![澄清](https://linux22.com/image/358955/%E6%BE%84%E6%B8%85.png)
我目前正在编写一个.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
文件中编译这两个文档。我不想有一个用于作业的文件和一个用于解决方案的文件。在我的序言中,我想将布尔值设置为 或true
。false
如果将布尔值solution
设置为false
,则不应编译解决方案,因此生成的文档是左侧的文档。如果将boolean
设置为true
,则应该编译解决方案,因此生成的文档是右侧的文档。
solution
我要求的 -environment 应该检查是否设置boolean
为true
,如果是,则编译其内容。
到目前为止,如果我像这样编码它就可以工作:
\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
不是环境和布尔值。)