使用 xparse 的多用途索引命令:作为 \index 参数的条件不起作用

使用 xparse 的多用途索引命令:作为 \index 参数的条件不起作用

我想定义一个多用途索引命令 \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}}%
    }%
}

相关内容