\documentclass{article} %指定文档使用的文档类
%导言区一般会使用\usepackage 调用宏包,以及会进行对文档的全局设置。
\begin{document} %document 环境当中的内容是文档正文
``Hello world!'' from \LaTeX.
\end{document}
LaTeX 中命令以反斜线\ 开头,字母形式的LATEX 命令忽略其后的所有连续空格。如果要人为引入空格,需要在命令后面加一对花括号阻止其忽略空格, 比如\Tex
和\TeX{}
LATEX 中还包括环境,用以令一些效果在局部生效,或是生成特殊的文档元素。LATEX 环境的用法为一对命令\begin 和\end
1.文档类
\documentclass[⟨options⟩]{⟨class-name⟩}
其中⟨class-name⟩
为文档类的名称,如LaTeX 提供的article
, book
, report
,在其基础上派生的一些文档类如支持中文排版的ctexart
/ ctexbook
/ ctexrep
,或者有其它功能的一些文档类,如moderncv
/ beamer
等。
可选参数⟨options⟩
为文档类指定选项,以全局地规定一些排版的参数,如字号、纸张大小、单双面等等。比如调用article 文档类排版文章,指定纸张为A4 大小,基本字号为11pt,双面排版:\documentclass[11pt,twoside,a4paper]{article}
10pt
, 11pt
, 12pt
指定文档的基本字号。默认为10pt
。
a4paper
, letterpaper
, … 指定纸张大小,默认为美式信纸letterpaper ($8:5\times 11$ 英寸)。可指定选项还包括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。
2. 宏包
\usepackage[⟨options⟩]{⟨package-name⟩}
\usepackage
可以一次性调用多个宏包,在⟨package-name⟩
中用逗号隔开。这种用法一般不要指定选项:
宏包(包括前面所说的文档类)可能定义了许多命令和环境,或者修改了LATEX 已有的命令和环境。它们的用法说明记在相应宏包和文档类的帮助文档。在Windows 命令提示符或者Linux 终端下输入命令可查阅相应文档:texdoc ⟨pkg-name⟩
3. LaTeX用到的文件
.sty 宏包文件。宏包的名称与文件名一致。
.cls 文档类文件。文档类名称与文件名一致。
.bib BIBTEX 参考文献数据库文件。
.bst BIBTEX 用到的参考文献格式模板。
辅助文件和日志
.log 排版引擎生成的日志文件,供排查错误使用。
.aux LATEX 生成的主辅助文件,记录交叉引用、目录、参考文献的引用等。
.toc LATEX 生成的目录记录文件。
.lof LATEX 生成的图片目录记录文件。
.lot LATEX 生成的表格目录记录文件。
.bbl BIBTEX 生成的参考文献记录文件。
.blg BIBTEX 生成的日志文件。
.idx LATEX 生成的供makeindex 处理的索引记录文件。
.ind makeindex 处理.idx 生成的用于排版的格式化索引文件。
.ilg makeindex 生成的日志文件。
.out hyperref 宏包生成的PDF 书签记录文件。
4.文件的组织方式
LaTeX 提供了命令\include
用来在源代码里插入文件:
\include{⟨filename⟩}
5 .只编译排查错误, 不生成文件
介绍一个实用的工具宏包syntonly。加载这个宏包后,在导言区使用\syntaxonly
命令,可令LATEX 编译后不生成DVI 或者PDF 文档,只排查错误,编译速度会快不少:
\usepackage{syntonly}
\syntaxonly
如果想生成文档,则用% 注释掉\syntaxonly
命令即可。
6.澄清几个概念
引擎 全称为排版引擎,是编译源代码并生成文档的程序,如pdfTeX、XeTeX 等。有时也称为编译器。
格式 是定义了一组命令的代码集。LaTeX 就是最广泛应用的一个格式,高德纳本人还编写了一个简单的plain TeX 格式,没有定义诸如\documentclass 和\section 等等命令。
编译命令 是实际调用的、结合了引擎和格式的命令。如xelatex 命令是结合XeTeX 引擎和LaTeX 格式的一个编译命令。
TEX 引擎、格式及其对应的编译命令
**latex **虽然名为latex 命令,底层调用的引擎其实是pdfTEX。该命令生成dvi(Device Independent格式的文档,用dvipdfmx 命令可以将其转为pdf。
**pdflatex **底层调用的引擎也是pdfTeX,可以直接生成pdf 格式的文档。
xelatex 底层调用的引擎是XeTeX,支持UTF-8 编码和TrueType / OpenType 字体。当前较为方便的中文排版解决方案基于xelatex。
**lualatex **底层调用的引擎是LuaTEX,这个引擎在pdfTEX 引擎基础上发展而来,除了支持UTF-8 编码和TrueType / OpenType 字体外,还支持通过Lua 语言扩展TEX 的功能。lualatex 编译命令下的中文排版支持需要借助luatex-ja 宏包。
ASCII 编码 每个字节为八位(8-bit)
扩展编码 在ASCII 之后,各种语言文字都发展了自己的编码,比如西欧语言的Latin-1,日本的Shift-
JIS,中国大陆的GB2312-80 和GBK 等
UTF-8 编码 Unicode 是一个多国字符的集合,覆盖了几乎全球范围内的语言文字。UTF-8 是Unicode
的一套编码方案,一个字符可以由一个到四个字节编码,其中单字节字符兼容ASCII 编码。
latex 命令及pdflatex 命令下可以使用inputenc
宏包支持UTF-8 编码:\usepackage[utf8]{inputenc}
xelatex 和lualatex 命令原生支持UTF-8 编码将.tex源代码保存为UTF-8 编码,并借助fontspec
宏包调用适当的字体,就可以在源代码中输入任意语言的文字
ctex
宏包和文档类, ctex
宏包和文档类是对CJK
和xeCJK
等宏包的进一步封装。ctex
文档类包括ctexart
/
ctexrep
/ ctexbook
,是对LaTeX 的三个标准文档类的封装
\documentclass{ctexart}
\begin{document}
中文\LaTeX{}排版。
\end{document}
特殊字符 # $ % & { } _ ^ ~ \
这些字符在LaTeX 里有特殊用途, 如果想要输入以上符号,需要使用以下带反斜线的形式输入:\# \$ \% \& \{ \} \_ \^ \^{} \~{} \textbackslash
反斜杠 \\
被直接定义成了手动换行的命令,输入反斜杠就只好用\textbackslash
。
连字 西文排版中经常会出现连字(Ligatures),常见的有ff / fi / fl / ffi / ffl
。
It's difficult to find \ldots .\\
It's dif{}f{}icult to f{}ind \ldots .
标点符号 中文的标点符号(绝大多数为非ASCII 字符)使用中文输入法输入即可,一般不需要过多留意。而在英文标点符号上,有许多需要留意的地方。
引号LaTeX 的单引号‘ ’
用 和‘ 输入;双引号
“ ” 用
` 和’’ 输入
连字号和破折号连字号(hyphen)、短破折号(en-dash)和长破折号(em-dash)。它们分别有不同的用途:连字号- 用来组成复合词;短破折号– 用来连接数字表示范围;长破折号— 用来连接单词,与中文语境中的破折号用法类似。
下划线,一个单词的话\underline{underlined}
, 多个单词或需要换行的话用ulem
宏包的\uline
命令。
斜体,\emph
命令用来将文字变为斜体以示强调。如果在本身已经用\emph 命令强调的文字内部嵌套使用\emph
命令,内部则使用直立体文字
5.断行和断页
单词间距和断行, 断行的位置尽可能选取在两个单词之间,也就是用户在源文件中输入的“空格”, 我们可以使用字符~
在合适的位置插入一个不会断行的空格(高德纳称之为tie,“带子”),通常用在英文人名、图表名称等场景
手动断行和断页
\\[⟨length⟩]
\newline
\\
可以带可选参数⟨length⟩,用于在换行处向下增加垂直间距, 而\newline
不带可选参数
\\
也在表格、公式等地方用于分行,而\newline
只用于文本段落中。
\newpage
\clearpage
在双栏排版中\newpage
只起到另起一栏的作用
涉及到浮动体的排版上行为不同
\linebreak[⟨n⟩] \nolinebreak[⟨n⟩]
\pagebreak[⟨n⟩] \nopagebreak[⟨n⟩]
以上命令都带一个可选参数,用数字⟨n⟩
代表适合/不适合的程度,取值范围为0-4,不带
可选参数时,缺省为4。比如\linebreak[3]
意味着此处在断行时优先考虑;\nopagebreak
或
\nopagebreak[4]
意味着禁止在此处断页。以上命令适合给出优先考虑断行断页/禁止断行断页的位置,但不适合直接拿来断行或断页,使用\newline 或\newpage 等是更好的选择>
断词 对于绝大部分单词,LaTeX 能够找到合适的断词位置,在断开的行尾加上连字符-
。如果一些单词没能自动断词,我们可以在单词内手动使用\-
命令指定断词的位置
三、文档元素
1. 章节和目录
1.1 章节标题
\chapter{⟨title⟩} \section{⟨title⟩} \subsection{⟨title⟩}
\subsubsection{⟨title⟩} \paragraph{⟨title⟩} \subparagraph{⟨title⟩}
\chapter
只在book 和report 文档类有定义
\part 命令
,用来将整个文档分割为大的分块,但不影响\chapter
或 \section
等的编号。
带可选参数的变体:\section[⟨short title⟩]{⟨title⟩}
标题使用⟨title⟩
参数,在目录和页眉页脚中使用⟨short title⟩
参数;
带星号的变体:\section*{⟨title⟩}
标题不带编号,也不生成目录项和页眉页脚。
article 文档类默认带编号的层级为\section / \subsection / \subsubsection
三级;
report/book 文档类默认带编号的层级为\chapter / \section / \subsection
三级
标准文档类并未提供为\section 等章节命令定制格式的功能,这一功能由titlesec
宏包提供
1.2 目录
\tableofcontents
\tableofcontents
生成的章节默认不写入目录(\section*
或\chapter*
),可使用tocbibind
等宏包修改设置。
正确生成目录项,一般需要编译两次源代码。
有时我们使用了\chapter* 或\section* 这样不生成目录项的章节标题命令,而又想手动生成该章节的目录项,可以在标题命令后面使用\addcontentsline{toc}{⟨level⟩}{⟨title⟩}
titletoc
、tocloft
等宏包提供了具体定制目录项格式的功能
1.3 文档结构的划分
\appendix
命令将正文和附录分开,使用\appendix
后,最高一级章节改为使用拉丁字母编号,从A 开始。
\frontmatter
前言部分,页码为小写罗马字母格式;其后的\chapter
不编号。
\mainmatter
正文部分,页码为阿拉伯数字格式,从1 开始计数;其后的章节编号正常。
\backmatter
后记部分,页码格式不变,继续正常计数;其后的\chapter
不编号。
book 文档类的文档结构示例。
\documentclass[...]{book}
% 导言区,加载宏包和各项设置,包括参考文献、索引等
\usepackage{...}
\usepackage{makeidx}
\makeindex
\bibliographystyle{...}
\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{...} % 利用BibTeX 工具生成参考文献
\printindex % 利用makeindex 工具生成索引
\end{document}
\title{Test title}
\author{ Mary\thanks{E-mail:*****@***.com}
\and Ted\thanks{Corresponding author}
\and Louis}
\date{\today}
article 文档类的标题默认不单独成页,而report 和book 默认单独成页。可在\documentclass 命令调用文档类时指定titlepage / notitlepage 选项以修改默认的行为。
3. 交叉引用
在能够被交叉引用的地方,如章节、公式、图表、定理等位置使用\label
命令:
\label{⟨label-name⟩}
之后可以在别处使用\ref
或\pageref
命令,分别生成交叉引用的编号和页码
\ref{⟨label-name⟩} \pageref{⟨label-name⟩}
为了生成正确的交叉引用,一般也需要多次编译源代码。
\labe
l 命令可用于记录各种类型的交叉引用,使用位置分别为:
章节标题 在章节标题命令\section 等之后紧接着使用。
行间公式 单行公式在公式内任意位置使用;多行公式在每一行公式的任意位置使用。
有序列表 在enumerate 环境的每个\item 命令之后、下一个\item 命令之前任意位置使用。
图表标题 在图表标题命令\caption 之后紧接着使用。
定理环境 在定理环境内部任意位置使用。
在使用不记编号的命令形式(\section*
、\caption*
、带可选参数的\item
命令等)时不
要使用\label
命令,否则生成的引用编号不正确。
4. 脚注和边注
使用\footnote
命令可以在页面底部生成一个脚注:
\footnote{⟨footnote⟩}
有些情况下(比如在表格环境、各种盒子内)使用\footnote 并不能正确生成脚注。我们可以分两步进行,先使用\footnotemark
为脚注计数,再在合适的位置用\footnotetext
生成脚注。比如:
使用\marginpar
命令可在边栏位置生成边注:
\marginpar[⟨left-margin⟩]{⟨right-margin⟩}
如果只给定了⟨right-margin⟩,那么边注在奇偶数页文字相同;如果同时给定了⟨left-margin⟩,则偶数页使用⟨left-margin⟩ 的文字。
\marginpar{\footnotesize 边注较窄,不要写过多文字,最好设置较小的字号。}
5. 特殊环境
5.1 列表
了基本的有序和无序列表环境enumerate
和itemize
,两者的用法很类似,都用\item
标明每个列表项。enumerate
环境会自动对列表项编号。
\begin{enumerate}
\item …
\end{enumerate}
\renewcommand{\labelitemi}{\ddag}
\renewcommand{\labelitemii}{\dag}
\begin{itemize}
\item First item
\begin{itemize}
\item Subitem
\item Subitem
\end{itemize}
\item Second item
\end{itemize}
默认的列表间距比较宽,LaTeX 本身也未提供方便的定制功能,可用enumitem
宏包定制各
种列表间距。enumitem
宏包还提供了对列表标签、引用等的定制。有兴趣的读者可参考其帮助
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 环境。
5.3 引用环境
quote
用于引用较短的文字,首行不缩进;quotation
用于引用若干段文字,首行缩进。
引用环境较一般文字有额外的左右缩进。
verse
用于排版诗歌,与quotation
恰好相反,verse
是首行悬挂缩进的。
5.4 代码环境
代码环境verbatim
,它以等宽字体排版代码,回车和空格也分别起到换行和空位的作用;带星号的版本更进一步将空格显示成␣。
要排版简短的代码或关键字,可使用\verb
命令:
\verb⟨delim⟩⟨code⟩⟨delim⟩
\verb
命令对符号的处理比较复杂,一般不能用在其它命令的参数里,否则多半会出错。
verbatim
宏包优化了verbatim 环境的内部命令,并提供了\verbatiminput
命令用来直接
读入文件生成代码环境。fancyvrb
宏包提供了可定制格式的Verbatim 环境;listings
宏包更进一
步,可生成关键字高亮的代码环境,支持各种程序设计语言的语法和关键字。详情请参考各自的
帮助文档。
6. 表格
\begin{tabular}{⟨column-spec⟩}
⟨item1⟩ & ⟨item2⟩ & … \\
\hline
⟨item1⟩ & ⟨item2⟩ & … \\
\end{tabular}
⟨column-spec⟩
是列格式标记,在接下来的内容将仔细介绍;&
用来分隔单元格;\\
用来换行;\hline
用来在行与行之间绘制横线。
直接使用tabular 环境的话,会和周围的文字混排, 通常情况下我们不这么用,tabular 环境一般会放置在table 浮动体环境中,并用\caption
命令加标题。
array
宏包提供了辅助格式> 和<,用于给列格式前后加上修饰命令
\begin{tabular}{>{\itshape}r<{*}l}%示例将某行意大利斜体。并在后面加上*号
\begin{tabular}{>{\centering\arraybackslash}p{9em}} %示例在p环境中居中对齐
array
宏包还提供了类似p
格式的m
格式和b
格式,三者分别在垂直方向上靠顶端对齐、居
中以及底端对齐。
%示例代码
\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}
在科技论文排版中广泛应用的表格形式是三线表,形式干净简明。三线表由booktabs
宏包
支持,它提供了\toprule
、\midrule
和\bottomrule
命令用以排版三线表的三条线,以及和
\cline
对应的\cmidrule
。除此之外,最好不要用其它横线以及竖线
%示例代码
\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}
⟨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}
如果不需要为“拆分的单元格”画线,并且只在垂直方向“拆分”的话,makecell
宏包提供的\makecell
命令是一个简单的解决方案:
\begin{tabular}{|c|c|}
\hline
a & \makecell{d1 \\ d2} \\
\hline
b & c \\
\hline
\end{tabular}
另外graphicx 宏包还提供了\graphicspath 命令,用于声明一个或多个图片文件存放的目录,使用这些目录里的图片时可不用写路径:
% 假设主要的图片放在figures 子目录下,标志放在logo 子目录下
\graphicspath{ {figures/} {logo/} }
\includegraphics 命令的可选参数⟨options⟩ 支持⟨key⟩=⟨value⟩ 形式赋值
8. 盒子
盒子是LATEX 排版的基础单元,虽然解释上去有些抽象:每一行是一个盒子,里面的文字从左到右依次排列;每一页也是一个盒子,各行文字从上到下依次排布……颇有一些活字印刷术的味道。不管如何,LATEX 提供了一些命令让我们生成一些有特定用途的盒子。
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.}|
\framebox[10em][r]{Test box}\\[1ex]
\setlength{\fboxrule}{1.6pt}
\setlength{\fboxsep}{1em}
\framebox[10em][r]{Test box}
8.3 垂直盒子
\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}
如果在minipage 里使用\footnote 命令,生成的脚注会出现在盒子底部,编号是独立的,并且使用小写字母编号。而在\parbox 里无法正常使用\footnote 命令,只能在盒子里使用\footnotemark,在盒子外使用\footnotetext。
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.
9. 浮动体
LaTeX 预定义了两类浮动体环境figure 和table,令大块的内容可以脱离上下文,放置在合适的位置。
\begin{table}[⟨placement⟩]
\end{table}
⟨placement⟩
参数提供了一些符号用来表示浮动体允许排版的位置,如hbp
允许浮动体排版在当前位置、底部或者单独成页。table
和figure
浮动体的默认设置为tbp
。
排版位置的选取与参数里符号的顺序无关,LATEX 总是以h-t-b-p 的优先级顺序决定浮动体位置。也就是说[!htp] 和[ph!t] 没有区别
限制包括浮动体个数(除单独成页外,默认每页不超过3 个浮动体,其中顶部不超过2 个,底部不超过1 个)以及浮动体空间占页面的百分比(默认顶部不超过70%,底部不超过30%)
双栏排版环境下,LATEX 提供了table*
和figure*
环境用来排版跨栏的浮动体, 用法与table
和figure
一样,不同之处为双栏的⟨placement⟩
参数只能用tp 两个位置。
\clearpage
命令会在另起一页之前,先将所有推迟处理的浮动体排版成页,此时htbp 等位置限制被完全忽略。
float
宏包为浮动体提供了H
位置参数,不与htbp 及! 混用。使用H
位置参数时,会取消浮动机制,将浮动体视为一般的盒子插入当前位置。这在一些特殊情况下很有用(如使用multicol宏包排版分栏内容的时候),但尺寸过大的浮动体可能使得分页比较困难。
9.1 浮动体的标题
图表等浮动体提供了\caption 命令加标题,并且自动给浮动体编号
\caption{…}%带编号
\caption*{…}%不带编号
\caption[…]{…}%在目录里使用短标题
\caption
命令之后还可以紧跟\label
命令标记交叉引用。
\caption
生成的标题形如“Figure 1: …”(figure 环境)或“Table 1: …”(table 环境)。可通过修改\figurename
和\tablename
的内容来修改标题的前缀。标题样式的定制功能由caption
宏包提供,
table 和figure 两种浮动体分别有各自的生成目录的命令:\listoftables
和\listoffigures
它们类似\tableofcontents 生成单独的章节。
9.2 并排和子图表
%一个标题
\begin{figure}[htbp]
\centering
\includegraphics[width=...]{...}
\qquad
\includegraphics[width=...]{...} \\[..pt]
\includegraphics[width=...]{...}
\caption{...}
\end{figure}
%多个标题
\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}
四、排版数学公式
1. AMS宏集
AMS 宏集合是美国数学学会(AmericanMathematical Society) 提供的对LaTeX 原生的数学公式排版的扩展,其核心是amsmath
宏包,对多行公式的排版提供了有力的支持。此外,amsfonts
宏包以及基于它的amssymb
宏包提供了丰富的数学符号;amsthm
宏包扩展了LATEX 定理证明格式。
2.公式排版基础
行内公式由一对$
符号包裹
单独成行的行间公式在LaTeX 里由equation
环境包裹, equation
环境为公式自动生成一个编号,这个编号可以用\label 和\ref 生成交叉引用。
amsmath
的\eqref
命令甚至为引用自动加上圆括号;还可以用\tag
命令手动修改公式的编号,或者用\notag
命令取消为公式编号(与之基本等效的命令是\nonumber)。
需要直接使用不带编号的行间公式,则将公式用命令\[
和\]
包裹1,与之等效的是displaymath
环境。有的人更喜欢equation*
环境.
行间公式的对齐、编号位置等性质由文档类选项控制,文档类的fleqn 选项令行间公式左对齐;leqno 选项令编号放在公式左边。
数学模式中输入的空格被忽略。数学符号的间距默认由符号的性质(关系符号、运算符等)决定。需要人为引入间距时,使用\quad
和\qquad
等命令。
不允许有空行(分段)。行间公式中也无法用\\
命令手动换行。
所有的字母被当作数学公式中的变量处理,字母间距与文本模式不一致,也无法生成单词之间的空格。如果想在数学公式中输入正体的文本,简单情况下可用\mathrm
命令。或者用amsmath
提供的\text
命令.
一般符号 $\alpha$(\alpha)、$\beta$ (\beta) 、$\Gamma$ (\Gamma)、$\Delta$ (\Delta) 、$\infty$ (\infty),$\dots$ (\dots) 、$\cdots$ (\cdots)、$\vdots$(\vdots)、$\ddots$(\ddots)
\ldots 和\dots 是完全等效的,它们既能用在公式中,也用来在文本里作为省略号
指数、上下标和导数
用^
和_
标明上下标。注意上下标的内容(子公式)一般需要用花括号包裹,否则上下标只对后面的一个符号起作用。
导数符号’(′
) 是一类特殊的上标
分式和根式
分式使用\frac{分子}{分母}
来书写
amsmath 提供了方便的命令\dfrac
和\tfrac
,令用户能够在行内使用正常大小的分式,或是反过来。
一般的根式使用\sqrt{...}
;表示n 次方根时写成\sqrt[n]{...}
。
特殊的分式形式,如二项式结构,由amsmath
宏包的\binom
命令生成:$\binom{n}{k} =\binom{n-1}{k}-\binom{n-1}{k-1}$
直接输入的=,>,<
不等号$\ne$ (\ne
)、大于等于号$\ge$ (\ge
) 和小于等于号$\le$ (\le
)、约等号$\approx$ (\approx
)、等价$\equiv$(\equiv
)、正比$\propto$ (\propto
)、相似$\sim$(\sim
) 等等
自定义二元关系符的命令\stackrel
,用于将一个符号叠加在原有的二元关系符之上:$f_n(x) \stackrel{*}{\approx} 1$
+、-、*、=
直接键盘输入
乘号$\times$ (\times
)、除号$\div$ (\div
)、点乘$\cdot$(\cdot
)、加减号$\pm$(\pm
) / $\mp$ (\mp
)
$\nabla$ (\nabla
) 、$\partial$ (\partial
)
算符的函数名称一览。
amsmath 允许用户用\DeclareMathOperator
定义自己的算符,其中带星号的命令定义带上下限的算符:
\DeclareMathOperator{\argh}{argh}
\DeclareMathOperator*{\nut}{Nut}
巨算符的上下标位置可由\limits
和\nolimits
控制,前者令巨算符类似lim
或求和算符$\sum$,上下标位于上下方;后者令巨算符类似积分号,上下标位于右上方和右下方。$\sum \limits_{x=1}^n$、$\sum \nolimits_{x=1}^n$
amsmath 宏包还提供了\substack
,能够在下限位置书写多行表达式;subarray
环境更进
一步,令多行表达式可选择居中(c) 或左对齐(l):
%示例代码
\sum_{\substack{0\le i\le n \\
j\in \mathbb{R}}}
P(i,j) = Q(n)
\sum_{\begin{subarray}{l}
0\le i\le n \\
j\in \mathbb{R}
\end{subarray}}
P(i,j) = Q(n)
$\dot{r}$(\dot{r}
)、$\ddot{r}$ (\ddot{r}
)、$\vec{r}$ (\vec{r}
) 、$\hat{\mathbf{e}}$ (\hat{\mathbf{e}}
)
使用时要注意重音符号的作用区域,一般应当对某个符号而不是“符号加下标”使用重音
包括直接画线的\overline
和\underline
命令,宽重音符号\widehat
、表示向量的箭头\overrightarrow
等
\overbrace
和\underbrace
命令用来生成上/下括号,各自可带一个上/下标公式。
$\rightarrow$ \rightarrow
(或\to
)、$\leftarrow$ \leftarrow( 或\gets)
amsmath 的\xleftarrow
和\xrightarrow
命令提供了长度可以伸展的箭头,并且可以为
箭头增加上下标:$c\xrightarrow[x<y]{abc}d $ ( c\xrightarrow[x<y]{a*b*c}d
)
括号和定界符
小括号()、中括号[]、大括号{}(\{\}
)、尖括号⟨⟩ (\langle \rangle
)
\left
和\right
命令可令括号(定界符)的大小可变,在行间公式中常用。
\left
和\right
必须成对使用。需要使用单个定界符时,另一个定界符写成\left.
或\right.
我们还可以用\big
、\Big
、\bigg
、\Bigg
等命令生成固定大小的定界符。更常用的形式是类似\left
的\bigl
、\biggl
等,以及类似\right
的\bigr
、\biggr
等(\bigl
和\big
r 不必成对出现)。
用\left
和\right
分界符包裹的公式块是不允许断行的,也不允许在多行公式里跨行使用 ,而\big
和\bigg
等命令不受限制。
amsmath
宏包的multline
环境提供了书写折行长公式的方便环境。它允许用\\
折行,将公式编号放在最后一行。多行公式的首行左对齐,末行右对齐,其余行居中。
\begin{multline}
a + b + c + d + e + f
+ g + h + i \\
= j + k + l + m + n\\
= o + p + q + r + s\\
= t + u + v + x + z
\end{multline}
multline*
环境排版不带编号的折行长公式。
5. 数组和矩阵
为了排版二维数组,LATEX 提供了array
环境,用法与tabular
环境极为类似,也需要定义列格式,并用\\
换行。数组可作为一个公式块,在外套用\left
、\right
等定界符:
amsmath
提供的cases
环境比array
环境更轻松地完成下面的效果。
%使用array
\[ |x| = \left\{
\begin{array}{rl}
-x & \text{if } x < 0,\\
0 & \text{if } x = 0,\\
x & \text{if } x > 0.
\end{array} \right. \]
%使用case
\[ |x| =
\begin{cases}
-x & \text{if } x < 0,\\
0 & \text{if } x = 0,\\
x & \text{if } x > 0.
\end{cases} \]
amsmath 宏包还直接提供了多种排版矩阵的环境,包括不带定界符的matrix
,以及带各种定界符的矩阵pmatrix
(()、bmatrix
([)、Bmatrix
({)、vmatrix
($
$)、Vmatrix
($|$)
\begin{bmatrix}
x_{11} & x_{12} & \ldots & x_{1n}\\
x_{21} & x_{22} & \ldots & x_{2n}\\
\vdots & \vdots & \ddots & \vdots\\
x_{n1} & x_{n2} & \ldots & x_{nn}\\
\end{bmatrix}
注意微元里的d 用的是直立体:$\int_a^b f(x)\mathrm{d}x \qquad
\int_a^b f(x)\,\mathrm{d}x$( \int_a^b f(x)\mathrm{d}x \qquad
\int_a^b f(x)\,\mathrm{d}x
)
amsmath
提供二重积分\iint
、三重积分\iiint
等
7. 数学符号的字体控制
数学字母字体 $\mathcal{R} \quad \mathfrak{R} \quad \mathbb{R}$ (\mathcal{R} \quad \mathfrak{R} \quad \mathbb{R}
)
{\sum_{i=1}^n (x_i- x)(y_i- y)}
{\displaystyle \left[
\sum_{i=1}^n (x_i-x)^2
\sum_{i=1}^n (y_i-y)^2
\right]^{1/2} }
⟨theorem environment⟩
为定理环境的名称。原始的LaTeX 里没有现成的定理环境,不加定义而直接使用很可能会出错。⟨title⟩
是定理环境的标题(“定理”,“公理”等)。
⟨section level⟩
为章节级别,如chapter、section 等,定理序号成为章节的下一级序号;
⟨counter⟩
为用\newcounter 自定义的计数器名称,定理序号由这个计数器管理。
%示例代码
\newtheorem{mythm}{My Theorem}[section]
\begin{mythm}\label{thm:light}
The light speed in vacuum
is $299,792,458\,\mathrm{m/s}$.
\end{mythm}
\begin{mythm}[Energy-momentum relation]
The relationship of energy,
momentum and mass is
\[E^2 = m_0^2 c^4 + p^2 c^2\]
where $c$ is the light speed
described in theorem \ref{thm:light}.
\end{mythm}
默认的定理环境格式为粗体标签、斜体正文、定理名用小括号包裹,如果需要修改格式,则要依赖其它的宏包,如amsthm、ntheorem 等等。
amsthm 提供了\theoremstyle
命令支持定理格式的切换,在用\newtheorem
命令定义定理环境之前使用。amsthm
预定义了三种格式用于\theoremstyle
:plain
和LaTeX 原始的格式一致;definition
使用粗体标签、正体内容;remark
使用斜体标签、正体内容。
%定义的jury 环境与law 环境共用编号,mar 环境不编号:
\theoremstyle{definition} \newtheorem{law}{Law}
\theoremstyle{plain} \newtheorem{jury}[law]{Jury}
\theoremstyle{remark} \newtheorem*{mar}{Margaret}
amsthm 还支持使用\newtheoremstyle 命令自定义定理格式,更为方便使用的是ntheorem
宏包。感兴趣的读者可参阅它们的帮助文档。
amsthm 还提供了一个proof 环境用于排版定理的证明过程。proof 环境末尾自动加上一个证毕符号
如果行末是一个不带编号的公式, 符号会另起一行,这时可使用\qedhere
命令将符号放在公式末尾:
证毕符号本身被定义在命令\qedsymbol
中,如果有使用实心符号作为证毕符号的需求,需要自行用\renewcommand
命令修改
%示例代码
\renewcommand{\qedsymbol}{\rule{1ex}{1.5ex}}
\begin{proof}
For simplicity, we use
E=mc^2 \qedhere
\end{proof}
\setmainfont[⟨font features⟩]{⟨font name⟩}
\setsansfont[⟨font features⟩]{⟨font name⟩}
\setmonofont[⟨font features⟩]{⟨font name⟩}
⟨font name⟩
使用字体的文件名(带扩展名)或者字体的英文名称。⟨font features⟩
用来手动配置对应的粗体或斜体,比如为Windows 下的无衬线字体Arial 配置粗体和斜体
\setsansfont[BoldFont={Arial Bold}, ItalicFont={Arial Italic}]{Arial}
\setCJKmainfont[⟨font features⟩]{⟨font name⟩}
\setCJKsansfont[⟨font features⟩]{⟨font name⟩}
\setCJKmonofont[⟨font features⟩]{⟨font name⟩}
LaTeX 预定义了大量的长度变量用于控制版面格式。如页面宽度和高度、首行缩进、段落间距等。如果需要自定义长度变量,需使用\newlength
命令,长度变量可以用\setlength
赋值,或用\addtolength
增加长度:
\newlength{\⟨length command⟩}
\setlength{\⟨length command⟩}{⟨length⟩}
\addtolength{\⟨length command⟩}{⟨length⟩}
{\linespread{2.0}\selectfont
The baseline skip is set to be
twice the normal baseline skip.
Pay attention to the \verb|\par|
command at the end. \par}
字号的改变是即时生效的,而行距的改变直到文字分段时才生效。
2.3 段落格式
以下长度分别为段落的左缩进、右缩进和首行缩进:
\setlength{\leftskip}{⟨length⟩}
\setlength{\rightskip}{⟨length⟩}
\setlength{\parindent}{⟨length⟩}
\hspace 命令生成的水平间距如果位于一行的开头或末尾,则有可能因为断行而被“吞掉”。可使用\hspace*
命令代替\hspace
命令得到不会因断行而消失的水平间距。
命令\stretch{⟨n⟩}
生成一个特殊弹性长度,参数⟨n⟩
为权重。它的基础长度为0pt,但可以无限延伸,直到占满可用的空间。如果同一行内出现多个\stretch{⟨n⟩}
,这一行的所有可用空间将按每个\stretch
命令给定的权重⟨n⟩
进行分配。
\quad
和\qquad
命令, 分别相当于\hspace{1em}
和\hspace{2em}
:
2.5 垂直间距
A paragraph.
\vspace{2ex}
Another paragraph.
`vspace 命令生成的垂直间距在一页的顶端或底端可能被“吞掉”,类似
\hspace 在一行的开头和末尾那样。对应地,
\vspace* 命令产生不会因断页而消失的垂直间距。
\vspace 也可用
\stretch `设置无限延伸的垂直长度。
在段落内的两行之间增加垂直间距,一般通过给断行命令\\
加可选参数,如\\[6pt]
或\\*[6pt]
。\vspace
也可以在段落内使用,区别在于\vspace
只引入垂直间距而不断行:
LaTeX 还提供了\bigskip
, \medskip
, \smallskip
来增加预定义长度的垂直间距。
3. 页面和分栏
geometry 宏包的调用方式类似于graphicx,在latex + dvipdfmx 命令下需要指定选项
dvipdfm (注意这里不是dvipdfmx);pdflatex 和xelatex 编译命令下不需要。
\usepackage{geometry}
\geometry{⟨geometry-settings⟩}
\usepackage[⟨geometry-settings⟩]{geometry}
\twocolumn
支持带一个可选参数,用于排版双栏之上的一部分单栏内容。
切换单/双栏排版时总是会另起一页(\clearpage)
在双栏模式下使用\newpage
会换栏而不是换页;\clearpage
则能够换页。
双栏排版时每一栏的宽度为\columnwidth
,它由\textwidth
减去\columnsep
的差除以2 得到。两栏之间还有一道竖线,宽度为\columnseprule
,默认为零,也就是看不到竖线。
一个比较好用的分栏解决方案是multicol
,它提供了简单的multicols
环境(注意不要写成multicol 环境)自动产生分栏,如以下环境将内容分为3 栏:
\begin{multicols}{3}
\end{multicols}
multicol 宏包能够在一页之中切换单栏/多栏,也能处理跨页的分栏且各栏的高度分布平
在multicols 环境中无法正常使用table
和figure
等浮动体环境,它会直接让浮动体丢失。multicols 环境中只能用跨栏的table*
和figure*
环境,或者用float
宏包提供的H
参数固定浮动体的位置。
4. 页眉和页脚
命令\pagestyle 来修改页眉页脚的样式\pagestyle{⟨page-style⟩}
命令\thispagestyle 只影响当页的页眉页脚样式:\thispagestyle{⟨page-style⟩}
⟨page-style⟩
参数为样式的名称
article 文档类,twoside 选项偶数页为页码和节标题,奇数页为小节标题和页码;
article 文档类,oneside 选项页眉为节标题和页码;
book/report 文档类,twoside 选项偶数页为页码和章标题,奇数页为节标题和页码;
book/report 文档类,oneside 选项页眉为章标题和页码。
\pagenumbering
命令令我们能够改变页眉页脚中的页码样式:
\pagenumbering{⟨style⟩}
⟨style⟩ 为页码样式,默认为arabic(阿拉伯数字),还可修改为roman(小写罗马数字)、Roman(大写罗马数字)等。注意使用\pagenumbering 命令后会将页码重置为1。
对于headings
或者myheadings
样式,LATEX 允许用户使用命令手动修改页眉上面的内容,
\markright{⟨right-mark⟩}
\markboth{⟨left-mark⟩}{⟨right-mark⟩}
⟨left-mark⟩
和⟨right-mark⟩
的内容分别预期出现在左页(偶数页)和右页(奇数页)
默认将页眉的内容都转为大写字母。如果你不喜欢这样,可以尝试以下代码
\renewcommand\chaptermark[1]{\markboth{Chapter \thechapter\quad #1}{}}
\renewcommand\sectionmark[1]{\markright{\thesection\quad #1}}
以上代码适用于report/book 文档类。对于article 文档类,与两个页眉相关的命令分别为\sectionmark
和\subsectionmark
。
fancyhdr 宏包
\pagestyle{fancy}
\fancyhf[⟨position⟩]{…}
\fancyhead[⟨position⟩]{…}
\fancyfoot[⟨position⟩]{…}
%fancyhdr 基础用法的一个示例,效果为将章节标题放在和headings 一致的位置,但使用加粗格式;页码都放在页脚正中;修改横线宽度,“去掉”页脚的横线。
% 在导言区使用此代码
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
\fancyhf{}
\fancyfoot[C]{\bfseries\thepage}
\fancyhead[LO]{\bfseries\rightmark}
\fancyhead[RE]{\bfseries\leftmark}
\renewcommand{\headrulewidth}{0.4pt} % 注意不用\setlength
\renewcommand{\footrulewidth}{0pt}