我试图标记文本中的某些单词并自动将它们提交到索引中,并可以选择修改索引条目。这种\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}