5. CJK 語法簡介

CJK 是一組在 LaTeX 下使用的 macro/environment,因此最先要具備的,當然就是 LaTeX 的語法了,再來才是 CJK 中的特殊語法。其實,只要 CJK 的大結構搞清楚,重要的語法還是在於原來的 TeX/LaTeX 裡頭。


5.1 LaTeX 的基礎文件

以下這些文件,都是給想接觸 LaTeX 的朋友而寫的,相當具參考價值,請多多利用。如果不清楚一般要用到的 LaTeX 語法,那學 CJK 的語法是沒什麼意義的。

5.1.1 一些值得參考的入門文件

系統上的 lshort.dvi

ftp://ftp.dante.de/tex-archive/info/beginlatex/beginlatex.pdf
ftp://ftp.dante.de/tex-archive/info/simplified-latex/simplified-intro.pdf
ftp://ftp.dante.de/tex-archive/info/ 目錄下有許多文章可以參考

整理相當完整的網路教材

SITE=http://www-h.eng.cam.ac.uk/help/tpl/textprocessing
$SITE/latex_basic/latex_basic.html
$SITE/latex_advanced/latex_advanced.html
$SITE/latex_maths+pix/latex_maths+pix.html
請自行將 SITE 的內容取代進去連成一個完整的網址。

吳聰敏、吳聰慧兩位老師的《cwTeX 排版系統》修訂 2 版

ftp://ftp1.sinica.edu.tw/pub2/tex/cwTeX/cxbook-s.pdf
雖然說的是 cwTeX 但其實道理是相通的。

〈大家來學 LaTeX〉一文

http://edt1023.sayya.org/tex/latex123/index.html
http://edt1023.sayya.org/tex/latex123/latex123.pdf
http://MathNet.math.tku.edu.tw/~edt1023/tex/latex123/index.html
http://MathNet.math.tku.edu.tw/~edt1023/tex/latex123/latex123.pdf

FAQ(許多問題可以從這兒查到初步資料,可抓 pdf 檔,比較好查詢,網站上也有搜尋的功能)

http://www.tex.ac.uk/faq
ftp://cam.ctan.org/tex-archive/help/uk-tex-faq/newfaq.pdf

Hypertext Help with LaTeX(簡介及指令、環境、資源速查表)

ftp://ftp.giss.nasa.gov/pub/sgreen/latex/latex.tar.gz

安裝 Kile 就會有個 LaTeX 指令速查表(latexhelp.html)

http://perso.club-internet.fr/pascal.brachet/kile/

看一些 macro 時,會需要 TeX 指令速查表

http://www.tug.org/utilities/plain/cseq.html

貪多嚼不爛,請先選定一份文件下功夫,純熟後其他的文件自然就會很容易吸收。


5.2 CJK 中的特殊指令

其實,依 CJK 的作者 Werner Lemberg 的說法,CJK macro 著重的重點,主要是給非使用 CJK 語文為主的人士使用的,因此是一個 environment 的形式出現,在有需要的部份加入這個環境就可以寫入 CJK 文字,不被這個環境包圍的部份仍然是英文模式,而不是打算將整個 TeX/LaTeX 系統中日韓化。

這樣的好處是,多國語文可以同時並存於同一份文件,各用各的編碼,缺點就是常會發現和其他 package 衝突,除非將來 LaTeX team 願意納入 CJK macro 的程式碼,否則這些 macro 間的衝突是難免的,畢竟 TeX 系統本就不是專為多字元語系所寫的。

以下只針對常常要用到的指令來說明,其他的可以參考 CJK 所附的文件,也有中文的。

5.2.1 CJK 的主要架構

以下先簡單說明 CJK 的架構,當然也是一般 LaTeX 文件的架構。

\documentclass[12pt,a4paper]{article}
\usepackage{CJK}
...
這裡是 preamble 區
...
\begin{document}
...
這裡可以寫非 CJK 的文字
...
\begin{CJK}{Bg5}{aming}
...
這裡才是本文區,可以寫中日韓各種不同編碼的語文
目前是定在 Bg5,就是我們的 Big-5 編碼
...
\end{CJK}
...
這裡可以寫非 CJK 的文字
...
\end{document}

所以,可以看得出來,CJK 環境包住整個文稿內文區的話,那整篇文稿都可以使用中文,也可以包住部份需要中文的地方,而且這個環境可以重複使用。一篇文稿中要使用多種不同編碼的文章也是可以,只要各 CJK 環境使用不同的編碼就可以了,但有些編碼需要前置處理,有些則不必,這裡要注意一下。

5.2.2 變更字體

字體除了在進入 CJK 環境時指定,也可以途中變更,例如:

\CJKfamily{akai}

這會改變成 akai 的字體。當然,如果不是在環境中,或由大括號括住,那要記得回復原字體,否則以下的字體都會通通變成楷體。另外,也可以另起一個新的 CJK 環境,並指定不同的字型。

5.2.3 變更字距、行距

字間距是由 \CJKglue 所定義,他的預設值是:

\newcommand{\CJKglue}{\hskip 0pt plus 0.08\baselineskip} CJK 預設值
\renewcommand\CJKglue{\hskip -0.3pt plus 0.08\baselineskip} 本文的定義

