我有一个单元格图片矩阵,希望第一列右对齐,第二列左对齐。但是我无法使用“nodes”键。
\documentclass{article}
\usepackage{tikz}
\usepackage[margin=0cm,nohead]{geometry}
\usepackage[active,tightpage]{preview}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\usetikzlibrary{arrows}
\usetikzlibrary{matrix}
\PreviewEnvironment{tikzpicture}
\begin{document}
\begin{tikzpicture}[very thick]
\matrix[matrix of nodes, column sep=3ex, row sep=2ex, nodes={draw}]{
\draw (0,0) rectangle (-2.5,1) rectangle ++ (2.5,1) rectangle ++ (-2.5,1) rectangle ++ (2.5,1);
\draw (2,2) rectangle ++ (2.5, 1) rectangle ++ (-2.5, 1);
\draw[thin, gray] (0,0) -- (2,2) (0,2) -- (2,3) (0,4) -- (2,4);
&
\draw (0,0) rectangle (2.5,1) rectangle ++ (-2.5,1) rectangle ++ (2.5,1) rectangle ++ (-2.5,1);
\draw (-2,2) rectangle ++ (-2.5, 1) rectangle ++ (2.5, 1);
\draw[thin, gray] (0,0) -- (-2,2) (0,2) -- (-2,3) (0,4) -- (-2,4);
\begin{scope}[-latex, shorten >=5pt, shorten <=8pt]
\draw (-2, 2.4) -- (0, 0.5);
\draw (-2, 2.6) -- (0, 1.5);
\draw (-2, 3.4) -- (0, 2.5);
\draw (-2, 3.6) -- (0, 3.5);
\end{scope}
\node at (-1.25,1.95) [red]{\Huge\bfseries{?}};
\node at (-1.25,3.32) [red]{\Huge\bfseries{?}};
\\
};
\end{tikzpicture}
\end{document}
在这个例子中,我希望看到周围的边界框细胞,但它只修改了nodes
里面单元格。我希望一旦我实际添加,框架就能看到我所做的更改column 1={anchor=east}, column 2={anschor=west}
。请注意,为了简洁起见,此示例只有一行,但实际矩阵有几行。
作为进一步的福利,我想在单元格的左上角和底部中央添加一个标签。因此,从单元格中获取这些位置会很棒,因为实际的单元格图片可能更小。
从 tikz 手册第 204 页的这个例子中可以看出这一点:
\begin{tikzpicture}[every node/.style={draw}]
\matrix [draw=red]
{
\node[left] {Hallo}; \fill[blue] (0,0) circle (2pt); \\
\node {X}; \fill[blue] (0,0) circle (2pt); \\
\node[right] {g}; \fill[blue] (0,0) circle (2pt); \\
};
\end{tikzpicture}
节点的边框明显小于列的宽度。
草图解释
为了明确所需的结果,我添加了上面的草图。
- 我想用线条将矩阵中的图像分开。最好像下面草图中的绿线那样,不过外框也是可以接受的。
- 我想将第一列的图片对齐到右侧,将第二列的图片对齐到左侧。 (crude)
x
和 (crude)的smiley
尺寸都比列小得多,但分别在列内右对齐/左对齐(我以为column 1/.style={node={anchor=east}
可以做到但我无法让它工作)。此外,我想将内容垂直居中在行内。(我试图用蓝色线条表示这一点) - 我想在矩阵单元格的角落位置添加标签(酒红色)
答案1
我认为以下内容涵盖了您请求的许多功能。我在代码后讨论了这些问题。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,matrix}
\begin{document}
\begin{tikzpicture}[very thick]
\matrix (m) [matrix of nodes, column sep=3ex, row sep=2ex,
column 1/.style={anchor=east}, column 2/.style={anchor=west},
nodes={draw}]{
{\tikz{\draw (0,0) rectangle (-2.5,1) rectangle ++ (2.5,1)
rectangle ++ (-2.5,1) rectangle ++ (2.5,1);
\draw (2,2) rectangle ++ (2.5, 1) rectangle ++ (-2.5, 1);
\draw[thin, gray] (0,0) -- (2,2) (0,2) -- (2,3) (0,4) -- (2,4);
}}
&
{\tikz{\draw (0,0) rectangle (2.5,1) rectangle ++ (-2.5,1)
rectangle ++ (2.5,1) rectangle ++ (-2.5,1);
\draw (-2,2) rectangle ++ (-2.5, 1) rectangle ++ (2.5, 1);
\draw[thin, gray] (0,0) -- (-2,2) (0,2) -- (-2,3) (0,4) -- (-2,4);
\begin{scope}[-latex, shorten >=5pt, shorten <=8pt]
\draw (-2, 2.4) -- (0, 0.5);
\draw (-2, 2.6) -- (0, 1.5);
\draw (-2, 3.4) -- (0, 2.5);
\draw (-2, 3.6) -- (0, 3.5);
\end{scope}
\node at (-1.25,1.95) [red]{\Huge\bfseries{?}};
\node at (-1.25,3.32) [red]{\Huge\bfseries{?}};}}
\\
x& y\\
z& p \( \frac{\sum_{n=1}^{50} n^2}{\sin(\theta)} \)\\
};
% Labels
\path (m.west) |- (m-2-1.north) node[pos=0.5,right,violet]
{\textsf{Label 1}}; 1
\path (m.east) |- (m-2-2.south) node[pos=0.5,left,violet]
{\textsf{Label 2}};
% Rules
\path (m.north) -| ($(m-1-1.east)!0.5!(m-1-2.west)$) node[pos=0.5] (t) {};
\path (m.south) -| ($(m-3-1.east)!0.5!(m-3-2.west)$) node[pos=0.5] (b) {};
\draw[green] (t) -- (b);
\foreach \i/\j in {1/2,2/3} {
\path (m.west) |- ($(m-\i-1.south)!0.5!(m-\j-1.north)$) node[pos=0.5] (l) {};
\path (m.east) |- ($(m-\i-1.south)!0.5!(m-\j-1.north)$) node[pos=0.5] (r) {};
\draw[green] (l) -- (r); };
\end{tikzpicture}
\end{document}
首先,正如我在评论中指出pgfmanual
的matrix of nodes
那样
如果您的单元格以
\path
命令或任何扩展为 的命令开头\path
,其中包括\draw
、\node
和\fill
其他命令,则\node{
启动代码和};
代码将被抑制。
如果您希望此类型的单元格成为节点,一种解决方法是将材料放入命令中,\tikz
如下所示:
{\tikz{....}}
指定包含锚点的列样式允许列左/右对齐。您可以通过 为特定单元格指定锚点|[anchor=...]|
,这也允许您将材料垂直居中在一行中。
最后,给出matrix
一个标签,(m)
允许将第 (i,j) 个单元格中的节点称为(m-i-j)
,并将矩阵称为单个节点(m)
,这样您就可以在以后的tikz
构造中挑选出图中的各个位置。因此,在上面的代码中,我通过从这些节点构造的点在单元格之间绘制了线条。我也用它来放置标签。请注意,(m-i-j)
是单元格中的节点,而不是整个单元格,因此您必须小心计算哪些点。
答案2
您的问题似乎是如何对齐多个图形tikzpictures
并将其放置labels
在它们之上。一种可能性是使用环境选项remember picture
来对齐图形。overlay
tabular
请看下面的代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tabular}{rl}
\begin{tikzpicture}[very thick,remember picture,baseline=(current bounding box.center)]
\node[draw,minimum height=3cm,minimum width=2cm] (a) {A};
\end{tikzpicture}
&
\begin{tikzpicture}[very thick,remember picture,baseline=(current bounding box.center)]
\node[draw,minimum height=2cm,minimum width=3cm] (b) {B};
\end{tikzpicture}
\\
\begin{tikzpicture}[very thick,remember picture,baseline=(current bounding box.center)]
\node[draw,minimum height=1cm,minimum width=1cm] (c) {C};
\end{tikzpicture}
&
\begin{tikzpicture}[very thick,remember picture,baseline=(current bounding box.center)]
\node[draw,minimum height=2cm,minimum width=2cm] (d) {D};
\end{tikzpicture}
\end{tabular}
\begin{tikzpicture}[remember picture,overlay]
\path (a.east) -- coordinate (aux-x) (b.west);
\path (a.south) -- coordinate (aux-y) (d.north);
\draw[green,very thick] (a.north-|aux-x)--(d.south-|aux-x);
\draw[green,very thick] (a.west|-aux-y)--(b.east|-aux-y);
\node[red, below=3mm of a.south west, anchor=north west] {Label 1};
\node[red, anchor=south east] at (b.east|-d.south) {Label 2};
\end{tikzpicture}
\end{document}
如您所见,四张不同大小的图片在 内对齐tabular
。baseline=(current bounding box.center)
所有图片在每一行中水平对齐,rl
表格选项在列内提供其垂直对齐。绘制数组后,您可以使用任何内容node
作为参考来绘制边框、放置标签或添加您想要的任何其他内容。请记住,编译两次以使所有内容都各归其位。结果是: