我正在使用 tikz-cd 绘制矩阵。我想在上面画一些垂直线和水平线来指示特定的子矩阵,但我不明白语法。这是我的 M(N)WE:
\documentclass{article}
\usepackage[margin=1cm]{geometry}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}[column sep=3pt, row sep=5pt,nodes={inner sep=0pt,align=center,
text width={width("20")}}]
&&0&0&0&0&0&0&0&0&0&0\\
&0&1&2&3&4&5&6&7&8&9&10\\
0&1&0&1&2&3&4&5&6&7&8&9\\
0&2&1&0&1&2&3&4&5&6&7&8\\
0&3&2&1&0&1&2&3&4&5&6&7\\
0&4&3&2&1&0&1&2&3&4&5&6
\foreach \x in {1,3}
{
\draw
([yshift=-3,xshift=-.125\pgflinewidth]mat-\x-1.south west) --
([yshift=-3,xshift=-.125\pgflinewidth]mat-\x-12.south east);
}
\foreach \y in {2}
{
\draw
([yshift=.5\pgflinewidth]mat-1-\y.north east) --
([yshift=.5\pgflinewidth]mat-14-\y.south east);
}
\end{tikzcd}
\end{document}
这在语法上是不正确的,但如果您删除 \foreach 循环,它就会起作用。如何将 \foreach...\draw 命令与 tikz-cd 绘制矩阵一起使用?
答案1
您在找这个吗?
\documentclass{article}
\usepackage[margin=1cm]{geometry}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}[column sep=3pt, row sep=5pt,nodes={inner sep=0pt,align=center,
text width={width("20")}},nodes in empty cells,
execute at end picture={
\foreach \x in {1,3}
{
\draw
([yshift=-3,xshift=-.125\pgflinewidth]\tikzcdmatrixname-\x-1.south west) --
([yshift=-3,xshift=-.125\pgflinewidth]\tikzcdmatrixname-\x-12.south east);
}
\foreach \y in {3}
{
\draw
([yshift=.5\pgflinewidth]\tikzcdmatrixname-1-\y.north west) --
([yshift=.5\pgflinewidth]\tikzcdmatrixname-6-\y.south west);
}}]
&&0&0&0&0&0&0&0&0&0&0\\
&0&1&2&3&4&5&6&7&8&9&10\\
0&1&0&1&2&3&4&5&6&7&8&9\\
0&2&1&0&1&2&3&4&5&6&7&8\\
0&3&2&1&0&1&2&3&4&5&6&7\\
0&4&3&2&1&0&1&2&3&4&5&6
\end{tikzcd}
\end{document}
我在这里雇用Henri Menke 的回答很好并添加nodes in empty cells
和更改了一些数字以仅使用现有节点。
附录:如果您希望线条位于单元格中间,而不必将所有偏移量添加到线宽的分数,则可以使用该calc
库。
\documentclass{article}
\usepackage[margin=1cm]{geometry}
\usepackage{tikz-cd}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzcd}[column sep=3pt, row sep=5pt,nodes={inner sep=0pt,align=center,
text width={width("20")}},nodes in empty cells,
execute at end picture={
\foreach \x [evaluate=\x as \xp using {int(\x+1)}] in {1,3}
{
\draw ($(\tikzcdmatrixname-\x-2.south)!0.5!(\tikzcdmatrixname-\xp-2.north)$)
coordinate (aux)
([xshift=-.1em]\tikzcdmatrixname.west|-aux) --
([xshift=.1em]\tikzcdmatrixname.east|-aux);
}
\foreach \y [evaluate=\y as \ym using {int(\y-1)}] in {3}
{
\draw ($(\tikzcdmatrixname-1-\y.west)!0.5!(\tikzcdmatrixname-1-\ym.east)$)
coordinate (aux)
([yshift=0.1ex]\tikzcdmatrixname.north-|aux) --
([yshift=0.1ex]\tikzcdmatrixname.south-|aux);
}}]
&&0&0&0&0&0&0&0&0&0&0\\
&0&1&2&3&4&5&6&7&8&9&10\\
0&1&0&1&2&3&4&5&6&7&8&9\\
0&2&1&0&1&2&3&4&5&6&7&8\\
0&3&2&1&0&1&2&3&4&5&6&7\\
0&4&3&2&1&0&1&2&3&4&5&6
\end{tikzcd}
\end{document}
至于这可能有什么好处的问题:有些事情用表格很难实现,例如
\documentclass{article}
\usepackage[margin=1cm]{geometry}
\usepackage{tikz-cd}
\usetikzlibrary{calc,through,backgrounds}
\tikzset{circle through 3 points/.style n args={3}{%
insert path={let \p1=($(#1)!0.5!(#2)$),
\p2=($(#1)!0.5!(#3)$),
\p3=($(#1)!0.5!(#2)!1!-90:(#2)$),
\p4=($(#1)!0.5!(#3)!1!90:(#3)$),
\p5=(intersection of \p1--\p3 and \p2--\p4)
in },
at={(\p5)},
circle through= {(#1)}
}}
\begin{document}
\begin{tikzcd}[column sep=3pt, row sep=5pt,nodes={inner sep=0pt,align=center,
text width={width("20")}},nodes in empty cells,
execute at end picture={
\foreach \x [evaluate=\x as \xp using {int(\x+1)}] in {1,3}
{
\draw ($(\tikzcdmatrixname-\x-2.south)!0.5!(\tikzcdmatrixname-\xp-2.north)$)
coordinate (aux)
([xshift=-.1em]\tikzcdmatrixname.west|-aux) --
([xshift=.1em]\tikzcdmatrixname.east|-aux);
}
\foreach \y [evaluate=\y as \ym using {int(\y-1)}] in {3}
{
\draw ($(\tikzcdmatrixname-1-\y.west)!0.5!(\tikzcdmatrixname-1-\ym.east)$)
coordinate (aux)
([yshift=0.1ex]\tikzcdmatrixname.north-|aux) --
([yshift=0.1ex]\tikzcdmatrixname.south-|aux);
}
\begin{scope}[on background layer]
\node[circle through 3
points={\tikzcdmatrixname-2-2}{\tikzcdmatrixname-3-1}{\tikzcdmatrixname-3-3},
fill=blue!20]{};
\end{scope}
}]
&&0&0&0&0&0&0&0&0&0&0\\
&0&1&2&3&4&5&6&7&8&9&10\\
0&1&0&1&2&3&4&5&6&7&8&9\\
0&2&1&0&1&2&3&4&5&6&7&8\\
0&3&2&1&0&1&2&3&4&5&6&7\\
0&4&3&2&1&0&1&2&3&4&5&6
\end{tikzcd}
\end{document}
然而,出于多种目的,Joule V 建议的表格方法就很好,甚至更好。这真的取决于你最终想做什么。
答案2
只是为了好玩:如果你想制作这个矩阵,为什么不使用表格?代码是很多更短:
\documentclass{article}
\begin{document}
\renewcommand{\arraystretch}{1.3}
\begin{tabular}{cc|cccccccccc}
&&0&0&0&0&0&0&0&0&0&0\\\hline
&0&1&2&3&4&5&6&7&8&9&10\\
0&1&0&1&2&3&4&5&6&7&8&9\\\hline
0&2&1&0&1&2&3&4&5&6&7&8\\
0&3&2&1&0&1&2&3&4&5&6&7\\
0&4&3&2&1&0&1&2&3&4&5&6
\end{tabular}
\end{document}
给文本着色并不难,不是吗?如果你想画一些箭头,\tikzmark
可能是一个选择。无论如何,如果我是你,我会使用一个简单的表格。:)
添加箭头
\documentclass{article}
\usepackage{tikz}
\begin{document}
\renewcommand{\arraystretch}{1.3}
\begin{tabular}{cc|cccccccccc}
&&0&0&0&0&0&0&0&0&0&0\\\hline
&0&1&2&3&4&5&6&7&8&9&10\\
0&\tikz[baseline,remember picture]\node[anchor=base,inner sep=0pt] (node1) {1};&0&1&2&3&4&5&6&7&8&9\\\hline
0&2&1&0&1&2&3&4&5&6&7&8\\
0&3&2&1&0&1&2&\tikz[baseline,remember picture]\node[anchor=base,inner sep=0pt] (node2) {3};&4&5&6&7\\
0&4&3&2&1&0&1&2&3&4&5&6
\end{tabular}
\begin{tikzpicture}[remember picture,overlay]
\draw[red,very thick,-latex] (node1) -- (node2);
\end{tikzpicture}
\end{document}
颜色行
\documentclass{article}
\usepackage{tikz}
\usepackage{xcolor,colortbl}
\begin{document}
\renewcommand{\arraystretch}{1.3}
\begin{tabular}{cc|cccccccccc}
\rowcolor{red!20}&&0&0&0&0&0&0&0&0&0&0\\\hline
\rowcolor{red!20}&0&1&2&3&4&5&6&7&8&9&10\\
0&1&0&1&2&3&4&5&6&7&8&9\\\hline
0&2&1&0&1&2&3&4&5&6&7&8\\
0&3&2&1&0&1&2&3&4&5&6&7\\
0&4&3&2&1&0&1&2&3&4&5&6
\end{tabular}
\end{document}
颜色列
\documentclass{article}
\usepackage{tikz}
\usepackage{xcolor,colortbl}
\begin{document}
\renewcommand{\arraystretch}{1.3}
\begin{tabular}{cc|ccc>{\columncolor{yellow!50}}cc>{\columncolor{green!20}}ccccc}
&&0&0&0&0&0&0&0&0&0&0\\\hline
&0&1&2&3&4&5&6&7&8&9&10\\
0&1&0&1&2&3&4&5&6&7&8&9\\\hline
0&2&1&0&1&2&3&4&5&6&7&8\\
0&3&2&1&0&1&2&3&4&5&6&7\\
0&4&3&2&1&0&1&2&3&4&5&6
\end{tabular}
\end{document}
使用表格命令处理表格绝非不可能:)