\label 后枚举

\label 后枚举

我有以下代码:

\usepackage{hyperref}
\newtheorem{thm}{Theorem}

\begin{thm} \label{mythm}
   \begin{enumerate}
      \item 
   \end{enumerate}
\end{thm}

\ref{mythm}

ref 打印了正确的数字。但是,当我单击它时,它会将我带到错误的页面(基本上是文档的开头)。pdflatex 也有一些警告。如果我在\begin{thm}和之间添加 $ $ \begin{enumerate},问题就会消失,但现在,枚举会开始一个新行。有什么办法可以解决这个问题吗?

答案1

您可以使用以下\phantomsection命令hyperref

\documentclass{book}
\usepackage{amsthm}
\usepackage{hyperref}

\newtheorem{thm}{Theorem}

\begin{document}

\begin{thm}\phantomsection \label{mythm}
   \begin{enumerate}
      \item 
   \end{enumerate}
\end{thm}

\ref{mythm}

\end{document}

另一个选择是使用定理包而不是amsthm

\documentclass{book}
\usepackage{ntheorem}
\usepackage{hyperref}

\newtheorem{thm}{Theorem}

\begin{document}
\mbox{}\newpage
\begin{thm}
\label{mythm}
   \begin{enumerate}
      \item
   \end{enumerate}
\end{thm}

\newpage
\ref{mythm}

\end{document}

答案2

梅威瑟:

\documentclass[12pt]{article}

\usepackage{amsthm}    
\usepackage[colorlinks]{hyperref}

\newtheorem{thm}{Theorem}

\begin{document}

\begin{thm} \label{thm:test}
\begin{enumerate}
\item First thing.
\item Second thing.
\item Third thing.
\end{enumerate}
\end{thm}

Reference to Theorem~\ref{thm:test}.

\end{document}

定理环境通过amsthm延迟将锚点设置到下一个段落的开始。但是,环境的\everypar第一个通过 清除它。因此, 的锚点丢失了。\itemenumerate\everypar{}\label{thm:test}

正常的段落开头会设置锚点。回答John Kormylo 的段落开头使用了\strut,这是一条具有高度和深度的隐形线。以下示例使用了\noindent

\documentclass[12pt]{article}

\usepackage{amsthm}
\usepackage[colorlinks]{hyperref}

\newtheorem{thm}{Theorem}

\begin{document}

\begin{thm}
\noindent\label{thm:test}
\begin{enumerate}
\item First thing.
\item Second thing.
\item Third thing.
\end{enumerate}
\end{thm}

Reference to Theorem~\ref{thm:test}.

\end{document}

结果 \noindent

然后第一项从定理标题行移到下一行,数字与枚举的其他数字对齐。因此我称之为特征。

否则\phantomsection\noindent可以使用,如下所示回答贡萨洛·梅迪纳:

\documentclass[12pt]{article}

\usepackage{amsthm}
\usepackage[colorlinks]{hyperref}

\newtheorem{thm}{Theorem}
\def\thmautorefname{Theorem}

\begin{document}

\begin{thm}
\phantomsection\label{thm:test}
\begin{enumerate}
\item First thing.
\item Second thing.
\item Third thing.
\end{enumerate}
\end{thm}

Theorem~\ref{thm:test} and \autoref{thm:test}.

\end{document}

结果 \phantomsection

\phantomsection不会开始新的段落,因此定理标签的原始锚点仍然丢失。但它会创建一个新的锚点,然后由以下内容使用\label

但是,\phantomsection不会创建定理锚点,而是创建具有部分内部名称的锚点。因此\autoref将把定理称为“部分”。

作为解决方法,可以通过以下方式设置正确的锚点\hyper@anchor

\documentclass[12pt]{article}

\usepackage{amsthm}
\usepackage[colorlinks]{hyperref}

\newtheorem{thm}{Theorem}
\def\thmautorefname{Theorem}

\begin{document}

\begin{thm}
\makeatletter
\hyper@anchor{\@currentHref}%
\makeatother
\label{thm:test}
\begin{enumerate}
\item First thing.
\item Second thing.
\item Third thing.
\end{enumerate}
\end{thm}

Theorem~\ref{thm:test} and \autoref{thm:test}.

\end{document}

结果 \hyper@anchor

答案3

甚至更简单...

\documentclass{book}
\usepackage{amsthm}
\usepackage{hyperref}

\newtheorem{thm}{Theorem}

\begin{document}

\begin{thm}\label{mythm}\strut% ******************
   \begin{enumerate}
      \item 
\end{enumerate}
\end{thm}

\ref{mythm}

\end{document}

相关内容