Linien

Woran man eine LaTeX-Tabelle sofort als LaTeX-Tabelle erkennt, sind ihre Linien. Mit \hline und | gezogene Linien wirken an die Buchstaben geklebt – und das ist messbar, nicht bloß gefühlt: \hline fügt der Zeile nichts hinzu außer den eigenen 0,4pt Strichstärke, oberhalb und unterhalb null Abstand. Das \midrule aus booktabs bringt neben der 0,5pt starken Linie 4,52pt Weißraum mit. Genau diese wenigen Punkte Luft trennen eine Zeitschriftentabelle von einer Standard-LaTeX-Tabelle. Diese Seite geht die Standardbefehle \hline, \cline und \vline durch, dann booktabs mit \toprule / \midrule / \bottomrule, schließlich hhline für die Kreuzungen, an die beide nicht heranreichen – durchgehend mit gemessenen Werten.

Warum \hline, \cline und | gedrängt wirken

Die Antwort: Sie fügen überhaupt keinen Abstand hinzu. Ein zweizeiliges tabular misst 24,0pt; kommt zwischen die Zeilen ein \hline, werden daraus 24,4pt. Der Zuwachs entspricht genau \arrayrulewidth (standardmäßig 0,4pt) – der Strichstärke selbst, sonst nichts. Es wird kein Weißraum eingefügt, und deshalb scheint die Linie die Buchstaben zu berühren. Noch extremer ist \cline: Ein eingefügtes \cline{2-3} lässt die Höhe bei 24,0pt, der Zuwachs ist exakt null. Die Linie drückt die Zeilen nicht auseinander, sie wird in den ohnehin vorhandenen Zeilenabstand gezeichnet.

Die Werkzeuge selbst sind unkompliziert. \hline zieht, nach dem \\ einer Zeile (oder ganz oben bzw. unten) platziert, eine Linie über die volle Breite; zwei hintereinander, \hline\hline, ergeben eine Doppellinie im Abstand \doublerulesep (Vorgabe 2pt). Für einen Teil einer Zeile dient \cline{i-j}\cline{2-3} zieht die Linie unter Spalte 2 und 3, getrennte Bereiche schreibt man als \cline{1-1}\cline{3-4}. Vertikale Linien gehören in die Spaltenspezifikation, nicht in den Körper: {|l|c|r|} setzt an jedem | eine Linie über die volle Höhe, || eine doppelte. Für eine senkrechte Linie innerhalb einer einzelnen Zelle gibt es \vline. Die Stärke von |, \hline und \vline bestimmt durchweg \arrayrulewidth; \setlength{\arrayrulewidth}{0.8pt} verstärkt sie also alle gleichzeitig.

latex
% every standard ruling feature at once -- and a specimen of what to avoid
\begin{tabular}{|l|c|r|}
  \hline
  Item & Qty & Price \\
  \hline\hline
  Apple & 3 & 380 \\
  \cline{2-3}
  Orange & 12 & 120 \\
  \hline
\end{tabular}

Dieses Beispiel rahmt jede Spalte mit |, setzt unter den Kopf mit \hline\hline eine Doppellinie und trennt in der Mitte mit \cline{2-3}. Es schöpft das Standardrepertoire aus – und ist gerade deshalb ein Musterfall für zu viele Linien. In der typografischen Tradition ist eine Linie kein Käfig um die Daten, sondern ein zurückhaltendes Mittel, das deren logische Gliederung markiert. Vertikale Linien errichten Mauern zwischen den Spalten und bremsen das Auge; doppelte Linien beschweren die Seite ohne Gegenwert. Wer bei schlichtem \hline bleibt, sollte zumindest die Tabelle nicht einrahmen: eine Linie unter dem Kopf sowie oben und unten, sonst keine. Das Paket booktabs im nächsten Abschnitt ist genau diese Disziplin in Code gegossen.

booktabs verwenden – \toprule, \midrule, \bottomrule

\usepackage{booktabs} in die Präambel schreiben und \hline durch drei Linienarten ersetzen: \toprule ganz oben, \midrule zwischen Kopf und Körper, \bottomrule ganz unten. Allein damit entsteht eine Zeitschriftentabelle ohne vertikale und ohne doppelte Linien. Zwei Dinge bewirken das: Das Paket staffelt die Linien in drei Stärken und setzt Abstand über und unter jede Linie. In Zahlen ist der Unterschied eindeutig – dieselbe dreizeilige Tabelle misst mit \hline 37,20pt, mit booktabs 47,14pt. Gleicher Inhalt, rund 10pt mehr Weiß.

