XeTeX 快速上手

這一頁主要記錄如何使用 XeTeX 排出中文 pdf 文件。XeTeX 改良 TeX 的核心,讓它以 unicode 字元為單位進行排版,同時它直接取用系統中的字型使用,你的 GUI 能用哪些字型,XeTeX 也「立即」可用,不需要額外安裝字型的手續。在 Linux/FreeBSD 上,XeTeX 使用 fontconfig 來取用系統字型,而這也是近來 X window 上最方便的字型管理系統。因為使用了 unicode,除了中文以外,理論上其它各式各樣的語言都可以交給 XeTeX 處理。

1. 安裝

不要自找麻煩,最方便的做法是安裝 Tex Live 2007,裡面就有附上 XeTeX。在 Windows 上已經有圖形化的安裝程式,選取 “collection-xetex” 就會一併安裝 XeTeX。

2. 使用方法

使用 XeTeX 的方式相當簡單,首先是 LaTeX 文件:

\documentclass{article}

\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt
\font\ming="新細明體" at 10pt

\begin{document}
\ming 中文測試
\end{document}

然後對這個檔執行 xelatex 就可以產生中文 pdf 文件了,而且使用新細明體作為文件字型。其中的 \XeTeXlinebreaklocale 是表示 XeTeX 應該以中文的方式斷行,因為一般英文字只會在空白處斷行,而中文字除了避頭避尾以外可以斷在任何地方,因此要指定 XeTeX 使用中文方式斷行。後面的 \XeTeXlinebreakskip 則是讓 XeTeX 可以在字元間加入 0pt~1pt 的彈性間距,這樣才能排出左右切齊的文件。

3. 使用 fontspec 設定字型

雖然 XeTeX 內建選選字型的指令,但要設定全文使用的字型、或是使用某些字型的特殊功能 (如連字符 ligature) 時,使用 fontspec package 是比較方便的做法。

上述的例子改用 fontspec 後如下:

\documentclass{article}

\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt

\usepackage{fontspec}
\setmainfont{PMingLiU}

\begin{document}
中文測試
\end{document}

注意我們改用英文字型名稱,原因後述。fontspec 提供一些更方便的字型設定指令,常用的如下:
\fontspec
選用某一個字型。
\setmainfont
設定文件的預設字型,這也是當使用者下 \rmfamily 指令時會選用的字型。
\setsansfont, \setmonofont
同上,分別設定 \sffamily\ttfamily 所對應的字型。
\newfontfamily
定義新的字型,這樣使用新字型時就不需要用 \fontspec,就像 \rmfamily 那樣寫自己指定的名稱即可。

以下是一個小範例:

\documentclass{article}

\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt

\usepackage{fontspec}
\setmainfont{PMingLiU}
\setsansfont{DFPHeiMedium-UN}
\newfontfamily\ming{DFPMingLight-UN}

\begin{document}
中文測試,這些字使用細明體。 \\
{\sffamily 這些字會改用華康中黑體} \\
{\ming 華康細明體}
\end{document}

fontspec 還有許多特異功能,比如說加入字體變化或連字符 (ligature),詳細的情況請參考文件。此外網路上似乎很難找到說明 XeTeX 的網頁,請直接參考安裝時附上的 pdf 文件。

4. 已知問題

雖然 XeTeX 看起來相當完美,但和 CJK 比起來,它還有一些小問題沒解決:

  1. 目前沒辦法對中英文設定不同的字型。似乎是因為多數中文字型的使用者不關心英文部份的樣子,許多中文字型中的英文字只能說是「可以辦識」,離美觀還差了段距離。另一方面,就算中英文字型可以分開設定,合在一起看時往往會有英文字過高或過低的現象,因為它們畢竟是不同的字型。這點在 CJK 中有個 hacking solution (\CJKhdef),不知道未來 XeTeX 是否會提供另一種解法。
  2. CJK 中有個 CJK* environment,讓原始檔內的中文文字可以在任意處斷行而不至於多出一個空白。不過 XeTeX 似乎沒有對應的功能,因此斷行處會多出一個空白。暫時的解決方法是不要斷行,或是加上百分號把斷行註解掉。
  3. 目前 XeTeX 使用改版過的 dvipdfmx (稱為 xdvipdfmx) 來產生 pdf,不幸的是,目前無法產生中文 bookmarks (就是打開 pdf 時,在 Acrobat Reader 左邊顯示的文件結構)。這部份應該是沒有太大的技術困難,最近的 CJK 也提供這個功能,因此相信不久後的版本就可以修正這個問題。
  4. 加上底線的文字無法正確斷行。CJK 中提供 \CJKunderline 來解決這個問題。

另外雖然 \setmainfont 等指令可以接受中文字型名稱,但處理時似乎有一些問題,當字型名稱重覆時會出現錯誤:

\setmainfont{細明體}
\setmonofont{細明體}

這樣會出現重覆定義的錯誤訊息:
! LaTeX Error: Command \c@zf@famc@細明體 already defined.
               Or name \end... illegal, see p.192 of the manual.

改用英文名稱 (PMingLiU) 就不會出現這項錯誤。
rating: 0+x

Comments

Add a New Comment
or Sign in as Wikidot user
(will not be published)
- +
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License