MacTeX + CJKutf8 + DVIPDFMx 的新增中文 TTF 字形

說明 MacTeX + CJKutf8 + DVIPDFMx 的環境下,新增中文 TrueType 字形的詳細步驟。

DVIPDFMx 的優點

在利用 CJK package 進行中文文稿由 DVI 編譯為 PDF 的時候,若採用 DVIPDFMx 就可以直接利用 TrueType 字型檔而不用使用 Type 1 字型檔。除此之外,DVIPDFMx 也是藉由 Ghostscript 的管路來產生 PDF,所以 Ghostscript 的參數也是可以在編譯時一併使用,功能仍不輸給較傳統的 latex + dvips + ps2pdf 方法。另外,利用自行撰寫的 shell script 也可以使 latex + dvipdfmx 的過程在 TeXShop 中方便運行。

運行環境及所需軟體

OS
MAC OS X 4 Tiger
TeX system
MacTeX-2007 Package
原始中文字型
TrueType 之 TTF 或 TTC 字型檔
(選用)純文字編輯器
Smultron
(選用)造字改字應用程式
FontForge

開工

以下我們以 cwming.ttf 為例。

利用 ttf2tfm 產生 TFM 檔

一個中文字型檔必定會產生大量的 TFM 檔。我們先把 cwming.ttf 放在桌面上 cwming 資料夾中,再到 Terminal 中輸入
cd ~desktop/cwming
以到達工作路徑中。之後再輸入
ttf2tfm cwming.ttf cwming@Unicode@
以生成 TFM 檔。經過等待,你就會在該資料夾中得到一大堆 TFM 檔。其中,cwming@Unicode@ 表示生成的 TFM 是以 cwming 做檔名頭,而以 Unicode 編碼運行。

若對於 ttf2tfm 想了解更多,請在 Terminal 中輸入 man ttf2tfmttf2tfm --help 以取得其說明文件。

如果你的原中文字型檔是 TTC,請了解一下 ttf2tfm -f 的用法。

如果你要動用到 FontForge 先修改字型,那也可以在 FontForge 中在輸出新 TTF 檔時一併輸出 TFM 檔。

把 TFM 搬到正確的位置

