
Ich möchte eine Matrix erstellen, die mehrere Knoten in einer einzigen Matrixzelle hat. Diese Knoten sollten zueinander zentriert sein. Ich habe es geschafft, dies zum Laufen zu bringen, indem ich eine verschachtelte Tikz-Umgebung wie folgt verwendet habe:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[auto, semithick]
\tikzstyle{block} = [rectangle, draw,
minimum width=5em, text centered, rounded corners, minimum
height=4em]
\matrix[matrix of nodes, row sep = 2em,
nodes={anchor=center}
] (mx2){
% First row:
label1
&
\node{\tikz{
\node[block](n1){node1};
\node[block, right=of n1](n2){node2};
}};
\\
% Second row:
label2
&
\node{\tikz{
\node[block] (n3)
{node 3};
\node[block] (n4) [right=of n3]
{node 4};
\node[block] (n5) [right=of n4]
{node 5};
}};
\\
};
\draw (n1) -- (n4); % this fails
\end{tikzpicture}
\end{document}
Aufgrund der verschachtelten Tikz-Umgebungen ist es jetzt unmöglich, diese Knoten zu verbinden. Ich habe versucht, mithilfe der fit
Bibliothek ein ähnliches Bild zu erstellen, aber es hat nicht funktioniert. Kann mir jemand von euch helfen?
Vielen Dank im Voraus.
Antwort1
Generell kann man von der remember picture
Möglichkeit Gebrauch machen und sie anwendenalleBilder, die später zugänglich sein sollen. Da deine Bilder verschachtelt sind und die Optionen vererbbar sind, reicht es aus, sie remember picture
nur auf die oberste Ebene anzuwenden {tikzpicture}
.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[auto, semithick, remember picture,
block/.style={rectangle, draw,
minimum width=5em, text centered, rounded corners,
minimum height=4em, text width=5em}
]
\matrix[matrix of nodes, row sep = 2em,
nodes={anchor=center}
] (mx2){
% First row:
label1
&
\node{\tikz{
\node[block] (n1) {node1};
\node[block, right=of n1] (n2) {node2};
}};
\\
% Second row:
label2
&
\node{\tikz{
\node[block] (n3) {node 3};
\node[block] (n4) [right=of n3] {node 4};
\node[block] (n5) [right=of n4] {node 5};
}};
\\
};
\draw (n1) -- (n4); % this works
\end{tikzpicture}
\end{document}
Um das richtige Ergebnis zu erhalten, müssen Sie es zweimal kompilieren.
Beachten Sie, dass ich \tikzstyle{block}
durch ersetzt habe block/.style
, was die bevorzugte Methode ist. SieheSollten \tikzset oder \tikzstyle zum Definieren von TikZ-Stilen verwendet werden?.
Antwort2
Ich denke, matrix
die Bibliothek ist hier überflüssig (obwohl ich sie ständig missbrauche). Eine direkte Verwendung ist ebenfalls möglich und (meiner Meinung nach) bequemer. Die positioning
Bibliothek wird sowieso verwendet, also können wir uns weiterhin darauf verlassen.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[
block/.style={rectangle, draw,
minimum width=5em, text centered, rounded corners, minimum
height=4em,text width=5em}
]
\node (l1) at (0,2) {label 1};
\node (l2) at (0,0) {label 2};
\node[right = 2.5cm of l1,block] (n1) {Node 1};
\node[right = of n1,block] (n2) {Node 2};
\node[right = 1cm of l2,block] (n3) {Node 3};
\node[right = of n3,block] (n4) {Node 4};
\node[block,right=of n4] (n5) {node 5};
\draw (n1) -- (n4); % this fails not :)
\end{tikzpicture}
\end{document}
node distance
Beachten Sie, dass Sie die individuelle Positionierung und die Standardeinstellungen optional und auf die gleiche Weise verfolgen können, wie Sie es bei der Verwendung von Matrizen <direction> = x cm of nodename
tun müssten .row sep
column sep
BEARBEITENWie Altermundus bemerkte, können Sie Ihre Zeilen stapeln, indem Sie sie auf einem vordefinierten Koordinatenraster zentrieren.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[
block/.style={rectangle, draw, text centered, rounded corners, minimum height=4em}
]
\foreach \x in {0,...,2} \node[circle,inner sep=1mm,fill] (cent\x) at (2,2*\x) {};
%The center goes in between
\node[right=of cent0,block] (n1) {A very wide node 1};
\node[left =of cent0,block] (n2) {2};
%The center hits the node
\node[block] at (cent1) (n4) {node 4};
\node[block,left =of n4] (n3) {Also a quite wide node 3};
\node[block,right=of n4] (n5) {5};
\draw (n1) -- (n4); % this fails not :)
%This uses eyeballing after compiling. Choose the widest and adjust.Can be absolute too.
\node[left= of n3] (l2) {label 2};
\node (l1) at (l2 |- cent0){label 1};
\node (l3) at (l2 |- cent2){label 3};
\end{tikzpicture}
\end{document}
Antwort3
Sie können die verschachtelten Bilder vermeiden
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[auto, semithick,remember picture,
block/.style={rectangle, draw,
minimum width=5em, text centered, rounded corners, minimum
height=4em,text width=5em}
]
\matrix[matrix of nodes, row sep = 2em,
nodes={anchor=center}
] (mx2){
% First row:
label1
&
\node[block,right=1em,anchor=west](n1){node1};
\node[block, right=of n1](n2){node2};
\\
% Second row:
label2
&
\node[block] (n3) {node 3};
\node[block] (n4) [right=of n3] {node 4};
\node[block] (n5) [right=of n4] {node 5};
\\
};
\draw (n1) -- (n4); % this fails
\end{tikzpicture}
\end{document}