summaryrefslogtreecommitdiff
path: root/usergrps/uktug/baskervi/3_1/diag.sty
diff options
context:
space:
mode:
Diffstat (limited to 'usergrps/uktug/baskervi/3_1/diag.sty')
-rw-r--r--usergrps/uktug/baskervi/3_1/diag.sty895
1 files changed, 895 insertions, 0 deletions
diff --git a/usergrps/uktug/baskervi/3_1/diag.sty b/usergrps/uktug/baskervi/3_1/diag.sty
new file mode 100644
index 0000000000..dbc3d9b4bb
--- /dev/null
+++ b/usergrps/uktug/baskervi/3_1/diag.sty
@@ -0,0 +1,895 @@
+% This is diagram.sty, intended for drawing commuting diagrams as PS \specials
+% in LaTeX. Original author Sean Bechhofer.
+% Improved, modified to use Rokiki's dvips 5.4.7 and generally crapped around with
+% by David Murphy.
+% This is version 1.0\beta
+
+% diagram.sty and associated files is copyright (c) 1991 David Murphy and Sean
+% Bechhofer. Please note the following conditions:
+%
+% 1. You can compile, use, copy and distribute this software without fee
+% provided that this copyright notice and permissions are preserved.
+%
+% 2. You can modify this software provided (a) you make no deletions; (b)
+% you mark all changes clearly (including the version number message); and
+% (c) if you distribute it, you change the name.
+%
+% 3. This software is provided for free, on an "as-is" basis, without
+% express or implied warranty.
+
+% The intention of (2) is to prevent a proliferation of incompatable
+% versions with the same name. Commenting out code does not count as a
+% deletion. If you have improvements or bug fixes, please forward them to
+% me rather than distributing a new version.
+\message{This is not Paul Taylor's commuting diagrams package;}
+\message{please do not acknowledge him. Version 1.0, 1991.}
+
+% This file depends on pspicture.ps and pspicture-dvips.sty.
+% The latter follows in this version.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% pspicture.sty Version 2.0
+%
+% Originally by D. P. Carlisle (carlisle@uk.ac.man.cs)
+% Computer Science Department, Manchester University
+% Heavily modified by David Murphy (david@gmdzi.gmd.de)
+%
+% A style file to redefine picture mode commands to use
+% postscript \special's rather than the circle and line fonts.
+% The \put and \multiput commands are not changed, ie
+% picture objects are positioned by TeX not by PS moveto.
+% The \framebox \makebox and \shortstack commands are unchanged.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%\circle and \circle*.
+% Use as in LaTeX book but with no maximum diameter.
+% The thickness of the circle is altered by the \linethickness command.
+%
+%\oval.
+% Use as in LaTeX book, but as there is no maximum diameter for
+% the circular arcs, the oval (in the absence of the optional [tr] etc)
+% always consists of two semi-circular arcs joined by a pair of parallel
+% lines. To obtain a `rectangle with rounded corners' the oval command
+% has a second optional argument (given first pspicmac).
+% \oval[20](100,200)[t]
+% Produces the top half of an oval with quarter circles of radius
+% 20*unitlength.
+% If unitlength = 1pt then this is equivalent to the standard oval command.
+% In general \oval[R](x,y) uses circular arcs of radius max(R,min(x/2,y/2)).
+%
+%\line and \vector.
+% Use as in LaTeX book but with no restriction on the available slopes.
+% The thickness of a sloping line is altered by the \linethickness command.
+%
+%\Line and \Vector.
+% New forms of the line and vector commands.
+% \put(x1,y1){\Line(x2,y2)}
+% produces a line from (x1,y1) to (x1+x2,y1+y2) and similarly for \Vector.
+%
+%\Curve
+% Like \Line except that it produce a curve pspicmac
+% \put(x1,y1){\Curve(x2,y2){m}}
+% produces a curve from (x1,y1) to (x1+x2,y1+y2). the amount of curvature
+% is controlled by m but try 1 or -1 first. m does not have to be an integer.
+% negative numbers curve the opposite way to positive numbers.
+%
+%\thinlines, \thicklines and \linethickness.
+% These commands alter the thickness of ALL lines including
+% slanted lines and circular arcs.
+%
+%\arrowlength.
+% A new command which specifies the size of the arrowhead drawn by the
+% \vector and \Vector commands. Like \linethickness it does not get
+% multiplied by \unitlength. At present the arrowhead is triangular.
+% If a head with curved sides more like the standard LaTeX head is required
+% the definition of pspicmacA in pspicture.ps should be altered.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% if for dashes
+\newif\ifdashed \dashedfalse
+
+% strip the final `pt' off string returned by \the
+{\catcode`t=12\catcode`p=12\gdef\noPT#1pt{#1}}
+\def\strippt#1{\expandafter\noPT\the#1\space}
+
+\def\@circle#1{%
+ \@tempdimb #1\unitlength
+ \special{"
+ \strippt\@wholewidth
+ \strippt\@tempdimb
+ pspicmacC}}
+
+\def\@dot#1{%
+ \@tempdimb #1\unitlength
+ \special{"
+ \strippt\@tempdimb
+ pspicmacD}}
+
+\def\line(#1,#2)#3{\ifdashed
+ \@linelen=#3\unitlength
+ \special{"
+ \strippt\@wholewidth
+ #1
+ #2
+ \strippt\@linelen
+ pspicmacdL}\else
+ \@linelen=#3\unitlength
+ \special{"
+ \strippt\@wholewidth
+ #1
+ #2
+ \strippt\@linelen
+ pspicmacL}\fi}
+
+\def\vector(#1,#2)#3{\ifdashed
+ \@linelen=#3\unitlength
+ \special{"
+ \strippt\@arrowlength
+ \strippt\@wholewidth
+ #1
+ #2
+ \strippt\@linelen
+ pspicmacdV}\else
+ \@linelen=#3\unitlength
+ \special{"
+ \strippt\@arrowlength
+ \strippt\@wholewidth
+ #1
+ #2
+ \strippt\@linelen
+ pspicmacV}\fi}
+
+\def\@FlArrow(#1,#2)(#3,#4)(#5,#6)(#7,#8){%
+ \@headlen=0.06\unitlength
+ \@headwid=0.03\unitlength
+ \@xa=#1\unitlength \@ya=#2\unitlength
+ \@xb=#3\unitlength \@yb=#4\unitlength
+ \@dxa=#5\unitlength \@dya=#6\unitlength
+ \@dxb=#7\unitlength \@dyb=#8\unitlength
+ \special{"
+ \strippt\@dxa
+ \strippt\@dya
+ \strippt\@dxb
+ \strippt\@dyb
+ \strippt\@xa
+ \strippt\@ya
+ \strippt\@xb
+ \strippt\@yb
+ \strippt\@wholewidth
+ \strippt\@headwid
+ \strippt\@headlen
+ arrowfl}}
+
+\def\oval{\@ifnextchar[{\@ov@l}%
+ {\count@=\maxdimen \divide\count@ by \unitlength \@ov@l[\count@]}}%
+\def\@ov@l[#1](#2,#3){\@ifnextchar[{\@oval[#1](#2,#3)}{\@oval[#1](#2,#3)[]}}%
+\def\@oval[#1](#2,#3)[#4]{\begingroup
+ \@tempdimb #1\unitlength
+ \@ovxx #2\unitlength
+ \@ovyy #3\unitlength
+ \def\r{\def\TL{0 }\def\BL{0 }}%
+ \def\l{\def\TR{0 }\def\BR{0 }}%
+ \def\t{\def\BL{0 }\def\BR{0 }}%
+ \def\b{\def\TL{0 }\def\TR{0 }}%
+ \def\TL{1 }\def\BL{1 }\def\TR{1 }\def\BR{1 }%
+ \@tfor\@tempa :=#4\do{\csname\@tempa\endcsname}%
+ \special{"
+ \BR\BL\TR\TL
+ \strippt\@wholewidth
+ \strippt\@tempdimb
+ \strippt\@ovxx
+ \strippt\@ovyy
+ pspicmacO}%
+ \endgroup}
+
+\def\Line(#1,#2){%
+ \@ovxx #1\unitlength
+ \@ovyy #2\unitlength
+ \special{"
+ \strippt\@wholewidth
+ \strippt\@ovxx
+ \strippt\@ovyy
+ pspicmacL2}}
+
+\def\Curve(#1,#2)#3{\ifdashed
+ \@ovxx #1\unitlength
+ \@ovyy #2\unitlength
+ \special{"
+ \strippt\@wholewidth
+ \strippt\@ovxx
+ \strippt\@ovyy
+ #3
+ pspicmacdC2}\else
+ \@ovxx #1\unitlength
+ \@ovyy #2\unitlength
+ \special{"
+ \strippt\@wholewidth
+ \strippt\@ovxx
+ \strippt\@ovyy
+ #3
+ pspicmacC2}\fi}
+
+\def\Vector(#1,#2){%
+ \@ovxx #1\unitlength
+ \@ovyy #2\unitlength
+ \special{"
+ \strippt\@arrowlength
+ \strippt\@wholewidth
+ \strippt\@ovxx
+ \strippt\@ovyy
+ pspicmacV2}}
+
+\newdimen\@arrowlength
+\def\arrowlength#1{\@arrowlength #1}
+\arrowlength{4pt}
+
+% A few dimensions that count...
+\newdimen\@headwid \newdimen\@headlen
+\newdimen\@xa \newdimen\@ya \newdimen\@xb \newdimen\@yb
+\newdimen\@dxa \newdimen\@dya \newdimen\@dxb \newdimen\@dyb
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%% Top level environments.
+% First, set-up a length to keep the external value of \unitlength in it.
+\newlength{\externalunitlength}
+\newdimen\diagramcellsize
+\diagramcellsize=8em
+
+% Now deal with diagrams with numbering.
+\newcounter{diagram}
+\def\thediagram{\arabic{diagram}}
+\newsavebox{\diagramlabel}
+
+% Now the unnumbered version
+\newenvironment{diagram*}{\refstepcounter{diagram}%
+ \savebox{\diagramlabel}[0pt]{}\@diagram}{\end@diagram}
+\newenvironment{diagram}{\refstepcounter{diagram}%
+ \savebox{\diagramlabel}{\hbox{\rm (\thediagram)}}\@diagram}{\end@diagram}
+
+\def\@diagram{\[
+ \unitlength\diagramcellsize%
+ \vcenter\bgroup\hbox to \displaywidth\bgroup\hfil\picture}
+\def\end@diagram{\endpicture\hfil\egroup\egroup\llap{\usebox{\diagramlabel}}\]}
+
+%%%%%%%%% Directions
+\def\north{0}
+\def\neast{1}
+\def\east{2}
+\def\seast{3}
+\def\south{4}
+\def\swest{5}
+\def\west{6}
+\def\nwest{7}
+\def\nneast{8}
+\def\eneast{9}
+\def\eseast{10}
+\def\sseast{11}
+\def\sswest{12}
+\def\wswest{13}
+\def\wnwest{14}
+\def\nnwest{15}
+\def\po{0}
+\def\st{1}
+
+\def\clock{0}
+\def\anti{1}
+
+\def\near{0}
+\def\far{1}
+
+%%%%%%%%% Positioning
+% Command to position an object; puts #3 in math mode at coords. (#1,#2).
+\def\object(#1,#2)#3{\put(#1,#2){\makebox(0,0){$#3$}}}
+
+% !!! This use of absolute coordinates is dreadful. We should work in
+% multiples of \unitlength (DVJM).
+\def\leftobject(#1,#2)#3{\put(#1,#2){\makebox(0,0)
+ {\makebox(0.3,0)[r]{$#3$}}}}
+\def\rightobject(#1,#2)#3{\put(#1,#2){\makebox(0,0)
+ {\makebox(0.3,0)[l]{$#3$}}}}
+
+%%%%%%%%% Short Arrows
+% Drawing short arrow bodies for tailed arrows;
+\def\arrshbdne{\put ( 0.15, 0.15){\line( 1, 1){0.75}}}
+\def\arrshbdnw{\put (-0.15, 0.15){\line(-1, 1){0.75}}}
+\def\arrshbdse{\put ( 0.15,-0.15){\line( 1,-1){0.75}}}
+\def\arrshbdsw{\put (-0.15,-0.15){\line(-1,-1){0.75}}}
+\def\arrshbdn{\put ( 0, 0.15){\line( 0, 1){0.75}}}
+\def\arrshbde{\put ( 0.25, 0 ){\line( 1, 0){0.55}}}
+\def\arrshbds{\put ( 0, -0.15){\line( 0,-1){0.75}}}
+\def\arrshbdw{\put (-0.25, 0 ){\line(-1, 0){0.55}}}
+
+% Drawing normal sized arrow bodies;
+\def\arrbdne{\put ( 0.1, 0.1){\line( 1, 1){0.8}}}
+\def\arrbdse{\put ( 0.1,-0.1){\line( 1,-1){0.8}}}
+\def\arrbdnw{\put (-0.1, 0.1){\line(-1, 1){0.8}}}
+\def\arrbdsw{\put (-0.1,-0.1){\line(-1,-1){0.8}}}
+\def\arrbdn{\put ( 0, 0.1){\line( 0, 1){0.8}}}
+\def\arrbde{\put ( 0.2, 0 ){\line( 1, 0){0.6}}}
+\def\arrbds{\put ( 0, -0.1){\line( 0,-1){0.8}}}
+\def\arrbdw{\put (-0.2, 0 ){\line(-1, 0){0.6}}}
+
+% !!! This bit's a special that might need further touching up (SB)
+\def\arrbdnne{\put ( 0.05, 0.1 ){\line( 1, 2){0.4}}}
+\def\arrbdene{\put ( 0.15, 0.075){\line( 2, 1){0.7}}}
+\def\arrbdese{\put ( 0.15,-0.075){\line( 2,-1){0.7}}}
+\def\arrbdsse{\put ( 0.05,-0.1 ){\line( 1,-2){0.4}}}
+\def\arrbdssw{\put (-0.05,-0.1 ){\line(-1,-2){0.4}}}
+\def\arrbdwsw{\put (-0.15,-0.075){\line(-2,-1){0.7}}}
+\def\arrbdwnw{\put (-0.15, 0.075){\line(-2, 1){0.7}}}
+\def\arrbdnnw{\put (-0.05, 0.11 ){\line(-1, 2){0.4}}}
+
+\def\arrhdnne(#1,#2){\put(#1,#2){\line(0,-1){0.056}}\put(#1,#2){\line(-3,-2){0.046}}}
+\def\arrhdene(#1,#2){\put(#1,#2){\line(-1,0){0.056}}\put(#1,#2){\line(-2,-3){0.031}}}
+\def\arrhdese(#1,#2){\put(#1,#2){\line(-1,0){0.056}}\put(#1,#2){\line(-2, 3){0.031}}}
+\def\arrhdsse(#1,#2){\put(#1,#2){\line( 0,1){0.056}}\put(#1,#2){\line(-3, 2){0.046}}}
+\def\arrhdssw(#1,#2){\put(#1,#2){\line( 0,1){0.056}}\put(#1,#2){\line( 3, 2){0.046}}}
+\def\arrhdwsw(#1,#2){\put(#1,#2){\line( 1,0){0.056}}\put(#1,#2){\line( 2, 3){0.031}}}
+\def\arrhdwnw(#1,#2){\put(#1,#2){\line( 1,0){0.056}}\put(#1,#2){\line( 2,-3){0.031}}}
+\def\arrhdnnw(#1,#2){\put(#1,#2){\line(0,-1){0.056}}\put(#1,#2){\line( 3,-2){0.046}}}
+
+%%%%%%%%% Long arrows
+\def\longarrbdne{\put( 0.1, 0.1){\line( 1, 1){1.8}}}
+\def\longarrbdse{\put( 0.1,-0.1){\line( 1,-1){1.8}}}
+\def\longarrbdnw{\put(-0.1, 0.1){\line(-1, 1){1.8}}}
+\def\longarrbdsw{\put(-0.1,-0.1){\line(-1,-1){1.8}}}
+\def\longarrbdn{\put( 0, 0.1){\line( 0, 1){1.8}}}
+\def\longarrbde{\put( 0.2, 0 ){\line( 1, 0){1.6}}}
+\def\longarrbds{\put( 0, -0.1){\line( 0,-1){1.8}}}
+\def\longarrbdw{\put(-0.2, 0 ){\line(-1, 0){1.6}}}
+
+\def\longarrbdnne{\put( 0.05, 0.1 ){\line( 1, 2){0.9}}}
+\def\longarrbdene{\put( 0.15, 0.075){\line( 2, 1){1.7}}}
+\def\longarrbdese{\put( 0.15,-0.075){\line( 2,-1){1.7}}}
+\def\longarrbdsse{\put( 0.05,-0.1 ){\line( 1,-2){0.9}}}
+\def\longarrbdssw{\put(-0.05,-0.1 ){\line(-1,-2){0.9}}}
+\def\longarrbdwsw{\put(-0.15,-0.075){\line(-2,-1){1.7}}}
+\def\longarrbdwnw{\put(-0.15, 0.075){\line(-2, 1){1.7}}}
+\def\longarrbdnnw{\put(-0.05, 0.11 ){\line(-1, 2){0.9}}}
+
+%%%%%%%%% Dotted Arrows
+\def\arrddbdne{\multiput( 0.15, 0.15)( 0.1, 0.1){8}{\line( 1, 1){0.05}}}
+\def\arrddbdse{\multiput( 0.15,-0.15)( 0.1,-0.1){8}{\line( 1,-1){0.05}}}
+\def\arrddbdnw{\multiput(-0.15, 0.15)(-0.1, 0.1){8}{\line(-1, 1){0.05}}}
+\def\arrddbdsw{\multiput(-0.15,-0.15)(-0.1,-0.1){8}{\line(-1,-1){0.05}}}
+\def\arrddbdn{\multiput( 0, 0.15)( 0, 0.1){8}{\line( 0, 1){0.05}}}
+\def\arrddbde{\multiput( 0.2, 0 )( 0.1, 0 ){6}{\line( 1, 0){0.05}}}
+\def\arrddbds{\multiput( 0, -0.15)( 0, -0.1){8}{\line( 0,-1){0.05}}}
+\def\arrddbdw{\multiput( -0.2, 0 )(-0.1, 0 ){6}{\line(-1, 0){0.05}}}
+
+%%%%%%%%% Heads and tails.
+% Heads; the argument determines where the apex of the arrow head lies.
+\def\arrhdne(#1,#2){\put(#1,#2){\line(-1,-2){0.025}}\put(#1,#2){\line(-2,-1){0.05 }}}
+\def\arrhdse(#1,#2){\put(#1,#2){\line(-1, 2){0.025}}\put(#1,#2){\line(-2, 1){0.05 }}}
+\def\arrhdnw(#1,#2){\put(#1,#2){\line( 2,-1){0.05 }}\put(#1,#2){\line( 1,-2){0.025}}}
+\def\arrhdsw(#1,#2){\put(#1,#2){\line( 2, 1){0.05 }}\put(#1,#2){\line( 1, 2){0.025}}}
+\def\arrhdn(#1,#2){\put(#1,#2){\line( -1,-2){0.025}}\put(#1,#2){\line( 1,-2){0.025}}}
+\def\arrhde(#1,#2){\put(#1,#2){\line( -2, 1){0.05 }}\put(#1,#2){\line(-2,-1){0.05 }}}
+\def\arrhds(#1,#2){\put(#1,#2){\line( -1, 2){0.025}}\put(#1,#2){\line( 1, 2){0.025}}}
+\def\arrhdw(#1,#2){\put(#1,#2){\line( 2, 1){0.05 }}\put(#1,#2){\line( 2,-1){0.05 }}}
+
+% Drawing inclusion tails
+\def\intaile{\put ( 0.2, 0.015){\oval(0.03,0.03)[l]}}
+\def\intailn{\put (-0.015, 0.1 ){\oval(0.03,0.03)[b]}}
+\def\intails{\put ( 0.015,-0.1 ){\oval(0.03,0.03)[t]}}
+\def\intailw{\put (-0.2, 0.015){\oval(0.03,0.03)[r]}}
+
+%%%%%%%%% Arrow Bodies, Heads and Tails
+% The arguments are position (of the object from which to draw the arrow
+% and the direction.
+
+\def\body(#1,#2)#3{\put(#1,#2){\ifcase #3 {\arrbdn}
+ \or {\arrbdne} \or {\arrbde} \or {\arrbdse}
+ \or {\arrbds} \or {\arrbdsw} \or {\arrbdw}
+ \or {\arrbdnw} \or {\arrbdnne} \or {\arrbdene}
+ \or {\arrbdese} \or {\arrbdsse} \or {\arrbdssw}
+ \or {\arrbdwsw} \or {\arrbdwnw} \or {\arrbdnnw} \fi}}
+
+% General long arrow body command. The arguments are as above.
+\def\longbody(#1,#2)#3{\put(#1,#2){\ifcase #3 {\longarrbdn}
+ \or {\longarrbdne} \or {\longarrbde} \or {\longarrbdse}
+ \or {\longarrbds} \or {\longarrbdsw} \or {\longarrbdw}
+ \or {\longarrbdnw} \or {\longarrbdnne} \or {\longarrbdene}
+ \or {\longarrbdese} \or {\longarrbdsse} \or {\longarrbdssw}
+ \or {\longarrbdwsw} \or {\longarrbdwnw} \or {\longarrbdnnw} \fi}}
+
+% General short body. Arguments as above.
+\def\shbody(#1,#2)#3{\put(#1,#2){\ifcase #3 {\arrshbdn}
+ \or {\arrshbdne} \or {\arrshbde} \or {\arrshbdse}
+ \or {\arrshbds} \or {\arrshbdsw} \or {\arrshbdw}
+ \or {\arrshbdnw} \fi}}
+
+% General dotted body.
+\def\ddbody(#1,#2)#3{\put(#1,#2){\ifcase #3 {\arrddbdn}
+ \or {\arrddbdne} \or {\arrddbde} \or {\arrddbdse}
+ \or {\arrddbds} \or {\arrddbdsw} \or {\arrddbdw}
+ \or {\arrddbdnw} \fi}}
+
+% General plain head. Two arguments, postion and direction. The position is
+% the object position from which the arrow emanates.
+\def\plhead(#1,#2)#3{\put(#1,#2){\ifcase #3 {\arrhdn(0,0.9)}
+ \or {\arrhdne(0.9,0.9)} \or {\arrhde(0.8,0)}
+ \or {\arrhdse(0.9,-0.9)} \or {\arrhds(0,-0.9)}
+ \or {\arrhdsw(-0.9,-0.9)} \or {\arrhdw(-0.8,0)}
+ \or {\arrhdnw(-0.9,0.9)} \or {\arrhdnne(0.45,0.9)}
+ \or {\arrhdene(0.85,0.425)} \or {\arrhdese(0.85,-0.425)}
+ \or {\arrhdsse(0.45,-0.9)} \or {\arrhdssw(-0.45,-0.9)}
+ \or {\arrhdwsw(-0.85,-0.425)} \or {\arrhdwnw(-0.85,0.425)}
+ \or {\arrhdnnw(-0.45,0.9)} \fi}}
+
+% General long head. Two arguments, postion and direction. The position is
+% the object position from which the arrow emanates.
+\def\longplhead(#1,#2)#3{\put(#1,#2){\ifcase #3 {\arrhdn(0,1.9)}
+ \or {\arrhdne(1.9,1.9)} \or {\arrhde (1.8,0)}
+ \or {\arrhdse(1.9,-1.9)} \or {\arrhds(0,-1.9)}
+ \or {\arrhdsw(-1.9,-1.9)} \or {\arrhdw(-1.8,0)}
+ \or {\arrhdnw(-1.9,1.9)} \or {\arrhdnne(0.95,1.9)}
+ \or {\arrhdene(1.85,0.925)} \or {\arrhdese(1.85,-0.925)}
+ \or {\arrhdsse(0.95,-1.9)} \or {\arrhdssw(-0.95,-1.9)}
+ \or {\arrhdwsw(-1.85,-0.925)} \or {\arrhdwnw(-1.85,0.925)}
+ \or {\arrhdnnw(-0.95,1.9)} \fi}}
+
+% General double head. Arguments as above.
+\def\dbhead(#1,#2)#3{\put(#1,#2){\ifcase #3 {\arrhdn(0,0.85)}
+ \or {\arrhdne(0.85,0.85)} \or {\arrhde(0.75,0)}
+ \or {\arrhdse(0.85,-0.85)} \or {\arrhds(0,-0.85)}
+ \or {\arrhdsw(-0.85,-0.85)} \or {\arrhdw(-0.75,0)}
+ \or {\arrhdnw(-0.85,0.85)} \fi}\plhead(#1,#2)#3}
+
+% General tail. Arguments as above.
+\def\tail(#1,#2)#3{\put(#1,#2){\ifcase #3 {\arrhdn(0,0.15)}
+ \or {\arrhdne(0.15,0.15)} \or {\arrhde(0.25,0)}
+ \or {\arrhdse(0.15,-0.15)} \or {\arrhds(0,-0.15)}
+ \or {\arrhdsw(-0.15,-0.15)} \or {\arrhdw(-0.25,0)}
+ \or {\arrhdnw(-0.15,0.15)} \fi}}
+
+% !!! What the fuck is going on here ? (DVJM)
+% General inclusion tail. Arguments as above.
+\def\intail(#1,#2)#3{\put(#1,#2){\ifcase #3 {\intailn}
+ \or \or {\intaile}
+ \or \or {\intails}
+ \or \or {\intailw} \fi}}
+
+%%%%%%%%% Arrow labels.
+% General "right hand" arrow labelling. Arguments are position, direction and label.
+\def\arrlabelr(#1,#2)#3#4{\put(#1,#2){\ifcase #3
+ {\put ( 0.05, 0.5 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 0.5, 0.4 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 0.5, -0.1 ){\makebox (0,0){$#4$}}}
+ \or {\put ( 0.4, -0.5 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-0.05,-0.5 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-0.5,- 0.4 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-0.5, 0.1 ){\makebox (0,0){$#4$}}}
+ \or {\put (-0.4, 0.5 ){\makebox(0,0)[l]{$#4$}}}
+ \or {\put ( 0.3, 0.5 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 0.55, 0.175){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 0.5, -0.325){\makebox (0,0)[r]{$#4$}}}
+ \or {\put ( 0.15,-0.55 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-0.3, -0.525){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-0.55,-0.175){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-0.5, 0.3 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put (-0.15, 0.55 ){\makebox (0,0)[l]{$#4$}}} \fi}}
+
+% General "left hand" arrow labelling. Arguments are position, direction
+% and label.
+\def\arrlabell(#1,#2)#3#4{\put(#1,#2){\ifcase #3
+ {\put (-0.05, 0.5 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put ( 0.4, 0.5 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put ( 0.5, 0.1 ){\makebox (0,0){$#4$}}}
+ \or {\put ( 0.5, -0.4 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 0.05,-0.5 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put (-0.4, -0.5 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put (-0.5, -0.1 ){\makebox (0,0){$#4$}}}
+ \or {\put (-0.5, 0.4 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put ( 0.15, 0.55 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put ( 0.5, 0.325){\makebox (0,0)[r]{$#4$}}}
+ \or {\put ( 0.55,-0.175){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 0.3, -0.5 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put (-0.15,-0.575){\makebox (0,0)[l]{$#4$}}}
+ \or {\put (-0.5, -0.325){\makebox (0,0)[l]{$#4$}}}
+ \or {\put (-0.55, 0.15 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-0.3, 0.5 ){\makebox (0,0)[r]{$#4$}}} \fi}}
+
+% General "right hand" long arrow labelling.
+\def\longarrlabelr(#1,#2)#3#4{\put(#1,#2){\ifcase #3
+ {\put ( 0.05, 1 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 1.1, 1 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 1, -0.1 ){\makebox (0,0){$#4$}}}
+ \or {\put ( 0.9, -1 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-0.05,-1 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-1, -0.9 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-1, 0.1 ){\makebox (0,0){$#4$}}}
+ \or {\put (-0.9, 1 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 0.55, 1 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 1.05, 0.4 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 1, -0.55){\makebox (0,0)[r]{$#4$}}}
+ \or {\put ( 0.4, -1.05){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-0.55,-1 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-1.05,-0.4 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-1, 0.55){\makebox (0,0)[l]{$#4$}}}
+ \or {\put (-0.4, 1.05){\makebox (0,0)[l]{$#4$}}} \fi}}
+
+% General "left hand" long arrow labelling.
+\def\longarrlabell(#1,#2)#3#4{\put(#1,#2){\ifcase #3
+ {\put (-0.05, 1 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put ( 0.9, 1 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put ( 1, 0.1 ){\makebox (0,0){$#4$}}}
+ \or {\put ( 1, -0.9 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 0.05,-1 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put (-0.9, -1 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put (-1, -0.1 ){\makebox (0,0){$#4$}}}
+ \or {\put (-1, 0.9 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put ( 0.4, 1.05){\makebox (0,0)[r]{$#4$}}}
+ \or {\put ( 1, 0.55){\makebox (0,0)[r]{$#4$}}}
+ \or {\put ( 1.05,-0.4 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put ( 0.55,-1 ){\makebox (0,0)[l]{$#4$}}}
+ \or {\put (-0.4, -1.05){\makebox (0,0)[l]{$#4$}}}
+ \or {\put (-1, -0.55){\makebox (0,0)[l]{$#4$}}}
+ \or {\put (-1.05, 0.4 ){\makebox (0,0)[r]{$#4$}}}
+ \or {\put (-0.55, 1 ){\makebox (0,0)[r]{$#4$}}} \fi}}
+
+%%%%%%%%% Parallel and Antiparallel Arrows.
+\def\prarrowe(#1,#2)#3#4{\put(#1,#2){\@plarrow( 0, 0.05){\east}[#3][\po]
+ \@plarrow( 0, -0.05){\east}[#4][\st]}}
+\def\prarrown(#1,#2)#3#4{\put(#1,#2){\@plarrow(-0.05, 0 ){\north}[#3][\po]
+ \@plarrow( 0.05, 0 ){\north}[#4][\st]}}
+\def\prarroww(#1,#2)#3#4{\put(#1,#2){\@plarrow( 0, -0.55){\west}[#3][\po]
+ \@plarrow( 0, 0.55){\west}[#4][\st]}}
+\def\prarrows(#1,#2)#3#4{\put(#1,#2){\@plarrow( 0.05, 0 ){\south}[#3][\po]
+ \@plarrow(-0.05, 0 ){\south}[#4][\st]}}
+
+\def\prarrone(#1,#2)#3#4{\put(#1,#2){\@plarrow(-0.03, 0.03){\neast}[#3][\po]
+ \@plarrow( 0.03,-0.03){\neast}[#4][\st]}}
+\def\prarronw(#1,#2)#3#4{\put(#1,#2){\@plarrow(-0.03,-0.03){\nwest}[#3][\po]
+ \@plarrow( 0.03, 0.03){\nwest}[#4][\st]}}
+\def\prarrose(#1,#2)#3#4{\put(#1,#2){\@plarrow( 0.03, 0.03){\seast}[#3][\po]
+ \@plarrow(-0.03,-0.03){\seast}[#4][\st]}}
+\def\prarrosw(#1,#2)#3#4{\put(#1,#2){\@plarrow( 0.03,-0.03){\swest}[#3][\po]
+ \@plarrow(-0.03, 0.03){\swest}[#4][\st]}}
+
+% Command for anti-parallel arrows. Arguments are position and labels.
+\def\anprarrowe(#1,#2)#3#4{\put(#1,#2){\@plarrow( 0, 0.05){\east}[#3][\po]
+ \@plarrow( 1, -0.05){\west}[#4][\po]}}
+\def\anprarrown(#1,#2)#3#4{\put(#1,#2){\@plarrow(-0.05, 0 ){\north}[#3][\po]
+ \@plarrow( 0.05, 1 ){\south}[#4][\po]}}
+\def\anprarroww(#1,#2)#3#4{\put(#1,#2){\@plarrow( 0, -0.55){\west}[#3][\po]
+ \@plarrow(-1, 0.55){\east}[#4][\po]}}
+\def\anprarrows(#1,#2)#3#4{\put(#1,#2){\@plarrow( 0.05, 0 ){\south}[#3][\po]
+ \@plarrow(-0.05,-1 ){\north}[#4][\po]}}
+
+\def\prarrone(#1,#2)#3#4{\put(#1,#2){\@plarrow(-0.03, 0.03){\neast}[#3][\po]
+ \@plarrow( 0.03,-0.03){\neast}[#4][\po]}}
+\def\prarronw(#1,#2)#3#4{\put(#1,#2){\@plarrow(-0.03,-0.03){\nwest}[#3][\po]
+ \@plarrow( 0.03, 0.03){\nwest}[#4][\po]}}
+\def\prarrose(#1,#2)#3#4{\put(#1,#2){\@plarrow( 0.03, 0.03){\seast}[#3][\po]
+ \@plarrow(-0.03,-0.03){\seast}[#4][\po]}}
+\def\prarrosw(#1,#2)#3#4{\put(#1,#2){\@plarrow( 0.03,-0.03){\swest}[#3][\po]
+ \@plarrow(-0.03, 0.03){\swest}[#4][\po]}}
+% Main arrow drawing commands.
+\def\plarrow(#1,#2)#3{\@ifnextchar[{\@plarrow(#1,#2){#3}}%
+ {\@plarrow(#1,#2){#3}[][\po]}}
+\def\@plarrow(#1,#2)#3[#4][#5]{\body(#1,#2){#3}\plhead(#1,#2){#3}
+ {\ifodd #5 {\arrlabelr(#1,#2){#3}{#4}}
+ \else {\arrlabell(#1,#2){#3}{#4}}\fi}}
+
+\def\longplarrow(#1,#2)#3{\@ifnextchar[{\@longplarrow(#1,#2){#3}}%
+ {\@longplarrow(#1,#2){#3}[][\po]}}
+\def\@longplarrow(#1,#2)#3[#4][#5]{\longbody(#1,#2){#3}\longplhead(#1,#2){#3}
+ {\ifodd #5 {\longarrlabelr(#1,#2){#3}{#4}}
+ \else {\longarrlabell(#1,#2){#3}{#4}}\fi}}
+
+\def\sharr(#1,#2)#3{\@ifnextchar[{\@sharr(#1,#2){#3}}%
+ {\@sharr(#1,#2){#3}[][\po]}}
+\def\@sharr(#1,#2)#3[#4][#5]{\shbody(#1,#2){#3}\plhead(#1,#2){#3}
+ {\ifodd #5 {\arrlabelr(#1,#2){#3}{#4}}
+ \else {\arrlabell(#1,#2){#3}{#4}}\fi}}
+
+\def\tlarrow(#1,#2)#3{\@ifnextchar[{\@tlarrow(#1,#2){#3}}%
+ {\@tlarrow(#1,#2){#3}[][\po]}}
+\def\@tlarrow(#1,#2)#3[#4][#5]{\shbody(#1,#2){#3}\plhead(#1,#2){#3}\tail(#1,#2){#3}
+ {\ifodd #5 {\arrlabelr(#1,#2){#3}{#4}}
+ \else {\arrlabell(#1,#2){#3}{#4}}\fi}}
+
+\def\dbarrow(#1,#2)#3{\@ifnextchar[{\@dbarrow(#1,#2){#3}}%
+ {\@dbarrow(#1,#2){#3}[][\po]}}
+\def\@dbarrow(#1,#2)#3[#4][#5]{\body(#1,#2){#3}\dbhead(#1,#2){#3}
+ {\ifodd #5 {\arrlabelr(#1,#2){#3}{#4}}
+ \else {\arrlabell(#1,#2){#3}{#4}}\fi}}
+
+\def\ddarrow(#1,#2)#3{\@ifnextchar[{\@ddarrow(#1,#2){#3}}%
+ {\@ddarrow(#1,#2){#3}[][\po]}}
+\def\@ddarrow(#1,#2)#3[#4][#5]{\ddbody(#1,#2){#3}\plhead(#1,#2){#3}
+ {\ifodd #5 {\arrlabelr(#1,#2){#3}{#4}}
+ \else {\arrlabell(#1,#2){#3}{#4}}\fi}}
+
+\def\inarrow(#1,#2)#3{\@ifnextchar[{\@inarrow(#1,#2){#3}}%
+ {\@inarrow(#1,#2){#3}[][\po]}}
+\def\@inarrow(#1,#2)#3[#4][#5]{\body(#1,#2){#3}\plhead(#1,#2){#3}\intail(#1,#2){#3}
+ {\ifodd #5 {\arrlabelr(#1,#2){#3}{#4}}
+ \else {\arrlabell(#1,#2){#3}{#4}}\fi}}
+\def\prarrow(#1,#2)#3{\@ifnextchar[{\@prarrow(#1,#2){#3}}%
+ {\@prarrow(#1,#2){#3}[][\po]}}
+\def\@prarrow(#1,#2)#3[#4][#5]{\ifcase #3 {\prarrown(#1,#2){#4}{#5}}
+ \or {\prarrowne(#1,#2){#4}{#5}} \or {\prarrowe(#1,#2){#4}{#5}}
+ \or {\prarrowse(#1,#2){#4}{#5}} \or {\prarrows(#1,#2){#4}{#5}}
+ \or {\prarrowsw(#1,#2){#4}{#5}} \or {\prarroww(#1,#2){#4}{#5}}
+ \or {\prarrownw(#1,#2){#4}{#5}} \fi}
+
+\def\sharrow(#1,#2)#3{\@ifnextchar[{\@sharrow(#1,#2){#3}}%
+ {\@sharrow(#1,#2){#3}[][\po]}}
+\def\@sharrow(#1,#2)#3[#4][#5]{\ifcase #3
+ {\put( 0, -0.05){\sharr(#1,#2){#3}[#4][#5]}}
+ \or {\put(-0.05,-0.05){\sharr(#1,#2){#3}[#4][#5]}}
+ \or {\put(-0.05, 0 ){\sharr(#1,#2){#3}[#4][#5]}}
+ \or {\put(-0.05, 0.05){\sharr(#1,#2){#3}[#4][#5]}}
+ \or {\put( 0, 0.05){\sharr(#1,#2){#3}[#4][#5]}}
+ \or {\put( 0.05, 0.05){\sharr(#1,#2){#3}[#4][#5]}}
+ \or {\put( 0.05, 0 ){\sharr(#1,#2){#3}[#4][#5]}}
+ \or {\put( 0.05,-0.05){\sharr(#1,#2){#3}[#4][#5]}} \fi}
+
+\def\anprarrow(#1,#2)#3{\@ifnextchar[{\@anprarrow(#1,#2){#3}}%
+ {\@anprarrow(#1,#2){#3}[][]}}
+\def\@anprarrow(#1,#2)#3[#4][#5]{\ifcase #3 {\anprarrown(#1,#2){#4}{#5}}
+ \or {\@warning{Arrow style not available}}
+ \or {\anprarrowe(#1,#2){#4}{#5}}
+ \or {\@warning{Arrow style not available}}
+ \or {\anprarrows(#1,#2){#4}{#5}}
+ \or {\@warning{Arrow style not available}}
+ \or {\anprarroww(#1,#2){#4}{#5}}
+ \or {\@warning{Arrow style not available}} \fi}
+
+%%%%%%%%% Curved arrow bodies and labels
+\def\curvepoarrbdn#1{\put(-0.1, 0.1 ){\Curve(0,0.8){-5}}
+ \put(-0.3, 0.5 ){\makebox(0,0)[r]{$#1$}}}
+\def\curvestarrbdn#1{\put( 0.1, 0.1 ){\Curve(0,0.8){5}}
+ \put( 0.3, 0.5 ){\makebox(0,0)[l]{$#1$}}}
+\def\curvepoarrbde#1{\put( 0.2, 0.1 ){\Curve(0.6,0){-5}}
+ \put( 0.5, 0.3 ){\makebox(0,0.1){$#1$}}}
+\def\curvestarrbde#1{\put( 0.2,-0.1 ){\Curve(0.6,0){5}}
+ \put( 0.5,-0.35){\makebox(0,0){$#1$}}}
+
+\def\curvepoarrbds#1{\put( 0.1,-0.1){\Curve(0,-0.8){-5}}
+ \put( 0.3,-0.5){\makebox(0,0)[l]{$#1$}}}
+\def\curvestarrbds#1{\put(-0.1,-0.1){\Curve(0,-0.8){5}}
+ \put(-0.3,-0.5){\makebox(0,0)[r]{$#1$}}}
+\def\curvestarrbdw#1{\put(-0.2, 0.1){\Curve(-0.6,0){5}}
+ \put(-0.5, 0.3){\makebox(0,0.1){$#1$}}}
+\def\curvepoarrbdw#1{\put(-0.2,-0.1){\Curve(-0.6,0){-5}}
+ \put(-0.5,-0.35){\makebox(0,0){$#1$}}}
+
+% Long curved arrow bodies
+\def\longcurvepoarrbdn#1{\put(-0.1, 0.1 ){\Curve(0,1.8){-5}}
+ \put(-0.6, 1 ){\makebox(0,0)[r]{$#1$}}}
+\def\longcurvestarrbdn#1{\put( 0.1, 0.1 ){\Curve(0,1.8){5}}
+ \put( 0.6, 1 ){\makebox(0,0)[l]{$#1$}}}
+\def\longcurvepoarrbde#1{\put( 0.2, 0.1 ){\Curve(1.6,0){-5}}
+ \put( 1, 0.55){\makebox(0,0){$#1$}}}
+\def\longcurvestarrbde#1{\put( 0.2,-0.1 ){\Curve(1.6,0){5}}
+ \put( 1, -0.6 ){\makebox(0,0){$#1$}}}
+\def\longcurvepoarrbds#1{\put( 0.1,-0.1 ){\Curve(0,-1.8){-5}}
+ \put( 0.6,-1 ){\makebox(0,0)[l]{$#1$}}}
+\def\longcurvestarrbds#1{\put(-0.1,-0.1 ){\Curve(0,-1.8){5}}
+ \put(-0.6,-1 ){\makebox(0,0)[r]{$#1$}}}
+\def\longcurvestarrbdw#1{\put(-0.2, 0.1 ){\Curve(-1.6,0){5}}
+ \put(-1, 0.55){\makebox(0,0){$#1$}}}
+\def\longcurvepoarrbdw#1{\put(-0.2,-0.1 ){\Curve(-1.6,0){-5}}
+ \put(-1., -0.6 ){\makebox(0,0){$#1$}}}
+
+% Arrow heads for curved arrows
+\let\curvepoarrhdn=\arrhdne
+\let\curvestarrhdn=\arrhdnw
+\let\curvepoarrhde=\arrhdse
+\let\curvestarrhde=\arrhdne
+\let\curvepoarrhds=\arrhdsw
+\let\curvestarrhds=\arrhdse
+\let\curvepoarrhdw=\arrhdsw
+\let\curvestarrhdw=\arrhdnw
+
+% General curved body
+\def\curvepobody(#1,#2)#3#4{\put(#1,#2){\ifcase #3 {\curvepoarrbdn{#4}}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvepoarrbde{#4}}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvepoarrbds{#4}}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvepoarrbdw{#4}}
+ \or {\@warning{Arrow style not available}} \fi}}
+\def\curvestbody(#1,#2)#3#4{\put(#1,#2){\ifcase #3 {\curvestarrbdn{#4}}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvestarrbde{#4}}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvestarrbds{#4}}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvestarrbdw{#4}}
+ \or {\@warning{Arrow style not available}} \fi}}
+\def\longcurvepobody(#1,#2)#3#4{\put(#1,#2){\ifcase #3 {\longcurvepoarrbdn{#4}}
+ \or {\@warning{Arrow style not available}}
+ \or {\longcurvepoarrbde{#4}}
+ \or {\@warning{Arrow style not available}}
+ \or {\longcurvepoarrbds{#4}}
+ \or {\@warning{Arrow style not available}}
+ \or {\longcurvepoarrbdw{#4}}
+ \or {\@warning{Arrow style not available}} \fi}}
+
+\def\longcurvestbody(#1,#2)#3#4{\put(#1,#2){\ifcase #3 {\longcurvestarrbdn{#4}}
+ \or {\@warning{Arrow style not available}}
+ \or {\longcurvestarrbde{#4}}
+ \or {\@warning{Arrow style not available}}
+ \or {\longcurvestarrbds{#4}}
+ \or {\@warning{Arrow style not available}}
+ \or {\longcurvestarrbdw{#4}}
+ \or {\@warning{Arrow style not available}} \fi}}
+
+\def\curvepohead(#1,#2)#3{\put(#1,#2) {\ifcase #3 {\curvepoarrhdn(-0.1,0.9)}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvepoarrhde(0.8,0.1)}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvepoarrhds(0.1,-0.9)}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvepoarrhdw(-0.8,-0.1)}
+ \or {\@warning{Arrow style not available}} \fi}}
+
+\def\curvesthead(#1,#2)#3{\put(#1,#2) {\ifcase #3 {\curvestarrhdn(0.1,0.9)}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvestarrhde(0.8,-0.1)}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvestarrhds(-0.1,-0.9)}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvestarrhdw(-0.8,0.1)}
+ \or {\@warning{Arrow style not available}} \fi}}
+
+\def\longcurvepohead(#1,#2)#3{\put(#1,#2) {\ifcase #3 {\curvepoarrhdn(-0.1,1.9)}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvepoarrhde(1.8,0.1)}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvepoarrhds(0.1,-1.9)}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvepoarrhdw(-1.8,-0.1)}
+ \or {\@warning{Arrow style not available}} \fi}}
+
+\def\longcurvesthead(#1,#2)#3{\put(#1,#2) {\ifcase #3 {\curvestarrhdn(0.1,1.9)}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvestarrhde(1.8,-0.1)}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvestarrhds(-0.1,-1.9)}
+ \or {\@warning{Arrow style not available}}
+ \or {\curvestarrhdw(-1.8,0.1)}
+ \or {\@warning{Arrow style not available}} \fi}}
+
+\def\curvepoarrow(#1,#2)#3#4{\curvepobody(#1,#2){#3}{#4}\curvepohead(#1,#2){#3}}
+\def\curvestarrow(#1,#2)#3#4{\curvestbody(#1,#2){#3}{#4}\curvesthead(#1,#2){#3}}
+
+\def\longcurvepoarrow(#1,#2)#3#4{\longcurvepobody(#1,#2){#3}{#4}%
+ \longcurvepohead(#1,#2){#3}}
+\def\longcurvestarrow(#1,#2)#3#4{\longcurvestbody(#1,#2){#3}{#4}%
+ \longcurvesthead(#1,#2){#3}}
+
+\def\curvearrow(#1,#2)#3{\@ifnextchar[{\@curvearrow(#1,#2){#3}}%
+ {\@curvearrow(#1,#2){#3}[]}}
+\def\@curvearrow(#1,#2)#3[#4]#5{\ifodd #5 {\curvestarrow(#1,#2){#3}{#4}}
+ \else {\curvepoarrow(#1,#2){#3}{#4}} \fi}
+
+\def\longcurvearrow(#1,#2)#3{\@ifnextchar[{\@longcurvearrow(#1,#2){#3}}%
+ {\@longcurvearrow(#1,#2){#3}[]}}
+\def\@longcurvearrow(#1,#2)#3[#4]#5{\ifodd #5 {\longcurvestarrow(#1,#2){#3}{#4}}
+ \else {\longcurveporrow(#1,#2){#3}{#4}} \fi}
+
+%%%%%%% Two cells
+\def\twocellup(#1,#2){\put(#1,#2){{\put( 0.02,-0.1) {\line( 0, 1) {0.16}}}
+ {\put(-0.02,-0.1) {\line( 0, 1) {0.16}}}
+ {\put( 0, 0.1) {\line( 1,-2) {0.05}}}
+ {\put( 0, 0.1) {\line(-1,-2) {0.05}}}}}
+
+\def\twocelldown(#1,#2){\put(#1,#2){{\put( 0.02, 0.1) {\line( 0,-1) {0.16}}}
+ {\put(-0.02, 0.1) {\line( 0,-1) {0.16}}}
+ {\put( 0, -0.1) {\line( 1, 2) {0.05}}}
+ {\put( 0, -0.1) {\line(-1, 2) {0.05}}}}}
+
+\def\twocellright(#1,#2){\put(#1,#2){{\put(-0.1, 0.02) {\line( 1, 0){0.16}}}
+ {\put(-0.1,-0.02) {\line( 1, 0){0.16}}}
+ {\put( 0.1, 0 ) {\line(-2, 1){0.1 }}}
+ {\put( 0.1, 0 ) {\line(-2,-1){0.1 }}}}}
+
+\def\twocellleft(#1,#2){\put(#1,#2){{\put( 0.1,-0.02) {\line(-1, 0) {0.16}}}
+ {\put( 0.1, 0.02) {\line(-1, 0) {0.16}}}
+ {\put(-0.1, 0 ) {\line( 2,-1) {0.1 }}}
+ {\put(-0.1, 0 ) {\line( 2, 1) {0.1 }}}}}
+
+\def\twocellclock(#1,#2)#3{\put(#1,#2){\ifcase #3 {\twocellright(0, 0.5)}
+ \or \or {\twocelldown( 0.5, 0 )}
+ \or \or {\twocellleft( 0, -0.5)}
+ \or \or {\twocellup( -0.5, 0 )}
+ \or \or {\twocellright(0.25,0.6)}
+ \or {\twocelldown( 0.6, 0.25)}
+ \or {\twocelldown( 0.6, -0.25)}
+ \or {\twocellleft( 0.25,-0.6 )}
+ \or {\twocellleft( -0.25,-0.6 )}
+ \or {\twocellup( -0.6, -0.25)}
+ \or {\twocellup (-0.6, 0.25)}
+ \or {\twocellright(-0.25, 0.6 )} \fi}}
+
+\def\twocellanti(#1,#2)#3{\put(#1,#2){\ifcase #3 {\twocellleft( 0, 0.5)}
+ \or \or {\twocellup( 0.5, 0 )}
+ \or \or {\twocellright(0, -0.5)}
+ \or \or {\twocelldown(-0.5, 0 )}
+ \or \or {\twocellleft( 0.25,0.6)}
+ \or {\twocellup( 0.6, 0.25)}
+ \or {\twocellup( 0.6, -0.25)}
+ \or {\twocellright( 0.25,-0.6)}
+ \or {\twocellright(-0.25,-0.6)}
+ \or {\twocelldown( -0.6, -0.25)}
+ \or {\twocelldown( -0.6, 0.25)}
+ \or {\twocellleft( -0.25, 0.6)} \fi}}
+
+\def\twocelllabelfar(#1,#2)#3#4{\put(#1,#2){\ifcase #3
+ {\put( 0, 0.65){\makebox(0,0){$#4$}}}
+ \or \or {\put( 0.6, 0 ){\makebox(0,0)[l]{$#4$}}}
+ \or \or {\put( 0, -0.65){\makebox(0,0){$#4$}}}
+ \or \or {\put(-0.6, 0 ){\makebox(0,0)[r]{$#4$}}}
+ \or \or {\put( 0.25, 0.75){\makebox(0,0){$#4$}}}
+ \or {\put( 0.7, 0.25){\makebox(0,0)[l]{$#4$}}}
+ \or {\put( 0.7, -0.25){\makebox(0,0)[l]{$#4$}}}
+ \or {\put( 0.25,-0.75){\makebox(0,0){$#4$}}}
+ \or {\put(-0.25,-0.75){\makebox(0,0){$#4$}}}
+ \or {\put(-0.7, -0.25){\makebox(0,0)[r]{$#4$}}}
+ \or {\put(-0.7, 0.25){\makebox(0,0)[r]{$#4$}}}
+ \or {\put(-0.25, 0.75){\makebox(0,0){$#4$}}} \fi}}
+
+\def\twocelllabelnear(#1,#2)#3#4{\put(#1,#2){\ifcase #3
+ {\put( 0, 0.35){\makebox(0,0){$#4$}}}
+ \or
+ \or {\put( 0.4, 0 ){\makebox(0,0)[r]{$#4$}}}
+ \or
+ \or {\put( 0, -0.35){\makebox(0,0){$#4$}}}
+ \or
+ \or {\put(-0.4, 0 ){\makebox(0,0)[l]{$#4$}}}
+ \or
+ \or {\put( 0.25, 0.45){\makebox(0,0){$#4$}}}
+ \or {\put( 0.5, 0.25){\makebox(0,0)[r]{$#4$}}}
+ \or {\put( 0.5, -0.25){\makebox(0,0)[r]{$#4$}}}
+ \or {\put( 0.25,-0.45){\makebox(0,0){$#4$}}}
+ \or {\put(-0.25,-0.45){\makebox(0,0){$#4$}}}
+ \or {\put(-0.5, -0.25){\makebox(0,0)[l]{$#4$}}}
+ \or {\put(-0.5, 0.25){\makebox(0,0)[l]{$#4$}}}
+ \or {\put(-0.25, 0.45){\makebox(0,0){$#4$}}} \fi}}
+
+\def\twocell(#1,#2)#3#4{\@ifnextchar[{\@twocell(#1,#2){#3}{#4}}%
+ {\@twocell(#1,#2){#3}{#4}[][\far]}}
+\def\@twocell(#1,#2)#3#4[#5][#6]{{\ifcase #4 {\twocellclock(#1,#2){#3}}
+ \or {\twocellanti(#1,#2){#3}} \fi}
+ {\ifcase #6 {\twocelllabelnear(#1,#2){#3}{#5}}
+ \or {\twocelllabelfar(#1,#2){#3}{#5}} \fi}}
+
+
+%%%%%%% The flexi--arrow routines
+\def\Farrow(#1,#2)(#3,#4){\@ifnextchar[{\@Garrow(#1,#2)(#3,#4)}%
+ {\@Farrow(#1,#2)(#3,#4)[][\po]}}
+
+% Note (1) that the \put(0,0) really is necessary, and (2) that
+% the overhead of doing the trig. means it really is worth avoiding for G
+\def\@Farrow(#1,#2)(#3,#4)[#5][#6]{\put(0,0){\@GenLab{#1}{#2}{#3}{#4}{#5}{#6}}
+ \put(0,0){\@FlArrow(#1,#2)(#3,#4)(0.15,0.15)(0.15,0.15)}}
+\def\@Garrow(#1,#2)(#3,#4)[#5][#6]{%
+ \put(0,0){\@FlArrow(#1,#2)(#3,#4)(0.15,0.15)(0.15,0.15)}}
+% In the course of time, @GenLab will label an arrow at arbitrary slope.
+\def\@GenLab#1#2#3#4#5#6{}
+% \dimen0 = #1pt
+% \dimen1 = #2pt
+% \dimen3 = #3pt
+% \dimen4 = #4pt
+% \advance \dimen3 by -\dimen1
+% \advance \dimen4 by -\dimen2
+
+% Essentially, we need to work out dx + h sin p, dy + h cos p, where dx
+% is x1 - x0, dy similarly, p is atan (dy/dx) and h is about 10pt.
+% The arguments are: #1 = x0, #2 = y0, #3 = x1, #4 = y1, #5 = label, #6 = direction
+% One for \po first.
+
+% \input ArcTan.tex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\endinput
+%
+% end of diagram.sty