我想定义一个命令来强调关键字并同时将其添加到索引中。这可以通过以下方式存档
\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}