我有以下代码:
\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
第一个通过 清除它。因此, 的锚点丢失了。\item
enumerate
\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}
然后第一项从定理标题行移到下一行,数字与枚举的其他数字对齐。因此我称之为特征。
否则\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
不会开始新的段落,因此定理标签的原始锚点仍然丢失。但它会创建一个新的锚点,然后由以下内容使用\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}
答案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}