参考带名称的覆盖编号

参考带名称的覆盖编号

我有两列幻灯片,左侧是 tikz 图形,右侧是条目。由于条目中的停顿,因此有 >10 个叠加,并且 tikz 图片的某些部分被相应地添加/删除/修改(使用\only<>),未覆盖的项目也是如此。

通过添加一个,很容易破解代码\pause,因为必须重写所有数字。

有没有办法(Beamer 手册第 9 章中没有提示)beamerpause在第一次发现该部分时将计数器的值分配给符号名称,类似于以下(需要多次传递才能解决)?

\begin{column}{..}
   \only</bar->{...}  % <2-> (use e.g. / to reference labels)
   \only<-/baz>{...}  % <-3>
\end{column}
\begin{column{..}
   \begin{itemize}
      \item foo \pause
      \item bar \firstUncoveredLabel{bar}\pause % assign 2 to label /bar
      \item baz \pause[baz]       % nicer syntax; assign 3 to label /baz
      \item end
   \end{itemize}
\end{column}

编辑:最小工作示例:

\documentclass{beamer}
\usepackage{tikz}
\begin{document}
   \begin{frame}
      \begin{columns}
         \begin{column}{.5\textwidth}
            \tikz{
               \draw< -3>        (0,0) grid (3,3);
               \draw<2-3>[red]   (0,0) -- (3,1);
               \draw<3- >[green] (0,0) -- (3,2);
               \draw<4  >[blue]  (0,0) -- (3,3);
            }
         \end{column}
         \begin{column}{.5\textwidth}
            \begin{itemize}
               %%%% uncomment this item and all numbers above have to be shifted :-(
               % \item important remark at the beginning \pause 
               \item grid \pause
               \item grid, red \pause
               \item grid, red, green \pause
               \item green, blue
            \end{itemize}
         \end{column}
      \end{columns}
   \end{frame}
\end{document}

这就是我的梦想(无法编译):

\documentclass{beamer}
\usepackage{tikz}
\begin{document}
   \begin{frame}
      \begin{columns}
         \begin{column}{.5\textwidth}
            \tikz{
               %% use symbolic names for overlay specificaiton
               \draw<-/gridRedGreen>                (0,0) grid (3,3);
               \draw</gridRed-/gridRedGreen>[red]   (0,0) -- (3,1);
               \draw</gridRedGreen->        [green] (0,0) -- (3,2);
               \draw</last>                 [blue]  (0,0) -- (3,3);
            }
         \end{column}
         \begin{column}{.5\textwidth}
            \begin{itemize}
               %%%% uncomment and overlays are still correct :-)
               % \item important remark at the beginning \pause 
               \item grid                \pause[grid]
               \item grid, red           \pause[gridRed]
               \item grid, red, green    \pause[gridRedGreen]
               \item green, blue      
            \end{itemize}
         \end{column}
      \end{columns}
   \end{frame}
\end{document}

答案1

以下是按名称引用覆盖的可能方法:

\makeatletter
\DeclareRobustCommand*{\savepause}[1]{\only<1>{\immediate\write\@auxout{\string\pauseentry{\the\c@framenumber}{#1}{\the\c@beamerpauses}}}}
\newcommand*{\usepause}[1]{\@ifundefined{pauses@\the\c@framenumber @#1}{1}{\@nameuse{pauses@\the\c@framenumber @#1}}}
\newcommand*{\pauseentry}[3]{\global\@namedef{pauses@#1@#2}{#3}}
\makeatother

将此代码包含在文档的前言中,即\documentclass{beamer}和之间\begin{document}。它定义了两个用户级命令,\savepause\usepause

  • \savepause{overlayname}将计数器的当前值保存beamerpausesoverlayname。在命令之前立即发出它\pause
  • \usepause{overlayname}指的是先前保存的值,因此如果您在第三个覆盖上overlayname使用,将扩展为 3。\savepause{overlayname}\usepause{overlayname}

由于值将保存到辅助文件中,因此需要至少两次 LaTeX 运行才能产生稳定的输出。

您无法\pause[overlayname]按照建议使用语法来保存值,因为可选参数beamer本身已被使用。但是,您可以定义自己的命令以方便使用:

\newcommand*{\mypause}[1]{\savepause{#1}\pause}

其用法类似\mypause{overlayname}

示例代码:

\documentclass{beamer}
\makeatletter
\DeclareRobustCommand*{\savepause}[1]{\only<1>{\immediate\write\@auxout{\string\pauseentry{\the\c@framenumber}{#1}{\the\c@beamerpauses}}}}
\newcommand*{\pauseentry}[3]{\global\@namedef{pauses@#1@#2}{#3}}
\newcommand*{\usepause}[1]{\@ifundefined{pauses@\the\c@framenumber @#1}{1}{\@nameuse{pauses@\the\c@framenumber @#1}}}
\makeatother
\usepackage{tikz}
\begin{document}
   \begin{frame}
      \begin{columns}
         \begin{column}{.5\textwidth}
            \tikz{
               %% use symbolic names for overlay specificaiton
               \draw<-\usepause{gridRedGreen}>                (0,0) grid (3,3);
               \draw<\usepause{gridRed}-\usepause{gridRedGreen}>[red]   (0,0) -- (3,1);
               \draw<\usepause{gridRedGreen}->        [green] (0,0) -- (3,2);
               \draw<\usepause{last}>                 [blue]  (0,0) -- (3,3);
            }
         \end{column}
         \begin{column}{.5\textwidth}
            \begin{itemize}
               %%%% uncommented and overlays are still correct :-)
               \item important remark at the beginning \pause 
               \item grid                \savepause{grid}\pause
               \item grid, red           \savepause{gridRed}\pause
               \item grid, red, green    \savepause{gridRedGreen}\pause
               \item green, blue      
            \end{itemize}
         \end{column}
      \end{columns}
  \savepause{last} 
  \end{frame}
\end{document}

两次 LaTeX 运行后的输出(单击图像可查看其完整尺寸):

示例代码的输出(五帧)

相关内容