Boxen

LaTeX setzt alles, Text, Mathematik und Abbildungen, indem es das Material zuerst in Boxen packt und diese Boxen anschließend auf der Seite anordnet. Eine Box ist ein starres Rechteck mit drei Maßen (Breite, Höhe, Tiefe); der Zeilenumbruch schaut nicht hinein, sondern behandelt sie als eine einzige unteilbare Einheit. Wenn man diese Idee des „Packens in eine Box“ verstanden hat, erscheinen Verschieben, Überlagern, Einrahmen und Spaltenbau als Varianten desselben Mechanismus.

Das Boxmodell

Im Inneren von TeX ist jedes gesetzte Material eine Box mit Abmessungen. Ein einzelnes Zeichen ist eine Box, ein Wort ist eine Box, eine Zeile ist eine Box, und eine ganze Seite ebenfalls. Um Zeilen und Absätze zu bauen, verbindet LaTeX diese Boxen mit dehnbarem Zwischenraum und bricht Zeilen und Seiten an den besten Stellen um. Entscheidend ist: Sobald Material in eine einzige Box gepackt ist, wird ihr Inhalt nicht mehr geteilt. Innerhalb der Box entsteht kein Zeilenumbruch; die ganze Box wandert als eine Einheit in die nächste Zeile.

LaTeX-Boxen lassen sich grob in zwei Arten einteilen. Die erste ist die LR-Box (left-to-right box): Sie setzt ihren Inhalt in einer einzigen Reihe und bricht niemals um; wird sie zu breit, ragt sie über den Rand hinaus. \mbox, \makebox und die gerahmte \fbox sind LR-Boxen. Die zweite Art ist die Absatzbox: Sie bricht ihren Inhalt innerhalb einer vorgegebenen Breite um und kann mehrere Zeilen oder sogar mehrere Absätze enthalten. \parbox und die Umgebung minipage gehören zu den Absatzboxen.

Diese Unterscheidung entspricht den Modi von TeX. Das Innere einer LR-Box befindet sich im LR-Modus: Die Eingabe läuft nur von links nach rechts und wird nicht umbrochen. Eine Absatzbox wechselt in den (inneren) Absatzmodus, in dem der Zeilenumbruch wie im normalen Fließtext arbeitet. Wenn klar ist, welcher Befehl welchen Modus erzeugt, sieht man schnell, warum etwas nicht umbricht oder warum eine Box nach unten wächst.

LR-Boxen: eine Zeile packen

Die grundlegendste LR-Box ist \mbox{...}. Sie schließt ihren Inhalt in eine Box ein und verbietet sowohl Zeilenumbrüche als auch Trennungen. Packen Sie eine Phrase, die nie getrennt werden soll, etwa einen Produktnamen wie Mac OS X, eine Telefonnummer oder einen langen chemischen Namen, in \mbox, und sie bleibt immer in einer Zeile. Das ist auch für kleine Korrekturen nützlich, etwa um einen Wert an seine Einheit zu binden.

Wenn Sie die Breite selbst wählen möchten, verwenden Sie \makebox[width][position]{text}. [width] legt die Breite der Box fest, und [position] bestimmt, wo der Inhalt darin sitzt: l linksbündig, c zentriert (Standard), r rechtsbündig, und s dehnt die Wortzwischenräume, sodass die Zeile die gesamte Breite ausfüllt. Neben normalen Längen wie \textwidth kann die Breite spezielle Längen für die natürliche Größe des Inhalts verwenden: \width (seine Breite), \height und \depth sowie \totalheight (Höhe plus Tiefe). So erzeugt \makebox[2\width]{word} eine Box, die doppelt so breit ist wie das Wort.

Besonders mächtig ist die Box mit Breite null \makebox[0pt][position]{text}. Weil die Box Breite 0 hat, setzt LaTeX den Inhalt, rückt die horizontale Position aber nicht weiter; der Inhalt kann also das Folgende überdrucken. Mit [c] ragt der Inhalt zu beiden Seiten des aktuellen Punkts, mit [r] nach links und mit [l] nach rechts. So entstehen Durchstreichungen, Überdrucke und Randnotizen; die Kurzformen \rlap und \llap (Boxen der Breite null, die nach rechts bzw. links überhängen) funktionieren nach demselben Prinzip.

Um einen Rahmen zu zeichnen, verwenden Sie \fbox{text} und \framebox[width][position]{text}; sie ziehen Linien an allen vier Seiten der Box. Die Argumente [width][position] von \framebox sind genau dieselben wie bei \makebox. Das Aussehen des Rahmens wird von zwei Längen bestimmt: der Linienstärke \fboxrule (Standard 0.4pt) und dem Abstand zwischen Rahmen und Inhalt \fboxsep (Standard 3pt). Mit \setlength lassen sie sich ändern; \setlength{\fboxsep}{0pt} etwa legt den Rahmen direkt an den Inhalt. Dies sind einzeilige LR-Boxen; mehrere Zeilen rahmen Sie daher zusammen mit den Absatzboxen unten ein (für aufwendigere Rahmen siehe „Rahmen“).

