Grundlagen von tabular

Das &, das man in einer Tabelle tippt, ist für LaTeX kein Kaufmanns-Und. Es ist ein Zeichen mit besonderem Kategoriecode – Nummer 4, von TeX alignment tab genannt. Deshalb lautet die Fehlermeldung bei falscher Spaltenzahl ! Extra alignment tab has been changed to \cr. – formuliert mit einem Wort, das auf dem Bildschirm nirgends steht. Diese Seite geht die drei Konventionen der tabular-Umgebung durch – Zellen mit & trennen, Zeilen mit \\ schließen, Linien mit \hline ziehen – und zeigt zugleich die Mechanik darunter. Ist sie erst sichtbar, verwandeln sich die beiden Fehler, die jeder Anfänger trifft, Extra alignment tab und Misplaced \noalign, von Rätseln in Anweisungen.

Die drei Zeichen der tabular-Umgebung: &, \\ und \hline

Im Rumpf einer tabular haben nur drei Zeichen Bedeutung. & trennt Zellen innerhalb einer Zeile, \\ schließt eine Zeile ab, und \hline zieht an dieser Stelle eine horizontale Linie über die volle Tabellenbreite. \begin{tabular} nimmt unmittelbar danach ein Pflichtargument, die Spaltendeklaration. \begin{tabular}{ccc} erklärt „drei zentrierte Spalten“, und die dort festgelegte Spaltenzahl ist das Gerüst der ganzen Tabelle. Leerzeichen um & werden ignoriert, im Quelltext darf man sie also zum Ausrichten der Zellen einsetzen.

latex
\begin{tabular}{ccc}
  \hline
  A & B & C \\
  D & E & F \\
  \hline
\end{tabular}

\\ ist kein tabellenspezifisches Zeichen, sondern LaTeX’ allgemeiner Zeilenumbruchsbefehl. Dasselbe Zeichen dient in pmatrix und align als Zeilentrenner, sodass sich die Gewohnheit „Spalten mit & ausrichten, Zeilen mit \\ umbrechen“ direkt von Tabellen auf Formeln überträgt. Das \\ nach der letzten Zeile darf entfallen; soll darunter jedoch eine Linie stehen, muss die Zeile erst mit \\ geschlossen und dann \hline gesetzt werden – lässt man es weg, landet man geradewegs beim Misplaced \noalign weiter unten. \\ nimmt außerdem ein optionales Argument in eckigen Klammern: \\[2pt] fügt zusätzlichen vertikalen Abstand unter der Zeile ein, ein negativer Wert zieht zusammen.

\begin{tabular} nimmt vor der Spaltendeklaration außerdem ein optionales Argument für die vertikale Position in eckigen Klammern. \begin{tabular}[t]{…} richtet die Oberkante der Tabelle an der Grundlinie der umgebenden Zeile aus, [b] die Unterkante; standardmäßig wird die vertikale Mitte ausgerichtet. Dabei lauert eine Falle: Beginnt oder endet die Tabelle mit \hline, erfolgt die Ausrichtung an der Linie, und das Ergebnis entspricht nicht der Erwartung. Genau dafür stellt das Paket array \firsthline und \lasthline bereit – anstelle von \hline gesetzt, richtet sich die Tabelle korrekt an ihrer ersten bzw. letzten Textzeile aus.

Extra alignment tab has been changed to \cr – die Spaltenzahl stimmt nicht

Dieser Fehler bedeutet genau eines: in der Zeile stehen mehr & als die Spaltendeklaration vorsieht. Wer in einer mit {ll} deklarierten Tabelle A & B & C schreibt, sieht ihn garantiert. TeX fängt sich, indem es das überzählige & als Zeilenende (\cr) liest und weiterläuft – es verschwindet also nichts, man erhält stattdessen eine verrutschte Tabelle. Meist hat man sich schlicht verzählt, doch drei feinere Ursachen sind häufig: ein & in einer Zeile, in der \multicolumn{3}{c}{…} bereits alle drei Spalten aufgebraucht hat; ein \\ innerhalb einer Zelle; und >{\raggedright} aus array an der letzten Spalte. Letzteres beißt, weil \raggedright das \\ umdefiniert: Der Zeilenabschluss wirkt nicht mehr, das & der nächsten Zeile läuft über und erzeugt denselben Fehler – >{\raggedright\arraybackslash} behebt es.

Zu wenige & bleiben dagegen stumm. Fehlende Zellen werden schlicht leer gesetzt, ohne Fehler und ohne Warnung; wenn eine Tabelle sichtbar verrutscht, aber sauber durchläuft, gilt der erste Verdacht einem vergessenen &. Noch ein Hinweis: Steht ein unbekannter Buchstabe in der Spaltendeklaration, hängt der Wortlaut des Fehlers vom geladenen Paket ab. Reines LaTeX meldet ! LaTeX Error: Illegal character in array arg., mit geladenem array dagegen ! Package array Error: Illegal pream-token. Welche der beiden erscheint, verrät, auf welcher Implementierung die Tabelle gerade läuft.

Misplaced \noalign – \hline passt nur zwischen Zeilen

