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_nl
zB 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.print
einen 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
Was ist passiert? Nachdem \clearpage
LuaTeX 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 \directlua
Versuch 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 \directlua
mit 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
\directlua
page 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.*print
Funktionsfamilie)
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 \shipout
abgeschlossen 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.