![Eingefügte Befehle im Argument \sindex[]{} werden nicht erweitert: @-Symbol wird angezeigt](https://rvso.com/image/298305/Eingef%C3%BCgte%20Befehle%20im%20Argument%20%5Csindex%5B%5D%7B%7D%20werden%20nicht%20erweitert%3A%20%40-Symbol%20wird%20angezeigt.png)
Zum Erstellen von Indexeinträgen verwende ich den \sindex[]{}
Befehl aus dem Paket. Zur Steuerung der Sortierung verwende ich beispielsweise das Symbol .splitxdx
@
\sindex[...]{1@One}
Um die Dinge etwas konfigurierbarer zu machen, definiere ich einen benutzerdefinierten Befehl: \newcommand{\sortedOne}{1@One}
.
Das Problem ist, dass \sindex
der wörtliche Text angezeigt wird, wenn ich diesen Befehl in das Argument einfüge 1@One
. Der Code erzeugt beispielsweise \sindex[myindex]{\sortedOne!This fails.}
den ersten der folgenden Einträge:
\expandafter
Gibt es eine einfache Möglichkeit, dies zu vermeiden? Ich würde eine Methode bevorzugen, bei der ich nicht jedes Mal, wenn ich verwende, etwas wie manuell eintippen muss \sindex
.
Eine interessante Randbemerkung:tutfunktioniert ordnungsgemäß, wenn ich den \sindex
Befehl in einen \comma@parse
Befehl aus dem kvsetkeys
Paket einschließe: \comma@parse{\sortedOne!This works with comma parse}{\sindex[myindex]}
.
Hier ist mein MWE, das die obige Ausgabe erzeugt hat:
\documentclass[12pt]{book}
\usepackage[split]{splitidx}\makeindex
\newindex{myindex}
\usepackage{lipsum}
\usepackage{kvsetkeys}
%\usepackage{hyperref}
%\newcommand{\mainindexentry}[1]{\textbf{\hyperpage{#1}}}
\newcommand{\sortedOne}{1@One}
\begin{document}
\lipsum[1]
\sindex[myindex]{1@One!This works fine}
\sindex[myindex]{\sortedOne!This fails.}
\sindex[myindex]{Even subentries fail!\sortedOne}
\makeatletter
\comma@parse{\sortedOne!This works with comma parse}{\sindex[myindex]}
\makeatother
\printindex[myindex]
\end{document}
Antwort1
Normalerweise expandieren Indexbefehle ihr Argument nicht und lesen dessen Inhalt wörtlich. Dadurch wird auch verhindert, dass Makros expandiert werden. Durch das Lesen des Arguments, bevor der Indexbefehl es sieht, sind die wörtlichen Änderungen wirkungslos, da die Token bereits gebildet sind, siehe die Definition von \Sindex
:
\documentclass[12pt]{book}
\usepackage[split]{splitidx}\makeindex
\newindex{myindex}
\usepackage{lipsum}
%\usepackage{kvsetkeys}
%\usepackage{hyperref}
%\newcommand{\mainindexentry}[1]{\textbf{\hyperpage{#1}}}
\newcommand{\sortedOne}{1@One}
\newcommand*{\myindex}{\sindex[myindex]}
\newcommand*{\smyindex}[1]{\sindex[myindex]{#1}}
\newcommand*{\Sindex}[2][]{\sindex[{#1}]{#2}}
\begin{document}
\lipsum[1]
\sindex[myindex]{1@One!This works fine}
\expandafter\myindex\expandafter{\sortedOne!This also works.}
\smyindex{Even subentries work!\sortedOne}
\Sindex[myindex]{\sortedOne!\sortedOne}
\printindex[myindex]
\end{document}
Natürlich sollten Befehle, die nicht erweitert werden sollen, durch Folgendes geschützt werden \string
:
\Sindex[myindex]{...\string\fragilecmd...}
oder mehrere Token können geschützt werden durch \detokenize
:
\Sindex[myindex]{...\detokenize{...}...}
Auch sollten die Methoden (mit/ohne Erweiterung) nicht gemischt werden, um doppelte Indexeinträge durch erweiterte/nicht erweiterte Indexeinträge zu vermeiden. Je nach Methode kann die Anzahl der Leerzeichen nach einem Befehl variieren:
\sindex[myindex]{\textbf{...}}
\Sindex[myindex]{\string\textbf{...}}
\Sindex[myindex]{\protect\textbf{...}}
\Sindex[myindex]{\textbf{...}}
Ergebnis in .idx
Datei:
\indexentry{\textbf{...}}{1}
\indexentry{\textbf{...}}{1}
\indexentry{\textbf {...}}{1}
\indexentry{\textbf {...}}{1}
Die beiden letzteren Formen können mit der Option „makeindex“ zusammengeführt werden. -c
Dadurch werden aufeinanderfolgende Leerzeichen zusammengeführt, ein Eintrag ohne Leerzeichen unterscheidet sich jedoch weiterhin von einem Eintrag mit Leerzeichen.