$\LaTeX{}$ 之文档元素(三)
本文主体内容来自一份 (不太) 简短的 LATEX2ε 介绍。
在知道了如何输入文字后,本章介绍一个结构化的文档所依赖的各种元素——章节、目录、列表、图表、交叉引用、脚注等等。
章节和目录
章节标题
一篇结构化的、条理清晰文档一定是层次分明的,通过不同的命令分割为章、节、小节。三个标准文档类
article
、report
和 book
提供了划分章节的命令:
1 | \chapter{⟨title⟩} \section{⟨title⟩} \subsection{⟨title⟩} |
其中 \chapter
只在 report
和
book
文档类有定义。这些命令生成章节标题,并能够自动编号。除此之外
\(\LaTeX{}\) 还提供了
\part
命令,用来将整个文档分割为大的分块,但不影响
\chapter
或 \section
等的编号。
上述命令除了生成带编号的标题之外,还向目录中添加条目,并影响页眉页脚的内容。每个命令有两种变体:
带可选参数的变体:
\section[<short title>]{<title>}
,标题使用<title>
参数,在目录和页眉页脚中使用<short title>
参数;带星号的变体:
\section*{<title>}
,标题不带编号,也不生成目录项和页眉页脚。
较低层次如 \paragraph
和 \subparagraph
即使不用带星号的变体,生成的标题默认也不带编号,事实上,除
\part
外:
article
文档类带编号的层级为\section
、\subsection
、\subsubsection
三级;report
和book
文档类带编号的层级为\chapter
、\section
、\subsection
三级。
目录
生成目录非常容易,只需在合适的地方使用命令:\tableofcontents
这个命令会生成单独的一章(report
/book
)或一节(article
),标题默认为“Contents”,可定制标题。这种生成的章节默认不写入目录(\section*
或 \chapter*
),可使用 tocbibind
等宏包修改设置。
正确生成目录项,一般需要 编译两次源代码。
有时使用了 \chapter*
或 \section*
这样不生成章节编号和目录项的章节标题命令,而又想手动生成该章节的目录项,可以在标题命令后面使用:
\addcontentsline{toc}{<level>}{<title>}
其中 <level>
为章节层次 \(\texttt{chapter}\) 或 \(\texttt{section}\)
等,<title>
为出现于目录项的章节标题。
titletoc
、tocloft
等宏包提供了具体定制目录项格式的功能,详情请参考宏包的帮助文档。
文档结构的划分
所有标准文档类都提供了一个 \appendix
命令将正文和附录分开,使用 \appendix
后,最高一级章节改为使用拉丁字母编号,从 A 开始。
book
文档类还提供了前言、正文、后记结构的划分命令:
\frontmatter
前言部分,页码使用小写罗马数字;其后的\chapter
不编号。\mainmatter
正文部分,页码使用阿拉伯数字,从 1 开始计数;其后的章节编号正常。\backmatter
后记部分,页码格式不变,继续正常计数;其后的\chapter
不编号。
以上三个命令还可和 \appendix
命令结合,生成有前言、正文、附录、后记四部分的文档。
下面的源代码是一份完整的文档结构。
1 | \documentclass{book} |
标题页
\(\LaTeX{}\) 支持生成简单的标题页。首先需要给定标题和作者等信息:
\title{<title>}
\author{<author>}
\date{<date>}
其中前两个命令是必须的(不用 \title
会报错;不用
\author
会警告),\date
命令可选。\(\LaTeX{}\) 还提供了一个 \today
命令自动生成当前日期,\date
默认使用 today
。在
\title
、\author
等命令内可以使用
\thanks
命令生成标题页的脚注,用 \and
隔开多个人名。
在信息给定后,就可以使用 \maketitle
命令生成一个简单的标题页了。下面的源代码给出了一个标题页的示例和大致效果。
\(\texttt{article}\)
文档类的标题默认不单独成页,而 \(\texttt{report}\) 和 \(\texttt{book}\) 默认单独成页。可在
\documentclass
命令调用文档类时指定 \(\texttt{titlepage}\) 或 \(\texttt{notitlepage}\)
选项以修改默认的行为。
1 | \title{Test title} |
\(\LaTeX{}\)
标准类还提供了一个简单的 titlepage
环境,生成不带页眉页脚的一页。用户可以在这个环境中使用各种排版元素自由发挥,生成自定义的标题页以替代
\maketitle
命令。甚至可以利用 titlepage
环境重新定义 \maketitle
:
1 | \renewcommand{\maketitle}{\begin{titlepage} |
事实上,为标准文档类指定了 \(\texttt{titlepage}\) 选项以后,使用
\maketitle
命令生成的标题页就是一个 \(\texttt{titlepage}\) 环境。
以上是 \(\LaTeX{}\)
标准文档类的标题页相关命令用法。在各种文档模板中经常有自定义的标题页,有可能需要除了
\title
和 \author
以外的命令给定信息,用法也可能与标准文档类的不一致(甚至有些模板可能没有定义
\(\texttt{titlepage}\) 等环境)。
使用文档模板前一定要仔细阅读文档模板的帮助文档。
交叉引用
交叉引用是 \(\LaTeX{}\)
强大的自动排版功能的体现之一。在能够被交叉引用的地方,如章节、公式、图表、定理等位置使用
\label
命令:
1 | \label{<label-name>} |
之后可以在别处使用 \ref
或 \pageref
命令,分别生成交叉引用的编号和页码:
1 | \ref{<label-name>} \pageref{<label-name>} |
为了生成正确的交叉引用,一般也需要 多次编译源代码。
label
命令可用于记录各种类型的交叉引用,使用位置分别为:
- 章节标题 在章节标题命令
\section
等之后紧接着使用。 - 行间公式 单行公式在公式内任意位置使用;多行公式在每一行公式的任意位置使用。
- 有序列表 在 \(\texttt{enumerate}\) 环境的每个
\item
命令之后、下一个\item
命令之前任意位置使用。 - 图表标题 在图表标题命令
\caption
之后紧接着使用。 - 定理环境 在定理环境内部任意位置使用。
在使用不记编号的命令形式(\section*
、\caption*
、带可选参数的
\item
命令等)时不要使用 \label
命令,否则生成的引用编号不正确。
脚注和边注
使用 \footnote
命令可以在页面底部生成一个脚注。假如输入以下文字和命令:
“ 天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。” \(\texttt{\footnote{出自《千字文》。}}\)
在正文中则为:“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”1
有些情况下(比如在表格环境、各种盒子内)使用 \footnote
并不能正确生成脚注。可以分两步进行,先使用 \footnotemark
为脚注计数,再在合适的位置用 \footnotetext
生成脚注。比如:
1 | \begin{tabular}{l} |
使用 \marginpar
命令可在边栏位置生成边注:
1 | \marginpar[⟨left-margin⟩]{⟨right-margin⟩} |
如果只给定了 right-margin,那么边注在奇偶数页文字相同;如果同时给定了 left-margin,则偶数页使用 left-margin 的文字。
特殊环境
列表
\(\LaTeX{}\)
提供了基本的有序和无序列表环境 \(\texttt{enumerate}\) 和 \(\texttt{itemize}\),两者用法类似,都用
\item
标明每个列表项。\(\texttt{enumerate}\)
环境会自动对列表项编号。
1 | \begin{enumerate} |
其中 \item
可带一个可选参数,将有序列表的计数或者无序列表的符号替换成自定义的符号。列表可以嵌套使用,最多嵌套四层。
1 | \begin{enumerate} |
1 | \begin{itemize} |
关键字环境 \(\texttt{description}\)
的用法与以上两者类似,不同的是 \item
后的可选参数用来写关键字,以粗体显示,一般是必填的:
1 | \begin{description} |
1 | \begin{description} |
各级无序列表的符号由命令 \labelitemi
到
\labelitemiv
定义,可以简单地重新定义它们:
1 | \renewcommand{\labelitemi}{\ddag} |
有序列表的符号由命令 \labelenumi
到
\labelenumiv
定义,重新定义这些命令需要用到计数器相关命令:
1 | \renewcommand{\labelenumi}% |
默认的列表间距比较宽,\(\LaTeX{}\)
本身也未提供方便的定制功能,可用 enumitem
宏包定制各种列表间距。enumitem
宏包还提供了对列表标签、引用等的定制。有兴趣的读者可参考其帮助文档。
对齐环境
\(\texttt{center}\)、\(\texttt{flushleft}\) 和 \(\texttt{flushright}\) 环境分别用于生成居中、左对齐和右对齐的文本环境。
1 | \begin{center} … \end{center} |
1 | \begin{center} |
除此之外,还可以用以下命令直接改变文字的对齐方式:
1 | \centering \raggedright \raggedleft |
1 | \centering |
三个命令和对应的环境经常被误用,有直接用所谓 \flushleft
命令或者 raggedright
环境的,都是不甚严格的用法(即使它们可能有效)。有一点可以将两者区分开来:\(\texttt{center}\)
等环境会在上下文产生一个额外间距,而
\centering
等命令不产生,只是改变对齐方式。比如在浮动体环境 \(\texttt{table}\) 或 \(\texttt{figure}\) 内实现居中对齐,用
\centering
命令即可,没必要再用 \(\texttt{center}\) 环境。
引用环境
\(\LaTeX{}\) 提供了两种引用的环境:\(\texttt{quote}\) 用于引用较短的文字,首行不缩进;\(\texttt{quotation}\) 用于引用若干段文字,首行缩进。引用环境较一般文字有额外的左右缩进。
1 | Francis Bacon says: |
1 | 《木兰诗》: |
\(\texttt{verse}\) 用于排版诗歌,与 \(\texttt{quotation}\) 恰好相反,\(\texttt{verse}\) 是首行悬挂缩进的。
1 | Rabindranath Tagore's short poem: |
摘要环境
摘要环境 \(\texttt{abstract}\)
默认只在标准文档类中的 \(\texttt{article}\) 和 \(\texttt{report}\) 文档类可用,一般用于紧跟
\maketitle
命令之后介绍文档的摘要。如果文档类指定了 \(\texttt{titlepage}\)
选项,则单独成页;反之,单栏排版时相当于一个居中的小标题加一个 \(\texttt{quotation}\) 环境,双栏排版时相当于
\section*
定义的一节。
代码环境
有时需要将一段代码原样转义输出,这就要用到代码环境 \(\texttt{verbatim}\),它以等宽字体排版代码,回车和空格也分别起到换行和空位的作用;
带星号的版本更进一步将空格显示成 ␣
。
1 | \begin{verbatim} |
1 | \begin{verbatim*} |
要排版简短的代码或关键字,可使用 \verb
命令:
1 | \verb⟨delim⟩⟨code⟩⟨delim⟩ |
<delim>
标明代码的分界位置,前后必须一致,除字母、空格或星号外,可任意选择使得不与代码本身冲突,习惯上使用
\(\texttt|\) 符号。
同 \(\texttt{verbatim}\)
环境,\verb
后也可以带一个星号,以显示空格:
1 | \verb|\LaTeX| \\ |
\verb
命令对符号的处理比较复杂,一般不能用在其它命令的参数里,否则多半会出错。
\(\texttt{verbatim}\) 宏包优化了
\(\texttt{verbatim}\)
环境的内部命令,并提供了 \verbatiminput
命令用来直接读入文件生成代码环境。 \(\texttt{fancyvrb}\) 宏包提供了可定制格式的
\(\texttt{Verbatim}\) 环境;\(\texttt{listings}\) 和 \(\texttt{minted}\)
宏包更进一步,可生成关键字高亮的代码环境,支持各种程序设计语言的语法和关键字。详情请参考各自的帮助文档。
表格
排版表格最基本的 \(\texttt{tabular}\) 环境用法为:
1 | \begin{tabular}[⟨align⟩]{⟨column-spec⟩} |
其中 <column-spec>
是列格式标记,在接下来的内容将仔细介绍;&
用来分隔单元格;\\
用来换行;\hline
用来在行与行之间绘制横线。
直接使用 \(\texttt{tabular}\)
环境的话,会 和周围的文字混排。此时可用一个可选参数
<align>
控制垂直对齐:\(\verb|t|\) 和 \(\verb|b|\)
分别表示按表格顶部、底部对齐,其他参数或省略不写(默认)表示居中对齐。
1 | \begin{tabular}{|c|} |
但是通常情况下 \(\texttt{tabular}\)
环境很少与文字直接混排,而是会放在 \(\texttt{table}\) 浮动体环境中,并用
\caption
命令加标题。
列格式
\(\texttt{tabular}\) 环境使用
<column-spec>
参数指定表格的列数以及每列的格式。基本的列格式见下表。
列格式 | 说明 |
---|---|
\(\texttt{l/c/r }\) | 单元格内容左对齐/居中/右对齐,不折行 |
\(\texttt{p\{<width>\}}\) | 单元格宽度固定为
<width> ,可自动折行 |
\(\mid\) | 绘制竖线 |
\(\texttt{@\{<string>\}}\) | 自定义内容
<string> |
1 | \begin{tabular}{lcr|p{6em}} |
表格中每行的单元格数目不能多于列格式里 \(\texttt{l/c/r/p}\) 的总数(可以少于这个总数),否则出错。
\(\texttt{@}\) 格式可在单元格前后插入任意的文本,但同时它也消除了单元格前后额外添加的间距。\(\texttt{@}\) 格式可以适当使用以充当“竖线”。特别地,\(\texttt{@\{\}}\) 可直接用来消除单元格前后的间距:
1 | \begin{tabular}{@{} r@{:}lr @{}} |
另外还提供了简便的将格式参数重复的写法
*{<n>}{<columnspec>}
,比如以下两种写法是等效的:
1 | \begin{tabular}{|c|c|c|c|c|p{4em}|p{4em}|} |
有时需要为整列修饰格式,比如整列改变为粗体,如果每个单元格都加上
\bfseries
命令会比较麻烦。array
宏包提供了辅助格式 \(\texttt>\) 和
\(\texttt<\),用于给列格式前后加上修饰命令:
1 | % \usepackage{array} |
辅助格式甚至支持插入 \centering
等命令改变 \(\texttt{p}\)
列格式的对齐方式,一般还要加额外的命令 \arraybackslash
以免出错。
1 | % \usepackage{array} |
array
宏包还提供了类似 \(\texttt{p}\) 格式的 \(\texttt{m}\) 格式和 \(\texttt{b}\)
格式,三者分别在垂直方向上靠顶端对齐、居中以及底端对齐。
1 | % \usepackage{array} |
列宽
在控制列宽方面,\(\LaTeX{}\)
表格有着明显的不足:\(\texttt{l/c/r}\)
格式的列宽是由文字内容的自然宽度决定的,而 \(\texttt{p}\)
格式给定了列宽却不好控制对齐(可用 array
宏包的辅助格式),更何况列与列之间通常还有间距,所以直接生成给定总宽度的表格并不容易。
\(\LaTeX{}\) 本身提供了 \(\texttt{tabular*}\)
环境用来排版定宽表格,但是不太方便使用,比如要用到 \(\texttt{@}\)
格式插入额外命令,令单元格之间的间距为
\fill
,但即使这样仍然有瑕疵:
1 | \begin{tabular*}{14em}% |
tabularx
宏包为我们提供了方便的解决方案。它引入了一个
\(\texttt{X}\) 列格式,类似 \(\texttt{p}\)
列格式,不过会根据表格宽度自动计算列宽,多个 \(\texttt{X}\) 列格式平均分配列宽。 \(\texttt{X}\) 列格式也可以用
array
里的辅助格式修饰对齐方式:
1 | % \usepackage{array,tabularx} |
横线
在之前的例子见过许多次绘制表格线的 \hline
命令。另外
\cline{<i>-<j>}
用来绘制跨越部分单元格的横线:
1 | \begin{tabular}{|c|c|c|} |

在科技论文排版中广泛应用的表格形式是三线表,形式干净简明。三线表由
booktabs
宏包支持,它提供了
\toprule
、\midrule
和 \bottomrule
命令用以排版三线表的三条线,以及和 \cline
对应的
\cmidrule
。除此之外,最好不要用其它横线以及竖线:
1 | % \usepackage{booktabs} |
合并单元格
横向合并单元格由 \multicolumn
命令实现:
1 | \multicolumn{⟨n⟩}{⟨column-spec⟩}{⟨item⟩} |
其中 <n>
为要合并的列数,<column-spec>
为合并单元格后的列格式,只允许出现一个 \(\texttt{l/c/r}\) 或 \(\texttt{p}\)
格式。如果合并前的单元格前后带表格线 \(\texttt|\),合并后的列格式也要带 \(\texttt|\) 以使得表格的竖线一致。
1 | \begin{tabular}{|c|c|c|} |
纵向合并单元格 需要用到 multirow
宏包提供的 \multirow
命令:
1 | \multirow{⟨n⟩}{⟨width⟩}{⟨item⟩} |
我们看一个结合 \cline
、\multicolumn
和
\multirow
命令的例子:
1 | % \usepackage{multirow} |
嵌套表格
在以下的例子中,注意要用 \multicolumn
命令配合 \(\texttt{@\{\}}\)
格式把单元格的额外边距去掉,使得嵌套的表格线能和外层的表格线正确相连:
1 | \begin{tabular}{|c|c|c|} |
如果不需要为“拆分的单元格”画线,并且只在垂直方向“拆分”的话,makecell
宏包提供的 \makecell
命令是一个简单的解决方案:
1 | % \usepackage{makecell} |
行距控制
\(\LaTeX{}\)
生成的表格看起来通常比较紧凑。修改参数 \arraystretch
可以得到行距更加宽松的表格。
1 | \renewcommand\arraystretch{1.8} |
另一种增加间距的办法是给换行命令 \\
添加可选参数,在这一行下面加额外的间距,适合用于在行间不加横线的表格:
1 | \begin{tabular}{c} |
但是这种换行方式的存在导致了一个缺陷——从第二行开始,表格的首个单元格不能直接使用中括号
\(\texttt{[]}\),否则 \\
往往会将下一行的中括号当作自己的可选参数,因而出错。如果要使用中括号,应当放在花括号
{}
里面。或者也可以选择将换行命令写成 \(\texttt{\\\\[0pt]}\)。
图片
\(\LaTeX{}\)
本身不支持插图功能,需要由 graphicx
宏包辅助支持。
使用 \(\texttt{latex + dvipdfmx}\)
编译命令时,调用 graphicx
宏包时要指定 \(\texttt{dvipdfmx}\) 选项;而使用 \(\texttt{pdflatex}\) 或 \(\texttt{xelatex}\) 命令编译时不需要。
不同编译命令支持的图片格式种类各异,见下表。这个表格也能解答诸如“为什么 \(\texttt{.eps}\) 格式图片在 \(\texttt{pdflatex}\) 编译命令下出错”之类的问题。本表格也再一次说明,使用 \(\texttt{xelatex}\) 命令是最推荐的方式。
在调用了 graphicx
宏包以后,就可以使用
\includegraphics
命令加载图片了:
1 | \includegraphics[⟨options⟩]{⟨filename⟩} |
其中 <filename> 为图片文件名,文件名可能需要用相对路径或绝对路径表示。图片文件的扩展名一般可不写。另外一定要注意,文件名里既不要有空格也不要有多余的英文点号,否则宏包在解析文件名的过程中会出错。
另外 graphicx
宏包还提供了 graphicspath
命令,用于声明一个或多个图片文件存放的目录,使用这些目录里的图片时可不用写路径:
1 | % 假设主要的图片放在 figures 子目录下,标志放在 logo 子目录下 |
在 \includegraphics
命令的可选参数
<options>
中可以使用
<key>=<value>
的形式,常用的参数如下:
graphicx
宏包也支持 \(\texttt{draft}\)/\(\texttt{final}\) 选项。当
graphicx
宏包或文档类指定 \(\texttt{draft}\)
选项时,图片将不会被实际插入,取而代之的是一个包含文件名的与原图片等大的方框。(加快编译过程)
盒子
盒子是 \(\LaTeX{}\) 排版的基础单元,虽然解释略有抽象:每一行是一个盒子,里面的文字从左到右依次排列;每一页也是一个盒子,各行文字从上到下依次排布……颇有一些活字印刷术的味道。
不管如何,\(\LaTeX{}\) 提供了一些命令让我们手动生成一些有特定用途的盒子。
水平盒子
生成水平盒子的命令如下:
1 | \mbox{…} |
\mbox
生成一个基本的水平盒子,内容只有一行,不允许分段(除非嵌套其它盒子,比如后文的垂直盒子)。外表看上去,\mbox
的内容与正常的文本无二,不过断行时文字不会从盒子里断开。
\makebox
更进一步,可以加上可选参数用于控制盒子的宽度
<width>
,以及内容的对齐方式
<align>
,可选居中 \(\texttt{c}\)(默认值)、左对齐 \(\texttt{l}\)、右对齐 \(\texttt{r}\) 和分散对齐 \(\texttt{s}\)。
1 | |\mbox{Test some words.}|\\ |
带框的水平盒子
\fbox
和 \framebox
让我们可以为水平盒子添加边框。使用的语法与 \mbox
和
\makebox
一模一样:
1 | \fbox{…} |
1 | \fbox{Test some words.}\\ |
可以通过 \setlength
命令调节边框的宽度
\fboxrule
和内边距 \fboxsep
:
1 | \framebox[10em][r]{Test box}\\[1ex] |
垂直盒子
如果需要排版一个文字可以换行的盒子,\(\LaTeX{}\) 提供了两种方式:
1 | \parbox[⟨align⟩][⟨height⟩][⟨inner-align⟩]{⟨width⟩}{…} |
其中 <align>
为盒子和周围文字的对齐情况;<height>
和
<inner-align>
设置盒子的高度和内容的对齐方式,<inner-align>
接受的参数是顶部 \(\texttt{t}\)、底部
\(\texttt{b}\)、居中 \(\texttt{c}\) 和分散对齐 \(\texttt{s}\)。
1 | 三字经:\parbox[t]{3em}% |
如果在 minipage
里使用 \footnote
命令,生成的脚注会出现在盒子底部,编号是独立的,并且使用小写字母编号。这也是
\(\texttt{minipage}\)
环境之被称为“迷你页”(Mini-page)的原因。而在 \parbox
里无法正常使用 \footnote
命令,只能在盒子里使用
\footnotemark
,在盒子外使用
\footnotetext
。
1 | \fbox{\begin{minipage}{15em}% |
标尺盒子
\rule
命令用来画一个实心的矩形盒子,也可适当调整以用来画线(标尺):
1 | \rule[⟨raise⟩]{⟨width⟩}{⟨height⟩} |
1 | Black \rule{12pt}{4pt} box. |
浮动体
内容丰富的文章或者书籍往往包含许多图片和表格等内容。这些内容的尺寸往往太大,导致分页困难。\(\LaTeX{}\) 为此引入了浮动体的机制,令大块的内容可以脱离上下文,放置在合适的位置。 \(\LaTeX{}\) 预定义了两类浮动体环境 \(\texttt{figure}\) 和 \(\texttt{table}\)。习惯上 \(\texttt{figure}\) 里放图片,\(\texttt{table}\) 里放表格,但并没有严格限制,可以在任何一个浮动体里放置文字、公式、表格、图片等等任意内容。
以 \(\texttt{table}\) 环境的用法举例,\(\texttt{figure}\) 同理:
1 | \begin{table}[⟨placement⟩] |
<placement>
参数提供了一些符号用来表示浮动体允许排版的位置,如 \(\texttt{hbp}\)
允许浮动体排版在当前位置、底部或者单独成页。\(\texttt{table}\) 和 \(\texttt{figure}\) 浮动体的默认设置为 \(\texttt{tbp}\)。
双栏排版环境下,\(\LaTeX{}\) 提供了
\(\texttt{table*}\) 和 \(\texttt{figure*}\) 环境用来排版
跨栏 的浮动体。用法与 \(\texttt{table}\) 和 \(\texttt{figure}\) 一样,不同之处为双栏的
<placement>
参数只能用 \(\texttt{tp}\) 两个位置。
浮动体的位置选取受到先后顺序的限制。如果某个浮动体由于参数限制、空间限制等原因在当前页无法放置,就要推迟到之后处理,并使得之后的同类浮动体一并推迟。\clearpage
命令会在另起一页之前,先将所有推迟处理的浮动体排版成页,此时 \(\texttt{htbp}\) 等位置限制被完全忽略。
float
宏包为浮动体提供了 \(\texttt{H}\) 位置参数,不与 \(\texttt{htbp}\) 及 \(\texttt{!}\) 混用。使用 \(\texttt{H}\)
位置参数时,会取消浮动机制,将浮动体视为一般的盒子插入当前位置。这在一些特殊情况下很有用(如使用
multicol
宏包排版分栏内容的时候),但尺寸过大的浮动体可能使得分页比较困难。
浮动体的标题
图表等浮动体提供了 \caption
命令加标题,并且自动给浮动体编号,可以用带星号的命令
\caption*
(需加载相关宏包,如 caption
)
生成不带编号的标题,也可以使用带可选参数的形式
\caption[...]{...}
,使得在目录里使用短标题。命令之后还可以紧跟
\label
命令标记交叉引用。
\caption
生成的标题形如“Figure 1: …”或“Table 1:
…”可通过修改 \figurename
和 \tablename
的内容来修改标题的前缀。标题样式的定制功能由 caption
宏包提供,详见该宏包的帮助文档,在此不作赘述。
\(\texttt{table}\) 和 \(\texttt{figure}\) 两种浮动体分别有各自的生成目录的命令:
1 | \listoftables |
它们类似 \tableofcontents
生成单独的章节。
并排和子图表
我们时常有在一个浮动体里面放置多张图的用法。最简单的用法就是直接并排放置,也可以通过分段或者换行命令
\\
排版多行多列的图片。以下为示意代码,效果大致如图所示。
1 | \begin{figure}[htbp] |
由于标题是横跨一行的,用 \caption
命令为每个图片单独生成标题就需要借助前文提到的 parbox
或者
\(\texttt{minipage}\)
环境,将标题限制在盒子内。效果见图所示。
1 | \begin{figure}[htbp] |
当需要更进一步,给每个图片定义小标题时,就要用到
subcaption
宏包的功能了。这里仅举一例,效果见图。更详细的用法请参考
subcaption
宏包的帮助文档。
1 | \begin{figure}[htbp] |
subcaption
依赖上文提到过的 caption
宏包,因此也支持子图表标题样式的定制。并排子图表的功能也可通过
subfig
宏包的 subfloat
命令实现,具体请参考宏包文档。
参考博文
[1] Partl H, Hyna I, Schlegl E. 一份 (不太) 简短的 LATEX2ε 介绍[J].
2024. https://github.com/CTeX-org/lshort-zh-cn
出自《千字文》。↩︎