在 Beamer 框架中检测第一个可见性

在 Beamer 框架中检测第一个可见性

我正在操作一个全局宏,比如说\mytext,我会在每张幻灯片上打印它。我想以自然的方式逐步向该宏添加数据:

\frame{
  MyText: \mytext

  \gappto\mytext{One}\pause
  \gappto\mytext{Two}\pause
  \gappto\mytext{Three}\pause
}

当然,由于每次都会评估帧,所以这行不通。现在,我可以测试当前帧是否是最后一个暂停的帧,从而得到以下有效示例:

\documentclass{beamer}
\usepackage{etoolbox}

\def\mytext{}

\makeatletter
\def\addtotext#1{%
  \ifnum\beamer@slideinframe = \c@beamerpauses
  \gappto\mytext{#1}
  \fi}
\makeatother

\begin{document}
\frame{
  MyText: \mytext

  \addtotext{One}\pause
  \addtotext{Two}\pause
  \addtotext{Three}\pause
}
\end{document}

问题:如何扩展此示例,使其适用于任何\only<>\visible<>?我处于一个特定情况,其中每个添加的部分\mytext都是唯一的;因此,如果多次评估添加,我可以简单地检查(例如使用列表)我是否尚未添加所述文本。

答案1

我想到了以下答案,其主要思想是修补pgfsys@{begin,end}invisible以计算其中的嵌套数量。第一次\addtomytext执行时使用 0 不可见嵌套,我假设它是可见的。为了确保不会将某些内容重复添加到\mytext,我将添加的所有内容存储在列表中。

\documentclass{beamer}
\usepackage{etoolbox}

\makeatletter
\newcounter{beamer@invisibilitydepth}
\preto\pgfsys@begininvisible{\global\addtocounter{beamer@invisibilitydepth}{1}}
\preto\pgfsys@endinvisible{\global\addtocounter{beamer@invisibilitydepth}{-1}}

\def\mytext{}
\def\arg@list{}
\newbool{is@found}
\newcommand<>{\addtomytext}[1]{%
  \long\def\do##1{\ifstrequal{##1}{#1}{\setbool{is@found}{true}\listbreak}{}}%
  \only#2{%
    \ifnumequal{\value{beamer@invisibilitydepth}}{0}{%
      \boolfalse{is@found}%
      \dolistloop{\arg@list}%
      \ifbool{is@found}{}{%
        \listgadd{\arg@list}{#1}%
        \gappto\mytext{#1}}%
    }{}%
  }%
}
\makeatother

\begin{document}
\frame{
  MyText: \mytext

  \visible<4->{\addtomytext{Four}\only<5>{\addtomytext{Fiveprime}}}
  \addtomytext{One}\pause
  \addtomytext{Two}\pause
  \addtomytext{Three}\pause
  \pause
  \addtomytext{Five}\pause
}
\end{document}

欢迎对该方法及其清洁度提出任何评论。

相关内容