TeX に色という概念はありません。クヌースが設計した組版エンジンは箱とグルーで紙面を組み立てるだけで、そこに色を置く場所は無く、色を表す基本命令も存在しません。では LaTeX の xcolor は何をしているのか——出力ドライバへの伝言です。\textcolor{red}{…} と書くと、TeX は「ここから赤」というメモ(\special)を出力ファイルに紛れ込ませ、実際に色を塗るのは PDF を作る側の仕事になります。この一点を知っていると、色にまつわる不可解な挙動がほとんど説明できます。このページでは \usepackage{xcolor} の読み込みから、\textcolor\colorbox\pagecolor\definecolor とモデル指定、red!30!white という混色の記法、そして「画面の色は紙には出ない」という最後の落とし穴までを順にたどります。

\usepackage{xcolor}color の違い——どちらを読み込むか

答えは常に \usepackage{xcolor} です。xcolor は David Carlisle の color パッケージの上位互換で、color のコマンドをそのまま受け継いだうえに、混色・色名セット・モデル変換を足しています。作ったのは Uwe Kern(2003〜2021 年)で、2021 年以降は LaTeX Project が引き継いでいます。TeX Live 2024 に入っているのは v3.01(2023 年 11 月 15 日)。設計の主眼は ドライバ非依存 で、pdfTeX で組んでも dvips 経由でも、同じ色指定が同じように解釈されます。

そのドライバ非依存へのこだわりは、オプションの設計にはっきり残っています。古い color は dvips 系のドライバが選ばれると dvipsnames の 68 色を黙って有効にしていました。手元では通るのに pdfTeX に切り替えたとたん未定義色でエラー、という文書ができあがるわけです。xcolor はこれをやめ、dvipsnames を書いた人にだけ色名を渡す代わりに、その色名をすべてのドライバで使えるようにしました。素の状態で使えるのは 19 の基本色。そこに dvipsnames(68 色)・svgnames(151 名)・x11names(317 名)を必要に応じて足します。表の着色をしたいなら table オプションで colortbl を連れてきます。

preamble
\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 tables

\textcolor\color の違い、\colorbox\fcolorbox

\textcolor{red}{文字} は引数に取った範囲だけを色付けし、\color{red}そこから TeX のグループが閉じるまで色を切り替えっぱなしにするスイッチです。この二つは別物ではなく、\textcolor\color を波括弧でくるんだ短縮形にすぎません——xcolor のドキュメント自身がそう説明しています。ですから {\color{blue} …} の外側の { } を忘れると、そこから先の文書がすべて青くなります。逆に言えば、節や環境の中で \color を使えばその環境の終わりで自動的に元へ戻る、ということでもあります。\textcolor はさらに \leavevmode を呼ぶので、段落の先頭に置いても字下げが壊れません。

document.tex
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{色}{文字}、枠と背景を別々に指定するのが \fcolorbox{枠色}{背景色}{文字} です。引数の順は「枠が先、塗りが後」。ここで一つ踏みやすい落とし穴があります。\colorbox は名前のとおり ボックス なので、中身は行をまたげません。長い文にハイライトを掛けると改行されずに版面からはみ出し、Overfull \hbox の警告が出ます。数語を目立たせるには十分ですが、文単位で塗りたいなら soul\hltcolorbox のような、行分割を扱える仕組みに移ってください。なお soul\sethlcolor のように、他パッケージの色引数は red!30!white のような色式をそのままでは受け取れないことがあります。そのときは \colorlet でいったん名前を付けてから渡します。

命令はたらき効く範囲
\textcolor{c}{text}引数の文字だけを色 c にする引数の中だけ
\color{c}そこから先の文字色を c に切り替える現在の TeX グループの終わりまで
\colorbox{c}{text}文字の背後を c で塗ったボックスにするボックス一つ分。行をまたげない
\fcolorbox{f}{b}{text}枠を f、背景を b にした囲みを作る同上。枠幅は \fboxrule
\pagecolor{c}ページ全体の地色を c にする大域宣言。以降のすべてのページ
\nopagecolor地色を消して透明に戻すドライバによっては未対応でログに記録が残る

\pagecolor がグループを無視する理由——色は \special である

\pagecolor{black} は現在のページとそれ以降のすべてのページの地色を変えます。しかも \color と違い、これは TeX のグループを尊重しない大域宣言 です。{\pagecolor{black} …} と書いても閉じ括弧で元には戻りません。戻したいときは明示的に \nopagecolor(透明に戻す)か \pagecolor{white} を置きます。表紙だけ黒くしたい、という用途ではこの性質が真っ先に足をすくうので、\maketitle の直後に打ち消しを入れておくのが定石です。地色ではなく、特定のページだけに枠や透かしを重ねたいのなら eso-pic 系の道具のほうが向いています。

