先不必驚訝、歡欣,這裡不是在說明從零開始的造字,只是利用現成的字型裡頭的字來加進去而已。至於從零開始的造字,往後有機會再來探討。而且,這裡以能用為原則,不討論字型品質的問題。
由於我們通常可以不受編碼影響的就是中文 Type1 subfonts,他可以透過 TeX 內建的取字機制來取用字型裡頭的字。因此,這裡我們優先製造 Type1 字型。當然,要直接造 TTF 也是可以,但最後還是得多經一道手續來處理成 Type1 字型。其他字型的製作,已超出本文要討論的範圍,以後有機會再專文來說明。
這裡以 CJK 的中文 Type1 字型來說明,就是在第 4 章提到的字型製作所製作出來的中文 Type1 字型。中文字會加入新字,英文也當然也就會加入新字了。
這可真是我們長久以來的痛啊!我們目前慣用的繁體中文是使用只有一萬多個字的 Big-5 碼及其字集,大家經常會碰到,有些字硬是輸入法拼不出來,例如,、
、
等等,雖然我們有大字集的 Unicode/CNS11643/CCCII,但是並沒有普遍的使用習慣,相對應的工具也很缺乏,這就是我們需要造字的原因。縱使有方便的大字集環境了,總是會有些新創的字,這也是需要造字。
這些字哪裡有呢?中國海字集有收錄,或一般較為完整的 Unicode 字型亦會有收錄。這裡以一般容易取得的 Unicode 字型為例,因為,如果要補其他字的時候,這種字型會收錄比較多,而且有正確的 Unicode 對應,找字較方便。
ftp://ftp.netscape.com/pub/communicator/extras/fonts/windows/CyberCJK.ZIP
ftp://ftp.netscape.com/pub/communicator/extras/fonts/windows/Cyberbit.ZIP
請注意,這個字型不是 free 的。使用時請注意他的 license 說明。或者,如果你在 Windows 系統有安裝中國海字集的話,也可以拿來使用。
這裡,我們選用開放原始碼的 FontForge,請參考第 3 章,第 3.2.4 節,頁 的安裝說明。他也可以直接讀入 Windows 系統的 TTE 的額外的字型,例如中國海字集所造的字型。
由 PfaEdiT 讀取 TTF 字型後,要調整字型的規格以符合我們所需(TTF 和 Type1 的規格並不一樣,而且我們得配合原先由 mkfont/ttf2pt1 所製作的字型),這裡以「」為例來說明:
fontforge Cyberbit.ttf [Element] => [Font Info] => [General] 修改以下的值: Ascent: 800 Desent: 200 EM size: 1000 Underline Position: -72 Height: 43
然後找到 uni9AF4(這是這個字的 Unicode 編碼),在這個字上 double click,然後 export 出 eps 圖檔,會產生
uni9AF4_BitstreamCyberbit-Roman.eps
,這就是我們要加進去的字。這裡我們取用 mkfont.sh 製作出來的 bsmi00lp55.pfb,並把錈改名為 newfont01.pfb。
mv bsmi00lp55.pfb newfont01.pfb fontforge newfont01.pfb [Element] => [Font Infos...] 改名為 newfont01
然後在 149 的格子 double click 把 uni9AF4_BitstreamCyberbit-Roman.eps
import 至 149 的位置,並命名為 uni9AF4,然後存檔。這樣以後加其他的字就不必擔心名稱重複了。
這時再來重新產生字型:
[Generate Fonts] => [PS Type1(Binary)] => [Save]
產生 pfb Type1 字型的同時會產生 afm 檔,可利用 afm2tfm 產生 tfm 檔。這些檔案 copy 至 $TEXMF/fonts/type1/CJK
及 $TEXMF/fonts/tfm/CJK
,執行 texhash。
由於我們使用的輸入法及作業系統上的字碼對應並沒有建立,所以還是得靠 TeX 來輸入這些字。
\font\Bsmi=newfont01 scaled 1000 \def\Fwu{\Bsmi\char149} ... 山有小口,髣\Fwu{}若有光,便捨船,從口入。
如果是使用 12 pt 則要 scale 成 1200(視原字型的大小而定,有些需要適度調整大小及位置。那個原先沒有的字就以以上的取字方法代替,編譯後自然會取到字。
由於各種字型在造字時的大小不一樣,因此有些字型要調整一下才能配合原來的字型大小,例如,以 Cyberbit.ttf 而言,他的字型比較小,依我目前使用的情形,和 bsmi00lp.ttf 由 ttf2pt1 造出來的中文 Type1 字型要配合的話,要加入以下的調整:9.1
\font\NewFont=newfont01 scaled 1300 \def\Fwu{\raise.1ex\hbox{\NewFont\char149}\kern.5em} \def\Shiuan{\raise.1ex\hbox{\NewFont\char150}\kern.5em} \def\Kuen{\raise.1ex\hbox{\NewFont\char151}\kern.5em}
調整他的大小,scale 成 1300 來配合 12 pt 的 bsmi00lp 字,而且字間距和上下位置也要調。這也可以由造字時調整,但是為了配合其他不是 bsmi00lp 的字型,這裡暫時使用這種醜一點的方法。
dvipdfmx 是直接抓 TTF,而且用的是 Adobe CID-Keyed font 的對應,在這裡不能適用,要改的話要把字加入 TTF 中,也要修改字的對應方式,除非是把字型嵌入,不然可攜性會出問題,因此,我們這裡另造一個新的中文 Type1 字型,以便和原來的 TTF 區分出來 ,原因是,這樣才可以使用 dvipdfmx,這時原有的字的部份會去抓 TTF(嵌入或不嵌入),新造的字則會去取中文 Type1 字型(這會嵌入),這樣就不會有可攜性的問題產生了。當然,這裡要產生一個 map 給 dvips 找字用,可以另編輯一個 newfont.map:
newfont01 newfont01 <newfont01.pfb
這要加在 dvips 的 config.ps 檔中。這樣一來,王建先生及游鍚
院長的名字就可以印得出來,桃花源記裡頭「髣
若有光」,也可照原文印出來了。當然,每種字型的設計風格並不一樣,還是會看出一些不同。
這只是很簡陋的使用方法,並沒有納入 LaTeX PSNFSS 的選字機制,也就是說,他無法依 LaTeX 的字體大小機制來自動變化大小,也沒有粗斜體的變化,都要自行手動去另行定義,一般 LaTeX 裡頭的這些指令是不會生效的,因此,如果是有大量的造字時,最好就是要寫 macro,納入選字機制,使用上才會方便。
礙於字型版權的問題,這裡無法提供做好的 macro 給各位使用,如果有人有辦法和中國海字集的所有人聯絡上,而他們也同意的話,我目前已經做好的 macro 就可以釋放給大家使用,不必另行定義,已納入 PSNFSS 的自動選字。
我們也可以使用 ttf2pt1 來從其他含有這些字 TTF 字型來製作 Type1 字型,但是他的對應表就得自行想辦法才能取得到所需要的字,這對一般使用者可能會比較困難,但好處就是效率會比較好,有興趣的朋友也可以自行嘗試看看。
使用大字集,例如 UTF-8 或 CNS11643 的編碼來寫文稿。但這在目前,顯示、編譯上可能沒有問題(CJK 目前可以支援 UCS BMP9.2的部份,也支援我們的 CNS11643,而在 Un*x 系統的 zh_TW.euctw
locale 就是使用 CNS11643),但輸入就是一個很大的問題了,我們目前並沒有很方便使用的這種大字集輸入法,而且編輯器也得支援才行。
其實 CJK 本身就有 UTF-8 編碼的環境可以利用,但是由於我們並沒有真正 free 的 Unocide 全字型,而且其中所能處理的 repertore 並不是全面的。而 ucs 則支援較完整的 repertore,而且 ucs 巨集不需要其他多迴語文的支援就可以獨立運作。這個部份,詳細的說明,請參考〈Ipe 與 ucs 巨集套件的配合〉一文:
http://edt1023.sayya.org/tex/ipeucs/
http://MathNet.math.tku.edu.tw/~edt1023/tex/ipeucs/
是新一代 16 位元處理的 TeX 系統,原始的 TeX 是 8 位元的方式來處理,所以,一碰到像我們中文這個多位元字元的書寫系統,就常常容易出問題。換用 16 位元的方式來處理的話,會省略許多不必要的處理過程。
但是,目前 系統對中文的處理還不是很圓滿,這裡我們可以參考李運璋博士的修正方法,詳細說明請參考〈Omega-16 位元科學排版系統之中文環境及 TrueType 字型產生〉一文:
http://edt1023.sayya.org/tex/omega/Compiled by Edward G.J. Lee (2004-05-18)
http://MathNet.math.tku.edu.tw/~edt1023/tex/omega/