Theppitak's blog

My personal blog.

21 สิงหาคม 2557

LibThai 0.1.21

LibThai 0.1.21 ออกแล้ว โดยรุ่นนี้ นอกเหนือจากการปรับพจนานุกรมตัดคำตามปกติ ก็ยังมีการเพิ่มสมรรถนะของตัวตัดคำเล็กน้อยด้วย

ตอนที่ยกเครื่องตัวตัดคำของ LibThai เขียนใหม่เมื่อ 8 ปีที่แล้วนั้น (การประเมินผลขณะ merge เข้า trunk) ก็ได้คิดเผื่ออัลกอริทึมแบบอื่นไว้ขณะออกแบบเหมือนกัน กะว่าอาจมาปรับเพิ่มในอนาคต แต่ก็ไม่ได้กลับไปดู จนมาถูกกระตุ้นด้วยการเปิดไฟล์ HTML บางไฟล์ด้วย Firefox/Iceweasel แล้ว พบว่าใช้เวลานาน จึงได้เอาความคิดนี้มาปัดฝุ่นใหม่ โดยพยายาม refactor โค้ดเตรียมรองรับอัลกอริทึมอื่นไว้

และก็ได้คิดออกแบบอัลกอริทึมแบบ longest matching ดู โดยอาศัยโครงจากอัลกอริทึม maximal matching ปัจจุบัน แต่ขณะสำรวจและวิเคราะห์โค้ดเดิม ก็กลับเกิดไอเดียที่จะลดขั้นตอนของโค้ดเดิมขึ้นมาแทน

ผมใช้ callgrind วัดเวลาที่ใช้ในฟังก์ชันต่าง ๆ ก็พบว่าฟังก์ชันที่กินเวลามากที่สุดคือ brk_recover_try() ซึ่งใช้สำหรับหาจุด recover จากคำที่ไม่อยู่ในพจนานุกรม จึงพยายามมุ่งมาลดขั้นตอนในฟังก์ชันนี้

ผมมีสมมุติฐานมากมาย ตั้งแต่การลดการ assign การคัดลอก และการตรวจค่าเล็ก ๆ น้อย ๆ ที่ไม่จำเป็นออก ไปจนถึงการปรับกระบวนการคิดของอัลกอริทึม แล้วก็ต้องโยนทิ้งไปหลายเรื่อง เพราะบางเรื่องเอาเข้าจริงกลับทำให้ใช้เวลาเพิ่มขึ้น มีเพียงเรื่องเดียวที่ทำให้ลดเวลาได้อย่างจริงจัง คือการปรับวิธีตรวจสอบจุด recover จากการ match คล้ายการตัดคำปกติ มาเป็นการ match แบบละโมบ (greedy) โดยพยายาม match คำให้ได้มากคำที่สุดสำหรับแต่ละทางเลือกที่หยิบออกมา ซึ่งมีผลทำให้พบคำตอบได้อย่างรวดเร็วในกรณีที่จุดนั้นสามารถ recover ได้ อีกทั้งไม่ต้องไปเสียเวลาเลือกทางเลือกมาพิจารณาให้มากเกินไป เพราะจุดประสงค์ของการ recover ก็แค่พิจารณาว่าแต่ละจุดสามารถ recover จาก error ได้หรือไม่เท่านั้น ไม่ได้ต้องการ solution ที่สวยงามว่า recover แล้วต้องได้การตัดคำที่ดีที่สุด

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

แนวคิดอื่นที่ยังทำไม่สำเร็จก็เช่น ลดจำนวนการ recover ลง, ลดขนาดของ search space ลง, ทำ cut-off แต่ไว้ค่อยคิดต่อไป รวมถึงการสร้างอัลกอริทึมแบบอื่นด้วย แต่ตอนนี้ขอออกรุ่นที่ปรับสมรรถนะเล็กน้อยนี้ก่อน ให้ทันใช้ใน Jessie ที่กำลังจะ freeze ในเดือนตุลานี้ โดยถือหลัก ออกเนิ่น ๆ ออกถี่ ๆ (release early, release often) เพื่อให้ตัวไลบรารีถูกทดสอบแต่เนิ่น ๆ ด้วย

สำหรับสมรรถนะตัวตัดคำที่เพิ่มขึ้นในรุ่นนี้ วัดเวลาจากกรณีทดสอบโดยใช้ callgrind:

  • ก่อนปรับ: 48,094,350
  • หลังปรับ: 46,893,901

คิดเป็นเวลาที่ลดลง = 2.50%

แต่นี่นับรวมทั้งหมดตั้งแต่เปิดพจนานุกรม, ตัดคำ, ปิดพจนานุกรม ซึ่งเวลาที่ใช้เกี่ยวกับพจนานุกรมนับเป็นสัดส่วนที่มากเอาการอยู่ และเป็น fixed cost ที่เกิดเพียงครั้งเดียวเท่านั้นตลอดโพรเซสที่เรียกตัวตัดคำของ libthai ดังนั้น ผมจึงวัดเวลาที่ใช้ในการเปิด-ปิดพจนานุกรมมาหักลบใหม่:

  • เฉพาะเปิด-ปิดพจนานุกรม: 32,961,393