document.tex
Do not break \mbox{Mac OS X} here.

% a 4cm box, contents flush right, then framed
\framebox[4cm][r]{right} \\[1ex]

% zero-width box: the word overprints what follows
X\makebox[0pt][l]{\,/} Y   % prints an X/ over the gap before Y

Im Beispiel bleibt die mit \mbox gesetzte Phrase immer in einer Zeile, \framebox[4cm][r] setzt den Inhalt rechtsbündig in einen 4 cm breiten Rahmen, und die Box mit Breite null überdruckt direkt nach dem X einen Schrägstrich.

Absatzboxen: parbox und minipage

Wenn Sie eine Breite festlegen und den Inhalt umbrechen lassen möchten, sind Absatzboxen zuständig. Die leichte Variante ist \parbox[position]{width}{text}; sie bricht den Inhalt innerhalb der angegebenen {width} als einen einzelnen Absatz um. [position] legt fest, wo die Box an der umgebenden Zeile ausgerichtet wird: c (Standard, die Mitte der Box liegt auf der Zeilenmitte), t (die Grundlinie der obersten Boxzeile liegt auf der umgebenden Grundlinie) oder b (die Grundlinie der untersten Zeile). Mit \parbox[position][height][inner-pos]{width}{text} können Sie zusätzlich Höhe und innere vertikale Ausrichtung (t/c/b/s) festlegen, doch \parbox verarbeitet nur einen einzigen Absatz: keine mehreren Absätze und keine Listen.

Die leistungsfähigere Absatzbox ist die Umgebung minipage: \begin{minipage}[position][height][inner-pos]{width}\end{minipage}. Die Argumente bedeuten dasselbe wie bei \parbox, aber der Inhalt verhält sich wie eine eigene kleine Seite. Sie kann mehrere Absätze, Listen wie itemize und sogar verbatim enthalten; unter den Absatzboxen ist sie das eigentliche Arbeitspferd. Beachten Sie: Im Inneren wird der Absatzeinzug (\parindent) auf 0 zurückgesetzt; setzen Sie ihn bei Bedarf selbst, etwa mit \setlength{\parindent}{1em}.

Eine minipage besitzt außerdem eine eigene Fußnotenbehandlung. Eine darin verwendete \footnote erscheint nicht am Seitenfuß, sondern direkt unter der minipage, markiert mit Kleinbuchstaben a, b, … (dafür gibt es den eigenen Zähler mpfootnote). Das ist praktisch, wenn eine Anmerkung innerhalb einer Tabelle oder eines eingerahmten Einschubs bleiben soll. Andererseits kann eine minipage keine Gleitobjekte (figure/table) enthalten und wird nie über Seiten hinweg getrennt; sie muss als eine Box auf die Seite passen.

Die häufigste Anwendung von minipages sind nebeneinanderstehende Spalten. Setzen Sie zwei minipages hintereinander und fügen Sie dazwischen Abstand wie \hfill ein, entsteht ein einfaches zweispaltiges Layout, ideal für eine Abbildung neben ihrer Beschriftung oder zwei Bilder nebeneinander. Wenn beide [t] verwenden, werden die Oberkanten zweier unterschiedlich hoher Boxen sauber ausgerichtet (für anspruchsvollere Platzierung siehe „Gleitobjekte und Platzierung“).

document.tex
\noindent
\begin{minipage}[t]{0.48\textwidth}
  Left column. This minipage wraps text within 48\%
  of the text width, and can hold several paragraphs,
  lists, and even its own footnote.\footnote{Local note.}
\end{minipage}\hfill
\begin{minipage}[t]{0.48\textwidth}
  Right column, top-aligned with the left one because
  both use the optional \verb|[t]| argument.
\end{minipage}

Jede minipage nimmt 48% der Textbreite ein, und das \hfill dazwischen füllt den Rest, sodass beide zusammen die ganze Zeilenbreite nutzen. Weil beide [t] tragen, richten sich ihre Oberkanten auch bei unterschiedlicher Zeilenzahl aus. Die \footnote in der linken Box erscheint mit Kleinbuchstabenmarke unter der minipage, nicht am Seitenfuß.

Verschieben und Linien: raisebox und rule

Um eine Box vertikal zu verschieben, verwenden Sie \raisebox{lift}[height][depth]{text}. Ein positiver Wert für {lift} hebt den Inhalt an, ein negativer senkt ihn ab. Der interessante Teil sind die optionalen Angaben [height] und [depth]: Sie weisen LaTeX an, so zu tun, als hätte die Box diese Höhe und Tiefe. Der umgebende Zeilenabstand wird daher aus den deklarierten Werten berechnet, nicht aus dem tatsächlich Gezeichneten. \raisebox{0pt}[0pt][0pt]{a big symbol} zeichnet etwa etwas Großes, meldet aber Höhe und Tiefe null; so lässt sich ein Schmuckelement einfügen, ohne den Zeilenvorschub zu stören. Auch hier funktionieren die speziellen Längen \height, \depth und \totalheight.

