ฟอนต์ฟอรั่ม

สำหรับคนทำฟอนต์ => เทคนิคฟอนต์ => โพสต์ถูกเริ่มโดย: iannnnn เมื่อ 03 ม.ค. 2026, 01:02 น.

ชื่อเรื่อง: ทำยังไงให้ mark2 ไม่เกาะต่อจาก mark1
โพสต์โดย: iannnnn เมื่อ 03 ม.ค. 2026, 01:02 น.
สวัสดีครับ

ขอถามเป็นแนวคอนเซปต์นะครับ
ว่าเราพอจะเขียนโค้ดหรือกำหนดค่าการ 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:
ชื่อเรื่อง: ตอบ: ทำยังไงให้ mark2 ไม่เกาะต่อจาก mark1
โพสต์โดย: uvSOV เมื่อ 03 ม.ค. 2026, 09:13 น.
ดีที่ส่ง 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


ชื่อเรื่อง: ตอบ: ทำยังไงให้ mark2 ไม่เกาะต่อจาก mark1
โพสต์โดย: iannnnn เมื่อ 03 ม.ค. 2026, 16:38 น.
ขอบคุณครับ  :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;



ชื่อเรื่อง: ตอบ: ทำยังไงให้ mark2 ไม่เกาะต่อจาก mark1
โพสต์โดย: iannnnn เมื่อ 03 ม.ค. 2026, 16:47 น.
เอ๊ะมาคิดดูอีกที เดี๋ยวลองเก็บวรรณยุกต์ทั้ง 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;
ชื่อเรื่อง: ตอบ: ทำยังไงให้ mark2 ไม่เกาะต่อจาก mark1
โพสต์โดย: iannnnn เมื่อ 03 ม.ค. 2026, 17:42 น.
สมบูรณ์แบบแล้วครับ  :51: :51: :51: :51:

(http://img3.f0nt.com//2026-01/5a00a57f10de61d1b110.png)

- ใส่ low แบบนี้ก็สนุกดี :30:
- ให้ Gemini ตรวจความเรียบร้อยและเก็บตกนี่เวิร์กมากครับ

ขอบคุณครับบบบบบบ
ชื่อเรื่อง: ตอบ: ทำยังไงให้ mark2 ไม่เกาะต่อจาก mark1
โพสต์โดย: uvSOV เมื่อ 03 ม.ค. 2026, 19:16 น.
 :12: เจ๋งเลย  :45: ยินดีด้วยที่บรรลุ ระบบ mark และ mark on makr แล้ว

วันหลัง สอนเรื่องการขอคำแนะนำจาก AI ในการทำฟอนต์ ให้ด้วยสิครับ น่าสนใจดี (ผมอ่านแล้ว ก็ยังนึกไม่ออกว่าคุยกันยังไง มันช่วยยังไง)
ชื่อเรื่อง: ตอบ: ทำยังไงให้ mark2 ไม่เกาะต่อจาก mark1
โพสต์โดย: iannnnn เมื่อ 03 ม.ค. 2026, 22:39 น.
ได้เลยครับ

เวลาผมอ่านโค้ดแล้วตาลายไปหมดเลย ก็จะโยนไปถาม 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:
ชื่อเรื่อง: ตอบ: ทำยังไงให้ mark2 ไม่เกาะต่อจาก mark1
โพสต์โดย: uvSOV เมื่อ 04 ม.ค. 2026, 08:28 น.
 :18: ว๊าว.. เห็นเป็น clip เลย (น้อน เไ นี่เก่งจริงๆ เก่งจริงๆ เก่งจริงๆ)