เมื่อหักลบเวลาเปิด-ปิดพจนานุกรม จะเหลือเวลาสำหรับช่วงตัดคำจริง ๆ คือ:

  • ก่อนปรับ: 15,132,957
  • หลังปรับ: 13,932,508

คิดเป็นเวลาที่ลดลง = 7.93%

หรืออัตราเร็วที่เพิ่มขึ้น = 1 / (1 - 0.0793) - 1 = 0.0861 หรือ 8.61%

ป้ายกำกับ:

08 กรกฎาคม 2557

Fonts-TLWG 0.6.1

Fonts-TLWG 0.6.1 ออกไปแล้วเมื่อวานนี้ สรุปความเปลี่ยนแปลงในรุ่นนี้คือ:

  • ฟอนต์ใหม่: ลักษมัณ (Laksaman) ซึ่งดัดแปลงจากฟอนต์ TH Sarabun New ของคุณศุภกิจ เฉลิมลาภ และ SIPA
  • แตกแฟ้ม fontconfig จากแฟ้มเดี่ยวๆ เป็นแฟ้มย่อย เพื่อให้สามารถเลือกติดตั้งฟอนต์เพียงบางส่วนได้ ซึ่งเป็นสิ่งที่ดัดแปลงไว้ในแพกเกจของ Debian ก็เพียงแต่ merge เข้ามาที่ต้นน้ำเท่านั้น
  • Option ใหม่สำหรับ LaTeX เพื่อให้สามารถกำหนดฟอนต์ปริยายของเอกสารได้โดยสะดวก

มีผลข้างเคียงอีกเรื่องหนึ่งที่ไม่ได้กล่าวไว้ใน blog ก่อน ๆ คือเรื่องการตัดการวาด ฤา เป็น ฤๅ ของฟอนต์สารบรรณออกในฟอนต์ลักษมัณ ซึ่งการวาดดังกล่าวผมถือว่าผิดหลักการ เพราะสตริงทั้งสองถือว่าเป็นสตริงที่ต่างกันทั้งในรหัส มอก.620-2533 และในยูนิโค้ด ผู้ใช้ควรสามารถแยกความแตกต่างได้ว่าเป็นสตริงที่ต่างกัน

พฤติกรรมนี้อาจมาจากการพยายามแก้การพิมพ์ผิดอย่างกลาดเกลื่อนของผู้ใช้ทั่วไป ที่มักจะพิมพ์ ฤๅ และ ฦๅ โดยใช้สระอาแทนลากข้างยาว แต่การแก้ที่ฟอนต์ถือว่าไม่ถูกต้อง เพราะเป็นการอำพรางความแตกต่างของข้อมูลจริง หากจะแก้ปัญหาให้ถูก ควรแก้ที่ input method ซึ่งประเด็นที่คล้ายกันนี้ผมเคยเขียนถึงไปแล้วใน กรณีฟอนต์ Sarabun IT9 การแก้ปัญหาที่ฟอนต์จะยิ่งเป็นการส่งเสริมการป้อนข้อมูลที่ผิดให้กว้างขวางยิ่งขึ้น ดังนั้นผมจึงตัดกฎข้อนี้ออกในฟอนต์ลักษมัณ และถ้าเป็นไปได้ก็อยากให้แก้ในฟอนต์มาตรฐานราชการไทยทั้ง 13 ฟอนต์ด้วย

ได้อัปโหลด Debian package เข้า sid ไปแล้ว แต่ยังรออยู่ในคิว NEW เนื่องจากมีแพกเกจใหม่ของฟอนต์ลักษมัณเพิ่มเข้ามา พร้อมกันนี้ก็ได้อัปโหลดแพกเกจ LaTeX ไปที่ CTAN แล้วด้วย ผู้ใช้ TeXLive ก็รอพบได้จากแพกเกจ texlive-lang-other รุ่นถัดไปครับ

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

05 กรกฎาคม 2557

LaTeX Options for fonts-tlwg

การเพิ่มฟอนต์ลักษมัณในแพกเกจ Fonts-TLWG พร้อมกับรองรับใน LaTeX ด้วยนั้น ทำให้เกิดคำถามกับผมว่า ในเมื่อมีฟอนต์สองค่ายมาอยู่ด้วยกัน คือ ฟอนต์แห่งชาติของเนคเทค และ ฟอนต์มาตรฐานราชการไทย จากกรมทรัพย์สินทางปัญญาร่วมกับ SIPA (เว็บต้นทาง สาบสูญไปแล้วตามระเบียบของราชการไทย) ย่อมจะเกิดทางเลือกการใช้ฟอนต์ที่เด่นชัดระหว่างสองค่ายนี้ ซึ่งผู้ใช้อาจเลือกฟอนต์ได้โดยใช้คำสั่งใน preamble เช่น เมื่อต้องการใช้ฟอนต์ลักษมัณในเอกสาร:

\renewcommand{\sffamily}{laksaman}
\AtBeginDocument{\sffamily}

