Tabellenplatzierung und Gestaltung

Es ist keine Einbildung, dass eine Tabellenüberschrift wie an die Tabelle geklebt wirkt. Die Standardklassen von LaTeX setzen \abovecaptionskip auf 10pt und \belowcaptionskip auf 0pt – in article, report und book gleichermaßen –, und diese Vorgaben sind für Abbildungen abgestimmt. Da die Caption einer Tabelle konventionell darüber steht, landet die Seite mit Luft oben und die Nullseite berührt die Tabelle. Daher der gedrängte Eindruck. Diese Seite behandelt alles um das tabular herum: Platzierung und Beschriftung über die table-Umgebung, den Umgang mit Tabellen, die breiter als die Seite sind, das Drehen ins Querformat und threeparttable für Anmerkungen. Der Aufbau des Inhalts selbst gehört zu „tabular-Grundlagen“ und „Spaltenspezifikation, Ausrichtung und Breite“.

Warum Tabellen gleiten – der Unterschied zwischen table und tabular

Weil eine Tabelle nicht über eine Seitengrenze gebrochen werden kann. Was tabular baut, ist eine große Box, und eine Box lässt sich an einer Seitengrenze nicht teilen. Würde LaTeX sie genau an der Quelltextstelle setzen und der verbleibende Platz reichte nicht, entstünde eine Lücke oder eine zerstörte Seite. Deshalb behandelt es Tabellen und Abbildungen als Floats, löst sie vom laufenden Text und schickt sie dorthin, wo sie passen. Das Werkzeug dafür ist die table-Umgebung: Man legt ein tabular hinein, gibt ihm mit \caption{…} eine nummerierte Überschrift wie „Tabelle 1“ und macht es mit \label{…} und \ref{…} referenzierbar. Im Fließtext schreibt man dann eine Referenz per Nummer – „wie Tabelle~\ref{tab:sales} zeigt“ –, und gleich um wie viele Seiten die Tabelle wandert, die Nummer stimmt. Das ~ ist ein geschütztes Leerzeichen, das Wort und Nummer nicht am Zeilenende trennt.

document.tex
\usepackage{booktabs}
\usepackage{float}   % needed only for the [H] specifier

\begin{table}[htbp]
  \centering
  \caption{Quarterly sales}
  \label{tab:sales}          % \label always AFTER \caption
  \begin{tabular}{@{}lrr@{}}
    \toprule
    Quarter & Sales & YoY \\
    \midrule
    Q1 & 1{,}200 & +5\% \\
    Q2 & 1{,}350 & +8\% \\
    \bottomrule
  \end{tabular}
\end{table}

% in the body: as Table~\ref{tab:sales} shows ...

Der Unterschied zwischen den Angaben [htbp] und [H]

[htbp] ist eine Menge erlaubter Orte, [H] dagegen die Anweisung, nicht mehr zu gleiten. In den eckigen Klammern direkt nach \begin{table} listet man h (hier), t (Seitenanfang), b (Seitenende) und p (reine Float-Seite) auf. Ohne Angabe ist die Vorgabe in article wie in book tbph ist also von vornherein kein Kandidat. Entscheidend ist: Die geschriebene Reihenfolge ändert nicht die Reihenfolge der Versuche. LaTeX prüft immer t, dann b, dann p; [htbp] und [bpht] verhalten sich folglich gleich. Die Klammern sind keine Präferenzangabe, sondern eine Aufzählung von Erlaubnissen.

Ein vorangestelltes !, etwa [!ht], bedeutet: „Nur für diesen Float die internen Grenzen ignorieren und die Platzierung versuchen“ – es heißt nicht „hier setzen“. Diese internen Grenzen sind konkrete Zahlen: In article gelten \topfraction = 0,7 (Anteil der Seite, den Floats oben einnehmen dürfen), \bottomfraction = 0,3, \textfraction = 0,2 (Mindestanteil für den Fließtext), \floatpagefraction = 0,5 (Schwelle für eine reine Float-Seite) sowie höchstens zwei Floats oben, einer unten und drei insgesamt pro Seite (\topnumber, \bottomnumber, \totalnumber). Erscheint eine Tabelle partout nicht, liegt es meist an einer dieser Grenzen, und ! lockert lediglich die Prüfung. Soll sie wirklich festgenagelt werden, dient [H] aus dem Paket float: Mit \usepackage{float} sorgt \begin{table}[H] dafür, dass die Tabelle nicht mehr gleitet und genau an der Quelltextstelle gesetzt wird – was am Seitenfuß eine große Lücke hinterlassen kann. H als „Float, der nicht floatet“ zu lesen, erspart manche Überraschung.

