![在 \sindex[]{} 參數中插入命令不會擴展:@-符號顯示](https://rvso.com/image/298305/%E5%9C%A8%20%5Csindex%5B%5D%7B%7D%20%E5%8F%83%E6%95%B8%E4%B8%AD%E6%8F%92%E5%85%A5%E5%91%BD%E4%BB%A4%E4%B8%8D%E6%9C%83%E6%93%B4%E5%B1%95%EF%BC%9A%40-%E7%AC%A6%E8%99%9F%E9%A1%AF%E7%A4%BA.png)
我正在使用包\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
,該選項合併連續的空格,但不含空格的條目與有空格的條目仍然不同。