我想定义一个多用途索引命令 \xindex{text}[index]/parent/,其中包含一个强制参数和两个可选参数。它应该 (i) 在主文本中打印“text”,(ii) 如果指定了“index”(或未指定),则将“index”(或“text”)发送到索引,以及 (iii) 如果指定了“parent”,它应该将 (ii) 格式化为索引中主条目的子条目。以下是我的尝试:
\documentclass{book}
\usepackage{xparse}
\usepackage{makeidx}
\makeindex
\NewDocumentCommand{\xindex}{mod//}
% #1: text
% #2: index (if given, it overrides #1)
% #3: parent (if given, #1,#2 become subentries)
{\IfValueTF{#3}%
{% if parent is specified, create parent entry
#1\index{#3@\textbf{#3}!%
% create subentry:
\IfNoValueTF{#2}{#1}{#2}@\IfNoValueTF{#2}{\emph{#1}}{#2}}%
{% if #3 'parent' is absent, create regular entry:
#1\index{\IfNoValueTF{#2}{#1}{#2}@\IfNoValueTF{#2}{\emph{#1}}{#2}}%
}%
}%
}%
\begin{document}
\xindex{test1},
\xindex{test2}[Test2],
\xindex{test3}/tests/,
\xindex{test4}[Test4]/tests/
\printindex
\end{document}
编译 latex 并运行 makeindex 后,我希望获得以下主要文本的输出,
test1, test2, test3, test4
对于索引(最右边的 1 是页码):
test1, 1
Test2, 1
tests
test3, 1
Test4, 1
相反,我的代码生成了正文:
, , test3test3 test4test4
对于索引:
Test3, 1
Test4, 1
tests
test3, 1
Test4, 1
我怀疑我误解了条件命令 \IfNoValueTF 的运行方式,或者 \index 的解释方式。出了什么问题?
答案1
您放错了地方}
。
\NewDocumentCommand{\xindex}{mod//}{%
% #1: text
% #2: index (if given, it overrides #1)
% #3: parent (if given, #1,#2 become subentries)
\IfValueTF{#3}%
{% if parent is specified, create parent entry
#1\index{#3@\textbf{#3}!%
% create subentry:
\IfNoValueTF{#2}{#1}{#2}@\IfNoValueTF{#2}{\emph{#1}}{#2}%
}%
}
{% if #3 'parent' is absent, create regular entry:
#1\index{\IfNoValueTF{#2}{#1}{#2}@\IfNoValueTF{#2}{\emph{#1}}{#2}}%
}%
}