由 TeX/LaTeX 製作中文 PDF 檔

李果正 Edward G.J. Lee


目 錄

   
1 前言

TEX/LATEX 的指令繁複,許多朋友都視為畏途,如果不是常在使用,那真的是會很累人,但又愛其排版品質的精細優良,而且您大概沒想到過,我還拿他排版音樂五線譜、棋譜、化學結構式 ......,實在是令人又愛又恨。但是有一個比較節省時間的法子,就是有空時就把一些常用的結構整理出來,或寫一篇新的格式文章時,保留檔案的結構,就好像是 templet 一樣,要用到時再拿來填入文章即可,這不失是一種方便的方法。

底下就是要介紹如何使用 CJK1 套件來製作中文的 PDF 檔。所使用的工具都是一般的TEX/LATEX 系統裡頭就有的,而不是要去買一套所費不貲的商業軟體。當然,為達到細部品質的要求,有些套件可能需要更新一下,只要照著本文的指引去更新,應該是不會太複雜,現在不都流行 DIY 嗎?

由於基本上由 TEX/LATEX 系統製作 PDF 文件,主要是由 ps 檔來轉的,除非是使用 pdfTEX 系統,因此以下所說的都是要使用 Type1 字型或 TTF 字型,最好不要使用 pk 點陣字型,否則,製作出來的 PDF 檔,品質會很差。

   
2 工具準備

   
2.1 CJK 套件

如果您的 CJK4.2.0 版的,那最好更新一下,可以到以下網址下載:

ftp://ftp.ffii.org/pub/cjk/devel/cjk-current.tar.gz
由於這是發展中的版本,可能一切都得手動。可參考所附說明把可執行檔編譯出來,取代系統原有的就可以了。重要的是 $TEXMF/tex/CJK2 目錄下的檔案要更換成新的,就是原始碼的 /texinput 目錄下的所有檔案。

更新 CJK 套件的目的是可以配合 hyperref 套件產生中文的 bookmarks,這在以前是只有商業軟體才能做到。而且,在 Unix-like 系統中尚無製作、閱覽中文 bookmarks 的商業軟體存在。

   
2.2 pdfTEX 系統

這不僅僅是巨集套件,而是一個 TEX/LATEX 的代替品,可以將 *.tex 檔,直接編譯成 PDF 檔。這不更新也是可以,只是就無法直接取用 TTF 字型檔了。

在原有系統中也是可以只更新 pdfTEX,可以到以下網站下載各種平檯的可執行檔:

http://www.tug.org/texlive/tlprod/Master/bin/
別忘了一些必要的檔案,例如 pdftex.def, *.pool 等,在覆蓋原來的檔案後,執行 texconfig init。可參考第 3 節的網頁說明。以下為必要檔案列表:


  
Table: pdfTEX 必要之檔案列表
檔案 所在位置
pdftex /usr/bin
pdfetex /usr/bin
ttf2afm /usr/bin
pdftosrc /usr/bin
pdftex.pool /usr/share/texmf/web2c
pdfetex.pool /usr/share/texmf/web2c
supp-mis.tex /usr/share/texmf/tex/context/base
supp-pdf.tex /usr/share/texmf/tex/context/base
pdftex.def /usr/share/texmf/tex/latex/graphics

不同的 distribution 或 OS 會有不同的位置,例如 Slackware 是集中在 $TEXMF/bin 目錄下。Windows 系統的 MiKTEX 則會在 texmf\miktex\bin 目錄下。

   
2.3 hyperref 套件

這個巨集套件主要是把 PDF 的一些功能嵌入 *.tex 檔內。不更新也沒關係,但就無法做出 PDF 檔中的中文 bookmarks 了。當然,中文的 bookmarks 還得配合新版的 CJK 套件才行。可在以下網址下載:

ftp://ftp.tug.org/pub/tex/hyperref/
版本一定要高於 2002/04/12 v6.72l 否則會無法處理中文 bookmarks。這個套件的原始作者是 Sebastian Rahtz,目前是由 Heiko Oberdiek 所維護。實際例子請參考第 5 節,相關設定可參考第 4.4 小節。

   
3 字型安裝

   
3.1 有關字型的一般注意事項

