Eingefügte Befehle im Argument \sindex[]{} werden nicht erweitert: @-Symbol wird angezeigt

Eingefügte Befehle im Argument \sindex[]{} werden nicht erweitert: @-Symbol wird angezeigt

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 \sindexder 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:

Bildbeschreibung hier eingeben

\expandafterGibt 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 \sindexBefehl in einen \comma@parseBefehl aus dem kvsetkeysPaket 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}

Ergebnis

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 .idxDatei:

\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. -cDadurch werden aufeinanderfolgende Leerzeichen zusammengeführt, ein Eintrag ohne Leerzeichen unterscheidet sich jedoch weiterhin von einem Eintrag mit Leerzeichen.

verwandte Informationen