Netzplan in TikZ - matrix of nodes mit Multispalten Nodes?

Tabellen und Grafiken erstellen und anordnen


TeXtastisch
Forum-Newbie
Forum-Newbie
Beiträge: 1
Registriert: Mo 14. Sep 2020, 10:43

Netzplan in TikZ - matrix of nodes mit Multispalten Nodes?

Beitrag von TeXtastisch »

Hallo, ich arbeite momentan an einer Ausarbeitung zu Projektmanagement Methoden. Ich konnte bereits erfolgreich ein Ornanigramm in tikz darstellen. Auch einen Phasenplan konnte ich mit dem TikZ Layer pgfgantt relativ fix erstellen. Aber bei einem sogenannten "Netzplan" verzweifle ich grade. Meine Internetrecherche hat mir da auch keine wirklich brauchbaren Ergebnisse geliefert. Wahrscheinlich ist der Begriff Netzplan auch zu genereisch.
Der Netzplan den ich machen möchte besteht aus mehreren "Vorgängen", welche mit Pfeilen verknüpft sind. Ein Vorgang kann beliebig viele vorherige oder Folgevorgänge haben. Ein Vorgang besteht aus 10 Feldern. Wobei in der ersten Reihe auch 2 Felder zusammen gefasst werden können. In der 2. Reihe ist dann ein Feld, welches sich über die Länge von 3 Feldern erstreckt und den Namen enthält. Darunter dann noch mal 2 Reihen mit jeweils 3 Feldern, welche Zahlen enthalten. Wenn ein Feld länger wird, sollte sich die ganze Matrix dem Anpassen und nicht nur eine Node entarten. (Siehe Anhang)
Ich hatte die Idee das mit einer Matrix of Nodes zu realisieren und diese mit chains zu verbinden. Aber ich scheitere daran eine Node zu erstellen, welche sich über die Länge von 3 Nodes erstreckt.

Hier einmal folgendes Minimalbeispiel (Erklärung folgt danach):

Code: Alles auswählen

\documentclass[fontsize=11pt]{scrartcl}
\usepackage[demo]{graphicx}
\usepackage{tikz}
\usetikzlibrary{matrix,fit,chains,scopes}
\begin{document}
	\begin{tikzpicture}[
		vorgang/.style={matrix of nodes},
		nodes={rectangle, draw},
		namerow/.style={white}]
		\matrix[vorgang] (vorgang1) 
		{
			0 & X & 0\\
			&Vorgang1&\\
			0 & 0 & 0\\
			0 & 0 & 0\\
		};
		
	\matrix[vorgang, right = of vorgang1] (vorgang2) 
	{
		2 & X & 7\\
		|[namerow]|.&|[namerow]|.&|[namerow]|.&\\
		0 & 0 & 7\\
		0 & 0 & 7\\
	};
	
	{	[start chain,every on chain/.style={join=by ->}]
		\chainin (vorgang1);
		\chainin (vorgang2);
	}
	
	\node[rectangle, draw, fit=(vorgang2-2-1)(vorgang2-2-2)(vorgang2-2-3)] {Vorgang2};
\end{tikzpicture}
\end{document}

Bei der Matrix vorgang1 habe ich die äußeren Felder in der 2. Reihe leer gelassen, dann weitet sich die Node aus schiebt die anderen beiseite, definitiv nicht das was ich möchte.
Bei der Matrix vorgang2 habe ich versucht die 3 Nodes zu erstellen und mit fit eine andere darüber zu legen, das ist aber weder schön, noch bringt es das gewünschte Ergebnis. Dies funktioniert nicht, wenn ich nur Leerzeichen in die Nodes schreibe, weswegen ich einfach Punkte dort eingefügt und diese weiß gefärbt habe. Nicht die schönste Lösung, und fit wirkt auch nicht ideal dafür.

Hat jemand eine Idee wie ich den Beschriebenen Netzplan in TikZ erstellen kann?

Oder gibt es ein Paket, welches eine einfache Lösung bereit stellt, wie z. B. pgfgantt für Phasenpläne?

Die letzte alternative wäre ein externes Programm, was ich aber gerne vermeiden würde. Aber ich wüsste auch nicht welches externe Programm, wichtig wäre das es mir eine Vektorgrafik erstellt.

