Вставка макросов в аргумент \sindex[]{} не расширяется

Вставка макросов в аргумент \sindex[]{} не расширяется

Мне нужно построить отдельный регистр \sindex[]{}из пакета splitxdx из внешнего сгенерированного кода TeX. Имя вызова людей с двумя именами иногда заключено в фигурные скобки, иногда нет. Поэтому для индекса скобки следует убрать.

Я написал короткий макрос rmBrcs, который очень хорошо удаляет скобки, но расширение макроса в sindex здесь не работает, и поэтому я получаю три строки в индексном файле:

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

с результатом:

введите описание изображения здесь

Я виделВставка команд в аргумент \sindex[]{} не раскрывается: отображается @-символобсуждение, но ответ здесь не поможет, потому что, к сожалению, я получаю смесь расширенных/нерасширенных записей индекса.

Вот мой MWE, который выдал указанный выше результат:

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

Другая идея — удалить скобки заранее, до того, как они попадут в sindex, но это выходит за рамки моих знаний TeX/LaTeX.

решение1

\sindex, как \indexрасширяетсянетмакрос по умолчанию, если только он не вызывается как аргумент другой команды.

Однако ваша \rmBrcsкоманда не работает исключительно путем расширения, в частности, \StrDelне выполняется во время \writeоперации, так что вы в любом случае не получите желаемого с помощью этого трюка.

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

или похожие.

Вам придется применить другой подход и убрать скобки, используя только макрорасширение, помимо использования вышеописанного приема.

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

Вот содержимое полученного potter.idxфайла:

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

решение2

Вам необходимо определить \rmbrcsкак макрос только для расширения:

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

Нет необходимости беспокоиться о хвостовой рекурсии (висячей \fi), поскольку аргументом здесь будет простой текст, а не какая-то рекурсивная вещь.

Связанный контент