Используйте Lua для маркировки предупреждений шрифтов

Используйте Lua для маркировки предупреждений шрифтов

Использую lualatex, TeXlive2024, Linux.

Впредыдущий вопрос, Марсель Крюгер показал, как использовать Lua для отслеживания ошибок. По сути, этот код устанавливает флаг, если была обнаружена какая-либо ошибка. В конце я могу обнаружить флаг с помощью другого кода, сделать что-то в PDF (изменить его метаданные) и написать финальное сообщение в Терминале. Я использую это все время. Очень полезно.

Существуют и другие методы (простые хаки кода LaTeX) для установки флага, когда сообщение приходит через механизм GenericError или GenericWarning.

Но мне не удалось использовать метод флага, когда проблема была вызвана моим отсутствующим символом. Я grep for Missing characterи Missing~character in texmf-distбезуспешно, поэтому (по крайней мере для lualatex) сообщение генерируется двоичным файлом. MWE:

\documentclass{article}
% Compile with lualatex, which uses fontspec and Latin Modern Roman.
\begin{document}
I could use a ⛾ right now.
\end{document}

Если скомпилировано с pdflatex, возникает эта ошибка: ! LaTeX Error: Unicode character ⛾ (U+26FE) not set up for use with LaTeX. Компилятор останавливается там. Если пользователь продолжает после сообщения об ошибке, то создается PDF. Если используется TeXworks, ошибка будет обнаружена и сообщена среди «ошибок, предупреждений, плохих ящиков».

Если скомпилировано с помощью lualatex, то появляется сообщение об ошибке, компилятор продолжает работу до конца, не останавливаясь: Missing character: There is no ⛾ (U+26FE) in font [lmroman10-regular]:+tlig;! Если используется TeXworks, то он не обнаруживается среди «ошибок, предупреждений, плохих ящиков».

Отслеживание ошибок Lua не обнаруживает сообщение об отсутствующем символе. Я попытался взломать код, изменив его errorна warning(пауза для смеха), но это не сработало.

Итак, мой вопрос: как мне установить флаг, когда отсутствует символ? Ему не нужно записывать символ, шрифт или страницу. Просто простое значение true/false, которое я могу обнаружить AtEndDocument. Псевдокод:

\documentclass{article}
\newif\iffoo
\directlua{
% This would be the code that sets the foo flag, if missing character.
}
\AtEndDocument{\iffoo\typeout{EEEEEEEK}\fi}
\begin{document}
I could use a ⛾ right now.
\end{document}

Кстати, я знаю о механизме резервного шрифта. Если используется резервный шрифт, сообщение об отсутствующем символе будет сгенерировано только в том случае, если он также отсутствует в резервном шрифте.

Почему я хочу это сделать: В моем рабочем процессе проблемный PDF должен содержать метаданные, помечающие его как неготовый. Я знаю, как записать эти метаданные AtEndDocument.

Запоздалая мысль: По желанию я включаю lua-typoпакет для обнаружения проблем с читаемостью, которые не являются проблемами PDF. Удивительно.

решение1

Регистр LuaTeX \tracinglostcharsдолжен быть установлен на 3. Тогда отсутствующий символ в текущем шрифте будет вести себя как обычная ошибка.

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