
EDIT: hpack_filter срабатывает, и мой вопрос бессмыслен. Проконсультируйтесь с моим ответом о том, почему я пропустил вызов обратного вызова.
Я использую LuaTeX для анализа процесса создания математических выражений в документе. Для этого я использую обратный mlist_to_hlist
вызов для вставки whatsit
узла в список узлов. Когда математические выражения собираются в свою окончательную форму путем упаковки различных списков узлов в горизонтальные и вертикальные списки, я подключаюсь к этому процессу с помощью обратных вызовов hpack_filter
и vpack_filter
. Это позволяет мне проследить путь создания от сырого математического выражения до конечной страницы.
Я столкнулся с проблемой в определенной части этого процесса. Кажется, что строки -math align
-environment добавляются в основной вертикальный список как горизонтальные списки с определенным подтипом. Эти hlist
узлы имеют подтип 4, который описан как «выравнивание столбца или строки» в документации LuaTeX.
Моя проблема сейчас в том, что создание именно этих hlist
s не фильтруется с помощью hpack_filter
обратного вызова. Для всех других hlist
типов я получаю ожидаемый вызов, hpack_filter
но не для этих. Для моих целей уже достаточно проверить входные аргументы этого процесса на наличие определенного whatsit
узла, а затем полностью отменить упаковку. Цель состоит в том, чтобы не передавать этот контент в основной вертикальный список.
Это приводит меня к моемувопросы:
- Почему
hpack_filter
не требуется созданиеhlist
с подтипом 4? - Можно ли реализовать такое поведение или каким-то образом получить эквивалентный механизм обратного вызова другими способами?
решение1
При проверке списка узлов, которые были заданы в качестве аргументов для hpack_filter
обратных вызовов, я не заметил, что входной аргумент содержал unset
узлы. Мое мнение о том, как выравнивание (которое генерируется командой TeX \halign
) обрабатывается LuaTeX, следующее:
- Посредством серии
hpack
вызовов с аргументомgroupcode == align_set
списки входных узлов упаковываются вhead
полеunset
узлов. - Эти
unset
узлы (сglue
узлами и, возможно, другими вещами) затем упаковываются вhlist
узел с подтипом 4. Списки узлов, которые находились вhead
полях узловunset
, по-прежнему присутствуют, но теперь вhead
поляхhlist
узлов с подтипом 5. Эта упаковка происходит приhpack
вызове с аргументомgroupcode == fin_row
.Это именно та часть, которую я пропустил и о которой просил.
Это то, что я выяснил, просматривая списки промежуточных узлов, и это мое собственное мнение. Эта информация пока не найдена в руководстве LuaTeX (версия 0.76), а unset
узлы вообще почти не упоминаются. То, что у них есть head
поле, я вывел, просматривая исходный код LuaTeX.