framed,overlay,layer 还有 collector
在使用 MS Word “排版”文档时,我们经常要用到“文本框”和“图文框”,在 ConTeXt (MkIV 版本) 中我们可以利用 framed、overlay 和 layer 来实现类似的功能。
ConTeXt 对参考文献的处理——整容篇
标题党!!!
上一回书说到 ConTeXt 处理参考文献时,给出的是“原生态”的排版效果,这主要是因为 ConTeXt 的参考文献模块默认给出的是适合西文排版的参考文献格式。中文用户,还需要先扮演一下整容师,对参考文献排版样式整顿一下。
ConTeXt 对参考文献的处理
本文讲述 ConTeXt 处理参考文献的基本过程。
ConTeXt MkIV 中文标点间距压缩问题的解决方案
有关在 ConTeXt MkIV 中解决中文标点符号微排版的话题,在背景一文中已做过介绍。为这个问题已经潜水很久,现在才开始准备浮出水面。这篇文章主要总结一下这段时间所做过的一些有关中文标点间距压缩方面的尝试,这样即便我受到一些外因的限制无法完成此事,也可对其他有志于此者有所帮助。
用构造 hlist 的方式实现中文标点符号的“升降”
本来认为无解的事情,结果还比较有灵感,居然想到要去查看““所对应的结点类型,结果发现是它是"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 对中文标点符号的微排版方面,感觉基本上没有什么太困难的问题了。这段时间,先把以前的各个环节的尝试总结一下,先制作一份文档出来。
又可以接着做 ConTeXt MkIV 的中文标点处理了
今天在翻看 LuaTeX 文档时,无意中看到已经看了好几遍的一句话:
Callback assignments are always global. You can use the special value nil instead of a function for clearing the callback.
这让我想起四个多月前败了一次就放弃的 ConTeXt MkIV 中文标点处理的事情。当时只是怀疑 Hans 在做字体的 Fallback 时已经利用了那个pre_linebreak_filter 回调函数,以致于只要我使用了自定义的 pre_linebreak_filter 回调函数就会把 Hans 的覆盖掉,所以导致 ConTeXt 的字体机制不正常。所以就简单地放弃了。
刚才进入 /path-to/texmf-context/tex/context/base 目录 grep 了一下,发现 Hans 的确是用了 pre_linebreak_filter:
$ grep pre_linebreak_filter * node-ini.mkiv:% callbacks.push('pre_linebreak_filter') node-ini.mkiv:% callbacks.pop('pre_linebreak_filter') node-pro.lua:function nodes.processors.pre_linebreak_filter(head,groupcode) node-pro.lua:callback.register('pre_linebreak_filter', nodes.processors.pre_linebreak_filter)
仔细想想,其实是有办法来解决这个回调函数冲撞的问题的,只是我对动态语言太缺乏实战经验,所以一直逃避至今。
大致可以这样解决:
local old_pre_linebreak_filter = callback.find ('pre_linebreak_filter') function new_pre_line_break (head, groupcode) old_pre_linebreak_filter (head, groupcode) -- 下面是我自己的代码 ... ... return true end callback.register ('pre_linebreak_filter', new_pre_line_break)
这个问题一旦解决了,那么基于以前所做的那些有关 LuaTeX 的尝试,实现中文标点横排压缩和边界对齐只是个体力活。
不仅仅是为了中文
上一篇在讲述 ConTeXt Minimals 安装过程中,为了测试 ConTeXt 环境是否可以正常工作,曾给出一个 "Say hello to \CONTEXT" 的英文测试示例,但愿当时你不会擅自向那个示例中自作主张地加入一些中文字符,那样做的话,得到不正确的的排版输出是在所难免的。因为,ConTeXt 默认仅支持英文排版,要让它支持中文,需要再做一些配置并了解更多的知识。
这就是 ConTeXt Minimals
讲述了在 Windows 和类 Unix 系统里如何安装 ConTeXt Minimals,并详细介绍了 TeX 文稿编辑器——TeXworks 的 ConTeXt MkIV 编辑环境的配制方法。