10.18. ttf2pt1 - TTF 轉中文 Type1 字型

Copyright (c) 2001 李果正(Edward G.J. Lee )

本文為自由文件(FDL http://www.gnu.org/copyleft/fdl.html) 可自由複製/修改/散佈。但請保留版權聲明的部份。

安裝 chinese/ttf2pt1, 他會連 print/ttf2pt1 一起安裝。

chinese 套件只是 map 表,有倚天字集可用。

寫一個 sh script(mkfont) 內容如下:

=== mkfont begin ===
#!/bin/sh
#
# By Edward G.J. Lee 2001.11.25
# This code is Public Domain.
#
if [ $# -ne 1 ]
then
  echo "Usage: `basename $0` your.ttf"
  exit 1
fi

echo
echo "Now create *.t1a and *.enc and *.afm files. Wait... "
echo
FONTNAME=$1
MAPFILE=/usr/local/share/ttf2pt1/maps/cubig5.map
n=1
while [ $n -lt 10 ]
do
  m=0$n
  ttf2pt1 -GE -pft -Ohub -W0 -L $MAPFILE+$m $FONTNAME ${FONTNAME%.ttf}$m
  n=`expr $n + 1`
done

m=10
while [ $m -lt 56 ]
do
  ttf2pt1 -GE -pft -Ohub -W0 -L $MAPFILE+$m $FONTNAME ${FONTNAME%.ttf}$m
  m=`expr $m + 1`
done

# avoid dvips(k)(before v5.86) t1part module bug.
#
perl -pi -e 's/_/Z/g' *.t1a *.afm

echo
echo "Now create *.pfb, wait... "
echo
for ps in *.t1a
do
  t1asm -b $ps > ${ps%.t1a}.pfb
done

echo
echo "Now create *.tfm, wait... "
echo
for afm in *.afm
do
  afm2tfm $afm
done

AFM=${FONTNAME%.ttf}-afm
TFM=${FONTNAME%.ttf}-tfm
PFB=${FONTNAME%.ttf}-pfb
ENC=${FONTNAME%.ttf}-enc
rm -f *.t1a
mkdir -p $AFM $TFM $PFB $ENC
mv -f *.enc $ENC
mv -f *.afm $AFM
mv -f *.tfm $TFM
mv -f *.pfb $PFB
echo
echo "OK, all done. :-)"
echo
=== mkfotn end ===

在一個獨立目錄放 mkfont(要先 chmod +x mkfont), 再把字型置於同一目錄。

* 一些路徑有不一樣的話,請自行修改。

這裡以文鼎細上海宋和文鼎中楷為例:

./mkfont bsmi00lp.ttf; ./mkfont bkai00mp.ttf

即可。完成後會產生 afm, euc, tfm, pfb 等四個目錄,裡面都是字型資料。

將資料搬移到所屬的地方(arphic 目錄請自行建立)。

afm copy 至 /usr/local/share/texmf/fonts/afm/arphic。

tfm copy 至 /usr/local/share/texmf/fonts/tfm/arphic。

pfb copy 至 /usr/local/share/texmf/fonts/type1/arphic。

euc copy 至 /usr/local/share/texmf/dvips/arphic。

新增 /usr/local/share/texmf/dvips/config/aming.map 內容如下:

bsmi00lp01  ShanHeiSun-Light-01 <bsmi00lp01.pfb
bsmi00lp02  ShanHeiSun-Light-02 <bsmi00lp02.pfb
...
bsmi00lp55  ShanHeiSun-Light-55 <bsmi00lp55.pfb

新增 /usr/local/share/texmf/dvips/config/akai.map 內容如下:

bkai00mp01  ZenKai-Medium-01 <bkai00mp01.pfb
bkai00mp02  ZenKai-Medium-02 <bkai00mp02.pfb
...
bkai00mp55  ZenKai-Medium-55 <bkai00mp55.pfb

在 /usr/local/share/texmf/dvips/config/config.ps 加入:

p +aming.map
p +akai.map

新增 /usr/local/share/texmf/dvips/config/bsmi00lp.map 內容如下:

bsmi00lp01  <bsmi00lp01.enc <bsmi00lp.ttf
bsmi00lp02  <bsmi00lp02.enc <bsmi00lp.ttf
...
bsmi00lp55  <bsmi00lp55.enc <bsmi00lp.ttf

新增 /usr/local/share/texmf/dvips/config/bkai00lp.map 內容如下:

bkai00mp01  <bkai00mp01.enc <bkai00mp.ttf
bkai00mp02  <bkai00mp02.enc <bkai00mp.ttf
...
bkai00mp55  <bkai00mp55.enc <bkai00mp.ttf

* bsmi00lp.ttf,bkai00mp.ttf 要置於 kpathsea 找得到的地方,如 /usr/local/share/texmf/fonts/truetype (目錄可自行建立)。

修改 /usr/local/share/texmf/pdftex/config/pdftex.cfg,加入:

map +bsmi00lp.map
map +bkai00mp.map

新增 /usr/local/share/texmf/tex/latex/CJK/Bg5/c00aming.fd 內容如下:

\def\fileversion{4.2.0}
\def\filedate{2001/09/28}
\ProvidesFile{c00aming.fd}[\filedate\space\fileversion]
\DeclareFontFamily{C00}{aming}{}
\DeclareFontShape{C00}{aming}{m}{n}{<-> CJK * bsmi00lp}{}
\DeclareFontShape{C00}{aming}{bx}{n}{<-> CJK * bkai00mp}{}
\endinput

新增 /usr/local/share/texmf/tex/latex/CJK/Bg5/c00bsmi00lp.fd 內容如下:

\def\fileversion{4.2.0}
\def\filedate{2001/09/28}
\ProvidesFile{c00bsmi00lp.fd}[\filedate\space\fileversion]
\DeclareFontFamily{C00}{bsmi00lp}{}
\DeclareFontShape{C00}{bsmi00lp}{m}{n}{<-> CJK * bsmi00lp}{}
\DeclareFontShape{C00}{bsmi00lp}{bx}{n}{<-> CJK * bkai00mp}{}
\endinput

這樣粗體字會去選用文鼎楷書體(個人不喜歡模擬出來的粗體字)。 當然楷書體也要自行按上述方法製作出來。

執行 texhash(or mktexlsr)。這樣就可以了,要使用明體就使用 aming 的字型名稱,要使用楷體就使用 akai(依上述方法做一個 c00akai.fd)。

當然,CJK 的使用方法,請參考 CJK 所附文件,一定要指定 aming 才會去使用所定義出來的字型,否則會去抓 CJK 預設字型, 那當然一般系統上是沒有的。

為了配合中文 Type1 字型,執行 dvips 時請加上 -Ppdf 或 -Pcmz 參數, 這樣英文字型才會去使用 Type1。

最後記得執行 texhash。

測試例子

=== begin ex.tex ===
\def\Fn{\char}
\font\Aa=bsmi00lp01 scaled 1000
\font\CCC=bsmi00lp55 scaled 3000
\font\CCc=bsmi00lp55 scaled 2000
\font\Ccc=bsmi00lp55 scaled 1000
\font\JJJ=bsmi00lp24 scaled 3000
\font\JJj=bsmi00lp24 scaled 2000
\font\Jjj=bsmi00lp24 scaled 1000
{\CCC\Fn108}
{\CCC\Fn109}
{\CCc\Fn110}
{\CCc\Fn111}
{\Ccc\Fn112}
{\Ccc\Fn113}
{\Ccc\Fn114}
{\JJJ\Fn55}
{\JJj\Fn95}
{\Jjj\Fn84}
{\CCC\Fn101}
{\CCC\Fn102}
{\CCc\Fn103}
{\CCc\Fn104}
{\Ccc\Fn106}
{\Ccc\Fn107}
\bye
=== end ex.tex ===

pdftex ex.tex 即可產生內嵌中文 TTF 的 ex.pdf。 如果有製作中文 Type1 字型,則 tex ex.tex ; dvipdf ex 則是會內嵌中文 Type1,各位可比較看看兩者有何不同。

寫個 cjk-latex 稿試看看吧!字型名稱要使用 bsmi00lp。我寫的 sh script 只是個半成品,可能得多試幾次才會成功。have fun! :)

* LaTeX 稿請用 pdflatex。

要編譯 CJK-latex 文稿,可有兩種方式:

1. bg5latex test.tex ; pdflatex test.cjk

2. 寫一個 sh script(bg5pdflatex) 內容如下:

=== bg5pdflatex begin ===
#!/bin/sh
FILE=`echo $1 | sed -e 's|\(.*\)\.[^/]*$|\1|'`
bg5conv < $1 > $FILE.cjk
pdflatex $FILE.cjk
=== bg5pdflatex end ===

chmod +x bg5pdflatex 後置於 PATH 可及之處。

bg5pdflatex test.tex

即可。其實這個 script 的內容和 bg5latex 是一樣的,只不過是把 latex 換成 pdflatex 而已。

ps. 內容如有錯誤,請不吝指正。

Figure 10-9. ttf2pt1 snapshot

WWW: 使用 pdfTeX/pdfLaTeX 讓 pdf 檔內嵌中文 TTF/TTC

WWW: 由 TeX/LaTeX 製作中文 PDF 檔

WWW: CJK/LaTeX environment 中文 Type1 及 TTF 的使用

WWW: http://ttf2pt1.sourceforge.net/