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 .idx
Datei 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 .idx
Datei xindy
führt zu Fehlern wie diesem, da xindy
die Eingaben als Querverweise interpretiert werden:
WARNING: unknown cross-reference-class `indexanchor'! (ignored)
Wie können xindy
diese Dateien verarbeitet werden?
Antwort1
Die Lösung, die ich gefunden habe, besteht darin, zu lehren, xindy
Hyperlink-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 .idx
Datei wie diese, wobei der Hyperlink-Befehl als Teil der Seitenreferenz enthalten ist. ( \indexanchor
ist 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)"}}
xindy
Man 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