在 LaTeX 中可以写出类似 的表达式\frac12
,它应该等同于 这样的表达式\frac{1}{2}
。第一种符号形式有正式的术语吗?
答案1
不。
这只是 TeX 吸收非分隔宏参数的正常方式的一部分。如果你定义
\def\foo#1{Something using #1 (or not).}
或者等价地
\newcommand\foo[1]{Something using #1 (or not).}
当\foo
扩展时,它会吸收输入流中的下一个标记或平衡组作为其参数(如#1
定义中所示)。假设正常类别代码
- 标记是单个字符(除了
\
、{
、}
、%
或空格或换行符(因为它们会被忽略))或命令序列(以 开头的内容\
), - 平衡组
{
以第一个}
不属于其他组(较晚开始)的组开始和结束。吸收后,括号将从组中剥离(即#1
不包含它们)。
这就是为什么\foo x
和\foo{x}
、\newcommand{\foo}
和\newcommand\foo
或\frac 12
、\frac{1}{2}
和等价的\frac{1}2
原因。\frac1 2
选择最清晰的版本是一种很好的做法,这通常意味着使用一个组。就我个人而言,在以下情况下,我会明确省略该组:必须输入一个标记,例如\newcommand\foo
。
答案2
值得补充的是,在 LaTeX3/ 中,单标记参数和括号中的参数之间的区别更加明确expl3
。按照惯例,每个expl3
宏名称都应以 结尾,:
后面跟着一串字母,称为参数说明符,每个字母都反映相应参数的类型。
除了许多其他的,我们还有
n
对于括号组或单个标记参数,以及N
仅适用于单标记参数,通常是宏/函数名称或变量名称。
这些说明符仍然不会改变 (La)TeX 处理各个参数的方式,但它会向用户提示如何在宏内部使用这些参数。
例如,该l3tl
包提供了两个函数\tl_if_empty:nTF
和\tl_if_empty:NTF
。虽然这两个函数都检查标记列表是否为空并有条件地执行代码,但前者需要使用一组带括号的标记来调用,而后者需要一个标记列表变量,该变量在对其内容执行测试之前先进行扩展。