La inserción de macros en el argumento de \sindex[]{} no se expande

La inserción de macros en el argumento de \sindex[]{} no se expande

Tengo que crear un registro individual a \sindex[]{}partir del paquete splitxdx a partir de un código TeX generado externamente. El nombre de las personas con dos nombres a veces se pone entre llaves, a veces no. Entonces, para el índice se deben quitar las llaves.

Escribí una macro breve rmBrcsque elimina muy bien las llaves, pero la expansión de la macro en sindex no funciona aquí y, por lo tanto, obtengo tres líneas en el archivo de índice:

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

con el resultado:

ingrese la descripción de la imagen aquí

he visto elLa inserción de comandos en el argumento de \sindex[]{} no se expande: aparece el símbolo @discusión, pero la respuesta no ayuda aquí, porque desafortunadamente obtengo una combinación de entradas de índice expandidas/no expandidas.

Aquí está mi MWE que produjo el resultado anterior:

\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} 

Otra idea es quitar las llaves por adelantado antes de que entren sindex, pero esto está más allá de mi conocimiento de TeX/LaTeX.

Respuesta1

\sindex, como \indexse expandeNomacro por diseño, a menos que se llame como argumento de otro comando.

Sin embargo, su \rmBrcscomando no funciona puramente por expansión, en particular \StrDelno se ejecuta durante una \writeoperación, por lo que de todos modos no obtiene lo que desea con el truco.

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

o similar.

Tienes que adoptar otro enfoque y eliminar los paréntesis usando solo la expansión macro, además de usar el truco anterior.

\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} 

Aquí está el contenido del potter.idxarchivo producido:

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

Respuesta2

Debe definir \rmbrcscomo macro de solo expansión:

\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}

No hay necesidad de preocuparse por la recursividad de cola (colgante \fi), ya que el argumento aquí será un texto simple, no algo recursivo.

información relacionada