我定义了一个数学宏来输入数字字段,如下所示:
\newcommand{\Q}[1][]{\ensuremath{\mathbb{Q}[#1\,]}}
这里\,
是在数字和括号之间添加一些空格。
使用\Q[\sqrt{2}]
,一切正常。但是,使用\Q[\sqrt[3]{2}]
,\,
似乎消失了,这与直接写入 不同\mathbb{Q}[\sqrt[3]{2}\,]
。
我认为可能是因为 中的括号[3]
导致了问题。然后我尝试将#1
其更改为 以使其成为一个单独的组{#1}
,但随后出现错误:
Argument of \@sqrt has an extra }.
为什么会发生这些情况以及我应该如何正确定义这个宏?
下面是 MWE。
\documentclass{article}
\usepackage{amssymb}
\newcommand{\Q}[1][]{\ensuremath{\mathbb{Q}[#1\,]}}
% \newcommand{\Q}[1][]{\ensuremath{\mathbb{Q}[{#1}\,]}} %ERROR
\begin{document}
\[
\Q[\sqrt{2}] \quad \mathbb{Q}[\sqrt{2}\,]
\]
\[
\Q[\sqrt[3]{2}] \quad \mathbb{Q}[\sqrt[3]{2}\,]
\]
\end{document}
答案1
您的问题源于您使用了“可选参数中的可选参数”,这搞乱了方括号匹配。可以通过将参数放在花括号(或一组)内的外部可选参数内来解决此问题:
\documentclass{article}
\usepackage{amssymb}
\newcommand{\Q}[1][]{\ensuremath{\mathbb{Q}[#1\,]}}
\begin{document}
\[
\Q[\sqrt{2}] \quad \mathbb{Q}[\sqrt{2}\,]
\]
\[
\Q[{\sqrt[3]{2}}] \quad \mathbb{Q}[\sqrt[3]{2}\,]
\]
\end{document}
更具体地说,当您调用时会发生以下情况\Q[\sqrt[3]{2}]
:可选参数在第一对[
...之间被捕获]
,即\sqrt[3
。所以
\Q[\sqrt[3]{2}]
扩展为(捕获的参数用 突出显示^
):
\ensuremath{\mathbb{Q}[\sqrt[3\,]}{2}]
^^^^^^^
因此,即使你试图将空间\,
后平方根,它实际上是在根中捕获的。\ensuremath
在数学模式下,它的参数不受影响地扩展:
\mathbb{Q}[\sqrt[3\,]{2}]
并排查看时可以清楚地看到这一点:\Q[\sqrt[3]{2}] \quad \Q[{\sqrt[3]{2}}]
注意第一个中的指数是如何向左移动的(由于\,
)。
纠正此问题的另一种方法是使用xparse
's \NewDocumentCommand
- 它可以正确处理带有嵌套方括号的可选参数:
\NewDocumentCommand{\Q}{o}{\ensuremath{\mathbb{Q}[#1\,]}}
但是,我不会在定义中包含间距,因为当您调用时它看起来不正确\Q[1]
:
而是将间距作为可能需要/不需要它的论点的一部分。
答案2
附注:还有一种更简单的方法来定义这个宏,即使用xparse
,如下所示:
\NewDocumentCommand{\Q}{o}{\ensuremath{\mathbb{Q}\IfNoValueF{#1}{[#1\,]}}}
有了这个,\Q[\sqrt[3]{2}]
就可以按预期工作了。(虽然我不知道为什么这个可以工作,而原来的却不行)