2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Создание дракон-схем на базе LaTeX пакета pgf/tikz
Сообщение22.03.2011, 21:35 


22/03/11
23
Здравствуйте. Достаточно давно я познакомился с языком ДРАКОН, описанным в книге Паронджанова «Как улучшить работу ума». Он позволяет создавать великолепные схемы алгоритмов, очень нужные для программистов. Скачать книгу можно тут:

http://www.koob.ru/parondjanov_v_d/kak_uluchshit_rabotu_uma


Поработав с tikz, я научился делать самые простые схемы на ДРАКОНе, но как мне научиться создавать более сложные элементы? Хотелось бы задать команду с параметром: «текст внутри», и появлялся бы соответствующий блок.

Вот схема, которую удалось создать и код:

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\begin{document}
\tikzstyle{line} = [draw]
\tikzstyle{block} = [rectangle, draw, text width=5em,
text centered, rounded corners, minimum height=4em]
\tikzstyle{question} = [shape=chamfered rectangle, chamfered rectangle xsep=2cm, draw]

\begin{tikzpicture}[node distance = 2cm, auto]
\node[rounded rectangle, draw] (begin) {begin};
\node [block, below of=begin] (init) {initialize model};
\node[question, below of=init] (switch1) {if(something)};
\node [block, below of=switch1] (return1) {return \$county};
\node [block, right of=return1, node distance=5cm] (return2) {return \$county1;};
\node[coordinate, below of=return1, node distance=1.5cm] (junction) {};
\node[rounded rectangle, draw, below of=junction, node distance=1.5cm] (end) {end};


\path [line] (begin) -- (init);
\path [line] (init) -- (switch1);
\path [line] (switch1) -- node [near start] {yes} (return1);
\path [line] (switch1) -| node [near start] {no} (return2);
\draw [->,>=angle 45] (return2) |- (junction);
\path [line,name=y] (return1) -- (end);
\end{tikzpicture}

\end{document}


Изображение

Изображение

 Профиль  
                  
 
 
Сообщение23.03.2011, 17:50 
Аватара пользователя


01/02/09
206
Вам нужно реализовать nodes с формами, как на картинке, так? Тогда pgfmanual, с. 625, 675.

 Профиль  
                  
 
 
Сообщение31.03.2011, 02:53 


22/03/11
23
Еще вопрос.

Хотел сделать древовидную структуру
код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\usetikzlibrary{trees}
\begin{document}

\tikzstyle{terminator} = [shape=rounded rectangle]
\tikzstyle{block} = [rectangle, draw,
    text centered, rounded corners]
\tikzstyle{line} = [draw]


\begin{tikzpicture}[node distance = 1.5cm, auto]
\node[block, draw] (n1) {index.php};
    \node[block, below of=n1] (n2) {center};
    \node[block, right of=n2] (n3) {right};
    \node[block, left of=n2] (n4) {left};

\path [line] (n1) -- (n2);
\path [line] (n1) |- (n3);
\path [line] (n1) |- (n4);
\end{tikzpicture}

\end{document}


Но линии прошли неверно. Как линии перенести наверх между уровнями? И можно ли использовать библиотеку trees, чтобы упростить код и не работать с блоками напрямую.

Изображение

 Профиль  
                  
 
 
Сообщение02.04.2011, 08:00 
Аватара пользователя


01/02/09
206
Читайте всё тот же pgfmanual. Там всё про работу с nodes написано. У node есть свойства .north, .south и т. д. Если лень читать мануал, то смотрите http://www.texample.net/tikz/examples/ вообще и http://www.texample.net/tikz/examples/m ... n-channel/ в частности.

 Профиль  
                  
 
 
Сообщение02.04.2011, 11:42 


22/03/11
23
Danke, .Serj

http://www.texample.net/tikz/examples/m ... n-channel/ оказался особенно полезен. На его базе сделал такую красивую схему:

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{tikz}
\usetikzlibrary{arrows,positioning}
\begin{document}

