![在 beamer 中使用 overlayarea 时修复坐标](https://linux22.com/image/413055/%E5%9C%A8%20beamer%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20overlayarea%20%E6%97%B6%E4%BF%AE%E5%A4%8D%E5%9D%90%E6%A0%87.png)
在此示例中,我使用幻灯片来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}