TeX kennt keine Farbe. Knuths Satzmaschine baut eine Seite aus Boxen und Leim zusammen, und in diesem Modell ist für Farbe kein Platz vorgesehen – ein Farb-Primitiv gibt es in TeX überhaupt nicht. Was also tut das LaTeX-Paket xcolor? Es hinterlässt eine Notiz für den Ausgabetreiber. Bei \textcolor{red}{…} schmuggelt TeX ein \special in die Ausgabedatei – „ab hier rot“ –, und gemalt wird erst später, von dem Programm, das das PDF erzeugt. Wer diese eine Tatsache kennt, kann fast alles Rätselhafte an Farbe in LaTeX erklären. Diese Seite geht den ganzen Weg ab: das Laden von \usepackage{xcolor}, dann \textcolor, \colorbox und \pagecolor, danach \definecolor und die Farbmodelle, die Mischschreibweise red!30!white – und zuletzt die Falle am Ende: Die Farben auf dem Bildschirm sind nicht die Farben, die aus einer Druckmaschine kommen.
\usepackage{xcolor} oder das Paket color – was wird geladen
Die Antwort lautet immer \usepackage{xcolor}. Es ist eine Obermenge des color-Pakets von David Carlisle: Sämtliche Befehle jenes Pakets werden übernommen und um Farbmischung, zusätzliche Namenssätze und Modellkonvertierung ergänzt. Geschrieben hat es Uwe Kern (2003–2021); seit 2021 pflegt es das LaTeX Project. TeX Live 2024 liefert v3.01 vom 15. November 2023. Leitgedanke ist die Treiberunabhängigkeit – dieselbe Farbangabe wird gleich interpretiert, ob über pdfTeX oder über dvips.
Dieses Beharren auf Treiberunabhängigkeit ist der Optionsgestaltung bis heute anzusehen. Das alte color-Paket schaltete die 68 dvipsnames-Farben stillschweigend frei, sobald ein Treiber aus der dvips-Familie gewählt war – dabei entstanden Dokumente, die auf dem eigenen Rechner durchliefen und bei pdfTeX sofort an einer undefinierten Farbe scheiterten. xcolor hat damit gebrochen: Die Namen bekommt nur, wer dvipsnames ausdrücklich schreibt, dafür funktionieren sie unter jedem Treiber. Ohne Optionen stehen 19 Grundfarben bereit; darauf lassen sich dvipsnames (68 Farben), svgnames (151 Namen) oder x11names (317 Namen) nach Bedarf setzen. Für farbige Tabellen bringt die Option table gleich colortbl mit.
\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 tablesDer Unterschied zwischen \textcolor und \color, dazu \colorbox und \fcolorbox
\textcolor{red}{Text} färbt nur das übergebene Argument, während \color{red} ein Schalter ist, der bis zum Ende der umgebenden TeX-Gruppe eingeschaltet bleibt. Es sind keine zwei getrennten Mechanismen: \textcolor ist schlicht \color mit bereits gesetzten Klammern – so steht es in der Dokumentation von xcolor. Fehlen also die äußeren { } bei {\color{blue} …}, wird der Rest des Dokuments blau. Umgekehrt gelesen heißt das: Ein \color innerhalb eines Abschnitts oder einer Umgebung wird beim Ende dieser Umgebung von selbst zurückgenommen. \textcolor ruft zusätzlich \leavevmode auf, weshalb es auch am Absatzanfang den Einzug nicht zerstört.
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{Farbe}{Text} färbt den Hintergrund, \fcolorbox{Rahmen}{Füllung}{Text} setzt Rahmen und Füllung getrennt – Rahmen zuerst, Füllung danach. Hier lauert eine Falle, in die man leicht tritt. Eine \colorbox ist, wie der Name sagt, eine Box, und ihr Inhalt kann nicht über Zeilen umbrechen. Wer einen langen Satz hervorhebt, sieht ihn geradewegs über den Satzspiegel hinauslaufen, samt Warnung Overfull \hbox. Für ein paar Wörter genügt das; für ganze Sätze empfiehlt sich etwas, das Zeilenumbruch beherrscht, etwa \hl aus soul oder tcolorbox. Zu beachten ist außerdem: Farbargumente fremder Pakete – das Handbuch nennt selbst \sethlcolor aus soul – nehmen einen Farbausdruck wie red!30!white unter Umständen nicht direkt an. Dann gibt man der Mischung erst mit \colorlet einen Namen und übergibt diesen.
| Befehl | Wirkung | Geltungsbereich |
|---|---|---|
\textcolor{c}{text} | setzt das Argument in Farbe c | nur das Argument |
\color{c} | schaltet die Textfarbe ab hier auf c um | bis zum Ende der aktuellen TeX-Gruppe |
\colorbox{c}{text} | setzt den Text auf eine mit c gefüllte Box | eine Box; kein Zeilenumbruch möglich |
\fcolorbox{f}{b}{text} | rahmt den Text in f über einem Hintergrund b | ebenso; Linienstärke ist \fboxrule |
\pagecolor{c} | legt die Seitenfarbe auf c fest | global; aktuelle und alle folgenden Seiten |
\nopagecolor | entfernt die Seitenfarbe, zurück zu transparent | nicht von jedem Treiber umgesetzt; sonst Log-Hinweis |
Warum \pagecolor TeX-Gruppen ignoriert: Farbe ist ein \special
\pagecolor{black} ändert den Hintergrund der aktuellen Seite und aller folgenden. Anders als \color ist dies eine globale Deklaration, die TeX-Gruppen nicht beachtet: {\pagecolor{black} …} stellt bei der schließenden Klammer nichts wieder her. Rückgängig gemacht wird es nur ausdrücklich, mit \nopagecolor (zurück zu transparent) oder \pagecolor{white}. Genau daran scheitert der Wunsch nach einem schwarzen Titelblatt zuerst; üblich ist deshalb, die Aufhebung direkt hinter \maketitle zu setzen. Geht es nicht um eine Hintergrundfläche, sondern um Rahmen oder Wasserzeichen auf einzelnen Seiten, eignen sich Werkzeuge aus der Familie eso-pic besser.
\pagecolor{black}\color{white}
\maketitle
% \pagecolor is global: it must be cancelled by hand
\nopagecolor\color{black}Dieses globale Verhalten ist keine Unart, sondern genau die Natur des eingangs erwähnten \special. Farbe steckt nicht in den Boxen von TeX, sie ist nur eine in der Ausgabedatei hinterlassene Notiz. Wechselt die Seite, erreicht die Notiz ihr Ziel nicht mehr. Beim frühen pdfTeX hatte das eine berühmte Folge: Vor einem Seitenumbruch gesetzte Farbe war auf der nächsten Seite schlicht verloren. Als Behelf diente das Paket pdfcolmk, das über den Marken-Mechanismus von LaTeX auf jeder Seite neu vermerkte, in welcher Farbe sie beginnt. pdfTeX 1.40, erschienen 2007, brachte einen eingebauten Farbstapel mit, und der Kunstgriff wurde überflüssig. Heute ist pdfcolmk ein leerer Kompatibilitätsstummel, und die Option fixpdftex von xcolor ist ein Überbleibsel, das nur noch Package option 'fixpdftex' is obsolete and ignored meldet. Im heutigen pdfLaTeX übersteht Farbe einen Seitenumbruch.
Wann \definecolor und wann \colorlet
\definecolor{Name}{Modell}{Werte} baut eine Farbe aus Zahlen, \colorlet{Name}{Farbe} aus einer bereits vorhandenen Farbe. Kommt die Vorgabe als „#1B3A6B“ herein, ist das Erste gefragt; lautet der Wunsch „dasselbe Blau wie im Fließtext, nur dunkler“, das Zweite. In beiden Fällen genügt eine Zeile in der Präambel, und der Name verhält sich danach wie red oder blue. \colorlet nimmt die Farbausdrücke des nächsten Abschnitts entgegen, weshalb sein praktisch wichtigster Zweck darin besteht, einer Mischung einen Namen zu geben: \colorlet{accent}{blue!30!black}. Läuft jede Farbe des Dokuments über solche Namen, kostet das Nachstimmen der gesamten Palette eine einzige Zeile in der Präambel.
\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 – welches Farbmodell wählen
Das zweite Argument von \definecolor ist das Farbmodell, also die Schreibweise, in der eine Farbe als Zahlen erscheint. In der Praxis ist die Wahl leicht: Man richtet sich nach der Form der vorliegenden Zahlen. Ein Web-Farbcode verlangt HTML, ein Grafikprogramm mit Werten von 0 bis 255 verlangt RGB, eine Vierfarbangabe aus der Druckerei verlangt cmyk. xcolor rechnet intern um, dieselbe Farbe in einem anderen Modell ergibt also dasselbe Ergebnis.
| Modell | Werte und Bereich | Beispiel |
|---|---|---|
rgb | Rot, Grün, Blau, je als Dezimalwert 0–1 | {0.2,0.4,0.8} |
RGB | dieselben drei, als ganze Zahlen 0–255 | {51,102,204} |
HTML | sechs Hexziffern RRGGBB, ohne führendes # | {FF8800} |
cmyk | Cyan, Magenta, Gelb, Schwarz, je 0–1; für den Druck | {0,0.5,1,0} |
gray | ein Wert: 0 ist Schwarz, 1 ist Weiß | {0.5} |
Gray | ebenfalls Helligkeit, aber ganzzahlig; Voreinstellung bis 15 | {8} |
hsb | Farbton, Sättigung, Helligkeit, je 0–1; praktisch zum Drehen des Farbtons | {0.6,0.8,0.9} |
wave | sichtbare Wellenlänge in nm, 363–814; für Physikgrafiken | {589} |
named | Pseudomodell: verweist statt auf Zahlen auf einen vorhandenen Namen | {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}Das Modell lässt sich ebenso an der Verwendungsstelle in eckigen Klammern angeben. Für eine einmalige Farbe, die keinen Namen verdient, genügen \textcolor[HTML]{FF8800}{…} oder \color[gray]{0.5}. Der Sonderfall in der Tabelle ist wave: Übergibt man eine sichtbare Wellenlänge in Nanometern, berechnet xcolor, wie diese Wellenlänge aussieht – \definecolor{sodium}{wave}{589} ergibt das Gelborange der Natrium-D-Linie. Für eine Abbildung zu Optik oder Spektren gibt es keine ehrlichere Angabe. named dagegen ist ein Pseudomodell ganz ohne Zahlen; es dient dazu, auf Namen zu verweisen, die etwa über dvipsnames geladen wurden. Im Alltag reicht es, den Farbnamen direkt zu schreiben.
Was das ! in red!30!white tut: Farben mischen
Das ! trennt die Anteile einer Mischung: FarbeA!Zahl!FarbeB bedeutet „so viel Prozent A, der Rest B“. Expandiert man red!50!blue, steht dort tatsächlich rgb 0.5,0,0.5 – das Violett genau in der Mitte. Fehlt Farbe B, gilt der Rest als Weiß: red!20 wird zu 1,0.8,0.8, zwanzig Prozent Rot auf achtzig Prozent Weiß, ein blasses Rosa. An dieser Stelle löst sich xcolor endgültig von color. Es braucht keine immer längere Liste von Farbnamen mehr; die gewünschte Abstufung entsteht aus den Farben, die schon da sind.
red!50!blue— halb Rot, halb Blau; expandiert zurgb0.5,0,0.5red!20— 20 % Rot, Rest Weiß: der übliche Weg zu einer Tönungblue!30!black— 30 % Blau, 70 % Schwarz: der übliche Weg zu einer Abdunklung-red— ein vorangestelltes Minus ergibt die Komplementärfarbe;-redist genau Cyan (rgb0,1,1)green!40!yellow!60— Ausdrücke lassen sich verketten, gemischt wird von links nach rechtsgray!15bisgray!25— etwa die richtige Stärke hinter Text; auf gesättigter Farbe liest es sich schlecht
Ein Farbausdruck wird überall dort angenommen, wo eine Farbe erwartet wird: in \textcolor{blue!30!black}{…}, in \colorbox{yellow!40}{…}, in den Argumenten von \definecolor und \colorlet und in \rowcolor{gray!15} beim Einfärben einer Tabelle. In der Praxis zahlt sich die Gewohnheit aus, Mischungen nicht über den Text zu verstreuen, sondern jede einmal mit \colorlet zu benennen. Decken accent und accent!15 zusammen Überschriften, Kästen und Zebrastreifen ab, kostet ein neuer Farbton eine Zeile in der Präambel. Steht blue!30!black dagegen an vierzig Stellen, wird jede spätere Änderung zur Such-und-Ersetzen-Arbeit.
\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}Welche Farbnamen es gibt – von 19 bis 752
Auch ganz ohne Optionen stehen diese 19 Farben immer zur Verfügung. Sie werden in xcolor.sty selbst definiert, die Namen gelten also unter jedem Treiber und in jeder Dokumentklasse. Als Rohstoff für Farbausdrücke reichen sie meist ebenfalls aus: Wer gray!20 und blue!30!black gewohnt ist, vermisst weitere Namen kaum noch.
black,blue,brown,cyan,darkgray,gray,green,lightgray,lime,magenta,olive,orange,pink,purple,red,teal,violet,white,yellow
Reichen sie nicht, ergänzen Optionen weitere Namen. dvipsnames liefert die 68 Farben des dvips-Treibers – RoyalBlue, Periwinkle, BurntOrange und die übrigen, sämtlich in cmyk definiert. svgnames liefert 151 Namen: die der SVG-1.1-Spezifikation plus vier aus X11. x11names liefert 317 Namen aus der X11-Datei rgb.txt. Und hier macht das Handbuch von xcolor selbst ein hübsches Eingeständnis: Die 151 Namen von svgnames bezeichnen nur 141 verschiedene Farben, weil Schreibvarianten wie Gray und Grey denselben Wert meinen. Ebenso stehen bei x11names 317 Namen für 315 Farben. Lädt man beide Sätze, so das Handbuch, sind alle 752 Namen aus rgb.txt erreichbar.
Diese Namen unterscheiden Groß- und Kleinschreibung. Wer royalblue statt RoyalBlue schreibt, sieht den Lauf bei ! Package xcolor Error: Undefined color 'royalblue'. abbrechen. Derselbe Fehler erscheint, wenn der Namenssatz gar nicht geladen wurde – etwa bei Periwinkle nach einem schlichten \usepackage{xcolor}. Statt sich das Aussehen jedes Namens zu merken, öffnet man das Handbuch mit texdoc xcolor: Dort steht neben jedem Namen ein gedrucktes Farbmuster. Eine Grenze ist noch zu merken: \rowcolor, \cellcolor und \rowcolors, die Tabellenzeilen und -zellen einfärben, gehören zu colortbl und nicht zu xcolor; die eine Zeile \usepackage[table]{xcolor} bringt beides mit – siehe die Seite über farbige Tabellen.
Bildschirmfarbe ist keine Druckfarbe – die Fallen von Papier und Barrierefreiheit
Bei einem Dokument für die Druckerei gilt: Eine in rgb geschriebene Farbe kommt nicht zwangsläufig so aus der Maschine. Der Offsetdruck kann Farbe nur aus den vier cmyk-Druckfarben aufbauen, und dieser Farbraum ist enger als das RGB eines Bildschirms. Mit der Option cmyk rechnet xcolor sämtliche Farben des Dokuments um; blue etwa wird zu {cmyk}{1,1,0,0}. Ein am Bildschirm leuchtendes Blau erscheint auf Papier dann leicht als schweres Violettblau – dieser Abstand ist keine Seltenheit. Vor der Druckabgabe empfiehlt es sich, einmal mit \usepackage[cmyk]{xcolor} zu setzen und einen Proof zu prüfen, oder die Farben von vornherein in cmyk zu definieren.
Eine Stufe tiefer liegt die eigentliche Falle: Farbe als einziges Signal zu verwenden. Rote Zeilen heißen Warnung, grüne heißen in Ordnung – diese Gestaltung verliert ihre gesamte Information, sobald die Seite schwarzweiß kopiert wird, jemand mit einer Farbsehschwäche sie liest oder sie auf einem E-Ink-Display erscheint. Genau darauf zielt der Web-Barrierefreiheitsstandard WCAG unter „Use of Color“ (Erfolgskriterium 1.4.1): Farbe muss stets mit einem zweiten Hinweis einhergehen – einem Symbol, Fettdruck, einer ausdrücklichen Beschriftung. Das Prüfmittel liefert xcolor selbst mit. Mit \usepackage[gray]{xcolor} werden alle Farben in das Modell gray überführt (red wird zu {gray}{0.3}) und damit die Ausgabe eines Schwarzweißdruckers unmittelbar simuliert. Bleibt der Sinn in diesem Zustand erhalten, stützt sich das Dokument nicht zu sehr auf Farbe.
% 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}