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

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

newen

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

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

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

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

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

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

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

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

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

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