
Ich habe ein npm-Paket erstellt, um ganz einfach ein TIKZ-Flussdiagramm zu schreiben. Flowtex erleichtert die Wartung eines Flussdiagramms. Beispielsweise das Einfügen neuer Knoten oder die Positionierung der Knoten als Funktion anderer. Ich hoffe, es wird Ihnen genauso nützlich sein wie mir.
https://www.npmjs.com/package/flowtex
Verwenden von flowtex.sty auf GitHubbezogen aufErstellen von Flussdiagrammen mit TikZ
Flussdiagramm
Flowtex-Code
flowchart.offsetX("3");
N('Start').belowGoto(
P('k <- 0').belowGoto(
loop = IO('Loop ?').belowGoto(
D('Yes or No ?').offsetY(-1) // use offsetY with D
.rightGoto(kp1 = P('k <- k + 1')).topLabel('yes')
.belowGoto( // use offsetY for this node because is immediatly below of D
P('Print k').offsetY(-1).belowGoto(
P('Stop')
).leftLabel('exit')
).leftLabel('no')
).leftLabel('Looping')
).leftLabel('Start loop')
).leftLabel('Init');
kp1.goto(loop).brokenArrow();
LaTeX-Code mit TIKZ
\begin{center}
\begin{tikzpicture}[node distance=2cm]
\node (node0) [startstop] {Start};
\node (node1) [process, below of=node0] {k $\leftarrow$ 0};
\node (node2) [io, below of=node1] {Loop ?};
\node (node3) [decision, below of=node2, yshift=-1cm] {Yes or No ?};
\node (node4) [process, right of=node3, xshift=3cm] {k $\leftarrow$ k + 1};
\node (node5) [process, below of=node3, yshift=-1cm] {Print k};
\node (node6) [process, below of=node5] {Stop};
\draw [arrow] (node3) --node[anchor=south] {yes} (node4);
\draw [arrow] (node3) --node[anchor=east] {no} (node5);
\draw [arrow] (node5) --node[anchor=east] {exit} (node6);
\draw [arrow] (node2) --node[anchor=east] {Looping} (node3);
\draw [arrow] (node1) --node[anchor=east] {Start loop} (node2);
\draw [arrow] (node0) --node[anchor=east] {Init} (node1);
\draw [arrow] (node4) |- (node2);
\end{tikzpicture}
\end{center}
Derzeit verwende ich \input, um den generierten LaTeX-Code einzufügen. Ich möchte jedoch einen LaTeX-Befehl wie diesen erstellen:
\begin{flowtex}
Here, the Flowtex code.
\end{flowtex}
Wüssten Sie, wie das geht?
Antwort1
Eine Alternative zur Antwort von @A.Ellet (beide berücksichtigen die erste Version Ihrer Frage):
\documentclass[border=3mm,
tikz]{standalone}
\usetikzlibrary{arrows.meta,
calc, chains,
quotes,
positioning,
shapes.geometric}
\begin{document}
\begin{tikzpicture}[
node distance = 8mm and 16mm,
start chain = A going below,
base/.style = {draw, minimum width=32mm, minimum height=8mm,
align=center, on chain=A},
startstop/.style = {base, rounded corners, fill=red!30},
process/.style = {base, fill=orange!30},
io/.style = {base, trapezium,
trapezium left angle=70, trapezium right angle=110,
fill=blue!30},
decision/.style = {base, diamond, fill=green!30},
every edge quotes/.style = {auto=right}]
]
\node [startstop] {Start}; % <-- A-1
\node [process] {k $\gets$ 0};
\node [io] {Loop ?};
\node [decision] {Yes or No ?};
\node [process] {Print k};
\node [process] {Stop}; % <-- A-6
%
\node [process, % <-- A-7
right=of A-4] {k $\gets$ k + 1};
%%
\draw [arrows=-Stealth]
(A-1) edge["init"] (A-2)
(A-2) edge["start stop"] (A-3)
(A-3) edge["looping"] (A-4)
(A-4) edge["no"] (A-5)
(A-5) edge["exit"] (A-6)
(A-4) edge["yes"'] (A-7) % <-- by ' is swapped label position
(A-7) |- ($(A-2.south east)!0.5!(A-3.north east)$)
-| ([xshift=7mm] A-3.north);
\end{tikzpicture}
\end{document}
Aus dem Vergleich der beiden Lösungen lassen sich folgende Hauptunterschiede erkennen:
- Knoten im Hauptzweig werden als Kette gesetzt (das vereinfacht den Code erheblich)
- für Knotennamen werden Namen verwendet, die durch die Kette definiert sind
- für die gemeinsamen Parameter der Knoten wird ein neuer Stil mit dem Namen definiert
base
- Zum Zeichnen von Kanten zwischen Knoten werden
quotes
Pakete verwendet, wodurch die Syntax zum Schreiben von Kantenbeschriftungen deutlich kürzer ist als der benötigte Code.
Die Zusammenstellung des obigen MWE (Minimal Working Example) erzeugt ein ähnliches Bild wie in der Antwort von @A.Ellett, mit wichtigen Unterschieden: Die Rückkopplungskante wird (meiner Meinung nach) korrekter gezeichnet.
Antwort2
In deinem MWE fehlt einiges: welche Bibliotheken du verwendest usw. Trotzdem habe ich hier nicht wirklich etwas gemacht. Ich habe deinen Code kopiert und dann den Rest vondiese Webseite.
Abgesehen von der Farbe sollte der folgende Code das tun, was Sie möchten.
\documentclass[border=4pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}[
node distance=2cm,
startstop/.style={rectangle, rounded corners, minimum width=3cm, minimum height=1cm,text centered, draw=black, fill=red!30},
process/.style={rectangle, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=orange!30},
io/.style={trapezium, trapezium left angle=70, trapezium right angle=110, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=blue!30},
decision/.style={diamond, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=green!30},
]
\node (node0) [startstop] {Start};
\node (node1) [process, below of=node0] {k $\leftarrow$ 0};
\node (node2) [io, below of=node1] {Loop ?};
\node (node3) [decision, below of=node2, yshift=-1cm] {Yes or No ?};
\node (node4) [process, right of=node3, xshift=3cm] {k $\leftarrow$ k + 1};
\node (node5) [process, below of=node3, yshift=-1cm] {Print k};
\node (node6) [process, below of=node5] {Stop};
\draw [arrows=-Stealth] (node3) --node[anchor=south] {yes} (node4);
\draw [arrows=-Stealth] (node3) --node[anchor=east] {no} (node5);
\draw [arrows=-Stealth] (node5) --node[anchor=east] {exit} (node6);
\draw [arrows=-Stealth] (node2) --node[anchor=east] {Looping} (node3);
\draw [arrows=-Stealth] (node1) --node[anchor=east] {Start loop} (node2);
\draw [arrows=-Stealth] (node0) --node[anchor=east] {Init} (node1);
\draw [arrows=-Stealth] (node4) -- (node2);
\end{tikzpicture}
\end{document}
Ich überlasse es Ihnen, den Rest so zu optimieren, dass Sie die gewünschten Farben erhalten (schließlich bin ich farbenblind).