luatex: Ausführungsreihenfolge von latelua, Auswirkung auf die einschließende Knotenliste und ihre Funktionsweise

luatex: Ausführungsreihenfolge von latelua, Auswirkung auf die einschließende Knotenliste und ihre Funktionsweise

Bei meinen Überlegungen zu Luatex, vielleicht wie Alice im Wunderland, ist das Einzige, was nicht ganz klar ist, die Funktionsweise von Latelua. So wie ich es verstehe, wird das gesamte Material, das auf einer Seite ausgegeben werden soll, als (vielleicht separate, vielleicht tief) verschachtelte verknüpfte Listen von Tex-Knoten erstellt und gespeichert. Außerdem platziert Latelua, soweit ich weiß, seinen Inhalt in seiner umschließenden verknüpften Liste als Knoten, der später in der Ausführungszeit verarbeitet werden soll (daher das Präfix „late“). Der Latelua-Code wird ausgeführt, wenn eine ihn enthaltende Knotenliste auf einer Seite erscheinen soll, was bedeutet, dass er viele Seiten später ausgeführt werden kann und wahrscheinlich so oft ausgeführt wird, wie die enthaltene Knotenliste im Dokument erscheinen soll. Und um das Ganze noch toller zu machen, können Knotenlisten geteilt oder zusammengeführt werden, um neue zu bilden, bevor sie erneut auf einer anderen Seite platziert werden. Hier sind also eine Reihe verwandter Fragen: Wie werden die Informationen zu Latelua-Knoten in der Luatex-Engine verwaltet? Gibt es eine spezielle Datenstruktur, die sich mit ihnen befasst (vielleicht aus Leistungsgründen?). Wie ein Farbschema mit einer Tabelle: Nehmen wir beispielsweise an, wenn ein Latelua-Knoten gefunden wird, wird in seinem übergeordneten Knoten ein Flag gesetzt und nach oben übertragen, wenn die Luatex-Ausführung zum übergeordneten Knoten zurückkehrt. Ein solches Schema müsste Knotenlistenaufteilungen und -zusammenführungen berücksichtigen. Oder gibt es keine separate Datenstruktur ... und direkt vor dem Senden von Inhalten an die Seite durchläuft Luatex die gesamte verschachtelte Knotenliste der Inhalte, die auf diese Seite kommen sollen, und prüft, ob es einen Latelua-Knoten gibt, den es (diesmal) ausführen muss? Wenn das so ist, d. h. keine separate spezielle Datenstruktur für Latelua-Knoten vorhanden ist und die gesamte zu versendende Knotenliste durchlaufen wird, liegt das daran, dass Luatex die Knotenliste, die auf der Seite erscheinen soll, ohnehin vollständig durchlaufen muss? Wenn ja, warum durchläuft es dann direkt vor dem Senden die gesamte Knotenliste? Gibt es eine Möglichkeit, den Versandprozess aufzufordern, einige vorgefertigte PDF-Seiteninhalte (die zum Senden bereit sind, und ihn aufzufordern, sie nicht zu durchlaufen) zu erfassen und so eine bessere Leistung zu erzielen? Wenn ja, wie kann man das tun? Es ist allgemein anerkannt, immer nur eine Frage zu stellen. Hier breche ich jedoch von dieser Norm, da die von mir gestellten Fragen eng miteinander verknüpft sind und dies für die Leser nützlicher sein könnte (da es kein englischsprachiges Buch zu Luatex gibt).

Antwort1

Der Mechanismus ist genau der gleiche wie \writeim klassischen TeX (mit \immediate\writedem Merkmal \directlua).

In Betracht ziehen

\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}

Dies erzeugt die Terminalausgabe

immediate write 3
directlua 4

Completed box being shipped out [1]

Dies zeigt, dass zu diesem Zeitpunkt die beiden nicht unmittelbaren Formen noch nicht ausgeführt wurden, die beiden unmittelbaren Formen jedoch schon.

Dann beginnt TeX mit der Verarbeitung von Seite 1 und konvertiert die Box-Node-Struktur in die PDF-Ausgabe. Das Terminal zeigt die Box-Node-Struktur

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

Dort sehen Sie, dass der Schreibknoten und der Latelua-Knoten in der Box immer noch Whatsit-Knoten sind, die lediglich den nicht ausgewerteten Text aus dem bereitgestellten Argument enthalten.

...\write-{write 1}

Und

...\latelua0{print 'latelua 2'}

Anschließend liest Latex die Schriftzuordnung wie auf dem Terminal angezeigt

{/usr/local/texlive/2020/texmf-var/fonts/map/pdftex/updmap/pdftex.map}

und schließlich, während es das PDF schreibt, kommt es zu den Schreib- und Latelua-Knoten und führt deren Inhalt aus und das Terminal zeigt

write 1
latelua 2

verwandte Informationen