整理一下LaTeX论文排版中的基本要素。

页面布局

通常需要在使用文档时首先全局地规定一些排版参数,如字号、纸张大小、单双面等等。 比如调用 article 文档类排版文章,指定基本字号为 11pt,双面排版,纸张为 A4 大小:

1
\documentclass[10pt,twoside,a4paper]{article}

常用的参数如下:

  • 指定字号,例如10pt,11pt,12pt,默认10pt
  • 指定纸张大小,默认为美式信纸 letterpaper(大约 21.6 cm × 28.0 cm)。可指定选项还包括 a4paper,b5paper,executivepaper 和 legalpaper等。有关纸张大小页边距的更多细节主要通过geometry包设置,当然在这里设置也可以
  • 单面/双面排版,twoside,oneside。双面排版时,奇偶页的页眉页脚、页边距不同。article和report默认为oneside,book默认为twoside。
  • 指定单栏/双栏排版,onecolumn, twocolumn。默认为 onecolum。
  • 指定横向排版,landscape,默认为纵向。

geometry推荐设置之一

1
\usepackage[left=2.5cm, right=2.5cm, top=3cm, bottom=3cm]{geometry}

推荐设置之二:A4纸,宽度:210 mm,高度:297 mm。

1
\usepackage[a4paper,margin=1in]{geometry}

还有一种适合Ipad阅读的布局

1
2
3
4
5
6
\usepackage{geometry}
\geometry{
paperwidth=7in,
paperheight=10in,
includefoot,
margin=8mm}

标题页

需要在导言区提供基本信息

1
2
3
\title{<title>} % 必选,缺失会报错
\author{<author>} % 可选,缺失会警告
\date{<date>} % 可选

作者可以有多个,不同作者之间使用\and命令相连,并且可以使用\thanks命令附带联系方式(联系方式会出现在脚注中)

1
2
3
\author{ Mary\thanks{E-mail:****@***.com}
\and Ted\thanks{Corresponding author}
\and Louis}

日期可以直接使用当前日期(英文),也可使用任意格式来指定日期,此时显示内容与输入的是完全一致的

1
2
3
4
5
\date{\today}

\date{October 1, 2020}
\date{Dec. 31, 2022}
\date{2022/12/31}

如果需要中文的日期和格式,可以使用zhnumber宏包(需要在中文文档中,否则缺字体等),使用如下

1
2
3
\date{\zhtoday}

\date{\zhdate{2019/10/11}}

此时zhnumber会自动调整日期的显示格式。

使用如下命令生成标题页

1
\maketitle

注意:对于article默认不会为标题部分单独成页,report和book则会单独成页,也可以在文档类引入时通过选项titlepage/notitlepage指定是否单独成页。

摘要

摘要环境是内置的,可以直接使用

1
2
3
\begin{abstract}
...
\end{abstract}

注意,默认情况下abstract环境只在article和report中可用,摘要一般紧跟着\maketitle使用,如果标题页单独成页,则摘要也会单独成页。

关键词的使用在不同的模板中有不同的实现,有的模板直接提供了独立命令,例如

1
2
3
4
5
6
7
\begin{abstract}
The abstract goes here.
\end{abstract}

\begin{IEEEkeywords}
IEEEtran, journal, \LaTeX, paper, template.
\end{IEEEkeywords}

可以简单定义一个\keywords命令

