% flowdoc.tex - a fairly plain LaTeX file, documentation for 'flow' % created 15 Nov 1992, by Terry Brown % last revised 2004-2-18 \documentstyle{article} \setlength{\unitlength}{2em} % for the picture environment \setlength{\parindent}{0pt} \setlength{\parskip}{2ex} \addtolength{\topmargin}{-1cm} \addtolength{\textheight}{2cm} \addtolength{\evensidemargin}{-1cm} \addtolength{\oddsidemargin}{-1cm} \addtolength{\textwidth}{2cm} % 4 levels of headings \newcommand{\headA}[1]{{\huge \vspace{1ex} \bf \hfill #1 \vspace{1ex}\hfill}} \newcommand{\headB}[1]{{\Large \vspace{1ex} \bf #1 \vspace{1ex} }} \newcommand{\headC}[1]{{\large \vspace{1ex} \bf #1 \vspace{1ex} }} \newcommand{\headD}[1]{{\bf \vspace{1ex} #1 \vspace{1ex} }} \newcommand{\pushin}{\hspace*{1em}} \begin{document} \title{Flow -- a program to generate flowcharts in the \LaTeX\ picture environment} \author{Terry Brown} \date{November 25, 1992 --- September 22, 2005} \maketitle \headB{Summary} {\em Flow\/} is a small program which parses the flowchart description explained in this document and translates it to the \LaTeX\ picture environment. Flow acts as a filter, so a typical execution would be... \verb+flow +$<$\verb+myprog.flo +$>$\verb+myprog.pic+ ...where \verb+myprog.flo+ is a plain text file containing a description of a flowchart, and \verb+myprog.pic+ will be a plain text file containing the body of a \LaTeX\ picture environment to draw the flowchart. Alternatively \verb+flow inputFile + or \verb+ flow inputFile outputFile+ may be used. VMS users see notes at end. \verb+myprog.pic+ could either be inserted into a picture environment in a \LaTeX\ file with a text editor, or pulled in by the \verb+\input+ command as \LaTeX\ is run. \headB{System requirements} Nothing in particular. Flow is in very plain C and should be portable to pretty much anything without alteration. Check beginning of file for defines if it gives trouble. \headB{Distribution and Bug Reports} Flow is free software covered by the GPL. See the file \verb+COPYING+ for details. Email to \verb+terry_n_brown@yahoo.com+ with bug reports etc. \newpage \headB{Flowchart description syntax} \verb+[indented text]+ indicates the command accepts zero or more line of text, these lines are identified by indentation. All lines after the command starting with either a space or a tab are assumed to be text for that command. The first line not starting with one of these characters is assumed to be the next command. Distributed code / executeables are case insensitive, but local compilations may vary. The flowchart is always ``going'' either up, down, left or right. The initial direction is down. The flowchart description file is terminated either by an invalid command, a blank line, or the end of the file. Keywords are case sensitive. % This bit became redundant with v 0.99 % %% The output from flow should appear inside a \LaTeX\ picture environment. %% Use %% %% \pushin\verb+\begin{picture}(x,y)(0,-y)+ %% %% to start the environment (as the flow %% chart starts at 0,0 and normally goes down, this put the pictures origin at %% the top left corner). 10 and 10 are ok as initial values for x and y. The %% positioning of the picture can be adjusted with the second pair as usual for %% the picture environment. The output from flow will appear inside a \LaTeX\ picture environment. The positioning of the picture can be adjusted with the second pair as usual for the picture environment. \verb+\unitlength+ should be set for use with the picture environment, all the examples in this document use \verb+2em+ (ie. put \verb+\setlength{\unitlength}{2em}+ at the top of the \LaTeX\ file). Smaller values make the boxes tighter around the text, larger values make them more open. \headC{The commands} \verb_% comment to end of line_ If the first thing on a line is a '\verb_%_' symbol the line is treated as a comment. Thanks to Joost Bruynooghe for adding this command. \begin{verbatim} Box [x y] [indented text] \end{verbatim} Draws a text at the current position, including a line or arrow leading to it if appropriate. If x and y are specified, the size of the box (in \verb+\unitlength+s), and all subsequent boxes, is set to these. The default size of a box is 4 by 2 \verb+\unitlength+s. {\small \begin{verbatim} Right Box This is the first box. Box 8 1 And this is the second \end{verbatim} } \begin{picture}(10,2)(0,-2) % picture environment flowchart generated by flow 0.95 \put(0.0000,-2.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ This is \\ the first \\ box. }}} \put(4.0000,-1.0000){\vector(1,0){1.0000}} \put(5.0000,-1.5000){\framebox(8.0000,1.0000)[c]{\shortstack[c]{ And this is the second }}} \end{picture} \newpage \begin{verbatim} Oval [x y] [indented text] Tilt [x y] [indented text] Text [x y] [indented text] \end{verbatim} \verb+Oval+, \verb+Tilt+ and \verb+Text+ are identical to \verb+Box+, except for the shape of the frame. (\verb+Text+ is an invisible frame.) {\small \begin{verbatim} Right Oval This is an Oval Tilt And this is a Tilt Text And this is a Text \end{verbatim} } \begin{picture}(10,3)(0,-3) % picture environment flowchart generated by flow 0.95 \put(2.0000,-1.0000){\oval(4.0000,2.0000)} \put(0.0000,-2.0000){\makebox(4.0000,2.0000)[c]{\shortstack[c]{ This is \\ an Oval }}} \put(4.0000,-1.0000){\vector(1,0){1.0000}} \put(5.0000,-2.0000){\makebox(4.0000,2.0000)[c]{\shortstack[c]{ And this \\ is a \\ Tilt }}} \put(5.3333,0.0000){\line(1,0){4.0000}} \put(4.6667,-2.0000){\line(1,0){4.0000}} \put(4.6667,-2.0000){\line(1,3){0.6667}} \put(8.6667,-2.0000){\line(1,3){0.6667}} \put(9.0000,-1.0000){\vector(1,0){1.0000}} \put(10.0000,-2.0000){\makebox(4.0000,2.0000)[c]{\shortstack[c]{ And this \\ is a \\ Text }}} \end{picture} \begin{verbatim} Choice A B C D [x y] [indented text] \end{verbatim} Draws a choice diamond, with the corners labeled as illustrated by the left diamond in the example. Periods (.) are not printed. The optional x an y parameters alter the size of the choice. The default size is 4 by 4 \verb+\unitlengh+s. Flow will report an error for non-square choice boxes whose aspect ratio doesn't match one of the line slopes supported by \LaTeX\ (-6 -- 6 : -6 -- 6, integers only). {\small \begin{verbatim} Right Choice A B C D Label any corner Choice Yes . No . Normally only two. \end{verbatim} } \begin{picture}(10,5)(0,-5) % picture environment flowchart generated by flow 0.95 \put(0.0000,-2.0000){\line(1,1){2.0000}} \put(0.0000,-2.0000){\line(1,-1){2.0000}} \put(4.0000,-2.0000){\line(-1,-1){2.0000}} \put(4.0000,-2.0000){\line(-1,1){2.0000}} \put(0.0000,-4.0000){\makebox(4.0000,4.0000)[c]{\shortstack[c]{ Label\\ any\\ corner }}} \put(2.6000,0.0000){\makebox(0,0)[lt]{A}} \put(0.0000,-1.4000){\makebox(0,0)[rt]{B}} \put(4.0000,-1.4000){\makebox(0,0)[lt]{C}} \put(2.6000,-4.0000){\makebox(0,0)[lb]{D}} \put(4.0000,-2.0000){\vector(1,0){1.0000}} \put(5.0000,-2.0000){\line(1,1){2.0000}} \put(5.0000,-2.0000){\line(1,-1){2.0000}} \put(9.0000,-2.0000){\line(-1,-1){2.0000}} \put(9.0000,-2.0000){\line(-1,1){2.0000}} \put(5.0000,-4.0000){\makebox(4.0000,4.0000)[c]{\shortstack[c]{ Normally\\ only two. }}} \put(7.6000,0.0000){\makebox(0,0)[lt]{Yes}} \put(9.0000,-1.4000){\makebox(0,0)[lt]{No}} \end{picture} \verb+SetTrack none | arrow | line+ Use arrows, lines, or nothing for drawing connections between boxes. \verb+TxtPos P1 P2 [B [A]]+ \verb+P1+ is the \LaTeX\ position specification (eg. [c] or [l]) for the lines of text that makes up the blocks of text in the boxes, \verb+P2+ is the \LaTeX\ position specification for the whole block of text within the box. \verb+B+ is the string (no white space) to be placed before each line of text, \verb+A+ is the string to be placed after each line of text. The example shows the use of \verb+B+ to keep text off the edge of the box. {\small \begin{verbatim} Right SetTrack arrow TxtPos [l] [l] Box 3.5 2 Needs some space on the left TxtPos [l] [l] ~ Box Left justified text with space SetTrack line TxtPos [c] [c] Box Centred Text SetTrack none TxtPos [r] [r] ~ \hspace*{1ex} Box Right justified Text \end{verbatim} } \begin{picture}(10,3)(0,-2.5) % picture environment flowchart generated by flow 0.95 \put(0.0000,-2.0000){\framebox(3.5000,2.0000)[l]{\shortstack[l]{ Needs some\\ space on the\\ left }}} \put(3.5000,-1.0000){\vector(1,0){1.0000}} \put(4.5000,-2.0000){\framebox(3.5000,2.0000)[l]{\shortstack[l]{ ~Left justified\\ ~text with\\ ~space }}} \put(8.0000,-1.0000){\line(1,0){1.0000}} \put(9.0000,-2.0000){\framebox(3.5000,2.0000)[c]{\shortstack[c]{ Centred\\ Text }}} \put(13.5000,-2.0000){\framebox(3.5000,2.0000)[r]{\shortstack[r]{ ~Right justified\hspace*{1ex}\\ ~Text\hspace*{1ex} }}} \end{picture} \newpage \verb+Tag+ \verb+ToTag+ \verb+Tag+ stores the location and size of the last object drawn on a stack, \verb+ToTag+ returns to that position (removing the item from the stack). This is particularly useful with \verb+Choice+s, allowing a second chain to be built from the diamond, but it can be used with any other item. Flow will complain if it encounters more \verb+ToTag+s the \verb+Tag+s, but won't mention \verb+Tag+s left on the stack when it finishes. {\small \begin{verbatim} Right 0 Choice . . N Y Ready to stop? Tag Choice . . Right Down Go right or Down? Tag Right 1 Box To the right ToTag Down Box Down here ToTag Down Oval STOP \end{verbatim} } \begin{picture}(10,7)(0,-5) % picture environment flowchart generated by flow 0.95 \put(0.0000,0.0000){\line(1,0){0.0000}} \put(0.0000,0.0000){\vector(1,0){1.0000}} \put(1.0000,0.0000){\line(1,1){2.0000}} \put(1.0000,0.0000){\line(1,-1){2.0000}} \put(5.0000,0.0000){\line(-1,-1){2.0000}} \put(5.0000,0.0000){\line(-1,1){2.0000}} \put(1.0000,-2.0000){\makebox(4.0000,4.0000)[c]{\shortstack[c]{ Ready to\\ stop? }}} \put(5.0000,0.6000){\makebox(0,0)[lt]{N}} \put(3.6000,-2.0000){\makebox(0,0)[lb]{Y}} \put(5.0000,0.0000){\vector(1,0){1.0000}} \put(6.0000,0.0000){\line(1,1){2.0000}} \put(6.0000,0.0000){\line(1,-1){2.0000}} \put(10.0000,0.0000){\line(-1,-1){2.0000}} \put(10.0000,0.0000){\line(-1,1){2.0000}} \put(6.0000,-2.0000){\makebox(4.0000,4.0000)[c]{\shortstack[c]{ Go right\\ or Down? }}} \put(10.0000,0.6000){\makebox(0,0)[lt]{Right}} \put(8.6000,-2.0000){\makebox(0,0)[lb]{Down}} \put(10.0000,0.0000){\line(1,0){1.0000}} \put(11.0000,0.0000){\vector(1,0){1.0000}} \put(12.0000,-1.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ To the\\ right }}} \put(8.0000,-2.0000){\vector(0,-1){1.0000}} \put(6.0000,-5.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ Down here }}} \put(3.0000,-2.0000){\vector(0,-1){1.0000}} \put(3.0000,-4.0000){\oval(4.0000,2.0000)} \put(1.0000,-5.0000){\makebox(4.0000,2.0000)[c]{\shortstack[c]{ STOP }}} \end{picture} \newpage \begin{verbatim} Up [d [*]] Down [d [*]] Left [d [*]] Right [d [*]] \end{verbatim} With or without the optional parameter, these command change the current direction of the flowchart. With the optional parameter, they draw a line, if \verb+SetTrack+ is \verb+line+ {\em or\/} \verb+arrow+, or leave a gap, if \verb+SetTrack+ in \verb+none+. The length of the line (or gap) is $d$. By default \verb+Box+es, \verb+Oval+s, \verb+Tilt+s and \verb+Text+s are 4 units wide and 2 units high. A \verb+Choice+ is 4 by 4 units. The arrows that connect things together are 1 unit. So a box drawn while the current direction is down would occupy 2 + 1 = 3 vertical units. To force the line to end in a arrow head, use the ``*'', which must be separated from the ``d'' by a space. {\small \begin{verbatim} Right 1 Box Flowing along. Right 1 Tag Down 2 Left 6 Up 2 * ToTag Right 3 Down Oval STOP \end{verbatim} } \begin{picture}(10,4)(0,-3) % picture environment flowchart generated by flow 0.95 \put(0.0000,0.0000){\line(1,0){1.0000}} \put(1.0000,0.0000){\vector(1,0){1.0000}} \put(2.0000,-1.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ Flowing \\ along. }}} \put(6.0000,0.0000){\line(1,0){1.0000}} \put(7.0000,0.0000){\line(0,-1){2.0000}} \put(7.0000,-2.0000){\line(-1,0){6.0000}} \put(1.0000,-2.0000){\vector(0,1){2.0000}} \put(7.0000,0.0000){\line(1,0){3.0000}} \put(10.0000,0.0000){\vector(0,-1){1.0000}} \put(10.0000,-2.0000){\oval(4.0000,2.0000)} \put(8.0000,-3.0000){\makebox(4.0000,2.0000)[c]{\shortstack[c]{ STOP }}} \end{picture} \verb+Scale x y+ Scale the {\em next\/} item by the specified values {\small \begin{verbatim} Right Oval Normal Oval Scale 2 1 Box A smaller oval is a better stop Scale 0.5 0.5 Oval STOP \end{verbatim} } \begin{picture}(10,3)(0,-3) % picture environment flowchart generated by flow 0.95 \put(2.0000,-1.0000){\oval(4.0000,2.0000)} \put(0.0000,-2.0000){\makebox(4.0000,2.0000)[c]{\shortstack[c]{ Normal\\ Oval }}} \put(4.0000,-1.0000){\vector(1,0){1.0000}} \put(5.0000,-2.0000){\framebox(8.0000,2.0000)[c]{\shortstack[c]{ A smaller oval is a better stop }}} \put(13.0000,-1.0000){\vector(1,0){1.0000}} \put(15.0000,-1.0000){\oval(2.0000,1.0000)} \put(14.0000,-1.5000){\makebox(2.0000,1.0000)[c]{\shortstack[c]{ STOP }}} \end{picture} \begin{verbatim} Skip x0 y0 x1 x1 \end{verbatim} \begin{tabular}{r@{~~}p{4in}} \tt x0 & Horizontal separation between boxes, default 1 \verb+\unitlength+ \\ \tt y0 & Vertical separation between boxes, default 1 \verb+\unitlength+ \\ \tt x1 & Multiplier for \verb+Left+ and \verb+Right+ commands, default 1 \\ \tt y1 & Multiplier for \verb+Up+ and \verb+Down+ commands, default 1 \\ \end{tabular} {\small \begin{verbatim} Skip 0 0 1 1 SetTrack none Box After this Box Box Is another with no gap SetTrack arrow Right 5 Up 1 * Left 1 * Down 1 * Right 1 * Skip 0 0 3 3 Up 1 * Left 1 * Down 1 * Right 1 * \end{verbatim} } \begin{picture}(10,5)(0,-5) % picture environment flowchart generated by flow 0.95 \put(0.0000,-2.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ After this\\ Box }}} \put(0.0000,-4.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ Is another\\ with no\\ gap }}} \put(4.0000,-3.0000){\line(1,0){5.0000}} \put(9.0000,-3.0000){\vector(0,1){1.0000}} \put(9.0000,-2.0000){\vector(-1,0){1.0000}} \put(8.0000,-2.0000){\vector(0,-1){1.0000}} \put(8.0000,-3.0000){\vector(1,0){1.0000}} \put(9.0000,-3.0000){\vector(0,1){3.0000}} \put(9.0000,0.0000){\vector(-1,0){3.0000}} \put(6.0000,0.0000){\vector(0,-1){3.0000}} \put(6.0000,-3.0000){\vector(1,0){3.0000}} \end{picture} \newpage \headB{VMS notes} I don't know much VMS, but this is one way of getting it to work. Compile and link as normal, then {\tt flow :== \$\fbox{\$1\$DIA3:}[brownt1.usr.flow]flow.exe} where the bit in the box is the name of the drive you're working on, and \verb+[brownt1.usr.flow]+ is the appropriate path. Then use the \verb+flow infile outfile+ form, as the redirection form doesn't seem to work. \newpage \headB{An example} The instructions that generated this flow chart are included in a commented section in \verb+flowdoc.tex+. Note the block of text is part of the picture environment (a \verb+Text+). % THIS IS THE FLOW DATA FOR THE EXAMPLE AT THE END % Box % Initialise % st % Oval % Begin % RootParse % Tag % Box % Initialise % A \& B % Down 1 % Box % Call client % with A, B \& st % Choice . . Y N % Is B a % New-Root % Node? % Tag % Down 1 % Choice . . Y N % Is B a % Fungi % Node? % Tag % Down 1 % Choice . N . Y % Is B the % Current-End % Node? % Tag % Oval % Return % ToTag % Left 3 % Up 2 % Box % Update % direction % data in st % Box % A = B % B = B.next % Up 10 % Right 5 * % ToTag % Right 1 % Box % Adjust fungi % values in st % Down 2 % Left 6 * % ToTag % Right % Box % Increment % st order % Tilt % Recursively % call RootParse % Box % Decrement % st order % Down 2 % Left 15 * % ToTag % SetTrack none % Down 2 % Right 8 % TxtPos [l] [c] % Text % A and B are the node records at the % start and end of the internode being % processed. `st' is a record containing % information about the current fungal % population, position in 3-space, root % order etc. It is cloned during the % recursive descent. \scriptsize \setlength{\unitlength}{1.8em} %% start of flow output \begin{picture}(24.000000,32.000000)(-5.000000,-32.000000) % picture environment flowchart generated by flow 0.99e \put(0.0000,-2.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ Initialise\\ st }}} \put(2.0000,-2.0000){\vector(0,-1){1.0000}} \put(2.0000,-4.0000){\oval(4.0000,2.0000)} \put(0.0000,-5.0000){\makebox(4.0000,2.0000)[c]{\shortstack[c]{ Begin\\ RootParse }}} \put(2.0000,-5.0000){\vector(0,-1){1.0000}} \put(0.0000,-8.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ Initialise\\ A \& B }}} \put(2.0000,-8.0000){\line(0,-1){1.0000}} \put(2.0000,-9.0000){\vector(0,-1){1.0000}} \put(0.0000,-12.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ Call client\\ with A, B \& st }}} \put(2.0000,-12.0000){\vector(0,-1){1.0000}} \put(0.0000,-15.0000){\line(1,1){2.0000}} \put(0.0000,-15.0000){\line(1,-1){2.0000}} \put(4.0000,-15.0000){\line(-1,-1){2.0000}} \put(4.0000,-15.0000){\line(-1,1){2.0000}} \put(0.0000,-17.0000){\makebox(4.0000,4.0000)[c]{\shortstack[c]{ Is B a\\ New-Root\\ Node? }}} \put(4.0000,-14.4000){\makebox(0,0)[lt]{Y}} \put(2.6000,-17.0000){\makebox(0,0)[lb]{N}} \put(2.0000,-17.0000){\line(0,-1){1.0000}} \put(2.0000,-18.0000){\vector(0,-1){1.0000}} \put(0.0000,-21.0000){\line(1,1){2.0000}} \put(0.0000,-21.0000){\line(1,-1){2.0000}} \put(4.0000,-21.0000){\line(-1,-1){2.0000}} \put(4.0000,-21.0000){\line(-1,1){2.0000}} \put(0.0000,-23.0000){\makebox(4.0000,4.0000)[c]{\shortstack[c]{ Is B a\\ Fungi\\ Node? }}} \put(4.0000,-20.4000){\makebox(0,0)[lt]{Y}} \put(2.6000,-23.0000){\makebox(0,0)[lb]{N}} \put(2.0000,-23.0000){\line(0,-1){1.0000}} \put(2.0000,-24.0000){\vector(0,-1){1.0000}} \put(0.0000,-27.0000){\line(1,1){2.0000}} \put(0.0000,-27.0000){\line(1,-1){2.0000}} \put(4.0000,-27.0000){\line(-1,-1){2.0000}} \put(4.0000,-27.0000){\line(-1,1){2.0000}} \put(0.0000,-29.0000){\makebox(4.0000,4.0000)[c]{\shortstack[c]{ Is B the\\ Current-End\\ Node? }}} \put(0.0000,-26.4000){\makebox(0,0)[rt]{N}} \put(2.6000,-29.0000){\makebox(0,0)[lb]{Y}} \put(2.0000,-29.0000){\vector(0,-1){1.0000}} \put(2.0000,-31.0000){\oval(4.0000,2.0000)} \put(0.0000,-32.0000){\makebox(4.0000,2.0000)[c]{\shortstack[c]{ Return }}} \put(0.0000,-27.0000){\line(-1,0){3.0000}} \put(-3.0000,-27.0000){\line(0,1){2.0000}} \put(-3.0000,-25.0000){\vector(0,1){1.0000}} \put(-5.0000,-24.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ Update\\ direction\\ data in st }}} \put(-3.0000,-22.0000){\vector(0,1){1.0000}} \put(-5.0000,-21.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ A = B\\ B = B.next }}} \put(-3.0000,-19.0000){\line(0,1){10.0000}} \put(-3.0000,-9.0000){\vector(1,0){5.0000}} \put(4.0000,-21.0000){\line(1,0){1.0000}} \put(5.0000,-21.0000){\vector(1,0){1.0000}} \put(6.0000,-22.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ Adjust fungi\\ values in st }}} \put(8.0000,-22.0000){\line(0,-1){2.0000}} \put(8.0000,-24.0000){\vector(-1,0){6.0000}} \put(4.0000,-15.0000){\vector(1,0){1.0000}} \put(5.0000,-16.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ Increment\\ st order }}} \put(9.0000,-15.0000){\vector(1,0){1.0000}} \put(10.0000,-16.0000){\makebox(4.0000,2.0000)[c]{\shortstack[c]{ Recursively\\ call RootParse }}} \put(10.3333,-14.0000){\line(1,0){4.0000}} \put(9.6667,-16.0000){\line(1,0){4.0000}} \put(9.6667,-16.0000){\line(1,3){0.6667}} \put(13.6667,-16.0000){\line(1,3){0.6667}} \put(14.0000,-15.0000){\vector(1,0){1.0000}} \put(15.0000,-16.0000){\framebox(4.0000,2.0000)[c]{\shortstack[c]{ Decrement\\ st order }}} \put(17.0000,-16.0000){\line(0,-1){2.0000}} \put(17.0000,-18.0000){\vector(-1,0){15.0000}} \put(11.0000,-8.0000){\makebox(4.0000,2.0000)[c]{\shortstack[l]{ A and B are the node records at the\\ start and end of the internode being\\ processed. `st' is a record containing\\ information about the current fungal\\ population, position in 3-space, root \\ order etc. It is cloned during the \\ recursive descent. }}} \end{picture} %% end of flow output \end{document}