Definición de sinónimos para indexación

Definición de sinónimos para indexación

¿Es posible configurar las cosas para que la indexación de sinónimos no genere múltiples entradas? Por ejemplo, si el texto incluye \index{cur}, \index{hound}y \index{mutt}, ¿se pueden fusionar bajo la entrada "perro"? (Supongamos que estas claves se generan automáticamente; de ​​lo contrario, simplemente escribiría \index{dog}cada vez).

Antecedentes: LaTeX3/expl3 ofrece la posibilidad de definir ciertas variantes de funciones juntas. En términos de la clase (experimental) l3doc, un ejemplo podría verse así:

% \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}

En los listados de códigos documentados, esto se muestra tanto \bool_if:N(TF)como \bool_if_p:Nen los márgenes; en el código generado, esto define las cuatro funciones \bool_if_p:N, \bool_if:NT, \bool_if:NFy \bool_if:NTF.

[Nota: La notación \bool_if:N(TF)es lo más cercano que puedo encontrar en este sitio a mostrar la notación real; pero está lo suficientemente cerca para esta discusión.]

El problema es que la indexación automática de nombres csname dedoc.styindexa esta línea como una instancia de la función inexistente \bool_if:N!

[Nota: l3docajusta los códigos cat para que los dos puntos y el guión bajo se reconozcan correctamente.]

Entonces…. ¿Hay alguna manera de decirle a la generación de índice que las variantes de función son sinónimos?Es decir, ¿se pueden fusionar los distintos lugares del código donde se utilizan las variantes en una entrada de índice? (La entrada probablemente se vería así \bool_if:N(TF), \bool_if_p:N).

Opción alternativa: ¿Es posible configurar las cosas para que la clave única \bool_if:Nse reconozca no como sí misma sino como una instancia de las cuatro variantes que realmente existen?

Respuesta1

Si no necesita nada sofisticado en el \indexargumento (como @o !), entonces esto debería funcionar:

\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}

Este es el contenido del .idxarchivo generado:

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

información relacionada