LaTeX 中处理颜色的标准工具是 xcolor 包。它是取代旧 color 包的上位兼容包,不仅可以给文字和背景上色,还能通过 red!50!blue 这样的 颜色表达式(color expression) 混合颜色本身,这是它的核心特性。本页会依次介绍加载方式、颜色模型、预定义色名和混色。
加载包
要使用颜色,只需在导言区写 \usepackage{xcolor}。它由 Uwe Kern 编写(2003–2021;现在由 LaTeX Project 维护),设计上不依赖驱动,因此无论输出 PDF 还是 DVI,颜色表现都应一致。旧文档中会看到 \usepackage{color},但新文档请选择 xcolor:混色(颜色表达式)和额外的色名集合都是 xcolor 才有、color 没有的功能。
默认即可使用 19 个基本色名,但加上选项后会额外载入 预定义色名集合。dvipsnames 添加 68 个来自 PostScript(dvips)的颜色,svgnames 添加约 151 个 SVG 1.1 / CSS 颜色,x11names 添加约 317 个 X11 颜色。再加上 table 选项还会同时载入 colortbl,从而可以给表格单元格和行着色(详见“彩色表格”页面)。
\usepackage{xcolor} % 基本(19 色)/ basics (19 colours)
\usepackage[dvipsnames]{xcolor} % + 68 色 / + 68 PostScript names
\usepackage[svgnames]{xcolor} % + 約151色 / + ~151 SVG names
\usepackage[x11names]{xcolor} % + 約317色 / + ~317 X11 names
\usepackage[dvipsnames,table]{xcolor} % 色名 + 表の着色 / names + colortbl选项可以并用,例如写 [dvipsnames,svgnames] 就能一次载入多个集合。色名在内部设计为不会冲突,但为了避免混乱,最好只载入实际会用到的集合。
应用颜色
最常用的是 \textcolor{颜色}{文字},它只给传入的那段文字着色。如果不想用花括号包住一小段,而是想让后续内容一起变色,请在分组 { } 中使用声明式写法 {\color{颜色} … }。可以把 \color 理解为一个“开关”,它会一直有效到当前分组结束。
これは \textcolor{red}{赤い} 文字です。
{\color{blue} ここから先は青。} ここは元の色に戻ります。要给背景上色,\colorbox{颜色}{文字} 会把文字放在指定颜色的实心色块上。若边框和背景要用不同颜色,请使用 \fcolorbox{边框色}{背景色}{文字}:第一个参数是边框,第二个参数是填充色。要改变整页背景色,则用 \pagecolor{颜色}(用 \nopagecolor 取消)。它会影响从该处开始的所有页面,所以如果只想让封面变黑,放置位置要特别小心。
\colorbox{yellow}{ハイライト}
\fcolorbox{red}{yellow}{赤枠・黄背景}
\pagecolor{black} % これ以降、ページ全体が黒地に这些命令都可以在单纯色名的位置直接接受 颜色表达式 或显式模型。例如可以写 \textcolor{red!50!blue}{…},也可以带上方括号中的模型写 \textcolor[rgb]{1,0,0}{…}(模型见下一节)。
定义自己的颜色
给自己的颜色命名要用 \definecolor{名称}{模型}{值}。在导言区定义一次之后,它就像普通色名一样,可以传给 \textcolor 等命令。比如要把一种柔和的蓝色注册为 myblue,可以这样写:
\definecolor{myblue}{rgb}{0.2,0.4,0.8}
% 使う / use it:
\textcolor{myblue}{この文字は myblue}另一个工具 \colorlet{名称}{颜色} 可以从已有颜色(或颜色表达式)创建新的色名。\definecolor 是从模型和数值构造颜色,而 \colorlet 是给 已有颜色混合后的结果 命名。比如要把“红色向白色淡化一半”的颜色命名为 half,写 \colorlet{half}{red!50}。! 混色记法会在下一节详细说明。
颜色模型
\definecolor 的第二个参数是 颜色模型,也就是用数字表示颜色的方式。xcolor 支持多种模型,从面向印刷的 cmyk 到 Web 中熟悉的 HTML 十六进制写法,可按用途选择。常用的有:
| 模型 | 值 | 例 |
|---|---|---|
rgb | 红、绿、蓝各为 0–1 | {0.2,0.4,0.8} |
RGB | 红、绿、蓝各为 0–255 的整数 | {51,102,204} |
HTML | 6 位十六进制数 RRGGBB | {FF8800} |
cmyk | 青、品红、黄、黑各为 0–1 | {0,0.5,1,0} |
gray | 一个值(0 = 黑,1 = 白) | {0.5} |
named | 引用已有色名(如 dvips 色名) | {Periwinkle} |
同一种橙色可以用多种方式书写,差别只在记法,结果并不变。下面四行定义的基本上是同一个颜色。HTML 接受六位十六进制数字,因此可以直接粘贴 Web 颜色代码;cmyk 则用于印刷(四色分色)。
\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}在“使用”颜色的位置,也可以用方括号直接指定模型。如果只临时用一次,不想先定义色名,写 \textcolor[HTML]{FF8800}{…} 或 \color[gray]{0.5} 会很方便。注意 named 模型是引用已有色名(例如由 dvipsnames 载入的色名)的特殊模型;日常使用时通常直接写色名即可。
颜色表达式 — 混色
这正是 xcolor 的强项。凡是需要颜色的地方,都可以不用色名,而写带感叹号 ! 的 颜色表达式。基本形式是 颜色A!比例!颜色B:取 A 的 比例 百分比,剩下部分取 B 来混合。因此 red!50!blue 是 50% 红加 50% 蓝,red!75!blue 是 75% 红加 25% 蓝。
省略颜色 B 时,剩余部分会被视为 白色。也就是说,red!20 表示“20% 红 + 80% 白”,得到浅红色(淡色、tint)。反过来与黑色混合会变暗,blue!30!black 是“30% 蓝 + 70% 黑”的深蓝。前面加 减号 的 -red 表示红色的 补色(反色)。
red!50!blue— 红和蓝各半混成的紫色red!20— 红 20%、白 80%:浅红色(淡色)blue!30!black— 蓝 30%、黑 70%:暗蓝色(阴影色)-red— 红色的补色(偏青色)green!40!yellow!60— 表达式可以串联;从左到右依次混合
由于颜色表达式到处都能用,可以写 \textcolor{blue!30!black}{…}、\colorbox{yellow!40}{…},也可以在 \definecolor 或 \colorlet 中自由使用。把某个混色集中命名一次,就能通过一行定义调整整篇文档的色调,这正是它的设计思路。
\textcolor{red!50!blue}{半分ずつの紫}
\colorbox{yellow!40}{薄い黄色の背景}
\colorlet{accent}{blue!30!black} % アクセント色を一括管理
\textcolor{accent}{見出しの色}可用的色名
即使不加任何选项,下面 19 个基本色 也始终可用。
- black, blue, brown, cyan, darkgray, gray, green, lightgray, lime, magenta, olive, orange, pink, purple, red, teal, violet, white, yellow
如果需要更丰富的调色板,就用前面的选项添加色名集合。dvipsnames 提供 RoyalBlue、Periwinkle、BurntOrange 等 68 个颜色;svgnames 提供 DarkSlateGray、Tomato 等约 151 个 CSS 中常见的名称。色名区分大小写,所以把 RoyalBlue 写成 royalblue 会得到“undefined colour”错误。要确认每种颜色的外观,最可靠的是 xcolor 手册中的色卡(可用 texdoc xcolor 打开)。