Alles über \shipout

Alles über \shipout

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: \shipoutist 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 \shipoutdiesen 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 \box255wird von bearbeitet \pagebody. Die Ausgaberoutine in LaTeX ist viel komplizierter.

Was man tun kann, ist, es neu zu definieren, \shipoutdamit 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 \shipoutim 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 atbegshiverhält sich ähnlich. Es wird neu definiert, \shipoutsodass es zwischen dem Aufruf \shipoutund dem tatsächlichen Seitenversand eingebunden werden kann.

Was das Primitiv genau \shipouttut, ist, die vertikale Liste, die es erhält, in Druckanweisungen auf niedriger Ebene umzuwandeln (DVI- oder PDF-Format, je nach Wert von, \pdfoutputwenn pdftexoder luatexverwendet wird, XDV, wenn xetexverwendet wird, nur DVI für Knuth TeX). In der Zwischenzeit führt es alle verzögerten \writeOperationen 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 \shipoutist das, was die eigentliche Ausgabe verursacht. Er sendet den Inhalt der Box an die dviDatei, die die Hauptausgabedatei von TeX ist. Wenn TeX fertig ist, dvienthä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 \count0through \count9auf Ihrem Terminal an, wie in Kapitel 15 erläutert. Diese zehn Zähler werden auch in der dviDatei 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 \writeBefehl Makros erweitert, wie in Kapitel 21 erläutert, kann der Scan-Mechanismus von TeX Syntaxfehler erkennen, während eine \shipoutausgeführt wird. Wenn \tracingoutputzum 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.

verwandte Informationen