定义 \newtheorem 后,我无法在 Beamer 中 \pause

定义 \newtheorem 后,我无法在 Beamer 中 \pause

我正在使用一个新命令为 Beamer 中的定理指定我想要的名称,但它不允许我使用\pause。以下代码在没有 的情况下可以正常工作\pause,但使用 时会出现此错误\pause

! LaTeX Error: Command \NewThm already defined.  
               Or name \end... illegal, see p.192 of the manual.

我该怎么做才能赋予定理我想要的名称并能够使用\pause

\documentclass{beamer}   
\usefonttheme{professionalfonts}   
\usetheme{Warsaw}

\newcommand\thm[2]{%
  \newtheorem*{#1}{#2}%
  \AtBeginEnvironment{#1}{%
     \setbeamercolor{block body}{}%
  }%
}

\begin{document}   
\begin{frame}    
Text \pause  
\thm{NewThm}{Theorem's Name}   
\begin{NewThm}
Statement.
\end{NewThm}    
\end{frame}
\end{document}

在此处输入图片描述

答案1

您收到错误是因为您两次使用相同名称声明新定理,这是不允许的。

! LaTeX Error: Command \NewThm already defined.
               Or name \end... illegal, see p.192 of the manual.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.682 \end{frame}
                 
? 

这是因为它会在帧的每一张幻灯片上执行。如果没有\pause,它会运行一次。如果有 ,它会运行两次。

几乎所有情况下,最好的解决方案都是在序言中声明新的命令和环境。这使得它们更易于管理,错误也更容易发现。真正需要这样做的情况是例外,而不是常规。

处理异常的方法有很多种。它们各有优缺点。您可以测试环境是否已定义,或者可以使用某种形式的\provide。或者您可以使定义特定于覆盖。

请注意我绝对会不是在这种情况下,建议这样做。没有理由你不能在序言中声明这个定理。

\documentclass{beamer}

\usefonttheme{professionalfonts}

\usetheme{Warsaw}


\newcommand\thm[2]{%
  \newtheorem*{#1}{#2}%
  \AtBeginEnvironment{#1}{%
     \setbeamercolor{block body}{}%
  }%
}

\thm{NewThm}{Theorem's Name}

\begin{document}

\begin{frame}

Text \pause

% \only<1>{% possible, but not recommended
%   \thm{NewThm}{Theorem's Name}%
% }

\begin{NewThm}

Statement.

\end{NewThm}

\end{frame}

\end{document}

您可能还想了解 Beamer 对定义覆盖感知自定义命令和环境的支持,因为这为您提供了更大的灵活性。(但frame在大多数情况下,不值得单独这样做。)

相关内容