\begin{figure}
\centering
\begin{tikzpicture}[node distance=1cm, auto]  
\tikzset{
    mynode/.style={rectangle,rounded corners,draw=black, top color=white, bottom color=yellow!50,very thick, inner sep=1em, minimum size=3em, text centered},
    myarrow/.style={draw},
}

\node[mynode] (top) {Государственная власть};  
\node[mynode, below=2cm of top] (center) {Судебная};
\node[mynode, left=of center] (left) {Законодательная};
\node[mynode, right=of center] (right) {Исполнительная};

\draw[myarrow] (top.south) -- (center.north);  
\draw[myarrow] (top.south) -- ++(0,-1) -|  (left.north);       
\draw[myarrow] (top.south) -- ++(0,-1) -|  (right.north);

\end{tikzpicture}
\end{figure}

\end{document}
 

Изображение

 Профиль  
                  
 
 Re: Создание дракон-схем на базе LaTeX пакета pgf/tikz
Сообщение06.04.2011, 05:08 


22/03/11
23
Прошу всех, опытных в tikz, посмотреть мои замечания. Они появилились после первой недели работы. Здесь не удалось вставить картинку: максимальная ширина 800 px, а она больше.

http://www.live-wtr.ru/leo/7.gif

 Профиль  
                  
 
 
Сообщение06.04.2011, 12:31 


19/09/10
109
Мой опыт в TikZ не так велик, но всё же:
— почему текст и схема должны быть в разных окнах? Вполне можно вставить tikzpicture прямо в документ LaTeX;
— необходимость перекомпиляции для просмотра результата — это вроде бы особенность всей системы LaTeX, а не библиотеки TikZ;
— текст переносится, если его ширину указать явно —
\node[...,text width=2cm,...] (имя) {Очень-очень длинный текст, длиннее двух сантиметров};
— кроме того, при явно заданной ширине текста можно полноценно поместить в блок список без всяких ухищрений;
— а как без уникального имени указать, какой именно блок с каким нужно соединить, если на «цып-цып» они не отзываются? ;)

А вот мануал, действительно, слишком обширен, чтобы быть учебным пособием.
Так что, увы, узнавать новое о TikZ приходится, выискивая статьи в блогах и на форумах, а к официальному руководству обращаться, уже имея какую-то информацию о необходимых действиях.

 Профиль  
                  
 
 
Сообщение06.04.2011, 12:51 


22/03/11
23
Danke, camphene. С переносами разобрались. Но это лишь маленький шаг в решении серьезных проблем, которые я описал.

Из-за них работа с latex/tikz превращается в каторгу.

 Профиль  
                  
 
 Re: Создание дракон-схем на базе LaTeX пакета pgf/tikz
Сообщение07.04.2011, 10:17 


22/03/11
23
Кажется, народ уже давно просек те проблемы, о которых я писал, и для LaTeX сделал вот это чудо:

http://www.lyx.org/

А для tikz было бы идеально, если бы был редактор, как AutoCad. Там сверху окно с изображением, а внизу пишешь команды. И после каждой команды ее результат сразу появляется в верхнем окне.

 Профиль  
                  
 
 Re: Создание дракон-схем на базе LaTeX пакета pgf/tikz
Сообщение26.07.2011, 18:17 


22/03/11
23
Сделал несколько узлов, но появился вопрос: как увеличить высоту node-ов, чтобы сохранить расстояние между ними?

Например, у меня есть node 'branch-name':

Изображение

и node 'address':

Изображение

Когда я располагаю их один под другим, то расстояние уменьшается на величину "крыши домика":

Изображение

Исходники можете скачать в архиве:

http://www.live-wtr.ru/leo/diagram.zip

Для тех, кто не хочет качать - даю их здесь:

