Tabellen

Diesen Monat wollen wir uns damit auseinandersetzen, wie man in Tabellen erzeugen kann und wie man diese leserfreundlich gestalten kann. Dabei werden wir uns zunächst mit den Möglichkeiten, die von Haus aus mitbringt, beschäftigen und anschließend die Funktionen durch die Pakete

erweitern.

Einleitung

Tabellen sind gut geeignet, um dem Leser ein Satz von Zahlen – oder allgemeiner Daten –, denen eine gewisse Struktur zu Grunde liegt, übersichtlich zu präsentieren. Eine Tabelle sollte dabei immer nur so viele Daten enthalten, wie für die Betrachtung gerade notwendig sind und Zahlenwerte können ggf. sinnvoll gerundet werden. Lange Tabellen mit vielen Informationen, die eher der Dokumentation dienen und nicht „am Stück“ gelesen werden, stehen besser im Anhang, um den Lesefluss nicht zu unterbrechen.

Neben diesen „inhaltlich motivierten“ Tabellen gibt es in Dokumenten auch häufig „layout motivierte“ Tabellen, die der Autor zweckentfremdet hat, um Texte auszurichten, und die der Leser in der Regel nicht als Tabelle wahrnimmt. Wir beschränken uns in den Beispielen im Wesentlichen auf Tabellen der ersten Sorte.

Datei tabellen.tex

Alle Beispieltabellen finden Sie vollständig in der Datei tabellen.tex. Hier im Blog werden die Tabellen, zum Teil gekürzt wiedergegeben, was jeweils durch % ... gekennzeichnet ist. Außerdem lassen wir die in der Datei enthaltenen Kapitelüberschriften hier weg.

Wir verwenden für das Beispiel die Klasse scrreprt (siehe auch FAQ 2), weil diese uns die \chapter-Ebene zur Verfügung stellt und das Ausgabedokument so übersichtlicher wird.

Eine mit \chapter formatierte Überschrift beginnt immer auf einer neuen Seite. Außerdem wird dafür gesorgt, dass bis dahin noch nicht ausgegebene Gleitobjekte (s. u.) vor dem neuen Kapitel ausgegeben werden.

\documentclass[ngerman]{scrreprt}

Dann laden wir die üblichen Pakete für Kodierung (FAQ 3), Spracheinstellung (FAQ 5) und Schrift (FAQ 4).

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{lmodern}

Für die Tabelle mit chemischen Elementen, die wir später ausgeben wollen, benötigen wir hochgestellte Einsen, Zweien und Dreien. Diese stellt das Paket textcomp zur Verfügung.

Natürlich könnten wir die Ziffern im Mathemodus auch ohne Paket erzeugen, mit dem Paket können wir aber die Unicodezeichen ¹, ² und ³, die in der Rohdatei enthalten sind, direkt benutzen.

\usepackage{textcomp}

Nun laden wir das erste Paket, was die Tabellenfunktionen erweitert: array. Es definiert neue Spaltentypen und ermöglicht uns erweiterte Spaltendefinitionen.

\usepackage{array}

siunitx, das im letzten September vorgestellt wurde, nutzen wir zum einen zum manuellen Formatieren der Zahlen und um Dezimalzahlen in Tabellen auszurichten.

\usepackage{siunitx}
   \sisetup{
      locale = DE,
      detect-all,
   }

Mit booktabs können wir schöner aussehende Tabellen gestalten.

\usepackage{booktabs}

Für farbige Tabellen laden wir xcolor mit der Option table, wodurch das Paket colortbl geladen wird.

Zu Farben siehe auch das Beispiel aus dem Januar.

\usepackage[table]{xcolor}

Dieses Paket benötigen wir für zeilenüberspannende Zellen.

\usepackage{multirow}

Mit diesem Paket können wir besonders breite Tabellen leicht um 90° drehen. Es muss vor tablefootnote geladen werden.

\usepackage{rotating}

Diese drei Pakete bieten uns jeweils eine Möglichkeit für Fußnoten in Tabellen.

\usepackage{threeparttable}
\usepackage{tablefootnote}
\usepackage{footnote}

Mit diesem Befehl aus dem Paket footnote können wir die {table}-Umgebung so verändern, dass darin Fußnoten möglich werden (s. u.).

   \makesavenoteenv{table}

tabularx laden wir, um Tabellen automatisch der Satzspiegelbreite anzupassen.

\usepackage{tabularx}

longtable ermöglicht Tabellen, die über mehrere Seiten gehen.

\usepackage{longtable}

Dieses Paket macht es uns möglich eine Tabelle automatisch aus externen Daten zu generieren. Mit der compat-Option stellen wir ein, dass das Paket mit allen Funktionen der (derzeit aktuellen) Version 1.13 geladen wird.

\usepackage{pgfplotstable}
   \pgfplotsset{compat = 1.13}

Das letzte Paket, das wir laden, hat mit Tabellen nichts zu tun, sorgt aber dafür, dass Inhalts- und Tabellenverzeichnis klickbar sind und die Überschriften auch als PDF-Bookmarks erscheinen, was die Arbeit mit der PDF erleichtert. Es sollte – bis aus wenige Ausnahmen – immer zuletzt geladen werden.

\usepackage[colorlinks]{hyperref}

