LuaTeX hpack_filter コールバックが特定の hlist 作成時にトリガーされない

LuaTeX hpack_filter コールバックが特定の hlist 作成時にトリガーされない

編集: hpack_filter がトリガーされ、私の質問は無意味になりました。コールバック呼び出しを見逃した理由については、私の回答を参照してください。

私は LuaTeX を使用して、ドキュメント内の数式の作成プロセスを分析しています。このため、mlist_to_hlistコールバックを使用してノードをノード リストに挿入しますwhatsit。さまざまなノード リストを水平および垂直のリストにパックして数式を最終形式に組み立てるとき、およびhpack_filterコールバックを使用してこのプロセスにフックしますvpack_filter。これにより、生の数式から最終ページまでの作成パスを追跡できます。

このプロセスの特定の部分で問題が発生しました。align-math 環境の行は、特定のサブタイプを持つ水平リストとしてメインの垂直リストに追加されるようです。これらのhlistノードにはサブタイプ 4 があり、これは LuaTeX ドキュメントで「配置列または行」として説明されています。

問題は、まさにこれらの の作成がコールバックhlistでフィルタリングされないことですhpack_filter。他のすべてのhlistタイプでは、期待どおりに が呼び出されますhpack_filterが、これらのタイプでは呼び出されません。私の目的には、このプロセスの入力引数で特定のwhatsitノードの発生を確認し、パッキングを完全にキャンセルするだけで十分です。目標は、このコンテンツをメインの垂直リストに転送しないようにすることです。

これが私の質問:

  • サブタイプ 4hpack_filterの作成が求められないのはなぜですか?hlist
  • このような動作を有効にしたり、他の手段で同等のコールバック メカニズムを取得したりすることは可能ですか?

答え1

コールバックの引数として与えられたノード リストを検査しているときにhpack_filter、入力引数にunsetノードが含まれていることに気付きませんでした。アライメント (TeX コマンドによって生成される) が LuaTeX によってどのように処理されるかについての私の見解は\halign次のとおりです。

  1. 引数 を使用した一連のhpack呼び出しを通じてgroupcode == align_set、入力ノード リストがノードheadフィールドにパックされますunset
  2. これらのunsetノード (glueノードとおそらく他のものを含む) は、サブタイプ 4 のノードにパックされます。ノードのフィールドhlistに存在していたノード リストは引き続き存在しますが、サブタイプ 5 のノードのフィールドにあります。このパックは、引数 を使用した呼び出しで行われます。headunsetheadhlisthpackgroupcode == fin_rowこれはまさに私が見逃していた部分であり、私が求めていた部分です。

これは中間ノード リストを見て私が理解したことであり、私自身の意見です。この情報は今のところ LuaTeX マニュアル (バージョン 0.76) には記載されておらず、unsetノードについてはほとんど言及されていません。LuaTeXheadソース コードを見て、ノードにフィールドがあることを推測しました。

関連情報