http://edt1023.sayya.org/tex/mycjk/node5.html
4. 製作中文 Type1 字型
如果想使用 dvips 來產生 ps 檔,那這裡還要製作中文 Type1 字型。當然,一般使用的話,應該是可以不必製作中文 Type1 了,直接由 dvipdfmx 抓取系統上的 TTF 就可以了,但由於有時要和一些處理 eps 的 packages 配合,例如 PSTrick,所以這裡一併把 Type1 字型製作出來。
4.1 需要哪些字型資料?
給 TeX/LaTeX 處理的話,只需要 *.tfm 檔就可以運作,生成 *.dvi 檔。但要由 dvips, dvipdfmx, pdflatex 處理的話,要有實體的字型才行,因為他們的輸出不是 ps 檔,就是 PDF 檔。
4.1.1 Free 的字型的取得
目前中、日、韓都有 free 的字型可以使用,字型品質也還算不錯,可以至以下這些網站下載:
ftp://cle.linux.org.tw/pub/fonts/
當然,目前 GNU/Linux/*BSD 的發行版本都會附上一些字型,所以請先檢查一下你的安裝光碟或官方網站是否已有整理打包好的字型套件,這樣安裝起來會比較方便。再把字型連結到 TeX 系統置放字型的目錄下就可以了,這樣就可以和系統共用字型。
4.1.2 各種字型資訊檔的意義
*.tfm (TeX Font Metric, 字型描述檔)
為二位元檔,TeX 有這個字型描述檔就可以產生 *.dvi 檔,但其中是沒有真正的字型實體資料在裡頭,得由其他的輔助工具來完成。任何型式的字型,要給 TeX 使用前,都一定要先產生這個 tfm 檔,而且 TeX 只要有這個 tfm 檔就可以運作。
*.afm (Ascii Font Metric)
這也是字型描述檔,但是以純文字的格式存在,要給 LaTeX 使用的話,可以由 afm2tfm 來產生 *.tfm 檔。一般的 Type 1 字型會只附 afm 檔,而沒有 tfm 檔。TTF 的話,可以由 ttf2tfm 來產生。
*.mf
這是 Knuth 教授設計的 Metafont source,他本身是一種 outline font,但由於顯示/成形(render/raster)較複雜,目前不適合像 Type 1/TTF 一樣 on-the-fly 使用,是另產生 bitmap 形式 *.*gf (generic font) 再由 gftopk 產生 pk 字型來使用的。Metafont 的可執行檔就是 mf,mf 在 font-makeing mode 時可以產生 tfm 檔。MetaPost4.1 也是可以用來製作字型,他的延伸檔名通常是 *.mp,可執行檔則是 mp 或 mpost。
*.pfa (POSTSCRIPT Font Ascii)
這是 POSTSCRIPT Type 1 字型檔,但是以純文字的格式存在,可由 t1asm 來轉成 binary 格式(即 *.pfb)。
*.pfb (POSTSCRIPT Font Binary)
和 *.pfa 同,但是以 binary 格式存在。兩種格式目前都可以直接使用。
*.*pk (packed font)
這是給 dvi viewer/printer/dvips 使用的點陣字,以便真正產生字型嵌入 ps 檔中或供 printer 使用。當然,這個 pk 字,可能是由 Metafont、Type 1 或 TTF 轉成的。
請注意這裡的表示方法,pk 字型是由其解析度來成為檔名的一部份的,例如 600 dpi 的 pk 字型,實際上的檔名是 *.600pk(gf 字型的表示法亦同)。
*.fd (font description)
這是給 LaTeX 找字型用的字型定義檔。
4.1.3 尋找 LaTeX 所需的資訊
這些字型資訊的置放處都會有一定規則,這可以參考一下 TDS(TeX Directory Structure) 文件:
http://tug.org/tex/tds
ftp://ftp.dante.de/tex-archive/tds/tds.pdf
也可以由 LaTeX 系統的一個函式庫 kpathsea 來找,當然,你的工具本身要有利用到這個函式庫才行,或者要直接使用 kpathsea 所附的工具,例如:
kpsewhich -format="dvips config" config.ps
kpsewhich econometrica.bst
kpsewhich bsmi00lp.ttf
kpsewhich -expand-var=$TEXMF (找安裝所在)
kpsewhich -show-path=texpool (找 memory dump 放在哪裡)
對 kpsewhich 而言,他的參數 -format 和 -format 是一樣的。
4.2 由 mkfont.sh 來製作需要的資料
這是製作中文 Type1 的一個 sh script,主要是利用 ttf2pt1。請先下載:
http://edt1023.sayya.org/tex/mycjk/mkfont.sh
並將這個 mkfont.sh 和字型置於同一個獨立的目錄中,製作方法如下:
./mkfont.sh your.ttf name
其中,your.ttf 就是 TTF 字型的實際名稱,後面的 name 指的是,在 CJK 文稿中所要使用的字型名稱。需要注意的是,這個 mkfont.sh 是使用 ttf2pt1 為工具,所以,目前只能用於 Unicode 字型,而且只能用於 Big-5 及 gb23124.2 兩種編碼。這裡要多謝許多朋友的幫忙,可以到 telnet://bbs.sayya.org 的 ttfm 版查看以往的討論情形。
以下是一個製作的範例:
mkdir aming akai
cd aming
ln -s yourpath/bsmi00lp.ttf bsmi00lp.ttf
./mkfont.sh bsmi00lp.ttf aming
cd ../akai
ln -s yourpath/bkai00mp.ttf bkai00mp.ttf
./mkfont.sh bkai00mp.ttf akai
其中 aming/akai 就是我們在文件中使用的字型名稱。經過以上的製作(可能會需要一點時間),會產生各種子目錄,並會產生一些定義檔,其中的作用,這裡微說明一下:
目錄或檔案 作用 置放位置
$FNAME-afm/ ascii font metric $TEXMF/fonts/afm/CJK
$FNAME-tfm/ TeX font metric $TEXMF/fonts/tfm/CJK
$FNAME-pfb/ Type1 字型檔 $TEXMF/fonts/type1/CJK
$FNAME-enc/ 給 pdfTeX 抓取 TTF 用的編碼對應 $TEXMF/dvips/CJK
$FNAME.fd 給 CJK 使用的字型定義 $TEXMF/tex/CJK/Bg5
cid-x.map 給 dvipdfmx 使用的 map 檔 $TEXMF/dvipdfm/config
$FNAME.map 給 dvips 使用的 map 檔 $TEXMF/dvips/config
其中 $FNAME 指的是字型名稱,就是執行 mkfont.sh 的第二個參數 name,也是我們在文稿上使用的字型名稱。cid-x.map 的內容是附加至原來的 cid-x.map 檔中,而不是取代原來的。$TEXMF 就是 TeX 系統安裝的地方,包括他會去搜尋到的其他目錄。
接下來,在 $TEXMF/dvips/config/config.ps 檔中加入:
p +akai.map
p +aming.map
最後,執行一下 texhash 即可。
4.3 由 FontForge 來製作字型
在第 3 章,第 3.2.4 小節曾提到的字型工具,他也是可以拿來製作中文 Type1 字型給 CJK/LaTeX 來使用。除了可以叫出 GUI 來製作外,也可以由 script 命令稿來製作。底下就是一個 FontForge script 的例子:
#!/usr/bin/env fontforge
# Generate CJK subfonts from master font.
# The fonts are created in the current directory.
# genfont.pe
# /usr/share/texmf/ttf2pk/UBig5.sfd
# /usr/share/texmf/ttf2pk/UGB.sfd
# $1: The master font (e.g. `bsmi00lp.ttf')
# $2: The name stem for the subfonts (e.g. `bsmilp')
# $3: The subfont definition file (e.g. `UBig5.sfd')
if ($argc != 4)
Print("usage: [fontforge -script] ", $0, " master-font name-stem SFD-file");
Quit(1);
endif
Print("Loading ", $1, "...");
Open($1);
SetFontOrder(3)
SelectAll();
Print("Scaling to PostScript units...");
ScaleToEm(800, 200);
Print("Simplifying outlines...");
Simplify(0,3)
Print("Rounding coordinates to integers...");
RoundToInt();
ClearHints();
Print("Generating subfonts...");
Generate($2 + ".mult", "", -1, -1, $3);
Close();
Quit(0);
這是由 Werner Lemberg 所舉的一個簡單例子,經 FontForge 的作者 George Williams 建議改一下 Simplify() 函數的參數,以便符合中日韓字型。存檔成 genfont.pe 並 chmod +x genfont.pe 即可。
他會同時產生 *.afm 檔,這樣就可以利用 afm2tfm 來生成 *.tfm 檔了。底下是執行的例子:
./genfont.pe bsmi00lp.ttf aming /usr/share/texmf/ttf2pk/UBig5.sfd
當然,他並沒有產生相對的一些 map、*.fd...等等額外的檔案,這些要自行參考 mkfont.sh 來製作,或自行寫個 sh script 來製作也是可以。
4.4 文稿測試
如果一切都弄妥當了,現在可以做個總測試了,先編一個測試文稿:
/documentclass[12pt,a4paper]{article}
/usepackage{CJK,pslatex}
/begin{document}
/begin{CJK}{Bg5}{aming}
這是 {/sf CJK} 的測試,終於可以方便製作不內嵌中文的 /LaTeX/PDF 文件了。
/end{CJK}
/end{document}
編好後存檔成 test.tex,然後:
bg5latex test.tex
dvipdfmx test => 由 test.dvi 產生 test.pdf
dvips -o test.ps test => 由 test.dvi 產生 test.ps
這樣 test.pdf 是不內嵌中文,連英文也不內嵌(引入 pslatex),而 test.ps 則是內嵌了中文 Type1 字型的。其中 dvips 預設會導向印表機,所以要有個 -o 參數,如果要改成輸出至檔案,可以修改
$TEXMF/dvips/config/config.ps
將 o|lpr 改成 o(英文字母小寫 o)或編輯一個 ~/.dvipsrc 檔,檔案內容就是一個 o 就可以了,或乾脆就整個註解起來就可以了。