2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Блок-схемы в TeX
Сообщение12.10.2011, 11:59 
Заслуженный участник


09/01/06
800
Подскажите, пожалуйста, как в TeX'е или MetaPost'е рисовать блок-схемы. Есть ли специализированные пакеты для этого?

 Профиль  
                  
 
 Re: Блок-схемы в TeX
Сообщение12.10.2011, 17:26 
Заслуженный участник


28/04/09
1933
Насчет 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 


19/09/10
109
Еще:
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 
Заслуженный участник


11/05/08
32166
А у меня такой деццкий вопрос, вызванный сугубо деццкими же воспоминаниями. Бог с ними, с закруглениями уголков; это, в конце концов -- исключительно вопрос вкуса. Но: как оформлять вывод-то?... (там, где эдакая волна снизу)

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

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

 Профиль  
                  
 
 Re: Блок-схемы в TeX
Сообщение13.10.2011, 21:42 


19/09/10
109
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 
Заслуженный участник


11/05/08
32166

(Оффтоп)

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

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

 Профиль  
                  
 
 Re: Блок-схемы в TeX
Сообщение13.10.2011, 22:10 
Заслуженный участник


28/04/09
1933
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 


19/09/10
109
О, EtCetera, мы с Вами одновременно написали про tape :)

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

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

 Профиль  
                  
 
 Re: Блок-схемы в TeX
Сообщение14.10.2011, 09:16 
Заслуженный участник


11/05/08
32166
EtCetera в сообщении #492264 писал(а):
Оно?

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

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

 Профиль  
                  
 
 Re: Блок-схемы в TeX
Сообщение06.05.2013, 12:42 


06/05/13
1
Цитата:
1. Предопределённый процесс на основе одного из примеров руководства.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group