話說 Sphinx 是一個寫文件非常方便的東西,在預設的情況下可以產生很漂亮整齊的網頁,而且原始碼是看起來頗乾淨的 reStructureText,要寫文件的話也只要把 VIM 打開來就馬上可以寫了。
但之前遇到的一個小問題,是雖然 Sphinx 可以生成 PDF 檔案,但他是透過 LaTex 來達成的,而眾所皆知要在 LaTex 上用中文……呃,好像不是很簡單。
至少在從前,要讓 LaTex 可以用中文,要裝 CJK 套件之類什麼的,我也一度成功地用 LaTex CJK 來生出 Sphinix 的 PDF 檔,但後來發現我太天真了……他遇到 Sphinix 裡有目錄的部份就死掉了。
後來才知道,原來現在要在 LaTex 上產生中文或其他 Unicode 文件,比較方便的解法是 xeTex / xeLaTex 這個東西,所以稍微研究了一下要怎麼用 Sphinix 再加上 xeTex / xeLaTex 來生出中文 PDF。
什麼是 xeTex / xeLaTex
簡單地來說的話,xeTex 就是個可以讓你直接在以 UTF-8 碼碼的 LaTex 原始檔裡寫中文,並且使用系統上原本的 Unicode 字型來生出 PDF 的東西。
有了 xeTex / xeLaTex,我們就不需要使用額外的 LaTex CJK 套件來處理中文的排版,也不用煩惱 Tex 字型的問題。
安裝 xeTex / xeLaTex
由於 Gentoo 的 Portage 裡面,xeTex / xeLaTex 的套件相依性有遞迴相關的 bug,所以如果要安裝 xeTex / xeLaTex 的話,需要 emerge 兩次 texlive-core 這個套件。
# USE="-xetex" emerge texlive-core
# USE="xetex" emerge texlive-core texlive-xetex
安裝完後,若有出現 xetex 和 xelatex 這兩個執行檔的話,就是成功了。
基本的 xeLaTex 文件與 PDF 生成
一個簡單的 xeLaTex 文件如下所示,其實主要的部份就是引入 fontspec 這個套件,並設定要使用的字型名稱。
字型名稱的部份,在 Linux 上可以用 fc-list 這個指令取得字型列表,我測試的結果是用中文或是英文名稱都 OK 的,只要該字型本身有中文字體即可。
%% 檔名:test.tex %%
\documentclass{article}
\usepackage{fontspec} % 引入 fontsepc,這樣才可以用下面的設定字型的指令
\setmainfont{cwTeX 圓體} % 預設字型
\setsansfont{cwTeX 圓體} % sans family 字型
\setromanfont{cwTeX 圓體} % roman 字型
\setmonofont{cwTeX 圓體} % 等寬字型
\XeTeXlinebreaklocale "zh" % 設定斷行演算法為中文
\XeTeXlinebreakskip = 0pt plus 1pt % 設定中文字距與英文字距
\begin{document}
\section{中英混排}
這是中文和英文混排的 LaTex 文件生出來的 PDF 檔案,沒有用到 CJK 套件,同
時使用了 cwTex 的圓體字型。
\end{document}
要編譯上述的原始碼成為 PDF 檔案的話,只要使用 xelatex 這個指令就可以了:
brianhsu@USBGentoo ~/test $ xelatex test.tex
This is XeTeX, Version 3.1415926-2.3-0.9997.5 (TeX Live 2011)
.....
Output written on test.pdf (1 page).
Transcript written on test.log.
這樣就會生出 PDF 的文件了,裡面的中文也會正確地用 cwTex 圓體來顯示。
將 Sphinx 與 xeTex 結合來生出 PDF
不幸地是,目前 Sphinx 並沒有內建 xeTex 的支援,所以我們得先讓 Sphinx 生出 LaTex 的原始檔,然後再修改那個檔案後再用 xeLaTex 生出最後的 PDF 文件。
舉例來說,如果你有一個原本長得像下面一樣的 Sphinx 原始檔:
歡迎使用 Sphinix 寫中文文件!
================================
目錄:
.. toctree::
:maxdepth: 2
第一章、中文
-------------------------
這一章是中文喲。
第二章、中英混排
-------------------------
這一張有中文和 English 兩種字呢!要不要再加個にほんご呢?
那麼你可以用 Sphinx 原本的 Makefile 來生出 LaTex 的檔案:
brianhsu@USBGentoo ~/doc $ make latex
如果成功的話,應該會在 build/latex/ 下面看見一個和你專案同名稱的 .tex 檔案,在這個例子裡面我們的檔案是 Test.tex。
打開 Test.tex 的話,會看到類似下面的 LaTex 原始檔:
% Generated by Sphinx.
\def\sphinxdocclass{report}
\documentclass[letterpaper,10pt,english]{sphinxmanual}
\usepackage[utf8]{inputenc}
\DeclareUnicodeCharacter{00A0}{\nobreakspace}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{times}
\usepackage[Bjarne]{fncychap}
\usepackage{longtable}
\usepackage{sphinx}
\usepackage{multirow}
\title{Test Documentation}
在這邊要做的,就是把和 xeTex 相衝突的 inputenc 套件給取消掉,並且把 xeTex 的設定給丟到最後一個 \\usepackage 和 \\title 之間[1],所以我們最後的檔案會長這樣:
% Generated by Sphinx.
\def\sphinxdocclass{report}
\documentclass[letterpaper,10pt,english]{sphinxmanual}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{times}
\usepackage[Bjarne]{fncychap}
\usepackage{longtable}
\usepackage{sphinx}
\usepackage{multirow}
\usepackage{fontspec} % 引入 fontsepc,這樣才可以用下面的設定字型的指令
\setmainfont{cwTeX 圓體} % 預設字型
\setsansfont{cwTeX 圓體} % sans family 字型
\setromanfont{cwTeX 圓體} % roman 字型
\setmonofont{cwTeX 圓體} % 等寬字型
\XeTeXlinebreaklocale "zh" % 設定斷行演算法為中文
\XeTeXlinebreakskip = 0pt plus 1pt % 設定中文字距與英文字距
\title{Test Documentation}
最後,我們再使用 xelatex 指令,直接編譯該 Test.tex 檔案兩次即可(一定要編兩次,只編第一次的話,目錄和索引是不會出現的,這是 LaTex 的機制使然),理論上這樣就可以生出一個叫 Test.pdf 的檔案囉。
brianhsu@USBGentoo ~/doc/build/latex $ xelatex Test.tex
brianhsu@USBGentoo ~/doc/build/latex $ xelatex Test.tex
回響