有关输入数字字段的宏的帮助

有关输入数字字段的宏的帮助

我定义了一个数学宏来输入数字字段,如下所示:

\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}]就可以按预期工作了。(虽然我不知道为什么这个可以工作,而原来的却不行)

相关内容