\newenvironment สร้างความงามให้กับหนังสือ


เคยเห็นในหนังสือเรียนประเภทตำราที่พิมพ์ขายกันไหมครับว่าเขาจะมีการจัดรูปแบบของ ตัวอย่าง ทฤษฏีบท ฯลฯ ให้มีความแตกต่างจากเนื้อหาปกติ เพื่อทำให้ส่วนนั้น ๆ ดูเด่นขึ้นมา ใน LaTeX ก็มี environment ที่ทำหน้าที่นี้โดยตรง โดยค่าตั้งต้นจะมีแค่เน้นคำว่า ตัวอย่าง ให้เป็นตัวหนา และตัวเนื้อความเป็นตัวเอียง ซึ่งสำหรับเอกสารทั่วไปก็ใช้ได้ แต่ในหนังสือเรียนที่ต้องมีการแยกตัวเนื้อหากับตัวอย่างโจทย์ออกจากกันนั้น ในการเรียงพิมพ์เอกสารคงต้องมีลูกเล่นมากกว่านั้น สำหรับโรงพิมพ์คงจะจัดเรียงพิมพ์ได้ไม่ยากอะไร แต่สำหรับบุคคลทั่วไปแล้วหล่ะ ถ้าต้องการทำเองจะทำอย่างไร เข้าใจว่าในโปรแกรมจำพวก word เราสามารถตกแต่งเอกสารได้ตรง ๆ ผมไม่รู้ว่ามีการทำเป็นรูปแบบเฉพาะแล้วมาเรียกใช้ภายหลังเพื่อให้รูปแบบคงเส้นคงวาหรือไม่  แต่สำหรับ LaTeX แล้ว เราสามารถสร้าง environment ให้เป็นในแบบที่เราต้องการได้ ยกตัวอย่างถ้าเราต้องการให้รูปแบบหนังสือเรามีรูปแบบของตัวอย่างอย่างที่เห็นในรูปข้างล่าง

newen

เราจะทำอย่างไรครับ แน่นอนคุณต้องเพิ่มเส้น ปรับขนาดของ environment ให้มีขนาด 90% ของส่วนตัวหนังสือ ซึ่งแน่นอนทำได้หลายแบบ ในที่นี้จะแนะนำให้ใช้คำสั่ง \newenvironment

