Spaltenspezifikation, Ausrichtung und Breite

Das erste Argument von tabular — eine Spaltendeklaration wie {lcr} — ist nicht nur eine Liste von Ausrichtungen. Es ist eine kleine Sprache: Neben Spaltenzahl und Ausrichtung kann man hier festlegen, dass LaTeX vor oder nach jeder Zelle eine Deklaration einfügt, den Abstand zwischen Spalten ersetzt oder eine Gruppe von Spalten wiederholt. Vieles davon gehört nicht zum einfachen tabular, sondern wird vom Paket array ergänzt. Ausgehend von l, c, r und p{width} behandelt diese Seite m{width} und b{width}, >{…} und <{…}, @{…} und !{…} sowie *{n}{…}.

Die kleine Sprache der Spaltendeklaration

Die vier Grundtypen wurden auf einer anderen Seite behandelt. l, c und r richten links, zentriert und rechts aus und bemessen die Spalte nach ihrem natürlichen Inhalt, ohne umzubrechen. Nur p{width} wird als Absatzbox der angegebenen Breite gesetzt und bricht um, wenn der Inhalt sie überschreitet. In den Begriffen des Pakets array ist p{width} äquivalent zu \parbox[t]{width} — also ein oben ausgerichteter Absatz. Diese Vorgabe „oben“ ist der Vergleichspunkt zu den zwei Verwandten, die nun folgen.

Die meisten der ab hier eingeführten Zeichen — m/b, >/<, @/!, * — stehen erst zur Verfügung, wenn in der Präambel \usepackage{array} steht. array gehört zu TeX Live und MiKTeX und wird von vielen Tabellenpaketen wie tabularx, booktabs und anderen intern geladen, ist also oft schon aktiv. Sicherer ist es trotzdem, es ausdrücklich zu laden.

Absatzspalten — p, m, b

Es gibt drei Arten umbrechender Absatzspalten; sie unterscheiden sich nur in der vertikalen Position der Zelle, also darin, wie ihre Box innerhalb der Zeile ausgerichtet ist. Nach der Definition des array-Handbuchs ist p{width} \parbox[t], also oben ausgerichtet; m{width} zentriert den Inhalt vertikal in der Zeile; und b{width} ist \parbox[b], also unten ausgerichtet. m und b stammen aus dem Paket array; einfaches tabular kennt sie nicht.

Wichtig wird das, wenn eine Zeile eine hohe Zelle, etwa eine p-Spalte mit mehreren umbrochenen Zeilen oder ein großes Bild, mit einzeiligen Zellen mischt. Beim Standard-p oben klebt die kurze Nachbarzelle am oberen Rand der Zeile und liegt nicht auf Höhe der Mitte der hohen Zelle. Mit m{width} steht der Inhalt dieser Spalte vertikal in der Zeilenmitte und richtet sich natürlich an einer einzeiligen Nachbarzelle aus. Nützlich ist das für Bildzellen oder für Tabellen, die links ein Label und rechts eine lange Beschreibung kombinieren.

latex
\usepackage{array}
% ...
\begin{tabular}{ p{3cm} m{3cm} b{3cm} }
  \hline
  上端揃え (p) & 縦中央 (m) & 下端揃え (b) \\
  この列は parbox[t]。 & この列は行の上下中央に。 & この列は parbox[b]\\
  \hline
\end{tabular}

Bei gleicher Breite und gleichem Text ändern p, m und b, wo jede Zelle vertikal sitzt. In allen drei Fällen gilt außerdem: Innerhalb einer Absatzspalte ist \parindent (Absatzeinzug) standardmäßig 0; bei Bedarf kann er etwa mit >{\setlength{\parindent}{1em}} wieder hinzugefügt werden.

TypVertikale PositionÄquivalente parboxBereitgestellt durch
p{wd}Oben\parbox[t]{wd}Standard
m{wd}Mittein der Zeile zentriertarray
b{wd}Unten\parbox[b]{wd}array