AngabeBedeutungZugehörige Vorgabe
hHier, an der Quelltextstelle. h allein ist unzulässig; t wird ergänztNicht Teil der Vorgabe tbp
tOben auf einer Textseite\topfraction = 0,7, \topnumber = 2
bUnten auf einer Textseite\bottomfraction = 0,3, \bottomnumber = 1
pReine Float-Seite ohne Fließtext\floatpagefraction = 0,5
!Nur für diesen Float die obigen Anteile und Anzahlen ignorieren. Keine PositionBetrifft auch \textfraction = 0,2 und \totalnumber = 3
HNicht mehr gleiten, an Ort und Stelle fixieren. Benötigt das Paket floatKeine Angabe des Standard-LaTeX

Caption über der Tabelle, unter der Abbildung – und \label nach \caption

Diese beiden Punkte verursachen die meisten Caption-Pannen. \caption{…} gibt einem Float eine nummerierte Überschrift, in article als „Tabelle 1:“, in book als „Tabelle 1.1:“. Tabellen und Abbildungen haben getrennte Zähler, ihre Nummern vermischen sich also nie. Mit dem optionalen Argument \caption[kurz]{vollständige Caption} erscheint im Tabellenverzeichnis die Kurzform, im Text die vollständige. Und da \caption den Zähler erhöht, muss \label nach \caption stehen; umgekehrt zeigt \ref auf die vorherige Nummer – stillschweigend, ohne Fehlermeldung. Zur Platzierung: Üblich ist die Caption über der Tabelle und unter der Abbildung. Man liest die Überschrift einer Tabelle, bevor man in die Daten geht, betrachtet aber eine Abbildung, bevor man die Erklärung liest. In LaTeX steht die Caption oben, wenn \caption vor dem tabular geschrieben wird, und unten, wenn es danach steht.

Hier zahlt sich die Messung vom Anfang aus. In den Standardklassen beträgt \abovecaptionskip 10pt und \belowcaptionskip 0pt; die Luft sitzt also nur außen an der Caption, und zwischen Caption und Float-Körper steht nichts. Bei einer Abbildung, deren Caption unten steht, ist das in Ordnung; bei einer Tabelle, deren Caption oben steht, berührt die Caption die Tabelle. Es gibt zwei Abhilfen. In reinem LaTeX deklariert man \setlength{\belowcaptionskip}{6pt}. Mit dem Paket caption schreibt man \usepackage[skip=6pt]{caption} oder beschränkt es mit \captionsetup[table]{skip=6pt} auf Tabellen. Die Gestaltung der Caption selbst – Schrift, Trenner, Breite – ist ebenfalls Sache des Pakets caption und wird auf der Seite „Captions und Subfigures“ ausgeführt.

Zum Zentrieren des Inhalts dient \centering. In einem Float ist \centering üblich, nicht die Umgebung center (\begin{center}…\end{center}): center fügt oben und unten zusätzlichen vertikalen Abstand ein, \centering ist nur eine Deklaration und fügt nichts hinzu. Soll die Tabelle statt zentriert am rechten Rand stehen, setzt man \hfill vor den Inhalt; der gesamte waagerechte Überschuss sammelt sich dann links. Bemerkenswert: \centering innerhalb eines Floats ist unbedenklich, \centering innerhalb einer p{width}-Spalte dagegen nicht – ist diese die letzte Spalte der Tabelle, bricht der Zeilenabschluss \\, und man erhält ! Extra alignment tab has been changed to \cr. Wie mit einem in die Spaltenspezifikation geschriebenen \centering umzugehen ist, behandelt „Spaltenspezifikation, Ausrichtung und Breite“.

Wenn eine LaTeX-Tabelle breiter als der Text ist

Bevor irgendetwas verkleinert wird: messen, wohin die Breite geht. Spalten vom Typ l, c und r brechen nicht um, daher überläuft eine Tabelle mit vielen Spalten die \textwidth. Der Überhang besteht aber meist nicht aus Buchstaben, sondern aus dem Raum zwischen den Spalten. Ein realer Fall: Eine booktabs-Tabelle mit zwölf Spalten, einer Kopf- und einer Datenzeile misst 412,95pt, während \textwidth im voreingestellten article 345pt beträgt – 68pt Überhang. Dieselbe Tabelle mit \tabcolsep = 0pt gesetzt, ergibt 268,95pt; die Differenz beträgt genau 144pt, nämlich 2 × 12 Spalten × 6pt. Mit anderen Worten: 35 % der Tabellenbreite waren Zwischenraum, nicht Text.

