札记(三)——公式
LaTeX是使用写代码的方式来排版的,而这恰恰就是让我们写文章时候一心一意只关注文章内容的绝佳方法。LaTeX比起其他排版软件最大的优势就是它的公式编辑功能。它的公式同样是通过代码来编写的,使用起来比起Word里面的通过上下间距调,通过文本框和直线调、MathType(不用TeX的情况下)优雅好多。
现在越来越多的公式编辑软件也加入了对于部分的支持,例如
- MathType可以输入LaTeX代码啦,但是还是不能宏定义什么的;
- Word自带的公式也可以编辑LaTeX数学代码啦,就是在不改变原始Cambria Math的前提下,奇丑无比,但是大部分人不会改字体;
- 甚至网站也开始支持数学公式了,但是实现途径有所不同,网页上主要通过MathJax来实现,但是在代码方面是与LaTeX基本兼容的;
但是即使这些其他的工具能够兼容LaTeX,但仅仅是兼容而已,LaTeX的数学公式编辑功能可不仅仅是编辑,它的公式编号和对齐功能也十分强大,具体的我会在下面的文章中谈到。
文章主要包括两部分:
- 正统的LaTeX公式编辑
- 奇奇怪怪LaTeX公式相关的工具和技巧
LaTeX公式编辑其实只需要自己动手排版一篇文章,在排版的过程中,去不断的充实自己的代码库就可以啦!针对这个公式编辑,我还是只推荐lshort这份文档,基本上把最基础的公式编辑都讲到了,具体更复杂的bing一下,404一下就可以了。这里呢主要提的还是些奇淫技巧,一些平常不一定会碰到,但是遇到就很棘手的问题。
公式编辑呢还是熟能生巧的问题,但是有些内容也不需要特别去背。那我手头的中文6.0版lshort来说,我觉得第四章别的部分看看就可,第52到55页( 表4.4-表4.14)建议大家可以打下来放在手边,用到可以看看,用着用着就熟悉了。表4.2的内容(数学字母字体)其实有时候也是挺常用的。
下面呢就来谈谈可能遇到的问题。
Part 0 准备
首先在写作之前我们需要引用相关的宏包,最著名的当然就是AMS宏集。AMS 宏集合是美国数学学会(American Mathematical Society) 提供的对LATEX 原生的数学公式排版的扩展,其核心是amsmath 宏包,对多行公式的排版提供了有力的支持。此外,amsfonts 宏包以及基于它的amssymb 宏包提供了丰富的数学符号;amsthm 宏包扩展了LATEX 定理证明格式。这里介绍的许多命令和环境依赖于amsmath 宏包。
(注意这边的引用是在sty文件中的引用,当放置到文中引用则应该改成\usepackage
)
1 | \RequirePackage{amsfonts,amsmath,amssymb} % AMS-LaTeX 符号、公式 |
Part 1 公式的编写
能够掌握lshort中的公式编辑其实已经完全足够了,这里只是提示几个杂项。
粗斜体
在国内,我们一般使用粗斜体表示向量、矩阵等,但是这个非常难打出来。
amsmath 提供了一个\boldsymbol
命令(由调用的amsbsy 宏包提供,这个宏包已经包括在上述package中了),在公式内部将一部分符号切换为粗体。
1 | \begin{align} |
算符的使用
LaTeX中的算符大多数是二元算符,除了直接用键盘可以输入的+、−、*
、/,其它符号用命令输入,常用的有乘号× (\times
)、除号÷ (\div
)、点乘· (\cdot
)、加减号± (\pm
) / ∓(\mp
) 等等。更多的见表格。
在LaTeX中,有部分函数是不需要通过例如\mathrm{}
来使其直立的,这些也被称为算符符号。LaTeX将数学函数的名称作为一个算符排版,字体为直立字体。其中有一部分符号在上下位置可以书写一些内容作为条件,类似于巨算符。不带上下限的算符最常见的就是三角函数、双曲三角函数等。带上下限的常用的有求极限、求确界、求最值等。利用算符\arg
和\min
或者\max
,就是我们熟悉的等。
行内公式中分数、巨算符的缩放
在行内公式中,巨算符的上下标往往会被放置到右侧,同时分数(fraction)也会变小,那么如何来让巨算符显示其原来的大小呢?这里有两种方法。
-
利用巨算符、分数本身的缩放
- 一般地,巨算符在行间公式显示成正常大小(求和Σ和求积Π的上下标显示在上下侧),而在行内公式则显示成缩小大小(求和Σ和求积Π的上下标显示在右侧)。我们可以通过巨算符本身就带有的
\limits
(上下方)和\nolimits
(右方)来控制; - 同时,分数也提供了比较方便的命令
\dfrac
(正常大小),和\tfrac
(行内缩小版)。
我们可以使用这些限制字符来使得巨算符和分数在公式中也能显示正常大小。
这里给出一个例子
1
2
3
4
5
6
7
8
9\begin{align}
\min &\,Z=\sum_{i \in \mathbb{I}} \sum_{j} \in B(j)\\
\mathrm{s.t.} &\left\{\begin{array}{llll}
\sum\limits_{i \in A(i)} V_i y_{ij} \le \sum\limits_{j \in A(i)} E_j x_j,\\
\sum\limits_{j \in B(i)} y_{ij} \ge 1, \forall i\in \mathbb{I}, \forall j \in B(j), \\
\sum\limits_{i \in A(i)} x_j \ge 1, \forall i \in \mathbb{I}, \\
y_{ij}\le x_j, \forall i\in \mathbb{I}, j\in \mathbb{J}. \\
\end{array}\right.
\end{align} - 一般地,巨算符在行间公式显示成正常大小(求和Σ和求积Π的上下标显示在上下侧),而在行内公式则显示成缩小大小(求和Σ和求积Π的上下标显示在右侧)。我们可以通过巨算符本身就带有的
-
使用万能的
\displaystyle
命令在行内公式出现前使用
\displaystyle
命令,即可将行内公式完全转化为行间公式,不需要单独调整巨算符和分数的大小,但是行间距会有一定的问题,显得比较局促。1
2
3
4
5
6
7
8
9
10\begin{equation}\left\{\begin{array}{l}
\theta_{1}=\displaystyle\frac{1}{L-2} \sum_{i=1}^{L-2} \Theta\left(D_{i}, D_{i+1}\right) \\
\theta_{2}=\displaystyle\frac{1}{L-3} \sum_{i=1}^{L-3} \Theta\left(D_{i}, D_{i+2}\right) \\
\theta_{3}=\displaystyle\frac{1}{L-4} \sum_{i=1}^{L-4} \Theta\left(D_{i}, D_{i+3}\right) \\
\dots \\
\dots \\
\theta_{\lambda}=\displaystyle\frac{1}{L-1-\lambda} \sum_{i=1}^{L-1-\lambda} \Theta\left(D_{i}, D_{i+\lambda}\right)
\end{array}\right.
\quad (\lambda<L-1)
\end{equation}
❗值得注意的是
在array、cases等环境内同样被认为是行内公式
这两者看似都是转化为行间公式其实是有所不同的,他们巨算符的大小是有区别的。
在文章中其实更加明显,使用
\displaystyle
命令的巨算符完全是行间公式大小的,而使用\limits
命令的还是会比行间公式的略小一点。
矩阵、数组
矩阵
矩阵的类型有很多这里就不多加赘述的给出常见的矩阵类型了。amsmath 宏包还直接提供了多种排版矩阵的环境,包括不带定界符的matrix,以及带各种定界符的矩阵pmatrix(()、bmatrix([)、Bmatrix({)、vmatrix(|)、Vmatrix(||)。
这里再给出一种比较特别的矩阵,它的行列分别有行标和列标。
1 | \begin{equation}\label{Eq:matrix} |
数组
数组最常用的其实也就是一个构建大括号条件格式。基本格式再lshort上也有,摘录在这里。
1 | \[ |x| = \left\{ |
1 | \[ |x| = |
Part 2 公式的对齐与编号
公式的编号是针对行间公式来说的,在科技论文和相关书籍中,编号能我们快速找到上下文需要对应的公式,在LaTeX制作的PDF版文档中则更胜一筹,你要你正确使用交叉引用,轻轻一点你就找到需要的公式啦!
基础中的基础
行内公式一般利用$
包裹即可。比如这个例子$\Delta=b^2-4ac$
,即。
单独成行的行间公式在LaTeX里由equation 环境包裹。equation 环境为公式自动生成一个编号,这个编号可以用\label
和\ref
生成交叉引用,amsmath 的\eqref
命令甚至为引用自动加上圆括号;还可以用\tag
命令手动修改公式的编号,或者用\notag
命令取消为公式编号(与之基本等效的命令是\nonumber)。
不带编号的行间公式有以下几种方式生成:
- 用
\[
和\]
包裹 - 用双美元符号包裹,即
$$
和$$
,这种在Markdown中是最常用的(Markdown仅支持采用美元符号引出LaTeX数学公式,使用单、双来区分行内和行间公式) - 使用displaymath环境
- 使用
equation*
环境
对齐与编号
谈到对齐不得不说的就是align和gather两大家族环境(姑且成为家族)。align这类环境重点就是按符号&对齐,gather这类环境重要的就是居中对齐。说到这里大家可能还无法理解,看了后续的例子就懂啦。
基础例子
基本的例子就是下面这两个
- **利用align环境使两个符号处对齐。**我们注意到公式在
&
符号处对齐了,而公示的换行则使用与表格类似\\
换行。
1 | \begin{align} |
- **利用gather环境进行公式的简单罗列。**有时候我们不需要按照等号或其他符号进行对齐,或者对齐后反而会使部分公式超出边距。(由于我不需要编号这里用的是gathered环境,其实也可以用
gather*
环境)
1 | \[\begin{gathered} |
2×3=6种派生环境
他们两个分别可以派生出三种环境
-
不加任何后缀,即align环境和gather环境。
- 已经囊括了数学环境,不需要在外层进一步添加类似equation环境等数学环境。
-
加
*
后缀,即align*
和gather*
环境- 同样已经囊括数学环境,但是他不会对公式进行编号,即带
*
环境的最常见用法。
- 同样已经囊括数学环境,但是他不会对公式进行编号,即带
-
加
ed
后缀,即aligned和gathered环境-
不包括数学环境,需要在外面再套一层数学环境的壳。
-
如果使用带编号的如equation环境,则变为多个公式共用一个编号。
1
2
3
4
5
6
7
8\begin{equation}
\begin{aligned}
a &= b + c \\
d &= e + f + g \\
h + i &= j + k \\
l + m &= n
\end{aligned}
\end{equation} -
如果使用不带编号的如
\[
和\]
包裹,则和带*
环境完全一致。也就是上面我举得那个例子。
-
归纳总结
以下有部分摘自lshort。
-
align 环境会给每行公式都编号。我们仍然可以用
\notag
去掉某行的编号。在以下的例子,为了对齐加号,我们将分隔符放在等号右边,这时需要给等号后添加一对括号{} 以产生正常的间距:1
2
3
4
5
6
7\begin{align}
a ={} & b + c \\
={} & d + e + f + g + h + i
+ j + k + l \notag \\
& + m + n + o \\
={} & p + q + r + s
\end{align} -
align 还能够对齐多组公式,除等号前的
&
之外,公式之间也用&
分隔:1
2
3
4\begin{align}
a &=1 & b &=2 & c &=3 \\
d &=-1 & e &=-2 & f &=-5
\end{align} -
多行对齐的且不需要编号的情况下,
\[
+aligned环境和align*
环境完全一致。 -
多行对齐带编号的情况
- 在使用多行公式每行都需要编号时使用基础的不加后缀的align和gather环境;
- 在多行公式只有最后一行公式需要编号时使用基础的不加后缀的align和gather环境,并使用
\notag
去掉某行的编号;当然这种情况也可以使用multline环境(详情请参考刘海洋老师的《LaTeX入门》) - 在多行公式共用编号的情况下,使用后缀
ed
环境辅以外部包裹equation环境。
其他杂类
此外我还遇到过的一些公式编号相关的内容在这边一并写一下。
共用主编号的子公式编号
在电磁场中,电位函数的边界条件常常需要用到子公式这一概念,即(6a),(6b)……。这里给出一个案例:
1 | \begin{subequations} |
这里使用到的是subequations环境,他同样已经包括了数学环境,不需要在外面再套equation环境。同时我们还初次碰到了alignat环境,它的参数表示的是几栏的意思。
这里写的内容都是我亲身碰到,并尝试过正确的方法。部分代码需要引用宏包,这里也不多说了。如果遇到其他的问题,不妨去刘海洋老师的《LaTeX入门》上找找,也可以在网络上找一找,这里不再多加赘述。
Part 3 奇奇怪怪LaTeX公式相关的工具和技巧
懒人工具、小白助手——Mathpix Snip
同样地,在文章的最前面推荐一个工具,那就是大名鼎鼎的Mathpix Snip(👉戳这边去官网)。这个小软件可以实现截图转LaTeX公式,甚至它能够生成内联公式、行间公式等不同格式供你选择。
使用方法如下:
同时最近它还支持了许多新特性,比如
但是美中不足的是,现在这个软件免费版每月只能识别50次,学生版凭学生邮箱可以识别100次。虽然有所限制,但是这个数量对于大部分不算特别常用人还是够用了。一般我只会在一些比较复杂的公式才用这个软件,简单的不如手撸代码😏。国产的部分OCR软件据说也有这样的功能了,我没用过,需要的同学可以到网上找找。
好用的技能——MathType公式与LaTeX代码的互转
有时候我们需要把别人在Word中写好的带有LaTeX公式文章贴到LaTeX里面,这就遇到了一个问题。MathType编辑的公式怎么贴过去呢。
笨办法
一种比较笨的办法就是先在MathType里面设置好粘贴的选项,然后一个一个贴。具体操作就是
-
打开公式编辑器
-
“预置”菜单中选择“剪切和复制预置“
-
在弹出的对话框中将对象选为”MathML或TeX“里面随便选一个就好
好办法
当然,我写博客怎么会就写这么一个本办法就出来招摇混骗呢,当然是有别的好办法咯。具体方法就是
- 选中需要转换的段落
- 按下键盘上的“Alt+\”
- 奇迹发生了,一段可以直接贴到LaTeX里面的文章出现啦!
奇怪的知识增加啦!——那么微信公众号里面能打LaTeX公式嘛
众所周知,生活在蓝星的微信公众平台是一种很奇特的编辑器,他啥排版、美化功能都没有,只能靠排版功能孱弱的秀米、135编辑器加持,更不要说加上对于数学公式的支持了。微信公众号,性格强硬,谁都不能驯服它。不过,记录历史我们是专业的。冒着生命危险,我们有幸记录下了,人类早期驯服野生微信公众平台的珍贵影像。哦,看呀,这个编辑器正在想尽办法,加入微信公众平台对数学公式的支持呢!……这就是大自然的力量,这就是人类的伟大。
——人类早期驯服之微信公众平台(灵感来源:b站up主人类早期驯服)
以上纯属胡扯,但是确实有一个编辑器在与微信公众平台的“不争”做着斗争,他就是Mdnice(👉戳这边去看看),他将数学公式转为矢量图放在微信公众平台中,比较好的解决了公众号的公式编辑问题。他还支持导出到知乎等平台。而且这个编辑器还有一个插件支持直接在微信平台编辑,保证公式的完整性。
同时,mdnice的开始文档还是一个非常好的Markdown教学文案,想学Markdown的同学也可以看着那个文档学。一不小心关掉了,还可以再开哦。
这边另外给出两篇使用mdnice编辑的公众号推文。是不是感觉很惊艳呢!我觉得全栈蓝这个主题真的很对我胃口。
最后一个——在线LaTeX数学公式编辑器
这是我在b站上看到的一个up主的在线LaTeX公式编辑器(👉戳这边看),还有好多别的up主也安利过这个网站。没有具体用过,但觉得还是挺不错的。
主界面是这样的
参考资料
- CTEX 开发小组.一份(不太)简短的介绍(中文版本:6.0)[EB/OL].https://mirrors.tuna.tsinghua.edu.cn/CTAN/info/lshort/chinese/lshort-zh-cn.pdf. 2018-09(最新的是2019-04的6.0.1版本)
- 刘海洋.LaTeX入门[M].北京:电子工业出版社.2013.
- Mathpix. https://mathpix.com/
- Mdnice. https://mdnice.com/
- 妈咪说MommyTalk. 如何优雅的编辑数学公式?LaTeX公式入门[V/OL].https://www.bilibili.com/video/BV14g4y1q7pb?from=search&seid=3393676273831028218. 2020-06-18/2020-07-12
- 在线LaTeX公式编辑器. https://www.texlive.com/