\NewDocumentCommand 与 \newcommand 之后不需要的空格

\NewDocumentCommand 与 \newcommand 之后不需要的空格

我试图标记文本中的某些单词并自动将它们提交到索引中,并可以选择修改索引条目。这种\newcommand方法并不令人满意,因为我无法将第一个参数的默认值设置为第二个参数。

\NewDocumentCommand设法正确设置了选项,但标点符号后面却出现了不必要的空格。有人能解释一下为什么会出现这种情况以及如何修复吗?

这是一个最小的工作示例:

\documentclass{article}
\usepackage{xparse}
 


\newcommand{\neuold}[2][]{{\sffamily\textbf{ #2}}\index{#1 #2}}

\NewDocumentCommand{\neu}{m O{#1}}
{
\IfNoValueTF{#2}
{{\sffamily\textbf{#1}}}
{\sffamily\textbf{ #1}\index{ #2}}
}

\begin{document}
blabla  \neu{test}, blabla \neuold{test}, blabla
\end{document}

答案1

您自己插入空格。

\NewDocumentCommand{\neu}{m O{#1}}
{% <--- space
\IfNoValueTF{#2}
{{\sffamily\textbf{#1}}}
{\sffamily\textbf{ #1}\index{ #2}}% <---
}

另一方面,\IfNoValueTF测试将总是返回 false,所以它没用。它要与o参数类型一起使用。所以

\NewDocumentCommand{\neu}{m O{#1}}
 {%
  \textsf{\textbf{#1}}\index{#2}%
 }

#1就是你想要的。我看不出在和前面有空格的理由#2

答案2

命令中的换行符被扩展为空格。您需要%在不希望出现空格的行尾添加。

\documentclass{article}
\usepackage{xparse}

\newcommand{\neuold}[2][]{{\sffamily\textbf{ #2}}\index{#1 #2}}

\NewDocumentCommand{ \neu }{ m O{#1} }{%
  \IfNoValueTF{#2}{%
    \sffamily\textbf{#1}%
  }{%
    \sffamily\textbf{#1}\index{#2}%
  }%
}

\begin{document}
blabla  \neu{test}, blabla \neuold{test}, blabla \neu{test}[Test], blah
\end{document}

相关内容