Die Vorgaben stehen in booktabs.sty: \heavyrulewidth=.08em (für \toprule und \bottomrule), \lightrulewidth=.05em (\midrule), \cmidrulewidth=.03em (\cmidrule). In einem 10pt-Dokument gemessen sind das 0,80002pt, 0,50003pt und 0,29999pt – ein Satz, der die 0,4pt von \hline von oben und unten einfasst. Die Eleganz liegt in der Einheit: Da alles in em angegeben ist, erhält ein 11pt-Dokument eine 0,876pt starke schwere Linie und ein 12pt-Dokument 0,94pt; die Linien werden also proportional zur Schrift stärker. \arrayrulewidth bleibt dagegen klassenunabhängig bei 0,4pt, womit \hline schon allein deshalb nicht zum eigenen Text passt. Beim Abstand gilt \aboverulesep=.4ex (1,72218pt bei 10pt) und \belowrulesep=.65ex (2,79857pt). Ein einzelnes \midrule fügt der Zeile somit 0,5+1,72+2,80 = 5,02pt hinzu – mehr als das Zwölffache der 0,4pt von \hline.

latex
\usepackage{booktabs}

% \toprule goes right after \begin{tabular}{...}; the rest follow a row's \\
\begin{tabular}{@{}llr@{}}
  \toprule
  \multicolumn{2}{c}{Fruit} \\
  \cmidrule(lr){1-2}
  Kind & Grade & Price \\
  \midrule
  Apple  & premium & 380 \\
  Orange & second  & 120 \\
  \addlinespace
  Total  &         & 500 \\
  \bottomrule
\end{tabular}

Die kleine Lücke vor der Summenzeile stammt von \addlinespace. Nach dem \\ einer Zeile platziert, fügt es \defaultaddspace ein (.5em, also 5pt in einem 10pt-Dokument); mit \addlinespace[1ex] lässt sich der Betrag angeben. Das drückt die Absicht klarer aus, als eine Zeile mit \\[2pt] zu strecken, und neben einer Linie steuert es den Abstand exakt. Nur wenn Stärke sowie Abstand oben und unten vollständig selbst bestimmt werden sollen, greift man zu \specialrule{width}{above}{below} (alle drei Argumente sind Pflicht) – ein Befehl für Ausnahmefälle; die drei üblichen Linien genügen sonst. Linien müssen an einer Zeilengrenze stehen: Ein \toprule mitten in einer Zelle bricht mit ! Misplaced \noalign. ab, denn wie \hline arbeiten diese Befehle innerhalb von \noalign.

Befehl / LängeRolleVorgabe (gemessen im 10pt-Dokument)
\topruleLinie ganz oben in der Tabelle\heavyrulewidth = .08em = 0,80002pt
\midruleLinie zwischen Kopf und Körper\lightrulewidth = .05em = 0,50003pt
\bottomruleLinie ganz unten in der Tabelle\heavyrulewidth = .08em = 0,80002pt
\cmidrule(lr){a-b}Teillinie nur über die Spalten a–b\cmidrulewidth = .03em = 0,29999pt; Beschnitt \cmidrulekern = .5em = 5pt
\aboverulesepAbstand oberhalb jeder Linie.4ex = 1,72218pt
\belowrulesepAbstand unterhalb jeder Linie.65ex = 2,79857pt
\addlinespaceZusätzlicher Abstand zwischen zwei Zeilen\defaultaddspace = .5em = 5pt
\specialruleLinie mit explizit angegebener Stärke und beiden AbständenAlle drei Argumente Pflicht (keine Vorgaben)

Nebenbei: Dass \heavyrulewidth die Stärke eine „width“ nennt, ist kein sprachlicher Ausrutscher. booktabs.dtx enthält eigens eine Anmerkung zur Terminologie: Im britischen Satz heiße eine Linie stets „rule“, und deren Dicke werde „oft als ihre width bezeichnet“ – wo, wie der Autor trocken hinzufügt, so ziemlich jeder andere bei einer waagerechten Linie von depth oder height spräche. Diesen Fachjargon übernahm er unverändert in die Befehlsnamen. Und noch etwas: Die mit TeX Live 2024 ausgelieferte Version von booktabs lautet 1.61803398 – φ, der goldene Schnitt. Eine Fußnote auf dem Titel der .dtx sagt in den Worten des Autors, die Versionsnummer „konvergiere gegen phi, den goldenen Schnitt“, mit einer weiteren Ziffer pro Release. Die Zusammenfassung nennt 1.618, 1.6180, 1.61803 und 1.618033, und eine Fußnote hält fest, dass diese Fehlerkorrekturen von Danie Els in Abwesenheit des Autors herausgegeben wurden.