แต่ด้วยแนวโน้มของความต้องการที่น่าจะสูงพอ ผมจึงตัดสินใจเพิ่ม option ให้กับแพกเกจ fonts-tlwg เสียเลย โดยผู้ใช้สามารถใส่ option ขณะ \usepackage ได้เลย โดยแบ่งหมวดหมู่ของ option ดังนี้:

  • การใช้ฟอนต์ sans-serif แทนค่าปกติที่เป็นฟอนต์ roman:
    • sans : ใช้ฟอนต์ sans-serif เป็นฟอนต์ปกติของเอกสาร
  • การกำหนดฟอนต์ roman, sans-serif, และ teletype ของเอกสาร:
    • rmkinnari : ให้ฟอนต์ kinnari เป็นฟอนต์ roman ปริยาย
    • rmnorasi : ให้ฟอนต์ norasi เป็นฟอนต์ roman ปริยาย
    • sfgaruda : ให้ฟอนต์ garuda เป็นฟอนต์ sans-serif ปริยาย
    • sflaksaman : ให้ฟอนต์ laksaman เป็นฟอนต์ sans-serif ปริยาย
    • sfumpush : ให้ฟอนต์ umpush เป็นฟอนต์ sans-serif ปริยาย
    • sfloma : ให้ฟอนต์ loma เป็นฟอนต์ sans-serif ปริยาย
    • sfwaree : ให้ฟอนต์ waree เป็นฟอนต์ sans-serif ปริยาย
    • ttttype : ให้ฟอนต์ ttype เป็นฟอนต์ teletype ปริยาย
    • ttttypist : ให้ฟอนต์ ttypist เป็นฟอนต์ teletype ปริยาย
    ตัวเลือกกลุ่มนี้ไม่ได้เปลี่ยนฟอนต์ปริยายของเอกสารโดยตรง แต่เปลี่ยนฟอนต์ทั้งสามตระกูลสำหรับใช้คละกันในเอกสาร
  • การกำหนดฟอนต์ปริยายของเอกสาร:
    • kinnari : ให้ฟอนต์ kinnari เป็นฟอนต์ปริยายของเอกสาร
    • garuda : ให้ฟอนต์ garuda เป็นฟอนต์ปริยายของเอกสาร
    • norasi : ให้ฟอนต์ norasi เป็นฟอนต์ปริยายของเอกสาร
    • laksaman : ให้ฟอนต์ laksaman เป็นฟอนต์ปริยายของเอกสาร
    • loma : ให้ฟอนต์ loma เป็นฟอนต์ปริยายของเอกสาร
    • purisa : ให้ฟอนต์ purisa เป็นฟอนต์ปริยายของเอกสาร
    • sawasdee : ให้ฟอนต์ sawasdee เป็นฟอนต์ปริยายของเอกสาร
    • ttype : ให้ฟอนต์ ttype เป็นฟอนต์ปริยายของเอกสาร
    • ttypist : ให้ฟอนต์ ttypist เป็นฟอนต์ปริยายของเอกสาร
    • umpush : ให้ฟอนต์ umpush เป็นฟอนต์ปริยายของเอกสาร
    • waree : ให้ฟอนต์ waree เป็นฟอนต์ปริยายของเอกสาร
    ตัวเลือกกลุ่มนี้กำหนดฟอนต์ปริยายของทั้งเอกสาร โดยไม่ได้เปลี่ยนฟอนต์ทั้งสามตระกูล (อาจจะเหมาะกับเอกสารที่ใช้ฟอนต์เดียวทั้งเอกสาร เช่นหนังสือราชการไทยที่บังคับใช้ฟอนต์สารบรรณ)

ตัวอย่าง use case:

  • ต้องการใช้ฟอนต์ลักษมัณ (ดัดแปลงจากสารบรรณ) ทั้งเอกสาร (เช่น ในหนังสือราชการ):
    \usepackage[laksaman]{fonts-tlwg}
    
  • ต้องการใช้ฟอนต์ลักษมัณเป็น sans-serif (เช่น ในคำสั่ง \textsf{}) แทนฟอนต์ครุฑ (ฟอนต์ปริยายยังคงเป็น norasi):
    \usepackage[sflaksaman]{fonts-tlwg}
    
  • ต้องการใช้ฟอนต์ลักษมัณเป็นฟอนต์ปริยาย โดยต้องการผสมกับฟอนต์ roman, teletype ปกติ:
    \usepackage[sans,sflaksaman]{fonts-tlwg}
    
  • ต้องการใช้ฟอนต์ลักษมัณผสมกับฟอนต์กินรี โดยลักษมัณเป็นฟอนต์ปริยาย:
    \usepackage[sans,sflaksaman,rmkinnari]{fonts-tlwg}
    
  • ต้องการใช้ฟอนต์กินรีอย่างเดียวทั้งเอกสาร:
    \usepackage[kinnari]{fonts-tlwg}
    
  • ต้องการใช้ฟอนต์ครุฑผสมกับฟอนต์กินรี โดยฟอนต์ครุฑเป็นฟอนต์ปริยาย:
    \usepackage[sans,sfgaruda,rmkinnari]{fonts-tlwg}
    

