
我想用 while 迴圈和其中的一些操作製作流程圖。我寫了下面的乳膠程式碼:
\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}
目前我得到這個:
如何將「輸出節點」放入for迴圈節點中?另外,對於另一個程序,我需要將整個決策節點放入 for 迴圈中。這可能嗎?
答案1
第二個(稍微複雜一點)範例:
\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}
筆記:
- 對於這張圖片我改變了
FlowChart
風格。因此,現在已修正/採用此新版本。請參閱您之前的問題。 - 您可以按照與上面相同的方式繪製第一個草圖。主要區別在於,它僅包含一個節點 (
io
)
附錄:
假設您只有一張這樣的合成影像,您可以開始繪製其合成影像,並在其上方f2
和下方新增節點f1
。為此,有必要更換舊樣式
arrow/.style = {thick,-Triangle},
兩個新的箭頭方向相反:
arr/.style = {thick,-Triangle},
arl/.style = {thick,Triangle-},
完整的 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}
當然,以上只是解決您問題的一種可能方法。其中之一可以是,您為內部節點單獨繪製圖像,將其儲存在某些節點中\savebox
並在選定節點中使用作為\node [...] {\usebox{˙<\saveboxname>}
。為了展示這個選項,我需要更多的空閒時間。