但对于一般人而言,你不需要通过学习 Vim 来达到高效编辑 LaTeX 的方式。而是通过一些比较容易实现的方式,使得你能够在原来的基础上更加高效得使用 LaTeX,并达到以思考的速度输入 LaTeX 的方式。
在第一部分,我会首先介绍高效编辑 LaTeX 文档的几种方式,这能够让你在短时间内迅速提高你的 LaTeX 输入速度。
而第二部分,则是将输入 LaTeX 中遇到的常见问题进行一个总结,例如输入数学字母、自定义定理类环境、参考文献的设置等等。尽管网络上已经有各种各样的教程教你如何使用这些特殊的环境,但搜索时依然能搜索到很多没有用的方案。这是因为你用的 TeX 版本可能跟作者不同,或者是作者所说的方案已经过时但网站没有及时更新等等。我在这里给出我对这些基本环境的一个使用,并会经常进行更新。
我用的 TeX 编译器主要是 TeXPadTeX,这是一款支持实时编译的 TeX 编译器,而不需要手动进行编译。而在 TeXPadTeX 无法处理的文档时,我会选择使用 TeX Live。TeXPadTeX 基本兼容 TeX Live,在使用上没有太大的区别。而对于 CTeX,我由于没有安装 CTeX,所以无法测试。
目录
-
高效编辑 LaTeX 文档的几种方式
-
数学字母
-
自定义定理类环境
-
插入图片
-
参考文献
1 高效编辑 LaTeX 文档的几种方式
1.1 实时预览
用 LaTeX 写文档很好,但它也有一个很明显的缺点,那就是用 LaTeX 写出来的文档,并不是所见即所得。不论是正文还是数学公式或者是参考文献,都需要将其写入 TeX 文件,并进行编译以后才能生成 PDF。而在预览 PDF 文件时,如果你发现有些地方存在书写错误,你就需要更改相应的 TeX 文件,并再次进行编译才能够生成新的 PDF 进行预览。
非所见即所得的 LaTeX 造成了很多困扰,这表示你必须编译以后才能看到内容上的错误,而修改内容又需要重新编译,这是一个重复性操作。另一方面,你只有在编译时,才能够发现 TeX 代码中的错误,这在后期调试时十分不方便。
尽管现在已经有越来越多的编辑器支持「实时预览」,也就是所见即所得。但不论是在功能上,还是体验上,都比不上 TeXPad 这款软件。TeXPad 的一个特色就是左侧编辑右侧预览,几乎无任何延时,并且在报错上也是十分灵敏,方便你在编写的过程中找到错误。
实时预览与实时报错演示
TeXPad 对新手十分友好,通过实时预览和实时报错,能够在入门 LaTeX 时节省很多的时间在调整细节和纠错上。有许多 LaTeX 老手并不喜欢这样的模式,认为再复杂的式子他也可以快速输入。我曾一度也如此认为,直至有一次要输入以下公式:
输入复杂的公式
这个公式的复杂,让我深切体会到 TeXPad 实时编译实时预览的好处。向量需要加粗,括号需要变大,上标需要加上小括号等等。如果没有实时预览,只要有一处没有考虑到就需要重新修改重新编译重新预览,反复如此。而有了实时预览之后,就可以一次性将这个公式打出来。
1.2 文本扩展
在 LaTeX 中插入一张图片或者一个表格并不容易。对于插入图片而言,要定义 figure 环境,设置图片位置、图片的文件名,图片标题等等。对于插入表格而言,需要定义 table 环境,设置表头、对齐方式、表格具体内容等等。插入图片和表格的代码相对比较复杂,不容易记忆。
好在插入图片或者插入表格都有固定的规律可循。比如,插入图片时,我们通常使用类似这样的代码:
\begin{figure}[ht] \centering \includegraphics[width=0.8\textwidth]{x2} \\[0mm] \caption{$y=x^2$} \label{fig:x2} \end{figure}
这样,对于每一张图片,只需这三个大括号中依次填入: 图片名称、图片标题、标签即可。通过 Keyboard Maestro 或 Text Expander 等等软件能够十分方便得通过这三条信息来生成一段插入图片的 LaTeX 代码。例如我设置通过输入 ffig
来插入一张图片,此时会弹出一个对话框,这个对话框就要求我输入这三条信息,输入完成后点击 OK,即可在当前应用程序中生成一段插入指定图片的 LaTeX 代码。
快速插入一张图片
这样的场景在 LaTeX 中十分常见,例如 align
环境、itemize
环境、array
环境、section
环境等等都可以通过这样的方式来自动插入 LaTeX 代码。
使用文本扩展不仅仅意味着你可以少输入很多字母,它更深刻的用处是在你不需要去记忆任何环境的代码规则。在一台新的电脑上,我无法在不查找资料的情况下在 LaTeX 中插入一张图片,但在我自己的电脑上,我很轻松的通过 Keyboard Maestro 来插入一张图片。
1.3 设置缩写
在 LaTeX 中,可以给常用的命令设置缩写。例如在公式中需要对向量 x
进行加粗,但每次都采用 \bm{x}
来进行加粗会比较麻烦。这时我们可以通过 \def
来指定缩写,例如 \def\bx{\bm{x}}
,此时 \bx
与 \bm{x}
完全等价。
设置缩写
通过设置缩写,可以将 LaTeX 中较长的代码直接通过一个小命令来使用,这在编写 TeX 文档时可以节省不少时间。
1.4 文本扩展与缩写的比较
文本扩展是通过设置短语,来实现快速输入,在内容上与原来完全一致。而缩写则是通过在导言区定义新的命令,在正文中可以通过这个命令来达到指定的功能。他们的优缺点分别有:
-
文本扩展的优点
-
可以设置模板 (例如插入图片、表格等等)
-
简化了打字方式,但在内容呈现上与原来一样
-
文本扩展与当前软件无关,无论是在不同的文件中,甚至在不同的软件中,文本扩展永远可以使用
-
缩写的优点
-
复杂公式中,更加容易看清公式的结构
-
文本扩展的缺点
-
所有内容都是按照原样来写,这样复杂的公式的代码会超级长
-
缩写的缺点
-
在每一个文件中,都需要设置缩写才可以使用
-
不同的人对于缩写的设置习惯不同,不利于协作
以上就是文本扩展和缩写的比较,在实际使用中,我们需要结合起来使用。
1.5 使用 MathPix 识别公式
Mathpix Snip 是一个能够将图片中的公式转成 LaTeX 代码的工具,它能够通过截取你想要识别的公式,并输出 LaTeX 代码。
图片转 LaTeX 的工具很多,但大部分软件做得不是太好,识别准确率也不高。很多软件虽然可以识别,但后期的修正 bug 会浪费很多的时间。而 MathPix 在识别准确率上做得很好,可以让你在截图以后直接可以放心使用识别出来的 LaTeX 代码,这非常快速并且节省时间。
通过 MathPix 截图并转换成 LaTeX 代码
下面是转换完成的 LaTeX 代码,整体来说还是转换的很不错的。
$$ \frac{\partial}{\partial \theta} \int \psi_{\theta}(x) d \nu=\int \frac{\partial}{\partial \theta} \psi_{\theta}(x) d \nu $$
总结
工欲善其事,必先利其器。在学习上我们不应该偷懒,但在写 LaTeX 代码上,我们应该用最高效地方式来进行编写,以达到节省时间节省精力的目的。通过一款支持实时预览的编辑器,使用文本扩展和缩写相结合,再配合 MathPix 之类的图片转 LaTeX 工具,这将让你编写 LaTeX 代码足够地高效。
2 数学字母
在数学公式中,你可能需要为公式中的字母设置字体,例如向量或矩阵的加粗、线性变换的花体、数集的字体等等。
几种常用字体
2.1 清除公式中的字母格式
在数学公式中,直接输入的字母都会变为斜体。例如输入 sin(x)
会得到一个全是斜体的 sin(x)
,通过 \sin(x)
进行输入则其中的 sin
为正体。
左: sin(x),右: \sin(x)
但公式中,并不是所有的数学符号都在 LaTeX 中有对应的命令。例如矩阵的迹: tr
或者 trace
,在 LaTeX 中并没有特定的命令来输入。这时,可以通过 \mathrm{}
来进行输入。
左: tr(A),右: \mathrm{tr}(A)
通过 \mbox{}
来进行输入时,也可以达到一样的效果,但这两种方法在字体和字母间距上有细微差别。
2.2 字母加粗
对于公式中的向量或者矩阵,常常需要对字母进行加粗。对字母进行加粗有两种情况,一种是字母为正体并加粗,一种是字母为斜体并加粗。这两种分别可以通过 \mathbf{}
和 \bm{}
来实现。其中 bm
需要引入一个包: bm
。
\bm{u},\bm{v}\in\mathbf{Col}(\mathbf{M})
2.3 使用花体字母
在有些情况下,你可以需要使用到花体字母,例如描述线性空间的线性变换等等。花体字母常用的有两种,\mathcal{}
与 \mathscr{}
,其中 mathscr
需要引入包: mathrsfs
。
\mathcal{A}\in \mathrm{End}(V)
2.4 使用空心字母
在描述数集时,常采用空心字母来表示。通过 \mathbb{}
能够输入空心字母,需要引入包: amsfonts
。
a, b, c\in\mathbb{R}
2.5 其他数学字母
其他数学字母
图片来源: Texdoc Symbols
3 自定义定理类环境
定理类环境是指,文档中关于定理、引理、命题、推论等等的环境。LaTeX 可以实现自定义定理类环境,包括设置排序单位、设置字体、分隔符等等。在 LaTeX 中,自定义定理类环境不需要另外的包 (网络上大多的资料都提示需要 amsmath
这个包,但我不用这个包的时候也能够正常运行),但在调整定理类环境的样式时需要使用 ntheorem
这个包。
3.1 基本语法
通过在导言区添加 \newtheorem{环境名}{标题}[排序单位]
即可自定义定理环境。其中:
-
环境名: 必选参数,在你的 TeX 文件中,
\begin{}\end{}
中大括号内的内容。 -
标题: 必选参数,在你的 PDF 文件中,该环境显示出来的内容。
-
排序单位: 可选参数,设置你的自定义环境自动标号的内容。
未设置排序单位
-
定理名字: 可选参数,在
\begin{}[]\end{}
中中括号内的内容即为定理的名字,会通过小括号显示在定理中。
设置定理名字
3.2 排序单位
-
取消排序: 若需要取消定理类环境的编号,你只需在定义定理类环境时,加上星号。
取消排序
-
按照
section
或subsection
等排序: 只需在排序单位中设置即可。
按照 section 排序
-
将
theorem
,lemma
等统一编号排序: 此时要将theorem
用中括号的形式放入环境名和标题之间,不可放至末尾。
theorem, lemma 统一编号
3.3 设置字体
-
定理类环境默认的字体为斜体,可以通过
\theorembodyfont
来设置字体,其中\upshape
为正体,\itshape
为斜体。\theorembodyfont
必须放在newthorem
的上方。
将定理类环境中的内容设置为正体
-
需要注意的是,这个设置会对接下来所有定义的
newtheorem
都会产生影响。在仍然需要设置斜体时,可以通过\theorembodyfont{\itshape}
将字体变为斜体。
设置正体和斜体
3.4 设置换行
-
可以通过设置
\theoremstyle{break}
来使定理和正文中进行换行。\theoremstyle
必须放在newthorem
的上方。
设置换行
-
这个命令会对接下来所有定义的
newtheorem
都会产生影响,可以通过\theoremstyle{plain}
使其恢复为原来的样式。
3.5 设置分隔符
可以通过 \theoremseparator{}
设置定理和正文的分隔符。
设置分隔符
4 插入图片
4.1 插入单张图片
插入图片需要引入包: graphicx
,通过 \includegraphics
即可插入一张图片。但一般情况下,你需要将图片放入到一个 figure
环境中。默认情况下,在一个空白页中,图片会插入到页面中间,但在一个非空白页中,图片会插入到页面顶部。若想要图片按照你指定的位置来进行插入,那就需要设定 figure
环境的参数。
没有设置任何参数时,图片显示在顶部
figure
环境包括 4 个参数:
-
h: here,此处
-
t: top,页顶
-
b: bottom,页底
-
p: page,独立一页
在设置参数时,通常使用 ht
。这表示 LaTeX 试图将图片放在此位置,如果不行 (此处没有足够的空白能够插入该图片) 则会将图片放在新页面的顶部 (如果页面为空时,放入页面中央)。
在设置好图片放置的位置以后,还需要设置图片居中,使用 \centering
即可设置图片居中。
接下来可以插入图片了,插入图片的命令是 \includegraphics{}
,大括号中输入图片的文件名即可,在不引起混淆的情况下,可以不输入文件的扩展名。可选项为设置图片的大小,一般情况下,设置图片宽度占文字宽度的多少即可,例如: width=0.8\textwidth
。
之后则是设置图片与标题的距离、标题、标签等等。这就得到插入一张图片时需要的代码:
\begin{figure}[ht] \centering \includegraphics[width=0.8\textwidth]{} \\[0mm] \caption{} \label{} \end{figure}
4.2 插入两张图片并水平排列
与插入一张图片的方式基本相同,只不过需要使用 minipage
包将图片进行包裹,并分别设置宽度即可。
插入两张图片并水平排列
代码如下:
\begin{figure}[ht] \centering \begin{minipage}[t]{0.48\textwidth} \centering \includegraphics[width=0.8\textwidth]{x2} \caption{$y=x^2$} \end{minipage} \begin{minipage}[t]{0.48\textwidth} \centering \includegraphics[width=0.8\textwidth]{x3} \caption{$y=x^3$} \end{minipage} \end{figure}
4.3 设置图片存放路径
在图片较多的情况下,将图片都存放在根目录会导致根目录文件较多。但如果将图片保存在子目录,那插入图片时会比较麻烦,每次都需要写上子目录的名称。你可以通过设置图片存放路径的方式,使得图片存放指定的目录,并在插入图片时直接使用图片名称即可。
通过 \graphicspath{{figures/}}
可以设置图片的路径为 figures/
,此时即可将图片存入该文件夹,而在代码中,可以直接通过文件名进行调用。
5 参考文献
在写文章的过程中,参考文献的引用是一个很重要的部分,但同时这也是一个很复杂的事情,这体现在以下几个方面
-
参考文献对大小写,正体斜体等的要求极其严格,并且有不同的规范。
-
正文中引用参考文献时有很多不同的格式,例如通过
[1]
、[2]
等等的数字进行引用,或者通过Erhan et al. (2010)
这样的作者年份来引用等等。 -
在文章的参考文献页,各参考文献的排序方式有很多规范,例如通过引用顺序进行排序或者通过作者名字进行排序等等。
在 LaTeX 中,自动生成参考文献也有诸多不同的方式。这里以 natbib
这个包来做示例,正文中显示的引用为作者加上年份,参考文献按照作者名字进行排序。对于别的参考文献样式,只需进行少许更改,即可达到指定的要求。
5.1 基本结构
首先你要引入包 natbib
并设置参数 authoryear
和 round
。这里的 authoryear
表示要显示的内容,而 round
表示年份用小括号进行包裹 (默认用中括号进行包裹)。
然后你需要在 TeX 文档的末尾添加参考文献的文件,即在 \end{document}
之前加上以下两行:
\bibliographystyle{plainnat} \bibliography{reference}
这两行的顺序不能够调换,第一行表示参考文献的样式是 plainnat
,而第二行表示参考文献的文件是 reference
这个文件。这时,TexPad 会自动问我们是否需要新建该文件。
创建 reference.bib 文件
此时的 TeX 文件结构如下,并在目录中多出了一个 reference.bib
文件。
基本结构
5.2 bib 文件结构
这个 bib 文件其实是一个文献数据库,你可以将你所有阅读过的文献都放到这个文件中进行管理。需要注意的是,只有你在正文中引用到的文献,才会出现在参考文献的列表中。
bib 文件存放所有需要使用到的参考文献,对每一个文献,都有一个固定的格式,例如下述内容就代表一个文献。
@article{erhan2010does, title={Why does unsupervised pre-training help deep learning?}, author={Erhan, Dumitru and Bengio, Yoshua and Courville, Aaron and Manzagol, Pierre-Antoine and Vincent, Pascal and Bengio, Samy}, journal={Journal of Machine Learning Research}, volume={11}, number={Feb}, pages={625--660}, year={2010} }
这并不需要你手动进行输入,你可以通过任何文献管理软件如 Papers、EndNote 等等将文章引用为 BibTeX 格式,或者在 Google 学术上点击引用并选择 BibTeX。
从 Google 学术中获取 BibTeX 格式的参考文献
5.3 引用参考文献
在正文中引用参考文献的方式非常简单,只需输入 \cite{}
即可,此时 TexPad 会自动弹出一个框用于选择需要引入的参考文献。
引用参考文献
从上图中你也可以看到,References 下面的参考文献列表,会随着正文中引用的参考文献的变化而变化。而关于 Reference 与正文在同一页的问题,这只需在参考文献前添加 \newpage
即可。