Использование hyperref с базовыми классами

Использование hyperref с базовыми классами

Я использую пакет 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}

Связанный контент