彩色表格 (colortbl)

colortbl 包提供了为表格的单元格、行、列铺 背景色,以及给线条着色的机制。载入只需一行:\usepackage[table]{xcolor}xcolortable 选项 会自动载入 colortbl,于是颜色名称来自 xcolor,表格着色来自 colortbl,两部分功能可以一起使用。核心是三个命令:\rowcolor(给行着色)\columncolor(给列着色)\cellcolor(给单元格着色),再加上自动斑马纹的 \rowcolors 和给线条着色的 \arrayrulecolor。本页介绍这五个命令,以及 单元格>行>列 的颜色优先级。

载入方式 — xcolor 的 table 选项

colortbl 可以单独载入,但推荐入口是 xcolor。用 table 选项 载入 xcolor 时,会同时启用 xcolor(颜色名、混色、颜色模型转换)和 colortbl(表格内着色)。colortbl 本身内部依赖 arraycolor 两个包;通过 xcolor 载入时,这些也会自动准备好。

document.tex
\usepackage[table]{xcolor}

这一行会启用下面介绍的全部命令:\rowcolor\columncolor\cellcolor\rowcolors\arrayrulecolor。在 beamer 中写法略有不同,需要作为类选项传入:\documentclass[xcolor=table]{beamer}。颜色可以是 grayred 这样的普通名称,也可以直接使用 xcolor 表达式,如 gray!20(20% 强度)或 red!30!yellow(30% 红色混入黄色)。淡背景常用 name!20 这样稀释后的指定。

给行、列、单元格着色的三个命令

核心是三个命令。\rowcolor{color} 给整行着色,\columncolor{color} 给整列着色,\cellcolor{color} 给单个单元格着色。三者形式相同,类似 \columncolor[model]{color}[left overhang][right overhang]:颜色名前可带 颜色模型 可选参数,颜色名后可带 左右伸出量(overhang) 可选参数。伸出量指定色块在列左右各延伸多远;省略时默认使用单侧 \tabcolsep(在 array 中为 \arraycolsep)。

注意,三者放置位置不同\rowcolor 放在 行首,即该行第一个单元格内容之前,也就是上一行 \\ 之后。\columncolor 不放在主体中,而是写在 列指定内部,形式为 >{\columncolor{gray!20}}array 包的 >{…} 钩子会在该列每个单元格前插入内容)。只有 \cellcolor 没有限制:它可以写在目标单元格内部 任意位置

latex
\begin{tabular}{>{\columncolor{gray!20}}l c r}
  \rowcolor{blue!30}
  項目 & 数量 & 価格 \\
  りんご & 3 & 380 \\
  みかん & \cellcolor{yellow!40}5 & 120 \\
\end{tabular}

在这个例子中,第 1 列通过 >{\columncolor{gray!20}} 染成浅灰色,表头行通过 \rowcolor{blue!30} 染成淡蓝色,而“mikan”的数量单元格单独用 \cellcolor{yellow!40} 高亮为黄色。请注意 \rowcolor 位于表头行的 开头,而 \columncolor 位于 列指定的 >{} 内部

优先级 — 单元格>行>列

当三种颜色在同一单元格中重叠时,谁胜出有明确规则。\cellcolor 覆盖 \rowcolor\rowcolor 覆盖 \columncolor,也就是 单元格>行>列。因此可以自然地叠加:先把整列染灰(\columncolor),再把表头行染蓝(\rowcolor),最后把某个单元格染黄(\cellcolor)。范围越窄优先级越高,正如直觉所示。

\cellcolor 出现之前,给单个单元格着色要写绕远的 \multicolumn{1}{>{\columncolor{…}}c}{…}。这种写法有很多缺点:内容可能妨碍着色触发,而且必须手动复制列对齐(在 p{} 列中尤其容易出错);colortbl 作者本人也直言 \multicolumn{1} “silly”。想给一个单元格着色时,直接使用 \cellcolor 即可。

