用构造 hlist 的方式实现中文标点符号的“升降”
LiYanrui
posted @ Nov 26, 2009 04:50:57 AM
in Dream of TeX
with tags
tex ConTeXt MkIV luatex
, 6490 阅读
本来认为无解的事情,结果还比较有灵感,居然想到要去查看““所对应的结点类型,结果发现是它是"glyph + kern + hlist + kern + glyph" 的形式,正好与““的宏展开式“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 对中文标点符号的微排版方面,感觉基本上没有什么太困难的问题了。这段时间,先把以前的各个环节的尝试总结一下,先制作一份文档出来。
2009年11月29日 17:53
对标点符号进行升降会不会影响行距呢?
2009年11月29日 18:08
@cdacl: 不会。
另外,这个方法也是有点罗嗦,事实上对于 glyph 结点,可以直接修改它的 yoffset 值来实现“升降”。
2009年12月17日 05:18
万恶的简化字啊!本来中文标点就与西文不同,为何一定要参照西文习惯来写呢?标点在中间还有个重要原因是汉字既可直书也可横写,变成跟西文一样那遇到直排时怎么办呢?
感慨两句,楼主莫怪。
再请教一下,ConTeXt 目前对中文直排有没有什么简单的办法?
2009年12月17日 05:31
@silvercoder: 应该是没有简单方法,比方模块、宏包之类的。不过 LuaTeX 提供了文字方向控制的功能,可以用来做直排。
将来假如有人愿意为 ConTeXt 写直排模块的时候,也可以用 luatex 所计算的字符 bounding box 来调整标点位置,这个不是什么太大的问题。