如何使用 luatex 的 node.hpack 以便标记、插入和 vadjusts 迁移出去?

如何使用 luatex 的 node.hpack 以便标记、插入和 vadjusts 迁移出去?

TeX 的 hpack 例程将 hlist 打包到框中。执行此操作时,它会查看全局指针adjust_tail,如果该指针不为“空”,它会将一些节点迁移到从 开始的单独列表中adjust_head。这样,来自\mark\insert或 的材料\vadjust在段落构建期间从行中迁移到封闭的垂直列表中。否则它们会留在框内。

从 luatex 手册中,我无法看到如何使用 实现此效果node.hpack。Luatex 知道tex.lists.adjust_headtex.lists.pre_adjust_head(无论那是什么?)但我不太明白它们是否对应于 TeX 的adjust_headadjust_tail或如何指示node.hpack应该进行迁移。

如果可以的话(手册中有一些关于在某些情况下node.hpack会产生奇怪的副作用的说明)。\insert

我对此感兴趣的原因是编写自己的段落生成器或改编 Taco 的代码(在这方面似乎不起作用(参见问题使用 LuaTeX 替换 TeX 的段落生成器) 并且存在一些其他错误,因此目前还不能正常工作。

当然,如果情况变得最坏,我想我可以在调用之前手动迁移这些节点,node.hpack但如果可能的话,我会使用内部并让它为我完成,因为这肯定更快。

答案1

LuaTeXadjust_head对应于 TeX adjust_head,设置它会自动设置adjust_tail为列表末尾adjust_head,即使它为空(nil)。因此,如果您有一个 hlist并希望node.hpack在让事物迁移的同时应用,您首先设置adjust_head(因此也设置adjust_tail为空列表:

tex.lists.adjust_head = nil
tex.lists.pre_adjust_head = nil

然后node.hpack从列表中删除所有可迁移节点并将它们移动到节点列表中tex.lists.adjust_head。从那里你可以按照自己的意愿处理它们。

这里的pre_adjust_head工作原理就像adjust_head:它用于实现\vadjust pre{stuff}插入的pdfTeX 扩展stuff 代替出现的行\vadjust

因此,为了模拟正常的 TeX 行为,首先pre_adjust_head必须将列表插入外部vlist,然后将结果插入到hpack最后adjust_head

要在代码末尾进行清理,您可能需要重置tex.lists.adjust_headtex.lists.pre_adjust_head。将它们设置为nil只会创建一个空列表,这将阻止 TeX 在中保留任何可迁移材料hbox。遗憾的是,我认为没有办法手动将内部 TeX 值设置为null,所以我们需要一个技巧: tex.linebreak使用这些列表并在最后重置它们,因此您只需调用tex.linebreak。我们实际上不想换行,因此我们可以传递一个空hlist节点以避免过多的工作,同时仍会触发清理列表的副作用adjust_

tex.linebreak(node.new'hlist')

相关内容