Xindy und benutzerdefinierte Hyperref-Indexeinträge

Xindy und benutzerdefinierte Hyperref-Indexeinträge

Mein Ziel ist es, Indexeinträge zu haben, die Hyperlinks zu bestimmten Beispielen auf einer Seite bereitstellen, indem ich verwende xindy. Dies folgt aus einerfrühere Frage; diese Frage enthält Code, der mit funktioniert makeindex. Er erstellt eine .idxDatei mit Einträgen wie diesen:

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

Das Durchlaufen einer solchen .idxDatei xindyführt zu Fehlern wie diesem, da xindydie Eingaben als Querverweise interpretiert werden:

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

Wie können xindydiese Dateien verarbeitet werden?

Antwort1

Die Lösung, die ich gefunden habe, besteht darin, zu lehren, xindyHyperlink-Befehle als Seitenverweise zu erkennen. (Der folgende Code unterstützt keine Seitenbereichsverweise, aber ich habe das einfach nicht aufgenommen, weil es für meine Anwendung irrelevant ist.)

Der Code generiert eine .idxDatei wie diese, wobei der Hyperlink-Befehl als Teil der Seitenreferenz enthalten ist. ( \indexanchorist unten definiert; die "Markierungen sind nur Escape-Zeichen für {.

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

xindyMan muss nur wissen, wie diese Seitenbereiche aussehen. Das ist xindy-hyperref.xdy:

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

Um das im richtigen Format zu erzeugen .idx, musste ich meine eigene Ausgabestruktur erstellen. (Es würde mich interessieren, ob jemand eine elegantere Möglichkeit kennt, ein Makro aus einem Indexierungspaket neu zu definieren. Als es soweit war, war ich überrascht, wie einfach es war, meinen eigenen Indexierungscode zu schreiben.)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}

So kompilieren Sie das Beispiel:

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

verwandte Informationen