LaTeX 学习记录(3):使用图表

很多朋友使用 $\LaTeX$ 处理图表是都会感觉达不到期望的状态,这篇文章我们来看看如何正确使用图表。

$\LaTeX$ 有很多“环境”的概念,在代码里就体现为采用 \begin{<env>}\end{<env>} 括起来的部分。环境一般用于局部的格式设置或者功能扩展,比如正常写作时采用的是两端对齐,如果想临时居中某内容时,可以使用 center 环境,如

tex

如果采用 $\LaTeX$ 进行编译后,生成的文档中,这里是正常的两端对齐文字。

\begin{center}
    这里是居中的文字。
\end{center}

环境是可以嵌套的,例如上面的内容在正文区,而正文区开始于 \begin{document} ,说明正文是处于 document 环境下的。

可以想象,一般的图表都采用居中的格式,应当分别处于独立的环境中,$\LaTeX$ 为此提供了 tablefigure 环境。对于上例这样一般的环境,它仅提供局部的格式变动,不会影响上下文之间的位置关系。而 tablefigure 却与之不同,它们被称作浮动体,意思是源码之间的相对位置与编译后生成文档中的相对位置可能是不同的。比如源码中的顺序是先写“如图 3 所示”,然后再插入图片,生成的文档可能会先插入图片,再出现“如图 3 所示”。

图表采用这种浮动体的原因有

  • 一般文档会以交叉引用的方式指明图表(比如“如图 3 所示”,而不是“如下图所示”),因此图表与正文的相对位置没有过于严格的要求;
  • 当前页面内的剩余版面可能无法完整插入图片或者表格,如果留空白会导致排版不好看,因此可以将图表移位,用后文填充页面;
  • $\LaTeX$ 默认的排版美学:同一页内连续使用图表或出现过多图表会使页面显得比较空洞而不好看。

使用浮动体(tablefigure环境)时可以用中括号添加可选参数,表示可以浮动的位置,可选以下几个参数或其组合:

  • h:允许在当前位置(here),即源码中插图与正文的相对位置保持一致;
  • t:允许在当前页面的最顶端(top);
  • b:允许在当前页面的最低端(bottom);
  • p:允许将图片放在单独一页(page)。

有时候 $\LaTeX$ 默认的排版美学会让人感到困惑,因此浮动体还支持采用 ! 选项突破默认的限制,例如我自己插图的时候经常会采用 \begin{figure}[!htb] 的设置。

为了在文档中插入图片,需要对 $\LaTeX$ 的功能进行“扩展”,在导言区使用 \usepackage{graphicx} 宏包即可。这个宏包提供的 \includegraphics 命令可以方便地插入 pdfepsjpgpng 等常见格式的图片,使用方法和示例如下。

tex

% 导言区添加 \usepackage{graphicx}
% \includegraphics[<选项>]{<图片文件名>}

\begin{figure}[!htb]    % 还记得刚说的图片放在浮动体内吗?
    \centering          % 设置图片居中
    % 插入图片,图片宽度为 0.7 倍正文宽度,图片文件为 misaka.png
    \includegraphics[width=0.7\textwidth]{misaka.png}
    \caption{御坂美琴}   % 正文中的图名
    \label{fig:misaka}  % 交叉引用的标签,以后再说哈
\end{figure}

以这种方法插图时,图片放置的位置必须在搜索路径中,或者使用绝对路径。一般情况下,我们会把正文图片收集在 figures 文件夹内,并在导入宏包后立即将该文件夹添加到图片的搜索路径,如下

tex

\usepackage{graphicx}
% 添加搜索路径,多个路径时用花括号区分
\graphicspath{
    {./figure/}
    {./figures/}
}

如此就可以实现正文的插图了。实际上,$\LaTeX$ 是支持直接绘图的,有兴趣的小伙伴可以在命令行使用 texdoc pgfmanual 查看具体方法。

1300 多页的说明文档直接给我劝退了……有学会的小伙伴教教我哈。通常我还是使用其他软件绘图,导出 .pdf 后在 $\LaTeX$ 中插图。说来,Inkscape 确实是一款很好用的矢量绘图开源软件。

绘制表格所需要的基本环境不需要额外的宏包进行扩展,但是依然推荐两个宏包:tabularxbooktabs,前者提供了定宽表格的格式,后者则提供了标准的三线表样式。下面我们先来看一个例子

tex

\begin{table}[hbp]
	\centering
	\caption{页码数字格式}
	\label{tab:pagenum}
	\begin{tabular}{ll}
		\toprule
		格式 & 说明 \\
		\midrule
		arabic & 阿拉伯数字 \\
		roman & 小写的罗马数字 \\
		Roman & 大写的罗马数字 \\
		alph & 小写的字符形式 \\
		Alph & 大写的字符形式 \\
		\bottomrule
	\end{tabular}
\end{table}

分析表格的代码:我们在最外围申明了表格所处的 table 环境,这是将表格整体作为浮动体;然后设置该环境下内容居中显示;由于表格的标题一般在表格上方,所以先生成标题并打上标签;剩下的一大块便是由 tabular 环境构造的表格。

tabular 环境是用来构造表格本体的,该环境有一个参数用来指明列格式,常用的列格式包括:

  • l:本列左对齐;
  • c:本列居中;
  • r:本列右对齐;
  • p{<列宽>}:指定列宽并允许自动换行;
  • |: 画一条竖线,不占据表项计数;
  • @{<内容>}:任意添加内容,不占表项计数;
  • *{<计数>}{<列格式说明>}:将给定列格式按计数重复多次。

诸位如果记不住这么多格式,只记住 l、c、r 就够基本使用了,有多少列就写多少个 l、c、r。

在表内,采用符号 & 指明对齐位置, 并使用 \\ 进行换行。表格中可以使用 \hline 绘制横线,或使用\cline{<开始>-<结束>} 指定横线的范围。booktabs 宏包提供了标准三线表的横线,可使用命令 \toprule\midrule\bottomrule分别绘制顶部横线、中间横线和底部横线。为了像 \cline 那样绘制指定位置的横线,该宏包还提供了 \cmidrule 命令。表格中绘制与单元格等高的竖线可用 \vline 命令。

如上面的例子所示,在不单独指定列宽的情况下,tabular 环境可以根据内容自动改变表格宽度,这在绝大多数情况下是非常好用的。然而有时候我们希望指定表格的总宽度,这就需要tabularx宏包提供的tabularx 环境。该环境在指定列格式之前必须指定表格的总宽度。同时,该宏包提供了一个特殊的列格式 X,它能够根据总宽度和表的内容自动改变列宽,也可以和其他列格式一起使用。

写了不少了,更详细的使用帮助可使用 texdoc <宏包名> 查看。不过,现在有很多 在线制作 $\LaTeX$ 表格 的工具,大家都可以尝试。