用两个并行计数器计算方程

用两个并行计数器计算方程

首先,为了避免XY问题:当我编写测试/考试时,我喜欢将文本和解决方案放在一起。现在,正文和解决方案都可以有方程式;我希望正文的方程式编号可以保持不变,无论是在仅有公式的文档中还是在完整文档(带有解决方案的公式)中。

我可以为图形做到这一点(我用来newfloat定义一个solfigure具有类似标签的环境图 S1等等),但我不明白是否可以通过方程式想到类似的东西。

我准备了这个 MWE:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{xcolor}
\usepackage{environ}
\newif\ifsolution
\solutiontrue
\NewEnviron{solution}{\ifsolution\color{red}\expandafter\BODY\fi}
\begin{document}
\begin{equation}
    2x=4
    \label{eq:one}
\end{equation}

\begin{solution}
    \begin{equation}
        x=2
        \label{eq:solone}
    \end{equation}
\end{solution}

\begin{equation}
    3x=6
    \label{eq:two}
\end{equation}

\end{document}

\solutiontfalse有方程 (1)、(2);\solutiontrue我有 (1)、(2)、(3);我想要 (1)、(S1)、(2)......等等,以便 (2) 的方程在公式和公式+解决方案文件中都是相同的。

标签为红色也是加分项。

\solutionfalse

配方输出

\solutiontrue

配方+解决方案的输出

答案1

只玩计数器怎么样?

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{xcolor}
\usepackage{environ}
\newif\ifsolution
\solutiontrue
\newcounter{fakeequation}
\newcounter{fakeeqtmp}
\NewEnviron{solution}{\setcounter{fakeeqtmp}{\value{equation}}\setcounter{equation}{\value{fakeequation}}%
    \renewcommand\theequation{S\arabic{equation}}\ifsolution\color{red}\expandafter\BODY\fi%
    \setcounter{fakeequation}{\value{equation}}\setcounter{equation}{\value{fakeeqtmp}}\renewcommand\theequation{\arabic{equation}}}
\begin{document}
\begin{equation}
    2x=4
    \label{eq:one}
\end{equation}

\begin{solution}
    \begin{equation}
        x=2
        \label{eq:solone}
    \end{equation}
\end{solution}

\begin{equation}
    3x=6
    \label{eq:two}
\end{equation}

\begin{solution}
    \begin{equation}
        x = 2
        \label{eq:soltwo}
    \end{equation}
\end{solution}

\end{document}

在此处输入图片描述

解释

我定义了两个额外的计数器fakeequationfakeeqtmp

在环境开始时,solution我将 的值存储equation到 中fakeeqtmp,并将 的值加载fakeequation到 中equation。在环境结束时,此操作被反转。因此,在环境内部,solution正在使用的计数器实际上是fakeequation计数器,只是寻址为equation

我还添加了一些格式化代码\theequation,以便方程标签在解决方案环境内部和外部看起来不同,包括您想要的大写字母“S”。

答案2

\tag与 一起使用\ref

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{xcolor}
\usepackage{xparse}
\usepackage{amsmath}

\newif\ifsolution
\solutiontrue
\NewDocumentEnvironment{solution}{+b}{%
  \ifsolution\color{red}#1\fi
}{}

\begin{document}
\begin{equation}
    2x=4
    \label{eq:one}
\end{equation}

\begin{solution}
    \begin{equation}
        x=2
        \tag{S\ref{eq:one}}
    \end{equation}
\end{solution}

\begin{equation}
    3x=6
    \label{eq:two}
\end{equation}

\end{document}

在此处输入图片描述

答案3

假设问题和解决方案有时都会有多个方程式,并且它们在问题和解决方案中出现的顺序不一定相同,因此使用并行计数器并不是理想的解决方案。正如@egreg建议的那样,更好的想法是使用与命令结合的\ref{...}来标记方程式\tag{..}

为了实现自动化,您需要更改equation环境内部环境的行为solution。下面的代码重新定义了equation环境内部的环境solution,使其真正成为一个equation*环境(即它没有方程编号),然后使用命令添加方程编号\tag。此外,还会自动添加对解决方案中方程的引用。为了实现这一点,在solution环境中,equation环境需要一个额外的参数,它是来自问题的方程的标签。

有了这个,代码:

\begin{equation}
    2x=4
    \label{eq:one}
\end{equation}

\begin{solution}
  \begin{equation}{eq:one}% must give the ref to the question eq.
        x=2
    \end{equation}
\end{solution}

\begin{equation}
    3x=6
    \label{eq:two}
\end{equation}

Equations \ref{eq:one}, \ref{eq:onesol} and \ref{eq:two}.

生成:

在此处输入图片描述

请注意,解决方案中方程的标签与附加的问题中对应方程的标签相同sol

完整代码如下:

\documentclass{article}
\usepackage{amsmath}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{xcolor}
\usepackage{xparse}

\newif\ifsolution
\solutiontrue