Dateianhänge
Hier das Ergebnis des Codes. Bei Vorgang1 ist zu sehen wie die anderen Nodes beiseite geschoben werden. Bei Vorgang 2 habe ich mit fit eine Node über die 3 anderen Nodes gelegt, führt aber auch nicht zum gewünschten Ergebnis. Auch sind hier zwischen den Nodes in der 3. und 4. Reihe abstände, welche in der ersten Reihe nicht sind.
Hier das Ergebnis des Codes. Bei Vorgang1 ist zu sehen wie die anderen Nodes beiseite geschoben werden. Bei Vorgang 2 habe ich mit fit eine Node über die 3 anderen Nodes gelegt, führt aber auch nicht zum gewünschten Ergebnis. Auch sind hier zwischen den Nodes in der 3. und 4. Reihe abstände, welche in der ersten Reihe nicht sind.
Ein Beispiel wie ein Netzplan aussehen könnte. In LibreOffice Calc erstellt.
Ein Beispiel wie ein Netzplan aussehen könnte. In LibreOffice Calc erstellt.
netzplanBeispiel.png (10.96 KiB) 221 mal betrachtet

cis
Forum-Anfänger
Forum-Anfänger
Beiträge: 42
Registriert: Mi 22. Jul 2020, 20:14

Re: Netzplan in TikZ - matrix of nodes mit Multispalten Nodes?

Beitrag von cis »

Mir ist das offengestanden zu viel Roman für vermutlich wenig Problem. Tip: Versuche, wenn möglich, auf Einzelprobleme runterzubrechen (mit einfachen Beispielcodes), die man nicht nicht seitenweise erklären muss.

Dein Hauptproblem in einem Satz scheint: Du willst eine multicolumn in einer TikZ-matrix.
Diese gibt es nicht von Haus aus, man muss sie sich basteln:
nodes in empty cells, % <---- 1/2
row 2 column 2/.style={overlay}, % <---- 2/2 verhindert das "Aufspalten"

Ansonsten scheinen mir die Anpassungen sinnvoll:
minimum size=2em, % <---- !
text height=\ht\strutbox, text depth=\dp\strutbox, % <---- !

Im Folgenden muss die 2. Matrix in ähnlicher Weise angepasst werden:

55555a5.png

Code: Alles auswählen

\documentclass[fontsize=11pt]{scrartcl}
\usepackage[demo]{graphicx}
\usepackage{tikz}
\usetikzlibrary{matrix,fit,chains,scopes}
\begin{document}
\begin{tikzpicture}[
vorgang/.style={matrix of nodes, 
minimum size=2em, % <---- !
text height=\ht\strutbox, text depth=\dp\strutbox, % <---- !
},
row 2/.style={nodes={draw=none}}, % <---- !
nodes in empty cells, % <---- 1/2
row 2 column 2/.style={overlay}, % <---- 2/2 verhindert das "Aufspalten"
nodes={rectangle, draw},
namerow/.style={white}
]
\matrix[vorgang,
row 4 column 1/.style={nodes={fill=red}}, % <---- Bsp. einer Füllung
] (vorgang1) 
{
0 & X & 0\\
&  Vorgang1 & \\ % <---- !
0 & 0 & 0\\
0 & 0 & 0\\
};
% Linien nachzeichnen
\draw[blue, transform canvas={xshift=0.5\pgflinewidth}] (vorgang1-1-1.south west) -- (vorgang1-3-1.north west);
\draw[red, transform canvas={xshift=-0.5\pgflinewidth}] (vorgang1-1-3.south east) -- (vorgang1-3-3.north east);


% Ähnlich anpassen: 
	\matrix[vorgang, right = of vorgang1] (vorgang2) 
	{
		2 & X & 7\\
		|[namerow]|.&|[namerow]|.&|[namerow]|.&\\
		0 & 0 & 7\\
		0 & 0 & 7\\
	};
	
{	[start chain,every on chain/.style={join=by ->}]
	\chainin (vorgang1);
	\chainin (vorgang2);
}

\node[rectangle, draw, fit=(vorgang2-2-1)(vorgang2-2-2)(vorgang2-2-3)] {Vorgang2};
\end{tikzpicture}
\end{document}

Antworten