\sindex[]{} 인수에 명령 삽입이 확장되지 않음: @-symbol 표시

\sindex[]{} 인수에 명령 삽입이 확장되지 않음: @-symbol 표시

\sindex[]{}패키지 의 명령을 사용하여 splitxdx색인 항목을 생성하고 있습니다. 정렬을 제어하기 위해 @기호(예: )를 사용하고 있습니다 \sindex[...]{1@One}.

좀 더 구성하기 쉽도록 사용자 정의 명령을 정의합니다 \newcommand{\sortedOne}{1@One}.

문제는 이 명령을 \sindex의 인수에 삽입할 때 리터럴 텍스트가 1@One표시된다는 것입니다. 예를 들어, 코드는 \sindex[myindex]{\sortedOne!This fails.}다음 항목 중 첫 번째 항목을 생성합니다.

여기에 이미지 설명을 입력하세요

이것을 피하는 쉬운 방법이 있습니까? \expandafter나는 를 사용할 때마다 수동으로 입력할 필요가 없는 방법을 선호합니다 \sindex.

흥미로운 참고 사항으로,하다패키지 의 명령 \sindex에 명령 을 래핑하면 올바르게 작동합니다 .\comma@parsekvsetkeys\comma@parse{\sortedOne!This works with comma parse}{\sindex[myindex]}

위의 출력을 생성한 MWE는 다음과 같습니다.

\documentclass[12pt]{book}

\usepackage[split]{splitidx}\makeindex
    \newindex{myindex}
\usepackage{lipsum}
\usepackage{kvsetkeys}
%\usepackage{hyperref}
%\newcommand{\mainindexentry}[1]{\textbf{\hyperpage{#1}}}
\newcommand{\sortedOne}{1@One}

\begin{document}

\lipsum[1]

\sindex[myindex]{1@One!This works fine}
\sindex[myindex]{\sortedOne!This fails.}
\sindex[myindex]{Even subentries fail!\sortedOne}
\makeatletter
\comma@parse{\sortedOne!This works with comma parse}{\sindex[myindex]}
\makeatother

\printindex[myindex]

\end{document}

답변1

일반적으로 인덱스 명령은 인수를 확장하지 않고 해당 내용을 그대로 읽습니다. 이는 또한 매크로가 확장되는 것을 방지합니다. index 명령이 인수를 확인하기 전에 인수를 읽으면 토큰이 이미 형성되어 있으므로 축어적 변경 사항이 적용되지 않습니다 \Sindex. 다음 정의를 참조하세요.

\documentclass[12pt]{book}

\usepackage[split]{splitidx}\makeindex
    \newindex{myindex}
\usepackage{lipsum}
%\usepackage{kvsetkeys}
%\usepackage{hyperref}
%\newcommand{\mainindexentry}[1]{\textbf{\hyperpage{#1}}}
\newcommand{\sortedOne}{1@One}

\newcommand*{\myindex}{\sindex[myindex]}
\newcommand*{\smyindex}[1]{\sindex[myindex]{#1}}
\newcommand*{\Sindex}[2][]{\sindex[{#1}]{#2}}

\begin{document}

\lipsum[1]

\sindex[myindex]{1@One!This works fine}
\expandafter\myindex\expandafter{\sortedOne!This also works.}
\smyindex{Even subentries work!\sortedOne}
\Sindex[myindex]{\sortedOne!\sortedOne}

\printindex[myindex]

\end{document}

결과

물론, 확장되어서는 안 되는 명령은 다음으로 보호되어야 합니다 \string.

\Sindex[myindex]{...\string\fragilecmd...}

또는 다음을 통해 여러 토큰을 보호할 수 있습니다 \detokenize.

\Sindex[myindex]{...\detokenize{...}...}

또한 확장/비확장 인덱스 항목으로 인한 중복 인덱스 항목을 방지하기 위해 메서드(확장 포함/비포함)를 혼합해서는 안 됩니다. 방법에 따라 명령 뒤의 공백 수가 달라질 수 있습니다.

\sindex[myindex]{\textbf{...}}
\Sindex[myindex]{\string\textbf{...}}
\Sindex[myindex]{\protect\textbf{...}}
\Sindex[myindex]{\textbf{...}}

파일 결과 .idx:

\indexentry{\textbf{...}}{1}
\indexentry{\textbf{...}}{1}
\indexentry{\textbf {...}}{1}
\indexentry{\textbf  {...}}{1}

후자의 두 형식은 -c연속 공백을 병합하는 makeindex' 옵션을 사용하여 병합할 수 있지만 공백이 없는 항목은 공백이 있는 항목과 다릅니다.

관련 정보