在 beamer 中使用 overlayarea 时修复坐标

在 beamer 中使用 overlayarea 时修复坐标

在此示例中,我使用幻灯片来overlayarea制作tikz图片:

\documentclass{beamer}
\usepackage{tikz}
\begin{document}
\begin{frame}
    \begin{overlayarea}{\linewidth}{0.9\paperheight}
      \centering
      \begin{tikzpicture}
        \draw[red, very thick](0, 0) -- (3, 0);
        \only<1>{
          \draw(-1, 1) -- (2, 1);
        }
        \only<2>{
          \draw(-2, 2) -- (1, 2);
        }
      \end{tikzpicture}
    \end{overlayarea}
  \end{frame}
\end{document}

不幸的是,坐标系在每张幻灯片上都会重新调整,红色粗锚线的跳跃就是明证:

在此处输入图片描述

使用时如何在每张幻灯片上使用相同的坐标overlayarea

答案1

以下是一种(诚然有些粗制滥造的)风格,基于这个帖子,记录图片的边界框,需要一个像这样的标识符A。密钥recycle bounding box=<identifier>会将边界框记录到辅助文件中,以便在第二次运行中恢复它。

\documentclass{beamer}
\usepackage{tikz}
\makeatletter
\tikzset{recycle bounding box/.style={%
execute at end picture={%
\immediate\write\@mainaux{\xdef\string\figbb@#1{%
(\the\pgf@picminx,\the\pgf@picminy) rectangle (\the\pgf@picmaxx,\the\pgf@picmaxy)}\relax}},
execute at begin picture={%
\ifcsname figbb@#1\endcsname
 \edef\figbb{\csname figbb@#1\endcsname}
 \path \figbb;
\fi}}}
\makeatother
\begin{document}
\begin{frame}[t]
      \begin{tikzpicture}[recycle bounding box=A]%<- A is an identifier
        \draw[red, very thick](0, 0) -- (3, 0);
        \only<1>{
          \draw(-1, 1) -- (2, 1);
        }
        \only<2>{
          \draw(-2, 2) -- (1, 2);
        }
      \end{tikzpicture}
  \end{frame}
\end{document}

在此处输入图片描述

如果您有几张图片,您想要记录其边界框,则需要为每张图片赋予一个唯一的标识符。在这方面,这就像eqparbox包一样工作。就像eqparbox您需要运行两次一样。(提醒自己:这种风格对于动画非常有用。)

overlay您还可以在模式下绘制图片

\documentclass{beamer}
\usepackage{tikz}
\begin{document}
\begin{frame}
      \begin{tikzpicture}[overlay,remember picture,shift={(current page.center)}]
        \draw[red, very thick](0, 0) -- (3, 0);
        \only<1>{
          \draw(-1, 1) -- (2, 1);
        }
        \only<2>{
          \draw(-2, 2) -- (1, 2);
        }
      \end{tikzpicture}
  \end{frame}
\end{document}

在此处输入图片描述

这种方法的问题在于我们需要手动添加shift。这个问题的另一种解读是

使用\path[use as bounding box] ....

如同

\documentclass{beamer}
\usepackage{tikz}
\begin{document}
\begin{frame}
    \begin{overlayarea}{\linewidth}{0.9\paperheight}
      \centering
      \begin{tikzpicture}
        \path[use as bounding box] (-4,-2) rectangle (4,3);
        \draw[red, very thick](0, 0) -- (3, 0);
        \only<1>{
          \draw(-1, 1) -- (2, 1);
        }
        \only<2>{
          \draw(-2, 2) -- (1, 2);
        }
      \end{tikzpicture}
    \end{overlayarea}
  \end{frame}
\end{document}

在此处输入图片描述

缺点是我们需要bounding box手动修复。答案开头的 hack 可以避免这种情况。

我个人使用这个overlay-beamer-styles库。这样,您只需使路径不可见,但保留它们,以使边界框不会改变。

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{overlay-beamer-styles}
\begin{document}
\begin{frame}
    \begin{overlayarea}{\linewidth}{0.9\paperheight}
      \centering
      \begin{tikzpicture}
        \draw[red, very thick](0, 0) -- (3, 0);
          \draw[visible on=<1>](-1, 1) -- (2, 1);
          \draw[visible on=<2>](-2, 2) -- (1, 2);
      \end{tikzpicture}
    \end{overlayarea}
  \end{frame}
\end{document}

在此处输入图片描述

您可以引入快捷方式:

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{overlay-beamer-styles}
\begin{document}
\begin{frame}[t]
\frametitle{Some title}
      \centering% the number of # depends on whether or not you add these
      % definitions in the frame and whether or not your frame is `fragile`.
      \begin{tikzpicture}[vo/.style={visible on=<####1>}]
        \draw[red, very thick](0, 0) -- (3, 0);
          \draw[vo={1}](-1, 1) -- (2, 1);
          \draw[vo={2}](-2, 2) -- (1, 2);
      \end{tikzpicture}
\end{frame}
\end{document}

相关内容