给图或表添加说明的 \caption 命令看起来朴素,却处在编号、交叉引用以及图表目录的核心位置。本页先梳理 \caption 的基础:它只能在浮动体中使用、会自动编号、如何指定短标题、\label 应放在哪里;随后介绍用于细致调整外观的 caption 包,以及把一个图拆成 (a)(b) 等小图的 subcaption 包。
\caption 基础
\caption{…} 是给图或表添加说明文字(题注)的命令。关键限制是:它只能在浮动体环境中使用,也就是只能在 figure 或 table 环境内部使用。直接写在普通正文中会报错。放在浮动体中时,LaTeX 会按类型 自动连续编号,如“Figure 1”“Table 3”,并把编号和题注正文按固定格式排出。编号不需要自己手写。
下面是一个最小的图示例。\centering 将图版居中,\includegraphics 读取图像,\caption 写在其下方。
\begin{figure}
\centering
\includegraphics[width=0.6\textwidth]{plot}
\caption{測定値と理論曲線の比較。}
\label{fig:plot}
\end{figure}当题注很长,而图目录(List of Figures)或表目录(List of Tables)中只想放短标题时,请使用方括号中的 可选参数:\caption[短标题]{完整正文}。方括号中的内容进入目录,花括号中的内容排在图旁边。省略方括号时,完整正文也会原样用于目录。
\caption[測定値と理論曲線]{測定値(点)と理論曲線(実線)の比較。誤差棒は標準偏差を表す。}用于交叉引用的 \label 有一条容易漏掉的铁则:一定要把 \label 放在 \caption 后面。LaTeX 只有在处理 \caption 时才会把“当前编号”更新为图的编号,因此若在 \caption 前写 \label,它会 抓到前一个计数器(例如章节编号),\ref 就会返回错误编号。把 \label 放在 \caption 之后,同行或下一行都可以,\ref{fig:plot} 就会正确得到“1”。
也说一下放置惯例:图的题注通常在图下方,表的题注通常在表上方。LaTeX 会在你写 \caption 的位置原样排出,所以若要放在上方,就把 \caption 写在图版或表格之前;若要放在下方,就写在之后(编号与正文的间距等格式本身不会因位置而改变)。期刊或会议常常会规定位置,因此先确认投稿要求。
用 caption 包调整外观
要改变标准题注的外观,例如字体、编号与正文之间的分隔符、对齐方式,请使用 Axel Sommerfeldt 编写的 caption 包。在导言区用 \usepackage{caption} 载入,然后通过 \captionsetup{键=值, …} 指定各种选项。最常用的键如下。
| 键 | 常见值 | 作用 |
|---|---|---|
format | plain / hang | 正文的排法;hang 会将续行按标签宽度缩进 |
labelsep | colon / period / space / quad | 编号(标签)与正文之间的分隔;colon 给出“: ”,period 给出“. ” |
font | small / bf / it … | 整个题注的字体和字号 |
labelfont | bf / sc … | 仅“Figure 1”标签部分的字体 |
justification | centering / raggedright / justified | 对齐方式:居中、左对齐(右边不齐)或两端对齐 |
width | 长度(如 0.8\textwidth) | 限制题注换行宽度 |
singlelinecheck | true / false | 一行短题注是否自动居中 |
例如,“编号加粗、分隔符用句点、整体使用较小字体”这样的体裁,可以在导言区一次性这样指定。\captionsetup 写在导言区会影响整篇文档;写在浮动体环境内部,则 只影响当场这个题注。
\usepackage{caption}
\captionsetup{labelfont=bf, labelsep=period, font=small, justification=raggedright}若要让图和表采用不同体裁,请 在方括号中指定浮动体类型:\captionsetup[figure]{…} 和 \captionsetup[table]{…}。注意 singlelinecheck 默认开启,它会把能放在一行内的短题注居中,而不管你给 justification 指定了什么。若想始终左对齐,请加上 singlelinecheck=false。
caption 包还提供另一个方便的命令 \captionof{类型}{正文}。它用于 给浮动体之外的内容添加题注:在 minipage 或 center 环境中,普通 \caption 不能使用,但写 \captionof{figure}{…} 就能把该对象作为“图”正确编号和引用。当你不想让图随浮动体自动放置,而是希望图和题注固定在正文中的某个位置时,它很有用。
\begin{center}
\includegraphics[width=0.5\textwidth]{diagram}
\captionof{figure}{フロートに入れずに置いた図。}
\label{fig:inline}
\end{center}用 subcaption 拆分图
常常需要在一个图中并排放置多个小图,并分别加上 (a)(b)(c) 这样的子标签。当前的标准工具是同样由 Sommerfeldt 编写的 subcaption 包。只需 \usepackage{subcaption} 载入,它会在内部自动载入 caption 包。
核心是 subfigure 环境(表格用 subtable 环境)。写法如 \begin{subfigure}[位置]{宽度},其中 宽度是必需参数;可选参数 [b] 等用于垂直对齐。它本质上是指定宽度的 minipage,内部放 \includegraphics 和 \caption。子图内部的 \caption 会成为 (a)/(b) 这样的子标签,而放在 subfigure 环境外部的 \caption 负责 整幅图的编号。
下面是两个子图横向并排的完整例子。两个 subfigure 的宽度都设为 0.45\textwidth,中间放入 \hfill,把它们推到左右两侧。
\usepackage{graphicx}
\usepackage{subcaption}
\begin{figure}
\centering
\begin{subfigure}[b]{0.45\textwidth}
\centering
\includegraphics[width=\textwidth]{before}
\caption{処理前}
\label{fig:before}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.45\textwidth}
\centering
\includegraphics[width=\textwidth]{after}
\caption{処理後}
\label{fig:after}
\end{subfigure}
\caption{画像処理の前後比較。}
\label{fig:compare}
\end{figure}在这个例子中,整幅图成为“Figure 1”,左右两个子图分别排成“(a) Before”和“(b) After”。在正文中,\ref{fig:before} 返回“1a”,\ref{fig:compare} 返回“1”。如果只想引用子图的 小标签,如“(a)”,可以写 \subref{fig:before} 得到裸的“a”,或写 \subref*{fig:before} 得到“(a)”。
除了 subfigure 环境,还有可以写成一行的 \subcaptionbox 命令。格式是 \subcaptionbox[目录条目]{小标题}[宽度][内部位置]{内容},这里要注意 把 \label 放在小标题参数内部(例如 \subcaptionbox{Before\label{fig:before}}{\includegraphics{…}})。它避免了多行 minipage,适合只放一张图片的简单子图。
避免旧包(subfig、subfigure)
用于子图的包在历史上有三代,很容易混淆。最早的 subfigure 包已经废弃(obsolete),使用旧命令 \subfigure。它的后继是 subfig 包(\subfloat 命令),但现在也不再积极维护。新文档建议使用本页说明的 subcaption 包。
需要注意的是,这些包不能同时载入。如果在 \usepackage 列表中同时放入 subcaption 和 subfig(或旧的 subfigure),内部定义会冲突并产生大量错误。期刊模板可能已经载入了旧包,所以在自己添加另一个包之前,先确认模板到底载入了什么。
- subcaption — 当前标准;提供
subfigure/subtable环境以及\subcaptionbox、\subref。与 caption 包集成,本页推荐。 - subfig — 上一代;提供
\subfloat命令。维护已停滞,新文档不推荐。 - subfigure — 最早的一代;提供
\subfigure命令。已废弃,不要使用。