当某个环境的内容包含一个特殊宏时,不显示该环境的内容

当某个环境的内容包含一个特殊宏时,不显示该环境的内容

我需要在课程中建立一个证明环境。

\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}

相关内容