TeX no tiene ninguna noción de color. El motor que diseñó Knuth arma la página con cajas y pegamento, y en ese modelo no hay sitio previsto para el color: no existe ninguna primitiva de color en TeX. ¿Qué hace entonces el paquete xcolor de LaTeX? Deja una nota para el controlador de salida. Al escribir \textcolor{red}{…}, TeX cuela en el archivo de salida un \special —«rojo a partir de aquí»— y la pintura real la aplica después el programa que genera el PDF. Con ese único dato se explica casi todo lo desconcertante del color en LaTeX. Esta página recorre el camino entero: la carga de \usepackage{xcolor}, luego \textcolor, \colorbox y \pagecolor, después \definecolor y los modelos de color, la notación de mezcla red!30!white y, al final, la trampa: los colores de la pantalla no son los que salen de una imprenta.
\usepackage{xcolor} frente al paquete color: cuál cargar
La respuesta es siempre \usepackage{xcolor}. Es un superconjunto del paquete color de David Carlisle: hereda todos sus comandos y añade encima mezcla de colores, conjuntos extra de nombres y conversión entre modelos. Lo escribió Uwe Kern (2003–2021) y desde 2021 lo mantiene el LaTeX Project; TeX Live 2024 incluye la versión 3.01, del 15 de noviembre de 2023. Su principio rector es la independencia del controlador: una misma especificación de color se interpreta igual pasando por pdfTeX o por dvips.
Esa insistencia en la independencia del controlador sigue visible en el diseño de las opciones. El antiguo paquete color activaba en silencio los 68 colores de dvipsnames en cuanto se elegía un controlador de la familia dvips, lo que producía documentos que compilaban en la máquina del autor y morían con un color indefinido en cuanto alguien probaba pdfTeX. xcolor abandonó ese comportamiento: entrega esos nombres solo a quien los pide escribiendo dvipsnames y, a cambio, hace que funcionen con cualquier controlador. Sin opciones dispones de 19 colores básicos; sobre ellos añades dvipsnames (68 colores), svgnames (151 nombres) o x11names (317 nombres) según haga falta. Para colorear una tabla, la opción table trae consigo colortbl.
\usepackage{xcolor} % 19 base colours, always available
\usepackage[dvipsnames]{xcolor} % + 68 cmyk names from the dvips driver
\usepackage[svgnames]{xcolor} % + 151 names from the SVG 1.1 spec
\usepackage[x11names]{xcolor} % + 317 names from the X11 rgb.txt
\usepackage[dvipsnames,svgnames]{xcolor} % sets can be combined
\usepackage[table]{xcolor} % also loads colortbl for coloured tablesLa diferencia entre \textcolor y \color, y además \colorbox y \fcolorbox
\textcolor{red}{texto} colorea solo el argumento que se le pasa, mientras que \color{red} es un interruptor que sigue activo hasta que se cierra el grupo TeX que lo contiene. No son dos mecanismos distintos: \textcolor no es más que \color con las llaves ya puestas, y así lo dice la documentación de xcolor. Por eso, si se olvidan las { } exteriores de {\color{blue} …}, todo el resto del documento se vuelve azul. Leído al revés, significa que un \color usado dentro de una sección o un entorno se restaura por sí solo al terminar ese entorno. \textcolor llama además a \leavevmode, de modo que colocarlo al principio de un párrafo no estropea la sangría.
This word is \textcolor{red}{red}, the rest is not.
{\color{blue} Everything from here to the closing brace is blue.} Back to black.
% the whole box gets a background; the frame colour comes first
\colorbox{yellow}{highlighted}
\fcolorbox{red}{yellow}{red frame, yellow fill}\colorbox{color}{texto} pinta un fondo y \fcolorbox{marco}{relleno}{texto} fija marco y relleno por separado: primero el marco, después el relleno. Aquí acecha una trampa en la que es fácil caer. Una \colorbox es, como dice el nombre, una caja, y su contenido no puede partirse entre líneas. Si se resalta una frase larga, saldrá disparada fuera de la caja de texto y dejará un aviso Overfull \hbox. Para unas pocas palabras basta; para sombrear frases enteras conviene pasar a algo que entienda el salto de línea, como \hl de soul o tcolorbox. Ten en cuenta además que los argumentos de color de otros paquetes —el manual cita él mismo \sethlcolor de soul— pueden no aceptar directamente una expresión como red!30!white. En ese caso, ponle nombre a la mezcla con \colorlet y pasa el nombre.
| Comando | Qué hace | Alcance |
|---|---|---|
\textcolor{c}{text} | compone el argumento en el color c | solo el argumento |
\color{c} | cambia el color del texto a c desde aquí | hasta el final del grupo TeX actual |
\colorbox{c}{text} | pone el texto sobre una caja rellena de c | una caja; no parte entre líneas |
\fcolorbox{f}{b}{text} | enmarca el texto en f sobre un fondo b | igual; el grosor lo da \fboxrule |
\pagecolor{c} | fija el fondo de página en c | global; la página actual y todas las siguientes |
\nopagecolor | quita el color de fondo y vuelve a transparente | no todos los controladores lo implementan; deja una nota en el registro |
Por qué \pagecolor ignora los grupos: el color es un \special
\pagecolor{black} cambia el fondo de la página actual y de todas las siguientes. Además, a diferencia de \color, es una declaración global que no respeta los grupos TeX: escribir {\pagecolor{black} …} no restaura nada en la llave de cierre. Para deshacerlo hay que decirlo explícitamente, con \nopagecolor (vuelta a transparente) o \pagecolor{white}. Es lo primero que hace tropezar a quien solo quiere una portada negra, así que lo habitual es poner la cancelación justo después de \maketitle. Si lo que buscas no es un fondo plano sino un marco o una marca de agua en páginas concretas, las herramientas de la familia eso-pic encajan mejor.
\pagecolor{black}\color{white}
\maketitle
% \pagecolor is global: it must be cancelled by hand
\nopagecolor\color{black}Ese carácter global no es mala educación: es la naturaleza misma del \special mencionado al principio. El color no está guardado dentro de las cajas de TeX; es solo una nota dejada en el archivo de salida. En cuanto cambia la página, la nota deja de llegar a su destino. Los primeros pdfTeX arrastraban una consecuencia célebre de esto: el color fijado antes de un salto de página se perdía sin más en la página siguiente. El remedio se llamaba pdfcolmk, un paquete que usaba el mecanismo de marcas de LaTeX para volver a declarar al principio de cada página «esta página empieza en este color». pdfTeX 1.40, publicado en 2007, incorporó una pila de colores y el truco dejó de hacer falta. Hoy pdfcolmk es un envoltorio de compatibilidad que no hace nada, y la opción fixpdftex de xcolor es un vestigio que solo avisa Package option 'fixpdftex' is obsolete and ignored. En el pdfLaTeX actual, el color sobrevive a un salto de página.
Cuándo usar \definecolor y cuándo \colorlet
\definecolor{nombre}{modelo}{valores} construye un color a partir de números; \colorlet{nombre}{color} lo construye a partir de un color que ya existe. Si la guía de marca te entrega «#1B3A6B», quieres el primero; si el encargo es «el mismo azul del texto, pero más oscuro», quieres el segundo. En ambos casos basta una línea en el preámbulo y el nombre se comporta luego como red o blue. \colorlet acepta las expresiones de color de la sección siguiente, lo que lo convierte en la herramienta práctica para ponerle nombre a una mezcla: \colorlet{accent}{blue!30!black}. Si todos los colores del documento pasan por nombres así, reajustar la paleta entera cuesta una línea del preámbulo.
\definecolor{myblue}{rgb}{0.2,0.4,0.8} % from numbers
\definecolor{brand}{HTML}{1B3A6B} % from a web hex code
\colorlet{accent}{blue!30!black} % from an existing colour
\colorlet{ruleline}{brand!25} % a 25 % tint of the brand colourrgb, RGB, HTML, cmyk, gray: qué modelo de color elegir
El segundo argumento de \definecolor es el modelo de color, es decir, la forma de escribir un color como números. En la práctica la elección es sencilla: hay que ajustarse a la forma de los números disponibles. Un código de color web pide HTML, una herramienta de diseño que da valores de 0 a 255 pide RGB, y una especificación a cuatro tintas venida de la imprenta pide cmyk. xcolor convierte internamente, así que el mismo color escrito en otro modelo sale igual.
| Modelo | Valores e intervalo | Ejemplo |
|---|---|---|
rgb | rojo, verde y azul, cada uno decimal de 0 a 1 | {0.2,0.4,0.8} |
RGB | los mismos tres, como enteros de 0 a 255 | {51,102,204} |
HTML | seis dígitos hexadecimales RRGGBB, sin # inicial | {FF8800} |
cmyk | cian, magenta, amarillo y negro, cada uno de 0 a 1; para imprenta | {0,0.5,1,0} |
gray | un solo valor: 0 es negro y 1 es blanco | {0.5} |
Gray | lo mismo, pero entero; el máximo por omisión es 15 | {8} |
hsb | tono, saturación y brillo, cada uno de 0 a 1; cómodo para girar el tono | {0.6,0.8,0.9} |
wave | longitud de onda visible en nm, de 363 a 814; para figuras de física | {589} |
named | pseudomodelo que remite a un nombre existente en vez de a números | {Periwinkle} |
% four spellings of one orange
\definecolor{o1}{rgb}{1,0.5,0}
\definecolor{o2}{RGB}{255,128,0}
\definecolor{o3}{HTML}{FF8000}
\definecolor{o4}{cmyk}{0,0.5,1,0}
% the model can also be given inline, in brackets, at the point of use
\textcolor[HTML]{FF8800}{a one-off orange}
\color[gray]{0.5}El modelo puede indicarse igualmente entre corchetes en el punto de uso. Para un color puntual que no merece nombre, bastan \textcolor[HTML]{FF8800}{…} o \color[gray]{0.5}. El caso raro de la tabla es wave: si se le da una longitud de onda visible en nanómetros, xcolor calcula qué aspecto tiene esa longitud de onda —\definecolor{sodium}{wave}{589} da el amarillo anaranjado de la línea D del sodio—. Para una figura de óptica o de espectros no hay especificación más honesta. named, en cambio, es un pseudomodelo que no contiene números: existe para remitir a nombres ya cargados por opciones como dvipsnames. En el día a día basta con escribir directamente el nombre del color.
Qué hace realmente el ! de red!30!white: mezclar colores
El ! separa las partes de una mezcla: colorA!número!colorB significa «ese porcentaje de A y el resto de B». Si se expande red!50!blue, aparece literalmente rgb 0.5,0,0.5: el morado que queda justo a medio camino. Si se omite el color B, el resto se toma como blanco: red!20 se expande a 1,0.8,0.8, un veinte por ciento de rojo sobre un ochenta por ciento de blanco, un rosa pálido. Aquí es donde xcolor se separa definitivamente de color. Ya no hace falta una lista de nombres cada vez más larga: el matiz necesario se extrae de los colores que ya se tienen.
red!50!blue— mitad rojo, mitad azul; se expande argb0.5,0,0.5red!20— 20 % rojo y el resto blanco: la forma habitual de obtener un tinteblue!30!black— 30 % azul y 70 % negro: la forma habitual de oscurecer-red— un menos inicial da el complementario;-redes exactamente cian (rgb0,1,1)green!40!yellow!60— las expresiones se encadenan y la mezcla avanza de izquierda a derechagray!15agray!25— la intensidad adecuada detrás del texto; sobre un color saturado se lee mal
Una expresión de color se acepta en cualquier sitio donde se espere un color: en \textcolor{blue!30!black}{…}, en \colorbox{yellow!40}{…}, en los argumentos de \definecolor y \colorlet, y en \rowcolor{gray!15} al sombrear una tabla. En la práctica, la costumbre que compensa es no desperdigar las mezclas por el texto, sino nombrar cada una una sola vez con \colorlet. Si accent y accent!15 bastan para títulos, recuadros y franjas cebra, cambiar el tono del documento cuesta una línea del preámbulo. Si en cambio se escribe blue!30!black en cuarenta sitios, cambiar de idea más tarde se convierte en un trabajo de buscar y reemplazar.
\colorlet{accent}{blue!30!black}
\colorlet{accentbg}{accent!15}
% then, in the body
\textcolor{accent}{a heading}
\colorbox{accentbg}{a quiet highlight}
\fcolorbox{accent}{accentbg}{framed and filled}Qué nombres de color hay disponibles: de 19 a 752
Incluso sin ninguna opción, estos 19 colores están siempre disponibles. Los define el propio xcolor.sty, de modo que los nombres funcionan con cualquier controlador y en cualquier clase de documento. Como materia prima para las expresiones de color suelen bastar: en cuanto gray!20 y blue!30!black se vuelven costumbre, las ganas de más nombres se desvanecen.
black,blue,brown,cyan,darkgray,gray,green,lightgray,lime,magenta,olive,orange,pink,purple,red,teal,violet,white,yellow
Cuando esos se agotan, las opciones añaden más nombres. dvipsnames aporta los 68 colores del controlador dvips —RoyalBlue, Periwinkle, BurntOrange y los demás, todos definidos en cmyk—. svgnames aporta 151 nombres: los de la especificación SVG 1.1 más cuatro tomados de X11. x11names aporta 317 nombres del archivo rgb.txt de X11. Y aquí el manual de xcolor hace una confesión simpática: los 151 nombres de svgnames designan solo 141 colores distintos, porque variantes ortográficas como Gray y Grey apuntan al mismo valor. Igualmente, x11names ofrece 317 nombres para 315 colores. Si se cargan ambos conjuntos, señala el manual, quedan al alcance los 752 nombres de rgb.txt.
Estos nombres distinguen mayúsculas y minúsculas. Si se escribe royalblue en lugar de RoyalBlue, la compilación se detiene con ! Package xcolor Error: Undefined color 'royalblue'. El mismo error aparece cuando no se ha cargado el conjunto de nombres —por ejemplo, al usar Periwinkle tras un simple \usepackage{xcolor}—. En vez de fiarse de la memoria para saber qué aspecto tiene cada nombre, conviene abrir el manual con texdoc xcolor: allí cada nombre aparece junto a su muestra impresa. Vale la pena conocer una frontera: \rowcolor, \cellcolor y \rowcolors, que colorean filas y celdas de tablas, pertenecen a colortbl y no a xcolor, y la única línea \usepackage[table]{xcolor} trae ambos; véase la página sobre tablas con color.
El color de la pantalla no es el del papel: las trampas de la imprenta y la accesibilidad
En un documento destinado a imprenta, un color escrito en rgb no saldrá necesariamente así de la máquina. El offset solo puede construir color con las cuatro tintas cmyk, y esa gama es más estrecha que el RGB de una pantalla. Si se pasa la opción cmyk a xcolor, todos los colores del documento se convierten: blue, por ejemplo, pasa a ser {cmyk}{1,1,0,0}. Un azul vivo en pantalla puede aparecer en el papel como un azul marino violáceo y pesado, y esa distancia no es rara. Antes de entregar los archivos conviene componer una vez con \usepackage[cmyk]{xcolor} y revisar una prueba, o definir los colores en cmyk desde el principio.
Un paso más allá acecha una trampa más honda: dejar que el color sea la única señal. Filas rojas para la advertencia, verdes para lo correcto: ese diseño pierde toda su información en cuanto la página se fotocopia en blanco y negro, la lee alguien con una deficiencia en la visión del color o se abre en una pantalla de tinta electrónica. Es justo lo que pide la norma de accesibilidad web WCAG bajo «Use of Color» (criterio de éxito 1.4.1): el color debe ir siempre acompañado de otra señal, ya sea un símbolo, una negrita o una etiqueta explícita. Por suerte, el medio de comprobarlo lo trae el propio xcolor. Al escribir \usepackage[gray]{xcolor}, todos los colores pasan al modelo gray (red se convierte en {gray}{0.3}), lo que simula directamente la salida de una impresora en blanco y negro. Si el sentido se sostiene en ese estado, el documento no se apoya demasiado en el color.
% convert every colour in the document to cmyk, for offset printing
\usepackage[cmyk]{xcolor}
% convert every colour to gray: a one-word black-and-white proof
\usepackage[gray]{xcolor}