定理环境的宏

定理环境的宏

打字很痛苦

\begin{theorem}
...
\end{theorem}

\begin{proof}
...
\end{proof}

在课堂上实时发送文档时。

当我宣布

\newcommmand{\theorem}[2]{\begin{theorem} {#1} \begin{proof} {#2} \end{proof} \end{theorem}}

我知道这\theorem已经定义了。

如果我尝试

\renewcommmand{\theorem}[2]{\begin{theorem} {#1} \begin{proof} {#2} \end{proof} \end{theorem}}

我收到一个致命错误。

有什么方法可以避免我多次输入开头、结尾和证明?当我在课堂上实时发短信时,这一点很重要。

答案1

你可以这样做

\newcommand{\thmpr}[2]{%
  \begin{theorem}#1\end{theorem}%
  \begin{proof}#2\end{proof}%
}

但我警告你,情况会更糟糕:你需要跟踪那些可能彼此相距很远的括号。

如果你正在记课堂笔记,那么标记起来就容易多了:

THEOREM\\
Whatever the guy at the blackboard is saying

PROOF\\
Something even more mysterious that I'll go through later

这样,当您修改材料时,就可以轻松放置所需的\begin标签。\end


问题是 确实\newtheorem{theorem}{Theorem}定义了一个\theorem宏用于其内部用途。因此 LaTeX 拒绝这样做\newcommand{\theorem}[2]{...};但是

\renewcommand{\theorem}[2]{\begin{theorem}...}

您正在\theorem根据其自身进行定义,这将导致无限循环。

答案2

您的定义中的问题在于\begin{theorem}隐式调用\theorem。这就是为什么在第一次尝试时您会得到“已定义”错误。(最终的环境实际上只是那个宏。)在第二次尝试中,您在要重新定义的宏中调用宏。因此,您最终陷入了无限循环。尝试\theorem通过以下方式存储一个版本

\let\oldtheorem\theorem

然后你的第二次尝试基本上应该有效:

\documentclass{article}
\usepackage{amsthm}

\newtheorem{theorem}{Theorem}
\let\oldtheorem\theorem
\let\endoldtheorem\endtheorem
\renewcommand\theorem[2]{\begin{oldtheorem}#1\end{oldtheorem}\begin{proof}#2\end{proof}}

\begin{document}
\theorem{a theorem}{with proof}
\end{document}

还要注意,proof环境通常不会嵌套在theorem参数周围的分组中,即“ {#1}”是不必要的。

相关内容