LaTeX总结

LaTeX是一种用于高质量排版的文档准备系统,常用于中型到大型技术或科学文档,发音为Lah-tech或Lay-tech。

编译与文件

编译器

LaTeX常见的编译器有latex、xelatex、pdflatex、lualatex,功能和区别如下:

引擎与编译器 介绍
TeX - LaTeX TeX是于1978年由Donald Erwin Knuth开发的排版引擎,而LaTeX则是由L. Lamport教授开发的基于TeX的排版系统,实际上是将TeX许多控制命令进行封装。latex命令编译后生成dvi文件,再由其他程序转化为pdf文件。
pdfTeX - pdfLaTex 可直接将tex代码编译成pdf文件,由pdflatex对LaTeX格式的文档进行解释,再交由pdfTeX引擎进行处理。
XeTeX - XeLaTeX XeTeX引擎可以直接支持Unicode,一般中文LaTeX文档常使用XeLaTeX编译方式。在XeLaTeX出现之前,pdfLaTeX和LaTeX常使用天元、CCT和CJK宏包(目前还在用)来实现中文字符排版,使用时编码格式需设置为UTF-8。

编译命令

编译命令一般包括三部分,编译器、latex文档名、编译选项:

1
2
3
4
5
6
latex test.tex -etex -interaction -errorstopmode/nonstopmode -synctex
# -etex打开e-tex扩展
# -interaction选择互动模式
# -errorstopmode遇到错误停下来
# -nonstopmode强行一直编译下去
# -SyncTeX用于提供正反向查找的文件,有时也被压缩为synctex.gz文件

文件后缀

LaTeX工程通常设计多种文件格式,在编写源码阶段涉及到的文件包括:

文件扩展名 内容
.tex LaTeX源码
.bib BIBTEX数据库文件,内容为参考文献的条目
.bst BIBTEX用到的参考文献模板
.sty LaTeX宏包,宏包名称与文件名一致
.cls 文档类文件,文档类名称与文件名一致

编译后产生的文件包括:

文件扩展名 内容
.log 记录编译时的输出和错误信息
.aux 重要的辅助文件,用于多次编译时和此前的编译信息进行互动
.toc latex生成的目录记录文件
.lof latex生成的图片目录记录五年间
.lot latex生成的表格目录记录文件
.bbl BIBTEX生成的参考文件记录文件
.blg BIBTEX生成的日志文件
.idx LATEX生成的供makeindex处理的索引记录文件
.ind makeindex处理.idx生成的用于排版的格式化索引记录文件
.ilg makeindex生成的日志文件
.out hyperref宏包生成的PDF书签记录文件
.synctex/.synctex.gz 用于正反向查找
.dvi latex编译器输出的中间文件,可用于后续通过dvipdf等命令生成最终文件

例如,将文件test.tex编译为test.pdf的命令为:

1
2
3
latex test.tex  # 将test.tex编译为test.dvi
dvipdfmx test.dvi # 将test.dvi转化为test.pdf
del *.aux *.dvi *.log # 删除多余文件

LaTeX源文件的基本结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
% 文档类
\documentclass[utf8,a4paper]{article}
% book, letter, report, draft,其中draft用于显示浮动体大小和位置,常用于排版和调试
% 导言区
\usepackage{ctex}
\usepackage{graphicx}
\title{文档名}
\author{
张三\thanks{Email:xiuqhou@outlook.com}
\and 李四\thanks{Corresponding author}
\and others}
\date{\today}

% 正文区
\begin{document}
\maketitle % 输出标题
此处书写正文
\end{document}

文档类

1
\documentclass[options]{class}
  1. class文档类指明文档类型,编译后产生不同的输出形式和适用领域。常见文档类:

    文档类 介绍
    article/ctexart 排版科技期刊、段报告、程序文档、邀请函
    report/ctexrep 多章节的长报告、短片书籍、毕业论文等
    book/ctexbook 排版书籍
    beamer/ctexbeamer 排版演示文稿/PPT

    需要注意以上文档类仅输出形式不同,并不限定适用范围,例如book文档类也常见于排版毕业论文。

  2. options调节文档类属性:

    • 设置字体大小,缺省10pt

    • 定义纸张大小,缺省latterpaper

    • 设置数学公式左对齐,缺省中间对齐

    • 设置数学公式编号位于左侧,缺省右侧

    • 是否在文档标题后开始一新页,缺省不开始,缺省开始

    • 指定排版方式,单栏或双栏

    • 指定排版格式,单面或双面,article和report缺省单面,book缺省双面

    • 指定新的一章开始在右边页(奇数页)还是下一可用页,article中无效(没有章的概念),report缺省下一页可用,book缺省右边页。

