虽然beamer
手册中没有明确说明,但我认为<+>
覆盖规范的意思是“仅限当前幻灯片”。我现在正在用 编写一个相当复杂的幻灯片,beamer
但我被 的确切语义所困扰<+>
。这是我的尝试,它似乎对普通文本很有效,但之后就搞砸了:
\PassOptionsToPackage{usenames,dvipsnames}{xcolor}
\documentclass{beamer}
\usepackage{listings,tikz}
\lstset{
basicstyle=\scriptsize\ttfamily,
tabsize=2,
extendedchars=true,
breaklines=true,
keywordstyle=\color{RoyalBlue}\textbf,
commentstyle=\color{ForestGreen},
stringstyle=\color{WildStrawberry}\ttfamily,
escapechar=`
}
\newcommand\M[1]{\tikz[overlay,remember picture]{\node[yshift=0.7ex](#1){};}}
\newcommand\PC[1]{\tikz[overlay,remember picture]{\node[circle,inner sep=2pt,fill=red!50] at (#1) {};}}
\begin{document}
\begin{frame}[fragile]\frametitle{Program}
\begin{lstlisting}[language=pascal]
Program My;
VAR
one, two: Integer;
Begin `\M{pc1}`
one := 1; `\M{pc2}`
two := 2; `\M{pc3}`
one := one + two; `\M{pc4}`
two := two + one; `\M{pc5}`
end. `\M{pc6}`
\end{lstlisting}
\uncover<+>{One}%
\uncover<+>{Two}%
\uncover<+>{Three}%
\uncover<+>{Four}%
\begin{uncoverenv}<+->\PC{pc1}\end{uncoverenv}%
\begin{uncoverenv}<+->\PC{pc2}\end{uncoverenv}%
\begin{uncoverenv}<+->\PC{pc3}\end{uncoverenv}%
\begin{uncoverenv}<+>\PC{pc4}\end{uncoverenv}% Note that we use <+> here, not <+->
\begin{uncoverenv}<+->\PC{pc5}\end{uncoverenv}%
\begin{uncoverenv}<+->\PC{pc6}\end{uncoverenv}%
\uncover<+->{After}%
\end{frame}
\end{document}
这是我得到的结果(见附件的动图)
- 文本“一”、“二”等按预期显示;每张幻灯片一个。
- 程序计数器 1-3 按预期显示,从当前幻灯片到结尾。
- 程序计数器 4 显示并消失(如预期的那样?)
- 程序计数器 5-6 从未出现。
硬编码数字也会出现类似的问题,例如以下输入:
\PassOptionsToPackage{usenames,dvipsnames}{xcolor}
\documentclass{beamer}
\usepackage{listings,tikz}
\lstset{
basicstyle=\scriptsize\ttfamily,
tabsize=2,
extendedchars=true,
breaklines=true,
keywordstyle=\color{RoyalBlue}\textbf,
commentstyle=\color{ForestGreen},
stringstyle=\color{WildStrawberry}\ttfamily,
escapechar=`
}
\newcommand\M[1]{\tikz[overlay,remember picture]{\node[yshift=0.7ex](#1){};}}
\newcommand\PC[1]{\tikz[overlay,remember picture]{\node[inner sep=1pt,circle,radius=2pt,fill=red!50] at (#1) {};}}
\begin{document}
\begin{frame}[fragile]\frametitle{Program}
\begin{lstlisting}[language=pascal]
Program My;
VAR
one, two: Integer;
Begin `\M{pc1}`
one := 1; `\M{pc2}`
two := 2; `\M{pc3}`
one := one + two; `\M{pc4}`
two := two + one; `\M{pc5}`
end. `\M{pc6}`
\end{lstlisting}
\uncover<+>{One}%
\uncover<+>{Two}%
\uncover<+>{Three}%
\uncover<+>{Four}%
\uncover<5-6>{\PC{pc1}}
\uncover<6-6>{\PC{pc2}}
\uncover<7-7>{\PC{pc3}}
\uncover<8-8>{\PC{pc4}}
\uncover<9>{\PC{pc5}}
\uncover<10>{\PC{pc6}}
\uncover<11>{After}%
\end{frame}
\end{document}
输出如下所示:
然而,这真的很奇怪,当我使用普通的覆盖规范时,问题不存在<+->
,如beamer
手册中所述。也就是说,如果我写
\PassOptionsToPackage{usenames,dvipsnames}{xcolor}
\documentclass{beamer}
\usepackage{listings,tikz}
\lstset{
basicstyle=\scriptsize\ttfamily,
tabsize=2,
extendedchars=true,
breaklines=true,
keywordstyle=\color{RoyalBlue}\textbf,
commentstyle=\color{ForestGreen},
stringstyle=\color{WildStrawberry}\ttfamily,
escapechar=`
}
\newcommand\M[1]{\tikz[overlay,remember picture]{\node[yshift=0.7ex](#1){};}}
\newcommand\PC[1]{\tikz[overlay,remember picture]{\node[inner sep=1pt,circle,radius=2pt,fill=red!50] at (#1) {};}}
\begin{document}
\begin{frame}[fragile]\frametitle{Program}
\begin{lstlisting}[language=pascal]
Program My;
VAR
one, two: Integer;
Begin `\M{pc1}`
one := 1; `\M{pc2}`
two := 2; `\M{pc3}`
one := one + two; `\M{pc4}`
two := two + one; `\M{pc5}`
end. `\M{pc6}`
\end{lstlisting}
\uncover<+>{One}%
\uncover<+>{Two}%
\uncover<+>{Three}%
\uncover<+>{Four}%
\uncover<+->{\PC{pc1}}
\uncover<+->{\PC{pc2}}
\uncover<+->{\PC{pc3}}
\uncover<+->{\PC{pc4}}
\uncover<+->{\PC{pc5}}
\uncover<+->{\PC{pc6}}
\uncover<11>{After}%
\end{frame}
\end{document}
我得到:
答案1
事实证明,它<+>
确实指的是单张幻灯片,并且没有任何副作用。我所看到的很可能是 TeX live 软件包中的一个错误。我在 2013 年 11 月的某个时候安装了我的版本。今天(2014 年 1 月 19 日)更新后,问题解决了。