我正在尝试以编程方式设置 TikZ 矩阵的列样式。我的尝试如下:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\tikzstyle{mymatrix}=[draw]
\foreach \c [count=\i] in {red, green, blue} {
\globaldefs=1 % make tikz style global
\tikzset{mymatrix/.append style={column \i/.style={nodes={fill=\c}}}}
}
\matrix (m) [matrix of nodes, mymatrix] {
1 & 2 & 3 & 4 \\
5 & 6 & 8 & 8 \\ };
\end{tikzpicture}
\end{document}
不幸的是,这段代码无法编译,因为命令\i
和\c
未定义。我猜想 for 循环内的样式必须在 for 循环内扩展,但我不知道该怎么做。有什么想法吗?
答案1
\edef
您可以使用定义新命令来扩展变量:
\documentclass{article}
\usepackage{pgfplots}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\tikzstyle{mymatrix}=[draw]
\foreach \c [count=\i] in {red, green, blue} {
\globaldefs=1
\edef\dotikzset{
\noexpand\tikzset{
mymatrix/.append style={
column \i/.style={
nodes={fill=\c}
}
}
}
}
\dotikzset
}
\matrix (m) [matrix of nodes, mymatrix] {
1 & 2 & 3 & 4 \\
5 & 6 & 8 & 8 \\ };
\end{tikzpicture}
\end{document}
答案2
杰克更快,但是我从埃格尔那里学到了一些东西在这个问题中:
\documentclass{article}
\usepackage{etoolbox}
\usepackage{tikz}
\usetikzlibrary{matrix}
\let\mystyle\empty
\newcommand{\populatestyle}{%
\foreach \c [count=\i] in {red, green, blue} {
\begingroup\edef\x{\endgroup
\noexpand\gappto\noexpand\mystyle{column \i/.style={nodes={fill=\c}},}}\x
}%
}
\populatestyle
\tikzset{mymatrix/.estyle={\mystyle}}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of nodes,mymatrix] {
1 & 2 & 3 & 4 \\
5 & 6 & 7 & 8 \\ };
\end{tikzpicture}
\end{document}
答案3
这是一个相当老的问题,有两个很好的答案。不过,可能还有一些空间可以容纳另一个既不使用\globaldefs
也不加载其他包的答案。(这个答案有一个弱点:如果颜色列表的条目少于矩阵的行数,则会出现错误。)
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[colorize cells/.style={/utils/exec={%
\pgfmathsetmacro{\mycolor}{{#1}[\the\pgfmatrixcurrentcolumn-1]}
\pgfkeysalso{/tikz/fill=\mycolor}}}]
\matrix (m) [matrix of nodes,nodes={colorize cells={"red","green","blue","white"}}] {
1 & 2 & 3 & 4 \\
5 & 6 & 8 & 8 \\ };
\end{tikzpicture}
\end{document}