Skip to content

LTN/Plone

Sections
Personal tools
You are here: Home » Members » poonlap's Home » latex » Angsana font in Thailatex

Angsana font in Thailatex

This document explains how to use AngsanaNew in thailatex. Actually it explains how to use truetype font in LaTeX in Thai language.

บทความนี้เอาไว้สำหรับอ้างอิงเท่านั้น. ถ้าต้องการใช้ฟอนต์ AngsanaNew กับ LaTeX ให้ไปที่บทความใหม่แทนครับ.

ถ้าพูดถึงเอกสารภาษาไทยทีสร้างด้วยไมโครซอฟต์เวิร์ดแล้วคงเป็นเรื่องปรกติที่ส่วนใหญ่จะใช้ฟอนต์ AngsanaNew หรือ CordiaNew กัน. แต่สำหรับเอกสารที่สร้างด้วย thailatex จะใช้ฟอนต์ Norasi, Garuda ซึ่งเป็นฟอนต์ในโครงการฟอนต์แห่งชาติสามารถแจกจ่ายได้โดยชอบธรรม. แล้วแต่ความชอบพอของแต่ละคน, บางคนก็ชอบฟอนต์ AngsanaNew เพราะสวยคุ้นตา, บางคนก็ชอบ Norasi เพราะก็ไม่มีอะไรเสียหายเป็นอิสระ. และแน่นอนบางคงอยากใช้ฟอนต์ AngsanaNew หรือ CordiaNew ใน thailatex.

หลักการการทำให้ thailatex ใช้ฟอนต์ AngsanaNew ที่จะพูดถึงนี้ก็เป็นหลักการเดียวกับการใช้ฟอนต์ truetype กับ LaTeX ธรรมดานี่เอง. ในที่นี้จะเสนอตัวอย่างวิธีการทำให้ thailatex ใช้ฟอนต์ AngsanaNew ได้ซึ่งฟอนต์นี้มีอยู่ในระบบไมโครซอฟต์วินโดวส์ที่สนับสนุนการใช้ภาษาไทย.

ขั้นหลักๆในการใช้ฟอนต์ AngsanaNew มีดังนี้

  1. แก้ไขชื่ออักษร(glyph name)ของฟอนต์ AngsanaNew ด้วย pfaedit
  2. ใช้ truetype ฟอนต์ที่แก้ไขแล้วสร้างฟอนต์ต่างๆที่ LaTeX ต้องการ
  3. ปรับแต่ง 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 
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. โปรแกรม ttf2pt1 โดยปรกติจะไม่มีในดิสทริบิวชันทั่วๆไปต้องนำมาติดตั้งเอง. หลักการทำงานของสคริปต์ไม่มีอะไรยาก, มีเนื้อหาสรุปได้ดังนี้:
  • ใช้โปรแกรม 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
# texhash
texhash เป็นคำสั่งสร้างฐานข้อมูลของ 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  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.
จะเห็นว่ามีการอ่านไฟล์ lthangsa.fd ซึ่งบอกข้อมูลเกียวกับฟอนต์ AngsanaNew. ในช่วงนี้ LaTeX จะยังไม่ใช้ฟอนต์ type1 จะใช้ฟอนต์ tfm, vf ในการสร้างไฟล์ dvi เป็นหลัก. ตอนที่เราสร้างฟอนต์ tfm, vpl, vf มีการใช้ข้อมูล lthuni.enc ด้วย, ทำให้ LaTeX รู้เกี่ยวกับการวางตำแหน่งตัวอักษรต่างๆและการจัดระดับวรรณยุกต์เป็นต้น.

เมื่อสั่งคำสั่ง 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

อ้างอิงและข้อมูลเพิ่มเติม

ส่งท้าย

ต่อจากนี้ผู้อ่านก็ลองใช้วิธีเดียวกันทำให้ใช้ CordiaNew กับ thailatex ดูแล้วกันนะครับ. ถ้ามีปัญหาหรือข้อสงสัยติดต่อ tlwg-devel@yahoogroups.com

Created by poonlap
Last modified 2005-06-01 02:27 PM
 

Powered by Plone

This site conforms to the following standards: