我想创建一个解决方案环境,在可选参数设置为 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}