我想使用 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 depth
nodes 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 节点)。