TikZ 矩阵作为表格的替代品

TikZ 矩阵作为表格的替代品

我想使用 TikZ 矩阵来绘制一些图形。我目前正在使用节点并手动定位它们以模拟表格。这有助于定位箭头和阴影。

TikZ 矩阵

但是,如果我使用类似下面的代码:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}

\begin{tikzpicture}
\matrix [matrix of nodes,row sep=0,column 2/.style={nodes={rectangle,draw,minimum width=3em}}]
{
0   & 6 \\
1   & 3 \\
};
\end{tikzpicture}
\end{document}

节点的下边界和上边界不重叠,导致节点之间有双边界。

双边框

编辑:Jake 提出了一个非常好的解决方案,使用负行分隔row sep。这对于单列表来说非常有效。但是当有更多列时,列会错位。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usetikzlibrary{positioning}
\begin{document}

\begin{tikzpicture}[cell/.style={rectangle,draw=black},
space/.style={minimum height=1.5em,matrix of nodes,row sep=-\pgflinewidth,column sep=-\pgflinewidth,column 1/.style={font=\ttfamily}}]

\matrix (first) [space, column 1/.style={font=\ttfamily},column 2/.style={nodes={cell,minimum width=2em}}]
{
0   & 6 \\
1   & 3 \\
2   & 9 \\
};

\matrix (second) [right=of first, space, column 2/.style={minimum width=3em,nodes={cell,minimum width=3.5em}},column 3/.style={nodes={cell,minimum width=2em}}]
{
0   &a  & 6 \\
1   &   & 3 \\
2   &c  & 9 \\
};

\matrix [right=of second, space, column 2/.style={minimum width=3em,nodes={cell,minimum width=3.5em}},column 3/.style={nodes={cell,minimum width=2em}}]
{
0   &a  & 6 \\
1   &b  & 3 \\
2   &c  & 9 \\
};
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案1

如果设置row sep-\pgflinewidth,线条将完全重叠:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\matrix [matrix of nodes,row sep=-\pgflinewidth,column 2/.style={nodes={rectangle,draw,minimum width=3em}}]
{
0   & 6 \\   1   & 3 \\   };
\end{tikzpicture}
\end{document}

节点矩阵

为了确保单元格水平对齐正确,您需要使 和在整个行中相同。通过设置text height,即使未提供任何内容,所有单元格都将被绘制。或者,您可以输入空单元格来实现相同的效果。text depthnodes in empty cells{}

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix,positioning}
\begin{document}
\begin{tikzpicture}[cell/.style={rectangle,draw=black},
space/.style={minimum height=1.5em,matrix of nodes,row sep=-\pgflinewidth,column sep=-\pgflinewidth,column 1/.style={font=\ttfamily}},text depth=0.5ex,text height=2ex,nodes in empty cells]

\matrix (first) [space, column 1/.style={font=\ttfamily},column 2/.style={nodes={cell,minimum width=2em}}]
{
0   & 6 \\   1   & 3 \\   2   & 9 \\   };

\matrix (second) [right=of first, space, column 2/.style={minimum width=3em,nodes={cell,minimum width=3.5em}},column 3/.style={nodes={cell,minimum width=2em}}]
{
0   &a  & 6 \\   1   &   & 3 \\   2   &c  & 9 \\   };

\matrix [right=of second, space, column 2/.style={minimum width=3em,nodes={cell,minimum width=3.5em}},column 3/.style={nodes={cell,minimum width=2em}}]
{
0   &a  & 6 \\   1   &b  & 3 \\   2   &c  & 9 \\   };
\end{tikzpicture}
\end{document}

具有固定文本深度和文本高度的矩阵表

答案2

{NiceTabular}供参考,的环境nicematrix会创建类似于的表格{tabular},但在单元格、行和列下使用 PGF/Tikz 节点。您可以在 Tikz 中使用这些节点。但是,您也可以使用经典技术在表格中添加规则{tabular}(例如\hline:)。

hvlines在下面的代码中,我使用了绘制所有规则的键(“第一”列和“第一”行除外)。

\documentclass{article}
\usepackage{nicematrix,tikz}
\usetikzlibrary{arrows.meta}

\begin{document}

\renewcommand{\arraystretch}{1.5}

\begin{NiceTabular}{>{\ttfamily}rc}[name=Left]
M         & \Block[draw]{} 0 \\
\\
L         & \Block[draw]{} 4 \\
\\
available & \Block[draw]{} 8 \\
\end{NiceTabular}\hspace{3cm}
\begin{NiceTabular}
  [
    first-col,
    code-for-first-col=\inteval{\value{iRow}-1},
    first-row,
    hvlines,
    color-inside,
    name = Right
  ]
  {cc}  
& element & next \\
& \cellcolor{gray!30}
          & $6$  \\
& 1       & $3$  \\
& b       & $9$  \\
&         & $5$  \\
& \cellcolor{gray!30}
          & $7$  \\
&         & $-1$ \\
&         & $10$ \\
& a       & $2$  \\
&         & $11$ \\
& c       & $-1$ \\
& c       & $-1$ \\
&         & $1$  \\ 
\end{NiceTabular}

\begin{tikzpicture}[overlay,remember picture]
  \draw [->] (Left-1.5-|Left-last) to [bend right] (Right-1.5-|Right-1) ; 
  \draw [->] (Left-3.5-|Left-last) to [bend left] (Right-5.5-|Right-1) ; 
  \draw [->] (Left-5.5-|Left-last) to [bend left] (Right-9.5-|Right-1) ; 
\end{tikzpicture}

\end{document}

您需要多次编译(因为 PGF/Tikz 节点)。

上述代码的输出

相关内容