我正在写一篇引用大量巴西规范的文本。所有这些规范都以“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