Definindo sinônimos para indexação

Definindo sinônimos para indexação

É possível configurar as coisas para que a indexação de sinônimos não gere múltiplas entradas? Por exemplo, se o texto incluir \index{cur}, \index{hound}, e \index{mutt}, estes podem ser agrupados na entrada “cachorro”? (Suponha que essas chaves estejam sendo geradas automaticamente; caso contrário, eu digitaria \index{dog}sempre.)

Antecedentes: LaTeX3/expl3 oferece a possibilidade de definir certas variantes de funções em conjunto. Em termos da classe (experimental) l3doc, um exemplo pode ser assim:

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

Nas listagens de códigos documentadas, isso é exibido \bool_if:N(TF)nas \bool_if_p:Nmargens; no código gerado, isso define as quatro funções \bool_if_p:N,,,, e .\bool_if:NT\bool_if:NF\bool_if:NTF

[Nota: A notação \bool_if:N(TF)é o mais próximo que posso chegar neste site de mostrar a notação real; mas está perto o suficiente para esta discussão.]

O problema é que a indexação automática de csnames dedoc.styindexa esta linha como uma instância da função inexistente \bool_if:N!

[Nota: l3docajusta os códigos de gato para que os dois pontos e o sublinhado sejam devidamente reconhecidos.]

Então…. Existe uma maneira de informar à geração do índice que as variantes da função são sinônimos?Ou seja, os vários locais do código onde as variantes são usadas podem ser agrupados em uma entrada de índice? (A entrada provavelmente seria algo como \bool_if:N(TF), \bool_if_p:N.)

Opção alternativa: É possível configurar as coisas de forma que a chave única \bool_if:Nseja reconhecida não como ela mesma, mas como uma instância das quatro variantes que realmente existem?

Responder1

Se você não precisa de nada sofisticado no \indexargumento (como @ou !), então isso deve 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 é o conteúdo do .idxarquivo gerado:

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

informação relacionada