澄清

澄清

我目前正在编写一个.sty文件,定义学生作业表的外观。我现在想为问题和答案定义一些自定义环境。

答案块打印在 a 内部tcolorbox,并且仅在布尔值设置为 true 时显示。因此,在我的自定义环境定义中,我首先检查布尔值,然后粘贴tcolorbox开始标记。不幸的是,这会返回以下错误:

LaTeX 错误:\begin{tcb@savebox} 在输入行 62 处以 \end{enumerate} 结束。

以下是代码:

\newenvironment{solution}
    {
        \ifthenelse{\boolean{solution}}{
            \begin{tcolorbox}[breakable, width=\textwidth, colframe=red, colback=white]
    }
    {
            \end{tcolorbox}
        }{} 
    }

我使用的代码如下:

\begin{solution}
    \begin{align*}
        x^2 + y^2 &= z^2\\
        \Rightarrow x &= \sqrt{z^2 - y^2}\\
        &= ...
    \end{align*}
\end{solution}

我做错了什么?提前谢谢您!


澄清

我的问题似乎有点不清楚,所以我尝试通过使用下图来更好地解释它。例子

请注意,左侧页面仅显示作业,右侧页面还包括问题的解决方案。我想要做的是能够从一个.tex文件中编译这两个文档。我不想有一个用于作业的文件和一个用于解决方案的文件。在我的序言中,我想将布尔值设置为 或truefalse如果将布尔值solution设置为false,则不应编译解决方案,因此生成的文档是左侧的文档。如果将boolean设置为true,则应该编译解决方案,因此生成的文档是右侧的文档。

solution我要求的 -environment 应该检查是否设置booleantrue,如果是,则编译其内容。

到目前为止,如果我像这样编码它就可以工作:

\begin{enumerate}[a)]
    %
    %
    %%%%%%%%%%%%%%%
    %% Question
    \item Compute the Fourier transform of $e^{-|x|}$ for $x\in \mathbb{R}$.
        %
        %
        %%%%%%%%%%%%%%%
        %% Solution
        \ifthenelse{\boolean{solution}}{
            \begin{tcolorbox}[breakable, width=\textwidth, colframe=red, colback=white]
                \begin{eqnarray*}
                    \hat{f}(\xi)&=&\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}e^{-|x|}e^{-ix\xi}dx\\
                    &=&\frac{1}{\sqrt{2\pi}}\int_{0}^{\infty}e^{-x-ix\xi}dx+\int_{-\infty}^0e^{x-ix\xi}dx\\
                    &=&\frac{1}{\sqrt{2\pi}}\int_{0}^{\infty}(e^{-x-ix\xi}-e^{-x+ix\xi})dx\\
                    &=&\frac{1}{\sqrt{2\pi}}[\frac{1}{-(1+i\xi)}(-1)-\frac{1}{-1+i\xi}(-1)]\\
                    &=&\frac{1}{\sqrt{2\pi}}[\frac{1-i\xi}{1+\xi^2}+\frac{-(1+i\xi)}{1+\xi^2}]\\
                    &=&\frac{1}{\sqrt{2\pi}}\frac{-2i\xi}{1+\xi^2}\\
                    &=&-\sqrt{\frac{2}{\pi}}\frac{i\xi}{1+\xi^2}
                \end{eqnarray*}
            \end{tcolorbox}
        }{}
    %
    %
    \item Compute the Fourier transform of $e^{-a|x|^2},~a>0$, directly, where $x\in \mathbb{R}$.\\
        \ifthenelse{\boolean{solution}}{
            \begin{tcolorbox}[breakable, width=\textwidth, colframe=red, colback=white]
                \begin{eqnarray*}
                    \hat{f}(\xi)&=&\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}e^{-a|x|^2}e^{-ix\xi}dx\\
                    &=&\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}e^{-a(x+\frac{i\xi}{2a})^2+\frac{-\xi^2}{4a}}dx~~~~~~~~x'\doteq x+\frac{i\xi}{2a}\\
                    &=&\frac{1}{\sqrt{2\pi}}e^{-\frac{\xi^2}{4a}}\int_{-\infty}^{\infty}e^{-ax^2}dx\\
                    &=&\frac{e^{-\frac{\xi^2}{4a}}}{2a}
                \end{eqnarray*}
            \end{tcolorbox}
        }{}
\end{enumerate}

自定义solution环境应该结合这两行(及其结束标签)以使编程更快,更干净:

\ifthenelse{\boolean{solution}}{
    \begin{tcolorbox}[breakable, width=\textwidth, colframe=red, colback=white]

希望这能消除误解。如果您还有其他问题,请随时提问。:)

