字形/中文


取得中文字形檔

最容易取得的中文字形有以下數套:

格式 捐贈者 Mdk 套件名稱 檔名
pcf ?? taipeifonts taipei16,taipei20,taipei24
ttf 文鼎 fonts-ttf-big5 bkai00mp, bsmi00lp
CID 0 教育部 MOEKai-Regular, MOESung-Regular

注意: 所謂 CID 0 是指 CIDFontType 0, 它其實是 "以 CID 方式排列的 Type1" (CID-keyed Type1).

X Window 下 顯示字形的最基本設定

在 X Window 內新增字型之後, 必須在新字型的目錄內下: mkfontdir 更新 fonts.dir。 另外可能還需要在原本的 fonts.alias 後面加上一些新的東東。 通常字型套件會有它自己的 *.alias, 只要將這個檔案的內容附加到原本的 fonts.dir 後面就可以了。 接下來必須叫 X Window 重新讀剛才修改過的 fonts.dir 與 fonts.alias 等設定檔。

如果你的系統並不使用字型伺服器 (例如 slackware 或 morphix) 則要下 xset fp rehash

如果你的系統使用字型伺服器 (例如 mandrake) 則要重新啟動 xfs。 xfs 內定的設定是透過 socket, 而不透過 tcp port. 這樣比較安全, 但是不方便 -- 無法使用 showfont 及 fslsfonts 等指令來測試字形安裝是否成功. 我們先改成透過 tcp port 來服務:

  1. 將 /etc/X11/fs/config 內的 no-listen = tcp 註解掉.
  2. 將 /etc/rc.d/init.d/xfs 內的 -port -1 改成 -port 7100
  3. 將 /etc/X11/XF86Config-4 內的 FontPath "unix/:-1" 一句改成 FontPath "unix/:7100"
  4. 重新啟動 X 及 xfs. 注意 /etc/rc.d/init.d/xfs restart 沒有用, 必須先 stop 再 start.
  5. 現在應該終於可以下 fslsfonts -server localhost:7100 | sort > xfs 列出所有 xfs 提供的字形了. 而詢問 X 本身的 xlsfonts | sort > x 的結果應該一樣: diff xfs x

xfd 可以顯示字形。 這麼基本重要的指令, 居然沒有 HOWTO 文件提到... 假設你已安裝 taipeifonts 與 fonts-ttf-big5 這兩個套件, 我們現在就用它來確定 X Window 的設定正確, 確實可以看到中文字形:

        xfd -fn taipeik24
        xfd -fn "`xlsfonts | grep -i kaitim | head -1`"

另外在 X11R6-contrib 套件內有一個 xfontsel 很久以前筆者有用過, 不過與較新版的 XFree86 好像無法搭配...

顯示中文 ps 檔

在 unix 底下, 所有的列印到最後幾乎都是以 postscript (.ps) 的格式輸出. ps 格式其實根本是一種 (專為畫圖寫字而設計的) 程式語言, 非常強大, 也因而解譯起來要花很多功夫. 如果你的印表機支援硬體直接列印 .ps 檔, 當然是最方便的了; 然而多數的低階印表機硬體都看不懂複雜的 ps 語言, 所以要靠 ghostscript 將 postscript 檔翻譯成各種印表機認得的低階印表機控制指令. 你幾乎可以說它是 「所有無法直接列印 ps 的檔印表機」 的驅動程式.

要看 ps 檔, 最陽春的方法是直接使用 gs 指令. 例如你下載了 cacc.ps 檔, 然後可以在 X Window 環境下: gs -sDEVICE=x11 cacc.ps 或是下 gs -sDEVICE=x11 進入 ghostscript 解譯器後下 (cacc.ps) run 每次顯示一頁之後要按 Enter 鍵, 提示符號才會再出現. 最後按 ^D 離開. 如果你的系統內安裝有 gv 或 ggv 套件, 就可以直接在命令列下 gv cacc.ps, 操作介面比較友善. 如果你想知道如何用 ghostscript 將 ps 檔轉成圖形檔, 可以參考 /usr/share/doc/ghostscript* 底下豐富的文件 (特別是 Use.htm 這個檔案); 如果你想學寫 postscript 語言, 可以從 "A First Guide to PostScript" 學起.

你的 ghostscript 看到有那些 fonts 可以用? 請到 gs -h | egrep '/lib|/font' 所秀出來的各個目錄下找 Fontmap.GS 檔. 例如 /usr/share/ghostscript/6.52/lib/Fontmap.GS 裡面可看到 /URWBookmanL-Ligh 與 /Helvetica 等字形. 如何顯示某套字形? 下 gs -sDEVICE=x11 prfont.ps 進入 ghostscript, 然後在解譯器內下 /Helvetica DoFont

但是要查看系統內可用的中文字形, 方法又不太一樣。

  1. 先查出字形目錄對照表在那裡:
    rpm -ql ghostscript | grep 'CIDFnmap$'
  2. cd 到它所在的目錄下
  3. 再看看 CIDFnmap 裡面提到那些其他對照表:
    grep -v '^%\|^ *$' CIDFnmap
  4. 針對上面所列出來的對照表, 看看裡面提到那些字形可用:
    grep -v '^%\|^ *$' CIDFnmap.ARP CIDFnmap.CJK
  5. 進入 ghostscript, 並且載入顯示字形的 postscript 函式庫:
    gs -sDEVICE=x11 prfont.ps
  6. (在 gs 解譯器內下的指令) 從上面所列字形中, 選一個來顯示看看:
    /ShanHeiSun-Light DoCIDFont

