Fortgeschrittene Tabellenumgebungen

Ein schlichtes tabular macht jede Spalte so breit wie ihren natürlichen Inhalt. Sobald eine Tabelle genau auf die Textbreite passen soll oder gleich breite Spalten mit Fließtext gebraucht werden, arbeitet es gegen Sie. Die Pakete, die dieses Problem lösen, sind tabularx (Spalten auf eine Zielbreite dehnen), tabulary (Breite nach Inhaltsmenge der Spalten verteilen) und das zunehmend standardmäßige tabularray (die Umgebung tblr, ein modernes Paket, das Tabellen über Schlüssel-Wert-Optionen steuert). Diese Seite zeigt die Unterschiede der drei und jeweils ein Beispiel.

Das Breitenproblem

In tabular brechen l-, c- und r-Spalten nie um, und p{width} bricht zwar um, zwingt Sie aber, die Breite selbst auszurechnen. Bei drei Spalten, die genau die Textbreite \textwidth füllen sollen, liegt man mit geratenen Angaben wie p{0.3\textwidth} um die Breite der Linien und des Spaltenabstands (\tabcolsep) daneben; die Tabelle läuft über oder bleibt zu schmal.

Also dreht man das Problem um: Erst die Breite festlegen und die Spalten anpassen lassen — das ist tabularx. Die Breite automatisch nach der Inhaltsmenge jeder Spalte verteilen — das ist tabulary. Beide sind bewährte Pakete von David Carlisle; tabularx gehört zum tools-Bundle. Geladen werden sie mit \usepackage{tabularx} bzw. \usepackage{tabulary}.

tabularx — die X-Spalte dehnt sich auf feste Breite

Anders als tabular nimmt die Umgebung tabularx die Zielbreite der gesamten Tabelle als erstes Argument: \begin{tabularx}{width}{column spec}. In der Spaltendeklaration kann der neue Spaltentyp X verwendet werden, eine p-artige Spalte, die sich automatisch dehnt oder schrumpft, um die Restbreite zu füllen. Mehrere X-Spalten teilen sich die verfügbare Breite gleichmäßig.

Der Mechanismus ist etwas ungewöhnlich: tabularx bestimmt die Breiten, indem es die Tabelle mehrfach setzt. Zuerst wird jede X-Spalte mit der vollen Zielbreite gesetzt, wodurch die Tabelle zu breit ist; dann wird der Überschuss durch die Zahl der X-Spalten geteilt, jede wird entsprechend schmaler gemacht und die Tabelle neu gesetzt. Das wiederholt sich bis zur Konvergenz. Am Ende wird X durch die Spalte ersetzt, die \tabularxcolumn definiert; die Vorgabe ist:

