原始答案

原始答案

我试图建立太多节点连接以使其具有相同的颜色。我尝试创建一个颜色列表和另一个节点列表,但节点列表不起作用。这是我的非 MWE:

\documentclass[tikz]{standalone}
\begin{document}
\def\cores{{"0.70 0.00 0.00","0.00 0.70 0.00"}}%cores=colors. the list of collors
\def\nodenames{(no1),(no4)}

\newcommand{\nodefrom}[1]{
\pgfmathparse{\cores[#1]};
\definecolor{cor}{rgb}{\pgfmathresult};
\draw[very thick, cor] (\nodenames[#1])}

\begin{tikzpicture}
    \node (\nodenames[0]) at (0,-1){no1};
    \node (no2) at (1,-1){no2};
    \node (no3) at (0,1){no3};
    \node (\nodenames[1] at (1,1){no4};

    \nodefrom[0]--(no2);
    \nodefrom[0]--(no3);
    \nodefrom[1]--(no2);
    \nodefrom[1]--(no3);
\end{tikzpicture}
\end{document}

答案1

笔记请参阅下面的更新以获得更好的(恕我直言)解决方案,并且更新 2按照 OP 的要求给出答案,但修复第一个版本中存在的一个错误。

原始答案

回答关于如何创建节点列表的问题,需要注意几点:

  1. 要使用 TikZ 解析器提取列表(或数组)的元素,您必须在列表周围加上双括号,就像在列表中所做的那样\cores
  2. 我认为,如果您的名称节点列表仅包含节点名称,而不包含括号,则代码会更简单。此外,提取元素时会再次添加括号,因此\draw[...] (\nodenames[#1]);它们不是节点名称的一部分。
  3. 要调用\nodefrom宏,参数应该用花括号而不是方括号给出,例如:\nodefrom{0}

使用这些点,您的原始代码将修复如下:

\documentclass[tikz]{standalone}
\begin{document}
\def\cores{{"0.70 0.00 0.00","0.00 0.70 0.00"}}%cores=colors. the list of collors
\def\nodenames{{no1,no4}}

\newcommand{\nodefrom}[1]{
\pgfmathparse{\cores[#1]};
\definecolor{cor}{rgb}{\pgfmathresult};
\draw[very thick, cor] (\nodenames[#1])}

\begin{tikzpicture}
    \node (\nodenames[0]) at (0,-1){no1};
    \node (no2) at (1,-1){no2};
    \node (no3) at (0,1){no3};
    \node (\nodenames[1]) at (1,1){no4};

    \nodefrom{0}--(no2);
    \nodefrom{0}--(no3);
    \nodefrom{1}--(no2);
    \nodefrom{1}--(no3);
\end{tikzpicture}
\end{document}

生成结果:

结果

更新

但是,我知道您希望使用节点名称列表或数组来以某种方式循环它们。在这种情况下,我不会使用列表,而是利用\foreach强大的机制。

这是您的代码,重构后使用\foreach循环,消除了对颜色列表和节点列表的需求(也使宏变得不必要\nodefrom)。结果更加符合 TikZ 的惯用用法:

\documentclass[tikz]{standalone}
\begin{document}
\definecolor{redish}{rgb}{0.7 0.0 0.0}
\definecolor{greenish}{rgb}{0.0 0.7 0.0}
\begin{tikzpicture}
    \node (no1) at (0,-1){no1};
    \node (no2) at (1,-1){no2};
    \node (no3) at (0,1){no3};
    \node (no4) at (1,1){no4};
    \foreach \from/\mycolor/\finals in {no1/redish/{no3,no2},no4/greenish/{no3,no2}}
        \foreach \to in \finals
            \draw[very thick, \mycolor] (\from) -- (\to);
\end{tikzpicture}
\end{document}

注意传递给第一个的参数\foreach。它由逗号分隔的值列表组成,每个值都是一个/-separated 元素序列。第一个是建立连接的节点。第二个是这些连接的颜色。第三个是目标节点的逗号分隔列表(括在花括号中)。第二个列表用于嵌套循环,\foreach最终使用相同的颜色和样式绘制连接。

结果与您的代码相同:

结果

更新 2

OP 在评论中指出,如果第一个节点定义为\node (no1) ...而不是\node (\nodelist[0])...

确实,原始答案中有一个错误。宏内部\nodefrom有一个\draw[...] (\nodenames[#1])。我(错误地)假设 TikZ 会解析(\nodenames[#1])部分并生成(no1),但事实并非如此。宏\nodenames只是被扩展,结果是({no1,no4}[0]),因此使用具有奇怪名称的节点{no1,no4}[0]进行绘制。如果之前使用创建了此节点\node (\nodenames[0])(因为发生了相同的扩展),则此节点存在,但如果\node (no1)使用则不存在。

要解决这个问题,需要进行两项修改。首先,节点名称列表需要在每个节点名称周围加上双引号。其次,必须使用 pgf 数学解析器从列表中提取单个节点的名称。我更喜欢使用\pgfmathsetmacro而不是,\pgfmathparser以便能够将所需信息提取到自定义宏中。

这是正确的代码:

\documentclass[tikz]{standalone}
\begin{document}
\def\colors{{"0.70 0.00 0.00","0.00 0.70 0.00"}}
\def\nodenames{{"no1","no4"}}

\newcommand{\nodefrom}[1]{
\pgfmathsetmacro{\mycolor}{\colors[#1]}
\pgfmathsetmacro{\start}{\nodenames[#1]}
\definecolor{mycolor}{rgb}{\mycolor}
\draw[very thick, mycolor] (\start)}

\begin{tikzpicture}
    \node (no1) at (0,-1){no1};
    \node (no2) at (1,-1){no2};
    \node (no3) at (0,1){no3};
    \node (no4) at (1,1){no4};

    \nodefrom{0}--(no2);
    \nodefrom{0}--(no3);
    \nodefrom{1}--(no2);
    \nodefrom{1}--(no3);
\end{tikzpicture}
\end{document}

答案2

如果我正确理解了你的问题,下面的图片显示了你想要实现的目标:

图片

我不知道为什么要使用节点列表。因此,我在下面的代码中删除了它:

\documentclass[tikz]{standalone}
\usepackage{ifthen}
\begin{document}
\def\colors{{"0.70 0.00 0.00","0.00 0.70 0.00"}}

\newcommand{\nodefrom}[1]{
% decide which color should be used based on the parameter
\ifthenelse{#1=1}{\pgfmathparse{\colors[0]}}{};
\ifthenelse{#1=4}{\pgfmathparse{\colors[1]}}{};

\definecolor{cor}{rgb}{\pgfmathresult};
\draw[very thick, cor] (no#1)
}

\begin{tikzpicture}
    \node (no1) at (0,-1){no1};
    \node (no2) at (1,-1){no2};
    \node (no3) at (0,1){no3};
    \node (no4) at (1,1){no4};

    \nodefrom{1} -- (no2);
    \nodefrom{1} -- (no3);
    \nodefrom{4} -- (no2);
    \nodefrom{4} -- (no3);
\end{tikzpicture}
\end{document}

我正在使用ifthen包来确定给定线使用的正确颜色。

相关内容