在 \sindex[]{} 的參數中插入巨集不會展開

在 \sindex[]{} 的參數中插入巨集不會展開

我必須\sindex[]{}從外部生成的 TeX 程式碼的 splitxdx 套件中建立一個單獨的暫存器。有兩個名字的人的稱呼有時會放在大括號中,有時不放在大括號中。因此對於索引,應該刪除大括號。

我寫了一個簡短的宏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),因為這裡的參數將是簡單的文本,而不是一些遞歸的東西。

相關內容