如何使用布尔值来切换可能包含逐字逐句的环境的显示?

如何使用布尔值来切换可能包含逐字逐句的环境的显示?

我想创建一个环境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}

相关内容