
編集: hpack_filter がトリガーされ、私の質問は無意味になりました。コールバック呼び出しを見逃した理由については、私の回答を参照してください。
私は LuaTeX を使用して、ドキュメント内の数式の作成プロセスを分析しています。このため、mlist_to_hlist
コールバックを使用してノードをノード リストに挿入しますwhatsit
。さまざまなノード リストを水平および垂直のリストにパックして数式を最終形式に組み立てるとき、およびhpack_filter
コールバックを使用してこのプロセスにフックしますvpack_filter
。これにより、生の数式から最終ページまでの作成パスを追跡できます。
このプロセスの特定の部分で問題が発生しました。align
-math 環境の行は、特定のサブタイプを持つ水平リストとしてメインの垂直リストに追加されるようです。これらのhlist
ノードにはサブタイプ 4 があり、これは LuaTeX ドキュメントで「配置列または行」として説明されています。
問題は、まさにこれらの の作成がコールバックhlist
でフィルタリングされないことですhpack_filter
。他のすべてのhlist
タイプでは、期待どおりに が呼び出されますhpack_filter
が、これらのタイプでは呼び出されません。私の目的には、このプロセスの入力引数で特定のwhatsit
ノードの発生を確認し、パッキングを完全にキャンセルするだけで十分です。目標は、このコンテンツをメインの垂直リストに転送しないようにすることです。
これが私の質問:
- サブタイプ 4
hpack_filter
の作成が求められないのはなぜですか?hlist
- このような動作を有効にしたり、他の手段で同等のコールバック メカニズムを取得したりすることは可能ですか?
答え1
コールバックの引数として与えられたノード リストを検査しているときにhpack_filter
、入力引数にunset
ノードが含まれていることに気付きませんでした。アライメント (TeX コマンドによって生成される) が LuaTeX によってどのように処理されるかについての私の見解は\halign
次のとおりです。
- 引数 を使用した一連の
hpack
呼び出しを通じてgroupcode == align_set
、入力ノード リストがノードhead
フィールドにパックされますunset
。 - これらの
unset
ノード (glue
ノードとおそらく他のものを含む) は、サブタイプ 4 のノードにパックされます。ノードのフィールドhlist
に存在していたノード リストは引き続き存在しますが、サブタイプ 5 のノードのフィールドにあります。このパックは、引数 を使用した呼び出しで行われます。head
unset
head
hlist
hpack
groupcode == fin_row
これはまさに私が見逃していた部分であり、私が求めていた部分です。
これは中間ノード リストを見て私が理解したことであり、私自身の意見です。この情報は今のところ LuaTeX マニュアル (バージョン 0.76) には記載されておらず、unset
ノードについてはほとんど言及されていません。LuaTeXhead
ソース コードを見て、ノードにフィールドがあることを推測しました。