我想知道为什么有些命令(...)
后面跟着“ ”,而其他命令后面跟着“ {...}
”。例如,“ \exp(x)
”和“ \bar{x}
”。
()
和是否都{}
用于指定它们前面的命令的参数?
还有其他类似的表现吗?
答案1
虽然马丁的回答有很多技术信息,但让我说一些关于你的具体例子。
该命令\bar
对其他命令执行某些操作。也就是说,它在其上加了一个横线。因此它需要接受一个参数。在 TeX 中,参数通常用花括号标记。因此,\bar{x}
produces和\bar{xx}
produce 。如果没有给出括号,TeX(或多或少)会将下一个非空白符号作为参数。例如,\bar x
againduces和\bar(x)
produce 。
另一方面,\exp
只是排版和 ,不接受任何参数。(x)
之后将完全独立地排版。 因此,TeX 不会将x
视为 的参数\exp
;即使从语义角度来看,它是指数函数的参数。 这很有用,因为它允许您编写,例如,\exp\colon\mathfrak{g} \to G
对于。 还请考虑和都是共同的例子。\sin
答案2
大括号{ }
用于普通参数,圆括号( )
仅用于图片宏来指定坐标等。另一组括号[ ]
用于可选参数。
普通的 LaTeX 宏总是等待括号,括号是普通的参数和分组字符。您不能使用\newcommand
和类似的 LaTeX 宏来定义等待括号的新宏。
但是,可以使用较低级别的 plainTeX 宏来定义宏的任意模式\def
。这种模式称为参数文本。如果此文本不遵循宏,则会产生错误。语法为\def
:
\def<macro><parameter text>{<macro content>}
参数文本必须包含所使用的参数#1
,#2
也可以包含一些其他文本,如括号。
等待的宏的一个示例( )
是:
\def\myvector(#1,#2){\dosomething{#1}{#2}}
宏随后直接\myvector
等待文本,其中存储在中,并将存储在中。(<something>,<something else>)
<something>
#1
<something else>
#2
也可以看看这个问题讨论\def
和的区别\newcommand
。
一个重要的区别{ }
和( )
或之间[ ]
是:
可以{ }
嵌套,但其他的不能。因为{ }
由下级系统处理,所以每个{
都会增加一个内部计数器,当找到 时,该计数器会减少}
。这样,每个{
都会与其 匹配}
。然而在\myvector
上面,第一个)
将关闭参数文本,而与 的数量无关(
。对于出于同样的原因不能包含的可选参数也是如此[ ]
。避免这种情况的一种方法是{ }
先用 包围内部文本,然后才能找到其余的参数文本。换句话说,参数文本扫描器将括号中的所有内容作为一个元素,因此它们可以有效地向扫描器隐藏其内容。
例子:
\somemacrowithoptionalargument[ \someother[opt]{...} ]{ ... }
将\someother[opt
作为可选参数,并将文本标记作为强制参数。正确的编写方式是:
\somemacrowithoptionalargument[ {\someother[opt]{...}} ]{ ... }