Fast immer steckt dahinter dasselbe: \hline geschrieben, ohne die Zeile mit \\ geschlossen zu haben. Lässt man das \\ nach der letzten Zeile weg und schreibt gleich \hline, zeigt das Protokoll von TeX Live 2024 drei Fehler in Folge – ! Misplaced \noalign., ! You can't use \hrule here except with leaders. und ! Missing number, treated as zero.. Alle drei entspringen einer einzigen Ursache. Sie liegt in der Definition von \hline selbst: In latex.ltx steht \def\hline{\noalign{…\hrule \@height \arrayrulewidth …}}. \noalign ist ein TeX-Primitiv und bedeutet ausschließlich „dieses Material zwischen die Zeilen einer Ausrichtung einfügen“. Mitten in einer Zeile aufgerufen hat es keinen Platz, und so fallen \noalign und danach sein eigentlicher Inhalt \hrule nacheinander blank heraus.

latex
% WRONG: the last row was never closed, so \hline has no gap to sit in
\begin{tabular}{ll}
  A & B \\
  C & D
  \hline
\end{tabular}

% RIGHT: close the row first, then draw the rule
\begin{tabular}{ll}
  A & B \\
  C & D \\
  \hline
\end{tabular}

Aus demselben Grund erzeugt ein \hline innerhalb einer Zelle genau dasselbe Fehlertrio. Umgekehrt ist ein allein stehendes \hline direkt nach einem \\ immer unbedenklich, und selbst \hline \\, das eine leere Zeile erzeugt, ist kein Fehler – es fügt nur sichtbaren Zwischenraum ein. Rund um tabular taucht außerdem ständig ! LaTeX Error: \caption outside float. auf, die klassische Folge eines \caption innerhalb von tabular: Wie der nächste Abschnitt zeigt, ist die Überschrift Sache von table. Ein vergessenes \end{tabular} liefert das freundlichere ! LaTeX Error: \begin{tabular} on input line N ended by \end{document}., das sogar die Zeilennummer nennt.

Linien ziehen – und welche man besser weglässt

Horizontale Linien liefert \hline, vertikale entstehen durch ein | in der Spaltendeklaration. {|l|c|r|} setzt Linien an die Außenkanten und zwischen alle drei Spalten; zusammen mit \hline wird jede Zelle zum Kästchen eines Rasters. \hline\hline ergibt eine Doppellinie, deren Abstand die Länge \doublerulesep bestimmt (Vorgabe 2pt). Die Liniendicke ist die Länge \arrayrulewidth, in den Standardklassen 0,4pt. \cline{2-3} nimmt einen Bereich von Spaltennummern und zieht die Linie nur über einen Teil der Breite. Damit sind alle Linien genannt, die Standard-LaTeX zeichnen kann.

SchreibweiseWirkungHinweise
&Trennt Zellen einer ZeileKategoriecode 4; zu viele ergeben Extra alignment tab
\\Schließt eine ZeileGleiche Rolle in align und pmatrix
\\[2pt]Fügt unter der Zeile Abstand einNegativer Wert zieht zusammen
\hlineHorizontale Linie über die volle BreiteDicke ist \arrayrulewidth (0,4pt)
\hline\hlineDoppelte horizontale LinieAbstand ist \doublerulesep (2pt)
\cline{2-3}Linie nur über Spalte 2 bis 3Übliches Mittel unter verbundenen Zellen
|Vertikale Linie in der SpaltendeklarationIn formalen Tabellen besser vermeiden
||Doppelte vertikale LinieDer Abstand ist ebenfalls \doublerulesep

Von den eben genannten Mitteln gilt im professionellen Satz jedoch: vertikale Linien und Doppellinien sollte man gar nicht verwenden. Das Handbuch zu booktabs, Publication quality tables in LaTeX von Simon Fear (die Fassung in TeX Live 2024 ist vom 12. Januar 2020 überarbeitet), nennt zwei Leitlinien: „1. Never, ever use vertical rules. 2. Never use double rules.“ Der Autor geht so weit zu schreiben, dass man zwei Tabellen nehmen solle, wenn sich die linke Hälfte so stark von der rechten unterscheidet, dass eine Trennlinie nötig scheint – und fügt ehrlich hinzu, er habe einmal für einen Verlag gearbeitet, der über der Summenzeile eine doppelte feine Linie verlangte, „but this would not have been my choice“. Empfohlen wird stattdessen: horizontale Linien unterschiedlicher Dicke und reichlich Abstand darüber und darunter.

Entscheidend ist: Diese Leitlinien gelten nicht für jede Tabelle. Fear zieht ausdrücklich eine Grenze zwischen der formal table – einer Menge von Werten in beschrifteten Spalten – und dem tableau, jenem einmaligen Layout, das vermutlich voller Symbole steckt und auch Farbe verwendet; die beiden Leitlinien betreffen ausdrücklich Ersteres. Das Layout einer formalen Tabelle sei über Jahrhunderte hinweg gewachsen und solle nur in außergewöhnlichen Fällen verändert werden. Umgekehrt gelesen: Ein Raster um einen Stundenplan oder ein Oberflächenschema fällt gar nicht in den Geltungsbereich. Für eine Zahlentabelle in einem Aufsatz ist heute booktabs mit \toprule, \midrule und \bottomrule der Standard – ausführlich auf der Seite „Linien und publikationsreife Tabellen“.

