我试图建立太多节点连接以使其具有相同的颜色。我尝试创建一个颜色列表和另一个节点列表,但节点列表不起作用。这是我的非 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 的要求给出答案,但修复第一个版本中存在的一个错误。
原始答案
回答关于如何创建节点列表的问题,需要注意几点:
- 要使用 TikZ 解析器提取列表(或数组)的元素,您必须在列表周围加上双括号,就像在列表中所做的那样
\cores
。 - 我认为,如果您的名称节点列表仅包含节点名称,而不包含括号,则代码会更简单。此外,提取元素时会再次添加括号,因此
\draw[...] (\nodenames[#1]);
它们不是节点名称的一部分。 - 要调用
\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
包来确定给定线使用的正确颜色。