Especifique destinos de links para entradas de índice feitas com hiperref

Especifique destinos de links para entradas de índice feitas com hiperref

Eu tenho um código para criar um índice que encaminha os leitores a um número de página e um número de exemplo. (O código está incluído emesta resposta, reproduzido abaixo por conveniência. Acontece que estou usando expex, mas poderia muito bem ser um número de equação, por exemplo.) Gostaria de usar hyperrefpara gerar links para o exemplo específico, em vez de apenas para a página. Existe uma maneira de fazer isso? Estou usando xindycomo processador de índice.

\documentclass{book}
\usepackage{expex,lipsum,index}
\newcommand{\PageExample}{\thepage-\the\excnt}
\newindex[PageExample]{my-index}{idx}{ind}{My Custom Index}
\makeindex
\begin{document}
\ex \lipsum[1]\index[my-index]{First example} \xe

\ex \lipsum[2] \index[my-index]{Second example}\xe

\ex \lipsum[3] \index[my-index]{Third example}\xe

\ex \lipsum[4] \index[my-index]{Fourth example}\xe

\ex \lipsum[5] \index[my-index]{Fifth example}\xe

\ex \lipsum[6] \index[my-index]{Sixth example}\xe

\ex \lipsum[6] \index[my-index]{Seventh example}\xe

\printindex[my-index]
\end{document}

Responder1

Aqui está a solução, baseada emesta resposta.

\documentclass{book}
\usepackage{expex,lipsum,index}
\newindex[PageExample]{my-index}{idx}{ind}{My Custom Index}
\usepackage[hyperindex=false]{hyperref} % has to be after makeidx
\newcommand{\PageExample}{\thepage-\the\excnt}
\makeindex

\def\xindex#1#2{%
  \edef\doindexentry{\noexpand\index[#1]
    {#2|indexanchor{example:\the\excnt}}}%
    \doindexentry}

\def\indexanchor#1#2{\hyperlink{#1}{#2}}

\begin{document}

\xindex{my-index}{First example}
\ex 
    \raisebox{\baselineskip}{\hypertarget{example:\the\excnt}{}}\ignorespaces%
    \lipsum[1] 
\xe

% now make the code prettier:
\def\iex#1{%
    \xindex{my-index}{#1}%
    \ex %
    \raisebox{\baselineskip}{\hypertarget{example:\the\excnt}{}}\ignorespaces}

\iex{Second example} \lipsum[2] \xe

\iex{Third example} \lipsum[3] \xe

\iex{Fourth example} \lipsum[4] \xe

\iex{Fifth example} \lipsum[5] \xe

\iex{Sixth example} \lipsum[6] \xe

\iex{Seventh example} \lipsum[7] \xe

\printindex[my-index]
\end{document}

Existem dois "truques" para isso. A primeira é que a macro que cria um hiperlink é passada \indexcomo se fosse um comando de formatação (por exemplo, \index{Joe|indexanchor}em vez de \index{Joe|textit}).

O segundo truque é usar \edefpara expandir todas as macros necessárias antes de chamá-las para chamar a \indexmacro. Se \xindexhouvesse uma chamada \indexfora de \edef, ele escreveria algo assim no arquivo .idx: \indexentry {First example|indexanchor{example: \the \excnt}}{1-1}.

informação relacionada