【注】笔记来自《LaTeX入门》——刘海洋。详细参数可参见 LaTeX 官方文档:

1
texdoc caption

1. 简介

在设计文档时,我们经常需要修改浮动体标题的字体、间距、对齐方式等格式,然而 LaTeX 内核及标准文档并没有提供直接修改浮动标题格式的命令,这时就可以使用 caption 宏包来完成相关的设置。

2. 格式选项

使用 caption 宏包设置标题格式是通过一系列键值对形式的选项完成的,这些选项既可以作为宏包的可选项,也可以作为 \captionsetup 命令的参数出现,修改整篇文档的浮动体标题格式:

1
2
3
4
5
% 导言区
\usepackage[font=small,labelfont=bf]{caption}
% 下面命令与之等价
\usepackage{caption}
\captionsetup{font=small,labelfont=bf}

也可以只修改某种浮动体环境的标题格式,以 figure 环境为例:

1
2
3
% 导言区
\usepackage{caption}
\captionsetup[figure]{font=small,labelfont=bf}

此外,还可以修改某个浮动体环境的标题格式,以 figure 环境为例:

1
2
3
4
\begin{figure}
% ……
\captionsetup{font=small,labelfont=bf}
\end{figure}

caption 宏包提供了非常多的选项,限于篇幅,这里之选择其中常用的一些。为了叙述方便,我们假定 \caption 放在了一个虚拟的 metafloat 浮动环境中。

2.1 format 选项

format 选项主要用来设置长标题格式:

  • plain 格式:如果标题很长,折成几行,就会像普通的正文段落一样显示。
  • hang 格式:如果标题很长,标题前面的数值标签会进行悬挂,就好像 LaTeX 列表环境一样。

2.2 labelformat 选项

labelformat 选项则用来设置标签编号的格式:

格式 说明
default simple
empty 空格式,去除标签编号部分
simple 简单数字格式
brace 数字右括号格式
parens 带括号数字格式

2.3 labelsep 选项

labelsep 选项控制标签与后面标题之间的间隔:

格式 说明
default colon
none 无间隔
colon 英文分号
period 英文句点
space 空格
quad 一个 em 的间隔
newline 标题另起一行
endash 英文 dash 连接符

2.4 justification 选项

justification 选项设置浮动标题的对齐方式:

格式 对应段落命令 对齐方式
justified \justifying 普通段落的均匀对齐(默认值)
centering \centering 每行居中对齐
centerlast \centerlast 每段的最后一行居中对齐,其他行均匀对齐
centerfirst \centerfist 仅标题第一行居中对齐,其他行均匀对齐
raggedright \raggedright 每行左对齐,段落右边界可以不对齐
RaggedRight \RaggedRight 改进的 raggedright
raggedleft \raggedleft 每行右对齐

【注】与标准文档一样,在默认情况下,caption 宏包在单行的短标题中会忽略 justification 选项,而将其居中排版,只有多行的标题才使用选项中的对齐方式。如果希望设置的对齐方式对单行的标题也有效,则可以使用 singlelinecheck=false 来关闭对单独一行标题的检测。

2.5 font 选项

font 选项用来设置浮动标题的字体,而 labelfonttextfont 选项则可以单独设置前面的标签和后面文字的字体:

类别 格式 等价字体命令 说明
字体 scriptsize
footnotesize
small
normalsize
large
Large
\scriptsize
\footnotesize
\small
normalsize
\large
\Large
非常小
很小
较小
正文文字大小
较大
很大
字体族 rm
sf
tt
\rmfamily
\sffamily
\ttfamily
罗马体 Roman family
无衬线体 Sans Serif family
打字机体 Typewriter family
字体系列 md
bf
\mdseries
bfseries
中等粗细 Medium series
粗体 Bold series
字体形状 up
it
sl
sc
\upshape
\itshape
\slshape
\scshape
值直立体 Upright shape
意大利体 Italic shape
倾斜体 Slanted shape
小型大写字母 SMALL CAPS SHAPE
行距 singlespacing
onehalfspacing
doublespacing
stretch=<倍数>
\singlespacing
\onehalfspacing
\doublespacing
\setstretch{<倍数>}
单倍行距
「1.5」倍行距
「双倍」行距
多倍行距
颜色 normalcolor
color=<颜色>
\normalcolor
\color{<颜色>}
默认颜色
指定彩色
选项集合 normalfont
normal
\normalfont
-
恢复默认字体
恢复默认字体、行距、颜色

