\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[]{} 인수에 명령 삽입이 확장되지 않음: @-symbol 표시토론이지만 여기서는 대답이 도움이 되지 않습니다. 불행히도 확장/확장되지 않은 색인 항목이 혼합되어 있기 때문입니다.

위의 출력을 생성한 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여기서 인수는 재귀적인 것이 아닌 간단한 텍스트이므로 꼬리 재귀(dangling)에 대해 걱정할 필요가 없습니다 .

관련 정보