วันอาทิตย์ที่ 12 กรกฎาคม พ.ศ. 2569

[Font] บันทึกแก้ไขฟอนต์ JS Jindara (ตอนที่หนึ่ง)

ไฟล์สำหรับดาวน์โหลด์ มี 2 แบบ คลิกที่ชื่อฟอนต์เพื่อโหลดได้เลย (ลิงก์จะอัปเดตให้เป็นรุ่นล่าสุด)

- JS-Jindara (fix) [v.1.3] คือฟอนต์ JS-Jindara ที่แก้ไขเรื่องตัวหนา/เอน และวรรณยุกต์เท่านั้น

- Jindara [v.2.3] คือฟอนต์ที่ปรับขนาดให้ตัวใหญ่ตามมาตรฐานฟอนต์สมัยปัจจุบันและแก้ไขบางจุด (อ่านเพิ่มเติมในโพสต์)

* * * * * * * * * *

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

ฟอนต์ JS-Jindara นี้ เป็นฟอนต์ที่มีหลายคนนิยมใช้สำหรับทำหนังสือ/เอกสาร แต่ด้วยความที่เป็นเทคโนโลยีเก่า จึงมีปัญหาการแสดงผลกับโปรแกรมและระบบปฏิบัติการในยุคปัจจุบันอยู่บ้าง

ผมลองพยายามค้นหาฟอนต์ที่แก้ไขให้ใช้งานได้กับโปรแกรมปัจจุบัน แต่หาไม่เจอเลย จึงต้องมาลงมือทำเอง โดยใช้ไฟล์ฟอนต์ที่ดาวน์โหลดมาจากเว็บ TypeFaces (ฟอนต์อื่นๆ ในตระกูล JS)

ตัวฟอนต์ JS-Jindara นั้น (ตระกูล JS ทั้งหมด) ไม่ได้มีการกำหนดค่าของคุณลักษณะ (style map) เอาไว้ ทำให้เมื่อมีการติดตั้งฟอนต์ทั้งชุด (ธรรมดา, หนา, เอน, หนาเอน) เวลาเราทำตัวหนา ตัวเอน ตัวหนาเอน จะเกิดความผิดพลาด ไม่ได้แสดงลักษณะรูปแบบตามที่ต้องการ

ดังนั้นวิธีการแก้ไขก็คือไปกำหนด Style Map ของไฟล์ฟอนต์แต่ละตัวให้ถูกต้อง เท่านี้ก็จะแสดง ‘ตัวหนา ตัวเอน ตัวหนาเอน’ ได้อย่างถูกต้องสมบูรณ์แล้ว

ผมใช้โปรแกรม FontForge สำหรับการแก้ไข โปรแกรมนี้เป็นโปรแกรมที่ใช้งานได้ฟรี (Open Sourge) ทั้งบน MS Windows, Mac, Linux ดาวน์โหลดได้ที่ https://fontforge.org/en-US/downloads/ แล้วเลือกตามระบบปฏิบัติการที่ใช้งาน

เมื่อเปิดฟอนต์ขึ้นมาแล้ว คลิกที่เมนู Element / Font Info… จะมีหน้าต่าง Font Infomation ขึ้นมา

  • ด้านซ้ายมือ เลือกเมนู OS/2
  • ด้านขวามือ แท็บแรก (Misc.) ด้านล่างๆ ตรงช่องตัวเลือก Style Map: จากเดิมที่เป็น None ก็คลิกเลือกตามประเภทที่ต้องการคือ ตัวธรรมดา (Regular) / ตัวเอน (Italic) / ตัวหนา (Bold) / ตัวหนาเอน (Bold Italic)
  • กดปุ่ม OK



จากนั้นที่เมนู File ก็เลือก Generate Fonts… จะแสดงหน้าต่างตัวเลือกสำหรับบันทึกฟอนต์ ให้เลือกโฟลเดอร์และตั้งชื่อไฟล์ที่ต้องการ

ตัวเลือกอื่นๆ คือประเภทของฟอนต์ จะเลือกเป็น TrueType (นามสกุล .ttf) หรือ OpenType (CFF) (นามสกุล .otf) ก็ได้

จากนั้นกดปุ่ม Generate ก็เป็นอันเสร็จสิ้น

หากมีหน้าต่างแจ้งข้อผิดพลาดอะไรก็ข้ามไป ไม่ต้องสนใจ

เท่านี้ก็เป็นอันเสร็จสิ้น เอาฟอนต์ที่ได้ไปใช้ได้เลย ถ้าใครต้องการเอาฟอนต์ JS หรือฟอนต์เก่าอื่นๆ ไปใช้งาน ก็จัดการตามนี้ได้เลย


