我可以在不同的投影仪模式下声明不同的覆盖规范吗?

我可以在不同的投影仪模式下声明不同的覆盖规范吗?

我有一个投影仪框架,上面有大约 150 张幻灯片。我希望文章和讲义模式仅显示第 92 帧。

阅读 Beamer 手册第 8.6.2 节,我似乎应该能够做类似的事情

\begin{frame}<handout:92>
...
\end{frame}

但这似乎没有效果——所有 150 张幻灯片都设置为讲义模式,重叠(使结果无法读取)。

我通过执行所有命令得到了我想要的效果之内具有覆盖规范的框架并添加“ | handout:0”以使它们不出现在讲义模式中。很烦人,但有效。但对于我的 150 张幻灯片框架,不同的幻灯片是由 PGF\foreach循环生成的,因此我无法将幻灯片 92 与其他幻灯片进行不同的编码。但我可以在框架的覆盖规范中执行此操作吗?

看起来框架的覆盖规范确实与其他命令不同。如果我只执行

\begin{frame}<92>...\end{frame}

那么在投影机模式下我只能得到第 92 张幻灯片,但在文章或讲义模式下则得到所有幻灯片。

答案1

据我所知,beamer 的情况如下:

\begin{frame}<92> means \begin{frame}<beamer:92|handout:1>

相似地

\only<5> means \only<beamer:5|handout:1>

在讲义模式下,如果覆盖图不包含讲义模式的规范,则框架的所有幻灯片都是相同的,并包含所有覆盖元素(除了 \alt,我认为它是替代元素,但我不确定)。因此,在讲义模式下打印框架的一张特定幻灯片是没有意义的,除非覆盖图包含讲义模式的规范。

在极端情况下,如果您希望在投影机和讲义模式下覆盖相同,则可以为“所有”模式提供覆盖规范。

\only<all:5>

因此,要做你想做的事:

\begin{frame}<handout:92>
...
\only<all:5-97>
...
\only<all:143>
...
\end{frame}

下面的代码演示了一个您似乎愿意做的事情的更简单的解决方案。

\documentclass[handout]{beamer}

\usepackage{tikz}

\begin{document}

\begin{frame}
\foreach \n  in {1,...,10} {
    \pgfmathtruncatemacro{\oneifnisfive}{\n==5}
    \only<\n| handout:\oneifnisfive>{Slide \n\par}
}
\end{frame}

\begin{frame}<handout:5>
\foreach \n  in {1,...,10} {
    \only<all:\n>{Slide \n\par}
}
\end{frame}

\end{document}

答案2

我推测 150 的数量指的是文档的主要演示版本(“beamer”版本)。如果是这样,您看到的事实是,当 beamer 生成页面的讲义(以及文章和翻译)版本时,它会大大折叠幻灯片。因此,当您在讲义版本中请求幻灯片“92”时,它会根据讲义使用的计数查找幻灯片 92。但这不是 beamer 版本中的幻灯片“92”,因为折叠已经发生。

在 Beamer 用户指南中,我找到了一个关于将演示文稿幻灯片的副本包含在文章版本中的部分。在我的版本中是第 21.2.3 节。我建议您查看该部分以了解详细信息,但基本思路如下:

  1. 向框架添加标签:\begin{frame}[label=myfantasticframe]
  2. \includeslide{myfantasticframe<92>}然后使用文档中的命令

有一些关于文件名和beamerjobname用户指南的详细信息。

你可以尝试在讲义模式下执行该命令,但我不确定它是否能按预期工作。快速实验没有成功,但这并不意味着它没有成功!


更新:好的,实验没有成功。问题在于包含“label => pagenumber”设置的数组在演示模式和文章模式下是不同的。在演示模式下,标签是“beamer@hyperlink标签在文章模式下,它们是“beamer@slide标签“。因此,在文章模式下,它会从相应的 Beamer 版本中读取标签 => 页码数组,并将该数组保存为“beamer@slideX => N”,因此当再次查找时,它会查找“beamer@slideX”。但是,如果我们尝试在讲义模式下执行此操作,它会读取标签数组并将其保存为“beamer@hyperlinkX”,但当查找标签时,它会查找“beamer@slideX”,而该数组并不存在。因此,需要告诉讲义模式在数组中查找正确的索引。由于这些“标签 => 页码”数组可能也用于其他用途,因此最好将当前文档(“讲义”版本)的数组与我们尝试引用的文档的数组分开。因此,要修改的宏是\setjobnamebeamerversion。这是一个在我有限的测试中有效的技巧:

\documentclass[handout]{beamer}

\makeatletter
\def\setjobnamebeamerversion#1{%
  \def\jobnamebeamerversion{#1}%
  {\makeatletter
  \def\beamer@slide##1##2{\expandafter\gdef\csname
    beamer@slide##1\endcsname{##2}}
  \@input{\jobnamebeamerversion.snm}}
}
\makeatother

\usepackage{tikz}

\begin{document}

\begin{frame}[label=test]
\foreach \t in {1,...,10}
{
\only<\t>{This is frame \t}
}
\end{frame}

\mode<handout>
\begin{frame}
\setjobnamebeamerversion{testbox.beamer}
\includeslide{test<2>}
\end{frame}

\begin{frame}[label=moretest]
The previous slide was the beamer version of frame \ref{test}. Incidentally, this is frame \ref{moretest}.
\end{frame}
\mode
<all>
\end{document}

为了使其正常工作,首先将其链接到“testbox.beamer.tex”和“testbox.handout.tex”。然后保存它没有“讲义”版本pdflatex投影机符号链接几次。然后添加“handout”选项pdflatex讲义版本。

请注意,这是一个精确的来自 beamer 版本的相应幻灯片的副本。因此,如果您在两者之间设置了任何不同的东西(导航符号、颜色),那么它们将显示为 beamer 版本,而不是讲义版本。

答案3

好的,我想我找到了一个更简单的方法。这个方法有效:

\begin{frame}
\foreach \n  in {1,...,10} {
    \pgfmathtruncatemacro{\oneifnisfive}{\n==5}
    \only<\n| handout:\oneifnisfive>{Slide \n\par}
}
\end{frame}

如果是 5,则该\pgfmathtruncatemacro行设置oneifnisfive为,否则设置为。然后我们即时构建一个覆盖规范。1\n0

在投影机模式下,所有幻灯片都包括在内。在讲义模式下,大多数内容都被归入“幻灯片”0,这意味着它们被隐藏。除非是\n5,否则文本会进入讲义“幻灯片”1,这意味着你可以看到它。尤里卡!

相关内容