2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Блок-схемы в TeX
Сообщение12.10.2011, 11:59 
Подскажите, пожалуйста, как в TeX'е или MetaPost'е рисовать блок-схемы. Есть ли специализированные пакеты для этого?

 
 
 
 Re: Блок-схемы в TeX
Сообщение12.10.2011, 17:26 
Насчет Metapost'а не знаю, но в LaTeX'е есть пакет PGF/Tikz, который позволяет, в том числе, построение блок-схем:
\usetikzlibrary{shapes, arrows}

\tikzstyle{decision} =
	[
		diamond,
		draw,
		fill = green!20,
		text width = 6em,
		text badly centered,
		node distance = 2cm,
		inner sep = 0pt
	]
\tikzstyle{block} =
	[
		rectangle,
		draw,
		fill = blue!20,
		text width = 6em,
		text centered,
		rounded corners,
		minimum height = 2em
	]
\tikzstyle{line} =
	[
		draw,
		-latex'
	]
\tikzstyle{cloud} =
	[
		draw,
		ellipse,
		fill = red!20,
		node distance = 2cm,
		minimum height = 2em
	]

\begin{tikzpicture}[node distance = 1cm, auto]
	\node [cloud] (start) {Начало};
	\node [block, below of = start] (phase1) {Этап 1};
	\node [block, below of = phase1] (phase2) {Этап 2};
	\node [block, below of = phase2] (phase3) {Этап 3};
	\node [block, below of = phase3] (phase4) {Этап 4};
	\node [block, below of = phase4] (phase5) {Этап 5};
	\node [block, below of = phase5] (phase6) {Этап 6};
	\node [block, below of = phase6] (phase7) {Этап 7};
	\node [block, left of = phase4, node distance = 3cm] (correction) {Коррекция};
	\node [decision, below of = phase7] (condition) {Условие};
	\node [cloud, below of = condition] (finish) {Конец};
	\path [line] (start) -- (phase1);
	\path [line] (phase1) -- (phase2);
	\path [line] (phase2) -- (phase3);
	\path [line] (phase3) -- (phase4);
	\path [line] (phase4) -- (phase5);
	\path [line] (phase5) -- (phase6);
	\path [line] (phase6) -- (phase7);
	\path [line] (phase7) -- (condition);
	\path [line] (condition) -| node [near start] {Нет} (correction);
	\path [line] (correction) |- (phase1);
	\path [line] (condition) -- node {Да}(finish);
\end{tikzpicture}

Код:
код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
% ...
\usepackage{tikz}
% ...
\usetikzlibrary{shapes, arrows}
% ...
\tikzstyle{decision} =
        [
                diamond,
                draw,
                fill = green!20,
                text width = 6em,
                text badly centered,
                node distance = 2cm,
                inner sep = 0pt
        ]
\tikzstyle{block} =
        [
                rectangle,
                draw,
                fill = blue!20,
                text width = 6em,
                text centered,
                rounded corners,
                minimum height = 2em
        ]
\tikzstyle{line} =
        [
                draw,
                -latex'
        ]
\tikzstyle{cloud} =
        [
                draw,
                ellipse,
                fill = red!20,
                node distance = 3cm,
                minimum height = 2em
        ]
% ...
\begin{tikzpicture}[node distance = 1cm, auto]
        \node [cloud] (start) {Начало};
        \node [block, below of = start] (phase1) {Этап 1};
        \node [block, below of = phase1] (phase2) {Этап 2};
        \node [block, below of = phase2] (phase3) {Этап 3};
        \node [block, below of = phase3] (phase4) {Этап 4};
        \node [block, below of = phase4] (phase5) {Этап 5};
        \node [block, below of = phase5] (phase6) {Этап 6};
        \node [block, below of = phase6] (phase7) {Этап 7};
        \node [block, left of = phase4, node distance = 3cm] (correction) {Коррекция};
        \node [decision, below of = phase7] (condition) {Условие};
        \node [cloud, below of = condition] (finish) {Конец};
        \path [line] (start) -- (phase1);
        \path [line] (phase1) -- (phase2);
        \path [line] (phase2) -- (phase3);
        \path [line] (phase3) -- (phase4);
        \path [line] (phase4) -- (phase5);
        \path [line] (phase5) -- (phase6);
        \path [line] (phase6) -- (phase7);
        \path [line] (phase7) -- (condition);
        \path [line] (condition) -| node [near start] {Нет} (correction);
        \path [line] (correction) |- (phase1);
        \path [line] (condition) -- node {Да}(finish);
