![TikZ 矩阵,组合或行和列的样式](https://linux22.com/image/289959/TikZ%20%E7%9F%A9%E9%98%B5%EF%BC%8C%E7%BB%84%E5%90%88%E6%88%96%E8%A1%8C%E5%92%8C%E5%88%97%E7%9A%84%E6%A0%B7%E5%BC%8F.png)
在 TikZ 手册中,我们有下面的示例,展示了如何将样式应用于矩阵的条目。将其应用于整行和整列也很容易。我的问题是,我们如何才能对多个条目实现相同的效果?有吗?一个简单的方法指定一种风格,比如说,第 1 行和第 3 行以及第 1 列和第 2 列?
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[row 2 column 3/.style=red]
\matrix [matrix of nodes]
{
8 & 1 & 6 \\
3 & 5 & 7 \\
4 & 9 & 2 \\
};
\end{tikzpicture}
\end{document}
答案1
您可以使用/.list
John Kormylo 在他的回答中提到的功能来为不同的输入重复一种样式。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\tikzset{myset/.style={row 2 column #1/.style={nodes={text=red}}}}
\begin{tikzpicture}[myset/.list={1,3,5}]
\matrix [matrix of nodes]
{
8 & 1 & 6 & 8 & 1 & 6 \\
3 & 5 & 7 & 3 & 5 & 7 \\
4 & 9 & 2 & 4 & 9 & 2 \\
};
\end{tikzpicture}
\end{document}
答案2
更多的是长篇评论而不是真正的答案...基于percusse 的回答,此样式允许同时指定行和列。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\tikzset{myset/.style args = {(#1,#2)}{%
row #1 column #2/.style={nodes={text=red}}}}
\begin{tikzpicture}[myset/.list={(2,1),(3,3),(1,5)}]
\matrix [matrix of nodes]
{
8 & 1 & 6 & 8 & 1 & 6 \\
3 & 5 & 7 & 3 & 5 & 7 \\
4 & 9 & 2 & 4 & 9 & 2 \\
};
\end{tikzpicture}
\end{document}
答案3
这确实可以通过 来实现\foreach
,但由于 设置的键\pgfkeys
不是全局的,因此退出循环时它们的分配将丢失。除非你弄乱\globaldef
,如下例所示:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\newcommand{\rows}[2]{% #1 = rows, #2 = style
\foreach \r in {#1} {%
\globaldefs=1\relax
\tikzset{row \r/.style={#2}}
}%
}
\newcommand{\cols}[2]{% #1 = columns, #2 = style
\foreach \r in {#1} {%
\globaldefs=1\relax
\tikzset{column \r/.style={#2}}
}%
}
\begin{tikzpicture}
\cols{1,3}{blue}
\rows{1,3}{red}
\matrix [matrix of nodes]
{
8 & 1 & 6 \\
3 & 5 & 7 \\
4 & 9 & 2 \\
};
\end{tikzpicture}
\end{document}
答案4
我重新提出这个老问题,因为从 percusse 和 cjorssen 的回答中,我设法将样式分配给一个单元格块,仅指定其(顶部、从左到下、右侧)坐标。我在这里分享我的解决方案,希望它能帮助其他人。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\tikzset{myblocks/.style args = {(#1,#2 to #3,#4)}{
blockrows/.style={
block/.style={
row ##1 column ####1/.style={nodes={text=red}}
},
block/.list={#2,...,#4}
},
blockrows/.list={#1,...,#3}
}
}
\begin{tikzpicture}[myblocks/.list={(1,1 to 2,2),(1,4 to 3,5)}]
\matrix [matrix of nodes]
{
8 & 1 & 6 & 8 & 1 & 6 \\
3 & 5 & 7 & 3 & 5 & 7 \\
4 & 9 & 2 & 4 & 9 & 2 \\
};
\end{tikzpicture}
\end{document}