定义索引的同义词

定义索引的同义词

是否可以进行设置,使索引同义词不会生成多个条目?例如,如果文本包含\index{cur}\index{hound}和,是否可以将它们合并到条目“dog”下?(假设这些键是自动生成的;否则我每次\index{mutt}都得输入。)\index{dog}

背景:LaTeX3/expl3 提供了同时定义某些函数变体的可能性。就(实验性)类而言l3doc,示例可能如下所示:

% \begin{macro}[pTF]{\bool_if:N}
%   Blah blah blah.
%    \begin{macrocode}
\prg_new_conditional:Npnn \bool_if:N #1 { p , T , F , TF }
  { … }
%    \end{macrocode}
% \end{macro}

在记录的代码清单中,这在边缘显示\bool_if:N(TF)和;在生成的代码中,这定义了四个函数、、和。\bool_if_p:N\bool_if_p:N\bool_if:NT\bool_if:NF\bool_if:NTF

[注:该符号\bool_if:N(TF)是我在此网站上所能找到的最接近实际符号的符号;但对于本次讨论来说,它已经足够接近了。]

问题是,csnames 的自动索引来自doc.sty将此行索引为不存在函数的实例\bool_if:N

[注意:l3doc调整 catcodes 以便正确识别冒号和下划线。]

那么……有没有办法告诉索引生成函数变体是同义词?IE那么,代码中使用变体的各个位置是否可以合并到一个索引条目下?(该条目可能看起来像\bool_if:N(TF), \bool_if_p:N。)

替代选项:是否可以进行设置,以便单个键\bool_if:N不被识别为其本身,而是被识别为实际存在的四个变体的一个实例?

答案1

如果你不需要\index参数中的任何花哨的东西(例如@!),那么这应该有效:

\documentclass{article}
\usepackage{makeidx}
\makeindex

\usepackage{xparse}
\ExplSyntaxOn
\cs_set_eq:NN \solomon_index:n \index

\NewDocumentCommand{\definesynonyms}{ m m }
 {
  \solomon_define_synonyms:nn { #1 } { #2 }
 }

\cs_new_protected:Npn \solomon_define_synonyms:nn #1 #2
 {
  \clist_map_inline:nn { #2 }
   {
    \tl_gset:cn { g_solomon_syn_##1_tl } { #1 }
   }
 }

\RenewDocumentCommand{\index}{ m }
 {
  \tl_if_exist:cTF { g_solomon_syn_#1_tl }
   {
    \solomon_index:v { g_solomon_syn_#1_tl }
   }
   {
    \solomon_index:n { #1 }
   }
 }
\cs_generate_variant:Nn \solomon_index:n { v }
\ExplSyntaxOff

\definesynonyms{dog}{cur,hound,mutt}

\begin{document}
\show\index
A\index{dog}
\newpage
B\index{cur}
\newpage
C\index{hound}
\newpage
D\index{mutt}
\newpage
\printindex
\end{document}

这是生成的文件的内容.idx

\indexentry{dog}{1}
\indexentry{dog}{2}
\indexentry{dog}{3}
\indexentry{dog}{4}

相关内容