\end{tikzpicture}
% ...
 

 
 
 
 Re: Блок-схемы в TeX
Сообщение13.10.2011, 11:29 
Еще:
1. Предопределённый процесс на основе одного из примеров руководства.
До конца разобраться с якорями и text width (чтобы текст не заезжал на линии без явно указанного inner xsep) не удалось, поэтому, если кто-то допилит — отпишитесь сюда, пожалуйста!
код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\usepgfmodule{shapes}
\makeatletter
\pgfdeclareshape{espdprocedure}{ \inheritsavedanchors[from=rectangle]

\inheritanchorborder[from=rectangle] \inheritanchor[from=rectangle]{center}
\inheritanchor[from=rectangle]{north} \inheritanchor[from=rectangle]{south}
\inheritanchor[from=rectangle]{west} \inheritanchor[from=rectangle]{east}

\backgroundpath{
% store lower (right) нижне-левый! in xa/ya and upper right in xb/yb
\southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y

\pgf@xc=\pgf@xb \advance\pgf@xc by-1mm
\pgf@yc=\pgf@xa \advance\pgf@yc by+1mm

% construct main path
\pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}} \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@yb}} \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yb}} \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@ya}} \pgfpathclose

\pgfpathmoveto{\pgfpoint{\pgf@xc}{\pgf@yb}} \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@ya}}
\pgfpathmoveto{\pgfpoint{\pgf@yc}{\pgf@yb}} \pgfpathlineto{\pgfpoint{\pgf@yc}{\pgf@ya}}
} }
\makeatother

\tikzstyle{procedure}=[block,shape=espdprocedure,text centered, inner xsep=2mm]
 


2. По ЕСПД углы у блока-процесса вроде бы не закругляются, а решение — более сплюснутый ромб (diamond, aspect=3).

3. В схеме алгоритма обычно удобнее указывать расстояние между краями фигур, а не между центрами, иначе с ромбами будет плохо (т.е. не below of = start, а below = of start или, при необходимости, below = 4mm of start).

И, присоединяюсь к EtCetera: пакет PGF/Tikz для блок-схем — лучшее из виденных мной средств не только в LaTeX, но и с учётом Dia|Visio|OOoDraw. Научится ещё многострочный текст в ромб вписывать красиво — цены ему не будет.

 
 
 
 Re: Блок-схемы в TeX
Сообщение13.10.2011, 21:28 
А у меня такой деццкий вопрос, вызванный сугубо деццкими же воспоминаниями. Бог с ними, с закруглениями уголков; это, в конце концов -- исключительно вопрос вкуса. Но: как оформлять вывод-то?... (там, где эдакая волна снизу)

-- Чт окт 13, 2011 22:33:11 --

Да, кстати: ромб -- это ни в коем случае не решение. Это пока что всего-навсего разветвление алгоритма.

 
 
 
 Re: Блок-схемы в TeX
Сообщение13.10.2011, 21:42 
ewert в сообщении #492256 писал(а):
Да, кстати: ромб -- это ни в коем случае не решение. Это пока что всего-навсего разветвление алгоритма.

ГОСТ 19.701—90 (ИСО 5807—85)
Схемы алгоритмов, программ, данных и систем
стр. 123-124:
«3.2.2.4. Решение
Символ отображает решение или функцию переключательного типа, имеющую один вход и ряд альтернативных выходов, один и только один из которых может быть активизирован после вычисления условий, определенных внутри этого символа. Соответствующие результаты вычисления могут быть записаны по соседству с линиями, отображающими эти пути.»

Далее изображён ромб.

ewert в сообщении #492256 писал(а):
Но: как оформлять вывод-то?... (там, где эдакая волна снизу)
Имеется в виду «документ» — прямоугольник с волной вместо нижней стороны?

Я не знаю, как изобразить именно такую фигуру.
Может быть, подойдёт более общая?
Часто для изображения любого ввода-вывода используется основной символ «данные» — параллелограмм:
Код:
\tikzstyle{userinterface} = [block,trapezium, trapezium left angle=60, trapezium right angle=120pt, text centered]