Vor und nach Zellen einfügen — >{…} und <{…}

Das Kernstück des Pakets array sind >{decl} und <{decl}. >{decl} fügt decl unmittelbar vor dem Inhalt jeder Zelle dieser Spalte ein; <{decl} entsprechend unmittelbar danach. >{\bfseries}l macht zum Beispiel jede Zelle einer linksbündigen Spalte fett, ohne dass in jeder Zelle \bfseries stehen muss. >{\itshape}c ergibt zentrierte Kursivschrift, >{\color{red}}r rechtsbündiges Rot usw.

In >{…} können auch Ausrichtungsdeklarationen stehen. Absatzspalten (p, m, b) sind standardmäßig im Blocksatz; >{\raggedright}p{4cm} macht daraus eine linksbündige, rechts flatternde Spalte, >{\centering} eine zentrierte und >{\raggedleft} eine rechtsbündige Absatzspalte. So lässt sich der Wunsch „umbrechen, aber nicht im Blocksatz“ präzise erfüllen.

Es gibt jedoch eine ernste Falle. Die drei Befehle \raggedright, \raggedleft und \centering definieren intern den Zeilenabschluss \\ um. Steht eine Spalte, die einen davon in >{…} verwendet, als letzte Spalte der Tabelle, funktioniert \\ nicht mehr als Zeilenende, und es kommt zu Fehlern oder kaputter Ausgabe. Die Lösung ist, am Ende der Deklaration \arraybackslash aus array anzuhängen: >{\raggedright\arraybackslash}p{4cm} stellt \\ als Zeilenumbruch wieder her. Dasselbe gilt für \centering und \raggedleft.

Ein weiterer Standardtrick ist, eine ganze Spalte in den Mathematikmodus zu setzen. >{$}c<{$} klammert jede Zelle vorne und hinten mit $, sodass alle Zellen dieser Spalte als Inline-Mathematik gesetzt werden. In zahlen- oder symbolreichen Spalten spart das jedes einzelne $…$. Umgekehrt heben sich in einer array-Umgebung, deren Zellen ohnehin im Mathematikmodus stehen, die beiden $ bei >{$}…<{$} auf und setzen nur diese Spalte in den Textmodus.

Wichtig: In >{…} und <{…} gehören Deklarationen. Formen ohne nachfolgendes Argument, etwa >{\bfseries} oder >{\itshape}, sind unproblematisch; man darf aber nicht mit einem Befehl enden, der ein Argument nimmt. >{\textbf} zum Beispiel versucht, den Zellinhalt als Argument zu lesen, und verhält sich falsch; für Fettdruck verwendet man die Deklarationsform \bfseries. Das array-Handbuch warnt, dass >{\textbf} weder die ganze Spalte noch den ersten Buchstaben fett machen würde.

An der Spaltengrenze — @{…} und !{…}

Zwischen zwei Spalten fügt LaTeX standardmäßig \tabcolsep Abstand ein, 6pt auf jeder Seite und damit insgesamt das Doppelte. Steht @{decl} an dieser Stelle der Spaltendeklaration, entfernt es dort den Spaltenzwischenraum und fügt stattdessen decl ein; im Wortlaut des array-Handbuchs „suppresses inter-column space and inserts decl. instead“.

Es gibt zwei Hauptanwendungen. Erstens äußeres Tabellenpolster entfernen: @{} als leere Deklaration an beiden Enden entfernt \tabcolsep links der ersten und rechts der letzten Spalte, sodass die Tabelle bündig mit dem linken Textrand steht. Das ist ein häufiges Idiom in booktabs-Tabellen. Zweitens ein Trennzeichen einfügen: Für Dezimalausrichtung teilt man Zahlen in eine Vorkomma- und eine Nachkommaspalte und setzt @{.} dazwischen; die Punkte stehen dann an fester Stelle und ergeben Ausrichtung am Dezimalpunkt.

