Theppitak's blog

My personal blog.

08 กุมภาพันธ์ 2556

ThaiLaTeX 0.5.1

ต่อจาก LibThai 0.1.19 ก็มาเป็น ThaiLaTeX 0.5.1 ที่ออกตามมา โดยมีการ sync ข้อมูลพจนานุกรมจาก LibThai มาเพื่อสร้าง hyphenation pattern ใหม่ พร้อมกับปรับกฎการแทรกยัติภังค์ให้เป็นไปตามที่กำหนดในพจนานุกรมทุกคำ

อีกรายการหนึ่ง เป็นเรื่องของความพยายามแก้ปัญหาขอบขวาหยักในการจัดหน้าเอกสาร ซึ่งผมเคยเจอเองบ้าง ได้ฟังผู้ใช้ถามวิธีแก้เข้ามาหลายครั้งหลายหน

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

เรื่องนี้อาจจะดีสำหรับข้อความภาษาอังกฤษ เพราะมีช่องว่างให้ยืดหลายจุด ยืดจุดละนิดละหน่อยก็ได้ความกว้างเพิ่มมาพอแล้ว แต่พอมาจัดบรรทัดภาษาไทยจะเจอปัญหาขาดแคลนช่องว่าง เพราะภาษาไทยไม่มีช่องว่างระหว่างคำ ผลคือ เมื่อยืดช่องว่างเท่าที่ยอมยืดแล้ว บรรทัดก็ยังกว้างไม่ถึงขอบขวา ดังนั้น TeX จึงเลือกที่จะดึงคำของบรรทัดถัดไปมาเติมช่องว่างแทน ซึ่งแน่นอนว่าทำให้บรรทัดกว้างเกินขอบขวา เกิด overfull line ถึงแม้จะไม่สวย แต่มันก็เป็นทางเลือกที่ดีที่สุดเท่าที่มีตามข้อกำหนดของ TeX อาการนี้อาจเป็นข้อยกเว้นที่แทบไม่เจอเลยในภาษาอังกฤษ แต่กลับเป็นกรณีที่พบบ่อยมากสำหรับภาษาไทย

วิธีแก้ปัญหานี้เป็นไปได้หลายแบบ เช่น

  • ใช้ letter spacing เป็นวิธีที่นิยมมากในงานพิมพ์ของไทย แม้ของฝรั่งเองก็เคยเห็นบ้าง แต่โดยหลักการแล้วถือว่าเป็นสไตล์ที่ไม่ดี (Frederick Goudy เคย กล่าว ไว้ว่า “Men who would letterspace lower case would shag sheep.”) โดยเฉพาะกับตัวพิมพ์เล็ก และ TeX ก็ไม่ทำ เพราะมันจะทำให้ข้อความอ่านยาก และจะใช้ ligature ไม่ได้ ดังนั้น หากจะทำ letter spacing กับภาษาไทยใน TeX คงไม่ใช่ความคิดที่ดีนัก
  • แทรกช่องว่างระหว่างคำ เป็นวิธีที่ ThaiLaTeX เคยใช้ในระหว่างรุ่น 0.2.5 ถึง 0.4.7 โดยดัดแปลงคำสั่ง \wbr ให้สามารถยืดความกว้างได้ แต่ปัญหาคือ ทำให้คำแยกออกจากกันเป็นคำ ๆ ดูไม่สวยงาม ในที่สุดก็เลิกใช้ไป
  • ยอมให้ยืดช่องว่าง เป็นวิธีที่ TeX เปิดให้จูนได้ โดยกำหนดค่า \pretolerance, \tolerance หรือ \emergencystretch ซึ่งการกำหนดค่า tolerance สูง ๆ อาจทำให้คุณภาพโดยรวมของการจัดบรรทัดตกได้ ผมจึงทดลองใช้ \emergencystretch กับเอกสารของตัวเองอยู่พักหนึ่ง จนได้ค่าที่เหมาะสมคือ 0.6em จนเมื่อ อ.กิตติพงษ์ มาถามผมในการประชุม “โสเหล่” ของ Khon Kaen Linux User Group (KKLUG) ครั้งหนึ่ง เป็นสัญญาณให้ผมตัดสินใจว่ามันเป็นสิ่งที่จำเป็นสำหรับการใช้ภาษาไทยใน LaTeX แล้ว ไม่ใช่สิ่งที่จะเก็บไว้เป็น solution ส่วนตัวอีกต่อไป จึงได้ commit เข้าใน SVN ของ ThaiLaTeX เสีย

ก็อยากให้ทดลองใช้กันดูนะครับ อาจมีวิธีที่ดีกว่านี้ หรือได้ค่า stretch ที่เหมาะกว่านี้ ก็เสนอเข้ามาได้ครับ

รุ่นนี้เป็นรุ่นแรกของ ThaiLaTeX ที่เปลี่ยนมาใช้ tarball แบบ XZ ตามประกาศ LTN ซึ่งปรากฏว่าขนาด tarball ลดลงถึง 26%

-rw-r--r-- 1 thep thep 260914 ก.พ.   8 12:02 thailatex-0.5.1.tar.gz
-rw-r--r-- 1 thep thep 191580 ก.พ.   8 11:35 thailatex-0.5.1.tar.xz

พร้อมกันนี้ ก็ได้อัปโหลดเข้า CTAN ไปแล้ว (รอ moderator รีวิวให้ถึงจะได้เข้า) รวมทั้งอัปโหลดเข้าที่ Debian experimental ไปรอ Jessie ไว้ด้วย

ป้ายกำกับ:

2 ความเห็น:

  • 11 กุมภาพันธ์ 2556 08:44 , Blogger wd แถลง…

    ผมทำใน XeLatex ใช้ผสมกัน (ใช้ฟอนต์ Browallia New)

    %INTER-WORD SPREAD
    \renewcommand\wbr{\hskip0em plus .05em minus .03em\relax}

    %INTER-LETTER SPREAD
    \setlength\spaceskip{.25em plus .55em minus .075em}

     
  • 11 กุมภาพันธ์ 2556 09:11 , Blogger Thep แถลง…

    เข้าใจว่า \spaceskip จะเอาไว้กำหนดการยืดหดช่องว่าง (อักขระ white space) ใช่ไหมครับ? ซึ่งก็เป็นการกำหนดค่าในระดับล่างเลย ไม่ใช่ที่อัลกอริทึมเหมือน \emergencystretch หรือ \tolerance

    ส่วน \wbr ที่มี plus, minus นั้น ก็เป็นแนวเดียวกับโค้ดเก่าที่ thailatex เคยใช้ คือแทรกช่องว่างระหว่างคำไทยด้วย ซึ่งได้ตัดสินใจตัดทิ้งไปแล้วครับ

     

แสดงความเห็น (มีการกลั่นกรองสำหรับ blog ที่เก่ากว่า 14 วัน)

<< กลับหน้าแรก

hacker emblem