答案1

\ifthenelse情况提前结束并environment在荒无人烟的地方留下一片空地。

与环境结合tcolorbox,结束分隔符是\endtcolorbox,我建议使用两个\ifthenelse语句,一个用于start环境代码,另一个用于结束代码。

\DeclareTColorbox在我看来,更好的方法是使用,或者一个奇怪的\scantokens构造。

也可以:用于\tcolorboxenvironment环绕现有solution环境。

\documentclass{article}

\usepackage{ifthen}

\usepackage[most]{tcolorbox}

\newboolean{solution}

\newenvironment{solution}{%
  \ifthenelse{\boolean{solution}}{%
    \tcolorbox[breakable, width=\textwidth, colframe=red, colback=white]
    }{%
  }%
}{\ifthenelse{\boolean{solution}}{\endtcolorbox}{}}


\begin{document}

\setboolean{solution}{true}
\begin{solution}
  \begin{align*}
    x^2 + y^2 &= z^2\\
    \Rightarrow x &= \sqrt{z^2 - y^2}\\
    &= ...
  \end{align*}
\end{solution}

\setboolean{solution}{false}
\begin{solution}
  \begin{align*}
    x^2 + y^2 &= z^2\\
    \Rightarrow x &= \sqrt{z^2 - y^2}\\
    &= ...
  \end{align*}
\end{solution}


\end{document}

在此处输入图片描述

具有两种不同环境的清洁解决方案

\documentclass{article}

\usepackage[most]{tcolorbox}


\tcbset{
  commonboxes/.style={nobeforeafter},
  nobox/.style={commonboxes,blank,breakable},
  solutionbox/.style={commonboxes,breakable, colframe=red, colback=white}
}


\newtcolorbox{solutionbox}[1][]{
  solutionbox,#1
}

\newtcolorbox{solutionbox*}[1][]{%
  nobox,#1
}






\begin{document}

\begin{solutionbox*}
  \begin{align*}
    x^2 + y^2 &= z^2\\
    \Rightarrow x &= \sqrt{z^2 - y^2}\\
    &= ...
  \end{align*}
\end{solutionbox*}

\begin{solutionbox}
  \begin{align*}
    x^2 + y^2 &= z^2\\
    \Rightarrow x &= \sqrt{z^2 - y^2}\\
    &= ...
  \end{align*}
\end{solutionbox}



\end{document}

\NewEnviron使用和命令的解决方案的第三部分\BODY

\documentclass{article}


\usepackage{environ}
\usepackage{ifthen}
\usepackage[shortlabels]{enumitem}
\usepackage{amssymb}
\usepackage{mathtools}
\usepackage[most]{tcolorbox}

\newboolean{solution}

\tcbset{
 commonboxes/.style={nobeforeafter,breakable},
  nobox/.style={commonboxes,blank,breakable},
  solutionbox/.style={commonboxes,breakable, colframe=red, colback=white}
}


\NewEnviron{solution}[1][]{%
  \ifthenelse{\boolean{solution}}{%
    \tcolorbox[solutionbox, width=\textwidth,#1]
    \BODY
    }{%
  }%
}[\ifthenelse{\boolean{solution}}{\endtcolorbox}{}]





\begin{document}

\begin{enumerate}[label={\alph*)}]
\item Compute the Fourier transform of $e^{-|x|}$ for $x\in \mathbb{R}$.
  \begin{solution}[colframe=blue]
    \begin{align*}
      \hat{f}(\xi)&=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}e^{-|x|}e^{-ix\xi}dx\\
      &=\frac{1}{\sqrt{2\pi}}\int_{0}^{\infty}e^{-x-ix\xi}dx+\int_{-\infty}^0e^{x-ix\xi}dx\\
      &=\frac{1}{\sqrt{2\pi}}\int_{0}^{\infty}(e^{-x-ix\xi}-e^{-x+ix\xi})dx\\
      &=\frac{1}{\sqrt{2\pi}}[\frac{1}{-(1+i\xi)}(-1)-\frac{1}{-1+i\xi}(-1)]\\
      &=\frac{1}{\sqrt{2\pi}}[\frac{1-i\xi}{1+\xi^2}+\frac{-(1+i\xi)}{1+\xi^2}]\\
      &=\frac{1}{\sqrt{2\pi}}\frac{-2i\xi}{1+\xi^2}\\
      &=-\sqrt{\frac{2}{\pi}}\frac{i\xi}{1+\xi^2}
    \end{align*}
  \end{solution}             
