用构造 hlist 的方式实现中文标点符号的“升降”

LiYanrui posted @ Nov 26, 2009 04:50:57 AM in Dream of TeX with tags tex ConTeXt MkIV luatex , 6427 阅读

本来认为无解的事情,结果还比较有灵感,居然想到要去查看“\TeX“所对应的结点类型,结果发现是它是"glyph + kern + hlist + kern + glyph" 的形式,正好与“\TeX“的宏展开式“T\kern-.1667em\lower.5ex\hbox{E}\kern-.125em X”相对应,可见在 LuaTeX 中那个下沉的 "E" 是通过 hlist 封装起来的。

于是自己写函数去造一些中文标点符号的 hlist 结点,然后在遍历文档结点时,用经过 hlist 封装的结点去替换原有结点,这样就可以实现对中文标点符号上下方向的位置调整了。

例如对于文鼎宋体,是台湾公司免费发布的,所以其中的中文标点大都是按照台湾的习惯来设计的,标点符号都是处于中间的,如下图的中文句号:

如果将这个句号字符采用 hlist 的方式封装,例如:

local function full_stop (g)
    local n = node.copy (hlist)
    n.attr = nil
    n.width = fontdata[g.font].size
    n.depth = 0
    n.shift = 0.3 * n.width
    n.glue_order, n.glue_set, n.glue_sign = 0, 0, 0
    n.list = nodes.glyph (g.font, g.char)
    n.dir = 'TLT'
    return n
end

用上述 full_stop 函数所生成的结点替换掉文档中出现的句号字符结点,效果如下图所示:

现在,在 ConTeXt MkIV 对中文标点符号的微排版方面,感觉基本上没有什么太困难的问题了。这段时间,先把以前的各个环节的尝试总结一下,先制作一份文档出来。

cdacl 说:
2009年11月29日 17:53

对标点符号进行升降会不会影响行距呢?

Avatar_small
LiYanrui 说:
2009年11月29日 18:08

@cdacl: 不会。

另外,这个方法也是有点罗嗦,事实上对于 glyph 结点,可以直接修改它的 yoffset 值来实现“升降”。

silvercoder 说:
2009年12月17日 05:18

万恶的简化字啊!本来中文标点就与西文不同,为何一定要参照西文习惯来写呢?标点在中间还有个重要原因是汉字既可直书也可横写,变成跟西文一样那遇到直排时怎么办呢?

感慨两句,楼主莫怪。

再请教一下,ConTeXt 目前对中文直排有没有什么简单的办法?

Avatar_small
LiYanrui 说:
2009年12月17日 05:31

@silvercoder: 应该是没有简单方法,比方模块、宏包之类的。不过 LuaTeX 提供了文字方向控制的功能,可以用来做直排。

将来假如有人愿意为 ConTeXt 写直排模块的时候,也可以用 luatex 所计算的字符 bounding box 来调整标点位置,这个不是什么太大的问题。


登录 *


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