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:
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 \index
erweitertNEINMakro von Natur aus, es sei denn, es wird als Argument eines anderen Befehls aufgerufen.
Allerdings \rmBrcs
funktioniert dein Befehl nicht rein durch Erweiterung, insbesondere \StrDel
wird 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.idx
Datei:
\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 \rmbrcs
als 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, \fi
da das Argument hier einfacher Text und nicht irgendetwas Rekursives ist.