是否可以进行设置,使索引同义词不会生成多个条目?例如,如果文本包含\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}