這個部份請參考前曾發表的文章 ``使用 pdfTEX/pdfLATEX 讓 pdf 檔內嵌中文 TTF/TTC'':
http://www.study-area.org/tips/latex/pdftex.html
這裡要補充的是,目前大概還有不少朋友還留有以前的 Big-5 碼的 TTF,這可以借由 oto3這支程式來加入 Unicode name/cmap table,這樣就可以當做是 Unicode 字型來使用。不過,其中的 map 表,並不合我們使用的 Big-5 碼中有關日文的部份,我做了個 patch,只要 patch 裡頭的 BIG5.TXT 檔就可以了,不必重編譯程式,可在 study-area 網站下載:
http://www.study-area.org/tips/latex/oto-BIG5.diff.gz
patch 的方法如下:
cd /usr/local/share/oto/
gzip -dc oto-BIG5.diff.gz | patch -s -p0

為了要使用 Type1 字型,$TEXMF/dvips/config.ps 最好是修改一下,加入以下各種設定 (這裡假設您的中文 Type1 或 TTF 字型都已安裝、設定妥當):

%% 以下設定會預設使用 BlueSky 的 Type1 字型,等同於 dvips 的 -Ppdf 參數。
p +bsr.map              % CM/AMS fonts
p +bsr-interpolated.map % additional sizes
p +hoekwater.map        % additional fonts from Taco Hoekwater
h tex.pro
h alt-rule.pro
% 以下這個 o 要把前面的 % 拿掉,否則預設執行 dvips 會導向印表機。
o
如果不加這些設定,則要執行以下的指令代替:
dvips -Ppdf -G0 -o your.ps your.dvi
千萬不要省略這個 -G0 參數,不然就得在 $TEXMF/tex/dvips/config.pdf 中把 G 這個設定給 % 起來。這是一個古老的 acroread 的 bug 所產生的相容性問題,目前的 acroread 應該不會有這種情形,加進去反而會有其他副作用。

   
3.2 本文所使用的字型

本文 PDF 格式所使用的字型都是自由軟體或 Public Domain,非常感謝各提供的公司及個人,由於他們的熱心,使得這篇文件裡裡外外稱得上是自由文件。茲列表於表 2

  
Table: 本文 PDF 格式使用的字型
字型檔名稱 使用處 字型名稱 提供者 版權
(lr)1-5 bsmi00lp.ttf 內文 文鼎細上海宋 文鼎公司 GPL-like
wcl-02.ttf 內文標題 王漢宗特明體 王漢宗博士 GPL
wcl-07.ttf Title 王漢宗粗鋼體 王漢宗博士 GPL
cm*.pfb 內文英文字 CM PS fonts Blue Sky Research Public Domain

使用的轉換程式是 otottf2pt1。如果是使用 pdfTEX 的話,可直接抓取 TTF 而不必轉換成 Type1。

   
4 製作流程

以下所討論的方法應該是最常見的,當然 TEX/LATEX 的世界無奇不有 (個人覺得,有點像 perl 的世界,一大堆的現成模組可以運用)。但以處理中文而言,除非是自行寫程式,否則這應該算是最方便的現成方法了。以下的舉例,都是以 chpdf.tex 為例,也是本文寫作的文稿檔案名稱。

   
4.1 dvips/ps2pdf

這可說是最正統,最古老的方法了。最近由於 Ghostscript 的大幅改進,已經使這個製作方法愈來愈完美。Ghostscript 要在 6.51 以上的版本才會有較佳的效果。

這個方法其實就是一般 TEX/LATEX 製作的正常過程,由 TEX/LATEX 指令,得到 *.dvi 檔,再由 dvips 製作成 *.ps 檔,然後再由 ps2pdf*.ps 檔轉成 *.pdf 檔。當然,處理中文而言,我們使用的是 CJK 套件,在 Big-5 碼的話, 指令是 bg5latex。實際指令如下:

bg5latex chpdf.tex
dvips -t a4 -Ppdf -G0 chpdf
ps2pdf13 chpdf.ps

其中 ps2pdf13 是指使用 PDF-1.3 的格式,建議使用這個格式,比上不足,比下有餘。據個人的經驗,使用這個方法製作來的 PDF 檔,會大一些,但品質會比較好,而且,在使用 gzip 壓縮後會比由 dvipdfmpdfTEX 做出來的還要小,很奇怪吧!這也是本文的 PDF 格式的製作方法。不過,無論如何,本文中文字型是內嵌的,這樣可攜性會比較好,但檔案就會比較大了。

   
4.2 dvipdfm

這個過程比第 4.1 小節的方法少了一個 *.ps 的步驟。dvipdfm 會將 *.dvi 檔直接生成 *.pdf 檔。

dvipdfm 標榜的是忠於原 TEX,但這樣一來,可加入的 PDF 特性的功能就少了許多,可以依靠 hyperref 套件來做擴充的功能。