\rule[lift]{width}{height} zeichnet ein voll gefülltes Rechteck, also eine schwarze Box. {width} und {height} legen die Maße fest, und das optionale [lift] verschiebt sie über die Grundlinie oder, bei negativem Wert, darunter. Für horizontale Linien ist das ideal: \rule{0.5\linewidth}{0.4pt} erzeugt eine dünne Linie mit halber Zeilenbreite.

Die andere Seite von \rule ist die Stütze (strut). Eine \rule{0pt}{height} mit Breite null ist eine unsichtbare Box, die nichts druckt, aber genau diese Höhe reserviert. Damit erzwingen Sie eine Mindestzeilenhöhe oder geben Tabellenzellen mehr Luft. Steht \rule{0pt}{2.6ex} am Zeilenanfang, ist die Zeile garantiert mindestens 2.6 ex hoch. LaTeX’ eigener Befehl \strut ist genau \rule[-0.3\baselineskip]{0pt}{\baselineskip}: eine Stütze der Breite null, die den aktuellen Zeilenvorschub ober- und unterhalb der Grundlinie ausfüllt. Das ist der klassische Trick, damit Text nicht an Tabellenlinien klebt.

latex
% a centered horizontal rule
\noindent\hfil\rule{0.5\linewidth}{0.4pt}\hfil

% a strut forces a taller line / roomier table cell
\begin{tabular}{|l|}
  \hline
  \rule{0pt}{2.6ex}Tall, uncramped row \\
  \hline
\end{tabular}

% align two differently sized boxes on a common baseline
big \raisebox{-0.4ex}{\Huge A} small

Boxen speichern und wiederverwenden

Wenn Sie dasselbe Material mehrfach verwenden, können Sie es einmal setzen, in einer Box speichern und später nur noch abrufen. Deklarieren Sie zuerst mit \newsavebox{\boxname} eine Speicherbox, also ein Register. Danach füllen Sie sie mit \sbox{\boxname}{text} oder \savebox{\boxname}[width][position]{text}; der Inhalt wird tatsächlich nur in diesem einen Moment gesetzt. An jeder gewünschten Stelle gibt \usebox{\boxname} die gespeicherte Box unverändert aus. Bei aufwendigem Material wie einer langen Tabelle oder einer komplizierten Abbildung, das an mehreren Stellen gebraucht wird, beschleunigt das die Verarbeitung und garantiert identisches Aussehen.

Eine Speicherbox ist eine LR-Box; mehrzeiliges Material packen Sie daher zuerst in eine \parbox oder minipage. Es gibt außerdem die Umgebungsform \begin{lrbox}{\boxname} … \end{lrbox}, die sich besser für Inhalte mit verbatim eignet. Beachten Sie, dass \sbox robust ist, \savebox dagegen fragil; seien Sie also vorsichtig, wenn Sie letzteres in einem „beweglichen Argument“ wie einer Abschnittsüberschrift verwenden.

Um eine Box zu messen, verwenden Sie \settowidth{\len}{text}, \settoheight{\len}{text} und \settodepth{\len}{text}. Sie speichern Breite, Höhe oder Tiefe des gesetzten Inhalts in das angegebene Längenregister. Das ist nützlich für präzise Anpassungen, etwa einen Rahmen oder eine Unterstreichung exakt auf die Boxgröße abzustimmen.

document.tex
\newsavebox{\mylogo}
\sbox{\mylogo}{\fbox{\textbf{Draft}}}   % typeset once

% reuse the identical box as many times as you like
Header: \usebox{\mylogo} \dots\ Footer: \usebox{\mylogo}

% measure a box into a length, then rule under it
\newlength{\w}
\settowidth{\w}{Signature}
Signature\par\rule{\w}{0.4pt}

Die Zeile mit \sbox setzt „Draft“ einmal in einen Rahmen, und die beiden Aufrufe von \usebox holen genau diese gespeicherte Box hervor. In der unteren Hälfte misst \settowidth die Breite von „Signature“, und \rule zeichnet eine Unterstreichung exakt dieser Breite.

Die Boxbefehle im Überblick

BefehlArtWirkung
\mboxLR-BoxHält den Inhalt in einer Zeile; kein Umbruch, keine Trennung
\makeboxLR-BoxLegt Breite und Position fest; [0pt] überdruckt mit Breite null
\frameboxLR-BoxEine gerahmte \makebox (\fbox ist die Form ohne Breitenangabe)
\parboxAbsatzboxEin einzelner umbrochener Absatz mit fester Breite
minipageAbsatzboxEine kleine Seite für Absätze, Listen und Fußnoten
\raiseboxTransformationVerschiebt Inhalt nach oben/unten; kann Höhe und Tiefe vortäuschen
\ruleGefüllte BoxEin gefülltes Rechteck; Breite null ergibt eine Stütze
\useboxSpeicherGibt eine mit \newsavebox + \sbox gespeicherte Box aus