แต่ยังมีเนื้อหาเพิ่มเติมต่ออีก…

ฟอนต์ในยุคเก่า การทำเอกสารทั่วไปเราจะใช้ขนาด 14-16 Pt. ซึ่งเมื่อเราใช้งานโปรแกรม MS Word เวลาสลับพิมพ์ตัวภาษาอังกฤษ จะพบว่าขนาดนั้นแตกต่างจากภาษาไทย

ภาษาอังกฤษขนาด 10 Pt. จะใกล้เคียงกับภาษาไทย 14 Pt.

ภาษาอังกฤษขนาด 11 Pt. จะใกล้เคียงกับภาษาไทย 16 Pt.

ตรงนี้เป็นขนาดโดยประมาณ แต่ละฟอนต์อาจมีขนาดแตกต่างกันไปบ้าง


ในปัจจุบันเราใช้งานภาษาไทยร่วมกับภาษาต่างประเทศมากขึ้น ทำให้ขนาดของตัวอักษรเกิดอาการลักลั่นไม่สอดคล้องกัน เกิดปัญหาทั้งฝ่ายคนที่สร้างเนื้อหาและฝ่ายคนอ่าน ทำให้มีการนำเสนอแนวคิดปรับขนาดอักษรไทยให้ใช้งานกับอักษรสากลได้กลมกลืนยิ่งขึ้น (Multilingual Normalize) เพราะในปัจจุบันเราใช้สื่ออินเทอร์เน็ตที่แสดงผลภาษาต่างประเทศกันมาก (อ่านเพิ่มเติมที่บล็อก Thai Font Metrics)

ฟอนต์ของทาง Google Fonts เองก็ใช้แนวทางนี้เช่นกัน

ฟอนต์ที่ผมใช้เป็นหลักทุกวันนี้ก็เป็นฟอนต์ที่มีการปรับขนาดให้ใหญ่ขึ้นกว่าฟอนต์ยุคก่อน ดังนั้นผมเลยปรับขนาดฟอนต์ JS-Jindara ไปด้วยเลย โดยชุดที่มีการปรับแก้นี้ ผมใช้ชื่อฟอนต์ว่า Jindara (จินตหรา) โดยอิงจากการตั้งชื่อของ Google Font (คัดสรร ดีมาก) เช่น TH Sarabun → Sarabun

ขนาดตัวอักษรที่ใช้ ผมเลือกใช้ฟอนต์ Chakra Petch (จักรเพชร) ของ Google Font เป็นต้นแบบ

หลังจากเอามาเทียบสัดส่วนว่าต้องขยายขนาดกี่เปอร์เซ็นต์แล้ว (146.5%) ผมก็เลือกอักขระ (Glyph) ทุกช่องโดยกด Ctrl + a จากนั้นเลือกเมนู Element > Transformations > Transform…

จะแสดงหน้าต่าง Transform ขึ้นมา

Origin เลือก Center of Selection

Move เลือกเป็น Scale Uniformly...

เท่านี้ก็เป็นอันเสร็จสิ้นการปรับขนาด


แต่ในการใช้งานจริง ผมพบจุดขัดใจบางจุด จึงตัดสินใจแก้ไขเพิ่ม

1. ปรับความกว้างตัวเลขให้เป็นแบบความกว้างเท่ากันทุกตัว และขยายขนาดตัวเลขเพิ่มขึ้นอีกเล็กน้อย รวมทั้งปรับเลข 6 กับเลข 9 ให้สูงเท่าเลขอื่น แล้วปรับความหนาของเส้นตัวเลขให้เท่ากับตัวอักษรไทย

2. เว้นระยะด้านซ้ายขวาของ ‘’ “” เพิ่มเล็กน้อย พร้อมกับยกให้สูงขึ้นจากระดับเดิมอีกหน่อย

3. เพิ่มระยะห่างด้านหน้าของไม้ม้วนเมื่อไปต่อท้ายกับไม้โทแล้วซ้อนกัน

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

5. น ณ หัวกลมด้านขวาล่างของฟอนต์ JS-Jindara ค่อนข้างยื่นออกมาพอสมควร ซึ่งหางของอักขระสองตัวนี้เป็นเส้นชี้ขึ้น เมื่อประกบคู่กับไม้เอกหรือสระอี มันดูเยื้องๆ เลยขยับให้เยื้องเพิ่มขึ้น (ฉ เองก็มีหัวม้วนยื่นออกมาเช่นกัน แต่เส้นหางจะโค้งไปด้านหน้า จึงไม่ได้มีปัญหาเหมือน น ณ)

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

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

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

