[心得] CJK 全型標點符號「對齊」行尾
過去在網路上有些人為了使 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
的效果。以下列出幾點。
1. 由於使用了 \nolinebreak[4] 達到避頭點,但其效力仍
貫穿了整個 \pe 命令,故使句號無法在行末出現。
2. 中文的全型句點基乎都沒有所謂的 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
}%
其中與以往不同之處在下列表說明。
1. 我特別為句點之後加了「必須執行」的負水平伸縮距離
(B 與 D 列),使句點的左右兩邊空白都被迫減少。這
二個伸縮距離就是該中文句點「字」本身左右所占據的
空白水平長度。如此一來,B、C、D 三列可以使你得到
一個「沒有左右空白」的中文句點。「必須執行」的用
意在於就算行末是個句點,也必須執行 \hspace*。若僅
使用 \hspace ,在行末的句點輸出後,LATEX 不理會
\hspace。
2. 在輸出句號(C 列)及去除句號本身左右空白(B 與 D
列)之前,為了避頭點,一樣不可以斷行(A 列),但
這四列已被群組,表示不可斷行之功能僅限於這四列。
這樣就可以達成句點後斷行。
3. 在不可斷行之群組功能失效後,即容許斷行(但並非要
求斷行,E 列)。這只是鼓勵 LATEX 可以在此斷行。
4. F 列的「不必須執行」水平拉伸是指「非行末」之句點
右方之空白空間。基於 LATEX 的精神,句子結束又不斷
行的情況下,水平空白應該比較大,所以在 F 列我給予
了較大的空白。
5. 至於 G 列,只是個習慣,必不必要我就不清楚了。
所以我把我的想法寫成一個模型,來表示類似句點這類必須避
頭點之自定命令(如逗號及問號等,但左括號或左引號則不適
用):
\def\yourcmd{%
{%
\nolinebreak[4]%
\hspace*{length1}%
\raise length2 \hbox{×}%
\hspace*{length3}%
}%
\allowbreak%
\hspace{length4}%
\ignorespaces%
}%
其中 yourcmd 為取代後的 LATEX 命令;length1 為該標點符
號「文字本身」左方空白長度,應為負值,不過若你覺得文字
與之後的標點符號太近了,可以自行修正一下;length2 為該
標點符號往下降的長度,應為負值;length3 為該標點符號「文
字本身」右方空白長度,應為負值;length4 為該標點符號若
並非出現於頁尾的情況下,後之後文字的距離;×為原來的中
文全型標點符號。
這項方法的缺點,是真的挺煩人的。要先抓到不同字體中每個
標點符號的數值,還要記得在文中以新命令取代原本的符號。
此外,吳老師等人也提到,像『「謝謝你。」』中有二個以上
標點符號前後連續出現時,我的方法也還是會有失誤。
此外,我也正在想「避尾點」的標點符號的模式。
我練習 LATEX 並不久,文中若有任何錯誤,望版友們多多指教。
--
http://apansharing.blogspot.com/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.128.117.83
※ 編輯: andrew43 來自: 140.128.117.83 (02/23 01:01)
※ 編輯: andrew43 來自: 140.128.117.83 (02/23 22:30)
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
LaTeX 近期熱門文章
PTT數位生活區 即時熱門文章