在演示文稿中打破两个框架之间的块,但在文章模式下不打破

在演示文稿中打破两个框架之间的块,但在文章模式下不打破

我面临着一个长期证明的问题,例如这个问题,这需要在两个框架之间打破一个块,也因为我正在创建一篇文章,我不希望证明环境在那里被破坏,就像那个封闭式的问题

我怎样才能将这两种想法结合起来?

答案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}

相关内容