summaryrefslogtreecommitdiff
path: root/info/digests/texline/no14/flowchart.tex
blob: df17c850f498fb506f43501b89bf23f45d0f52de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
% malcolm,
% please note that the placement of most figures has to be
% optimized manually! furthermore, the standard \vsize is
% assumed for one or two figures. 
% good luck!
%

\input texline
\pageno6
\input flow.def
\begingroup
\let\Alisttt\tt
\let\Alistrm\rm
\def\uncatcodespecials{\def\do##1{\catcode`##1=12 }\dospecials}
\def\listing#1{\par\begingroup\setupverbatim\input#1 \endgroup}
\def\setupverbatim{
  \Alisttt\lineskip=1truept
  \lineskiplimit=1truept\topskip=0pt
  \def\par{\leavevmode\egroup\box0\endgraf}
  \obeylines \uncatcodespecials \obeyspaces
  \catcode`\`=\active \catcode`\^^I=\active
  \everypar{\startbox}}
\newdimen\w \setbox0=\hbox{\Alisttt\space} \w=8\wd0
\def\startbox{\setbox0=\hbox\bgroup}
{\catcode`\^^I=\active
  \gdef^^I{\leavevmode\egroup
    \dimen0=\wd0
    \divide\dimen0 by\w
    \multiply\dimen0 by\w
    \advance\dimen0 by\w
    \wd0=\dimen0 \box0 \startbox}}
{\obeyspaces\global\let =\ }
{\catcode`\`=\active \gdef`{\relax\lq}}

\begindoublecolumns


\fontdimen16\tensy=2.7pt
\fontdimen17\tensy=2.7pt
\fontdimen3\tenbf=4pt
\fontdimen3\tenrm=4pt

\parskip0pt



\hyphenation{Theo-re-ti-sche end-insert flow-chart flow-left-con-nect}
\hyphenation{flow-right-con-nect}

\tracingstats=2


{\vfuzz10pt
\title{\bf Flow charts with \TeX}
\section{Introduction and connection to plain \TeX}
The purpose of this contribution is to describe usage and
limitations of the macro |\flowchart| and a set of secondary
macros, which allow an easy generation of flow charts (of limited
complexity) within \TeX. The macros themselves will be described
in detail elsewhere; they are available from the Aston \TeX\ server
or directly from the author. 

The macros are designed to work in the plain
\TeX\ environment. No additional font tables are required;
instead, the printer driver, which converts the \dvi\ file into the
actual print file, {\it must\/} be able to handle rules correctly.

The command |\flowchart| generates a |vbox|. Although the typical use of this
|vbox| will be in combination with |\topinsert| and |\endinsert|,
it may be used in any other box operation. The macros are quite
economical:  |\flowchart| requires 4393 words of \TeX's memory for
macro definition; most of this memory can be released by the command
|\nomoreflowcharts|. 

The secondary macros mentioned before are intended to be used as
commands inside the argument of |\flowchart|. In most cases an
outside use will cause \TeX\ to interrupt and complain about some
undefined control sequence. If, by chance, all those control
sequences are also defined outside of |\flowchart|, an {\it
outside\/} use of the flow chart commands will cause severe
problemss by changing registers, dimensions, and boxes. By
exploiting  the grouping effect of boxes in \TeX, the outside
definitions of all control sequences will be restored upon
completion of |\flowchart|. Some additional macros are used by the
secondary macros; with the exception of |\nomoreflowcharts|, the
names of all of these macros are prefixed with `{\tt
flow}'.\looseness1 

\section{Start and stop}
The commands |\flowstart| and |\flowend| are available for use
within the argument of |\flowchart| to mark the begin and the end.
In detail, |\flowchart{\flowstart}| yields 
$$\flowchart{\flowstart}$$
and |\flowchart{\flowend}| gives
$$\hphantom.\kern1cm
\hbox to0cm{\hss\flowchart{\flowend}\hss}\kern1cm.$$

Basically |\flowchart| arranges the individual entries  vertically
and centered without an |\interlineskip| to form a linear stream
of operations; thus |\flowchart{\flowstart\flowend}| produces 
$$\hphantom.\kern1cm
\hbox to0cm{\hss\flowchart{\flowstart\flowend}\hss}\kern1cm.$$

The related commands  |\flowstartcircle| and |\flowendcircle|,
produce circles instead of triangles to mark points of
continuation. Both  require one argument, which
is placed in the centre of the circle. Since one token (digit
or letter) is sufficient to distinguish different points of
continuation, the size of the circle is independent of the length
of the argument. Continuing the previous examples,
|\flowchart{\flowstartcircle1}| and 
|\flowchart{\flowendcircle{\it The End}}| result in 
$$\hphantom.\kern1cm
\hbox to0cm{\hss\flowchart{\flowstartcircle1}\hss}
\hbox to3cm{\hfill and\hfill}
\hbox to0cm{\hss\flowchart{\flowendcircle{\it The End}}\hss}\kern1cm
\hbox{.}$$\looseness-1

\section{Basic operations}
Three commands are available to insert symbols for basic
operations: |\flowcompute|, |\flowinput|, and |\flowoutput|. Each
command requires one argument, which must consist of
`horizontal material'. The argument will be placed in a |hbox|,
or, if the width of this |hbox| would exceed |0.4\hsize|, it will
be typeset by \TeX\ as a paragraph with a maximum width of
|0.4\hsize|. This |hbox| (or paragraph) will be  surrounded by a
properly shaped symbol and placed as the next item in the flow
chart. To make the text inside the flow chart symbols look nice, it is
processed with stretchable |\leftskip| and |\rightskip| and zero
|\parfillskip|. (If this produces unwanted effects, alternate values
for the named parameters may be specified as part of the
argument.) An example is shown in %\nextabb, 
Figure~1, demonstrating that the symbols grow with the amount of text
given.\looseness-1

\section{Decisions}
%
Decisions are certainly the most important elements of flow
charts; within the argument of |\flowchart|, decisions are
generated with the command |\flowdecide| which requires
four arguments illustrated by the example 
|\flowchart{\flowdecide{A}{B}{C}{D}}|: \hskip0pt plus1em\relax
which produces the display
$$\hphantom.\kern1in\hbox to0cm{%
\hss\flowchart{\flowdecide{A}{B}{C}{D}}\hss}\kern1in.$$
}
\enddoublecolumns
\eject
\begindoublecolumns



{
\input flow.fg1
\medskip\noindent
Figure 1: The flow chart of the solution of the quadratic equation
$ax^2+bx+c=0$ was generated via 
\smallskip\begingroup\parindent0pt
\listing{flow.fg1} 
\endgroup
\medskip
\hrule}

\medskip

\noindent The first two arguments must be non-empty 
in order to generate the horizontal strokes:
|\flowchart{\flowdecide{}{B}{C}{D}}| 
yields
$$\flowchart{\flowdecide{}{B}{C}{D}}$$
\medskip\noindent
and |\flowchart{\flowdecide{~}{}{}{D}}| 
gives
$$\hphantom.\kern2cm\hbox to0cm{%
\hss\flowchart{\flowdecide{~}{}{}{D}}\hss}\kern2cm.$$

\fontdimen4\tentt=3pt
The rhombic shape generated by |\flowdecide| grows with the amount
of text passed as the fourth argument, and the text will be
typeset as a properly shaped paragraph as shown below. The rhombic
shape, however, cannot exceed a maximum horizontal size of 
|0.33\hsize|${}+{}$|1truecm|; 
the text therefore has to be cautiously limited 
to fit into the decision symbol.
\vadjust{$$\centerline{\hsize=2.75\hsize \flowchart{
\flowdecide{}{}{}{\dots\ 
and the text will be typeset as a properly shaped paragraph.}}}$$}%
(This is especially important for small values of |\hsize|
like the one used in this double column style. The above display
was generated with an enlarged |\hsize| value using the
input\hfil\break 
|$$\centerline{\hsize=2.75\hsize|\hfil\break
|\flowchart{\flowdecide{}{}{}{...}}}$$|.)

The decision branches the flow chart in a maximum of three parts,
which will be named `left', `middle', and `right' in the
following. 
$$\flowchart{\flowdecide~~~~
\flowcompute{middle}\flowendmiddlepart
\flowleftpart
\flowcompute{left}\flowendleftpart
\flowrightpart
\flowcompute{right}\flowendrightpart}$$

All items following |\flowdecide| will be placed below the
decision symbol to form the middle part until the command
|\flowendmiddlepart| is encountered. After this, the commands
|\flowleftpart|, |\flowendleftpart|, |\flowrightpart|, and
|\flowendrightpart| are available to commence and terminate the
left and the right part after the decision. Left and right part
may be specified in arbitrary sequence, except in case of
connections between these parts (see next section). 
 
If the arguments to the basic operations in the various parts are
not restricted to such short words as in the display above, the
left or right part will interfere with a middle part, since the
horizontal strokes of the decision symbol will extend |0.25\hsize|
left and right from the current stream of operations. Therefore
the use of either a left and a right part without a middle part is
recommended, or the use of a middle part in combination with
backward or forward jumps in the side parts. 

\enddoublecolumns
\eject
\begindoublecolumns

Left and right parts may be recombined by using the command
|\flowcombine| after |\flowleftpart| and |\flowrightpart|, as
shown in Figure 2.


\bigskip\hrule\medskip
\input flow.fg1
\medskip
{\catcode`\|=12 
\input flow.fg2
\medskip\noindent
Figure 2: This flow chart was generated by the input
\smallskip\begingroup\parindent0pt
\listing{flow.fg2}
\endgroup
\bigskip
\hrule}

\medskip

Additional |\flowdecide| commands may follow in any of the parts;
in such cases the commands |\flowdecide| and |\flowendmiddlepart|,
as well as |\flowleftpart| and |\flowendleftpart| (and
|\flowrightpart| and |\flowendrightpart|) act as opening and
closing operations (like brackets in mathematical equations).
Figures~3--5 make use of this feature. 


\section{Jumps}
The jump definitions are the most tricky part of |\flowchart|,
designed to make things as simple as possible for the user. Jumps
are defined with the command |\flowmark| and one of the commands
|\flowleftconnect|, |\flowrightconnect|, and |\flowconnect|. Each
of these commands requires one of the ten digits as its argument. 

The command |\flowmark|$n$ adds a vertical stroke to the last flow
chart entry and marks its end as position~$n$ ($0\le n\le9$).
Positions may be marked in any order, as long as they are defined
before they are used. 

The command |\flowrightconnect|$n$ or
|\flowleftconnect|\kern0pt$n$ is used {\rm after\/} one of the
{\it basic operations\/} to produce an arrow pointing to position
$n$. As indicated by the command name, the arrow will be drawn to
the left or to the right of the current main stream. For example, 
the input 
|\flowchart{\flowstart \flowmark1 \flowcompute~
\flowrightconnect1}| 
will produce

\centerline{$\hphantom.$\kern3cm\hbox to0cm{\hss
\flowchart{\flowstart \flowmark1 \flowcompute~
\flowrightconnect1}\hss}\kern3cm.}
\vskip\belowdisplayskip
The command |\flowconnect| is to be used in the left or the right
part after a {\it decision\/} only. If given, it must be the only
command in this specific part. |\flowconnect|$n$ will also result
in an arrow pointing to position $n$. Although the use of
|\flowconnect| appears to be rather simple, the definition of flow
charts with several decisions and jumps may require some planning.
Figure~3 gives a simple example, Figures~4 and~5 show more complicated
flow charts. 

Figure~5 also shows that repetitive |\flowmark| commands
can be used to elongate vertical strokes. This may help to avoid
overlapping entries in those cases in which a combination of a
middle part and a left or right part after a decision cannot be
avoided.\looseness-1 

\section{Size adjustment}
In some cases it will be necessary to change the {\it
horizontal\/} size of the charts generated by |\flowchart|,
because the macros work expecting a certain maximum width:
this maximum width is reached by a decision followed by a left and
a right part, both of which contain additional decisions.
Figure~5 presents an example of the assumed maximum width.\looseness-1 

Flow charts without left or right parts (or with only jumps as
left or right part) will therefore be limited to |0.5\hsize| and
may benefit from an enlarged |\hsize| value (demonstrated in
Figure~3). The opposite is true where the left
(or right) part after a decision which itself is placed in the
left (or right) part after a previous decision contains 
operations other than a jump: these will require careful reduction of
|\hsize| and proper |\kern|ing ({\it cf.{}}
Figure~5).\looseness-1 


{\vfill\hrule\medskip
\input flow.fg1
}
\goodbreak
{\input flow.fg3 
\noindent
Figure~3: This flow chart was generated by the following input, in
which the matching commands |\flowdecide| and |\flowendmiddlepart|
are connected by percent signs.
\smallskip
\parindent0pt
\listing{flow.fg3}
\medskip\hrule}

\eject



{\input flow.fg4
\goodbreak
\parindent0pt\frenchspacing 
Figure~4: This flow chart was generated by the input 
\smallskip\listing{flow.fg4}
\bigskip\hrule}%

\bigskip
Such changes of |\hsize| have to be made outside of |\flowchart|,
since a number of internal dimensions are derived from |\hsize|
before the argument of |\flowchart| is processed. The best way
certainly is to make use of \TeX's rules and limit the range of
the altered |\hsize|  value to a surrounding group. 
The following plain \TeX\ commands, which are of interest in
combination with |\flowchart|, do this automatically: 
|\centerline|, |\topinsert|\dots\hskip0pt|\endinsert|,
|\midinsert|\dots\hskip0pt|\endinsert|, 
and |\pageinsert|\dots\hskip0pt|\endinsert|.

The {\it vertical\/} dimension of the |\flowchart| output is
adjusted automatically using the following procedure. At first,
|5truemm| are used for two distances: the white space between the
text in the basic operation boxes and the surrounding box symbols,
and the distance between individual flow chart entries. If the
height of the |vbox| generated this way exceeds |\vsize|, the
chart is re-generated using distances of |4truemm| and eventually
once more with |3truemm|. 
(Figure~4 exhibits an example of such a reduced size: the initial
interentry distance of |5truemm| gave a box height of |676.3pt|;
reduction to |4truemm| diminished the box height to |577.7pt|,
which is the size actually used in Figure~4.)

\eject



{\input flow.fg5
\bigskip
\noindent
Figure~5: This flow chart shows a sequence of decisions used in a
special variant of quantum chemical MO calculations. If processed
normally, this chart would extend too far to the left. The input used
to generate the chart, which is reproduced below, takes care of this by
a |\kern|ing, which compensates the left half of the `cleanup'-box
(with a maximum width of |0.2\hsize|), and the subsequent definition of
a new |\hsize| value. This new value was calculated from the width of
the `skip'-box (which, including both strokes, is |0.5\hsize|),
the width of the left half of the `last atom'-box (which,
including the stroke, is |0.25\hsize|), the width of the left and
the right half of the `cleanup'- and the `restore'-box (which
both have a maximum value of |0.2\hsize|). This gives a maximum
total width of |1.15\hsize|, hence |\hsize| was scaled by 
$1 / 1.15 = 0.86956\ldots\,.$}
\goodbreak


