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 rmBrcs
que 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:
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 \index
se expandeNomacro por diseño, a menos que se llame como argumento de otro comando.
Sin embargo, su \rmBrcs
comando no funciona puramente por expansión, en particular \StrDel
no se ejecuta durante una \write
operació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.idx
archivo 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 \rmbrcs
como 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.