我遇到了这个问题,练习环境会自动生成对其解决方案的引用,虽然显示的页面是正确的,但单击它会转到解决方案的章节(如果有),如果没有章节则不执行任何操作。
最小示例:
\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 到其解决方案的引用,反之亦然。
解决方案不会显示在练习中:它们是在解决方案文件(此处称为“解决方案”)中生成和分组的。
此代码是在社区帮助下生成的,如我之前的问题所示:交叉引用两个编号环境
所以,这就是问题所在。这个最小的例子产生了两个练习和两个解决方案:
页面引用是正确的,因此人们会认为它们也指向正确的页面。但事实并非如此:它们什么也不做。发生了什么?
答案1
当设置一个时\label
,hyperref
使用最后一个标记作为超目标。如果您没有以正确的方式指定它,您的链接可能会到达它们不应该去的地方。
\phantomsection
您可以在环境中放置一个solution
。这将重新建立超目标位置:
\newenvironment{solution}[1]
{\def\exerciseref{\ref{#1}}%
\innersolution\phantomsection\label{sol:#1} (p.~\pageref{#1})}
{\endinnersolution}