宏包

宏包是一些格式为.sty的文件,用于拓宽功能,使用时需要在文档中引入:

1
\usepackage[可选参数]{宏包名}

常用的宏包如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\usepackage[body={16.1cm, 22.2cm},a4paper]{geometry} % 定义页面的几何参数
\usepackage{ctex} % 中文支持
\usepackage{graphicx} % 插入图像
\usepackage{caption} % 浮动体标题
\usepackage{float} % 浮动体支持
\usepackage{amsmath} % 数学公式支持
\usepackage{amssymbol} % 数学特殊符号
\usepackage{booktabs} % 三线表
\usepackage{arydshln} % 表格虚横线
\usepackage{subfigure} % 子图表
\usepackage{subfigure}{ccaption} % 图表的双语标题
\usepackage{tikz} % tikz画图库
\usepackage{algorithm2e} % 伪代码库
\usepackage{identfirst} % 首行缩进

断行与分页

断行:

1
2
3
4
5
6
\\[length]            % 换行命令,length表示垂直间距
\\*[length] % 为禁止分页,length表示垂直间距
\newline
\linebreak[n] % n为建议程度,取值为0-4,默认
\nolinebreak[n]
\sloppy % 执行断行标准,增加间隔,防止出现过长行(不建议使用)

分页:

1
2
3
\newpage               % 另起一页
\clearpage % 清空浮动体队列,开始新的一页,以防浮动体跑到下一章
\cleardoublepage % 清空浮动体队列,偶数页上开始新的一页

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
\usepackage{algorithm}
\usepackage{algorithmic}

\begin{algorithm}[h]
%\textsl{}\setstretch{1.8}调整行距
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
\caption{Simplified Model I}
\begin{algorithmic}[1]
\REQUIRE InPut matrix .
\STATE Initialization .
%% while循环部分
\WHILE{Not Converged and $k\leq n$}
\STATE $k\leftarrow {k+1}$
\ENDWHILE
%% for循环
\FOR{$i=0$ to $10$}
\STATE carry out some processing
\ENDFOR
%% if部分
\IF{some condition is true}
\STATE do some processing
\ELSIF{some other condition is true}
\STATE do some different processing
\ELSIF{some even more bizarre condition is met}
3
\STATE do something else
\ELSE
\STATE do the default actions
\ENDIF
\ENSURE Matrix
\end{algorithmic}
\end{algorithm}

字体

1
2
3
4
\textbf{}    % 加粗
\textit{} % 斜体

\textcolor{red}{} % 颜色

公式

公式类型

1
2
3
4
5
6
7
\begin{equation}
    a^2 + b^2=c^2
\end{equation}

$$
    a^2 + b^2=c^2
$$

效果:

a2+b2=c2a^2+b^2=c^2

行内公式使用$$直接嵌入到文字中

1
$a^2+b^2=c^2$直接嵌入到文字中

效果为a2+b2=c2a^2+b^2=c^2

多行公式环境包括:flalign、align、gather、split等。

  • flalign环境:默认右对齐,可以使用&符号来设置对齐的位置,此时所有&会对齐。每行会进行编号,可以在行尾通过\nonumber设置本行不编号。
1
2
3
4
5
\begin{flalign}
a^2+b^2=c^2\\
a^2+b^2=c^2\nonumber\\
a^2+b^2=c^2
\end{flalign}

效果如下所示:

a2+b2=c2a2+b2=c2a2+b2=c2\begin{aligned} a^2+b^2=c^2\\ a^2+b^2=c^2\nonumber\\ a^2+b^2=c^2 \end{aligned}

  • align环境:align环境效果和用法与flalign相同。区别在于flalign整体两端对齐, 会比align宽一些。
1
2
3
4
5
\begin{align}
a^2+b^2=c^2\\
a^2+b^2=c^2\nonumber\\
a^2+b^2=c^2
\end{align}

效果:

a2+b2=c2a2+b2=c2a2+b2=c2\begin{align} a^2+b^2=c^2\\ a^2+b^2=c^2\nonumber\\ a^2+b^2=c^2 \end{align}

  • split环境:

子公式

使用subsequations环境嵌套align环境,会自动在后面用英文设置子公式编号

