Определение синонимов для индексации

Определение синонимов для индексации

Можно ли настроить так, чтобы индексация синонимов не создавала множественные записи? Например, если текст содержит \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}

Связанный контент