排版表格的基础是 tabular 环境。在 \begin{tabular}{ccc} 中,{ccc} 是 列指定,预先声明有几列以及各列如何对齐;在主体中用 & 分隔单元格,并用 \\ 结束每一行。横线用 \hline 绘制。本页介绍这三条规则,基本列指定 l、c、r、p{width},以及生成“表格内容”的 tabular 与把它作为带编号标题图表放置的浮动 table 环境之间的区别。
tabular 环境
tabular 是用来排版行列式表格的环境。它最重要的特征是,\begin{tabular} 后面紧跟一个 必选引数,即列指定。写 \begin{tabular}{ccc} 就表示“三个居中列”,这里声明的列数和对齐方式决定了整张表的骨架。主体中的每一行都要写成相同数量的单元格,并用 & 连接。
在表格内部有三个符号承担特殊作用。&(和号) 是同一行中单元格之间的 列分隔符。\\(两个反斜杠) 是结束一行的 行结束符(换行)。而 \hline 会在当前位置画一条横跨整张表宽度的 横线。最后一行后的 \\ 可以省略,但如果要在最后一行下方画线,就要先用 \\ 结束该行,再放置 \hline。
\begin{tabular}{ccc}
\hline
A & B & C \\
D & E & F \\
\hline
\end{tabular}这个例子排出一个三列两行的表格,并用上下各一条横线包围。每个单元格的内容(A 到 F)都按列指定 c 居中。& 前后的空格会被忽略,所以在源码中可以为了可读性用空格把单元格对齐。
另外,\begin{tabular} 在列指定之前还可以接收方括号中的 垂直位置可选参数(\begin{tabular}[t]{…} 将表格顶端与周围行的基线对齐,[b] 则对齐底端)。默认情况下,表格的垂直中心与所在行对齐。
基本列指定
列指定引数按每列一个字母书写。基本类型有四个。l 左对齐,c 居中,r 右对齐;它们都会让列宽扩展到 内容的自然宽度。这些列在行内 不会换行:如果单元格内容很长,列会横向伸到那一行内容的宽度,表格可能超出页面宽度。
第四种 p{width} 行为不同。它把该列设为指定 宽度的段落盒(parbox):当内容超过这个宽度时会 自动换行,形成多行。包含长文本的列应使用 p{width}。宽度可以是 p{5cm} 这样的绝对值,也可以是相对正文宽度的 p{0.3\linewidth}。默认情况下,p 列内容顶部对齐并两端对齐。
| 指定符 | 对齐 | 换行? |
|---|---|---|
l | 左对齐 | 否(自然宽度) |
c | 居中 | 否(自然宽度) |
r | 右对齐 | 否(自然宽度) |
p{幅} | 顶部、两端对齐 | 是(按给定宽度换行) |
更复杂的列指定,如跨多列单元格的 \multicolumn、重复列的 *{n}{…},以及 array 包的 m{width}(垂直居中)、b{width}(底端)和 >{…} 列前处理钩子,都在“列指定详解”页面中介绍。只掌握 l、c、r、p{width} 这四个,就已经能构建大多数表格。
线条 — 横线与竖线
横线用 \hline 绘制。它放在行与行之间,或表格上下端,会横跨整张表宽度画一条线。连续写两个 \hline,即 \hline\hline,会得到两条平行线(双线)。如果只想在表格中间的某些列上画线,可用带列范围的 \cline,例如 \cline{2-3}。
竖线通过在列指定中插入 |(竖线) 来创建。写 {|l|c|r|} 会在三列的外侧以及各列之间放入竖线,再配合 \hline 就会把所有单元格围成网格。|| 表示双竖线。
\begin{tabular}{|l|c|r|}
\hline
左 & 中央 & 右 \\
\hline
1 & 2 & 3 \\
\hline
\end{tabular}不过,惯例是避免过多线条。尤其是竖线和双线,在专业排版中通常不推荐。booktabs 包的作者明确说过“不要使用竖线,也不要使用双线”,期刊表格的标准做法是只用少量横线的简洁设计。易读的表格设计,以及 \toprule / \midrule / \bottomrule 的用法,会在“线条与出版级表格”页面中详细介绍。
行结束与行距调整
行结束符 \\ 可以带 可选引数。像 \\[2pt] 这样在方括号中添加长度,会在该行下方插入 额外的垂直空白(负值也可以压紧)。当横线贴得太紧,或希望行与行之间有些余量时可以使用。
注意,\\ 本质上是 换行命令:它不仅结束表格行,在数学矩阵以及 align 等对齐环境中也作为同样的“行分隔符”。因此“用 & 分列,用 \\ 换行”的感觉,不只适用于表格,也直接适用于数学对齐。
如果想统一增大整行高度,可以用 \renewcommand{\arraystretch}{1.3} 修改行高倍率。列与列之间的空白(默认每侧 6pt)由长度 \tabcolsep 控制。这些细微尺寸调整也会在“列指定详解”和“线条与出版级表格”页面中介绍。
tabular 与 table 环境的区别
它们经常被混淆,但 tabular 和 table 完全不同。tabular 排版的是 表格本身(行和列的内容),可以放在文本模式的任何地方:段落中、列表项中、图片标题中,甚至只要不在 $…$ 内,也可以放在脚注中。tabular 本身 没有标题、没有编号,也没有放置控制。
相比之下,table 环境是包在 tabular 外面的 浮动体。table 提供的是:通过 \caption{…} 生成的 带自动连续编号的标题(如“表 1”)、通过 \label{…} 和 \ref{…} 实现的 交叉引用,以及通过 [htbp] 等放置选项 把“放在页面哪里”交给 LaTeX 决定的机制。当表格较大、可能靠近分页位置时,把它做成浮动体可以让 LaTeX 把它移到合适的位置。table 环境的完整用法(标题、编号、放置)留到另一页说明。
\begin{table}[htbp]
\centering
\caption{四半期ごとの売上}
\begin{tabular}{lrr}
\hline
四半期 & 売上 & 前年比 \\
\hline
Q1 & 1{,}200 & +5\% \\
Q2 & 1{,}350 & +8\% \\
\hline
\end{tabular}
\end{table}在这个例子中,外层 table 负责“Table 1: Quarterly sales”这样的编号标题和放置,内层 tabular 排版内容。\centering 将表格水平居中。要点是职责分离:内容在 tabular 中,标题和放置在 table 中。单独的 tabular 已经可以排表,但若要在论文或报告中把它引用为“表 N”,就要用 table 包起来。
完整示例
最后,下面是一个把前面要素组合起来的 tabular 示例:第 1 列为左对齐标签,第 2 列为会换行的 p{width} 列,第 3 列为右对齐数字。
\begin{tabular}{l p{5cm} r}
\hline
項目 & 説明 & 価格 \\
\hline\hline
りんご & 蜜入りの大玉。贈答にも使われる人気の品種です。 & 380 \\
みかん & 甘くて手で剥ける小ぶりの柑橘。 & 120 \\
\hline
\end{tabular}这会排出一个三列表格。第 1 列“Item”按内容自然宽度左对齐,第 3 列“Price”右对齐。第 2 列“Description”是 宽 5cm 的 p 列,所以长说明会在 5cm 宽度处自动换行,只有该单元格变成多行(行高也随内容增加)。标题行下方用 \hline\hline 画双线,表格上下端用单条 \hline。如果把同样的长文本放进 l 或 r 列,它不会换行,而会横向伸出;这正是它与 p{width} 的决定性区别。