1
2
3
4
5
6
7
\begin{subequations}
\begin{align}
\mathbf B_{A_i}^{k+1}\left(\frac\rho 2||\mathbf Z_{A_i}\mathbf B_{A_i}^k+\mathbf H^k-\mathbf{ZB}^k-\mathbf U^k-\mathbf Z_{A_i}\mathbf B_{A_i}||_2^2+\lambda||\mathbf B_{A_i}||_1 \right)\\
\mathbf H^{k+1}=\frac{1}{n+\rho}\left(\mathbf Y+\rho\mathbf{ZB}^{k+1}+\rho\mathbf U^k\right)\\
\mathbf U^{k+1}=\mathbf U^k+\mathbf {ZB}^{k+1}-\mathbf H^{k+1}
\end{align}
\end{subequations}

效果如下:

image-20220110163153101

公式语法

上下标

1
2
3
4
5
\begin{flalign}
a_2^2\\
_z^xA\\
\mathop A\limits_y^x\\ % 使用\limits可以将上下标换成中心位置的上下标,要配合\mathop使用
\end{flalign}

效果如下:

a22zxAAyxa_2^2\\ \\_z^xA\\ \mathop A\limits_y^x\\ % 使用\limits可以将上下标换成中心位置的上下标

标记

1
2
3
4
5
6
7
8
9
10
11
12
13
\begin{flalign}
A'\\ % 角分符号
^\backprime A\\ % 回角符号
\dot A\\ % 单点符号
\ddot A\\ % 双点符号
\bar a \\% 上横线
\tilde a \\% 上波浪线
\mathop a\limits^{\scriptscriptstyle\frown} \\% 上方上弧线,\scriptscriptstyle控制大小,\mathop和\limits控制中间上方的位置,\frown表示弧线
\breve{a} \\% 上方下弧线
\hat a \\% 帽子
\check a \\%
\underline{a} \\% 下横线
\end{flalign}

AAA˙A¨aˉa~aa˘a^aˇaA' \\% 角分符号 \\^\backprime A \\% 回角符号 \dot A \\% 单点符号 \ddot A \\% 双点符号 %\dddot A \\% 三点符号 %\ddddot A \\% 四点符号 \bar a \\% 上横线 \tilde a \\% 上波浪线 \mathop a\limits^{\scriptscriptstyle\frown} \\% 上方上弧线,\scriptscriptstyle控制大小,\mathop和\limits控制中间上方的位置,\frown表示弧线 \breve{a} \\% 上方下弧线 \hat a \\% 帽子 \check a \\% \underline{a} \\% 下横线

大型运算符

1
2
3
4
5
6
7
8
9
\sum_{i=1}^N            \\% 连加
\sum\nolimits_{i=1}^N \\
\prod_{i=1}^N \\% 连乘
\coprod \\
\int_{i=1}^N \\% 积分
\iint_{i=1}^N \\% 两重积分
\oint \\% 围线积分
\bigcap \\
\bigcup \\

i=1Ni=1Ni=1Ni=1Ni=1N\sum_{i=1}^N \\% 连加 \sum\nolimits_{i=1}^N \\ \prod_{i=1}^N \\% 连乘 \coprod \\ \int_{i=1}^N \\% 积分 \iint_{i=1}^N \\% 两重积分 \oint \\% 围线积分 \bigcap \\ \bigcup \\

空格

预定义空格

1
2
3
4
5
6
7
8
9
a\qquad b        \\% 2em
a\quad b \\% 1em
a\enspace b \\% 0.5em
a\;b \\% 5/18em
a\:b \\% 4/18em
a\ b \\% 1/3em
a~b \\% 1/3em
a\,b或a\thinspace b \\% 3/18em
a\!b或a\negthinspace b \\% -3/18em

abababa  baba ba bababa ⁣ba ⁣ba\qquad b \\% 2em a\quad b \\% 1em a\enspace b \\% 0.5em a\;b \\% 5/18em a\:b \\% 4/18em a\ b \\% 1/3em a~b \\% 1/3em a\,b或a\thinspace b \\% 3/18em a\!b或a\negthinspace b \\% -3/18em

自定义间距

1
2
\hspace{1em}    \\% 自定义水平距离
\vspace{1em} % 定义垂直距离

填充

1
2
\hfill             % 填充延伸到的最大宽度,从而实现两端对齐的效果
\vfill % 垂直填充延伸到的最大宽度

浮动体

表格

LaTeX表格去以下几个网站制作:

