![交叉引用两个编号环境](https://linux22.com/image/300935/%E4%BA%A4%E5%8F%89%E5%BC%95%E7%94%A8%E4%B8%A4%E4%B8%AA%E7%BC%96%E5%8F%B7%E7%8E%AF%E5%A2%83.png)
考虑以下代码:
\documentclass[a4paper,12pt]{book}
\usepackage{amsthm}
\usepackage{hyperref}
\theoremstyle{plain}
\newtheorem{exercise}{Exercise}
\newtheorem{solution}{Solution}
\begin{document}
\begin{exercise}
This is an exercise.
\end{exercise}
\begin{solution}
This is a solution.
\end{solution}
\end{document}
我想:
- 为每个“练习”和“解决方案”对分配相同的编号(可能通过它们共享的某种唯一ID?);
- 自动从“练习”标题生成到其对应“解决方案”的超链接,反之亦然,这样人们可以轻松地从问题导航到其解决方案,反之亦然。
我可能问的是比较难的问题——只要回答第一个问题我就满足了。我不确定它们是否应该是两个独立的问题,但它们似乎与我息息相关。
答案1
\documentclass[a4paper,12pt]{book}
\usepackage{amsthm}
\usepackage{hyperref}
\theoremstyle{plain}
\newcounter{exercise}[chapter]
\renewcommand\theexercise{\thechapter.\arabic{exercise}}
\newtheorem{xexercise}[exercise]{Exercise}
\newtheorem*{xsolution}{Solution}
\newenvironment{exercise}[1]
{\begin{xexercise}\label{#1}\def\thissoln{\hyperref[sol-#1]{Solution}}}
{\par\thissoln\end{xexercise}}
\newenvironment{solution}[1]
{\begin{xsolution}[Solution \ref{#1}]\label{sol-#1}}
{\end{xsolution}}
\begin{document}
\chapter{aaa}
\begin{exercise}{z}
This is an exercise.
\end{exercise}
\chapter{bbb}
\begin{exercise}{a1}
This is an exercise.
\end{exercise}
\begin{exercise}{thing}
This is an exercise.
\end{exercise}
\chapter{solutions}
\begin{solution}{z}
This is a solution.
\end{solution}
\begin{solution}{a1}
This is a solution.
\end{solution}
\begin{solution}{thing}
This is a solution.
\end{solution}
\end{document}
答案2
您可以将solution
环境定义为具有与上一个练习相同的编号,但有可能通过\label
-\ref
机制抓取不同的编号。
解决方案编号将是练习的链接。如果解决方案没有紧跟在相应的练习之后,因为您想并列陈述两个练习,请指定练习的标签并将其用作 的可选参数\begin{solution}
。
\documentclass[a4paper,12pt]{book}
\usepackage{amsthm}
\usepackage{hyperref}
\theoremstyle{definition} % body text is upright
\newtheorem{innerexercise}{Exercise}
\newtheorem*{innersolution}{Solution of \exerciseref}
\newenvironment{exercise}
{\innerexercise\label{exercise@@\theinnerexercise}}
{\endinnerexercise}
\newenvironment{solution}[1][]
{\if!#1!%
\def\exerciseref{\ref{exercise@@\theinnerexercise}}%
\else
\def\exerciseref{\ref{#1}}%
\fi
\innersolution}
{\endinnersolution}
\begin{document}
\begin{exercise}
This is an exercise.
\end{exercise}
\begin{solution}
This is a solution.
\end{solution}
\begin{exercise}\label{another}
This is another exercise.
\end{exercise}
\begin{exercise}\label{ohwell}
This is yet another exercise.
\end{exercise}
\begin{solution}[another]
A solution.
\end{solution}
\begin{solution}[ohwell]
Too much.
\end{solution}
\end{document}
答案3
我找到了这个包裹exercise.sty
并且它满足所有要求。
你定义这样的练习:
\begin{Exercise} [⟨key val list⟩] ... \end{Exercise}
\begin{Exercise*} [⟨key val list⟩] ... \end{Exercise*}
答案:
\begin{答案} [⟨键值列表⟩] ... \end{答案}
以上所有内容均具有以下可能的关键值:
label={⟨string ⟩}
title={⟨string ⟩}
difficulty={⟨number ⟩}
origin={⟨string ⟩}
name={⟨string ⟩}
counter={⟨counter ⟩}
number={⟨string ⟩}
您可以label
在答案中使用 key ,然后引用ref
和number
key 值。顺便说一句,您可以将这些标签用作带有 的普通标签 latex \ref{label}
。
举例来说:
\documentclass[12pt]{article}
\usepackage{hyperref}
\usepackage{exercise}
\begin{document}
\begin{Exercise}[label=ex1]
This is an exercise.
\end{Exercise}
\begin{Answer}
This is an answer.
\end{Answer}
\end{document}
因此,结果如下所示:
此包exercise
确实还有其他选择,比如练习环境和其他东西。
答案4
根据集体意见,我提出了几个替代方案:
- 无
answers
包装
\documentclass[a4paper,12pt]{book}
\usepackage{amsthm}
\usepackage{hyperref}
\theoremstyle{definition}
\newtheorem{innerexercise}{Exercise}
\newtheorem*{innersolution}{Solution \exerciseref}
\newenvironment{exercise}[1]
{\innerexercise\label{#1} (p\pageref{sol:#1})}
{\endinnerexercise}
\newenvironment{solution}[1]
{\def\exerciseref{\ref{#1}}%
\innersolution\label{sol:#1} (p\pageref{#1})}
{\endinnersolution}
\begin{document}
\chapter{Exercise One}
\begin{exercise}{labelone}
Exercise one.
\end{exercise}
\chapter{Exercise Two}
\begin{exercise}{labeltwo}
Exercise two.
\end{exercise}
\chapter{Solutions}
\begin{solution}{labeltwo}
Solution two.
\end{solution}
\begin{solution}{labelone}
Solution one.
\end{solution}
- 带
answers
包装
\documentclass[a4paper,12pt]{book}
\usepackage{amsthm}
\usepackage{answers}
\Newassociation{sol}{solution}{ans}
\usepackage{hyperref}
\newtheorem{innerexercise}{Exercise}
\newenvironment{exercise}[1]
{\begin{innerexercise}\label{#1} (p.~\pageref{sol:#1})\renewcommand{\Currentlabel}{#1}}
{\end{innerexercise}}
\newtheorem*{innersolution}{Solution \exerciseref}
\renewenvironment{solution}[1]
{\def\exerciseref{\ref{#1}}%
\innersolution\label{sol:#1} (p.~\pageref{#1})}
{\endinnersolution}
\begin{document}
\Opensolutionfile{ans}[solutionsfile]
\chapter{Problems}
\begin{exercise}{First}
First exercise
\begin{sol}
First solution.
\end{sol}
\end{exercise}
\begin{exercise}{Second}
Second exercise
\begin{sol}
Second solution.
\end{sol}
\end{exercise}
\Closesolutionfile{ans}
\chapter{Solutions}
\input{solutionsfile}
\end{document}
无论如何,我都可以管理编号的练习 - 解决方案对,并利用 \pageref 的额外好处,它既可以作为在 PDF 上浏览此内容的人的超链接,也可以作为在纸上阅读的人的页面标记。
第二种解决方案更易于管理,因为我不必保持解决方案的有序性。这也是一种更好的风格,因为解决方案保存在各自的“父级”中,您只需为每对定义一个标签即可。