Entradas de índice Xindy y Hyperref personalizadas

Entradas de índice Xindy y Hyperref personalizadas

Mi objetivo es tener entradas de índice que proporcionen hipervínculos a ejemplos específicos en una página, utilizando xindy. Esto se desprende de unapregunta anterior; esa pregunta tiene un código que funciona con makeindex. Crea un .idxarchivo con entradas como esta:

\indexentry {First example|indexanchor{example:2}}{1(2)}
\indexentry {Second example|indexanchor{example:3}}{1(3)}
\indexentry {Third example|indexanchor{example:4}}{1(4)}

La ejecución de un .idxarchivo de este tipo xindyproduce errores como este, ya que xindyinterpreta la entrada como referencias cruzadas:

WARNING: unknown cross-reference-class `indexanchor'! (ignored)

¿Cómo se pueden xindyprocesar estos archivos?

Respuesta1

La solución que se me ocurrió es enseñar xindya reconocer los comandos de hipervínculo como tipos de referencias de páginas. (El código que sigue no permite hacer referencias a rangos de páginas, pero simplemente no lo incluí porque es irrelevante para mi aplicación).

El código genera un .idxarchivo como este, con el comando de hipervínculo incluido como parte de la referencia de la página. ( \indexanchorse define a continuación; las "marcas son solo escapes para {.

\indexentry{First example}{\indexanchor{example:1"}{1(1)"}}
\indexentry{Second example}{\indexanchor{example:2"}{1(2)"}}
\indexentry{Third example}{\indexanchor{example:3"}{1(3)"}}

xindysólo necesita que le digan cómo son estos rangos de páginas. Esto es xindy-hyperref.xdy:

(define-location-class "page-example-hyperref" ( :sep "\indexanchor{example:" "arabic-numbers" :sep "}{" "arabic-numbers" :sep "(" "arabic-numbers" :sep ")}" ))

Para producirlo .idxen el formato adecuado, necesitaba crear mi propia estructura de salida. (Me interesaría si alguien tuviera una forma más elegante de redefinir una macro a partir de un paquete de indexación. Cuando llegó el momento, me sorprendió lo sencillo que era escribir mi propio código de indexación).xindy-hyperref.tex:

\documentclass{book}
\usepackage{expex,hyperref,lipsum}
% open the index file
\newwrite\outputstream
\immediate\openout\outputstream=xindy-hyperref.idx
% Index references like 2(3)
\newcommand{\PageExample}{\thepage (\the\excnt)}
% Write the index entries to a file
\def\xindex#1#2#3{%
    \immediate\write#3{\string\indexentry {#2}{\string\indexanchor{example:\the\excnt"}{\PageExample"}}}
    }
\def\indexanchor#1#2{\hyperlink{#1}{#2}}
% clean output
\def\iex#1{%
    \xindex{my-index}{#1}{\outputstream}%
    \ex %
    \raisebox{\baselineskip}{\hypertarget{example:\the\excnt}{}}\ignorespaces}

\begin{document}
\iex{First example} \lipsum[1] \xe

\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

\InputIfFileExists{xindy-hyperref.ind}{}{}

\end{document}

Para compilar el ejemplo:

xelatex xindy-hyperref.tex
texindy -L english xindy-hyperref.idx -o xindy-hyperref.ind -M xindy-hyperref
xelatex xindy-hyperref.tex

información relacionada