我想定义一个\mycover
与 Beamer 的命令对偶的命令\uncover
。在beamerbaseoverlay.sty
命令中\uncover
定义为
\newcommand{\uncover}{\alt{\beamer@fakeinvisible}{\beamer@makecovered}}
因此,我第一次尝试\mycover
简单地切换\alt
分支:
\newcommand{\mycover}{\alt{\beamer@makecovered}{\beamer@fakeinvisible}}
不幸的是,即使我 , 的覆盖规范中的第一个幻灯片\mycover
也始终显示为完全不可见\setbeamercovered{transparent}
。以下是一个例子:
\documentclass{beamer}
\makeatletter
\newcommand{\mycover}{\alt{\beamer@makecovered}{\beamer@fakeinvisible}}
\def\c@slideinframe{\beamer@slideinframe}
\makeatother
\setbeamercovered{transparent}
\begin{document}
\begin{frame}{}
\structure{Slide \arabic{slideinframe}}
\uncover<1,4>{Testing} \mycover<2-3>{my cover} \uncover<1,4>{command.}
\end{frame}
\end{document}
“我的封面”这两个字应该和“测试”和“命令”这两个字覆盖在完全相同的幻灯片上,即幻灯片 2 和 3。然而,实际发生的情况是,“我的封面”在第 2 张幻灯片上完全不可见,而在第 3 张幻灯片上才被正确覆盖。
存在什么问题\mycover
?如何解决?
答案1
以下定义似乎产生了所需的结果:
\documentclass{beamer}
\makeatletter
\def\beamer@startmycovered{%
\def\opaqueness<##1>##2{%
\only<##1>{%
\beamer@actions{%
\expandafter\xdef\csname beamer@oldcolorhook%
\the\beamer@coveringdepth\endcsname{\beamer@colorhook}%
\expandafter\xdef\csname beamer@oldpgfextension%
\the\beamer@coveringdepth\endcsname{\beamer@pgfextension}%
{\globalcolorstrue\colorlet{beamer@freeze\the\beamer@coveringdepth}{bg}}%
\xdef\beamer@colorhook{!##2!beamer@freeze%
\the\beamer@coveringdepth\beamer@colorhook}%
\gdef\beamer@pgfextension{!##2opaque}%
\color{.}%
}%
{%
\xdef\beamer@colorhook{\csname beamer@oldcolorhook%
\the\beamer@coveringdepth\endcsname}%
\xdef\beamer@pgfextension{\csname beamer@oldpgfextension%
\the\beamer@coveringdepth\endcsname}%
\color{.}%
}}}%
\ifnum\beamer@slideinframe<\beamer@minimum%ok, at beginning
{%
\beamer@saveanother%
\advance\beamer@minimum by-\beamer@slideinframe%
\beamer@slideinframe=\beamer@minimum%
\beamer@uncoverbeforeactions%
\beamer@restoreanother%
}%
\else%
{%
\beamer@saveanother%
\advance\beamer@slideinframe by-\beamer@minimum%
\beamer@uncoverafteractions%
\beamer@restoreanother%
}%
\fi%
\beamer@do%
% }%
}
\long\def\beamer@makemycovered#1{\beamer@startmycovered#1\beamer@endcovered}
\def\mycover{%
\alt{\beamer@makemycovered}{\beamer@fakeinvisible}}
\def\c@slideinframe{\beamer@slideinframe}
\makeatother
\setbeamercovered{transparent}
\begin{document}
\begin{frame}
\frametitle{Test frame 1}
\structure{Slide \arabic{slideinframe}}
\uncover<1,5>{Testing} \mycover<2-4>{my cover} \uncover<1,5>{command.}
\end{frame}
\begin{frame}
\frametitle{Test frame 2}
\structure{Slide \arabic{slideinframe}}
Testing \mycover<2,4,6>{my cover} command.
\end{frame}
\begin{frame}
\frametitle{Test frame 3}
\structure{Slide \arabic{slideinframe}}
\mycover<2,6>{Testing} \mycover<1-3,5-7>{my cover} command.
\end{frame}
\end{document}
\beamer@startcovered
我使用了你原来的想法,但使用了原来的变体\beamer@makecovered
。
虽然我在演示中没有使用太多的覆盖规范(\pause
,\only
和\onslide
对我来说已经足够了),但我非常喜欢你的想法;我认为这个命令可以成为官方课程的一部分beamer
。