เป็นฟีเจอร์ใหม่สำหรับ fonts-tlwg รุ่นหน้าที่จะรอออกรุ่นต่อไปครับ

ป้ายกำกับ: ,

01 กรกฎาคม 2557

Laksaman Font

จาก แผนการ ที่วางไว้สำหรับการดัดแปลงฟอนต์สารบรรณเพื่อผลักดันเข้า Debian ว่าจะตกลงใช้ Fonts-TLWG เป็นฐาน ก็ได้ใช้เวลาว่างทำเก็บเล็กผสมน้อยวันละนิด ขณะนี้ก็เริ่มเป็นรูปเป็นร่างแล้ว

สรุปสิ่งที่ปรับจาก TH Sarabun New

  • เปลี่ยนชื่อฟอนต์เป็น Laksaman (ลักษมัณ) โดยอิงตามชื่อที่ใช้ในฟอนต์ชุด Siampradesh แต่ตัด prefix SP ออก
  • ขยายตัวอักษรเป็น 150.42% เพื่อให้ match กับฟอนต์ตะวันตก และเข้ากันกับฟอนต์อื่นในชุด Fonts-TLWG
  • แปลง spline จาก quadratic เป็น cubic พร้อมทำความสะอาด spline
  • เพิ่ม Postscript hints
  • โละ GSUB rules ที่เกี่ยวกับภาษาไทยทิ้งทั้งหมด แล้วเพิ่ม GPOS, GSUB ตามแบบของ Fonts-TLWG
  • เพิ่ม glyph บางส่วนเพื่อรองรับภาษาชาติพันธุ์
  • เพิ่มการรองรับ LaTeX (pdfTeX) โดยเพิ่มเข้าในแพกเกจ fonts-tlwg
  • เพิ่มการสังเคราะห์ฟอนต์ TH Sarabun{PSK, New} บนเดสก์ท็อปผ่าน fontconfig

หลังจากตรวจความเรียบร้อยต่าง ๆ แล้ว คงสามารถออกรุ่นใหม่ได้เร็ว ๆ นี้ครับ

ป้ายกำกับ: ,

05 พฤษภาคม 2557

Thanks

ขอขอบคุณย้อนหลัง สำหรับผู้สนับสนุนงานพัฒนาซอฟต์แวร์เสรีของผมในช่วงเดือนกุมภาพันธ์-เมษายนที่ผ่านมา คือ:

ผมอาจจะสวัสดีปีใหม่ไทยช้าไปนิด ก็ขอให้ทุกท่านที่เอ่ยมาจงร่มเย็นเป็นสุขทุกท่านครับ

หากท่านอ่าน blog ขอบคุณของผมมาหลายครั้งแล้ว และสงสัยว่าจะสนับสนุนงานพัฒนาของผมได้อย่างไร ก็เชิญได้ที่หน้า การสนับสนุนงานพัฒนา ครับ

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

อย่างไรก็ดี งานบางงานที่ไม่ได้เขียนเป็น blog ต่างหากเนื่องจากเป็นงานรูทีนอยู่แล้ว หรือเป็นงานยิบย่อย ก็ขอเล่าเพิ่มเติมจากที่ blog ไปแล้วบ้าง เช่น:

  • งานแปล Xfce ได้แปลขึ้นไปจนถึง 86% แล้ว ก่อนที่จะเกิดการจัดโครงสร้างใหม่ใน Transifex ทำให้สถิติเริ่มเพี้ยน โดยในหน้า dashboard (ภายใต้โครงสร้างใหม่ ปรากฏว่าต้องเป็นสมาชิก transifex จึงจะดูได้) รายงานอัตราการแปลของภาษาไทยที่ 69.3% แต่จำนวนข้อความที่ยังไม่แปลเหลือเพียง 1,571 ข้อความ ซึ่งน้อยกว่าภาษาฟินแลนด์ที่อัตราการแปลสูงกว่าภาษาไทย คืออยู่ที่ 70.4% แต่เหลือข้อความที่ยังไม่แปลถึง 3,653 ข้อความ จึงทำให้เกิดความสับสนในค่าสถิติที่รายงาน
  • เสนอแพตช์ใน Xfce #10311 ที่ได้รายงานไว้เมื่อปีกลาย เกี่ยวกับการบอกเวลาเป็นคำพูดโดยประมาณ โดยขอปรับปรุงให้แปลเวลาเป็นไทยได้ถูกต้องยิ่งขึ้น เช่น ทำให้รายงานเวลาแบบนี้ได้ในพาเนล:
    Thai fuzzy clock
  • ปรับคำแปล dpkg และ apt สำหรับ Debian (มีผลใน dpkg 1.17.7 และ apt 1.0.2 ตามลำดับ)
  • ปรับคำแปล ISO 3166-2 ในแพกเกจ iso-codes เล็กน้อย หลังจากได้แปลชื่อเมืองใน Orage ของ Xfce (มีผลใน iso-codes 3.53) พร้อมกันนี้ก็ได้ปรับคำแปลใน libgweather locations ของ GNOME ไปพร้อมกันด้วย

