什么是宏?它是一个计算机术语,理论解释为根据一系列预定义的规则替换一定的文本模式,这理解起来很抽象,结合实际生活中的例子,我们可以把它理解为批量铸造工艺品的过程,只需要在初次设计制造工艺品时精心去完善它,随后便可以以其为模板制造模具,批量生产相同的工艺品,而写好的宏就像是这里的模具。
1. LaTeX宏
所谓LaTeX,是运行于基本TeX上的一集宏,LaTeX中提供定义新命令的方法。定义可以在定义之后文本的其他数学公式间生效,在要使用之前书写一次即可。
1.1. newcommand
想要简单的定义新命令,只需在你将要使用新命令的公式代码前使用\newcommand{\<新命令名>}[<参数个数>]{<定义代码>}
即可,其中参数个数是1~9
的整数,定义代码中的形参使用#1~#9
表示,使用新命令采取\新命令名{<参数1>}{<参数2>}...{<参数9>}
的格式。
我们定义\SES
命令并在同一公式块中就能使用它(简书MathJax的使用限制)。
$$
\newcommand{\SES}[3]{0 \to #1 \to #2 \to #3 \to 1}
\SES{A}{B}{C}
$$
1.2. renewcommand
如果新定义的命令与已有命令重名,则无法用\newcommand
来定义,这时候可以使用 \renewcommand
,强行定义新命令。具体格式为\renewcommand{\<旧命令名>}[<参数个数>]{<新定义代码>}
,我们重定义并使用命令:
$$
\renewcommand{\SES}[3]{1 \leftarrow #1 \leftarrow #2 \leftarrow #3 \leftarrow 0}
\SES{A}{B}{C}
$$
2. TeX宏
TeX宏比LaTeX宏更加基本,在MathJax功能也更强大。其定义也可以在定义之后文本的其他数学公式间生效,在要使用之前书写一次即可。
2.1. def
def的用法为\def \<命令名><参数代码>{<定义代码>}
,其参数代码复杂多变,因此也非常强大,借助它可以得到一些不同寻常的命令。参数代码与定义代码中的形参使用#1~#9
表示。
为了表现参数代码的特别之处,我们尝试定义\exchange
,随后使用定义的\exchange
:
$$
\def \exchange(#1,#2){#2 \quad and \quad #1}
\exchange(left,right)
$$
我们可以发现由于\newcomand
这类命令只能设定参数个数而不能实现如上所示的功能。
在这里我们展示使用\def
初步扩展数学公式的演示,原生MathJax是不支持带方向的围道积分号的,好在我们可以使用已有的功能实现它,但是不免需要每次输入冗长的代码,显然这可以使用\def
解决。另外,该围道积分是具有方向性的,因此我们使用参数代码解决这个问题:
$$
\def \cin {\curvearrowright}
\def \cout {\kern{-2pt} \curvearrowleft}
\def \coint(#1,#2){\huge
\oint
\kern{-18.9pt} \raise{2pt} {\Large #1}
\kern{-5pt} \lower{8pt} {\normalsize #2}
}
\coint(\cin,M) {
f(z)\,\mathrm{d}z
=-\coint(\cout,M) {
f(z)\,\mathrm{d}z
}
}
$$
最后强调\def
不能以递归的方式使用:
$$
\def \x {\x}
\x
$$
上面的公式无法显示并不是因为语法错误而是定义有递归,由于MathJax没有\edef
的功能,所以我们杜绝使用递归定义新命令。
2.2. let
let命令是另一个重要的宏定义命令,它可以让一个新宏定义等于另一个已定义宏的当前定义,以\let \<新命令名> = \<旧命令名>
格式使用。它经常用来在重定义一个宏之前保存这个宏原来的定义,比如我们想保存当前已定义的\exchange
命令到\pastexchange
,随后修改命令\exchange
,最后分别使用\pastexchange
和\exchange
命令:
$$
\def \exchange(#1,#2){#2 \quad and \quad #1}
\let \pastexchange = \exchange
\def \exchange(#1,#2){#2 \quad or \quad #1}
\pastexchange(left,right) \to
\exchange(left,right)
$$
我们看见\pastexchange
保存了原本的\exchange
,且不受\exchange
被修改的影响。
此篇完结~
如有错误望指正!