Wirken die Zeilen gedrängt und scheinen die Linien die Buchstaben zu berühren, hilft am schnellsten ein größerer Zeilenhöhenfaktor: \renewcommand{\arraystretch}{1.2} (Vorgabe ist 1). Der Abstand zwischen Spalten ist die Länge \tabcolsep, standardmäßig 6pt je Seite, zwischen zwei Spalten also 12pt. Mit geladenem Paket array steht zusätzlich \setlength{\extrarowheight}{2pt} bereit – es vergrößert nur die Höhe jeder Zeile und lässt die Tiefe unverändert, genau das richtige Mittel gegen Linien, die die Oberkanten der Großbuchstaben streifen.

tabular und table: Eine Tabelle ist kein Float

tabular setzt den Inhalt einer Tabelle und sonst nichts: keine Nummer, keine Beschriftung, kein Mitspracherecht bei der Platzierung. Es wird wie ein Stück Text behandelt und kann daher mitten im Absatz, in einem Listeneintrag, sogar in einer Fußnote stehen. table dagegen ist ein Float. Man legt es um ein tabular und erhält eine automatisch nummerierte Überschrift über \caption{…}, Querverweise über \label{…} und \ref{…} sowie Platzierungsangaben wie [htbp]. Ein \caption innerhalb von tabular liefert ! LaTeX Error: \caption outside float. – dieselbe Arbeitsteilung, in eine Fehlermeldung übersetzt.

document.tex
\begin{table}[htbp]
  \centering
  \caption{Quarterly sales}
  \label{tab:sales}
  \begin{tabular}{lrr}
    \hline
    Quarter & Sales & YoY \\
    \hline
    Q1 & 1{,}200 & +5\% \\
    Q2 & 1{,}350 & +8\% \\
    \hline
  \end{tabular}
\end{table}

% ... and refer to it from the running text:
See Table~\ref{tab:sales}.

Der Grund, daraus einen Float zu machen, ist weniger die Nummerierung als der Umstand, dass ein tabular nicht über Seiten umbrechen kann. Es wird als ein großer Kasten gesetzt; passt er nicht mehr auf den Rest der Seite, wandert er als Ganzes auf die nächste und hinterlässt eine Lücke. In einem table kann LaTeX diesen Kasten an den Kopf einer späteren Seite verschieben und die Lücke mit Text füllen. [htbp] ist eine Wunschliste – hier, Seitenanfang, Seitenende, eigene Seite – und LaTeX probiert die Positionen in dieser Reihenfolge. Eine Tabelle, die auf keine Seite passt, lässt sich gar nicht als Float behandeln; das ist die Aufgabe von longtable, das über Seiten hinweg umbricht.

Eine Tabelle mit langem Text: ohne p{width} läuft sie aus dem Satzspiegel

Die drei Typen l, c und r verbreitern die Spalte nur auf ihre natürliche Inhaltsbreite und brechen innerhalb der Zeile nie um. Setzt man eine lange Beschreibung direkt in eine l-Spalte, dehnt sich diese auf die Breite jener einen Zeile und schiebt die Tabelle aus dem Satzspiegel. Man erhält die Warnung Overfull \hbox (…pt too wide) – eine Warnung, kein Fehler, das Dokument übersetzt also weiterhin, und man merkt es erst beim Blick ins PDF. Genau das macht diesen Fehler lästig. Wird Umbruch gebraucht, bietet reines tabular genau einen Typ: p{width}. Er setzt die Zelle als Absatzbox der angegebenen Breite, und was darüber hinausgeht, fließt automatisch in weitere Zeilen.

latex
\begin{tabular}{l p{5cm} r}
  \hline
  Item & Description & Price \\
  \hline\hline
  Apple  & A large honey-cored variety, popular as a gift. & 380 \\
  Orange & A small, sweet citrus that peels by hand.       & 120 \\
  \hline
\end{tabular}

Spalte 1 ist linksbündig in natürlicher Breite, Spalte 3 rechtsbündig, und nur Spalte 2 ist eine 5cm breite p-Spalte. Die lange Beschreibung bricht bei diesen 5cm um, nur diese Zelle wird mehrzeilig, und die Zeile wächst entsprechend in der Höhe. Derselbe Satz in einer l-Spalte dehnt sich dagegen ohne Umbruch seitwärts – der entscheidende Unterschied, den p{width} macht. Unter der Kopfzeile steht eine Doppellinie \hline\hline, oben und unten je eine einfache \hline. Der Inhalt einer p-Spalte ist standardmäßig oben ausgerichtet und im Blocksatz, und der Absatzeinzug \parindent steht darin auf 0. Soll die Zelle vertikal mittig oder unten stehen oder linksbündig statt im Blocksatz gesetzt werden, ist man im Gebiet von array – behandelt auf „Spaltentypen im Detail“.