Theppitak's blog

My personal blog.

27 ตุลาคม 2554

ThaiLaTeX 0.4.6 Refactored

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

จาก แผนงาน ThaiLaTeX ที่ได้วางไว้ ตอนนี้ก็ได้ดำเนินการสองขั้นแรกเสร็จแล้ว คือการออก ThaiFonts-Scalable 0.4.16 และ ThaiLaTeX 0.4.6 โดยได้ย้ายฟอนต์จาก ThaiLaTeX มาไว้ทางฝั่ง ThaiFonts-Scalable เรียบร้อยแล้ว

ใครที่ใช้ Debian sid ก็คงได้เห็นการเปลี่ยนแปลงแล้วเมื่อเช้านี้ ส่วน distro อื่น รวมถึงผู้ใช้ MikTeX ที่ติดตั้งแพกเกจผ่าน CTAN ก็อดใจรอสักนิด

การย้ายฟอนต์ในครั้งนี้ ปรากฏว่าเมื่อลงมือทำจริง มีบางส่วนที่ไม่เป็นไปตามคาด คือไม่ได้ทำ automake snippet ไว้ให้แพกเกจฟอนต์ดึงไปใช้ เนื่องจาก:

  • ไม่มีวิธีง่าย ๆ ในการพิจารณาตำแหน่งของ include file โดยถ้าเป็น make ธรรมดานั้น คำสั่ง include สามารถไปค้นหาไฟล์จากไดเรกทอรี /usr[/local]/include ได้เลย แต่ automake กลับมา override คำสั่งนี้ และสามารถ include ไฟล์ได้แค่จากภายใน source tree หรือระบุพาธเต็มเท่านั้น ซึ่งถ้าจะใช้ข้ามแพกเกจก็ต้องเพิ่มสคริปต์ configure มาตรวจสอบยุ่งยากอีก
  • เมื่อพิจารณาแพกเกจฟอนต์อื่นที่การใช้ฟอนต์ TrueType อาจจะเหมาะกว่า Type 1 เช่น ThaiFonts-Arundina สุดท้ายก็คงได้ไปปรับกฎใหม่อีกอยู่ดี

พิจารณาแล้ว ได้ไม่คุ้มเสีย จึงเลือกตัดความยุ่งยากทั้งหลาย ใช้วิธีตัดแปะกฎเอา คงมีแต่ซอร์สที่ใช้ build ส่วน LIGKERN เท่านั้นที่จะติดตั้งให้ใช้ร่วมกัน

ในการ refactor ครั้งนี้ มีจุดหนึ่งที่ถือเป็นก้าวกระโดดสำคัญ คือการปลดพันธนาการระหว่างฟอนต์กับข้อกำหนดภาษาใน babel จากเดิมที่ thai.ldf จะกำหนดฟอนต์หลักสามแบบ คือ roman, san-serif, teletype สำหรับภาษาไทยไว้ด้วย ทำให้ข้อกำหนดภาษาจำเป็นต้องมีฟอนต์ติดพ่วงไปด้วย สร้างความลำบากใจในการส่งโค้ดเข้ารวมใน babel แต่เมื่อได้สำรวจภาษาอื่น ก็ได้พบวิธีการที่เขาทำกัน คือจะกำหนดแค่ font encoding เท่านั้น ไม่ได้กำหนด family แล้ว LaTeX จะไปหาฟอนต์ตัวใดตัวหนึ่งที่มี encoding ตามที่กำหนดนี้มาใช้ให้เอง (ซึ่งวิธีเลือกนั้นผมยังไม่ได้ค้น) จากนั้น ถ้าผู้ใช้จะใช้ฟอนต์อะไร ถ้าไม่ใช้วิธีกำหนด \usefont ตรง ๆ ก็จะไป \usepacakge ของฟอนต์นั้น ๆ แล้วตัว style ของแพกเกจก็จะกำหนดฟอนต์หลักให้อีกที

ก็เป็นวิธีที่ดี เพราะถ้าต่อไปเราเพิ่มฟอนต์ไทยชุดอื่น ถ้าผู้ใช้ต้องการเลือกใช้ฟอนต์ชุดไหน ก็ไป \usepackage ชุดที่ต้องการเอา ไม่ต้องมีอะไรผูกพ่วงกับข้อกำหนดภาษา

