
Я использую пакет hyperref
в сочетании с пользовательскими базовыми классами и у меня возникли проблемы с пониманием сообщений об ошибках:
Undefined control sequence. <recently read> \Hy@colorlink
и Undefined control sequence. \close@pdflink ->\Hy@endcolorlink
. Они появляются только тогда, когда пакет объявлен в документе. Он работает так, как и ожидалось, когда объявлен в базовом классе.
Рассмотрим следующую минимальную настройку:
\ProvidesClass{base}
\LoadClass{report}
% declare option 1: works
% \RequirePackage{hyperref}
\AtBeginDocument{
\tableofcontents
}
\documentclass{base}
% declare option 2: does not work
% \usepackage{hyperref}
\begin{document}
\section{One}
hello
\section{Two}
goodbye
\end{document}
Фон
Мне нужно написать серию отчетов для университета с одинаковой структурой, и я хотел бы передать все несодержательные страницы на аутсорсинг в documentclass.
\AtBeginDocument
Он обрабатывает такие вещи, как титульный лист, аннотация, оглавление и т. д.
решение1
Для вашей проблемы не нужен специальный класс, просто hyperref загружается после вашего \AtBeginDocument
вызова:
\documentclass{report}
\AtBeginDocument{\tableofcontents}
\usepackage{hyperref}
\begin{document}
\section{One}
hello
\section{Two}
goodbye
\end{document}
\AtBeginDocument
не следует использовать для начала набора текста. Многие пакеты добавляют туда свой код инициализации.
С новым latex 2020/10/01, который в настоящее время можно протестировать с помощью версии -dev (например, pdflatex-dev), вы можете сделать это следующим образом:
\documentclass{report}
\AddToHook{begindocument/end}{\tableofcontents}
\usepackage{hyperref}
\begin{document}
\section{One}
hello
\section{Two}
goodbye
\end{document}
Со старым латексом можно использовать etoolbox:
\documentclass{report}
\usepackage{etoolbox}
\AfterEndPreamble{\tableofcontents}
\usepackage{hyperref}
\begin{document}
\section{One}
hello
\section{Two}
goodbye
\end{document}