【注】笔记来自《LaTeX入门》——刘海洋。详细参数可参见 LaTeX 官方文档:
texdoc caption
1. 简介
在设计文档时,我们经常需要修改浮动体标题的字体、间距、对齐方式等格式,然而 LaTeX 内核及标准文档并没有提供直接修改浮动标题格式的命令,这时就可以使用 caption
宏包来完成相关的设置。
2. 格式选项
使用 caption
宏包设置标题格式是通过一系列键值对形式的选项完成的,这些选项既可以作为宏包的可选项,也可以作为 \captionsetup
命令的参数出现,修改整篇文档的浮动体标题格式:
% 导言区
\usepackage[font=small,labelfont=bf]{caption}
% 下面命令与之等价
\usepackage{caption}
\captionsetup{font=small,labelfont=bf}
也可以只修改某种浮动体环境的标题格式,以 figure
环境为例:
% 导言区
\usepackage{caption}
\captionsetup[figure]{font=small,labelfont=bf}
此外,还可以修改某个浮动体环境的标题格式,以 figure
环境为例:
\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
选项用来设置浮动标题的字体,而 labelfont
和 textfont
选项则可以单独设置前面的标签和后面文字的字体:
类别 | 格式 | 等价字体命令 | 说明 |
---|---|---|---|
字体 | 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 |
恢复默认字体 恢复默认字体、行距、颜色 |
多个不同的字体选项可以同时使用,只要把几个选项放在分组中:
\captinosetup{font={small,sf},labelfont=bf}
\caption{小号加粗无衬线字体 Caption}
几个字体选项还支持 +=
语法,用于在现有设置上增加新设置:
\captinosetup{font=small}
\captionsetup{font+=bf}
\caption{小号加粗字体 Caption}
2.6 margin
选项和 width
选项
margin
选项用来设置标题距离页面左右边界的距离,width
则用来设置标题的最大宽度。这两个选项之间有制约关系,因而通常同时只使用其中一个:
% 设定 margin
\captionsetup{margin=4em}
\caption{标题距离左右个 4\,em 的距离}
% 或设定 width
\captionsetup{widith=6em}
\caption{标题最多只有 8\,em 宽}
2.7 skip
选项
skip
选项控制标题与浮动环境内容的垂直间距,在标准文档类中默认值是 pt。
\captionsetup{skip=0pt}
\caption{与前面浮动体内容无额外间隔}
2.8 type
选项
type
选项可以设置标题所对应的浮动环境类型,这就允许在非浮动环境中直接使用浮动体的标题,或者是在同一个浮动体中显示不同的几个标签。但注意标题仍然应该倍放在一个环境中或盒子中,而不是直接写在正文里。比如,可以利用 type
选项在同一个浮动体中完成图表的混排:
\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
选项可以用来设置标题标签的文字名称。在标准文档类中,figure
和 table
环境的名称是「Figure」和「Table」,而 ctex
文档类则分别是「图」和「表」。设置 figurename
和 tablename
选项等价于修改宏 \figurename
和 tablename
的值,但更为方便:
% 导言区
\usepackage{caption}
\captionsetup{figurename=图片}
也可以在浮动体环境中直接使用 name
选项临时性修改标签名称:
\captionsetup{type=figure, name=空图片}
\caption{标签名称可以修改}
3. 功能命令
caption
宏包除了定义了大量的格式选项,同时也提供了一些有用的命令。
3.1 \caption
命令
\caption
用于给浮动环境添加标题,其语法格式为:
\caption{<标题>}
\caption{<短标题>}{<长标题>}
可选的参数短标题用于图表目录,而交叉引用的标题 \label
需要放在 \caption
后面,或者 <标题>
、<长标题>
中。在 \caption
的 <长标题>
中可以进行长达多段的叙述,但 <短标题>
或单独的 <标题>
中不允许分段。
\begin{figure}
\centering
\includegraphics{picture}
\caption[图片]{这是一张图片}\label{fig:picture}
% 或者 \caption[图片]{\label{fig:picture}这是一张图片}
\end{figure}
3.2 \captionof
命令
\caption{<类型>}{<标题>}
命令可以看作是先设置了 type
选项,然后使用普通的 \caption
:
\captionof{figure}{空图片标题}
\captionof
和 \caption
一样,都有一个带星号的形式,表示不编号、不显示标签也不进入图表目录的标题:
\captionsetup{font=sf}
\caption*{无编号的标题,只保留格式}
3.3 \ContinuedFloat
命令
\ContinuedFloat
命令则用来放在浮动体中,阻止标题的编号增加,从而可以用一个编号表示多个浮动体。如果要产生「续图」、「续表」的功能,就可以使用类似下面的代码:
\begin{figure}
\ContinuedFloat
% ……
\caption{某图形}
\end{figure}
\begin{figure}
\ContinuedFloat
% ……
\caption{某图形(续)}
\end{figure}
3.4 其他命令
caption
宏包同时也提供了许多命令来为其格式选项增加新的取值。相关的命令很多,以 labelsep
选项为例,可以声明一个 fullcolon
的取值:
% 导言区
\DeclareCaptionLabelSeparator{fullcolon}{:} % 声明中文的全角冒号分隔符
\captionsetup{labelsep=fullcolon} % 为中文的标题设置全角冒号分隔符
4. 其他宏包
4.1 bicaption
宏包
bicaption
宏包是 caption
宏包的附加宏包,它提供了双语标题的功能,其基本命令是 \bicaption
,语法格式如下:
\bicaption[<短标题一>]{<长标题一>}[<短标题二>]{<长标题二>}
此时可以同时使用 \captionsetup[bi-first]
和 \captionsetup[bi-second]
的 lang
选项分别设置两个标题不同的语言。bicaption
宏包原本使用 babel
宏包或 polyglossia
宏包提供的语言选择机制来设置不同语言的标题,不过中文等东亚语言不使用上述宏包的翻译机制,因此需要手工设置不同语言的标题。可以使用 \DeclareCaptionOption
命令来声明一个新的选项,完成标签名的重定义,然后可以用 \captionsetup
为每种语言分别调用。比如,设置中英文两种图表标题:
% 中文文档类会设定好标题的第一种语言
\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
宏包还同时提供了 subfigure
和 subtable
环境,它们的语法和功能与 minipage
完全相同。
4.3 其他宏包
除了以上宏包外,还可以使用 subfig
和 floatrow
宏包,它们都与 caption
宏包的功能兼容,同时提供额外的子图表排版功能。
-
subfig
宏包主要提供了\subfloat
和\subref
命令,功能和语法都和subcaption
十分相近。 -
floatrow
宏包则预定义了许多更为复杂的子图表格式。