สวัสดีครับ
ขอถามเป็นแนวคอนเซปต์นะครับ
ว่าเราพอจะเขียนโค้ดหรือกำหนดค่าการ mark ระดับที่ 2 ให้มันไม่ไปทับ mark ตัวอื่นไหมครับ
อะนี่คือปัญหาที่เจอและต้องการแก้ไขครับ
(http://img3.f0nt.com//2026-01/ce8b402e65f280cb040e.jpg)
ผมจัด mark ไว้แบบนี้ครับ
บ = top (ใช้กับสระบน), mai2 (ใช้กับไม้โท ...ที่จริงมี mai1-mai8 เลย แต่ขอไม่พูดถึงเดี๋ยวเยอะไป), bottom (ใช้กับสระล่าง)
สระอี = _top (สมอปักสระบน) , mai2 (ใช้กับไม้โท)
สระอู = _bottom (สมอปักสระล่าง)
ไม้โท = _mai2
ถ้าพิมพ์คำว่า บี้ หรือ บ้า
มันแสดงผลได้ตามปกติถูกต้องตามตำแหน่งที่ปักสมอไว้
แต่ถ้าพิมพ์คำว่า บู้ ทีนี้ ไม้โทมันจมลงมา เหมือนเราไม้โทเอาไปวางปักสมอบนสระอูครับ
(http://img3.f0nt.com//2026-01/2b1b64b8c1fac6e91c0d.png)
ถ้าเปิด mkmk preview จะเจอปัญหานี้
แต่ถ้าปิด มันจะแสดงผลได้สวยงามอย่างที่อยากให้เป็น (ซะงั้น) (แต่พวก mark สระวรรณยุกต์คู่อื่นๆ พังนะ)
(http://img3.f0nt.com//2026-01/884e86e93bc375b4395b.png)
(http://img3.f0nt.com//2026-01/c3193052a8f628b18dcb.png)
ผมทดลองทำกับฟอนต์กระต่าย ได้พี่เจปีศาจฟอนต์มาช่วยดูให้
ทางแก้ตอนนั้นคือให้ใส่ _top ที่ไม้โท เพื่อเอาไว้เสียบสมอเหนือ บ
แบบนั้นก็ถือว่าพอได้อยู่ครับ
แต่ทีนี้ใจจริง ไอ้เจ้า anchor ชื่อ top เนี่ย ผมตั้งใจให้มันเป็นแก๊งสระบน (มีหลายตัว เช่น อิ อี อั อ็ อํ) ครับ
ในขณะที่ mai ต่างๆ ผมเอาไว้ให้สำหรับวรรณยุกต์ (ซึ่งมีทั้งแบบตำแหน่งสูง และตำแหน่ง .low ที่แยกเป็นอีก glyph นึง)
และคำถามคือ
ทำไงให้ พยัญชนะ + mark1 + mark2
แล้ว mark2 มันไปเกาะกับพยัญชนะ แทนที่จะเกาะ mark1 ครับ
หรือมี solution อะไรที่เป็นวิธีแก้ไขกรณีนี้ได้บ้างครับ
อันนี้ไฟล์ ttf / otf และ fontlab source ครับ
https://drive.google.com/open?id=1DTqcXv26nX-KvUBUiWWdKJNyT96edbgH&usp=drive_fs
:46: :46: :46:
ดีที่ส่ง file ตัวอย่างมาให้ และทำคำว่า low ไว้ด้วย ..ไม่งั้น ดูรูปให้ตายก็เดาไม่ออก
สรุปคือ..ไม่ได้ผิดที่ mark แต่อย่างใด ผิดที่วงสีแดง --> ทำไม บ้ ใช้ ไม้โท low แล้วที่วงสีเขียว บุ้ ไม่ใช้ไม้โท low ด้วยล่ะ???
(http://img3.f0nt.com//2026-01/66759d01592f6a00b7dc.jpg)
solution 1
ไม้โท low ให้ทำเหมือนสระ คือใช้ mark (คู่กับ mark base ของพยัญชนะ) แต่ไม่ต้องใช้ mark on mark (ในวงกลมสีแดง มีแค่ mark ตัวเดียวพอ สีเหลืองยังไม่ต้องสนใจ เดี๋ยวเล่าให้ฟัง)
(http://img3.f0nt.com//2026-01/ed691d3811f376faea05.jpg)
ดังนั้น แค่ไปเพิ่ม function ที่ระบุว่า บ (พยัชญะ) ตามด้วย ุ (ุสระล่าง) ให้เปลี่ยน ไม้โท (วรรณยุกต์) เป็น ไม้โท low และ ลบ mark on mark ใน ไม้โท low ทิ้งไป ก็หายแล้วครับ
solution 2
จริงๆแล้ว ถ้าแอนไม่ได้จะทำ วรรณยุกต์ชั้น 3 ให้เล็กลง ก็ไม้ต้องเขียนโปรแกรม เป็น ไม้โท เป็นไม้โท low ก็ได้ครับ แค่ กำหนด ให้ไม้โทมีทั้ง mark และ mark on mark (ในวงกลมสีแดง จริงๆอยู่ตำแหน่งเดียวกัน แต่กลัวอ่านไม่ออก แล้วขยับให้มองเห็นว่ามี 2 ระบบ) แค่นี้ ก็เสร็จแล้วเช่นกัน
(http://img3.f0nt.com//2026-01/13639d4f317a0b5f8c52.jpg)
แถม.. ส่วนสีวงสีเหลือง คือส่วนที่ แอน อยากทำ วรรณยุกต์ ซ้อนกัน .. ให้ใช้ระบบ mark on mark โดยกำหนดให้ตัวเอง เป็นทั้ง mark และ base (mark อยู่ล่าง base อยู่บน มันจะซ้อนขึ้นไปเรื่อยๆ -- แต่ถ้าเป็นอักษรธรรม ไต ขอม มอญ พม่า ก็กลับกัน mark อยู่บน base อยู่ล่าง)
สรุป concept ของ mark และ mark on mark สำหรับอักษรไทยสำหรับภาษาไทย ตามที่ผมเข้าใจนะครับ
1. mark ใช้ จัดการ สระล่าง(ุ ุ ู ฺ ) สระบน( ิ ี ื ึ ั ํ ็–๎) รวมทั้งวรรณยุกต์ชั้น 2 ( ่ ้ ๊ ๋ ์)
1.1 mark base คือตำแหน่งอ้างอิง จะอยู่ที่พยัญชนะ
1.2 mark ตำแหน่งของ สระ วรรณยุกต์ จะอยู่ที่ตัวมันเอง
2. mark on mark (mkmk) ใช้ วรรณยุกต์ชั้น 3 ( ่ ้ ๊ ๋ ์) บนสระบน( ิ ี ื ึ ั ํ)
2.1 mkmk base คือตำแหน่งอ้างอิง จะอยู่ที่ สระบน( ิ ี ื ึ ั ํ)
2.2 mkmk ตำแหน่งของวรรณยุกต์ชั้น 3 จะอยู่ที่ตัวมันเอง
** ดังนั้น เราไม่ใช้ mark on mark บน พยัญชนะ นะครับ
** เราไม่มองว่า ( ่ ้ ๊ ๋ ์) ที่พิมพ์หลัง (ุ ุ ู ฺ ) เป็นวรรณยุกต์ชั้น 3 นะครับ --> ต้องนับตามที่ตาเห็น ไม่ใช้ code ใน computer จ้า
3. กรณี อักษรภาษาไทยสำหรับภาษาบาลี มีตัวพิเศษคือ กิํ (อ่านว่ากิง) ก สระอิ นิคหิต ไม่ใช้ ก สระอึ ..นอกนั้นใช้ปรกติ เช่น สํ (อ่านว่า สัง)
อันนี้ ให้มอง สระอำ(นิคหิต) ให้เป็นทั้ง สระบน และ วรรณยุกต์ชั้น 3
3.1 มี mark แบบ 1.2
3.2 มี mkmk base แบบ 2.1
3.3 มี mkmk แบบ 2.2
ขอบคุณครับ :25: :25: :25: :25:
เข้าใจแล้วววววว
(http://img3.f0nt.com//2026-01/9532036c6edd9a22525a.png)
คอนเซปต์คือพวกวรรณยุกต์(บน)ล่างที่ซ้อนเนี่ย ผมก็ตัดทิ้งไปเลย ไม่ต้องทำรูเสียบรอไว้
เพราะไม่งั้นมันจะดึงใครๆ ที่อยากมาเสียบให้พ่วงลงมาข้างล่างครับ
พอมาดูการจัดกลุ่มสระวรรณยุกต์ ก็จะเป็น
- top = สระวรรณยุกต์ชั้นปกติ // และ mai678 = (นิคหิต ไม้หันอากาศ ไม้ไต่คู้)
- mai12345 = วรรณยุกต์ (ไม้เอกโทตรีจัตวาทัณฑฆาต)
- bottom = สระล่าง
ดังนั้นตอนนี้ ชื่อ anchor marks ของผมก็จะมี
- พยัญชนะ = bottom, top, mai12345678
- สระบน (เลเวลธรรมดา) = mai12345678, _top
- วรรณยุกต์ = _mai12345678
- สระล่างผมก็เลยเหลือแค่ _bottom
ตอนนี้ลองละ ใช้ได้ครับ ขอบคุณมากๆ เลย :25: :25: :25: :25:
ที่จริงพวกวรรณยุกต์ .low นี่เป็น lagacy code ที่ผมไม่ได้ไปแตะมัน กลัวพังครับ :05:
พอเห็นคำแนะนำดังนี้ก็เลยลองว่า งั้นเอาออกเลยก็ได้นี่หว่า... ถ้าจะใช้ตัวไหนค่อยเขียนเอา
ดังนั้นพวกชุดนี้ก็จะลบออกครับ
feature ccmp {
# GSUB feature: Glyph Composition / Decomposition
# Lookups: 1
sub bobaimai-thai [maiek-thai maitho-thai maitri-thai maichattawa-thai thanthakhat-thai]' by [maiek-thai.low maitho-thai.low maitri-thai.low maichattawa-thai.low thanthakhat-thai.low];
} ccmp;
เอ๊ะมาคิดดูอีกที เดี๋ยวลองเก็บวรรณยุกต์ทั้ง low ทั้งไม่ low ไว้ดีกว่า :3005: เผื่อได้ใช้ในฟอนต์หน้าๆ ครับ
งั้นก็จะเป็น solution แรกที่พี่บอกครับ
ส่วนการเขียนโค้ด ผมโยนไปถาม Gemini ให้น้องบ้วนออกมาให้ครับ :25: :25: :25:
และนี่คือเหล่า ccmp ครับ
อ้างอิงlookup ccmp_4 {
# GSUB lookup 8, type 16 (Chaining Context)
sub @ccmp2 saraam-thai' lookup ccmp_5;
sub @ccmp2 [maiek-thai maitho-thai maitri-thai maichattawa-thai thanthakhat-thai]' lookup ccmp_7 saraam-thai' lookup ccmp_6;
# กรณี: พยัญชนะ + วรรณยุกต์ (เปลี่ยนเป็นตัวต่ำทันที)
sub @ccmp2 [maiek-thai maitho-thai maitri-thai maichattawa-thai thanthakhat-thai]' by [maiek-thai.low maitho-thai.low maitri-thai.low maichattawa-thai.low thanthakhat-thai.low];
# กรณี: พยัญชนะ + สระล่าง/พินทุ + วรรณยุกต์ (เปลี่ยนเป็นตัวต่ำ)
sub @ccmp2 [sarau-thai sarauu-thai phinthu-thai] [maiek-thai maitho-thai maitri-thai maichattawa-thai thanthakhat-thai]' by [maiek-thai.low maitho-thai.low maitri-thai.low maichattawa-thai.low thanthakhat-thai.low];
} ccmp_4;
สมบูรณ์แบบแล้วครับ :51: :51: :51: :51:
(http://img3.f0nt.com//2026-01/5a00a57f10de61d1b110.png)
- ใส่ low แบบนี้ก็สนุกดี :30:
- ให้ Gemini ตรวจความเรียบร้อยและเก็บตกนี่เวิร์กมากครับ
ขอบคุณครับบบบบบบ
:12: เจ๋งเลย :45: ยินดีด้วยที่บรรลุ ระบบ mark และ mark on makr แล้ว
วันหลัง สอนเรื่องการขอคำแนะนำจาก AI ในการทำฟอนต์ ให้ด้วยสิครับ น่าสนใจดี (ผมอ่านแล้ว ก็ยังนึกไม่ออกว่าคุยกันยังไง มันช่วยยังไง)
ได้เลยครับ
เวลาผมอ่านโค้ดแล้วตาลายไปหมดเลย ก็จะโยนไปถาม Gemini ครับ
บอกไปแบบเหมือนเราคุยกับเพื่อนนี่แหละ ว่า "ช่วยวิจารณ์โค้ดให้หน่อยดิ"
แล้วก็โยนโค้ดลงไปให้มันเป็นหลายร้อยบรรทัดเลยครับ
มันดูออกประมาณ 95% ครับ โดยเฉพาะถ้าเราตั้งชื่อหรือฟีเจอร์ให้มันอยู่ในมาตรฐาน
(แต่ถ้าฟอนต์ SOV ouj เอไอน่าจะระเบิด 5555555)
มันรู้หมดเลยว่าเราใช้ตัวนี้เพื่อทำ ญ หญิงไม่มีเชิง หรืออะไรแบบนี้ ละเอียดมากครับ
คือเอาจริงมันรู้จักการโค้ดฟอนต์ รวมถึงภาษาไทย ก็น่าทึ่งว่ามันมีข้อมูลของภาษาเราด้วย
และวิจารณ์การเขียนได้ว่าตรงไหนซ้ำซ้อน ตรงไหนควรตัด
ซึ่งเราเป็น user ก็ต้องพิจารณาแล้วตัดสินใจเอาเองจากคำแนะนำนั้นครับ
อ้อ ส่วนอันนี้ที่อยู่ในเม้นบน
# กรณี: พยัญชนะ + สระล่าง/พินทุ + วรรณยุกต์ (เปลี่ยนเป็นตัวต่ำ)
sub @ccmp2 [sarau-thai sarauu-thai phinthu-thai] [maiek-thai maitho-thai maitri-thai maichattawa-thai thanthakhat-thai]' by [maiek-thai.low maitho-thai.low maitri-thai.low maichattawa-thai.low thanthakhat-thai.low];
} ccmp_4;หลังจากให้โค้ดเดิมไปศึกษา
ผมบอกมันไปเลยว่า
อ้างอิงจากโค้ดตรงนี้ :
บรรทัด sub @ccmp2 [maiek...]' by [...low]; สั่งให้เปลี่ยนวรรณยุกต์เป็นตัวต่ำ (.low) ทันทีที่วางหลังพยัญชนะ
ผมอยากให้เพิ่มความสามารถโดยให้พยัญชนะ ตามด้วย สระล่าง (สระอุ สระอู และพินทุ) และตามด้วยวรรณยุกต์ต่ำ (ที่มี .low ต่อท้าย) ต้องเพิ่มโค้ดอะไร
น้องก็ทำมาให้ ไม่ดื้อ ไม่ซน คนไม่เก่งโค้ดอย่างผมก็ตาไม่ลายครับ :04:
:18: ว๊าว.. เห็นเป็น clip เลย (น้อน เไ นี่เก่งจริงๆ เก่งจริงๆ เก่งจริงๆ)