答案1
在摸索了不同版本之后\mode
,我终于让它工作了。
我真的不明白为什么我必须在某个地方使用一个版本而在另一个地方使用另一个版本,我愿意接受解释、更好的方法甚至自动化(即定义一个更短的宏来做到这一点)。
\documentclass{beamer}
\makeatletter
\@ifclassloaded{beamer}{\usecolortheme{orchid}}{\usepackage{beamerarticle}}
\makeatother
\NewDocumentEnvironment{preuve}{O{Preuve}}{\begin{block}{#1}}{\end{block}}
\begin{document}
\begin{frame}
\begin{alertblock}{Berge, 1957}
Un couplage $C$ est de cardinal maximal si et seulement s'il n'admet pas de chemin augmentant.
\end{alertblock}
\pause
\begin{preuve}[Preuve du sens non couvert par le lemme]
some already long text
\mode
<presentation>
% article mode does not see this
\hfill …/…
\end{preuve}
\end{frame}
\begin{frame}
\begin{block}{}
\mode
<all>
Soit $p$ un chemin maximal dans $K$ : \uncover<2->{sa première et sa dernière arêtes sont dans $C_2$.}
\mode
<presentation>
\end{block}\pause[3]\vfill
\mode
<all>
\mode<article>{\end{preuve}}
Remarque : ce lemme et ce théorème n'utilisent pas le fait que le graphe est biparti.\\
Cette propriété va cependant permettre de faciliter la recherche d'un chemin augmentant.
\end{frame}
\end{document}
答案2
这是一个更优雅的解决方案,使用 lua 在文章模式下向 LaTeX 隐藏帧分割代码。
\RequirePackage{luacode}
\begin{luacode*}
envname = ""
current = ""
function startGobble(cur, fut)
envname = fut
current = cur
luatexbase.add_to_callback("process_input_buffer", gobble, "gobbler")
end
function gobble(line)
if line:find("\\begin{"..envname.."}") ~= nil then
luatexbase.remove_from_callback("process_input_buffer", "gobbler")
luatexbase.add_to_callback("process_input_buffer", replace, "replacer")
return "\\refstepcounter{framenumber}"
else
return ""
end
end
function replace(line)
if line:find("\\end{"..envname.."}") ~= nil then
luatexbase.remove_from_callback("process_input_buffer", "replacer")
return line:gsub("\\end{"..envname.."}", "\\end{"..current.."}")
else
return line
end
end
\end{luacode*}
\mode
<presentation>
\NewDocumentCommand{\mergeFrame}{mm}{}
\mode
<article>
\NewDocumentCommand{\mergeFrame}{mm}{\luadirect{startGobble("#1", "#2");}}
\mode
<all>
然后我们可以说
\NewDocumentEnvironment{preuve}{O{Preuve}}{\begin{block}{#1}}{\end{block}}
\begin{document}
\begin{frame}
\begin{alertblock}{Berge, 1957}
Un couplage $C$ est de cardinal maximal si et seulement s'il n'admet pas de chemin augmentant.
\end{alertblock}
\pause
\begin{preuve}[Preuve du sens non couvert par le lemme]
some already long text
\mergeFrame{preuve}{block}
\end{preuve}
\end{frame}
\begin{frame}
\begin{block}{}
Soit $p$ un chemin maximal dans $K$ : \uncover<2->{sa première et sa dernière arêtes sont dans $C_2$.}
\end{block}
Remarque : ce lemme et ce théorème n'utilisent pas le fait que le graphe est biparti.\\
Cette propriété va cependant permettre de faciliter la recherche d'un chemin augmentant.
\end{frame}
\end{document}
在演示模式下,\mergeFrame
不执行任何操作。在文章模式下,它会设置一个行吞噬器,直到它看到\begin{block}
(包括)。然后它让内容显示出来,直到它看到\end{block}
,并用 替换它\end{preuve}
。因此,在文章模式下,LaTeX 看到一个单一的preuve
环境。我们\refstepcounter{framenumber}
在退出吞噬模式时,尽管这在文章模式下应该不太相关。
答案3
Beamer 块默认不可破坏。但是,您可以用可破坏的 tcolorbox 替换它们,并\framebreak
根据需要破坏您的块。
该\framebreak
宏被定义为仅在演示模式下起作用,因此它不会干扰您的文章。
\documentclass{article}
\makeatletter
\@ifclassloaded{beamer}{\usecolortheme{orchid}}{\usepackage{beamerarticle}}
\makeatother
\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}