在 beamer 中修补部分命令时未定义控制序列 \Hy@writebookmark

在 beamer 中修补部分命令时未定义控制序列 \Hy@writebookmark

我尝试提供解决方案更新部分命令以在环境中包装整个部分并认为最好的方法是使用etoolbox修补\section命令。但这导致:

! Undefined control sequence.
l.1 ...metitle {Text 1}\let \Hy@writebookmark \org
                                                  @writebookmark {}

以下是 MWE:

\RequirePackage{etoolbox}
\documentclass{beamer}

\newif\ifInSection%
\global\InSectionfalse%
\makeatletter
\pretocmd\beamer@section{\ifInSection\end{frame}\fi\global\InSectiontrue}{}{}%
\apptocmd\beamer@section{\begin{frame}[fragile]{#1}}{}{}%
\makeatother

%\AtEndDocument{\end{frame}}% Needed to end the frame at \end{document}

\begin{document}
\section{Text 1}% Do a begin{frame} at end of this macro
Some text (1).
%\end{frame}% Start of next \section will do this

\section{Text 2}% Will end previous frame
Some text (2).
\end{frame}% Delete once \AtEndDocument above works
\end{document}

如果前一节已经开始,则使用 在新的 开始时结束前一节。使用在\pretocmd结束时开始。frame\section\apptocmdframe\section

我不太熟悉,beamer所以不确定是否有更简单的方法来做到这一点。

答案1

Beamer 的帧收集例程通过将内容拖入下一个 来工作\end,此时它会测试下一个“内容”以查看它是否是(也有一些嵌套测试)。因此,在启动{frame}时,需要位于标记流中才能找到。TeX 处理器不会扩展内容来找到它。\begin{frame}\end{frame}

因为它寻找\end可能可以将其挂接到宏中,以便对\end{document}所需的添加进行测试\end{frame},但这需要重写整个宏才能使其与命令一起工作\section。没有理由\section 不能出现在框架内。一旦命令\section被读取,beamer 已经决定了什么是框架,什么不是框架,所以试图说服它改变主意已经太晚了。让它重新考虑的唯一方法是扩展allowframebreaks\section添加一个\newpage。但这将涉及 TeX 吸收所有的一次过读完所有文件,这可能不是一个好主意。

相关内容