TeX 的 hpack 例程将 hlist 打包到框中。执行此操作时,它会查看全局指针adjust_tail
,如果该指针不为“空”,它会将一些节点迁移到从 开始的单独列表中adjust_head
。这样,来自\mark
、\insert
或 的材料\vadjust
在段落构建期间从行中迁移到封闭的垂直列表中。否则它们会留在框内。
从 luatex 手册中,我无法看到如何使用 实现此效果node.hpack
。Luatex 知道tex.lists.adjust_head
和tex.lists.pre_adjust_head
(无论那是什么?)但我不太明白它们是否对应于 TeX 的adjust_head
和adjust_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_head
和tex.lists.pre_adjust_head
。将它们设置为nil
只会创建一个空列表,这将阻止 TeX 在中保留任何可迁移材料hbox
。遗憾的是,我认为没有办法手动将内部 TeX 值设置为null
,所以我们需要一个技巧:
tex.linebreak
使用这些列表并在最后重置它们,因此您只需调用tex.linebreak
。我们实际上不想换行,因此我们可以传递一个空hlist
节点以避免过多的工作,同时仍会触发清理列表的副作用adjust_
:
tex.linebreak(node.new'hlist')