交叉引用两个编号环境

交叉引用两个编号环境

考虑以下代码:

\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}

我想:

  1. 为每个“练习”和“解决方案”对分配相同的编号(可能通过它们共享的某种唯一ID?);
  2. 自动从“练习”标题生成到其对应“解决方案”的超链接,反之亦然,这样人们可以轻松地从问题导航到其解决方案,反之亦然。

我可能问的是比较难的问题——只要回答第一个问题我就满足了。我不确定它们是否应该是两个独立的问题,但它们似乎与我息息相关。

答案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 ,然后引用refnumberkey 值。顺便说一句,您可以将这些标签用作带有 的普通标签 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

根据集体意见,我提出了几个替代方案:

  1. 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}
  1. 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 上浏览此内容的人的超链接,也可以作为在纸上阅读的人的页面标记。

第二种解决方案更易于管理,因为我不必保持解决方案的有序性。这也是一种更好的风格,因为解决方案保存在各自的“父级”中,您只需为每对定义一个标签即可。

相关内容