
다음과 같은 순서도가 있습니다.
이것을 Latex로 그리기 위해 다음과 같이 작성했습니다.
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\begin{document}
\pagestyle{empty}
% Define block styles
\tikzstyle{block} = [rectangle, draw, text width=5.5em, text centered, minimum height=4em]
\tikzstyle{line} = [draw, -latex']
\begin{tikzpicture}[node distance = 2.5cm, auto]
% Place nodes
\node [block] (init) {Statement};
\node [block, below of=init] (asVl) {Assisgnment\\by-value};
\node [block, left of=asVl] (cons) {Constructor};
\node [block, right of=asVl] (asRt) {Assisgnment\\by-return};
\node [block, below of=asRt] (d2) {dependent\\(dependee)};
\node [block, left of=d2] (d1) {dependee};
\node [block, right of=d2] (d3) {dependent\\(not dependee)};
\node [block, below of=d3] (red) {redundant};
\node [block, left of=red] (nonred) {non-redundant};
\node [block, below of=nonred] (noRem) {Statement cannot be removed};
\node [block, right of=noRem] (rem) {Statement can be removed};
% Draw edges
\path [line] (init) -- (cons);
\path [line] (init) -- (asVl);
\path [line] (init) -- (asRt);
\path [line] (asRt) -- (d1);
\path [line] (asRt) -- (d2);
\path [line] (asRt) -- (d3);
\path [line] (d3) -- (red);
\path [line] (d3) -- (nonred);
\path [line] (red) -- (rem);
\path [line] (cons) -- (noRem);
\path [line] (asVl) -- (noRem);
\path [line] (d1) -- (noRem);
\path [line] (d2) -- (noRem);
\path [line] (nonred) -- (noRem);
\end{tikzpicture}
\end{document}
그러면 다음 순서도가 생성됩니다.
이 흐름도에는 몇 가지 문제가 있습니다. 첫째, 위 차트처럼 상자를 연결하는 선을 직선으로 만들려면 어떻게 해야 합니까? (상단의 각 상자와 하단의 상자 사이를 연결하는 수평선이 있습니다). 둘째, 레이블을 왼쪽(유형, 종속성 및 중복성)에 배치하는 데 어려움을 겪었습니다. 셋째, 마지막 상자(문은 제거할 수 없음)를 위 차트의 크기와 정확히 같도록 확장하려면 어떻게 해야 합니까?
이러한 문제를 해결하는 방법에 대한 제안 사항이 있습니까?
답변1
나는 이것이 올바른 방향을 가리켜야 한다고 생각합니다. 일부 오프셋은 선택에 따라 조정될 수 있습니다.
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,calc,positioning}
\begin{document}
\pagestyle{empty}
% Define block styles
\tikzstyle{block} = [rectangle, draw, text width=2cm, text centered, minimum
height=3em]
\tikzstyle{line} = [draw, -latex']
\begin{tikzpicture}[node distance = 2.5cm, auto]
% Place nodes
\node [block] (init) {Statement};
\node [block, below of=init] (asVl) {Assisgnment\\by-value};
\node [block, left of=asVl] (cons) {Constructor};
\node [block, right of=asVl,xshift=2cm] (asRt) {Assisgnment\\by-return};
\node [block, below of=asRt] (d2) {dependent\\(dependee)};
\node [block, left of=d2] (d1) {dependee};
\node [block, right of=d2] (d3) {dependent\\(not dependee)};
\node [block, below of=d3,xshift=2cm] (red) {redundant};
\node [block, below of=d3,xshift=-2cm] (nonred) {non-redundant};
\node [block, below of=red] (rem) {Statement can be removed};
\node [minimum height=3em,text width=5cm,minimum width=10cm,draw, left
of=rem,xshift=-5cm] (noRem) {Statement cannot be removed};
% Draw edges
\path [line] ($(init.south)+(0,-4pt)$) -| (cons.north);
\path [line] (init) -- (asVl);
\path [line] ($(init.south)+(0,-4pt)$) -|(asRt);
\path [line] ($(asRt.south)+(0,-4pt)$) -| (d1.north);
\path [line] (asRt) -- (d2);
\path [line] ($(asRt.south)+(0,-4pt)$) -| (d3.north);
\path [line] (d3)--($(d3.south)+(0,-4pt)$) -| (red.north);
\path [line] (d3)--($(d3.south)+(0,-4pt)$) -| (nonred.north);
\coordinate(temp) at ($(asVl.south)+(0,-3cm)$);
\path[draw] (temp) -- (asVl);
\path[draw] (temp) -| (cons.south);
\path[draw] (temp) -| (d1.south);
\path[draw] (temp) -| (d2.south);
\path[draw] (temp) -| (d1.south);
\path[line] (temp) -| (noRem.north);
\path[line] (nonred)--($(nonred.south)+(0,-4pt)$) -| (noRem.north);
\path[line] (red) -- (rem);
\end{tikzpicture}
\end{document}
답변2
˙forest
귀하의 순서도는 나무에 대해 생각나게 하므로 나무 그리기 전용 패키지 를 사용하여 그리는 것이 귀하의 의견에 좋은 결과를 주는지 확인하십시오 .
\documentclass{article}
\usepackage[edges]{forest}
\usetikzlibrary{arrows.meta,
positioning}
\tikzset{N/.style = {font=\bfseries, rotate=90, anchor=south}}
\begin{document}
\pagestyle{empty}
\begin{forest}
for tree = {
% nodes
draw,
text width = 7em,
minimum height = 3em,
text centered,
font = \small\linespread{0.84}\selectfont,
% tree
grow = south,
anchor = north,
forked edge,
l sep = 12mm,
s sep = 1mm,
fork sep = 6mm,
tier/.option = level,
edge = {-Latex}
}
[Statement
[Assisgnment by-return, name=asRt]
[Constructor,
[Statement cannot be removed, text width=8em,
name=cannot, tier=L4]
]
[Assisgnment\\ by-value,
[dependee, name=d1]
[dependent\\(dependee), name=d2,before computing xy={s/.average={s}{siblings}}]
[dependent\\(not dependee), text width=7em
[non-redundant, name=nonred]
[redundant
[Statement can be removed, tier=L4]
]
]
]
]
\coordinate[above=4mm of cannot] (aux2);
\coordinate[above=24mm of aux2] (aux1);
\draw (asRt) |- (aux1)
(d1) |- (aux1)
(d2) |- (aux1)
(nonred) |- (aux2);
\node (L1) [left=2mm of asRt, N] {Type};
\node [left=0mm of L1.south |- d1,N] {Dependency};
\node [left=0mm of L1.south |- nonred,N, ] {Redudancy};
\end{forest}
\end{document}