Der Unterschied zwischen \cline und \cmidrule

Der sichtbare Unterschied liegt in Abstand und Endenbehandlung. An derselben zweizeiligen Tabelle gemessen, fügt \cline{2-3} 0,0pt Höhe hinzu, \cmidrule{2-3} dagegen 4,82pt (0,29999pt Linie plus \aboverulesep 1,72218pt plus \belowrulesep 2,79857pt). Deshalb wirkt ein \cline, als bisse es in die Buchstaben. Der zweite Unterschied sind die Enden. Ein \cmidrule reicht standardmäßig über die volle Spaltenbreite und stößt so an eine benachbarte Teillinie; man gibt ihm daher in Klammern einen Beschnitt: (l), (r) und (lr) ziehen das linke, rechte oder beide Enden um \cmidrulekern (.5em = 5pt) zurück, und der Betrag lässt sich angeben, etwa (r{.75em}). Die vollständige Syntax lautet \cmidrule, danach die Stärke in eckigen Klammern, der Beschnitt in runden Klammern und {a-b}. Als Faustregel: Unter ein \multicolumn, das Spaltenköpfe gruppiert, gehört fast immer ein \cmidrule(lr){…}.

Mischen darf man sie aber nicht. Der Autor schreibt unmissverständlich, die booktabs-Linien seien „nicht garantiert mit \hline oder \cline verträglich … ich sehe keinen Grund, sie mischen zu wollen“. Tatsächlich sind die Linien so gebaut, dass sie sich nicht mit dem | einer Spaltenspezifikation verbinden – und die Dokumentation nennt das ein Feature. Nur wenn eine doppelte Teillinie auf einer Höhe wirklich nötig ist, setzt man \morecmidrules zwischen zwei \cmidrule (\cmidrule{1-2}\morecmidrules\cmidrule{1-2}; der Abstand ist \cmidrulesep, standardmäßig dieselben 2pt wie \doublerulesep). Da Doppellinien ohnehin nicht empfohlen sind, ist auch das kein Alltagswerkzeug.

Warum vertikale Linien tabu sind

Das booktabs-Handbuch formuliert das im Imperativ und ohne Einschränkung. Man liege nicht weit daneben, heißt es, wenn man sich jederzeit zwei einfache Leitlinien merke: „1. Verwende niemals, wirklich niemals vertikale Linien. 2. Verwende niemals doppelte Linien.“ Und weiter: „Diese Leitlinien mögen extrem erscheinen, aber ich habe nie ein gutes Argument dafür gefunden, sie zu brechen.“ Unterscheidet sich die linke Hälfte einer Tabelle so stark von der rechten, dass man eine Linie dazwischen wünscht, lautet die Antwort des Autors: dann nimm zwei Tabellen. An anderer Stelle sagt er es noch kürzer: Vertikale Linien gehören nicht in Tabellen, Ende der Geschichte.

Dasselbe Dokument führt drei weitere Leitlinien auf, die der Autor als „außerhalb des Kreises professioneller Setzer und Redakteure allgemein unbekannt“ einleitet – und sie sind ausgesprochen praktisch. Die Einheiten gehören in den Spaltenkopf, nicht in den Tabellenkörper. Vor einem Dezimalpunkt steht immer eine Ziffer0.1, nicht .1. Keine Wiederholungszeichen („dito“) und nichts dergleichen: Meist genügt ein Leerfeld, und wo nicht, wiederholt man den Wert. Der Autor ist ehrlich mit den Grenzen seiner eigenen Regeln und merkt zur zweiten Leitlinie an, er habe „für einen Verlag gearbeitet, der auf einer doppelten leichten Linie über einer Summenzeile bestand. Aber meine Wahl wäre das nicht gewesen.“ Die Leitlinien sind keine Absolutheiten; man bricht sie mit Grund.

hhline – festlegen, wie Linien einander kreuzen

hhline zieht dieselben waagerechten Linien wie \hline, erlaubt aber, Zeichen für Zeichen festzulegen, ob eine senkrechte Linie an der Kreuzung unterbrochen wird oder glatt hindurchläuft. Es stammt von David Carlisle aus dem tools-Bündel von LaTeX und wird mit \usepackage{hhline} geladen. Bei einem schlichten \hline\hline lässt sich nicht wählen, ob eine senkrechte Linie an der Doppellinie bricht oder durchgeht. Da booktabs weder vertikale noch doppelte Linien empfiehlt, kommt hhline nur dort zum Zug, wo diesem Rat nicht zu folgen ist: eine Zeitschriftenvorlage mit vorgeschriebenem Format, ein nachzubildendes Dokument, eine Rechnungstabelle. Sonst braucht man es nicht.

