diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/grapher |
Initial commit
Diffstat (limited to 'support/grapher')
-rw-r--r-- | support/grapher/README.grapher | 28 | ||||
-rw-r--r-- | support/grapher/grapher.pdf | bin | 0 -> 50290 bytes | |||
-rw-r--r-- | support/grapher/grapher.py | 316 | ||||
-rw-r--r-- | support/grapher/grapher.tex | 204 | ||||
-rw-r--r-- | support/grapher/test.tex | 163 |
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 Binary files differnew file mode 100644 index 0000000000..c761f01a44 --- /dev/null +++ b/support/grapher/grapher.pdf 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 + }% +}% |