É 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:N
margens; 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.sty
indexa esta linha como uma instância da função inexistente \bool_if:N
!
[Nota: l3doc
ajusta 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:N
seja 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 \index
argumento (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 .idx
arquivo gerado:
\indexentry{dog}{1}
\indexentry{dog}{2}
\indexentry{dog}{3}
\indexentry{dog}{4}