1
\newcommand{\keywords}[1]{\vskip 2ex\par\noindent\normalfont{\bfseries Keywords: } #1}

使用时例如

1
2
3
4
\begin{abstract}
The abstract goes here.
\keywords{IEEEtran, journal, \LaTeX, paper, template}
\end{abstract}

完全不使用模板和自定义样式,也可以如下简单粗暴地实现

1
2
3
4
5
6
7
8
9
10
11
\noindent
\textbf{Abstract:}
The abstract goes here.

\bigskip % 插入大的垂直间距

\noindent
\textbf{Key words:}
IEEEtran; journal; \LaTeX; paper; template.

\medskip % 插入中等的垂直间距

文档结构

一个大型文档的main.tex正文部分结构如下,各个部分的详细内容会拆分为单独的.tex文件

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
34
35
\begin{document}

\maketitle

\frontmatter % 前言

\input{chapters/abstract.tex}

\tableofcontents
% \listoffigures
% \listoftables

\input{chapters/chapter0.tex}

\mainmatter % 正文

\input{chapters/chapter1.tex}
\input{chapters/chapter2.tex}
\input{chapters/chapter3.tex}
\input{chapters/chapter4.tex}

% 参考文献
\bibliography{bib/ustc} % 参考文献使用 BibTeX 编译
% \printbibliography % 参考文献使用 BibLaTeX 编译

\appendix % 附录

\input{chapters/complementary.tex}

\backmatter % 后记

\input{chapters/acknowledgements.tex}
\input{chapters/publications.tex}

\end{document}

其中用下面的命令将文档分成三部分

1
2
3
4
5
\frontmatter % 前言

\mainmatter % 正文

\backmatter % 后记

使用下面的命令生成目录以及图表的单独目录

1
2
3
4
5
\tableofcontents    % 目录

\listoffigures % 图表目录

\listoftables % 表格目录

使用下面的命令划分后面的部分为附录

1
\appendix

此后的章节编号改用拉丁字母,从A开始。

这只是对于诸如毕业论文和书籍等大型文档的结构划分,对于一般的文档,并没有必要使用完整的文档结构,例如通常都没有前言和后记,可能有附录。

参考文献

原始方式

LaTeX提供的对参考文献的底层支持是thebibliography环境,相当于一个特殊的列表。在使用的地方立刻生成参考文献列表,每一项以\bibterm开始,使用示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
\documentclass{article}

\begin{document}

According to Einstein's theory of relativity \cite{einstein1905}...

\begin{thebibliography}{99}
\bibitem{einstein1905} Albert Einstein. \textit{On the Electrodynamics of Moving Bodies}. Annalen der Physik, 1905.
\bibitem{knuth1984} Donald E. Knuth. \textit{The TeXbook}. Addison-Wesley, 1984.
\bibitem{lamport1994} Leslie Lamport. \textit{LaTeX: A Document Preparation System}. Addison-Wesley, 1994.
\end{thebibliography}

\end{document}

注意:

  • 需要指定一个最大数目例如99,用于限制编号的最大宽度
  • 每一个条目后的参数是条目标识,在正文中引用时使用,例如\cite{knuth1984},可以多个同时引用,例如\cite{einstein1905,knuth1984}
  • 原始方式仅介绍一下,不建议使用

Bibtex

Bibtex引擎使用如下的格式来记录参考文件数据,通常也称为Bibtex格式,从Google Scholar或期刊/数据库的网站上都能够导出 BIBTEX 文献条目。

1
2
3
4
5
6
7
8
9
10
@article{einstein1905,
author = {Albert Einstein},
title = {On the Electrodynamics of Moving Bodies},
journal = {Annalen der Physik},
volume = {17},
number = {6},
pages = {891--921},
year = {1905},
publisher = {Wiley-VCH}
}

其中最开始的名称为条目标识,用于在正文中引用。 通常将所有的参考文献汇总到一个文本文件中,记作reference.bib。注意并不是.bib文件的所有条目都会被打印在参考文献列表中,只会打印前文提到的部分。

在使用Bibtex时,需要如下几个必要环节:

  1. 在导言区使用\bibliographystyle设置参考文献的呈现样式:作者,名称,年份的顺序,大小写等细节。可以直接使用内置的几种样式,也可以使用期刊自定义的文献显示样式(需要提供.bst文件)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    \bibliographystyle{<bst-name>}

    % 基础样式,使用数字编号,按字母顺序排列,比较次序为作者的姓和名、年度和标题
    % 下面几个样式都是基于plain进行的修改
    \bibliographystyle{plain}

    % 尽量使用缩写使信息更紧凑
    \bibliographystyle{abbrv}

    % 用作者名首字母+年份后两位作为编号,而非默认的数字编号,例如 [ABCD13]
    \bibliographystyle{alpha}

    % 直接按照引用的先后顺序,而非默认的字母顺序
    \bibliographystyle{unsrt}

  2. 在正文中同样使用\cite{name}或者\cite{name1,name2}等引用文献

  3. 在正文最后使用\bibliography加载.bib文件,并立刻打印参考文献列表

    1
    2
    3
    4
    5
    \bibliography{<bib-name>}

    \bibliography{reference} % reference.bib

    \bibliography{reference,BigBib} % reference.bib and BigBib.bib

  4. 在多次编译中,使用bibtex命令参与编译,例如

    1
    2
    3
    4
    xelatex demo.tex
    bibtex demo.aux
    xelatex demo.tex
    xelatex demo.tex

完整示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\documentclass{article}
\bibliographystyle{plain}

\begin{document}

According to Einstein's theory of relativity \cite{einstein1905}...

\medskip

Another great reference on LaTeX is the book by Leslie Lamport \cite{lamport1994}.

\bibliography{reference} % reference.bib

\end{document}

注意:默认不会打印.bib文件的所有条目,而是只会筛选出\cite{}提到的条目,如果需要强制在参考文献列表中呈现未提及的项,可以使用\nocite{}命令指定添加某些条目,例如\nocite{*}将添加.bib文件中的所有条目,需要用于打印参考文献列表之前(下面的biblatex同样支持)

1
2
\nocite{*}
\bibliography{reference} % reference.bib

Biblatex

Bibtex是传统的参考文献处理方案,而Biblatex是更现代的方案,或者说提供了一个兼容Bibtex的前端,它提供了更多的自定义选项和灵活性,可以轻松地定制引用和参考文献列表的显示样式,并且对于UTF-8编码和多语言的支持更好。

Biblatex 可以使用Biber(默认)或者Bibtex作为后端处理工具,而传统的Bibtex只能使用Bibtex本身,无论哪一种方案都需要提供.bib数据文件。

严格来说,Bibtex 和 Biblatex 所使用的 .bib 数据文件的格式是不一样的,Biblatex 格式的 .bib 文件允许包含更丰富的字段信息。Zotero 等文献管理工具支持分别导出这两种格式,谷歌学术默认导出的是 Bibtex 格式。 由于 Biblatex 基本保持了对 Bibtex 的兼容,无论实际使用 Biblatex 还是 Bibtex 进行编译,在导出 .bib 文件时使用 Bibtex 格式都是不错的选择。如果对于参考文献的排版细节要求较高,可以考虑使用 Biblatex 格式。

基本使用

Biblatex的基本使用与Bibtex有所不同,包括如下步骤:

  1. 在导言区导入biblatex宏包,在导入宏包时可以指定后端为biber(默认)或bibtex,还可以自定义参考文献列表的显示样式(提供.bbx和.cbx文件)

    1
    2
    3
    4
    5
    6
    7
    \usepackage[<options>]{biblatex}

    \usepackage[backend=biber]{biblatex}

    \usepackage[backend=bibtex]{biblatex}

    \usepackage[backend=biber,citestyle=xxx,bibstyle=xxx]{biblatex}

  2. 在导言区使用\addbibresource加载.bib文件,其中location=local指定查找位置,通常是不需要的

    1
    \addbibresource[location=local]{reference.bib} % reference.bib 完整文件名

  3. 在正文中同样使用\cite{name}或者\cite{name1,name2}等引用文献,还支持\footcite等不同效果的引用命令

  4. 在正文最后使用如下命令打印参考文献列表,可以加入一些参数来设置细节

    1
    2
    3
    4
    5
    \printbibliography

    \printbibliography[heading=bibintoc] % 将参考文献列表作为一个章节加入目录

    \printbibliography[title={References}] % 指定参考文献列表的标题为References

  5. 在多次编译中,如果指定biber为后端,就需要使用biber命令参与编译,例如

    1
    2
    3
    4
    xelatex demo.tex
    biber demo.aux
    xelatex demo.tex
    xelatex demo.tex

完整示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\documentclass{article}
\usepackage[style=authoryear]{biblatex}
\addbibresource{reference.bib} % reference.bib

\begin{document}

According to Einstein's theory of relativity \parencite{einstein1905}...

\medskip

Another great reference on LaTeX is the book by Leslie Lamport \cite{lamport1994}.

\printbibliography

\end{document}

如果reference.bib文件不存在,上述命令会报错,我们可以先判断文件是否存在,在存在时将其添加,例如

1
2
\usepackage[style=numeric]{biblatex}
\IfFileExists{reference.bib}{\addbibresource{reference.bib}}{}

更多细节

Biblatex支持的参考文献样式拆分为两部分:在正文中的引用样式(citation style,即xxx.cbx), 在参考文献列表中的著录样式(bibliography style,即xxx.bbx)。 在调用宏包时可以使用 style 选项同时指定样式(此时使用同名的引用样式和著录样式),或者使用bibstyle 或 citestyle 分别指定样式。

常见的默认样式包括

  1. numeric 数字样式:style=numeric,数字引用样式,引用标记通常以数字形式出现,例如 [1]。
  2. authoryear 作者年份样式:style=authoryear,作者年份引用样式,引用标记通常包括作者和年份,例如 (Smith, 2010)。
  3. authortitle 作者标题样式:style=authortitle,引用标记包括作者和标题,例如 (Smith, The Title)。
  4. verbose 详细样式:style=verbose,提供详细的引用信息。

在正文中引用时,支持下面的个性化引用命令:

  1. \cite{}:这是最基本的引用命令,用于在文中引用文献条目。格式由biblatex的样式定义。
  2. \parencite{}:与\cite{}类似,但它将引用放在括号中。通常用于在文本中使用圆括号括起引用。
  3. \textcite{}:这个命令用于在文本中引用文献,同时在括号中给出作者名和年份。适用于在正文中直接提及作者。
  4. \supercite{}:与\parencite{}相似,但产生上标引用。通常用于脚注或类似的环境中。
  5. \autocite{}:这是一个更灵活的命令,它会根据上下文自动选择合适的引用样式,可以根据需要生成内文引用、上标引用或其他引用样式。

注:除此之外,natbib宏包也经常用于参考文献的管理之中,这里略去。关于参考文献的具体格式(bib文件中的条目格式,在pdf中显示的格式),也是非常繁琐的,配合使用Zotero导出文献时也存在复杂的格式问题,这里暂不讨论。

补充

交叉引用

在 LaTeX 中往往需要给各种类型的元素(方程、章节、图表)添加标签以方便引用,在打标签的时候最好遵循一个统一的格式:

  • 方程:\label{eq:xxx}
  • 章:\label{chap:xxx}
  • 节:\label{sec:xxx}
  • 图:\label{fig:xxx}
  • 表:\label{tab:xxx}

在引用时通常使用\ref{xxx:xxx},对于方程可以使用 \eqref{xxx:xxx},它会自动给公式编号加上括号。

空格与换行

整理一下关于LaTeX中空格相关的排版细节:

  • 在 LaTeX 中的空格是有意义的,在行末的单个换行符也被视为空格。多个连续空格会被视为一个空格。
  • ~ 在插入空格的同时不允许在空格处换行,通常用于人名之间,避免名字和姓氏被放在不同的行。
  • 使用 \ 进行强制空格插入,通常用在需要明显分隔的字符之间,例如在两个字母之间插入额外的空格,a\ b
  • 除了标准空格长度,还有一些命令可以更精细地控制排版间隙:
    • \!:一个负空格,缩小间距
    • \,:一个细小的空格(小于普通空格)
    • \::中等大小的空格(大于 \,
    • \;:比 \: 更大的空格
    • \quad\qquad:相对较大的空格,分别是当前字体中一个字宽和两个字宽。
  • 在数学公式中,空格通常会被忽略,LaTeX 会自动调整数学公式中的间距,也可以使用上面提到的 \,\: 等命令来手动调节空格。

整理一下关于LaTeX中换行相关的排版细节:

  • 在 LaTeX 中连续两个换行符(即产生一个空行)会将文字分段,这是最常见的用法。多个连续空行仍然被视作一个空行。
  • \par 命令可以用于结束当前段落并开始新段落,与空行的效果是一样的。(但是不建议使用,\par更适合用于宏定义中)
  • 使用 \\\newline 可以强制当前行结束并开始新的一行。两者并不等价,例如\\可以加参数:使用 \\[length] 可以在换行的同时调整行间距,例如\\[1cm]
  • \\* 在强制换行的同时不允许在换行处分页
  • 在数学公式和表格中的换行有专门的机制,通常使用\\

水印

给PDF文件加上水印也是一个常见的需求,比如标记文档的来源,或者标记当前版本为草稿等。

可以使用下面的宏包和代码实现

1
2
3
4
5
\usepackage{draftwatermark}

\SetWatermarkText{Draft} % 设置水印内容
\SetWatermarkLightness{0.9} % 设置水印透明度 0-1, 1为透明看不见
\SetWatermarkScale{0.6} % 设置水印字体大小 0-1

注意:

  • 默认给所有页加水印,导入宏包时加参数firstpage则只有第一页添加水印;
  • 水印的文字只会在页面中央出现一次,不会循环出现;
  • 这个宏包提供的水印在图片上不会出现,图片会覆盖水印,如果需要保证在顶层的水印,也可以通过tikz实现。

例如可以在水印中添加作者(标注来源),编译日期(区别版本)等信息

1
2
3
4
5
6
7
\usepackage{draftwatermark}
\usepackage{datetime}

\newdateformat{tmpdate}{\THEYEAR-\twodigit{\THEMONTH}-\twodigit{\THEDAY}}
\SetWatermarkText{<Author> \\ \texttt{\tmpdate\today}}
\SetWatermarkLightness{0.9}
\SetWatermarkScale{0.6}

待办

LaTeX有一个todonotes宏包,可以用来进行一些标注

1
\usepackage[color=green]{todonotes}

在指定位置使用\todo{xxx}\todo[color=green]{xxx}即可在页边加上备注,并且使用横线指向对应位置。

它还提供了一个命令可以生成默认图片在排版中起到占位的效果。

1
\missingfigure{xxx.}

需要注意的是,\todo命令最好不要放在一些特殊环境中,否则容易导致编译错误。

谷歌学术 bibtex

在谷歌学术上获取文献bibtex的步骤比较麻烦,下面的油猴脚本可以做到一键复制,非常方便。

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
34
35
36
37
38
39
40
41
// ==UserScript==
// @name 谷歌学术直接复制bibtex
// @namespace blog.icespite.top
// @version 0.3
// @description 在学术网站上直接复制bibtex到剪贴板,免去跳转步骤,请在设置中开启“导入BibTeX”按钮。
// @author IceSpite
// @match https://scholar.google.com/scholar*
// @match https://scholar.google.com.hk/scholar*
// @require https://unpkg.com/jquery@3.7.1/dist/jquery.js
// @connect scholar.googleusercontent.com
// @grant GM_setClipboard
// @grant GM_xmlhttpRequest
// @run-at document-end
// @license MIT
// @downloadURL https://update.greasyfork.org/scripts/442869/%E8%B0%B7%E6%AD%8C%E5%AD%A6%E6%9C%AF%E7%9B%B4%E6%8E%A5%E5%A4%8D%E5%88%B6bibtex.user.js
// @updateURL https://update.greasyfork.org/scripts/442869/%E8%B0%B7%E6%AD%8C%E5%AD%A6%E6%9C%AF%E7%9B%B4%E6%8E%A5%E5%A4%8D%E5%88%B6bibtex.meta.js
// ==/UserScript==

(function() {
'use strict';
var ALERT = true;
$('a.gs_nta.gs_nph').each(function() {
if (this.classList.length==2) {
var that = this;
this.onclick = function() {
GM_xmlhttpRequest({
url: that.href,
onload: ({
responseText
}) => {
GM_setClipboard(responseText);
if (ALERT) {
alert('复制成功:\n' + responseText);
}
}
});
return false;
}
}
})
})();

filecontents

有时候,我们只需要在文档中使用一两个参考文献,或者需要提供单个文件的最小工作示例,单独创建一个bib文件看起来有的麻烦, 使用filecontents环境可以简化这种情况,例如在.tex文件中使用下面的片段

1
2
3
4
5
6
7
8
9
10
11
12
13
\begin{filecontents}{reference.bib}
@article{eigel2023dynamical,
title = {Dynamical Low-rank Approximations of Solutions to the {{Hamilton}}--{{Jacobi}}--{{Bellman}} Equation},
author = {Eigel, Martin and Schneider, Reinhold and Sommer, David},
year = {2023},
journal = {Numerical Linear Algebra with Applications},
volume = {30},
number = {3},
pages = {e2463},
issn = {1070-5325, 1099-1506},
doi = {10.1002/nla.2463}
}
\end{filecontents}

在编译时就会自动创建对应的临时文件并写入环境中的内容,默认还会加上一个注释头部(使用filecontents*环境则不会附带注释头部),完整内容为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
%% LaTeX2e file `./reference.bib'
%% generated by the `filecontents' environment
%% from source `main' on 2024/11/28.
%%
@article{eigel2023dynamical,
title = {Dynamical Low-rank Approximations of Solutions to the {{Hamilton}}--{{Jacobi}}--{{Bellman}} Equation},
author = {Eigel, Martin and Schneider, Reinhold and Sommer, David},
year = {2023},
journal = {Numerical Linear Algebra with Applications},
volume = {30},
number = {3},
pages = {e2463},
issn = {1070-5325, 1099-1506},
doi = {10.1002/nla.2463}
}

和其它杂项文件一样,这里的临时文件默认会生成在aux目录中,但是如果文件已经存在(aux目录或当前目录),则不会覆盖现存的文件,并发出警告。(虽然可以加上[overwrite]参数指定重写,但是一样会报警告)