自动斑马纹 — \rowcolors

隔行着色的 斑马纹 可以用来自 xcolor\rowcolors{start}{odd-row color}{even-row color} 自动完成(注意末尾有 s;没有 s\rowcolor 是另一个命令)。在表格 之前 写一次,后续行就会按指定交替着色。第一个引数是开始着色的行号;若要跳过表头行,使用 2。两个颜色引数都可以留空,表示“无颜色”。

latex
\rowcolors{2}{gray!15}{white}
\begin{tabular}{l r r}
  項目 & 数量 & 価格 \\
  りんご & 3 & 380 \\
  みかん & 5 & 120 \\
  ぶどう & 2 & 600 \\
  もも & 4 & 450 \\
\end{tabular}

这个例子从第 2 行开始斑马纹,在 gray!15(浅灰)和 white(白色)之间交替。表头(第 1 行)不着色,只有数据行交替着色。\rowcolors 前面还可带一个 可选参数:写成 \rowcolors[\hline]{2}{…}{…} 时,会在每行前执行 \hline 等命令。此外,显式的 \rowcolor\multicolumn 会覆盖 \rowcolors 的自动着色,因此也可以在斑马纹中途把某一行改成其他颜色。

命令着色对象放置位置
\columncolor{c}整列列指定中的 >{…}
\rowcolor{c}整行行首(第一个单元格之前)
\cellcolor{c}单个单元格该单元格内任意位置
\rowcolors{n}{a}{b}交替行(斑马纹)表格前一次
\arrayrulecolor{c}之后的线条表外 / 行首 / 列指定的 >{}

给线条着色 — \arrayrulecolor

线条(\hline\cline 和竖线 |)的颜色用 \arrayrulecolor{color} 设置。它是一个 全局声明,接受与 \color 相同的引数,可以放在表格外、行首,或列指定的 >{} 中。注意:如果在表格中途指定,它只影响之后绘制的线条;列前导言中已经声明的竖线会保持原来的颜色。要恢复默认值,可再次声明 \arrayrulecolor{black}

||\hline\hline 形成的 双线之间的间隙 默认保持白色。若也想给它着色,可结合长度 \doublerulesep(间隙宽度)使用 \doublerulesepcolor{color}。下面的例子把线条设为蓝色,把双线间隙设为黄色。

latex
\setlength\arrayrulewidth{1pt}\arrayrulecolor{blue}
\setlength\doublerulesep{2pt}\doublerulesepcolor{yellow}
\begin{tabular}{||l|c||}
  \hline\hline
  one & two \\
  three & four \\
  \hline\hline
\end{tabular}

如果只想单独给某条竖线着色,也可以不用专门命令,而是在列指定中用 !{\color{green}\vline} 代替 |\arrayrulewidth 是控制线条粗细的长度;着色后细线可能不明显,必要时可以稍微加粗。

与 booktabs 结合使用及注意点

colortbl 可以与 booktabs 一起使用,但二者配合有一个小问题。booktabs 会在 \toprule / \midrule / \bottomrule 上下加入少量空白(\aboverulesep\belowrulesep),因此行背景色与线条之间会留下 白色缝隙。若希望填色一直延伸到线条,常见做法是把这些空白设为 0pt,并把相应高度转移到 \extrarowheight 中。

另一个常见问题是:较高的内容或大字号文字可能碰到紧上方的 \hline 或色块顶端。为此,colortbl 提供长度 \minrowclearance;设置 \setlength\minrowclearance{2pt} 之类的值,会在较高行上方增加一点空白。(不过要适度,如果大写字母高度加上此值超过普通行高,行距会变得不均匀。)

最后谈一点节制。多数排版指南都 提醒不要过度使用线条和颜色。背景色最好只用于需要强调的表头行,或帮助视线横向追踪的淡色条纹。颜色本身的指定(颜色名、模型、混色)在“颜色(xcolor)”页面中介绍,线条惯例则在“线条”页面中说明。