如何在 tikz-cd 图上画线

如何在 tikz-cd 图上画线

我正在使用 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}

在此处输入图片描述


使用表格命令处理表格绝非不可能:)

相关内容