實際執行指令如下:

bg5latex chpdf.tex
dvipdfm chpdf

   
4.3 pdfTEX/pdfLATEX

hyperref 套件雖然也可以加入不少的 PDF 特性,但 pdfTEX/pdfLATEX 可說是重寫的軟體,可以當做 TEX/LATEX 來使用,並且加入相當多的 PDF 特異功能,如果目標是製作 PDF 檔的話,pdfTEX/pdfLATEX 無疑是首選的工具。

這個部份可以先參考第 3 節所指網頁的說明,先能動再來談應用。版本至少要 0.14h 以上的版本才能直接抓取 TTF。

當然 pdfTEX/pdfLATEX 的詳細功能,本篇文章並沒有做詳細說明,僅對有用到的功能略加解說。讀者可以下載使用手冊來參考。

   
4.4 hyperref 的設定

以目前的情形而言,hyperref 套件的使用範圍可能會比 pdfTEX/pdfLATEX 還要廣。他不僅可以配合原來的 TEX/LATEX 系統,也可以和 pdfTEX/pdfLATEX 合用,因此對這個套件有必要多瞭解一下。

   
4.4.1 hyperref 的設定檔

原則上設定檔是 hyperref.cfg,使用 hyperref 套件時,一有用到其中的 macro 就是會找這個檔,其中找尋的順序是:

  1. 文稿中是否有設定,這是最優先使用的,會蓋過其他設定。
  2. 目前的工作目錄是否有 hyperref.cfg
  3. 系統的預設值,如 Unix-like 的 $TEXMF/tex/latex/hyperref/hyperref.cfg。Windows MiKTEX 系統中的 $TEXMF\tex\latex\00miktex\hyperref.cfg

   
4.4.2 hyperref 的設定項目

這裡以我自已的 hyperref.cfg 來說明:

1 \hypersetup{backref,
2             dvips,
3             bookmarks=true,
4             pdfauthor=Edward G.J. Lee,
5             colorlinks=true,
6             breaklinks=true,
7             hyperfigures=true,
8             pdfstartview=FitH,
9             linkcolor=blue}

基本上,原來文稿使用 \label/\ref 及目錄、索引的部份就會自動可以交互參照。2 是指定要用其他如 dvipdfmpdfTEX 時更改這裡的值,或設在文稿內。

3 是指要不要 bookmarks,4 是作者名字,在使用 Xpdf4所附的 pdfinfo 指令執行後就會顯示。或者使用 acroread 在功能表上叫出 Document info 時也會顯示,在 PDF 正文內則不會顯示出來。59 是設定超連結的地方要不要顯示顏色,及顯示什麼顏色。

8 是指使用 acroread 閱覽這個 PDF 檔時的顯示模式,例如,是 Fit Width 還是 Fit in Window。這在 Xpdfgs/gv 則沒有這個功能來判斷這個設定。這裡設的是 Fit Width,不過,這個是傳參數給 PDF View 這個 key,據個人的測試,似乎控制得不是很好。

最後,請大家饒了我吧!不要把例子裡頭的阿拉伯數字也寫進您的設定檔裡去了。

   
5 動手實作

這個部份可說是本文的精華了,因為要加入 PDF 特有的功能,光靠傳統的方法及工具是不夠的,例如一些連結及 bookmarks 的功能,除非很瞭解 PDF 的一些 instructions,自行由 TEX 的指令 \special 來帶入 *.tex 文稿中,但這樣一來可就累了,本就夠複雜的 TEX/LATEX 語法,再加上 PDF 的指令,那一篇文章還沒完成,大概就打退堂鼓了。先別緊張,本文雖沒有很深入的說明,但本文這個活實例,就是您的 templet,直接拿來套用就對了!

本文的實際文稿及完成後的 PDF 檔可在 study-area 網站下載:

http://www.study-area.org/tips/latex/chpdf.tex
http://www.study-area.org/tips/latex/chpdf.pdf

這樣就可以一邊看文章一邊看實際的排版結果。其中 chpdf.tex 由於加入了許多注解,因此顯得比較亂,而且個人寫 *.tex 文稿的習慣都是不內縮的,這點請大家忍耐一下。本文沒有詳細說明的部份,應該在 chpdf.tex 的注解裡頭都會稍加說明。

當然,您必須具有最基本的 LATEX 排版的經驗,例子中已經盡量採用較簡單的方式,但有一小部份,為達到所需要的效果,還是不得不要用到特殊的套件。

   
5.1 文稿內的架構

