三言两语LaTeX的表格 (1)

Start

微博上看到微博网友说起论文格式,进而看到阿饼提到了多用LaTeX少用Word就很方便,突然有了些感触,毕竟咱去年写本科毕业论文时也是被Word折腾得不轻,最后靠LaTeX,基于校友整理的模板,三天从零开始完成一篇毕业论文的。

不过都说LaTeX很方便,但是LaTeX中每个组件其实也都是值得仔细推敲才能用得好或者用得美观的。作为过来人我打算简单整理下。那么,就从最值得整理的表格部分开始聊聊吧。

Episode 0

表格这个组件真的很常见,不论是写论文看论文,还是别的科普文章,几乎所有需要摆事实将论据的文章都会给出表格形式的内容作为论据。在LaTeX里,表格内容用tabular表示,换句话说,表格中表头和数据,都是直接在这里写出的。下面给出一组随意生成的数据,用最简单的例子来展示。

1
2
3
4
5
6
7
8
\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|}
\hline
Method & AP & AP$_{50}$ & AP$_{75}$ & AP$_{S}$ & AP$_{M}$ & AP$_{L}$ & AR & AR$_{S}$ & AR$_{M}$ & AR$_{L}$ \\
\hline
Network1 & 26.6 & 47.0 & 26.9 & 12.2 & 31.3 & 37.8 & 40.0 & 20.4 & 46.5 & 56.5 \\
Network2 & 29.1 & 48.9 & 30.7 & 12.5 & 34.2 & 44.2 & 42.5 & 21.2 & 49.5 & 62.3 \\
\hline
\end{tabular}

经过编译之后,就可以看到表格呈现如下所示的样子。

其中,表格体本身要用一对begin-end tabular块来包裹,begin语句后除了tabular,还包含一个大括号,用来表示表格体的列属性,例如上例中“|”表示当前位置是否添加竖向表格线;“c”表示该列的文本居中放置,同理你可以改成l或者r表示左对齐或者右对齐;hline则表示水平线,当你需要用水平线分割表格的时候,可以选择添加hline来构造。对于表格的每一行,我们用“&”符号去分割每个元素,并使用双斜杠表示这一行的结束,意味着换行渲染表格内容。

同理,下面给出一个数据部分不添加竖线,Method列左对齐的例子。

1
2
3
4
5
6
7
8
\begin{tabular}{|l|cccccccccc|}
\hline
Method & AP & AP$_{50}$ & AP$_{75}$ & AP$_{S}$ & AP$_{M}$ & AP$_{L}$ & AR & AR$_{S}$ & AR$_{M}$ & AR$_{L}$ \\
\hline
Network1 & 26.6 & 47.0 & 26.9 & 12.2 & 31.3 & 37.8 & 40.0 & 20.4 & 46.5 & 56.5 \\
Network2 & 29.1 & 48.9 & 30.7 & 12.5 & 34.2 & 44.2 & 42.5 & 21.2 & 49.5 & 62.3 \\
\hline
\end{tabular}

此时的显示内容如下所示。

学到这里,你已经掌握了最基本的表格绘制方式了ヾ(≧▽≦*)o。

Episode 1

上面想要渲染的其实就是某些学校毕业论文强制要求的三线表。当然,某学校的某老师当时也曾经对着我的表格指着说不合规范,好烦哦。所以说,更常见的三线表该怎么绘制呢?这个非常简单,只需要将表头和末尾的hline分别替换成“toprule”和“bottomrule”即可,目的是将顶部和底部的线加粗,当然,中间的hline也可以替换成midrule,此时渲染出的表格和使用hline时存在小幅的差异。需要注意的是,如果使用下述三线表构造方式,需要在LaTeX文档开始时导入booktabs包,这个包中给出了完整的三线表构造元素。下面给出一个例子。

1
2
3
4
5
6
7
8
9
10
\usepackage{booktabs}
% blablabla
\begin{tabular}{|ccccccccccc|}
\toprule
Method & AP & AP$_{50}$ & AP$_{75}$ & AP$_{S}$ & AP$_{M}$ & AP$_{L}$ & AR & AR$_{S}$ & AR$_{M}$ & AR$_{L}$ \\
\midrule
Network1 & 26.6 & 47.0 & 26.9 & 12.2 & 31.3 & 37.8 & 40.0 & 20.4 & 46.5 & 56.5 \\
Network2 & 29.1 & 48.9 & 30.7 & 12.5 & 34.2 & 44.2 & 42.5 & 21.2 & 49.5 & 62.3 \\
\bottomrule
\end{tabular}

此时的显示内容如下所示。

Episode 2

当然,表格中的文本也是可以调节格式的,无论是全局调节还是对每条文本的调节都可以做到。以调节每条文本为例,正如LaTeX标准语法所示,对于一段文本,用花括号包裹后,可以在花括号中添加参数来提供文本的格式选项,顺序如下:字号-格式-文本内容。例如还是Ep1给定的例子,我们把Network1设置为大字体加粗,把Network2设置为小字体加斜体,就可以这样写。