Das Gegenstück zu @{…} ist !{decl}. Es kann an der Stelle stehen, an der sonst eine vertikale Linie | stünde, und fügt statt dieser Linie beliebiges decl ein. Der entscheidende Unterschied zu @{…}: !{…} entfernt den normalen Spaltenzwischenraum nicht. Es passt also zu Fällen wie „eine gestrichelte Linie zwischen Spalten zeichnen, aber den Spaltenabstand behalten“, etwa indem ein gestrichelter Linienbefehl aus arydshln in !{…} steht.

Nebenbei ändert das Laden von array auch das Verhalten der vertikalen Linie | ein wenig: Der Spaltenabstand wird um die Linienstärke breiter. In Standard-LaTeX sitzt die Linie im vorhandenen Abstand, ohne ihn zu vergrößern. Vertikale Linien selbst sollten in professionellen Tabellen jedoch meist vermieden werden; das gehört zur Seite „Linien und publikationsreife Tabellen“.

Spalten wiederholen — *{n}{…}

Wenn viele gleich deklarierte Spalten hintereinander stehen, fasst *{count}{spec} die Wiederholung zusammen. Nach dem array-Handbuch ist das äquivalent zu „count Kopien von spec“. Für sechs zentrierte Spalten schreibt man *{6}{c} statt cccccc. Die wiederholte Einheit darf mehrere Deklarationen enthalten: *{3}{|c}| expandiert zu |c|c|c|. Besonders nützlich ist das bei langen Deklarationen mit >{…} oder @{…}; *{4}{>{$}c<{$}} erzeugt etwa vier zentrierte Mathematikspalten auf einmal.

Ein Beispiel mit mehreren Kombinationen

Zum Schluss eine Spaltendeklaration, die die obigen Werkzeuge bündelt. Spalte 1 ist eine fette Beschriftungsspalte (>{\bfseries}l); Spalte 2 ist eine linksbündige umbrechende Absatzspalte (>{\raggedright\arraybackslash}p{5cm} — hier nicht zwingend nötig, da sie nicht die letzte Spalte ist, aber \arraybackslash steht aus Gewohnheit dabei); Spalten 3 und 4 sind zentrierte Mathematikspalten, gemeinsam mit *{2}{…} gebaut; und das äußere Polster wird an beiden Enden mit @{} entfernt.

document.tex
\usepackage{array}
% ...
\begin{tabular}{@{} >{\bfseries}l >{\raggedright\arraybackslash}p{5cm} *{2}{c} @{}}
  \hline
  記号 & 意味 & 値 & 単位 \\
  \hline
  $c$ & 真空中の光速。物理定数のひとつ。 & $2.998\times10^{8}$ & m/s \\
  $g$ & 標準重力加速度。地表付近での近似値。 & $9.807$ & m/s$^2$ \\
  \hline
\end{tabular}

Das Ergebnis: Die Symbolspalte ist einheitlich fett, die Bedeutungsspalte bricht linksbündig bei 5cm um, die zwei Wertespalten stehen zentriert, und die ganze Tabelle ist ohne äußeres Polster bündig am linken Textrand. Mehrere Mechanismen in eine Deklaration zu packen ist die Stärke der Spaltensprache, kann aber schwer lesbar werden. Für häufig verwendete Kombinationen vergibt man daher mit \newcolumntype{yourletter}{…} einen Namen als eigenen Spaltentyp und verwendet ihn knapp wie {C C C} wieder; das ist eine Funktion von array.

Für die Ausrichtung von Zahlen am Dezimalpunkt ist heute übrigens die S-Spalte aus dem Paket siunitx die moderne und zuverlässige Wahl, nicht das hier gezeigte @{.}. Die S-Spalte analysiert jede Zahl und richtet Vorkommateil, Dezimalpunkt, Nachkommteil, Exponent und sogar Unsicherheiten korrekt aus; außerdem bereinigt sie Gruppierung und signifikante Stellen. Siehe dazu auch die Seite „Breite Tabellen und automatische Breite“.