
次の LaTex コードがあります:
% !TEX TS-program = pdflatex
% !TEX encoding = UTF-8 Unicode
\documentclass[14pt, a4paper]{article} % use larger type; default would be 10pt
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows}
\usetikzlibrary{shapes.multipart}
\oddsidemargin=-15.4mm
\textwidth=190mm
\headheight=-32.4mm
\textheight=277mm
\tolerance=100
\parindent=0pt
\parskip=8pt
\pagestyle{empty}
\tikzstyle{startstop} = [rectangle, rounded corners, minimum width=3cm, minimum height=1cm,text centered, draw=black, fill=blue!50]
\tikzstyle{io} = [trapezium, trapezium left angle=70, trapezium right angle=110, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=red!50]
\tikzstyle{process} = [rectangle, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=gray!50]
\tikzstyle{decision} = [diamond, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=green!50]
\tikzstyle{loop} = [rectangle split, rectangle split parts=2,draw, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=gray!50]
\tikzstyle{arrow} = [thick,->,>=stealth]
\begin{document}
{\textbf{Задача 1.}}
\\
Схема алгоритма:
\\
\begin{center}
\begin{tikzpicture}[node distance=2cm]
\node (start) [startstop] {Начало};
\node (input) [io, below of=start] {Ввод n};
\node (ds1) [decision, below of=input, yshift=-0.4cm]{n = 0?};
\node (y-case) [process, right of=ds1, xshift=2cm]{pow = 1};
\node (while) [loop, below of=ds1, yshift=-0.4cm]{
\nodepart{one} While n > 0
\nodepart{two}
\begin{tabular}{cc}
n = n //10 \\
pow = pow +1 \\
\end{tabular}
};
\node (output) [io, below of=while, ]{Вывод pow};
\node (stop) [startstop, below of=output] {Конец программы};
\draw[arrow] (start) -- (input);
\draw[arrow] (input) -- (ds1);
\draw[arrow] (ds1) -- node[anchor=south]{Yes}(y-case);
\draw[arrow] (y-case) |- (while);
\draw[arrow] (ds1) -- node[anchor=east]{No}(while);
\draw[arrow] (while) -- (output);
\draw[arrow] (output) -- (stop);
\end{tikzpicture}
\end{center}
\end{document}
「NO」矢印の動作を、ダイヤモンド ブロックの左隅から移動するように定義するにはどうすればよいですか (現在は下隅から移動しています)。
答え1
このような?
\documentclass[12pt, a4paper]{article}
\usepackage[russian]{babel}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
chains, % new
positioning, % new
quotes, % new
shapes.geometric,
shapes.multipart,
babel
}
\oddsidemargin=-15.4mm % for this settings is better to use >"geometry" package
\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},
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{Задача 1.} \\
Схема алгоритма: \\
\begin{center}
\begin{tikzpicture}[FlowChart,
base/.append style = {on chain, join=by arrow},
node distance = 5mm and 7mm,
start chain = A going below
]
% nodes in chain
\node (start) [startstop] {Начало};
\node (input) [io] {Ввод n};
\node (ds1) [decision] {n = 0?};
\node (while) [loop,
suspend join] {\nodepart{one} While n > 0
\nodepart{two} \begin{tabular}{cc}
n = n //10 \\
pow = pow +1 \\
\end{tabular}
};
\node (output) [io] {Вывод pow};
\node (stop) [startstop] {Конец программы};
% right branch
\node (y-case) [process,right=of ds1,
suspend join] {pow = 1};
%
\draw[arrow] (ds1) to ["Yes"] (y-case);
\draw[arrow] (y-case) |- (while);
\draw[arrow] (ds1.west) to ["No" '] ++ (-1,0) |- (while); % new
\end{tikzpicture}
\end{center}
\end{document}
注記: 上記の MWE は、あなたのものと比較して、次の点が変更されています。
- 画像要素のスタイルは
tikset
非推奨の代わりに使用されますtikzstyle
positioning
fo ノードの配置には、ライブラリで定義された構文が使用されます(right=of ds1
の代わりにright of=ds1
)- ノードはチェーン状に編成されており、コードが簡素化され、より短く明確になります。
- 垂直接続線はマクロで定義されたマクロによって描画され
join
ますchains
join
メインブランチの最後のノードと決定ノードの右のノードの間の線は、スタイルコードによって中断されます。suspend join