将 \lowercase 应用于索引条目

将 \lowercase 应用于索引条目

我想对索引条目进行排序,而不考虑大小写。

最初我得到的是(MWE 中提供的代码)左侧的图像。因此,似乎就像一个简单的修复:只需应用\lowercase(在 MWE 中取消注释\def)但会产生右侧的图像:

在此处输入图片描述 在此处输入图片描述

那么,我如何按字母顺序排列这些内容,并将这两个条目显示zero为单个标题下的子条目?

失败的尝试:

  1. 我以为这是一个解释问题,所以我尝试使用

    \edef\LowerCaseWord{\lowercase{#2}}
    \index{\LowerCaseWord!#1}
    

    但这也产生了与右图相同的结果。

  2. 由于这里的一位明智的成员(我认为他不再想与此评论相关联:-))曾经暗示,几个精心放置的\expandafters 应该可以解决我尝试过的所有问题,而且它也不会改变输出:

    \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}%
}

相关内容