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 各種字型資訊檔的意義

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.2mkfont.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-5gb23124.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.pechmod +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 就可以了,或乾脆就整個註解起來就可以了。

Compiled by Edward G.J. Lee (2004-05-18)