Fehler beim Verwenden der Callback-Startseitennummer in Lualatex

Fehler beim Verwenden der Callback-Startseitennummer in Lualatex

Ich habe miktex und alle Pakete aktualisiert und jetzt tritt ein Fehler auf, wenn ich versuche, den Rückruf start_page_number in meinem Dokument zu verwenden. Der Fehler trat sogar in sehr kleinen Dokumenten auf, z. B. in diesem Dokument:

\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}

Beim Kompilieren erhalte ich die folgenden Fehler:

{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}

Bitte helfen Sie mir, diese Fehler zu beheben (ich verwende die russische Sprache, weil ich sie in Dokumenten verwenden möchte, die kyrillische Zeichen enthalten). Vielen Dank an alle für die Hilfe.

Antwort1

start_page_number"ersetzt den Code, der das [ und die Seitenzahl am Anfang von \shipout. ausgibt". Dieser Code sendet Informationen an das Terminal und das Protokoll. Es macht wenig Sinn, ihn durch Code zu ersetzen, der versucht, etwas in das Dokument zu schreiben. Mit texio.write_nlzB funktioniert es einwandfrei:

\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}

Antwort2

Sie versuchen, tex.printeinen Rückruf zu verwenden. Das funktioniert fast nie wie erwartet. Um das Problem in diesem speziellen Fall zu veranschaulichen, kompilieren Sie die folgende Änderung Ihres Dokuments:

\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}

Auf der zweiten Seite wird gedruckt

Bildbeschreibung hier eingeben

Was ist passiert? Nachdem \clearpageLuaTeX die erste Seite fertiggestellt und Ihren Rückruf aufgerufen hat. Dies hat dem LuaTeX-Ausgabepuffer etwas hinzugefügt und zurückgegeben. Wenn nun beim nächsten \directluaVersuch etwas gedruckt werden soll, wird es demselben Puffer hinzugefügt, der nach der Auswertung von an TeX gesendet wird . Der während eines Rückrufs \directluamit gedruckte Text wird also bei einer zufälligen folgenden Verwendung gedruckt. In Ihrem Beispiel versucht Polyglossia, mit LuaTeX auf eine Zahl zuzugreifen, und war verwirrt, weil stattdessen zurückgegeben wurde.tex.print\directluapage 1

Dies zeigt:Niemalsin einem Rückruf verwenden tex.print. Das tatsächliche Verhalten kann sich mit jedem Update auch ändern, um das Handbuch zu zitieren: (bezieht sich auf die gesamte tex.*printFunktionsfamilie)

Das Ergebnis der Verwendung dieser Funktionen innerhalb von Rückrufen ist derzeit undefiniert.

Jetzt können Sie Tokens aus einem Callback über die Schnittstelle in den TeX-Eingabestrom einfügen token.put_next,Aberdas ist höchstwahrscheinlich nicht das, was Sie versuchen: Es würde die Token an einer im Grunde zufälligen Position einfügen, da der Rückruf aufgerufen wird, wenn \shipoutabgeschlossen ist, sodass sie wahrscheinlich im Code der Ausgaberoutine landen würden. Diese Routine erwartet keine zufälligen Codeeinfügungen, daher wird sie entweder zu einem weiteren Fehler führen oder die Token zur vertikalen Hauptliste hinzufügen. Im letzten Fall würde die Seitenzahl an einer „zufälligen“ Stelle landennachdie tatsächliche Seite, auf die es sich bezieht, aufgrund der asynchronen Natur der TeX-Ausgaberoutine.

Wie Sie das Problem beheben, hängt davon ab, was Sie archivieren möchten: Wenn Sie etwas auf der Konsole drucken möchten, lesen Sie die Antwort von Ulrike Fischer. Wenn Sie eine Seitenzahl in Ihrem TeX-Dokument oder andere Informationen in der Fußzeile drucken möchten, lesen Sie beispielsweisediese Frage.LuaTeX-Rückrufe arbeiten auf einer viel niedrigeren Ebene.

verwandte Informationen