使用 \newcommand 和 \NewDocumentCommand 的结果不同

使用 \newcommand 和 \NewDocumentCommand 的结果不同

我正在写一篇引用大量巴西规范的文本。所有这些规范都以“NBR”为前缀。因此,我创建了以下命令

\newcommand*{\NBR}[1]{NBR #1\cite{NBR#1}}

这样,我可以在文本的任何地方输入 \NBR{6118},它就会以标准格式显示(而不是意外地在 NBR6118、NBR 6118、NBR-6118 等之间切换)。这还会在名称旁边显示引用,我认为这很有用,因为文本通常采用“根据 NBR 6118 表 8.1...”的形式。这样,我就不用手动引用了。

但是,有些情况下我宁愿不要这个引文。例如,我可能会说“尽管方程式可能不同,但国际规范和 NBR 6118 具有相似的概念...”,但这个引文没有任何意义。

因此,我想创建一个带星号的命令版本 (\NBR*),它只放置名称,而不放置引文。在尝试了简单的路径后

\newcommand*{\NBR*}[1]{NBR #1}

并出现错误,我发现必须使用不同的方法。这个xparse包看起来很有前途,所以我定义了以下内容:

\NewDocumentCommand \NBR {s m}
{
    \IfBooleanTF{#1}
        {NBR #2}
        {NBR #2\cite{NBR#2}}
}

这似乎很管用。 \NBR{6118} 给出了带有引文的文本,而 \NBR* 则省略了引文。但是,我注意到最终结果有所不同,在 \NewDocumentCommand 版本中,命令前后似乎有额外的空格。在 \NewDocumentCommand 中,标点符号后的引文自动移动也受到抑制。

下面很容易看出这一点:

使用 \newcommand

\新命令

使用 \NewDocumentCommand

\新文档命令

有办法纠正这个问题吗?

答案1

您不能用 定义 *-variant \newcommand{\NBR*},就是这样。

工作版本\NewDocumentCommand有虚假空格:您需要保护一些行尾。

\NewDocumentCommand \NBR {s m}
 {%
  \IfBooleanTF{#1}
   {NBR #2}
   {NBR #2\cite{NBR#2}}%
 }

%第 3 行和第 4 行末尾不需要,因为有\IfBooleanTF三个参数,而 TeX 在寻找参数时会忽略空格。

NBR #2您可以通过注意两种情况的共同点来缩写定义:

\NewDocumentCommand \NBR {s m}
 {%
  NBR #2\IfBooleanF{#1}{\cite{NBR#2}}%
 }

您可以\NBR使用来定义\newcommand,但它需要一个低级程序:

\makeatletter
\DeclareRobustCommand{\NBR}{\@ifstar\NBR@s\NBR@}
\newcommand{\NBR@}[1]{NBR #1\cite{NBR#1}}
\newcommand{\NBR@s}[1]{NBR #1}
\makeatother

相关内容