我想创建一个环境solution
,根据布尔值是否solutions
设置,显示其内容或不显示任何内容。目前我正在尝试:
\documentclass{article}
\usepackage{ifthenx}
\newboolean{solutions}
\setboolean{solutions}{true}
\usepackage{color}
\newenvironment{solution}%
{%
\ifsolutions%
\color{red}
\subsubsection*{Solution}%
}%
{%
\fi%
}
\begin{document}
Write some code:
\begin{solution}
\begin{verbatim}
a = 1;
a++;
\end{verbatim}
\end{solution}
\end{document}
这对于 来说很好,\setboolean{solutions}{true}
但对于 来说却失败了\setboolean{solutions}{false}
。我收到一个错误:
! Incomplete \iffalse; all text was ignored after line 21.
<inserted text>
\fi
<*> foo
?
https://tex.stackexchange.com/a/204450/13600建议使用 environ 包,但这不是真实环境,因此如果使用 verbatim 环境,则会失败\BODY
。反过来,https://tex.stackexchange.com/a/51256/13600建议针对环境采取一些解决方法,例如使用特殊的宏或外部文件。
有没有更干净的方式来做我想做的事情?
答案1
当 TeX 看到\iffalse
(可能是在宏扩展期间)时,它开始跳过标记,直到找到匹配的\fi
,没有任何宏扩展。它只是对找到的(显式)条件进行计数,以确定正确的嵌套。
因此,当布尔值设置为 false 时,就不会扫描\fi
隐藏内容。\end{solutions}
这似乎可以实现你想要的效果:
\documentclass{article}
\usepackage{comment}
\usepackage{color}
\newenvironment{solution}
{\color{red}\subsubsection*{Solution}}
{}
%\excludecomment{solution}
\begin{document}
Write some code:
\begin{solution}
á prògrâm
\begin{verbatim}
a = 1;
a++;
\end{verbatim}
\end{solution}
some text following
\end{document}
如果你不想打印解决方案,只需取消注释该行
%\excludecomment{solution}
到
\excludecomment{solution}