表格有两种形式,一种plain形式,一种booktabs形式。后者的竖线在每一行表格中会断开,因此一般只画三线表形式的横线,两者横线的命令也不同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
% plain形式
\begin{table} % table环境,表格一般都放在这里面,如果有分栏的情况下使用table*可生成跨栏表格
\centering % 表格居中
\begin{tabular}{c|ccc} % 指定每一列的对齐方式,l左c中r右,|表示插入竖线
    \hline % 插入一条横线,注意后面不加\\
    1 & 2 & 3 & 4 & 5\\
    \hline
    6 & 7 & 8 & 9 & 10\\
    \hline
\end{tabular}
\end{table}

% booktabs形式
\begin{table}
\centering
\begin{tabular}{cccc}
    \toprule % 表格最上方的线
    1 & 2 & 3 & 4 & 5\\
    \middlerule % 表格内部的线
    6 & 7 & 8 & 9 & 10\\
    \bottomrule % 表格最下方的线
\end{tabular}
\end{table}

多行和多列

1
2
\multirow{3}{*}{文字}        % 单元格跨多行
\multicolumn{5}{c}{文字} % 单元格跨多列

单元格内部换行

默认的表格中,单元格内的文字不会自动换行,加“\\”换行符也不行,可以在单元格中使用以下命令:

1
2
\makecell[c]{单元格内第一行文字\\单元格内第二行文字}    % 单元格换行
\begin{tabular}[c]{@{}c@{}}单元格第一行文字\\第二行文字\end{tabular}

图片

基本命令

1
2
3
4
5
6
\begin{figure}[h]    % figure环境,h设置浮动体,H设置强制当前位置
\centering % 图片居中
\includegraphics[scale=0.55]{pictures/Error_with_Missing_Rate.png} % 设置图片大小和路径,图片大小可按比例设置:scale=0.55,也可按照宽度设置:width=0.5\textwidth,\textwidth表示文字区域的宽度
\caption{Imputation error on Lorenz-63 with missing rate changing} % 设置图片下方显示的标题文字
\label{fig:error with missing rate} % 设置图片的引用信息
\end{figure}

图片缩放

图片可依据预定义的文档宽度width和高度height按比例缩放,或使用scale命令依据图片原始大小进行缩放。例如:

1
2
3
\includegraphics[width=0.55\textwidth]{pictures.png}  % 图片设置为文本宽度的0.55
\includegraphics[height=0.55\textwidth]{pictures.png} % 图片高度设置为文本宽度的0.55
\includegraphics[scale=0.8]{pictures.png} % 图片缩放为原始大小的0.8

需注意当width和height单独使用时,图片会进行等比例缩放,而同时使用时会进行自定义拉伸。常用的预定义文档宽度和高度包括:

命令 含义
\textwidth 整个页面版芯(文字部分)的宽度
\textheight 整个页面版芯(文字部分)的高度
\paperwidth 整个页面纸张的宽度
\paperheight 整个页面纸张的高度
\linewidth 当前行的宽度,受所在environment影响,例如进行了芬兰,则宽度为单位栏的宽度。

浮动体位置

  • h: 优先将图片放到源码中图片引入的位置,即当前位置。

  • p: 浮动页,将图片放到一致允许有浮动对象的页面上。

  • b: 底部,优先放置在页面底部。

  • t: 顶部,优先放置在页面顶部。

  • !: 覆盖内置布局方式,可与其他样式组合使用。

  • H: 强制在当前位置放置图片,需要float宏包。

子图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
\begin{figure}[h]
\centering
\subfigure[子图1显示的标题文字]% 设置子图显示的标题文字
{\label{引用信息} % 设置子图1的引用信息
\includegraphics[width=0.23\textwidth]{图片路径}
} % 插入子图
\subfigure[子图2显示的标题文字]
{\label{引用信息}
\includegraphics[width=0.23\textwidth]{图片路径}
}

% 子图之间如果插入空行,子图也会换行,如下所示
\subfigure[子图1显示的标题文字]
{\label{引用信息}
\includegraphics[width=0.23\textwidth]{图片路径}
}

\subfigure[子图2显示的标题文字]
{\label{引用信息}
\includegraphics[width=0.23\textwidth]{图片路径}
}

\caption{总图显示的标题文字}
\label{总图的引用信息}
\end{figure}

自定义浮动体显示格式

浮动体名称一般格式如Fig 1.表名,其中Fig被称为captionname,表名为captiontitle,可参考如下命令进行自定义:

1
2
3
4
5
6
7
8
9
\renewcommand{\figurename}{图}      % captionname自定义
\renewcommand{\tablename}{表}
% \captionsetup{font=song,labelsep=quad}
\captiondelim{\hspace{1em}}
\captiondelim{\hspace{1em}}
\setlength{\abovecaptionskip}{0pt} % caption的上下间距
\setlength{\belowcaptionskip}{0pt}
\captionnamefont{\wuhao} % captionname和captiontitle的字体设置
\captiontitlefont{\wuhao}

