我的投影仪幻灯片中有 4 个节点的图。
\begin{figure}[h]
\begin{centering}
\begin{tikzpicture}[system/.style={draw,rectangle,rounded corners=3,minimum width=2cm,text width=1.8cm,text centered}]
\node [system] (fe) {Feature Extraction};
\node [system] (am) [right=of fe] {Acoustic Model};
\node [system] (lm) [right=of am] {Language Model};
\node [system] (d) [below=of lm] {Decoder};
\draw[->] (fe) |- (am);
\draw[->] (am) |- (d);
\draw[->] (lm) -- (d.north);
\end{tikzpicture}
\end{centering}
\end{figure}
我怎样才能在第二张幻灯片中“突出显示”其中一个节点,就像我<alert@n>
对列表中的项目所做的那样?
我所说的突出显示是指例如赋予颜色和加粗线条。
答案1
我以前都是按照 Andrew 的解决方案来做的,直到我读到他的笔记 #2,它提醒我 PGF 的键几乎可以做任何事情。关键(请原谅我的双关语)是创建一个键,该键根据幻灯片编号来处理其他键:
\tikzset{onslide/.code args={<#1>#2}{%
\only<#1>{\pgfkeysalso{#2}}
}}
使用\pgfkeysalso
不会重置当前键路径,而\pgfkeys
或\tikzset
则会。.code args
键处理程序意味着
onslide=<overlay specification>{keys}
导致以下代码被扩展:
\only<overlay specification>{\pgfkeysalso{keys}}
然后,您可以使用该键onslide=<overlay specification>{keys}
仅在特定幻灯片上设置键。略显不雅观的是,如果您的覆盖规范包含逗号,则必须包含整个覆盖规范和键对。
这是一个完整的例子:
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{onslide/.code args={<#1>#2}{%
\only<#1>{\pgfkeysalso{#2}} % \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
}}
\tikzstyle{highlight}=[red,ultra thick]
\begin{document}
\begin{frame}
\begin{figure}[h]
\begin{centering}
\begin{tikzpicture}[
system/.style={draw,rectangle,rounded corners=3,minimum width=2cm,text width=1.8cm,text centered},
node distance=2cm
]
\node [system,onslide=<3->{highlight},anchor=center] (fe) {Feature Extraction};
\node [system,onslide={<2,4>{green}}] (am) [right=of fe.center] {Acoustic Model};
\node [system,temporal=<3>{blue}{highlight}{green}] (lm) [right=of am.center] {Language Model};
\node [system] (d) [below=of lm.center] {Decoder};
\draw[->] (fe) |- (am);
\draw[->] (am) |- (d);
\draw[->] (lm) -- (d.north);
\end{tikzpicture}
\end{centering}
\end{figure}
\end{frame}
\end{document}
使用线条粗细键时,图片会抖动,这会让你感到失望。你可能必须避免相对定位才能消除这种情况。
有关诸如 之类的密钥处理程序的更多信息.code args
,请参阅pgfkeys
TikZ-PGF 手册部分。
答案2
有几种方法可以做到这一点,具体哪种方法最好取决于您想要的突出显示效果。一种方法是使用两种样式的单独节点,然后在一张幻灯片上显示一种样式,在另一张幻灯片上显示另一种样式。另一种方法是定义一种包裹在 中的样式\only
。实际上,使用 beamer 的 重新实现\newcommand
,可以实现\tikzset
叠加感知。以下是几种可能性:
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{positioning}
\newcommand<>{\btikzset}[2]{\alt#3{\tikzset{#1}}{\tikzset{#2}}}
\tikzset{highlight/.style={red,fill=green,text=blue}}
\begin{document}
\begin{frame}
\begin{figure}[h]
\begin{centering}
\begin{tikzpicture}[system/.style={draw,rectangle,rounded corners=3,minimum width=2cm,text width=1.8cm,text centered}]
\node [system] (fe) {Feature Extraction};
\node<1> [system] (am) [right=of fe] {Acoustic Model};
\node<2> [system,highlight] (am) [right=of fe] {Acoustic Model};
\node [system] (lm) [right=of am] {Language Model};
\node [system] (d) [below=of lm] {Decoder};
\draw[->] (fe) |- (am);
\draw[->] (am) |- (d);
\draw[->] (lm) -- (d.north);
\end{tikzpicture}
\end{centering}
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}[h]
\begin{centering}
\begin{tikzpicture}[system/.style={draw,rectangle,rounded corners=3,minimum width=2cm,text width=1.8cm,text centered}]
\btikzset<2>{highlighton2/.style={highlight}}{highlighton2/.style={}}
\node [system] (fe) {Feature Extraction};
\node [system,highlighton2] (am) [right=of fe] {Acoustic Model};
\node [system] (lm) [right=of am] {Language Model};
\node [system] (d) [below=of lm] {Decoder};
\draw[->] (fe) |- (am);
\draw[->] (am) |- (d);
\draw[->] (lm) -- (d.north);
\end{tikzpicture}
\end{centering}
\end{figure}
\end{frame}
\end{document}
笔记:
我发现这
\renewcommand<>
不起作用,可能是因为我让\tikzset
接受两个参数 - 因此让它像\alt
而不是 一样工作\only
。这是为了避免对未知键的投诉。另一种方法是定义一个空样式,比如highlightOn
在开始时,然后在第 2 帧\tikzset
上映射到highlightOn
,highlight
而对其他帧不执行任何操作。这将适用于\renewcommand<>
:\renewcommand<>{\tikzset}[1]{\only#2{\beameroriginal{\tikzset}{#1}}} \tikzset{highlight/.style={red,fill=green,text=blue}} \tikzset{highlighton2/.style={}}
然后在框架中:
\tikzset<2>{highlighton2/.style={highlight}}
也许真正优雅的方法是使用代码处理程序定义一个新键“highlight on=”。但我刚刚才知道有这个功能,所以我将这个解决方案留给别人。