Theppitak's blog

My personal blog.

27 ธันวาคม 2554

ThaiLaTeX wbr, Quotation and Special Characters

หลังจากที่ แยกร่าง ThaiLaTeX เสร็จไปแล้ว ขณะที่พยายามจะทำความสะอาดโค้ดเพื่อเตรียมส่งเข้ารวมใน Babel นั้น ก็ได้ข่าวมาสองชิ้น เป็นข่าวร้ายและข่าวดี

ข่าวร้ายคือโครงการ Babel นั้นอยู่ในสถานะ unmaintained มานานแล้ว ส่งไปตอนนี้ก็ไม่มีใครจัดการให้ แต่ข่าวดีคือ ยังพอมีหวังถ้าสามารถเข้ารวมใน TeX Live ได้ และได้รับคำแนะนำจากผู้ดูแล TeX Live ให้ปรับปรุงเรื่องการจัดโครงสร้างของแพกเกจ

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

เสร็จเรื่องจัดโครงสร้างแล้ว ก่อนจะออกรุ่นใหม่ก็กลับมาทำความสะอาดต่อ ก็ปรากฏว่าพบประเด็นอีก 2 ประเด็นที่เป็นจุดบกพร่องอยู่

1. การเว้นช่องไฟระหว่างคำ

ในคำสั่ง \wbr ปัจจุบันนั้น ได้ดัดแปลงจากแค่เป็นช่องว่างที่ไม่มีความกว้างธรรมดา ให้กลายเป็น glue ที่สามารถยืดได้ เพื่อช่วยในการจัด justified text ในคอลัมน์แคบ โดยให้มาแทรกช่องว่างระหว่างคำด้วย เนื่องจากภาษาไทยใช้อักขระเว้นวรรคน้อยกว่าภาษาอังกฤษ แต่จากการสังเกตเอกสารที่ใช้คอลัมน์แคบ ปรากฏว่าทำให้หลายจุดกลายเป็นการเว้นช่องว่างระหว่างคำเหมือนในหนังสือเรียนชั้นประถม ซึ่งดูไม่สวยงามเลย และในบรรทัดที่ตัดคำไม่ถูก เช่นบรรทัดที่มีชื่อคน ก็จะเป็นการเปิดเผยจุดตัดคำที่ผิดไปด้วย แต่ครั้นจะไม่ยืด \wbr ก็จะทำให้ช่องว่างห่างมาก และในบรรทัดที่ไม่มีช่องว่างเลย บรรทัดก็จะ rag ด้านขวา (แต่สังเกตว่าการไม่ยืดช่องไฟทำให้เส้นหมึกของตัวหนังสือสม่ำเสมอน่าอ่านกว่า)

\wbr แบบยืดได้ \wbr แบบยืดไม่ได้

วิธีแก้ที่นิยมที่สุดในงานพิมพ์ภาษาไทยคือ ใช้ letter-spacing คือการกระจายช่องไฟลงไประหว่างอักขระ ซึ่งวิธีนี้ก็มีข้อเสียเหมือนกัน คือในกรณีที่ต้องชดเชยช่องว่างมาก (ซึ่งในกรณีแยกคำทำให้เห็นคำแยกเป็นคำ ๆ) ช่องไฟที่แทรกลงไปจะทำให้อักขระแยกห่างจากกัน ทำให้อ่านยากอยู่ดี เพราะตามหลักการทำงานของสมองขณะอ่านนั้น สมองจะรับรู้คำต่าง ๆ เป็นรูปภาพของกลุ่มอักขระมากกว่าจะไล่สะกดเรียงตัว แต่เมื่อภาพถูกยืดออกมากเกินไป ก็จะทำให้การรับรู้รูปคำช้าลง

อย่างไรก็ดี เรื่อง letter-spacing นั้นทำใน LaTeX ได้ยาก เพราะนอกจากจะถือเป็นหนึ่งใน bad practice ในเชิง typography แล้ว ยังทำให้มีปัญหากับการจัดการ ligature (ff, fi, fl, ffi, ffl) อีกด้วย ทำให้ Knuth ไม่สนใจสนับสนุนวิธีการนี้ใน TeX และหากเราจะจัดการกับภาษาไทย ก็ต้องจัดการภาษาอังกฤษด้วย เพื่อให้ช่องไฟสมดุลกัน และคงต้องไปรบรากับนัก typography อีกเยอะ

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

