
Для индексации нетривиального выражения 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}
который решает проблему раз и навсегда, мне кажется более предпочтительным.