以下 mwe
\documentclass{amsart}
\usepackage{hyperref}
\usepackage{cleveref}
\newtheorem{theorem}{Theorem}
\newtheorem{proposition}[theorem]{Proposition}
\begin{document}
\begin{proposition}
\end{proposition}
\end{document}
产生警告
pdfTeX warning (ext4): destination with the same identifier (name{theorem.1}) has been already used, duplicate ignored
\newtheorem
用\declaretheorem
from替换时也存在类似的问题thmtools
。这三个包的顺序是根据以下问题的答案来选择的:使用包静默禁用“具有相同标识符的目的地”以及cleveref
手册
是什么导致了警告?我该如何修复它?这是否有可能导致更复杂的文档中出现错误链接?如果没有,那么我很乐意忽略警告。
由于 Sigur 的评论,我正在添加相关软件包的版本。我正在使用更新的 MikTeX 安装。
Document Class: amsart 2015/03/04 v2.20.2
Package: hyperref 2012/11/06 v6.83m Hypertext links for LaTeX
Package: cleveref 2013/12/28 v0.19 Intelligent cross-referencing
答案1
我给出的答案使用包静默禁用“具有相同标识符的目的地”这里不适用,因为该类amsart
禁用了加载amsthm
并提供了等效代码,因此无法amsthm
在之后应用加载的方法hyperref
。
这里有一个允许amsthm
在正确位置加载的黑客技术,但它违反了对标准定理样式所做的更改amsart
,因此如果您想将文档提交给 AMS,这可能会被拒绝。
\documentclass{amsart}
% make amsthm.sty loadable
\expandafter\let\csname [email protected]\endcsname\relax
% remove the definitions that will be redone by amsthm
\let\theoremstyle\relax
\let\newtheoremstyle\relax
\let\pushQED\relax
\let\popQED\relax
\let\qedhere\relax
\let\mathqed\relax
\let\openbox\relax
\let\proof\relax\let\endproof\relax
\usepackage{hyperref}
\usepackage{amsthm}
\usepackage{cleveref}
\newtheorem{theorem}{Theorem}
\newtheorem{proposition}[theorem]{Proposition}
\begin{document}
\begin{proposition}
\end{proposition}
\end{document}
为了至少恢复正确的间距,还需要采取其他措施。
\documentclass{amsart}
% make amsthm.sty loadable
\expandafter\let\csname [email protected]\endcsname\relax
% remove the definitions that will be redone by amsthm
\let\theoremstyle\relax
\let\newtheoremstyle\relax
\let\pushQED\relax
\let\popQED\relax
\let\qedhere\relax
\let\mathqed\relax
\let\openbox\relax
\let\proof\relax\let\endproof\relax
\usepackage{hyperref}
\usepackage{amsthm}
\usepackage{cleveref}
\makeatletter
\newtheoremstyle{standard}% name
{6\p@\@plus6\p@\relax}% Space above
{6\p@\@plus6\p@\relax}% Space below
{\itshape}% Body font
{}% Indent amount (empty = no indent, \parindent = para indent)
{\bfseries}% Thm head font
{.}% Punctuation after thm head
{ }% Space after thm head: " " = normal interword space;
% \newline = linebreak
{}% Thm head spec (can be left empty, meaning `normal')
\makeatother
\theoremstyle{standard}
\newtheorem{theorem}{Theorem}
\newtheorem{proposition}[theorem]{Proposition}
\newcommand{\testA}{words words and other words }
\newcommand{\testB}{\testA\testA\testA\testA\testA}
\begin{document}
\testB
\begin{proposition}\label{test}
\testA
\end{proposition}
\begin{proof}
\testB
\end{proof}
\testB
\begin{proof}
\testB
\end{proof}
\testB
\cref{test}
\end{document}