latex
\newcommand{\tabularxcolumn}[1]{p{#1}}

Damit ist X standardmäßig eine oben ausgerichtete Absatzspalte. Soll der Inhalt vertikal zentriert werden, definiert man \renewcommand{\tabularxcolumn}[1]{m{#1}} neu. Der Inhalt einer X-Spalte ist standardmäßig im Blocksatz; für Linksbündigkeit stellt man >{\raggedright\arraybackslash}X voran. Entscheidend ist \arraybackslash: \raggedright, \centering und \raggedleft definieren die Bedeutung von \\ um und kollidieren mit dem Zeilenabschluss der Tabelle. \arraybackslash nach diesen Deklarationen stellt \\ als Zeilenabschluss wieder her.

Wird derselbe Vorsatz mehrfach verwendet, kann \newcolumntype ihm zur besseren Lesbarkeit einen einbuchstabigen Alias geben. Das folgende Beispiel setzt Spalte 1 als linksbündige Spalte natürlicher Breite l und die zwei übrigen als gleich breite, linksbündige umbrechende Y-Spalten, sodass die ganze Tabelle auf \textwidth passt.

document.tex
\usepackage{tabularx}
\newcolumntype{Y}{>{\raggedright\arraybackslash}X}
% ...
\begin{tabularx}{\textwidth}{l Y Y}
  \hline
  項目 & 長所 & 短所 \\
  \hline
  tabular  & 単純で速い & 幅を自分で調整する必要がある \\
  tabularx & 表幅を固定でき、列が自動で伸縮する & 試し組みのぶん処理が遅い \\
  \hline
\end{tabularx}

Diese Tabelle erstreckt sich über die volle Textbreite (\textwidth). Spalte 1 („Item“) behält die natürliche Breite ihrer kurzen Wörter, und Spalten 2–3 erhalten jeweils die Hälfte der Restbreite, sodass längere Beschreibungen dort umbrechen. Da Y, also ein linksbündiges X, verwendet wird, sind die Zellen rechts flatternd. Für ungleiche Gewichtung ist die unten gezeigte Koeffizientensyntax von tabularray, etwa X[2], praktisch; einfaches tabularx hat keine Koeffizientenoption.

Eine Einschränkung: Weil der Rumpf mehrfach expandiert wird, können Befehle mit Nebenwirkungen wie Zählererhöhungen, Dateischreiben oder \verb in tabularx fehlerhaft reagieren. Eine Zelle, die eine Fußnote oder \verb enthalten muss, wird typischerweise zuerst in eine Box gepackt.

tabulary — Breite nach Inhalt verteilen

tabularx verteilt Platz unter seinen X-Spalten gleichmäßig. Wenn Spalten aber sehr unterschiedliche Mengen enthalten, etwa ein kurzes Label in der einen und eine lange Beschreibung in der anderen, sehen gleiche Anteile ungeschickt aus. tabulary verteilt die Breite daher proportional zur natürlichen Breite des Inhalts jeder Spalte und skaliert die Summe auf die gewünschte Breite.

Die Syntax entspricht tabularx: \begin{tabulary}{width}{column spec}. Es gibt vier Spaltentypen, alle Absatzspalten mit automatischer Breite: L links, C zentriert, R rechts, J Blocksatz. Gewöhnliche l-, c-, r-, p{width}-Spalten usw. können gemischt werden; sie werden nicht gemessen und bleiben auf natürlicher Breite. Jede gemessene Spalte wird nach der natürlichen Breite ihrer breitesten Zelle gewichtet und so skaliert, dass die Tabelle die angeforderte Gesamtbreite erreicht; eine Spalte, deren natürliche Breite bereits kleiner ist, bleibt jedoch unverändert.

Um extreme Verteilungen zu begrenzen, gibt es zwei Längen für gemessene Spalten: die Mindestbreite \tymin (Vorgabe 10pt) und die Höchstbreite \tymax (Vorgabe 2\textwidth). Sie helfen, wenn ein einzelner sehr langer Eintrag sonst die Spaltenbreite dominieren würde.

document.tex
\usepackage{tabulary}
% ...
\begin{tabulary}{\textwidth}{L L}
  \hline
  用語 & 説明 \\
  \hline
  X 列 & 表幅から固定部分を引いた残りを、X 列どうしで均等に分け合う列。 \\
  \hline
\end{tabulary}

Beide Spalten sind hier L, also linksbündig; Spalte 1 („Term“) ist schmal, weil ihr Inhalt kurz ist, während Spalte 2 („Description“) für ihren Text den breiteren Anteil erhält. Mit tabularx und X X wären beide Spalten gleich breit; tabulary folgt dem Gewicht des Inhalts, sodass eine Label-plus-Text-Tabelle natürlich proportioniert wirkt. Auch tabulary verarbeitet den Rumpf zweimal; daher gelten dieselben Vorsichtsmaßnahmen für Fußnoten und Zähler wie bei tabularx.

tabularray — die moderne tblr-Umgebung

tabularray ist das in den letzten Jahren am aktivsten entwickelte Tabellenpaket, geschrieben von Jianrui Lyu (lvjr). Es verwirft die alte auf \halign beruhende Technik und analysiert und setzt Tabellen direkt mit LaTeX3 (expl3). Seine Hauptstärke ist, dass es Dinge, für die zuvor mehrere Pakete wie array, booktabs, multirow, colortbl und diagbox zusammenspielen mussten, in eine einzige Schlüssel-Wert-Schnittstelle integriert: Linien, Farbe, Zellspannen, Absatzformatierung und Spaltenbreiten. Geladen wird es mit \usepackage{tabularray}; die Hauptumgebung ist tblr.

Die Struktur von tblr unterscheidet sich etwas von tabular: Vor dem Rumpf steht ein Argument mit durch Kommas getrennten Schlüssel-Wert-Optionen, die innere Spezifikation, wie in \begin{tblr}{ … inner spec … }. Die Spaltenausrichtung wird mit dem Schlüssel colspec deklariert. Die bekannte Einbuchstabenform colspec={lcr} ist möglich, doch die eigentliche Stärke liegt in Q[…], einer allgemeinen Spalte mit Ausrichtung, Breite und weiteren Optionen in eckigen Klammern, und X[…], einer dehnbaren Spalte wie bei tabularx. X[c] ist eine zentrierte dehnbare Spalte; X[2,l] eine linksbündige mit Koeffizient 2, also doppelt so breit wie ein normales X.

Bei X-Spalten gibt man die Breite, in die sie sich ausdehnen, mit dem Schlüssel width an; ohne Angabe gilt \linewidth. Abstände zwischen Zeilen und Spalten steuern rowsep und colsep, in tblr standardmäßig rowsep=2pt und colsep=6pt. Linien sind deklarativ: hlines / vlines zeichnen alle horizontalen / vertikalen Linien, und hline{n} / vline{n} formatieren eine bestimmte Linie, etwa hline{2}={1pt,solid}. Im Rumpf schreibt man kein \hline.

Zellspannen werden im Rumpf mit \SetCell gesetzt. \SetCell[c=2]{c} ist eine zentrierte Zelle, die 2 Spalten spannt (entspricht \multicolumn), und \SetCell[r=2]{c} spannt 2 Zeilen (entspricht \multirow). c= und r= geben die Spalten- bzw. Zeilenspanne an, das Argument in Klammern die Ausrichtung der Zelle. Ganze Zeilen oder Spalten gestaltet man mit \SetRow / \SetColumn; \SetRow{cyan8} färbt eine Zeile etwa blass cyan. Die Farbnamen sind im Paket eingebaut.

document.tex
\usepackage{tabularray}
% ...
\begin{tblr}{
  width = \textwidth,
  colspec = {Q[l] X[c] X[2,l]},
  rowsep = 3pt,
  hline{1,Z} = {1pt,solid},
  hline{2} = {0.5pt,solid},
  row{1} = {font=\bfseries},
}
  項目 & 区分 & 説明 \\
  \SetCell[r=2]{l} 表環境 & 固定幅 & 表全体の幅を固定し、X 列が残りを分け合う。 \\
   & 内容幅 & 各列の中身の量に応じて幅を配分する。 \\
  注記 & --- & 罫線・色・結合をキーで一括指定できる。 \\
\end{tblr}

Dieses tblr fixiert die Tabellenbreite mit width=\textwidth auf die Textbreite. Die drei Spalten sind Q[l] (linke Basisspalte), X[c] (zentrierte dehnbare Spalte) und X[2,l] (linke dehnbare Spalte mit Koeffizient 2). Die zwei X-Spalten teilen die Restbreite daher 1 : 2, und Spalte 3 („Description“) wird am breitesten. Im Rumpf steht kein \hline; die Linien kommen nur aus den hline{…}-Schlüsseln der inneren Spezifikation, wobei Z der spezielle Index für die letzte Zeile ist. Die erste Zeile wird mit row{1}={font=\bfseries} fett, und die Zelle „Table environment“ in Spalte 1 spannt mit \SetCell[r=2]{l} zwei Zeilen. All das ohne zusätzliche Pakete wie booktabs, multirow und array zu erreichen, ist genau der Reiz von tabularray.

Für seitenübergreifende Tabellen gibt es die Umgebung longtblr mit wiederholten Kopfzeilen, Captions und Fußnoten; für eine einseitige Tabelle mit Anmerkungen im Stil von threeparttable gibt es talltblr. Caption, Label, note{…} und Ähnliches kommen dabei in das optionale Argument […] vor dem Rumpf, die äußere Spezifikation.

Wozu greifen?

Als Faustregel gilt: Soll eine Tabelle auf eine feste Breite passen und gleich breite Textspalten haben, verwenden Sie tabularx. Soll die Breite fest sein, aber natürlich nach Inhaltsmenge der Spalten verteilt werden, verwenden Sie tabulary. Wenn in neuer Arbeit Linien, Farbe, Zellspannen und Spaltenbreiten in einem einzigen System gesteuert werden sollen, nehmen Sie tabularray.

tabularray ist funktionsreich und deckt mit X-Spalten plus width-Schlüssel das Breitenproblem ab, das tabularx / tabulary lösen. Dagegen sind tabularx und tabulary ausgereift, leichtgewichtig und fügen sich gut in bestehenden tabular-Code ein. Kurz gesagt: Ältere Pakete eignen sich, um einer kurzen bestehenden Tabelle Breitenkontrolle hinzuzufügen; tabularray eignet sich, wenn anspruchsvolle Tabellen neu aufgebaut werden.

PaketWie die Breite festgelegt wirdGeeignet für
tabularxFeste Gesamtbreite; X-Spalten teilen gleichmäßigGleich breite Textspalten auf Zielbreite
tabularyFeste Gesamtbreite; nach Inhalt verteiltUngleichmäßige Label-plus-Text-Tabellen
tabularraywidth-Schlüssel + X-Spalten (mit Koeffizienten)Moderne Tabellen mit Linien, Farbe und Spannen aus einem System

Die Details der Spaltendeklaration selbst, etwa \multicolumn und >{…} aus dem Paket array, stehen auf der Seite „Spaltendeklaration“; die Grundlagen des Zellverbindens auf „Zellen verbinden“; und sehr lange seitenübergreifende Tabellen auf der Seite „longtable“.