在 \sindex[]{} 參數中插入命令不會擴展:@-符號顯示

在 \sindex[]{} 參數中插入命令不會擴展:@-符號顯示

我正在使用包\sindex[]{}中的命令splitxdx來建立索引條目。為了控制排序,我使用@符號,例如\sindex[...]{1@One}

為了使事情更加可配置,我定義了一個自訂命令:\newcommand{\sortedOne}{1@One}

問題是當我將此命令插入到的參數中時,我會顯示\sindex文字文字。1@One例如,程式碼\sindex[myindex]{\sortedOne!This fails.}產生以下條目中的第一個:

在此輸入影像描述

有沒有簡單的方法可以避免這種情況?我更喜歡一種方法,這樣我就不必在\expandafter每次使用時手動輸入類似的內容\sindex

作為一個有趣的旁注,它\sindex如果我將命令包裝在包\comma@parse中的命令中,則可以正常工作kvsetkeys\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

通常索引命令不會擴展其參數並逐字讀取其內容。這也可以防止巨集被擴充。透過在索引命令看到參數之前讀取參數,逐字更改無效,因為標記已經形成,請參閱以下定義\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}

後兩種形式可以透過 makeindex 選項合併-c,該選項合併連續的空格,但不含空格的條目與有空格的條目仍然不同。

相關內容