如何让流程图看起来更好看?

如何让流程图看起来更好看?

我有以下流程图:

在此处输入图片描述

为了在 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}

在此处输入图片描述

相关内容