作者andrew43 (Myrmarachne)
看板LaTeX
标题[心得] CJK 全型标点符号「对齐」行尾
时间Sat Feb 23 00:59:50 2008
过去在网路上有些人为了使 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)