在一个框架中我包括一张包含多个叠加层的图形,比如说两张幻灯片。在那个帧中,我只想显示所包含图形的子集,比如说第 1 帧。
对于标准演示文稿,我可以轻松地编写\begin{frame}<1>
仅显示第一张幻灯片,因此也仅显示所含图形的第一帧。
但是,讲义选项始终会打印最后的帧,无论实际演示中包含哪些。在示例中,它显示了完全展开的图形,直到 1。我知道|handout:1
可以添加的选项,但这在我的场景中似乎没用。
MMW示例:
\documentclass[handout]{beamer} % remove "handout" to see normal slides
\usepackage{filecontents,tikz}
\begin{filecontents}{fancyFig.tikz}
\begin{tikzpicture}
\node[draw] (n1) {some node};
\only<2>{ % "+(1)" would mean the same than "2"
\node[below of=n1,draw] (n2) {an even more awesome node!};
}
\end{tikzpicture}
\end{filecontents}
\begin{document}
% only show the first slide of the following frame,
% i.e., also only show the first pic
\begin{frame}<1>{boring frame title}
Awesome pic:\\[1em]
\input{fancyFig.tikz}
\end{frame}
\end{document}
在此示例中,讲义还显示了节点 (n2),我不知道如何更改它。请注意,\only<2| handout:0>{
在图中使用不是一个选项,因为该图包含在多张幻灯片中(其中一些幻灯片中必须包含节点 (n2))。因此,我需要找到一个只能在框架内而不是在导入的图中使用的选项/命令。
请注意:我的问题与这是关于从讲义中完全排除框架的内容甚至更多这是关于从讲义中去除某些覆盖内容的,但即使后者在这里也不起作用,因为我只包含一张图形,其中的讲义占据最后一张幻灯片,无论在实际演示文稿中显示哪些。
答案1
我认为https://tex.stackexchange.com/a/356907/36296也适用于您的问题:
\documentclass[handout]{beamer} % remove "handout" to see normal slides
\usepackage{filecontents,tikz}
\usetikzlibrary{overlay-beamer-styles}
\makeatletter
\newif\ifOnBeamerModeTransition
\newcommand{\slideselection}{1-}%
\newenvironment{handoutframeselect}[1][1-]{%
\begingroup%
\mode<handout>{%
\gdef\beamer@currentmode{beamer}%
\OnBeamerModeTransitiontrue%
\renewcommand{\slideselection}{#1}}%
}{%
\ifOnBeamerModeTransition%
\OnBeamerModeTransitionfalse%
\gdef\beamer@currentmode{handout}%
\fi%
\endgroup%
}
\makeatother
\begin{filecontents}{fancyFig.tikz}
\begin{tikzpicture}
\node[draw] (n1) {some node};
\node<2>[below of=n1,draw] (n2) {an even more awesome node!};
\end{tikzpicture}
\end{filecontents}
\begin{document}
\begin{handoutframeselect}[1]
\begin{frame}<1>{boring frame title}
Awesome pic:\\[1em]
\input{fancyFig.tikz}
\end{frame}
\end{handoutframeselect}
\end{document}
答案2
这是对 samcarter 给出的答案的改进,它又建立在另一个答案的基础上。如果您喜欢这个答案,请为这两个答案投票。
在此答案中,\slideselection 接受一个附加参数,该参数指定应在演示模式中包含的幻灯片。如果应显示所有幻灯片,则应将“1-”作为参数,否则任何所需的子集都可以。(请注意,必须给出此命令,否则 handoutframeselect 环境无法正常工作。)
\documentclass[handout]{beamer} % remove "handout" to see normal slides
\usepackage{filecontents,tikz}
\usetikzlibrary{overlay-beamer-styles}
\makeatletter
\newif\ifOnBeamerModeTransition
\newcommand{\slideselection}[1]{#1}%
\newenvironment{handoutframeselect}[1][1-]{%
\begingroup%
\mode<handout>{%
\gdef\beamer@currentmode{beamer}%
\OnBeamerModeTransitiontrue%
\renewcommand{\slideselection}[1]{#1}}%
}{%
\ifOnBeamerModeTransition%
\OnBeamerModeTransitionfalse%
\gdef\beamer@currentmode{handout}%
\fi%
\endgroup%
}
\makeatother
\begin{filecontents}{fancyFig.tikz}
\begin{tikzpicture}
\node[draw] (n1) {some node};
\node<2>[below of=n1,draw] (n2) {an even more awesome node!};
\end{tikzpicture}
\end{filecontents}
\begin{document}
\begin{handoutframeselect}[1]
\begin{frame}<\slideselection{1}>{boring frame title}
Awesome pic:\\[1em]
\input{fancyFig.tikz}
\end{frame}
\end{handoutframeselect}
\end{document}
答案3
进一步Chaos 教授的回答,对文章模式也做了一些小修改。handoutframeselect
环境将在讲义和文章模式下运行,并负责恢复正确的模式。
\newenvironment{handoutframeselect}[1][1-]{%
\begingroup%
\mode<handout|article>{%
\xdef\beamer@actualcurrentmode{\beamer@currentmode}
\gdef\beamer@currentmode{beamer}%
\OnBeamerModeTransitiontrue%
\renewcommand{\slideselection}[1]{#1}}%
}{%
\ifOnBeamerModeTransition%
\OnBeamerModeTransitionfalse%
\xdef\beamer@currentmode{\beamer@actualcurrentmode}%
\fi%
\endgroup%
}
答案4
这里答案背后的想法非常棒——谢谢!
但是,我发现稍微不同的界面更加灵活且更易于使用。这是基于以下包装器\againframe
:
\makeatletter
\newcommand\handoutframe[1][handout]{%
\@ifnextchar<%
{\handoutframe@[#1]}%
{\handoutframe@[#1]<1->}%
}
\def\handoutframe@[#1]<#2>#3{%
\mode<#1>{%
% \edef\save@currentmode{\beamer@currentmode}
\begingroup
\def\beamer@currentmode{beamer}%
\againframe<#2>{#3}%
\endgroup
% \edef\beamer@currentmode{\save@currentmode}%
}%
}
\makeatother
使用示例:
\begin{frame}<2-3|handout:0|trans:0>[label=complexframe]
complex slide with
\only<1>{overwritten}\onslide<2->{replaced}
\onslide<3->{material}
\end{frame}
\handoutframe<1,3>{complexframe}
\handoutframe[handout|trans]<2>{complexframe}
此版本允许演示模式覆盖规范与框架一起照常出现,并且如果需要,可以使用(例如)抑制默认讲义(和其他模式)的渲染handout:0
。
然后可以使用覆盖规范来选择要在讲义中呈现的特定覆盖\handoutframe
。如果省略规范,则将呈现每个覆盖步骤。
相同的命令适用于使用可选参数的其他模式(但我仍然使用\handoutframe
宏的名称,因为“handout”既是默认的也是我最常用的)。可以使用类似 的形式\handoutframe[handout|trans]<spec>{framename}
。我发现分组足以将模式切换限制为单个\againframe
调用,但如果在某些情况下中断,可以通过取消注释行来明确保存和恢复模式\save@currentmode
。