在 \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),因为这里的参数将是简单的文本而不是一些递归的东西。

相关内容