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
正文部分,页码使用阿拉伯数字,从 1 11 开始计数,其后的章节编号正常\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}
\hline
italic & 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}}
\hline
pos & \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|}}
\hline
A & B & C & D \\ \hline
a & b & c & d \\ \hline
\end{tabularx}
3.6.3 横线
我们已经在之前的例子见过许多次绘制表格线的 \hline
命令. 另外\cline{⟨i⟩-⟨j⟩}
用来绘制跨越部分单元格的横线:
\begin{tabular}{|c|c|c|}
\hline
4 & 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 \\
\midrule
Alphabet & 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|}
\hline
1 & 2 & Center \\ \hline
\multicolumn{2}{|c|}{3} &
\multicolumn{1}{r|}{Right} \\ \hline
4 & \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 \\ \hline
A & 1 & 2 \\ \hline
\end{tabular}
3.6.5 行距控制
LaTeX \LaTeXLATEX 生成的表格看起来通常比较紧凑,修改参数 \arraystretch
可以得到行距更加宽松的表格:
\renewcommand\arraystretch{1.8}
\begin{tabular}{|c|}
\hline
Really loose \\ \hline
tabular 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}