
En mis reflexiones sobre luatex, tal vez como Alicia en el país de las maravillas, lo único que no está del todo claro es el funcionamiento interno de latelua. Según tengo entendido, todo el material que se generará en una página se crea y almacena como listas enlazadas anidadas (quizás separadas, quizás profundas) de 'nodos de texto'. Además, AFAIK latelua coloca su contenido en su lista vinculada adjunta como un nodo que se procesará más adelante en el tiempo de ejecución (de ahí el prefijo "tarde"). El código latelua se ejecuta cuando una lista de nodos que lo contiene va a aparecer en una página, lo que significa que puede ser muchas páginas más tarde y probablemente se ejecute tantas veces como aparezca la lista de nodos que lo contiene en el documento. Además, para aumentar la maravilla, las listas de nodos se pueden dividir o unir para formar otras nuevas antes de volver a colocarlas en otra página. Aquí hay un montón de preguntas relacionadas: ¿Cómo se mantiene la información sobre los nodos latelua en el motor luatex? ¿Existe una estructura de datos especial que se ocupe de ellos (quizás por motivos de rendimiento?). Como un esquema de coloración con una tabla: digamos, por ejemplo, cuando se encuentra un nodo latelua, se establece una bandera en su nodo principal y se lleva hacia arriba cuando la ejecución de luatex regresa al nodo principal. Tal esquema tendría que respetar las divisiones y uniones de los nodos. O es que no hay una estructura de datos separada... y justo antes de enviar contenidos a la página, luatex recorre toda la lista de nodos anidados de los contenidos que van a ir en esa página y verifica si hay un nodo latelua que debe ejecutar (esta vez alrededor)? Si es así, es decir, no hay una estructura de datos especial separada para los nodos de latelua y se recorre toda la lista de nodos que se enviará, ¿es porque de todos modos luatex necesita atravesar completamente la lista de nodos que aparecerá en la página? En caso afirmativo, ¿por qué atraviesa toda la lista de nodos justo antes del envío? ¿Hay alguna manera de pedirle al proceso de envío que tome algunos contenidos de páginas PDF prefabricadas (que están listas para enviarse y pedirle que no las atraviese) y obtener un mejor rendimiento? En caso afirmativo, ¿cómo se puede hacer eso? Es una norma generalmente aceptada hacer una pregunta a la vez, aunque aquí estoy rompiendo la norma ya que las preguntas que hago son muy unidas y podría ser más beneficioso para los lectores (ya que no hay ningún libro en inglés sobre luatex).
Respuesta1
El mecanismo es exactamente el mismo que \write
en TeX clásico (siendo \immediate\write
como \directlua
)
Considerar
\documentclass{article}
\showoutput
\showboxdepth3
\begin{document}
a
\write20{write 1}
b
\latelua{print 'latelua 2'}
c
\immediate\write20{immediate write 3}
d
\directlua{print 'directlua 4'}
e
\end{document}
Esto produce la salida del terminal.
immediate write 3
directlua 4
Completed box being shipped out [1]
mostrando que en este punto las dos formas no inmediatas no han sido ejecutadas pero las dos formas inmediatas sí.
Luego TeX comienza a procesar la página 1 convirtiendo la estructura del nodo del cuadro a la salida PDF, el terminal muestra la estructura del nodo del cuadro.
Completed box being shipped out [1]
\vbox(633.0+0.0)x407.0, direction TLT
.\glue 16.0
.\vbox(617.0+0.0)x345.0, shifted 62.0, direction TLT
..\vbox(12.0+0.0)x345.0, glue set 12.0fil, direction TLT
...\glue 0.0 plus 1.0fil
...\hbox(0.0+0.0)x345.0, direction TLT
..\glue 25.0
..\glue(\lineskip) 0.0
..\vbox(550.0+0.0)x345.0, glue set 491.94745fil, direction TLT
...\write-{}
...\glue(\topskip) 5.52
...\hbox(4.48+0.11)x345.0, glue set 325.0fil, direction TLT []
...\write-{write 1}
...\glue(\parskip) 0.0 plus 1.0
...\glue(\baselineskip) 4.95
...\hbox(6.94+0.11)x345.0, glue set 324.44fil, direction TLT []
...\latelua0{print 'latelua 2'}
...\glue(\parskip) 0.0 plus 1.0
...\glue(\baselineskip) 7.41
...\hbox(4.48+0.11)x345.0, glue set 325.56fil, direction TLT []
...\glue(\parskip) 0.0 plus 1.0
...\glue(\baselineskip) 4.95
...\hbox(6.94+0.11)x345.0, glue set 324.44fil, direction TLT []
...\glue(\parskip) 0.0 plus 1.0
...\glue(\baselineskip) 7.41
...\hbox(4.48+0.11)x345.0, glue set 325.56fil, direction TLT []
...\glue -0.11
...\glue 0.0 plus 1.0fil
...\glue 0.0
...\glue 0.0 plus 0.0001fil
..\glue(\baselineskip) 23.34
..\hbox(6.66+0.0)x345.0, glue set 170.0fil, direction TLT
...\glue 0.0 plus 1.0fil
...\TU/lmr/m/n/10 1
...\glue 0.0 plus 1.0fil
Donde ve que el nodo de escritura y el nodo latelua siguen siendo nodos en el cuadro y solo contienen el texto no evaluado del argumento proporcionado.
...\write-{write 1}
y
...\latelua0{print 'latelua 2'}
Luego, el látex lee el mapa de fuentes como se muestra en la terminal.
{/usr/local/texlive/2020/texmf-var/fonts/map/pdftex/updmap/pdftex.map}
y finalmente, mientras escribe el PDF, llega a los nodos de escritura y latelua y ejecuta su contenido y la terminal muestra
write 1
latelua 2