我正在尝试使用节点名称来引用节点的颜色。我不确定这是否可行。
我有一个 Ti钾Z mindmap
:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows}
\usetikzlibrary{mindmap,backgrounds}
\begin{document}
\begin{figure}[t]
\begin{center}
\begin{tikzpicture}[mindmap, grow cyclic, every node/.style=concept, concept color=orange!40,
level 1/.append style={level distance=2cm,sibling angle=90},
level 2/.append style={level distance=1.7cm,sibling angle=45}]
\tikzset{every node/.append style={scale=0.6}}
\node{Root}
child [concept color=blue!30] { node (c1) {Child1}
}
child [concept color=yellow!60] { node (c2) {Child2}
};
\newcommand{\connCOnetoCTwo}{to[circle connection bar switch color=from (blue!30) to (yellow!60)]}
\begin{pgfonlayer}{background}
\path (c1) \connCOnetoCTwo (c2);
\end{pgfonlayer}
\end{tikzpicture}
\end{center}
\label{MindMap}
\end{figure}
\end{document}
我的问题是:我可以使用节点名称c1
或并引用它们的颜色吗?因此,当我使用来替换和时c2
,类似 ( c1.fill color
) 的内容。因此它看起来像这个伪代码:\newcommand
(blue!30)
(yellow!60)
\newcommand{\connCOnetoCTwo}{to[circle connection bar switch color=from (c1.color) to (c2.color)]}
**已编辑-代码现已兼容
答案1
这是我目前得到的。
首先,我发现,tikz.code.tex
在钾Z 将您的颜色存储在\tikz@fillcolor
、\tikz@strokecolor
和中\tikz@textcolor
。所以我写了一个测试。
\tikzset{
every text node part/.add code={}{
\xdef\thisnodefillcolor{\tikz@fillcolor}
\xdef\thisnodedrawcolor{\tikz@strokecolor}
\xdef\thisnodetextcolor{\tikz@textcolor}
}
}
\begin{tikzpicture}[ultra thick]
\draw(0,0)node[fill=red,draw=green,text=blue]{Foo};
\end{tikzpicture} \\
fill: \thisnodefillcolor \\
draw: \thisnodedrawcolor \\
text: \thisnodetextcolor \\
但有一个限制,如果其中任何一个没有被分配明确地,我什么也得不到。也就是说,
\draw(0,0)node[red]{Foo};
和
\draw[red](0,0)node{Foo};
导致为空\thisnodexxx
。我们稍后会讨论这个问题。
接下来,我发现 分配的颜色concept color
存储在 中\tikz@concept@color
。由于我们稍后要引用此颜色,因此我们创建了两个别名:c1.conc
和c2.conc
。以防万一有人忘记分配颜色,c1.conc
/c2.conc
将设置为当前颜色。
\tikzset{
every text node part/.add code={}{
\globalcolorstrue
\ifx\tikz@concept@color\pgfutil@empty
\pgfutil@colorlet{\tikz@[email protected]}{.}
\else
\pgfutil@colorlet{\tikz@[email protected]}{\tikz@concept@color}
\fi
}
}
\begin{tikzpicture}[mindmap,grow cyclic,every node/.style=concept,concept color=orange!40]
\node{Root}
child[concept color=blue!30]{node(c1){Child1}}
child[concept color=yellow!60]{node(c2){Child2}};
\newcommand\connCOnetoCTwo[2]{(#1)to[circle connection bar switch color=from (#1.conc) to (#2.conc)](#2)}
\path\connCOnetoCTwo{c1}{c2};
\end{tikzpicture}
请注意这c1.conc
不是一个面向目标的概念。它是一种颜色名称。而且不能保证它c1.conc
始终是名称,因为\tikz@fig@name
可能包含前缀和后缀。
结合这两种方法我得到:
\tikzset{
every text node part/.add code={}{
\globalcolorstrue
\ifx\tikz@fillcolor\pgfutil@empty
\pgfutil@colorlet{\tikz@[email protected]}{.}
\else
\pgfutil@colorlet{\tikz@[email protected]}{\tikz@fillcolor}
\fi
\ifx\tikz@strokecolor\pgfutil@empty
\pgfutil@colorlet{\tikz@[email protected]}{.}
\else
\pgfutil@colorlet{\tikz@[email protected]}{\tikz@strokecolor}
\fi
\ifx\tikz@textcolor\pgfutil@empty
\pgfutil@colorlet{\tikz@[email protected]}{.}
\else
\pgfutil@colorlet{\tikz@[email protected]}{\tikz@textcolor}
\fi
}
}
\begin{tikzpicture}[ultra thick,scale=.6]
\draw[violet](0,-3)node(c3){Foo};
\draw(0,-4)node[fill=red,draw=green,text=blue](c4){Bar};
\draw(0,-5)node[fill=c4.draw,draw=c4.text,text=c4.fill](c5){hakuna};
\draw(0,-6)node[fill=c2.draw,draw=c3.text,text=c4.conc](c6){matata};
\end{tikzpicture}
看看我是如何为 分配颜色的(c6)
?我们可以看到c2.draw
,出于某种原因, 同步到c2.conc
;c3.text
出于另一种原因, 同步到[violet]
;并且c4.conc
默认情况下变为黑色。
至于明确性问题,这xcolor
是当前颜色创造奇迹。我没有对它们进行太多测试,因此如果有任何进一步的问题,请留下评论。
every text node part/.add code
尽管如此,你可以尝试用或其他东西替换every node/.code
。它会产生错误,因为 Ti钾Zevery
按照自己的顺序执行 。事实上,every node
在处理这些颜色之前执行。您可以阅读tikz.code.tex
以找到更好的破解方法。请记住, 的所有内容fig
都是一个节点。(我猜)