1  \documentclass[12pt,a4paper]{article}
2  \usepackage{CJK}
3  \usepackage[dvips,CJKbookmarks]{hyperref}
4  \begin{document}
5  \begin{CJK*}{Bg5}{aming}
6  \CJKtilde

......
這裡寫文章

7  \end{CJK*} 
8  \end{document}

重點在 23 的部份。這裡如果要改用 pdfTEX,那就得把 dvips 改成 pdftex,由於我的 hyperref.cfg 已經設定好 dvips,因此這裡的 dvips 也是可以省略。而且注意這個 CJKbookmarks,這就是讓 PDF 能有中文 bookmarks 的設定,要不然因為標題的部份經過編碼,最後如果沒有還原的話就變成一堆亂碼了。這裡要特別感謝 Werner LembergHeiko Oberdiek 的幫忙,解決了中文 bookmarks 的問題,是由 Werner 提出 patch,然後 Heiko 做了一些修改後釋出。當然,這在目前只能在 Windows 系統下的 acroread 才會看得到中文 bookmarks,拿到 Unix-lke 系統的 acroread 閱覽則仍是一堆亂碼,這是 acroread 的問題,而不是 PDF 檔的問題。

其他關於目錄、交互參照、腳注、參考文獻、索引 ......等等,只要使用了 hyperref 套件,便會自動處理,不必操心。但本文並沒有談到參考文獻、索引的部份,這是更進階的課題了,留待有機會再來探討。

   
5.2 關於交互參照 (cross-reference)

基本上 LATEX 本身就有交互參照的指令可用,分別是 \label 及 \ref,\pageref,當然這只能顯示,沒辦法由滑鼠點了以後跳來跳去。也就是說只要使用 hyperref 套件,縱使沒有加入新的 tags,也是會有基本的文內連結功能。當然 hyperref 套件另有擴充這方面的功能。請參考表 3

  
Table: 交互參照
套件 指令 功能說明
LATEX \label{name} name 來定位
  \ref{name} 顯示 name 之所在章節、圖表
  \pageref{name} 顯示 name 之所在頁碼
hyperref \hypertarget{name}{text} name 來定位
  \hyperlink{name}{text} 按 hyperlink 處,會跳至
    hypertarget 所在之處

   
5.3 網址超連結 (hyperlink)

這個在原本 LATEX 當然是沒有的, TEX/LATEX 是屬於平面排版系統,網路上的應用是在 PDF 格式廣為被使用後才開始有相關套件出現,這恐怕也是 TEX 系統能長久維持一定比例使用者的原因,彈性、功能都相當大,品質也有保證,較不容易被時間所淘汰。

底下仍以圖表的方式來說明比較清楚,請參考表 4

   
Table: 網址超連結的方法
套件 定址 說明
pdfTEX   為了相容性,請盡量直接使用
    hyperref 的方式
hyperref \href{url}{text} 連結至 url 所在處
  \hyperref{url}{category}{name}{text} 連結至 url#{category} 所在處
LATEX2HTML \htmladdnormallink{text}{url} 連結至 url 所在處

   
5.4 所見即所得?

現在很流行 ``所見即所得'' ,這裡不想引發任何爭議或論戰,只是目前個人使用的環境是 GNU/Linux 系統,我就說說我是怎麼編譯,怎麼預視的。

首先我開了兩個終端機 (rxvt),我的視窗管理程式是 IceWM,我已經設定好由按鍵就可以在兩個虛擬視窗間方便移動。使用的編輯器是 Vim。在工作目錄已寫好了一個 sh script 稱為 compile 其內容如下:

#!/bin/sh
if [ $# -ne 1 ]
then
  echo "Usage: `basename $0` your.tex"
  exit 1
fi
FNAME=$1
rmtextmp
bg5latex $FNAME && \
bg5latex $FNAME && \
dvips -t a4 -Ppdf -G0 ${FNAME%.tex} && \
ps2pdf ${FNAME%.tex}.ps && \
xpdf ${FNAME%.tex}.pdf
其中 rmtextmp 是另一個 sh script,內容如下:
#!/bin/sh
rm -f *.aux *.toc *.log *.dvi *.cjk *.out \
      *.brf *.idx *.ind *.lof *.lot
主要是去除一些暫時產生的檔案,可置於路徑可達之處,否則要指明路徑。這裡 bg5latex 要執行二次,是因為交互參照的部份要第二次編譯時才會完成。

左邊由 vim 編輯了一段,想預視的話,馬上移到右邊執行:

./compile chpdf.tex
就可以了,文稿不大,而且又使用 Type1 字型的話,速度是相當快的,而 vim 也可以由顏色來幫忙控制語法是否正確,當然前提是文稿的整個大結構要先建立好,否則編譯容易發生錯誤而停下來。而大文稿本就應該切割成幾個部份,由 make,makefile 來控制。當然要做到完全由 vim 來控制也是可以,這樣會不會更方便就看個人所持的觀點和習慣了。

Emacs 編輯器 (系統?) 也有現成的 preview-latex 可以使用。

不曉得這樣子算不算是另類 WYSIWYG?在我的經驗裡,這樣的生產量是不會輸給 MS Word,尤其是文稿份量相當大,例如幾百頁的內容,至於細部微調控制那就更不用說了。甚至國人開發的 cwTEXChiTEX 目前都有相配合的 GUI 工具,相當方便,只可惜偏重在 Windows 系統上,在 Unix-like 系統上還是得雙手萬能一下。這裡要提醒大家一下,TEX 系統畢竟是幕後排版系統。而且,排版是一門審美藝術,大小細節要能掌握住,才能達到質的要求,我們要的不是 WTGIWYG(What They Give Is What You Get)。

   
6 結語

好了,文章告一段落。我得事先聲明,我不算是什麼 TEX/LATEX 的專家,只是常在使用,會有一些使用上的心得,文章裡頭所說的不敢保證百分之百正確,但至少我是親自實作過,如果有不正確的地方,希望大家提出指正。跟據我的說法去實作,如果有任何 ``意外'',那我是不負責的。您不會認為看了這十頁的內容就變成 TEX/LATEX 的專家了吧!千萬不能有這種想法,學海無涯,一山還有一山高 ......。

另外,有許多朋友來信問到 TEX/LATEX 相關文件的問題,其實一般的 TEX 系統裡頭就會附上相當多的文件,只是有些可能沒有編譯出來,是以 *.tex*.dvi 的形式存在,只要動手把他們編譯出來就成了。另外,一些 *.sty 檔裡頭都會有一些說明,這可是第一手資料喔!當然,這些都是英文,但只要找到相關的指令,照著指令的格式動手實驗一下就成了。 當然現成的 FAQ 不能忘了:

http://www.tex.ac.uk/faq

至於中文書籍,新版本的確實不多,但吳聰敏教授的《cwTEX排版系統》一書應該相當具參考價值,這是個人手邊重要的工具書之一,雖然說的是 cwTEX 但其實都差不多,LATEX 的語法是固定的,這本書網路上也可以下載。陳弘毅教授的 ChiTEX 系統也是有一些文件可以參考,也可以由網路上下載。CJK 本身的話,所附的文件也有中文的,就是 READMEb5.tex,如果沒有編譯出來的話,自行改一下裡頭使用的中文字型,手動編譯出來就是一篇 CJK 中文使用手冊了。

   
7 授權聲明

Copyright © 2002 李果正 Edward G.J. Lee

本文件除 sh script 外,為自由文件(FDL),可自由複製、修改、散佈,但請保留版權聲明。sh script 的部份為 Public Domain。文件內所提及的商標皆屬其合法註冊公司所有。

About this document ...

由 TeX/LaTeX 製作中文 PDF 檔

This document was generated using the LaTeX2HTML translator Version 2002 (1.62)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

The command line arguments were:
latex2html -split 0 -show_section_number -ascii_mode -noimages chpdf.tex

The translation was initiated by on 2002-04-27


Footnotes

...CJK1
這是由 Werner Lemberg所開發的一個 LATEX套件,專門用來排版中日韓文。
...$TEXMF/tex/CJK2
這是指 Unix-like 系統,一般是在 /usr/share/texmf/tex/CJK 目錄下。在 Windows 系統下,那可能會在 texmf/tex/latex/cjk 目錄下。
... HREF="http://sourceforge.net/projects/oto/">oto3
這支程式是由 Yao Zhang 所開發,不使用其他函式庫,是一個獨立有用的小程式,以往的 Big-5 碼TTF 可借由這個程式加入 Unicode table 後借屍還魂給 X 或 ttf2pt1來使用
...http://www.foolabs.com/xpdf/4
Xpdf 是由 Derek B. Noonburg 所開發的 PDF 閱覽器,雖不若 acroread 功能那麼完備,但在自由軟體來說,是除了 Ghostscript外的唯一 ``專業'' PDF 閱覽器。

Compiled by Edward G.J. Lee (2002-04-27)