เมื่อแยกขาดออกจากกันได้อย่างนี้ ก็ทำให้ thai.ldf ของเราเบาสบายคล่องตัวขึ้นมาก ขอแค่มาตรวจทานให้ดีสักหน่อย ก็น่าจะส่งเข้ารวมใน babel ได้เลย (โดยอาจจะส่ง lthuni.enc เข้าไปอีกไฟล์หนึ่งด้วย แต่ต้องสำรวจอีกที) และเมื่อพิจารณาสิ่งที่เหลืออยู่นอกจากฟอนต์กับ babel แล้ว ก็เหลือเพียง Emacs macro เล็ก ๆ กับคำสั่งเชลล์เล็ก ๆ เท่านั้น จนทำให้ไม่ต้องมีแพกเกจ ThaiLaTeX อีกต่อไปก็ได้ และนั่นคือสิ่งที่ผมคิดจะทำในขั้นต่อไปหลังจากเสร็จงานครั้งนี้ ThaiLaTeX must die!

สำหรับผู้ใช้ เดิมจะมีแพกเกจ thswitch เพื่อใช้สลับชุดฟอนต์ระหว่างไทย-ละตินอยู่ นอกเหนือจากค่าปริยายในข้อกำหนดภาษา ซึ่งแพกเกจนี้จะยังคงมีผลอยู่ในรุ่นใหม่ที่ได้ตัดฟอนต์ออกไปแล้ว เพื่อเป็นการรักษาความเข้ากันได้กับเอกสารเดิมที่มีอยู่ โดยจะอ้างอิงไปถึงฟอนต์ชุดเดิมที่ได้แยกออกไปเหมือนเดิม ถ้าเอกสารของคุณใช้แพกเกจนี้อยู่แล้ว ก็ไม่มีปัญหา คุณสามารถสลับฟอนต์ในเอกสารด้วยคำสั่ง \rmfamily (หรือ \textrm{}), \sffamily (หรือ \textsf{}) และ \ttfamily (หรือ \texttt{}) ได้ตามปกติ แต่ถ้าไม่ได้ใช้ คำสั่งสลับฟอนต์เหล่านี้จะไม่มีผลในรุ่นใหม่ คือมันจะใช้ฟอนต์ปริยายที่ตรวจพบเพียงฟอนต์เดียวไปตลอดเอกสาร

ถ้าคุณต้องการสลับฟอนต์ในเอกสาร ขอแนะนำให้ใช้แพกเกจ fonts-tlwg ดังนี้:

\usepackage{fons-tlwg}

ซึ่งในขณะนี้ คำสั่งด้านบนมีผลเทียบเท่ากับ \usepackage{thswitch} ทุกประการ และขอแนะนำให้เอกสารใหม่ ๆ ใช้วิธีการนี้แทน thswitch ที่อาจจะถูกตัดออกในอนาคต

ขั้นต่อไป ผมคิดว่าจะทำแบบนี้กับฟอนต์ชุด Arundina เป็นรายต่อไป และผู้ใช้คงเริ่มเห็นภาพ ว่าทำไมต้อง deprecate แพกเกจ thswitch นี้

ป้ายกำกับ: , ,

13 ตุลาคม 2554

ThaiLaTeX and Fonts Work Plan

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

รายการนั้นคือ การเปลี่ยนชื่อแพกเกจฟอนต์ใน Debian ตาม naming convention ใหม่ (ซึ่ง เอาเข้าจริงใช้แค่บางส่วน) ตามข้อกำหนดใหม่ (ที่ใช้จริงแค่บางส่วน) นี้ ชื่อแพกเกจจะไม่ใช่ ttf-* หรือ t1-* หรือ otf-* อีกต่อไป แต่จะชื่อ fonts-* อย่างเดียวโดยไม่แยกชนิด ซึ่งหมายความว่า แพกเกจ thaifonts-scalable ที่เคยแยก binary เป็น ttf-thai-tlwg, otf-thai-tlwg และ t1-thai-tlwg จะต้องยุบรวมเป็น fonts-tlwg หรืออาจจะแตกเป็นแพกเกจย่อย ๆ รายฟอนต์ เป็น fonts-kinnari, fonts-garuda ฯลฯ ก็ได้ แต่สุดท้ายคือมีฟอนต์แค่แบบเดียวเท่านั้น ซึ่งถ้าต้องเลือกก็คงเป็น TTF ถึงแม้ Christian จะแนะว่ายังสามารถทำแพกเกจฟอนต์หลายชนิดโดยตั้งชื่อแยกชนิดกันได้อยู่ แต่เมื่อพิจารณา สถิติ popcon แล้ว ผมคิดว่าอีกสองแบบที่เหลือคงไม่มีความต้องการใช้สักเท่าไร

อีกเรื่องหนึ่งที่เกี่ยวข้องกัน คือ lintian report ที่มีมานานแล้วในแพกเกจ thailatex คือ duplicate-font-file และ font-in-non-font-package โดยรายการแรกเป็นเพราะตัวแพกเกจมีฟอนต์ชุดที่ซ้ำกับในแพกเกจ t1-thai-tlwg ซึ่งถ้าตัด t1-thai-tlwg ออกก็คงหาย แต่รายการหลังนี่แหละที่น่าคิด เพราะแพกเกจ thailatex ไม่ใช่แพกเกจสำหรับฟอนต์ แต่กลับมีฟอนต์รวมมาด้วย เพื่อใช้กับ LaTeX ซึ่งมีระบบฟอนต์แยกต่างหากจากของเดสก์ท็อป