多个不同的字体选项可以同时使用,只要把几个选项放在分组中:

1
2
\captinosetup{font={small,sf},labelfont=bf}
\caption{小号加粗无衬线字体 Caption}

几个字体选项还支持 += 语法,用于在现有设置上增加新设置:

1
2
3
\captinosetup{font=small}
\captionsetup{font+=bf}
\caption{小号加粗字体 Caption}

2.6 margin 选项和 width 选项

margin 选项用来设置标题距离页面左右边界的距离,width 则用来设置标题的最大宽度。这两个选项之间有制约关系,因而通常同时只使用其中一个:

1
2
3
4
5
6
% 设定 margin
\captionsetup{margin=4em}
\caption{标题距离左右个 4\,em 的距离}
% 或设定 width
\captionsetup{widith=6em}
\caption{标题最多只有 8\,em 宽}

2.7 skip 选项

skip 选项控制标题与浮动环境内容的垂直间距,在标准文档类中默认值是 1010 pt。

1
2
\captionsetup{skip=0pt}
\caption{与前面浮动体内容无额外间隔}

2.8 type 选项

type 选项可以设置标题所对应的浮动环境类型,这就允许在非浮动环境中直接使用浮动体的标题,或者是在同一个浮动体中显示不同的几个标签。但注意标题仍然应该倍放在一个环境中或盒子中,而不是直接写在正文里。比如,可以利用 type 选项在同一个浮动体中完成图表的混排:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
\begin{figure}
\begin{minipage}[b]{.5\textwidth}
\centering
\includegraphics[width=.4\textwidth]{picture}
\caption{picture}
\end{minipage}
\begin{minipage}[b]{.5\textwidth}
\centering
\begin{tabular}{|*{5}{c|}}
\hline
1996 & 1998 & 1999 & 2000 & 2001 \\
\hline
2002 & 2003 & 2004 & 2005 & 2007 \\
\hline
2008 & 2009 & 2010 & \dots & \\
\hline
\end{tabular}
\captionsetup{type=table}
\caption{table}
\end{minipage}
\end{figure}

2.9 *name 选项

在导言区使用 *name 选项可以用来设置标题标签的文字名称。在标准文档类中,figuretable 环境的名称是「Figure」和「Table」,而 ctex 文档类则分别是「图」和「表」。设置 figurenametablename 选项等价于修改宏 \figurenametablename 的值,但更为方便:

1
2
3
% 导言区
\usepackage{caption}
\captionsetup{figurename=图片}

也可以在浮动体环境中直接使用 name 选项临时性修改标签名称:

1
2
\captionsetup{type=figure, name=空图片}
\caption{标签名称可以修改}

3. 功能命令

caption 宏包除了定义了大量的格式选项,同时也提供了一些有用的命令。

3.1 \caption 命令

\caption 用于给浮动环境添加标题,其语法格式为:

1
2
\caption{<标题>}
\caption{<短标题>}{<长标题>}

可选的参数短标题用于图表目录,而交叉引用的标题 \label 需要放在 \caption 后面,或者 <标题><长标题> 中。在 \caption<长标题> 中可以进行长达多段的叙述,但 <短标题> 或单独的 <标题> 中不允许分段。

1
2
3
4
5
6
\begin{figure}
\centering
\includegraphics{picture}
\caption[图片]{这是一张图片}\label{fig:picture}
% 或者 \caption[图片]{\label{fig:picture}这是一张图片}
\end{figure}

3.2 \captionof 命令

\caption{<类型>}{<标题>} 命令可以看作是先设置了 type 选项,然后使用普通的 \caption

1
\captionof{figure}{空图片标题}

\captionof\caption 一样,都有一个带星号的形式,表示不编号、不显示标签也不进入图表目录的标题:

1
2
\captionsetup{font=sf}
\caption*{无编号的标题,只保留格式}

