summaryrefslogtreecommitdiff
path: root/info/digests/texline/no14/flowchart.tex
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 /info/digests/texline/no14/flowchart.tex
Initial commit
Diffstat (limited to 'info/digests/texline/no14/flowchart.tex')
-rw-r--r--info/digests/texline/no14/flowchart.tex425
1 files changed, 425 insertions, 0 deletions
diff --git a/info/digests/texline/no14/flowchart.tex b/info/digests/texline/no14/flowchart.tex
new file mode 100644
index 0000000000..df17c850f4
--- /dev/null
+++ b/info/digests/texline/no14/flowchart.tex
@@ -0,0 +1,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}}