我正在尝试创建两个新环境,一个用于编写练习,另一个用于解决方案,具有以下特点:
- 环境
Exercise
应该具有:- 默认情况下,没有号码。
- 一个可选参数,其中我可以将练习编号自定义为任何感兴趣的数字。
- 此环境中列出的所有方程式都应按以下格式编号:
([exercise number].[equation number])
。如果练习没有编号,则格式应为通常:([equation number])
。 - 在每个新环境中,方程编号应重置。
- 环境
Solution
应该具有:- 默认情况下,没有号码。
- 一个可选参数,其中我可以将解决方案编号自定义为任何感兴趣的数字。
- 此环境中列出的所有方程式都应按以下格式编号:
([exercise number].[equation number])
。编号还应遵循Exercise
环境中列出的方程式的编号。 - 在每个新环境中,方程编号应重置。
目前,我面临两个问题:
- 如果我没有对两个环境进行编号,那么我会出现以下错误:
缺失数字,视为零。\begin{exercise}{}
缺失数字,视为零。\begin{solution}{}
- 如果我没有对练习环境进行编号,则方程式的编号为:
(0.[equation number])
。
以下是 MWE:
\documentclass[12pt]{article}
\usepackage{amsmath}
\setlength{\labelsep}{0.3em}
\newenvironment{exercise}[2][Exercise]
{\stepcounter{myproblemcnt}\setcounter{myproblemcnt}
{#2}\noindent\hskip\labelsep{\large\bfseries
#1}\hspace\labelsep{\large\bfseries#2}\par\noindent}
\makeatletter
\renewcommand{\theequation}{\arabic{myproblemcnt}.\arabic{equation}}
\newcounter{myproblemcnt}
\@addtoreset{equation}{myproblemcnt}
\makeatother
\newcounter{myanswercnt}
\newenvironment{solution}[2][Solution]
{\stepcounter{myanswercnt}\setcounter{myanswercnt}
{#2}\noindent\hskip\labelsep{\bfseries
#1}\hskip\labelsep{\bfseries#2}\par\noindent}
\begin{document}
\begin{exercise}{1}{}
\textit{This is an exercise.}
\begin{align}
i = 2
\end{align}
\end{exercise}
\begin{exercise}{}{}
\textit{This is an exercise.}
\begin{align}
i = 2
\end{align}
\end{exercise}
\begin{solution}{1}{}
This is a first solution.
\begin{align}
i = 2 \\
t = 3
\end{align}
\end{solution}
\begin{exercise}{7}{}
\textit{This is an exercise.}
\end{exercise}
\begin{solution}{1}{}
This is a first solution.
\begin{align}
i = 2 \\
t = 3
\end{align}
\end{solution}
\begin{solution}{2}{}
This is a second solution.
\begin{align}
i = 2 \\
t = 3
\end{align}
\end{solution}
\end{document}
答案1
@JohnKormylo 的评论指出了你遇到的主要问题:你似乎对 LaTeX 的可选参数语法感到困惑。根据你的要求,当你想要一个未编号练习,你输入类似
\begin{exercise} ... \end{exercise}
当你想要一个编号练习,你输入类似
\begin{exercise}[number] ... \end{exercise}
还有其他问题。例如,1.\labelsep
仅为了您在练习/解决方案标题中的用途而进行更改不是一个好主意;2.<end environment stuff>
命令的\newenvironment
丢失;3. 计数器myanswercnt
从未真正使用过;等等。
我对你的要求 3 和 4 的解释不太确定solution
。一方面,你希望 中的方程编号solution
遵循 中的exercise
。另一方面,你希望重置编号。我从你的要求 3 推断solution
应该里面每个exercise
。因此,这是我的尝试:
\documentclass[12pt]{article}
\usepackage{amsmath}
\newcounter{myproblemcnt}
\makeatletter
\@addtoreset{equation}{myproblemcnt}
\makeatother
\newenvironment{exercise}[1][]{%
\setlength\parindent{0pt}%
\stepcounter{myproblemcnt}%
\if\relax\detokenize{#1}\relax
{\large\textbf{Exercise}\par}%
\else
\setcounter{myproblemcnt}{#1}%
\renewcommand{\theequation}{\arabic{myproblemcnt}.\arabic{equation}}%
{\large\textbf{Exercise~#1}\par}%
\fi
}{}
\newenvironment{solution}[1][]{%
\setlength\parindent{0pt}%
\if\relax\detokenize{#1}\relax
\textbf{Solution}\par
\else
\textbf{Solution~#1}\par
\fi
}{}
\begin{document}
\begin{exercise}[1]
\textit{This is an exercise.}
\begin{align}
i = 2
\end{align}
\end{exercise}
\begin{exercise}
\textit{This is an exercise.}
\begin{align}
i = 2
\end{align}
\begin{solution}[1]
This is a first solution.
\begin{align}
i = 2 \\
t = 3
\end{align}
\end{solution}
\end{exercise}
\begin{exercise}[7]
\textit{This is an exercise.}
\begin{solution}
This is a first solution, but not numbered.
\begin{align}
i = 2 \\
t = 3
\end{align}
\end{solution}
\begin{solution}[2]
This is a second solution.
\begin{align}
i = 2 \\
t = 3
\end{align}
\end{solution}
\end{exercise}
\end{document}