Diese Einsicht ändert die Reihenfolge der Abhilfen. Der übliche Rat, die Schrift eine Stufe kleiner zu setzen, ergibt für dieselbe Tabelle 392,77pt bei \small und 372,55pt bei \footnotesize – beides erreicht 345pt nicht. Der Grund: \tabcolsep ist eine Länge und skaliert nicht mit der Schrift, die 144pt Zwischenraum überstehen die kleinere Schrift also unverändert. Halbiert man sie mit \setlength{\tabcolsep}{3pt}, kommt die Tabelle auf 340,95pt – sie passt, bei voller Textgröße. \small zusammen mit \tabcolsep = 4pt ergibt 344,77pt. Die Reihenfolge lautet also: zuerst der Zwischenraum, dann die Schriftgröße, zuletzt das Skalieren.

latex
\usepackage{graphicx}   % for \resizebox

% 1. trim the padding first -- \tabcolsep is 6pt on EACH side of EVERY column
\begingroup
\setlength{\tabcolsep}{3pt}
\begin{tabular}{@{}lrrrrrrrrrrr@{}}  % @{} also removes the outer 2 x 6pt
  ...
\end{tabular}
\endgroup

% 2. only then consider a smaller size, or scaling as a last resort
\resizebox{\textwidth}{!}{%
  \begin{tabular}{lrrrrr}
    ...
  \end{tabular}%
}

Auch @{} an beiden Enden der Spaltenspezifikation entfernt den äußeren \tabcolsep und richtet die Tabelle am linken Textrand aus – gemessen genau 2 × 6pt = 12pt. Das ist die vertraute Schreibweise in booktabs-Tabellen. Reicht all das nicht, bleibt als letztes Mittel \resizebox{Breite}{Höhe}{Material} aus graphicx, wobei ein ! für einen der beiden Werte proportional skaliert. Allerdings skaliert es den Inhalt: Schickt man die obige Tabelle durch \resizebox{\textwidth}{!}, beträgt der Faktor 345 ÷ 412,95 = 0,836; aus 10pt-Schrift werden etwa 8,4pt, aus dem 0,8pt starken \toprule 0,67pt. Weder Schrift noch Linien passen dann noch zum umgebenden Text – also als Notlösung behandeln. Statt \resizebox bietet adjustbox eine Umgebungsform: \begin{adjustbox}{width=\textwidth}…\end{adjustbox}. Sollen die Zeilen etwas luftiger stehen, macht \renewcommand{\arraystretch}{1.2} (Vorgabe ist 1) eine dreizeilige Tabelle im 10pt-Dokument um 0,2 × 3 × 12pt = 7,2pt höher.

Passt es dann immer noch nicht, ist es Zeit, das Werkzeug zu wechseln. Die X-Spalte von tabularx, die Spalten auf eine Zielbreite dehnt, und tblr aus tabularray behandelt die Seite „Erweiterte Tabellenumgebungen“. Liegt das Problem an zu vielen Zeilen für eine Seite, geht es um Länge statt Breite, und die Antwort heißt longtable, das über Seiten umbrechen kann – Seite „Seitenübergreifende Tabellen“. Beides lohnt die Prüfung, bevor auf dieser Seite skaliert oder gedreht wird.

Tabellen ins Querformat drehen – sidewaystable und rotatebox

Eine Tabelle, die für eine Hochformatseite zu groß ist, kann eine ganze Seite nutzen, indem sie um 90° gedreht wird: statt table die Umgebung sidewaystable aus dem Paket rotating verwenden. Caption und Nummer drehen sich mit, und die Tabelle erscheint weiterhin im Tabellenverzeichnis. In zweiseitigen Dokumenten wählt das Paket die Drehrichtung automatisch, damit die Doppelseite natürlich lesbar bleibt. Für Abbildungen gibt es entsprechend sidewaysfigure. Soll nur ein Teil einer Tabelle in beliebigem Winkel gedreht werden, dient \rotatebox{Winkel}{Material}, ebenfalls aus graphicx/rotating; typisch ist, eine einzelne Kopfzelle mit \rotatebox{90}{long column name} hochzustellen (positive Winkel drehen gegen den Uhrzeigersinn).

document.tex
\usepackage{rotating}
\usepackage{booktabs}

\begin{sidewaystable}
  \centering
  \caption{A wide table turned 90 degrees}
  \label{tab:wide}
  \begin{tabular}{@{}lrrrrrrrr@{}}
    \toprule
    Region & Q1 & Q2 & Q3 & Q4 & Total & Prev & Diff & Ratio \\
    \midrule
    East & 120 & 135 & 128 & 142 & 525 & 500 & +25 & 105\% \\
    \bottomrule
  \end{tabular}
\end{sidewaystable}

