7

这就是我想要做的

    \begin{tikzpicture}
    [node distance = 1cm, auto,font=\footnotesize,
    % STYLES
    every node/.style={node distance=1.3cm},
    comment/.style={rectangle, inner sep= 5pt, text width=4cm, node distance=0.25cm, font=},
    module/.style={rectangle, drop shadow, draw, fill=black!10, inner sep=5pt, text width=3cm, text badly centered, minimum height=0.8cm, font=\bfseries\footnotesize\sffamily,rounded corners},
    selected/.style={fill=red!40}]

    \node [module] (nodeA) {node A};
    \node [module, below of=nodeA] (nodeA) {node B};

    \only<1>{
      \node [comment, text width=6cm, right=0.25 of nodeA] {short description of Node A};
      \node [comment, text width=6cm, right=0.25 of nodeB] {short description of Node B};
     }

    \only<2>{
      \node [selected] (nodeA) {};
      \node [comment, text width=6cm, right=0.25 of nodeA] {long description of node A};
    }
    \only<3>{
      \node [selected] (nodeB) {};
      \node [comment, text width=6cm, right=0.25 of nodeA] {long description of node B};
    }
    \end{tikzpicture}

问题是

      \node [selected] (nodeB) {};

创建一个新节点,但我希望它为现有节点应用样式。有什么办法吗?

当然,我可以拥有处于选中状态和未选中状态的每个节点的副本,但我真的想要一个正常的解决方案。

4

4 回答 4

4

我不认为您可以按照您想要的方式执行此操作(假设我正确理解了这个问题),因为一旦绘制了节点,就无法更改其外观。我建议使用 Beamer 的\alt宏:

\alt<2>{\node[module,selected] at (nodeA) {node A};}{\node[module] at (nodeA) {node A};}
\alt<3>{\node[module,selected] at (nodeB) {node B};}{\node[module] at (nodeB) {node B};}
\node[comment,text width=6cm,right=0.25 of nodeA]{\alt<2>{short description}{long description}};
\node[comment,text width=6cm,right=0.25 of nodeB]{\alt<3>{short description}{long description}};

或者类似的东西(你可能需要修改分号才能让它工作,我目前无法测试)。

另一种选择是实际上只绘制一个新节点。如果你包括

\node[module,selected] at (nodeA) {node A};

在里面\only<2>,这将在节点A的相同位置绘制一个看起来像节点A的节点,除了红色背景之外。新节点将覆盖原始节点A。

于 2010-06-05T06:40:10.860 回答
3

有时,为了避免重复,做这样的事情可能会很好:

% #1    Overlay specs.
% #2    Style name.
% #4    Style properties.
\def\onlystyle<#1>#2#3{%
    \alt<#1>{%
        \tikzset{#2/.style = {#3}}
    }{%
        \tikzset{#2/.style = {}}
    }%
}

然后,如果你把它放在一个框架内:

\onlystyle<2>{selected}{fill = red}

该样式selectedfill = red在动画的第二张幻灯片上定义,并且在所有其他幻灯片上都没有任何影响。然后,您可以编写一个可读的图形,例如:

\begin{tikzpicture}
    \node           at (0, 0) {A};
    \node[selected] at (1, 0) {B};
    \node           at (2, 0) {C};
\end{tikzpicture}

并且“B”节点将在第二张幻灯片上突出显示。这样,您不必复制粘贴大量节点定义。当然,它不能适用于每一个动画需求,但我喜欢将这种技术保留在我的袖子里。

于 2017-12-12T16:10:46.263 回答
3

我发现了另一种解决方案,与以前的所有解决方案(包括我之前发布的解决方案)相比,它具有优势(更多功能!)。

首先我提到了改进的解决方案,然后我解释了为什么它实际上比所有其他解决方案显示了更多的功能。

以下解决方案改编自How can I make Beamer overlays with TikZ node attributes? ,使用一个额外的 tikz 库,并为幻灯片编号相关属性使用一个参数(当然,对于幻灯片编号)。请注意,现在必须在框架外完成 tikz 设置。

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{overlay-beamer-styles}
\begin{document}

\begin{frame}{With code/node duplication (explicit frame numbers)}
  \begin{tikzpicture}
  [every node/.style={draw,circle},
   redStyle/.style={fill=red},
   blueStyle/.style={fill=blue}]
   
  \node<1> [] (A) {A};          % no style
  \node<2> [redStyle]  (A) {A}; % red style
  \node<3> [blueStyle] (A) {A}; % blue style

  \node [right of=A] (B) {B};
  \draw [-latex] (A) -- (B) ;
  \end{tikzpicture}
