summaryrefslogtreecommitdiff
path: root/support/grapher
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/grapher
Initial commit
Diffstat (limited to 'support/grapher')
-rw-r--r--support/grapher/README.grapher28
-rw-r--r--support/grapher/grapher.pdfbin0 -> 50290 bytes
-rw-r--r--support/grapher/grapher.py316
-rw-r--r--support/grapher/grapher.tex204
-rw-r--r--support/grapher/test.tex163
5 files changed, 711 insertions, 0 deletions
diff --git a/support/grapher/README.grapher b/support/grapher/README.grapher
new file mode 100644
index 0000000000..c10543eff4
--- /dev/null
+++ b/support/grapher/README.grapher
@@ -0,0 +1,28 @@
+Readme of grapher
+
+What is it
+----------
+grapher This is a utility very useful for doing
+graphs, state machine, data flow diagrams and so on.
+
+Given a python specification of a graph
+this translates it into gpic code, that can be
+ translated into TeX code.
+
+How to run it.
+---------------
+
+Take a look at the end of grapher.py, there you'll see good examples.
+You need python to run it. It generates gpic code that you
+convert into TeX doing:
+gpic -t something.gpic > anotherthing.tex
+
+Once you have converted it:
+\input{anotherthing}
+\centerline{\box\graph}
+
+How to make the documentation.
+------------------------------
+
+Run "latex grapher.tex".
+
diff --git a/support/grapher/grapher.pdf b/support/grapher/grapher.pdf
new file mode 100644
index 0000000000..c761f01a44
--- /dev/null
+++ b/support/grapher/grapher.pdf
Binary files differ
diff --git a/support/grapher/grapher.py b/support/grapher/grapher.py
new file mode 100644
index 0000000000..94880beb1a
--- /dev/null
+++ b/support/grapher/grapher.py
@@ -0,0 +1,316 @@
+"""
+1999 Manuel Gutierrez Algaba
+You are free to use , modify, distribute and copy this piece of
+python code, if you keep this free copyright notice in it.
+
+grapher.py Version 1.0
+
+This small programm produces state diagrams, just specifying the
+relationship among the different states
+
+"""
+
+class graphstate:
+ def __init__(self, label1, label2 = None):
+ self.label1= label1
+ self.label2 = label2
+ self.next = None
+ self.goto=[]
+ self.label_next = None
+ self.make_width()
+ self.size = ""
+ self.numberlabel = None
+ self.figure = "ellipse"
+ self.already_drawn = 0
+ self.already_drawn_arrows = 0
+ self.index_of_goto_arrows = 0
+
+ def do_size(self, s):
+ """
+ valid sizes are: 0.9 and 0.8, or greater
+ """
+ self.size = s
+
+ def rel(self,n=None, l= None, f = None, g=[] ):
+ """
+ This makes a relationship among this state and those stated
+ in n and g.
+ n = the next one state,
+ g = a list of states where this state goes
+ l = label of the transition of this state to the next one
+ f = forced_next , this forces f to be the next node to be visited.
+ """
+ self.next = n
+ self.label_next = l
+ self.goto = g
+ self.forced_next = f
+
+ def make_width(self):
+ if self.label2 is None:
+ t = len(self.label1)
+ else:
+ t = max(len(self.label1), len(self.label2))
+
+ self.width = t
+
+ def generate_gpic_code(self, file ):
+ f = open( file, "w")
+ self.write_headings(f)
+ self.write_body(f)
+ self.write_footnote(f)
+ f.close()
+
+ def make_size(self, size ):
+ self.size = size
+
+ def write_headings(self, f):
+ if self.size=="":
+ f.write(".PS \ndown\narrowhead=7\narrow\n")
+ else:
+ f.write(".PS "+`self.size`+"\ndown\narrowhead=7\narrow\n")
+
+ def write_footnote(self, f):
+ f.write(".PE\n")
+
+ def write_body(self , f, numberlabel = None):
+ self.assign_numberlabel()
+ self.start_drawing(f)
+ self.arrows_and_such(f)
+
+ def start_drawing(self,f):
+ print self.numberlabel, self.already_drawn
+ if self.already_drawn == 1:
+ return
+ self.already_drawn = 1
+ self.write_label(f)
+ self.write_enclosing_figure(f)
+ self.write_movement(f)
+ self.write_rest_of_it(f)
+
+ def write_rest_of_it(self,f):
+ if not self.forced_next is None:
+ self.forced_next.start_drawing(f)
+
+ if not self.next is None:
+ self.next.start_drawing(f)
+
+ for i in self.goto:
+ i[0].start_drawing(f)
+
+ def write_rest_of_it_arrows(self,f):
+ if not self.next is None:
+ self.next.arrows_and_such(f)
+
+ for i in self.goto:
+ i[0].arrows_and_such(f)
+
+ def write_movement(self,f):
+ if self.label_next is None:
+ f.write("move 0.2\n")
+ else:
+ f.write("move 0.5\n")
+
+ def write_enclosing_figure(self, f ):
+ if self.label2 is None:
+ part1 = self.figure+ ' "'+self.label1 + '" '
+ else:
+ part1 = self.figure+ ' "'+ self.label1 + '" "' + self.label2 + '" '
+
+ #print "line 200",self.width
+ part2 = " ht 0.5 wid " + str( 0.12 * self.width )
+ f.write(part1 + part2 + "\n")
+
+ def convert_numberlabel(self):
+ return self.numberlabel[0]+str(self.numberlabel[1])
+
+ def write_label(self,f):
+ f.write(self.convert_numberlabel() +": ")
+
+ def what_numberlabel(self):
+ return self.numberlabel
+
+ def assign_numberlabel(self, numberlabel= None):
+ """
+ We go through all the states in the drawing. And we label them.
+ """
+ if not self.numberlabel is None:
+ return
+ # first we assign our own numberlabel
+ if numberlabel is None:
+ self.numberlabel = ('L', 0)
+ else:
+ #print "line 224",self.numberlabel
+ self.numberlabel = ('L', numberlabel + 1)
+ # then we propagate the numberlabels
+ propagated_numberlabel = self.numberlabel[1]
+
+ if not self.forced_next is None:
+ propagated_numberlabel = self.forced_next.assign_numberlabel( propagated_numberlabel)
+
+ if not self.next is None:
+ propagated_numberlabel = self.next.assign_numberlabel( propagated_numberlabel)
+
+ for i in self.goto:
+ if i[0].what_numberlabel() is None:
+ propagated_numberlabel = i[0].assign_numberlabel(propagated_numberlabel)
+
+ return propagated_numberlabel
+
+ def arrows_and_such(self, f):
+ if self.already_drawn_arrows == 1:
+ return
+ self.already_drawn_arrows = 1
+ self.write_arrows(f)
+ self.write_rest_of_it_arrows(f)
+
+ def write_arrows(self, file):
+ '''
+ Cases:
+ arrow next:
+ arrow "health" rjust from Gairst.s to Econd.n
+ arrow from Econd.s to Erd.n
+ arrow self:
+ PAPER : spline from Erd.e then up 0.2 right 0.3 then down 0.4 then up 0.2 left 0.3 ->
+ box invis "apteros" at PAPER + ( 0.6, 0.0)
+ arrow goto:
+ D: arc -> from Erd.e to Gairst.e
+ sprintf("zoom") ljust at D.e + (0.2, 0.0)
+
+ '''
+ self.write_arrow_next(file)
+ self.write_arrow_goto(file)
+
+ def write_arrow_next(self, f):
+ if not self.forced_next is None:
+ self.arrow_forced_west((self.next, self.label_next),f )
+ return
+
+ if not self.next is None:
+ if not self.label_next is None:
+ f.write('arrow "'+self.label_next+'" rjust from '+self.convert_numberlabel()+'.s to '+ self.next.convert_numberlabel()+'.n\n')
+ else:
+ f.write('arrow from '+self.convert_numberlabel()+'.s to '+ self.next.convert_numberlabel()+'.n\n')
+
+ def write_arrow_goto(self,f):
+ '''
+ arrow goto down to up:
+ D: arc -> from Erd.e to Gairst.e
+ sprintf("zoom") ljust at D.e + (0.2, 0.0)
+ arrow goto up to down :
+ D: arc -> from Erd.w to Gairst.w
+ sprintf("zoom") rjust at D.e + (-0.2, 0.0)
+
+ '''
+ for i in self.goto:
+ if i[0] != self:
+ self.make_arrow(i,f)
+ else:
+ self.write_arrow_self(i,f)
+
+ def make_arrow(self,arrow,f):
+ if self.is_lower(arrow[0]):
+ self.arrow_down_up(arrow,f)
+ else:
+ self.arrow_up_down(arrow,f)
+
+ def arrow_down_up(self, arrow, f):
+ intlabel = self.generate_goto_arrow_internal_label(f)
+ self.generate_arc(arrow,f,"DOWN-UP")
+ self.generate_goto_arrow_label(arrow,f,intlabel,"DOWN-UP")
+
+ def arrow_up_down(self, arrow, f):
+ intlabel = self.generate_goto_arrow_internal_label(f)
+ self.generate_arc(arrow,f,"UP-DOWN")
+ self.generate_goto_arrow_label(arrow,f,intlabel,"UP-DOWN")
+ def arrow_forced_west(self, arrow, f):
+ intlabel = self.generate_goto_arrow_internal_label(f)
+ self.generate_arc(arrow,f,"FORCED-WEST")
+ self.generate_goto_arrow_label(arrow,f,intlabel,"FORCED-WEST")
+
+ def generate_goto_arrow_internal_label(self, f):
+ self.index_of_goto_arrows = self.index_of_goto_arrows + 1
+ to_return = self.convert_numberlabel()+`self.index_of_goto_arrows`+" :"
+ f.write(to_return)
+ return to_return
+
+ def generate_arc(self, arrow, f, location):
+ if location =="DOWN-UP":
+ f.write('arc -> from '+self.convert_numberlabel()+'.w to '+ arrow[0].convert_numberlabel()+'.w\n')
+ elif location =="UP-DOWN":
+ f.write('arc -> from '+self.convert_numberlabel()+'.e to '+ arrow[0].convert_numberlabel()+'.e\n')
+ elif location=="FORCED-WEST":
+ f.write('arc -> from '+self.convert_numberlabel()+'.w to '+ arrow[0].convert_numberlabel()+'.w\n')
+
+ def generate_goto_arrow_label(self, arrow,f,intlabel,location):
+ if arrow[1] is None:
+ return
+ if location =="DOWN-UP":
+ #print "line 163", `arrow[1]`, intlabel
+ f.write('sprintf("'+arrow[1]+'") ljust at '+intlabel[:-2]+'.w +(0.2, 0.0)\n')
+ elif location =="UP-DOWN":
+ f.write('sprintf("'+arrow[1]+'") rjust at '+intlabel[:-2]+'.e +(-0.2, 0.0)\n')
+ elif location=="FORCED-WEST":
+ f.write('sprintf("'+arrow[1]+'") ljust at '+intlabel[:-2]+'.w +(0.2, 0.0)\n')
+
+
+
+ def is_lower(self, another_state):
+ return self.what_numberlabel()[1] < another_state.what_numberlabel()[1]
+
+ def write_arrow_self(self, arrow, f):
+ '''
+ PAPER : spline from Erd.e then up 0.2 right 0.3 then down 0.4 then up 0.2 left 0.3 ->
+ box invis "apteros" at PAPER + ( 0.6, 0.0)
+ '''
+ intlabel = self.generate_goto_arrow_internal_label(f)
+ if arrow[1] is None:
+ label= ""
+ else:
+ label = arrow[1]
+
+ f.write(' spline from '+ self.convert_numberlabel()+'.e then up 0.2 right 0.3 then down 0.4 then up 0.2 left 0.3 -> \n \
+box invis "'+label +'" at '+ intlabel[:-2] + " +( 0.6, 0.0)\n")
+
+
+def gs(label1 = None, label2 = None):
+ return graphstate(label1,label2)
+
+
+def __test24__():
+
+ 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")
+
+def __test25__():
+
+ st1 = graphstate("consideraciones metafisicas up")
+ st2 = graphstate("kuntakinte en norte america")
+ st3 = graphstate("burros y otros", "el burro espa'nol")
+
+ st1.rel(n=st2)
+ st2.rel(n=st3)
+ st3.rel(g=[(st1,"hola"),(st2,"adios")])
+
+ st1.generate_gpic_code("test1.gpic")
+
+if __name__=='__main__':
+ __test24__()
diff --git a/support/grapher/grapher.tex b/support/grapher/grapher.tex
new file mode 100644
index 0000000000..baf82a7f03
--- /dev/null
+++ b/support/grapher/grapher.tex
@@ -0,0 +1,204 @@
+% 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}
+
diff --git a/support/grapher/test.tex b/support/grapher/test.tex
new file mode 100644
index 0000000000..ed44a5395d
--- /dev/null
+++ b/support/grapher/test.tex
@@ -0,0 +1,163 @@
+\expandafter\ifx\csname graph\endcsname\relax \csname newbox\endcsname\graph\fi
+\expandafter\ifx\csname graphtemp\endcsname\relax \csname newdimen\endcsname\graphtemp\fi
+\setbox\graph=\vtop{\vskip 0pt\hbox{%
+ \special{pn 8}%
+ \special{pa 984 0}%
+ \special{pa 984 500}%
+ \special{fp}%
+ \special{sh 1.000}%
+ \special{pa 1009 400}%
+ \special{pa 984 500}%
+ \special{pa 959 400}%
+ \special{pa 1009 400}%
+ \special{fp}%
+ \special{ar 984 750 420 250 0 6.28319}%
+ \graphtemp=.5ex\advance\graphtemp by 0.750in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss wake up\hss}}%
+ \special{ar 984 1450 540 250 0 6.28319}%
+ \graphtemp=.5ex\advance\graphtemp by 1.450in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss breakfast\hss}}%
+ \special{ar 984 2150 480 250 0 6.28319}%
+ \graphtemp=\baselineskip\multiply\graphtemp by -1\divide\graphtemp by 2
+ \advance\graphtemp by .5ex\advance\graphtemp by 2.150in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss homework\hss}}%
+ \graphtemp=\baselineskip\multiply\graphtemp by 1\divide\graphtemp by 2
+ \advance\graphtemp by .5ex\advance\graphtemp by 2.150in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss done?\hss}}%
+ \special{ar 984 3150 540 250 0 6.28319}%
+ \graphtemp=\baselineskip\multiply\graphtemp by -1\divide\graphtemp by 2
+ \advance\graphtemp by .5ex\advance\graphtemp by 3.150in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss nice \hss}}%
+ \graphtemp=\baselineskip\multiply\graphtemp by 1\divide\graphtemp by 2
+ \advance\graphtemp by .5ex\advance\graphtemp by 3.150in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss class day\hss}}%
+ \special{ar 984 3850 540 250 0 6.28319}%
+ \graphtemp=\baselineskip\multiply\graphtemp by -1\divide\graphtemp by 2
+ \advance\graphtemp by .5ex\advance\graphtemp by 3.850in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss bad\hss}}%
+ \graphtemp=\baselineskip\multiply\graphtemp by 1\divide\graphtemp by 2
+ \advance\graphtemp by .5ex\advance\graphtemp by 3.850in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss class day\hss}}%
+ \special{ar 984 4550 600 250 0 6.28319}%
+ \graphtemp=.5ex\advance\graphtemp by 4.550in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss have lunch\hss}}%
+ \special{ar 984 5250 300 250 0 6.28319}%
+ \graphtemp=\baselineskip\multiply\graphtemp by -1\divide\graphtemp by 2
+ \advance\graphtemp by .5ex\advance\graphtemp by 5.250in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss go to\hss}}%
+ \graphtemp=\baselineskip\multiply\graphtemp by 1\divide\graphtemp by 2
+ \advance\graphtemp by .5ex\advance\graphtemp by 5.250in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss party\hss}}%
+ \special{ar 984 5950 480 250 0 6.28319}%
+ \graphtemp=.5ex\advance\graphtemp by 5.950in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss have fun\hss}}%
+ \special{ar 984 6650 480 250 0 6.28319}%
+ \graphtemp=.5ex\advance\graphtemp by 6.650in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss next day\hss}}%
+ \special{pa 984 1000}%
+ \special{pa 984 1200}%
+ \special{fp}%
+ \special{sh 1.000}%
+ \special{pa 1009 1100}%
+ \special{pa 984 1200}%
+ \special{pa 959 1100}%
+ \special{pa 1009 1100}%
+ \special{fp}%
+ \special{pa 984 1700}%
+ \special{pa 984 1900}%
+ \special{fp}%
+ \special{sh 1.000}%
+ \special{pa 1009 1800}%
+ \special{pa 984 1900}%
+ \special{pa 959 1800}%
+ \special{pa 1009 1800}%
+ \special{fp}%
+ \special{pa 984 2400}%
+ \special{pa 984 2900}%
+ \special{fp}%
+ \special{sh 1.000}%
+ \special{pa 1009 2800}%
+ \special{pa 984 2900}%
+ \special{pa 959 2800}%
+ \special{pa 1009 2800}%
+ \special{fp}%
+ \graphtemp=.5ex\advance\graphtemp by 2.650in
+ \rlap{\kern 0.984in\lower\graphtemp\hbox to 0pt{\hss Yes}}%
+ \special{ar 1000 3019 1000 1000 2.159881 4.193863}%
+ \special{sh 1.000}%
+ \special{pa 375 3774}%
+ \special{pa 444 3850}%
+ \special{pa 347 3815}%
+ \special{pa 375 3774}%
+ \special{fp}%
+ \graphtemp=.5ex\advance\graphtemp by 3.019in
+ \rlap{\kern 0.200in\lower\graphtemp\hbox to 0pt{No\hss}}%
+ \special{ar 1127 3881 1000 1000 2.408126 3.960721}%
+ \special{sh 1.000}%
+ \special{pa 336 4459}%
+ \special{pa 384 4550}%
+ \special{pa 299 4492}%
+ \special{pa 336 4459}%
+ \special{fp}%
+ \special{pa 984 4800}%
+ \special{pa 984 5000}%
+ \special{fp}%
+ \special{sh 1.000}%
+ \special{pa 1009 4900}%
+ \special{pa 984 5000}%
+ \special{pa 959 4900}%
+ \special{pa 1009 4900}%
+ \special{fp}%
+ \special{pa 984 5500}%
+ \special{pa 984 5700}%
+ \special{fp}%
+ \special{sh 1.000}%
+ \special{pa 1009 5600}%
+ \special{pa 984 5700}%
+ \special{pa 959 5600}%
+ \special{pa 1009 5600}%
+ \special{fp}%
+ \special{pa 984 6200}%
+ \special{pa 984 6400}%
+ \special{fp}%
+ \special{sh 1.000}%
+ \special{pa 1009 6300}%
+ \special{pa 984 6400}%
+ \special{pa 959 6300}%
+ \special{pa 1009 6300}%
+ \special{fp}%
+ \special{pa 1464 5950}%
+ \special{pa 1764 5750}%
+ \special{pa 1764 6150}%
+ \special{pa 1464 5950}%
+ \special{sp}%
+ \special{sh 1.000}%
+ \special{pa 1534 6026}%
+ \special{pa 1464 5950}%
+ \special{pa 1561 5985}%
+ \special{pa 1534 6026}%
+ \special{fp}%
+ \graphtemp=.5ex\advance\graphtemp by 5.950in
+ \rlap{\kern 2.064in\lower\graphtemp\hbox to 0pt{\hss have fun\hss}}%
+ \special{ar -1266 3727 4000 4000 -0.839587 0.819248}%
+ \special{sh 1.000}%
+ \special{pa 1462 835}%
+ \special{pa 1404 750}%
+ \special{pa 1496 798}%
+ \special{pa 1462 835}%
+ \special{fp}%
+ \graphtemp=.5ex\advance\graphtemp by 3.727in
+ \rlap{\kern 2.533in\lower\graphtemp\hbox to 0pt{\hss Sleep}}%
+ \special{pa 984 4100}%
+ \special{pa 984 4300}%
+ \special{fp}%
+ \special{sh 1.000}%
+ \special{pa 1009 4200}%
+ \special{pa 984 4300}%
+ \special{pa 959 4200}%
+ \special{pa 1009 4200}%
+ \special{fp}%
+ \hbox{\vrule depth7.100in width0pt height 0pt}%
+ \kern 2.733in
+ }%
+}%