Steht im Quelltext „hier 2cm frei lassen“, dann lässt LaTeX 2cm frei. Sobald dasselbe \vspace{2cm} aber an den Kopf einer Seite rutscht, ist die Länge spurlos verschwunden. Das ist kein Fehler. Abstand ist in LaTeX keine feste Maßangabe, sondern Leim (glue): etwas, das sich dehnt, schrumpft und weggeworfen wird, sobald es nicht mehr gebraucht wird. Diese Seite geht die Längeneinheiten (pt, bp, em, ex), die Befehle für Abstand (\hspace, \vspace samt Sternformen) und die Gummilängen entlang genau dieses Fadens durch: warum pt und bp um 0,375 % auseinanderliegen, warum em bei gleicher nomineller Größe je nach Schrift anders ausfällt und was der Stern in \hspace* eigentlich schützt.
pt oder bp: die Längeneinheiten von LaTeX
Eine Länge besteht immer aus Zahl plus Einheit. Dezimalzahlen und negative Werte sind erlaubt – 12pt, 2.5cm, -3mm –, doch ohne Einheit bricht der Lauf mit ! Illegal unit of measure (pt inserted). ab. Diese Meldung erscheint nach \hspace{2} oder \setlength{\mylen}{5} und gehört zu den häufigsten Fehlern in LaTeX überhaupt. Die Einheiten zerfallen in zwei Gruppen: absolute Einheiten, deren Wert unabhängig von der aktiven Schrift feststeht (pt, bp, in, cm, mm, pc), und schriftrelative Einheiten, die ihren Wert aus der gerade verwendeten Schrift auslesen (em, ex).
Bezugsgröße der absoluten Einheiten ist pt, der TeX-Punkt. Knuth übernahm den angloamerikanischen Schriftsetzerpunkt unverändert: 1 inch = 72.27pt. Daneben führt TeX einen zweiten Punkt mit, bp (big point), definiert als exakt 1/72 Zoll – die runde Zahl, die PostScript und später PDF zum Standard gemacht haben. Gleich sind die beiden nicht: 1bp = 1.00375pt genau, der big point ist also 0,375 % größer, und 100bp ergeben 100.375pt. Da das Koordinatengitter von PDF selbst in 1/72 Zoll rechnet, sind alle Zahlen in der BoundingBox einer EPS- oder PDF-Datei bp-Werte; wer eine Abbildung von \includegraphics[width=100pt] auf [width=100bp] umschreibt, ändert ihre Größe um eben diese 0,375 %. Abbildungsmaße in Millimetern anzugeben ist schon deshalb sicherer, weil die Verwechslung dort gar nicht auftreten kann.
| Einheit | Bedeutung / Umrechnung | Verwendung |
|---|---|---|
pt | TeX-Punkt. 1in = 72.27pt | Referenz für alle Längen, auch für Schriftgrößen |
bp | Big Point. 1bp = 1.00375pt (72bp = 1in) | Der PostScript/PDF-Punkt; Einheit der BoundingBox |
in | Zoll. 1in = 72.27pt | US-Papiermaße |
cm | Zentimeter. 1cm = 28.45274pt | Praktischer Standard für Ränder und Abbildungen |
mm | Millimeter. 1mm = 2.84526pt | Feine Maßangaben |
pc | Pica. 1pc = 12pt | Traditionelle typografische Einheit, etwa für Spaltenbreiten |
dd | Didot-Punkt. 1157dd = 1238pt (≈ 1,07pt) | Kontinentaleuropäische Bleisatztradition |
cc | Cicero. 1cc = 12dd = 12.8401pt | Das Pica-Äquivalent des Didot-Systems |
sp | Scaled Point. 1pt = 65536sp | Interne Schrittweite aller Längen; wird nie von Hand geschrieben |
px | Pixel. Voreingestellt 1px = 1bp = 1.00375pt | Nur in pdfTeX und Verwandten; über \pdfpxdimen einstellbar |
em | Das Geviert der aktuellen Schrift (\fontdimen6) | Schriftrelativ; Einzüge und waagerechte Abstände |
ex | x-Höhe der aktuellen Schrift (\fontdimen5) | Schriftrelativ; senkrechte Feinkorrekturen an der Kleinbuchstabenhöhe |
mu | Math-Einheit. 18mu = 1em | Nur im Mathematikmodus; \, ist 3mu, \; ist 5mu |
Weiter unten in der Tabelle steht sp, der scaled point – die kleinste Stufe, in der TeX Längen führt, mit 1pt = 65536sp. Man schreibt sie kaum je selbst, doch diese Stufe legt zugleich Genauigkeit und Obergrenze von TeX fest. Ein sp misst rund 5,4 Nanometer, weit feiner als die Wellenlänge sichtbaren Lichts (400–700 nm); am anderen Ende steht \maxdimen, die größte Länge, die TeX halten kann, mit 16383.99998pt – gerade einmal rund 5,76 Meter. Beide Zahlen folgen aus derselben einen Bedingung: Eine Länge ist eine ganze Zahl von sp und muss unter 2^30 bleiben. Die kontinentaleuropäischen Bleisatzeinheiten dd (Didot-Punkt, 1157dd = 1238pt) und cc (Cicero, 1cc = 12dd) funktionieren weiterhin, tauchen in modernen Dokumenten aber selten auf.
em und ex hängen von der Schrift ab
em ist nicht „die Schriftgröße“. Es ist das Geviert (quad), das die gerade aktive Schrift für sich selbst angibt – in TeX der Wert \fontdimen6. Dieselbe nominelle Größe von 10pt liefert deshalb verschiedene Antworten: In Computer Modern Roman bei 10pt beträgt 1em genau 10.00002pt, in der Schreibmaschinenschrift Computer Modern Typewriter bei ebenfalls 10pt dagegen 10.4999pt, in der Kursiven 10.22217pt. Auch die geläufige Erklärung, em sei die Breite eines großen M, hält der Messung nicht stand: In cmr10 ist ein M 9.16669pt breit, also schmaler als 1em. Der Name stammt aus dem Bleisatz, wo das Geviert ein Quadrat des Kegels war; die tatsächliche Zahl bestimmt die Schrift.
ex funktioniert genauso und hält die x-Höhe, die die Schrift angibt (\fontdimen5). Computer Modern Roman meldet bei 10pt 4.30554pt, die serifenlose Computer Modern Sans bei ebenfalls 10pt 4.44444pt. Die Wahl zwischen beiden ist keine Richtungsfrage – „em waagerecht, ex senkrecht“ –, sondern die Frage, woran sich der Abstand orientieren soll. Raum, der dem Textvorschub folgen soll, nimmt em; eine Feinkorrektur, die der Höhe der Kleinbuchstaben folgen soll, nimmt ex. Im Mathematikmodus kommt ein Drittes hinzu, mu (math unit), mit 18mu = 1em. \quad ist buchstäblich \hskip1em, \qquad das Doppelte, 2em; das schmale \, ist in der Formel 3mu und im Text ein Kern von 0.16667em (ein Sechstel Geviert). Das breite \; misst 5mu, das mittlere \: mit 4mu steht erst nach dem Laden von amsmath zur Verfügung.
% absolute units: the same length whatever font is active
\hspace{12pt} \hspace{2.5cm} \hspace{-3mm} \hspace{100bp}
% font-relative units: the font decides the value
\hspace{1em} \vspace{2ex}
% proof that em follows the font, not the point size
\rmfamily \the\dimexpr 1em\relax % 10.00002pt at 10pt
\ttfamily \the\dimexpr 1em\relax % 10.4999pt at 10ptGummilängen: was plus und minus bewirken
plus gewährt Dehnraum, minus Schrumpfraum. Eine unbewegliche Länge wie 12pt heißt starre Länge, eine mit Spielraum wie 1cm plus 2mm minus 1mm heißt Gummilänge und bedeutet: normalerweise 1cm, bei Bedarf bis 1,2cm, unter Druck bis 0,9cm. Für TeX ist das keine Sonderfunktion – innerhalb einer Zeile, eines Absatzes oder einer Seite ist praktisch aller Weißraum dehnbarer Leim. Dass Zeilen exakt an beiden Rändern stehen, liegt allein daran, dass die Wortzwischenräume Gummilängen sind. Umgekehrt nimmt eine Reihe starrer \vspace{12pt} dem Satzprogramm genau den Verhandlungsspielraum, den es bräuchte.
% rigid: exactly 1cm, always
\vspace{1cm}
% rubber: 1cm normally, up to 1.2cm, down to 0.9cm
\vspace{1cm plus 2mm minus 1mm}
% infinite stretch: 0pt at rest, grows without limit
\vspace{\fill}LaTeXs \fill ist ein Skip-Register mit dem Inhalt 0pt plus 1fill – im Ruhezustand null, dafür unendlich dehnbar. Weil unendliche Dehnung jede endliche schlägt, sorgt ein einziges \fill in einer Zeile oder Spalte dafür, dass sich der gesamte umgebende endliche Leim gar nicht mehr dehnt. TeX kennt drei Stufen der Unendlichkeit, fil < fill < filll: \hfil trägt plus 1fil, \hfill trägt plus 1fill; stehen beide in einer Zeile, nimmt \hfill den gesamten Überschuss. Für eine Aufteilung nach Verhältnis dient \stretch{n}, also 0pt plus n fill: \hspace{\stretch{2}} gegen \hspace{\stretch{1}} teilt den Rest im Verhältnis 2:1, zwei gleich starke \fill teilen ihn gleichmäßig.
Wirkt diese Elastizität senkrecht überhaupt? Manchmal. Unter \flushbottom, das jede Seite auf dieselbe Tiefe ausrichtet, dehnt TeX den bereits vorhandenen flexiblen Leim der Seite – das \parskip zwischen Absätzen (voreingestellt 0pt plus 1pt), den Raum um Überschriften, einen gelegentlichen \bigskip –, bis die Spalte genau die Höhe des Satzspiegels erreicht. Unter \raggedbottom geschieht das nicht, und der Grund ist eine einzige Zeile im LaTeX-Kern: \raggedbottom hängt genau einen Leim an den Fuß des Textes, \vskip 0pt plus.0001fil. Dieser Hauch unendlicher Dehnbarkeit übertrumpft jedes endliche plus der Seite und verschluckt den gesamten Überschuss; der Leim im Text behält seine natürliche Größe, und der Rest sammelt sich unten. Die Standardklassen entscheiden dann von selbst: article, report und book rufen \raggedbottom für ein einseitiges Dokument und \flushbottom für twoside und twocolumn auf. Da article auf oneside voreingestellt ist, werden dort die auf einem \vspace notierten plus- und minus-Anteile für den Seitenausgleich kaum herangezogen – wer sie nutzen will, deklariert \flushbottom.
\hspace oder \hspace* – dazu \hfill und \dotfill
\hspace{Länge} setzt waagerechten Raum innerhalb einer Zeile: \hspace{2cm} liefert 2cm – sofern dieser Raum nicht an den Zeilenrand gerät. Jedes Mal, wenn TeX einen Absatz in Zeilen zerlegt, verwirft es den Leim unmittelbar neben jeder Umbruchstelle, damit kein Weißraum über den rechten Rand hinaushängt und keine Zeile grundlos eingerückt beginnt. Die Sternform \hspace*{Länge} umgeht das. Ein Blick in die Definition zeigt: Sie stellt lediglich eine \vrule der Breite null und ein \nobreak vor den Skip. Eine Linie ist eine Box und kein Leim, kann also nicht verworfen werden, und der Raum dahinter steht nicht mehr neben der Umbruchstelle. Genau das braucht man, wenn die erste Zeile einen erzwungenen Einzug tragen soll.
\hfill ist dasselbe wie \hspace{\fill}: Es treibt auseinander, was links und rechts steht, so weit die Zeile es zulässt – der klassische Weg, ein Wort linksbündig und ein anderes rechtsbündig zu setzen. Auch das ist Leim und wird am Zeilenrand verworfen; wo es bleiben muss, schreibt man \hspace*{\fill}. Soll die Lücke nicht leer bleiben, sondern gefüllt werden, zieht \hrulefill eine Linie hindurch und \dotfill eine Punktreihe; beide sind ein \hfill, das TeX über den Leaders-Mechanismus (\leaders und \cleaders) auffüllt. Die Punktreihe zwischen Inhaltseintrag und Seitenzahl ist genau das, ebenso die Linie unter einem Formularfeld. Für kleine feste Abstände halten die schriftrelativen \quad (1em), \qquad (2em) und \, die optische Balance auch bei geänderter Schriftgröße – ein fest notiertes 6pt tut das nicht.
Name:\hspace{2cm}Date:\par
\noindent Chapter 1\quad Introduction\dotfill 1\par
\noindent left\hfill centre\hfill right\par
\noindent Signature:\hrulefill\par
% 2:1 split of the leftover space
\noindent A\hspace{\stretch{2}}B\hspace{\stretch{1}}C\par
% survives even at the start of a line
\noindent\hspace*{2cm}forced indentWarum \vspace an einem Seitenumbruch verschwindet
Weil dieselbe Regel senkrecht gilt. TeX verwirft den Leim neben einer Umbruchstelle, gleich wo diese liegt; ein \vspace{3cm}, das an den Kopf einer Seite gerät, ist damit vollständig verschwunden. Direkt gemessen steuert ein \vspace{3cm} unmittelbar nach einem \newpage exakt nichts bei – das steckt meistens hinter „der Abstand wirkt überall, nur hier nicht“. Die Absicht entspricht der bei \hspace: kein unerklärlicher weißer Streifen am Seitenkopf. Die Sternform \vspace*{Länge} umgeht das mit demselben Kniff, einer \hrule der Höhe null und einem \nobreak unmittelbar vor dem Skip. \vspace* gehört überall dorthin, wo der Abstand unabhängig von der Umbruchstelle bestehen bleiben muss, etwa für den festen Vorlauf über einem Kapitelanfang.
Für alltägliche vertikale Abstände liegen drei fertige Größen bereit: \smallskip, \medskip und \bigskip mit den Standardwerten 3pt plus 1pt minus 1pt, 6pt plus 2pt minus 2pt und 12pt plus 4pt minus 4pt. In einem 10pt-Dokument beträgt \baselineskip 12pt, ein \bigskip entspricht also ungefähr einer Zeile. Alle drei sind Gummilängen und geben der Seite ein wenig nach. Und nun schlägt der vorige Absatz zu: Jeder von ihnen ist als sternloses \vspace definiert (\vspace\smallskipamount und so fort) und wird an einer Seitengrenze daher ebenso rücksichtslos verworfen wie jeder andere Leim. Deshalb verschwindet der Abstand über einer Überschrift, sobald diese an den Seitenkopf rutscht; wo er bleiben muss, schreibt man \vspace*{\bigskipamount}. Das senkrechte \fill heißt \vfill (\vspace{\fill}) und dient dazu, eine einzeilige Seite vertikal zu zentrieren oder einen Signaturblock an den Fuß zu drücken.
| Befehl | Eingefügter Abstand | Am Umbruch verworfen? |
|---|---|---|
\hspace{len} | Waagerechter Leim der angegebenen Breite | Ja, am Zeilenrand |
\hspace*{len} | Dieselbe Breite, davor eine \vrule der Breite null | Nein |
\hfill | Wie \hspace{\fill}: 0pt plus 1fill | Ja |
\hfil | 0pt plus 1fil; eine Stufe schwächer als \hfill | Ja |
\stretch{n} | 0pt plus n fill; teilt Raum nach Verhältnis | Ja |
\hrulefill | Ein \hfill, das die Lücke mit einer Linie füllt | Ja |
\dotfill | Ein \hfill, das die Lücke mit Punkten füllt; Inhaltsverzeichnis | Ja |
\quad | \hskip1em; fester Abstand, der der Schrift folgt | Ja |
\qquad | \hskip2em; doppelt so viel wie \quad | Ja |
\, | Schmaler Abstand: 3mu in der Formel, 0.16667em im Text | Nein, im Text ein Kern |
\vspace{len} | Senkrechter Leim der angegebenen Höhe | Ja, am Seitenumbruch |
\vspace*{len} | Dieselbe Höhe, davor eine \hrule der Höhe null | Nein |
\vfill | Wie \vspace{\fill}; schiebt den Rest senkrecht auseinander | Ja |
\smallskip | Ein \vspace von 3pt plus 1pt minus 1pt | Ja |
\medskip | Ein \vspace von 6pt plus 2pt minus 2pt | Ja |
\bigskip | Ein \vspace von 12pt plus 4pt minus 4pt; bei 10pt etwa eine Zeile | Ja |
\newlength, \setlength, \addtolength: Längen als Variablen
Wenn dieselbe Länge im ganzen Dokument wiederkehrt, ist ein einziges Längenregister mit Namensbezug deutlich wartungsfreundlicher. \newlength{\mylen} deklariert eine neue Länge, \setlength{\mylen}{2em} weist ihr einen Wert zu und \addtolength{\mylen}{-1pt} verändert ihn; eine Änderung an einer Stelle zieht alle Verwendungen nach. Deklariert wird genau einmal – ein zweites \newlength auf denselben Namen erzeugt ! LaTeX Error: Command \mylen already defined. Um tatsächlich Gesetztes auszumessen, legt \settowidth{\mylen}{Total:} (neben \settoheight und \settodepth) die Breite ab, die dieser Text real einnimmt. Und \the\mylen gibt den aktuellen Wert zur Kontrolle ins PDF aus.
Vorhandene Längen lassen sich direkt in die Rechnung nehmen: \textwidth (Breite des Satzspiegels), \linewidth (Breite der gerade gesetzten Zeile – innerhalb einer minipage oder Liste schmaler als \textwidth), \baselineskip (Zeilenabstand), \parindent (Einzug) und \parskip (Abstand zwischen Absätzen, voreingestellt 0pt plus 1pt). Ein vorangestellter Faktor skaliert sie – 0.8\textwidth – und das funktioniert ganz ohne Paket. Hier lauert allerdings eine Falle, die gerade deshalb tückisch ist, weil sie keinen Fehler erzeugt. Ohne das Paket calc beschwert sich \setlength{\mylen}{\textwidth - 2em} überhaupt nicht. Was geschieht, ist keine Subtraktion: \mylen erhält schlicht \textwidth (in einem voreingestellten article also 345.0pt), und der Rest - 2em wird als Text ins Dokument gesetzt. Man merkt es, wenn die Zeichenfolge „- 2em“ im PDF auftaucht. Mit \usepackage{calc} ergibt dieselbe Zeile korrekt 324.99997pt, und Klammerausdrücke wie (\textwidth - 2em)/2 werden ebenfalls möglich.
\usepackage{calc} % needed for + - * / inside \setlength
% ...
\newlength{\gutter}
\setlength{\gutter}{2em}
\addtolength{\gutter}{-1pt}
\newlength{\halfcol}
\setlength{\halfcol}{(\textwidth - \gutter) / 2}
\newlength{\labelw}
\settowidth{\labelw}{Total:} % width of that text once typeset
\the\halfcol % prints the value, e.g. 162.49998pt
\noindent\hspace*{0.8\textwidth}right-aligned headingIn der Praxis genügen drei Gewohnheiten. Fest notierte Werte sind das letzte Mittel: Sobald 8cm im Quelltext steht, zerfällt das Verhältnis bei jeder Änderung von Papierformat oder Rändern, während ein Ausdruck auf Basis einer vorhandenen Länge – 0.8\textwidth, 2\baselineskip – die Änderung übersteht. Den fertigen \smallskip, \medskip und \bigskip den Vorzug geben vor einem rohen \vspace{12pt}, dann atmet das ganze Dokument gleichmäßig. Und nur den Abstand mit Stern versehen, der einen Umbruch wirklich überleben muss – denn ein Abstand ohne Stern ist ein Abstand, den TeX ausdrücklich verwerfen darf. Wer sich daran hält, erlebt den rätselhaften Fehler „nur hier fehlt der Abstand“ kaum noch.