在 beamer 中,\uncover
定义为
\newrobustcmd*{\uncover}{\alt{\beamer@fakeinvisible}{\beamer@makecovered}}
并\alt
定义为
\newrobustcmd*\alt{\@ifnextchar<{\beamer@alt}{\beamer@alttwo}}
\long\def\beamer@alttwo#1#2{\beamer@ifnextcharospec{\beamer@altget{#1}{#2}}{#1}}
\long\def\beamer@altget#1#2<#3>{%
\gdef\beamer@doifnotinframe{#2}\def\beamer@doifinframe{#1}%
\beamer@masterdecode{#3}\beamer@donow}
\long\def\beamer@alt<#1>#2#3{%
\gdef\beamer@doifnotinframe{#3}\def\beamer@doifinframe{#2}%
\beamer@masterdecode{#1}\beamer@donow}
因此,\uncover<1>{text}
扩展为
\alt{\beamer@fakeinvisible}{\beamer@makecovered}<1>{text}
进而
\beamer@alttwo{\beamer@fakeinvisible}{\beamer@makecovered}<1>{text}
进而
\beamer@ifnextcharospec{\beamer@altget{\beamer@fakeinvisible}{\beamer@makecovered}}{beamer@fakeinvisible}<1>{text}
\beamer@ifnextcharospec
定义为
\long\def\beamer@ifnextcharospec#1#2{%
\def\reserved@a{#1}%
\def\reserved@b{#2}%
\futurelet\@let@token\beamer@ifnch}
\def\beamer@ifnch{%
\ifx\@let@token<%
\let\reserved@c\reserved@a%
\else%
\let\reserved@c\reserved@b%
\fi%
\reserved@c}
但我不明白这段代码和的效果\beamer@ifnextcharospec
。
那么扩张进展如何?
答案1
\beamer@ifnextcharospec
差不多\@ifnextchar<
,但空格不会被忽略。定义:
\long\def\beamer@ifnextcharospec#1#2{%
\def\reserved@a{#1}%
\def\reserved@b{#2}%
\futurelet\@let@token\beamer@ifnch}
将<true code>
( #1
) 存储在 中,并将 存储在\reserved@a
中,然后执行。调用将存储下一个标记在 中,然后调用。 将比较您的标记与,并相应地将或分配给,然后执行后者。<false code>
\reserved@b
\futurelet
\futurelet
\@let@token
\beamer@ifnch
\beamer@ifnch
<
\reserved@a
\reserved@b
\reserved@c
随着呼叫:
\beamer@ifnextcharospec % 1
{\beamer@altget{\beamer@fakeinvisible}{\beamer@makecovered}}% 2
{beamer@fakeinvisible}% 3
<1>{text}% 4
下一个标记(第一个是第 4 行)确实是<
,因此\reserved@a
(行1
)被执行,因此您有:
\beamer@altget{\beamer@fakeinvisible}{\beamer@makecovered}
<1>{text}% 4
最后,您现在可以确定接下来的是一个<...>
-delimited 参数,因此\beamer@altget
将正确扩展:
\gdef\beamer@doifnotinframe{\beamer@makecovered}%
\def\beamer@doifinframe{\beamer@fakeinvisible}%
\beamer@masterdecode{1}%
\beamer@donow
{text}% 4