LaTeX学习笔记
LATEX是一个文档准备系统 (Document Preparing System),它非常适用于生成高印刷质量的科技类和数学类文档。它也能够生成所有其他种类的文档,小到简单的信件,大到完整的书籍。LATEX 使用 TEX作为它的排版引擎。LaTeX是一种“非所见即所得”的排版系统,用户需要输入特定的代码,保存在后缀为.tex的文件中,通过编译得到所需的pdf文件。
安装LaTeX与VS Code配置环境
安装Tex Live
下载地址:texlive2023.iso,有效期限:永久有效
右键 install-tl-windows,单击以管理员身份运行,进入安装界面,下面的选项安可选择不安装 TeXworks 前段,设置完安装路径等选项之后点击“安装”,之后静坐 20 分钟 - 3 小时等待安装完成。一定不要点击“Abort”!!!
检查安装是否正常: 按win + R 打开运行,输入cmd,打开命令行窗口;然后输入命令xelatex -v ,如下图,若输出了一些版本信息,则安装正常。
安装SumatraPDF
SumatraPDF比Workshop 插件自带的PDF软件打开速度更快,同时支持双向查找功能,进入官网,Sumatra PDF reader download page,下载完成后,点击exe文件进行安装,修改安装目录一键安装就行,记好文件的安装路径。
安装VS Code插件
在扩展商店安装 LaTeX Workshop 插件,在扩展中搜索LaTeX Workshop,下载第一个插件,等待下载完成。
配置Workshop 插件
在 VSCode 界面下按下 F1,然后键入“setjson”,点击“首选项: 打开设置(JSON)”,将以下代码放入设置区:
1 | { |
一份介绍LaTeX的PDF
文件:一份不太简的latex介绍.pdf,有效期限:永久有效
代码基本组成
1 | % 源代码以一个 \documentclass 命令作为开头,它指定了文档使用的文档类。文档类规定了 LATEX 源代码所要生成的文档的性质——普通文章、书籍、演示文稿、个人简历等等。document 环境当中的内容是文档正文。 |
文档类
源代码的开头须用\documentclass 指定文档类,
1 | \documentclass[⟨options⟩]{⟨class-name⟩} |
宏包
1 | \usepackage[⟨options⟩]{⟨package-name⟩} |
过程文件说明
1 | % LaTeX提供了命令 \include 用来在源代码里插入文件: |
功能源代码
最简单的源代码示例
1 | \documentclass{article} |
排版中文的最简源代码示例
ctex 宏包本身用于配合各种文档类排版中文,而 ctex 文档类对LATEX 的标准文档类进行了封装,对一些排版根据中文排版习惯做了调整,包括 ctexart、ctexrep、ctexbook 等。ctex 宏包和文档类能够识别操作系统和 TEX 发行版中安装的中文字体,因此基本无需额外配置即可排版中文文档。下面举一个使用 ctex 文档类排版中文的最简例子:
1 | \documentclass{ctexart} |
排版文字
字符:
空格:空格键和 Tab 键输入的空白字符视为“空格”。连续的若干个空白字符视为一个空格。一行开头的空格忽略不计。行末的换行符视为一个空格;
分段:连续两个换行符,也就是空行,会将文字分段。多个空行被视为一个空行。也可以在行末使用 \par 命令分段。
注释:
用 % 字符作为注释。在这个字符之后直到行末,所有的字符都被忽略,行末的换行符也不引入空格。
特殊字符:
如果想要输入“# $ % & { } _ ^ ~ \”符号,需要使用以下带反斜线的形式输入,类似编程语言里的“转义”符号。输入反斜线需要用 \textbackslash
连字:
西文排版中经常会出现连字(ligatures),常见的有 ff/fi/fl/ffi/f
标点符号:
中文的标点符号(绝大多数为非 ASCII 字符)使用中文输入法输入即可,一般不需要过多留意。而输入西文标点符号时,有不少地方需要留意。
引号:
LATEX 中单引号 ‘ 和 ’ 分别用 ` 和 ‘ 输入;双引号 “ 和 ” 分别用 和 '' 输入(" 可以输入后双引号,但没有直接输入前双引号的字符,习惯上用 '' 输入以和
更好地对应)。
连字号和破折号:
有三种长度的“横线”可用:连字号(hyphen)、短破折号(en-dash)和长破折号(em-dash)。它们分别有不同的用途:连字号 - 用来组成复合词;短破折号 – 用来连接数字表示范围;长破折号 — 用来连接单词,语义上类似中文的破折号。
省略号:
提供了 \ldots 命令表示省略号,相对于直接输入三个点的方式更为合理。\dots 与\ldots 命令等效。
波浪号:
~ 命令,它可以用来输入波浪号,但位置靠顶端(~ 命令主要用作重音,参考下一小节)。西文中较少将波浪号作为标点符号使用,在中文环境中一般直接使用全角波浪号(~)
断行和断页
在西文排版实践中,断行的位置优先选取在两个单词之间,也就是在源代码中输入的“空格”。“空格”本身通常生成一个间距,它会根据行宽和上下文自动调整,文字密一些的地方,单词间距就略窄,反之略宽。
文字在单词间的“空格”处断行时,“空格”生成的间距随之舍去。我们可以使用字符 ~ 输入一个不会断行的空格(高德纳称之为 tie,“带子”),通常用在英文人名、图表名称等上下文环境:
断行:
1 | \\[⟨length⟩] \\*[⟨length⟩] |
有两点区别:一是 \ 可以带可选参数 ⟨length⟩,用于在断行处向下增加垂直间距,而 \newline 不带可选参数;二是 \ 也在表格、公式等地方用于换行,而 \newline只用于文本段落中。带星号的 \ 表示禁止在断行处分页。
断页:
1 | \newpage |
通常情况下两个命令都起到另起一页的作用,区别在于:第一,在双栏排版模式中 \newpage起到另起一栏的作用,\clearpage 则能够另起一页;第二,在涉及浮动体的排版上行为不同。
有时候我们不满足于 LATEX 默认的断行和断页位置,需要进行微调,可以用以下命令告诉LATEX 哪些地方适合断行或断页,哪些地方不适合:
1 | \linebreak[⟨n⟩] \nolinebreak[⟨n⟩] |
以上命令都带一个可选参数,用数字 ⟨n⟩ 代表适合/不适合的程度,取值范围为 0–4,不带可选参数时,缺省为 4。比如 \linebreak 或者 \linebreak[4] 意味着此处需要强行断行;\nopagebreak 或 \nopagebreak[4] 意味着禁止在此处断页。
断词:
如果 LATEX 遇到了很长的英文单词,仅在单词之间的“空格”处断行无法生成疏密程度匀称的段落时,就会考虑从单词中间断开。对于绝大多数单词,LATEX 能够找到合适的断词位置,在断开的行尾加上连字符 -。如果一些单词没能自动断词,我们可以在单词内手动使用 - 命令指定断词的位置:
章节和目录
在知道了如何输入文字后,我们将在本章了解一个结构化的文档所依赖的各种元素——章节、目录、列表、图表、交叉引用、脚注等等。
章节标题:
一篇结构化的、条理清晰文档一定是层次分明的,通过不同的命令分割为章、节、小节。提供了划分章节的命令:
1 | \section{⟨title⟩} \subsection{⟨title⟩} \subsubsection{⟨title⟩} \paragraph{⟨title⟩} \subparagraph{⟨title⟩} |
这些命令生成章节标题,并能够自动编号。上述命令除了生成带编号的标题之外,还向目录中添加条目,并影响页眉页脚的内容,每个命令有两种变体:
目录:
只需在合适的地方使用命令:
1 | \tableofcontents |
这个命令会生成单独的一章(report/book)或一节(article),标题默认为“Contents”,\tableofcontents 生成的章节默认不写入目录(\section* 或\chapter*),可使用 tocbibind 等宏包修改设置。正确生成目录项,一般需要编译两次源代码。
有时我们使用了 \chapter* 或 \section* 这样不生成目录项的章节标题命令,而又想手动生成该章节的目录项,可以在标题命令后面使用:
1 | \addcontentsline{toc}{⟨level⟩}{⟨title⟩} |
其中 ⟨level⟩ 为章节层次 chapter 或 section 等,⟨title⟩ 为出现于目录项的章节标题。titletoc、tocloft 等宏包提供了具体定制目录项格式的功能,详情请参考宏包的帮助文档。
文档结构的划分:
所有标准文档类都提供了一个 \appendix 命令将正文和附录分开,使用 \appendix 后,最高一级章节改为使用拉丁字母编号,从 A 开始。
以上三个命令还可和 \appendix 命令结合,生成有前言、正文、附录、后记四部分的文档。
标题页
LATEX 支持生成简单的标题页。首先需要给定标题和作者等信息:
1 | \title{⟨title⟩} \author{⟨author⟩} \date{⟨date⟩} |
在 \title、\author等命令内可以使用 \thanks 命令生成标题页的脚注,用 \and 隔开多个人名。在信息给定后,就可以使用 \maketitle 命令生成一个简单的标题页了。
article 文档类的标题默认不单独成页,而 report 和 book 默认单独成页。可在 \documentclass 命令调用文档类时指定 titlepage 或 notitlepage 选项以修改默认的行为。LATEX 标准类还提供了一个简单的 titlepage 环境,生成不带页眉页脚的一页。
交叉引用
交叉引用是 LATEX 强大的自动排版功能的体现之一。在能够被交叉引用的地方,如章节、公式、图表、定理等位置使用 \label 命令:
1 | \label{⟨label-name⟩} |
之后可以在别处使用 \ref 或 \pageref 命令,分别生成交叉引用的编号和页码:
1 | \ref{⟨label-name⟩} \pageref{⟨label-name⟩} |
为了生成正确的交叉引用,一般也需要多次编译源代码。\label 命令可用于记录各种类型的交叉引用,使用位置分别为:
在使用不记编号的命令形式(\section、\caption、带可选参数的 \item 命令等)时不要使用 \label 命令,否则生成的引用编号不正确。
脚注和边注
使用 \footnote 命令可以在页面底部生成一个脚注:
1 | \footnote{⟨footnote⟩} |
使用 \marginpar 命令可在边栏位置生成边注:
1 | \marginpar[⟨left-margin⟩]{⟨right-margin⟩} |
如果只给定了 ⟨right-margin⟩,那么边注在奇偶数页文字相同;如果同时给定了 ⟨left-margin⟩,则偶数页使用 ⟨left-margin⟩ 的文字。
特殊环境
列表:
LATEX 提供了基本的有序和无序列表环境 enumerate 和 itemize,两者的用法很类似,都用 \item 标明每个列表项。enumerate 环境会自动对列表项编号。
1 | \begin{enumerate} |
关键字环境 description 的用法与以上两者类似,不同的是 \item 后的可选参数用来写关键字,以粗体显示,一般是必填的:
1 | \begin{description} |
对齐环境:
center、flushleft 和 flushright 环境分别用于生成居中、左对齐和右对齐的文本环境。
1 | \begin{center} … \end{center} |
除此之外,还可以用以下命令直接改变文字的对齐方式:
1 | \centering \raggedright \raggedleft |
center 等环境会在上下文产生一个额外间距,而 \centering 等命令不产生,只是改变对齐方式。比如在浮动体环境 table 或 figure 内实现居中对齐,用 \centering 命令即可,没必要再用 center 环境。
引用环境:
LATEX 提供了两种引用的环境:quote 用于引用较短的文字,首行不缩进;quotation 用于引用若干段文字,首行缩进。引用环境较一般文字有额外的左右缩进。
摘要环境:
摘要环境 abstract 默认只在标准文档类中的 article 和 report 文档类可用,一般用于紧跟\maketitle 命令之后介绍文档的摘要。如果文档类指定了 titlepage 选项,则单独成页;反之,单栏排版时相当于一个居中的小标题加一个 quotation 环境,双栏排版时相当于 \section* 定义的一节。
代码环境:
代码环境 verbatim,它以等宽字体排版代码,回车和空格也分别起到换行和空位的作用;带星号的版本更进一步将空格显示成“␣”
要排版简短的代码或关键字,可使用 \verb 命令:
1 | \verb⟨delim⟩⟨code⟩⟨delim⟩ |
⟨delim⟩ 标明代码的分界位置,前后必须一致,除字母、空格或星号外,可任意选择使得不与代码本身冲突,习惯上使用 | 符号。同 verbatim 环境,\verb 后也可以带一个星号,以显示空格:
\verb 命令对符号的处理比较复杂,一般不能用在其它命令的参数里,否则多半会出错。
verbatim 宏包优化了 verbatim 环境的内部命令,并提供了 \verbatiminput 命令用来直接读入文件生成代码环境。fancyvrb 宏包提供了可定制格式的 Verbatim 环境;listings 宏包更进一步,可生成关键字高亮的代码环境,支持各种程序设计语言的语法和关键字。
表格
LATEX 里排版表格不如 Word 等所见即所得的工具简便和自由,不过对于不太复杂的表格来讲,完全能够胜任。排版表格最基本的 tabular 环境用法为:
1 | \begin{tabular}[⟨align⟩]{⟨column-spec⟩} |
其中 ⟨column-spec⟩ 是列格式标记,在接下来的内容将仔细介绍;& 用来分隔单元格;\ 用来换行;\hline 用来在行与行之间绘制横线。
直接使用 tabular 环境的话,会和周围的文字混排。此时可用一个可选参数 ⟨align⟩ 控制垂直对齐:t 和 b 分别表示按表格顶部、底部对齐,其他参数或省略不写(默认)表示居中对齐。
但是通常情况下 tabular 环境很少与文字直接混排,而是会放在 table 浮动体环境中,并用 \caption 命令加标题。
列格式:
tabular 环境使用 ⟨column-spec⟩ 参数指定表格的列数以及每列的格式。
表格中每行的单元格数目不能多于列格式里 l/c/r/p 的总数(可以少于这个总数),否则出错。
@ 格式可在单元格前后插入任意的文本,但同时它也消除了单元格前后额外添加的间距。@格式可以适当使用以充当“竖线”。特别地,@{} 可直接用来消除单元格前后的间距:
列宽:
在控制列宽方面,LATEX 表格有着明显的不足:l/c/r 格式的列宽是由文字内容的自然宽度决定的,而 p 格式给定了列宽却不好控制对齐(可用 array 宏包的辅助格式),更何况列与列之间通常还有间距,所以直接生成给定总宽度的表格并不容易。
tabularx 宏包为我们提供了方便的解决方案。它引入了一个 X 列格式,类似 p 列格式,不过会根据表格宽度自动计算列宽,多个 X 列格式平均分配列宽。X 列格式也可以用 array 里的辅助格式修饰对齐方式:
横线:
我们已经在之前的例子见过许多次绘制表格线的 \hline 命令。另外 \cline{⟨i⟩-⟨j⟩} 用来绘制跨越部分单元格的横线:
在科技论文排版中广泛应用的表格形式是三线表,形式干净简明。三线表由 booktabs 宏包支持,它提供了 \toprule、\midrule 和 \bottomrule 命令用以排版三线表的三条线,以及和\cline 对应的 \cmidrule。除此之外,最好不要用其它横线以及竖线:
合并单元格:
LATEX 是一行一行排版表格的,横向合并单元格较为容易,由 \multicolumn 命令实现:
1 | \multicolumn{⟨n⟩}{⟨column-spec⟩}{⟨item⟩} |
其中 ⟨n⟩ 为要合并的列数,⟨column-spec⟩ 为合并单元格后的列格式,只允许出现一个 l/c/r 或p 格式。如果合并前的单元格前后带表格线 |,合并后的列格式也要带 | 以使得表格的竖线一致。
上面的例子还体现了,形如 \multicolumn{1}{⟨column-spec⟩}{⟨item⟩} 的命令可以用来修改某一个单元格的列格式。
纵向合并单元格需要用到 multirow 宏包提供的 \multirow 命令:
1 | \multirow{⟨n⟩}{⟨width⟩}{⟨item⟩} |
⟨width⟩ 为合并后单元格的宽度,可以填 * 以使用自然宽度。
行距控制:
LATEX 生成的表格看起来通常比较紧凑。修改参数 \arraystretch 可以得到行距更加宽松的表格。
完整代码案例
1 | \documentclass[UTF8,titlepage,12pt]{ctexart} |
参考文献Reference.bib如下:
1 | @InProceedings{GVQA, |