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 .idx
archivo 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 .idx
archivo de este tipo xindy
produce errores como este, ya que xindy
interpreta la entrada como referencias cruzadas:
WARNING: unknown cross-reference-class `indexanchor'! (ignored)
¿Cómo se pueden xindy
procesar estos archivos?
Respuesta1
La solución que se me ocurrió es enseñar xindy
a 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 .idx
archivo como este, con el comando de hipervínculo incluido como parte de la referencia de la página. ( \indexanchor
se 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)"}}
xindy
só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 .idx
en 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