我正在 Beamer 中制作演示文稿,我有一个 tikz 流程图,我想在演示文稿中处理完图表上的一个块后重复该流程图。为了让用户在视觉上更容易理解,我想突出显示我将要讨论的下一个块,并使已经讨论过的块变暗。
我弄清楚了如何为应该突出显示的块创建警报样式。以下是我的代码。
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,positioning}
\usepackage{xcolor}
\definecolor{uablue}{RGB}{0,61,100}
\colorlet{uablue100}{uablue}
\colorlet{uablue75} {uablue!75!white}
\colorlet{uablue50} {uablue!50!white}
\colorlet{uablue25} {uablue!25!white}
\colorlet{uablue10} {uablue!10!white}
\colorlet{uablue5} {uablue!5!white}
\definecolor{uared}{RGB}{126,0,47}
\colorlet{uared100}{uared}
\colorlet{uared75} {uared!75!white}
\colorlet{uared50} {uared!50!white}
\colorlet{uared25} {uared!25!white}
\colorlet{uared10} {uared!10!white}
\colorlet{uared5} {uared!5!white}
\begin{document}
\begin{frame}
\label{overview}
\frametitle{Overview}
\begin{figure}
\centering
\tikzstyle{block} = [rectangle, draw, fill=blue!25,text width=4em, text centered, rounded corners, minimum height=2em, line width=1pt ]
\tikzstyle{line} = [draw, -latex', line width=1pt]
\tikzstyle{alert} = [text=red, fill=red!25, draw=red]
\begin{tikzpicture}[node distance = 2cm, auto]
% Place nodes
\node [block, alert] (client) {Web Client};
\node [block, right of=client, node distance=3cm] (python) {Python Service};
\node [block, right of=python, node distance=3cm] (wavefront) {Wavefront};
\node [block, above of=wavefront] (AMCL) {AMCL};
\node [block, below of=wavefront] (VFH) {VFH};
% Draw edges
\path [line] (client) -> (python);
\path [line] (python) -> (client);
\path [line] (python) -- (wavefront);
\path [line] (wavefront) -- (AMCL);
\path [line] (AMCL) -- (python);
\path [line] (wavefront) -- (VFH);
\end{tikzpicture}
\end{figure}
\end{frame}
\end{document}
因此,我的想法是,我只定义一次 tikzfigure,当我使用时,\againframe
我可以选择应该突出显示哪个块以及应该使哪个块变暗。我看过其他示例,但他们希望在连续的帧中突出显示不同的部分。我使用这个框架作为我的“概览框架”
编辑:我有我的概览框架,然后是一些其他框架,然后我想再次重复我的概览框架并使用\againframe
并选择不同的块来突出显示。
谢谢!
答案1
您可以调整此答案以如何使用 Tikz 节点制作投影仪覆盖:
\tikzset{onslide/.code args={<#1>#2}{%
\only<#1>{\pgfkeysalso{#2}} % \pgfkeysalso doesn't change the path
}}
\tikzset{alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
}}
\tikzset{temporal/.code args={<#1>#2#3#4}{%
\temporal<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}{\pgfkeysalso{#4}} % \pgfkeysalso doesn't change the path
}}
例如,这允许您将temporal=<overlay specification>{before}{during}{after}
键值列表放入 TikZ 命令中的任何位置。 onslide
工作方式与\only
我包括的一样\alt
,以完善集合。
完整代码如下:
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows}
\usepackage{xcolor}
\definecolor{uablue}{RGB}{0,61,100}
\colorlet{uablue100}{uablue}
\colorlet{uablue75} {uablue!75!white}
\colorlet{uablue50} {uablue!50!white}
\colorlet{uablue25} {uablue!25!white}
\colorlet{uablue10} {uablue!10!white}
\colorlet{uablue5} {uablue!5!white}
\definecolor{uared}{RGB}{126,0,47}
\colorlet{uared100}{uared}
\colorlet{uared75} {uared!75!white}
\colorlet{uared50} {uared!50!white}
\colorlet{uared25} {uared!25!white}
\colorlet{uared10} {uared!10!white}
\colorlet{uared5} {uared!5!white}
\tikzset{onslide/.code args={<#1>#2}{%
\only<#1>{\pgfkeysalso{#2}} % \pgfkeysalso doesn't change the path
}}
\tikzset{alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
}}
\tikzset{temporal/.code args={<#1>#2#3#4}{%
\temporal<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}{\pgfkeysalso{#4}} % \pgfkeysalso doesn't change the path
}}
\begin{document}
\begin{frame}<1>[label=overview]
\frametitle{Overview}
\begin{figure}
\centering
\tikzstyle{block} = [rectangle, draw, fill=uablue25,
text width=4em, text centered, rounded corners, minimum height=2em, line width=1pt ]
\tikzstyle{line} = [line width=1pt, -triangle 45]
\tikzstyle{alert} = [text=uared100, fill=uared25, draw=uared100]
\tikzstyle{dim} = [text=uablue25, fill=uablue5, draw=uablue25]
\begin{tikzpicture}[node distance=1.5cm, auto]
% Place nodes
\node [block,onslide=<2->{dim}] (client) {Web Client};
\node [block,onslide=<2->{dim}] (python) [right of=client, node distance=3cm] {Python Service};
\node [block,onslide=<2->{dim}] (wavefront) [right of=python, node distance=3cm] {Wavefront};
\node [block,onslide=<2->{dim}] (AMCL) [above of=wavefront] {AMCL};
\node [block,temporal=<2>{}{alert}{dim}] (VFH) [below of=wavefront] {VFH};
\node [block,onslide=<2->{dim}] (laser) [above right=0.5cm and 1.2cm of AMCL] {Laser};
\node [block,onslide=<2->{dim}] (dash7) [right of=AMCL, node distance=3cm] {DASH7};
\node [block,onslide=<2->{dim},temporal=<3>{}{alert}{dim}] (robot) [right of=wavefront, node distance=3cm] {Robot};
% Draw edges
\draw [line] (client.east) -> (python.west);
\draw [line] (python) -> (client);
\draw [line] (python) -- (wavefront);
\draw [line] (AMCL) -- (wavefront);
\draw [line] (AMCL) edge[out=180,in=90] (python);
\draw [line] (python) edge[out=270,in=180] (VFH);
\draw [line] (wavefront) -- (VFH);
\draw [line] (laser) -> (AMCL);
\draw [line] (dash7) -> (AMCL);
\draw [line] (robot) -> (AMCL);
\draw [line] (VFH) edge[out=0,in=270] (robot);
\end{tikzpicture}
\end{figure}
\end{frame}
\begin{frame}{Introductory stuff}
\begin{itemize}[<+->]
\item Stuff
\item Stuff
\item Stuff
\item Stuff
\end{itemize}
\end{frame}
\againframe<2>{overview}
\begin{frame}{Stuff about VFH}
\begin{itemize}[<+->]
\item Stuff
\item Stuff
\item Stuff
\item Stuff
\item Stuff
\end{itemize}
\end{frame}
\againframe<3>{overview}
\begin{frame}{Stuff about Robot}
\begin{itemize}[<+->]
\item Stuff
\item Stuff
\item Stuff
\end{itemize}
\end{frame}
\end{document}