Jetzt nehmen wir die erste Einstellung für Tabellen vor: In dem wir den Befehl \arraystretch auf den Wert 1.1 definieren (siehe FAQ 10), legen wir fest, dass der Zeilenabstand von Tabellenzeilen um den Faktor 1,1 vergrößert wird, was die Lesbarkeit verbessert.

\renewcommand{\arraystretch}{1.1}
\begin{document}

Am Anfang unseres Dokuments geben wir das Inhalts- und das Tabellenverzeichnis aus.

\tableofcontents
\listoftables

Einfache Tabellen

Um in eine Tabelle zu erzeugen, verwendet man die Umgebung {tabular}. Sie hat ein Argument, das die Spaltendefinition enthält. Eine so erzeugte Tabelle wir „inline“ gesetzt, steht also genau so in der Zeile, wie ein einfacher Buchstabe auch.

Unsere Tabelle soll vier Spalten haben: Wir müssen in der Spaltendefinition dementsprechend vier Spaltentypen angeben. Hier nutzen wir alle verfügbaren, nämlich l, c und r für linksbündige, zentrierte bzw. rechtsbündige Zellen ohne Zeilenumbruch und p{Breite} für Zellen mit fester Breite im Blocksatz. Die Spalten ohne Umbruch sind so breit wie der längste Eintrag in der jeweiligen Spalte.

Die Leerzeichen in der Spaltendefinition könnten wir auch weglassen, sie machen die Definition aber besser lesbar.

\begin{tabular}{ l c r p{50mm} }

Im Inhalt der Tabelle trennen wir die einzelnen Zellen einer Zeile mit & und beenden jede Zeile mit \\. Für die Ausgabe in der PDF ist es unerheblich, ob eine Tabellenzeile im Code auch wirklich nur in einer Zeile steht und ob die Spalten im Code untereinander stehen oder nicht (so wie hier).

   Links & Mittig & Rechts & Ausgerichteter Text mit Umbrüchen im Blocksatz. \\
   Hier & steht & noch & mehr Tabelleninhalt \\

Bei Verwendung der p-Spalten sollte man bedenken, dass das erste Wort in einer Zeile generell nicht trennt. Gerade in schmalen spalten kann das aber nötig sein. Man kann dann einfach mit \hspace{0pt} einen Null-Abstand einfügen so dass das lange Wort nach ’s Verständnis das zweite ist.

   Zeile & mit & langem & Donaudampfschiffskapitänsmützentestwort darin \\
   Zeile & mit & langem & \hspace{0pt}Donaudampfschiffskapitänsmützentestwort darin \\

Ende der Tabelle

\end{tabular}

Wie bereits gesagt, werden Tabellen wie Buchstaben in der Textzeile platziert. Die vertikale Ausrichtung an der Grundlinie kann man mit dem optionalen Argument von {tabular} beeinflussen. Hier nutzen wir einspaltige, vierzeilige Tabellen, die wir mittig (Voreinstellung und c) in der Textzeile, an der ersten Tabellenzeile (t) bzw. an der letzen Tabellenzeile (b) ausrichten.

Text
\begin{tabular}{c}
   A \\ B \\ C \\ D \\
\end{tabular}
Text
\begin{tabular}[c]{c}
   A \\ B \\ C \\ D \\
\end{tabular}
Text
\begin{tabular}[t]{c}
   A \\ B \\ C \\ D \\
\end{tabular}
Text
\begin{tabular}[b]{c}
   A \\ B \\ C \\ D \\
\end{tabular}
Text

Tabulatoren

Neben {tabular} bietet mit der Umgebung {tabbing} auch die Möglichkeit Text anhand von Tabulatoren in Spalten auszurichten. Der so erzeugte Inhalt wird nicht „inline“ gesetzt.

Innerhalb der Umgebung muss man mit \= die Tabulatorpositionen einstellen und kann diese in den folgenden Zeilen mit \> erreichen. Die Zeilen werden auch hier mit \\ beendet; nur die letzte Zeile der Umgebung muss ohne \\ bleiben.

\begin{tabbing}
   Das ist ein Satz, der \= \textit{verschiedene} Arten \= \textbf{der Auszeichnung} zeigt. \\
   recto/aufrecht \> kursiv \> fett
\end{tabbing}

Wird eine Zeile so wie hier anstelle von \\ mit \kill beendet, wird sie nicht ausgegeben, kann aber zur Festlegung der Tabstops genutzt werden.

\begin{tabbing}
   \hspace{20mm} \= \hspace{20mm} \= \hspace{20mm} \= \hspace{20mm} \= \hspace{20mm} \= \kill
   1 \> 2 \> 3 \> 4 \> 5 \\

Wird in einer Zeile \+ benutzt, werden alle folgenden Zeilen um eine Tabstop-Position nach rechts verschoben. Bei mehreren \+ entsprechend um mehrere Positionen.

   1A \> 2A \> 3A \> 4A \> 5A \+ \\
   2B \> 3B \> 4B \> 5B \+ \\

Mit \< kann man in einer derart verschobenen Zeile zurück springen.

   \< \< 1C \> 2C \> 3C \> 4C \> 5C  \\

Ein \- verschiebt alle Folgezeilen um eine Position nach links.

   3D \> 4D \> 5D \-\- \\
   1E \> 2E \> 3E \> 4E \> 5E \\

Ein \' (Shift + #) verschiebt den davor stehenden Text so nach links, dass dieser rechtsbündig am nächsten Spaltenbeginn erscheint und ein \` (accent grave) verschiebt den folgenden Text bzw. die letzte Tabulatorposition rechtsbündig an die rechte Satzkante.