3.3 \ContinuedFloat 命令

\ContinuedFloat 命令则用来放在浮动体中,阻止标题的编号增加,从而可以用一个编号表示多个浮动体。如果要产生「续图」、「续表」的功能,就可以使用类似下面的代码:

1
2
3
4
5
6
7
8
9
10
\begin{figure}
\ContinuedFloat
% ……
\caption{某图形}
\end{figure}
\begin{figure}
\ContinuedFloat
% ……
\caption{某图形(续)}
\end{figure}

3.4 其他命令

caption 宏包同时也提供了许多命令来为其格式选项增加新的取值。相关的命令很多,以 labelsep 选项为例,可以声明一个 fullcolon 的取值:

1
2
3
% 导言区
\DeclareCaptionLabelSeparator{fullcolon}{:} % 声明中文的全角冒号分隔符
\captionsetup{labelsep=fullcolon} % 为中文的标题设置全角冒号分隔符

4. 其他宏包

4.1 bicaption 宏包

bicaption 宏包是 caption 宏包的附加宏包,它提供了双语标题的功能,其基本命令是 \bicaption,语法格式如下:

1
\bicaption[<短标题一>]{<长标题一>}[<短标题二>]{<长标题二>}

此时可以同时使用 \captionsetup[bi-first]\captionsetup[bi-second]lang 选项分别设置两个标题不同的语言。bicaption 宏包原本使用 babel 宏包或 polyglossia 宏包提供的语言选择机制来设置不同语言的标题,不过中文等东亚语言不使用上述宏包的翻译机制,因此需要手工设置不同语言的标题。可以使用 \DeclareCaptionOption 命令来声明一个新的选项,完成标签名的重定义,然后可以用 \captionsetup 为每种语言分别调用。比如,设置中英文两种图表标题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
% 中文文档类会设定好标题的第一种语言
\documentclass{ctexart}
\usepackage{bicaption}
% 声明 english 选项重定义第二种语言的标签名,选项没有参数
\DeclareCaptionOption{english}[]{
\renewcommand\figurename{Figure}
\renewcommand\tablename{Table}
}
\captionsetup[bi-second]{english}
% ……
\beign{figure}
% ……
\bicaption{中文标题}{English Title}
\end{figure}

4.2 subcaption 宏包

subcaption 宏包可以给整个浮动体加一个概括性的标题,同时对浮动体内的每个子图表也都有自己的编号和标题。需要注意的是,subcaption 宏包依赖于 caption 宏包。subcaption 宏包提供了一组命令来完成子图表的排版输出。

  • \subcaption{<子标题>}:用来直接输出子标题。
  • \subcaptionbox[<目录标题>]{<标题>}[<宽度>][<盒子内位置>]{<内容>}:生成一个带有子标题的子图表。其中,如果省略 <宽度> 则使用其 <内容> 的自然宽度;<盒子内位置> 确定 <内容> 在盒子中的水平对齐方式,可以是 l\raggedright)、r\raggedleft)、c\centering)或 s(无特别格式),默认为居中的 c
  • \subcaptionbox*{<标题>}[<宽度>][<盒子内位置>]{<内容>}:与 \subcaptionbox 语法相同,但不进行编号。

【注】使用 \subcaptionbox 时,需要给子图加引用的 \label 标签可以放在 <标题> 参数中。使用 \ref 引用标签将得到「x.y(a)」,它是外层编号「x.y」和内层编号「(a)」的混合。若只引用子标题的内层编号,可以用 subcaption 提供的 \subref 命令。

由于子图表几乎总是需要使用子段盒子来放置内容和子标题,所以 subcaption 宏包还同时提供了 subfiguresubtable 环境,它们的语法和功能与 minipage 完全相同。

4.3 其他宏包

除了以上宏包外,还可以使用 subfigfloatrow 宏包,它们都与 caption 宏包的功能兼容,同时提供额外的子图表排版功能。

  • subfig 宏包主要提供了 \subfloat\subref 命令,功能和语法都和 subcaption 十分相近。
  • floatrow 宏包则预定义了许多更为复杂的子图表格式。