![在 Beamer 框架中检测第一个可见性](https://linux22.com/image/320247/%E5%9C%A8%20Beamer%20%E6%A1%86%E6%9E%B6%E4%B8%AD%E6%A3%80%E6%B5%8B%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8F%AF%E8%A7%81%E6%80%A7.png)
我正在操作一个全局宏,比如说\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}
欢迎对该方法及其清洁度提出任何评论。