亲爱的 LaTeX / beamer 爱好者
对于我们的课程,我们有一个使用出色的 beamer 包的大型 LaTeX 幻灯片库。一些幻灯片仅包含在讲义中,其他幻灯片则在讲义和 beamer 幻灯片集中提供。讲义和叠加层是通过将选项从构建脚本传递给 beamer 类从同一文件生成的。
我正在寻找一种解决方案来标记讲义中实际上只在讲义中可见的幻灯片(而不是覆盖的一部分)。因为我们有一个庞大的幻灯片库,这些幻灯片用于(导入)各种课程,所以我想自动执行此任务,而不必维护某种“handout_required”开关。
我知道如何了解当前模式(handout/trans/beamer/...)。如果我能了解当前需要哪些模式(因为在某个\only<handout>
环境中,例如),我就会知道如何解决问题。
[编辑:在我最初的问题中,我假设如果我可以暂时切换到不同的模式,我就能解决这个问题,但事实证明并非如此]
我查阅了这里和其他地方的很多页面,但找不到我的问题的答案。
任何帮助将非常感激。
以下是使用场景
\documentclass[handout]{beamer}
\begin{document}
% this command only finds out that we are in handout mode
% (but I want to find out about the currently required mode)
\newcommand\onlyhandoutmarker{\only<handout>{(handout)}}
% this supports using the marker in the frametitle
\setbeamertemplate{frametitle}{
\begin{beamercolorbox}[wd=\textwidth, ht=0.85cm, dp=0.4cm]{frametitle}
\strut\insertframetitle\ \onlyhandoutmarker\strut
\end{beamercolorbox}
}
\begin{frame}{General Slide}
This slide appears on overlay slides and in the handout.
It should not be marked as handout in the handout slides.
\end{frame}
\begin{frame}<handout>{Handout Slide}
This slide only appears in a handout.
This is the slide that I would like marked as handout in the handout slides.
\end{frame}
\end{document}
答案1
改编
frame
添加了两个切换按钮,如果在或在 中设置了讲义模式altenv
(例如 使用onlyenv
), 则这些切换按钮设置为 true :\newtoggle{handoutmarkerframe} \newtoggle{handoutmarkeraltenv}
handoutmarkerframe
在每一帧之前 设置为 false,使用:\preto\frame{\global\togglefalse{handoutmarkerframe}}
- 更改 的定义
\beamer@@frameenvspec
以包含以下附加行:\ifstrequal{#1}{handout}{% <<< NEW \global\toggletrue{handoutmarkerframe}% <<< NEW }{}% <<< NEW
- 这将检查是否
frame
使用该选项调用并相应<handout>
地设置切换handoutmarkerframe
- 这将检查是否
- 类似地改变定义
\beamer@@altenv
并\endaltenv
设置切换handoutmarkeraltenv
- 如果至少有一个切换为真,则将(“ (handout)”)添加
\onlyhandoutmarker
到框架标题:\ifboolexpr{ togl {handoutmarkerframe} or togl {handoutmarkeraltenv} }{% \onlyhandoutmarker% }{}%
etoolbox
添加了命令\preto
和\ifstrequal
切换包- 为了测试目的,我添加了更多幻灯片,以查看它之后是否仍能正常工作
代码
\documentclass[handout]{beamer}
\usepackage{etoolbox}
\newtoggle{handoutmarkerframe}
\newtoggle{handoutmarkeraltenv}
\newcommand{\onlyhandoutmarker}{\ (handout)}
\preto\frame{\global\togglefalse{handoutmarkerframe}}
\makeatletter
\def\beamer@@frameenvspec<#1>{%
\ifstrequal{#1}{handout}{% <<< NEW
\global\toggletrue{handoutmarkerframe}% <<< NEW
}{}% <<< NEW
\expandafter\gdef\expandafter\beamer@frameoptions\expandafter{\beamer@frameoptions<#1>}%
\beamer@copewithframeenv%
}
\long\def\beamer@@altenv#1#2#3#4#5{%
\ifstrequal{#1}{<handout>}{% <<< NEW
\global\toggletrue{handoutmarkeraltenv}% <<< NEW
}{}% <<< NEW
\alt#1{\long\def\beamer@eoenv{#3}#2}{\long\def\beamer@eoenv{#5}#4}%
}
\protected\def\endaltenv{%
\global\togglefalse{handoutmarkeraltenv}% <<< NEW
\beamer@eoenv%
}
\makeatother
% this supports using the marker in the frametitle
\setbeamertemplate{frametitle}{
\begin{beamercolorbox}[wd=\textwidth, ht=0.85cm, dp=0.4cm]{frametitle}
\strut\insertframetitle%
\ifboolexpr{ togl {handoutmarkerframe} or togl {handoutmarkeraltenv} }{%
\onlyhandoutmarker%
}{}%
\strut%
\end{beamercolorbox}
}
\begin{document}
\begin{onlyenv}<handout>
\begin{frame}{General Slide inside handout onlyenv}
This slide only appears in a handout.
This is the slide that I would like marked as handout in the handout slides.
\end{frame}
\end{onlyenv}
\begin{frame}<all>{All Slide}
This slide appears on overlay slides and in the handout.
It should not be marked as handout in the handout slides.
\end{frame}
\begin{frame}<handout>{Handout Slide}
This slide only appears in a handout.
This is the slide that I would like marked as handout in the handout slides.
\end{frame}
\begin{frame}{General Slide}
This slide appears on overlay slides and in the handout.
It should not be marked as handout in the handout slides.
\end{frame}
\end{document}