แผนงานต่อไป เรื่องหลักก็จะเป็นการผลักดันฟอนต์สารบรรณเข้า Debian ตามแผนที่วางไว้ครับ

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

30 เมษายน 2557

Sarabun Plan

หลังจากที่ได้ ตั้งใจไว้ ว่าจะผลักดันฟอนต์สารบรรณเข้า Debian ให้ทัน Jessie แต่ก็ติดภารกิจอื่นจนตอนนี้เพิ่งมีเวลามานั่งคิดต่อ

ความต้องการ

พูดถึง requirement เกี่ยวกับฟอนต์สารบรรณ มีเงื่อนไขสองเรื่องหลักที่ต้องพิจารณา คือ

  1. License จะต้องเสรี ไม่เป็น postcardware license
  2. การใช้งานกับ LaTeX ซึ่งมีผู้ใช้สอบถามเข้ามาหลายครั้ง หลังจากที่หน่วยงานต่าง ๆ ถูกบังคับให้ต้องใช้ฟอนต์สารบรรณในหนังสือราชการต่างๆ ผู้ที่ใช้ LaTeX เตรียมเอกสารจึงต้องสามารถใช้ฟอนต์นี้ได้ ซึ่งแน่นอนว่าการดัดแปลงฟอนต์จำเป็นต้องผ่านเงื่อนไขความเสรีของ license มาก่อน

ทรัพยากรที่มีอยู่

ฟอนต์สารบรรณมีการออกรุ่นอย่างเป็นทางการจากต้นน้ำสองรุ่น และแตกแขนงไปอีกอย่างน้อยสองรุ่น กล่าวคือ:

  • TH Sarabun PSK ซึ่งอยู่ในชุดเริ่มแรกของ ฟอนต์มาตรฐานราชการไทย ที่เผยแพร่โดยกรมทรัพย์สินทางปัญญาร่วมกับ SIPA ซึ่งเป็น postcardware
  • TH Sarabun New ซึ่งปรับปรุงใหม่โดย SIPA ร่วมกับคุณศุภกิจ เฉลิมลาภ ผู้พัฒนา TH Sarabun PSK โดยออกรุ่นภายใต้สัญญาอนุญาต GPL 2 + Font Exception เผยแพร่อยู่ที่ f0nt.com
  • SP Laksaman ซึ่งผมดัดแปลงจาก TH Sarabun PSK ในชุด ThaiFonts-Siampradesh ภายใต้การว่าจ้างของ SIPA ผ่านบริษัทเมตามีเดีย เทคโนโลยี ซึ่งแน่นอนว่ายังใช้สัญญาอนุญาตแบบ postcardware ตาม TH Sarabun PSK การดัดแปลงที่สำคัญได้แก่การขยายขนาดตัวอักษรทั้งหมด โดยใช้อัตราส่วนที่ทำให้ตัวโรมันมีขนาดเท่า ๆ กับฟอนต์ตะวันตกที่ point size เดียวกัน และการแปลงเส้นโค้งจาก quadratic เป็น cubic พร้อมทำความสะอาดเพื่อเตรียมพร้อมสำหรับการแก้ไขดัดแปลงต่อไป
  • Sarabun ภายใต้โครงการ googlefontdirectory ซึ่งได้รับอนุญาตจากเจ้าของลิขสิทธิ์ให้เผยแพร่ภายใต้สัญญาอนุญาต OFL

อย่างไรก็ดี มีอีกปัจจัยหนึ่งที่ต้องพิจารณาประกอบ คือ การอนุญาตให้ relicense ฟอนต์ชุดมาตรฐานราชการไทย ซึ่งยังคงค้างอยู่ที่การรอการเผยแพร่ฟอนต์ภายใต้ license ใหม่จากต้นน้ำอย่างเป็นทางการ ซึ่งหากดำเนินการเสร็จ เราจะได้ฟอนต์ที่เสรีอย่างแท้จริงถึง 10 หรือ 13 ฟอนต์ (ขึ้นอยู่กับ 3 ฟอนต์ที่ผู้สร้างยังประกาศถือครองลิขสิทธิ์อยู่ในตัวฟอนต์ ไม่ได้ยกให้กรมทรัพย์สินทางปัญญาและ SIPA) ซึ่งเรื่องได้ค้างอยู่ตรงนี้มาเกือบ 3 ปีแล้ว

ทางเลือกที่เป็นไปได้

