Ошибка при использовании обратного вызова start_page_number в lualatex

Ошибка при использовании обратного вызова start_page_number в lualatex

Я обновил miktex и все пакеты, и теперь у меня ошибка, когда я пытаюсь использовать callback start_page_number в моем документе. Ошибка появлялась даже в очень маленьких документах, например в этом документе:

\documentclass{article}
\usepackage{luacode}
\usepackage{polyglossia}
\setmainlanguage[babelshorthands=true]{russian}
\setmainfont{Times New Roman}
\pagestyle{empty}
\thispagestyle{empty}
\begin{luacode}
function f0()
tex.print("page "..tex.count["c@page"])
end
luatexbase.add_to_callback("start_page_number",f0,"start")
\end{luacode}
\begin{document}
test
\end{document}

При компиляции возникают следующие ошибки:

{C:/Users/ksash/AppData/Local/MiKTeX/2.9/pdftex/config/pdftex.map}] (./lua3.aux
! Missing number, treated as zero.
<to be read again>
p
l.3 \select@language {russian}

?
! Missing = inserted for \ifnum.
<to be read again>
p
l.3 \select@language {russian}

?
! Missing number, treated as zero.
<to be read again>
p
l.3 \select@language {russian}

?
! Missing number, treated as zero.
<to be read again>
p
l.3 \select@language {russian}

?
! Missing number, treated as zero.
<to be read again>
\__bool_p_0:
l.3 \select@language {russian}

Помогите мне исправить эту ошибку (я использую русский язык, потому что хочу использовать его в документах, содержащих кириллические символы). Спасибо всем за помощь.

решение1

start_page_number"заменяет код, который печатает [ и номер страницы в начале \shipout.". Этот код отправляет информацию на терминал и в журнал. Не имеет особого смысла заменять его кодом, который пытается что-то записать в документ. С texio.write_nleg это работает нормально:

\documentclass{article}
\usepackage{luacode}
\usepackage{polyglossia}
\setmainlanguage{russian}
\usepackage{fontspec}
\setmainfont{Times New Roman}
\pagestyle{empty}
\thispagestyle{empty}
\begin{luacode}
function f0()
texio.write_nl("page "..tex.count["c@page"])
end
luatexbase.add_to_callback("start_page_number",f0,"start")
\end{luacode}
\begin{document}
test
\end{document}

решение2

Вы пытаетесь использовать tex.printв обратном вызове. Это почти никогда не будет работать так, как вы ожидаете. Чтобы показать проблему в этом конкретном случае, скомпилируйте следующую модификацию вашего документа:

\documentclass{article}
\usepackage{luacode}
\pagestyle{empty}
\thispagestyle{empty}
\begin{luacode}
function f0()
  tex.print("page "..tex.count["c@page"])
end
luatexbase.add_to_callback("start_page_number",f0,"start")
\end{luacode}
\begin{document}
test
\clearpage
X\directlua{tex.print''}X
\end{document}

На второй странице это будет напечатано

введите описание изображения здесь

Что произошло? После того, как \clearpageLuaTeX закончил первую страницу и вызвал ваш обратный вызов. Это добавило что-то в выходной буфер Lua TeX и вернуло. Теперь в следующий раз, когда \directluaпопытается что-то напечатать, это будет добавлено в тот же буфер, который будет отправлен в TeX после оценки \directlua. Таким образом, текст, напечатанный tex.printво время обратного вызова, печатается во время случайного следующего \directluaиспользования. В вашем примере polyglossia пытается использовать LuaTeX для доступа к некоторому числу и была сбита с толку тем, что page 1вместо этого была возвращена.

Это демонстрирует:Никогдаиспользовать tex.printв обратном вызове. Фактическое поведение также может измениться с любым обновлением, цитируя руководство: (относится ко всему tex.*printсемейству функций)

Результат использования этих функций из внутренних обратных вызовов на данный момент не определен.

Теперь вы можете добавлять токены во входной поток TeX из обратного вызова, используя token.put_nextинтерфейс,ноэто, скорее всего, не то, что вы пытаетесь сделать: он вставит токены в по сути случайную позицию, потому что обратный вызов вызывается, когда \shipoutвыполняется, поэтому они, вероятно, окажутся в коде выходной процедуры. Эта процедура не ожидает случайных вставок кода, поэтому она либо приведет к другой ошибке, либо добавит токены в основной вертикальный список. В последнем случае номер страницы окажется в каком-то «случайном» местепослефактическая страница, на которую он ссылается, из-за асинхронной природы процедуры вывода TeX.

Итак, как это исправить, зависит от того, что вы пытаетесь архивировать: Если вы хотите что-то распечатать на консоли, см. ответ Ульрике Фишер. Если вы хотите распечатать номер страницы в документе TeX или какую-то другую информацию в нижнем колонтитуле страницы, см. напримерэтот вопрос.Обратные вызовы LuaTeX работают на гораздо более низком уровне.

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