
Ich möchte ein Flussdiagramm mit While-Schleife und einigen darin enthaltenen Aktionen erstellen. Ich habe den folgenden Latex-Code geschrieben:
\documentclass[12pt, a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
chains,
positioning,
quotes,
shapes.geometric,
shapes.multipart,
babel
}
\oddsidemargin=-15.4mm
\textwidth=190mm
\headheight=-32.4mm
\textheight=277mm
\tolerance=100
\parindent=0pt
\parskip=8pt
\pagestyle{empty}
\makeatletter
\tikzset{FlowChart/.style={ % <--- corrected, new
base/.style = {draw,
minimum width=3cm, minimum height=1cm, align=center,
outer sep=0pt,
on chain, join=by arrow},
startstop/.style = {base, rounded corners, fill=blue!30},
process/.style = {base, fill=orange!30},
decision/.style = {base, diamond, aspect=1.3, fill=green!30},
io/.style = {base, trapezium, trapezium stretches body,
trapezium left angle=70, trapezium right angle=110,
fill=red!30,
text width =\pgfkeysvalueof{/pgf/minimum width} - 2*\pgfkeysvalueof{/pgf/inner xsep}
},
loop/.style = {base, rectangle split, rectangle split parts=2,
fill=gray!50},
arrow/.style = {thick,-Triangle},
% suspend
suspend join/.code={\def\tikz@after@path{}}
}
}% end of tikzset
\makeatother
\begin{document}
{\textbf{Задача 2.}}
\\
Схема алгоритма:
\\
\begin{center}
\begin{tikzpicture}[FlowChart,
node distance = 1cm and 3cm,
start chain = A going below
]
\node (start) [startstop] {Start};
\node (input) [io] {Input n};
\node (for) [loop]{
\nodepart{one} for i = 1; i<len(n); i++
\nodepart{two} Output n[i].
};
\node (stop) [startstop, below of=for] {End of programm};
\end{tikzpicture}
\end{center}
\end{document}
Derzeit erhalte ich Folgendes:
Wie kann ich den „Ausgabeknoten“ in einen For-Schleifenknoten einfügen? Außerdem muss ich für ein anderes Programm einen ganzen Entscheidungsknoten in eine For-Schleife einfügen. Ist das überhaupt möglich?
Grafisch soll der Loop-Block folgendermaßen aussehen:
Und für ein anderes Programm möchte ich, dass es so aussieht:
Antwort1
das zweite (etwas komplexere) Beispiel:
\documentclass[12pt, a4paper]{article}
\usepackage[russian]{babel}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
chains,
fit, % new
positioning,
quotes,
shapes.geometric,
shapes.multipart,
babel
}
\usepackage[margin=10mm]{geometry}
\tolerance=100
\parindent=0pt
\parskip=8pt
\pagestyle{empty}
\makeatletter
\tikzset{FlowChart/.style={
base/.style = {draw,
minimum width=3cm, minimum height=1cm, align=center,
outer sep=0pt},
startstop/.style = {base, rounded corners, fill=blue!30},
process/.style = {base, fill=orange!30},
decision/.style = {base, diamond, aspect=1.3, fill=green!30},
FIT/.style = {base, semithick, inner sep=3mm, fit=##1}, % new
io/.style = {base, trapezium, trapezium stretches body,
trapezium left angle=70, trapezium right angle=110,
fill=red!30,
text width =\pgfkeysvalueof{/pgf/minimum width} - 2*\pgfkeysvalueof{/pgf/inner xsep}
},
loop/.style = {base, rectangle split, rectangle split parts=2,
fill=gray!50},
arrow/.style = {thick,-Triangle},
% suspend
suspend join/.code={\def\tikz@after@path{}}
}
}% end of tikzset
\makeatother
\begin{document}
\begin{center}
\begin{tikzpicture}[FlowChart,
node distance = 5mm and 7mm,
start chain = going below
]
\node (d1) [decision] {$n>0$};
\node (d2) [process,
below right=of d1.south] {n=n+1};
\coordinate[below=of d1 |- d2.south] (aux1);
\node (d3) [io,
below=of aux1] {output};
%
\draw (d1) -| node[pos=0.25,above] {Yes} (d2) |- (aux1)
(d1.west) -- node[pos=0.25,above] {No} ++
(-1,0) coordinate (aux2) |- (aux1);
\draw[arrow] (aux1) -- (d3);
% fit
\node (f1) [FIT=(d1) (aux2) (d2) (d3)] {};
\node (f2) [FIT=(f1.north west) (f1.north east),
inner sep=0pt,
above=0pt of f1]
{for $j=1$; $j<\mathrm{len}(r)$; $j+1$};
\end{tikzpicture}
\end{center}
\end{document}
Notiz:
- für dieses Bild habe ich
FlowChart
den Stil geändert. Dementsprechend ist er jetzt für diese neue Version korrigiert/angepasst. Siehe Ihre vorherige Frage. - Die erste Skizze können Sie auf die gleiche Weise wie oben zeichnen. Der Hauptunterschied besteht darin, dass sie nur einen Knoten enthält (
io
)
Nachtrag:f2
Angenommen, Sie haben nur ein solches zusammengesetztes Bild, können Sie mit dem Zeichnen seiner Komposition beginnen und Knoten über und unter dem Knoten hinzufügen f1
. Dazu ist es notwendig, den alten Stil zu ersetzen
arrow/.style = {thick,-Triangle},
mit zwei neuen, deren Pfeile in entgegengesetzte Richtungen zeigen:
arr/.style = {thick,-Triangle},
arl/.style = {thick,Triangle-},
Komplettes MWE:
\documentclass[12pt, a4paper]{article}
\usepackage[russian]{babel}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
chains,
fit, % new
positioning,
quotes,
shapes.geometric,
shapes.multipart,
babel
}
\usepackage[margin=10mm]{geometry}
\tolerance=100
\parindent=0pt
\parskip=8pt
\pagestyle{empty}
\makeatletter
\tikzset{FlowChart/.style={
base/.style = {draw,
minimum width=3cm, minimum height=1cm, align=center,
outer sep=0pt},
startstop/.style = {base, rounded corners, fill=blue!30},
process/.style = {base, fill=orange!30},
decision/.style = {base, diamond, aspect=1.3, fill=green!30},
FIT/.style = {base, semithick, inner sep=3mm, fit=##1}, % new
io/.style = {base, trapezium, trapezium stretches body,
trapezium left angle=70, trapezium right angle=110,
fill=red!30,
text width =\pgfkeysvalueof{/pgf/minimum width} - 2*\pgfkeysvalueof{/pgf/inner xsep}
},
loop/.style = {base, rectangle split, rectangle split parts=2,
fill=gray!50},
arr/.style = {thick,-Triangle},
arl/.style = {thick,Triangle-},
% suspend
suspend join/.code={\def\tikz@after@path{}}
}
}% end of tikzset
\makeatother
\begin{document}
\begin{center}
\begin{tikzpicture}[FlowChart,
node distance = 5mm and 13mm,
start chain = A going above,
start chain = B going below
]
% nodes in node
\node (d1) [decision] {$n>0$};
\node (d2) [process,
below right=of d1.south] {n=n+1};
\coordinate[below=of d1 |- d2.south] (aux1);
\node (d3) [io,
below=of aux1] {output};
%
\draw (d1) -| node[pos=0.25,above] {Yes} (d2) |- (aux1)
(d1.west) -- node[pos=0.25,above] {No} ++
(-1,0) coordinate (aux2) |- (aux1);
\draw[arr] (aux1) -- (d3);
% fit
\begin{scope}[nodes={on chain=B, join= by arr}]
\node (f1) [FIT=(d1) (aux2) (d2) (d3)] {};
% nodes below f1
\node (output) [io,
below=of f1] {Вывод pow};
\node (stop) [startstop] {Конец программы};
\end{scope}
\begin{scope}[nodes={on chain=A, join= by arl}]
\node (f2) [FIT=(f1.north west) (f1.north east),
inner sep=0pt,
above=0pt of f1]
{for $j=1$; $j<\mathrm{len}(r)$; $j+1$};
% nodes above f2
\node (ds1) [decision,
above=of f2] {$n = 0?$};
\node (input) [io] {Ввод n};
\node (start) [startstop] {Начало};
\end{scope}
\node (y-case) [process,right=of ds1] {pow = 1};
%
\draw[arr] (ds1) to ["Yes"] (y-case);
\draw[arr] (y-case) |- (f2);
\draw[arr] (ds1.west) to [pos=0.2, "No" '] ++ (-3,0) |- (f2); % new
\end{tikzpicture}
\end{center}
\end{document}
Natürlich ist oben nur eine der möglichen Lösungen für Ihr Problem aufgeführt. Eine andere Möglichkeit wäre, dass Sie das Bild für den Knoten separat zeichnen, es irgendwo speichern \savebox
und es dann im ausgewählten Knoten verwenden \node [...] {\usebox{˙<\saveboxname>}
. Um diese Option anzuzeigen, brauche ich etwas mehr Freizeit.