
Beim Lesen von Paketen, die es ermöglichen,HakenMakros für bestimmte Ereignisse zuzuweisen, stieß ich auf diesen Befehl \shipout
. Die Suche im Internet hat nicht viel geholfen, aber wenn ich mich nicht irre, hat es irgendwie mit dem Erstellen neuer Seiten zu tun (oder etwa nicht?).
Meine Frage ist: Was ist das genau \shipout
, was macht es und wie macht es das, was es macht? (d. h. was passiert auf niedriger Ebene im Hintergrund)
Antwort1
Das ist ganz einfach: \shipout
ist ein Primitiv. Seine Syntax ist
\Versandkarton⟩
wobei ⟨box⟩ auf Seite 278 des TeXbook vollständig angegeben ist:
⟨Box⟩ →
\box
⟨8-Bit-Zahl⟩ |\copy
⟨8-Bit-Zahl⟩
|\lastbox
|\vsplit
⟨8-Bit-Zahl⟩to
⟨Abmessung⟩
|\hbox
⟨Boxspezifikation⟩{
⟨Horizontalmodus-Material⟩}
|\vbox
⟨Boxspezifikation⟩ ⟨Vertikalmodus{
-Material⟩}
|\vtop
⟨Boxspezifikation⟩{
⟨Vertikalmodus-Material⟩}
⟨Boxspezifikation⟩ → ⟨Abmessung⟩⟨Füllmaterial⟩to
|spread
⟨Abmessung⟩⟨Füllmaterial⟩ | ⟨Füllmaterial⟩
Man könnte zum Beispiel sagen
\shipout\hbox{Hello world}
und eine Seite in der DVI- oder PDF-Datei wird erstellt. Natürlich will niemand \shipout
diesen Weg verwenden. Seine Hauptverwendung ist in der Ausgaberoutine, die aufgerufen wird, wenn TeX entscheidet, dass es genügend Material zum Auswerfen einer ganzen Seite hat. Die aktuelle vertikale Hauptliste wird am gewählten Seitenumbruch geteilt und ihr Inhalt wird in gepackt \box255
, auf die die Ausgaberoutine reagieren kann. Beispielsweise macht die Plain TeX-Ausgaberoutine
\shipout\vbox{
\makeheadline
\pagebody
\makefootline
}
\advancepageno
\ifnum\outputpenalty>-\@MM
\else
\dosupereject
\fi
so wird eine vollständige Seite mit Kopf- und Fußzeilen ausgegeben. Der Inhalt von \box255
wird von bearbeitet \pagebody
. Die Ausgaberoutine in LaTeX ist viel komplizierter.
Was man tun kann, ist, es neu zu definieren, \shipout
damit es andere Aufgaben übernimmt. Der älteste Makrosatz, der so etwas tat, war quire.tex
(immer noch verfügbar auf CTAN und TeX Live):
\def\q_init
{\global\q_sheetnr=0\global\q_qnr=0
\global\let\q_oldship=\shipout
\global\let\shipout=\q_boat
\xdef\q_cycles{\the\deadcycles}%
\global\let\endquire=\q_endquire
}
Es speichert die ursprüngliche Bedeutung von \shipout
im Befehl \q_oldship
(die Makros verwenden sie _
als „privaten“ Marker) und definiert sie neu als \q_boat
, das einige Aufgaben ausführen und schließlich aufrufen wird \q_oldship
. Es könnte beispielsweise so eingerichtet werden, dass zwei Ausgabeseiten auf derselben physischen Seite platziert werden oder dass sechzehn Seitenlagen erstellt werden (daher der Paketname).
Das Paket atbegshi
verhält sich ähnlich. Es wird neu definiert, \shipout
sodass es zwischen dem Aufruf \shipout
und dem tatsächlichen Seitenversand eingebunden werden kann.
Was das Primitiv genau \shipout
tut, ist, die vertikale Liste, die es erhält, in Druckanweisungen auf niedriger Ebene umzuwandeln (DVI- oder PDF-Format, je nach Wert von, \pdfoutput
wenn pdftex
oder luatex
verwendet wird, XDV, wenn xetex
verwendet wird, nur DVI für Knuth TeX). In der Zwischenzeit führt es alle verzögerten \write
Operationen aus und erweitert dabei Token: Auf diese Weise wird garantiert, dass Verweise auf die Seitenzahl korrekt sind, da sie berechnet werden, wenn die Seite versendet wird.
Antwort2
AusTeXbook, Kapitel 23: Ausgaberoutinen, Seite 254:
Der primitive Befehl <box> von TeX
\shipout
ist das, was die eigentliche Ausgabe verursacht. Er sendet den Inhalt der Box an diedvi
Datei, die die Hauptausgabedatei von TeX ist. Wenn TeX fertig ist,dvi
enthält die Datei eine kompakte, geräteunabhängige Kodierung von Anweisungen, die genau angeben, was gedruckt werden soll. Wenn eine Box ausgegeben wird, zeigt TeX die Werte von\count0
through\count9
auf Ihrem Terminal an, wie in Kapitel 15 erläutert. Diese zehn Zähler werden auch in derdvi
Datei aufgezeichnet, wo sie zur Identifizierung der Seite verwendet werden können. Alle\openout
,\closeout
, und\write
-Befehle, die innerhalb der Box erscheinen, werden in ihrer natürlichen Reihenfolge ausgeführt, während diese Box ausgegeben wird. Da ein\write
Befehl Makros erweitert, wie in Kapitel 21 erläutert, kann der Scan-Mechanismus von TeX Syntaxfehler erkennen, während eine\shipout
ausgeführt wird. Wenn\tracingoutput
zum Zeitpunkt einer ungleich null ist\shipout
, wird der Inhalt der ausgegebenen Box in symbolischer Form in Ihre Protokolldatei geschrieben. Sie können\shipout
überall angeben, nicht nur in einer Ausgaberoutine.