จากความต้องการและสิ่งที่มีอยู่ พอจะคิดทางเลือกออกมาได้ดังนี้:

  1. ใช้ SP Laksaman เป็นฐาน ซึ่งต้องผ่านขั้นตอนทางกฎหมายเสียก่อน พร้อม ๆ กับอีก 9 ฟอนต์ที่เหลือ ข้อดีคือฟอนต์พร้อมแก้ไขแล้ว และจะได้ฟอนต์โพสต์สคริปต์ที่ทำความสะอาดแล้วด้วย เหมาะกับการดัดแปลงใช้กับ LaTeX อย่างเต็มที่ แต่ข้อเสียคือยังขาดความชัดเจนในข้อกฎหมาย ซึ่งถ้าชัดเจนแล้วก็อาจจะได้ฟอนต์ Siampradesh ทั้ง 10 ฟอนต์มาพร้อมกันเลย
  2. ใช้ TH Sarabun New เป็นฐาน ไม่มีปัญหาเรื่องข้อกฎหมาย โดยอาจมีการดัดแปลงเพื่อใช้กับ LaTeX หรือมิฉะนั้นก็พยายามใช้ฟอนต์ TrueType กับ LaTeX โดยตรง ทางเลือกนี้มีข้อดีคือฟอนต์จะเหมือนกับสารบรรณที่ใช้โดยราชการไทยทุกประการ ข้อเสียคืออาจไม่คล่องตัวนักในการแก้ไขดัดแปลงเพราะผูกติดกับชื่อฟอนต์อยู่
  3. ใช้ Google Sarabun เป็นฐาน ไม่มีปัญหาเรื่องข้อกฎหมายเช่นกัน ข้อดีข้อเสียคล้ายกับการใช้ TH Sarabun New สิ่งที่แตกต่างอาจเป็นผู้ดูแลต้นน้ำเท่านั้น และทางเลือกนี้ดูจะมีช่องทางติดตั้งโดยตรงใน Debian อยู่แล้ว (ผ่านแพกเกจ typecacher แต่ขณะนี้ยังไม่มี Sarabun ในรายชื่อ) แต่จะขาดการรองรับการใช้งานใน LaTeX (pdfTeX) เท่านั้น
  4. ใช้ Fonts-TLWG เป็นฐาน เป็นอีกทางเลือกหนึ่งที่เป็นไปได้ เนื่องจาก Fonts-TLWG จะรวบรวมฟอนต์เสรีมาปรับต่ออยู่แล้ว ทำไมจะเพิ่มฟอนต์อีกสักตัวไม่ได้? แนวทางนี้อาจหยิบฟอนต์สารบรรณหรือลักษมัณมาปรับตามมาตรฐานฟอนต์ TLWG โดยใช้ฟีเจอร์ OpenType (GPOS, GSUB) เต็มรูปแบบ ตัด hack ทิ้ง พร้อมปรับใช้กับ LaTeX (pdfTeX) ด้วยโครงสร้างที่พัฒนาใน TLWG มาอยู่แล้ว

หลังจากพิจารณาทางเลือกต่าง ๆ ทางเลือกที่เป็นอุดมคติสำหรับผมคือการพัฒนาต่อจากฟอนต์ชุด Siampradesh (ทางเลือกที่ 1) เพราะได้เตรียมการไว้พร้อมหมดแล้วทั้ง 10 ฟอนต์ แต่ความไม่ชัดเจนในข้อกฎหมายทำให้ยังไม่กล้าลงมือทำ หนังสือราชการที่เวียนเป็นการภายในของ SIPA และกรมทรัพย์สินทางปัญญาจะเพียงพอหรือไม่ที่ผมจะ relicense ฟอนต์ Siampradesh เอง? ทางเลือกที่ผู้ใช้ส่วนใหญ่อยากได้ที่สุดน่าจะเป็น 2 หรือ 3 คือผลักดันเข้าไปตรง ๆ โดยไม่ต้องไปแตะต้องอะไรมันเลย แต่การปรับใช้กับ LaTeX จะเป็นเรื่องไม่สะดวกเอามาก ๆ รวมถึงการปรับปรุงทางเทคนิคให้เข้ากับข้อกำหนดต่าง ๆ ก็ขึ้นอยู่กับผู้ดูแลต้นน้ำเป็นหลัก ซึ่งพิจารณาดูแล้ว แม้แต่ Google เองซึ่งมีผู้เชี่ยวชาญ typography มาดูแล ก็ยังไม่ได้ทำอะไรกับรายละเอียดทางเทคนิคในตัวฟอนต์เลย

ดังนั้น ทางเลือกที่ 4 (ใช้ Fonts-TLWG เป็นฐาน) จึงเป็นทางเลือกที่ผมคิดว่าดีที่สุด และเมื่อได้ลองหยั่งเสียงสมาชิก KKLUG ในการประชุม โสเหล่ 57.04 ที่ผ่านมา ก็ดูจะเห็นตรงกัน จึงคิดว่าจะเริ่มดำเนินการตามนี้เร็ว ๆ นี้ครับ

ป้ายกำกับ: ,

18 มีนาคม 2557

Fonts-TLWG 0.6.0

ออกไปแล้วเมื่อวาน สำหรับ Fonts-TLWG 0.6.0 สำหรับรุ่นนี้ การเปลี่ยนแปลงที่สำคัญที่ทำให้ถึงกับต้องเพิ่มเลขรุ่นที่เลขกลาง ก็คือการรองรับภาษาชาติพันธุ์อย่างมีการเตรียมการ

สำหรับข้อมูลเบื้องต้นเกี่ยวกับภาษาชาติพันธุ์ กรุณาอ่าน blog เก่า และ บทความของคุณอนงค์ เพิ่มเติม

