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, Супермодераторы



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

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


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

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