TeX n'a aucune notion de couleur. Le moteur conçu par Knuth assemble une page avec des boîtes et de la glue, et ce modèle ne prévoit nulle part de place pour la couleur : il n'existe tout simplement pas de primitive de couleur dans TeX. Que fait alors le package LaTeX xcolor ? Il laisse un mot au pilote de sortie. Écrivez \textcolor{red}{…} et TeX glisse dans le fichier de sortie un \special — « rouge à partir d'ici » ; la peinture proprement dite est appliquée plus tard, par le programme qui produit le PDF. Ce seul fait explique presque tout ce qui déroute dans la couleur sous LaTeX. Cette page parcourt tout le chemin : le chargement de \usepackage{xcolor}, puis \textcolor, \colorbox et \pagecolor, ensuite \definecolor et les modèles de couleur, la notation de mélange red!30!white — et pour finir le piège de la fin : les couleurs de l'écran ne sont pas celles qui sortent d'une presse.
\usepackage{xcolor} ou le package color : lequel charger
La réponse est toujours \usepackage{xcolor}. C'est un sur-ensemble du package color de David Carlisle : il en reprend toutes les commandes et y ajoute le mélange de couleurs, des jeux de noms supplémentaires et la conversion entre modèles. Il a été écrit par Uwe Kern (2003–2021) et est maintenu depuis 2021 par le LaTeX Project ; TeX Live 2024 livre la version 3.01, datée du 15 novembre 2023. Son principe directeur est l'indépendance vis-à-vis du pilote : une même spécification de couleur est interprétée de la même façon via pdfTeX ou via dvips.
Cette exigence d'indépendance se lit encore dans la conception des options. L'ancien package color activait en silence les 68 couleurs de dvipsnames dès qu'un pilote de la famille dvips était choisi — d'où des documents qui compilaient chez leur auteur et mouraient sur une couleur indéfinie dès qu'on passait à pdfTeX. xcolor a rompu avec cet usage : il ne livre ces noms qu'à qui écrit explicitement dvipsnames, et en contrepartie les rend utilisables sous tous les pilotes. Sans option, on dispose de 19 couleurs de base ; on y ajoute au besoin dvipsnames (68 couleurs), svgnames (151 noms) ou x11names (317 noms). Pour colorer un tableau, l'option table amène colortbl avec elle.
\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 différence entre \textcolor et \color, et aussi \colorbox et \fcolorbox
\textcolor{red}{texte} ne colore que l'argument qu'on lui passe, tandis que \color{red} est un commutateur qui reste actif jusqu'à la fermeture du groupe TeX englobant. Ce ne sont pas deux mécanismes distincts : \textcolor n'est que \color avec les accolades déjà posées — la documentation de xcolor le dit en toutes lettres. Oubliez donc les { } extérieurs de {\color{blue} …} et tout le reste du document devient bleu. Lu à l'envers, cela signifie qu'un \color employé dans une section ou un environnement se rétablit tout seul à la fin de cet environnement. \textcolor appelle en plus \leavevmode, si bien qu'on peut le placer en tête de paragraphe sans casser l'aliné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{couleur}{texte} peint un fond, et \fcolorbox{cadre}{fond}{texte} règle séparément le cadre et le remplissage — le cadre d'abord, le remplissage ensuite. Un piège se cache ici, dans lequel on tombe facilement. Une \colorbox est, comme son nom l'indique, une boîte, et son contenu ne peut pas se couper d'une ligne à l'autre. Surlignez une longue phrase et elle filera droit hors de la justification, en laissant un avertissement Overfull \hbox. Cela convient pour quelques mots ; pour colorer des phrases entières, passez à un outil qui gère la coupure de ligne, comme \hl de soul ou tcolorbox. Notez aussi que les arguments de couleur d'autres packages — le manuel cite lui-même \sethlcolor de soul — n'acceptent pas toujours directement une expression telle que red!30!white. Donnez alors un nom au mélange avec \colorlet et transmettez ce nom.
| Commande | Effet | Portée |
|---|---|---|
\textcolor{c}{text} | compose l'argument dans la couleur c | l'argument seul |
\color{c} | bascule la couleur du texte sur c à partir d'ici | jusqu'à la fin du groupe TeX courant |
\colorbox{c}{text} | place le texte sur une boîte remplie de c | une boîte ; pas de coupure de ligne |
\fcolorbox{f}{b}{text} | encadre le texte en f sur un fond b | idem ; épaisseur du filet : \fboxrule |
\pagecolor{c} | définit le fond de page en c | global ; la page courante et toutes les suivantes |
\nopagecolor | supprime la couleur de fond, retour au transparent | tous les pilotes ne l'implémentent pas ; note dans le journal |
Pourquoi \pagecolor ignore les groupes : la couleur est un \special
\pagecolor{black} modifie le fond de la page courante et de toutes les suivantes. Contrairement à \color, il s'agit d'une déclaration globale qui ne respecte pas les groupes TeX : écrire {\pagecolor{black} …} ne rétablit rien à l'accolade fermante. Pour annuler, il faut le dire explicitement, avec \nopagecolor (retour au transparent) ou \pagecolor{white}. C'est le premier écueil quand on ne veut qu'une page de titre noire ; l'usage est donc de placer l'annulation juste après \maketitle. Si ce que vous cherchez n'est pas un aplat de fond mais un cadre ou un filigrane sur certaines pages, les outils de la famille eso-pic conviennent mieux.
\pagecolor{black}\color{white}
\maketitle
% \pagecolor is global: it must be cancelled by hand
\nopagecolor\color{black}Ce caractère global n'est pas un manque de tenue : c'est la nature même du \special évoqué en tête. La couleur n'est pas rangée dans les boîtes de TeX, ce n'est qu'un mot laissé dans le fichier de sortie. Dès que la page change, le mot n'arrive plus à destination. Les premiers pdfTeX en portaient une conséquence célèbre : une couleur posée avant une coupure de page était tout simplement perdue à la page suivante. Le contournement s'appelait pdfcolmk : ce package se servait du mécanisme de marques de LaTeX pour redire en haut de chaque page « cette page commence dans telle couleur ». pdfTeX 1.40, paru en 2007, a intégré une pile de couleurs, et l'astuce est devenue inutile. Aujourd'hui pdfcolmk n'est plus qu'une coquille de compatibilité qui ne fait rien, et l'option fixpdftex de xcolor un vestige qui se contente d'avertir Package option 'fixpdftex' is obsolete and ignored. Sous pdfLaTeX moderne, la couleur franchit les coupures de page.
Quand employer \definecolor et quand \colorlet
\definecolor{nom}{modèle}{valeurs} fabrique une couleur à partir de nombres ; \colorlet{nom}{couleur} en fabrique une à partir d'une couleur déjà disponible. Si la charte graphique vous livre « #1B3A6B », c'est la première ; si la demande est « le même bleu que le texte, en plus sombre », c'est la seconde. Dans les deux cas, une ligne dans le préambule suffit et le nom se comporte ensuite comme red ou blue. \colorlet accepte les expressions de couleur de la section suivante, ce qui fait de lui, en pratique, l'outil pour donner un nom à un mélange : \colorlet{accent}{blue!30!black}. Faites passer toutes les couleurs du document par de tels noms, et réaccorder la palette entière tient en une ligne du préambule.
\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 : quel modèle de couleur choisir
Le deuxième argument de \definecolor est le modèle de couleur, c'est-à-dire la façon d'écrire une couleur sous forme de nombres. En pratique le choix est simple : on s'aligne sur la forme des nombres dont on dispose. Un code couleur Web appelle HTML, un logiciel de création qui sort des valeurs de 0 à 255 appelle RGB, une spécification quadrichromique venue de l'imprimeur appelle cmyk. xcolor convertit en interne, si bien qu'une même couleur écrite dans un autre modèle donne le même résultat.
| Modèle | Valeurs et intervalle | Exemple |
|---|---|---|
rgb | rouge, vert, bleu, chacun décimal de 0 à 1 | {0.2,0.4,0.8} |
RGB | les mêmes trois, en entiers de 0 à 255 | {51,102,204} |
HTML | six chiffres hexadécimaux RRGGBB, sans # initial | {FF8800} |
cmyk | cyan, magenta, jaune, noir, chacun de 0 à 1 ; pour l'impression | {0,0.5,1,0} |
gray | une seule valeur : 0 pour le noir, 1 pour le blanc | {0.5} |
Gray | idem, mais en entier ; maximum par défaut 15 | {8} |
hsb | teinte, saturation, luminosité, chacune de 0 à 1 ; pratique pour faire tourner la teinte | {0.6,0.8,0.9} |
wave | longueur d'onde visible en nm, de 363 à 814 ; pour les figures de physique | {589} |
named | pseudo-modèle renvoyant à un nom existant plutôt qu'à des nombres | {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}Le modèle peut tout aussi bien être indiqué entre crochets au point d'utilisation. Pour une couleur ponctuelle qui ne mérite pas de nom, \textcolor[HTML]{FF8800}{…} ou \color[gray]{0.5} suffisent. Le cas à part du tableau est wave : donnez-lui une longueur d'onde visible en nanomètres et xcolor calcule l'apparence de cette longueur d'onde — \definecolor{sodium}{wave}{589} donne le jaune orangé de la raie D du sodium. Pour une figure d'optique ou de spectroscopie, aucune spécification n'est plus honnête. named, à l'inverse, est un pseudo-modèle sans aucun nombre : il sert à désigner des noms déjà chargés par des options telles que dvipsnames. Au quotidien, écrire directement le nom de la couleur suffit.
Ce que fait vraiment le ! de red!30!white : mélanger les couleurs
Le ! sépare les parts d'un mélange : couleurA!nombre!couleurB signifie « ce pourcentage de A, le reste en B ». Développez red!50!blue et vous obtenez littéralement rgb 0.5,0,0.5 — le violet situé exactement à mi-chemin. Omettez la couleur B et le reste est pris pour du blanc : red!20 se développe en 1,0.8,0.8, vingt pour cent de rouge sur quatre-vingts pour cent de blanc, un rose pâle. C'est ici que xcolor quitte définitivement color. Nul besoin d'une liste de noms sans cesse plus longue : la nuance voulue se tire des couleurs déjà présentes.
red!50!blue— moitié rouge, moitié bleu ; se développe enrgb0.5,0,0.5red!20— 20 % de rouge, le reste en blanc : la façon classique d'obtenir une teinte claireblue!30!black— 30 % de bleu, 70 % de noir : la façon classique d'assombrir-red— un moins initial donne la complémentaire ;-redest exactement le cyan (rgb0,1,1)green!40!yellow!60— les expressions s'enchaînent, le mélange va de gauche à droitegray!15àgray!25— l'intensité qui convient derrière du texte ; une couleur saturée se lit mal
Une expression de couleur est acceptée partout où une couleur est attendue : dans \textcolor{blue!30!black}{…}, dans \colorbox{yellow!40}{…}, dans les arguments de \definecolor et \colorlet, et dans \rowcolor{gray!15} lorsqu'on colore un tableau. En pratique, la bonne habitude consiste à ne pas disperser les mélanges dans le texte mais à nommer chacun une fois avec \colorlet. Si accent et accent!15 couvrent à eux deux les titres, les encadrés et les bandes zébrées, changer la tonalité du document tient en une ligne du préambule. Écrivez plutôt blue!30!black à quarante endroits et le moindre changement d'avis devient un travail de rechercher-remplacer.
\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}Quels noms de couleur sont disponibles : de 19 à 752
Même sans la moindre option, ces 19 couleurs sont toujours disponibles. Elles sont définies dans xcolor.sty lui-même : les noms fonctionnent donc sous tous les pilotes et dans toutes les classes de document. Comme matière première des expressions de couleur, elles suffisent le plus souvent : une fois gray!20 et blue!30!black entrés dans les habitudes, l'envie d'autres noms s'estompe.
black,blue,brown,cyan,darkgray,gray,green,lightgray,lime,magenta,olive,orange,pink,purple,red,teal,violet,white,yellow
Lorsqu'elles ne suffisent plus, les options apportent d'autres noms. dvipsnames fournit les 68 couleurs du pilote dvips — RoyalBlue, Periwinkle, BurntOrange et les autres, toutes définies en cmyk. svgnames fournit 151 noms : ceux de la spécification SVG 1.1 plus quatre repris d'X11. x11names fournit 317 noms tirés du fichier rgb.txt d'X11. Et c'est ici que le manuel de xcolor fait un aveu savoureux : les 151 noms de svgnames ne désignent que 141 couleurs distinctes, car des variantes d'orthographe comme Gray et Grey renvoient à la même valeur. De même, x11names propose 317 noms pour 315 couleurs. Chargez les deux jeux, indique le manuel, et les 752 noms de rgb.txt deviennent tous accessibles.
Ces noms respectent la casse. Écrivez royalblue au lieu de RoyalBlue et la compilation s'arrête sur ! Package xcolor Error: Undefined color 'royalblue'. La même erreur survient quand on a oublié de charger le jeu de noms — par exemple en utilisant Periwinkle après un simple \usepackage{xcolor}. Plutôt que de se fier à sa mémoire pour l'aspect de chaque nom, ouvrez le manuel avec texdoc xcolor : chaque nom y figure à côté de son nuancier imprimé. Une frontière mérite d'être connue : \rowcolor, \cellcolor et \rowcolors, qui colorent lignes et cellules de tableau, relèvent de colortbl et non de xcolor, et la seule ligne \usepackage[table]{xcolor} apporte les deux — voir la page sur les tableaux colorés.
La couleur de l'écran n'est pas celle du papier : les pièges de l'impression et de l'accessibilité
Pour un document destiné à un imprimeur, une couleur écrite en rgb ne sortira pas nécessairement telle quelle de la presse. L'offset ne peut construire la couleur qu'avec les quatre encres cmyk, et ce gamut est plus étroit que le RGB d'un écran. Passez l'option cmyk à xcolor et toutes les couleurs du document sont converties : blue, par exemple, devient {cmyk}{1,1,0,0}. Un bleu éclatant à l'écran peut se retrouver sur le papier en un bleu marine violacé et lourd ; l'écart n'a rien d'exceptionnel. Avant de livrer les fichiers, composez une fois avec \usepackage[cmyk]{xcolor} et vérifiez une épreuve, ou définissez vos couleurs en cmyk dès le départ.
Un piège plus profond se tient un cran plus loin : faire de la couleur le seul indice. Ligne rouge pour l'alerte, ligne verte pour le normal — cette conception perd toute son information dès que la page est photocopiée en noir et blanc, lue par une personne daltonienne ou affichée sur un écran à encre électronique. C'est précisément ce que vise la norme d'accessibilité web WCAG sous « Use of Color » (critère de succès 1.4.1) : la couleur doit toujours s'accompagner d'un autre indice — un symbole, une graisse, une étiquette explicite. Le moyen de vérifier, xcolor le fournit lui-même. Écrivez \usepackage[gray]{xcolor} et toutes les couleurs passent au modèle gray (red devient {gray}{0.3}), ce qui simule directement la sortie d'une imprimante noir et blanc. Si le sens tient encore dans cet état, le document ne s'appuie pas trop sur la couleur.
% 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}