ที่ว่า รองรับอย่างมีการเตรียมการ ก็เพราะในรุ่นก่อนก็สามารถรองรับได้ในระดับหนึ่ง หลังจากที่ Pango 1.31.0 (GNOME 3.6) ขึ้นไปได้โละ engine ภาษาไทยที่ใช้ วทท. 2.0 (มอก. 1566-2541) ทิ้ง และย้ายไปใช้ HarfBuzz จัดการแทน ก็ทำให้กระบวนการวาดภาษาไทยย้ายหนีจาก วทท. 2.0 มาเป็น normalization ตามข้อกำหนดยูนิโค้ด โดยปริยาย ซึ่งข้อกำหนดนี้จะผ่อนคลายกว่า วทท. 2.0 ที่ผูกติดกับภาษาไทยเพียงภาษาเดียว เพราะยูนิโค้ดได้เตรียมการเผื่อการใช้อักษรไทยเขียนภาษาชาติพันธุ์ต่าง ๆ เอาไว้ด้วย ทำให้ฟอนต์ชุด TLWG รุ่นเก่าก็สามารถใช้เขียนภาษาชาติพันธุ์ได้ทันที แต่จะเป็นการวางอักขระซ้อนกันแบบไม่มีการจัดตำแหน่ง บางกรณีก็วางแล้วไม่ซ้อนกัน บางกรณีก็ซ้อนทับกัน แต่ในฟอนต์รุ่น 0.6.0 นี้ มีการออกแบบเพื่อรองรับกรณีต่าง ๆ ให้จัดวางอักขระได้อย่างสวยงาม

ข้อกำหนด วทท. 2.0 นั้น มีลำดับการซ้อนสระและวรรณยุกต์ตายตัวตามอักขรวิธีภาษาไทย แต่เมื่ออักษรไทยถูกใช้เขียนภาษาชาติพันธุ์ จะมีการดัดแปลงอักขระบางตัวเพิ่มเติม เช่น ใช้ไม้ไต่คู้กำกับเหนือสระบน ใช้วรรณยุกต์เหนือไม้ไต่คู้ ใช้ทัณฑฆาตหรือยามักการเป็นวรรณยุกต์เพิ่มเติม การประพินทุใต้สระ การวางสระบนเหนือสระอา หรือกระทั่งดัดแปลงไม้ตรีใช้เป็นสระพิเศษ!

Ethnic languages using Garuda font

ภาษาชาติพันธุ์ที่ใช้ในรูป (ตั้งแต่บรรทัดที่สองเป็นต้นไป ส่วนบรรทัดแรกใช้ทดสอบฟอนต์ตามข้อกำหนดยูนิโค้ดเท่านั้น) :-

  • ภาษากูย/ส่วย (สุรินทร์) [1]:
    • ปะเฺติ็ลฺ = ขันตักน้ำ
    • โฺญฺ็จฺ = หยุดกึกเพราะกลัวหรือตกใจ
  • ภาษาเขมรถิ่นไทย (สุรินทร์):
    • ปั็วฮฺ
    • ทฺ็อง
    • เปฺิ็ว
    • มูํย
  • ภาษาบรู/ข่า:
    • แต็่ง = to spread
    • เจฺํอ = already
    • เปรฺิ่ห์ = dirty
    • โจ๊่ = bunch of bamboo
    • เปฺี่ย = to mix
  • ภาษาโส้:
    • โฺทร = โส้ (ชื่อภาษา)
  • ภาษาช์อง (จันทบุรี):
    • ม็่อง
  • ภาษาญัฮกุร [อ่านว่า ญะกุ้น] (ชัยภูมิ):
    • เติ็ง
  • ภาษาละว้า:
    • อาื = chase
    • ยาึ = mine
  • ภาษามลายูปาตานี [2]:
    • จือรฺุ
    • การฺู

การใช้งานเหล่านี้ นอกจากทำให้ต้องยกเครื่องจาก วทท. 2.0 เป็นยูนิโค้ดแล้ว ยังมีผลต่อการออกแบบฟอนต์ที่ต้องรองรับกรณีพิเศษเพิ่มเติมด้วย

สำหรับฟอนต์ TrueType/OpenType สิ่งที่ทำเพิ่มก็คือ:

  • เพิ่ม glyph สำหรับอักขระยกสูงเพิ่มเติม นอกจากชุดวรรณยุกต์ปกติในฟอนต์ทั่วไปแล้ว ก็ต้องมีไม้ไต่คู้ นิคหิต และยามักการยกสูงเพิ่มด้วย โดย glyph ชุดนี้จะมีขนาดย่อส่วนลงเล็กน้อย แต่ไม่ใช่ scale down ตามปติ เพราะจะทำให้ได้เส้นที่บางลง แต่จะเป็นการวาดด้วยเส้นหนาเท่าเดิมให้ตัวเล็กลง
  • เพิ่มกฎ GSUB ในการแปลงอักขระชุดดังกล่าวให้เป็นตัวยกสูง โดยต้องครอบคลุมทุก combination ไม่ใช่แค่ที่มีในภาษาไทย
  • เพิ่ม anchor ให้กับอักขระเหนือบรรทัด ให้สามารถซ้อนกันได้ครบทุกคู่ ไม่ใช่แค่ที่มีในภาษาไทย
  • เพิ่ม anchor ชนิด BelowMark อีกชนิดหนึ่งในตาราง 'mkmk' (mark to mark) เพื่อรองรับการซ้อนสระล่างใต้พินทุ พร้อมทั้งเพิ่ม anchor ให้กับ glyph แต่ละ glyph ให้ครบ

