我想定义一个命令,当我传递名称时,该命令会创建一个具有特定名称的索引,如果没有传递名称,则不会创建任何索引。
我的第一个想法是这样写的:
\newcommand{\kw}[1][]{\emph{#2}\index{#1}}
但是当我传递一个空的可选参数时,编译器会出错。我如何构建如下所示的 if-then 结构?
\newcommand{\kw}[1][]{
if(#1 is not empty)
\emph{#2}\index{#1}}
else
\emph{#2}
}
答案1
如果你不想使用xparse
(为什么不呢?),你可以使用一些传统的技巧,例如:
\newcommand{\kw}[2][]{%
\emph{#2}%
\if&\else
\index{#1}%
\fi
}
xparse
在某些情况下更\IfValueT
安全。不使用 LaTeX3 的更安全的实现是:
\usepackage{etoolbox}
\newcommand{\kw}[2][]{%
\emph{#2}%
\ifstrempty{#1}{}{\index{#1}}%
}
答案2
您可以使用xparse
来自 LaTeX3 项目的包。
\usepackage{xparse}
\NewDocumentCommand\kw{o}{%
\IfNoValueTF{#1}{%
% #1 is empty.
}{%
% #1 has a value.
}%
}
要重新创建示例命令:
\NewDocumentCommand\kw{om}{%
\IfNoValueTF{#1}{%
\emph{#2}%
}{%
\emph{#2}\index{#1}%
}%
}