为什么使用输入或 usepackage 方法的超级设置会失败?

为什么使用输入或 usepackage 方法的超级设置会失败?

我正在努力开发一个模板作为类文件(从回忆录类扩展)。开发包括一组空调\newcommand用,这些调用将根据模板的使用位置进行更改。我还想将某些设置适当地带入 PDF 文档,例如作者、标题和关键字。我正在使用\hyperxmp\hyperref。最后,为了减少主模板类文件中的混乱,我将命令放入\hypersetup单独的样式文件中,使用调用该样式文件\usepackage,并使用\AtBeginDocument指令调用\hypersetup{...}

因此,总体格式如下。

\documentclass{mytemplate}
\renewcommand*{\theCourse}{My Course}
\begin{document}
...
\end{document}

mytemplate.cls如下所示

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mytemplate}[...]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{memoir}}
\ProcessOptions\relax
\LoadClass{memoir}
%% ... other packages
\RequirePackage{hyperxmp}
\RequirePackage{hyperref}
%% ... load settings
\newcommand*{\theCourse}{}
\RequirePackage{mytemplatesettings}

并且mytemplatesettings.sty有一部分如下所示

\AtBeginDocument{%
    \hypersetup{%
        pdftitle=\theCourse{},
        colorlinks=true,
        linkcolor=blue
        }
    }

--> 问题

上述方法的问题是colorlinkslinkcolor指令被忽略。为了解决这个问题,我必须在类中使用以下行

\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}

并删除中的相应设置mytemplatesettings.sty

我可以使用下面的 MWE 重现该行为。

\documentclass{article}
\usepackage{lipsum}
\usepackage{hyperxmp}
\usepackage{hyperref}
\newcommand*{\theCourse}{The Course}

%% FAILURE
%% compile once then uncomment next line
%% and comment out the \hypersetup section
%\input{hypersets}
\hypersetup{
    colorlinks=true,
    linkcolor=blue,
    pdftitle=\theCourse{}
    }

\begin{filecontents}{hypersets.tex}
\AtBeginDocument{%
    \hypersetup{
        colorlinks=true,
        linkcolor=blue,
        pdftitle=\theCourse{}
        }
    }
\end{filecontents}

\begin{document}

\tableofcontents{}

\vfill

This is for \theCourse{}.

\section{The First}

\lipsum[1]

\section{The Second}

\lipsum[2]

\end{document}

我认为我应该能够将colorlinks指令放入外部包(或输入)文件中,这个错误在哪里?

答案1

当前 hyperref 版本colorlinks在开始文档时禁用,因此您的设置太晚了。

使用当前的乳胶,您可以设置规则以确保您的设置位于超参考代码之前:

\documentclass{article}
\usepackage{lipsum}
\usepackage{hyperxmp}
\usepackage{hyperref}
\newcommand*{\theCourse}{The Course}


\begin{filecontents}{hypersets.tex}
\AtBeginDocument[hypersets]{%
    \hypersetup{
        colorlinks=true,
        linkcolor=blue,
        pdftitle=\theCourse{}
        }
    }
\DeclareHookRule{begindocument}{hypersets}{before}{hyperref}
    
\end{filecontents}

\input{hypersets}

\begin{document}

\tableofcontents{}

\vfill

This is for \theCourse{}.

\section{The First}

\lipsum[1]

\section{The Second}

\lipsum[2]

\end{document}

在将来的 hyperref 中,将不再需要此操作,因为也可以在文档中设置颜色链接。您可以通过以下方式启动文档来测试此未来版本

\RequirePackage{pdfmanagement-testphase}
\DeclareDocumentMetadata{}
\documentclass{article}

相关内容