[Gentoo] 使用 Sphinx 與 xeLaTex 來產生中文 PDF 檔

話說 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

安裝完後,若有出現 xetexxelatex 這兩個執行檔的話,就是成功了。

基本的 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

中文 PDF 結果

以上述的 Sphinx 原始檔來說,我們可以生出這個 PDF 檔案,由於字型是內嵌的,所以就算對方的電腦沒有 cwTex 圓體這個字型,一樣是可以看得到的喔!

總而言之,透過上述的方式,我們就可以使用 Sphinx 這個非常方便的工具,直接製作美美的 PDF 有件檔案囉。

註解

[1]這一步可以使用 conf.py 來達成,不過這裡以手動操作示範。

回響