Хорошо, этот вопрос старый, но я столкнулся с той же проблемой и должен был найти решение. Решение включает в себя небольшую хакерскую переписку и не является универсальным, но вы должны иметь возможность адаптировать его к вашему конкретному случаю.
Проблема
Пакет индекса генерирует ссылки, используя макрос \hyperpage
, который принимает только один аргумент: он напечатает это число и ссылку на страницу, которая имеет это абсолютное число.
Специальное решение
Сохранение количества страниц в начале в макросе, а затем смещение всех якорей страниц на это же число.
На практике
Это решение хрупкое, поскольку, если код стиля вашей книги или пакетов hyperref
изменится, он больше не будет работать. Тем не менее это рабочее решение для меня.
Я изменил макрос \frontmatter
в своем стиле книги:
(добавлены новые строки: строки 2 и 3, обратите внимание, что нам нужно уменьшить на 1, так как вычисление происходит на новой странице с номером «1»)
\newcommand\mainmatter{\clearemptydoublepage
\count0=\value{page}\advance\count0 by -1
\xdef\pagesfrontmatter{\the\count0}
\@mainmattertrue\pagenumbering{arabic}}
Затем наступает более сложная часть. \hyperpage
содержит много кода и может обрабатывать, например, аргументы типа '2,4' или '3-5', поэтому нам нужно изменить макрос конца, который фактически выводит текст и гиперссылку. Если вы посмотрите на hyperref.sty
, вы найдете его с именем \HyInd@removespaces
. Нам нужно переопределить его только для индекса , чтобы каждая ссылка имела один и тот же текст, но якорь был смещен на нужную величину (измененные строки, включая ссылки на \count0
):
{ % open local group
% locally change how hyperpage creates hyperlinks to take
% frontmatter pages into account
\makeatletter
\def\HyInd@removespaces#1 #2\@nil{%
\toks@=\expandafter{\the\toks@#1}%
\ifx\\#2\\%
\edef\x{\the\toks@}%
\ifx\x\@empty
\else
\count0=\the\toks@\advance\count0 by \pagesfrontmatter%
\hyperlink{page.\the\count0}{\the\toks@}%
\fi
\else
\ltx@ReturnAfterFi{%
\HyInd@removespaces#2\@nil
}%
\fi
}
\makeatother
\printindex
} % close local group