Le package colortbl ne teinte pas le fond des cellules d’un tableau LaTeX. Il place des panneaux colorés derrière elles : c’est la formulation de son auteur, David Carlisle, dans sa propre documentation. Presque tout ce qui déroute dans la couleur des tableaux découle de cette seule phrase — pourquoi un \cline demandé reste introuvable, et pourquoi une bande blanche subsiste entre la couleur et un filet de booktabs. Cette page part de la ligne unique \usepackage[table]{xcolor} et parcourt \rowcolor (lignes), \columncolor (colonnes), \cellcolor (cellules), \rowcolors pour les bandes zébrées et \arrayrulecolor pour les filets, avant d’écouter l’objection que soulève booktabs : peut-être ne faut-il pas de couleur du tout.
Quel package faut-il pour colorer un tableau
Une seule ligne suffit : \usepackage[table]{xcolor}. Inutile de charger colortbl explicitement, car l’option table de xcolor l’entraîne automatiquement. On peut faire l’inverse et n’écrire que \usepackage{colortbl}, mais il manque alors les noms de couleurs. colortbl exige en interne array et color, et color ne définit presque aucun nom ; dès qu’on écrit \rowcolors{2}{gray}{white}, la compilation s’arrête sur ! LaTeX Error: Undefined color 'gray'. Fournir les noms et les mélanges est précisément le rôle de xcolor, d’où le retour systématique à la ligne unique avec [table].
% one line brings in both xcolor and colortbl
\usepackage[table]{xcolor}Seul beamer s’écrit autrement : il faut passer l’option à la classe, \documentclass[xcolor=table]{beamer}. Pour les couleurs elles-mêmes, toute expression xcolor convient : outre les noms simples comme gray et red, on peut écrire gray!20 (20 % d’intensité) ou red!30!yellow (30 % de rouge mélangé à du jaune). Une couleur saturée derrière du texte le rend illisible ; la plage utile pour un fond de tableau va donc d’un name!15 à un name!25 bien dilués.
Option clash for package xcolor — et pourquoi il a presque disparu
! LaTeX Error: Option clash for package xcolor. a longtemps été la mine la plus souvent déclenchée lorsqu’on colore un tableau. La cause était simple : tikz, pgfplots ou beamer avaient déjà chargé xcolor sans option, si bien que le \usepackage[table]{xcolor} écrit ensuite comptait comme un rechargement du même package avec d’autres options. xcolor 3.00, paru le 11 novembre 2023, a changé la donne. Depuis cette version, table n’est plus du tout une option de chargement mais une clé de préambule déclarée via le nouveau gestionnaire clé/valeur de LaTeX, applicable après coup à un xcolor déjà chargé. Sous TeX Live 2024, charger tikz puis écrire \usepackage[table]{xcolor} ne provoque aucune erreur — alors que la même expérience avec geometry s’arrête toujours sur Option clash for package geometry.
Le conseil qui circule encore sur le web — « remonter [table] dans les options de classe » — est donc devenu un contournement pour installations anciennes. On en rencontre toujours, d’où l’intérêt de connaître l’ordre des remèdes. D’abord déplacer l’option vers la classe : \documentclass[table]{article} place la demande avant toutes les autres. Si cela ne suffit pas, charger \usepackage{colortbl} directement — ce qui entre en conflit est une option de xcolor, pas colortbl lui-même. Notons aussi que le nouveau comportement de xcolor 3.00 ne s’applique qu’à partir de LaTeX 2022-06-01 ; face à un format plus ancien, une version figée est utilisée automatiquement. À l’inverse, si ce nouveau comportement perturbe un document existant, \usepackage{xcolor}[=v2] rappelle explicitement l’ancienne version.
La différence entre \rowcolor, \columncolor et \cellcolor
Les trois commandes diffèrent non seulement par la zone colorée mais par l’endroit où chacune s’écrit. \rowcolor{color} se place au début de la ligne, avant le contenu de sa première cellule, c’est-à-dire juste après le \\ précédent. \columncolor{color} ne va pas dans le corps du tableau mais dans la spécification des colonnes, sous la forme >{\columncolor{gray!20}}. Le crochet >{…} provient du package array, qui injecte du contenu juste avant chaque cellule de cette colonne, et colortbl s’y greffe simplement. Seul \cellcolor{color} est libre : n’importe où dans la cellule visée fera l’affaire. Cette asymétrie se retient mal, mais sa raison est nette : une ligne ne se saisit qu’au moment où elle commence, et une colonne ne se déclare qu’avant le début du tableau.
Les trois partagent la même forme d’arguments : \columncolor[model]{color}[left overhang][right overhang], avec un modèle de couleur optionnel avant la couleur et des débordements gauche et droit optionnels après. Le débordement indique jusqu’où le panneau coloré s’étend au-delà de la colonne de chaque côté. Omettez celui de droite et il recopie celui de gauche ; omettez les deux et vous obtenez \tabcolsep dans tabular, ou \arraycolsep dans array. Mettez les deux à 0pt et le panneau s’arrête exactement à la largeur du contenu de la colonne — c’est en général ce qui crée une couture blanche entre cellules. Pour souder deux couleurs voisines, il faut donc augmenter le débordement, non le réduire.
\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}Ce trio n’a pas été conçu d’un seul tenant : il s’est constitué sur deux décennies. Le premier brouillon de colortbl est daté du 20 septembre 1996 et ne contenait que \columncolor. \rowcolor est arrivé quinze jours plus tard, le 5 octobre 1996, et le journal des modifications note qu’il fut ajouté pour faire plaisir à S. Rahtz — Sebastian Rahtz, l’une des grandes figures du monde TeX. \cellcolor n’est apparu que cinq ans après, le 13 février 2001, sur une contribution de Donald Arseneau. Jusque-là, colorer une seule cellule imposait d’écrire \multicolumn{1}{>{\columncolor{…}}c}{…}, et Carlisle oppose trois objections à ce procédé : le contenu de la cellule peut empêcher la coloration de se déclencher ; l’alignement de colonne doit être recopié à la main, source d’erreurs surtout pour les colonnes p{} ; et troisièmement, \multicolumn{1} est tout bonnement absurde. Pour une cellule, donc : \cellcolor.
Quelle couleur l’emporte en cas de superposition : cellule, ligne, colonne
\cellcolor l’emporte sur \rowcolor, qui l’emporte sur \columncolor : cellule, puis ligne, puis colonne. Plus la portée est étroite, plus la revendication est forte — exactement ce que suggère l’intuition, il n’y a donc rien à désapprendre. Grâce à cet ordre, on empile trois couches sans craindre les conflits : un gris pâle sur toute une colonne, du bleu sur la seule ligne d’en-tête, et du jaune sur l’unique cellule à signaler. Le mieux est de lire ce dispositif comme traitant la déclaration large en valeur par défaut et la déclaration étroite en exception.
| Commande | Ce qui est coloré | Emplacement |
|---|---|---|
\columncolor{c} | Colonne entière | Dans le >{…} de la spécification |
\rowcolor{c} | Ligne entière | Début de ligne, avant la première cellule |
\cellcolor{c} | Cellule unique | Dans cette cellule, n’importe où |
\rowcolors{n}{a}{b} | Lignes alternées (zébrures) | Une fois, avant le tableau |
\arrayrulecolor{c} | Tous les filets suivants | Hors tableau, en début de ligne ou dans >{} |
\doublerulesepcolor{c} | L’espace entre filets doubles | Aux mêmes endroits que \arrayrulecolor |
Bandes zébrées automatiques avec \rowcolors
Pour alterner les couleurs au fil d’un tableau, il suffit d’écrire une fois \rowcolors{start}{odd-row color}{even-row color} avant le tableau. Le s final compte : \rowcolor sans s est la commande distincte qui colore une seule ligne. Le premier argument est la ligne à partir de laquelle la coloration démarre ; passez 2 pour laisser passer l’en-tête intact. Les deux arguments de couleur peuvent rester vides, et vide signifie « pas de couleur ». Un point contredit ici la plupart des articles anciens qu’on trouve en cherchant : \rowcolors n’est plus une commande de xcolor. Le code a été déplacé de xcolor vers colortbl dans la version 1.0f, datée du 20 juin 2022, et le journal de xcolor 3.00 acte ce transfert. L’écriture ne change pas, mais il est utile de savoir qu’aujourd’hui \usepackage{colortbl} seul définit déjà \rowcolors.
% 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}Le zébrage n’est pas du tout ou rien. D’abord, \rowcolors accepte un argument optionnel initial : \rowcolors[\hline]{2}{…}{…} exécute une commande telle que \hline avant chaque ligne. Ensuite, un \rowcolor ou un \multicolumn explicite prime sur le zébrage automatique, ce qui permet de recolorer sans peine une ligne isolée au milieu des bandes. Enfin, pour interrompre momentanément le motif, il existe \hiderowcolors et \showrowcolors, qui se placent à l’intérieur du tableau et suppriment ou reprennent les bandes à partir de ce point. Une exigence du type « tout zébré sauf la ligne de total » se règle ainsi.
Colorer les filets avec \arrayrulecolor et \doublerulesepcolor
La couleur de \hline, \cline et du | vertical se change avec \arrayrulecolor{color}. La commande prend les mêmes arguments que \color et constitue une déclaration globale : elle peut se placer hors du tableau, en début de ligne, ou dans un >{} de la spécification. Un piège subsiste. Donnée au milieu du tableau, elle n’atteint que les filets spécifiés après ce point ; les filets verticaux déjà déclarés dans la spécification gardent leur couleur d’origine. Étant globale, elle survit aussi à la fin du tableau : pour ne pas emporter tous les tableaux suivants, redéclarez \arrayrulecolor{black} afin de rétablir la valeur par défaut.
L’espace entre les filets doubles produits par || ou \hline\hline reste blanc par défaut. Pour le remplir, on emploie \doublerulesepcolor{color} avec \doublerulesep, la longueur qui fixe la largeur de cet espace. Attention toutefois : dès que cette commande entre en jeu, longtable ne peut plus escamoter l’espace entre \hline\hline à une coupure de page. TeX sait bien supprimer du ressort, mais un « espace » coloré est en réalité un troisième filet, et un filet se supprime bien moins facilement qu’un ressort. Si un long tableau doit se répartir sur plusieurs pages, mieux vaut le savoir d’avance.
\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 itPour ne colorer qu’un seul filet vertical, on peut se passer des commandes dédiées et glisser !{\color{green}\vline} dans la spécification à la place de |. Un détail petit mais utile : \arrayrulewidth est la longueur qui règle l’épaisseur des filets, et un filet laissé à l’épaisseur d’un cheveu paraît très faible une fois coloré. Une épaisseur amplement suffisante en noir peut disparaître de la page dès qu’elle passe à une teinte claire — d’où la règle empirique : en colorant un filet, épaississez-le légèrement.
Pourquoi \cline disparaît sous une ligne colorée
Tracez un \cline dans un tableau qui utilise aussi \rowcolor et le filet devient totalement invisible. Ce n’est pas un défaut mais la conséquence du mécanisme évoqué en ouverture : colortbl pose la couleur en panneaux derrière les cellules, alors que \cline est dessiné plus en arrière encore, si bien que la couleur le recouvre. Dans un commentaire du source, Carlisle admet que \cline ne fonctionne pas vraiment dans un tableau coloré et se contente de donner la bonne couleur aux parties encore visibles. Le contournement est net : au lieu de \cline, chargez le package hhline et écrivez par exemple \hhline{-~}, où - signifie « tracer un filet dans cette colonne » et ~ « sauter cette colonne ». Ce filet-là se dessine par-dessus le panneau et apparaît correctement.
% \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}L’espace blanc entre les filets de booktabs et la couleur de ligne
colortbl et booktabs cohabitent sans difficulté, mais une bande blanche subsiste entre \toprule, \midrule, \bottomrule et la couleur de fond. La cause est l’espace que booktabs insère au-dessus et au-dessous de ses filets : \aboverulesep vaut par défaut .4ex et \belowrulesep .65ex. Cet espace se trouve hors de la boîte de la ligne, si bien que le panneau de \rowcolor ne l’atteint jamais. Le correctif habituel, quand on veut que le remplissage touche le filet, consiste à mettre les deux à 0pt et à reporter la hauteur perdue dans \extrarowheight : les lignes conservent leur hauteur, seule la couleur change et rejoint les filets.
% let the row color reach the booktabs rules
\setlength\aboverulesep{0pt}
\setlength\belowrulesep{0pt}
\setlength\extrarowheight{.75ex}L’autre symptôme classique : un gros corps ou un contenu haut vient toucher le \hline ou le bord supérieur du panneau coloré juste au-dessus. Comme colortbl doit de toute façon mettre chaque entrée en boîte et la mesurer pour déterminer la largeur des filets, la longueur \minrowclearance a été ajoutée par la même occasion. \setlength\minrowclearance{2pt} insère un peu d’espace au-dessus des seules lignes hautes. Carlisle note toutefois qu’il vaut mieux augmenter d’abord \extrarowheight ou \arraystretch, qui règlent le problème tout en gardant un interligne régulier : dès que la hauteur d’une capitale plus cette valeur dépasse la hauteur normale d’une ligne, l’interlignage devient visiblement irrégulier.
Pour finir, une question : faut-il vraiment de la couleur ici ? Simon Fear, auteur de booktabs, était sans ambiguïté. Un bon tableau se lit grâce à l’espace et à quelques filets horizontaux ; en respectant deux règles — jamais de filets verticaux, jamais de filets doubles — on ne se trompe guère. Il distingue la « formal table », un ensemble de valeurs en colonnes étiquetées, du « tableau », probablement parsemé d’icônes et coloré lui aussi, et soutient que la mise en forme de la première s’est établie au fil des siècles et ne devrait être modifiée que dans des circonstances extraordinaires. Au passage, le numéro de version de booktabs est 1.61803398 : une plaisanterie de l’auteur, qui le fait converger vers φ, le nombre d’or. Avant de colorer un tableau, il vaut la peine de se demander une fois si la hauteur des lignes et deux ou trois filets n’auraient pas suffi.