Das Paket colortbl färbt nicht den Hintergrund der Zellen einer LaTeX-Tabelle. Es legt farbige Flächen hinter sie — so formuliert es der Autor David Carlisle in seiner eigenen Dokumentation. Fast alles Rätselhafte an Tabellenfarbe folgt aus diesem einen Satz: warum ein angefordertes \cline nirgends zu sehen ist, und warum zwischen der Farbfläche und einer booktabs-Linie ein weißer Streifen übrig bleibt. Diese Seite beginnt bei der einen Zeile \usepackage[table]{xcolor} und arbeitet sich durch \rowcolor (Zeilen), \columncolor (Spalten), \cellcolor (Zellen), \rowcolors für Zebrastreifen und \arrayrulecolor für Linien — bis hin zu dem Einwand, den booktabs erhebt: dass hier vielleicht gar keine Farbe hingehört.
Welches Paket wird zum Färben einer Tabelle gebraucht
Eine Zeile genügt: \usepackage[table]{xcolor}. colortbl muss nicht ausdrücklich geladen werden, denn die Option table von xcolor zieht es automatisch mit. Umgekehrt lässt sich auch nur \usepackage{colortbl} schreiben, dann fehlen allerdings die Farbnamen. colortbl benötigt intern array und color, und color definiert kaum eigene Namen; sobald also \rowcolors{2}{gray}{white} im Dokument steht, bricht der Lauf mit ! LaTeX Error: Undefined color 'gray'. ab. Namen und Mischungen beizusteuern ist gerade die Aufgabe von xcolor — deshalb landet man in der Praxis bei der einen Zeile mit [table].
% one line brings in both xcolor and colortbl
\usepackage[table]{xcolor}Nur bei beamer sieht es anders aus: Dort wird es als Klassenoption übergeben, \documentclass[xcolor=table]{beamer}. Für die Farben selbst funktioniert jeder xcolor-Ausdruck, also neben schlichten Namen wie gray und red auch gray!20 (20% Intensität) oder red!30!yellow (30% Rot in Gelb gemischt). Eine gesättigte Farbe hinter dem Text macht diesen unlesbar; der praktische Bereich für Tabellenflächen liegt daher bei verdünnten Angaben von name!15 bis name!25.
Option clash for package xcolor – und warum der Fehler kaum noch auftritt
! LaTeX Error: Option clash for package xcolor. war lange die häufigste Falle beim Färben von Tabellen. Die Ursache war schlicht: tikz, pgfplots oder beamer hatten bereits xcolor ohne Optionen geladen, sodass ein späteres \usepackage[table]{xcolor} als erneutes Laden desselben Pakets mit anderen Optionen galt. Mit xcolor 3.00 vom 11. November 2023 hat sich das geändert. Seit dieser Version ist table überhaupt keine Ladeoption mehr, sondern ein Präambel-Schlüssel, deklariert über den neueren Schlüssel-Wert-Mechanismus von LaTeX, und lässt sich daher auf ein bereits geladenes xcolor nachträglich anwenden. Unter TeX Live 2024 erzeugt es keinerlei Fehler, zuerst tikz zu laden und danach \usepackage[table]{xcolor} zu schreiben — während derselbe Versuch mit geometry nach wie vor bei Option clash for package geometry. abbricht.
Der im Netz weiterhin kursierende Rat, [table] in die Klassenoptionen hochzuziehen, ist damit ein Behelf für ältere Installationen. Solche begegnen einem aber noch, deshalb lohnt sich die Reihenfolge der Gegenmaßnahmen. Zuerst in die Klassenoptionen verschieben: Mit \documentclass[table]{article} steht der Wunsch vor allen anderen. Hilft das nicht, \usepackage{colortbl} direkt laden — es kollidiert eine Option von xcolor, nicht colortbl selbst. Zu beachten ist außerdem, dass das neue Verhalten von xcolor 3.00 nur ab LaTeX 2022-06-01 greift; gegenüber älteren Formaten wird automatisch eine eingefrorene Fassung verwendet. Stört umgekehrt das neue Verhalten ein bestehendes Dokument, holt \usepackage{xcolor}[=v2] die alte Version ausdrücklich zurück.
Der Unterschied zwischen \rowcolor, \columncolor und \cellcolor
Die drei unterscheiden sich nicht nur im gefärbten Bereich, sondern auch darin, wo sie jeweils stehen. \rowcolor{color} steht am Zeilenanfang, vor dem Inhalt der ersten Zelle dieser Zeile, also unmittelbar nach dem vorangehenden \\. \columncolor{color} steht nicht im Tabellenrumpf, sondern in der Spaltendeklaration, in der Form >{\columncolor{gray!20}}. Der Haken >{…} stammt aus dem Paket array und fügt Material direkt vor jede Zelle dieser Spalte ein; colortbl nutzt ihn einfach mit. Nur \cellcolor{color} ist frei und wirkt an beliebiger Stelle innerhalb der betroffenen Zelle. Diese Asymmetrie lässt sich schlecht merken, hat aber einen klaren Grund: Eine Zeile ist nur in dem Moment zu fassen, in dem sie beginnt, und eine Spalte lässt sich nur vor Beginn der Tabelle deklarieren.
Alle drei teilen dieselbe Argumentform: \columncolor[model]{color}[left overhang][right overhang], mit einem optionalen Farbmodell vor der Farbe und optionalen linken und rechten Überhängen danach. Der Überhang legt fest, wie weit die Farbfläche über die Spalte hinausreicht. Wird der rechte weggelassen, übernimmt er den linken Wert; fehlen beide, gilt \tabcolsep in tabular beziehungsweise \arraycolsep in array. Bei 0pt für beide endet die Fläche exakt an der Breite des Spalteninhalts — genau daher rührt meist die weiße Naht zwischen Zellen. Sollen benachbarte Farben zusammenlaufen, ist der Überhang also zu vergrößern, nicht zu verkleinern.
\begin{tabular}{>{\columncolor{gray!20}}l c r}
\rowcolor{blue!30}
Item & Qty & Price \\
Apple & 3 & 380 \\
Orange & \cellcolor{yellow!40}5 & 120 \\
\end{tabular}Dieses Trio wurde nicht in einem Zug entworfen, sondern wuchs über zwei Jahrzehnte. Der erste Entwurf von colortbl trägt das Datum 20. September 1996 und enthielt allein \columncolor. \rowcolor kam vierzehn Tage später hinzu, am 5. Oktober 1996, und laut Änderungsprotokoll wurde es aufgenommen, um S. Rahtz eine Freude zu machen — Sebastian Rahtz, eine der großen Gestalten der TeX-Welt. \cellcolor folgte erst fünf Jahre danach, am 13. Februar 2001, beigesteuert von Donald Arseneau. Bis dahin hieß das Färben einer einzelnen Zelle \multicolumn{1}{>{\columncolor{…}}c}{…}, und Carlisle nennt dagegen drei Einwände: Der Zellinhalt kann das Auslösen der Färbung verhindern; die Spaltenausrichtung muss von Hand kopiert werden, was besonders bei p{}-Spalten fehleranfällig ist; und drittens sei \multicolumn{1} schlicht albern. Für eine einzelne Zelle also \cellcolor.
Welche Farbe gewinnt bei Überlagerung: Zelle vor Zeile vor Spalte
\cellcolor überschreibt \rowcolor, und \rowcolor überschreibt \columncolor — Zelle vor Zeile vor Spalte. Je enger der Geltungsbereich, desto stärker der Anspruch; genau das erwartet die Intuition, es ist also nichts umzulernen. Dank dieser Ordnung lassen sich drei Schichten ohne Konfliktsorgen stapeln: ein blasses Grau über eine ganze Spalte, Blau allein auf der Kopfzeile und Gelb auf der einen Zelle, die auffallen soll. Verständlich wird der Entwurf, wenn man die weite Angabe als Vorgabe und die enge als deren Ausnahme liest.
| Befehl | Was gefärbt wird | Wo er steht |
|---|---|---|
\columncolor{c} | Ganze Spalte | Im >{…} der Spaltendeklaration |
\rowcolor{c} | Ganze Zeile | Zeilenanfang, vor der ersten Zelle |
\cellcolor{c} | Einzelne Zelle | In dieser Zelle, beliebig |
\rowcolors{n}{a}{b} | Abwechselnde Zeilen (Zebra) | Einmal vor der Tabelle |
\arrayrulecolor{c} | Alle folgenden Linien | Außerhalb, am Zeilenanfang oder in >{} |
\doublerulesepcolor{c} | Der Abstand zwischen Doppellinien | Wie bei \arrayrulecolor |
Automatische Zebrastreifen mit \rowcolors
Für abwechselnd gefärbte Zeilen genügt es, einmal vor der Tabelle \rowcolors{start}{odd-row color}{even-row color} zu schreiben. Auf das abschließende s kommt es an: \rowcolor ohne s ist der eigene Befehl für eine einzelne Zeile. Das erste Argument ist die Zeile, ab der gefärbt wird; mit 2 bleibt eine Kopfzeile unberührt. Beide Farbargumente dürfen leer bleiben, und leer heißt „keine Farbe“. Ein Punkt widerspricht hier den meisten älteren Fundstellen im Netz: \rowcolors ist kein xcolor-Befehl mehr. Der Code wanderte mit Version 1.0f vom 20. Juni 2022 aus xcolor nach colortbl, und das Änderungsprotokoll von xcolor 3.00 hält die Übergabe fest. An der Schreibweise ändert das nichts, doch es ist nützlich zu wissen, dass heute bereits \usepackage{colortbl} allein \rowcolors definiert.
% start striping at row 2, so the header stays plain
\rowcolors{2}{gray!15}{white}
\begin{tabular}{l r r}
Item & Qty & Price \\
Apple & 3 & 380 \\
Orange & 5 & 120 \\
Grape & 2 & 600 \\
Peach & 4 & 450 \\
\end{tabular}Streifen sind keine Alles-oder-nichts-Sache. Erstens nimmt \rowcolors ein vorangestelltes optionales Argument: \rowcolors[\hline]{2}{…}{…} führt vor jeder Zeile einen Befehl wie \hline aus. Zweitens hat ein ausdrückliches \rowcolor oder \multicolumn Vorrang vor der automatischen Streifung, sodass sich eine einzelne Zeile mitten im Streifenblock mühelos umfärben lässt. Und zum vorübergehenden Abschalten gibt es \hiderowcolors und \showrowcolors, die innerhalb der Tabelle stehen dürfen und das Muster ab dieser Stelle unterdrücken oder wieder aufnehmen. Eine Anforderung wie „alles gestreift außer der Summenzeile“ ist damit erledigt.
Linien färben mit \arrayrulecolor und \doublerulesepcolor
Die Farbe von \hline, \cline und der senkrechten | ändert \arrayrulecolor{color}. Der Befehl nimmt dieselben Argumente wie \color und ist eine globale Deklaration; er darf außerhalb der Tabelle, am Zeilenanfang oder in einem >{} der Spaltendeklaration stehen. Eine Falle gibt es: Mitten in der Tabelle angegeben, erreicht er nur die danach angegebenen Linien; senkrechte Linien, die bereits in der Spaltendeklaration festgelegt wurden, behalten ihre ursprüngliche Farbe. Da die Deklaration global ist, überdauert sie zudem das Tabellenende — wer nicht alle folgenden Tabellen mitfärben will, stellt mit einem erneuten \arrayrulecolor{black} den Ausgangszustand wieder her.
Der Abstand zwischen den Doppellinien aus || oder \hline\hline bleibt standardmäßig weiß. Zum Füllen dient \doublerulesepcolor{color} zusammen mit \doublerulesep, der Länge für die Breite dieses Abstands. Zu beachten ist allerdings: Sobald dieser Befehl im Spiel ist, kann longtable den Zwischenraum bei \hline\hline an einem Seitenumbruch nicht mehr verwerfen. TeX besitzt zwar einen Mechanismus zum Verwerfen von Leim, doch ein gefärbter „Zwischenraum“ ist in Wahrheit eine dritte Linie, und Linien lassen sich weit schwerer verwerfen als Leim. Wenn eine lange Tabelle über Seiten hinweg umbrechen soll, ist das vorher zu wissen.
\setlength\arrayrulewidth{1pt}\arrayrulecolor{blue}
\setlength\doublerulesep{2pt}\doublerulesepcolor{yellow}
\begin{tabular}{||l|c||}
\hline\hline
one & two \\
three & four \\
\hline\hline
\end{tabular}
\arrayrulecolor{black} % global: reset, or later tables inherit itSoll nur eine einzelne senkrechte Linie farbig werden, lassen sich die Spezialbefehle ganz umgehen: Statt | kommt !{\color{green}\vline} in die Spaltendeklaration. Ein kleiner, aber praktischer Punkt dazu: \arrayrulewidth bestimmt die Linienstärke, und eine auf Haarlinie belassene Linie wirkt gefärbt sehr schwach. Eine Stärke, die in Schwarz reichlich war, verschwindet in einem hellen Farbton womöglich vom Papier — als Faustregel gilt daher, eine Linie beim Einfärben etwas kräftiger zu setzen.
Warum \cline unter einer gefärbten Zeile verschwindet
Wird in einer Tabelle mit \rowcolor ein \cline gezogen, ist die Linie überhaupt nicht zu sehen. Das ist kein Fehler, sondern die Folge des eingangs erwähnten Prinzips: colortbl legt Farbe als Flächen hinter die Zellen, \cline wird jedoch noch weiter hinten gezeichnet und daher von der Farbe verdeckt. In einem Kommentar im Quelltext räumt Carlisle ein, dass \cline in einer gefärbten Tabelle nicht wirklich funktioniert, und begnügt sich damit, wenigstens den noch sichtbaren Teilen die richtige Farbe zu geben. Der Ausweg ist eindeutig: statt \cline das Paket hhline laden und etwa \hhline{-~} schreiben, wobei - für „hier eine Linie ziehen“ und ~ für „diese Spalte auslassen“ steht. Diese Linie liegt über der Farbfläche und ist sichtbar.
% \cline{1-1} would vanish behind the panel; \hhline draws on top
\usepackage{hhline}
...
\begin{tabular}{ll}
\rowcolor{blue!40} one & two \\
\hhline{-~}
\rowcolor{blue!40} three & four \\
\end{tabular}Die weiße Lücke zwischen booktabs-Linien und der Zeilenfarbe
colortbl und booktabs vertragen sich problemlos, doch zwischen \toprule, \midrule, \bottomrule und der Hintergrundfarbe bleibt ein weißer Streifen. Ursache ist der Abstand, den booktabs ober- und unterhalb seiner Linien einfügt: \aboverulesep steht standardmäßig auf .4ex, \belowrulesep auf .65ex. Dieser Abstand liegt außerhalb der Zeilenbox, und die Fläche von \rowcolor reicht deshalb nicht hinein. Soll die Füllung die Linie berühren, setzt man üblicherweise beide Abstände auf 0pt und verschiebt die verlorene Höhe stattdessen nach \extrarowheight: Die Zeilenhöhe bleibt erhalten, nur die Farbe stößt nun an die Linien.
% let the row color reach the booktabs rules
\setlength\aboverulesep{0pt}
\setlength\belowrulesep{0pt}
\setlength\extrarowheight{.75ex}Das andere klassische Symptom: große Schrift oder hoher Inhalt berührt das \hline oder die Oberkante der unmittelbar darüberliegenden Farbfläche. Da colortbl ohnehin jeden Eintrag in eine Box setzen und ausmessen muss, um die Breite der Linien zu bestimmen, wurde bei dieser Gelegenheit die Länge \minrowclearance ergänzt. \setlength\minrowclearance{2pt} fügt nur über hohen Zeilen etwas Abstand ein. Carlisle merkt allerdings an, dass es besser ist, zuerst \extrarowheight oder \arraystretch zu erhöhen, weil sich das Problem so bei gleichmäßigem Zeilenabstand lösen lässt: Übersteigt Versalhöhe plus dieser Wert die normale Zeilenhöhe, wird der Durchschuss sichtbar ungleichmäßig.
Zum Schluss die Frage, ob hier überhaupt Farbe hingehört. Simon Fear, der Autor von booktabs, war darin eindeutig: Lesbar wird eine gute Tabelle durch Weißraum und wenige waagerechte Linien; wer zwei Leitlinien beherzigt — niemals senkrechte Linien, niemals Doppellinien —, liegt kaum falsch. Er unterscheidet die „formal table“, einen Satz von Werten in beschrifteten Spalten, vom „tableau“, das vermutlich voller Symbole steckt und auch Farbe verwendet, und hält fest, dass die Gestalt der ersteren über Jahrhunderte hinweg entstanden ist und nur in außergewöhnlichen Fällen geändert werden sollte. Nebenbei: Die Versionsnummer von booktabs lautet 1.61803398 — der Scherz des Autors, sie konvergiere gegen φ, den Goldenen Schnitt. Bevor eine Tabelle Farbe bekommt, lohnt die einmalige Frage, ob Zeilenhöhe und zwei, drei Linien nicht schon genügt hätten.