我正在努力解决一个可以在投影机中自动生成一些帧的宏。在这样做的过程中,我遇到了一个我不完全理解的情况。我的教学示例归结为以下内容:
\documentclass{beamer}
\begin{document}
\frame{Works}
\frame\begingroup Barks-why? \endgroup
\frame\bgroup Barks-why? \egroup
\end{document}
为什么第二和第三帧对我大喊大叫,声称存在语法问题?
我将非常感激您对此的一些想法。
答案1
在命令形式中使用时,\frame
接受参数的全部内容作为将在框架内设置的内容。此参数定义为支撑组或者令牌紧接着\frame
。就你的情况而言,代币导致问题的原因在于打开了一个未正确关闭的组。
在第一种情况下 -
\frame{Works}
- 这将是Works
。没问题。在第二种/第三种情况下 -
\frame\begingroup ...
/\frame\bgroup ...
这将是\begingroup
/\bgroup
。它们设置在框架内(框架本身具有作用域),并且没有用\endgroup
/正确关闭\egroup
。
这就是为什么你会看到指向“忘记”的错误\engroup
:
! Extra }, or forgotten \endgroup.
\endbeamer@frameslide ...amer@framepauses}\egroup
\ifx \beamer@frametitle \@...
l.8 \frame\begingroup
Barks-why? \endgroup
答案2
对我来说,提醒自己它们存在的理由是有帮助的:你想要这样的东西
\def\beginmyenviron{ABC \bgroup abc}
\def\closemyenviron{xyz \egroup XYZ}
这样你就可以更自由地控制局部变量。在这种情况下,你不希望\bgroup
被精确地解释为一个{
字符,否则第一个定义将永远不会结束。
\something
然后事情就卡在这里了。你无法想出一个定义,
\def\beginmyenviron{ABC \something abc}
{
在定义时不被视为字符,但{
在使用时被视为字符。例如,您可以尝试\edef
,但\edef
不会\bgroup
变成{
。
因此,回答你最初的问题,安全的做法是使用\begin{frame}
和\end{frame}
建立你的宏。
如果您真的讨厌\begin
和\end
,另一种方法是使用 holder-macro。
\def\content{First sentence.}
\expandafter\def\expandafter\content\expandafter{\content second sentence.}
\expandafter\def\expandafter\content\expandafter{\content third sentence.}
\expandafter\def\expandafter\content\expandafter{\content fourth sentence.}
and then finally
\frame{\content}