% lamsarrow.sty: fancy arrows using lams fonts
% Author: extracted from Michael Spivak's LamS-TeX by Paul Burchard
% Version Number: 4.1
% Version Date: 24 Jan 1997
%
%--------------------- LamS-TeX copyright -------------------------
% COPYRIGHT (C) 1989, 1990, 1991 by the Texplorators Corporation,
% 1572 West Gray #377, Houston, TX 77019-4948 (ALL RIGHTS RESERVED)
%------------------------------------------------------------------
%
% This macro package allows LaTeX users to make use of the LamS-TeX
% arrow fonts and create arrows with
%	* any valid LaTeX \line slope (unlike LaTeX's \vector)
%	* all those fancy head/tail symbols and shaft styles.
%
% Actually, these macros will accept any slope and approximate it
% by the closest LaTeX \line slope.  In making the approximation
% to the desired arrow slope, these macros will work to keep the
% arrow's *vertical* dimension accurate (at the expense
% of the horizontal one, if necessary).  This requires the
% opposite strategy from LaTeX's \line and \vector commands,
% where the *horizontal* dimension can always be precisely
% specified.
%
% The macros seem to have the 10pt font size hardcoded in, so
% the arrow embellishments will be on the marginally small side
% in 12pt.
%
% Commands defined in this style file:
%
% \lamsarrow(#1,#2)
%	Draws an arrow which extends #1 \unitlengths in the
%	x-direction and #2 \unitlengths in the y-direction from the
%	current position.  #1 and #2 are arbitrary real numbers,
%	not both zero.  Intended for use in the picture environment.
%
% \lamsvector(#1,#2){#3}
%	Has the same effect as \lamsarrow, except its usage is
%	completely compatible with LaTeX's \vector command.  But
%	with \lamsvector, there are no limits on the size of the
%	integers #1, #2, and it is OK if they have common factors.
%	Only valid LaTeX line slopes will actually be drawn, tho.
%
% \lamsshaft{#1}
%	A local declaration which changes the style of the shaft
%	of any subsequent lams arrows within the same environment
%	or {...} group.  The symbol #1 may be one of:
%
%		-	solid line (default)
%		.	dashed line
%		=	long equals sign (no head or tail printed)
%		0	invisible arrow
%		?	reset to default
%
% \lamssource{#1}
% \lamstarget{#1}
%	Local declarations which change the symbol placed at the
%	initial and final points, respectively, of the arrow shaft.
%	Affects subsequent lams arrows within the same environment
%	or {...} group.  For either declaration, the symbol #1 may
%	be any one of:
%
%	  Heads:
%		^	arrow head (default for \lamstarget)
%		V	arrow tail (default for \lamssource)
%		'	left half of arrowhead
%		`	right half of arrowhead
%		A	double arrowhead
%	  Tails:
%		J	left fishhook tail
%		L	right fishhook tail
%		S	squiggle
%	  Other:
%		0	no symbol
%		?	reset to default
%

% detente message
\typeout{ * LAMSTEX ARROWS *                                      }
\typeout{ The arrows you are using are courtesy of LamS-TeX, a    }
\typeout{ full-featured mathematical typsetting package which its }
\typeout{ creator, at least, believes to be superior to LaTeX.    }
\typeout{ You can obtain LamS-TeX by anonymous FTP from most TeX  }
\typeout{ archives, or through the TUG user group organization.   }
\typeout{ }

% lams arrow fonts
\font\lamsfont@i=lams1
\font\lamsfont@ii=lams2
\font\lamsfont@iii=lams3
\font\lamsfont@iv=lams4
\font\lamsfont@v=lams5

% arrow geom params
% direction
\newif\ifN@
\newif\ifE@
\newif\ifNESW@
\newif\ifH@
\newif\ifV@
% location of source, target
\newdimen\lams@firstx
\newdimen\lams@firsty
\newdimen\lams@lastx
\newdimen\lams@lasty
\newdimen\lams@center %ignore
% shaft char dims
\newdimen\lams@ht
\newdimen\lams@wd

% misc
\newcount\ten@ \ten@10


%%%%%%%%%%%%%%%%%%%% \lamssource, \lamstarget, \lamsshaft
%
% Used to set arrow style options.
%
% EXTERNAL VARS COMPUTED
%
% \lams@source \lams@target \lams@shaft

\newcount\lams@source
\newcount\lams@target
\newcount\lams@shaft

\def\lamssource#1{%
 \if#10\lams@source\m@ne\else
 \if#1?\lams@source\z@\else
 \if#1V\lams@source\tw@\else
 \if#1^\lams@source\thr@@\else
 \if#1'\lams@source6 \else
 \if#1`\lams@source7 \else
 \if#1J\lams@source8 \else
 \if#1L\lams@source9 \else
 \if#1S\lams@source12 \else
 \if#1A\lams@source13 \else
 \@latexerr{Invalid lamsarrow source style: #1}%
 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
\def\lamstarget#1{%
 \if#10\lams@target\m@ne\else
 \if#1?\lams@target\z@\else
 \if#1^\lams@target\tw@\else
 \if#1V\lams@target\thr@@\else
 \if#1'\lams@target4 \else
 \if#1`\lams@target5 \else
 \if#1J\lams@target\ten@ \else
 \if#1L\lams@target11 \else
 \if#1S\lams@target12 \else
 \if#1A\lams@target13 \else
 \@latexerr{Invalid lamsarrow target style: #1}%
 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
\def\lamsshaft#1{%
 \if#10\lams@shaft\m@ne\else
 \if#1?\lams@shaft\z@\else
 \if#1-\lams@shaft\@ne\else
 \if#1.\lams@shaft\tw@\else
 \if#1=\lams@shaft\thr@@\else
 \@latexerr{Invalid lamsarrow shaft style: #1}%
 \fi\fi\fi\fi\fi}


%%%%%%%%%%%%%%%%%%%% \lams@slope
%
% Utility macro to calculate arrow shaft character in lamstex arrow
% fonts, given the x- and y-dimensions of the raw arrow.
%
% EXTERNAL VARS USED
%
% \lams@firstx \lams@lastx \lams@firsty \lams@lasty
% \ifN@ \ifE@
%
% EXTERNAL VARS COMPUTED
%
% \lams@tani \lams@tanii \lams@ang
%
% INTERNAL VARS USED
%
% \lams@slopei \lams@slopeii
% \lams@tanip \lams@taniip \lams@slopeip \lams@slopeiip
% \count@ \lams@extra

\newcount\lams@tani
\newcount\lams@tanip
\newcount\lams@tanii
\newcount\lams@taniip
\newdimen\lams@slopei
\newdimen\lams@slopeip
\newdimen\lams@slopeii
\newdimen\lams@slopeiip
\newcount\lams@ang
\newcount\lams@extra

\def\lams@slopeselect{%
 \\161\\152\\143\\134\\255\\126\\357\\238\\349\\45{10}%
 \\56{11}\\11{12}\\65{13}\\54{14}\\43{15}\\32{16}\\53{17}%
 \\21{18}\\52{19}\\31{20}\\41{21}\\51{22}\\61{23}}

\def\lams@slope{{\lams@slopei\lams@lasty
 \advance\lams@slopei-\lams@firsty
 \ifN@\else\multiply\lams@slopei\m@ne\fi
 \lams@slopeii\lams@lastx\advance\lams@slopeii-\lams@firstx
 \ifE@\else\multiply\lams@slopeii\m@ne\fi
 \ifdim\lams@slopeii<\z@
  \global\lams@tani6 \global\lams@tanii\@ne\global\lams@ang23
 \else
  \dimen@\lams@slopei\multiply\dimen@6
  \ifdim\dimen@<\lams@slopeii
   \global\lams@tani\@ne\global\lams@tanii6 \global\lams@ang\@ne
  \else
   \dimen@\lams@slopeii\multiply\dimen@6
   \ifdim\dimen@<\lams@slopei
    \global\lams@tani6 \global\lams@tanii\@ne\global\lams@ang23
   \else
    \global\lams@tanip\z@\global\lams@taniip\@ne
    \def\\##1##2##3{\global\lams@ang##3\relax
     \lams@slopeip\lams@slopei\lams@slopeiip\lams@slopeii
     \multiply\lams@slopeiip##1\relax
     \multiply\lams@slopeip##2\relax
     \ifdim\lams@slopeiip<\lams@slopeip
      \global\lams@tanip##1\relax\global\lams@taniip##2\relax
     \else
      \global\lams@tani##1\relax\global\lams@tanii##2\relax
      \def\\####1####2####3{}%
     \fi}%
    \lams@slopeselect
    \lams@slopei\lams@lasty\advance\lams@slopei-\lams@firsty
    \ifN@\else\multiply\lams@slopei\m@ne\fi
    \multiply\lams@slopei\lams@tanii
    \multiply\lams@slopei\lams@taniip
    \multiply\lams@slopei\tw@
    \count@\lams@tani\multiply\count@\lams@taniip
    \lams@extra\lams@tanip\multiply\lams@extra\lams@tanii
    \advance\count@\lams@extra
    \lams@slopeii\lams@lastx\advance\lams@slopeii-\lams@firstx
    \ifE@\else\multiply\lams@slopeii\m@ne\fi
    \multiply\lams@slopeii\count@
    \ifdim\lams@slopei<\lams@slopeii
     \global\lams@tani\lams@tanip\global\lams@tanii\lams@taniip
     \global\advance\lams@ang\m@ne
    \fi
   \fi
  \fi
 \fi}%
}


%%%%%%%%%%%%%%%%%%%% \lamsarrow, \lamsvector
%
% User macros for lams arrows.  They call \lams@arrow, which sets
% up parameters for \lams@harrow, \lams@varrow, and \lams@darrow.
%
% EXTERNAL VARS USED
%
% \lams@source \lams@target
%
% EXTERNAL VARS COMPUTED
%
% \ifNESW@ \ifN@ \ifE@
% \lams@center \lams@firstx \lams@firsty \lams@lasty
% \lams@wd \lams@ht
%
% INTERNAL VARS USED
%
% \lams@xsize \lams@ysize

\newdimen\lams@xsize
\newdimen\lams@ysize

\def\lamsvector(#1,#2)#3{%
 \lams@xsize#3\unitlength\relax
 \ifnum#1<\z@\multiply\lams@xsize\m@ne\fi
 \lams@ysize\lams@xsize
 \ifnum#1=\z@
  \lams@xsize\z@
  \ifnum#2<\z@\multiply\lams@ysize\m@ne\fi
 \else
  \multiply\lams@ysize#2\relax\divide\lams@ysize#1\relax
 \fi
 \lams@arrow{\lams@xsize}{\lams@ysize}%
}

\def\lamsarrow(#1,#2){%
 \lams@xsize#1\unitlength\relax\lams@ysize#2\unitlength\relax
 \lams@arrow{\lams@xsize}{\lams@ysize}%
}

\def\lams@switchsides{%
  \ifnum\lams@source=6\relax\lams@source7\else
  \ifnum\lams@source=7\relax\lams@source6\else
  \ifnum\lams@source=8\relax\lams@source9\else
  \ifnum\lams@source=9\relax\lams@source8\fi\fi\fi\fi\relax
  \ifnum\lams@target=4\relax\lams@target5\else
  \ifnum\lams@target=5\relax\lams@target4\else
  \ifnum\lams@target=\ten@\relax\lams@target11\else
  \ifnum\lams@target=11\relax\lams@target\ten@\fi\fi\fi\fi\relax
}

\def\lams@arrow#1#2{%
 \lams@firstx\z@\lams@firsty\z@
 \lams@lastx#1\relax\lams@lasty#2\relax
 \lams@center\z@
 %
 % compute direction flags
 \N@false\E@false\H@false\V@false
 \ifdim\lams@lastx>\z@\E@true\fi
 \ifdim\lams@lastx=\z@\V@true\fi
 \ifdim\lams@lasty>\z@\N@true\fi
 \ifdim\lams@lasty=\z@\H@true\fi
 \NESW@false
 \ifN@\ifE@\NESW@true\fi\else\ifE@\else\NESW@true\fi\fi
 %
 % fix up one-sided embellishments, depending on direction
 \ifdim\lams@lastx<\z@ \lams@switchsides \fi
 \ifdim\lams@lastx=\z@ \ifdim\lams@lasty<\z@ \lams@switchsides \fi\fi
 %
 % compute shaft char info with help of \lams@slope macro 
 \ifH@\else\ifV@\else
  \lams@slope
  \ifnum\lams@tani>\lams@tanii
   \lams@ht\ten@\p@\lams@wd\ten@\p@
   \multiply\lams@wd\lams@tanii\divide\lams@wd\lams@tani
  \else
   \lams@wd\ten@\p@\lams@ht\ten@\p@
   \divide\lams@ht\lams@tanii\multiply\lams@ht\lams@tani
  \fi
 \fi\fi
 %
 % adjust arrow placement for source and target style
 \ifH@\else\ifV@\else
  \ifnum\lams@target=\thr@@
   \ifN@\advance\lams@lasty-.3\lams@ht
   \else\advance\lams@lasty.3\lams@ht\fi
  \fi
  \ifnum\lams@source=\tw@
   \ifE@\advance\lams@firstx.3\lams@ht
   \else\advance\lams@firstx-.3\lams@ht\fi
  \fi
  \ifnum\lams@target=12
   \ifN@\advance\lams@lasty-\lams@ht
   \else\advance\lams@lasty\lams@ht\fi
  \fi
 \fi\fi
 %
 % draw arrow, special-casing horizontal and vertical ones
 \ifH@  \lams@harrow
 \else\ifV@ \lams@varrow
 \else \lams@darrow
 \fi\fi
}


%%%%%%%%%%%%%%%%%%%% \lams@darrow
%
% Does actual drawing of diagonal arrows,
% with the help of \lams@cos.
%
% EXTERNAL VARS USED
%
% \lams@shaft \lams@source \lams@target
%
% \ifNESW@ \ifN@ \ifE@ (computed by \lams@arrow)
% \lams@center \lams@firstx \lams@firsty \lams@lasty (ibid)
% \lams@wd \lams@ht (computed by \lams@arrow)
%
% \lams@ang \lams@tani \lams@tanii (computed by \lams@slope)
%
% \lamsfont@i \lamsfont@ii \lamsfont@iii \lamsfont@iv \lamsfont@v
%
% INTERNAL VARS USED
%
% \lams@sl (from \lams@ang, used by \lams@cos)
% \lams@S \lams@T (from \lams@ang, \lams@source, \lams@target)
% \lams@shift (+/- \lams@firsty) \lams@adj
% \lams@goal (+/-(\lams@lasty-\lams@firsty))
% \dimen@ \dimen@ii \count@ (computed by \lams@cos)
% \arrowfont@ \lams@shaftbox \lams@ZERO

\newdimen\lams@goal
\newdimen\lams@shift
\newdimen\lams@adj
\newcount\lams@T
\newcount\lams@S
\newbox\lams@shaftbox
\newcount\lams@sl
\newbox\lams@ZERO

\def\lams@next{\ifN@\let\next@\raise\else\let\next@\lower\fi}

\def\lams@cos#1{%
 \ifnum\lams@tani<\lams@tanii
  \dimen@#1%
  \ifnum\lams@sl<8 \count@9
  \else \ifnum\lams@sl<12 \count@8
  \else \count@7 \fi\fi
  \multiply\dimen@\count@\divide\dimen@\ten@
  \dimen@ii\dimen@\multiply\dimen@ii\lams@tani
  \divide\dimen@ii\lams@tanii
 \else
  \dimen@ii#1%
  \count@-\lams@sl\advance\count@24
  \ifnum\count@<8 \count@9 \else \ifnum\count@<12 \count@8
   \else\count@7 \fi\fi
  \multiply\dimen@ii\count@\divide\dimen@ii\ten@
  \dimen@\dimen@ii\multiply\dimen@\lams@tanii
  \divide\dimen@\lams@tani
 \fi
}

\def\lams@darrow{\lams@sl\lams@ang
 \ifNESW@
  \ifnum\lams@ang<\ten@
   \let\arrowfont@\lamsfont@i\global\advance\lams@ang\m@ne
   \global\multiply\lams@ang13
  \else
   \ifnum\lams@ang<19
    \let\arrowfont@\lamsfont@ii\global\advance\lams@ang-\ten@
    \global\multiply\lams@ang13
   \else
    \let\arrowfont@\lamsfont@iii\global\advance\lams@ang-19
    \global\multiply\lams@ang13
  \fi\fi
  \lams@T\lams@ang
 \else
  \ifnum\lams@ang<5
   \let\arrowfont@\lamsfont@iii\global\advance\lams@ang\m@ne
   \global\multiply\lams@ang13 \global\advance\lams@ang65
  \else
   \ifnum\lams@ang<14
    \let\arrowfont@\lamsfont@iv\global\advance\lams@ang-5
    \global\multiply\lams@ang13
   \else
    \ifnum\lams@ang<23
     \let\arrowfont@\lamsfont@v\global\advance\lams@ang-14
     \global\multiply\lams@ang13
    \else
     \let\arrowfont@\lamsfont@i\global\lams@ang117
  \fi\fi\fi
  \ifnum\lams@ang=117 \lams@T115 \else\lams@T\lams@ang\fi
 \fi
 \lams@S\lams@T
 \ifE@
  \ifnum\lams@target=\z@\advance\lams@T\tw@
  \else\ifnum\lams@target=13 \advance\lams@T\tw@
  \else\advance\lams@T\lams@target\fi\fi
  \ifnum\lams@source=\z@
  \else\ifnum\lams@source=13 \advance\lams@S\thr@@
  \else\advance\lams@S\lams@source\fi\fi
 \else
  \ifcase\lams@target\advance\lams@T\thr@@\or
   \or\advance\lams@T\thr@@\or
   \advance\lams@T\tw@\or\advance\lams@T6 \or\advance\lams@T7
   \or\or\or\or\or\advance\lams@T8 \or\advance\lams@T9 \or
   \advance\lams@T12 \or\advance\lams@T\thr@@\fi
  \ifcase\lams@source\or\or\advance\lams@S\thr@@
   \or\advance\lams@S\tw@\or\or\or\advance\lams@S4 
   \or\advance\lams@S5 \or\advance\lams@S\ten@
   \or\advance\lams@S11 \or\or\or\advance\lams@S12
   \or\advance\lams@S\tw@\fi
 \fi
 \ifcase\lams@shaft\or\or\global\advance\lams@ang\@ne\else\fi
 \ifN@\lams@shift\lams@firsty\else\lams@shift-\lams@firsty\fi
 \ifE@\else\advance\lams@shift\lams@ht\fi
 \lams@goal\lams@lasty\advance\lams@goal-\lams@firsty
 \ifN@\else\multiply\lams@goal\m@ne\fi
 \setbox\lams@shaftbox\hbox{\arrowfont@\char\lams@ang}%
 \ifnum\lams@shaft=\thr@@
  \lams@cos{1.5\p@}%
  \setbox\lams@shaftbox\hbox to\wd\lams@shaftbox{\arrowfont@
   \rlap{\hskip\dimen@ii
    \smash{\ifNESW@\let\next@\lower\else\let\next@\raise\fi
     \next@\dimen@\hbox{\arrowfont@\char\lams@ang}}}%
   \rlap{\hskip-\dimen@ii
    \smash{\ifNESW@\let\next@\raise\else\let\next@\lower\fi
      \next@\dimen@\hbox{\arrowfont@\char\lams@ang}}}\hfil}%
 \fi
 \rlap{\smash{\hskip\lams@center\hskip\lams@firstx
  \ifnum\lams@shaft=\m@ne
  \else
   \ifnum\lams@shaft=\thr@@
   \else
    \ifnum\lams@source=\m@ne
    \else
     \ifnum\lams@source=\z@
     \else
      \setbox\lams@ZERO\hbox{%
       \ifnum\lams@ang=117 \lamsfont@v\else\arrowfont@\fi
       \char\lams@S}%
      \ifNESW@
       \ifnum\lams@source=\tw@
        \dimen@\lams@shift\advance\dimen@-\lams@ht
        \ifN@\hskip-\wd\lams@ZERO\fi
        \lams@next
        \next@\dimen@\copy\lams@ZERO
        \ifN@\else\hskip-\wd\lams@ZERO\fi
       \else
        \lams@next
        \ifN@\else\hskip-\wd\lams@ZERO\fi
        \next@\lams@shift\copy\lams@ZERO
        \ifN@\hskip-\wd\lams@ZERO\fi
       \fi
       \ifnum\lams@source=12
        \advance\lams@shift\lams@ht\advance\lams@goal-\lams@ht
        \ifN@\hskip\wd\lams@ZERO\else\hskip-\wd\lams@ZERO\fi
       \fi
       \ifnum\lams@source=13
        \lams@cos{\thr@@\p@}%
        \ifN@\hskip\dimen@\else\hskip-\wd\lams@ZERO\hskip-\dimen@\fi
        \lams@adj\lams@shift\advance\lams@adj\dimen@ii
        \lams@next
        \next@\lams@adj\copy\lams@ZERO
        \ifN@\hskip-\dimen@\hskip-\wd\lams@ZERO\else\hskip\dimen@\fi
       \fi
      \else
       \ifN@\hskip-\wd\lams@ZERO\fi
       \ifnum\lams@source=\tw@
        \ifN@\hskip\wd\lams@ZERO\else\hskip-\wd\lams@ZERO\fi
        \dimen@\lams@shift\advance\dimen@-\lams@ht
        \lams@next
        \next@\dimen@\copy\lams@ZERO
        \ifN@\hskip-\wd\lams@ZERO\fi
       \else
        \lams@next
        \next@\lams@shift\copy\lams@ZERO
        \ifN@\else\hskip-\wd\lams@ZERO\fi
       \fi
       \ifnum\lams@source=12
        \advance\lams@shift\lams@ht\advance\lams@goal-\lams@ht
        \ifN@\hskip-\wd\lams@ZERO\else\hskip\wd\lams@ZERO\fi
       \fi
       \ifnum\lams@source=13
        \lams@cos{\thr@@\p@}%
        \ifN@\hskip-\wd\lams@ZERO\hskip-\dimen@\else\hskip\dimen@\fi
        \lams@adj\lams@shift\advance\lams@adj\dimen@ii
        \lams@next
        \next@\lams@adj\copy\lams@ZERO
        \ifN@\hskip\dimen@\else\hskip-\dimen@\hskip-\wd\lams@ZERO\fi
       \fi
      \fi
  \fi\fi\fi\fi
  \ifnum\lams@shaft=\m@ne
  \else
   \loop
    \ifdim\lams@goal>\lams@ht
    \ifE@\else\hskip-\lams@wd\fi
    \lams@next
    \next@\lams@shift\copy\lams@shaftbox
    \ifE@\else\hskip-\lams@wd\fi
    \advance\lams@shift\lams@ht\advance\lams@goal-\lams@ht
    \repeat
   \ifdim\lams@goal>\z@
    \dimen@\lams@ht\advance\dimen@-\lams@goal
    \divide\dimen@\lams@tani\multiply\dimen@\lams@tanii
    \ifE@\hskip-\dimen@\else\hskip-\lams@wd\hskip\dimen@\fi
    \lams@adj\lams@shift\advance\lams@adj-\lams@ht
    \advance\lams@adj\lams@goal
    \lams@next
    \next@\lams@adj\copy\lams@shaftbox
    \ifE@\else\hskip-\lams@wd\fi
   \else
    \lams@adj\lams@shift\advance\lams@adj-\lams@ht
   \fi
  \fi
  \ifnum\lams@shaft=\m@ne
  \else
   \ifnum\lams@shaft=\thr@@
   \else
    \ifnum\lams@target=\m@ne
    \else
     \setbox\lams@ZERO
      \hbox{\ifnum\lams@ang=117 
       \lamsfont@v\else\arrowfont@\fi\char\lams@T}%
     \ifnum\lams@target=\thr@@
      \advance\lams@adj\lams@ht
      \ifE@\else\ifN@\hskip-\lams@wd\else\hskip-\wd\lams@ZERO\fi\fi
     \else
      \ifnum\lams@target=12
       \advance\lams@adj\lams@ht
       \ifE@\else\ifN@\hskip-\lams@wd\else\hskip-\wd\lams@ZERO\fi\fi
      \else
       \ifE@\hskip-\wd\lams@ZERO\fi
     \fi\fi
     \lams@next
     \next@\lams@adj\copy\lams@ZERO
     \ifnum\lams@target=13
      \hskip-\wd\lams@ZERO
      \lams@cos{\thr@@\p@}%
      \ifE@\hskip-\dimen@\else\hskip\dimen@\fi
      \advance\lams@adj-\dimen@ii
      \lams@next
      \next@\lams@adj\box\lams@ZERO
     \fi
  \fi\fi\fi}}%
}


%%%%%%%%%%%%%%%%%%%% \lams@harrow
%
% Performs actual drawing of horizontal arrows.
%
% EXTERNAL VARS USED
%
% \lams@shaft \lams@source \lams@target
%
% \ifE@ (computed by \lams@arrow)
% \lams@center \lams@firstx \lams@lastx (ibid)
% \lamsfont@i \lamsfont@ii (lams fonts)
%
% \lams@axis (to correct centering of head/tail symbol chars)
%
% INTERNAL VARS USED
%
% \dimen@ \dimen@ii
% \leads@ \lams@ZERO

\newdimen\lams@axis \lams@axis90\p@\divide\lams@axis36

\def\lams@harrow{\dimen@\lams@lastx\advance\dimen@-\lams@firstx
 \ifE@\let\next@\rlap\else\multiply\dimen@\m@ne\let\next@\llap\fi
 \next@{\ifE@\hskip\lams@center\hskip\lams@firstx\fi
  \smash{\raise-\lams@axis\hbox to\dimen@
   {\lamsfont@ii
    \ifnum\lams@shaft=\m@ne\else\ifnum\lams@shaft=\thr@@\else
     \ifE@
      \ifnum\lams@source=\m@ne
      \else
       \ifcase\lams@source\or\or\char118 \or\char117 \or
       \or\or\char119 \or\char120 \or\char121 \or\char122 \or
       \or\or\lamsfont@i\char125 \or
       \char117 \hskip\thr@@\p@\char117 \hskip-\thr@@\p@\fi
      \fi
     \else
      \ifnum\lams@target=\m@ne
      \else
       \ifcase\lams@target\char117 \or\or\char117 \or\char118 \or
       \char119 \or\char120 \or\or\or\or\or\char121 \or
       \char122 \or\lamsfont@i\char125
       \or\char117 \hskip\thr@@\p@\char117 \hskip-\thr@@\p@\fi
      \fi
     \fi
    \fi\fi
    \dimen@\lams@axis\advance\dimen@.2\p@
    \dimen@ii\lams@axis\advance\dimen@ii-.2\p@
    \ifnum\lams@shaft=\m@ne
     \let\leads@\null
    \else
     \ifcase\lams@shaft
      \def\leads@{\hrule\@height\dimen@\@depth-\dimen@ii}\or
      \def\leads@{\hrule\@height\dimen@\@depth-\dimen@ii}\or
      \def\leads@{\hbox to\ten@\p@{%
       \leaders\hrule\@height\dimen@\@depth-\dimen@ii\hfil
       \hfil
      \leaders\hrule\@height\dimen@\@depth-\dimen@ii
       \hskip\z@ plus2fil\relax
       \hfil
       \leaders\hrule\@height\dimen@\@depth-\dimen@ii\hfil}}\or
     \def\leads@{\hbox{\hbox to\ten@\p@{%
       \dimen@\lams@axis\advance\dimen@1.2\p@
       \dimen@ii\dimen@\advance\dimen@ii-.4\p@
       \leaders\hrule\@height\dimen@\@depth-\dimen@ii\hfil}%
       \kern-\ten@\p@
       \hbox to\ten@\p@{\dimen@\lams@axis\advance\dimen@-1.2\p@
       \dimen@ii\dimen@\advance\dimen@ii-.4\p@
       \leaders\hrule\@height\dimen@\@depth-\dimen@ii\hfil}}}\fi
    \fi
    \cleaders\leads@\hfil
    \ifnum\lams@shaft=\m@ne\else\ifnum\lams@shaft=\thr@@\else
     \lamsfont@i
     \ifE@
      \ifnum\lams@target=\m@ne
      \else
       \ifcase\lams@target\char119 \or\or\char119 \or\char120 \or
       \char121 \or\char122 \or \or\or\or\or\char123 \or
       \char124 \or\char125 \or
       \char119 \hskip-\thr@@\p@\char119 \hskip\thr@@\p@\fi
      \fi
     \else
      \ifcase\lams@source\or\or\char120 \or\char119 \or
       \or\or\char121 \or\char122 \or\char123 \or
       \char124 \or\or\or\char125 \or
       \char119 \hskip-\thr@@\p@\char119 \hskip\thr@@\p@\fi
     \fi
    \fi\fi}}%
  \ifE@\else\hskip-\lams@firstx\hskip-\lams@center\fi}%
}
  

%%%%%%%%%%%%%%%%%%%% \lams@varrow
%
% Performs actual drawing of vertical arrows.
%
% EXTERNAL VARS USED
%
% \lams@shaft \lams@source \lams@target
%
% \ifN@ (computed by \lams@arrow)
% \lams@center \lams@firsty \lams@lasty (ibid)
%
% \lamsfont@iii \lamsfont@iv (lams fonts)
%
% INTERNAL VARS USED
%
% \dimen@ \dimen@ii
% \leads@ \lams@ZERO

\def\lams@varrow{\dimen@\lams@lasty\advance\dimen@-\lams@firsty
 \ifN@\else\multiply\dimen@\m@ne\fi
 \setbox\lams@ZERO\vbox to\dimen@
  {\ifnum\lams@shaft=\m@ne\else\ifnum\lams@shaft=\thr@@\else
    \hbox{\lamsfont@iii
     \ifN@
      \ifnum\lams@target=\m@ne
      \else
       \ifcase\lams@target\char117 \or\or\char117 \or
       \char118 \or\char119 \or\char120 \or\or\or\or
       \or\char121 \or\char122 \or\char123 \or
       \vbox{\hbox{\char117}\nointerlineskip\vskip\thr@@\p@
       \hbox{\char117}\vskip-\thr@@\p@}\fi
      \fi
     \else
      \ifcase\lams@source\or\or\char118 \or\char117 \or\or
      \or\char119 \or\char120 \or\char121 \or\char122 \or
      \or\or\char123 \or
      \vbox{\hbox{\char117}\nointerlineskip\vskip\thr@@\p@
      \hbox{\char117}\vskip-\thr@@\p@}\fi
     \fi}%
    \nointerlineskip
   \fi\fi
   \ifnum\lams@shaft=\m@ne
    \let\leads@\null
   \else
    \ifcase\lams@shaft\let\leads@\vrule\or\let\leads@\vrule\or
    \def\leads@{\vbox to\ten@\p@{%
     \hrule\@height1.67\p@\@depth\z@\@width.4\p@
     \vfil
     \hrule\@height3.33\p@\@depth\z@\@width.4\p@
     \vfil
     \hrule\@height1.67\p@\@depth\z@\@width.4\p@}}\or
    \def\leads@{\hbox{\vrule\@height\p@\hskip\tw@\p@\vrule}}\fi
   \fi
  \cleaders\leads@\vfill\nointerlineskip
   \ifnum\lams@shaft=\m@ne\else\ifnum\lams@shaft=\thr@@\else
    \hbox{\lamsfont@iv
     \ifN@
      \ifcase\lams@source\or\or\char118 \or\char117 \or
      \or\or\char119 \or\char120 \or\char121 \or\char122 \or
      \or\or\lamsfont@iii\char123 \or
      \vbox{\hbox{\char117}\nointerlineskip\vskip-\thr@@\p@
      \hbox{\char117}\vskip\thr@@\p@}\fi
     \else
      \ifnum\lams@target=\m@ne
      \else
       \ifcase\lams@target\char117 \or\or\char117 \or\char118 \or
       \char119 \or\char120 \or\or\or\or\or\char121 \or
       \char122 \or\lamsfont@iii\char123 \or
       \vbox{\hbox{\char117}\nointerlineskip\vskip-\thr@@\p@
       \hbox{\char117}\vskip\thr@@\p@}\fi
      \fi
     \fi}%
   \fi\fi}%
 \ifN@
  \dimen@ii\lams@firsty
 \else
  \dimen@ii-\lams@firsty\advance\dimen@ii\ht\lams@ZERO
  \multiply\dimen@ii\m@ne
 \fi
 \rlap{\smash{\hskip\lams@center\raise\dimen@ii\box\lams@ZERO}}%
}