ก็ต้องวิจัยกันต่อไป ว่าสามารถเขียน hyphenation pattern สำหรับภาษาไทยออกมาได้หรือไม่ หรือจะใช้พจนานุกรมช่วยโดยเพิ่มความสามารถใน swath แต่เฉพาะหน้านี้ ผมได้ตัดเรื่องการยืดช่องไฟของ \wbr ออกแล้ว กลับไปใช้ช่องไฟแบบไม่มีช่องว่างเหมือนเดิม

2. อัญประกาศและเครื่องหมายพิเศษต่าง ๆ

ผมได้สังเกตเห็นมาระยะหนึ่งแล้ว ว่าอัญประกาศคู่ในเอกสาร LaTeX ภาษาไทยมันดูห่าง ๆ โดยเฉพาะฟอนต์นรสีห์จะเห็นได้ชัด พอเปิด PDF ที่ได้แล้วใช้เมาส์เลือกดู ก็พบว่ามันไม่ได้แปลง `` หรือ '' ให้เป็นอัญประกาศคู่ตัวเดียวเลย ยังคงเป็นอัญประกาศเดี่ยวสองตัวซ้อนกันอยู่เหมือนใน input แกะไปแกะมาก็พบว่าเป็นบั๊กในกฎ ligkern วิธีแก้นั้นมีหลายวิธี ได้ผลครบถ้วนไม่เท่ากัน เนื่องจากปัจจุบันสามารถใช้ UTF-8 ในเอกสารได้ ทำให้สามารถป้อนอักขระยูนิโค้ดของอัญประกาศลงไปตรง ๆ ได้เหมือนกัน แก้ไปแก้มาก็พบ trick ที่ทำให้ใช้งานได้ทุกกรณี ซึ่งแก้เพียง 3 บรรทัดเท่านั้น

การแก้ไขนี้มีผลทำให้ลำดับ ?` และ !` ซึ่ง TeX กำหนดให้แปลงเป็น ¿ และ ¡ ตามลำดับกลับมาทำงานถูกต้องด้วย และเมื่อได้ตรวจสอบลำดับอื่น ๆ ของ TeX ก็พบว่ามีหลายตัวที่ยังไม่ได้กำหนดใน encoding LTH ทำให้ TeX ต้องสำรองใช้ glyph จาก encoding OT1 หรืออื่น ๆ แทน ซึ่งรวมถึงเครื่องหมายพื้นฐานอย่าง $ ด้วย ทำให้รูปแบบตัวอักษรดูไม่กลมกลืนกันเพราะมาจากคนละฟอนต์ และเพื่อแกล้งให้มันต่างกันมากเพื่อให้สังเกตได้ง่ายระหว่างทดสอบ ก็ได้ทดลองใช้ฟอนต์ garuda ผ่านคำสั่ง \usefont ไม่ใช่ \sffamily เพื่อให้ glyph ที่สำรองนั้นไปดึงมาจาก roman shape ให้มันต่างจาก san serif ของ garuda

รูปข้างล่างนี้แสดงการเปรียบเทียบก่อนและหลังการแก้ ทั้งกรณีอัญประกาศและเครื่องหมายพิเศษ:

Garuda ก่อน Garuda หลัง

กับฟอนต์นรสีห์:

Norasi ก่อน Norasi หลัง

จะเห็นว่าไม่ได้กู้อักขระละตินกลับมาทั้งหมด เนื่องจากช่องว่างในตารางอักขระมีจำกัด จึงเลือกเอาเฉพาะที่น่าจะได้ใช้บ่อยเท่านั้น หลังจากแก้แล้ว อักขระละตินนอกช่วง ASCII ที่สามารถใช้ใน LTH ได้ ได้แก่ ?` (¿), !` (¡), \dag (†), \ddag (‡), \S (§), \P (¶), \copyright (©), \textregistered (®), \texttrademark(™), \ae (æ), \AE (Æ), \oe (œ), \OE (Œ), \ss (ß), \i (ı), \j (ȷ) ส่วนอักขระ accent ทั้งหลาย ยังคงใช้การผสม accent ของ TeX ตามปกติ (เช่น \'e = é)

แต่งานยังไม่จบครับ ปัญหาคือไม่ใช่ทุกฟอนต์ที่มี glyph เหล่านี้ครบ ยังต้องไล่เพิ่ม glyph ก่อน (เช่น ตัวอย่างของ garuda จะเห็นว่า dotless j หาย) กว่าจะเสร็จคงปีหน้า :-)

Update (2011-12-28 09:28+0700): เพิ่มโค้ด LaTeX สำหรับอักขระละตินที่ใช้เพิ่มได้ เพื่อความชัดเจน

ป้ายกำกับ: ,

0 ความเห็น:

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

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

hacker emblem