Мне нужно построить отдельный регистр \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
), поскольку аргументом здесь будет простой текст, а не какая-то рекурсивная вещь.