Angsana font in Thailatex
บทความนี้เอาไว้สำหรับอ้างอิงเท่านั้น. ถ้าต้องการใช้ฟอนต์ AngsanaNew กับ LaTeX ให้ไปที่บทความใหม่แทนครับ.
ถ้าพูดถึงเอกสารภาษาไทยทีสร้างด้วยไมโครซอฟต์เวิร์ดแล้วคงเป็นเรื่องปรกติที่ส่วนใหญ่จะใช้ฟอนต์ AngsanaNew หรือ CordiaNew กัน. แต่สำหรับเอกสารที่สร้างด้วย thailatex จะใช้ฟอนต์ Norasi, Garuda ซึ่งเป็นฟอนต์ในโครงการฟอนต์แห่งชาติสามารถแจกจ่ายได้โดยชอบธรรม. แล้วแต่ความชอบพอของแต่ละคน, บางคนก็ชอบฟอนต์ AngsanaNew เพราะสวยคุ้นตา, บางคนก็ชอบ Norasi เพราะก็ไม่มีอะไรเสียหายเป็นอิสระ. และแน่นอนบางคงอยากใช้ฟอนต์ AngsanaNew หรือ CordiaNew ใน thailatex.
หลักการการทำให้ thailatex ใช้ฟอนต์ AngsanaNew ที่จะพูดถึงนี้ก็เป็นหลักการเดียวกับการใช้ฟอนต์ truetype กับ LaTeX ธรรมดานี่เอง. ในที่นี้จะเสนอตัวอย่างวิธีการทำให้ thailatex ใช้ฟอนต์ AngsanaNew ได้ซึ่งฟอนต์นี้มีอยู่ในระบบไมโครซอฟต์วินโดวส์ที่สนับสนุนการใช้ภาษาไทย.
ขั้นหลักๆในการใช้ฟอนต์ AngsanaNew มีดังนี้
- แก้ไขชื่ออักษร(glyph name)ของฟอนต์ AngsanaNew ด้วย pfaedit
- ใช้ truetype ฟอนต์ที่แก้ไขแล้วสร้างฟอนต์ต่างๆที่ LaTeX ต้องการ
- ปรับแต่ง LaTeX ให้รู้จักฟอนต์ที่เพิ่มเข้าไปใหม่
สิ่งที่จำเป็น
ซอฟต์แวร์ต่างๆที่จำเป็นได้แก่- pfaedit เอาไว้แก้ชื่ออักษรที่ผิดๆในฟอนต์
- ttf2pt1 เอาไว้แปลงฟอนต์ truetype ให้เป็น type1. จริงๆแล้ว pfaedit ก็สามารถแปลงฟอนต์ได้เช่นกันแต่เพื่อความสะดวกในการเขียนสคริปต์จึงขอใช้ ttf2pt1.
- แน่นอนว่าต้องการ thailatex
- ฟอนต์ AngsanaNew จากไมโครซอฟต์วินโดวส์, angsa.ttf, angsab.ttf, angsai.ttf และ angsaz.ttf.
- ไฟล์ lthuni.enc จาก /usr/share/texmf/dvips/base (มากับ thailatex)
- ไฟล์ lthangsa.fd เป็นไฟล์สร้างขึ้นมาใหม่เลียนแบบ lthnorasi.fd
แก้ชื่ออักษรในฟอนต์ truetype ด้วย pfaedit
สมมติว่าเราได้ติดตั้งโปรแกรม pfaedit เรียบร้อยแล้ว. ให้ใช้ pfaedit เปิดไฟล์ angsa.ttf แก้ไขชื่ออักษรที่ผิดให้หมด. เช่นตัวอักษร "ข" จะมีชื่อเป็น "afii59682;" ซึ่งจริงๆแล้วไม่ควรมี ";" อยู่ท้ายชื่อ. ชื่อที่ถูกต้องควรจะเป็น "afii59682" หรือ "uni0E02". ชื่อตัวอักษรภาษาอังกฤษบางตัวก็ผิดเหมือนกันเช่น "emdash" จะเป็น "emdash;" คือมี ";" ตามหลังอีกเหมือนกัน. ให้แก้ชื่อของตัวอักษรตั้งแต่ตัว 0x0E00 จนถึงตัวสุดท้ายในฟอนต์.
เปิดแก้ไขไฟล์ด้วยคำสั่งดังนี้
% pfaedit angsa.ttfให้คลิกตัวอักษรที่ต้องการแก้ชื่อแล้วกด "Element"->"Char Info ...". ตรง Unicode name ให้กด pull-down menu แล้วเลือก "uniXXXX". pfaedit จะเสนอชื่อที่สอดคล้องกับยูนิโค้ดของอักษรที่เลือก.
กดปุ่ม "Next" หรือ "Alt+n" เพื่อเปลี่ยนชื่ออักษรตัวต่อๆไป. คราวนี้เป็นหน้าที่ของคุณที่ต้องเปลี่ยนชื่ออักษรที่ผิดๆให้หมดทุกตัว.
หลังจากที่เปลี่ยนชื่อตัวอักษรที่ผิดหมดแล้วให้บันทึกฟอนต์เป็นฟอร์แมต sfd (pfedit) เพื่อที่จะได้ใช้ในโอกาศอื่นต่อไป. หลังจากนั้นก็ให้กด "File"->"Generate Fonts..." เพื่อสร้างฟอนต์ truetype.
ให้ตั้งชื่อฟอนต์เหมือนเดิมคือ angsa.ttf เพื่อความสะดวก. สำหรับฟอนต์ตระกูลเดียวกันได้แก่ angsab.ttf, angsai.ttf และ angsaz.ttf ก็ให้แก้ชื่อตัวอักษรแบบเดียวกัน. เสร็จแล้วก็จะได้ฟอนต์ตระกูลเดียวกันสี่ตัวที่แก้ชื่อให้เป็นแบบยูนิโค้ด uniXXXX ที่จะใช้กับ LaTeX ต่อไป.
สร้างฟอนต์ที่จะใช้กับ thailatex
ฟอนต์ที่จะใช้ใน LaTeX นั้นจะเป็น Postscript type1 (.pfa หรือ .pfb) ซึ่งเราจะแปลงจากฟอนต์ truetype ที่ได้มาจาก pfaedit. เพื่อความสะดวกจะใช้เชลล์สคริปต์ที่แสดงไว้ข้างล่างสร้างฟอนต์และไฟล์ต่างๆที่ LaTeX ต้องการ.เพื่อความสะดวก, ให้เอาฟอนต์ truetype ทั้งสี่ที่เปลี่ยนชื่อแล้วไปไว้ในไดเรกทอรีที่เตรียมไว้แล้วก็อปปี้ไฟล์ /usr/share/texmf/dvips/base/lthuni.enc มาไว้ในไดเรกทอรีนี้ด้วย.
#!/bin/sh # Create necessary fonts for thailatex # 2003 # by Poonlap Veerathanabutrตัวสคริปต์จะใช้โปรแกรม ttf2pt1 ในการแปลงฟอนต์ truetype ให้เป็น type1. โปรแกรม ttf2pt1 โดยปรกติจะไม่มีในดิสทริบิวชันทั่วๆไปต้องนำมาติดตั้งเอง. หลักการทำงานของสคริปต์ไม่มีอะไรยาก, มีเนื้อหาสรุปได้ดังนี้:echo -n > fonts.map echo -n > thai.map which ttf2pt1 if [ $? != 0 ]; then echo "Can not find ttf2pt1" echo "Download and install from http://ttf2pt1.sourceforge.net/" exit fi for i in *.ttf; do basename=`basename $i .ttf` ttf2pt1 -a -b ${basename}.ttf pf2afm $i afm2tfm $basename -T lthuni.enc -v $basename z$basename >> fonts.map line=`tail -1 fonts.map` line="$line <<${basename}.pfb" echo $line >> thai.map vptovf $basename $basename z$basename done
- ใช้โปรแกรม ttf2pt1 แปลงฟอนต์ truetype ที่แก้ไขชื่อแล้วให้เป็นฟอนต์ type1 (pfb)
- ใช้โปรแกรม pf2afm ที่มากับ ghostscript สร้างฟอนต์ afm (Adobe Font Metric)
- ต่อด้วยการใช้โปรแกรม afm2tfm สร้างฟอนต์ tfm (TeX Font Metric) จากฟอนต์ afm. ตรงนี้มีความสำคัญที่มีการใช้ไฟล์ lthuni.enc ซึ่งเป็นไฟล์ที่ระบุข้อมูลเกี่ยวกับ ligature และ kerning ร่วมใช้ในการสร้างฟอนต์ tfm ด้วย. นอกจากฟอนต์ tfm แล้วยังสร้างฟอนต์ vpl และส่งผลลัพธ์เก็บไว้ในไฟล์ fonts.map ชั่วคราวด้วย.
- สร้างไฟล์ thai.map ซึ่งมีหน้าที่บอก LaTeX ว่าฟอนต์ tfm จริงๆแล้วมาจากฟอนต์ type1 เวลาใช้โปรแกรมที่เกี่ยวข้องกับ dvi ต้องทำอย่างไรบ้าง. ในที่นี้ใช้ "<<" เป็นการบอกให้ฝังฟอนต์ type1 ลงในเอกสารถึงแม้มีตัวอักษรบางตัวไม่ได้ใช้ในเอกสารก็ตาม. โดยทั่วไปแล้ว "<" ก็เพียงพอ. กล่าวคือบอกให้ฝังฟอนต์บางส่วนที่จำเป็นเท่านั้น, เช่นฝังตัวอักษรที่ใช้ในเอกสารเท่านั้น. เพื่อความแน่นอนในที่นี้จะใช้ "<<".
- สุดท้ายสร้างฟอนต์ vf (Virtual Font) จากฟอนต์ vpl. แล้วทิ้งฟอนต์ vpl ไปเพราะไม่ใช้อีก.
$ ls angsab.ttf angsai.ttf angsa.ttf angsaz.ttf lthuni.enc makefonts.sh $ ./makefonts.sh .... .... $ ls angsa.afm angsab.vpl angsai.vpl angsaz.afm fonts.map zangsai.tfm angsab.afm angsai.afm angsa.pfb angsaz.pfb lthuni.enc zangsa.tfm angsab.pfb angsai.pfb angsa.ttf angsaz.ttf makefonts.sh* zangsaz.tfm angsab.ttf angsai.ttf angsa.vf angsaz.vf thai.map angsab.vf angsai.vf angsa.vpl angsaz.vpl zangsab.tfm
ปรับแต่ง LaTeX
หลังจากที่ได้ฟอนต์และไฟล์ต่างๆที่ต้องการแล้วก็ให้เปลี่ยนยูสเซอร์เป็น root แล้วสั่งคำสั่งดังนี้. (สมมติว่าเอาไฟล์ lthangsa.fd ไว้ในไดเรกทอรีเดียวกันและ TEXMF คือ /usr/share/texmf)$ su Password: # cp *.afm /usr/share/texmf/fonts/afm/public/thai # cp *.tfm /usr/share/texmf/fonts/tfm/public/thai # cp *.pfb /usr/share/texmf/fonts/type1/public/thai # cp *.vf /usr/share/texmf/fonts/vf/public/thai # cat thai.map >> /usr/share/texmf/dvips/config/thai.map # cp lthangsa.fd /usr/share/texmf/tex/generic/babel # texhashtexhash เป็นคำสั่งสร้างฐานข้อมูลของ LaTeX ว่าไฟล์ไหนอยู่ไหน.
ทดสอบ
สร้างไฟล์ทดสอบง่ายๆโดยไม่ต้องตัดคำดังนี้
% test.tex
\documentclass{article}
\usepackage[thai]{babel}
\def\thairmdefault{angsa}
\begin{document}
ภาษาไทย AngsanaNew
\end{document}
ตัวอย่างการสั่งคำสั่ง latex จะได้ผลดังนี้.
$ latex test.tex This is TeX, Version 3.14159 (Web2C 7.3.1) (test.tex LaTeX2e <2000/06/01> Babelจะเห็นว่ามีการอ่านไฟล์ lthangsa.fd ซึ่งบอกข้อมูลเกียวกับฟอนต์ AngsanaNew. ในช่วงนี้ LaTeX จะยังไม่ใช้ฟอนต์ type1 จะใช้ฟอนต์ tfm, vf ในการสร้างไฟล์ dvi เป็นหลัก. ตอนที่เราสร้างฟอนต์ tfm, vpl, vf มีการใช้ข้อมูล lthuni.enc ด้วย, ทำให้ LaTeX รู้เกี่ยวกับการวางตำแหน่งตัวอักษรต่างๆและการจัดระดับวรรณยุกต์เป็นต้น.and hyphenation patterns for american, french, german, ngerman, i talian, nohyphenation, loaded. (/usr/share/texmf/tex/latex/base/article.cls Document Class: article 2000/05/19 v1.4b Standard LaTeX document class (/usr/share/texmf/tex/latex/base/size10.clo)) (/usr/share/texmf/tex/generic/babel/babel.sty (/usr/share/texmf/tex/generic/babel/thai.ldf (/usr/share/texmf/tex/generic/babel/babel.def) Package babel Warning: No hyphenation patterns were loaded for (babel) the language `thai' (babel) I will use the patterns loaded for \language=0 instead. Loading the definitions for the Thai font encoding (/usr/share/texmf/tex/generic/babel/lthenc.def))) (test.aux (/usr/share/texmf/tex/generic/babel/lthangsa.fd)) (/usr/share/texmf/tex/generic/babel/lthnorasi.fd) [1] (test.aux LaTeX Font Warning: Font shape `OT1/angsa/m/n' undefined (Font) using `OT1/cmr/m/n' instead on input line 2. ) LaTeX Font Warning: Some font shapes were not available, defaults substituted. ) Output written on test.dvi (1 page, 240 bytes). Transcript written on test.log.
เมื่อสั่งคำสั่ง xdvi, LaTeX พยายามจะหาฟอนต์ pk ที่ชื่อ zangsa มาแสดง. เมื่อหาฟอนต์ไม่เจอ LaTeX จะไปดูไฟล์ที่เกี่ยวข้องได้แก่ thai.map แล้วจะสร้าง pk ฟอนต์ให้โดยเรียกโปรแกรม mktexpk(gsftopk)สร้างฟอนต์ pk ให้แล้วเก็บเป็นไฟล์ชื่อ /var/lib/texmf/pk/modeless/public/thai/zangsa.300pk
$ xdvi test.dvi kpathsea: Running mktexpk --mfmode cx --bdpi 300 --mag 1+0/300 --dpi 300 zangsa mktexpk: Running gsftopk zangsa 300 gsftopk(k) version 1.17/705 [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] [118] [119] [120] [121] [122] [123] [124] [125] [126] [128] [129] [130] [131] [132] [133] [134] [135] [136] [137] [138] [139] [140] [141] [142] [143] [144] [145] [146] [147] [148] [149] [150] [151] [152] [153] [154] [155] [156] [157] [158] [159] [161] [162] [163] [164] [165] [166] [167] [168] [169] [170] [171] [172] [173] [174] [175] [176] [177] [178] [179] [180] [181] [182] [183] [184] [185] [186] [187] [188] [189] [190] [191] [192] [193] [194] [195] [196] [197] [198] [199] [200] [201] [202] [203] [204] [205] [206] [207] [208] [209] [210] [211] [212] [213] [214] [215] [216] [217] [218] [221] [222] [223] [224] [225] [226] [227] [228] [229] [230] [231] [232] [233] [234] [235] [236] [237] [238] [239] [240] [241] [242] [243] [244] [245] [246] [247] [248] [249] [250] [251] [252] [253] /usr/share/texmf/web2c/mktexupd: /var/lib/texmf/ls-R unwritable. mktexpk: /var/lib/texmf/pk/modeless/public/thai/zangsa.300pk: successfully generated.จากนั้นก็ลอง dvips
$ dvips -t a4 -o test.ps test.dvi This is dvips(k) 5.86 Copyright 1999 Radical Eye Software (www.radicaleye.com) ' TeX output 2003.05.21:2319' -> test.ps <texc.pro><lthuni.enc><angsa.pfb><texps.pro>. [1]จะเห็นได้ว่า dvips จะฝังฟอนต์ angsa.pfb ไว้ในไฟล์ test.ps ให้ด้วย. ถ้าลองเปิดไฟล์ test.ps ด้วยบรรณาธิกรก็จะเป็นช่วงที่เป็นฟอนต์ type1 กับ lthuni.enc ปรากฏอยู่ในเอกสารด้วย. จริงๆแล้ว lthuni.enc เป็นภาษา Postscript ระบุข้อมูลการลงรหัสของฟอนต์ทีใช้มีส่วนหมายเหตุบอกข้อมูล ligature กับ kerning ซึ่งใน Postscript จะไม่สนพวกนี้. จะใช้ข้อมูล ligature กับ kerning ตอนที่สร้างฟอนต์ tfm, vpl, vf เท่านั้น.
ต่อจากนั้นแปลงเป็น PDF ด้วยโปรแกรม ps2pdf ได้อย่างสบาย.
$ ps2pdf test.ps
ตัวอย่างไฟล์ PDF
ตัวอย่างไฟล์ที่ใช้ฟอนต์ AngsanaNew: angsa.pdfอ้างอิงและข้อมูลเพิ่มเติม
- A DVI driver - Encoding file format
- Unicode and Glyph names
- Adobe Glyph list
- Using TrueType fonts with TeX and pdfTeX
- LaTeX font commands
- เอกสาร thailatex_doc.pdf
ส่งท้าย
ต่อจากนี้ผู้อ่านก็ลองใช้วิธีเดียวกันทำให้ใช้ CordiaNew กับ thailatex ดูแล้วกันนะครับ. ถ้ามีปัญหาหรือข้อสงสัยติดต่อ tlwg-devel@yahoogroups.com