我正在尝试以编程方式定义节点矩阵,但是在定义矩阵节点的步骤上遇到问题。
节点的大小不同(dimensionsBigBox 和 DimensionsSmallBox),我可以定义它们,但只能“硬编码”(即通过按行或按列甚至按节点定义节点的样式(语法/row 1))。我想动态定义它们,因为我有一个变量来定义节点 x 需要哪种样式。
这可能吗 ?
我做了一个最小的工作示例,但应用程序实际上有许多我事先不知道的节点。
\documentclass[border=2mm,tikz]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\tikzset{dimensionsBigBox/.style={
minimum height=3cm,
rectangle,
fill=none, draw=blue,
text depth=0.5em, text height=1em,
}}
\tikzset{dimensionsSmallBox/.style={
minimum height=1cm,
rectangle,
fill=none, draw=red,
text depth=0.5em, text height=1em,
}}
\tikzset{
mygridmatrix/.style={
matrix of nodes,
row sep=-\pgflinewidth, column sep=-\pgflinewidth,
nodes={draw, minimum size=1cm},
nodes in empty cells,
row 1/.style={
nodes={
dimensionsBigBox
}
},
row 2/.style={
nodes={
dimensionsSmallBox
}
},
row 3/.style={
nodes={
dimensionsBigBox
}
},
},
}
\begin{tikzpicture}
\foreach \x/\y in {1/dimensionsBigBox, 2/dimensionsBigBox, 3/dimensionsBigBox, 4/dimensionsSmallBox, 5/dimensionsSmallBox, 6/dimensionsSmallBox, 7/dimensionsBigBox, 8/dimensionsBigBox, 9/dimensionsBigBox}{
Set style \y for node \x \\
}
\matrix (m) [mygridmatrix]
{
&&&\\
&&&\\
&&&\\
};
\end{tikzpicture}
\end{document}
需要添加的附加内容:
目前,第 1 行和第 3 行是 BigBox。如果我想让第 1 行仅是 BigBox,我需要更改行的硬编码样式:
row 1/.style={
nodes={
dimensionsBigBox
}
},
row 2/.style={
nodes={
dimensionsSmallBox
}
},
row 3/.style={
nodes={
dimensionsBigBox
}
},
我想要有乳胶代码,它实际上允许我通过循环定义所有节点的变量来分别定义每个节点。
\foreach \x/\y in {1/dimensionsBigBox, 2/dimensionsBigBox, 3/dimensionsBigBox, 4/dimensionsSmallBox, 5/dimensionsSmallBox, 6/dimensionsSmallBox, 7/dimensionsBigBox, 8/dimensionsBigBox, 9/dimensionsBigBox}{
Set style \y for node \x \\
}
============ 编辑以跟进该问题 ===================
我发布了有关该问题的更精确的问题:循环中节点矩阵的附加样式不起作用
答案1
循环设置样式并不容易,foreach
因为它是在本地组中执行的,并且样式不会在外部持久化。
为了解决这个问题,您可以使用另一个循环,例如\xintFor
或\xintForpair
来自xinttools
库。
下面是一个如何操作的例子。
\documentclass[tikz,border=7pt]{standalone}
\usetikzlibrary{matrix}
\usepackage{xinttools}
\xintForpair #1#2 in {(1,red), (2,blue), (3,purple), (4,orange),(7,pink)} \do {
\pgfmathsetmacro\row{int(div(#1-1,4)+1)}
\pgfmathsetmacro\col{int(mod(#1-1,4)+1)}
\tikzstyle{row \row\space column \col}=[nodes={fill=#2}]
}
\begin{document}
\begin{tikzpicture}
\matrix (m)[
matrix of nodes,
row sep=-\pgflinewidth, column sep=-\pgflinewidth,
nodes={draw, minimum size=1cm},
nodes in empty cells
]
{
&&&\\
&&&\\
&&&\\
};
\end{tikzpicture}
\end{document}
注意:我使用它tikzstyle
只是为了测试-ayatollahs 的耐心tikzset
;)
答案2
我对这个问题仍然感到困惑。为什么不直接将节点放入矩阵中,而是定义一个数组来定义矩阵的节点呢?我也不明白关于节点名称的说法,它们确实有名称,你可以使用alias
。如果你能告诉我下面的问题是什么,那就太好了,这样有人最终可以回答这个问题。
\documentclass[border=2mm,tikz]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\tikzset{dimensionsBigBox/.style={
minimum height=3cm,
rectangle,
fill=none, draw=blue,
text depth=0.5em, text height=1em,
}}
\tikzset{dimensionsSmallBox/.style={
minimum height=1cm,
rectangle,
fill=none, draw=red,
text depth=0.5em, text height=1em,
}}
\begin{tikzpicture}[every node/.append style={minimum width=6mm}]
\matrix[matrix of nodes] (m) {%
|[dimensionsBigBox,alias=topleft]|& |[dimensionsBigBox]| &|[dimensionsBigBox]|\\
|[dimensionsSmallBox]|& |[dimensionsSmallBox]| &|[dimensionsSmallBox]|\\
|[dimensionsBigBox]|& |[dimensionsBigBox]| &|[dimensionsBigBox,alias=bottomright]|\\ };
\draw[blue,-latex] (topleft.center) -- (bottomright.center);
\end{tikzpicture}
\end{document}