Hyperref (+answers) 指向章节而不是页面

Hyperref (+answers) 指向章节而不是页面

我遇到了这个问题,练习环境会自动生成对其解决方案的引用,虽然显示的页面是正确的,但单击它会转到解决方案的章节(如果有),如果没有章节则不执行任何操作。

最小示例:

\documentclass[english,a4paper,12pt]{book}

\usepackage{amsthm}
\usepackage{answers} 
 \Newassociation{sol}{Solution}{ans} 
\usepackage{hyperref}

\newtheorem*{exercise*}{Exercise}
\theoremstyle{plain}
\newenvironment{Exercise*}{\noindent\begin{exercise*}}{\end{exercise*}}
\newtheorem{innerexercise}{Exercise}
\newenvironment{exercise}[1]
  {\begin{innerexercise}\label{#1} (p.~\pageref{sol:#1}) \renewcommand{\Currentlabel}{#1}}
  {\end{innerexercise}}
\newenvironment{Exercise}[1]{\noindent\begin{exercise}{#1}}{\end{exercise}}

\newtheorem*{solution*}{Solution}
\newenvironment{Solution*}{\noindent\begin{solution*}}{\end{solution*}}
\newtheorem*{innersolution}{Solution{} \exerciseref}
\newenvironment{solution}[1]
  {\def\exerciseref{\ref{#1}}%
   \innersolution\label{sol:#1} (p.~\pageref{#1})}
  {\endinnersolution}
\renewenvironment{Solution}[1]{\noindent\begin{solution}{#1}}{\end{solution}}

\begin{document}
\Opensolutionfile{ans}[solutions]

\begin{Exercise}{firstexercise}
 First exercise here.
 \begin{sol} % label is auto generated: sol:firstexercise
 First solution here.

 \newpage % forcing break between one solution and another so to display two solutions in two different pages
 \end{sol}

\end{Exercise}

\begin{Exercise}{secondexercise}
 Second exercise here.
 \begin{sol}
  Second solution here.
 \end{sol}

\end{Exercise}


\Closesolutionfile{ans}
\input{solutions}
\end{document}

该代码创建了两个环境,“练习”和“解决方案”(仅包含执行实际工作的两个环境,“练习”和“解决方案”;如果有人想添加一些图形修饰,这个额外的层是为了代码清晰度)。

“练习”需要一个参数,然后该参数将成为其标签。在练习中,必须定义一个“sol”环境来托管其父练习的解决方案。

此代码自动生成从练习 A 到其解决方案的引用,反之亦然。

解决方案不会显示在练习中:它们是在解决方案文件(此处称为“解决方案”)中生成和分组的。

此代码是在社区帮助下生成的,如我之前的问题所示:交叉引用两个编号环境

所以,这就是问题所在。这个最小的例子产生了两个练习和两个解决方案:

Example

页面引用是正确的,因此人们会认为它们也指向正确的页面。但事实并非如此:它们什么也不做。发生了什么?

答案1

当设置一个时\labelhyperref使用最后一个标记作为超目标。如果您没有以正确的方式指定它,您的链接可能会到达它们不应该去的地方。

\phantomsection您可以在环境中放置一个solution。这将重新建立超目标位置:

\newenvironment{solution}[1]
  {\def\exerciseref{\ref{#1}}%
   \innersolution\phantomsection\label{sol:#1} (p.~\pageref{#1})}
  {\endinnersolution}

相关内容