Einfügen von Makros im Argument \sindex[]{} wird nicht erweitert

Einfügen von Makros im Argument \sindex[]{} wird nicht erweitert

Ich muss \sindex[]{}aus einem extern generierten TeX-Code aus dem splitxdx-Paket ein eigenes Register erstellen. Bei Personen mit zwei Vornamen wird der Rufname manchmal in Klammern gesetzt, manchmal nicht. Für den Index sollten die Klammern also entfernt werden.

Ich habe ein kurzes Makro geschrieben rmBrcs, das die Klammern sehr gut entfernt - aber die Makroerweiterung in Sindex funktioniert hier nicht und daher erhalte ich drei Zeilen in der Indexdatei:

\indexentry[myindex]{Test!\rmBrcs{\testone}}{1}
\indexentry[myindex]{Test!\rmBrcs{\testtwo}}{2}
\indexentry[myindex]{Test!\testthree|textbf}{3}

mit dem Ergebnis:

Bildbeschreibung hier eingeben

Ich habe gesehen,Eingefügte Befehle im Argument \sindex[]{} werden nicht erweitert: @-Symbol wird angezeigtDiskussion, aber die Antwort hilft hier nicht weiter, da ich leider eine Mischung aus erweiterten/nicht erweiterten Indexeinträgen erhalte.

Hier ist mein MWE, das die obige Ausgabe erzeugt hat:

\documentclass[fontsize=12pt]{scrartcl} 

\usepackage[ngerman]{babel} 
\usepackage{xstring}

% Remove Braces
\def\rmBrcsTmp{rmBrcsTmp}%
\def\rmBrcs#1{\IfSubStr{#1}{(}{\StrDel{#1}{(}[\rmBrcsTmp]\StrDel{\rmBrcsTmp}{)}\/}{#1}}%

\usepackage[makeindex]{splitidx}
\makeindex 
\newindex{myindex}

\def\testone{(John) Bob Doe}
\def\testtwo{John Bob Doe}
\def\testthree{John Bob Doe}

\begin{document} 

Test on page 1:
\sindex[myindex]{Test!\rmBrcs{\testone}}

\newpage
Test on page 2:
\sindex[myindex]{Test!\rmBrcs{\testtwo}}

\newpage
Test on page 3:
\sindex[myindex]{Test!\testthree}

\newpage
\printindex[myindex]

\end{document} 

Eine andere Idee besteht darin, die Klammern im Voraus zu entfernen, bevor es in geht sindex, aber das übersteigt meine TeX/LaTeX-Kenntnisse.

Antwort1

\sindex, wie \indexerweitertNEINMakro von Natur aus, es sei denn, es wird als Argument eines anderen Befehls aufgerufen.

Allerdings \rmBrcsfunktioniert dein Befehl nicht rein durch Erweiterung, insbesondere \StrDelwird er nicht während einer Operation ausgeführt \write, sodass du mit dem Trick sowieso nicht das gewünschte Ergebnis erzielst

\newcommand{\Sindex}[2][]{\sindex[#1]{#2}}

o.ä.

Sie müssen einen anderen Ansatz wählen und die Klammern zusätzlich zum oben beschriebenen Trick nur mithilfe der Makroerweiterung entfernen.

\documentclass[fontsize=12pt]{scrartcl} 

\usepackage[ngerman]{babel} 
\usepackage[makeindex]{splitidx}

\newindex{potter}

\makeatletter
\newcommand{\rmBrcs}[1]{\expandafter\@rmBrcs#1()\@nil}
\def\@rmBrcs#1(#2)#3\@nil{%
  \if\relax\detokenize{#2}\relax
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {#1}%
  {\@rmBrcs#1#2#3\@nil}%
}
\makeatother
\newcommand{\Sindex}[2][]{\sindex[#1]{#2}}% for expanding contents during \write

\def\testone{(John) Bob Doe}
\def\testtwo{John Bob Doe}
\def\testthree{John Bob Doe}

\begin{document} 

\rmBrcs{\testone}$|$\rmBrcs{\testtwo}$|$\rmBrcs{\testthree}

Test on page 1:
\Sindex[potter]{Test!\rmBrcs{\testone}}

\newpage
Test on page 2:
\Sindex[potter]{Test!\rmBrcs{\testtwo}}

\newpage
Test on page 3:
\Sindex[potter]{Test!\testthree}

\newpage
\printindex[potter]

\end{document} 

Hier ist der Inhalt der erstellten potter.idxDatei:

\indexentry[potter]{Test!John Bob Doe}{1}
\indexentry[potter]{Test!John Bob Doe}{2}
\indexentry[potter]{Test!John Bob Doe}{3}

Antwort2

Sie müssen es \rmbrcsals Nur-Erweitern-Makro definieren:

\def\rmbrcs#1{\expandafter\rmbrcsA#1()\end}
\def\rmbrcsA#1(#2)#3\end{\ifx\end#3\end #1\else \rmbrcsA#1#2#3\end\fi}

Über eine Endrekursion (Dangling) müssen Sie sich keine Gedanken machen, \fida das Argument hier einfacher Text und nicht irgendetwas Rekursives ist.

verwandte Informationen