如何使用 Tikz 节点制作投影仪覆盖

如何使用 Tikz 节点制作投影仪覆盖

我的投影仪幻灯片中有 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,请参阅pgfkeysTikZ-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}

笔记:

  1. 我发现这\renewcommand<>不起作用,可能是因为我让\tikzset接受两个参数 - 因此让它像\alt而不是 一样工作\only。这是为了避免对未知键的投诉。另一种方法是定义一个空样式,比如highlightOn在开始时,然后在第 2 帧\tikzset上映射到highlightOnhighlight而对其他帧不执行任何操作。这将适用于\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}}
    
  2. 也许真正优雅的方法是使用代码处理程序定义一个新键“highlight on=”。但我刚刚才知道有这个功能,所以我将这个解决方案留给别人。

相关内容