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 l3doc
kö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:N
in 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.sty
indiziert diese Zeile als Instanz der nicht vorhandenen Funktion \bool_if:N
!
[Hinweis: l3doc
Passt 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:N
nicht als er selbst, sondern als Instanz der vier tatsächlich existierenden Varianten erkannt wird?
Antwort1
\index
Wenn 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 .idx
Datei:
\indexentry{dog}{1}
\indexentry{dog}{2}
\indexentry{dog}{3}
\indexentry{dog}{4}