
아마도 이상한 나라의 앨리스처럼 luatex에 대한 나의 생각에서 확실히 명확하지 않은 한 가지는 latelua의 내부 작동입니다. 내가 이해하는 바에 따르면, 페이지에 출력될 모든 자료는 tex '노드'의 중첩된 연결 목록(아마도 별도, 아마도 깊은)으로 구축되고 저장됩니다. 또한 AFAIK latelua는 해당 콘텐츠를 나중에 실행 시간에 처리될 노드로 둘러싸는 연결 목록에 배치합니다(따라서 접두사 "늦음"). latelua 코드는 이를 포함하는 nodelist가 페이지에 나타날 때 실행됩니다. 이는 나중에 여러 페이지에 나타날 수 있으며 아마도 포함된 nodelist가 문서에 나타나는 횟수만큼 실행될 수 있음을 의미합니다. 또한 더 멋진 점을 추가하기 위해 노드 목록을 분할하거나 결합하여 다른 페이지에 다시 배치하기 전에 새로운 목록을 형성할 수 있습니다. 따라서 관련된 질문은 다음과 같습니다. latelua 노드에 대한 정보는 luatex 엔진에서 어떻게 유지됩니까? 이를 처리하는 특별한 데이터 구조가 있습니까(아마도 성능을 위해?). 테이블이 있는 색상 구성표와 같습니다. 예를 들어 latelua 노드가 발견되면 플래그가 상위 노드에 설정되고 luatex 실행이 상위 노드로 다시 이동할 때 업스트림으로 전달됩니다. 이러한 체계는 노드 목록 분할 및 조인을 존중해야 합니다. 아니면 별도의 데이터 구조가 없다는 건지... 그리고 luatex는 콘텐츠를 페이지로 보내기 직전에 해당 페이지에 들어갈 콘텐츠의 중첩된 nodelist 전체를 순회하여 실행해야 하는 latelua 노드가 있는지 확인합니다(이번에는 약)? 그렇다면, 즉 latelua 노드에 대한 별도의 특별한 데이터 구조가 없고, 발송될 전체 nodelist를 순회하는데, 어쨌든 luatex는 페이지에 나타날 nodelist를 완전히 순회해야 하기 때문일까요? 그렇다면 배송 직전에 전체 노드 목록을 순회하는 이유는 무엇입니까? 미리 구운 PDF 페이지 콘텐츠(출고 준비가 되어 있고 통과하지 않도록 요청함)를 가져오고 더 나은 성능을 얻도록 출하 프로세스에 요청하는 방법이 있습니까? 그렇다면 어떻게 그렇게 할 수 있습니까? 한 번에 하나의 질문을 하는 것이 일반적으로 허용되는 표준이지만, 여기서는 제가 묻는 질문이 밀접하게 연관되어 있고 독자들에게 더 유익할 수 있기 때문에 표준을 깨고 있습니다(루아텍스에 대한 영어 책이 없기 때문에).
답변1
\write
메커니즘은 클래식 TeX 와 완전히 동일합니다 \immediate\write
.\directlua
고려하다
\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}
그러면 터미널 출력이 생성됩니다.
immediate write 3
directlua 4
Completed box being shipped out [1]
이 시점에서 두 개의 즉각적이지 않은 형식은 실행되지 않았지만 두 개의 직접 형식은 실행되었음을 보여줍니다.
그런 다음 TeX는 상자 노드 구조를 PDF 출력으로 변환하는 페이지 1을 처리하기 시작하고 터미널에 상자 노드 구조가 표시됩니다.
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
write 노드와 latelua 노드는 여전히 상자에 있는 whatsit 노드이며 제공된 인수의 평가되지 않은 텍스트만 포함하고 있는 것을 볼 수 있습니다.
...\write-{write 1}
그리고
...\latelua0{print 'latelua 2'}
그런 다음 Latex는 터미널에 표시된 대로 글꼴 맵을 읽습니다.
{/usr/local/texlive/2020/texmf-var/fonts/map/pdftex/updmap/pdftex.map}
마지막으로 PDF를 작성하면서 write 및 latelua 노드로 이동하여 해당 내용을 실행하고 터미널에 다음이 표시됩니다.
write 1
latelua 2