Я обновил 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_nl
eg это работает нормально:
\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}
На второй странице это будет напечатано
Что произошло? После того, как \clearpage
LuaTeX закончил первую страницу и вызвал ваш обратный вызов. Это добавило что-то в выходной буфер Lua TeX и вернуло. Теперь в следующий раз, когда \directlua
попытается что-то напечатать, это будет добавлено в тот же буфер, который будет отправлен в TeX после оценки \directlua
. Таким образом, текст, напечатанный tex.print
во время обратного вызова, печатается во время случайного следующего \directlua
использования. В вашем примере polyglossia пытается использовать LuaTeX для доступа к некоторому числу и была сбита с толку тем, что page 1
вместо этого была возвращена.
Это демонстрирует:Никогдаиспользовать tex.print
в обратном вызове. Фактическое поведение также может измениться с любым обновлением, цитируя руководство: (относится ко всему tex.*print
семейству функций)
Результат использования этих функций из внутренних обратных вызовов на данный момент не определен.
Теперь вы можете добавлять токены во входной поток TeX из обратного вызова, используя token.put_next
интерфейс,ноэто, скорее всего, не то, что вы пытаетесь сделать: он вставит токены в по сути случайную позицию, потому что обратный вызов вызывается, когда \shipout
выполняется, поэтому они, вероятно, окажутся в коде выходной процедуры. Эта процедура не ожидает случайных вставок кода, поэтому она либо приведет к другой ошибке, либо добавит токены в основной вертикальный список. В последнем случае номер страницы окажется в каком-то «случайном» местепослефактическая страница, на которую он ссылается, из-за асинхронной природы процедуры вывода TeX.
Итак, как это исправить, зависит от того, что вы пытаетесь архивировать: Если вы хотите что-то распечатать на консоли, см. ответ Ульрике Фишер. Если вы хотите распечатать номер страницы в документе TeX или какую-то другую информацию в нижнем колонтитуле страницы, см. напримерэтот вопрос.Обратные вызовы LuaTeX работают на гораздо более низком уровне.