LuaTeX hpack_filter 回调不会在某些 hlist 创建时触发

LuaTeX hpack_filter 回调不会在某些 hlist 创建时触发

编辑:hpack_filter 已触发,我的问题毫无意义。请参阅我的回答,了解我为什么错过了回调调用。

我正在使用 LuaTeX 分析文档中数学表达式的创建过程。为此,我使用mlist_to_hlist回调将节点插入节点列表。当通过将各种节点列表打包成水平和垂直列表将数学表达式组装成最终形式时,我使用和回调whatsit来参与此过程。这使我能够跟踪从原始数学表达式到最终页面的创建路径。hpack_filtervpack_filter

我遇到了此过程的特定部分的问题。似乎align-math-environment 的行作为具有特定子类型的水平列表添加到主垂直列表中。这些hlist节点具有子类型 4,在 LuaTeX 文档中描述为“对齐列或行”。

我现在的问题是,这些 s 的创建hlist没有通过回调进行过滤hpack_filter。对于所有其他hlist类型,我都会得到预期的调用,hpack_filter但对于这些类型则不会。就我的目的而言,检查此过程的输入参数是否出现某个节点,然后完全取消打包就足够了whatsit。目标是不要将此内容转移到主垂直列表中。

这导致我的问题

  • 为什么hpack_filter不要求创建子hlist类型 4?
  • 是否有可能启用这种行为或以其他方式获得等效的回调机制?

答案1

在检查作为回调函数参数给出的节点列表时hpack_filter,我没有注意到输入参数包含unset节点。我对 LuaTeX 如何处理对齐(由 TeX 命令生成\halign)的看法如下:

  1. 通过一系列hpack带有参数的调用groupcode == align_set,输入的节点列表被打包到节点head字段中unset
  2. 然后将这些unset节点(包含glue节点和其他内容)打包到子类型为 4 的节点中。节点字段hlist中的节点列表仍然存在,但现在位于子类型为 5 的节点的字段中。此打包发生在带有参数的调用中。headunsetheadhlisthpackgroupcode == fin_row这正是我所错过的和我所要求的部分。

这是我通过查看中间节点列表得出的结论,也是我自己的观点。到目前为止,在 LuaTeX 手册(版本 0.76)中找不到此信息,并且unset几乎没有提到节点。head我从查看 LuaTeX 源代码中推断出它们有一个字段。

相关内容