将参数的默认值设置为 newcommand 中的参数

将参数的默认值设置为 newcommand 中的参数

我想定义一个命令来强调关键字并同时将其添加到索引中。这可以通过以下方式存档

\newcommand{\iemph}[1]{\emph{#1}\index{#1}}

但问题是,我还想使用索引的变体:\index{bundle!Vector bundle}这意味着应该vector bundle在索引下进行索引bundle,我尝试按如下方式完成它

\newcommand{\iemph}[2][]{\emph{#2}\index{#1!#2}}

这意味着,我将第一个值默认设置为空,但是当我抑制第一个参数时,这并没有给我想要的结果(它根本没有被索引):

 \iemph{vector bundle}

尽管它的完整形式完美

 \iemph{vector}{Vector bundle} 

或者

 \iemph[vector]{vector bundle}

那么有没有办法解决这个问题,而不用定义两个命令呢?如果我们可以定义类似的东西:

\newcommand{\iemph}[2][]{\emph{#2}\if{#1 is not empty}{\index{#1!#2}}else{\index{#2}}}

更新

也许原始问题的简单解决方案(尽管下面提供的答案在其他类似情况下也很有用)是将命令定义为

\newcommand{\iemph}[2][]{\emph{#2}\index{#1#2}}

并将其用作

\iemph{vector bundle}
\iemph[vector!]{vector bundle}

需要注意的是,在这种情况下

\iemph{vector!}{vector bundle}

行为怪异。

答案1

通过包\NewDocumentCommand中的介绍xparse,很容易就可以知道是否给出了可选参数:

\NewDocumentCommand{\iemph}{om}{%
  \emph{#2}%
  \IfValueTF{#1}{%
    \index{#1!#2}%
  }{%
    \index{#2}%
  }%
}

这里的o意思是可选参数,并且\IfValueTF{#1}{true}{false}可以进行相关的分支。

\ifblank{}{}{}另一种可能性:从包中使用etoolbox,如下所示\iemphother

\documentclass{article}

\usepackage{etoolbox}    
\usepackage{makeidx}
\usepackage{xparse}


\newcommand{\iemphother}[2][]{%
  \emph{#2}%
  \ifblank{#1}{%
    \index{#2}%
  }{%
  \index{#1!#2}%
  }%
}



\NewDocumentCommand{\iemph}{om}{%
  \emph{#2}%
  \IfValueTF{#1}{%
    \index{#1!#2}%
  }{%
    \index{#2}%
  }%
}

\makeindex

\begin{document}
\iemph[vector]{vector bundle}

\iemph{vector bundle}



\printindex

\end{document}

相关内容