/usr/local/texlive/2007/texmf-dist/fonts/tfm/ 中先建一個 cwming 資料夾,再把方才所有的 TFM 檔搬到這裡,這都需要管理者權限。在 Terminal 中輸入
cd /usr/local/texlive/2007/texmf-dist/fonts/tfm
sudo mkdir cwming
sudo mv ~/desktop/cwming/*.tfm /usr/local/texlive/2007/texmf-dist/fonts/tfm/cwming/

即可。

把 TTF/TTC 搬到正確的位置

/usr/local/texlive/2007/texmf-dist/fonts/truetype/ 中先建一個 cwming 資料夾,再把方才的 TTF 或 TFM 檔搬到這裡,這都需要管理者權限。在 Terminal 中輸入
cd /usr/local/texlive/2007/texmf-dist/fonts/truetype
sudo mkdir cwming
sudo mv ~/desktop/cwming/cwming.ttf /usr/local/texlive/2007/texmf-dist/fonts/truetype/cwming/

即可。

修改 cid-x.map

利用純文字編輯器開啟 /usr/local/texlive/2007/texmf/fonts/map/dvipdfm/dvipdfmx/cid-x.map,對在新的一列中加入
cwming@Unicode@ unicode :0:cwming.ttf
即可。若需說明,請仔細看看 cid-x.map

製作 FD 描

利用純文字編輯器製作 c70cwming.fd,其中 c70 是因為你用 Unicode。c70cwming.fd 的內容就定義了 LaTeX 指令如何控制這個新字型,例如
\ProvidesFile{c70cwming.fd}
\DeclareFontFamily{C70}{cwming}{\hyphenchar \font\m@ne}
\DeclareFontShape{C70}{cwming}{m}{n}{<-> CJK * cwming}{}
\DeclareFontShape{C70}{cwheib}{b}{n}{<-> CJKb * cwheib}{}
\DeclareFontShape{C70}{cwheib}{bx}{n}{<-> CJKb * cwheib}{}
\DeclareFontShape{C70}{cwming}{m}{it}{<-> CJK * cwkai}{}
\DeclareFontShape{C70}{cwming}{bx}{it}{<-> CJKb * cwkai}{}
就是定義了以 cwming 為 CJK 字型時的 Normal、Bold、Italic 與 Bold Italic 是什麼字型了。當然,其它的字型你也要一一裝上去才有的用。

之後把 c70cwming.fd 放到 /usr/local/texlive/2007/texmf-dist/tex/latex/CJK/UTF8/ 中即可。

更新 TeX 索引

在 Terminal 中輸入 sudo texhash 。以更新 TeX 索引。這樣就完成了。現在已經可以使用 latex filename;dvipdfmx filename 了。

TEX 檔範例

\documentclass[10pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{CJKutf8}
\begin{document}
\begin{CJK}{UTF8}{cwming}
\CJKtilde
測試看看。
\clearpage
\end{CJK}
\end{document}

與 TeXShop 的配合

請見陳念波老師所寫的「如何在 Mac OS X 上裝設 LaTeX 以及 CJK 套件 (TeX Live 2007)」中的「在 TeXShop 裡方便的使用 latex + dvipdfmx 工作流程」。

與 Ghostscript 的配合

請見 /usr/local/texlive/2007/texmf-config/dvipdfm/config/dvipdfmx.cfg 中的 D "gs..." 及 Ghostscript 官網上 ps2pdf說明文件。簡單來說,就是把 ps2pdf 中的參數寫在 D "gs..." 裡。

Chen-Pan Liao posted on 2008/7/27

CJK 全型標點符號「對齊」行尾

在 LATEX 中對中文全型標點符號重新給予新命令,並達到「避頭點」、「貼近文字基線」及「可對齊行尾」之目的。

先前的做法

過去在網路上有些人為了使 CJK 中的中文全型標點符號更美觀,以自定義新命令來取代標點符號,如下例:
\def\pe{%
  \nolinebreak[4]% A
  \hspace{-0.25em}% B
  \raise -0.75em\hbox{。}% C
  \hspace{0.4em}% D
}

其中 A 列表示句點前不可斷行;B 列使文字往左移;C 列使文字下降後輸出句點;而 D 列代表文字後之距離。之後再將文中所有之句點以 \pe 來取代,即可得到貼近基線及左側並可避頭點之中文全型句點,非常美觀。

很抱歉我並不知道這個方法是誰先提出來的,在此向原創者至上感謝之意。

先前的做法有些問題

不過這個方法似乎有些問題,而且仍不及吳老師等人之 cwTEX 的效果。以下列出幾點。

  • 由於使用了 \nolinebreak[4] 達到避頭點,但其效力仍貫穿了整個 \pe 命令,故使句號無法在行末出現。
  • 中文的全型句點基乎都沒有所謂的 kerning 設定,故即使某行之行未為句點,且 LATEX 也貼心地做到左右對齊,但句點的右邊仍留下了原本的小小空間。

修正後的辦法

所以我想了一些方法,可以修正這二項問題,一樣也是以中文全型句點為例:
\def\pe{%
  {%
    \nolinebreak[4]% A
    \hspace*{-0.25em}% B
    \raise-0.75ex\hbox{。}% C
    \hspace*{-0.25em}% D
  }%
  \allowbreak% E
  \hspace{0.5em plus 0.1em}% F
  \ignorespaces% G
}%

其中與以往不同之處在下列表說明。

  1. 我特別為句點之後加了「必須執行」的負水平伸縮距離(B 與 D 列),使句點的左右兩邊空白都被迫減少。這二個伸縮距離就是該中文句點「字」本身左右所占據的空白水平長度。如此一來,B、C、D 三列可以使你得到一個「沒有左右空白」的中文句點。「必須執行」的用意在於就算行末是個句點,也必須執行 \hspace*。若僅使用 \hspace ,在行末的句點輸出後,LATEX 不理會 \hspace
  2. 在輸出句號(C 列)及去除句號本身左右空白(B 與 D列)之前,為了避頭點,一樣不可以斷行(A 列),但這四列已被群組,表示不可斷行之功能僅限於這四列。這樣就可以達成句點後斷行。
  3. 在不可斷行之群組功能失效後,即容許斷行(但並非要求斷行,E 列)。這只是鼓勵 LATEX 可以在此斷行。
  4. F 列的「不必須執行」水平拉伸是指「非行末」之句點右方之空白空間。基於 LATEX 的精神,句子結束又不斷行的情況下,水平空白應該比較大,所以在 F 列我給予了較大的空白。
  5. 至於 G 列,只是個習慣,必不必要我就不清楚了。

新辦法的模型

所以我把我的想法寫成一個模型,來表示類似句點這類必須避頭點之自定命令(如逗號及問號等,但左括號或左引號則不適用):
\def\yourcmd{%
  {%
    \nolinebreak[4]%
    \hspace*{length1}%
    \raise length2 \hbox{×}%
    \hspace*{length3}%
  }%
  \allowbreak%
  \hspace{length4}%
  \ignorespaces%
}%

其中,

  • yourcmd 為取代後的 LATEX 命令;
  • length1 為該標點符號「文字本身」左方空白長度,應為負值,不過若你覺得文字與之後的標點符號太近了,可以自行修正一下;
  • length2 為該標點符號往下降的長度,應為負值;
  • × 為原本的中文全型標點符號;
  • length3 為該標點符號「文字本身」右方空白長度,應為負值;
  • length4 為該標點符號若並非出現於頁尾的情況下,後之後文字的距離。

尚未達成的目標

這項方法的缺點,是真的挺煩人的。要先抓到不同字體中每個標點符號的數值,還要記得在文中以新命令取代原本的符號。此外,吳老師等人也提到,像『「謝謝你。」』中有二個以上標點符號前後連續出現時,我的方法也還是會有失誤。

此外,我也正在想「避尾點」的標點符號的模式。

我練習 LATEX 並不久,文中若有任何錯誤,望大家多多指教。

Chen-Pan Liao posted on 2008/2/23

替 MacTeX 新增 CJK 之 Type 1 字型

本文說明如何在 MacTeX-2007 下為 CJK 新增中文 Type 1 字型

前言

首先感謝李果正先生的資料,其中對於新手的指點非常充足。

以 LaTeX 系統排中文,最有名的方式就是 CJK 了。不過,在 MacTeX-2007 中,只提供了 bsmi(為一種明體)作為正體中文之 CJK 字體,確實不太夠用。而網路上大部份說明如何新增 CJK 字型的中文資料,針對 MacTeX 者少。

我用 xelatex 也好一陣子了。不過 xelatex 最大的缺點就是,中英文字型會用同一種字型,除非每次遇到中英文時分別使用更換字型的命令(也許真的有更好的辦法,但小弟並不知道)。

以下我說明替 MacTeX-2007 新增 Arphic bkai00mp-20071106.tar.bz2 為 CJK 字型的步驟。若要從 TTF 字型轉成 TYPE 1 字型開始,我也不會,請參考上述李果正先生的資料。

工作環境

我的條件是在 OS 10.4 下灌好 MacTeX-2007,並未其它任何其它 TeX 或ghostscript 系統。

進行步驟

  1. 下載 bkai00mp-20071106.tar.bz2 並在 OS X 中直接解壓縮。
  2. 解壓縮後,將相關的資料夾或檔案丟到正確位置。過程中一定會要求密碼驗證。 不過太擔心丟錯地方會怎樣,其實新字型資料夾的結構和要丟去的地方有相似之處。如果你在 Finder 中找不到怎麼到這些目的地,請試著用 apple + shift + g。
    • .../fonts/afm/arphic/bkaiu
      這個資料夾丟到
      /usr/local/texlive/2007/texmf-dist/fonts/afm/arphic/
      裡。
    • .../fonts/map/arphic/dvips/arphic/bkaiu.map
      這個檔丟到
      /usr/local/texlive/2007/texmf-dist/fonts/map/dvips/arphic/
      裡。
    • .../fonts/tfm/arphic/
      內的
      bkaimp 與 bkaiu
      二個資料夾丟到
      /usr/local/texlive/2007/texmf-dist/fonts/tfm/arphic/
      裡。
    • .../fonts/type1/arphic/bkaiu
      這個資料夾丟到
      /usr/local/texlive/2007/texmf-dist/fonts/type1/arphic/
      裡。
    • .../fonts/vf/arphic/bkaimp
      這個資料夾丟到
      /usr/local/texlive/2007/texmf-dist/fonts/vf/arphic/
      裡。
  3. 確定
    /usr/local/texlive/2007/texmf-dist/tex/latex/CJK/UTF8/
    中有沒有
    c70bkai.fd 及 c70bkai.fdx
    這二個檔。如果沒有,到 CTAN 裡來抓。
  4. 在 terminal 中,執行:
    sudo texhash
    並輸入管理者密碼。此動作可以更新
    /usr/local/texlive/2007/**/
    下數個 Is-R 檔。
  5. 在 terminal 中,執行:
    sudo updmap-sys --enable Map bkaiu.map
    之後可以在
    /usr/local/texlive/2007/texmf-config/web2c/updmap.cfg
    這個檔案中找到
    Map bkaiu.map
    這行敘述。
  6. (此步驟不知道是否必要)在
    /usr/local/texlive/2007/texmf-dist/dvips/arphic/config.arphic
    中加入
    p +bkaiu.map
    一行。
  7. 到此步驟為止,已經可以用 latex + dvipdfmx 成功編譯,不過檔案很大,且 latex + dvips + ps2pdf 在 dvips 時仍會找不到新字型。我搞了很久,終於在
    /usr/local/texlive/2007/texmf-config/dvips/config/config.ps
    (記得用純文字編輯器打開)中,加入
    p +bkaiu.map
    一行即可。之後,latex + dvips + ps2pdf 可行,且 PDF 檔案也小。(但我不知道為什麼 MacTeX-2007 內建的 bsmiu.map 與 gbsnu.map 就不用。)

這樣就完成了。我以
\usepackage{CJKutf8}......\begin{CJK}{UTF8}{bkai}......\end{CJK}
再加上 latex + dvips + ps2pdf 可以完成很不錯且體積小的 PDF 檔,且與 hyperref 這個 package 在 PDF 中也配合得很好。

後記

這些過程我試很多次了,所以前前後後也許有遺漏之處,盼前輩能夠指正。 希望這篇說明對其它 MAC 愛好者能有所小小幫助。

若要加入其它中文字型給 MacTeX-2007 內的 CJK 用,我想大同小異吧。反正改錯了 再改回原來的樣子就好了,勇敢試下去吧!

Chen-Pan Liao posted on 2007/12/27