可以變更他的 \hskip 為負值,就會縮小字間距。行距的話,和英文環境一樣,是由 \linespread 來控制,只要改變他的參數,就會照原來字體大小的倍數縮放。例如:

\linespread{1.2}

則會放大成字體大小的 1.2 倍,這裡所謂的行距,指的是兩 baseline 的距離,就是這一行字的底線至下一行字的底線的距離。把這些設定在 preamble 區,則對整篇文稿都會有效果。

一般的 verbatim 環境,常會造成無法正常折行的問題,這可以改用 CJKverbatim 來代替。

如果在編譯時常會有 `Overfull \hbox' 的錯誤訊息,可以改變 \CJKtolerance 的容忍度,他的預設值是:

\newcommand{\CJKtolerance}{400}

另外,CJKindent 是專為 CJK 語文所設的,會內縮兩個中文字,不然,一般的內縮是在一至兩個中文字之間。但這要在 CJK-4.5.1 以上的版本才支援。

5.3 關於中英混合字間距及中文斷行

這個問題困擾許多人,因為 TeX 不會去辨識是不是中文字,以致於我們按 Enter 鍵斷行,TeX 會認為要加入一個空白,因為這在英文環境的確是字(word)間空白,但中文就不是了。而且,中英文間是否要有個空白?這個空白應該要多大?恐怕也沒有確定的結論。以下是幾個解決的方式。

5.3.1 編輯時手動加入必要的控制

這完全是抓 TeX 的特性去適應的,可能是比較笨的方法,但如果習慣了的話,問題可能比較少。也就是說中英文間,主動在編輯時就加入一個空白。而換行的話,可以在每行最後加一個百分號 %,或以我個人的習慣,中文的話是一行到底不按 Enter 鍵,這在一般的編輯器會有「假性」折行,也就是螢幕看起來有折行,實際上是沒有。

也有人就乾脆使用英文逗點,然後在英文逗點後按 Enter 鍵換行,這樣的話,單字元的英文逗點,後面再加個單字元的空白,看起來就不難看了,當然,這在中文句點就沒有替代的方法。

5.3.2 使用 CJK* 環境

也可以使用 CJK* 環境來解決,也就是說,原來的環境宣告要變成:

\begin{CJK*}{Bg5}{aming}
...
\end{CJK*}

加個星號,這有兩種作用:

  1. 去除中英文字間的空白。
  2. Enter 鍵的斷行,自動去掉換行空白。
那問題來了,中英文字間距怎麼辦?這可以使用 \CJKtile,然後在中英文字間加個波紋號 ~,這個空白會比一般的英文空白大一點點。這在文章不長的情況下還可以忍受,長篇文章的話可能打字起來不會很方便。

5.3.3 由程式本身去解決

cwTeX 及 ChiTeX 就由程式本身去解決這類問題,這種處理方式可能會比較完善。有興趣的話,也可以自行寫程式或 macro 去前置處理,不過,要小心的是在 TeX 的世界,「地雷」很多,別誤觸「地雷」了。:-)

5.4 直排的問題

在東方語文中,會有許多機會要使用到直排。在 CJK 中,也可以處理直排的排版,但是 CJK 的版本要新一點的才行(最好是取得 CVS 中的版本),而且標點符號要另外使用直排的標點符號,這可以從 CTAN 中的 TeXLive 檔案中取得:

http://tug.org/ftp/texlive/Contents/live/texmf/fonts/

只要引入 CJKvert package 就可以了,但他不會自動引入 CJK package,所以兩個都要引入:

...
\usepackage{CJK}
\usepackage{CJKvert}
...

其他就和正常橫排一樣的編輯即可,編譯過後自然會轉成直排。這裡有個實例供參考:

http://edt1023.sayya.org/misc/big5vert.tex
http://edt1023.sayya.org/misc/big5vert.pdf

他的原理是將每個中文字旋轉後再排入,這樣可以節省另一套直排字型,使用原有的一般字型就可以了,當然,也因此在操作上容易和其他的巨集套件有衝突的機會。這個套件仍在發展中,所以會有些小地方沒有注意到,但一般使用應該是可以用了。

5.5 漢字加點、畫線

東方語文也常會有加其他點標示重點或畫線的情形,例如中文的書名號、私名號等等。這是由 Wenchang Sun 所貢獻的 macro,你必須使用 CJK-4.5.2(不含)以上的版本才有這個功能。當然,你可以從 CJK 的 cvs server 中取出最版的 CJK

這個 macro 的名稱是 CJKfntef,他會自動載入 CJK package,所以,只要載入這個 macro 就可以使用 CJK 環境了。

...
\usepackage{color}      % 需要顏色放前面
\usepackage{CJKfntef}
[\usepackage{color}]    % 不需要顏色放後面
...

這些加點、畫線是有顏色的,如果要沒有顏色(就是和字體一樣是黑色)的話,只要把引用這個 package 的宣告時放在 color package 前面就可以了,要有顏色就一定要放在 color package 後面,這樣才能順利引用到顏色的定義。以下舉一些實例:

Image cjkfntef
當然,這個 macro 才剛完成,還沒有正式 release,難免會有些和原有 macro 衝突的情況發生,例如用在表格中時就會有問題,但這些變化算是滿方便的,一些臭蟲我們可以慢慢來改善。

Compiled by Edward G.J. Lee (2004-05-18)