diff options
Diffstat (limited to 'info/lshort/chinese/src/chap/chap.03.elements.tex')
-rw-r--r-- | info/lshort/chinese/src/chap/chap.03.elements.tex | 1145 |
1 files changed, 1145 insertions, 0 deletions
diff --git a/info/lshort/chinese/src/chap/chap.03.elements.tex b/info/lshort/chinese/src/chap/chap.03.elements.tex new file mode 100644 index 0000000000..4d289d43e3 --- /dev/null +++ b/info/lshort/chinese/src/chap/chap.03.elements.tex @@ -0,0 +1,1145 @@ +\chapter{文档元素}\label{chap:elements} +\addtocontents{los}{\protect\addvspace{10pt}} + +\begin{intro} +在知道了如何输入文字后,我们将在本章了解一个结构化的文档所依赖的各种元素——章节、目录、列表、图表、交叉引用、脚注等等。 +\end{intro} + +\section{章节和目录}\label{sec:secs} + +\subsection{章节标题}\label{subsec:secs} + +\cmdindex{part,chapter,section,subsection,subsubsection,paragraph,subparagraph} +\clsindex{article,book,report} + +一篇结构化的、条理清晰文档一定是层次分明的,通过不同的命令分割为章、节、小节。三个标准文档类 \cls{article}、\cls{report} 和 \cls{book}% +\footnote{千万注意是\textbf{标准文档类},其它文档类,如果不是从标准文档类衍生而来, +很可能没有定义或只定义了一部分命令,如 \cls{beamer} 或 \cls{moderncv} 等。}% +提供了划分章节的命令: +\begin{command} +\cmd{chapter}\marg{title} \quad +\cmd{section}\marg{title} \quad +\cmd{subsection}\marg{title} \\ +\cmd{subsubsection}\marg{title} \quad +\cmd{paragraph}\marg{title} \quad +\cmd{subparagraph}\marg{title} +\end{command} +其中 \cmd{chapter} \textbf{只在 \cls{book} 和 \cls{report} 文档类有定义}。这些命令生成章节标题,并能够自动编号。 +除此之外 \LaTeX{} 还提供了 \cmd{part} 命令,用来将整个文档分割为大的分块,但不影响 \cmd{chapter} 或 \cmd{section} 等的编号。 + +上述命令除了生成带编号的标题之外,还向目录中添加条目,并影响页眉页脚的内容(详见 \ref{sec:pagestyle} 节)。每个命令有两种变体: +\begin{itemize} + \item 带可选参数的变体:\cmd{section}\oarg{short title}\marg{title}\par + 标题使用 \Arg{title} 参数,在目录和页眉页脚中使用 \Arg{short title} 参数; + \item 带星号的变体:\cmd{section*}\marg{title}\par + 标题不带编号,也不生成目录项和页眉页脚。 +\end{itemize} + +较低层次如 \cmd{paragraph} 和 \cmd{subparagraph} 即使不用带星号的变体,生成的标题默认也不带编号,事实上,除 \cmd{part} 外: +\begin{itemize} + \item \cls{article} 文档类带编号的层级为 \cmd{section} / \cmd{subsection} / \cmd{sub\-sub\-section} 三级; + \item \cls{report}/\cls{book} 文档类带编号的层级为 \cmd{chapter} / \cmd{section} / \cmd{sub\-section} 三级。 +\end{itemize} +对此的详细解释和调整方法见 \ref{subsec:latex-counts} 小节。 + +\pkgindex{titlesec} +\LaTeX{} 及标准文档类并未提供为 \cmd{section} 等章节命令定制格式的功能,这一功能由 \pkg{titlesec} 宏包提供。详情请参考宏包的帮助文档。 + +\subsection{目录}\label{sec:toc} + +\cmdindex{tableofcontents} +\pkgindex{tocbibind,tocloft,titletoc} +在 \LaTeX{} 中生成目录非常容易,只需在合适的地方使用命令: +\begin{command} +\cmd{tableofcontents} +\end{command} + +这个命令会生成单独的一章(\cls{book} / \cls{report})或一节(\cls{article}),标题默认为 ``Contents''{},可通过 \ref{sec:latex-settings} 节给出的方法定制标题。 +\cmd{tableof\-contents} 生成的章节默认不写入目录(\cmd{section*} 或 \cmd{chapter*}),可使用 \pkg{tocbibind} 等宏包修改设置。 + +正确生成目录项,一般需要编译两次源代码。 + +\cmdindex{addcontentsline} +有时我们使用了 \cmd{chapter*} 或 \cmd{section*} 这样不生成目录项的章节标题命令, +而又想手动生成该章节的目录项,可以在标题命令后面使用: +\begin{command} +\cmd{addcontentsline}\marg*{toc}\marg{level}\marg{title} +\end{command} + +其中 \Arg{level} 为章节层次 \texttt{chapter} 或 \texttt{section} 等,\Arg{title} 为出现于目录项的章节标题。 + +\pkg{titletoc}、\pkg{tocloft} 等宏包提供了具体定制目录项格式的功能,详情请参考宏包的帮助文档。 + +\subsection{文档结构的划分}\label{sec:matters} + +\cmdindex{appendix} +所有标准文档类都提供了一个 \cmd{appendix} 命令将正文和附录分开% +\footnote{有的参考文档可能使用 \cmd{begin} \marg*{appendix} \ldots \cmd{end} \marg*{appendix} 这样的写法, +虽然有效,但并不规范,只要使用 \cmd{appendix} 命令就够了。}, +使用 \cmd{appendix} 后,最高一级章节改为使用拉丁字母编号,从 A 开始。 + +\clsindex{book} +\cmdindex{frontmatter,mainmatter,backmatter} +\cls{book} 文档类还提供了前言、正文、后记结构的划分命令: +\begin{description} + \item[\cmd{frontmatter}] 前言部分,页码为小写罗马字母格式;其后的 \cmd{chapter} 不编号。 + \item[\cmd{mainmatter}] 正文部分,页码为阿拉伯数字格式,从 1 开始计数;其后的章节编号正常。 + \item[\cmd{backmatter}] 后记部分,页码格式不变,继续正常计数;其后的 \cmd{chapter} 不编号。 +\end{description} + +\cmdindex{include} +以上三个命令还可和 \cmd{appendix} 命令结合,生成有前言、正文、附录、后记四部分的文档。 +源代码 \ref{code:book-struct} 结合 \ref{sec:latex-multi-files} 节的 \cmd{include} 命令 +和其它一些命令示意了一份完整的文档结构。 + +\begin{sourcecode}[htp] +\begin{Verbatim} +\documentclass{book} + +% 导言区,加载宏包和各项设置,包括参考文献、索引等 +\usepackage{makeidx} % 调用 makeidx 宏包,用来处理索引 +\makeindex % 开启索引的收集 +\bibliographystyle{plain} % 指定参考文献样式为 plain + +\begin{document} + +\frontmatter % 前言部分 +\maketitle % 标题页 +\include{preface} % 前言章节 preface.tex +\tableofcontents + +\mainmatter % 正文部分 +\include{chapter1} % 第一章 chapter1.tex +\include{chapter2} % 第二章 chapter2.tex +... +\appendix % 附录 +\include{appendixA} % 附录 A appendixA.tex +... + +\backmatter % 后记部分 +\include{prologue} % 后记 prologue.tex +\bibliography{books} % 利用 BibTeX 工具从数据库文件 books.bib 生成参考文献 +\printindex % 利用 makeindex 工具生成索引 + +\end{document} +\end{Verbatim} +\caption{\cls{book} 文档类的文档结构示例。}\label{code:book-struct} +\end{sourcecode} + +\section{标题页}\label{sec:titlepage} + +\cmdindex{title,author,date,today} +\cmdindex{thanks,and} +\LaTeX{} 支持生成简单的标题页。首先需要给定标题和作者等信息: +\begin{command} +\cmd{title}\marg{title} \quad +\cmd{author}\marg{author} \quad +\cmd{date}\marg{date} +\end{command} +其中前两个命令是必须的(不用 \cmd{title} 会报错;不用 \cmd{author} 会警告),\cmd{date} 命令可选。 +\LaTeX{} 还提供了一个 \cmd{today} 命令自动生成当前日期,\cmd{date} 默认使用 \cmd{today}。 +在 \cmd{title}、\cmd{author} 等命令内可以使用 \cmd{thanks} 命令生成标题页的脚注,用 \cmd{and} 隔开多个人名。 + +\cmdindex{maketitle} +\pinyinindex{biaotiye}{标题页} +在信息给定后,就可以使用 \cmd{maketitle} 命令生成一个简单的标题页了。 +源代码 \ref{code:titlepage} 给出了一个标题页的示例和大致效果。 +\cls{article} 文档类的标题默认不单独成页,而 \cls{report} 和 \cls{book} 默认单独成页。 +可在 \cmd{document\-class} 命令调用文档类时指定 \texttt{titlepage / notitlepage} 选项以修改默认的行为。 + +\begin{sourcecode}[htp] +\begin{Verbatim} +\title{Test title} +\author{ Mary\thanks{E-mail:*****@***.com} + \and Ted\thanks{Corresponding author} + \and Louis} +\date{\today} +\end{Verbatim} +\bigskip +\makeatletter +\begin{minipage}{\textwidth} + \centering + \renewcommand\thempfootnote{\@fnsymbol\c@mpfootnote}% + {\LARGE Test title \par}% + \vskip 1.5em% + {\large + \lineskip .5em% + \begin{tabular}[t]{c}% + Mary\footnote{E-mail:*****@***.com} + \end{tabular} + \hskip 1em \@plus.17fil% + \begin{tabular}[t]{c}% + Ted\footnote{Corresponding author} + \end{tabular} + \hskip 1em \@plus.17fil% + \begin{tabular}[t]{c}% + Louis + \end{tabular}\par}% + \vskip 1em% + {\large \csname CTEX@todayold\endcsname}% +\end{minipage} +\makeatother +\caption{\LaTeX{} 默认的标题页示例和效果。}\label{code:titlepage} +\end{sourcecode} + +\envindex{titlepage} +\LaTeX{} 标准类还提供了一个简单的 \env{titlepage} 环境,生成不带页眉页脚的一页。用户可以在这个环境中使用各种排版元素自由发挥, +生成自定义的标题页以替代 \cmd{maketitle} 命令。甚至可以利用 \env{titlepage} 环境重新定义 \cmd{maketitle}: +\begin{verbatim} +\renewcommand{\maketitle}{\begin{titlepage} +... % 用户自定义命令 +\end{titlepage}} +\end{verbatim} + +事实上,为标准文档类指定了 \texttt{titlepage} 选项以后,使用 \cmd{maketitle} 命令生成的标题页就是一个 \env{titlepage} 环境。 + +以上是 \LaTeX{} 标准文档类的标题页相关命令用法。在各种文档模板中经常有自定义的标题页, +有可能需要除了 \cmd{title} 和 \cmd{author} 以外的命令给定信息,用法也可能与标准文档类的不一致 +(甚至有些模板可能没有定义 \env{titlepage} 等环境)。使用文档模板前\textbf{一定要仔细阅读文档模板的帮助文档}。 + +\section{交叉引用}\label{sec:crossref} + +\cmdindex{label} +交叉引用是 \LaTeX{} 强大的自动排版功能的体现之一。在能够被交叉引用的地方,如章节、公式、图表、定理等位置使用 \cmd{label} 命令: +\begin{command} +\cmd{label}\marg{label-name} +\end{command} + +\cmdindex{ref,pageref} +之后可以在别处使用 \cmd{ref} 或 \cmd{pageref} 命令,分别生成交叉引用的编号和页码: +\begin{command} +\cmd{ref}\marg{label-name} \quad +\cmd{pageref}\marg{label-name} +\end{command} +\begin{example} +A reference to this subsection +\label{sec:this} looks like: +``see section~\ref{sec:this} on +page~\pageref{sec:this}.'' +\end{example} + +为了生成正确的交叉引用,一般也需要多次编译源代码。 + +\cmd{label} 命令可用于记录各种类型的交叉引用,使用位置分别为: +\begin{description} + \item[章节标题] 在章节标题命令 \cmd{section} 等之后紧接着使用。 + \item[行间公式] 单行公式在公式内任意位置使用;多行公式在每一行公式的任意位置使用。 + \item[有序列表] 在 \env{enumerate} 环境的每个 \cmd{item} 命令之后、下一个 \cmd{item} 命令之前任意位置使用。 + \item[图表标题] 在图表标题命令 \cmd{caption} 之后紧接着使用。 + \item[定理环境] 在定理环境内部任意位置使用。 +\end{description} + +在使用不记编号的命令形式(\cmd{section*}、\cmd{caption*}、带可选参数的 \cmd{item} 命令等)时不要使用 \cmd{label} 命令, +否则生成的引用编号不正确。 + +\section{脚注和边注}\label{sec:footnote-marginpar} + +\cmdindex{footnote} +使用 \cmd{footnote} 命令可以在页面底部生成一个脚注: +\begin{command} +\cmd{footnote}\marg{footnote} +\end{command} + +假如我们输入以下文字和命令: +\begin{verbatim} +“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnote{出自《千字文》。} +\end{verbatim} + +在正文中则为:% +“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnote{出自《千字文》。} + +\cmdindex{footnotemark,footnotetext} +有些情况下(比如在表格环境、各种盒子内)使用 \cmd{footnote} 并不能正确生成脚注。我们可以分两步进行, +先使用 \cmd{foot\-note\-mark} 为脚注计数,再在合适的位置用 \cmd{foot\-note\-text} 生成脚注。比如: + +\begin{verbatim} +\begin{tabular}{l} +\hline +“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnotemark \\ +\hline +\end{tabular} +\footnotetext{表格里的名句出自《千字文》。} +\end{verbatim} + +效果为: + +\leavevmode\begin{tabular}{l} +\hline +“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnotemark \\ +\hline +\end{tabular} +\footnotetext{表格里的名句出自《千字文》。} + +\cmdindex{marginpar} +使用 \cmd{marginpar} 命令可在边栏位置生成边注: +\begin{command} +\cmd{marginpar}\oarg{left-margin}\marg{right-margin} +\end{command} +如果只给定了 \Arg{right-margin},那么边注在奇偶数页文字相同;如果同时给定了 \Arg{left-margin}, +则偶数页使用 \Arg{left-margin} 的文字。 + +例如以下代码: +\begin{verbatim} +\marginpar{\footnotesize 边注较窄,不要写过多文字,最好设置较小的字号。} +\end{verbatim} +其效果见边栏。\marginpar{\footnotesize 边注较窄,不要写过多文字。最好设置较小的字号。} + +\section{特殊环境}\label{sec:envs} + +\subsection{列表}\label{subsec:lists} + +\envindex{enumerate,itemize} +\cmdindex{item} +\LaTeX{} 提供了基本的有序和无序列表环境 \env{enumerate} 和 \env{itemize},两者的用法很类似,都用 \cmd{item} 标明每个列表项。 +\env{enumerate} 环境会自动对列表项编号。 +\begin{command} +\cmd{begin}\marg*{enumerate} \\ +\cmd{item} \ldots \\ +\cmd{end}\marg*{enumerate} +\end{command} + +其中 \cmd{item} 可带一个可选参数,将有序列表的计数或者无序列表的符号替换成自定义的符号。 +列表可以嵌套使用,最多嵌套四层。 +\begin{example} +\begin{enumerate} + \item An item. + \begin{enumerate} + \item A nested item.\label{itref} + \item[*] A starred item. + \end{enumerate} + \item Reference(\ref{itref}). +\end{enumerate} +\end{example} + +\begin{example} +\begin{itemize} + \item An item. + \begin{itemize} + \item A nested item. + \item[+] A `plus' item. + \item Another item. + \end{itemize} + \item Go back to upper level. +\end{itemize} +\end{example} + +\envindex{description} +关键字环境 \env{description} 的用法与以上两者类似,不同的是 \cmd{item} 后的可选参数用来写关键字,以粗体显示,一般是必填的: +\begin{command} +\cmd{begin}\marg*{description} \\ + \cmd{item}\oarg{item title} \ldots \\ +\cmd{end}\marg*{description} +\end{command} + +\begin{example} +\begin{description} + \item[Enumerate] Numbered list. + \item[Itemize] Non-numbered list. +\end{description} +\end{example} + +各级无序列表的符号由命令 \cmd{labelitemi} 到 \cmd{labelitemiv} 定义,可以简单地重新定义它们: +\begin{example} +\renewcommand{\labelitemi}{\ddag} +\renewcommand{\labelitemii}{\dag} +\begin{itemize} + \item First item + \begin{itemize} + \item Subitem + \item Subitem + \end{itemize} + \item Second item +\end{itemize} +\end{example} + +有序列表的符号由命令 \cmd{labelenumi} 到 \cmd{labelenumiv} 定义, +重新定义这些命令需要用到 \ref{sec:counters} 节的计数器相关命令: +\begin{example} +\renewcommand{\labelenumi}% + {\Alph{enumi}>} +\begin{enumerate} + \item First item + \item Second item +\end{enumerate} +\end{example} + +默认的列表间距比较宽,\LaTeX{} 本身也未提供方便的定制功能,可用 \pkg{enumitem} 宏包定制各种列表间距。 +\pkg{enumitem} 宏包还提供了对列表标签、引用等的定制。有兴趣的读者可参考其帮助文档。 + +\subsection{对齐环境}\label{subsec:flush} + +\envindex{center,flushleft,flushright} +\env{center}、\env{flush\-left} 和 \env{flush\-right} 环境分别用于生成居中、左对齐和右对齐的文本环境。 +\begin{command} +\cmd{begin}\marg*{center} \ldots\ \cmd{end}\marg*{center} \\ +\cmd{begin}\marg*{flushleft} \ldots\ \cmd{end}\marg*{flushleft} \\ +\cmd{begin}\marg*{flushright} \ldots\ \cmd{end}\marg*{flushright} +\end{command} + +\begin{example} +\begin{center} +Centered text using a +\verb|center| environment. +\end{center} +\begin{flushleft} +Left-aligned text using a +\verb|flushleft| environment. +\end{flushleft} +\begin{flushright} +Right-aligned text using a +\verb|flushright| environment. +\end{flushright} +\end{example} + +\cmdindex{centering,raggedleft,raggedright} +除此之外,还可以用以下命令直接改变文字的对齐方式: +\begin{command} +\cmd{centering} \quad +\cmd{raggedright} \quad +\cmd{raggedleft} +\end{command} + +\begin{example} +\centering +Centered text paragraph. + +\raggedright +Left-aligned text paragraph. + +\raggedleft +Right-aligned text paragraph. +\end{example} + +三个命令和对应的环境经常被误用,有直接用所谓 \cmd{flushleft} 命令或者 \env{raggedright} 环境的,都是不甚严格的用法(即使它们可能有效)。 +有一点可以将两者区分开来:\env{center} 等环境会在上下文产生一个额外间距,而 \cmd{centering} 等命令不产生,只是改变对齐方式。 +比如在浮动体环境 \env{table} 或 \env{figure} 内实现居中对齐,用 \cmd{centering} 命令即可,没必要再用 \env{center} 环境。 + +\subsection{引用环境}\label{subsec:quote} + +\envindex{quote,quotation} +\LaTeX{} 提供了两种引用的环境:\env{quote} 用于引用较短的文字,首行不缩进;\env{quotation} 用于引用若干段文字,首行缩进。 +引用环境较一般文字有额外的左右缩进。 +\begin{example} +Francis Bacon says: +\begin{quote} +Knowledge is power. +\end{quote} +\end{example} + +\begin{example} +《木兰诗》: +\begin{quotation} +万里赴戎机,关山度若飞。 +朔气传金柝,寒光照铁衣。 +将军百战死,壮士十年归。 + +归来见天子,天子坐明堂。 +策勋十二转,赏赐百千强。…… +\end{quotation} +\end{example} + +\envindex{verse} +\env{verse} 用于排版诗歌,与 \env{quotation} 恰好相反,\env{verse} 是首行悬挂缩进的。 +\begin{example} +Rabindranath Tagore's short poem: +\begin{verse} +Beauty is truth's smile +when she beholds her own face in +a perfect mirror. +\end{verse} +\end{example} + +\subsection{摘要环境}\label{subsec:abstract} + +\envindex{abstract} +摘要环境 \env{abstract} 默认只在标准文档类中的 \cls{article} 和 \cls{report} 文档类可用, +一般用于紧跟 \cmd{maketitle} 命令之后介绍文档的摘要。如果文档类指定了 \texttt{titlepage} 选项,则单独成页; +反之,单栏排版时相当于一个居中的小标题加一个 \env{quotation} 环境,双栏排版时相当于 \cmd{section*} 定义的一节。 + +\subsection{代码环境}\label{subsec:verbatim} + +\envindex{verbatim} +有时我们需要将一段代码原样转义输出,这就要用到代码环境 \env{verbatim},它以等宽字体排版代码,回车和空格也分别起到换行和空位的作用; +带星号的版本更进一步将空格显示成“\textvisiblespace”。 +\begin{example} +\begin{verbatim} +#include <iostream> +int main() +{ + std::cout << "Hello, world!" + << std::endl; + return 0; +} +\end{verbatim} +\end{example} + +\begin{example} +\begin{verbatim*} +for (int i=0; i<4; ++i) + printf("Number %d\n",i); +\end{verbatim*} +\end{example} + +\cmdindex{verb} +要排版简短的代码或关键字,可使用 \cmd{verb} 命令: +\begin{command} +\cmd{verb}\Arg{delim}\Arg{code}\Arg{delim} +\end{command} + +\Arg{delim} 标明代码的分界位置,前后必须一致,除字母、空格或星号外,可任意选择使得不与代码本身冲突,习惯上使用 \texttt| 符号。 + +同 \env{verbatim} 环境,\cmd{verb} 后也可以带一个星号,以显示空格: +\begin{example} +\verb|\LaTeX| \\ +\verb+(a || b)+ \verb*+(a || b)+ +\end{example} + +\cmd{verb} 命令对符号的处理比较复杂,一般\textbf{不能用在其它命令的参数里},否则多半会出错。 + +\pkg{verbatim} 宏包优化了 \env{verbatim} 环境的内部命令,并提供了 \cmd{verbatiminput} 命令用来直接读入文件生成代码环境。 +\pkg{fancyvrb} 宏包提供了可定制格式的 \env{Verbatim} 环境;\pkg{listings} 宏包更进一步,可生成关键字高亮的代码环境, +支持各种程序设计语言的语法和关键字。详情请参考各自的帮助文档。 + +\section{表格}\label{sec:tabular} + +\pinyinindex{biaoge}{表格|(} +\LaTeX{} 里排版表格不如 Word 等所见即所得的工具简便和自由,不过对于不太复杂的表格来讲,完全能够胜任。 + +\envindex{tabular} +\cmdindex{hline} +\index{&@\texttt\& (\textit{单元格/对齐})} +\index{\@\crcmd{} (\textit{换行})} +排版表格最基本的 \env{tabular} 环境用法为: +\begin{command} +\cmd{begin}\marg*{tabular}\oarg{align}\marg{column-spec}\\ + \Arg{item1} \texttt\& \Arg{item2} \texttt\& \ldots\ \crcmd \\ + \cmd{hline} \\ + \Arg{item1} \texttt\& \Arg{item2} \texttt\& \ldots\ \crcmd \\ +\cmd{end}\marg*{tabular} +\end{command} +其中 \Arg{column-spec} 是列格式标记,在接下来的内容将仔细介绍;\texttt\& 用来分隔单元格; +\crcmd{} 用来换行;\cmd{hline} 用来在行与行之间绘制横线。 + +直接使用 \env{tabular} 环境的话,会\textbf{和周围的文字混排}。此时可用一个可选参数 \Arg{align} 控制垂直对齐: +\verb|t| 和 \verb|b| 分别表示按按表格顶部、底部对齐,其他参数或省略不写(默认)表示居中对齐。 +\begin{example} +\begin{tabular}{|c|} + center-\\ aligned \\ +\end{tabular}, +\begin{tabular}[t]{|c|} + top-\\ aligned \\ +\end{tabular}, +\begin{tabular}[b]{|c|} + bottom-\\ aligned\\ +\end{tabular} tabulars. +\end{example} + +但是通常情况下 \env{tabular} 环境很少与文字直接混排,而是会放在 \env{table} 浮动体环境中,并用 \cmd{caption} 命令加标题。 + +\subsection{列格式}\label{subsec:tabular-cols} + +\env{tabular} 环境使用 \Arg{column-spec} 参数指定表格的列数以及每列的格式。基本的列格式见表 \ref{tbl:table-column-spec}。 +\begin{table}[htp] +\centering +\caption{\LaTeX{} 表格列格式}\label{tbl:table-column-spec} +\begin{tabular}{*{2}{l}} + \hline + \textbf{列格式} & \textbf{说明} \\ + \hline + \ttfamily l/c/r & 单元格内容左对齐/居中/右对齐,不折行 \\ + \ttfamily p\marg{width} & 单元格宽度固定为 \Arg{width},可自动折行 \\ + \ttfamily | & 绘制竖线 \\ + \ttfamily @\marg{string} & 自定义内容 \Arg{string} \\ + \hline +\end{tabular} +\end{table} + +\begin{example} +\begin{tabular}{lcr|p{6em}} + \hline + left & center & right + & par box with fixed width\\ + L & C & R & P \\ + \hline +\end{tabular} +\end{example} + +表格中每行的单元格数目不能多于列格式里 \texttt{l/c/r/p} 的总数(可以少于这个总数),否则出错。 + +\texttt{@} 格式可在单元格前后插入任意的文本,但同时它也消除了单元格前后额外添加的间距。 +\texttt{@} 格式可以适当使用以充当“竖线”。特别地,\texttt{@}\marg*{} 可直接用来消除单元格前后的间距: +\begin{example} +\begin{tabular}{@{} r@{:}lr @{}} + \hline + 1 & 1 & one \\ + 11 & 3 & eleven \\ + \hline +\end{tabular} +\end{example} + +另外 \LaTeX{} 还提供了简便的将格式参数重复的写法 \texttt*\marg{n}\marg{column-spec},比如以下两种写法是等效的: +\begin{verbatim} +\begin{tabular}{|c|c|c|c|c|p{4em}|p{4em}|} +\begin{tabular}{|*{5}{c|}*{2}{p{4em}|}} +\end{verbatim} + +\pkgindex{array} +有时需要为整列修饰格式,比如整列改变为粗体,如果每个单元格都加上 \cmd{bfseries} 命令会比较麻烦。 +\pkg{array} 宏包提供了辅助格式 \texttt> 和 \texttt<,用于给列格式前后加上修饰命令: +\begin{example} +\begin{tabular}{>{\itshape}r<{*}l} + \hline + italic & normal \\ + column & column \\ + \hline +\end{tabular} +\end{example} + +辅助格式甚至支持插入 \cmd{centering} 等命令改变 \texttt{p} 列格式的对齐方式, +一般还要加额外的命令 \cmd{array\-back\-slash} 以免出错% +\footnote{\cmd{centering} 等对齐命令会破坏表格环境里 \crcmd{} 换行命令的定义, +\cmd{array\-back\-slash} 用来恢复之。如果不加 \cmd{array\-back\-slash} 命令, +也可以用 \cmd{tabular\-newline} 命令代替原来的 \crcmd{} 实现表格换行。}: +\begin{example} +\begin{tabular} +{>{\centering\arraybackslash}p{9em}} + \hline + Some center-aligned long text. \\ + \hline +\end{tabular} +\end{example} + +\pkg{array} 宏包还提供了类似 \texttt{p} 格式的 \texttt{m} 格式和 \texttt{b} 格式, +三者分别在垂直方向上靠顶端对齐、居中以及底端对齐。 +\begin{example} +\newcommand\txt + {a b c d e f g h i} +\begin{tabular}{cp{2em}m{2em}b{2em}} + \hline + pos & \txt & \txt & \txt \\ + \hline +\end{tabular} +\end{example} + +\subsection{列宽}\label{subsec:colwidth} + +在控制列宽方面,\LaTeX{} 表格有着明显的不足:\texttt{l/c/r} 格式的列宽是由文字内容的自然宽度决定的, +而 \texttt{p} 格式给定了列宽却不好控制对齐(可用 \pkg{array} 宏包的辅助格式), +更何况列与列之间通常还有间距,所以直接生成给定总宽度的表格并不容易。 + +\envindex{tabular*} +\LaTeX{} 本身提供了 \env{tabular*} 环境用来排版定宽表格,但是不太方便使用, +比如要用到 \texttt{@} 格式插入额外命令,令单元格之间的间距为 \cmd{fill},但即使这样仍然有瑕疵: +\begin{example} +\begin{tabular*}{14em}% +{@{\extracolsep{\fill}}|c|c|c|c|} + \hline + A & B & C & D \\ \hline + a & b & c & d \\ \hline +\end{tabular*} +\end{example} + +\pkgindex{tabularx} +\envindex[tabularx]{tabularx} +\pkg{tabularx} 宏包为我们提供了方便的解决方案。它引入了一个 \texttt{X} 列格式,类似 \texttt{p} 列格式, +不过会根据表格宽度自动计算列宽,多个 \texttt{X} 列格式平均分配列宽。 +\texttt{X} 列格式也可以用 \pkg{array} 里的辅助格式修饰对齐方式: +\begin{example} +\begin{tabularx}{14em}% +{|*{4}{>{\centering\arraybackslash}X|}} + \hline + A & B & C & D \\ \hline + a & b & c & d \\ \hline +\end{tabularx} +\end{example} + +\subsection{横线}\label{subsec:hline} + +\cmdindex{hline,cline} +我们已经在之前的例子见过许多次绘制表格线的 \cmd{hline} 命令。另外 \cmd{cline}\marg*{\Arg{i}-\Arg{j}} 用来绘制跨越部分单元格的横线: +\begin{example} +\begin{tabular}{|c|c|c|} + \hline + 4 & 9 & 2 \\ \cline{2-3} + 3 & 5 & 7 \\ \cline{1-1} + 8 & 1 & 6 \\ \hline +\end{tabular} +\end{example} + +\pkgindex{booktabs} +\cmdindex[booktabs]{toprule,midrule,bottomrule,cmidrule} +在科技论文排版中广泛应用的表格形式是三线表,形式干净简明。 +三线表由 \pkg{booktabs} 宏包支持,它提供了 \cmd{toprule}、\cmd{midrule} 和 \cmd{bottomrule} 命令用以排版三线表的三条线, +以及和 \cmd{cline} 对应的 \cmd{cmidrule}。除此之外,最好不要用其它横线以及竖线: +\begin{example} +\begin{tabular}{cccc} + \toprule + & \multicolumn{3}{c}{Numbers} \\ + \cmidrule{2-4} + & 1 & 2 & 3 \\ + \midrule + Alphabet & A & B & C \\ + Roman & I & II& III \\ + \bottomrule +\end{tabular} +\end{example} + +\subsection{合并单元格}\label{subsec:tabular-multicol} + +\LaTeX{} 是一行一行排版表格的,横向合并单元格较为容易,由 \cmd{multi\-column} 命令实现: +\begin{command} +\cmd{multicolumn}\marg{n}\marg{column-spec}\marg{item} +\end{command} +其中 \Arg{n} 为要合并的列数,\Arg{column-spec} 为合并单元格后的列格式,只允许出现一个 \texttt{l/c/r} 或 \texttt{p} 格式。 +如果合并前的单元格前后带表格线 \texttt|,合并后的列格式也要带 \texttt| 以使得表格的竖线一致。 +\begin{example} +\begin{tabular}{|c|c|c|} + \hline + 1 & 2 & Center \\ \hline + \multicolumn{2}{|c|}{3} & + \multicolumn{1}{r|}{Right} \\ \hline + 4 & \multicolumn{2}{c|}{C} \\ \hline +\end{tabular} +\end{example} + +上面的例子还体现了,形如 \cmd{multicolumn}\marg*{1}\marg{column-spec}\marg{item} 的命令\textbf{可以用来修改某一个单元格的列格式。} + +\pkgindex{multirow} +\cmdindex[multirow]{multirow} +纵向合并单元格需要用到 \pkg{multirow} 宏包提供的 \cmd{multirow} 命令: +\begin{command} +\cmd{multirow}\marg{n}\marg{width}\marg{item} +\end{command} +\Arg{width} 为合并后单元格的宽度,可以填 \texttt{*} 以使用自然宽度。 + +我们看一个结合 \cmd{cline}、\cmd{multi\-column} 和 \cmd{multi\-row} 命令的例子: +\begin{example} +\begin{tabular}{ccc} + \hline + \multirow{2}{*}{Item} & + \multicolumn{2}{c}{Value} \\ + \cline{2-3} + & First & Second \\ \hline + A & 1 & 2 \\ \hline +\end{tabular} +\end{example} + +\subsection{嵌套表格}\label{subsec:tabular-embed} + +相对于合并单元格,拆分单元格对于 \LaTeX{} 来说并非易事。在单元格中嵌套一个小表格可以起到“拆分单元格”的效果。 +在以下的例子中,注意要用 \cmd{multi\-column} 命令配合 \texttt{@\{\}} 格式把单元格的额外边距去掉,使得嵌套的表格线能和外层的表格线正确相连: + +\begin{example} +\begin{tabular}{|c|c|c|} + \hline + a & b & c \\ \hline + a & \multicolumn{1}{@{}c@{}|} + {\begin{tabular}{c|c} + e & f \\ \hline + e & f \\ + \end{tabular}} + & c \\ \hline + a & b & c \\ \hline +\end{tabular} +\end{example} + +\pkgindex{makecell} +如果不需要为“拆分的单元格”画线,并且只在垂直方向“拆分”的话,\pkg{makecell} 宏包提供的 \cmd{make\-cell} 命令是一个简单的解决方案: + +\begin{example} +\begin{tabular}{|c|c|} + \hline + a & \makecell{d1 \\ d2} \\ + \hline + b & c \\ + \hline +\end{tabular} +\end{example} + +\subsection{行距控制}\label{subsec:tabular-colht} + +\cmdindex{arraystretch} +\LaTeX{} 生成的表格看起来通常比较紧凑。修改参数 \cmd{array\-stretch} 可以得到行距更加宽松的表格 +(相关命令参考 \ref{subsec:newcmd} 小节): +\begin{example} +\renewcommand\arraystretch{1.8} +\begin{tabular}{|c|} + \hline + Really loose \\ \hline + tabular rows.\\ \hline +\end{tabular} +\end{example} + +\index{\@\crcmd{} (\textit{换行})} +另一种增加间距的办法是给换行命令 \crcmd{} 添加可选参数,在这一行下面加额外的间距,适合用于在行间不加横线的表格: +\begin{example} +\begin{tabular}{c} + \hline + Head lines \\[6pt] + tabular lines \\ + tabular lines \\ \hline +\end{tabular} +\end{example} + +但是这种换行方式的存在导致了一个缺陷——\textbf{表格的首个单元格不能直接使用中括号 \texttt{[]}}, +否则 \crcmd{} 往往会将下一行的中括号当作自己的可选参数,因而出错。如果要使用中括号,应当放在花括号 \marg*{} 里面。 +或者也可以选择将换行命令写成 \crcmd\texttt{[0pt]}。 + +\pinyinindex{biaoge}{表格|)} + +\section{图片}\label{sec:figures} + +\pkgindex{graphicx} + +\LaTeX{} 本身不支持插图功能,需要由 \pkg{graphicx} 宏包辅助支持。 + +使用 \texttt{latex + dvipdfmx} 编译命令时,调用 \pkg{graphicx} 宏包时要指定 \texttt{dvipdfmx} 选项% +\footnote{早期常使用 \texttt{latex + dvips} 组合命令,后者将 \texttt{.dvi} 文件转为 \texttt{.ps} 文件(PostScript), +可进一步通过 \texttt{ps2pdf} 工具生成 PDF。\texttt{dvips} 和 \texttt{dvipdfmx} 在图形、颜色、超链接等功能的实现上有差别,而 \LaTeX{} 无法识别 +用户是用 \texttt{dvips} 还是 \texttt{dvipdfmx},所以要指定选项(缺省为 \texttt{dvips})。 +\ref{sec:hyperlinks} 节中的 \pkg{hyperref} 宏包同理。};而使用 \texttt{pdflatex} 或 \texttt{xelatex} 命令编译时不需要。 + +读者可能听说过“\LaTeX{} 只能插入 \texttt{.eps} 格式的图片,需要把 \texttt{.jpg} 转成 \texttt{.eps} 格式”的观点。 +\LaTeX{} 发展到今天,这个观点早已过时。事实上不同的编译命令支持的图片格式范围各异,见表 \ref{tbl:figure-format}。 +这个表格也能解答诸如“为什么 \texttt{.eps} 格式图片在 \texttt{pdflatex} 编译命令下出错”之类的问题。本表格也再一次说明,使用 +\texttt{xelatex} 命令是笔者最推荐的方式。 + +\begin{table}[htp] +\centering +\caption{各种编译方式支持的主流图片格式}\label{tbl:figure-format} +\begin{tabular}{*{3}{l}} + \hline + \textbf{格式} & \textbf{矢量图} & \textbf{位图} \\ + \hline + \texttt{latex + dvipdfmx} & \texttt{.eps} & n/a \\ + \quad $\llcorner$(调用 \pkg{bmpsize} 宏包 ) & \texttt{.eps .pdf} & \texttt{.jpg .png .bmp} \\[.3\baselineskip] + \texttt{pdflatex} & \texttt{.pdf} & \texttt{.jpg .png} \\ + \quad $\llcorner$(调用 \pkg{epstopdf} 宏包) & \texttt{.pdf .eps} & \texttt{.jpg .png} \\[.3\baselineskip] + \texttt{xelatex} & \texttt{.pdf .eps} & \texttt{.jpg .png .bmp} \\ + \hline +\end{tabular} +\begin{quote}\footnotesize +注:在较新的 \TeX{} 发行版中,\texttt{latex + dvipdfmx} 和 \texttt{pdf\-latex} 命令可不依赖宏包,支持原来需要宏包扩展的图片格式 +(但 \texttt{pdf\-latex} 命令仍不支持 \texttt{.bmp} 格式的位图)。 +\end{quote} +\end{table} + +\cmdindex[graphicx]{includegraphics} +在调用了 \pkg{graphicx} 宏包以后,就可以使用 \cmd{include\-graphics} 命令加载图片了: +\begin{command} +\cmd{includegraphics}\oarg{options}\marg{filename} +\end{command} + +\cmdindex[graphicx]{graphicspath} +其中 \Arg{filename} 为图片文件名,与 \cmd{include} 命令的用法类似,文件名可能需要用相对路径或绝对路径表示(见 \ref{sec:latex-multi-files} 节)。 +图片文件的扩展名一般可不写。另外一定要注意,\textbf{文件名里既不要有空格(类似 \cmd{include}),也不要有多余的英文点号},否则宏包在解析文件名的过程中会出错。 + +另外 \pkg{graphicx} 宏包还提供了 \cmd{graphics\-path} 命令,用于声明一个或多个图片文件存放的目录, +使用这些目录里的图片时可不用写路径: +\begin{verbatim} +% 假设主要的图片放在 figures 子目录下,标志放在 logo 子目录下 +\graphicspath{{figures/}{logo/}} +\end{verbatim} + +\cmd{includegraphics} 命令的可选参数 \Arg{options} 支持 \Arg{key}=\Arg{value} 形式赋值,常用的参数如下: +\begin{table}[htp] +\centering +\caption{\cmd{includegraphics} 命令的可选参数}\label{tbl:graphics-options} +\begin{tabular}{lp{18em}} + \hline + \textbf{参数} & \textbf{含义} \\ + \hline + \texttt{width=}\Arg{width} & 将图片缩放到宽度为 \Arg{width} \\ + \texttt{height=}\Arg{height} & 将图片缩放到高度为 \Arg{height} \\ + \texttt{scale=}\Arg{scale} & 将图片相对于原尺寸缩放 \Arg{scale} 倍 \\ + \texttt{angle=}\Arg{angle} & 令图片逆时针旋转 \Arg{angle} 度 \\ + \hline +\end{tabular} +\end{table} + +\section{盒子}\label{sec:box} + +盒子是 \LaTeX{} 排版的基础单元,虽然解释上去有些抽象:每一行是一个盒子, +里面的文字从左到右依次排列;每一页也是一个盒子,各行文字从上到下依次排布……颇有一些活字印刷术的味道。 + +不管如何,\LaTeX{} 提供了一些命令让我们生成一些有特定用途的盒子。 + +\subsection{水平盒子}\label{subsec:mbox} + +\cmdindex{mbox,makebox} +生成水平盒子的命令如下: +\begin{command} +\cmd{mbox}\marg*{\ldots} \\ +\cmd{makebox}\oarg{width}\oarg{align}\marg*{\ldots} +\end{command} + +\cmd{mbox} 生成一个基本的水平盒子,内容只有一行,不允许分段(除非嵌套其它盒子,比如后文的垂直盒子)。 +外表看上去,\cmd{mbox} 的内容与正常的文本无二,不过断行时文字不会从盒子里断开。 + +\cmd{makebox} 更进一步,可以加上可选参数用于控制盒子的宽度 \Arg{width},以及内容的对齐方式 \Arg{align}, +可选居中 \texttt{c}(默认值)、左对齐 \texttt{l}、右对齐 \texttt{r} 和分散对齐 \texttt{s}% +\footnote{分散对齐方式强行拉开单词的间距,往往会报 \texttt{Underfull} \cmd{hbox} 的消息。}。 +\begin{example} +|\mbox{Test some words.}|\\ +|\makebox[10em]{Test some words.}|\\ +|\makebox[10em][l]{Test some words.}|\\ +|\makebox[10em][r]{Test some words.}|\\ +|\makebox[10em][s]{Test some words.}| +\end{example} + +\subsection{带框的水平盒子}\label{subsec:fbox} + +\cmdindex{fbox,framebox} +\cmd{fbox} 和 \cmd{framebox} 让我们可以为水平盒子添加边框。使用的语法与 \cmd{mbox} 和 \cmd{makebox} 一模一样: +\begin{command} +\cmd{fbox}\marg*{\ldots} \\ +\cmd{framebox}\oarg{width}\oarg{align}\marg*{\ldots} +\end{command} +\begin{example} +\fbox{Test some words.}\\ +\framebox[10em][r]{Test some words.} +\end{example} + +\cmdindex{setlength} +\cmdindex{fboxrule,fboxsep} +可以通过 \cmd{setlength} 命令(见 \ref{subsec:lengths} 小节)调节边框的宽度 \cmd{fbox\-rule} 和内边距 \cmd{fbox\-sep}: +\begin{example} +\framebox[10em][r]{Test box}\\[1ex] +\setlength{\fboxrule}{1.6pt} +\setlength{\fboxsep}{1em} +\framebox[10em][r]{Test box} +\end{example} + +\subsection{垂直盒子}\label{subsec:parbox} + +\cmdindex{parbox} +\envindex{minipage} +如果需要排版一个文字可以换行的盒子,\LaTeX{} 提供了两种方式: +\begin{command} +\cmd{parbox}\oarg{align}\oarg{height}\oarg{inner-align}\marg{width}\marg*{\ldots} \\[0.5ex] +\cmd{begin}\marg*{minipage}\oarg{align}\oarg{height}\oarg{inner-align}\marg{width} \\ +\ldots \\ +\cmd{end}\marg*{minipage} +\end{command} + +其中 \Arg{align} 为盒子和周围文字的对齐情况(类似 \env{tabular} 环境); +\Arg{height} 和 \Arg{inner-align} 设置盒子的高度和内容的对齐方式,类似水平盒子 \cmd{makebox} 的设置, +不过 \Arg{inner-align} 接受的参数是顶部 \texttt{t}、底部 \texttt{b}、居中 \texttt{c} 和分散对齐 \texttt{s}。 + +\begin{example} +三字经:\parbox[t]{3em}% +{人之初 性本善 性相近 习相远} +\quad +千字文: +\begin{minipage}[b][8ex][t]{4em} +天地玄黄 宇宙洪荒 +\end{minipage} +\end{example} + +\cmdindex{footnote,footnotetext,footnotemark} +如果在 \env{minipage} 里使用 \cmd{footnote} 命令,生成的脚注会出现在盒子底部,编号是独立的,并且使用小写字母编号。 +这也是 \env{minipage} 环境之被称为“迷你页”(Mini-page)的原因。 +而在 \cmd{parbox} 里无法正常使用 \cmd{footnote} 命令,只能在盒子里使用 \cmd{foot\-note\-mark},在盒子外使用 \cmd{foot\-note\-text}。 +\begin{example} +\fbox{\begin{minipage}{15em}% + 这是一个垂直盒子的测试。 + \footnote{脚注来自 minipage。} +\end{minipage}} +\end{example} + +\subsection{标尺盒子}\label{subsec:rules} + +\cmdindex{rule} +\cmd{rule} 命令用来画一个实心的矩形盒子,也可适当调整以用来画线(标尺): +\begin{command} +\cmd{rule}\oarg{raise}\marg{width}\marg{height} +\end{command} +\begin{example} +Black \rule{12pt}{4pt} box. + +Upper \rule[4pt]{6pt}{8pt} and +lower \rule[-4pt]{6pt}{8pt} box. + +A \rule[-.4pt]{3em}{.4pt} line. +\end{example} + +\section{浮动体}\label{sec:float} + +内容丰富的文章或者书籍往往包含许多图片和表格等内容。这些内容的尺寸往往太大,导致分页困难。 +\LaTeX{} 为此引入了浮动体的机制,令大块的内容可以脱离上下文,放置在合适的位置。 + +\envindex{figure,table} +\LaTeX{} 预定义了两类浮动体环境 \env{figure} 和 \env{table}。习惯上 \env{figure} 里放图片,\env{table} 里放表格, +但并没有严格限制,可以在任何一个浮动体里放置文字、公式、表格、图片等等任意内容。 + +以 \env{table} 环境的用法举例,\env{figure} 同理: +\begin{command} +\cmd{begin}\marg*{table}\oarg{placement} \\ +\ldots \\ +\cmd{end}\marg*{table} +\end{command} + +\Arg{placement} 参数提供了一些符号用来表示浮动体允许排版的位置,如 \texttt{hbp} 允许浮动体排版在当前位置、底部或者单独成页。 +\env{table} 和 \env{figure} 浮动体的默认设置为 \texttt{tbp}。 +\begin{table}[htp] +\centering +\caption{浮动体的位置参数}\label{tbl:float-placement} +\begin{tabular}{*{2}{l}} + \hline + \textbf{参数} & \textbf{含义} \\ + \hline + \texttt{h} & 当前位置(代码所处的上下文) \\ + \texttt{t} & 顶部 \\ + \texttt{b} & 底部 \\ + \texttt{p} & 单独成页 \\ + \texttt{!} & 在决定位置时忽视限制 \\ + \hline +\end{tabular} +\begin{quote}\footnotesize +注 1:排版位置的选取与参数里符号的顺序无关,\LaTeX{} 总是以 \texttt{h-t-b-p} 的优先级顺序决定浮动体位置。 +也就是说 \texttt{[!htp]} 和 \texttt{[ph!t]} 没有区别。\par +注 2:限制包括浮动体个数(除单独成页外,默认每页不超过 3 个浮动体,其中顶部不超过 2 个,底部不超过 1 个) +以及浮动体空间占页面的百分比(默认顶部不超过 70\%,底部不超过 30\%)。 +\end{quote} +\end{table} + +\envindex{table*,figure*} +双栏排版环境下,\LaTeX{} 提供了 \env{table*} 和 \env{figure*} 环境用来排版跨栏的浮动体。 +它们的用法与 \env{table} 和 \env{figure} 一样,不同之处为双栏的 \Arg{placement} 参数只能用 \texttt{tp} 两个位置。 + +\cmdindex{clearpage} +浮动体的位置选取受到先后顺序的限制。如果某个浮动体由于参数限制、空间限制等原因在当前页无法放置,就要推迟到之后处理, +并使得之后的同类浮动体一并推迟。\cmd{clearpage} 命令会在另起一页之前,先将所有推迟处理的浮动体排版成页, +此时 \texttt{htbp} 等位置限制被完全忽略。 + +\pkgindex{float} + +\pkg{float} 宏包为浮动体提供了 \texttt{H} 位置参数,不与 \texttt{htbp} 及 \texttt{!} 混用。使用 \texttt{H} 位置参数时, +会取消浮动机制,将浮动体视为一般的盒子插入当前位置。这在一些特殊情况下很有用(如使用 \pkg{multicol} 宏包排版分栏内容的时候), +但尺寸过大的浮动体可能使得分页比较困难。 + +\subsection{浮动体的标题}\label{subsec:caption} + +\cmdindex{caption,label} +图表等浮动体提供了 \cmd{caption} 命令加标题,并且自动给浮动体编号: +\begin{command} +\cmd{caption}\marg*{\ldots} +\end{command} +\cmd{caption} 的用法非常类似于 \cmd{section} 等命令,可以用带星号的命令 \cmd{caption*} 生成不带编号的标题, +也可以使用带可选参数的形式 \cmd{caption}\oarg*{\ldots}\marg*{\ldots},使得在目录里使用短标题。 +\cmd{caption} 命令之后还可以紧跟 \cmd{label} 命令标记交叉引用。 + +\pkgindex{caption} +\cmd{caption} 生成的标题形如 ``Figure 1: \ldots''{}(\env{figure} 环境)或 ``Table 1: \ldots''{}(\env{table} 环境)。 +可通过修改 \cmd{figurename} 和 \cmd{tablename} 的内容来修改标题的前缀(详见第 \ref{sec:latex-settings} 节)。 +标题样式的定制功能由 \pkg{caption} 宏包提供,详见该宏包的帮助文档,在此不作赘述。 + +\cmdindex{listoftables,listoffigures} +\env{table} 和 \env{figure} 两种浮动体分别有各自的生成目录的命令: +\begin{command} +\cmd{listoftables} \\ +\cmd{listoffigures} +\end{command} + +它们类似 \cmd{tableofcontents} 生成单独的章节。 + +\subsection{并排和子图表}\label{subsec:subfig} + +我们时常有在一个浮动体里面放置多张图的用法。最简单的用法就是直接并排放置, +也可以通过分段或者换行命令 \crcmd{} 排版多行多列的图片。以下为示意代码,效果大致如图 \ref{fig:parallel-fig} 所示。 +\begin{verbatim} +\begin{figure}[htbp] + \centering + \includegraphics[width=...]{...} + \qquad + \includegraphics[width=...]{...} \\[..pt] + \includegraphics[width=...]{...} + \caption{...} +\end{figure} +\end{verbatim} + +\begin{figure}[htp] + \centering + \fcolorbox[gray]{0}{0.96}{\parbox{10em}{\vrule width 0pt height 10ex\hfil}} + \qquad + \fcolorbox[gray]{0}{0.96}{\parbox{10em}{\vrule width 0pt height 12ex\hfil}} + \par\bigskip + \fcolorbox[gray]{0}{0.96}{\parbox{20em}{\vrule width 0pt height 12ex\hfil}} + \caption{并排放置图片的示意。}\label{fig:parallel-fig} +\end{figure} + +由于标题是横跨一行的,用 \cmd{caption} 命令为每个图片单独生成标题就需要借助前文提到的 \cmd{parbox} +或者 \env{minipage} 环境,将标题限制在盒子内。效果见图 \ref{fig:parallel-cap1} 和图 \ref{fig:parallel-cap2}。 +\begin{verbatim} +\begin{figure}[htbp] + \centering + \begin{minipage}{...} + \centering + \includegraphics[width=...]{...} + \caption{...} + \end{minipage} + \qquad + \begin{minipage}{...} + \centering + \includegraphics[width=...]{...} + \caption{...} + \end{minipage} +\end{figure} +\end{verbatim} + +\begin{figure}[htp] + \centering + \begin{minipage}{12em} + \centering + \fcolorbox[gray]{0}{0.96}{\parbox{10em}{\vrule width 0pt height 12ex\hfil}} + \caption{并排图1。}\label{fig:parallel-cap1} + \end{minipage} + \qquad + \begin{minipage}{12em} + \centering + \fcolorbox[gray]{0}{0.96}{\parbox{10em}{\vrule width 0pt height 12ex\hfil}} + \caption{并排图2。}\label{fig:parallel-cap2} + \end{minipage} +\end{figure} + +\pkgindex{subfig} +\cmdindex[subfig]{subfloat} +当我们需要更进一步,给每个图片定义小标题时,就要用到 \pkg{subfig} 宏包的功能了。 +这里仅举一例,效果见图 \ref{fig:subfig}。更详细的用法请参考 \pkg{subfig} 宏包的帮助文档。 +\begin{verbatim} +\begin{figure}[htbp] + \centering + \subfloat[...]{\label{sub-fig-1}% 为子图加交叉引用 + \begin{minipage}{...} + \centering + \includegraphics[width=...]{...} + \end{minipage} + } + \qquad + \subfloat[...]{% + \begin{minipage}{...} + \centering + \includegraphics[width=...]{...} + \end{minipage} + } + \caption{...} +\end{figure} +\end{verbatim} + +\begin{figure}[htp] + \centering + \subfloat[并排子图1]{% + \begin{minipage}{12em} + \centering + \fcolorbox[gray]{0}{0.96}{\parbox{10em}{\vrule width 0pt height 12ex\hfil}} + \end{minipage}} + \qquad + \subfloat[并排子图2]{% + \begin{minipage}{12em} + \centering + \fcolorbox[gray]{0}{0.96}{\parbox{10em}{\vrule width 0pt height 12ex\hfil}} + \end{minipage}} + \caption{使用 \pkg{subfig} 宏包的 \cmd{subfloat} 命令排版子图。}\label{fig:subfig} +\end{figure} + +\endinput |