从 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 中,参数只会被分隔,]
因为[
在检查可选参数时会被删除),#2
isxyz
和#3
is123
因为这些参数是未分隔的参数,因此采用单个标记或匹配的括号组,并且在扫描参数时会删除参数 2 和 3 周围的括号,并且不会形成一个组,所以最终结果是
something using abc, xyz and 123.
参数扫描内置于 tex-the-program 中的 tex 宏语言中,而不是格式中实现的。