在 LATEX 中對中文全型標點符號重新給予新命令,並達到「避頭點」、「貼近文字基線」及「可對齊行尾」之目的。
先前的做法
過去在網路上有些人為了使 CJK 中的中文全型標點符號更美觀,以自定義新命令來取代標點符號,如下例:
\def\pe{% \nolinebreak[4]% A \hspace{-0.25em}% B \raise -0.75em\hbox{。}% C \hspace{0.4em}% D }
其中 A 列表示句點前不可斷行;B 列使文字往左移;C 列使文字下降後輸出句點;而 D 列代表文字後之距離。之後再將文中所有之句點以 \pe 來取代,即可得到貼近基線及左側並可避頭點之中文全型句點,非常美觀。
很抱歉我並不知道這個方法是誰先提出來的,在此向原創者至上感謝之意。
先前的做法有些問題
不過這個方法似乎有些問題,而且仍不及吳老師等人之 cwTEX 的效果。以下列出幾點。
- 由於使用了
\nolinebreak[4]
達到避頭點,但其效力仍貫穿了整個\pe
命令,故使句號無法在行末出現。 - 中文的全型句點基乎都沒有所謂的 kerning 設定,故即使某行之行未為句點,且 LATEX 也貼心地做到左右對齊,但句點的右邊仍留下了原本的小小空間。
修正後的辦法
所以我想了一些方法,可以修正這二項問題,一樣也是以中文全型句點為例:
\def\pe{% {% \nolinebreak[4]% A \hspace*{-0.25em}% B \raise-0.75ex\hbox{。}% C \hspace*{-0.25em}% D }% \allowbreak% E \hspace{0.5em plus 0.1em}% F \ignorespaces% G }%
其中與以往不同之處在下列表說明。
- 我特別為句點之後加了「必須執行」的負水平伸縮距離(B 與 D 列),使句點的左右兩邊空白都被迫減少。這二個伸縮距離就是該中文句點「字」本身左右所占據的空白水平長度。如此一來,B、C、D 三列可以使你得到一個「沒有左右空白」的中文句點。「必須執行」的用意在於就算行末是個句點,也必須執行
\hspace*
。若僅使用\hspace
,在行末的句點輸出後,LATEX 不理會\hspace
。 - 在輸出句號(C 列)及去除句號本身左右空白(B 與 D列)之前,為了避頭點,一樣不可以斷行(A 列),但這四列已被群組,表示不可斷行之功能僅限於這四列。這樣就可以達成句點後斷行。
- 在不可斷行之群組功能失效後,即容許斷行(但並非要求斷行,E 列)。這只是鼓勵 LATEX 可以在此斷行。
- F 列的「不必須執行」水平拉伸是指「非行末」之句點右方之空白空間。基於 LATEX 的精神,句子結束又不斷行的情況下,水平空白應該比較大,所以在 F 列我給予了較大的空白。
- 至於 G 列,只是個習慣,必不必要我就不清楚了。
新辦法的模型
所以我把我的想法寫成一個模型,來表示類似句點這類必須避頭點之自定命令(如逗號及問號等,但左括號或左引號則不適用):
\def\yourcmd{% {% \nolinebreak[4]% \hspace*{length1}% \raise length2 \hbox{×}% \hspace*{length3}% }% \allowbreak% \hspace{length4}% \ignorespaces% }%
其中,
yourcmd
為取代後的 LATEX 命令;length1
為該標點符號「文字本身」左方空白長度,應為負值,不過若你覺得文字與之後的標點符號太近了,可以自行修正一下;length2
為該標點符號往下降的長度,應為負值;×
為原本的中文全型標點符號;length3
為該標點符號「文字本身」右方空白長度,應為負值;length4
為該標點符號若並非出現於頁尾的情況下,後之後文字的距離。
尚未達成的目標
這項方法的缺點,是真的挺煩人的。要先抓到不同字體中每個標點符號的數值,還要記得在文中以新命令取代原本的符號。此外,吳老師等人也提到,像『「謝謝你。」』中有二個以上標點符號前後連續出現時,我的方法也還是會有失誤。
此外,我也正在想「避尾點」的標點符號的模式。
我練習 LATEX 並不久,文中若有任何錯誤,望大家多多指教。