순서도를 더 보기 좋게 만드는 방법은 무엇입니까?

순서도를 더 보기 좋게 만드는 방법은 무엇입니까?

다음과 같은 순서도가 있습니다.

여기에 이미지 설명을 입력하세요

이것을 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}

여기에 이미지 설명을 입력하세요

관련 정보