ซึ่งปัญหาการรวมฟอนต์มาใน thailatex นี้ ถ้าเราจะละเลย lintian report นี้ไปเสียก็ไม่มีปัญหา แต่ความจริงแล้ว มันก็มีปัญหาในทางปฏิบัติบ้างในช่วงที่ผ่านมา กล่าวคือ:

  • ทุกครั้งที่ออกฟอนต์ thaifonts-scalable รุ่นใหม่ ก็จะต้อง generate ฟอนต์ Type 1 แล้วนำมาอัปเดตใน thailatex เพื่อออก thailatex รุ่นใหม่ตามมาเสมอ ซึ่งจะมีหลายรุ่นที่เป็นแค่การอัปเดตฟอนต์เท่านั้น ถ้าย้ายฟอนต์ LaTeX ไปรวมใน thaifonts-scalable เสีย การอัปเดตฟอนต์ก็จะเป็นไปอย่างอัตโนมัติ แล้ว thailatex ก็จะออกรุ่นใหม่เฉพาะเมื่อมีการเปลี่ยนแปลงในส่วน LaTeX class จริง ๆ เท่านั้น
  • การเพิ่มฟอนต์ใน thailatex ด้วยวิธีปัจจุบัน จะต้องนำมาเพิ่มในแพกเกจ thailatex โดยตรง ยังมีแพกเกจฟอนต์อื่น ๆ ที่อาจนำมาเพิ่มได้ เช่น thaifonts-arundina หรือแม้กระทั่ง ฟอนต์ชุดสารบรรณ ที่กำลังจะผลักดันกันต่อไป ซึ่งการใช้วิธีเดิมจะไม่สะดวกอีกต่อไปแล้ว สมควรที่จะแยกส่วนของฟอนต์ออกมาจาก thailatex จริง ๆ เสียที

ด้วยเหตุนี้ การเปลี่ยนแปลงครั้งนี้จึงควรรวมการย้ายฟอนต์ออกจาก thailatex เสียด้วย

แต่การย้ายฟอนต์ออกจาก thailatex ไม่ใช่แค่ย้ายตัวฟอนต์ออกมา แต่ยังมีกรรมวิธีการ build TFM และ virtual font ที่ใช้ LIGKERN ในการจัดเรียงสระและวรรณยุกต์อีกด้วย จึงต้องแยกกระบวนการเหล่านี้ออกมา ทำให้อยู่ในรูปทั่วไปเพื่อใช้กับฟอนต์ทั่วไป (ที่มีลักษณะตามข้อกำหนดบางอย่าง เช่น ใช้ glyph naming convention แบบ uniXXXX) แล้วก็ต้องวางแผน transition สำหรับ Debian และการจัดการแพกเกจใน CTAN ควบคู่กันไปด้วย

หลังจากคิดออกมาหลาย ๆ แบบแล้ว ก็เลือกเอาแบบที่คิดว่าง่ายที่สุด ดังนี้:

  1. thaifonts-scalable:
    • เพิ่ม configure option --enable-texfonts
    • คัดลอกกฎต่าง ๆ จาก thailatex มาใช้ชั่วคราวเพื่อ build ฟอนต์
    • New upstream release (0.4.16)
    • สร้าง deb โดยเปลี่ยนชื่อฟอนต์ตามข้อกำหนดใหม่
    • เพิ่มแพกเกจ fonts-latex-* โดย Conflicts/Breaks thailatex (<< 0.4.5-3)
  2. thailatex:
    • แยกเอาส่วนกระบวนการ build ฟอนต์ออกมา คือ:
      • make rule สำหรับ build และติดตั้งฟอนต์ ซึ่งทางที่สะดวกที่สุดคือทำเป็น snippet สำหรับ include ใน Makefile.am แล้วก็เขียนแมโคร m4 เพื่อใช้กำหนดตัวแปรต่าง ๆ ให้กับกฎ แล้วให้แพกเกจฟอนต์นำไปใช้ใน configure.ac
      • กฎ LIGKERN โดยติดตั้งลงในระบบเพื่อให้ make rule ดึงไปใช้
      • lthuni.enc อาจติดตั้งรวมกับ make rule หรือกฎ LIGKERN หรือจะใช้จากในไดเรกทอรี TEXMF เลยก็ได้
    • ตัดฟอนต์ออก
    • New upstream release (0.4.6)
    • สร้าง deb โดย Depends fonts-latex-*
  3. thaifonts-scalable:
    • เปลี่ยนกฎการ build ให้ไปใช้รูปทั่วไปที่ thailatex ติดตั้งไว้
    • New upstream release (0.4.17)
    • สร้าง deb โดย Build-Depends thailatex (>= 0.4.6)
  4. CTAN upload: thailatex + thaifonts-scalable
  5. แพกเกจฟอนต์อื่น:
    • เพิ่ม configure option --enable-tex-fonts เหมือน thaifonts-scalable
    • New upstream release
    • สร้าง deb โดย Build-Depends thailatex (>= 0.4.6)
    • CTAN upload

