
У меня есть следующая блок-схема:
Чтобы нарисовать это в латексе, я написал следующее:
\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}