(八)宏

什么是宏?它是一个计算机术语,理论解释为根据一系列预定义的规则替换一定的文本模式,这理解起来很抽象,结合实际生活中的例子,我们可以把它理解为批量铸造工艺品的过程,只需要在初次设计制造工艺品时精心去完善它,随后便可以以其为模板制造模具,批量生产相同的工艺品,而写好的宏就像是这里的模具。

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}
$$

\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}
$$

\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)
$$

\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 \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
$$

\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)
$$

\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被修改的影响。


此篇完结~
如有错误望指正!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容