นอกจากนี้ ยังได้ ส่งแพตช์ สำหรับแก้ให้ HarfBuzz normalize อักขระใต้บรรทัดให้พินทุมาก่อนสระล่างอย่างถูกต้องด้วย ซึ่งแพตช์ยังอยู่ระหว่างอภิปราย

แต่เนื่องจากฟอนต์ชุด TLWG ยังมีการใช้งานใน LaTeX (pdfTeX engine) ด้วย ซึ่งใน LaTeX ยังคงใช้ PUA glyph แบบเก่า (ที่เรียกกันว่า ตัวหลบ) อยู่ ไม่สามารถใช้ประโยชน์จากการปรับข้อมูล OpenType ข้างต้นได้ จึงต้องปรับขยายกฎ LIGKERN ให้ครอบคลุมกรณีของภาษาชาติพันธุ์เพิ่มเติม กล่าวคือ ต้องเพิ่มกฎต่อไปนี้:

  • ใช้วรรณยุกต์ยกสูงถ้าตามหลังไม้ไต่คู้ วรรณยุกต์ หรือทัณฑฆาต (กฎ LIGKERN ใน LaTeX จะใช้วรรณยุกต์ตัวลดต่ำโดยปริยาย แล้วค่อยใช้กฎ LIGKERN ยกให้สูงขึ้น ซึ่งจะกลับกันกับฟอนต์บนเดสก์ท็อป)
  • ใช้วรรณยุกต์ยกสูงหลบซ้ายถ้าตามหลังไม้ไต่คู้ วรรณยุกต์ หรือทัณฑฆาตที่หลบซ้าย
  • ใช้สระบนที่หลบซ้ายถ้าตามหลังพินทุที่ตามหลังพยัญชนะหางยาว (ป ฝ ฟ ฬ)
  • ใช้สระอุ อู ลดต่ำเมื่อตามหลังพินทุ
  • generalize กฎอื่น ๆ ที่บังเอิญเจาะจงเฉพาะกรณีที่ปรากฏในภาษาไทยไว้ เช่น ใช้นิคหิตหลบซ้ายหลังสระอูและพินทุที่ตามหลังพยัญชนะหางยาว, ใช้สระบนหลบซ้ายถ้าตามหลังสระอุ อู ที่ตามหลังพยัญชนะหางยาว)

นั่นคือสิ่งที่ทำได้ในตอนนี้สำหรับ LaTeX ยังมีกรณีที่ขาดเหลืออยู่ซึ่งยังไม่สามารถทำได้ เนื่องจากตาราง LTH encoding เต็มแล้ว ไม่มีช่องเหลือให้เพิ่ม PUA glyph เช่น

  • ยามักการยกสูง
  • ไม้ไต่คู้ นิคหิต ยามักการ ที่ยกสูงและหลบซ้าย

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

Ethnic languages in LaTeX

ผลพลอยได้ระหว่าง fine-tune ฟอนต์ก็คือ ได้เพิ่มฟอนต์ Umpush Light สำหรับการใช้งานใน LaTeX แล้วด้วย โดยสามารถกำหนดฟอนต์ด้วยคำสั่ง \usefont เช่น

  \usefont{LTH}{umpush}{l}{n}   % ตัวตรง
  \usefont{LTH}{umpush}{l}{it}  % ตัวเอียง

Umpush Light in LaTeX

ฟอนต์รุ่นนี้ ได้อัปโหลดเข้า Debian sid (สำหรับเดสก์ท็อป) และที่ CTAN (สำหรับ LaTeX) แล้วทันทีหลังจากออกรุ่นที่ต้นน้ำ สำหรับ LaTeX ใน Debian นั้น ต้องรอทีม TeX ของ Debian อัปเดตพร้อมกับภาษาอื่น ๆ ในแพกเกจ texlive-lang-other ต่อไป

อ้างอิง:

[1]
นเรศ นโรปกรณ์. (๒๕๓๖). อัจฉริยลักษณ์และความเป็นวิทยาศาสตร์ของลายสือไทย. พิมพ์ครั้งที่ ๑. กรุงเทพฯ : โอเดียนสโตร์. ISBN 974-276-975-3.
[2]
ราชบัณฑิตยสถาน. (๒๕๕๓). คู่มือระบบเขียนภาษามลายูปาตานีอักษรไทย ฉบับราชบัณฑิตยสถาน. พิมพ์ครั้งที่ ๑. กรุงเทพฯ : ราชบัณฑิตยสถาน. ISBN 978-616-7073-25-5.

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

hacker emblem
No PAD No UDD
No Violent Mob