\sindex[]{}の引数に挿入されたマクロは展開されません

\sindex[]{}の引数に挿入されたマクロは展開されません

外部で生成された TeX コードから、splitxdx パッケージを使用して個別のレジスタを構築する必要があります\sindex[]{}。 2 つのファーストネームを持つ人の呼び出し名は、中括弧で囲まれる場合と、囲まれない場合があります。 そのため、インデックスの場合は中括弧を削除する必要があります。

rmBrcs私は中括弧をうまく削除する短いマクロを作成しましたが、sindex のマクロ展開はここでは機能しないため、インデックス ファイルに 3 行が表示されます。

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

もう 1 つのアイデアは、 に入る前に中括弧を削除することです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ここでの引数は再帰的なものではなく単純なテキストなので、末尾再帰 (ぶら下がり) について心配する必要はありません。

関連情報