Synonyme für die Indizierung definieren

Synonyme für die Indizierung definieren

Ist es möglich, die Dinge so einzurichten, dass bei der Indizierung von Synonymen nicht mehrere Einträge generiert werden? Wenn der Text beispielsweise \index{cur}, \index{hound}, und enthält \index{mutt}, können diese unter dem Eintrag „Hund“ zusammengefasst werden? (Nehmen wir an, dass diese Schlüssel automatisch generiert werden, sonst würde ich sie \index{dog}jedes Mal einfach eintippen.)

Hintergrund: LaTeX3/expl3 bietet die Möglichkeit, bestimmte Varianten von Funktionen gemeinsam zu definieren. Bezogen auf die (experimentelle) Klasse l3dockönnte ein Beispiel so aussehen:

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

In den dokumentierten Codeauflistungen werden dadurch sowohl \bool_if:N(TF)als auch \bool_if_p:Nin den Rändern angezeigt; im generierten Code werden dadurch die vier Funktionen \bool_if_p:N, \bool_if:NT, \bool_if:NF, und definiert \bool_if:NTF.

[Hinweis: Die Notation \bool_if:N(TF)kommt der tatsächlichen Notation am nächsten, die ich auf dieser Site zeigen kann; für diese Diskussion ist sie jedoch nah genug dran.]

Das Problem ist, dass die automatische Indizierung von csnames vondoc.styindiziert diese Zeile als Instanz der nicht vorhandenen Funktion \bool_if:N!

[Hinweis: l3docPasst Catcodes so an, dass Doppelpunkt und Unterstrich richtig erkannt werden.]

Also…. Gibt es eine Möglichkeit, der Indexgenerierung mitzuteilen, dass die Funktionsvarianten Synonyme sind?Dh, können die verschiedenen Stellen im Code, an denen die Varianten verwendet werden, unter einem Indexeintrag zusammengefasst werden? (Der Eintrag würde wahrscheinlich ungefähr so ​​aussehen \bool_if:N(TF), \bool_if_p:N.)

Alternative Option: Ist es möglich, die Dinge so einzurichten, dass der einzelne Schlüssel \bool_if:Nnicht als er selbst, sondern als Instanz der vier tatsächlich existierenden Varianten erkannt wird?

Antwort1

\indexWenn das Argument nichts Ausgefallenes (wie etwa @oder ) erfordert !, sollte Folgendes funktionieren:

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

Dies ist der Inhalt der generierten .idxDatei:

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

verwandte Informationen