Моя цель — иметь записи индекса, которые предоставляют гиперссылки на конкретные примеры на странице, используя 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