這裡的 DoFont 與 DoCIDFont 都是 prfont.ps 檔案內定義的函數名稱.

Mandrake 9.1 的 CIDFnmap.ARP 裡面的定型目錄有誤, 只要根據 rpm -qil fonts-ttf-big5 印出的路徑修改就可以了。

詳見 statue 的文件。

顯示中文 pdf 檔

pdf 檔可以算是新版的 ps 檔。 較新版本的 gs 也認得 pdf 檔。 因為 gs 設定的文件比較清楚, 我現在都用 gs 看 pdf 檔。

如果要研究 pdf 檔, 可安裝 xpdf 套件。 pdffonts 可以檢視一下它用到那些字形。 從 emb 欄位可以得知它所用到的字形, 是否內嵌在文件當中。 如果所有中文字形都已內嵌, 可以用 gs 或 xpdf 開啟閱讀。 如果有些需要用到的中文字形並未內嵌, 最簡單的方式還是用 gs 閱讀。

pdfinfo 可以查看一個 pdf 檔究竟是用什麼軟體做出來的。

如果要用 xpdf 讀中文 pdf 檔... (以下有點過時) xpdf 的設定檔是 ~/.xpdfrc 感謝 Edward Lee 提供的 .xpdfrc; 但是為配合 Mandrake 9.1 的環境, 已經被我改過。 如果出問題, 可能是我改錯了。

        #----- begin Chinese Traditional support package (2002-apr-14)
        cidToUnicode    Adobe-CNS1      /usr/share/xpdf/chinese-traditional/Adobe-CNS1.cidToUnicode
        unicodeMap      Big5            /usr/share/xpdf/chinese-traditional/Big5.unicodeMap
        unicodeMap      Big5ascii       /usr/share/xpdf/chinese-traditional/Big5ascii.unicodeMap
        cMapDir         Adobe-CNS1      /usr/share/xpdf/chinese-traditional/CMap
        toUnicodeDir                    /usr/share/xpdf/chinese-traditional/CMap
        # 以下四句註解, 請只打開一句就好。 你的 xwindow 所安裝的字形
        # 可能與我不同。 請在你的環境下 xlsfonts | grep -i big5 並適當修改
        # displayCIDFontX Adobe-CNS1 "-*-fixed-medium-r-normal-*-%s-*-*-*-*-*-big5-0" Big5
        # displayCIDFontX Adobe-CNS1 "-taipei-ming-medium-r-normal--%s-*-*-*-*-*-big5-0" Big5
        # displayCIDFontX Adobe-CNS1 "-arphic technology co.-ar pl kaitim big5-medium-r-normal--%s-0-0-0-c-0-big5-0" Big5
        displayCIDFontX Adobe-CNS1 "-arphic technology co.-ar pl mingti2l big5-medium-r-normal--%s-0-0-0-c-0-big5-0" Big5
        # 不知為什麼, 可能不同版本的 linux, 文鼎字形的名稱不太相同...
        # 以下是 Edward 原來的設定
        # displayCIDFontX Adobe-CNS1    "-arphic-ar pl kaitim big5-medium-r-normal--%s-*-*-*-c-*-iso10646-1" UCS-2
        #----- end Chinese Traditional support package

其他軟體顯示中文可能遇到的問題

gnumeric

  1. 先確定 ghostscript/ghostview 可以正常顯示中文 ps 檔。
  2. 檢查 /etc/gnome/fonts/gnome-print.fontmap 裡面是否有 big5 相關字形的設定。

列印中文檔

一律轉成 .ps 檔列印。

純文字檔可用 bg5ps 轉換。

pdf 檔可用 pdftops 或 pdf2ps 轉換。 建議先試 pdftops, 這個指令來自 pdf 套件, 轉出來的檔案較小, 也較好看。 但是如果 pdf 檔用到一些既未內嵌, 你的系統也未安裝的中文字形, 不妨改試 pdf2ps。 這個指令來自 ghostscript 套件, 如果它找不到字形, 可以用 ps 一節的方式追查原因並解決。

mozilla

如果 mozilla 列印中文時, 用 print preview 看正常, 但印成 .ps 檔再用 ghostscript 看卻變成一個個空白方塊, 可以如下修正。 找到 mozilla 套件的 pref/ 目錄 (例如 Mandrake 10.1 放在 /usr/lib/mozilla-1.7.2/defaults/pref/ ), 在 unix.js 檔案裡面加上這兩句:

        pref("print.postscript.nativecode.zh-TW", "big5");
        pref("print.postscript.nativefont.zh-TW", "ShanHeiSun-Light-B5-H");

以上來自 Shen Chuan-Hsing (statue 在 freebsd.sinica.edu.tw) 的 FreeBSD Chinese HOWTO

參考資料

  1. Tips on PostScript 非常有用.
  2. Handling fonts under Linux
  3. Adobe CJK collection README 裡面提到 technical notes 第 5092 號 "CID-Keyed Font Technology Overview".
  4. Font-HOWTO.
  5. 繁體 FreeBSD 中文 Howto