\NewDocumentEnvironment{solution}{+b}{
  \ifsolution\color{red}
    % redefine the equation* environment
    \RenewDocumentEnvironment{equation}{m +b}{
      \begin{equation*}##2\tag{S\ref{##1}}
      \xdef\@currentlabel{S\noexpand\ref{##1}}% attach an S to the equation label
      \label{##1sol}% add the label
    }{\end{equation*}}
    #1
  \fi
}{}

\begin{document}
\begin{equation}
    2x=4
    \label{eq:one}
\end{equation}

\begin{solution}
  \begin{equation}{eq:one}
        x=2
    \end{equation}
\end{solution}

\begin{equation}
    3x=6
    \label{eq:two}
\end{equation}

Equations \ref{eq:one}, \ref{eq:onesol} and \ref{eq:two}.
\end{document}

\NewDocumentEnvironment请注意,我使用了解析包,连​​同+b选项(这使得环境主体等于#1...并且使用\RenewDocumentEnvironment上面的命令,主体变为#2,因为#1是方程标签),而不是环境包裹。

这样做的一个副作用是,除非标记方程与问题中的方程相对应,否则你不能在解决方案中使用标记方程。再多花点功夫,也可以支持这一点。

答案4

我正在复制我自己使用的内容。它基于这个答案(至少我用它作为起点)。(至少我想光荣地提到这篇文章。;-) 它并没有准确地产生你想要的输出,但有原因。随着时间的推移,我发现我希望这个东西能与和一起工作hyperrefcleveref所以这个答案是相关的),并希望能够将解决方案移动到单独的位置,例如章节末尾。这就是我得到的。

\documentclass[fleqn]{article}
\usepackage{environ}
\usepackage{amsthm}
\usepackage{etoolbox} 
\newtheoremstyle{exercise}% name
  {6pt}%      Space above
  {6pt}%      Space below
  {}%         Body font
  {}%         Indent amount (empty = no indent, \parindent = para indent)
  {\bfseries\boldmath}% Thm head font
  {}%        Punctuation after thm head
  {\newline}%     Space after thm head: " " = qnormal interword space;
        %       \newline = linebreak
  {\bignumber{#2} : #3}%         Thm head spec (can be left empty, meaning `normal')

\theoremstyle{exercise}

\newtheorem{Problem}{Problem}

\newtheoremstyle{solution}% name
  {3pt}%      Space above
  {3pt}%      Space below
  {\small}%         Body font
  {}%         Indent amount (empty = no indent, \parindent = para indent)
  {\bfseries\boldmath}% Thm head font
  {:}%        Punctuation after thm head
  {.3em}%     Space after thm head: " " = qnormal interword space;
        %       \newline = linebreak
  {Solution for exercise #3}%         Thm head spec (can be left empty, meaning `normal')

\theoremstyle{solution}
\newtheorem{solution}{Solution}

\makeatletter
\let\latex@theequation\theequation
\AtBeginEnvironment{Problem}{\setcounter{equationstore}{\value{equation}}%
\setcounter{equation}{\value{solequationstore}}%
\renewcommand{\theequation}{P\latex@theequation}%
\renewcommand{\theHequation}{P\latex@theequation}}
\AtBeginEnvironment{solution}{\setcounter{equationstore}{\value{equation}}%
\setcounter{equation}{\value{solequationstore}}%
\renewcommand{\theequation}{S\latex@theequation}%
\renewcommand{\theHequation}{S\latex@theequation}}
\AtEndEnvironment{Problem}{%
\setcounter{solequationstore}{\value{equation}}%
\setcounter{equation}{\value{equationstore}}%
}
\AtEndEnvironment{solution}{%
\setcounter{solequationstore}{\value{equation}}%
\setcounter{equation}{\value{equationstore}}%
}
\makeatother

\NewEnviron{Solution}[1][]{%
\ifkeepsol
\begin{solution}[#1]~%
\BODY
\end{solution}%
\fi
}

\usepackage{hyperref}
\usepackage{cleveref}
\newif\ifkeepsol
\keepsoltrue

\crefname{Problem}{problem}{problems}
\Crefname{Problem}{Problem}{Problems}
\newcounter{equationstore}
\newcounter{solequationstore}

\crefname{solution}{solution}{solutions}
\Crefname{solution}{Solution}{Solutions}


\begin{document}
\keepsolfalse\keepsoltrue
\begin{equation}
    2x=4
    \label{eq:one}
\end{equation}

\begin{Solution}[\ref{eq:one}]
    \begin{equation}
        x=2
        \label{eq:solone}
    \end{equation}
\end{Solution}

\begin{equation}
    3x=6
    \label{eq:two}
\end{equation}

\begin{Solution}[\ref{eq:two}]
    \begin{equation}
        x=2
        \label{eq:soltwo}
    \end{equation}
\end{Solution}

\begin{equation}
    3x=9
    \label{eq:three}
\end{equation}

\begin{Solution}[\ref{eq:three}]
    \begin{equation}
        x=3
        \label{eq:solthree}
    \end{equation}
\end{Solution}

\end{document}

在此处输入图片描述

相关内容