¿Cómo puedo recuperar \thepage (o detectar un cambio de página) de Lua en LuaTeX?

¿Cómo puedo recuperar \thepage (o detectar un cambio de página) de Lua en LuaTeX?

Estoy escribiendo (contribuyendo con) un paquete LuaLaTeX donde se usa una función Lua para generar imágenes que se insertan en el documento LaTeX.

Un dato que necesitamos es el número de página actual para determinar si estamos en una página par o impar (sé que esto no es tan trivial y conozco algunas estrategias más allá \thepage). Configuramos una variable Lua cuando todavía estamos en la parte de LaTeX y hasta ahora esto funciona bastante bien.

Sin embargo, ahora resulta que la secuencia de imágenes que creamos puede estar distribuida en varias páginas, y realmente nos gustaría reflejar eso porque nuestras imágenes pueden comportarse de manera diferente en páginas pares e impares.

Básicamente lo que tenemos es una serie de

tex.print('\\includegraphics{something}\\par')

declaraciones, ejecutadas en un bucle dentro de una función Lua.

Ahora la pregunta: ¿hay alguna manera de detectar directamente un cambio de página entre dos de esos gráficos o recuperar repetidamente la página actual dentro de dicho bucle?

Todas las soluciones que he encontrado para determinar el estado actual par o impar están en el propio LaTeX. Sé cómo utilizarlo \directluapara recuperar un valor para usarlo en LaTeX, pero ¿hay alguna manera de hacer lo contrario: recuperar un valor de LaTeX desde LUa?

Editar:para responder al comentario de TeXnician y responder: Cuando modifico el código de ejemplo para que produzca repeticiones de párrafos, parece que el contador de páginas no se actualizadentro de un fragmento de Lua:

\documentclass{article}

\newcommand\printluapage{%
    \directlua{for i = 1, 60 do tex.print(tex.count['c@page']) 
        tex.print([[\par]]) end}
}

\begin{document}
\printluapage

New command

\printluapage

New command

\printluapage
\end{document}

El número de página sólo se actualiza con cada nueva llamada de \printluapage.

Respuesta1

Casi nunca se puede hacer referencia con precisión al contador de páginas desde el documento principal, sólo durante la rutina de salida, cuando se conoce con precisión la página que se envía. Luatex no cambia el modelo básico de la forma en que se generan las páginas TeX, por lo que lo mismo se aplica en luatex.

En tu bucle lua puedes usar

mcount=mycount+1
tex.print('\\includegraphics{something}\\label{graphic-' .. mycount .. '}\\par')

Luego, cada imagen tendrá un \labelasociado y en la siguiente ejecución podrá seleccionar \pageref{graphic-5}(de Lua o TeX) lo que le indicará en qué página terminó el quinto gráfico.

un ejemplo completo:

ingrese la descripción de la imagen aquí

\documentclass{article}
\directlua{j=0}
\newcommand\printluapage{%
    \directlua{
for i = 1, 60 do
 j=j+1
 tex.print('\string\\pageref{foo' .. j .. '}\string\\label{foo' .. j .. '}') 
 tex.print([[\par]]) end}%
}

\begin{document}
\printluapage

New command

\printluapage

New command

\printluapage
\end{document}

Respuesta2

Esta es una solución muy básica que simplemente lee el valor de la página del contador LaTeX en Lua (la impresión es para pruebas, pero la declaración tex.count también se puede usar en otros lugares).

\documentclass{article}

\newcommand\printluapage{%
    \directlua{tex.print(tex.count['c@page'])}
}

\begin{document}
    \printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage
\end{document}

Respuesta3

Hay dos complicaciones aquí.

En primer lugar, cada llamada a \directluase ejecuta inmediatamente, por lo que si desea que se realice el procesamiento habitual de TeX, debe ceder el control a TeX (y usar corrutinas o algo así). Así que cuando tengas

\directlua{for i = 1, 60 do tex.print(tex.count['c@page']) 
    tex.print([[\par]]) end}
}

como en la pregunta, esto simplemente coloca 60 instancias de 42(o cualquiera que sea el número de página) y \paren la pila de entrada de TeX, para que TeX las lea a continuación después de \directluarealizar toda la llamada. (No da como resultado que TeX procese todas \pary cada una de las composiciones tipográficas inmediatamente, incluso antes de que finalice el ciclo). Su problema exacto se analiza, con soluciones, en esta pregunta:Ejecución entrelazada simultánea de Lua y TeX en LuaTeX.

En segundo lugar, TeX simplemente añade elementos a sus listas verticales hasta que un salto de página se vuelve inevitable (por ejemplo, no hay forma posible de poner todo el material recopilado hasta ahora en una sola página), por lo que el valor del contador de páginas en el momento en que se publica el material. agregado no es necesariamente la página en la que terminará (puede terminar en la página siguiente, por ejemplo). El número de página sólo se determina finalmente cuando se envían las cajas. Hay algunos trucos para lidiar con este hecho (por ejemplo, ¿ejecutar su código Lua durante el envío?), pero no los conozco; tal vez alguien más responda. :-)

Puede obtener algunos resultados aproximados utilizando cantidades como \pagetotal(o de Lua, tex.pagetotal) que muestra cuánto material se ha agregado a la página actual. Esto está sujeto a advertencias: el primer punto anterior sobre dejar que TeX haga su trabajo (dividir su código Lua en diferentes llamadas a \directlua), y también es posible que deba lidiar con pegamento retráctil y estirable, y tenerlos en cuenta.

Respuesta4

El problema del entrelazado esparcialmenteresuelto en ConTeXt. Puede acceder al número de página desde Lua y se actualiza en algún momento, pero el problema que David describió ensu comentariopersiste.

\starttext

\startluacode
for i = 1, 60 do
    context(context.currentpage) 
    context.par()
end
\stopluacode

\stoptext

ingrese la descripción de la imagen aquí

información relacionada