document.tex
\pagecolor{black}\color{white}
\maketitle
% \pagecolor is global: it must be cancelled by hand
\nopagecolor\color{black}

この「大域」ぶりは行儀の悪さではなく、冒頭で触れた \special の性質そのものです。色は TeX の箱の中に格納されているわけではなく、出力ファイルに残された伝言でしかありません。だからページが切り替わると伝言は届かなくなる——初期の pdfTeX では、色を付けたまま改ページすると次のページで色が失われるという有名な問題がありました。対策として pdfcolmk というパッケージが、LaTeX のマーク機構を使って「このページはこの色で始まる」と毎ページ書き直していたほどです。pdfTeX 1.40(2007 年)が色スタックを内蔵したことでこの細工は不要になり、いま pdfcolmk は何もしない互換用の空パッケージ、xcolorfixpdftex オプションも Package option 'fixpdftex' is obsolete and ignored と警告を出すだけの遺物になりました。現代の pdfLaTeX では色は改ページを越えて保たれます。

\definecolor\colorlet の使い分け

数値から色を作るのが \definecolor{名前}{モデル}{値}、すでにある色から作るのが \colorlet{名前}{色} です。ブランドカラーの指定が「#1B3A6B」の形で降ってきたなら前者、「本文の青をもう少し暗く」なら後者、と考えると迷いません。どちらもプリアンブルに一度書けば、以後は redblue と同じ普通の色名として振る舞います。\colorlet の引数には次節で扱う色式をそのまま渡せるので、\colorlet{accent}{blue!30!black} のように混色に名前を与えるのが実務上もっとも効く使い方です。文書中の色をすべて名前経由にしておけば、トーンの調整はプリアンブルの一行を書き換えるだけで済みます。

preamble
\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 colour

rgb・RGB・HTML・cmyk・gray——色モデルはどれを選ぶか

\definecolor の第 2 引数が 色モデル、つまり色を数値で表す方式です。実務上の選び方は単純で、手元にある数字の形に合わせるのが正解です。Web のカラーコードを渡されたら HTML、デザインツールが 0〜255 で出してくるなら RGB、印刷所から 4 色の網点指定が来たら cmykxcolor は内部で相互変換するので、同じ色を別のモデルで書いても結果は同じになります。

モデル値の意味と範囲
rgb赤・緑・青、それぞれ小数 0〜1{0.2,0.4,0.8}
RGB同じく赤・緑・青、整数 0〜255{51,102,204}
HTML16 進 6 桁 RRGGBB。# は付けない{FF8800}
cmykシアン・マゼンタ・黄・墨、各 0〜1。印刷用{0,0.5,1,0}
gray明度 1 値。0 が黒、1 が白{0.5}
Gray同じく明度だが整数。既定の上限は 15{8}
hsb色相・彩度・明度、各 0〜1。色相を回すのに便利{0.6,0.8,0.9}
wave可視光の波長(nm)、363〜814。物理の図版向き{589}
named数値ではなく既存の色名を参照する擬似モデル{Periwinkle}
preamble
% 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}

モデルは使う側でも角括弧で直接指定できます。一度きりの色に名前を付けたくなければ \textcolor[HTML]{FF8800}{…}\color[gray]{0.5} で済ませられます。表の wave は変わり種で、可視光の波長をナノメートル単位で渡すと xcolor がその波長の見えを計算します——\definecolor{sodium}{wave}{589} はナトリウム D 線の黄橙色になります。光学やスペクトルの図に色を合わせたいとき、これ以上に正直な指定はありません。いっぽう named は数値を持たない擬似モデルで、dvipsnames などで読み込んだ既存の色名を参照するためのものです。ふだんは色名をそのまま書けば足ります。

red!30!white! は何をしているのか——色式で色を混ぜる

