罚点

LiYanrui posted @ Jul 03, 2009 03:52:30 PM in Dream of TeX with tags luatex tex , 2584 阅读

在 TeX 中,罚点(penalty)可以用于控制在某个字符后是否必然会发生断行,我们可以利用它来实现标点禁则。在 LuaTeX 中,函数 nodes.penalty () 可以制作一个罚点,只需要使用 node.insert_before () 或 node.insert_after () 函数将罚点插入不希望断行的字符结点之前或之后即可。

下面的例子展示了一种很变态的情况,在所有的字符结点之后插入了值为 -10000 的罚点,结果会导致在每个字符后开始断行。

\directlua {
    local glyph = node.id('glyph')

    function test (head, groupcode)
        for t in node.traverse(head) do
            if t.id == glyph then
                texio.write_nl ("*****")
                node.insert_after (head, t, nodes.penalty (-10000))
            end
        end
        return true
    end

    callback.register("pre_linebreak_filter", test)
}

\parindent 0pt

Hello world!

\bye

 结果如下图所示:

取值小于等于 -10000 的罚点表示 TeX 必须要在这一位置处断行;相反,取值大于等于 10000 的罚点表示 TeX 一定不要在这一位置处断行。

我们可以通过将取值大于等于 10000 的罚点插入文档中出现的中文标点之前或之后,来实现标点禁则。


登录 *


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