使用节点名称引用节点的颜色

使用节点名称引用节点的颜色

我正在尝试使用节点名称来引用节点的颜色。我不确定这是否可行。

我有一个 TiZ 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.texZ 将您的颜色存储在\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.concc2.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.concc3.text出于另一种原因, 同步到[violet];并且c4.conc默认情况下变为黑色。

至于明确性问题,这xcolor当前颜色创造奇迹。我没有对它们进行太多测试,因此如果有任何进一步的问题,请留下评论。

every text node part/.add code尽管如此,你可以尝试用或其他东西替换every node/.code。它会产生错误,因为 TiZevery按照自己的顺序执行 。事实上,every node在处理这些颜色之前执行。您可以阅读tikz.code.tex以找到更好的破解方法。请记住, 的所有内容fig都是一个节点。(我猜)

相关内容