我使用\index
传统方式,但也使用一些宏作为内容。更准确地说,我有一些宏,例如\def\foo{BAR}
,然后我使用\index{\foo}
。
不幸的是,索引是按宏的名称排序的,而不是按宏的内容排序的。这很尴尬,因为所有宏都位于列表顶部(由于使用了\
)。
有办法改变这种状况吗?
答案1
如果在读取之前展开宏\index
,则内容之后的排序应该是正确的。您可以使用以下方法执行此操作\expandafter
:
\def\foo{BAR}
% ...
\expandafter\index\expandafter{\foo}
{ }
如果将其放在定义里面则会更短:
\def\foo{{BAR}}
% ...
\expandafter\index\foo
\edef
对于更复杂的内容,即具有多个宏,您应该使用(或可能)完全扩展内容\protected@edef
:
\def\foo{BAR}
\def\bar{FOO}
% ...
\edef\temp{\noexpand\index{\foo\bar}}
\temp
如果您想要保留\temp
本地定义,请使用:
\begingroup
\edef\temp{\endgroup\noexpand\index{\foo\bar}}
\temp
反而。
答案2
\documentclass{article}
\usepackage{makeidx}\makeindex
\def\Index#1{#1\expandafter\index\expandafter{#1}}
\begin{document}
\index{classical}
\def\foo{BAR} and I use then \foo\index{\foo} (the wrong entry)\newpage
and \Index{\foo} (the correct entry).
\printindex
\end{document}
第一个条目是错误的,第二个条目\Index
正确:
答案3
这是 Martin Sharrer 的解决方案的一个示例(如上所示)。
所有索引键 AAAAA 到 HHHHH 均按字母顺序排序,无论其原始格式如何(newcommand、def、bfseries 等),但 ZZZZZ 则不然。
\documentclass{article}
\usepackage{imakeidx}
\usepackage{xcolor}
\makeindex%
\begin{document}
\newcommand{\BBBBB}[0]{BBBBB}
\newcommand{\DDDDD}[0]{DDDDD}
\def\EEEEE{EEEEE}
\def\FFFFF{FFFFF}
\def\HHHHH{HHHHH}
\newcommand{\ZZZZZ}[0]{ZZZZZ}
Here is an example of Martin Sharrer's solution (http://tex.stackexchange.com/questions/18336/correct-sorting-of-index-entries-containing-macros).
All the index keys AAAAA to HHHHH are sorted in alphabetical order, regardless of their original format (newcommand, def, bfseries, etc.) whereas ZZZZZ is not.
\index{AAAAA@\bfseries AAAAA \normalfont}
\expandafter\index\expandafter{\BBBBB}
\index{CCCCC}
\expandafter\index\expandafter{\DDDDD}
\expandafter\index\expandafter{\EEEEE @ \scshape \EEEEE \normalfont}
\expandafter\index\expandafter{\FFFFF}
\index{GGGGG@\color{red} GGGGG \color{black}\normalfont}
\expandafter\index\expandafter{\HHHHH}
\index{\ZZZZZ}% sorted according to its "\"
\printindex
\end{document}