\footnote 破坏了 \index 中的 @ 结构

\footnote 破坏了 \index 中的 @ 结构

要索引一个非平凡的 TeX 表达式expr,我们使用命令\index{str@expr},其中是用于排序的str简化(通常是纯 ASCII)表示。expr

然而,str@expr脚注内的解析不正确:

\documentclass{report}
\usepackage{imakeidx}
\makeindex

\def\gnu{\texttt{Gnu}}
\def\gnat{\texttt{Gnat}}
\begin{document}
Some text\index{Gnu@\gnu}\index{Gnat@\gnat}.

\pagebreak
Some more text\index{Gnu@\gnu}.\footnote
{A footnote.\index{Gnat@\gnat}}

\printindex
\end{document}

这将生成以下.idx文件

\indexentry{Gnu@\gnu}{1}
\indexentry{Gnat@\gnat}{1}
\indexentry{Gnu@\gnu}{2}
\indexentry{Gnat@\texttt  {Gnat}}{2}

“Gnat” 的两个索引条目有所不同,因此\Gnat在索引中出现了两次,如以下屏幕截图所示:

在此处输入图片描述

如何\footnote修改\index命令,以及可以做些什么?

答案1

这不是一个构造问题@,而是一个控制序列扩展问题。一个基于https://groups.google.com/forum/#!topic/comp.text.tex/_Hwo6Hapcng建议提供一个命令,我们可以使用它来保护脚注中索引条目中的反斜杠\def\indexprotect#1{\string#1}。正如 Ulrike Fischer 指出的那样,\string它本身就足以做到这一点:

示例输出

\documentclass{report}
\usepackage{imakeidx}
\makeindex

\def\gnu{\texttt{Gnu}}
\def\gnat{\texttt{Gnat}}
\begin{document}
Some text\index{Gnu@\gnu}\index{Gnat@\gnat}.

\pagebreak
Some more text\index{Gnu@\gnu}.\footnote
{A footnote.\index{Gnat@\string\gnat}}

\printindex
\end{document}

答案2

@Andrew Swann 和 @Ulrike Fischer 的解决方案(用于\string转义 中的反斜杠expr)效果很好,但需要在所有相关的脚注或标题中重复努力。因此,@egreg 在评论中提到的解决方案,

\usepackage{bigfoot}

一劳永逸地解决问题,对我来说似乎更好。

相关内容