
Nas minhas reflexões sobre o luatex, talvez como Alice no país das maravilhas, a única coisa que não está muito clara é o funcionamento interno do latelua. Pelo que entendi, todo o material a ser gerado em uma página é construído e armazenado como listas vinculadas aninhadas (talvez separadas, talvez profundas) de nós de tex. Além disso, AFAIK latelua coloca seu conteúdo em sua lista vinculada como um nó que será processado posteriormente no tempo de execução (daí o prefixo "tarde"). O código latelua é executado quando uma lista de nós que o contém vai aparecer em uma página, o que significa que pode ser muitas páginas depois e provavelmente executado quantas vezes a lista de nós que o contém aparecer no documento. Além disso, para aumentar ainda mais a grandiosidade, os nodellists podem ser divididos ou unidos para formar novos antes de serem colocados novamente em alguma outra página. Então aqui estão algumas questões relacionadas: Como as informações sobre os nós latelua são mantidas no mecanismo luatex? Existe uma estrutura de dados especial que lida com eles (talvez para desempenho?). Como algum esquema de cores com uma tabela: digamos, por exemplo, quando um nó latelua é encontrado, um sinalizador é definido em seu nó pai e transportado upstream quando a execução do luatex volta para o nó pai. Tal esquema teria que respeitar as divisões e junções da lista de nós. Ou será que não existe uma estrutura de dados separada... e logo antes de enviar o conteúdo para a página luatex percorre toda a lista de nós aninhados do conteúdo que irá para aquela página e verifica se existe um nó latelua que ele deve executar (desta vez em volta)? Se for assim, ou seja, nenhuma estrutura de dados especial separada para os nós latelua, e toda a lista de nós a ser enviada é percorrida, é porque o luatex de qualquer maneira precisa percorrer completamente a lista de nós que deve aparecer na página? Se sim, então por que ele percorre toda a lista de nós antes do envio? Existe uma maneira de solicitar ao processo de envio que pegue algum conteúdo de página PDF pré-preparado (que está pronto para envio e peça para não ser atravessado) e obtenha melhor desempenho? Se sim, então como alguém pode fazer isso? É uma norma geralmente aceita fazer uma pergunta de cada vez, embora aqui esteja eu quebrando a norma, pois as perguntas que faço são muito unidas e poderia ser mais benéfico para os leitores (já que não existe um livro em inglês sobre luatex).
Responder1
O mecanismo é exatamente o mesmo \write
do TeX clássico (sendo \immediate\write
semelhante \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}
Isso produz a saída do terminal
immediate write 3
directlua 4
Completed box being shipped out [1]
mostrando que neste ponto as duas formas não imediatas não foram executadas, mas as duas formas imediatas foram.
Então o TeX começa a processar a página 1 convertendo a estrutura do nó da caixa para a saída PDF, o terminal mostra a estrutura do nó da caixa
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
Onde você vê que o nó de gravação e o nó latelua ainda são nós que estão na caixa, contendo apenas o texto não avaliado do argumento fornecido.
...\write-{write 1}
e
...\latelua0{print 'latelua 2'}
Então o latex lê o mapa de fontes conforme mostrado no terminal
{/usr/local/texlive/2020/texmf-var/fonts/map/pdftex/updmap/pdftex.map}
e finalmente, à medida que grava o PDF, ele chega aos nós write e latelua e executa seu conteúdo e o terminal mostra
write 1
latelua 2