交叉引用

LaTeX中交叉引用需要使用\label\ref两个命令,\label{标签}指定引用的标签名,\ref{标签}用于对该标签进行引用,此外\label命令需要放在\caption标题命令后。交叉引用需要多次编译。

引入\usepackage{cleveref}宏包可自动为引用增加上对象类型,例如Figure和Table,此时引用方式变为:

1
2
\Cref{标签} % Table/Figure.
\cref{标签} % tab/fig.

如果希望给引用增加上超链接, 则可以使用hyperref宏包,实现鼠标跳转到引用对象的功能。

参考文献

首先建立paper.bib引用库文件,里面放bibtex格式的文献引用信息,paper.bib文件必须和tex文件放在同一目录下。paper.bib文件中的内容如下:

1
2
3
4
5
6
7
8
9
@article{liu2016barrier,
title={Barrier Lyapunov functions-based adaptive control for a class of nonlinear pure-feedback systems with full state constraints},
author={Liu, Yan-Jun and Tong, Shaocheng},
journal={Automatica},
volume={64},
pages={70--75},
year={2016},
publisher={Elsevier}
}

正文中的引用方式为:

1
2
% 正文区
\cite{liu2016barrier}

文章末插入参考文献列表的方式为:

1
2
3
\bibliographystyle{IEEEtran} % 选择参考文献格式
% argument is your BibTeX string definitions and bibliography database(s)
\bibliography{paper} % 插入参考文献列表

中文参考文献的引用需要引用gbt7714包,并设置language,注意中文作者姓名不能加标点符号,同样使用and隔开。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\usepackage{gbt7714}

@article{Yu2022ARIMA-GRU,
author = {于军琪 and 聂己开 and 赵安军 and 侯雪妍},
file = {:C\:/Users/houxiuquan/AppData/Local/Mendeley Ltd./Mendeley Desktop/Downloaded/于 et al. - 2022 - 基于特征挖掘的ARIMA-GRU短期电力负荷预测.pdf:pdf},
journal = {电力系统及其自动化学报},
keywords = {autoregressive in,load forecasting,phase space reconstruction,variational modal decomposition,vmd},
mendeley-groups = {基于分布式建模的电力负荷预测研究/分布式负荷预测/时间序列分析},
number = {3},
pages = {91--99},
title = {基于特征挖掘的ARIMA-GRU短期电力负荷预测},
volume = {34},
year = {2022},
language = {chinese},
}

参考文献若想保持标题问题不变,可在title两侧增加一对大括号

1
2
3
4
5
6
7
8
9
10
11
12
13
@article{Yu2022ARIMA-GRU,
author = {于军琪 and 聂己开 and 赵安军 and 侯雪妍},
file = {:C\:/Users/houxiuquan/AppData/Local/Mendeley Ltd./Mendeley Desktop/Downloaded/于 et al. - 2022 - 基于特征挖掘的ARIMA-GRU短期电力负荷预测.pdf:pdf},
journal = {电力系统及其自动化学报},
keywords = {autoregressive in,load forecasting,phase space reconstruction,variational modal decomposition,vmd},
mendeley-groups = {基于分布式建模的电力负荷预测研究/分布式负荷预测/时间序列分析},
number = {3},
pages = {91--99},
title = {{基于特征挖掘的ARIMA-GRU短期电力负荷预测}},
volume = {34},
year = {2022},
language = {chinese},
}

跨文件交叉引用

1
2
\usepackage{xr}        % 引用xr交叉引用包
\externaldocument{supple} % 添加外部需要引用的文件

跨文件交叉引用依赖于aux文件,因此编译时,需要先编译一遍tex文件生成aux文件,再再编译两次,才可生成正确的交叉引用。以bare_jrnl.tex和supple.tex文件互相引用为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 编译tex文件,生成交叉引用的用于aux文件,跨文件的交叉引用依赖aux文件
pdflatex bare_jrnl.tex
pdflatex supple.tex

# 编译生成各自的参考文献
bibtex bare_jrnl.aux
bibtex supple.aux

# 再次编译两次,生成引用信息,生成最终的两个pdf文件
pdflatex bare_jrnl.tex
pdflatex bare_jrnl.tex
pdflatex supple.tex
pdflatex supple.tex

# 删除辅助文件(windows下,linux用rm命令)
del *.aux *.bib *.log *.gz *.bbl *.blg