%
%From: chase@orc.olivetti.com (David Chase)
%Subject: re: Flow charts in LaTeX
%Date: Mon, 24 Oct 88 15:34:42 -0700
%
%Here is a tool that might be useful; you can use it to get lines
%which bend (90 degrees) ending in arrows, and you can study it (ha ha)
%to figure out how it might be extended to do a flow chart.
%It is included within a program to test demonstrate it.  It uses only
%the LaTeX picture macros for graphics.
%
%Note the use of dirty tricks to turn points into dimensionless
%numbers.  There may be a better way, but I couldn't find it.  My
%difficulties with this lead me to believe that either
%(1) TeX should really provide dimensionless real numbers
%or
%(2) Maybe LaTeX should use real lengths instead of dimensionless
%numbers in the picture environment.  I might get tired of always
%attaching a dimension to things, but it would be LOTS easier to write
%interesting macros.
%
%If anyone can point out to me an easier way to do this, I'd be happy
%to hear it.  People on TeXhax tried to help me a couple of years ago
%with this, but nothing seemed to work.
%
%---------------- BEGINNING OF MACROS  ----------------
% First, a dirty trick

{\catcode`p=12 \catcode`t=12 \gdef\bogusmacro#1pt{#1}}
\let\getfactor=\bogusmacro
\def\unpt#1{\expandafter\getfactor\the#1}

% A macro to get us out of the iteration.

\def\gobbleemup#1,#2,#3,{}

% TWAI does all the work, and could probably be rewritten
% to be much prettier.

\def\twai#1,#2,#3,#4,#5,{
%   \typeout{Twisty arrow increment of |#1| |#2| |#3| |#4| |#5|}

% Turn parameters into PT quantities so we can do simple arithmetic.
    \xco#1pt\relax
    \yco#2pt\relax
    \len#4pt\relax
    \advance\len -\firstshrink\relax
% We get \taoval dynamically from our caller
    \def\firstshrink{\taoval pt}\relax
% Set things up for selection and iteration
    \let\drawcommand=\line
    \def\this{#3}
    \def\xvec{0}
    \def\yvec{0}
    \let\next=\twai
% Figure out which way we're going now
    \if\this\uu
        \addtolength{\yloc}{\len}
        \def\yvec{1}
        \corner=0
        \else
    \if\this\dd
        \addtolength{\yloc}{-\len}
        \def\yvec{-1}
        \corner=1
        \else
    \if\this\ll
        \addtolength{\xloc}{-\len}
        \def\xvec{-1}
        \corner=0
        \else
    \if\this\rr
        \addtolength{\xloc}{\len}
        \def\xvec{1}
        \corner=2
        \else
    \if\this\ee
        \relax
        \else
        \typeout{Twisty Arrow Increment--arg 2 (\this) not one of {udlre}}
    \fi\fi\fi\fi\fi
        \if#5\ee
%       \typeout{Ending vector}
        \let\drawcommand=\twaiend
        \advance\len\tarad
    \fi
%        \typeout{New XL \unpt\xloc\space YL \unpt\yloc}
% Here we emit the line or ending command
    \put(\unpt\xco,\unpt\yco){\drawcommand(\xvec,\yvec){\unpt\len}}
    % Figure out the next line
    \if#5\uu
        \advance\yloc \tarad
        \advance\corner 1
        \else
    \if#5\dd
        \advance\yloc -\tarad
        \advance\corner 0
        \else
    \if#5\ll
        \advance\xloc -\tarad
        \advance\corner 2
        \else
    \if#5\rr
        \advance\xloc \tarad
        \advance\corner 0
        \else
    \if#5\ee
        \let\next=\gobbleemup
                \corner=4
        \else
    typeout{Twisty Arrow Increment--arg 5 (#5) not one of {udlre}}
    \fi\fi\fi\fi\fi
%       \typeout{Corner center XL \unpt\xloc\space YL \unpt\yloc}
    \ifcase\corner
        % case 0 TL
        \put(\unpt\xloc,\unpt\yloc){\oval(\taoval,\taoval)[tl]}
        \or
        % case 1 BL
        \put(\unpt\xloc,\unpt\yloc){\oval(\taoval,\taoval)[bl]}
        \or
        % case 2 TR
        \put(\unpt\xloc,\unpt\yloc){\oval(\taoval,\taoval)[tr]}
        \or
        % case 3 BR
        \put(\unpt\xloc,\unpt\yloc){\oval(\taoval,\taoval)[br]}
        \or
        % case 4 END
        \relax
        \fi
    \advance\xloc \xvec\tarad
    \advance\yloc \yvec\tarad
%        \typeout{Final XL \unpt\xloc\space YL \unpt\yloc}
% iterate or finish, depending upon value of 'next'
    \next\unpt\xloc,\unpt\yloc,#5,
    }
\def\twistyarrowgen(#1,#2,#3,#4)#5{{
    \def\uu{u}
    \def\dd{d}
    \def\ll{l}
    \def\rr{r}
    \def\ee{e}
    \countdef\corner=255
    \newskip{\xco}\newskip{\yco}\newskip{\len}
    \newskip{\xloc}\newskip{\yloc}
    \newskip{\tarad}\setlength{\tarad}{#3pt}
    \newskip{\dummylen}
    \let\twaiend=#4
    \setlength{\dummylen}{\tarad}
    \advance\dummylen \dummylen
    \def\taoval{\unpt\dummylen}
    \setlength{\xloc}{#1pt}\setlength{\yloc}{#2pt}
    \def\firstshrink{\tarad}\relax
    \twai #1,#2,#5,e,}}
%
\def\twistyarrow(#1,#2){\twistyarrowgen(#1,#2,2,\vector)}
\def\twistyarrowrad(#1,#2,#3){\twistyarrowgen(#1,#2,#3,\vector)}
%----------------  END OF MACROS ----------------
%\documentstyle[flowchart]{article}
%\begin{document}
%\unitlength=.1in
%\begin{center}
%\begin{picture}(30,30)
%\twistyarrowrad(0,0,1){%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11,r,11,d,10,l,10,%
%u,11}
%\end{picture}
%\end{center}
%\end{document}
