¿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:N
en los márgenes; en el código generado, esto define las cuatro funciones \bool_if_p:N
, \bool_if:NT
, \bool_if:NF
y \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.sty
indexa esta línea como una instancia de la función inexistente \bool_if:N
!
[Nota: l3doc
ajusta 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:N
se reconozca no como sí misma sino como una instancia de las cuatro variantes que realmente existen?
Respuesta1
Si no necesita nada sofisticado en el \index
argumento (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 .idx
archivo generado:
\indexentry{dog}{1}
\indexentry{dog}{2}
\indexentry{dog}{3}
\indexentry{dog}{4}