表格罫线大致有三种做法。LaTeX 标准的 \hline / \cline 与列指定中的 |;面向专业表格的 booktabs 包(\toprule、\midrule、\bottomrule);以及用于精细控制双线和纵线交叉方式的 hhline。标准罫线很容易上手,但线画得太多会让表格难读。本页依次介绍这三层,并说明为什么推荐把 booktabs 作为默认选择。
标准罫线 — \hline、\cline、|
原生 LaTeX 提供的横线是 \hline。把它放在一行的 \\ 之后(或表格最上方、最下方),就会在该位置画一条贯穿表格全宽的横线。连续写两个 \hline\hline,会得到由 \doublerulesep 隔开的 双横线。最后一行后的 \\ 通常可以省略,但如果要在最后一行下方画 \hline,必须先用 \\ 结束该行。
若要在表格中间只给 部分列 画横线,请使用 \cline{i-j}:横线只跨第 i 列到第 j 列,因此 \cline{2-3} 只画在第 2、3 列下方。若要同时画几个不相邻的范围,可像 \cline{1-1}\cline{3-4} 这样并列写出。纵线 不在表体中写,而是在 列指定 中生成:在列指定中插入 |(竖线),如 {|l|c|r|},就会在该位置放一条贯穿表格高度的纵线;写 || 则是双纵线。这些 |、\hline、\vline 的线宽由长度 \arrayrulewidth 决定(默认 0.4pt),成对线之间的距离由 \doublerulesep 决定。
\begin{tabular}{|l|c|r|}
\hline
項目 & 個数 & 価格 \\
\hline\hline
りんご & 3 & 380 \\
\cline{2-3}
みかん & 12 & 120 \\
\hline
\end{tabular}这个例子用纵线 | 围住所有列,用 \hline\hline 在表头下方画双线,并用 \cline{2-3}(只跨第 2、3 列)分隔中间部分。它展示了标准罫线的大部分功能,但也正是 应该避免的过度画线 的样本。
原因是 过多罫线会损害可读性。在排版传统中,线不是把数据关起来的笼子,而是用来标示信息 逻辑分隔 的克制工具。尤其是纵线会在列之间筑起视觉墙,阻碍视线流动;双线则无端显得沉重。下一节介绍的 booktabs 作者 Simon Fear 写道,这种表格布局“经过数世纪经验确立,除非情况非常特殊,否则不应改变”,并推荐只用简洁横线、既不用纵线也不用双线的表格。
booktabs — 出版品质的表格
booktabs 是 Simon Fear 编写的宏包,用于轻松排出“应出现在已出版科学书籍和期刊中的表格”。在导言区写 \usepackage{booktabs} 即可使用。它与普通 \hline 的区别在于:会 按粗细区分不同罫线,并在每条罫线 上下自动加入合适空白。结果是不需要框线包围,也能清楚读出结构的精致表格。
核心是三条命令:表格最上方的 \toprule,分隔表头与正文的 \midrule,以及表格最下方的 \bottomrule。\toprule 和 \bottomrule 较粗(默认 \heavyrulewidth = 0.08em),\midrule 较细(\lightrulewidth = 0.05em);这种粗细差异让表格外边界和内部分隔一眼可辨。它们都可用方括号单独指定粗细(如 \toprule[1pt]),并像 \hline 一样放在行末 \\ 之后;只有 \toprule 放在 \begin{tabular}{...} 之后。
\begin{tabular}{@{}llr@{}}
\toprule
\multicolumn{2}{c}{品目} \\
\cmidrule(lr){1-2}
種類 & 状態 & 価格 \\
\midrule
りんご & 蜜入り & 380 \\
みかん & 訳あり & 120 \\
\addlinespace
合計 & & 500 \\
\bottomrule
\end{tabular}这个例子汇集了 booktabs 的要素。只跨部分列的部分罫线是 \cmidrule{a-b},相当于 \cline 的 booktabs 版本。但由于 \cmidrule 会延伸到完整列宽,容易碰到相邻罫线,通常会加上 修剪(端部收缩)。在圆括号中写 (l)、(r)、(lr),会把左端、右端或两端按 \cmidrulekern(默认 0.5em)缩进;(lr){1-2} 就是在第 1–2 列画左右都修剪过的线。修剪量也可像 (r{.75em}) 这样单独指定。完整语法是 \cmidrule[width](trim){a-b}。
想在行与行之间加入少量空白,例如在合计行之前,可在 \\ 后放 \addlinespace。默认插入 \defaultaddspace(0.5em)的空白,也可用 \addlinespace[1ex] 指定量。它比用 \\[...] 单独拉伸某一行更能表达意图;放在罫线前后时,也能精确控制间距。如果确实需要手工指定线宽以及上下空白三者,可用 \specialrule{width}{above}{below}(三个参数都必需)。这是特殊情况用的命令,通常三条 \toprule / \midrule / \bottomrule 已经足够。
booktabs 的哲学在开头就以两条简单准则说明:“绝不要使用纵线”、“不要使用双线”。Fear 写道,这些规则“也许显得极端,但我从未找到打破它们的好理由”。如果表格左右两部分差异大到想用分隔线,答案应是 分成两张表,而不是画纵线;合计行上方也只需一条 \midrule。在实现上,booktabs 的罫线被设计为 不与列指定中的 | 相连,这是特性,也就是有意阻止使用纵线的设计。
还有一条规则:不要把 \hline 与 booktabs 的罫线混用。Fear 明确写道,它们“不能保证与 \hline 或 \cline 一起工作……我也想不出任何想混用它们的理由”。只有在极少数需要把两条 \cmidrule 叠在同一高度以做双重部分罫线时,才在中间插入 \morecmidrules(\cmidrule{1-2}\morecmidrules\cmidrule{1-2})。不过双线本身并不推荐,因此这也不是日常用法。
| 命令 | 作用 | 默认粗细 / 空白 |
|---|---|---|
\toprule | 表格顶部的罫线 | 宽度 \heavyrulewidth = 0.08em |
\midrule | 分隔表头与正文 | 宽度 \lightrulewidth = 0.05em |
\bottomrule | 表格底部的罫线 | 宽度 \heavyrulewidth = 0.08em |
\cmidrule(lr){a-b} | 只跨 a-b 列的部分罫线 | 宽度 \cmidrulewidth = 0.03em,修剪 \cmidrulekern = 0.5em |
\addlinespace | 在行间添加空白 | \defaultaddspace = 0.5em |
\specialrule | 完整指定线宽和上下空白 | 三个参数全部必需 |
hhline — 控制纵横线的交叉
hhline(David Carlisle 编写,包含在 LaTeX 的 tools 套件中)能像标准 \hline 一样绘制单横线和双横线,同时允许控制它们 如何与纵线相交。用 \usepackage{hhline} 载入。普通的 \hline\hline 双线无法选择纵线是在交点处断开还是贯穿过去;\hhline 可以逐字符指定。只有在确实必须把双线或部分横线与纵线组合,而内置命令处理不好时,它才有用。
\hhline{…} 的参数是一串类似 tabular 列指定的记号。各字符含义如下:= 表示一个列宽的双横线,- 表示单横线,~(波浪号)表示该列无线。纵线方面,| 表示 贯穿 双线(或单线)的纵线,: 表示被双线 切断 的纵线,# 表示两条纵线之间的一段双横线。还有用于构成双线角的 t(双线段上半部分)和 b(下半部分),它们必须放在两条纵线之间使用(|t: 是左上角,:b| 是右下角)。也可以使用与列指定相同的 *{n}{…} 重复形式。
注意,如果指定双纵线(|| 或 ::),\hhline 的横线会在该处断开。若想让横线不断开地贯穿过去,请使用 #,或干脆省略纵线指定。下面是官方文档中的例子,几乎用到了所有功能。
\begin{tabular}{||cc||c|c||}
\hhline{|t:==:t:==:t|}
a & b & c & d \\
\hhline{|:==:|~|~||}
1 & 2 & 3 & 4 \\
\hhline{#==#~|=#}
i & j & k & l \\
\hhline{||--||--||}
w & x & y & z \\
\hhline{|b:==:b:==:b|}
\end{tabular}在这张表中,顶端的 |t:==:t:==:t| 构成各段双横线的上半部分和纵线角,底端的 |b:==:b:==:b| 构成下半部分,使双线边框能与纵线干净衔接。中间几行混用 ~(无线)和 #(两条纵线之间的双线段),逐行改变横线在哪里断开、在哪里贯穿纵线。只用普通的 \hline / \cline 几乎不可能重现如此复杂的交叉,hhline 的用途正是这种 处理双线与纵线相交细节 的场面。
补充一个技术细节。\hline 是 TeX 的单个 \hrule,而 \hhline 的线由许多小线段组成。它们在 DVI 中位置准确,但某些查看器或驱动可能会让线段接缝看起来略有错位。若这让你在意,文档建议尝试其他驱动,或稍微增大 \arrayrulewidth 来减轻这一效果。
该用哪一个
结论基本只有一个:普通表格默认使用 booktabs。只用 \toprule / \midrule / \bottomrule 这三条线,再在需要时加 \cmidrule,就能得到期刊中常见的简洁、易读表格。遵循“不用纵线、不用双线”的原则后,罫线本身几乎不再需要纠结。
booktabs— 几乎所有表格的首选。只用横线,线宽和间距已调好,具备出版品质。- 标准
\hline/\cline/|— 无需额外包,使用方便。适合网格状表格或快速草稿,但要避免画线过多。 hhline— 只限于必须精细控制双线和纵线交叉方式的特殊情况。不要日常使用。
在考虑罫线本身之前,列如何对齐、如何分隔决定了表格骨架。列指定的基础请参见“tabular 环境”,\multicolumn、宽度指定等进阶内容请参见“列指定详解”。