如果想使用 dvips 來產生 ps 檔,那這裡還要製作中文 Type1 字型。當然,一般使用的話,應該是可以不必製作中文 Type1 了,直接由 dvipdfmx 抓取系統上的 TTF 就可以了,但由於有時要和一些處理 eps 的 packages 配合,例如 PSTrick,所以這裡一併把 Type1 字型製作出來。
給 TeX/LaTeX 處理的話,只需要 *.tfm 檔就可以運作,生成 *.dvi 檔。但要由 dvips, dvipdfmx, pdflatex 處理的話,要有實體的字型才行,因為他們的輸出不是 ps 檔,就是 PDF 檔。
目前中、日、韓都有 free 的字型可以使用,字型品質也還算不錯,可以至以下這些網站下載:
ftp://cle.linux.org.tw/pub/fonts/
當然,目前 GNU/Linux/*BSD 的發行版本都會附上一些字型,所以請先檢查一下你的安裝光碟或官方網站是否已有整理打包好的字型套件,這樣安裝起來會比較方便。再把字型連結到 TeX 系統置放字型的目錄下就可以了,這樣就可以和系統共用字型。
請注意這裡的表示方法,pk 字型是由其解析度來成為檔名的一部份的,例如 600 dpi 的 pk 字型,實際上的檔名是 *.600pk(gf 字型的表示法亦同)。
這些字型資訊的置放處都會有一定規則,這可以參考一下 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 是一樣的。
這是製作中文 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 即可。
在第 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 來製作也是可以。
如果一切都弄妥當了,現在可以做個總測試了,先編一個測試文稿:
\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 就可以了,或乾脆就整個註解起來就可以了。