如何停止 Beamer \only 在先前渲染的帧部分上覆盖再生随机参数

如何停止 Beamer \only 在先前渲染的帧部分上覆盖再生随机参数

我在使用 的框架中有一些 lcg 随机化\only。我的问题是,多个 PDF 页面应该使框架的各个部分看起来像是慢慢出现在先前渲染的内容旁边,但它们的随机化值不同,这意味着失去了显示更多框架的幻觉。

以下是 MWE:

\documentclass{beamer}
\usepackage[first=0,last=1000,seed=0]{lcg}
\begin{document}
    \begin{frame}
        \rand\arabic{rand},\rand\arabic{rand} \only<2>{Text}
    \end{frame}
\end{document}

除非你运气不好,碰巧两次得到相同的数字,否则使用 pdflatex 你会看到类似这样的内容:一个有两页的 PDF,第一页显示“439,384”,第二页显示“27,692 Text”。我想要的是,第一页显示“439,384”,第二页显示“439,384 Text”。

如果没有\only,我可以重置 lcg 随机化种子来生成相同的随机数。例如,此代码两次生成相同的数字对:

\documentclass{beamer}
\usepackage[first=0,last=1000,seed=0]{lcg}
\begin{document}
    \begin{frame}
        \rand\arabic{rand},\rand\arabic{rand}
        \reinitrand[first=0,last=1000,seed=0]
        \rand\arabic{rand},\rand\arabic{rand}
    \end{frame}
\end{document}

所以我想,如果我能在它生成每个新的 PDF 页面之前\only运行它\reinitrand[first=0,last=1000,seed=0],那么就可以解决这个问题。或者,更好的方法是:将随机化倒回到它开始这一帧之前,在这种情况下,这不是第一个带有随机元素的帧,但我不知道如何倒回种子。至少\reinitrand我可以在帧的开头运行它,这样我就知道当时的种子是什么,然后将其重置为相同的种子。

我尝试了\begin{frame}\reinitrand[first=0,last=1000,seed=0]\reinitrand[first=0,last=1000,seed=0]\begin{frame}和,但它们都没有产生两次相同的数字。我尝试使用重新定义\reinitrand[first=0,last=1000,seed=0]\only<2>{Text},但我无法让它工作,而且无论如何我不明白或从概念上不知道它在做什么,也不知道我想改变什么。\only<2>{\reinitrand[first=0,last=1000,seed=0] Text}\only\def\oldonly\only\renewcommand{\only}[2]{...}\only

注意:我意识到如果只有一个,\rand我可以在框架之前存储生成的数字的值并使用存储的版本而不是在框架上生成它 - 类似下面的内容在两个 PDF 页面上产生相同的数字 - 但在实际情况中我使用一个使用\rand多次(至少两次)的命令,并且该命令在页面上被调用多次,所以这是不切实际的。

\documentclass{beamer}
\usepackage[first=0,last=1000,seed=0]{lcg}
\begin{document}
    \newcounter{myrand}
    \rand\setcounter{myrand}{\value{rand}}
    \begin{frame}
        \arabic{myrand} \only<2>{Text}
    \end{frame}
\end{document}

答案1

您还可以为 \setbox 行定义一个宏

\documentclass{beamer}
\usepackage[first=0,last=1000,seed=0]{lcg}
\newsavebox\RBox
\begin{document}
        
\sbox\RBox{\rand\arabic{rand},\rand\arabic{rand}}
\begin{frame}
        \usebox\RBox\ \only<2>{Text}
\end{frame}

\sbox\RBox{\rand\arabic{rand},\rand\arabic{rand}}
\begin{frame}
        \usebox\RBox\ \only<2>{Text}
\end{frame}

\end{document}

答案2

当时我使用了@user187802 的解决方案并将我的代码放入其中,\newsavebox因此每次包含时都会包含相同的内容。

刚才,我在思考一个涉及 的问题lcg,我刚刚意识到我忘记了它的种子初始化参数是如何工作的。事实上,seed应该是一个从 1 到 2^31-1 的数字。 放置的seed=0意思是“随机数生成器将使用时间、页码和文件的实际行进行初始化”(lcg 手册),这对于通常的情况来说是可以的,但如果我想生成两次相同的数字,我所需要做的就是seed在正确的范围内指定一个。

例如:

\documentclass{beamer}
\usepackage[first=0,last=1000,seed=0]{lcg}
\begin{document}
    \begin{frame}
        \reinitrand[first=0,last=1000,seed=123]\rand\arabic{rand},\rand\arabic{rand} \only<2>{Text}
    \end{frame}
\end{document}

为了获得比指定实际种子数更大的随机性,可以存储lcg从“时间、页码和文件的实际行”中得出的值,并将其用作种子。如下所示:

\documentclass{beamer}
\usepackage[first=0,last=1000,seed=0]{lcg}
\begin{document}
    
    \newcounter{storedseed}
    \makeatletter
    \cr@nd =  \the\time
    \advance  \cr@nd \inputlineno
    \multiply \cr@nd \value{page}
    \advance  \cr@nd \the\year
    \multiply \cr@nd \the\month
    \multiply \cr@nd \the\day
    \advance  \cr@nd \inputlineno
    \setcounter{storedseed}{\cr@nd}
    \makeatother
    
    \begin{frame}
        \reinitrand[first=0,last=1000,seed=\value{storedseed}]\rand\arabic{rand},\rand\arabic{rand} \only<2>{Text}
    \end{frame}
\end{document}

相关内容