! は混合の比率を区切る記号で、色A!数値!色B は「A を数値パーセント、残りを B」 という意味です。red!50!blue を実際に展開すると rgb0.5,0,0.5——赤と青がちょうど半分ずつの紫になります。色 B を省いた red!20 は残りが とみなされ、1,0.8,0.8 すなわち赤 20 % に白 80 % の淡いピンクです。ここが xcolorcolor から決定的に離れた点で、色名を無限に増やさなくても、いま持っている色から必要な濃さを取り出せます。

  • red!50!blue — 赤と青を半々に。展開すると rgb0.5,0,0.5
  • red!20 — 赤 20 %、残りは白。薄い色(ティント)を作る定番
  • blue!30!black — 青 30 %、黒 70 %。暗い色(シェード)を作る定番
  • -red — 先頭のマイナスは補色。-red は正確にシアン(rgb0,1,1
  • green!40!yellow!60 — 式は連結できる。左から順に混ぜていく
  • gray!15gray!25 — 文字の背後に敷くならこの程度。原色は読みづらい

色式は「色を期待するあらゆる場所」で通ります。\textcolor{blue!30!black}{…}\colorbox{yellow!40}{…}\definecolor\colorlet の引数、そして表を塗る \rowcolor{gray!15} まで同じ記法です。実務では、混色をその場に散らさず \colorlet で一度だけ名前にしておくのが効きます。accentaccent!15 の二つだけで見出し・囲み・表の縞まで賄えば、色調の変更はプリアンブルの一行で終わります。散らかしたまま blue!30!black を 40 か所に書いてしまうと、後から色を変える作業が置換作業になります。

preamble
\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}

使える色名——19 の基本色から 752 色まで

オプションを一つも付けなくても、次の 19 色は常に使えます。xcolor.sty そのものが定義しているので、どのドライバでも、どの文書クラスでも同じ名前で通ります。色式の材料もこの 19 色で足りることが多く、gray!20blue!30!black のような書き方に慣れると、そもそも色名を増やす必要が薄れます。

  • black, blue, brown, cyan, darkgray, gray, green, lightgray, lime, magenta, olive, orange, pink, purple, red, teal, violet, white, yellow

それでも足りなければオプションで名前を足します。dvipsnames は dvips ドライバ由来の 68 色(RoyalBluePeriwinkleBurntOrange など、すべて cmyk 定義)、svgnames は SVG 1.1 仕様の名前に X11 由来の 4 語を足した 151 名、x11names は X11 の rgb.txt から取った 317 名です。ここに xcolor のマニュアルが自分で書いている面白い注記があります——svgnames の 151 の名前が指す色は、実際には 141 色しかありませんGrayGrey のように綴りの違う別名が同じ色を指しているためです。x11names も 317 名で 315 色。そして両方を読み込めば、rgb.txt の 752 名すべてに手が届く、というのがマニュアルの案内です。

これらの色名は 大文字小文字を区別しますRoyalBlueroyalblue と書くと ! Package xcolor Error: Undefined color 'royalblue'. で止まります。同じエラーは、色名セットを読み込み忘れたとき(\usepackage{xcolor} のまま Periwinkle を使ったとき)にも出ます。どの名前がどんな色かは texdoc xcolor でマニュアルを開けば色見本つきで一覧できるので、記憶に頼らず現物を見るのが早道です。なお表のセルや行を塗る \rowcolor\cellcolor\rowcolorsxcolor ではなく colortbl の担当で、\usepackage[table]{xcolor} の一行で両方そろいます——詳しくは色のついた表のページへ。

商業印刷に出す文書では、rgb で書いた色がそのまま刷り上がるとは限りません。オフセット印刷は cmyk の 4 色でしか色を作れず、その再現域は画面の RGB より狭いからです。xcolorcmyk オプションを渡すと文書中のすべての色が cmyk に変換され、たとえば blue{cmyk}{1,1,0,0} になります。画面で鮮やかだった青が、紙の上では沈んだ紫紺に見える——この落差は珍しくありません。入稿前に \usepackage[cmyk]{xcolor} で一度組んで刷り見本を確認するか、最初から cmyk で色を定義しておくのが安全です。

そしてもう一段深い落とし穴が、色を唯一の手がかりにしてしまうことです。赤い行が警告、緑の行が正常——この設計は、白黒コピーを取った瞬間、色覚特性のある読者の目の前、あるいは e-ink 端末の画面で、まるごと情報を失います。ウェブアクセシビリティの基準 WCAG が「色の使用」(達成基準 1.4.1)で求めているのもまさにこの点で、色は必ず記号・太字・ラベルなど別の手がかりと併用するのが原則です。幸い、確かめる手段は xcolor 自身が持っています。\usepackage[gray]{xcolor} と書けば全色が gray モデルに変換され(red{gray}{0.3} になります)、白黒プリンタの出力をそのまま試せます。この状態で意味が伝わるなら、その文書は色に頼りすぎていません。

preamble
% 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}