1. LaTeX 基本概念
LaTeX\LaTeXLATEX 的源代码为文本文件。这些文本除了文字本身,还包括各种命令,用在排版公式、划分文档结构、控制样式等等不同的地方.
1.1 LaTeX 命令和代码结构
1.1.1 LaTeX 命令
LaTeX\LaTeXLATEX 中命令以 \
开头,为以下两种形式之一:
- 反斜线和后面的一串字母,如
\LaTeX
,它们以任意非字母符号(空格、数字、标点等)为界限 - 反斜线和后面的单个非字母符号,如
\$
命令是大小写敏感的
一些 LaTeX\LaTeXLATEX 命令可以接收一些参数,参数的内容会影响命令的效果. LaTeX\LaTeXLATEX 的参数分为可选参数和必选参数. 可选参数以方括号 [
和 ]
包裹;必选参数一般以花括号 {
和 }
包裹. 还有些命令可以带一个星号 *
,带星号和不带星号的命令效果有一定差异. 初次接触这些概念时,可以粗略地把星号看作一种特殊的可选参数.
1.1.2 LaTeX 环境
LaTeX\LaTeXLATEX 中还包括环境,用以令一些效果在局部生效,或是生成特殊的文档元素. LaTeX\LaTeXLATEX 环境的用法为一对命令 \begin
和 \end
:
\begin{⟨environment name⟩}[⟨optional arguments⟩]{⟨mandatory arguments⟩}
…
\end{⟨environment name⟩}
- 其中
⟨environment name⟩
为环境名,\begin
和\end
中填写的环境名应当一致- 类似命令,
{⟨mandatory arguments⟩}
和[⟨optional arguments⟩]
为环境所需的必选和可选参数- 部分环境允许嵌套使用
1.1.3 LaTeX 分组
有些命令(如 \bfseries
)会对其后所有内容产生作用,若要限制其作用范围,则需要使用分组.
LaTeX\LaTeXLATEX 使用一对花括号 {
和 }
作为分组,在分组中使用的命令被限制在分组内,不会影响到分组外的内容.
上文提到的 LaTeX\LaTeXLATEX 环境隐含了一个分组,在环境中的命令被包裹在分组内.
1.1.4 LaTeX 源代码结构
LaTeX\LaTeXLATEX 源代码以一个 \documentclass
命令作为开头,它指定了文档使用的文档类. document 环境当中的内容是文档正文.
在 \documentclass
和 \begin{document}
之间的位置称为导言区,在导言区中一般会使用 \usepackage
命令调用宏包,还会进行文档的全局设置.
\documentclass{...} % ... 为某文档类
% 导言区
\begin{document}
% 正文内容
\end{document}
% 此后内容会被忽略
1.2 LaTeX 宏包和文档类
1.2.1 文档类
文档类规定了 LaTeX\LaTeXLATEX 源代码所要生成的文档的性质——普通文章、书籍、演示文稿、个人简历等等. LaTeX\LaTeXLATEX 源代码的开头须用 \documentclass
指定文档类:
\documentclass[⟨options⟩]{⟨class-name⟩}
其中 ⟨class-name⟩
为文档类的名称,如 LaTeX\LaTeXLATEX 提供的 article, report, book,在其基础上派生的一些文档类如支持中文排版的 ctexart / ctexrep / ctexbook,或者有其它功能的一些文档类,如 moderncv / beamer 等, LaTeX\LaTeXLATEX 提供的基础文档类如下所示:
可选参数 ⟨options⟩
为文档类指定选项,以全局地规定一些排版的参数,如字号、纸张大小、单双面等等。比如调用 article 文档类排版文章,指定纸张为 A4 大小,基本字号为 11pt
,双面排版:
\documentclass[11pt,twoside,a4paper]{article}
LaTeX\LaTeXLATEX 的三个标准文档类可指定的选项包括:
10pt
,11pt
,12pt
指定文档的基本字号,默认为10pt
.a4paper
,letterpaper
指定纸张大小,默认为美式信纸letterpaper
. 可指定选项还包括a5paper
,b5paper
,executivepaper
和legalpaper
.twoside
,oneside
指定单面/双面排版. 双面排版时,奇偶页的页眉页脚、页边距不同.article
和report
默认为oneside
,book
默认为twoside
.onecolumn
,twocolumn
指定单栏/双栏排版,默认为onecolumn
.openright
,openany
指定新的一章\chapter
是在奇数页(右侧)开始,还是直接紧跟着上一页开始.report
默认为openany
,book
默认为openright
,对article
无效.landscape
指定横向排版,默认为纵向.titlepage
,notitlepage
指定标题命令\maketitle
是否生成单独的标题页,article
默认为notitlepage
,report
和book
默认为titlepage
.fleqn
令行间公式左对齐,默认为居中对齐.leqno
将公式编号放在左边,默认为右边.draft
,final
指定草稿/终稿模式。草稿模式下,断行不良的地方会在行尾添加一个黑色方块,默认为final
.
1.2.2 宏包
在使用 LaTeX\LaTeXLATEX 时,时常需要依赖一些扩展来增强或补充 LaTeX\LaTeXLATEX 的功能,比如排版复杂的表格、插入图片、增加颜色甚至超链接等等,这些扩展称为宏包. 调用宏包的方法非常类似调用文档类的方法:
\usepackage[⟨options⟩]{⟨package-name⟩}
宏包(包括前面所说的文档类)可能定义了许多命令和环境,或者修改了 LaTeX\LaTeXLATEX 已有的命令和环境。它们的用法说明记在相应宏包和文档类的帮助文档。在 Windows 命令提示符或者 Linux 终端下输入命令可查阅相应文档:
texdoc ⟨pkg-name⟩
1.3 LaTeX 用到的文件
.tex
:源码文件.sty
:宏包文件,宏包的名称与文件名一致.cls
:文档类文件,文档类名称与文件名一致.bib
:BIBTEX 参考文献数据库文件.bst
:BIBTEX 用到的参考文献格式模板
LaTeX\LaTeXLATEX 在编译过程中除了生成 .dvi
或 .pdf
格式的文档外,还可能会生成相当多的辅助文件和日志. 一些功能如交叉引用、参考文献、目录、索引等,需要先通过编译生成辅助文件,然后再次编译时读入辅助文件得到正确的结果,所以复杂的 LaTeX\LaTeXLATEX 源代码可能要编译多次:
.aux
:LaTeX\LaTeXLATEX 生成的主辅助文件,记录交叉引用、目录、参考文献的引用等.toc
:LaTeX\LaTeXLATEX 生成的目录记录文件.lof
LaTeX\LaTeXLATEX 生成的图片目录记录文件.lot
LaTeX\LaTeXLATEX 生成的表格目录记录文件.bbl
BIBTEX 生成的参考文献记录文件.idx
LaTeX\LaTeXLATEX 生成的供makeindex
处理的索引记录文件.ind
makeindex
处理.idx
生成的用于排版的格式化索引文件.out
hyperref
宏包生成的 PDF 书签记录文件
1.4 文件的组织方式
当编写长篇文档时,例如当编写书籍、毕业论文时,单个源文件会使修改、校对变得十分困难. 将源文件分割成若干个文件,例如将每章内容单独写在一个文件中,会大大简化修改和校对的工作.
LaTeX\LaTeXLATEX 提供了命令 \include
用来在源代码里插入文件:
\include{⟨filename⟩}
⟨filename⟩
为文件名(不带.tex
扩展名),如果和要编译的主文件不在一个目录中,则要加上相对或绝对路径
值得注意的是 \include
在读入 ⟨filename⟩
之前会另起一页. 有的时候我们并不需要这样,而是用 \input
命令,它纯粹是把文件里的内容插入:
\input{⟨filename⟩}
当导言区内容较多时,常常将其单独放置在一个 .tex
文件中,再用 \input
命令插入,复杂的图、表、代码等也会用类似的手段处理.
LaTeX\LaTeXLATEX 还提供了一个 \includeonly
命令来组织文件,用于导言区,指定只载入某些文件. 导言区使用了 \includeonly
后,正文中不在其列表范围的 \include
命令不会起效:
\includeonly{⟨filename1⟩,⟨filename2⟩,…}
需要注意的是,使用 \include
和 \input
命令载入的文件名最好不要加空格和特殊字符,也尽量避免使用中文名,否则很可能会出错.
最后介绍一个实用的工具宏包 syntonly。加载这个宏包后,在导言区使用
\syntaxonly
命令,可令 LaTeX\LaTeXLATEX 编译后不生成 DVI 或者PDF 文档,只排查错误,编译速度会快不少:\usepackage{syntonly} \syntaxonly
2. 用 LaTeX 排版文字
2.1 示例
\documentclass{ctexart}
\begin{document}在\LaTeX{}中排版中文。汉字和English单词混排,通常不需要在中英文之间添加额外的空格。当然,为了代码的可读性,加上汉字和English 之间的空格也无妨。汉字换行时不会引入多余的空格。
\end{document}
输出结果为:
2.2 LaTeX 中的字符
2.2.1 空格和分段
LaTeX\LaTeXLATEX 源代码中,空格键和 Tab 键输入的空白字符视为“空格”,连续的若干个空白字符视为一个空格.
一行开头的空格忽略不计.
行末的换行符视为一个空格;但连续两个换行符,也就是空行,会将文字分段.
多个空行被视为一个空行,也可以在行末使用 \par
命令分段。
2.2.2 注释
LaTeX\LaTeXLATEX 用 %
字符作为注释. 在这个字符之后直到行末,所有的字符都被忽略,行末的换行符也不引入空格.
2.2.3 特殊字符
\documentclass{ctexart}
\begin{document}
\# \$ \% \& \{ \} \_
\^{} \~{} \textbackslash
\end{document}
2.2.4 连字
西文排版中经常会出现连字(ligatures),常见的有 ff
、 fi
、 fl
、 ffi
、 ffl
\documentclass{ctexart}
\begin{document}
It's difficult to find \ldots\\
It's dif{}f{}icult to f{}ind \ldots
\end{document}
2.2.5 标点符号
中文的标点符号(绝大多数为非ASCII 字符)使用中文输入法输入即可,一般不需要过多留意. 而输入西文标点符号时,有不少地方需要留意.
-
引号
LaTeX\LaTeXLATEX 中单引号
‘
和’
分别用`
和’
输入;双引号“
和”
分别用``
和‘’
输入``Please press the `x' key.''
中文的引号 ‘ ’ 和 “ ” 与西文的引号实际上是同一组符号,但由于中西文通常用不同的字体显示,它们的具体形状和宽度可能有所不同。在使用 ctex 宏包或文档类的情况下,中文引号可以通过输入法直接输入.
-
连字号破折号
LaTeX\LaTeXLATEX 中有三种长度的“横线”可用:连字号(hyphen)、短破折号(en-dash)和长破折号(em-dash).
它们分别有不同的用途:连字号 – 用来组成复合词;短破折号 – 用来连接数字表示范围;长破折号 — 用来连接单词,语义上类似中文的破折号.
daughter-in-law, X-rated\\ pages 13--67\\ yes---or no?
-
省略号
LaTeX\LaTeXLATEX 提供了
\ldots
命令表示省略号,相对于直接输入三个点的方式更为合理.\dots
与\ldots
命令等效.
2.3 断行和断页
LaTeX\LaTeXLATEX 将文字段落在合适的位置进行断行,尽可能做到每行的疏密程度匀称,单词间距不会过宽或过窄. 文字段落和公式、图表等内容从上到下顺序排布,并在合适的位置断页,分割成匀称的页面. 在绝大多数时候,我们无需自己操心断行和断页,但偶尔会遇到需要手工调整的地方.
2.3.1 单词间距
在西文排版实践中,断行的位置优先选取在两个单词之间,也就是在源代码中输入的“空格”. “空格”本身通常生成一个间距,它会根据行宽和上下文自动调整,文字密一些的地方,单词间距就略窄,反之略宽.
文字在单词间的“空格”处断行时,“空格”生成的间距随之舍去. 我们可以使用字符 ~
输入一个不会断行的空格(高德纳称之为 tie,“带子”),通常用在英文人名、图表名称等上下文环境:
Fig.~2a \\
Donald~E. Knuth
2.3.2 手动断行和断页
如果我们确实需要手动断行,可使用如下命令:
\\[⟨length⟩] \\*[⟨length⟩]
\newline
它们有两点区别:
- 一是
\\
可以带可选参数⟨length⟩
,用于在断行处向下增加垂直间距,而\newline
不带可选参数 - 二是
\\
也在表格、公式等地方用于换行,而\newline
只用于文本段落中
带星号的
\\
表示禁止在断行处分页
断页的命令有两个:
\newpage
\clearpage
通常情况下两个命令都起到另起一页的作用,区别在于:
- 第一,在双栏排版模式中
\newpage
起到另起一栏的作用,\clearpage
则能够另起一页 - 第二,在涉及浮动体的排版上行为不同
有时候我们不满足于 LaTeX\LaTeXLATEX 默认的断行和断页位置,需要进行微调,可以用以下命令告诉 LaTeX\LaTeXLATEX 哪些地方适合断行或断页,哪些地方不适合:
\linebreak[⟨n⟩] \nolinebreak[⟨n⟩]
\pagebreak[⟨n⟩] \nopagebreak[⟨n⟩]
以上命令都带一个可选参数,用数字 ⟨n⟩
代表适合/不适合的程度,取值范围为 0–4
,不带可选参数时,缺省为 4
. 比如 \linebreak
或者 \linebreak[4]
意味着此处需要强行断行;`nopagebreak或
\nopagebreak[4]` 意味着禁止在此处断页.
以上命令适合给出优先考虑断行断页/禁止断行断页的位置,但不适合直接拿来断行或断页,使用 \newline
或 \newpage
等命令是更好的选择. 因为 \newline
和 \newpage
会在断行/断页位置填充适当的间距,但 \linebreak
和 \pagebreak
不能,使用这些命令强行断行/断页可能会制造出糟糕的排版效果.
使用\verb|\newline| 断行的效果
\newline
与使用\verb|\linebreak| 断行的效果
\linebreak
进行对比。
2.3.3 断词
如果 LaTeX\LaTeXLATEX 遇到了很长的英文单词,仅在单词之间的“空格”处断行无法生成疏密程度匀称的段落时,就会考虑从单词中间断开. 对于绝大多数单词,LaTeX\LaTeXLATEX 能够找到合适的断词位置,在断开的行尾加上连字符 -
。
如果一些单词没能自动断词,我们可以在单词内手动使用 \-
命令指定断词的位置:
I think this is: su\-per\-cal\-%
i\-frag\-i\-lis\-tic\-ex\-pi\-%
al\-i\-do\-cious.
3. 文档元素
3.1 章节和目录
3.1.1 章节标题
一篇结构化的、条理清晰文档一定是层次分明的,通过不同的命令分割为章、节、小节. 三个标准文档类 article
、report
和 book
提供了划分章节的命令:
\chapter{⟨title⟩}
\section{⟨title⟩}
\subsection{⟨title⟩}
\subsubsection{⟨title⟩}
\paragraph{⟨title⟩}
\subparagraph{⟨title⟩}
其中
\chapter
只在report
和book
文档类有定义
这些命令生成章节标题,并能够自动编号.
上述命令除了生成带编号的标题之外,还向目录中添加条目,并影响页眉页脚的内容,每个命令有两种变体:
-
带可选参数
\section[⟨short title⟩]{⟨title⟩}
标题使用
⟨title⟩
参数,在目录和页眉页脚中使用⟨short title⟩
参数 -
带星号
\section*{⟨title⟩}
标题不带编号,也不生成目录项和页眉页脚
article
文档类带编号的层级为\section
,\subsection
,\subsubsection
三级
report
和book
文档类带编号的层级为\chapter
,\section
,\subsection
三级
LaTeX\LaTeXLATEX 及标准文档类并未提供为 \section
等章节命令定制格式的功能,这一功能由 titlesec 宏包提供
3.1.2 目录
在 LaTeX\LaTeXLATEX 中生成目录非常容易,只需在合适的地方使用命令:
\tableofcontents
这个命令会生成单独的一章(report
或 book
)或一节(article
),标题默认为“Contents”
\tableofcontents
生成的章节默认不写入目录(\section
或 \chapter
),可使用 tocbibind 等宏包修改设置
titletoc、tocloft 等宏包提供了具体定制目录项格式的功能
正确生成目录项,一般需要编译两次源代码
3.1.3 文档结构的划分
所有标准文档类都提供了一个 \appendix
命令将正文和附录分开,使用 \appendix
后,最高一级章节改为使用拉丁字母编号,从 A 开始
book
文档类还提供了前言、正文、后记结构的划分命令:
\frontmatter
前言部分,页码使用小写罗马数字;其后的\chapter
不编号\mainmatter
正文部分,页码使用阿拉伯数字,从 111 开始计数,其后的章节编号正常\backmatter
后记部分,页码格式不变,继续正常计数;其后的\chapter
不编号
以上三个命令还可和
\appendix
命令结合,生成有前言、正文、附录、后记四部分的文档
\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}
3.2 标题页
LaTeX\LaTeXLATEX 支持生成简单的标题页. 首先需要给定标题和作者等信息:
\title{⟨title⟩}
\author{⟨author⟩}
\date{⟨date⟩}
其中前两个命令是必须的(不用
\title
会报错;不用\author
会警告),\date
命令可选
LaTeX\LaTeXLATEX 还提供了一个 \today
命令自动生成当前日期,\date
默认使用 \today
.
在 \title
、\author
等命令内可以使用 \thanks
命令生成标题页的脚注,用 \and
隔开多个人名.
在信息给定后,就可以使用 \maketitle
命令生成一个简单的标题页了:
\title{Test title}
\author{ Mary\thanks{E-mail:*****@***.com}
\and Ted\thanks{Corresponding author}
\and Louis}
\date{\today}
article 文档类的标题默认不单独成页,而 report 和 book 默认单独成页.
可在 \documentclass
命令调用文档类时指定 titlepage
/ notitlepage
选项以修改默认的行为.
LaTeX\LaTeXLATEX 标准类还提供了一个简单的 titlepage
环境,生成不带页眉页脚的一页. 用户可以在这个环境中使用各种排版元素自由发挥,生成自定义的标题页以替代 \maketitle
命令. 甚至可以利用 titlepage
环境重新定义 \maketitle
:
\renewcommand{\maketitle}{\begin{titlepage}
... % 用户自定义命令
\end{titlepage}}
事实上,为标准文档类指定了 titlepage
选项以后,使用 \maketitle
命令生成的标题页就是一个 titlepage
环境.
3.3 交叉引用
交叉引用是 LaTeX\LaTeXLATEX 强大的自动排版功能的体现之一,在能够被交叉引用的地方,如章节、公式、图表、定理等位置使用 \label
命令:
\label{⟨label-name⟩}
之后可以在别处使用 \ref
或 \pageref
命令,分别生成交叉引用的编号和页码:
\ref{⟨label-name⟩}
\pageref{⟨label-name⟩}
【Example】
A reference to this subsection
\label{sec:this} looks like:
``see section~\ref{sec:this} on
page~\pageref{sec:this}.''
为了生成正确的交叉引用,一般也需要多次编译源代码
\label
命令可用于记录各种类型的交叉引用,使用位置分别为:
- 章节标题:在章节标题命令
\section
等之后紧接着使用 - 行间公式:单行公式在公式内任意位置使用;多行公式在每一行公式的任意位置使用
- 有序列表:在
enumerate
环境的每个\item
命令之后、下一个\item
命令之前任意位置使用 - 图表标题:在图表标题命令
\caption
之后紧接着使用 - 定理环境:在定理环境内部任意位置使用
3.4 脚注和边注
3.4.1 脚注
使用 \footnote
命令可以在页面底部生成一个脚注:
\footnote{⟨footnote⟩}
假如我们输入以下文字和命令:
“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnote{出自《千字文》。}
正文显示为:
脚注在页面底部显示为:
有些情况下(比如在表格环境、各种盒子内)使用 \footnote
并不能正确生成脚注. 我们可以分两步进行,先使用 \footnotemark
为脚注计数,再在合适的位置用\footnotetext
生成脚注。比如:
\begin{tabular}{l}
\hline
“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnotemark \\
\hline
\end{tabular}
\footnotetext{表格里的名句出自《千字文》。}
效果为:
3.4.2 边注
使用 \marginpar
命令可在边栏位置生成边注:
\marginpar[⟨left-margin⟩]{⟨right-margin⟩}
如果只给定了 ⟨right-margin⟩
,那么边注在奇偶数页文字相同;如果同时给定了 ⟨left-margin⟩
,则偶数页使用 ⟨left-margin⟩
的文字,例如以下代码:
\marginpar{\footnotesize 边注较窄,不要写过多文字,最好设置较小的字号。}
其效果为:
3.5 特殊环境
3.5.1 列表
LaTeX\LaTeXLATEX 提供了基本的有序和无序列表环境 enumerate
和 itemize
,两者的用法很类似,都用 \item
标明每个列表项,enumerate
环境会自动对列表项编号.
\begin{enumerate}
\item …
\end{enumerate}
其中 \item
可带一个可选参数,将有序列表的计数或者无序列表的符号替换成自定义的符号,列表可以嵌套使用,最多嵌套四层.
例如有序列表:
\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}
其效果为:
无序列表:
\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}
其效果为:
关键字环境 description
的用法与以上两者类似,不同的是 \item
后的可选参数用来写关键字,以粗体显示,一般是必填的:
\begin{description}
\item[⟨item title⟩] …
\end{description}
例如:
\begin{description}
\item[Enumerate] Numbered list.
\item[Itemize] Non-numbered list.
\end{description}
其效果为:
各级无序列表的符号由命令 \labelitemi
到 \labelitemiv
定义,可以简单地重新定义它们:
\renewcommand{\labelitemi}{\ddag}
\renewcommand{\labelitemii}{\dag}
\begin{itemize}
\item First item
\begin{itemize}
\item Subitem
\item Subitem
\end{itemize}
\item Second item
\end{itemize}
有序列表的符号由命令 \labelenumi
到 \labelenumiv
定义,重新定义这些命令需要用到计数器相关命令:
\renewcommand{\labelenumi}%
{\Alph{enumi}>}
\begin{enumerate}
\item First item
\item Second item
\end{enumerate}
默认的列表间距比较宽,LaTeX\LaTeXLATEX 本身也未提供方便的定制功能,可用 enumitem
宏包定制各种列表间距,enumitem
宏包还提供了对列表标签、引用等的定制.
3.5.2 文本对齐环境
center
、flushleft
和 flushright
环境分别用于生成居中、左对齐和右对齐的文本环境.
\begin{center} … \end{center}
\begin{flushleft} … \end{flushleft}
\begin{flushright} … \end{flushright}
例如:
\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}
其效果为:
除此之外,还可以用以下命令直接改变文字的对齐方式:
\centering
\raggedright
\raggedleft
例如:
\centering
Centered text paragraph.\raggedright
Left-aligned text paragraph.\raggedleft
Right-aligned text paragraph.
效果为:
有一点可以将两者区分开来:center
等环境会在上下文产生一个额外间距,而 \centering
等命令不产生,只是改变对齐方式. 比如在浮动体环境 table
或 figure
内实现居中对齐,用 \centering
命令即可,没必要再用 center
环境.
3.5.3 引用环境
LaTeX\LaTeXLATEX 提供了两种引用的环境:quote
用于引用较短的文字,首行不缩进;quotation
用于引用若干段文字,首行缩进.
引用环境较一般文字有额外的左右缩进.
Francis Bacon says:
\begin{quote}
Knowledge is power.
\end{quote}
效果为:
《木兰诗》:
\begin{quotation}
万里赴戎机,关山度若飞。
朔气传金柝,寒光照铁衣。
将军百战死,壮士十年归。归来见天子,天子坐明堂。
策勋十二转,赏赐百千强。⋯⋯
\end{quotation}
verse
用于排版诗歌,与 quotation
恰好相反,verse
是首行悬挂缩进的.
Rabindranath Tagore's short poem:
\begin{verse}
Beauty is truth's smile
when she beholds her own face in
a perfect mirror.
\end{verse}
3.5.4 摘要环境
摘要环境 abstract
默认只在标准文档类中的 article
和 report
文档类可用,一般用于紧跟 \maketitle
命令之后介绍文档的摘要。如果文档类指定了 titlepage
选项,则单独成页;反之,单栏排版时相当于一个居中的小标题加一个 quotation
环境,双栏排版时相当于 \section*
定义的一节.
3.5.5 代码环境
有时我们需要将一段代码原样转义输出,这就要用到代码环境 verbatim
,它以等宽字体排版代码,回车和空格也分别起到换行和空位的作用;带星号的版本更进一步将空格显示成 “␣”.
\begin{verbatim}
#include <iostream>
int main()
{std::cout << "Hello, world!"<< std::endl;return 0;
}
\end{verbatim}
\begin{verbatim*}
for (int i=0; i<4; ++i)printf("Number %d\n",i);
\end{verbatim*}
要排版简短的代码或关键字,可使用 \verb
命令:
\verb⟨delim⟩⟨code⟩⟨delim⟩
⟨delim⟩
标明代码的分界位置,前后必须一致,除字母、空格或星号外,可任意选择使得不与代码本身冲突,习惯上使用 |
符号.
同 verbatim
环境,\verb
后也可以带一个星号,以显示空格:
\verb|\LaTeX| \\
\verb+(a || b)+ \verb*+(a || b)+
\verb
命令对符号的处理比较复杂,一般不能用在其它命令的参数里,否则多半会出错
verbatim
宏包优化了 verbatim
环境的内部命令,并提供了 \verbatiminput
命令用来直接读入文件生成代码环境. fancyvrb
宏包提供了可定制格式的 Verbatim
环境;listings
宏包更进一步,可生成关键字高亮的代码环境,支持各种程序设计语言的语法和关键字.
3.6 表格
LaTeX\LaTeXLATEX 里排版表格不如 Word 等所见即所得的工具简便和自由,不过对于不太复杂的表格来讲,完全能够胜任.
排版表格最基本的 tabular
环境用法为:
\begin{tabular}[⟨align⟩]{⟨column-spec⟩}
⟨item1⟩ & ⟨item2⟩ & … \\
\hline
⟨item1⟩ & ⟨item2⟩ & … \\
\end{tabular}
其中
⟨column-spec⟩
是列格式标记;&
用来分隔单元格;\\
用来换行;\hline
用来在行与行之间绘制横线
直接使用 tabular
环境的话,会和周围的文字混排。此时可用一个可选参数 ⟨align⟩
控制垂直对齐:t
和 b
分别表示按表格顶部、底部对齐,其他参数或省略不写(默认)表示居中对齐.
\begin{tabular}{|c|}
center-\\ aligned \\
\end{tabular},
\begin{tabular}[t]{|c|}
top-\\ aligned \\
\end{tabular},
\begin{tabular}[b]{|c|}
bottom-\\ aligned\\
\end{tabular} tabulars.
但是通常情况下 tabular
环境很少与文字直接混排,而是会放在 table
浮动体环境中,并用 \caption
命令加标题.
3.6.1 列格式
tabular
环境使用 ⟨column-spec⟩
参数指定表格的列数以及每列的格式,基本的列格式见下表:
列格式 | 说明 |
---|---|
l /c /r |
单元格内容左对齐/居中/右对齐,不折行 |
p{⟨width⟩} |
单元格宽度固定为 ⟨width⟩ ,可自动折行 |
| |
绘制竖线 |
@{⟨string⟩} |
自定义内容 ⟨string⟩ |
例如:
\begin{tabular}{lcr|p{6em}}
\hline
left & center & right
& par box with fixed width\\
L & C & R & P \\
\hline
\end{tabular}
表格中每行的单元格数目不能多于列格式里
l
/c
/r
/p
的总数(可以少于这个总数),否则出错.
@
格式可在单元格前后插入任意的文本,但同时它也消除了单元格前后额外添加的间距. @
格式可以适当使用以充当“竖线”,特别地,@{}
可直接用来消除单元格前后的间距:
\begin{tabular}{@{} r@{:}lr @{}}
\hline
1 & 1 & one \\
11 & 3 & eleven \\
\hline
\end{tabular}
另外 LaTeX\LaTeXLATEX 还提供了简便的将格式参数重复的写法 *{⟨n⟩}{⟨column-spec⟩}
,比如以下两种写法是等效的:
\begin{tabular}{|c|c|c|c|c|p{4em}|p{4em}|}
\begin{tabular}{|*{5}{c|}*{2}{p{4em}|}}
有时需要为整列修饰格式,比如整列改变为粗体,如果每个单元格都加上 \bfseries
命令会比较麻烦。array
宏包提供了辅助格式 >
和<
,用于给列格式前后加上修饰命令:
% \usepackage{array}
\begin{tabular}{>{\itshape}r<{*}l}\hlineitalic & normal \\column & column \\\hline
\end{tabular}
array
宏包还提供了类似 p
格式的 m
格式和 b
格式,三者分别在垂直方向上靠顶端对齐、居中以及底端对齐:
% \usepackage{array}
\newcommand\txt{a b c d e f g h i}
\begin{tabular}{cp{2em}m{2em}b{2em}}\hlinepos & \txt & \txt & \txt \\\hline
\end{tabular}
3.6.2 列宽
在控制列宽方面,LaTeX\LaTeXLATEX 表格有着明显的不足:l
/c
/r
格式的列宽是由文字内容的自然宽度决定的,而 p
格式给定了列宽却不好控制对齐(可用 array
宏包的辅助格式),更何况列与列之间通常还有间距,所以直接生成给定总宽度的表格并不容易.
tabularx
宏包为我们提供了方便的解决方案。它引入了一个 X
列格式,类似 p
列格式,不过会根据表格宽度自动计算列宽,多个 X
列格式平均分配列宽. X
列格式也可以用array
里的辅助格式修饰对齐方式:
% \usepackage{array,tabularx}
\begin{tabularx}{14em}%{|*{4}{>{\centering\arraybackslash}X|}}\hlineA & B & C & D \\ \hlinea & b & c & d \\ \hline
\end{tabularx}
3.6.3 横线
我们已经在之前的例子见过许多次绘制表格线的 \hline
命令. 另外\cline{⟨i⟩-⟨j⟩}
用来绘制跨越部分单元格的横线:
\begin{tabular}{|c|c|c|}\hline4 & 9 & 2 \\ \cline{2-3}3 & 5 & 7 \\ \cline{1-1}8 & 1 & 6 \\ \hline
\end{tabular}
在科技论文排版中广泛应用的表格形式是三线表,形式干净简明. 三线表由 booktabs
宏包支持,它提供了\toprule
、\midrule
和 \bottomrule
命令用以排版三线表的三条线,以及和 \cline
对应的 \cmidrule
. 除此之外,最好不要用其它横线以及竖线:
% \usepackage{booktabs}
\begin{tabular}{cccc}\toprule& \multicolumn{3}{c}{Numbers} \\\cmidrule{2-4}& 1 & 2 & 3 \\\midruleAlphabet & A & B & C \\Roman & I & II& III \\\bottomrule
\end{tabular}
3.6.4 合并单元格
LaTeX\LaTeXLATEX 是一行一行排版表格的,横向合并单元格较为容易,由 \multicolumn
命令实现:
\multicolumn{⟨n⟩}{⟨column-spec⟩}{⟨item⟩}
其中
⟨n⟩
为要合并的列数,⟨column-spec⟩
为合并单元格后的列格式,只允许出现一个l
/c
/r
或p
格式如果合并前的单元格前后带表格线
|
,合并后的列格式也要带|
以使得表格的竖线一致
\begin{tabular}{|c|c|c|}\hline1 & 2 & Center \\ \hline\multicolumn{2}{|c|}{3} &\multicolumn{1}{r|}{Right} \\ \hline4 & \multicolumn{2}{c|}{C} \\ \hline
\end{tabular}
上面的例子还体现了,形如 \multicolumn{1}{⟨column-spec⟩}{⟨item⟩}
的命令可以用来修改某一个单元格的列格式.
纵向合并单元格需要用到 multirow
宏包提供的 \multirow
命令:
\multirow{⟨n⟩}{⟨width⟩}{⟨item⟩}
⟨width⟩
为合并后单元格的宽度,可以填*
以使用自然宽度
我们看一个结合 \cline
、\multicolumn
和 \multirow
命令的例子:
% \usepackage{multirow}
\begin{tabular}{ccc}\hline\multirow{2}{*}{Item} & \multicolumn{2}{c}{Value} \\ \cline{2-3}& First & Second \\ \hlineA & 1 & 2 \\ \hline
\end{tabular}
3.6.5 行距控制
LaTeX\LaTeXLATEX 生成的表格看起来通常比较紧凑,修改参数 \arraystretch
可以得到行距更加宽松的表格:
\renewcommand\arraystretch{1.8}
\begin{tabular}{|c|}\hlineReally loose \\ \hlinetabular rows.\\ \hline
\end{tabular}
3.7 图片
LaTeX\LaTeXLATEX 本身不支持插图功能,需要由 graphicx
宏包辅助支持. 在调用了graphicx
宏包以后,就可以使用 \includegraphics
命令加载图片了:
\includegraphics[⟨options⟩]{⟨filename⟩}
其中
⟨filename⟩
为图片文件名,与\include
命令的用法类似,文件名可能需要用相对路径或绝对路径表示
图片文件的扩展名一般可不写,另外一定要注意,文件名里既不要有空格(类似 \include
),也不要有多余的英文点号,否则宏包在解析文件名的过程中会出错.
另外 graphicx
宏包还提供了 \graphicspath
命令,用于声明一个或多个图片文件存放的目录,使用这些目录里的图片时可不用写路径:
% 假设主要的图片放在figures 子目录下,标志放在logo 子目录下
\graphicspath{{figures/}{logo/}}
\includegraphics
命令的可选参数 ⟨options⟩
支持 ⟨key⟩=⟨value⟩
形式赋值,常用的参数如下:
3.8 盒子
盒子是 LaTeX\LaTeXLATEX 排版的基础单元,虽然解释上去有些抽象:每一行是一个盒子,里面的文字从左到右依次排列;每一页也是一个盒子,各行文字从上到下依次排布⋯⋯
3.8.1 水平盒子
生成水平盒子的命令如下:
\mbox{…}
\makebox[⟨width⟩][⟨align⟩]{…}
\mbox
生成一个基本的水平盒子,内容只有一行,不允许分段(除非嵌套其它盒子,比如后文的垂直盒子). 外表看上去,\mbox
的内容与正常的文本无二,不过断行时文字不会从盒子里断开.
\makebox
更进一步,可以加上可选参数用于控制盒子的宽度 ⟨width⟩
,以及内容的对齐方式 ⟨align⟩
,可选居中 c
(默认值)、左对齐 l
、右对齐 r
和分散对齐 s
.
|\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.}|
3.8.2 带框的水平盒子
\fbox
和 \framebox
让我们可以为水平盒子添加边框. 使用的语法与 \mbox
和 \makebox
一模一样:
\fbox{…}
\framebox[⟨width⟩][⟨align⟩]{…}
可以通过 \setlength
命令调节边框的宽度 \fboxrule
和内边距 \fboxsep
:
\framebox[10em][r]{Test box}\\[1ex]
\setlength{\fboxrule}{1.6pt}
\setlength{\fboxsep}{1em}
\framebox[10em][r]{Test box}
3.8.3 垂直盒子
如果需要排版一个文字可以换行的盒子,LaTeX\LaTeXLATEX 提供了两种方式:
\parbox[⟨align⟩][⟨height⟩][⟨inner-align⟩]{⟨width⟩}{…}
\begin{minipage}[⟨align⟩][⟨height⟩][⟨inner-align⟩]{⟨width⟩}
…
\end{minipage}
其中⟨align⟩
为盒子和周围文字的对齐情况(类似 tabular
环境);⟨height⟩
和 ⟨inner-align⟩
设置盒子的高度和内容的对齐方式,类似水平盒子\makebox
的设置,不过⟨inner-align⟩
接受的参数是顶部 t
、底部 b
、居中 c
和分散对齐 s
.
三字经:\parbox[t]{3em}%
{人之初性本善性相近习相远}
\quad
千字文:
\begin{minipage}[b][8ex][t]{4em}
天地玄黄宇宙洪荒
\end{minipage}
3.8.4 标尺盒子
\rule
命令用来画一个实心的矩形盒子,也可适当调整以用来画线(标尺):
\rule[⟨raise⟩]{⟨width⟩}{⟨height⟩}
例如:
Black \rule{12pt}{4pt} box. \\ \\
Upper \rule[4pt]{6pt}{8pt} and
lower \rule[-4pt]{6pt}{8pt} box. \\ \\
A \rule[-.4pt]{3em}{.4pt} line.
3.9 浮动体
内容丰富的文章或者书籍往往包含许多图片和表格等内容,这些内容的尺寸往往太大,导致分页困难. LaTeX\LaTeXLATEX 为此引入了浮动体的机制,令大块的内容可以脱离上下文,放置在合适的位置.
LaTeX\LaTeXLATEX 预定义了两类浮动体环境 figure
和 table
。习惯上 figure
里放图片,table
里放表格,但并没有严格限制,可以在任何一个浮动体里放置文字、公式、表格、图片等等任意内容.
以 table
环境的用法举例,figure
同理:
\begin{table}[⟨placement⟩]
…
\end{table}
⟨placement⟩
参数提供了一些符号用来表示浮动体允许排版的位置,如hbp
允许浮动体排版在当前位置、底部或者单独成页.table
和figure
浮动体的默认设置为tbp
.
- 排版位置的选取与参数里符号的顺序无关,LaTeX\LaTeXLATEX 总是以 h-t-b-p 的优先级顺序决定浮动体位置,也就是说
[!htp]
和[ph!t]
没有区别- 限制包括浮动体个数(除单独成页外,默认每页不超过 3 个浮动体,其中顶部不超过 2 个,底部不超过 1 个)以及浮动体空间占页面的百分比(默认顶部不超过 70%,底部不超过 30%)
双栏排版环境下,LaTeX\LaTeXLATEX 提供了 table*
和 figure*
环境用来排版跨栏的浮动体. 它们的用法与 table
和 figure
一样,不同之处为双栏的⟨placement⟩
参数只能用 tp
两个位置.
浮动体的位置选取受到先后顺序的限制. 如果某个浮动体由于参数限制、空间限制等原因在当前页无法放置,就要推迟到之后处理,并使得之后的同类浮动体一并推迟. \clearpage
命令会在另起一页之前,先将所有推迟处理的浮动体排版成页,此时 htbp
等位置限制被完全忽略.
float
宏包为浮动体提供了 H
位置参数,不与 htbp
及 !
混用. 使用 H
位置参数时,会取消浮动机制,将浮动体视为一般的盒子插入当前位置. 这在一些特殊情况下很有用(如使用 multicol
宏包排版分栏内容的时候),但尺寸过大的浮动体可能使得分页比较困难.
3.9.1 浮动体的标题
图表等浮动体提供了 \caption
命令加标题,并且自动给浮动体编号:
\caption{…}
\caption
的用法非常类似于 \section
等命令,可以用带星号的命令 \caption*
生成不带编号的标题,也可以使用带可选参数的形式 \caption[…]{…}
,使得在目录里使用短标题. \caption
命令之后还可以紧跟 \label
命令标记交叉引用.
\caption
生成的标题形如 “Figure 1: …”(figure
环境)或 “Table 1: …”(table
环境). 可通过修改 \figurename
和 \tablename
的内容来修改标题的前缀. 标题样式的
定制功能由 caption
宏包提供.
table
和 figure
两种浮动体分别有各自的生成目录的命令:
\listoftables
\listoffigures
它们类似
\tableofcontents
生成单独的章节
3.9.2 并排和子图表
我们时常有在一个浮动体里面放置多张图的用法. 最简单的用法就是直接并排放置,也可以通过分段或者换行命令 \\
排版多行多列的图片,以下为示意代码:
\begin{figure}[htbp]\centering\includegraphics[width=...]{...}\qquad\includegraphics[width=...]{...} \\[..pt]\includegraphics[width=...]{...}\caption{...}
\end{figure}
示意图大致如下:
由于标题是横跨一行的,用 \caption
命令为每个图片单独生成标题就需要借助前文提到的 \parbox
或者 minipage
环境,将标题限制在盒子内.
\begin{figure}[htbp]\centering\begin{minipage}{...}\centering\includegraphics[width=...]{...}\caption{...}\end{minipage}\qquad\begin{minipage}{...}\centering\includegraphics[width=...]{...}\caption{...}\end{minipage}
\end{figure}
示意图如下:
当我们需要更进一步,给每个图片定义小标题时,就要用到 subfig
宏包的功能了. 这里仅举一例:
\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}