Обратный вызов LuaTeX hpack_filter не срабатывает при создании определенных hlist

Обратный вызов LuaTeX hpack_filter не срабатывает при создании определенных hlist

EDIT: hpack_filter срабатывает, и мой вопрос бессмыслен. Проконсультируйтесь с моим ответом о том, почему я пропустил вызов обратного вызова.

Я использую LuaTeX для анализа процесса создания математических выражений в документе. Для этого я использую обратный mlist_to_hlistвызов для вставки whatsitузла в список узлов. Когда математические выражения собираются в свою окончательную форму путем упаковки различных списков узлов в горизонтальные и вертикальные списки, я подключаюсь к этому процессу с помощью обратных вызовов hpack_filterи vpack_filter. Это позволяет мне проследить путь создания от сырого математического выражения до конечной страницы.

Я столкнулся с проблемой в определенной части этого процесса. Кажется, что строки -math align-environment добавляются в основной вертикальный список как горизонтальные списки с определенным подтипом. Эти hlistузлы имеют подтип 4, который описан как «выравнивание столбца или строки» в документации LuaTeX.

Моя проблема сейчас в том, что создание именно этих hlists не фильтруется с помощью hpack_filterобратного вызова. Для всех других hlistтипов я получаю ожидаемый вызов, hpack_filterно не для этих. Для моих целей уже достаточно проверить входные аргументы этого процесса на наличие определенного whatsitузла, а затем полностью отменить упаковку. Цель состоит в том, чтобы не передавать этот контент в основной вертикальный список.

Это приводит меня к моемувопросы:

  • Почему hpack_filterне требуется создание hlistс подтипом 4?
  • Можно ли реализовать такое поведение или каким-то образом получить эквивалентный механизм обратного вызова другими способами?

решение1

При проверке списка узлов, которые были заданы в качестве аргументов для hpack_filterобратных вызовов, я не заметил, что входной аргумент содержал unsetузлы. Мое мнение о том, как выравнивание (которое генерируется командой TeX \halign) обрабатывается LuaTeX, следующее:

  1. Посредством серии hpackвызовов с аргументом groupcode == align_setсписки входных узлов упаковываются в headполе unsetузлов.
  2. Эти unsetузлы (с glueузлами и, возможно, другими вещами) затем упаковываются в hlistузел с подтипом 4. Списки узлов, которые находились в headполях узлов unset, по-прежнему присутствуют, но теперь в headполях hlistузлов с подтипом 5. Эта упаковка происходит при hpackвызове с аргументом groupcode == fin_row.Это именно та часть, которую я пропустил и о которой просил.

Это то, что я выяснил, просматривая списки промежуточных узлов, и это мое собственное мнение. Эта информация пока не найдена в руководстве LuaTeX (версия 0.76), а unsetузлы вообще почти не упоминаются. То, что у них есть headполе, я вывел, просматривая исходный код LuaTeX.

Связанный контент