Eine Grenze ist zu beachten: rotating arbeitet mit gedrehten Boxen, und eine Box bleibt stets auf einer Seite. Damit lässt sich laufender Text im Querformat über mehrere Seiten nicht erzeugen. Dafür verwendet man lscape, das den Fließtext quer setzt, oder pdflscape, das die PDF-Seite selbst dreht. pdflscape eignet sich besonders für Dokumente, die am Bildschirm gelesen werden, da der Betrachter die Seite selbst dreht. Eine Tabelle, die zugleich quer und mehrseitig ist, verlangt die Kombination von pdflscape mit longtable.

Anmerkungen unter einer Tabelle – threeparttable

Verwendet man \footnote innerhalb eines tabular, springt die Anmerkung an den Seitenfuß oder erscheint gar nicht. Donald Arseneaus threeparttable löst das. Wie der Name sagt, behandelt es eine Tabelle als drei Teile – Titel (Caption), Körper (tabular) und Anmerkungen (tablenotes) – und setzt die Anmerkungen in Tabellenbreite direkt darunter. Wie die Paketdokumentation selbst festhält, gleitet eine threeparttable nicht von allein; für Nummer und Platzierung schließt man das Ganze in ein table ein (oder table* für volle Breite im zweispaltigen Satz).

document.tex
\usepackage{booktabs}
\usepackage{threeparttable}

\begin{table}[htbp]
  \centering
  \begin{threeparttable}
    \caption{Yield by variety}
    \label{tab:yield}
    \begin{tabular}{@{}lrr@{}}
      \toprule
      Variety & Yield\tnote{a} & Price\tnote{b} \\
      \midrule
      Koshihikari & 540 & 380 \\
      Akitakomachi & 520 & 360 \\
      \bottomrule
    \end{tabular}
    \begin{tablenotes}
      \footnotesize
      \item[a] Kilograms per 10 a.
      \item[b] Wholesale price per kilogram.
    \end{tablenotes}
  \end{threeparttable}
\end{table}

In einer threeparttable-Umgebung stehen der Reihe nach schlicht \caption, das tabular und dann tablenotes. Die Verknüpfung der Anmerkungen ist manuell: In der Zelle steht ein Marker wie \tnote{a}, und in tablenotes wird die Anmerkung mit demselben Buchstaben als \item[a] … geschrieben. Seine Begründung, das nicht zu automatisieren, hinterließ der Autor am Anfang der .sty-Datei: „Derzeit ist an den Anmerkungen nichts automatisch … Ich habe diese Methode gewählt, weil automatische Nummerierung mit \footnote sehr schwer zu benutzen wäre, insbesondere weil viele Tabellen wiederholt auf eine einzige Anmerkung verweisen. Wenn jemand ein bequemes, elegantes, automatisches System hat, höre ich zu!“ Das Paket wird bis heute mit genau diesem Entwurf ausgeliefert.

OptionWirkung
paraSetzt mehrere Anmerkungen ohne Zeilenumbrüche in einem Absatz
flushleftEntfernt den hängenden Einzug der Anmerkungen
onlineDruckt die \item-Marke in normaler Größe statt hochgestellt
normalStellt die Standardformatierung wieder her und hebt eine dokumentweite Option für eine Tabelle auf

Diese Optionen lassen sich dokumentweit setzen, etwa \usepackage[para]{threeparttable}, oder pro Tabelle, etwa \begin{tablenotes}[flushleft]. threeparttable gestaltet die Caption selbst nicht; für ein sauberes Überschriftenbild kombiniert man es mit dem Paket caption. Für Anmerkungen an einer seitenübergreifenden Tabelle (longtable) dient das Schwesterpaket threeparttablex.

  • Die Tabelle landet nicht dort, wo sie soll – zuerst die Buchstaben in [htbp] als Menge von Erlaubnissen verstehen, nicht als Reihenfolge. Rührt sie sich immer noch nicht, stößt sie an \topfraction und Verwandte; dann [!ht] versuchen, und für echtes Fixieren [H] aus float.
  • Die Caption klebt an der Tabelle\belowcaptionskip ist standardmäßig 0pt. \setlength{\belowcaptionskip}{6pt} verwenden oder skip= aus dem Paket caption.
  • Die Tabelle ist breiter als die Seite – zuerst \tabcolsep und @{}, dann \small, zuletzt \resizebox. Dürfen die Spalten umbrechen, p{width} oder tabularx nehmen.
  • Zu viele Zeilen – das ist Länge, nicht Breite: longtable; muss es zugleich quer sein, mit pdflscape kombinieren.
  • Eine Fußnote an einer Zelle – nicht \footnote, sondern \tnote und tablenotes aus threeparttable.