我想索引一些可能包含代码的文本元素,例如:
foo of type \code{bar}
其中的\code
内容类似于\texttt
。但是当我将此文本粘贴到时\index
,代码和普通文本之间的排序规则不同:
\index{foo of type \code{bar}}
\index{foo of type abc}
\index{foo of type unknown}
排序规则是错误的,为了获得正确的排序规则,我需要说:
\index{foo of type bar@foo of type \code{bar}}
\index{foo of type abc@foo of type abc}
\index{foo of type unknown@foo of type unknown}
然而,维护起来非常繁琐。
是否可以编写一个命令来为排序规则创建剥离的“裸”文本?理想情况下,类似这样的命令:
\myindex{abc \code{def} ghi}
即成为
\index{abc def ghi@abc \code{def} ghi}
?
如果该机制只能剥离一个特定命令(例如\code
上述命令),那么这是可以接受的。
重现的小例子:
\documentclass{article}
\usepackage{makeidx}
\makeindex
\begin{document}
\index{aba}
\index{abc}
\index{abe}
\index{ab\texttt{b}}
\index{ab\texttt{d}}
\printindex
\end{document}
这会导致排序不正确。我想要一个可以代替的宏,\index
它可以生成正确的排序顺序“aba”、“abb”、“abc”、“abd”、“abe”。
答案1
我不确定这是否是一种好方法,但对于发布的最小示例来说,它似乎有效。它试图仅解决所描述的受限问题,即仅处理一个命令。在这种情况下,\code{}
将进行特殊处理,以便它不会影响条目的排序,而只会影响条目的格式。
\documentclass{article}
\usepackage{makeidx}
\makeindex
\newcommand*\ocode[1]{\string\texttt{#1}}
\newcommand*\nocode[1]{#1}
\let\code\ocode
\def\myindexx#1\relax{\index{#1}}
\newcommand*\myindex[1]{%
\let\code\nocode
\edef\tempa{#1}%
\let\code\ocode
\myindexx\tempa@#1\relax
}
\begin{document}
abc
\myindex{aba}
\myindex{abc}
\myindex{abe}
\myindex{ab\code{b}}
\myindex{ab\code{d}}
\printindex
\end{document}