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.print
en 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á.
¿Qué pasó? Después de que \clearpage
LuaTeX 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 \directlua
intente 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.print
durante una devolución de llamada se imprime durante un \directlua
uso posterior aleatorio. En su ejemplo, Polyglossia intenta usar LuaTeX para acceder a algún número y estaba confundida acerca de page 1
ser devuelto.
Esto demuestra:Nuncautilizar tex.print
en 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.*print
familia 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_next
interfaz,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.