El paquete colortbl no tiñe el fondo de las celdas de una tabla LaTeX. Coloca paneles de color detrás de ellas: así lo formula su autor, David Carlisle, en su propia documentación. Casi todo lo desconcertante del color en tablas se deduce de esa única frase: por qué un \cline que pediste no aparece por ninguna parte, y por qué queda una banda blanca entre el sombreado y un filete de booktabs. Esta página arranca en la línea única \usepackage[table]{xcolor} y recorre \rowcolor (filas), \columncolor (columnas), \cellcolor (celdas), \rowcolors para las franjas cebra y \arrayrulecolor para los filetes, hasta llegar a la objeción que plantea booktabs: que quizá no debería haber color en absoluto.
Qué paquete hace falta para colorear una tabla
Basta una línea: \usepackage[table]{xcolor}. No hace falta cargar colortbl de forma explícita, porque la opción table de xcolor lo arrastra automáticamente. Se puede hacer al revés y escribir solo \usepackage{colortbl}, pero entonces faltan los nombres de color. colortbl necesita internamente array y color, y color apenas define nombres propios, así que en cuanto aparece \rowcolors{2}{gray}{white} la compilación se detiene con ! LaTeX Error: Undefined color 'gray'. Aportar nombres y mezclas es justamente la función de xcolor, y por eso en la práctica todo el mundo acaba en la línea única con [table].
% one line brings in both xcolor and colortbl
\usepackage[table]{xcolor}Solo beamer se escribe de otro modo: hay que pasarlo como opción de clase, \documentclass[xcolor=table]{beamer}. Para los colores sirve cualquier expresión de xcolor, así que además de nombres simples como gray y red se puede escribir gray!20 (20 % de intensidad) o red!30!yellow (30 % de rojo mezclado con amarillo). Un color saturado detrás del texto lo vuelve ilegible, de modo que el rango práctico para el fondo de una tabla va de un name!15 a un name!25 bien diluidos.
Option clash for package xcolor: por qué casi ha desaparecido
! LaTeX Error: Option clash for package xcolor. fue durante años la mina más pisada al colorear tablas. La causa era simple: tikz, pgfplots o beamer ya habían cargado xcolor sin opciones, de modo que el \usepackage[table]{xcolor} escrito después contaba como recargar el mismo paquete con opciones distintas. xcolor 3.00, del 11 de noviembre de 2023, cambió eso. Desde esa versión table no es una opción de carga sino una clave de preámbulo declarada mediante el nuevo gestor de clave/valor de LaTeX, y por tanto puede aplicarse a un xcolor ya cargado. En TeX Live 2024, cargar tikz y escribir después \usepackage[table]{xcolor} no produce error alguno, mientras que el mismo experimento con geometry sigue deteniéndose en Option clash for package geometry.
Así pues, el consejo que aún circula por la web —«sube [table] a las opciones de clase»— es hoy un remedio para instalaciones antiguas. Aun así seguirás encontrándolas, de modo que conviene conocer el orden de actuación. Primero, muévelo a las opciones de clase: \documentclass[table]{article} coloca tu petición por delante de todas las demás. Si eso no basta, carga \usepackage{colortbl} directamente: lo que choca es una opción de xcolor, no colortbl en sí. Conviene además saber que el nuevo comportamiento de xcolor 3.00 solo se aplica con LaTeX 2022-06-01 o posterior; frente a un formato más antiguo se usa automáticamente una versión congelada. A la inversa, si ese comportamiento nuevo estropea un documento existente, \usepackage{xcolor}[=v2] recupera explícitamente la versión antigua.
La diferencia entre \rowcolor, \columncolor y \cellcolor
Las tres se diferencian no solo en lo que sombrean, sino en dónde se escribe cada una. \rowcolor{color} va al inicio de la fila, antes del contenido de su primera celda, es decir, justo después del \\ anterior. \columncolor{color} no va en el cuerpo de la tabla sino dentro de la especificación de columnas, en la forma >{\columncolor{gray!20}}. El gancho >{…} procede del paquete array, que inyecta material justo antes de cada celda de esa columna, y colortbl simplemente se sube a él. Solo \cellcolor{color} queda libre: en cualquier lugar dentro de la celda afectada funciona. La asimetría cuesta memorizarla, pero su motivo es claro: una fila solo puede atraparse en el instante en que empieza, y una columna solo puede declararse antes de que la tabla comience.
Las tres comparten la misma forma de argumentos: \columncolor[model]{color}[left overhang][right overhang], con un modelo de color opcional antes del color y salientes izquierdo y derecho opcionales después. El saliente indica cuánto se extiende el panel de color más allá de la columna por cada lado. Si se omite el derecho, copia el izquierdo; si se omiten ambos, se usa \tabcolsep en tabular o \arraycolsep en array. Si ambos valen 0pt, el panel se corta justo en el ancho del contenido de la columna, que es lo que suele generar una costura blanca entre celdas: para unir dos colores contiguos hay que aumentar el saliente, no reducirlo.
\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}Este trío no se diseñó de una vez: se fue acumulando a lo largo de dos décadas. El primer borrador de colortbl lleva fecha del 20 de septiembre de 1996 y contenía solo \columncolor. \rowcolor llegó quince días después, el 5 de octubre de 1996, y el registro de cambios anota que se añadió para dar gusto a S. Rahtz: Sebastian Rahtz, una de las grandes figuras del mundo TeX. \cellcolor no apareció hasta cinco años más tarde, el 13 de febrero de 2001, aportado por Donald Arseneau. Hasta entonces, sombrear una celda obligaba a escribir \multicolumn{1}{>{\columncolor{…}}c}{…}, y Carlisle opone tres objeciones a ese método: el contenido de la celda puede impedir que se dispare el coloreado; la alineación de columna hay que copiarla a mano, algo propenso a errores sobre todo con columnas p{}; y en tercer lugar, que \multicolumn{1} es sencillamente absurdo. Para colorear una celda, \cellcolor.
Qué color gana cuando se superponen: celda sobre fila sobre columna
\cellcolor prevalece sobre \rowcolor, y \rowcolor sobre \columncolor: celda, fila, columna. Cuanto más estrecho es el alcance, más fuerte es la reclamación, que es justo lo que dicta la intuición, así que no hay nada que desaprender. Gracias a ese orden pueden apilarse tres capas sin temer conflictos: un gris pálido en toda una columna, azul solo en la fila de encabezado y amarillo en la única celda que quieras destacar. Ayuda leer el diseño como si tratara la declaración amplia como valor por omisión y la estrecha como su excepción.
| Comando | Qué colorea | Dónde va |
|---|---|---|
\columncolor{c} | Una columna entera | Dentro del >{…} de la especificación |
\rowcolor{c} | Una fila entera | Inicio de la fila, antes de la primera celda |
\cellcolor{c} | Una sola celda | Dentro de esa celda, en cualquier lugar |
\rowcolors{n}{a}{b} | Filas alternas (cebra) | Una vez, antes de la tabla |
\arrayrulecolor{c} | Todos los filetes siguientes | Fuera, al inicio de fila o en >{} |
\doublerulesepcolor{c} | El hueco entre filetes dobles | En los mismos sitios que \arrayrulecolor |
Franjas cebra automáticas con \rowcolors
Para alternar colores a lo largo de una tabla basta escribir una vez \rowcolors{start}{odd-row color}{even-row color} antes de la tabla. La s final importa: \rowcolor sin ella es el comando distinto que sombrea una sola fila. El primer argumento es la fila en la que empieza el coloreado, así que pasa 2 para que la fila de encabezado pase intacta. Cualquiera de los argumentos de color puede quedar vacío, y vacío significa «sin color». Un punto contradice aquí a la mayoría de los artículos antiguos que aparecen al buscar: \rowcolors ya no es un comando de xcolor. El código se trasladó de xcolor a colortbl en la versión 1.0f, del 20 de junio de 2022, y el registro de cambios de xcolor 3.00 deja constancia del traspaso. La escritura no cambia, pero conviene saber que hoy \usepackage{colortbl} por sí solo ya define \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}El rayado no es todo o nada. Primero, \rowcolors admite un argumento opcional inicial: \rowcolors[\hline]{2}{…}{…} ejecuta un comando como \hline antes de cada fila. Segundo, un \rowcolor o \multicolumn explícito manda sobre el rayado automático, de modo que recolorear una fila en mitad de la serie resulta directo. Y para apagar las franjas de forma temporal existen \hiderowcolors y \showrowcolors, que pueden colocarse dentro de la tabla para suprimir y reanudar el patrón desde ese punto. Un requisito como «todo rayado salvo la fila de totales» se resuelve con ellos.
Colorear los filetes con \arrayrulecolor y \doublerulesepcolor
El color de \hline, \cline y el | vertical se cambia con \arrayrulecolor{color}. Toma los mismos argumentos que \color y es una declaración global, así que puede ir fuera de la tabla, al inicio de una fila o en un >{} de la especificación. Hay una trampa: si se da a mitad de tabla, solo alcanza a los filetes especificados después de ese punto; los filetes verticales ya declarados en la especificación conservan su color original. Al ser global, además sobrevive al final de la tabla, así que, para no arrastrar a todas las tablas siguientes, vuelve a declarar \arrayrulecolor{black} y restaura el valor por omisión.
El hueco entre los filetes dobles que producen || o \hline\hline queda blanco por omisión. Para rellenarlo se usa \doublerulesepcolor{color} junto con \doublerulesep, la longitud que fija el ancho de ese hueco. Ahora bien, en cuanto este comando entra en juego, longtable ya no puede descartar el espacio entre \hline\hline en un salto de página. TeX sí sabe descartar goma elástica, pero un «hueco» coloreado es en realidad un tercer filete, y los filetes se descartan mucho peor que la goma. Si una tabla larga va a repartirse entre páginas, conviene saberlo de antemano.
\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 itPara colorear un único filete vertical se pueden evitar los comandos dedicados y colocar !{\color{green}\vline} en la especificación de columnas en lugar de |. Un detalle pequeño pero útil: \arrayrulewidth es la longitud que fija el grosor de los filetes, y un filete dejado en su grosor capilar se ve muy débil al colorearse. Un grosor sobrado en negro puede desaparecer de la página en cuanto pasa a un tono claro, de modo que, como regla práctica, engrosa un poco el filete cuando lo colorees.
Por qué \cline desaparece bajo una fila coloreada
Traza un \cline en una tabla que también usa \rowcolor y el filete se vuelve completamente invisible. No es un fallo, sino la consecuencia del mecanismo del primer párrafo: colortbl coloca el color como paneles detrás de las celdas, mientras que \cline se dibuja aún más atrás que esos paneles, de modo que el color lo tapa. En un comentario del código fuente, Carlisle admite que \cline no funciona de verdad en una tabla coloreada y se conforma con dar al menos el color correcto a las partes que siguen viéndose. El remedio es claro: en vez de \cline, carga el paquete hhline y escribe algo como \hhline{-~}, donde - significa «traza filete en esta columna» y ~ significa «sáltala». Ese filete se dibuja encima del panel y se ve como debe.
% \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}El hueco blanco entre los filetes de booktabs y el color de fila
colortbl y booktabs conviven sin problemas, pero entre \toprule, \midrule, \bottomrule y el color de fondo queda una banda blanca. La causa es el espacio que booktabs inserta encima y debajo de sus filetes: \aboverulesep vale por omisión .4ex y \belowrulesep, .65ex. Ese espacio queda fuera de la caja de la fila, así que el panel de \rowcolor nunca llega hasta él. El arreglo habitual, cuando se quiere que el relleno toque el filete, es poner ambos a 0pt y trasladar la altura perdida a \extrarowheight: las filas mantienen su altura y solo cambia el color, que ahora sí alcanza los filetes.
% let the row color reach the booktabs rules
\setlength\aboverulesep{0pt}
\setlength\belowrulesep{0pt}
\setlength\extrarowheight{.75ex}El otro síntoma clásico es que un cuerpo grande o un contenido alto toque el \hline o el borde superior del panel de color inmediatamente encima. Como colortbl ya tiene que encajonar y medir cada entrada para calcular el ancho de los filetes, se añadió de paso la longitud \minrowclearance. Poner \setlength\minrowclearance{2pt} inserta un poco de espacio solo sobre las filas altas. Carlisle señala, no obstante, que conviene aumentar antes \extrarowheight o \arraystretch, que resuelven el problema manteniendo un interlineado regular: en cuanto la altura de una mayúscula más ese valor supera la altura normal de fila, el interlineado se vuelve visiblemente desigual.
Para cerrar, una pregunta: ¿hace falta color aquí? Simon Fear, autor de booktabs, fue tajante. Una buena tabla se lee gracias al espacio y a unos pocos filetes horizontales; con dos pautas —nunca uses filetes verticales, nunca uses filetes dobles— es difícil equivocarse mucho. Distingue la «formal table», un conjunto de valores en columnas etiquetadas, del «tableau», que probablemente estará sembrado de iconos y usará color, y sostiene que la disposición de la primera se estableció a lo largo de siglos de experiencia y solo debería alterarse en circunstancias extraordinarias. De paso: el número de versión de booktabs es 1.61803398, la broma del autor de que converge hacia φ, la razón áurea. Antes de sombrear una tabla, merece la pena preguntarse una vez si la altura de las filas y dos o tres filetes no lo habrían resuelto ya.