% %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}