Оказывается, есть «документ» в стандартной библиотеке:
Код:
\node[tape, draw, tape bend top=none]

 
 
 
 Re: Блок-схемы в TeX
Сообщение13.10.2011, 22:09 

(Оффтоп)

camphene в сообщении #492258 писал(а):
Символ отображает решение или функцию переключательного типа,

Я как типа математик категорически протестую. Решение -- есть решение (и оно окончательно, даже независимо от его верности); переключатель же -- не более чем переключатель. Какая-то совершенно бессмысленная терминология. Нас в наше время, во всяком случае, так совершенно не учили. Возможно, из-за недоразвитости; да, возможно...

 
 
 
 Re: Блок-схемы в TeX
Сообщение13.10.2011, 22:10 
ewert
Оно?
\usetikzlibrary{shapes, arrows}

\tikzstyle{print_block} =
         [
                 tape,
                 draw,
                 tape bend top=none
                 text width = 6em,
                 text badly centered,
                 node distance = 1cm
         ]

\tikzstyle{cloud} =
         [
                 draw,
                 ellipse,
                 node distance = 1cm,
                 minimum height = 2em
         ]

\tikzstyle{line} =
         [
                 draw,
                 -latex'
         ]

\begin{tikzpicture}[node distance = 1cm, auto]
         \node [cloud] (start) {Начало};
         \node [print_block, below of = start] (print) {Печать};
         \node [cloud, below of = print] (finish) {Конец};
         \path [line] (start) -- (print);
         \path [line] (print) -- (finish);
\end{tikzpicture}

Код:
код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\usetikzlibrary{shapes, arrows}

\tikzstyle{print_block} =
         [
                 tape,
                 draw,
                 tape bend top=none
                 text width = 6em,
                 text badly centered,
                 node distance = 1cm
         ]

\tikzstyle{cloud} =
         [
                 draw,
                 ellipse,
                 node distance = 1cm,
                 minimum height = 2em
         ]

\tikzstyle{line} =
         [
                 draw,
                 -latex'
         ]

\begin{tikzpicture}[node distance = 1cm, auto]
         \node [cloud] (start) {Начало};
         \node [print_block, below of = start] (print) {Печать};
         \node [cloud, below of = print] (finish) {Конец};
         \path [line] (start) -- (print);
         \path [line] (print) -- (finish);
\end{tikzpicture}

ewert в сообщении #492256 писал(а):
Да, кстати: ромб -- это ни в коем случае не решение. Это пока что всего-навсего разветвление алгоритма.
В свое время я долго ломал голову, почему гостописатели остановились именно на таком чуднОм названии данного блока, и ничего более подходящего, нежели "блок принятия решения" (о том куда дальше плыть) не придумал.

camphene
По поводу предыдущей схемки: я выдрал ее с корнем из одного своего документика (немного подредактировав) и ни в коем случае не претендовал на соответствие стандартам (на что намекали разноцветные блоки), а, скорее, пытался продемонстрировать возможности пакета.

 
 
 
 Re: Блок-схемы в TeX
Сообщение13.10.2011, 22:16 
О, EtCetera, мы с Вами одновременно написали про tape :)

Мне в своё время понадобилось много времени, чтобы изобразить именно ЕСПД`шные значки...

А название у блока-«решения» действительно неудачное, но мне кажется, что лучше придерживаться неудачного стандарта, чем обходиться вообще без него.

 
 
 
 Re: Блок-схемы в TeX
Сообщение14.10.2011, 09:16 
EtCetera в сообщении #492264 писал(а):
Оно?

Конечно (правда, овальчики лучше бы выровнять по размеру).

Чудные люди эти гостачи. Есть ведь абсолютно устойчивое в программировании сочетание -- "ветвление алгоритма". И никто и никогда не говорит в этом случае "решение". Так зачем же изобретать терминологию, совершенно оторванную от практики?...

 
 
 
 Re: Блок-схемы в TeX
Сообщение06.05.2013, 12:42 
Цитата:
1. Предопределённый процесс на основе одного из примеров руководства.

Извините за некропост, но вопрос актуален для меня: ни у кого не появилось решение для этого блока лучше?

 
 
 [ Сообщений: 10 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group