TikZ
我有一个关于在 中发现路径段的问题Beamer
?作为一个简单的示例,考虑以下由水平段和垂直段组成的路径。
\begin{tikzpicture}
\draw(0,0)--(1,0)--(1,1);
\end{tikzpicture}
在幻灯片上,我想先显示水平段,然后显示垂直段。实现此目的的一种方法是:
\begin{tikzpicture}
\draw<1->(0,0)--(1,0);
\draw<2->(1,0)--(1,1);
\end{tikzpicture}
但是,这会产生两个不相交的线段(如果放大点,就会很明显(1,0)
)。有没有其他方法可以将这两个线段显示为连接的路径,而不是两条不相交的线?
答案1
不幸的是,评论中的“相关”问题和链接问题仅涉及不在同一条路径上的内容。
手动解决方案
创建两条路径,其中第二个(较长的)仅在第二张幻灯片中被发现。
\visible<1>{\draw(0,0)--(1,0);}
\visible<2->{\draw(0,0)--(1,0)--(1,1);}
我们可以使用第一个\draw
,\visible
因为它只是被过度绘制,但也许你想再次玩弄opacity
或隐藏一些东西。
更好的(?)解决方案
line to
将第一张幻灯片中的更改为move to
(更好的是just leave me alone but use the correct bounding box so that the picture doesn't jump around
,但在这种情况下它可以正常工作)†。
在这个特定的最小例子中,beamer
当我们仅使用时,并不知道有第二张幻灯片onslide=<1>
,所以我们需要澄清这一点。
变体 A
将第二个(及后续)操作指定为line to
或空作为默认to
路径line to
(又名--
)。
变体 B
以某种方式创建第二张幻灯片(\only<2>{}
),再次利用默认to
是一项line to
操作的事实。
更好
创建一个结合隐藏和显示的 TikZ 风格。
hideshow/.style args={<#1><#2>#3}{%
onslide=<#1>{move to},
onslide=<#2>{#3}
}
代码
\documentclass{beamer}
\usepackage{tikz}
\tikzset{
onslide/.code args={<#1>#2}{% http://tex.stackexchange.com/a/6155/16595
\only<#1>{\pgfkeysalso{#2}}
},
hideshow/.style args={<#1><#2>#3}{%
onslide=<#1>{move to},
onslide=<#2>{#3}
}
}
\begin{document}
\begin{frame}% manual
\begin{tikzpicture}[scale=5,very thick]
\visible<1>{\draw(0,0)--(1,0);}
\visible<2->{\draw(0,0)--(1,0)--(1,1);}
\end{tikzpicture}
\end{frame}
\begin{frame}% "better" A
\begin{tikzpicture}[scale=5,very thick]
\draw(0,0)--(1,0) to[onslide=<1>{move to},onslide=<2>{}] (1,1);% or onslide=<2>{line to}
\end{tikzpicture}
\end{frame}
\begin{frame}\only<2>{}% "better" B
\begin{tikzpicture}[scale=5,very thick]
\draw(0,0)--(1,0) to[onslide=<1>{move to}] (1,1);
\end{tikzpicture}
\end{frame}
\begin{frame}% "better-er"
\begin{tikzpicture}[scale=5,very thick]
\draw(0,0)--(1,0) to[hideshow=<1><2>{}] (1,1);
\end{tikzpicture}
\end{frame}
\end{document}
输出(裁剪)
†显然这样的键是不需要的,请参见以下代码的输出:
\documentclass[beamer]{standalone}
\usepackage{tikz}
\tikzset{
onslide/.code args={<#1>#2}{
\only<#1>{\pgfkeysalso{#2}}
},
hideshow/.style args={<#1><#2>#3}{%
onslide=<#1>{move to},
onslide=<#2>{#3}
}
}
\begin{document}
\begin{frame}
\begin{tikzpicture}[scale=5,very thick]
\draw[line width=1cm,line join=round](0,0)--(1,0) to[hideshow=<1><2->{}] (1,1);
\end{tikzpicture}
\end{frame}
\end{document}
答案2
下面的代码展示了如何使用装饰库在几个 beamer 框架中一步步绘制路径。我混合了杰克的回答到如何为路径制作动画或如何绘制复杂但线性路径的起始部分?path
并显示在叠加绘图的可能性Prim 算法例如TeXample.net。
完整代码如下
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{decorations}
% A simple empty decoration, that is used to ignore the last bit of the path
\pgfdeclaredecoration{ignore}{final}
{
\state{final}{}
}
% Declare the actual decoration.
\pgfdeclaremetadecoration{middle}{initial}{
\state{initial}[
width={0pt},
next state=middle
]
{\decoration{moveto}}
\state{middle}[
width={\pgfdecorationsegmentlength*\pgfmetadecoratedpathlength},
next state=final
]
{\decoration{curveto}}
\state{final}
{\decoration{ignore}}
}
% Create a key for easy access to the decoration
\tikzset{middle segment/.style={decoration={middle},decorate, segment length=#1}}
\begin{document}
\begin{frame}
\begin{tikzpicture}
\node[fill=blue!15,draw] at (0,0) (a) {A};
\node[fill=blue!15,draw] at (2,2) (b) {B};
\foreach \pos in {0.25,0.5,0.75,1}
\path<+->[draw, middle segment=\pos, thick, red] (a) -| (b);
\end{tikzpicture}
\end{frame}
\end{document}
结果(在我学习如何制作动画 gif 时的一个复合图中)是
由于查看器的渲染问题,此处前两帧显示出不同的厚度。