那么,宏到底是什么?

那么,宏到底是什么?

从 catcode 列表中,\开始新的控制序列、{开始一个组并}结束一个组。在 LaTeX 中,宏显示为

\foo[opt-arg]{arg1}{arg2}

然而,TeX 似乎没有控制序列的参数的概念,那么这里发生了什么?

答案1

宏是用\def\gdef或定义的任何控制序列(\edef或活动字符) \xdef。TeX 宏最多支持九个参数,这与您关于它没有控制序列参数概念的说法相矛盾。

参数最常见的用法是“非限定”形式;比如说你

\def\foo#1{--#1--}

so\foo接受一个参数。在\foo使用时展开时,TeX 会查找下一个标记;如果是{(准确地说,是类别代码为 1 的字符标记),则 TeX 会查找匹配的整个标记列表}(准确地说,是类别代码为 2 的字符标记),然后删除括号并替换\foo{<...>}

--<...>--

(其中<...>表示按照指定的方式确定的标记列表)。否则,下一个标记<token>用于替换,并得到

--<token>--

因此,例如,\foo{abc}\foo x将分别导致

--abc--
--x--

请注意,\newcommand在 LaTeX 中使用\def未限定的参数,除非它有定义命令名称后的可选参数。上述 LaTeX 定义如下

\newcommand{\foo}[1]{--#1--}

然而,论点也可以被界定;如果我们这样做

\def\foo[#1]#2{--#1--#2--}

那么 的第一个参数将是出现在(必须跟在 后面)和 的下一个(必须)出现\foo之间且在同一括号级别的 中的任何内容;然后第二个参数将像前面一样确定。因此将导致[\foo]\foo[x]{yz}

--x--yz--

(如果没有留下不平衡的括号,则分隔符标记将与一组可能的外部括号一起消失)。

LaTeX 使用此功能来引入带有可选参数的命令。定义如下

\newcommand{\foo}[2][default]{--#1--#2--}

将设置事物,以便\foo{abc}\foo[x]{abc}将分别导致

--默认--abc--
--x--abc--

基本上,上面\newcommand定义了两个宏,\foo\fooOPT;当\foo被展开时,TeX 会检查是否[跟进。在这种情况下,它被替换为,\fooOPT然后正常展开,定义为

\def\fooOPT[#1]#2{--#1--#2--}

如果[后面没有,\foo则用 替换\fooOPT[default]。实际上,\fooOPT\\foo(名称中有一个反斜杠,但基本无关紧要)。 的定义\foo(非常简单):

\def\foo{\@ifnextchar[{\\foo}{\\foo[default]}}

答案2

{}在 TeX 中有两个不同的用途,即分组和定界宏参数(当它们确实不是组成一个团体)。

忽略乳胶细节和使参数可选的测试,然后

\foo[arg1]{arg2}{arg3}

在 tex 基元中定义为

\def\foo[#1]#2#3{something using #1, #2 and #3}

因此使用如下

\foo[abc]{xyz}{123}

然后#1就像abc 论点一样分隔by [and ](实际上在 latex 中,参数只会被分隔,]因为[在检查可选参数时会被删除),#2isxyz#3is123因为这些参数是未分隔的参数,因此采用单个标记或匹配的括号组,并且在扫描参数时会删除参数 2 和 3 周围的括号,并且不会形成一个组,所以最终结果是

something using abc, xyz and 123.

参数扫描内置于 tex-the-program 中的 tex 宏语言中,而不是格式中实现的。

相关内容