简单自定义包中的“hyperref”怪异之处

简单自定义包中的“hyperref”怪异之处

尝试追溯性地开始hyperref完成我的论文。

乐趣。

遇到了以下奇怪的事情...我有以下(来之不易的)最小工作示例:

\documentclass{article}

\usepackage{blindtext}
% LINE 0 BELOW
% \usepackage{mypackage}
\usepackage{hyperref}

% LINE 1 BELOW
\newtheorem{definition}{Definition}[section] 

\begin{document}

\section{Section One}
See Definition~\ref{def:one}.

\begin{definition}\label{def:one}
\blindtext
\end{definition}

\Blindtext

\section{Section Two}
When using external \texttt{mypackage}, Definition~\ref{def:two} \texttt{hyperref}'s to Definition~\ref{def:one}---otherwise it's fine.

\begin{definition}\label{def:two}
\blindtext
\end{definition}

\end{document}

经过几次构建后,它运行良好。但是,如果我将newtheorem命令 ( LINE 1) 放入新的自定义中,mypackage.sty如下所示:

\ProvidesPackage{mypackage}

\newtheorem{definition}{Definition}[section]

...将其粘贴在与主文件相同的目录中,并在主文件中切换注释LINE 0 & 1,经过几次构建后我收到一条警告:

pdfTex 警告(ext4):具有相同标识符(name{definition.1})的目标已被使用,重复项被忽略

此外,在生成的 PDF 中,第二个标签Definition链接到第一个标签。

现在,我已经解决了问题(将newtheorem声明移到我的主 .tex 文件中)...

...但这次我被困了hyperref太久,我患上了斯德哥尔摩综合症。(回顾我与这个包裹的历史,这只是时间问题。)

有人能给我一些解释吗为什么 hyperref关心我把我的newthereom声明放在哪里吗?

hyperref否则,有人可以告诉我受害者支持小组的地址吗?

答案1

hyperref 需要修补许多 LaTeX 命令(以及其他软件包提供的命令)才能实现正确的超链接,其中之一就是\newtheorem。因此,如果您在 hyperref 包之前包含您的软件包,则\newtheorem您的软件包内部将使用 LaTeX 的原始定义,而不是 hyperref 修补的定义。

因此,解决您的问题的方法是包含您的包hyperref 包。

作为一般规则,可以说提供命令的软件包(将由 hyperref 修补,或使用自身将由 hyperref 修补的命令)必须在 hyperref 之前包含。仅使用这些命令的软件包必须在 hyperref 之后包含。(并且在文档中使用这些命令必须在包含 hyperref 之后进行。)

另一个例子:float 包提供\newfloat,而这个包需要通过 hyperref 进行修补。因此,在使用 时\newfloat,必须先包含 float 包(这样\newfloat才能定义),然后再包含 hyperref 包(这样\newfloat才能进行修补),最后才能使用 (patched)\newfloat命令。

也可以看看:https://texfaq.org/FAQ-hyperdupdest

相关内容