![\sindex[]{} 인수에 매크로 삽입이 확장되지 않음](https://rvso.com/image/476996/%5Csindex%5B%5D%7B%7D%20%EC%9D%B8%EC%88%98%EC%97%90%20%EB%A7%A4%ED%81%AC%EB%A1%9C%20%EC%82%BD%EC%9E%85%EC%9D%B4%20%ED%99%95%EC%9E%A5%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9D%8C.png)
\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)에 대해 걱정할 필요가 없습니다 .