\newcounter{Examplecount}
\setcounter{Examplecount}{0}
\newenvironment{examplex}[1][]
{% This is the begin code
\vspace{1em}
\begin{center}
\begin{minipage}[c]{.9\textwidth}
\hrule
\vspace{1em}
\stepcounter{Examplecount} {\bf\small ตัวอย่าง
      \thesection.\arabic{Examplecount}}\small
      { }\emph{#1}{}
}
{% This is the end code
\vspace{1em}
 \hrule
 \end{minipage}
 \end{center}
}

ดูรหัสโปรแกรมแล้วหลายคนต้องงง ๆ เป็นแน่ อธิบายนิดหน่อยแล้วกันครับ ในการเขียน \newenvironment นั้นมีรูปแบบดังนี้

\newenvironment{name}[numopt][default]{begincode}{endcode}
  1. name ก็ตรงตัวครับ คือชื่อ environment ที่เราต้องการ ตัวอย่างข้างบนคือ examplex
  2. numopt คือจำนวนของพารามิเตอร์ที่เราต้องการให้มี กรณีนี้คือ 1 พารามิเตอร์
  3. default คือค่าตั้งต้นของพารามิเตอร์ กรณีนี้คือเป็นช่องว่างเฉย ๆ
  4. begincode กับ endcode คือส่วนเปิดกับส่วนปิด ที่เราต้องการให้มีก่อนและหลังข้อความที่เราต้องการ ในกรณีของตัวอย่างข้างต้น ผมใช้ \newline เพื่อบังคับให้มีการขึ้นบรรทัดใหม่เสมอ \begin{center} เพื่อให้ \minipage ที่มีขนาด 90% ของ \textwidth นั้นอยู่ตรงกลาง แล้วใช้ \hrule เพื่อขีดเส้น (ถ้าต้องการให้เส้นเป็นเส้นใหญ่หรือเส้นเล็ก ก็ใช้คำสั่ง \rule แทน)
  5. จากเส้นลงมา 1 em ก็จะเป็นการแสดงคำว่า ตัวอย่าง เป็นตัวหนา และใช้อักษรขนาดเล็กกว่าขนาดปกติหนึ่งขั้น มีการแสดงเลขของตัวอย่างตามเลข section และตัวข้อความก็จะเป็นตัวเล็กกว่าขนาดปกติหนึ่งขั้น ซึ่งทำได้ตามนี้
    \stepcounter{Examplecount} {\bf\small ตัวอย่าง
             \thesection.\arabic{Examplecount}}\small

    ส่วน Examplecount นั้นเป็น counter ที่สร้างขึ้นใหม่ด้วยคำสั่ง (อยู่ก่อน \newenvironment)

    \newcounter{Examplecount}
    \setcounter{Examplecount}{0}

    โดยให้ counter เริ่มจากศูนย์

  6. คำสั่ง \vspace{1em} มีไว้เพื่อกำหนดให้มีระยะห่างจาก \hrule ขนาดในแนวตั้ง 1em

เป็นอันเสร็จเรื่องเสร็จพิธี เวลาเรียกใช้ก็

\begin{examplex}[กำลังสองสัมบูรณ์]
     จงแก้สมการ
      \begin{align*}
        x^2+4x+4 &= 0 \\
        (x+2)(x+2)&=0 \\
        x &= -2
      \end{align*}
คำตอบที่ได้คือ $x$ มีค่าเท่ากับ -2
\end{examplex}

ก็จะได้ตามที่ได้แสดงไว้ในรูปข้างต้น ขอขอบคุณ Zoltan’s blog สำหรับตัวอย่างครับ

อย่างไรก็ตามตัวอย่างข้างต้นนั้นมีข้อจำกัด กล่าวคือ environment ที่ได้จะจำกัดอยู่ในหน้านั้น ๆ เท่านั้น การมี environment ที่ยาวข้ามหน้า หรือถูกวางในตำแหน่งที่คร่อมหน้าจะมีปัญหา ตัวอย่างโค้ดข้างล่างเป็นการแก้ปัญหาที่กล่าวถึง ซึ่งมีความซับซ้อนพอสมควร

\newcounter{Examplecount}
\setcounter{Examplecount}{0}
\makeatletter%
\newenvironment{examplex}[1][]
{% This is the begin code
\vspace{1em}
\@tempdima2cm
\def\endbit{#1}
\advance\rightskip\@tempdima
\hangindent8pt
\ignorespaces
\hrule
\vspace{1em}
\stepcounter{Examplecount} {\bf\small Example
      \thesection.\arabic{Examplecount}}\small
      { }\emph{#1}{}
}
{% This is the end code
\nolinebreak\hspace*{\stretch2}
 \parfillskip-\@tempdima
 %\makebox[\@tempdima][r]{\endbit}\par}
 \hfill $\blacksquare$
\vspace{1em}
 \hrule
\vspace{1.5em}
}
\makeatother%

อนึ่ง สำหรับผมแล้วเรื่องนี้ถือเป็นขั้นสูงนะครับ

\newcounter{Examplecount}
\setcounter{Examplecount}{0}
\newenvironment{examplex}[1][]
{% This is the begin code
\newline
\begin{center}
\begin{minipage}[c]{.9\textwidth}
\hrule
\vspace{1em}
\stepcounter{Examplecount} {\bf\small µÑÇÍÂèÒ§} \thesection.\arabic{Examplecount}\small
{ }\emph{#1}{}
}
{% This is the end code
\vspace{1em}
\hrule
\end{minipage}
\end{center}
}
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s