Как применить стиль к существующему узлу tikz на определенных слайдах?
Вопрос
Это то, что я пытаюсь сделать
\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) {};
создает новый узел, но я хочу, чтобы он применил стиль существующего узла.Есть ли способ сделать это?
Конечно, я мог бы иметь копии каждого узла в выбранном и невыбранном состоянии, но мне действительно хочется иметь нормальное решение.
Решение
Я не думаю, что вы можете сделать это так, как хотите (при условии, что я правильно понимаю вопрос), потому что, как только узел нарисован, нет способа изменить его внешний вид. Я бы посоветовал использовать Beamer's \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.
Другие советы
Иногда, чтобы избежать повторений, было бы неплохо сделать что-то вроде этого:
% #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}
стиль selected
будет определяться как fill = red
на втором слайде анимации и как стиль, не влияющий на все остальные слайды.Затем вы можете написать читаемую цифру, например:
\begin{tikzpicture}
\node at (0, 0) {A};
\node[selected] at (1, 0) {B};
\node at (2, 0) {C};
\end{tikzpicture}
и узел «B» будет выделен на втором слайде.Таким образом, вам не придется копировать и вставлять тонны определений узлов.Конечно, его нельзя применить ко всем нуждам анимации, но мне нравится держать этот метод при себе.