如何理解 beamer 源代码中 \uncover 的定义

如何理解 beamer 源代码中 \uncover 的定义

在 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

相关内容