\footnote quebra construções @ em \index

\footnote quebra construções @ em \index

Para indexar uma expressão TeX não trivial expr, usamos o comando \index{str@expr}, onde stré uma representação simplificada (normalmente ASCII simples) de expra ser usada para classificação.

No entanto, str@expré analisado incorretamente em uma nota de rodapé:

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

Isso gera o seguinte .idxarquivo

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

As duas entradas de índice para 'Gnat' são diferentes e, portanto, \Gnataparecem duas vezes no índice, conforme mostrado nesta captura de tela:

insira a descrição da imagem aqui

Como \footnotemodifica o \indexcomando e o que pode ser feito a respeito?

Responder1

Não é tanto uma questão de @construção, mas de expansão das sequências de controle. Uma solução alternativa baseada emhttps://groups.google.com/forum/#!topic/comp.text.tex/_Hwo6Hapcngsugere fornecer um comando que possamos usar para proteger a barra invertida na entrada do índice na nota de rodapé por meio de \def\indexprotect#1{\string#1}. Como aponta Ulrike Fischer \stringjá é bom o suficiente para fazer isso por conta própria:

Exemplo de saída

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

Responder2

A solução de @Andrew Swann e @Ulrike Fischer (use \stringpara escapar da barra invertida expr) funciona bem, mas requer esforço repetido em todas as notas de rodapé ou legendas envolvidas. Portanto a solução mencionada no comentário de @egreg,

\usepackage{bigfoot}

que resolve o problema de uma vez por todas, parece-me preferível.

informação relacionada