当参数有参数时,如何允许命令在参数周围不使用括号?

当参数有参数时,如何允许命令在参数周围不使用括号?

我定义了几个简单的宏来让我的生活更轻松一些:

\newcommand{\curl}[1]{\ensuremath{\nabla\times #1}}
\renewcommand{\v}[1]{{\ensuremath{\vec{#1}}}}

这样,在文本模式下我就可以写\v{F}\curl{\v{F}},一切就好了。

但为了简单起见,至少在数学模式下,我希望能够只写\curl\v{F},并将其扩展为

\ensuremath{\nabla\times {\ensuremath\vec{F}}}

就像 一样\curl{\v{F}}。由于我以一种非常简单的方式定义了\curl,所以目前看起来是正确的。但是,我认为我实际上得到了一种奇怪的行为:如果我将 的定义更改为\curl带有括号,例如{(\ensuremath{\nabla\times #1})},则向量符号会显示在右括号上方,就好像\v(但不是它的参数)被捕获为 的参数一样\curl

但奇怪的是,仅仅输入\ensuremath{(\nabla\times {\ensuremath\vec})}就会导致错误。

这是怎么回事? 有没有什么好办法可以做到这一点? 这是一个好主意吗?

(顺便说一句,我{}在的定义中多了一个对的原因\v是它允许我使用\int_\v{x}而不是\int_{\v{x}}。这似乎很有效,但我不太清楚为什么。)

答案1

您可以在正常数学模式下执行此操作,如果您定义

\newcommand{\curl}{\nabla\times}
\newcommand{\v}{\vec}

然后\curl\v{F}就会完全按照您的需要进行操作,但不幸的是,不适用于下标。

实际上,可以使它适用于下标,但我认为不值得使用它(此外它是错误的,因为它在不用于下标时修复空格):

\makeatletter
\def\curl{\bgroup\@ifnextchar\v\@curlv\@curl}
\def\@curlv#1#2{\nabla\times\vec{#2}\egroup}
\def\@curl#1{\nabla\times #1\egroup}
\makeatother

现在$\int_\curl X$$\int_\curl\v{F}$可以工作。但只有当\v遵循时\curl,而不是类似\curl\mathbf{X}。因此这很容易出错,完全不值得推荐。

过度使用是错误的:用 代替\ensuremath并不会提高打字速度。\curl\v{F}$\curl\v{F}$

答案2

这里的简单答案是“你不能”。TeX 不是函数式语言,因此\curl\v{F}不是“F 的 v 的 curl”。\curl将吸收一个标记或“平衡文本”(括号组)作为参数。因此\curl\v{f}最终会\curl抓取\v,然后各种事情都可能出错。

相关内容