LaTeX 参考资料
LaTex
20200614, 如何优雅地使用LaTeX写论文? - 陈林的回答 - 知乎
以下所列的内容,并没有特别的排序。其中有些很可能是个人的偏好。我根据我新学到的LaTeX格式上的知识会不断更新在最前面。如有错误,欢迎评论,我会修改并致谢。
-
区分
-
(hyphen,连字符,如model-based algorithm),--
(en-dash,表示范围,如page 3--7
)和---
(em-dash,破折号)三者不同的用法。 -
在displayed equation(比如
\[ 1+1=2 \]
环境中,如果这个公式是句子的结尾,要加句号,但是句号前面要有一点空格,我一般用\,
,如果再加上句号,就写成\[ 1+1=2\,. \]
。如果后面有句子,比如用来解释其中字母含义的where,要加逗号,写成\[ 1+1=2\,, \]
。 -
在公式中的省略号用
\dots
(或者\ldots
和\cdots
,其中\dots
会根据上下文变成\ldots
或者\cdots
),不要手动写三个点。 -
如果希望括号随着括号中的内容的大小能自动变化,则使用
\left(\right)
、\left[\right]
、或者\left\{\right\}
。 -
有一个package叫paralist,提供了行距比较小的enumerate和itemize环境,叫做
compactenum
和compactitem
,还提供很多其他的功能,有兴趣可以看看文档。 - 引用文章时如果有会议或是期刊的版本,则引用之,尽量不要引用arXiv。如果没有会议或期刊版本而有arXiv版本,则引用arXiv版本。
-
不要引用Wikipedia,它不是正规的学术出处。 (感谢@Enrique Juan
:引用wikipedia内容的正确姿势是看wiki条目中标注的原始来源,好的条目通常会注明引用自哪篇学术文章或新闻报导。)
- 如果觉得LaTeX的article环境的页边距(margin)太大,可以用fullpage包。
-
如果
e.g.
、i.e.
和i.i.d.
等缩写不在句子结尾,且后面没有标点符号(比如逗号),则需要加\
再加一个空格,写成e.g.\ apple
,否则LaTeX会认为这是一个句子的结尾而增加空白(除非是french spacing)。 最容易犯此类错误的可能就是i.i.d.
了。 -
表示引用或强调的斜体一般用
\emph
而不是\textit
,这是因为后者在上下文是斜体的环境(比如定理环境)中不会变成别的字体,而依然是斜体,起不到强调作用。 -
如果公式里字母的下标是文字,使用
\textnormal
,比如P_{\textnormal{total}}
,它不会随着外在环境的字体而改变,而且大小一般也是正确的。 -
在使用
align
环境的时候,如果定位符&
在等号(或者大于号、小于号等)后面,要加{}
,写成={}&
,因为&
会吃掉前面的空格。 -
不要用数学公式或者数学符号作为一个句子的开头。也不要用拉丁缩写如
I.e.
开头。 -
了解
natbib
的引用命令\citep
和\citet
。\citep
一般会产生带括号的引用,如[1]
或者(Chen et al., 2019)
,取决于设定的引用风格。而\citet
会产生带有作者名字的的引用,一般用于做主语,如Chen et al. (2019) proposed an interesting algorithm.
-
引用文献前应该有空格,例如
The Hello World algorithm [1]
。个人比较喜欢在此处用~
来产生空格。 -
书写(有姓和名等几个部分的)西方人名的时候,用
~
产生空格,这样名字不会被分成两行。 -
如果需要使用自己定义的文字型的数学运算符,比如conv表示凸包,需要用
\DeclareMathOperator
或者\DeclareMathOperator*
(这两者在公式是displayed的时候下标的位置不同)或者\operatorname
,不要用\mathrm
或者\text
等。(@卧在角落的猫提到的\mathop,可以参看 https://tex.stackexchange.com/questions/84302/what-is-the-difference-of-mathop-operatorname-and-declaremathoperator 。正如上面的链接所指出,依然建议只用\operatorname
,\DeclareMathOperator
和\DeclareMathOperator*
) -
引用数学公式用
\eqref{eq:equation-name}
,不需要像这样手动加括号(\ref{eq:equation-name})
。 -
有能够自动给长公式分行的包叫
breqn
,但是有时不够智能。 -
cleveref
包会根据标签类型自动加上前缀,比如某个label是属于一个section的(比如\label{sec:intro}
),那么用\cref{sec:intro}
就会产生Section 1
(如果这个section编号是1,前面的Section前缀是自动产生的)。如果label是一个定理,也会自动产生Theorem前缀。通常我们希望前缀是大写的,所以用\usepackage[capitalize]{cleveref}
。 -
\label{}
里面标签的命名分为两段,前面是类型名,后面是具体的标签名,中间用冒号隔开,比如\label{sec:introduction}
是给introduction这个section的标签,再如\label{thm:main}
是给一个定理环境的标签。这样的好处是LaTeX的IDE可以在输入类型名的时候自动对文章的标签进行过滤,只显示这个类型名的标签。常用的类型名如sec
: sectionsub
: subsectionalg
: algorithmthm
: theoremlem
: lemmacor
: corollaryrmk
: remarkdefn
: definitionit
: item (用在enuemrate, itemize等环境中)tab
: tablefig
: figureln
:line(算法的某一行)
- 批量定义 mathcal, mathbb, mathbf 字母的 macro
\usepackage{forloop}
% Caligraphics and Board Letters
\newcommand{\defcal}[1]{\expandafter\newcommand\csname
c#1\endcsname{{\mathcal{#1}}}}
\newcommand{\defbb}[1]{\expandafter\newcommand\csname
b#1\endcsname{{\mathbb{#1}}}}
\newcommand{\defbf}[1]{\expandafter\newcommand\csname
bf#1\endcsname{{\mathbf{#1}}}}
\newcounter{calBbCounter}
\forLoop{1}{26}{calBbCounter}{
\edef\letter{\Alph{calBbCounter}}
\expandafter\defcal\letter
\expandafter\defbb\letter
\expandafter\defbf\letter
}
\forLoop{1}{26}{calBbCounter}{
\edef\letter{\alph{calBbCounter}}
\expandafter\defbb\letter
\expandafter\defbf\letter
}
这样 对于26个字母都定义了 macro,比如\cR 就等价于 \mathcal{R},\bR 等价于 \mathbb{R} ,\bfx 等价于 \mathbf{x} 。