\end{frame}


\tikzset{
  every node/.style={draw,circle},
  redStyle/.style={fill=red},     redStyle on/.style={alt=#1{redStyle}{}},
  blueStyle/.style={fill=blue}, blueStyle on/.style={alt=#1{blueStyle}{}}}
\begin{frame}{\textbf{Without} code/node duplication (explicit frame numbers)}
  \begin{tikzpicture}
  \node [redStyle on=<2>,blueStyle on=<3>] (A) {A};   
  \node [right of=A] (B) {B};
  \draw [-latex] (A) -- (B) ;
  \end{tikzpicture}
\end{frame}


\tikzset{
  every node/.style={draw,circle},
  redStyle/.style={fill=red},     redStyle on/.style={alt=#1{redStyle}{}},
  blueStyle/.style={fill=blue}, blueStyle on/.style={alt=#1{blueStyle}{}}}
\begin{frame}{\textbf{Without} code/node duplication (relative frame numbers)}
  \begin{tikzpicture}
  \node [redStyle on=<+(1)>,blueStyle on=<+(1)>] (A) {A};   
  \node [right of=A] (B) {B};
  \draw [-latex] (A) -- (B) ;
  \end{tikzpicture}
\end{frame}

\end{document}

现在解释为什么这个解决方案是迄今为止最好提到的,即它具有哪些附加功能以及它们为什么(或何时)相关。好吧,仅仅是因为相应的属性不必在同一帧内以不同的用法显示在相同的幻灯片编号上。简单的例子:

假设您有一个简单的树,即具有连接它们的有向边的节点。假设您想在特定幻灯片中使某些边缘变粗。当然你有多个边缘,所以很明显它们不会同时变得粗体!一些边缘在帧编号 m 到 n 处变粗,其他边缘在 x 和 y 处变粗。现在可以使用节点(或边缘,在这种情况下)属性timedBold on=<m-n>timedBold on=<x,y>.

于 2020-08-18T06:08:53.160 回答
0

请注意,还有另一种可能性,对我来说这似乎比前两个建议好一点,因为它的代码重复更少(与 David Z 的解决方案相比),而且因为(与 Alice M. 的解决方案相比)你没有需要定义一个必须在框架之外定义的新命令(尽管定义这个附加命令对任何人来说可能都不是问题)。原则上,以下建议似乎与 Alice M 的建议密切相关。

无论如何,解决方案是直接应用How to modify a node in TikZ when using beamer's overlays

基本上只是根据帧号重新定义样式。请参阅以下最小示例,第二帧或第三帧。(我重新做了最小示例,因为我认为给定的示例非常复杂;它当然不是最小示例,也不能单独工作。)

\documentclass{beamer}
\usepackage{tikz}
\begin{document}

\begin{frame}{With code/node duplication (explicit frame numbers)}
  \begin{tikzpicture}
  [every node/.style={draw,circle},
   redStyle/.style={fill=red},
   blueStyle/.style={fill=blue}]
   
  \node<1> [] (A) {A};          % no style
  \node<2> [redStyle]  (A) {A}; % red style
  \node<3> [blueStyle] (A) {A}; % blue style

  \node [right of=A] (B) {B};
  \draw [-latex] (A) -- (B) ;
  \end{tikzpicture}
\end{frame}

\begin{frame}{\textbf{Without} code/node duplication (explicit frame numbers)}
  \only<1>{\tikzset{colorStyle/.style={}}}          % no style
  \only<2>{\tikzset{colorStyle/.style={fill=red}}}  % red style
  \only<3>{\tikzset{colorStyle/.style={fill=blue}}} % blue style

  \begin{tikzpicture}
  [every node/.style={draw,circle}]
    
  \node [colorStyle] (A) {A}; % frame-dependent style
  \node [right of=A] (B) {B};
  \draw [-latex] (A) -- (B) ;
  \end{tikzpicture}
\end{frame}

\begin{frame}{\textbf{Without} code/node duplication (relative frame numbers)}
  \only<+>{\tikzset{colorStyle/.style={}}}          % no style
  \only<+>{\tikzset{colorStyle/.style={fill=red}}}  % red style
  \only<+>{\tikzset{colorStyle/.style={fill=blue}}} % blue style

  \begin{tikzpicture}
  [every node/.style={draw,circle}]
    
  \node [colorStyle] (A) {A}; % frame-dependent style
  \node [right of=A] (B) {B};
  \draw [-latex] (A) -- (B) ;
  \end{tikzpicture}
\end{frame}

\end{document}
于 2020-08-18T05:14:56.920 回答