summaryrefslogtreecommitdiff
path: root/graphics/pgf/base/doc/pgfmanual-en-library-petri.tex
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pgf/base/doc/pgfmanual-en-library-petri.tex')
-rw-r--r--graphics/pgf/base/doc/pgfmanual-en-library-petri.tex380
1 files changed, 380 insertions, 0 deletions
diff --git a/graphics/pgf/base/doc/pgfmanual-en-library-petri.tex b/graphics/pgf/base/doc/pgfmanual-en-library-petri.tex
new file mode 100644
index 0000000000..e5f0360bf7
--- /dev/null
+++ b/graphics/pgf/base/doc/pgfmanual-en-library-petri.tex
@@ -0,0 +1,380 @@
+% Copyright 2019 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Petri-Net Drawing Library}
+
+\begin{tikzlibrary}{petri}
+ This packages provides shapes and styles for drawing Petri nets.
+\end{tikzlibrary}
+
+
+\subsection{Places}
+
+The package defines a style for drawing places of Petri nets.
+
+\begin{stylekey}{/tikz/place}
+ This style indicates that a node is a place of a Petri net. Usually, the
+ text of the node should be empty since places do not contain any text. You
+ should use the |label| option to add text outside the node like its name or
+ its capacity. You should use the |tokens| options, explained in
+ Section~\ref{section-tokens}, to add tokens inside the place.
+ %
+\begin{codeexample}[preamble={\usetikzlibrary{petri,positioning}}]
+\begin{tikzpicture}
+ \node[place,label=above:$p_1$,tokens=2] (p1) {};
+ \node[place,label=below:$p_2\ge1$,right=of p1] (p2) {};
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{stylekey}{/tikz/every place}
+ This style is evoked by the style |place|. To change the appearance of
+ places, you can change this style.
+ %
+\begin{codeexample}[preamble={\usetikzlibrary{petri,positioning}}]
+\begin{tikzpicture}
+ [every place/.style={draw=blue,fill=blue!20,thick,minimum size=9mm}]
+ \node[place,tokens=7,label=above:$p_1$] (p1) {};
+ \node[place,structured tokens={3,2,9},
+ label=below:$p_2\ge1$,right=of p1] (p2) {};
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+\end{stylekey}
+
+
+\subsection{Transitions}
+
+Transitions are also nodes. They should be drawn using the following style:
+
+\begin{stylekey}{/tikz/transition}
+ This style indicates that a node is a transition. As for places, the text
+ of a transition should be empty and the |label| option should be used for
+ adding labels.
+
+ To connect a transition to places, you can use the |edge| command as in the
+ following example:
+ %
+\begin{codeexample}[preamble={\usetikzlibrary{petri,positioning}}]
+\begin{tikzpicture}
+ \node[place,tokens=2,label=above:$p_1$] (p1) {};
+ \node[place,label=above:$p_2\ge1$,right=of p1] (p2) {};
+
+ \node[transition,below right=of p1,label=below:$t_1$] {}
+ edge[pre] (p1)
+ edge[post] node[auto] {2} (p2);
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{stylekey}{/tikz/every transition}
+ This style is evoked by the style |transition|.
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/pre}
+ This style can be used with paths leading \emph{from} a transition
+ \emph{to} a place to indicate that the place is in the pre-set of the
+ transition. By default, this style is |<-,shorten <=1pt|, but feel free
+ to redefine it.
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/post}
+ This style is also used with paths leading \emph{from} a transition
+ \emph{to} a place, but this time the place is in the post-set of the
+ transition. Again, feel free to redefine it.
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/pre and post}
+ This style is to be used to indicate that a place is both in the pre-
+ and post-set of a transition.
+ \end{stylekey}
+\end{stylekey}
+
+
+\subsection{Tokens}
+\label{section-tokens}
+
+Interestingly, the most complicated aspect of drawing Petri nets in \tikzname\
+turns out to be the placement of tokens.
+
+Let us start with a single token. They are also nodes and there is a simple
+style for typesetting them.
+
+\begin{stylekey}{/tikz/token}
+ This style indicates that a node is a token. By default, this causes the
+ node to be a small black circle. Unlike places and transitions, it
+ \emph{does} make sense to provide text for the token node. Such text will
+ be typeset in a tiny font and in white on black (naturally, you can easily
+ change this by setting the style |every token|).
+ %
+\begin{codeexample}[preamble={\usetikzlibrary{petri,positioning}}]
+\begin{tikzpicture}
+ \node[place,label=above:$p_1$] (p1) {};
+ \node[token] at (p1) {};
+
+ \node[place,label=above:$p_2$,right=of p1] (p2) {};
+ \node[token] at (p2) {$y$};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \begin{stylekey}{/tikz/every token}
+ Change this style to change the appearance of tokens.
+ \end{stylekey}
+\end{stylekey}
+
+In the above example, it is bothersome that we need an extra command for the
+token node. Worse, when we have \emph{two} tokens on a node, it is difficult to
+place both nodes inside the node without overlap.
+
+The Petri library offers a solution to this problem: The |children are tokens|
+style.
+
+\begin{stylekey}{/tikz/children are tokens}
+ The idea behind this style is to use trees mechanism for placing tokens.
+ Every token lying on a place is treated as a child of the node. Normally
+ this would have the effect that the tokens are placed below the place and
+ they would be connected to the place by an edge. The |children are tokens|
+ style, however, redefines the growth function of trees such that it places
+ the children next to each other inside (or, rather, on top) of the place
+ node. Additionally, the edge from the parent node is not drawn.
+ %
+\begin{codeexample}[preamble={\usetikzlibrary{petri}}]
+\begin{tikzpicture}
+ \node[place,label=above:$p_1$] {}
+ [children are tokens]
+ child {node [token] {1}}
+ child {node [token] {2}}
+ child {node [token] {3}};
+\end{tikzpicture}
+\end{codeexample}
+
+ In detail, what happens is the following: Tree growth functions tell
+ \tikzname\ where it should place the children of nodes. These functions get
+ passed the number of children that a node has an the number of the child
+ that should be placed. The special tree growth function for tokens has a
+ special mapping for each possible number of children up to nine children.
+ This mapping decides for each child where it should be placed on top of the
+ place. For example, a single child is placed directly on top of the place.
+ Two children are placed next to each other, separated by the
+ |token distance|. Three children are placed in a triangle whose side
+ lengths are |token distance|; and so on up to nine tokens. If you wish to
+ place more than nice tokens on a place, you will have to write your own
+ placement code.
+ %
+\begin{codeexample}[preamble={\usetikzlibrary{petri}}]
+\begin{tikzpicture}
+ \node[place,label=above:$p_2$] {}
+ [children are tokens]
+ child {node [token] {1}}
+ child {node [token,fill=red] {2}}
+ child {node [token,fill=red] {2}}
+ child {node [token] {1}};
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{key}{/tikz/token distance=\meta{distance}}
+ This specifies the distance between the centers of the tokens in the
+ arrangements of the option |children are tokens|.
+ %
+\begin{codeexample}[preamble={\usetikzlibrary{petri}}]
+\begin{tikzpicture}
+ \node[place,label=above:$p_3$] {}
+ [children are tokens,token distance=1.1ex]
+ child {node [token] {}}
+ child {node [token,red] {}}
+ child {node [token,blue] {}}
+ child {node [token] {}};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{stylekey}
+
+The |children are tokens| option gives you a lot of flexibility, but it is a
+bit cumbersome to use. For this reason there are some options that help in
+standard situations. They all use |children are tokens| internally, so any
+change to, say, the |every token| style will affect how these options depict
+tokens.
+
+\begin{key}{/tikz/tokens=\meta{number}}
+ This option is given to a |place| node, not to a |token| node. The effect
+ of this option is to add \meta{number} many child nodes to the place, each
+ having the style |token|. Thus, the following two pieces of codes have the
+ same effect:
+ %
+\begin{codeexample}[preamble={\usetikzlibrary{petri}}]
+\tikz
+ \node[place] {}
+ [children are tokens]
+ child {node [token] {}}
+ child {node [token] {}}
+ child {node [token] {}};
+\tikz
+ \node[place,tokens=3] {};
+\end{codeexample}
+ %
+ It is legal to say |tokens=0|, no tokens are drawn in this case. This
+ option does not handle ten or more tokens correctly. If you need this many
+ tokens, you will have to program your own code.
+ %
+\begin{codeexample}[preamble={\usetikzlibrary{petri}}]
+\begin{tikzpicture}[every place/.style={minimum size=9mm}]
+
+ \foreach \x/\y/\tokennumber in {0/2/1,1/2/2,2/2/3,
+ 0/1/4,1/1/5,2/1/6,
+ 0/0/7,1/0/8,2/0/9}
+ \node [place,tokens=\tokennumber] at (\x,\y) {};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/colored tokens=\meta{color list}}
+ This option, which must also be given when a place node is being created,
+ gets a list of colors as parameter. It will then add as many tokens to the
+ place as there are colors in this list, each filled correspondingly.
+ %
+\begin{codeexample}[preamble={\usetikzlibrary{petri}}]
+\tikz \node[place,colored tokens={black,black,red,blue}] {};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/structured tokens=\meta{token texts}}
+ This option, which must again be passed to a place, gets a list of texts
+ for tokens. For each text, a new token will be added to the place.
+ %
+\begin{codeexample}[preamble={\usetikzlibrary{petri}}]
+\tikz \node[place,structured tokens={$x$,$y$,$z$}] {};
+\end{codeexample}
+ %
+\begin{codeexample}[preamble={\usetikzlibrary{petri}}]
+\begin{tikzpicture}[every place/.style={minimum size=9mm}]
+
+ \foreach \x/\y/\tokennumber in {0/2/1,1/2/2,2/2/3,
+ 0/1/4,1/1/5,2/1/6,
+ 0/0/7,1/0/8,2/0/9}
+ \node [place,structured tokens={1,...,\tokennumber}] at (\x,\y) {};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ If you use lots of structured tokens, consider redefining the |every token|
+ style so that the tokens are larger.
+\end{key}
+
+
+\subsection{Examples}
+
+\begin{codeexample}[preamble={\usetikzlibrary{petri}}]
+\begin{tikzpicture}[yscale=-1.6,xscale=1.5,thick,
+ every transition/.style={draw=red,fill=red!20,minimum size=3mm},
+ every place/.style={draw=blue,fill=blue!20,minimum size=6mm}]
+
+ \foreach \i in {1,...,6} {
+ \node[place,label=left:$p_\i$] (p\i) at (0,\i) {};
+ \node[place,label=right:$q_\i$] (q\i) at (8,\i) {};
+ }
+ \foreach \name/\var/\vala/\valb/\height/\x in
+ {m1/m_1/f/t/2.25/3,m2/m_2/f/t/2.25/5,h/\mathit{hold}/1/2/4.5/4} {
+ \node[place,label=above:{$\var = \vala$}] (\name\vala) at (\x,\height) {};
+ \node[place,yshift=-8mm,label=below:{$\var = \valb$}] (\name\valb) at (\x,\height) {};
+ }
+ \node[token] at (p1) {}; \node[token] at (q1) {};
+ \node[token] at (m1f) {}; \node[token] at (m2f) {};
+ \node[token] at (h1) {};
+
+ \node[transition] at (1.5,1.5) {} edge [pre] (p1) edge [post] (p2);
+ \node[transition] at (1.5,2.5) {} edge [pre] (p2) edge[pre] (m1f)
+ edge [post](p3) edge[post] (m1t);
+ \node[transition] at (1.5,3.3) {} edge [pre] (p3) edge [post] (p4)
+ edge [pre and post] (h1);
+ \node[transition] at (1.5,3.7) {} edge [pre] (p3) edge [pre] (h2)
+ edge [post] (p4) edge [post] (h1.west);
+ \node[transition] at (1.5,4.3) {} edge [pre] (p4) edge [post] (p5)
+ edge [pre and post] (m2f);
+ \node[transition] at (1.5,4.7) {} edge [pre] (p4) edge [post] (p5)
+ edge [pre and post] (h2);
+ \node[transition] at (1.5,5.5) {} edge [pre] (p5) edge [pre] (m1t)
+ edge [post] (p6) edge [post] (m1f);
+ \node[transition] at (1.5,6.5) {} edge [pre] (p6) edge [post] (p1.south east);
+ \node[transition] at (6.5,1.5) {} edge [pre] (q1) edge [post] (q2);
+ \node[transition] at (6.5,2.5) {} edge [pre] (q2) edge [pre] (m2f)
+ edge [post] (q3) edge [post] (m2t);
+ \node[transition] at (6.5,3.3) {} edge [pre] (q3) edge [post] (q4)
+ edge [pre and post] (h2);
+ \node[transition] at (6.5,3.7) {} edge [pre] (q3) edge [pre] (h1)
+ edge [post] (q4) edge [post] (h2.east);
+ \node[transition] at (6.5,4.3) {} edge [pre] (q4) edge [post] (q5)
+ edge [pre and post] (m1f);
+ \node[transition] at (6.5,4.7) {} edge [pre] (q4) edge [post] (q5)
+ edge [pre and post] (h1);
+ \node[transition] at (6.5,5.5) {} edge [pre] (q5) edge [pre] (m2t)
+ edge [post] (q6) edge [post] (m2f);
+ \node[transition] at (6.5,6.5) {} edge [pre] (q6) edge [post] (q1.south west);
+\end{tikzpicture}
+\end{codeexample}
+
+Here is the same net once more, but with these styles changes:
+%
+\begin{codeexample}[code only]
+\begin{tikzpicture}[yscale=-1.1,thin,>=stealth,
+ every transition/.style={fill,minimum width=1mm,minimum height=3.5mm},
+ every place/.style={draw,thick,minimum size=6mm}]
+\end{codeexample}
+
+\begin{tikzpicture}[yscale=-1.1,thin,>=stealth,
+ every transition/.style={fill,minimum width=1mm,minimum height=3.5mm},
+ every place/.style={draw,thick,minimum size=6mm}]
+
+ \foreach \i in {1,...,6} {
+ \node[place,label=left:$p_\i$] (p\i) at (0,\i) {};
+ \node[place,label=right:$q_\i$] (q\i) at (8,\i) {};
+ }
+ \foreach \name/\var/\vala/\valb/\height/\x in
+ {m1/m_1/f/t/2.25/3,m2/m_2/f/t/2.25/5,h/\mathit{hold}/1/2/4.5/4} {
+ \node[place,label=above:{$\var = \vala$}] (\name\vala) at (\x,\height) {};
+ \node[place,yshift=-8mm,label=below:{$\var = \valb$}] (\name\valb) at (\x,\height) {};
+ }
+ \node[token] at (p1) {}; \node[token] at (q1) {};
+ \node[token] at (m1f) {}; \node[token] at (m2f) {};
+ \node[token] at (h1) {};
+
+ \node[transition] at (1.5,1.5) {} edge [pre] (p1) edge [post] (p2);
+ \node[transition] at (1.5,2.5) {} edge [pre] (p2) edge [pre] (m1f)
+ edge [post] (p3) edge [post] (m1t);
+ \node[transition] at (1.5,3.3) {} edge [pre] (p3) edge [post] (p4)
+ edge [pre and post] (h1);
+ \node[transition] at (1.5,3.7) {} edge [pre] (p3) edge [pre] (h2)
+ edge [post] (p4) edge [post] (h1.west);
+ \node[transition] at (1.5,4.3) {} edge [pre] (p4) edge [post] (p5)
+ edge [pre and post] (m2f);
+ \node[transition] at (1.5,4.7) {} edge [pre] (p4) edge [post] (p5)
+ edge [pre and post] (h2);
+ \node[transition] at (1.5,5.5) {} edge [pre] (p5) edge [pre] (m1t)
+ edge [post] (p6) edge [post] (m1f);
+ \node[transition] at (1.5,6.5) {} edge [pre] (p6) edge [post] (p1.south east);
+ \node[transition] at (6.5,1.5) {} edge [pre] (q1) edge [post] (q2);
+ \node[transition] at (6.5,2.5) {} edge [pre] (q2) edge [pre] (m2f)
+ edge [post] (q3) edge [post] (m2t);
+ \node[transition] at (6.5,3.3) {} edge [pre] (q3) edge [post] (q4)
+ edge [pre and post] (h2);
+ \node[transition] at (6.5,3.7) {} edge [pre] (q3) edge [pre] (h1)
+ edge [post] (q4) edge [post] (h2.east);
+ \node[transition] at (6.5,4.3) {} edge [pre] (q4) edge [post] (q5)
+ edge [pre and post] (m1f);
+ \node[transition] at (6.5,4.7) {} edge [pre] (q4) edge [post] (q5)
+ edge [pre and post] (h1);
+ \node[transition] at (6.5,5.5) {} edge [pre] (q5) edge [pre] (m2t)
+ edge [post] (q6) edge [post] (m2f);
+ \node[transition] at (6.5,6.5) {} edge [pre] (q6) edge [post] (q1.south west);
+\end{tikzpicture}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End: