共享计数器、cleveref 和 amsart 的“具有相同标识符的目的地”警告

共享计数器、cleveref 和 amsart 的“具有相同标识符的目的地”警告

以下 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\declaretheoremfrom替换时也存在类似的问题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}

相关内容