% If you don't know how to handle a .tex file, do this :
% This is documentation file for textoolspro ( tex tools for the
% programmer ).
% latex grapher.tex
% xdvi grapher.dvi
% See dvips man page if you want it in postscript
% I don't supply postscripts because they're usually huge.

\documentclass[10pt,a4paper]{article}
\begin{document}
\title{Documentation and examples of grapher.py }
\author{ Manuel Gutierrez Algaba \\ irmina@ctv.es \\ http://www.ctv.es/USERS/irmina/texpython.htm }
\date{ February 1999 }
\maketitle

\section{Copyright issues}
grapher.py  and its documentation ( this text and the sources 
of tex drawings included in it) are copyrighted by Manuel
Gutierrez Algaba 1999 and you are free 
to  use, modify , copy and distribute it under the 
condition that
you include this notice ad in it.

\section{Beg and cries}

If you belong to an important organization:IBM, XeroX, Borland,\ldots
(all of them are registered trademarks), then it'd be {\huge FINE}
if you email me saying me how much you like it. Then I can include
this CONGRATULATIONS in my curriculum.

\section{Introduction}
This document explains all the details for the user of grapher.py.

\subsection{grapher.py }
When I wrote grapher.py there wasn't any automated utility for
doing graphs (state machines, data flow diagrams). Of course, you can write them
directly in \LaTeX{ } or using xfig or something like that. But grapher.py has
two major advantages, it's easier to use and it's faster to 'write'.
Besides it can be used as an interface by CASE programs.
The kinds of available drawings are good for:
\begin{itemize}
\item Expressing the flow of control and data.
\item Expressing the different parts something can be divided into.
\end{itemize}

And this is an utility written in python. 
\begin{verbatim}
http://www.python.org
\end{verbatim}

I imagine that it could be written in \TeX { }but It's 3 times easier
to use python. And what's more important \TeX{ }programmers have a
model , if they want to do the translation. \\ Another point, the
python code  could be improved \ldots 

And, it generates tex code. So if you want it in postscript, gif
or whatever, use the programs dvi, gs or grab directly from a 
window!

\section{ How to use it}
This  piece of python code illustrates the full capabilities 
of it, basically, you can put several states and transitions.
This code:
\begin{verbatim}
st1 = graphstate("wake up")
st2 = graphstate("breakfast")
st3 = graphstate("homework", "done?")
st4 = graphstate("nice ", "class day")
st5 = graphstate("bad", "class day")
st6 = graphstate("have lunch")
st7 = graphstate("go to","party")
st8 = graphstate("have fun")
st9 = graphstate("next day")
#st1.do_size(2)
st1.rel(n=st2)
st2.rel(n=st3)
st3.rel(n=st4, l='Yes', g=[(st5,'No')])
st4.rel(n=st6,f=st5)
st5.rel(n=st6)
st6.rel(n=st7)
st7.rel(n=st8)
st8.rel(n=st9,g=[(st8, "have fun")])
st9.rel(g=[(st1,"Sleep")])
    
st1.generate_gpic_code("test1.gpic")
\end{verbatim}
generates this : 
\begin{verbatim}
.PS 
down
arrowhead=7
arrow
L0:  ellipse "wake up"  ht 0.5 wid 0.84
move 0.2
L1:  ellipse "breakfast"  ht 0.5 wid 1.08
move 0.2
L2:  ellipse "homework" "done?"  ht 0.5 wid 0.96
move 0.5
L3:  ellipse "nice " "class day"  ht 0.5 wid 1.08
move 0.2
L4:  ellipse "bad" "class day"  ht 0.5 wid 1.08
move 0.2
L5:  ellipse "have lunch"  ht 0.5 wid 1.2
move 0.2
L6:  ellipse "go to" "party"  ht 0.5 wid 0.6
move 0.2
L7:  ellipse "have fun"  ht 0.5 wid 0.96
move 0.2
L8:  ellipse "next day"  ht 0.5 wid 0.96
move 0.2
arrow from L0.s to L1.n
arrow from L1.s to L2.n
arrow "Yes" rjust from L2.s to L3.n
L21 :arc -> from L2.w to L4.w
sprintf("No") ljust at L21.w +(0.2, 0.0)
L31 :arc -> from L3.w to L5.w
arrow from L5.s to L6.n
arrow from L6.s to L7.n
arrow from L7.s to L8.n
L71 : spline from L7.e then up 0.2 right  0.3 then down 0.4 then up 0.2 left 0.3 -> 
 box invis  "have fun" at L71 +( 0.6, 0.0)
L81 :arc -> from L8.e to L0.e
sprintf("Sleep") rjust at L81.e +(-0.2, 0.0)
arrow from L4.s to L5.n
.PE

\end{verbatim}

What's this ? \ldots, uhmmm, \ldots, many years ago when programmers
were programmers , and there was no law to the West of Pecos, \ldots
people used to work in Unix, with small, independent programs ,
suitable for just one thing, very specialised programs, \ldots,
one of that legendary time is troff , and one of their satellite 
helpers is {\large gpic}, yeah, this forgotten program is what I've
recovered from its exile.

What you've seen before it's a gpic specification. Well, to convert
it into \TeX, just:
\\
gpic -t test1.gpic \verb|>| test.tex
\\
Then , you use something like this:
\begin{verbatim}
\documentclass[10pt,a4paper]{article}
\begin{document}
wrekj
\begin{figure}
\input{test} % This is the first line, we include the drawing ,
\centerline{\box\graph} % now, we USE the drawing
\end{figure}
werw
\end{document}
\end{verbatim}

Exactly, those two commented lines do the job.

And that's all. Let's take a look at it:
\\
\input{test} % This is the first line, we include the drawing ,
\centerline{\box\graph} % now, we USE the drawing

\subsubsection{The instructions}
\begin{description}
\item [definition ] {\verb| st1 = graphstate("wake up")| : This says that state st1 will have inside the words:''wake up'' } 

\item [definition 2 ] { \verb| st2 = graphstate("homework","done?")|:  This says that state st1 
will have inside the words:''wake up'' and in another line ``done?'' }
\item  [next relationship ] { \verb|st1.rel(n=st2)|: This says that in the drawing , st2 will be next to st2 }

\item  [goto] { \verb|st3.rel(n=st4, l='Yes', g=[(st5,'No')])| : This line says , that there's a transition from st3
 to st4 and that it's labelled with the word ``Yes'', and there're another transition to st5,
 labelled with ``No''. As you may imagine it may be so many transitions as you like. }

\item [forced next]  { \verb|st4.rel(n=st6,f=st5)| : This line says that NOBODY IS PERFECT and that st5 is drawn
 inmediatly after st4, regardless there's
no transition st4->st5 }


\end{description}

\subsection{Sources of help}
Well, the best you can do is to take a look at the end of grapher.py

Secondly, you should take a look at the source of this document,
that is: less  grapher.tex 




\section{ Caveats and bugs}
grapher has no bugs. Even so, there'll
be some bugs. Well, really, the draw of arcs should be improved,
and it'd be fine if some different kind of figures ( triangles,
squares ) should be included.

\section{Bye bye}
I hope this documentation helps you to use this utility. It's not
difficult and greatly profitable.
And if you want to get similar drawings or improve some of them
just take a look at the code, once you get accostumed to it , you'll
find it quite logical.

\end{document}


.
