tabular:先声明列,再填内容
表格的基础是 tabular 环境。它的写法是 \begin{tabular}{列格式} ... \end{tabular}——注意那个必须写的列格式参数,它用一串字母描述每一列怎么对齐:l 左对齐、c 居中、r 右对齐。有几列就写几个字母。
表格内部沿用了你已经熟悉的两个记号:& 分隔同一行的单元格,\\ 结束一行。这不奇怪——回想第 2 课,& 和 \\ 本来就是保留字符,它们的「本职」就是表格与对齐。
画线有两种:\hline 画一条横穿整表的横线,列格式里的 | 画竖线。例如 {|l|c|r|} 会得到「竖线-列-竖线-列-竖线-列-竖线」的网格效果。
列格式进阶:重复列、固定宽度与去边距
列很多时不必手写一堆字母。*{3}{c} 表示「三列居中」,等价于 ccc;*{2}{|c}| 表示两列居中且每列左侧带竖线。
默认情况下,列与列之间会留一点空隙。如果你想精确控制宽度、去掉这点空隙,可以用 @{} 显式声明列间距,例如 {@{}l l@{}}。多数场景用不到,但排「内容刚好顶满版心」的表格时会用到。
还有一点容易忽略:表格环境本身不会自动居中,它会左对齐。想让它水平居中,需要在整个 tabular 外面套一层 \centering(在浮动体里)或 center 环境。
booktabs 三线表:学术界的标准
带满竖线和横线的「网格表」在学术出版里几乎绝迹。期刊和书籍通行的是三线表:只有三条粗细不同的横线,没有任何竖线。它由 booktabs 宏包提供。
三线表的三个命令是:\toprule 顶线(较粗)、\midrule 中线(分隔表头与数据)、\bottomrule 底线(较粗)。行与行之间不加线,靠留白区分——这正是它显得高级的原因。
如果表头跨若干列需要单独一道分隔线,用 \cmidrule{2-3} 画一条只覆盖第 2 到第 3 列的短线,比 \hline 更精细。
table 浮动体:给表格编号与标题
裸 tabular 没有编号、也没有标题。正规做法是把它放进 table 环境——和 figure 一样,table 也是浮动体,会自动编号、可能移动位置。
table 里通常包含:\centering 居中、一个 \caption{...} 表注、可选 \label{tab:...},以及那个 tabular。惯例是表格的 \caption 写在表格上方(图片则写在下方),这样读者先看到标题再看到数据。
注意 table 与 tabular 只差一个字母、含义却完全不同:table 是带编号的浮动容器,tabular 是真正排行列的表格。初学者常把它们搞混。
Extra alignment tab has been changed to \cr:某一行的 & 比列数多(或少一个 & 导致列数不符)。数一数列格式里有几个字母,每一行就应该有几个 &。
表格溢出页面右边:内容太宽。可以缩小字号、减少列数,或改用 tabularx 宏包让某列自动折行。
最后一行后面忘了写 \\,或行尾的 \\ 之后紧跟 \hline 却少写:容易导致「Misplaced \noalign」之类的怪异报错,回头检查行尾。
tabular = 列格式 + & 分列 + \\ 换行;l/c/r 定对齐,| 画竖线,\hline 画横线,*{n}{c} 重复列。
正式表格用 booktabs 三线表:\toprule / \midrule / \bottomrule,不加竖线;再放进 table 浮动体配 \caption 与 \label。
下一课我们学习如何引用文献——这是学术写作里「自动编号」威力最大的场景。