Можно ли настроить так, чтобы индексация синонимов не создавала множественные записи? Например, если текст содержит \index{cur}
, \index{hound}
и \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
настраивает коды так, чтобы двоеточие и подчеркивание распознавались правильно.]
Итак… Есть ли способ сообщить генерации индекса, что варианты функций являются синонимами?Т.е., можно ли объединить различные места в коде, где используются варианты, в одну запись индекса? (Запись, вероятно, будет выглядеть примерно так \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}