บันทึกแผนงานไว้ก่อนครับ เดี๋ยวทยอยทำ

ป้ายกำกับ: , ,

12 ตุลาคม 2554

Sarabun to be Freed

ข่าวดีข่าวหนึ่งที่ผมได้รับมาตั้งแต่ตอนที่ยังอยู่ที่ DebConf ที่บอสเนียก็คือ ฟอนต์ชุด DIP/SIPA ได้รับอนุมัติให้เปลี่ยน license เป็น GPL แล้ว โดยครั้งนี้ได้รับอนุมัติจากทั้งผู้อำนวยการ (รักษาการ) SIPA และอธิบดีกรมทรัพย์สินทางปัญญาเลย จึงถือได้ว่ามีผลทางกฎหมายแน่นอน

ว่าจะเขียนถึงเรื่องนี้แต่ก็ติดงานโน่นนี่จนไม่ได้เขียนเสียที นี่ก็ล่วงเลยมา 3 เดือนครึ่งแล้ว ถึงจะช้าแต่ก็ยังอยากเขียนถึง

นับว่าเป็นความคืบหน้าอย่างมากสำหรับการผลักดันฟอนต์ชุดนี้เข้าในดิสโทรลินุกซ์ต่าง ๆ ที่เหลือก็คือ รอให้ทีมงานของ SIPA ปรับแก้ข้อมูล license ของฟอนต์ตามที่ได้รับอนุมัติแล้วประกาศออกฟอนต์ชุดใหม่อย่างเป็นทางการ เพื่อที่เราจะได้มีวัตถุดิบที่สามารถใช้เป็นฐานในการพัฒนากันต่อไป

อีกเรื่องหนึ่งที่อยากเสนอแนะก็คือ ควรมี upstream maintainer ที่จะคอยดูแลและรับแพตช์จากที่ต่าง ๆ เพราะถ้าประกาศออกไปด้วย GPL เฉย ๆ ก็ยากที่จะควบคุมมาตรฐานของฟอนต์ คนที่เอาไปดัดแปลงแก้ไขก็ไม่รู้ว่าจะส่งแพตช์ปรับปรุงไปที่ไหน ก็เป็นไปได้ที่จะมีการ fork ออกไปมากมาย

แน่นอนว่าทางเลือกที่ดีที่สุดคือ SIPA เป็นผู้ดูแลเอง หรือมิฉะนั้น ก็อาจจะให้คนภายนอกตั้งโครงการขึ้นมา เหมือนที่ TLWG คอยดูแลฟอนต์แห่งชาติของเนคเทคผ่านโครงการ thaifonts-scalable อยู่ ซึ่งอันที่จริง ก็ได้มีโครงการ thaifonts-siampradesh ที่ดัดแปลงไปจากฟอนต์ชุด DIP/SIPA อยู่ก่อนแล้ว ถ้าจะให้ดูแลต่อก็ย่อมเป็นไปได้ เพียงแต่เราอาจจะขาดทรัพยากรสำหรับ OS อื่นที่ไม่ใช่ลินุกซ์ไปเท่านั้น

แต่ไม่ว่าอย่างไร ตอนนี้ผู้ครองบอลคือ SIPA ที่จะต้องออกฟอนต์ชุดใหม่อย่างเป็นทางการเสียก่อน ฝ่ายอื่น ๆ จึงจะสามารถรับลูกไปทำต่อได้

หัวข้อนี้ เมื่อรวมกับหัวข้อ localization ของเนคเทค ก็สามารถบรรจุเป็นวาระใน workshop ของ Thailand Mini-DebConf 2011 ได้เหมือนกันนะนี่

ป้ายกำกับ: ,

04 ตุลาคม 2554

Thanks

ขอ ขอบคุณ คุณวิทยา และคุณ Thanathip Limna ที่ได้ หย่อนสตางค์ลงหมวก เพื่อสนับสนุนงานพัฒนาของผมในเดือนกันยายนที่ผ่านมา โดยสำหรับคุณวิทยา ขอขอบคุณย้อนหลังไปถึงการหย่อนสตางค์เมื่อปลายเดือนมิถุนายนก่อนที่ผมจะไป DebConf ด้วย

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

ป้ายกำกับ: ,

hacker emblem