A inserção de macros no argumento de \sindex[]{} não é expandida

A inserção de macros no argumento de \sindex[]{} não é expandida

Eu tenho que construir um registro individual \sindex[]{}do pacote splitxdx a partir de um código TeX gerado externamente. O nome de pessoas com dois nomes às vezes é colocado entre colchetes, às vezes não. Portanto, para o índice, os colchetes devem ser removidos.

Eu escrevi uma pequena macro rmBrcsque remove muito bem os colchetes - mas a expansão da macro no sindex não funciona aqui e, portanto, recebo três linhas no arquivo de índice:

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

com o resultado:

insira a descrição da imagem aqui

Eu vi oA inserção de comandos no argumento de \sindex[]{} não é expandida: símbolo @ aparecendodiscussão, mas a resposta não ajuda aqui, porque infelizmente recebo uma mistura de entradas de índice expandidas/não expandidas.

Aqui está meu MWE que produziu a saída acima:

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

Outra ideia é remover os colchetes antecipadamente antes de entrar sindex, mas isso está além do meu conhecimento de TeX/LaTeX.

Responder1

\sindex, como \indexse expandenãomacro por design, a menos que seja chamada como argumento para outro comando.

No entanto, seu \rmBrcscomando não funciona puramente por expansão, em particular \StrDelnão é executado durante uma \writeoperação, então você não consegue o que deseja de qualquer maneira com o truque

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

ou similar.

Você tem que adotar outra abordagem e remover os parênteses usando apenas a expansão macro, além de usar o truque acima.

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

Aqui está o conteúdo do potter.idxarquivo produzido:

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

Responder2

Você precisa definir \rmbrcscomo macro somente de expansão:

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

Não há necessidade de se preocupar com a recursão final (dangling \fi), pois o argumento aqui será um texto simples e não algo recursivo.

informação relacionada