首先,为了避免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}
解释
我定义了两个额外的计数器fakeequation
和fakeeqtmp
。
在环境开始时,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
我正在复制我自己使用的内容。它基于这个答案(至少我用它作为起点)。(至少我想光荣地提到这篇文章。;-) 它并没有准确地产生你想要的输出,但有原因。随着时间的推移,我发现我希望这个东西能与和一起工作hyperref
(cleveref
所以这个答案是相关的),并希望能够将解决方案移动到单独的位置,例如章节末尾。这就是我得到的。
\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}