Das Argument von \hhline{…} ist eine Folge von Zeichen, die stark an eine Spaltenspezifikation erinnert. Waagerecht: = ist eine Doppellinie in Spaltenbreite, - eine einfache Linie, ~ keine Linie in dieser Spalte. Senkrecht: | ist eine vertikale Linie, die die Linie durchschneidet, : eine, die von ihr unterbrochen wird, und # ein Abschnitt Doppellinie zwischen zwei vertikalen Linien. Für Ecken gibt es t (obere Hälfte eines Doppellinienabschnitts) und b (untere Hälfte): |t: ergibt die linke obere, :b| die rechte untere Ecke. Auch die Wiederholungsform *{n}{…} aus den Spaltenspezifikationen steht zur Verfügung. Zu beachten: Eine doppelte senkrechte Linie (|| oder ::) unterbricht die waagerechten Linien an dieser Stelle; soll eine glatt durchlaufen, nimmt man # oder verzichtet ganz auf die vertikalen Angaben.

latex
\usepackage{hhline}

% the example from the package documentation: t/b build the corners,
% ~ leaves a column unruled, # is a double-rule segment between verticals
\begin{tabular}{||cc||c|c||}
  \hhline{|t:==:t:==:t|}
  a & b & c & d \\
  \hhline{|:==:|~|~||}
  1 & 2 & 3 & 4 \\
  \hhline{#==#~|=#}
  i & j & k & l \\
  \hhline{||--||--||}
  w & x & y & z \\
  \hhline{|b:==:b:==:b|}
\end{tabular}

Die erste Zeile |t:==:t:==:t| baut die oberen Hälften der Doppellinien samt Ecken, die letzte |b:==:b:==:b| die unteren; so schließt der doppelt gezogene Rahmen sauber an die senkrechten Linien an. Die mittleren Zeilen mischen ~ (keine Linie) und # (ein Doppellinienabschnitt zwischen zwei Senkrechten) und variieren Zeile für Zeile, wo unterbrochen und wo durchgezogen wird. Zum Schluss ein technischer Vorbehalt: Ein \hline ist eine einzige TeX-\hrule, eine \hhline-Linie dagegen aus vielen kleinen Abschnitten zusammengesetzt. Im DVI sitzen sie exakt, doch manche Betrachter und Treiber setzen die Abschnitte nicht ganz bündig aneinander. Die Dokumentation rät, einen anderen Treiber zu probieren oder \arrayrulewidth leicht zu erhöhen, damit die Nähte verschwinden.

Welches Werkzeug wofür

Das Fazit ist fast einstimmig: booktabs als Standard für gewöhnliche Tabellen. Die drei Linien \toprule, \midrule und \bottomrule sowie bei Bedarf ein \cmidrule(lr){…} unter einer Kopfgruppe ergeben die sparsamen, gut lesbaren Tabellen, die man aus Zeitschriften kennt. Wer „keine vertikalen, keine doppelten Linien“ befolgt, muss über Linien gar nicht mehr nachdenken.

  • booktabs – erste Wahl für nahezu jede Tabelle: nur waagerechte Linien, Stärke und Abstände bereits abgestimmt, Publikationsqualität.
  • Standard-\hline / \cline / | – praktisch, weil ohne Paket verfügbar; brauchbar für gitterartige Tabellen und schnelle Entwürfe. Auf zu viele Linien achten.
  • hhline – nur für den Sonderfall, in dem die Kreuzung doppelter und senkrechter Linien exakt gesteuert werden muss. Kein Alltagswerkzeug.
  • Wenn der Wunsch nach einer weiteren Linie aufkommt – zuerst prüfen, ob \addlinespace die Zeilengruppe ebenso gut markiert. Weißraum ist leichter als eine Linie und leistet dasselbe.

Vor den Linien legen Anordnung und Ausrichtung der Spalten das Gerüst einer Tabelle fest. Die Grundlagen von & und \\ sowie das Lesen von Extra alignment tab und Misplaced \noalign stehen unter „tabular-Grundlagen“. Die Feinheiten der Spaltenspezifikation samt p{width} und >{…} behandelt „Spaltenspezifikation, Ausrichtung und Breite“. Mehrstufige Köpfe aus \multicolumn und \cmidrule finden sich unter „Zellen verbinden“. Die Tabelle in eine table-Umgebung zu setzen und zu betiteln, gehört zu „Tabellenplatzierung und Gestaltung“.