Xindy とカスタム Hyperref インデックス エントリ

Xindy とカスタム Hyperref インデックス エントリ

私の目標は、ページ上の特定の例へのハイパーリンクを提供するインデックスエントリを作成することですxindy。これは、以前の質問; その質問には で動作するコードがありますmakeindex.idx次のようなエントリを含むファイルを作成します。

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

このようなファイルを実行する.idxと、入力が相互参照として解釈されるxindyため、次のようなエラーが発生します。xindy

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

これらのファイルをどのように処理すればよいでしょうかxindy?

答え1

私が思いついた解決策は、xindyハイパーリンク コマンドをページ参照の種類として認識するように教えることです。(次のコードではページ範囲参照は有効になりませんが、これは私のアプリケーションとは無関係なので、単に含めませんでした。)

コードは.idx次のようなファイルを生成します。ハイパーリンク コマンドはページ参照の一部として含まれます。 (\indexanchorは以下で定義されます。"マークは のエスケープです{

\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これらのページ範囲がどのようになっているかを伝える必要があります。これは次のとおりですxindy-hyperref.xdy

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

適切な形式で生成するには.idx、独自の出力構造を作成する必要がありました。(インデックス パッケージのマクロを再定義するよりエレガントな方法があれば興味があります。実際にやってみると、独自のインデックス コードを書くのがいかに簡単かに驚きました。)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}

例をコンパイルするには:

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

関連情報