尝试追溯性地开始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
命令。