From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- info/digests/texline/no14/flowchart.tex | 425 ++++++++++++++++++++++++++++++++ 1 file changed, 425 insertions(+) create mode 100644 info/digests/texline/no14/flowchart.tex (limited to 'info/digests/texline/no14/flowchart.tex') 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}} -- cgit v1.2.3