อันนี้เป็นปัญหาระดับโลกนะครับ ไม่ใช่เฉพาะภาษาไทย ตัวละตินของภาษาเวียดนามก็โดนเหมือนกัน และก็ไม่ใช่ปัญหาของฟอนต์อย่างเดียว มีสาเหตุมาจากโอเอสและโปรแกรมที่ใช้งานฟอนต์ด้วย การปรับค่า Asc/Des ช่วยได้ระดับหนึ่ง โดยเฉพาะใน Windows เหตุผลที่ทำให้เราสับสนคือมันมีค่า Asc/Des สองแบบที่ไม่ใช่อันเดียวกัน อันแรกคือ General Asc/Des ที่เรากำหนดสำหรับ font views เวลาวาดตัวอักษรนั่นแหละ คือ
Asc + Des = Em size เช่น 960 + 240 = 1200 เป็นต้น ตามภาพด้านล่างนี้ (จากเทมเพลต f0ntuni-a ที่เปิดด้วย FontForge โปรแกรมอื่นก็คงมีวิธีปรับเหมือนกันมั้ง?) ซึ่งมันจะเพียงพอสำหรับตัวละตินพื้นฐานที่ไม่มี diacritics บน-ล่างเท่านั้น
ส่วนอันที่สองคือ OS/2 metrics ตามภาพต่อไปนี้
ในอุดมคติ เราตั้งค่า OS/2 metrics เพื่อบอก OS ว่าอย่าจัดการค่าแนวตั้งในฟอนต์ของเราตามอำเภอใจนะ ให้ใช้ตัวเลขที่เรากำหนดเท่านั้น ในภาพคือไม่ให้มัน Offset (ไม่เลือก Is Offset คือโอเอสไม่ต้องตัดและไม่ต้องเผื่อพื้นที่สำหรับ leading/line spacing/line height ประมาณนั้น) แต่ในทางปฏิบัติมันอาจไม่เชื่อฟังเราครับ และที่ทำให้สับสนยิ่งกว่านั้นคือ
ค่า Win Des ต้องเป็นบวก ในขณะที่โอเอสอื่นต้องใช้ค่าเป็นเลขลบ (ด้วยเหตุนี้ FontForge เลยแยกไว้ให้ เพราะมันใช้ค่า Des ไม่เหมือนชาวบ้าน)
จะเห็นว่าค่า Asc/Des ใน OS/2 metrics ที่ผมกำหนดในภาพที่สองไม่เหมือนค่าของภาพแรก เพราะจากประสบการณ์สู้รบระหว่างฟอนต์กับโอเอสพบว่า
ค่า OS/2 Asc ของฟอนต์ไทยควรเท่ากับจุดสูงสุดของวรรณยุกต์ตัวสูง (ส่วนใหญ่คือไม้โทหรือไม้ตรีที่ไม่ได้ถูกดึงลงมา หรือถ้าสระโอของคุณสูงกว่าไม้โทไม้ตรี ก็ใช้ค่าของสระโอ เป็นต้น) ส่วน Des ควรเป็นจุดต่ำสุดของสระล่าง (ส่วนใหญ่คือสระอูที่ถูกดึงต่ำสำหรับใช้กับ ฏ.ปฏัก) จะเห็นว่า 1240 + 480 มันเกิน General Asc/Des ตามภาพที่หนึ่งแน่ๆ (ยกเว้นคุณจะเพิ่ม Em size ซึ่งทำให้ตัวอักษรเล็กลง และผมไม่แนะนำ)
เหตุผลที่ว่าทำไมส่วนบนล่างของตัวอักษรจึงถูก crop ไม่ใช่ปัญหาที่มาจากฟอนต์อย่างเดียว เพราะโอเอสหรือโปรแกรมที่ใช้งานฟอนต์มักให้ผู้ใช้กำหนด leading/line height ได้เอง ยกตัวอย่างในโปแกรมประเภท word processor ถ้าเรากำหนด line spacing ไว้น้อยมากๆ สำหรับฟอนต์ไทย บางโปรแกรมก็อาจจะ crop ส่วนที่สูงหรือต่ำกว่า บางโปรแกรมก็อาจจะไม่ crop แต่ยอมให้ตัวอักษรทับซ้อนกันแทน เป็นต้น สรุปสั้นๆ คือ มันไม่สนใจค่าที่เรากำหนดไว้ในฟอนต์นั่นเอง
ส่วนคำถามที่ว่า
มีวิธีอื่นไหมที่จะแสดงผลฟอนต์แบบไม่ถูก crop โดยไม่แคร์ระยะบรรทัดอะไรเลย? คำตอบสั้นๆ เท่าที่ผมรู้คือ
ไม่มีครับ เราทำได้ดีที่สุดคือกำหนดค่า OS/2 metrics ที่เหมาะสมสำหรับฟอนต์ของเรา ที่เหลือเป็นอิสระของผู้ใช้ที่จะกำหนดระยะบรรทัดที่เหมาะสมในโปรแกรมที่เขาใช้งานเอง อันนี้ไม่ใช่ความผิดของฟอนต์แล้ว