Der mit \' verschobene Text steht genau genommen nicht ganz rechtsbündig an der Spaltenkante sondern um die Läge \tabbingsep nach links verschoben

   F $\rightarrow$ \' 1F \> 2F \> 3F \> 4F \> 5F \\
   1G \> 2G \> 3G \> 4G \> 5G \` $\leftarrow$ G \+ \\
   H $\rightarrow$ \' 2H \> 3H \` $\leftarrow$ H \\
   I $\rightarrow$ \' \< \> 2I \> 3I \` $\leftarrow$ I \\
   2J \> $\Rightarrow$ \' 3J \` $\leftarrow$ J
\end{tabbing}

Die Gleitumgebung {table} und Tabellenbeschriftungen

Da die mit {tabular} erzeugten Tabellen in der Zeile stehen, sollte man Sie in die dafür vorgesehene Gleitumgebung {table} einbetten. Das ermöglicht es außerdem mit \caption eine Beschriftung hinzuzufügen. Die Tabelle erscheint dann in der PDF nicht unbedingt and der Stelle, an der Sie auch im Code steht sondern sie gleitet an eine von gewählte günstige Position.

Um die mit {tabular} erzeugte Tabelle auf der Seite zu zentrieren, verwenden wir in der Gleitumgebung {table} den Befehl \centering (niemals die Umgebung {center}!) und fügen dann die Tabelle ein. Mit \caption erzeugen wir eine Tabellenbeschriftung und gleichzeitig auch einen Eintrag im Tabellenverzeichnis. Wie die Überschriftenbefehle hat auch \caption ein optionales Argument, um den Verzeichniseintrag zu ändern.

\begin{table}[h]
   \centering
   \begin{tabular}{ l l l l }
      \textbf{Ordnungszahl} & \textbf{Element} &
         \textbf{Symbol} & \textbf{Atommasse (\si{\atomicmassunit})} \\
      2 & Helium & He & \num{4.002602} \\
      10 & Neon & Ne & \num{20.1797} \\
      18 & Argon & Ar & \num{39.948} \\
      36 & Krypton & Kr & \num{83.798} \\
      54 & Xenon & Xe & \num{131.293} \\
      86 & Radon & Rn & \num{222} \\
      118 & Ununoctium & Uuo & \num{294} \\
   \end{tabular}
   \caption[Übersicht der Edelgase]{Übersicht der Edelgase
      (Massewerte aus der Wikipedia).}
\end{table}

Mehr über Gleitobjekte finden sie bspw. in l2kurz.pdf, Abschnitt 6.2, oder in „Gleitobjekte – die richtige Schmierung“.

Mehr Spaltentypen mit array

Das Paket array stellt uns mit b und m zwei weitere Spaltentypen zur Verfügung, die analog zu p eine feste Breite haben, deren vertikale Ausrichtung aber anders ist: p-Zellen werden an ihrer ersten Zeile, b-Zellen an ihrer letzten Zeile und m-Zellen sind mittig ausgerichtet.

\begin{table}[h]
   \centering
   \begin{tabular}{ l c r p{50mm} }
      Links & Mittig & Rechts & Ausgerichteter Text mit Umbrüchen im Blocksatz. \\
      Hier & steht & noch & mehr Tabelleninhalt \\
   \end{tabular}
   \caption{Bereits bekannter Spaltentyp \texttt{p}}
\end{table}
 
\begin{table}[h]
   \centering
   \begin{tabular}{ l c r m{50mm} }
      Links & Mittig & Rechts & Ausgerichteter Text mit Umbrüchen im Blocksatz. \\
      Hier & steht & noch & mehr Tabelleninhalt \\
   \end{tabular}
   \caption{Neuer Spaltentyp \texttt{m}}
\end{table}
 
\begin{table}[h]
   \centering
   \begin{tabular}{ l c r b{50mm} }
      Links & Mittig & Rechts & Ausgerichteter Text mit Umbrüchen im Blocksatz. \\
      Hier & steht & noch & mehr Tabelleninhalt \\
   \end{tabular}
   \caption{Neuer Spaltentyp \texttt{p}}
\end{table}

Tabellen mit Rahmen versehen mit booktabs

bietet uns von Haus aus die Möglichkeit mit | in der Spaltendefinition und \hline zwischen zwei Zeilen vertikale bzw. horizontale Linien in Tabellen zu erzeugen.

\begin{table}[h]
   \centering
   \begin{tabular}{ | l | l | l | l | }
      \hline
      \textbf{Ordnungszahl} & \textbf{Element} &
         \textbf{Symbol} & \textbf{Atommasse (\si{\atomicmassunit})} \\
      \hline
      2 & Helium & He & \num{4.002602} \\
      % ...
      \hline
      118 & Ununoctium & Uuo & \num{294} \\
      \hline
   \end{tabular}
   \caption{Tabelle mit Rahmenlinien}
\end{table}

Die so entstehende Tabelle ist aber alles andere als optisch ansprechend und legt dem Leser sogar Steine in den Weg: Denn sie soll wie die meisten Tabellen zeilenweise gelesen werden, durch die vertikalen Linien wird das Auge aber in eben dieser Bewegungsrichtung permanent unterbrochen. Die daraus folgende einfache Regel lautet: Keine vertikalen Linien in Tabellen! Die vielen horizontalen stören zwar beim Lesen nicht, sind aber auch nicht wirklich nötig.

Deutlich schöner wird die Tabelle, wenn wir die vertikalen Linien vollständig und die meisten horizontalen Linien entfernen. Wir setzen nur eine dickere Linie, um die Tabelle nach oben und unten abzuschließen und eine dünnere Linie, um den Tabellenkopf vom Inhalt abzusetzen.

Wir nutzen dazu die drei Linientypen \toprule, \midrule und \bottomrule, die das Paket booktabs definiert.

\begin{table}[h]
   \centering
   \begin{tabular}{ l l l l }
      \toprule
      \textbf{Ordnungszahl} & \textbf{Element} &
         \textbf{Symbol} & \textbf{Atommasse (\si{\atomicmassunit})} \\
      \midrule
      2 & Helium & He & \num{4.002602} \\
      % ...
      118 & Ununoctium & Uuo & \num{294} \\
      \bottomrule
   \end{tabular}
   \caption{Tabelle mit \emph{schönen} Rahmenlinien}
\end{table}

Zellen verbinden mit multirow

Um Zellen über mehrere Spalten hinweg zu verbinden, gibt es in (ohne zusätzliches Paket) den Befehl \multicolumn. Dabei geben wir im ersten Argument die Spaltenspanne, im zweiten Argument die Ausrichtung – genauer gesagt den Spaltentyp – der Verbundzelle und im letzten Argument den Inhalt an. Hier nutzen wir das, um die ersten beiden Spalten mit „Element“ zu überschreiben.

Wir müssen dabei darauf achten, in der Zeile entsprechend weniger & zu verwenden!

\begin{table}[h]
   \centering
   \begin{tabular}{ l l l l }
      \toprule
      \multicolumn{2}{l}{\textbf{Element}} &
         \textbf{Symbol} & \textbf{Atommasse (\si{\atomicmassunit})} \\
         % ...
   \end{tabular}
   \caption{Zellen über Spalten verbinden}
\end{table}

Um Zellen auch über mehrere Zeilen hinweg zu verbinden, müssen wir multirow laden und dessen Befehl \multirow verwenden. Hier geben wir im ersten Argument die Zeilenspanne, im zweiten Argument die Breite der Zelle und im letzten wieder den Inhalt an. Wenn wir statt der Breite * eingeben, wir die „natürliche“ Breite benutzt.

Anders als bei \multicolumn entfallen die & in den folgenden Zeilen nicht! Hier stehen einfach leere Zellen.

\begin{table}[h]
   \centering
   \begin{tabular}{ l l l l l }
      \toprule
      & \textbf{Ordnungszahl} & \textbf{Element} &
         \textbf{Symbol} & \textbf{Atommasse (\si{\atomicmassunit})} \\
      \midrule
      \multirow{5}{*}{\textbf{stabil}}
         & 2 & Helium & He & \num{4.002602} \\
      & 10 & Neon & Ne & \num{20.1797} \\
      & 18 & Argon & Ar & \num{39.948} \\
      & 36 & Krypton & Kr & \num{83.798} \\
      & 54 & Xenon & Xe & \num{131.293} \\
      \midrule
      \multirow{2}{*}{\textbf{radioaktiv}}
         & 86 & Radon & Rn & \num{222} \\
      & 118 & Ununoctium & Uuo & \num{294} \\
      \bottomrule
   \end{tabular}
   \caption{Zellen über Zeilen verbinden}
\end{table}

Erweiterte Spaltendefinitionen mit array

Neben den oben genannten Spaltentypen, bietet array auch noch erweiterte Funktionen für die Spaltendefinition.

Mit dem *-Operator können wir Teile der Spaltendefinition wiederholen. Hier wird das l vier Mal wiederholt; aber auch l *{6}{l c r l} p{2cm} für insgesamt 26 Spalten wäre möglich.

\begin{table}[h]
   \centering
   \begin{tabular}{ *{4}{l} }
   % ...
   \end{tabular}
   \caption{Spaltendefinition wiederholen}
\end{table}

Mit dem @-Operator können wir den Abstand, den zwischen bzw. vor oder nach Spalten einfügt durch das was in geschweiften Klammern folgt ersetzen. Mit @{} können wir den Abstand entfernen. Das verwenden wir hier, um den Text bündig zu den Linienenden zu setzen.

Der @-Operator steht auch ohne Laden eines Paketes zur Verfügung.

\begin{table}[h]
   \centering
   \begin{tabular}{ @{} *{4}{l} @{} }
      % ...
   \end{tabular}
   \caption{Tabelle ohne Abstände vor/nach erster/letzter Spalte}
\end{table}

Nun verwenden wir @, um zwischen der zweiten und dritten Spalte ein Gleichheitszeichen einzufügen.

\begin{table}[h]
   \centering
   \begin{tabular}{ l l @{=} l l }
      % ...
   \end{tabular}
   \caption{Material zwischen Spalten einfügen; Abstand ersetzen}
\end{table}

Wenn wir anstelle vom @- den !-Operator benutzen, wird das Material zusätzlich zum Spaltenabstand eingefügt. Der ursprüngliche Abstand wird gleichmäßig auf beide Seiten des eingefügten Materials verteilt.

\begin{table}[h]
   \centering
   \begin{tabular}{ l l !{=} l l }
      % ...
   \end{tabular}
   \caption{Material zwischen Spalten einfügen; Abstand ersetzen}
\end{table}

Mit dem >- bzw. dem <-Operator können wir zusätzliches Material an den Anfang bzw. das Ende eine Zelle einfügen. Hier nutzen wir es, um den Elementnamen in Anführungszeichen zu setzen. Um dies nicht auf die Zelle in der Kopfzeile wirken zu lassen, setzen wir diese mit einer einspaltigen \multicolumn, wodurch die Definition >{„} l <{“} für diese Zelle mit l überschrieben wird.

Das kann bspw. auch nützlich sein, um in alle p-Zellen einen Null-Abstand für die Silbentrennung des ersten Wortes (s. o.) einzufügen.

\begin{table}[h]
   \centering
   \begin{tabular}{ >{\bfseries} l >{} l <{} l l @{} }
      \toprule
      \textbf{Ordnungszahl} & \multicolumn{1}{l}{\textbf{Element}} &
         \textbf{Symbol} & \textbf{Atommasse (\si{\atomicmassunit})} \\
      \midrule
      2 & Helium & He & \num{4.002602} \\
      % ...
   \end{tabular}
   \caption{Material in Zellen einer Spalte einfügen}
\end{table}

Farbige Zellen, Zeilen und Spalten mit colortbl

Um den Hintergrund von Spalten, Zeilen oder Zellen zu färben, benötigen wir das Paket colortbl, das nicht mit \usepackage sondern über die table-Option von xcolor geladen werden sollte.

Eine einzelne Zelle können wir mit \cellcolor einfärben. Dabei ist es egal, wo in der Zelle der Befehl steht. Steht er am Anfang muss man allerdings acht geben, kein ungewünschtes Leerzeichen einzufügen.

\begin{table}[h]
   \centering
   \begin{tabular}{ *{4}{l} }
      % ...
      36 & \cellcolor{yellow}Krypton & Kr & \num{83.798} \\
      % ...
   \end{tabular}
   \caption{Hervorgehobene Zelle}
\end{table}

Mit \rowcolor am Anfang einer Zeile können wir diese farbig hinterlegen. Ein evtl. folgendes Leerzeichen wird in diesem Fall ignoriert.

\begin{table}[h]
   \centering
   \begin{tabular}{ *{4}{l} }
      % ...
      \rowcolor{yellow} 10 & Neon & Ne & \num{20.1797} \\
      % ...
      \bottomrule
   \end{tabular}
   \caption{Hervorgehobene Zeile}
\end{table}

Um eine Spalte zu färben, müssen wir mit dem >-Operator den Befehl \columncolor voranstellen.

Zu den dabei entstehenden weißen Bereichen um die Linien siehe bspw. „Coloring columns in a table with colortbl and booktabs“, „Colouring columns of a table which uses booktabs“ und „Booktabs and colortbl not filling height of row

\begin{table}[h]
   \centering
   \begin{tabular}{ l >{\columncolor{yellow}} l l l }
      % ...
   \end{tabular}
   \caption{Hervorgehobene Spalte}
\end{table}

Um alternierende Zeilenfarben zu erhalten, können wir \rowcolors verwenden, wobei wir im ersten Argument angeben, dass die Färbung erst in der zweiten Zeile beginnen soll, damit wir die Kopfzeile individuell färben können.

Außerdem verändern wir hier \arraystretch, um etwa höhere Zeilen zu bekommen.

\begin{table}[h]
   \centering
   \renewcommand{\arraystretch}{1.3}
   \rowcolors{2}{white}{black!10}
   \begin{tabular}{ *{4}{l} }
      \rowcolor{black!35}
      \textbf{Ordnungszahl} & \textbf{Element} &
         \textbf{Symbol} & \textbf{Atommasse (\si{\atomicmassunit})} \\
      % ...
   \end{tabular}
   \caption{Alternierende Zeilenfarben}
\end{table}

Die Farbe der Linien können wir mit dem Befehl \arrayrulecolor verändern. Allerdings lässt sich dessen Wirkung nicht durch eine Gruppe (FAQ 7) beschränken, weshalb wir hier nach der Tabelle manuell auf schwarze Rahmen zurückschalten müssen.

\begin{table}[h]
   \centering
   \arrayrulecolor{blue}
   \begin{tabular}{ *{4}{l} }
      % ...
   \end{tabular}
   \arrayrulecolor{black}
   \caption{Farbige Rahmen}
\end{table}

Fußnoten/Anmerkungen in Tabellen mit threeparttable, tablefootnote und footnote

Fußnoten in Tabellen sind in nicht ohne Weiteres möglich. Dennoch gibt es verschiedene Wege Fußnoten zu erzeugen. Bei der (empfohlenen) Verwendung der Gleitumgebung ist zu beachten, dass die Fußnoten u. U. an einer anderen Stelle erscheinen, als die Tabelle selbst, weswegen es in der Regel sinnvoll ist die Anmerkungen nicht als Fußnoten zu setzen sondern direkt unter der Tabelle beizufügen.

Selbst bei nicht gleitenden Tabellen können wir \footnote nicht verwenden. Wir müssen stattdessen auf eine Kombination aus \footnotemark und \footnotetext zurück greifen. Eine automatische Zählung funktioniert hier aber nur, bei einer Fußnote, bei mehreren müssten wir die Nummer manuell in eckigen Klammern angeben.

\begin{tabular}{ *{4}{l} }
   \toprule
   \textbf{Ordnungszahl} & \textbf{Element} & \textbf{Symbol} &
      \textbf{Atommasse (\si{\atomicmassunit})}\footnotemark \\
      % ...
\end{tabular}
\footnotetext{Werte aus der Wikipedia}

Wird die Tabelle in eine {minipage} eingebunden, funktioniert \footnote. Diese Fußnoten werden dann alphabetisch nummeriert und unmittelbar nach der Tabelle bzw. vor Ende der {minipage} ausgegeben. Auf diese Weise sind mehrere Fußnoten möglich. Außerdem ist so sichergestellt, dass die Anmerkungen immer zusammen mit der Tabelle erscheinen und der Leser nicht danach suchen muss.

\begin{table}[h]
   \begin{minipage}{\textwidth}
      \centering
      \begin{tabular}{ *{4}{l} }
         \toprule
         \textbf{Ordnungszahl} & \textbf{Element} & \textbf{Symbol} &
            \textbf{Atommasse (\si{\atomicmassunit})}\footnote{Werte aus der Wikipedia} \\
         % ...
         118 & Ununoctium\footnote{Vorläufiger Name} & Uuo & \num{294} \\
         \bottomrule
      \end{tabular}
   \end{minipage}
   \caption{Eine Tabelle mit Anmerkungen direkt bei der Tabelle mit Bordmitteln}
\end{table}

Mit dem Paket threeparttable steht uns die gleichnamige Umgebung zur Verfügung, innerhalb der wie mit \tnote ein Symbol / eine Nummer und in {tablenotes} anschließend den zugehörigen Text setzen. Dabei müssen die Nummern/Symbole zwingend manuell angeben werden, was allerdings den Vorteil hat, dass man mehrfach auf eine Anmerkung verweisen kann.

\begin{table}[h]
   \centering
   \begin{threeparttable}
      \begin{tabular}{ *{4}{l} }
         \toprule
         \textbf{Ordnungszahl} & \textbf{Element} & \textbf{Symbol} &
            \textbf{Atommasse (\si{\atomicmassunit})}\tnote{a} \\
         % ...
         118 & Ununoctium\tnote{b} & Uuo\tnote{b} & \num{294} \\
         \bottomrule
      \end{tabular}
      \begin{tablenotes}
         \item[a] Werte aus der Wikipedia
         \item[b] Vorläufiger Name
      \end{tablenotes}
   \end{threeparttable}
   \caption{Eine Tabelle mit Anmerkungen direkt bei der Tabelle mit \texttt{\{threparttable\}}}
\end{table}

Wenn wir das Paket tablefootnote laden, können wir anstelle von \footnote den Befehl \tablefootnote verwenden, der ganz normale Fußnoten erzeugt mit dem Nachteil das Tabelle und Anmerkungen nicht sicher auf der gleichen Seite erscheinen.

\begin{table}[h]
   \centering
   \begin{tabular}{ *{4}{l} l }
      \toprule
      \textbf{Ordnungszahl} & \textbf{Element} & \textbf{Symbol} &
         \textbf{Atommasse (\si{\atomicmassunit})}\tablefootnote{Werte aus der Wikipedia} \\
      \midrule
      % ...
      118 & Ununoctium\tablefootnote{Vorläufiger Name} & Uuo & \num{294} \\
      \bottomrule
   \end{tabular}
   \caption{Eine Tabelle mit echte Fußnoten mit \texttt{tablefootnote}}
\end{table}

Da wir in der Präambel bereits \makesavenoteenv{table} verwendet haben, sind in dieser Datei in {table} sogar normale Fußnoten mit \footnote möglich. Aber auch hier besteht die Problematik der verschiedenen Seiten.

\begin{table}[h]
   \centering
   \begin{tabular}{ *{4}{l} l }
      \toprule
      \textbf{Ordnungszahl} & \textbf{Element} & \textbf{Symbol} &
         \textbf{Atommasse (\si{\atomicmassunit})}\footnote{Werte aus der Wikipedia} \\
      \midrule
      % ...
      118 & Ununoctium\footnote{Vorläufiger Name} & Uuo & \num{294} \\
      \bottomrule
   \end{tabular}
   \caption{Eine Tabelle mit echten Fußnoten mit \texttt{footnote}}
\end{table}

Weitere Alternativen für Fußnoten in Tabellen finden sie bspw. in der Dokumentation von tablefootnote.

Tabellen mit definierter Breite mit tabluarx

Um eine Tabelle mit Bordmitteln auf eine vorgegebene Breite, z. B. die Textbreite \textwidth, zu bringen, können wir {tabular*} verwenden. Diese Umgebung hat ein Argument mehr, in dem die gewünschte Breite angegeben werden muss. Außerdem müssen wir zwischen den Spalten dann mit \extracolsep{\fill} einen flexiblen Abstand einfügen, der gedehnt wird, um die gewünschte Breite zu erhalten. Die Breite der Spalten ändert sich dadurch aber nicht.

\begin{table}[h]
   \begin{tabular*}{\textwidth}{ l *{3}{@{\extracolsep{\fill}}l} }
      % ...
   \end{tabular*}
   \caption{Tabelle so breit wie der Fließtext mit Bordmitteln}
\end{table}

Wenn wir stattdessen {tabularx} aus dem gleichnamigen Paket und den zugehörigen Spaltentypen X verwenden, wird die Spaltenbreite gleichmäßig aufgeteilt, so dass die Tabelle die gewünschte Breite erhält. Die so erzeugten Spalten entsprechen einer p-Spalte nur dass die Breite automatisch ermittelt wurde.

Es ist auch möglich, die Gesamtbreite unterschiedlich zu Verteilen, siehe dazu die Anleitung des Paketes.

\begin{table}[h]
   \begin{tabularx}{\textwidth}{ *{4}{X} }
      % ...
   \end{tabularx}
   \caption{Tabelle so breit wie der Fließtext mit \texttt{\{tabularx\}}}
\end{table}

Um eine zentrierte Spalte mit flexibler Breite zu erzeugen, können wir uns mit \newcolumntype (aus array) einen neuen Spaltentyp C so definieren, dass er einer X-Spalte mit vorangestelltem Befehl zur Zentrierung entspricht.

Diese Definition sollte normalerweise in der Präambel stehen.

\newcolumntype{C}{>{\centering\arraybackslash}X}

Den so definierten Spaltentyp können wir dann zusammen mit tabularx verwenden.

\begin{table}[h]
   \begin{tabularx}{\textwidth}{ *{4}{C} }
      % ...
   \end{tabularx}
   \caption{Tabelle so breit wie der Fließtext mit zentrierten Spalten}
\end{table}

Zellen am Komma ausrichten mit siunitx

Manchmal ist es gut, wenn Zahlen in einer Tabelle am Dezimaltrenner ausgerichtet werden, was mit siunitx relativ einfach möglich ist.

Mit dem von sinunitx definieren Spaltentyp S erhalten wir eine Spalte, deren Inhalt am Komma ausgerichtet wird und deren Zellen mit \num verarbeitet werden, weshalb wir in der Ausgabe auch ein Komma anstelle des Punktes im Code erhalten. Um eine einzelne Zelle aus dieser Verarbeitung auszuklammern, können wir sie in geschweifte Klammern einschließen so wie hier die Kopfzelle.

\begin{table}[h]
   \centering
   \begin{tabular}{ *{3}{l} S }
      \toprule
      \textbf{Ordnungszahl} & \textbf{Element} &
         \textbf{Symbol} & {\textbf{Atommasse (\si{\atomicmassunit})}} \\
      \midrule
      2 & Helium & He & 4.002602 \\
      % ...
   \end{tabular}
   \caption{Zellen am Komma ausrichten}
\end{table}

Der S-Spaltentyp hat ein optionales Argument, mit dem wir auf alle Funktionen zugreifen können, die uns auch mit \num zur Verfügung stehen. Hier nutzen wir dies um die Werte automatisch zu runden.

\begin{table}[h]
   \centering
   \begin{tabular}{ *{3}{l} S[round-mode=places, round-precision=1] }
      % ...
   \end{tabular}
   \caption{Zellen am Komma ausrichten}
\end{table}

Die Funktionen von siunitx haben wir im letzten September bereits angeschaut.

Lange (nicht-gleitende) Tabellen mit longtable

Alle bisher gesetzten Tabellen erlauben keinen Seitenumbruch zwischen den Zeilen und laufen einfach über den Seitenrand hinaus, wenn Sie zu lang werden. Eine Lösung dafür bietet das Paket longtable mit der gleichnamigen Umgebung. Diese Umgebung darf nicht in einer Gleitumgebung stehen. Außerdem steht die Beschriftung (\caption) in der Umgebung.

Um dem Leser bei der Orientierung in einer über mehrere Seiten laufenden Tabelle zu unterstützen, bietet {longtable} die Möglichkeit, wiederholende Kopf- und Fußzeilen für die Tabelle zu definieren. Damit die Spaltenbreiten über alle Seiten gleich sind, muss das Dokument mehrfach kompiliert werden.

Die Spaltendefinition geben wir hier, wie gewohnt an.

\begin{longtable}{ *{4}{l} }

Als erstes definieren wir den Tabellenkopf, wie er auf der ersten Seite der Tabelle erscheinen soll. Dabei verwenden wir \captionabove für die Beschriftung und schließen auch diese Zeile mit einem \\ ab. Den ersten Kopf schließen wir mit \endfirsthead ab.

      \captionabove{Lange Tabelle mit den ersten 36 Elementen} \\
      \toprule
      \textbf{Ordnungszahl} & \textbf{Name (engl.)} &
         \textbf{Symbol} & {\textbf{Atommasse (\si{\atomicmassunit})}} \\
      \midrule
   \endfirsthead

Nun definieren wir den Kopf, der auf allen anderen Seiten wiederholt werden soll. Hier verwenden wir \captionabove mit einem leeren optionalen Argument, um den Eintrag im Tabellenverzeichnis zu unterdrücken. Diesen Kopf beenden wir mit \endhead.

      \captionabove[]{Lange Tabelle mit den ersten 36 Elementen (Forts.)} \\
      \toprule
      Ordnungszahl & Name (engl.) & Symbol & Atommasse \\
      \midrule
   \endhead

Für den auf allen Seiten außer der letzten zu wiederholenden Fuß stellen wir eine verbundene Zelle mit Auslassungszeichen ein, um anzudeuten, dass es hier noch weiter geht. Wir schließen diesen mit \endfoot ab.

      \multicolumn{4}{r}{\ldots} \\
   \endfoot

Zuletzt legen wir noch eine dicke Linie für den letzten Fuß, d. h. das Ende der gesamten Tabelle fest. Die letzte Fußzeile schließt mit \endlastfoot

      \bottomrule
   \endlastfoot

Jetzt folgt der eigentliche Inhalt der Tabelle wie er auch in {tabluar} stehen würde.

Die für diese Tabelle verwendeten Rohdaten stammen von Richard Terrett.

   1 & Hydrogen & H & \num{1.00794} \\
   % ...

Ende der langen Tabelle

\end{longtable}

Breite Tabellen mit rotating

Hin und wieder kommt es vor, dass eine Tabelle zu breit ist für den Satzspiegel und deswegen um 90° gedreht werden soll. Dafür bietet rotatig eine Lösung. Die Tabelle wird dabei automatisch so gedreht, dass ihr Fuß rechts (bzw. außen in doppelseitigen Dokumenten) steht.

Anstelle von {table} verwenden wir für diese besonders breite Tabelle {sidewaystable}; ansonsten ändert sich nichts.

\begin{sidewaystable}
   \begin{tabular}{ *{6}{l} }
      % ...
   \end{tabular}
   \caption{Eine besonders breite Tabelle}
\end{sidewaystable}

Tabellen aus externen Daten generieren mit pgfplotstable

Besonders in naturwissenschaftlichen Publikationen, kann es vorkommen, das viele lange Tabellen eingebunden werden müssen. Dank pgfplotstable können wir uns sparen diese manuell in die -Syntax zu übertragen und stattdessen einfach automatisch eine Text- bzw. CSV-Datei einlesen.

Zum Einlesen benutzen wir den Befehl \pgfplotstabletypesetfile mit einer Reihe von Optionen, einige davon könnte man bei mehreren ähnlichen Tabellen besser global festlegen.

\pgfplotstabletypesetfile[

Als erstes stellen wir ein, dass die Spalten der CSV-Datei mit Semikola getrennt sind.

   col sep = semicolon,

Da die Tabelle nicht auf eine Seite passen wird, legen wir die Verwendung von {longtable} fest.

   begin table = \begin{longtable},
   end table = \end{longtable},

Außerdem sollen die Spalten den l-Typ haben.

   column type = l,

Jetzt unterdrücken wir mit output empty row die Ausgabe der Kopfzeile in der CSV-Datei und schleusen stattdessen mit before row die Kopf- und Fußdefinition für {longtable} ein.

   every head row/.append style = {
      output empty row,
      before row = {
            \captionabove{Tabelle mit allen Elemente aus CSV-Datei} \\
            \toprule
            & \textbf{Name (engl.)} & \textbf{Symbol} &
               \textbf{Atommasse (\si{\atomicmassunit})} &
               \textbf{Elektronenkonfiguration} \\
            \midrule
         \endfirsthead
            \captionabove[]{Tabelle mit allen Elemente aus CSV-Datei (Forts.)} \\
            \toprule
            & \textbf{Name (engl.)} & \textbf{Symbol} &
               \textbf{Atommasse (\si{\atomicmassunit})} &
               \textbf{Elektronenkonfiguration} \\
            \midrule
         \endhead
            \multicolumn{5}{r}{\ldots}
         \endfoot
            \bottomrule
         \endlastfoot
      },
   },

Mit dieser Option wählen wir die Spalten aus der CSV-Datei aus, da wir nicht alle ausgeben wollen. Die Namen sind die, die in der ersten Zeile der CSV-Datei verwendet werden.

   columns = {num, name, symbol, mass, electronicconfiguration},

Mit columns/num/.style können wir auf die Nummernspalte zugreifen und legen fest dass diese rechtsbündig ausgerichtet werden soll.

   columns/num/.style = {
      column type = r,
   },

Für die Spalten mit den Namen, den Symbolen und den Elektronenkonfigurationen legen wir mit string type fest, dass sie von pgfplotstable wie in der CSV-Datei ausgeben und nicht weiter verarbeitet werden sollen.

   columns/name/.style = {
      string type,
   },
   columns/symbol/.style = {
      string type,
   },
   columns/electronicconfiguration/.style = {
      string type,
   },

Für die Masseangaben könnten wir die Verarbeitung durch pgfplotstable verwenden, da wir aber im ganzen Dokument mit siunitx arbeiten und eine einheitliche Darstellung wollen schalten wir auch hier die Verarbeitung ab und geben stattdessen den S-Spaltentyp an.

   columns/mass/.style = {
      string type,
      column type = { S[round-mode = places, table-number-alignment = left] },
   },

Im obligatorischen Argument geben wir schließlich die einzulesende Datei an.

Die für diese CSV-Datei verwendeten Rohdaten stammen von Richard Terrett.

]{elemente.csv}
\end{document}

Das Paket tabu

Viele Möglichkeiten der zuvor genannten Pakete bietet auch das Paket tabu. Vor allem stellt es sehr flexible Funktion zum Erstellen von Tabellen zur Verfügung und ist insofern einen Blick wert. Allerdings ist nicht klar, ob und wie das Paket weiterentwickelt wird, weshalb ich es aus diesem Beispiel ausgeklammert habe.

Bemerkung

In der Beispieldatei werden sehr viele Pakete für Tabellenfunktionen geladen, die Sie in Ihrem Dokument jeweils nur bei Bedarf und nicht „auf Vorrat“ laden sollten. Insbesondere bei den drei Fußnoten-Paketen sollten Sie sich für eine Methode entscheiden und diese konsistent verwenden.