通过 true/false 开关解决环境问题

通过 true/false 开关解决环境问题

我想创建一个解决方案环境,在可选参数设置为 true(默认值)的情况下打印解决方案,在参数为 false 的情况下隐藏解决方案。我尝试使用 egreg 的想法 是否存在一个“身份”(或“无操作”)环境,它只是不改变地使用其内容? 但由于可选参数 ( Illegal parameter number in definition of \endsolution),我的构造已经失败。如果我们处于“false”的情况,那么我们的想法是不显示任何内容(理想情况下也不会创建任何垂直空间)。

注意:我知道这个问题的其他解决方案(请参阅比较有助于排版练习和解决方案的软件包:练习 vs. 答案 vs. probsoln) 但我很想知道我在构造过程中做错了什么。

\documentclass{scrartcl}

\usepackage[T1]{fontenc}
\usepackage{ifthen}

% solution environment
\newenvironment{solution}[1][true]{
  \ifthenelse{\boolean{#1}}{\par{\sffamily\bfseries Solution}\par}{\ignorespaces}
}{\ifthenelse{\boolean{#1}}{}{\ignorespacesafterend}}

\begin{document}
This is Exercise 1 with solution.
\begin{solution}
  Solution to Exercise 1
\end{solution}

\bigskip
This is Exercise 2 (without solution).
\begin{solution}[false]
  This should not appear.
\end{solution}

\end{document}

答案1

传递给环境的参数在最后执行的代码中不可用。您可以通过在初始化代码中使用全局声明来保存它们来解决此问题。此外,您的示例中没有任何内容可以阻止在 false 情况下处理环境主体(即\begin{solution}和之间\end{solution})。您可以使用环境包\BODY在这段代码中,只有当执行宏时,才会处理环境的主体。

\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{ifthen}
\usepackage{environ}

% solution environment
\makeatletter
\NewEnviron{solution}[1][true]{
  \gdef\@tmp{#1}
  \ifthenelse{\boolean{#1}}{\par{\sffamily\bfseries Solution}\par\BODY}{\ignorespaces}
}[\ifthenelse{\boolean{\@tmp}}{}{\ignorespacesafterend}]
\makeatother    

\begin{document}
This is Exercise 1 with solution.
\begin{solution}
  Solution to Exercise 1
\end{solution}

\bigskip
This is Exercise 2 (without solution).
\begin{solution}[false]
  This should not appear.
\end{solution}

\end{document}

答案2

这是一个使用的解决方案xparse包,它NewDocumentEnvironment允许在代码中使用参数\end{environment}

重要的是

% solution environment
\NewDocumentEnvironment{solution}{O{true}}{%
    \ifthenelse{\boolean{#1}}{\par{\sffamily\bfseries Solution}\par}{\setbox0=\hbox\bgroup}
    }{%
    \ifthenelse{\boolean{#1}}{}{\egroup}
}

这是一个完整的 MWE,可以参考:为什么环境的结束代码不能包含参数?将 \newenvironment 参数传递给结束块?以供进一步参考。

% arara: pdflatex
% !arara: indent: {overwrite: yes}
\documentclass{article}

\usepackage{xparse}
\usepackage{ifthen}

% solution environment
\NewDocumentEnvironment{solution}{O{true}}{%
    \ifthenelse{\boolean{#1}}{\par{\sffamily\bfseries Solution}\par}{\setbox0=\hbox\bgroup}
    }{%
    \ifthenelse{\boolean{#1}}{}{\egroup}
}

\begin{document}
This is Exercise 1 with solution.
\begin{solution}
    Solution to Exercise 1
\end{solution}

\bigskip
This is Exercise 2 (without solution).
\begin{solution}[false]
    This should not appear.
\end{solution}

\begin{solution}[true]
    This *should*  appear.
\end{solution}

\end{document}

相关内容