7. กรณีที่พิมพ์ช่องว่างด้านหน้าไม้ยมก จะทำให้ช่องว่างด้านหน้ากลายเป็นช่องว่างที่ไม่ตัดคำ

8. เมื่อพิมพ์สระเอสองตัวติดกัน ให้เว้นระยะของสระเอทั้งสองตัวมากขึ้นจนแตกต่างจากการพิมพ์สระแอ เพื่อให้รู้ว่าพิมพ์ผิด (ถ้าพิมพ์ใน MS Word หรือ LO Writer มันจะแก้สระเอสองตัวเป็นสระแออัตโนมัติ)

9. ปรับระยะห่างของ ใ ไ เมื่อต้องเอาไปต่อท้ายสระบนและวรรณยุกต์แล้วซ้อนชนกัน

10. เพิ่มตัวอักขระ ฤๅ ฦๅ


**ข้อที่ขีดฆ่าไว้ ตอนนี้ส่วนใหญ่เจอปัญหาว่าไม่ทำงานกับ MS Word และบางข้อตัดสินใจว่าเอาไว้ทำเป็นฟอนต์อีกตระกูล สำหรับงานเขียนโดยเฉพาะดีกว่า อันนี้พยายามคงเดิมเอาไว้**


ตอนแรกว่าจะเพิ่มคุณสมบัติแก้ไขคำอัตโนมัติลงไปด้วย เช่นการพิมพ์คำที่มีสระอำ+วรรณยุกต์ ปกติตามลำดับการพิมพ์คือต้องพิมพ์วรรณยุกต์ก่อน ถึงค่อยพิมพ์สระอำ เช่น "น้ำ" ต้องพิมพ์ น + ไม้โท + สระอำ แต่ลำดับการสะกดคำของไทยจะสะกดเป็น น + สระอำ + ไม้โท ซึ่งบางคนจะติดพิมพ์แบบนี้ แต่มันผิดหลักการจัดเก็บข้อมูล (ที่อิงมาตั้งแต่สมัยเป็นพิมพ์ดีด) เมื่อพิมพ์สระอำก่อน จะได้เป็น "นำ้" (ถ้าพิมพ์ใน MS Word หรือ LO Writer มันจะแก้ "นำ้" เป็น "น้ำ" ให้อัตโนมัติ)

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

โปรแกรมพิมพ์เอกสารส่วนใหญ่ สามารถจัดการแก้ไขลำดับตรงนี้ให้ถูกต้องอัตโนมัติ แต่บางโปรแกรมไม่มี


เมื่อจัดการเรื่องต่างๆ เสร็จสิ้น ก็จะได้ฟอนต์ Jindara มาใช้ ตอนแรกก็คิดว่าจะจบแค่นี้แล้ว เอาไปใช้งานได้อย่างมีความสุข


ทว่า… หลังจากที่เอาไปทดสอบใช้งานกับ MS Word บน Windows แล้วเจอปัญหาสำคัญอีกเรื่อง

ส่วนตัวผมใช้งาน Linux + LibreOffice Writer มาหลายปี ตอนใช้งานฟอนต์ ไม่เจอปัญหาอะไร ทดสอบใช้อยู่พักหนึ่งแล้วก็เอาไปทดสอบต่อบนเครื่องคอมพิวเตอร์คนอื่นที่เป็น Windows + MS Word ถึงพบปัญหาว่า… วรรณยุกต์ลอย!

พยายามหาวิธีแก้ไข แต่ก็ไม่ได้ผล

แต่ถ้าใช้งาน LibreOffice Writer บน Windows มันกลับแสดงผลวรรณยุกต์ได้ถูกต้อง (ผมทดสอบกับ LibreOffice รุ่นล่าสุด 26.2 บน Windows 11)

MS Word รุ่นใหม่ใช้ engine แสดงตัวอักษรที่ต่างไปจากรุ่นเก่า (น่าจะตั้งแต่ MS Office 2003 ลงไปมั้ง) ซึ่งไม่ได้จัดการกับชุดอักขระวรรณยุกต์ในระดับต่างๆ อย่างอัตโนมัติ

สุดท้ายต้องเขียนชุดคำสั่ง Open Type เพื่อจัดการกับเรื่องวรรณยุกต์เพิ่มเอง

ยกยอดไปเขียนต่อตอนที่สองในบล็อกหน้าละกัน


Reference


Keyword

Font, FontForge, ฟอนต์, ฟอนท์, JS Jindara, จินตหรา

ไม่มีความคิดเห็น:

แสดงความคิดเห็น