\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}. Как отмечает Ульрике Фишер, \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}

который решает проблему раз и навсегда, мне кажется более предпочтительным.

Связанный контент