pgfmoduleaddress.code.tex
Код:
\pgfdeclareshape{address}{ \inheritsavedanchors[from=rectangle]
  % this is nearly a rectangle
  \inheritanchorborder[from=rectangle]
 
  \inheritanchor[from=rectangle]{center}
  \inheritanchor[from=rectangle]{north} \inheritanchor[from=rectangle]{south}
  \inheritanchor[from=rectangle]{west} \inheritanchor[from=rectangle]{east}

  \anchor{north}{
      \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
       \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
        \pgf@process{\northeast}%
        \pgfmathparse{(\pgf@xb-\pgf@xa)/2}
        \advance\pgf@x by -\pgfmathresult pt
        \advance\pgf@y by 10pt
  }

  \backgroundpath{
    %{{{ store lower left 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 = .5\wd\pgfnodeparttextbox
    \pgf@yc = \pgf@yb
    \advance\pgf@yc by 10pt % this should be a parameter
    %{{{ construct 2 bottom lines
    \pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
    \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@ya}}
    \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yb}}
    \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yc}}
    \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@yb}}
    \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@ya}}
%}}}
  }
}


pgfmodulebranch-name.code.tex
Код:
\pgfdeclareshape{branch-name}{ \inheritsavedanchors[from=rectangle]
  % this is nearly a rectangle
  \inheritanchorborder[from=rectangle] \inheritanchor[from=rectangle]{center}
  \inheritanchor[from=rectangle]{north} \inheritanchor[from=rectangle]{south}
  \inheritanchor[from=rectangle]{west} \inheritanchor[from=rectangle]{east}

  \anchor{south}{
      \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
       \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
        \pgf@process{\southwest}%
        \pgfmathparse{(\pgf@xb-\pgf@xa)/2}
        \advance\pgf@x by \pgfmathresult pt
        \advance\pgf@y by -10pt
  }

   \saveddimen{\depth}{
          \pgf@y = \pgf@y - 10pt
   }
   
  \backgroundpath{
    %{{{ store lower left 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 = .5\wd\pgfnodeparttextbox
    \pgf@yc = \pgf@ya
    \advance\pgf@yc by - 10pt % this should be a parameter

    \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
    %{{{ construct 2 bottom lines
    \pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
    \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yc}}
    \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@ya}}
    \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yb}}
    \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@yb}}
    \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@ya}}
%}}}
  }
}


diagram.tex
Код:
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{calc,shapes,arrows}
\usepgfmodule{branch-name}
\usepgfmodule{address}
\begin{document}
\pagestyle{empty}

\def\len{1cm}
\begin{tikzpicture}
\tikzset{
   line/.style = {draw},
   comment/.style = {rectangle, draw, text centered, rounded corners, minimum height=2em,fill=white},
   terminator/.style = {shape=rounded rectangle, draw, inner sep=2mm},
        pause/.style = {shape=trapezium, inner sep=2mm, trapezium right angle = -70, trapezium left angle = -70},
}

  \node[draw,shape=branch-name,inner sep=2ex, ] (x1) {Remark text text text $\frac{x}{2} + \pi^2$};
  \node[draw,shape=address,inner sep=2ex, below of=x1, node distance=2cm] (x2) {Remark text text text $\frac{x}{2} + \pi^2$};
  \draw[line] (x1.south) -- (x2.north);

\end{tikzpicture}
\end{document}

 Профиль  
                  
 
 Re: Создание дракон-схем на базе LaTeX пакета pgf/tikz
Сообщение26.07.2011, 19:20 


19/09/10
109
А если вместо
\node[...below of=x1, ...] (x2) {...};
использовать более современный вариант
\node[...below = of x1, ...] (x2) {...};
будет не лучше?

 Профиль  
                  
 
 Re: Создание дракон-схем на базе LaTeX пакета pgf/tikz
Сообщение26.07.2011, 20:06 


22/03/11
23
camphene в сообщении #471364 писал(а):
А если вместо
\node[...below of=x1, ...] (x2) {...};
использовать более современный вариант
\node[...below = of x1, ...] (x2) {...};
будет не лучше?



Помогло. Danke.

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

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



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

Сейчас этот форум просматривают: Lenchik


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

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