{\parindent0pt\frenchspacing
\listing{flow.fg5} 
\medskip\hrule}

\section{Acknowledgement}
The author is grateful to the students Michaela Flock and Ulrike
Seebacher for testing the macro package in the course of writing
up their diploma works.
\author{Michael Ramek} 

\enddoublecolumns
\endgroup
\endinput


\bigskip

\smallskip
Institut f\"ur Physikalische und Theoretische Chemie,
Technische Universit\"at Graz, \hbox{A--8010} Graz, Austria}


\endinput
\def\kap#1 {\advance\kapno1\goodbreak%
\vskip 3\bigskipamount\vbox{\bf \setbox0\hbox{\the\kapno. }%
\parindent\wd0\item{\the\kapno.}#1\bigskip}\nobreak\noindent}

\newcount\abbno\abbno0
\def\abb{\global\advance\abbno1\noindent Fig.~\the\abbno\thinspace: }
\def\thisabb{Fig.~\the\abbno}
\def\nextabb{{\advance\abbno1Fig.~\the\abbno}}
\def\nextnextabb{{\advance\abbno2Fig.~\the\abbno}}
\def\nextnextnextabb{{\advance\abbno3Fig.~\the\abbno}}
\def\nextthreeabb{{\advance\abbno1Figs.~\the\abbno%
                   \advance\abbno2--\the\abbno}}
\def\nexttwoabb{{\advance\abbno1Figs.~\the\abbno\advance\abbno1\ %
                  and \the\abbno}}