1
2
3
4
5
6
7
8
9
10
\usepackage{booktabs}
% blablabla
\begin{tabular}{|ccccccccccc|}
\toprule
Method & AP & AP$_{50}$ & AP$_{75}$ & AP$_{S}$ & AP$_{M}$ & AP$_{L}$ & AR & AR$_{S}$ & AR$_{M}$ & AR$_{L}$ \\
\midrule
{\Large \bf Network1} & 26.6 & 47.0 & 26.9 & 12.2 & 31.3 & 37.8 & 40.0 & 20.4 & 46.5 & 56.5 \\
{\tiny \it Network2} & 29.1 & 48.9 & 30.7 & 12.5 & 34.2 & 44.2 & 42.5 & 21.2 & 49.5 & 62.3 \\
\bottomrule
\end{tabular}

此时的显示内容如下所示。

对于字号,LaTeX内建了多种符号来表示不同的字体大小,从小到大为\tiny、\scriptsize、\footnotesize、\small、\normalsize、\large、\Large、\LARGE、\huge、\Huge。

对于格式,常用的包括粗体“\bf”和斜体“\it”。

Episode 3

但是tabular提供的调节选项没有那么丰富,如果真的想要更完善的表格体系,可以在tabular外使用table进行包裹,并且添加需要的参数。例如说我们需要为表格添加对应的描述(caption),我们可以这样写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\usepackage{booktabs}
% blablabla
\begin{table}
\begin{center}
\caption{Detection performance between two methods.}
\begin{tabular}{|ccccccccccc|}
\toprule
Method & AP & AP$_{50}$ & AP$_{75}$ & AP$_{S}$ & AP$_{M}$ & AP$_{L}$ & AR & AR$_{S}$ & AR$_{M}$ & AR$_{L}$ \\
\midrule
Network1 & 26.6 & 47.0 & 26.9 & 12.2 & 31.3 & 37.8 & 40.0 & 20.4 & 46.5 & 56.5 \\
Network2 & 29.1 & 48.9 & 30.7 & 12.5 & 34.2 & 44.2 & 42.5 & 21.2 & 49.5 & 62.3 \\
\bottomrule
\end{tabular}
\end{center}
\end{table}

当然为了美观我们会加上居中操作,此时显示内容如下所示。

当然caption的位置会根据你使用的模板来调节。

Episode 4

当然,有时你也会遇到一行表格数据稍微多一些,导致表格超出右边界的情况。例如说这样。

虽然这种情况可以靠折行解决,但是仍然存在让表格自适应的办法,只需要在table块内加入这行即可。

1
2
3
4
5
\begin{table}
\resizebox{\textwidth}{!}{
% blablabla
}
\end{table}

即可调节成自适应的效果。

Episode 5

如果想要使用斜线分割的表头呢?那么我们可以选择使用diagbox包进行处理。语法是“\diagbox{item}{item}……{item}”,看你需要写几个块了。

1
2
3
4
5
6
7
8
9
10
11
12
13
\begin{table}
\begin{center}
\caption{Detection performance between two methods.}
\begin{tabular}{|c|cccccccccc|}
\toprule
\diagbox{Method}{Result}{Metric} & AP & AP$_{50}$ & AP$_{75}$ & AP$_{S}$ & AP$_{M}$ & AP$_{L}$ & AR & AR$_{S}$ & AR$_{M}$ & AR$_{L}$ \\
\midrule
Network1 & 26.6 & 47.0 & 26.9 & 12.2 & 31.3 & 37.8 & 40.0 & 20.4 & 46.5 & 56.5 \\
Network2 & 29.1 & 48.9 & 30.7 & 12.5 & 34.2 & 44.2 & 42.5 & 21.2 & 49.5 & 62.3 \\
\bottomrule
\end{tabular}
\end{center}
\end{table}

显示效果如下。

Episode 6

那么单元格合并该怎么做呢?可以使用multicolumn和multirow来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\begin{table}
\begin{center}
\caption{Detection performance between two methods.}
\begin{tabular}{|c|cccccccccc|}
\toprule
\multirow{2}*{Method} & \multicolumn{10}{|c|}{Metric} \\
\cline{2-11}
& AP & AP$_{50}$ & AP$_{75}$ & AP$_{S}$ & AP$_{M}$ & AP$_{L}$ & AR & AR$_{S}$ & AR$_{M}$ & AR$_{L}$ \\
\midrule
Network1 & 26.6 & 47.0 & 26.9 & 12.2 & 31.3 & 37.8 & 40.0 & 20.4 & 46.5 & 56.5 \\
Network2 & 29.1 & 48.9 & 30.7 & 12.5 & 34.2 & 44.2 & 42.5 & 21.2 & 49.5 & 62.3 \\
\bottomrule
\end{tabular}
\end{center}
\end{table}

显示效果如下。

============

好啦,先写这些,后面遇到再来追加(:з)∠)