You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
315 lines
7.2 KiB
315 lines
7.2 KiB
% Copyright 2006 by Till Tantau
|
|
%
|
|
% This file may be distributed and/or modified
|
|
%
|
|
% 1. under the LaTeX Project Public License and/or
|
|
% 2. under the GNU Public License.
|
|
%
|
|
% See the file doc/generic/pgf/licenses/LICENSE for more details.
|
|
|
|
\RequirePackage{pgfrcs}
|
|
|
|
\ProvidesPackageRCS{pgfautomata.sty}
|
|
|
|
|
|
\RequirePackage{pgf}
|
|
|
|
\PackageWarning{pgfautomata}{This package is obsolete.}
|
|
|
|
\ProcessOptions
|
|
|
|
%
|
|
% Package for drawing finite automata.
|
|
%
|
|
|
|
|
|
\newdimen\pgf@stateradius
|
|
\newdimen\pgf@mooreradius
|
|
\newdimen\pgf@doublethickness
|
|
\newdimen\pgf@statebackoff
|
|
|
|
|
|
|
|
|
|
% Automaton environment - setup of certain drawing parameters like arrows.
|
|
%
|
|
% Example:
|
|
%
|
|
% \begin{pgfpicture}{-2cm}{-2cm}{2cm}{2cm}%
|
|
% \begin{pgfautomaton}
|
|
% \pgfstaterejecting{q1}{\pgforigin}{$q_1$}
|
|
% \pgfstateaccepting{q2}{\pgfstaterelative[east]{q1}{1cm}}{$q_2$}
|
|
% \pgfstateaccepting{q3}{\pgfstaterelative[east]{q2}{1cm}}{$q_3$}
|
|
%
|
|
% \pgfstateconnect{q1}{q2}[.5]{$0$}
|
|
% \pgfstateconnect{q2}{q3}[.5]{$1$}
|
|
% \pgfstateloop{q1}{90}{$1$}
|
|
% \pgfstateloop{q2}{90}{$1$}
|
|
% \end{pgfautomaton}
|
|
% \end{pgfpicture}
|
|
|
|
\def\pgfautomaton{\begin{pgfscope}%
|
|
\pgfsetendarrow{\pgfarrowto}%
|
|
\pgfnodesetsepend{4pt}\ignorespaces}
|
|
\def\endpgfautomaton{\end{pgfscope}}
|
|
|
|
|
|
|
|
% Set the outer state radius to #1.
|
|
%
|
|
% #1 = new state radius.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfsetstateradius{10pt}
|
|
|
|
\def\pgfsetstateradius#1{\setlength\pgf@stateradius{#1}\ignorespaces}
|
|
|
|
\pgfsetstateradius{1em}
|
|
|
|
|
|
|
|
% Set the state radius for Moore states to #1.
|
|
%
|
|
% #1 = new state radius.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfsetstatemooreradius{10pt}
|
|
|
|
\def\pgfsetstatemooreradius#1{\setlength\pgf@mooreradius{#1}\ignorespaces}
|
|
|
|
\pgfsetstatemooreradius{2em}
|
|
|
|
|
|
|
|
% Set the distance between the outer and the inner circle in an
|
|
% accepting state.
|
|
%
|
|
% #1 = new distance radius.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfsetstatecircledistance{1.2pt}
|
|
|
|
\def\pgfsetstatecircledistance#1{\setlength\pgf@doublethickness{#1}\ignorespaces}
|
|
|
|
\pgfsetstatecircledistance{1.6pt}
|
|
|
|
|
|
|
|
% Set the distance between a connecting line and a label to #1.
|
|
%
|
|
% #1 = new distance
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfsetstatelabeldistance{4pt}
|
|
|
|
\def\pgfsetstatelabeldistance#1{\setlength\pgf@statebackoff{#1}\ignorespaces}
|
|
|
|
\pgfsetstatelabeldistance{4pt}
|
|
|
|
|
|
% Draws an accepting state #1 with name #3 at position #2.
|
|
%
|
|
% #1 = a name
|
|
% #2 = a point
|
|
% #3 = a text
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfstateaccepting{q1}{\pgfxy(1,1)}{$q_1$}
|
|
|
|
\def\pgfstateaccepting#1#2#3{%
|
|
\pgfnodecircle{#1}[stroke]{#2}{\pgf@stateradius}%
|
|
\pgfputat{#2}{\pgfbox[center,center]{#3}}%
|
|
{%
|
|
\pgf@xa=\pgf@stateradius%
|
|
\advance\pgf@xa by-\pgf@doublethickness%
|
|
\pgfcircle[stroke]{#2}{\pgf@xa}}\ignorespaces}
|
|
|
|
|
|
% Draws a rejecting state #1 with name #3 at position #2.
|
|
%
|
|
% #1 = a name
|
|
% #2 = a point
|
|
% #3 = a text
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfstaterejecting{q2}{\pgfstatedirection[n]{q1}}{$q_2$}
|
|
|
|
\def\pgfstaterejecting#1#2#3{%
|
|
\pgfnodecircle{#1}[stroke]{#2}{\pgf@stateradius}%
|
|
\pgfputat{#2}{\pgfbox[center,center]{#3}}\ignorespaces}
|
|
|
|
|
|
% Draws a Moore state #1 with name #3 and output #4 at position #2.
|
|
%
|
|
% #1 = a name
|
|
% #2 = a point
|
|
% #3 = a text
|
|
% #4 = an output text
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfstatemoore{q}{\pgfxy(1,1)}{$q_1$}{$0,1$}
|
|
|
|
\def\pgfstatemoore#1#2#3#4{%
|
|
\pgfnodecircle{#1}[stroke]{#2}{\pgf@mooreradius}%
|
|
\begin{pgftranslate}{#2}%
|
|
\begin{pgfscope}%
|
|
\pgfsetdash{{2pt}{1pt}}{0pt}%
|
|
\pgfmoveto{\pgfpoint{-\pgf@mooreradius}{0cm}}%
|
|
\pgflineto{\pgfpoint{\pgf@mooreradius}{0cm}}%
|
|
\pgfqstroke%
|
|
\end{pgfscope}%
|
|
\pgfputat{\pgfpoint{0cm}{0.4\pgf@mooreradius}}{\pgfbox[center,base]{#3}}%
|
|
\pgfputat{\pgfpoint{0cm}{-0.2\pgf@mooreradius}}{\pgfbox[center,top]{#4}}%
|
|
\end{pgftranslate}\ignorespaces}
|
|
|
|
|
|
|
|
|
|
% Connect states #1 and #2 and draw #4 above label, #3-th part of the
|
|
% way from #1 to #2.
|
|
%
|
|
% #1 = a start state
|
|
% #2 = an end state
|
|
% #3 = a fraction of the distance between the two
|
|
% #4 = a label
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfstateconnect{q1}{q2}[.5]{$0$}
|
|
|
|
\def\pgfstateconnect#1#2[#3]#4{%
|
|
\pgfnodeconnline{#1}{#2}%
|
|
\pgfnodelabel{#1}{#2}[#3][\pgf@statebackoff]%
|
|
{\pgfbox[center,bottom]{#4}}\ignorespaces}
|
|
|
|
|
|
|
|
% Connect states #1 and #2 and draw #4 above label, #3-th part of the
|
|
% way from #1 to #2.
|
|
%
|
|
% #1 = a start state
|
|
% #2 = an end state
|
|
% #3 = a fraction of the distance between the two
|
|
% #4 = a label
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfstateconnectrotated{q1}{q2}[.5]{$0$}
|
|
|
|
\def\pgfstateconnectrotated#1#2[#3]#4{%
|
|
\pgfnodeconnline{#1}{#2}%
|
|
\pgfnodelabelrotated{#1}{#2}[#3][\pgf@statebackoff]%
|
|
{\pgfbox[center,bottom]{#4}}\ignorespaces}
|
|
|
|
|
|
|
|
% Connect state #1 with itself with label #3 and a loop going in
|
|
% direction #2.
|
|
%
|
|
% #1 = a state
|
|
% #2 = an angle
|
|
% #3 = a label
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfstateloop{q1}{90}{$0$}
|
|
|
|
\def\pgfstateloop#1#2#3{%
|
|
\c@pgf@counta=#2\relax%
|
|
\c@pgf@countb=#2\relax%
|
|
\advance\c@pgf@counta by15\relax%
|
|
\advance\c@pgf@countb by-15\relax%
|
|
\pgfnodeconncurve{#1}{#1}{\the\c@pgf@counta}{\the\c@pgf@countb}{2\pgf@stateradius}{2\pgf@stateradius}%
|
|
\pgfputat{\pgfnodeborder{#1}{#2}{2.25\pgf@stateradius}}{\pgfbox[center,center]{#3}}\ignorespaces}
|
|
|
|
|
|
|
|
% Connect states #1 and #2 and draw #4 above label, #3-th part of the
|
|
% way from #1 to #2.
|
|
%
|
|
% #1 = a start state
|
|
% #2 = an end state
|
|
% #3 = a start angle
|
|
% #4 = an end angle
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfstatecurve{q1}{q2}{10}{-10}
|
|
|
|
\def\pgfstatecurve#1#2#3#4{%
|
|
\pgfnodeconncurve{#1}{#2}{#3}{#4}{2\pgf@stateradius}{2\pgf@stateradius}\ignorespaces}
|
|
|
|
|
|
|
|
% Give a position relative to some state.
|
|
%
|
|
% #1 = a direction
|
|
% #2 = a state
|
|
% #3 = a distance
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfstaterelative[east]{q2}{1cm}
|
|
|
|
\def\pgfstaterelative{\pgfnoderelative}
|
|
|
|
|
|
|
|
% Draw an initial state by drawing an inleading line.
|
|
%
|
|
% #1 = a state
|
|
% #2 = a direction leading into the state (n,s,e,w)
|
|
% #3 = a label (for example ``start'')
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfstateinitial{q1}[w]{start}
|
|
|
|
\def\pgfstateinitial#1[#2]#3{{%
|
|
\pgfmoveto{\pgfrelative{\pgfnodeborder{#1}{\pgfdirection{#2}}{-2pt}}%
|
|
{\pgfpolar{\pgfdirection{#2}}{1.5\pgf@stateradius}}}%
|
|
\pgflineto{\pgfnodeborder{#1}{\pgfdirection{#2}}{\pgf@nodesepend}}%
|
|
\pgfstroke%
|
|
\edef\temp{[\csname pgf@statepos\pgfdirection{#2}\endcsname]}%
|
|
\pgfputat{\pgfrelative{\pgfnodeborder{#1}{\pgfdirection{#2}}{0pt}}%
|
|
{\pgfpolar{\pgfdirection{#2}}{1.5\pgf@stateradius}}}%
|
|
{\expandafter\pgfbox\temp{#3}}}\ignorespaces}
|
|
|
|
\expandafter\def\csname pgf@statepos0\endcsname{left,center}
|
|
\expandafter\def\csname pgf@statepos90\endcsname{center,bottom}
|
|
\expandafter\def\csname pgf@statepos180\endcsname{right,center}
|
|
\expandafter\def\csname pgf@statepos270\endcsname{center,top}
|
|
|
|
|
|
|
|
% Draw an final state by drawing an outleading line.
|
|
%
|
|
% #1 = a state
|
|
% #2 = a direction leading out of the state (valid directions are
|
|
% n,s,e,w)
|
|
% #3 = a label (for example ``exit'')
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfstatefinal{q1}[right]{accept}
|
|
|
|
\def\pgfstatefinal#1[#2]#3{{%
|
|
\pgfmoveto{\pgfnodeborder{#1}{\pgfdirection{#2}}{\pgf@nodesepstart}}%
|
|
\pgflineto{\pgfrelative{\pgfnodeborder{#1}{\pgfdirection{#2}}{-\pgf@nodesepend}}%
|
|
{\pgfpolar{\pgfdirection{#2}}{1.5\pgf@stateradius}}}%
|
|
\pgfstroke%
|
|
\edef\tempb{[\csname pgf@statepos\pgfdirection{#2}\endcsname]}%
|
|
\pgfputat{\pgfrelative{\pgfnodeborder{#1}{\pgfdirection{#2}}{0pt}}%
|
|
{\pgfpolar{\pgfdirection{#2}}{1.5\pgf@stateradius}}}%
|
|
{\expandafter\pgfbox\tempb{#3}}}\ignorespaces}
|
|
|
|
|
|
|
|
\endinput
|
|
|