首发于 LaTeX 入门课

LaTeX 第六课:图表的排版

本文同时发布于微信公众号: 两个少年的奇幻漂流(ID:Amazing_Adventure)

本期的主题是图表的排版,主要内容有:

  • 普通表格与矩阵
  • 长表格与三线表
  • 图片的插入与大小控制
  • 浮动体与图表标题的制作

前段时间期末季实在太忙啦,于是这期就拖到了现在,大家见谅!

---

普通表格与矩阵

在 LaTeX 中,排版表格是一个非常重要的事情。在广义上,表格不仅包括我们日常所说的表格,也包含矩阵,因为表格的核心其实是 对齐 。在前面数学公式排版中,我们提到过矩阵的排版,其中就使用“&”符号作为对齐的标志。在表格中也是如此。

首先要介绍的是 tabular 和 array 环境,它们的功能几乎没有差别,也包含了排版表格的核心技术。其主要用法是这样的:

\begin{tabular}[<垂直对齐选项>]{<列格式说明>}
A & B & C \\
D & E & F \\
\end{tabular}

我们先解释列格式说明。列格式说明的基本元素有 l c r 三种,分别表示这一列是靠左、居中还是靠右对齐。在左右两端或基本元素之间可以加上竖线,表示这里是不是需要用线来分隔。举例如下:

在列格式中还有一些其他的说明符,在此也列举如下:

  • p{<宽度>},表示本列具有固定的宽度,表格内容在其中可以自动换行(但不能手动用 \\ 进行换行),并可以用 \raggedleft,\centering 等命令进行对齐。
  • @{<内容>},添加任意内容,不占表项计数,同时取消表列间的距离。例如我们需要某一列的数据按小数点对齐,就可以用 r@{.}l 这样定义两列,分别输入整数部分和小数部分,实现这个效果。
  • *{<计数>}{<列格式说明>},将部分列格式说明重复多次。

我们也可以在其中视需要加入横线进行分隔(\hline)。举例如下:

如果我希望某一行的横线不贯穿整个表格,则可以使用 \cline 命令。\cline{x-y} 可以获得一段从第 x 格到第 y 格的横线,举例如下:

垂直对齐选项表示在行内使用时,表格的哪一部分与文字对齐,其参数可以是 t 或者 b,默认条件是居中对齐。举例如下:

与底部对齐:

居中对齐:

这样的行内表格并不常见,因此大多数情况下我们不需要用到垂直对齐选项。

有的时候我们需要将表格单元进行合并,我们就可以使用 \multicolumn 命令。这一命令的使用方式如下:

\multicolumn{<项数>}{<列格式说明>}{<内容>}

设项数为 n,那么这一命令表示,将此行连着 n 个格子合并,并填入相应的内容。对被合并的 n 个格子,它们之间的对齐符号全部省略不写,但前后的对齐符号不可省略。

如果要合并列,则需要用 multirow 宏包提供的 \multirow 命令,其使用方式如下:

\multirow{<行数>}{<宽度>}{<内容>}
\multirow{<行数>}*{<内容>}

使用后一种用法就可以不指定宽度,最终其宽度会以内容的宽度为准。将上述两个命令相互嵌套,即可实现多行多列表格的合并。这样的操作其实是非常麻烦的,因此在这里为大家推荐 excel2latex 这个网站,还有同名的 Excel 插件,可以用 Excel 做好表格之后导出成 LaTeX 源码。

---

长表格与三线表

有的时候我们需要制作的表格,用一整张纸都装不下。这样的话我们在新的一页上需要重新排版一个表头,同时在页面接续处需要有一些文字来说明这个表格是跨页排版的。这个时候我们就需要 longtable 宏包中提供的 longtable 环境。其使用方式如下:

\begin{longtable}[<水平对齐项>]{<列格式说明>}
<第一页表头>
\endfirsthead
<接续处表头>
\endhead
<页面连接处表尾>
\endfoot
<最后一页表尾>
\endlastfoot
\end{longtable}

具体的使用细节可以参考 longtable 的宏包文档。

在科学论文中,更多使用的是 三线表 。这样的表格只在顶部、底部和表头下方有三条分隔线,其中顶部和底部的线较粗,表头下方的线较细。这样的线条可以用 booktabs 宏包提供的如下四种命令来实现:

  • \toprule:画顶部的线
  • \midrule:画表头下方的线
  • \bottomrule:画底部的线
  • \cmidrule:与 \cline 命令类似,可以画出一段短线,它比 \midrule 更细;配合 \morecmidrules 命令可以画出多条分隔线,并且其间有合适的间距

简明的使用方法如下:

\begin{tabular}[<垂直对齐项>]{<列对齐说明>}
\toprule 
\midrule
<内容> \\
\bottomrule

booktabs 宏包没有提供单独的表格环境,只需要在普通的表格中插入新定义的线条即可。详细的使用说明可以看看 booktabs 的文档。下面用一个比较复杂的三线表来回顾一下我们到现在为止讲到的全部内容吧(自己动手之前别忘了需要的宏包噢)。

---

图片的插入与大小控制

说完了表,我们来说图。插入一张图片的核心命令是

\includegraphics[<选项>]{<文件名>}

同时我们在插图时一般都需要调用 graphicx 宏包。下面默认全部调用。在使用 XeLaTeX 进行编译时,被插入的图片支持 EPS,PDF,PNG,JPEG,BMP 等五种格式。一般使用较多的是 PDF、PNG。PDF 图片是矢量图形的标准格式,也是最推荐使用的(一般的作图软件都支持输出 PDF 格式的图片);PNG 则是无损压缩的像素图模式,显示计算机制作的非自然图形。

图形文件一般和 .tex 源文件在同一目录下,因此可以直接写文件名插入。但有的时候图片会被合并到一个文件夹中进行管理,此时就可以使用 graphicx 宏包提供的 \graphicspath 命令来指定这个文件夹。指定后,所有图片的搜索都将在这个文件夹中进行。

\graphicspath{{figures/}}

例如上面这个命令就可以指定根目录下的 figures 文件夹为图片文件夹。

插入的图片可以指定大小,只要在 \includegraphics 命令中的选项中指定即可。例如

\includegraphics[width=\textwidth]{pic}

就可以将 pic 这张图片伸展成与版心等宽,恰好充满版面的宽度。类似的指标还有 height(表示图片的高度)和 scale(表示图片的比例)。

---

浮动体与图表标题的制作

一般情况下,图表都会占据页面中大块的位置,造成分页的困难。放在前面一页位置不够,放在后面一页又会造成前面一页底部有大量空白,非常不美观。于是 LaTeX 使用浮动体来解决这个问题。也就是说在排版的时候,如果当前位置放不下图表,那就先排版后面的内容,再在后面找合适的地方来放图表。针对图片和表格,LaTeX 提供了 figure 和 table 两种环境,不仅可以实现浮动,还可以分别编号并生成目录。下面我来举例为大家说明浮动体环境的使用方式。

\begin{figure}[<浮动位置>]
\includegraphics[<选项>]{<文件名>}
\caption{<图标题>}
\label{<标签>}
\end{figure}
\begin{table}[<浮动位置>]