我需要在课程中建立一个证明环境。
\begin{proof}
...
\end{proof}
这个环境可以有一个包含一个宏的内容,\lines
如下例所示。\lines{n}
绘制 n 条水平线,学生可以在课堂上书写。
\begin{proof}
bla, bla,...
\lines{4}
bla, bla,...
\lines{7}
bla, bla,...
\end{proof}
我想显示或不显示proof
包含一个或多个宏的环境\lines
,以便有两个版本的课程:一个用于学生,一个仅显示我输入的文本。
是否可以 ?
\lines
更准确地说,如果使用宏,我不想显示整个证明环境。
答案1
您可以使用这environ
随着\newtoggle
来自这etoolbox
。以下代码产生:
这里使用包environ
来收集宏中的环境主体\BODY
。
进一步增强:
- 正如评论中提到的,由于包含宏的环境中的材料
\lines
是排版的(即使它可能会被丢弃),因此任何具有全局副作用的宏仍会执行。这些需要在开始时禁用,\sbox
以便它们不会产生任何意外的副作用。下面我已禁用\label
和\stepcounter
宏,但可能还有许多其他需要禁用的宏,具体取决于应用程序。唯一应该禁用的宏不是确实被禁用当然是\lines
宏了。
笔记:
- 宏
\lines
尚未绘制线条。需要添加相应的代码。 - 这里的解决方案使用了
\newtoggle
这里的解决这etoolbox
,因为我觉得这种语法更易读。这可以适用于评估条件的许多其他选项,例如LaTeX 条件表达式。
代码:
\documentclass{article}
\usepackage{amsthm}
\usepackage{environ}
\usepackage{etoolbox}
\newtoggle{LinesMacroUsed}%
\newcommand*{\lines}[1]{\global\toggletrue{LinesMacroUsed}}%
\newbox{\MyBody}
\NewEnviron{MyProof}{%
\global\togglefalse{LinesMacroUsed}%
\sbox{\MyBody}{%
% Disable any commands here so that there are not any unwanted side effects
\renewcommand{\ref}[1]{}%
\renewcommand{\stepcounter}[1]{}%
% Typeset the body onto a box to see if the \lines macro was called
\vbox{\BODY}%
}%
\iftoggle{LinesMacroUsed}{%
}{%
\begin{proof}%
\BODY% Using the \savebox here has issues for case of multiple lines
\end{proof}%
}%
}{}%
\begin{document}
\begin{MyProof}
bla, bla,...
\lines{4}
bla, bla,...
\lines{7}
bla, bla,...
\end{MyProof}
%
\begin{MyProof}
bla, bla, (without using lines macro)
bla, bla, (without using lines macro)
bla, bla, (without using lines macro)
\end{MyProof}
%
\begin{MyProof}
bla, bla,...
\lines{4}
bla, bla,...
\lines{7}
bla, bla,...
\end{MyProof}
%
\end{document}
答案2
使用 environ 来获取环境的主体看起来是显而易见的。然后我建议扫描主体,检查是否有标记\lines
。如果我们确定标记\lines
永远不会在括号内,则可以使用带有分隔参数的宏轻松完成此操作。否则,使用是一个安全的选择:进行虚拟替换以计算环境主体中ted
出现的次数。\lines
\documentclass[a4paper]{article}
\usepackage{amsthm}
\usepackage{environ, ted}
\makeatletter
\NewEnviron{Proof}{%
\Substitute*{\BODY}{\lines}{}%
\ifnum\ted@count=\z@
\begin{proof}
\BODY
\end{proof}
\fi
}
\makeatother
\newcommand*\lines[1]{(#1)}
\begin{document}
\begin{Proof}
bli
\begin{equation}
2 + 2 = 4
\end{equation}
{\large \lines{1}}
bli
\end{Proof}
\begin{Proof}
bla
\begin{equation}
2 + 2 = 4
\end{equation}
bla
\end{Proof}
\arabic{equation}
\end{document}