Error al utilizar la devolución de llamada start_page_number en lualatex

Error al utilizar la devolución de llamada start_page_number en lualatex

Actualicé miktex y todos los paquetes y ahora aparece un error cuando intento usar la devolución de llamada start_page_number en mi documento. El error apareció incluso en documentos muy pequeños, por ejemplo en este documento:

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

Cuando lo compilo, obtengo los siguientes errores:

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

Ayúdenme a corregir estos errores (uso el idioma ruso porque quiero usarlo en documentos que contienen caracteres cirílicos). Gracias a todos por su ayuda.

Respuesta1

start_page_number"reemplaza el código que imprime [y el número de página al comienzo de \shipout". Este código envía información al terminal y al log. No tiene mucho sentido reemplazarlo por código que intenta escribir algo en el documento. Con texio.write_nl, por ejemplo, funciona bien:

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

Respuesta2

Estás intentando utilizar tex.printen una devolución de llamada. Eso casi nunca funcionará de la forma esperada. Para mostrar el problema en este caso particular, compile la siguiente modificación de su documento:

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

En la segunda página, esto se imprimirá.

ingrese la descripción de la imagen aquí

¿Qué pasó? Después de que \clearpageLuaTeX terminó la primera página y llamó a su devolución de llamada. Esto agregó algo al búfer de salida de Lua TeX y regresó. Ahora, la próxima vez que \directluaintente imprimir algo, se agregará al mismo búfer que se enviará a TeX después de la evaluación de \directlua. Entonces, el texto impreso tex.printdurante una devolución de llamada se imprime durante un \directluauso posterior aleatorio. En su ejemplo, Polyglossia intenta usar LuaTeX para acceder a algún número y estaba confundida acerca de page 1ser devuelto.

Esto demuestra:Nuncautilizar tex.printen una devolución de llamada. El comportamiento real también puede cambiar con cualquier actualización, para citar el manual: (refiriéndose a toda la tex.*printfamilia de funciones)

El resultado del uso de estas funciones desde dentro de las devoluciones de llamada no está definido en este momento.

Ahora puedes agregar tokens al flujo de entrada TeX desde una devolución de llamada usando la token.put_nextinterfaz,peroEs muy probable que esto no sea lo que estás intentando hacer: insertaría los tokens en una posición básicamente aleatoria porque la devolución de llamada se llama cuando\shipout finaliza, por lo que probablemente terminarían en el código de la rutina de salida. Esta rutina no espera inserciones de código aleatorias, por lo que generará otro error o agregará los tokens a la lista vertical principal. En el último caso, el número de página terminaría en alguna ubicación "aleatoria".despuésla página real a la que se refiere debido a la naturaleza asincrónica de la rutina de salida TeX.

Entonces, cómo solucionarlo depende de lo que esté intentando archivar: si desea imprimir algo en la consola, consulte la respuesta de Ulrike Fischer. Si desea imprimir un número de página en su documento TeX o alguna otra información en el pie de página, consulte, por ejemploesta pregunta.Las devoluciones de llamada de LuaTeX operan en un nivel mucho más bajo.

información relacionada