我正在尝试绘制一个“表格” tikz
,并且更笼统地解决这个问题,以便于编写大量的代码。
该matrix
库使放置对齐节点变得容易得多。下一步是能够绘制垂直线和水平线。
我尝试了几种方法(其中一些“只是为了确保万无一失”):
- 使用节点锚点,例如在回答这个问题(如果节点的高度或宽度可变则不起作用,请参见下面的蓝线和红线)
- 使用节点作为列或行,使用
fit
库,如答案中所述这个问题(比之前更好,参见橙线,但是如果行(或列)不像矩阵那样宽(或高)的话,仍然会出现一些问题 [参见绿线]。
值得注意的是,可以绘制水平线\hline
(但缺乏 tikz 路径的可定制性)。
那么问题是:如何以一致的方式绘制这种线条?
编辑(第一个答案后有更多信息)
我知道可以通过指定每个单元格的高度、深度和宽度来强制对齐锚点。但是,这不正是pgf
绘制矩阵时所做的吗?
因此,问题的重点是(如果可能的话)在绘制矩阵pgf
后,访问由 计算的信息(矩阵边界框交叉点的位置以及行和列之间区域的界限)。
梅威瑟:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix,fit}
\begin{document}
\begin{tikzpicture}%[every node/.style={draw=black!30}]
\node[%
matrix of nodes,%
every node/.append style={%
inner xsep=5pt,
inner ysep=5pt,
outer sep=0pt
},
row sep=0pt,
column sep=0pt
] (M) {
{} & 1 & 2 \\
1 & 1 & 2 \\
2 & 2 & 4 \\
3 & 3 & 6 \\
1000000 & 1000000 & 2000000 \\
};
\draw[red] (M-1-2.north west) -- (M-5-1.south east);
\draw[blue] (M-1-1.north east) -- (M-5-1.south east);
\node[fit=(M-1-3) (M-5-3),inner sep=0pt] (C3) {};
\draw[orange!80!black] (C3.north west) -- (C3.south west);
\node[fit=(M-2-1) (M-2-3),inner sep=0pt] (R2) {};
\draw[green!50!black] (R2.north west) -- (R2.north east);
\end{tikzpicture}
\end{document}
输出:
带单元格边框的输出:
相关问题:
答案1
因为所有节点都在列中水平居中,所以您可以加载calc
库并使用
\draw[blue]({$(M-1-1)!.5!(M-1-2)$} |- M.north) -- ({$(M-1-1)!.5!(M-1-2)$} |- M.south);
在第一列和第二列之间绘制蓝线。
要获得绿线,你必须使用全部选项里面第二行的节点fit
:
\node[fit=(M-2-1) (M-2-2) (M-2-3),inner sep=0pt] (R2) {};
\draw[green!50!black] (R2.north -| M.west) -- (R2.north -| M.east);
\documentclass[tikz,margin=10pt]{standalone}
\usetikzlibrary{matrix,fit,calc}
\begin{document}
\begin{tikzpicture}%
\node[%
matrix of nodes,%
inner xsep=0pt,% <- code added
every node/.append style={%
draw=lightgray,
inner xsep=5pt,
inner ysep=5pt,
outer sep=0pt,
},
row sep=0pt,
column sep=0pt
] (M) {
{}& 1 & 20 \\
{}& 1 & {} \\
2 & 2 & 4 \\
3 & 3 & 6 \\
1000000 & 1000000 & 2000000 \\
};
% horizontal lines
\draw[blue]({$(M-1-1)!.5!(M-1-2)$} |- M.north) -- ({$(M-1-1)!.5!(M-1-2)$} |- M.south);
\draw[orange!80!black]({$(M-1-2)!.5!(M-1-3)$} |- M.north) --({$(M-1-2)!.5!(M-1-3)$} |- M.south);
% vertical lines
\node[fit=(M-2-1) (M-2-2) (M-2-3),inner sep=0pt] (R2) {};
\draw[green!50!black] (R2.north -| M.west) -- (R2.north -| M.east);
\end{tikzpicture}
\end{document}
可以定义宏:
\documentclass[tikz,margin=10pt]{standalone}
\usetikzlibrary{matrix,fit,calc}
% \mvline[<style>]{<matrix name>}{<row number on the right hand side of the line>}
\newcommand\mvline[3][]{%
\pgfmathtruncatemacro\hc{#3-1}
\draw[#1]({$(#2-1-#3)!.5!(#2-1-\hc)$} |- #2.north) -- ({$(#2-1-#3)!.5!(#2-1-\hc)$} |- #2.south);
}
% \mhline[<style>]{<matrix name>}{<column number below of the line>}{<number of columns in a row>}
\newcommand\mhline[4][]{%
\node[fit=(#2-#3-1),inner sep=0pt,outer sep=0pt](R){};
\foreach \i in {1,...,#4}\node[fit=(R) (#2-#3-\i),inner sep=0pt,outer sep=0pt](R){};
\draw[#1] (R.north -| #2.west) -- (R.north -| #2.east);
}
\begin{document}
\begin{tikzpicture}%
\node[%
matrix of nodes,%
inner xsep=0pt,% <- code added
nodes in empty cells,% <- code added, nodes also in empty cells
every node/.append style={%
%draw=lightgray,
inner xsep=5pt,
inner ysep=5pt,
outer sep=0pt,
},
row sep=0pt,
column sep=0pt
] (M) {
& 1 & 20 \\
& & \huge T \\
2 & 2 & 4 \\
3 & 3 & 6 \\
1000000 & 1000000 & 2000000 \\
};
% border of the table
\draw[purple](M.south west) rectangle (M.north east);
% horizontal lines
\mvline[blue]{M}{2}
\mvline[orange]{M}{3}
% vertical lines
\foreach \r in {2,...,5} {\mhline[green!50!black]{M}{\r}{3}}
\end{tikzpicture}
\end{document}
答案2
text height
您可以使用、text width
和强制矩阵中的所有节点具有相同的大小text depth
。然后调整column sep
和row sep
以使节点更紧凑。
平均能量损失
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix,fit}
\usepackage{calc}
\begin{document}
\begin{tikzpicture}%[every node/.style={draw=black!30}]
\node[%
matrix of nodes,%
every node/.append style={%
inner xsep=5pt,
inner ysep=5pt,
draw=lightgray, % just to show node borders
text height=\heightof{0},
text width=\widthof{2000000},
align=center
},
row sep=-\pgflinewidth,
column sep=-.5\pgflinewidth,
] (M) {
{} & 1 & 2 \\
1 & 1 & 2 \\
2 & 2 & 4 \\
3 & 3 & 6 \\
1000000 & 1000000 & 2000000 \\
};
\draw[red] (M-1-2.north west) -- (M-5-1.south east);
\draw[blue] (M-1-1.north east) -- (M-5-1.south east);
% \node[fit=(M-1-3) (M-5-3),inner sep=0pt] (C3) {};
\draw[orange!80!black] (M-1-3.north west) -- (M-5-3.south west);
% \node[fit=(M-2-1) (M-2-3),inner sep=0pt] (R2) {};
\draw[green!50!black] (M-2-1.north west) -- (M-2-3.north east);
\end{tikzpicture}
\end{document}