我正在用 Beamer 写一个演示文稿,其中我展示的证明长度超过一帧。如何让 Beamer 自动将其拆分到另一帧?如果不可能,我该如何删除方块(证明的结尾)并将其放在另一帧的正确位置?
答案1
如果您正在使用该proof
环境,那么恐怕没有自动的方法来打破文本(allowframebreaks
在这里不起作用,因为我们正在处理一个块)。
您可以定义一个行为方式为 的环境proof
,但不使用结束标记;然后,您可以将这个新环境用于证明的前几帧,然后将标准proof
环境用于最后一帧;下面是此类环境的定义(我称之为proofs
)及其用法的一个例子:
\documentclass{beamer}
\usetheme{Warsaw}
\usepackage{lipsum}
\makeatletter
\newenvironment<>{proofs}[1][\proofname]{%
\par
\def\insertproofname{#1\@addpunct{.}}%
\usebeamertemplate{proof begin}#2}
{\usebeamertemplate{proof end}}
\makeatother
\begin{document}
\begin{frame}
\begin{proofs}
\lipsum[1]
\end{proofs}
\end{frame}
\begin{frame}
\begin{proofs}[\proofname\ (Cont.)]
\lipsum[1]
\end{proofs}
\end{frame}
\begin{frame}
\begin{proof}[\proofname\ (Cont.)]
\lipsum[1]
\end{proof}
\end{frame}
\end{document}
根据评论中的要求,我现在定义了三个新环境:proofs
,它使用一个标题为\insertproofname
(默认“证明”)的块并抑制结束标记;proofc
,它抑制标题和结束标记,以及proofe
抑制标题但添加结束标记;第一个环境用于开始证明,第二个环境用于继续证明,第三个环境用于结束证明:
\documentclass{beamer}
\usetheme{Warsaw}
\usepackage{lipsum}
\makeatletter
\newenvironment<>{proofs}[1][\proofname]{%
\par
\def\insertproofname{#1\@addpunct{.}}%
\usebeamertemplate{proof begin}#2}
{\usebeamertemplate{proof end}}
\newenvironment<>{proofc}{%
\setbeamertemplate{proof begin}{\begin{block}{}}
\par
\usebeamertemplate{proof begin}}
{\usebeamertemplate{proof end}}
\newenvironment<>{proofe}{%
\par
\pushQED{\qed}
\setbeamertemplate{proof begin}{\begin{block}{}}
\usebeamertemplate{proof begin}}
{\popQED\usebeamertemplate{proof end}}
\makeatother
\begin{document}
\begin{frame}
\begin{proofs}
\lipsum[1]
\end{proofs}
\end{frame}
\begin{frame}
\begin{proofc}
\lipsum[1]
\end{proofc}
\end{frame}
\begin{frame}
\begin{proofe}
\lipsum[1]
\end{proofe}
\end{frame}
\end{document}
答案2
解决这个问题的一个选择是“蛮力”:因为存在通用的堵塞对于 beamer 类的环境,我们可以做以下事情:
\begin{frame}
\begin{block}{Proof}
Here is the first part of my proof.
\end{block}
\end{frame}
\begin{frame}
\begin{block}{}
This is where my proof continues, and ends.
\qed
\end{block}
\end{frame}
在第二个空的“{}”中,我们可以插入任何我们想要的块作为标题的内容,或者如果我们不想在那里添加任何内容,则可以将其留空。
答案3
这个allowframebreaks
选项是邪恶的,但仅作为概念证明,这里有一个具有tcolorbox
内部主题的解决方案:
\documentclass{beamer}
\usetheme{Warsaw}
\usepackage{lipsum}
\usepackage[most]{tcolorbox}
\useinnertheme{tcolorbox}
\tcbset{breakable,title after break=\insertblocktitle}
\begin{document}
\begin{frame}[allowframebreaks]
\begin{proof}
\lipsum[1]
\framebreak
\lipsum[1]
\end{proof}
\end{frame}
\end{document}