TeX 的 Glue 与中文断行

LiYanrui posted @ May 22, 2008 09:08:03 AM in Dream of TeX with tags tex 中文断行 , 5708 阅读

资质天生愚钝,The TeXBook 读到 Glue 一节,才意识到这个可以用于处理中文断行。

虽然现在还不知道 TeX 的断行算法是怎样的(过几日就会读到,届时再来印证一番),直觉上 TeX 处理英文的断行肯定要依循单词之间的空格,这种算法用于处理中文断行就不行了,因为汉字之间没有空格。

TeX 可以把每个文字都当作一个盒子来处理,在排版时,这些盒子是通过 Glue 连接起来的。在使用 TeX 排版中文时,如果在汉字之间插入一些微小的“空格”,那么就可以直接利用 TeX 的英文断行机制了。那天我给 WangYue 发邮件,向他询问有关 MkIV 的 font-otf.lua 脚本中一个 stretch 变量值的作用,现在有点明白了。那个脚本正是在每个汉字之间插入了 Glue,只是当时并不知道 Glue 是啥意思。

我用下面一份 LuaTeX 源文档印证了一下自己的想法:

\pdfoutput1
\directlua0{dofile ('setfont.lua')}

\font\zh=simsun at 11pt
\def\zhskip{\hskip.08em plus .03em minus.03em}
\hsize 20em

\zh
我\zhskip是\zhskip中\zhskip文\zhskip我\zhskip要\zhskip断\zhskip行\zhskip
我\zhskip是\zhskip中\zhskip文\zhskip我\zhskip要\zhskip断\zhskip行\zhskip
我\zhskip是\zhskip中\zhskip文\zhskip我\zhskip要\zhskip断\zhskip行\zhskip
我\zhskip是\zhskip中\zhskip文\zhskip我\zhskip要\zhskip断\zhskip行\zhskip
我\zhskip是\zhskip中\zhskip文\zhskip我\zhskip要\zhskip断\zhskip行\zhskip
我\zhskip是\zhskip中\zhskip文\zhskip我\zhskip要\zhskip断\zhskip行\zhskip
我\zhskip是\zhskip中\zhskip文\zhskip我\zhskip要\zhskip断\zhskip行\zhskip
我\zhskip是\zhskip中\zhskip文\zhskip我\zhskip要\zhskip断\zhskip行\zhskip

\bye

断行的效果:

由于目前的中文字体在设计上通常都将标点符号的宽度等于一个汉字的宽度,而高质量的中文排版,标点并不是占据一个中文字符的位置,而要比中文字符略小,若解决这一问题,可以在中文标点与汉字之间插入类似下面这样的 glue:

我是中文,没有压缩标点,有些丑陋。

我是中文,\hskip-0.3em对标点字距进行压缩,\hskip-0.3em好看了一些。

标点字距的未压缩与压缩的效果对比如下图所示:

如果将源文档中的 \zhskip 宏采用 LuaTeX 提供的脚本嵌入机制实现自动插入,再考虑一下对中文标点符号的处理,那么基本上可以差强人意地实现中文断行了。我现在倒是可以写个 Python 预处理脚本来实现,不过也没什么意思,继续啃 The TeXBook。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter