向新环境模板添加可选参数

向新环境模板添加可选参数

我正在尝试创建两个新环境,一个用于编写练习,另一个用于解决方案,具有以下特点:

  • 环境Exercise应该具有:
    1. 默认情况下,没有号码。
    2. 一个可选参数,其中我可以将练习编号自定义为任何感兴趣的数字。
    3. 此环境中列出的所有方程式都应按以下格式编号:([exercise number].[equation number])。如果练习没有编号,则格式应为通常:([equation number])
    4. 在每个新环境中,方程编号应重置。
  • 环境Solution应该具有:
    1. 默认情况下,没有号码。
    2. 一个可选参数,其中我可以将解决方案编号自定义为任何感兴趣的数字。
    3. 此环境中列出的所有方程式都应按以下格式编号:([exercise number].[equation number])。编号还应遵循Exercise环境中列出的方程式的编号。
    4. 在每个新环境中,方程编号应重置。

目前,我面临两个问题:

  1. 如果我没有对两个环境进行编号,那么我会出现以下错误:

缺失数字,视为零。\begin{exercise}{}

缺失数字,视为零。\begin{solution}{}

  1. 如果我没有对练习环境进行编号,则方程式的编号为:(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}

输出如下: MWE 输出

答案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}

练习和解答

相关内容