\item Compute the Fourier transform of $e^{-a|x|^2},~a>0$, directly, where $x\in \mathbb{R}$.\\
  \begin{solution}
    \begin{align*}
      \hat{f}(\xi)&=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}e^{-a|x|^2}e^{-ix\xi}dx\\
      &=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}e^{-a(x+\frac{i\xi}{2a})^2+\frac{-\xi^2}{4a}}dx~~~~~~~~x'\doteq x+\frac{i\xi}{2a}\\
      &=\frac{1}{\sqrt{2\pi}}e^{-\frac{\xi^2}{4a}}\int_{-\infty}^{\infty}e^{-ax^2}dx\\
      &=\frac{e^{-\frac{\xi^2}{4a}}}{2a}
    \end{align*}
  \end{solution}

\end{enumerate}

\setboolean{solution}{true}

\begin{enumerate}[label={\alph*)}]
\item Compute the Fourier transform of $e^{-|x|}$ for $x\in \mathbb{R}$.
  \begin{solution}[colframe=blue]
    \begin{align*}
      \hat{f}(\xi)&=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}e^{-|x|}e^{-ix\xi}dx\\
      &=\frac{1}{\sqrt{2\pi}}\int_{0}^{\infty}e^{-x-ix\xi}dx+\int_{-\infty}^0e^{x-ix\xi}dx\\
      &=\frac{1}{\sqrt{2\pi}}\int_{0}^{\infty}(e^{-x-ix\xi}-e^{-x+ix\xi})dx\\
      &=\frac{1}{\sqrt{2\pi}}[\frac{1}{-(1+i\xi)}(-1)-\frac{1}{-1+i\xi}(-1)]\\
      &=\frac{1}{\sqrt{2\pi}}[\frac{1-i\xi}{1+\xi^2}+\frac{-(1+i\xi)}{1+\xi^2}]\\
      &=\frac{1}{\sqrt{2\pi}}\frac{-2i\xi}{1+\xi^2}\\
      &=-\sqrt{\frac{2}{\pi}}\frac{i\xi}{1+\xi^2}
    \end{align*}
  \end{solution}             
\item Compute the Fourier transform of $e^{-a|x|^2},~a>0$, directly, where $x\in \mathbb{R}$.\\
  \begin{solution}
    \begin{align*}
      \hat{f}(\xi)&=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}e^{-a|x|^2}e^{-ix\xi}dx\\
      &=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}e^{-a(x+\frac{i\xi}{2a})^2+\frac{-\xi^2}{4a}}dx~~~~~~~~x'\doteq x+\frac{i\xi}{2a}\\
      &=\frac{1}{\sqrt{2\pi}}e^{-\frac{\xi^2}{4a}}\int_{-\infty}^{\infty}e^{-ax^2}dx\\
      &=\frac{e^{-\frac{\xi^2}{4a}}}{2a}
    \end{align*}
  \end{solution}

\end{enumerate}

\end{document}

该命令包含环境“文本”,并且仅在为真的\BODY情况下打印。solution

答案2

这是您编写的代码:

\newenvironment{solution}
    {% open 1
        \ifthenelse{\boolean{solution}}{% open 2
            \begin{tcolorbox}[breakable, width=\textwidth, colframe=red, colback=white]
    }% close 1
    {% open 3
            \end{tcolorbox}
        }{}% close 2, open & close 4
    }% close 3

但这混淆了开放和封闭(而且 TeX 不会查看缩进)。以下是 TeX 看到的代码:

\newenvironment{solution}
    {% open 1
        \ifthenelse{\boolean{solution}}{% open 2
            \begin{tcolorbox}[breakable, width=\textwidth, colframe=red, colback=white]
        }% close 2
        {% open 3
            \end{tcolorbox}
        }{}% close 3, open & close 4
    }% close 1

当然,这没有意义。环境缺少第二个参数;如果是solution,则 tcolorbox 打开(但永远不会关闭);如果不是solution,则 tcolorbox 关闭(但永远不会打开)。而{}#4 什么也不做。更符合原文的说法应该是:

\newenvironment{solution}
    {% open 1
        \ifthenelse{\boolean{solution}}{% open 2
            \begin{tcolorbox}[breakable, width=\textwidth, colframe=red, colback=white]
        }{% close 2, open 3
            \begin{comment}
        }% close 3
    }% close 1
    {% open 4
        \ifthenelse{\boolean{solution}}{% open 5
            \end{tcolorbox}
        }{% close 5, open 6
            \end{comment}
        }% close 6
    }% close 4

我们使用该comment包来丢弃答案。(您可能希望使用不同的变量名,因此这solution不是环境和布尔值。)

相关内容