我想对索引条目进行排序,而不考虑大小写。
最初我得到的是(MWE 中提供的代码)左侧的图像。因此,似乎就像一个简单的修复:只需应用\lowercase
(在 MWE 中取消注释\def
)但会产生右侧的图像:
那么,我如何按字母顺序排列这些内容,并将这两个条目显示zero
为单个标题下的子条目?
失败的尝试:
我以为这是一个解释问题,所以我尝试使用
\edef\LowerCaseWord{\lowercase{#2}} \index{\LowerCaseWord!#1}
但这也产生了与右图相同的结果。
由于这里的一位明智的成员(我认为他不再想与此评论相关联:-))曾经暗示,几个精心放置的
\expandafter
s 应该可以解决我尝试过的所有问题,而且它也不会改变输出:\edef\LowerCaseWord{\lowercase{#2}} \expandafter\index{\LowerCaseWord!#1}
代码:
%\def\UseLowercase{}% Uncomment to use lowercase
\documentclass{article}
\usepackage{imakeidx}
\ifdefined\UseLowercase% Select whether we use lowercase or not
\newcommand{\IndexTitle}{Index (lowercase)}%
\else
\newcommand{\IndexTitle}{Index}%
\renewcommand{\lowercase}[1]{#1}%
\fi
\newcommand*{\AddIndexEntry}[2]{%
% #1 = indexed term, #2 = word to index this under
\par\noindent
Indexing: #2
\index{\lowercase{#2}!#1}
}%
\makeindex[title={\IndexTitle},columns=1]
\begin{document}
\AddIndexEntry{aardvark}{aardvark}
\AddIndexEntry{Saved by Zero}{Saved}
\AddIndexEntry{Saved by Zero}{Zero}
\AddIndexEntry{zero}{zero}
\printindex
\end{document}
答案1
我想说的是
\newcommand*{\AddIndexEntry}[2]{%
% #1 = indexed term, #2 = word to index this under
\par\noindent
\lowercase{\def\temp{#2}}%
Indexing: #2%
\expandafter\index\expandafter{\temp!#1}%
}
应该是你需要的。
如何\lowercase
工作的?它将参数发送给另一个处理器(它的不是宏,因此它无法在 TeX 的“嘴里”工作);使用表格转换标记列表\lccode
:每个没有零的字符标记\lccode
都转换为其小写对应项,但符号标记(例如\def
或\temp
保持不变。这样获得的标记列表被放回到输入中,就好像它从一开始就在那里一样。有不在此过程中进行扩展:因此,如果 TeX 发现\lowercase{\def\temp{Xyz}}
它正在执行某些操作,那么它会“等待”一会儿,按照说明处理标记列表,然后处理
\def\temp{xyz}
并随之而去。
如果有多个索引,则可以使用修改后的形式:
\documentclass{article}
\usepackage{imakeidx}
\newcommand*{\AddIndexEntry}[3][]{%
% #1 = indexed term, #2 = word to index this under
\par\noindent
\lowercase{\def\temp{#3}}%
Indexing: #3%
\if!#1!
\expandafter\index\expandafter{\temp!#2}%
\else
\expandafter\indexopt\expandafter{\temp!#2}{#1}
\fi
}
\newcommand{\indexopt}[2]{\index[#2]{#1}}
\makeindex
\makeindex[name=Name,title=Title,columns=1]
\begin{document}
\AddIndexEntry{aardvark}{aardvark}
\AddIndexEntry{Saved by Zero}{Saved}
\AddIndexEntry{Saved by Zero}{Zero}
\AddIndexEntry[Name]{zero}{zero}
\printindex
\printindex[Name]
\end{document}
宏\indexopt
负责切换参数,这样就\expandafter
不需要跳过可选参数\index
。
答案2
按照 egreg 的回答,对于那些只需要 1 个参数版本并且在表中有小写单词的人来说:
\newcommand{\lindex}[1]{%
\lowercase{\def\temp{#1}}%
\expandafter\index\expandafter{\temp}%
}