我是 LaTeX 新手,正在完成别人的工作。我在 Windows 10 上使用 MiKTeX 2.9。
我正在尝试创建可点击的超链接,从文内练习到附录中的解决方案。我希望不必定义解决方案环境或使用包answers
,因为只有随机选择的练习有解决方案,并且我希望练习和解决方案编号匹配。目前我用它hyperref
来引用他们的解决方案中的练习,但我不知道如何标记解决方案并在练习中引用它们,而不会弄乱编号。
以下是我正在处理的内容:
\documentclass{article}
\usepackage[colorlinks, backref]{hyperref}
\newtheorem{exercise}{Exercise}
\begin{document}
\begin{exercise}\label{ex:one}
exercise text
\end{exercise}
\begin{exercise}
exercise without solution
\end{exercise}
\begin{exercise}\label{ex:three}
exercise text
\end{exercise}
{Exercise}~\ref{ex:one}
solution text
{Exercise}~\ref{ex:three}
solution text
\end{document}
如有任何建议我将非常感激。
答案1
有\hyperlink
和\hypertaget
。在很多方面,它们都优于\label
和\ref
。此外,使用包含计数器值的标签会让计数器的整体使用变得毫无意义。
我深入研究了source2e
(可从 ctan 获得)以使用与 相同的格式\newtheorem
。
\documentclass{article}
\usepackage[colorlinks, backref]{hyperref}
\newcounter{exercise}
\newenvironment{exercise}[1][\empty]{% #1 = answer target (optional)
\refstepcounter{exercise}%
\trivlist
\ifx\empty#1\relax
\item[\hskip \labelsep{\bfseries Exercise \theexercise}]\itshape
\else
\item[\hskip \labelsep{\bfseries Exercise \hyperlink{#1}{\theexercise}}]\itshape
\fi}{\endtrivlist}
\begin{document}
\begin{exercise}[ans:one]\label{ex:one}
exercise text
\end{exercise}
\begin{exercise}
exercise without solution
\end{exercise}
\begin{exercise}[ans:three]\label{ex:three}
exercise text
\end{exercise}
\hypertarget{ans:one}{Exercise}~\ref{ex:one}
solution text
\hypertarget{ans:three}{Exercise}~\ref{ex:three}
solution text
\end{document}
答案2
我认为你的前提是错误的:
我不想定义解决方案环境或使用
answers
包,因为只有随机选择的练习才有解决方案,并且我希望练习和解决方案编号能够匹配。
他们做使用以下包自动进行数学运算answers
:
\documentclass{article}
\usepackage{answers}
\Newassociation{solution}{Solution}{answers}
\newtheorem{exercise}{Exercise}
\begin{document}
\Opensolutionfile{answers}
\section{Problems}
\begin{exercise}
First exercise
\begin{solution}
First solution.
\end{solution}
\end{exercise}
\begin{exercise}
Second exercise
\end{exercise}
\begin{exercise}
Third exercise
\begin{solution}
Third solution.
\end{solution}
\end{exercise}
\Closesolutionfile{answers}
\section{Solutions}
\input{answers}
\end{document}
添加超链接也不是那么难。为了避免出现有关不存在超目标的警告,我们可以使用@Werner 的解决方案
\documentclass{article}
\usepackage{answers}
\usepackage{hyperref}
\Newassociation{solution}{Solution}{answers}
\newtheorem{exercise}{\hyperlink{ex:\theexercise}{Exercise}\hypertarget{sol:\theexercise}{}}
\renewcommand{\solutionstyle}[1]{\textbf{\hyperlink{sol:#1}{Exercise} \hypertarget{ex:#1}{#1}}}
\let\oldhypertarget\hypertarget
\let\oldhyperlink\hyperlink
\renewcommand{\hypertarget}[2]{%
\label{ht@#1}\oldhypertarget{#1}{#2}%
}
\renewcommand{\hyperlink}[2]{%
\ifcsname r@ht@#1\endcsname\oldhyperlink{#1}{#2}\else#2\fi
}
\begin{document}
\Opensolutionfile{answers}
\section{Problems}
\begin{exercise}
First exercise
\begin{solution}
First solution.
\end{solution}
\end{exercise}
\begin{exercise}
Second exercise
\end{exercise}
\begin{exercise}
Third exercise
\begin{solution}
Third solution.
\end{solution}
\end{exercise}
\Closesolutionfile{answers}
\section{Solutions}
\input{answers}
\end{document}