我正在努力开发一个模板作为类文件(从回忆录类扩展)。开发包括一组空调\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
}
}
--> 问题
上述方法的问题是colorlinks
和linkcolor
指令被忽略。为了解决这个问题,我必须在类中使用以下行
\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}