% \iffalse meta-comment
%
% Copyright (C) 1993-2026
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
% This file is part of the LaTeX base system.
% -------------------------------------------
%
% It may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
%    https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
% The list of all files belonging to the LaTeX base distribution is
% given in the file `manifest.txt'. See also `legal.txt' for additional
% information.
%
% The list of derived (unpacked) files belonging to the distribution
% and covered by LPPL is defined by the unpacking scripts (with
% extension .ins) which are part of the distribution.
%
% \fi
%
% \iffalse
%%% From File: ltpictur.dtx
%<*driver>
% \fi
      \ProvidesFile{ltpictur.dtx}
                      [2026-06-01 v1.2c LaTeX Kernel (Picture Mode)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltpictur.dtx}
\title{\filename}
\date{\filedate}
\author{%
  Johannes Braams\and
  David Carlisle\and
  Alan Jeffrey\and
  Leslie Lamport\and
  Frank Mittelbach\and
  Chris Rowley\and
  Rainer Sch\"opf}
\begin{document}
 \MaintainedByLaTeXTeam{latex}
 \maketitle
 \DocInput{\filename}
\end{document}
%</driver>
% \fi
%
%
% \changes{v1.0g}{1995/05/07}{Use \cs{hb@xt@}}
% \changes{v1.1a}{1995/05/19}{Support autoloading feature}
% \changes{v1.1b}{1995/06/13}{Use \cs{ProvidesFile} in autoload}
% \changes{v1.1d}{1995/07/12}{allow 2e commands in 209 mode. latex/1737}
% \changes{v1.1e}{1995/10/03}{New autoload code}
% \changes{v1.1h}{1999/04/15}{Replaced octal numbers, CAR}
% \changes{v1.1k}{2015/02/21}{Removed autoload code}
%
% \section{Picture Mode}
% Picture mode commands. In addition to the commands available in
% \LaTeX2.09,  This section adds the new |\qbezier| command for
% drawing curves.
%
% \DescribeMacro{\qbezier}
%  |\qbezier|\oarg{N}\parg{AX,AY}\parg{BX,BY}\parg{CX,CY}
%  plots a quadratic Bezier curve from \parg{AX,AY} to \parg{CX,CY},
%  with \parg{BX,BY}  as the third Bezier point, using $N+1$ points
%  equally spaced parametrically.
%  If $N = 0$ (the default value), then a sufficient number of points
%  are used to draw a connected curve--except that at most
%  $|\qbeziermax| + 1$ points are drawn.  A ``point'' is a square of
%  side |\@wholewidth|.
%
% \DescribeMacro{\bezier}
% In addition, to be compatible with the old |bezier| package, a
% variant of this command, |\bezier|, is defined, in which the first
% argument is not optional.
%
% \MaybeStop{}
%
%
% \changes{v0.1a}{1994/03/07}{Initial version, split from latex.dtx}
% \changes{v0.1a}{1994/03/07}{Long lines wrapped to 72 columns}
% \changes{v0.1b}{1994/04/24}
%     {Removed surplus spaces after \cs{hbox to } in several cases}
% \changes{v0.1d}{1994/05/13}
%     {Removed surplus braces from \cs{@if..} constructions}
% \changes{v0.1e}{1994/05/22}{Use new warning cmds}
% \changes{v1.0f}{1994/11/17}
%         {\cs{@tempa} to \cs{reserved@a}}
% \changes{v1.1m}{2019/08/27}{Remove several unnecessary \cs{gdef} definitions}
% \changes{v1.1m}{2019/08/27}{Make various commands robust}
%
% \begin{oldcomments}
%
%  \unitlength     = value of dimension argument
%  \@wholewidth    = current line width
%  \@halfwidth     = half of current line width
%  \@linefnt       = font for drawing lines
%  \@circlefnt     = font for drawing circles
%
% \linethickness{DIM} : Sets the width of horizontal and vertical lines
%     in a picture to DIM.  Does not change width of slanted lines
%     or circles.   Width of all lines reset by \thinlines and
%     \thicklines
%
% \picture(XSIZE,YSIZE)(XORG,YORG)
%   BEGIN
%     \@picht :=L YSIZE * \unitlength
%     box \@picbox :=
%          \hb@xt@ XSIZE * \unitlength
%            {\hskip -XORG * \unitlength
%             \lower YORG * \unitlength
%             \hbox{
%             \ignorespaces    %% added 13 June 89
%   END
%
% \endpicture ==
%   BEGIN
%                   } \hss }
%                   height of \@picbox := \@picht
%                   depth  of \@picbox := 0
%                   \mbox{\box\@picbox}   %% change 26 Aug 91
%   END
%
% \put(X, Y){OBJ} ==
%   BEGIN
%     \@killglue
%     \raise Y * \unitlength  \hb@xt@ 0pt { \hskip X * \unitlength
%                                              OBJ \hss             }
%     \ignorespaces
%   END
%
% \multiput(X,Y)(DELX,DELY){N}{OBJ} ==
%   BEGIN
%    \@killglue
%    \@multicnt := N
%    \@xdim  := X * \unitlength
%    \@ydim  := Y * \unitlength
%    while \@multicnt > 0
%      do \raise \@ydim \hb@xt@ 0pt { \hskip \@xdim
%                                             OBJ \hss   }
%         \@multicnt := \@multicnt - 1
%         \@xdim     := \@xdim + DELX * \unitlength
%         \@ydim     := \@ydim + DELY * \unitlength
%      od
%    \ignorespaces
%   END
%
%  \shortstack[POS]{TEXT} : Makes a \vbox containing TEXT stacked as
%      a one-column array, positioned l, r or c as indicated by POS.
%
% \end{oldcomments}
%
% The `2ekernel' code ensures that a |\usepackage{autopict}| is
% essentially ignored if a `full' format is being used that has
% picture mode already in the format.
%    \begin{macrocode}
%<2ekernel>\expandafter\let\csname ver@autopict.sty\endcsname\fmtversion
%    \end{macrocode}
%
% \begin{macro}{\@wholewidth}
% \begin{macro}{\@halfwidth}
%    \begin{macrocode}
%<*2ekernel>
\newdimen\@wholewidth
\newdimen\@halfwidth
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\unitlength}
%    \begin{macrocode}
\newdimen\unitlength \unitlength =1pt
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@picbox}
% \begin{macro}{\@picht}
%    \begin{macrocode}
\newbox\@picbox
\newdimen\@picht
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@defaultunitsset}
% \changes{v1.2a}{2020/08/15}{Macro added}
% Set a length register, |#1|,
% accepting number or an etex length expression, |#2|,
% with default unit, |#3|.
%
% The register name in |#1| can be prefixed by |\advance| so that
% the register is incremented by the supplied value.
%
% |\@defaultunitsset{\advance\@vxx}{\textwidth-15pt}\unitlength|
%
% |#3| can be a literal unit such as |cm| or a length register such
% as |\unitlength|.
%
% This is used in all |picture| commands that take picture coordinates.
% So |\put(2,2)| as previously but now |\put(\textwidth-5cm,0.4\texteight)|
% Note that you can only use expressions with lengths, |\put(1+2,0)| is not
% supported.
% 
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\@defaultunitsset}{default units}%
\def\@defaultunitsset#1#2#3{%
  \@defaultunits#1\dimexpr#2#3\relax\relax\@nnil}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\@defaultunitsset}{default units}%
%<latexrelease>\let\@defaultunitsset\@undefined
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{environment}{picture}
% \begin{macro}{\picture}
% \changes{v0.1c}{1994/04/28}{(DPC) Ignore spaces before (}
%  |#1| should be white space.
% \begin{macro}{\pictur@}
% \changes{v1.0h}{1995/05/12}{Macro added for latex/1355}
%  |#1| should be a |(| (eating any white space before the bracket),
% \changes{v1.2c}{2026/01/20}{adding no-op optional argument for gh/1172} 
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2026/06/01}%
%<latexrelease>                 {\pictur@}{optional arg}
\newcommand\picture[2][]{\pictur@#2}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\pictur@}{optional arg}%
%<latexrelease>\long\def\picture#1{\pictur@#1}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>  
\def\pictur@(#1){%
  \@ifnextchar({\@picture(#1)}{\@picture(#1)(0,0)}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@picture}
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\@picture}{default units}%
\def\@picture(#1,#2)(#3,#4){%
  \@defaultunitsset\@picht{#2}\unitlength
  \@defaultunitsset\@tempdimc{#1}\unitlength
  \setbox\@picbox\hb@xt@\@tempdimc\bgroup
    \@defaultunitsset\@tempdimc{#3}\unitlength
    \hskip -\@tempdimc
    \@defaultunitsset\@tempdimc{#4}\unitlength
    \lower\@tempdimc\hbox\bgroup
      \ignorespaces}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\@picture}{default units}%
%<latexrelease>\def\@picture(#1,#2)(#3,#4){%
%<latexrelease>  \@picht#2\unitlength
%<latexrelease>  \setbox\@picbox\hb@xt@#1\unitlength\bgroup
%<latexrelease>    \hskip -#3\unitlength
%<latexrelease>    \lower #4\unitlength\hbox\bgroup
%<latexrelease>      \ignorespaces}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\endpicture}
% \changes{LaTeX2.09}{1991/08/26}
%     {(RmS \& FMi) extra boxing level around \cs{@picbox}
%     to guard against unboxing in math mode
%     (proposed by John Hobby)}
%
%    \begin{macrocode}
\def\endpicture{%
  \egroup\hss\egroup
    \ht\@picbox\@picht\dp\@picbox\z@
    \mbox{\box\@picbox}}
%    \end{macrocode}
% \end{macro}
% \end{environment}
%
% In the definitions of |\put| and |\multiput|, |\hskip| was replaced by
% |\kern| just in case arg |#3| = ``plus''.  (Bug detected by Don Knuth.
% changed 20 Jul 87).
%
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\put}{default units}%
%<latexrelease>\expandafter\let\csname put \endcsname\@undefind
\long\def\put(#1,#2)#3{%
  \@killglue
  \@defaultunitsset\@tempdimc{#2}\unitlength
  \raise\@tempdimc
  \hb@xt@\z@{%
    \@defaultunitsset\@tempdimc{#1}\unitlength
    \kern\@tempdimc
    #3\hss}%
  \ignorespaces}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\put}{default units}%
%<latexrelease>\expandafter\let\csname put \endcsname\@undefind
%<latexrelease>\long\def\put(#1,#2)#3{%
%<latexrelease>  \@killglue\raise#2\unitlength
%<latexrelease>  \hb@xt@\z@{\kern#1\unitlength #3\hss}%
%<latexrelease>  \ignorespaces}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
%
%
% \begin{macro}{\multiput}
% \changes{v0.1c}{1994/04/28}{(DPC) Ignore spaces between )(}
% |#3| had better be a |(|.
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\multiput}{default units}%
%<latexrelease>\expandafter\let\csname multiput \endcsname\@undefind
\def\multiput(#1,#2)#3{%
  \@defaultunitsset\@xdim{#1}\unitlength
  \@defaultunitsset\@ydim{#2}\unitlength
   \@multiput(}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\multiput}{default units}%
%<latexrelease>\expandafter\let\csname multiput \endcsname\@undefind
%<latexrelease>\def\multiput(#1,#2)#3{%
%<latexrelease>  \@xdim #1\unitlength
%<latexrelease>  \@ydim #2\unitlength
%<latexrelease>   \@multiput(}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@multiput}
% \changes{v0.1c}{1994/04/28}{(DPC) Macro added}
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\@multiput}{default units}%
\long\def\@multiput(#1,#2)#3#4{%
  \@killglue\@multicnt #3\relax
  \@whilenum \@multicnt >\z@\do
    {\raise\@ydim\hb@xt@\z@{\kern\@xdim #4\hss}%
     \advance\@multicnt\m@ne
     \@defaultunitsset{\advance\@xdim}{#1}\unitlength
     \@defaultunitsset{\advance\@ydim}{#2}\unitlength}%
  \ignorespaces}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\@multiput}{default units}%
%<latexrelease>\long\def\@multiput(#1,#2)#3#4{%
%<latexrelease>  \@killglue\@multicnt #3\relax
%<latexrelease>  \@whilenum \@multicnt >\z@\do
%<latexrelease>    {\raise\@ydim\hb@xt@\z@{\kern\@xdim #4\hss}%
%<latexrelease>     \advance\@multicnt\m@ne
%<latexrelease>     \advance\@xdim#1\unitlength\advance\@ydim#2\unitlength}%
%<latexrelease>  \ignorespaces}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@killglue}
%    \begin{macrocode}
\def\@killglue{\unskip\@whiledim \lastskip >\z@\do{\unskip}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thinlines}
% \begin{macro}{\thicklines}
%    \begin{macrocode}
\DeclareRobustCommand\thinlines{\let\@linefnt\tenln
  \let\@circlefnt\tencirc
  \@wholewidth\fontdimen8\tenln \@halfwidth .5\@wholewidth}
\DeclareRobustCommand\thicklines{\let\@linefnt\tenlnw
  \let\@circlefnt\tencircw
  \@wholewidth\fontdimen8\tenlnw \@halfwidth .5\@wholewidth}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\linethickness}
% \changes{v1.1n}{2020/02/14}{Suppress spaces following the declaration (gh/274)}
% \changes{v1.1p}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
%    \begin{macrocode}
\DeclareRobustCommand*\linethickness[1]
   {\@wholewidth #1\relax \@halfwidth .5\@wholewidth \ignorespaces}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ishortstack}
%    \begin{macrocode}
\def\shortstack{\@ifnextchar[\@shortstack{\@shortstack[c]}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@ishortstack}
%    \begin{macrocode}
\def\@shortstack[#1]{%
  \leavevmode
  \vbox\bgroup
    \baselineskip-\p@\lineskip 3\p@
    \let\mb@l\hss\let\mb@r\hss
    \expandafter\let\csname mb@#1\endcsname\relax
    \let\\\@stackcr
    \@ishortstack}
%    \end{macrocode}
% \end{macro}
%
%
% \changes{LaTeX2.09}{1991/08/14}
%         {(RmS) inserted extra braces around entry for NFSS}
% \changes{LaTeX2.09}{1993/11/03}
%         {(RmS) changed \cs{halign} to \cs{ialign} to initialize
%              \cs{tabskip} and \cs{everycr}}
%
% \begin{macro}{\@ishortstack}
%    \begin{macrocode}
\def\@ishortstack#1{\ialign{\mb@l {##}\unskip\mb@r\cr #1\crcr}\egroup}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@stackcr}
% \changes{v1.2b}{2021/04/20}{Use \cs{protected} for \cs{\bslash} variant (gh/548)}
% \begin{macro}{\@ixstackcr}
%    \begin{macrocode}
\protected\def\@stackcr{\@ifstar\@ixstackcr\@ixstackcr}
\def\@ixstackcr{\@ifnextchar[\@istackcr{\cr\ignorespaces}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@istackcr}
% \changes{v1.1o}{2020/04/21}{Support calc syntax (gh/152)}
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\@istackcr}{\shortstack calc support}%
\def\@istackcr[#1]{\cr\noalign{\@vspace@calcify{#1}}\ignorespaces}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\@istackcr}{\shortstack calc support}%
%<latexrelease>
%<latexrelease>\def\@istackcr[#1]{\cr\noalign{\vskip #1}\ignorespaces}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{oldcomments}
% \line(X,Y){LEN} ==
% BEGIN
%  \@xarg    := X
%  \@yarg    := Y
%  \@linelen := LEN * \unitlength
%  if \@xarg = 0
%     then \@vline
%     else if \@yarg = 0
%            then \@hline
%            else \@sline
%          if
%  if
% END
%
% \@sline ==
%  BEGIN
%    if \@xarg < 0
%      then @negarg := T
%           \@xarg  := -\@xarg
%           \@yyarg := -\@yarg
%      else @negarg := F
%           \@yyarg := \@yarg
%    fi
%    \@tempcnta := |\@yyarg|
%    if \@tempcnta > 6
%      then error: 'LATEX ERROR: Illegal \line or \vector argument.'
%           \@tempcnta := 0
%    fi
%    \box\@linechar := \hbox{\@linefnt \@getlinechar(\@xarg,\@yyarg) }
%     if \@yarg > 0 then \@upordown = \raise
%                         \@clnht := 0
%                   else \@upordown = \lower
%                        \@clnht := height of \box\@linechar
%     fi
%     \@clnwd  := width of \box\@linechar
%     if @negarg
%       then \hskip - width of \box\@linechar
%            \reserved@a == \hskip - 2* width of box \@linechar
%       else \reserved@a == \relax
%     fi
%  %% Put out integral number of line segments
%     while \@clnwd <  \@linelen
%       do  \@upordown \@clnht \copy\@linechar
%           \reserved@a
%           \@clnht := \@clnht + ht of \box\@linechar
%           \@clnwd := \@clnwd + width of \box\@linechar
%       od
%
%  %% Put out last segment
%     \@clnht := \@clnht - height of \box\@linechar
%     \@clnwd := \@clnwd - width of \box\@linechar
%     \@tempdima   := \@linelen - \@clnwd
%     \@tempdimb   := \@tempdima - width of \box\@linechar
%     if @negarg  then \hskip -\@tempdimb
%                 else \hskip  \@tempdimb
%     fi
%     \@tempdima   := 1000 * \@tempdima
%     \@tempcnta   := \@tempdima / width of \box\@linechar
%     \@tempdima   := (\@tempcnta * ht of \box\@linechar)/1000
%     \@clnht := \@clnht + \@tempdima
%     if \@linelen < width of box\@linechar
%         then \hskip width of box\@linechar
%         else \hbox{\@upordown \@clnht \copy\@linechar}
%     fi
% END
%
% \@hline ==
%   BEGIN
%     if \@xarg < 0 then  \hskip -\@linelen \fi
%     \vrule height \@halfwidth depth \@halfwidth width \@linelen
%     if \@xarg < 0 then  \hskip -\@linelen \fi
%  END
%
% \@vline == if \@yarg < 0 \@downline else \@upline  fi
%
%
% \@getlinechar(X,Y) ==
%   BEGIN
%     \@tempcnta := 8*X - 9
%     if Y > 0
%       then \@tempcnta := \@tempcnta + Y
%       else \@tempcnta := \@tempcnta - Y + 64
%     fi
%     \char\@tempcnta
%   END
%
% \vector(X,Y){LEN} ==
% BEGIN
%  \@xarg    := X
%  \@yarg    := Y
%  \@linelen := LEN * \unitlength
%  if \@xarg = 0
%     then \@vvector
%     else if \@yarg = 0
%            then \@hvector
%            else \@svector
%          if
%  if
% END
%
% \@hvector ==
%   BEGIN
%     \@hline
%     {\@linefnt if \@xarg < 0 then  \@getlarrow(1,0)
%                              else  \@getrarrow(1,0)
%                 fi}
%   END
%
% \@vvector == if \@yarg < 0 \@downvector else \@upvector  fi
%
% \@svector ==
%  BEGIN
%   \@sline
%   \@tempcnta := |\@yarg|
%     if  \@tempcnta < 5
%        then  \hskip - width of \box\@linechar
%              \@upordown \@clnht \hbox
%                       {\@linefnt
%                        if @negarg then \@getlarrow(\@xarg,\@yyarg)
%                                   else \@getrarrow(\@xarg,\@yyarg)
%                        fi }
%        else  error: 'LATEX ERROR: Illegal \line or \vector argument.'
%     fi
%  END
%
% \@getlarrow(X,Y) ==
%  BEGIN
%   if Y = 0
%     then \@tempcnta := '33
%     else \@tempcnta := 16 * X  -  9
%          \@tempcntb := 2 * Y
%          if \@tempcntb > 0
%            then  \@tempcnta := \@tempcnta  +  \@tempcntb
%            else  \@tempcnta := \@tempcnta  -  \@tempcntb +  64
%          fi
%   fi
%   \char\@tempcnta
%  END
%
% \@getrarrow(X,Y) ==
%  BEGIN
%   \@tempcntb := |Y|
%   case of \@tempcntb
%     0 : \@tempcnta := '55
%     1 : if X < 3
%           then \@tempcnta :=  24*X - 6
%           else if X = 3
%                  then \@tempcnta := 49
%                  else \@tempcnta := 58  fi
%         fi
%     2 : if X < 3
%           then \@tempcnta :=  24*X - 3
%           else \@tempcnta := 51     % X must = 3
%         fi
%     3 : \@tempcnta := 16*X - 2
%     4 : \@tempcnta := 16*X + 7
%   endcase
%   if Y < 0
%     then \@tempcnta := \@tempcnta + 64
%   fi
%   \char\@tempcnta
%  END
% \end{oldcomments}
%
% \begin{macro}{\if@negarg}
%    \begin{macrocode}
\newif\if@negarg
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\line}
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\line}{default units}%
%<latexrelease>\expandafter\let\csname line \endcsname\@undefind
\def\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
  \@defaultunitsset\@linelen{#3}\unitlength
  \ifdim\@linelen<\z@\@badlinearg\else
    \ifnum\@xarg =\z@ \@vline
      \else \ifnum\@yarg =\z@ \@hline \else \@sline\fi
    \fi
  \fi}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\line}{default units}%
%<latexrelease>\expandafter\let\csname line \endcsname\@undefind
%<latexrelease>\def\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
%<latexrelease>  \@linelen #3\unitlength
%<latexrelease>  \ifdim\@linelen<\z@\@badlinearg\else
%<latexrelease>    \ifnum\@xarg =\z@ \@vline
%<latexrelease>      \else \ifnum\@yarg =\z@ \@hline \else \@sline\fi
%<latexrelease>    \fi
%<latexrelease>  \fi}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@sline}
%    \begin{macrocode}
\def\@sline{%
  \ifnum\@xarg<\z@ \@negargtrue \@xarg -\@xarg \@yyarg -\@yarg
  \else \@negargfalse \@yyarg \@yarg \fi
\ifnum \@yyarg >\z@ \@tempcnta\@yyarg \else \@tempcnta -\@yyarg \fi
\ifnum\@tempcnta>6 \@badlinearg\@tempcnta\z@ \fi
\ifnum\@xarg>6 \@badlinearg\@xarg \@ne \fi
\setbox\@linechar\hbox{\@linefnt\@getlinechar(\@xarg,\@yyarg)}%
%    \end{macrocode}
%    If we have something like |\line(5,5){30}| the |\@linechar| will
%    not contain a char and later on we will end in an infinite loop.
%    So we check the width of the box and put in something as an
%    emergency fix if necessary.
% \changes{v1.1k}{2003/08/27}{check for \cs{@linechar} being empty pr/3570}
%    \begin{macrocode}
\ifdim\wd\@linechar=\z@
   \setbox\@linechar\hbox{.}%
   \@badlinearg
\fi
\ifnum \@yarg >\z@ \let\@upordown\raise \@clnht\z@
   \else\let\@upordown\lower \@clnht \ht\@linechar\fi
\@clnwd \wd\@linechar
\if@negarg
  \hskip -\wd\@linechar \def\reserved@a{\hskip -2\wd\@linechar}%
\else
     \let\reserved@a\relax
\fi
\@whiledim \@clnwd <\@linelen \do
  {\@upordown\@clnht\copy\@linechar
   \reserved@a
   \advance\@clnht \ht\@linechar
   \advance\@clnwd \wd\@linechar}%
\advance\@clnht -\ht\@linechar
\advance\@clnwd -\wd\@linechar
\@tempdima\@linelen\advance\@tempdima -\@clnwd
\@tempdimb\@tempdima\advance\@tempdimb -\wd\@linechar
\if@negarg \hskip -\@tempdimb \else \hskip \@tempdimb \fi
\multiply\@tempdima \@m
\@tempcnta \@tempdima
\@tempdima \wd\@linechar \divide\@tempcnta \@tempdima
\@tempdima \ht\@linechar \multiply\@tempdima \@tempcnta
\divide\@tempdima \@m
\advance\@clnht \@tempdima
\ifdim \@linelen <\wd\@linechar
   \hskip \wd\@linechar
%    \end{macrocode}
%    Warn if line gets so short that it can't be printed.
% \changes{v1.1g}{1997/09/15}{Warn if lines become invisible pr/2524}
%    But don't warn if it is exactly zero since that was probably
%    deliberate (e.g., to get a vector head only).
% \changes{v1.1j}{2001/06/04}{Don't warn for exactly zero pr/3318}
%    \begin{macrocode}
   \ifdim \@linelen = \z@
   \else
     \@picture@warn
   \fi
   \else\@upordown\@clnht\copy\@linechar\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@hline}
%    \begin{macrocode}
\def\@hline{\ifnum \@xarg <\z@ \hskip -\@linelen \fi
\vrule \@height \@halfwidth \@depth \@halfwidth \@width \@linelen
\ifnum \@xarg <\z@ \hskip -\@linelen \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@getlinechar}
%    \begin{macrocode}
\def\@getlinechar(#1,#2){\@tempcnta#1\relax\multiply\@tempcnta 8%
  \advance\@tempcnta -9\ifnum #2>\z@ \advance\@tempcnta #2\relax\else
  \advance\@tempcnta -#2\relax\advance\@tempcnta 64 \fi
  \char\@tempcnta}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\vector}
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\vector}{default units}%
%<latexrelease>\expandafter\let\csname vector \endcsname\@undefind
\def\vector(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
  \@tempcnta \ifnum\@xarg<\z@ -\@xarg\else\@xarg\fi
  \ifnum\@tempcnta<5\relax
  \@defaultunitsset\@linelen{#3}\unitlength
  \ifdim\@linelen<\z@\@badlinearg\else
    \ifnum\@xarg =\z@ \@vvector
      \else \ifnum\@yarg =\z@ \@hvector \else \@svector\fi
    \fi
  \fi
  \else\@badlinearg\fi}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\vector}{default units}%
%<latexrelease>\expandafter\let\csname vector \endcsname\@undefind
%<latexrelease>\def\vector(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
%<latexrelease>  \@tempcnta \ifnum\@xarg<\z@ -\@xarg\else\@xarg\fi
%<latexrelease>  \ifnum\@tempcnta<5\relax
%<latexrelease>  \@linelen #3\unitlength
%<latexrelease>  \ifdim\@linelen<\z@\@badlinearg\else
%<latexrelease>    \ifnum\@xarg =\z@ \@vvector
%<latexrelease>      \else \ifnum\@yarg =\z@ \@hvector \else \@svector\fi
%<latexrelease>    \fi
%<latexrelease>  \fi
%<latexrelease>  \else\@badlinearg\fi}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@hvector}
%    \begin{macrocode}
\def\@hvector{\@hline\hb@xt@\z@{\@linefnt
 \ifnum \@xarg <\z@ \@getlarrow(1,0)\hss\else
    \hss\@getrarrow(1,0)\fi}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@vvector}
%    \begin{macrocode}
\def\@vvector{\ifnum \@yarg <\z@ \@downvector \else \@upvector \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@svector}
%    \begin{macrocode}
\def\@svector{\@sline
  \@tempcnta\@yarg \ifnum\@tempcnta <\z@ \@tempcnta -\@tempcnta\fi
  \ifnum\@tempcnta <5%
    \hskip -\wd\@linechar
    \@upordown\@clnht \hbox{\@linefnt  \if@negarg
    \@getlarrow(\@xarg,\@yyarg)\else \@getrarrow(\@xarg,\@yyarg)\fi}%
  \else\@badlinearg\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@getlarrow}
% \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR}
%    \begin{macrocode}
\def\@getlarrow(#1,#2){\ifnum #2=\z@ \@tempcnta 27 % '33
  \else
  \@tempcnta #1\relax\multiply\@tempcnta \sixt@@n
  \advance\@tempcnta -9 \@tempcntb #2\relax\multiply\@tempcntb \tw@
  \ifnum \@tempcntb >\z@ \advance\@tempcnta \@tempcntb
  \else\advance\@tempcnta -\@tempcntb\advance\@tempcnta 64
  \fi\fi\char\@tempcnta}
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR}
% \begin{macro}{\@getrarrow}
%    \begin{macrocode}
\def\@getrarrow(#1,#2){\@tempcntb #2\relax
\ifnum\@tempcntb <\z@ \@tempcntb -\@tempcntb\relax\fi
\ifcase \@tempcntb\relax \@tempcnta 45  % '55
\or
\ifnum #1<\thr@@ \@tempcnta #1\relax\multiply\@tempcnta
24\advance\@tempcnta -6 \else \ifnum #1=\thr@@ \@tempcnta 49
\else\@tempcnta 58 \fi\fi\or
\ifnum #1<\thr@@ \@tempcnta=#1\relax\multiply\@tempcnta
24\advance\@tempcnta -\thr@@ \else \@tempcnta 51 \fi\or
\@tempcnta #1\relax\multiply\@tempcnta
\sixt@@n \advance\@tempcnta -\tw@ \else
\@tempcnta #1\relax\multiply\@tempcnta
\sixt@@n \advance\@tempcnta 7 \fi\ifnum #2<\z@ \advance\@tempcnta 64 \fi
\char\@tempcnta}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@vline}
%    \begin{macrocode}
\def\@vline{\ifnum \@yarg <\z@ \@downline \else \@upline\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@upline}
%    \begin{macrocode}
\def\@upline{%
  \hb@xt@\z@{\hskip -\@halfwidth \vrule \@width \@wholewidth
   \@height \@linelen \@depth \z@\hss}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@downline}
%    \begin{macrocode}
\def\@downline{%
  \hb@xt@\z@{\hskip -\@halfwidth \vrule \@width \@wholewidth
   \@height \z@ \@depth \@linelen \hss}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@upvector}
% \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR}
% \changes{v1.1i}{2000/01/15}{Removed space at end-of-line, CAR}
%    \begin{macrocode}
\def\@upvector{\@upline\setbox\@tempboxa\hbox{\@linefnt\char 54}% '66
  \raise \@linelen \hb@xt@\z@{\lower \ht\@tempboxa\box\@tempboxa\hss}}
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR}
% \begin{macro}{\@downvector}
%    \begin{macrocode}
\def\@downvector{\@downline\lower \@linelen
      \hb@xt@\z@{\@linefnt\char 63  % '77
      \hss}}
%    \end{macrocode}
% \end{macro}
%
% \begin{oldcomments}
% \dashbox{D}(X,Y) ==
%  BEGIN
%  leave vertical mode
%  \hb@xt@ 0pt {
%       \baselineskip := 0pt
%       \lineskip     := 0pt
%  %% HORIZONTAL DASHES
%       \@dashdim := X * \unitlength
%       \@dashcnt := \@dashdim + 200 % to prevent roundoff error
%       \@dashdim := D * \unitlength
%       \@dashcnt := \@dashcnt / \@dashdim
%       if \@dashcnt is odd
%         then \@dashdim := 0pt
%              \@dashcnt := (\@dashcnt + 1) / 2
%         else \@dashdim := \@dashdim / 2
%              \@dashcnt := \@dashcnt / 2 - 1
%              \box\@dashbox   := \hbox{\vrule height \@halfwidth
%                             depth \@halfwidth width \@dashdim}
%              \put(0,0){\copy\@dashbox}
%              \put(0,Y){\copy\@dashbox}
%              \put(X,0){\hskip -\@dashdim\copy\@dashbox}
%              \put(X,Y){\hskip -\@dashdim\box\@dashbox}
%              \@dashdim := 3 * \@dashdim
%       fi
%       \box\@dashbox := \hbox{\vrule height \@halfwidth
%                         depth \@halfwidth width D * \unitlength
%                         \hskip D * \unitlength}
%       \@tempcnta := 0
%       \put(0,0){\hskip \@dashdim
%                while \@tempcnta < \@dascnt
%                  do \copy\@dashbox
%                     \@tempcnta := \@tempcnta + 1
%                  od
%               }
%       \@tempcnta := 0
%       put(0,Y){\hskip \@dashdim
%                while \@tempcnta < \@dascnt
%                  do \copy\@dashbox
%                     \@tempcnta := \@tempcnta + 1
%                  od
%               }
%
% %% vertical dashes
%       \@dashdim := Y * \unitlength
%       \@dashcnt := \@dashdim + 200 % to prevent roundoff error
%       \@dashdim := D * \unitlength
%       \@dashcnt := \@dashcnt / \@dashdim
%       if \@dashcnt is odd
%         then \@dashdim := 0pt
%              \@dashcnt := (\@dashcnt + 1) / 2
%         else \@dashdim := \@dashdim / 2
%              \@dashcnt := \@dashcnt / 2 - 1
%              \box\@dashbox   := \hbox{\hskip -\@halfwidth
%                                       \vrule width \@wholewidth
%                                                height \@dashdim  }
%              \put(0,0){\copy\@dashbox}
%              \put(X,0){\copy\@dashbox}
%              \put(0,Y){\lower\@dashdim\copy\@dashbox}
%              \put(X,Y){\lower\@dashdim\copy\@dashbox}
%              \@dashdim := 3 * \@dashdim
%       fi
%       \box\@dashbox := \hbox{\vrule width \@wholewidth
%                                 height D * \unitlength       }
%       \@tempcnta := 0
%       put(0,0){\hskip -\halfwidth
%                \vbox{while \@tempcnta < \@dashcnt
%                       do \vskip D*\unitlength
%                          \copy\@dashbox
%                          \@tempcnta := \@tempcnta + 1
%                       od
%                      \vskip \@dashdim
%                     } }
%       \@tempcnta := 0
%       put(X,0){\hskip -\halfwidth
%                \vbox{while \@tempcnta < \@dashcnt
%                       do \vskip D*\unitlength
%                          \copy\@dashbox
%                          \@tempcnta := \@tempcnta + 1
%                       od
%                      \vskip \@dashdim
%                     }
%               }
%    }     % END DASHES
%
%  \@imakepicbox(X,Y)
% END
% \end{oldcomments}
%
% \begin{macro}{\dashbox}
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\dashbox}{default units}%
%<latexrelease>\expandafter\let\csname dashbox \endcsname\@undefind
\def\dashbox#1(#2,#3){\leavevmode\hb@xt@\z@{\baselineskip \z@skip
\lineskip \z@skip
\@defaultunitsset\@dashdim{#2}\unitlength
\@dashcnt \@dashdim \advance\@dashcnt 200
\@defaultunitsset\@dashdim{#1}\unitlength
\divide\@dashcnt \@dashdim
\ifodd\@dashcnt\@dashdim \z@
\advance\@dashcnt \@ne \divide\@dashcnt \tw@
\else \divide\@dashdim \tw@ \divide\@dashcnt \tw@
\advance\@dashcnt \m@ne
\setbox\@dashbox \hbox{\vrule \@height \@halfwidth \@depth \@halfwidth
\@width \@dashdim}\put(0,0){\copy\@dashbox}%
\put(0,#3){\copy\@dashbox}%
\put(#2,0){\hskip-\@dashdim\copy\@dashbox}%
\put(#2,#3){\hskip-\@dashdim\box\@dashbox}%
\multiply\@dashdim \thr@@
\fi
\setbox\@dashbox \hbox{%
  \@defaultunitsset\@tempdimc{#1}\unitlength
  \vrule \@height \@halfwidth \@depth \@halfwidth \@width \@tempdimc
  \hskip\@tempdimc}%
\@tempcnta\z@
\put(0,0){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
\do{\copy\@dashbox\advance\@tempcnta \@ne }}\@tempcnta\z@
\put(0,#3){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
\do{\copy\@dashbox\advance\@tempcnta \@ne }}%
\@defaultunitsset\@dashdim{#3}\unitlength
\@dashcnt \@dashdim \advance\@dashcnt 200
\@defaultunitsset\@dashdim{#1}\unitlength
\divide\@dashcnt \@dashdim
\ifodd\@dashcnt \@dashdim \z@
\advance\@dashcnt \@ne \divide\@dashcnt \tw@
\else
\divide\@dashdim \tw@ \divide\@dashcnt \tw@
\advance\@dashcnt \m@ne
\setbox\@dashbox\hbox{\hskip -\@halfwidth
\vrule \@width \@wholewidth
\@height \@dashdim}\put(0,0){\copy\@dashbox}%
\put(#2,0){\copy\@dashbox}%
\put(0,#3){\lower\@dashdim\copy\@dashbox}%
\put(#2,#3){\lower\@dashdim\copy\@dashbox}%
\multiply\@dashdim \thr@@
\fi
\@defaultunitsset\@tempdimb{#1}\unitlength
\setbox\@dashbox\hbox{%
  \vrule \@width \@wholewidth \@height\@tempdimb}%
\@tempcnta\z@
\put(0,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta <\@dashcnt
\do{\vskip\@tempdimb\copy\@dashbox\advance\@tempcnta \@ne }%
\vskip\@dashdim}}\@tempcnta\z@
\put(#2,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta<\@dashcnt
\do{\vskip\@tempdimb\copy\@dashbox\advance\@tempcnta \@ne }%
\vskip\@dashdim}}}\@makepicbox(#2,#3)}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\dashbox}{default units}%
%<latexrelease>\expandafter\let\csname dashbox \endcsname\@undefind
%<latexrelease>\def\dashbox#1(#2,#3){%
%<latexrelease>\leavevmode\hb@xt@\z@{\baselineskip \z@skip
%<latexrelease>\lineskip \z@skip
%<latexrelease>\@dashdim #2\unitlength
%<latexrelease>\@dashcnt \@dashdim \advance\@dashcnt 200
%<latexrelease>\@dashdim #1\unitlength\divide\@dashcnt \@dashdim
%<latexrelease>\ifodd\@dashcnt\@dashdim \z@
%<latexrelease>\advance\@dashcnt \@ne \divide\@dashcnt \tw@
%<latexrelease>\else \divide\@dashdim \tw@ \divide\@dashcnt \tw@
%<latexrelease>\advance\@dashcnt \m@ne
%<latexrelease>\setbox\@dashbox \hbox{%
%<latexrelease>  \vrule \@height \@halfwidth \@depth \@halfwidth
%<latexrelease>  \@width \@dashdim}\put(0,0){\copy\@dashbox}%
%<latexrelease>\put(0,#3){\copy\@dashbox}%
%<latexrelease>\put(#2,0){\hskip-\@dashdim\copy\@dashbox}%
%<latexrelease>\put(#2,#3){\hskip-\@dashdim\box\@dashbox}%
%<latexrelease>\multiply\@dashdim \thr@@
%<latexrelease>\fi
%<latexrelease>\setbox\@dashbox \hbox{%
%<latexrelease>  \vrule \@height \@halfwidth \@depth \@halfwidth
%<latexrelease>  \@width #1\unitlength\hskip #1\unitlength}\@tempcnta\z@
%<latexrelease>\put(0,0){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
%<latexrelease>\do{\copy\@dashbox\advance\@tempcnta \@ne }}\@tempcnta\z@
%<latexrelease>\put(0,#3){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
%<latexrelease>\do{\copy\@dashbox\advance\@tempcnta \@ne }}%
%<latexrelease>\@dashdim #3\unitlength
%<latexrelease>\@dashcnt \@dashdim \advance\@dashcnt 200
%<latexrelease>\@dashdim #1\unitlength\divide\@dashcnt \@dashdim
%<latexrelease>\ifodd\@dashcnt \@dashdim \z@
%<latexrelease>\advance\@dashcnt \@ne \divide\@dashcnt \tw@
%<latexrelease>\else
%<latexrelease>\divide\@dashdim \tw@ \divide\@dashcnt \tw@
%<latexrelease>\advance\@dashcnt \m@ne
%<latexrelease>\setbox\@dashbox\hbox{\hskip -\@halfwidth
%<latexrelease>\vrule \@width \@wholewidth
%<latexrelease>\@height \@dashdim}\put(0,0){\copy\@dashbox}%
%<latexrelease>\put(#2,0){\copy\@dashbox}%
%<latexrelease>\put(0,#3){\lower\@dashdim\copy\@dashbox}%
%<latexrelease>\put(#2,#3){\lower\@dashdim\copy\@dashbox}%
%<latexrelease>\multiply\@dashdim \thr@@
%<latexrelease>\fi
%<latexrelease>\setbox\@dashbox\hbox{\vrule \@width \@wholewidth
%<latexrelease>\@height #1\unitlength}\@tempcnta\z@
%<latexrelease>\put(0,0){%
%<latexrelease>  \hskip -\@halfwidth \vbox{\@whilenum \@tempcnta <\@dashcnt
%<latexrelease>  \do{\vskip #1\unitlength\copy\@dashbox
%<latexrelease>      \advance\@tempcnta\@ne }%
%<latexrelease>  \vskip\@dashdim}}\@tempcnta\z@
%<latexrelease>\put(#2,0){%
%<latexrelease>  \hskip -\@halfwidth \vbox{\@whilenum \@tempcnta<\@dashcnt
%<latexrelease>  \do{\vskip #1\unitlength\copy\@dashbox
%<latexrelease>      \advance\@tempcnta \@ne }%
%<latexrelease>  \vskip\@dashdim}}}\@makepicbox(#2,#3)}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{oldcomments}
% CIRCLES AND OVALS
%
%  USER COMMANDS:
%
%  \circle{D} : Produces the circle with the diameter as close as
%               possible to D * \unitlength.  \put(X,Y){\circle{D}}
%               puts the circle with its center at (X,Y).
%
%  \oval(X,Y) : Makes an oval as round as possible that fits in the
%               rectangle of width X * \unitlength and height
%               Y * \unitlength. The reference point is the center.
%
% \oval(X,Y)[POS] : Save as \oval(X,Y) except it draws only the
%                   half or quadrant of the oval indicated by POS.
%                   E.G., \oval(X,Y)[t] draws just the top half
%                   and \oval(X,Y)[br] draws just the bottom right
%                   quadrant.  In all cases, the reference point is
%                   the same as the unqualified \oval(X,Y) command.
%
% \@ovvert {DELTA1} {DELTA2} : Makes a vbox containing either the left
%    side or the right side of the oval being constructed.  The baseline
%    will coincide with the outside bottom edge of the oval; the left
%    side of the box will coincide with the left edge of the vertical
%    rule.  The width of the box will be \@tempdima.
%    DELTA1 and DELTA2 are added to the character number in \@tempcnta
%    to get the characters for the top and bottom quarter circle pieces.
%
% \@ovhorz : Makes an hbox containing the straight rule for either the
%         top or the bottom of the oval being constructed.  The baseline
%         will coincide with bottom edge of the rule; the left side of
%         the box will coincide with the left side of the oval.
%         The width of the box will be \@ovxx.
%
% \@getcirc {DIAM} : Sets \@tempcnta to the character number
%               of the top-right quarter circle with the largest
%               diameter less than or equal to DIAM.
%               Sets \@tempboxa to an hbox containing that character.
%               Sets \@tempdima to \wd \@tempboxa, which is the distance
%               from the circle's left outside edge to its right
%               inside edge.
%               (These characters are like those described in the
%               TeXbook, pp. 389-90.)
%
% \@getcirc {DIAM} ==
%   BEGIN
%     \@tempcnta       := integer coercion of (DIAM + 2pt)
%                                           + 2pt added 1 Nov 88
%     \@tempcnta       := \@tempcnta / integer coercion of 4pt
%     if \@tempcnta > 10
%       then \@tempcnta := 10 fi
%     if \@tempcnta > 0
%       then \@tempcnta := \@tempcnta-1
%       else LaTeX Warning: Oval too small.
%     fi
%     \@tempcnta       := 4 * \@tempcnta
%     \@tempboxa       := \hbox{\@circlefnt \char \@tempcnta}
%     \@tempdima       := \wd \@tempboxa
%   END
%
% \@put{X}{Y}{OBJ} ==
%   BEGIN
%     \raise Y \hb@xt@ 0pt{\hskip X OBJ \hss}
%   END
%
% \@oval(X,Y)[POS] ==
%   BEGIN
%     \begingroup
%       \boxmaxdepth := \maxdimen
%       @ovt := @ovb := @ovl := @ovr := true
%       for all E in POS
%         do  @ovE := false od
%       \@ovxx      := X * \unitlength
%       \@ovyy      := Y * \unitlength
%       \@tempdimb := min(\@ovxx,\@ovyy)
%       \@getcirc{\@tempdimb-2pt}   %% "-2pt" added 7 Dec 89
%       \@ovro     := \ht \@tempboxa
%       \@ovri     := \dp \@tempboxa
%       \@ovdx     := \@ovxx - \@tempdima
%       \@ovdx     := \@ovdx/2
%       \@ovdy     := \@ovyy - \@tempdima
%       \@ovdy     := \@ovyy/2
%       \@circlefnt
%       \@tempboxa :=
%           \hbox{
%                 if @ovr
%                   then \@ovvert{3}{2} \kern -\@tempdima
%                 fi
%                 if @ovl
%                   then \kern \@ovxx \@ovvert{0}{1} \kern -\@tempdima
%                        \kern -\@ovxx
%                 fi
%                 if @ovt
%                   then \@ovhorz \kern -\@ovxx
%                 fi
%                 if @ovb
%                   then \raise \@ovyy \@ovhorz
%                 fi
%                }
%       \@ovdx    := \@ovdx + \@ovro
%       \@ovdy    := \@ovdy + \@ovro
%      \ht\@tempboxa := \dp\@tempboxa := 0
%       \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}
%    \endgroup
%   END
%
% \@ovvert {DELTA1} {DELTA2} ==
%   BEGIN
%      \vbox to \@ovyy {
%                      if @ovb
%                        then \@tempcntb := \@tempcnta + DELTA1
%                             \kern -\@ovro
%                             \hbox { \char \@tempcntb }
%                             \nointerlineskip
%                        else \kern \@ovri \kern \@ovdy
%                      fi
%                      \leaders \vrule width \@wholewidth \vfil
%                      \nointerlineskip
%                      if @ovt
%                        then \@tempcntb := \@tempcnta + DELTA2
%                             \hbox { \char \@tempcntb }
%                        else \kern \@ovdy \kern \@ovro
%                      fi
%                     }
%   END
%
% \@ovhorz ==
%   BEGIN
%    \hb@xt@ \@ovxx{
%                   \kern \@ovro
%                   if @ovr
%                     then
%                     else \kern \@ovdx
%                   fi
%                   \leaders \hrule height \@wholewidth \hfil
%                   if @ovl
%                     then
%                     else \kern \@ovdx
%                   fi
%                   \kern \@ovri
%                  }
%   END
%
% \circle{DIAM} ==
%   BEGIN
%    \begingroup
%    \boxmaxdepth := maxdimen
%    \@tempdimb := DIAM *\unitlength
%    if \@tempdimb > 15.5pt
%      then \@getcirc{\@tempdimb}
%           \@ovro := \ht \@tempboxa
%           \@tempboxa := \hbox{
%                   \@circlefnt
%                   \@tempcnta := \@tempcnta + 2
%                   \char \@tempcnta
%                   \@tempcnta := \@tempcnta - 1
%                   \char \@tempcnta
%                   \kern -2\@tempdima
%                   \@tempcnta := \@tempcnta + 2
%                   \raise \@tempdima \hbox { \char \@tempcnta }
%                   \raise \@tempdima \box\@tempboxa
%                  }
%           \ht\@tempboxa := \dp\@tempboxa := 0
%           \@put{-\@ovro}{-\@ovro}{\@tempboxa}
%      else
%           \@circ{\@tempdimb}{96}
%    fi
%   \endgroup
%   END
%
% \circle*{DIAM}  ==  \@dot{DIAM} == \@circ{DIAM*\unitlength}{112}
%
% \@circ{DIAM}{CHAR} ==
%  BEGIN
%   \@tempcnta := integer coercion of (DIAM + .5pt)/1pt.
%   if \@tempcnta > 15 then \@tempcnta := 15 fi
%   if \@tempcnta > 1  then \@tempcnta := \@tempcnta - 1 fi
%   \@tempcnta := \@tempcnta + CHAR
%   \@circlefnt
%   \char \@tempcnta
%  END
% \end{oldcomments}
%
%
% \begin{macro}{\if@ovt}
% \begin{macro}{\if@ovb}
% \begin{macro}{\if@ovl}
% \begin{macro}{\if@ovr}
% If producing the Top Bottom Left or Right of an oval.
%    \begin{macrocode}
\newif\if@ovt
\newif\if@ovb
\newif\if@ovl
\newif\if@ovr
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\@ovxx}
% \begin{macro}{\@ovyy}
% \begin{macro}{\@ovdx}
% \begin{macro}{\@ovdy}
% \begin{macro}{\@ovro}
% \begin{macro}{\@ovri}
%    \begin{macrocode}
\newdimen\@ovxx
\newdimen\@ovyy
\newdimen\@ovdx
\newdimen\@ovdy
\newdimen\@ovro
\newdimen\@ovri
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% |\advance\@tempdima 2pt\relax| added 1 Nov 88 to fix bug in which
% size of drawn circle not monotonic function of argument of |\circle|,
% caused by different rounding for dimensions of large and small
% circles.
%
%
% \begin{macro}{\@getcirc}
% \changes{v1.1j}{2003/12/30}{issue warning if circle size can't be met pr/3473}
%    \begin{macrocode}
\def\@getcirc#1{\@tempdima #1\relax \advance\@tempdima 2\p@
  \@tempcnta\@tempdima
  \@tempdima 4\p@ \divide\@tempcnta\@tempdima
  \ifnum \@tempcnta >10\relax
      \@picture@warn
      \@tempcnta 10\relax
  \fi
  \ifnum \@tempcnta >\z@ \advance\@tempcnta\m@ne
%    \end{macrocode}
%     Warn if requirements for oval or circle can't be met.
% \changes{v1.1g}{1997/09/15}{Warn if lines become invisible pr/2524}
%    \begin{macrocode}
    \else \@picture@warn \fi
  \multiply\@tempcnta 4\relax
  \setbox \@tempboxa \hbox{\@circlefnt
  \char \@tempcnta}\@tempdima \wd \@tempboxa}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@picture@warn}
%     Generic warning for lines, vectors (used in |\@sline|) and
%     oval or circle (used in |\@getcirc|) are not available at
%     right size.
% \changes{v1.1g}{1997/09/15}{Macro added pr/2524}
%    \begin{macrocode}
\def\@picture@warn{\@latex@warning{%
     \string\oval, \string\circle, or \string\line\space
     size unavailable}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@put}
%    \begin{macrocode}
\def\@put#1#2#3{\raise #2\hb@xt@\z@{\hskip #1#3\hss}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\oval}
%    \begin{macrocode}
\def\oval(#1,#2){\@ifnextchar[{\@oval(#1,#2)}{\@oval(#1,#2)[]}}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</2ekernel>
%<latexrelease>\IncludeInRelease{2016/03/31}%
%<latexrelease>                 {\@ovhlinetrue}%
%<latexrelease>                 {Avoid almost zero length leaders}%
%<*2ekernel|latexrelease>
%    \end{macrocode}
%
% \begin{macro}{\if@ovvline}
% \changes{v1.1l}{2016/03/29}{macro added (latex/4452)}
% \begin{macro}{\if@ovhline}
% \changes{v1.1l}{2016/03/29}{macro added (latex/4452)}
% Tests whether horizontal or vertical lines are needed.
%    \begin{macrocode}
\newif\if@ovvline \@ovvlinetrue
\newif\if@ovhline \@ovhlinetrue
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\@ovhlinetrue}%
%<latexrelease>                 {Avoid almost zero length leaders}%
%<latexrelease>\let\if@ovvline\@undefined
%<latexrelease>\let\if@ovhline\@undefined
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@oval}
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\@oval}{default units}%
\def\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
  \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
%    \end{macrocode}
% \changes{v1.1l}{2016/03/29}{initialize tests}
%    \begin{macrocode}
  \@ovvlinefalse \@ovhlinefalse
%    \end{macrocode}
%    \begin{macrocode}
  \@tfor\reserved@a :=#3\do{%
    \csname @ov\reserved@a false\endcsname}%
  \@defaultunitsset\@ovxx{#1}\unitlength
  \@defaultunitsset\@ovyy{#2}\unitlength
%    \end{macrocode}
% \changes{v1.1l}{2016/03/29}{add setting of line tests}
%    \begin{macrocode}
  \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx \@ovvlinetrue
  \else \@ovyy \ifdim \@ovyy =\@ovxx \else \@ovhlinetrue \fi\fi
%    \end{macrocode}
%    \begin{macrocode}
  \advance \@tempdimb -2\p@
  \@getcirc \@tempdimb
  \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa
  \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@
  \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@
%    \end{macrocode}
% \changes{v1.1l}{2016/03/29}{add setting of line tests}
%    \begin{macrocode}
  \ifdim \@ovdx >\z@ \@ovhlinetrue \fi
  \ifdim \@ovdy >\z@ \@ovvlinetrue \fi
%    \end{macrocode}
%    \begin{macrocode}
  \@circlefnt \setbox\@tempboxa
  \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi
  \if@ovl \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx \fi
  \if@ovt \@ovhorz \kern -\@ovxx \fi
  \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro
  \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@
  \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}%
  \endgroup}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{2016/03/31}%
%<latexrelease>                 {\@oval}{default units}%
%<latexrelease>\def\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
%<latexrelease>  \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
%<latexrelease>  \@ovvlinefalse \@ovhlinefalse
%<latexrelease>  \@tfor\reserved@a :=#3\do{%
%<latexrelease>    \csname @ov\reserved@a false\endcsname}%
%<latexrelease>  \@ovxx #1\unitlength
%<latexrelease>  \@ovyy #2\unitlength
%<latexrelease>  \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx \@ovvlinetrue
%<latexrelease>  \else \@ovyy \ifdim \@ovyy =\@ovxx \else \@ovhlinetrue
%<latexrelease>   \fi\fi
%<latexrelease>  \advance \@tempdimb -2\p@
%<latexrelease>  \@getcirc \@tempdimb
%<latexrelease>  \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa
%<latexrelease>  \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@
%<latexrelease>  \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@
%<latexrelease>  \ifdim \@ovdx >\z@ \@ovhlinetrue \fi
%<latexrelease>  \ifdim \@ovdy >\z@ \@ovvlinetrue \fi
%<latexrelease>  \@circlefnt \setbox\@tempboxa
%<latexrelease>  \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi
%<latexrelease>  \if@ovl
%<latexrelease>   \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx
%<latexrelease>  \fi
%<latexrelease>  \if@ovt \@ovhorz \kern -\@ovxx \fi
%<latexrelease>  \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro
%<latexrelease>  \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@
%<latexrelease>  \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}%
%<latexrelease>  \endgroup}
%<latexrelease>\EndIncludeInRelease
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\@oval}{default units}%
%<latexrelease>\def\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
%<latexrelease>  \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
%<latexrelease>  \@tfor\reserved@a :=#3\do
%<latexrelease>                {\csname @ov\reserved@a false\endcsname}%
%<latexrelease>  \@ovxx #1\unitlength
%<latexrelease>  \@ovyy #2\unitlength
%<latexrelease>  \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx\else \@ovyy \fi
%<latexrelease>  \advance \@tempdimb -2\p@
%<latexrelease>  \@getcirc \@tempdimb
%<latexrelease>  \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa
%<latexrelease>  \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@
%<latexrelease>  \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@
%<latexrelease>  \@circlefnt \setbox\@tempboxa
%<latexrelease>  \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi
%<latexrelease>  \if@ovl
%<latexrelease>   \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx
%<latexrelease>  \fi
%<latexrelease>  \if@ovt \@ovhorz \kern -\@ovxx \fi
%<latexrelease>  \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro
%<latexrelease>  \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@
%<latexrelease>  \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}%
%<latexrelease>  \endgroup}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@ovvert}
%    \begin{macrocode}
%</2ekernel>
%<latexrelease>\IncludeInRelease{2016/03/31}%
%<latexrelease>                 {\@ovvert}{Avoid almost zero length leaders}%
%<*2ekernel|latexrelease>
\def\@ovvert#1#2{\vbox to\@ovyy{%
    \if@ovb \@tempcntb \@tempcnta \advance \@tempcntb #1\relax
      \kern -\@ovro \hbox{\char \@tempcntb}\nointerlineskip
    \else \kern \@ovri \kern \@ovdy \fi
%    \end{macrocode}
% \changes{v1.1l}{2016/03/29}
%               {use glue not leaders if vertical line not required}
%    \begin{macrocode}
    \if@ovvline \leaders\vrule \@width \@wholewidth \fi
%    \end{macrocode}
%    \begin{macrocode}
    \vfil \nointerlineskip
    \if@ovt \@tempcntb \@tempcnta \advance \@tempcntb #2\relax
      \hbox{\char \@tempcntb}%
    \else \kern \@ovdy \kern \@ovro \fi}}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\@ovvert}{Avoid almost zero length leaders}%
%<latexrelease>\def\@ovvert#1#2{\vbox to\@ovyy{%
%<latexrelease>    \if@ovb \@tempcntb \@tempcnta \advance \@tempcntb #1\relax
%<latexrelease>      \kern -\@ovro \hbox{\char \@tempcntb}\nointerlineskip
%<latexrelease>    \else \kern \@ovri \kern \@ovdy \fi
%<latexrelease>    \leaders\vrule \@width \@wholewidth\vfil \nointerlineskip
%<latexrelease>    \if@ovt \@tempcntb \@tempcnta \advance \@tempcntb #2\relax
%<latexrelease>      \hbox{\char \@tempcntb}%
%<latexrelease>    \else \kern \@ovdy \kern \@ovro \fi}}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@ovhorz}
%    \begin{macrocode}
%</2ekernel>
%<latexrelease>\IncludeInRelease{2016/03/31}%
%<latexrelease>                 {\@ovhorz}{Avoid almost zero length leaders}%
%<*2ekernel|latexrelease>
\def\@ovhorz{\hb@xt@\@ovxx{\kern \@ovro
    \if@ovr \else \kern \@ovdx \fi
%    \end{macrocode}
% \changes{v1.1l}{2016/03/29}
%               {use glue not leaders if horizontal line not required}
%    \begin{macrocode}
    \if@ovhline \leaders \hrule \@height \@wholewidth \fi
%    \end{macrocode}
%
%    \begin{macrocode}
    \hfil
    \if@ovl \else \kern \@ovdx \fi
    \kern \@ovri}}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\@ovhorz}{Avoid almost zero length leaders}%
%<latexrelease>\def\@ovhorz{\hb@xt@\@ovxx{\kern \@ovro
%<latexrelease>    \if@ovr \else \kern \@ovdx \fi
%<latexrelease>    \leaders \hrule \@height \@wholewidth \hfil
%<latexrelease>    \if@ovl \else \kern \@ovdx \fi
%<latexrelease>    \kern \@ovri}}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\circle}
% \changes{LaTeX2.09}{1993/08/05}
%     {(RMS) Added error message if \cs{circle} is used in math mode.}
%    \begin{macrocode}
\def\circle{\@inmatherr\circle\@ifstar\@dot\@circle}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@circle}
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\@circle}{default units}%
\def\@circle#1{%
  \begingroup \boxmaxdepth \maxdimen
   \@defaultunitsset\@tempdimb{#1}\unitlength
   \ifdim \@tempdimb >15.5\p@ \@getcirc\@tempdimb
      \@ovro\ht\@tempboxa
     \setbox\@tempboxa\hbox{\@circlefnt
      \advance\@tempcnta\tw@ \char \@tempcnta
      \advance\@tempcnta\m@ne \char \@tempcnta \kern -2\@tempdima
      \advance\@tempcnta\tw@
      \raise \@tempdima \hbox{\char\@tempcnta}\raise \@tempdima
        \box\@tempboxa}\ht\@tempboxa\z@ \dp\@tempboxa\z@
      \@put{-\@ovro}{-\@ovro}{\box\@tempboxa}%
   \else  \@circ\@tempdimb{96}\fi\endgroup}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\@circle}{default units}%
%<latexrelease>\def\@circle#1{%
%<latexrelease>  \begingroup \boxmaxdepth \maxdimen \@tempdimb #1\unitlength
%<latexrelease>   \ifdim \@tempdimb >15.5\p@ \@getcirc\@tempdimb
%<latexrelease>      \@ovro\ht\@tempboxa
%<latexrelease>     \setbox\@tempboxa\hbox{\@circlefnt
%<latexrelease>      \advance\@tempcnta\tw@ \char \@tempcnta
%<latexrelease>      \advance\@tempcnta\m@ne \char \@tempcnta
%<latexrelease>      \kern -2\@tempdima
%<latexrelease>      \advance\@tempcnta\tw@
%<latexrelease>      \raise \@tempdima \hbox{\char\@tempcnta}%
%<latexrelease>      \raise \@tempdima
%<latexrelease>        \box\@tempboxa}\ht\@tempboxa\z@ \dp\@tempboxa\z@
%<latexrelease>      \@put{-\@ovro}{-\@ovro}{\box\@tempboxa}%
%<latexrelease>   \else  \@circ\@tempdimb{96}\fi\endgroup}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@dot}
% Internal form of |\circle*|.
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\@dot}{default units}%
\def\@dot#1{%
  \@defaultunitsset\@tempdimb{#1}\unitlength
  \@circ\@tempdimb{112}}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\@dot}{default units}%
%<latexrelease>\def\@dot#1{\@tempdimb #1\unitlength \@circ\@tempdimb{112}}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@circ}
%    \begin{macrocode}
\def\@circ#1#2{\@tempdima #1\relax \advance\@tempdima .5\p@
   \@tempcnta\@tempdima \@tempdima \p@
   \divide\@tempcnta\@tempdima
   \ifnum\@tempcnta >15\relax \@tempcnta 15\relax \fi
   \ifnum \@tempcnta >\z@ \advance\@tempcnta\m@ne\fi
   \advance\@tempcnta #2\relax
   \@circlefnt \char\@tempcnta}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@xarg}
% \begin{macro}{\@yarg}
% \begin{macro}{\@yyarg}
% Counters used for manipulating the `slope' arguments.
%    \begin{macrocode}
\newcount\@xarg
\newcount\@yarg
\newcount\@yyarg
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@multicnt}
% Counter used in |\multiput|, and also |\multicolumn|.
%    \begin{macrocode}
\newcount\@multicnt
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@xdim}
% \begin{macro}{\@ydim}
% Length registers.
%    \begin{macrocode}
\newdimen\@xdim
\newdimen\@ydim
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@linechar}
% Box for holding a line segment character, for sloping lines.
%    \begin{macrocode}
\newbox\@linechar
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@linelen}
% Length of the line currently being built.
%    \begin{macrocode}
\newdimen\@linelen
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@clnwd}
% \begin{macro}{\@clnht}
% Height and width of current line segment.
%    \begin{macrocode}
\newdimen\@clnwd
\newdimen\@clnht
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@dashdim}
% \begin{macro}{\@dashbox}
% \begin{macro}{\@dashcnt}
% |\dashbox| internal registers.
%    \begin{macrocode}
\newdimen\@dashdim
\newbox\@dashbox
\newcount\@dashcnt
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% Initialization: ``|\thinlines|''
% \changes{v1.1f}{1995/10/27}
%      {Move initialization to kernel from autoload file}
%    \begin{macrocode}
\let\@linefnt\tenln
\let\@circlefnt\tencirc
\@wholewidth\fontdimen8\tenln
\@halfwidth .5\@wholewidth
%    \end{macrocode}
%
%
%
% \subsection{Curves}
% The new |\qbezier| command, based on the old |\bezier| defined in
% |bezier.sty|.
% \changes{v0.1c}{1994/04/28}{bezier curves added}
%
% \begin{oldcomments}
%
%  \qbezier[N] == \bezier{N}
%
%  \bezier{N}(AX,AY)(BX,BY)(CX,CY) ==
%    BEGIN
%      IF N = 0
%         THEN \@xdima := |BX - AX|
%             \@xb := |CX - BX|
%             \@xa := Max(\@xa, \@xb)
%             \@ya := |BY - AY|
%             \@yb := |CY - BY|
%             \@ya := Max(\@ya, \@yb)
%             @sc := Max(\@xa, \@ya)
%             %% The coefficient .5 below is the degree of overlap of
%             %% successive points, where 1 is no overlap and 0 is
%             %% complete overlap.  A coefficient of C multiplies
%             %% the number of points plotted by 1/C.
%             %%
%             \@xa := .5 * \@halfwidth
%             @sc := @sc / \@halfwidth
%             @sc := Max(@sc, qbeziermax)
%          ELSE @sc := N
%      @scp := @sc+1
%      \@xb := 2 * (BX - AX) * \unitlength
%      \@xa := ((CX-AX)*\unitlength - \@xb)/@sc
%      \@yb := 2 * (BY - AY) * \unitlength
%      \@ya := ((CY-AY)*\unitlength - \@yb)/@sc
%      \@pictdot := square rule of width \@wholewidth
%      \count@ := 0
%      WHILE \count@ < @scp
%        DO  \@xdim := ((\count@*\@xa + @xb) / @sc) * \count@
%            \@ydim := ((\count@*\@ya + @yb) / @sc) * \count@
%            plot pt with relative coords (\@xdim,\@ydim)
%            \count@ := \count@+1
%        OD
%
% \end{oldcomments}
%
%  \begin{macro}{\qbeziermax}
% The maximum number of points to plot.
%    \begin{macrocode}
\def\qbeziermax{500}
%    \end{macrocode}
%  \end{macro}
%
%
% In the code below, to save registers |\@a| \ldots\ are not used.
% Instead other registers are reused.
%
% |\newcounter{@sc} -> \c@multicnt|\par
% |\newcounter{@scp} -> \@tempcnta|\par
% |\newdimen\@xa ->  \@ovxx|\par
%
% |\newdimen\@xb ->  \@ovdx|
%
% |\newdimen\@ya ->  \@ovyy|\par
% |\newdimen\@yb ->  \@ovdy|
%
% |\newsavebox{\@pictdot} -> \@tempboxa|
%
% \begin{macro}{\qbezier}
% Main user-level command to plot quadratic bezier curves.
% |#2| should be |(|.
%    \begin{macrocode}
\newcommand\qbezier[2][0]{\bezier{#1}#2}
%    \end{macrocode}
% \end{macro}
%
%  \begin{macro}{\bezier}
% Form of |\bezier| compatible with 2.09 |bezier.sty|, but modified to
% ignore spaces between its arguments.
% |#2| should be white space, and |#4| should be |(|.
%    \begin{macrocode}
\def\bezier#1)#2(#3)#4({\@bezier#1)(#3)(}
%    \end{macrocode}
%
%  \begin{macro}{\@bezier}
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease>                 {\@bezier}{default units}%
\def\@bezier#1(#2,#3)(#4,#5)(#6,#7){%
  \ifnum #1=\z@
      \@defaultunitsset\@ovxx{#4}\unitlength
        \@defaultunitsset{\advance\@ovxx}{-#2}\unitlength
        \ifdim \@ovxx<\z@ \@ovxx -\@ovxx \fi
      \@defaultunitsset\@ovdx{#6}\unitlength
        \@defaultunitsset{\advance\@ovdx}{-#4}\unitlength
        \ifdim \@ovdx<\z@ \@ovdx -\@ovdx \fi
        \ifdim \@ovxx<\@ovdx \@ovxx \@ovdx \fi
      \@defaultunitsset\@ovyy{#5}\unitlength
        \@defaultunitsset{\advance\@ovyy}{-#3}\unitlength
        \ifdim \@ovyy<\z@ \@ovyy -\@ovyy \fi
      \@defaultunitsset\@ovdy{#7}\unitlength
        \@defaultunitsset{\advance\@ovdy}{-#5}\unitlength
        \ifdim \@ovdy<\z@  \@ovdy -\@ovdy \fi
        \ifdim \@ovyy<\@ovdy \@ovyy  \@ovdy \fi
      \@multicnt
         \ifdim \@ovxx>\@ovyy \@ovxx \else \@ovyy \fi
      \@ovxx .5\@halfwidth \divide\@multicnt\@ovxx
      \ifnum \qbeziermax<\@multicnt
        \@multicnt\qbeziermax\relax
      \fi
  \else \@multicnt#1\relax \fi
  \@tempcnta\@multicnt \advance\@tempcnta\@ne
  \@defaultunitsset\@ovdx{#4}\unitlength
  \@defaultunitsset{\advance\@ovdx}{-#2}\unitlength
      \multiply\@ovdx \tw@
  \@defaultunitsset\@ovxx{#6}\unitlength
  \@defaultunitsset{\advance\@ovxx}{-#2}\unitlength
      \advance\@ovxx -\@ovdx \divide\@ovxx\@multicnt
  \@defaultunitsset\@ovdy{#5}\unitlength
  \@defaultunitsset{\advance\@ovdy}{-#3}\unitlength
       \multiply\@ovdy \tw@
  \@defaultunitsset\@ovyy{#7}\unitlength
  \@defaultunitsset{\advance\@ovyy}{-#3}\unitlength
      \advance\@ovyy -\@ovdy \divide\@ovyy\@multicnt
%    \end{macrocode}
%
% \changes{v1.1k}{2003/08/27}{added missing displacement pr/3566}
%    \begin{macrocode}
  \setbox\@tempboxa\hbox{%
            \hskip -\@halfwidth
            \vrule \@height\@halfwidth
                   \@depth \@halfwidth
                   \@width \@wholewidth}%
   \put(#2,#3){%
     \count@\z@
     \@whilenum{\count@<\@tempcnta}\do
        {\@xdim\count@\@ovxx
           \advance\@xdim\@ovdx
           \divide\@xdim\@multicnt
           \multiply\@xdim\count@
         \@ydim\count@\@ovyy
            \advance\@ydim\@ovdy
            \divide\@ydim\@multicnt
            \multiply\@ydim\count@
         \raise \@ydim
            \hb@xt@\z@{\kern\@xdim
                        \unhcopy\@tempboxa\hss}%
         \advance\count@\@ne}}}
%</2ekernel|latexrelease>
%    \end{macrocode}
%    
%    \begin{macrocode}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\@bezier}{default units}%
%<latexrelease>\def\@bezier#1(#2,#3)(#4,#5)(#6,#7){%
%<latexrelease>  \ifnum #1=\z@
%<latexrelease>      \@ovxx #4\unitlength
%<latexrelease>        \advance\@ovxx -#2\unitlength
%<latexrelease>        \ifdim \@ovxx<\z@ \@ovxx -\@ovxx \fi
%<latexrelease>      \@ovdx #6\unitlength
%<latexrelease>        \advance\@ovdx -#4\unitlength
%<latexrelease>        \ifdim \@ovdx<\z@ \@ovdx -\@ovdx \fi
%<latexrelease>        \ifdim \@ovxx<\@ovdx \@ovxx \@ovdx \fi
%<latexrelease>      \@ovyy #5\unitlength
%<latexrelease>        \advance\@ovyy -#3\unitlength
%<latexrelease>        \ifdim \@ovyy<\z@ \@ovyy -\@ovyy \fi
%<latexrelease>      \@ovdy #7\unitlength
%<latexrelease>        \advance\@ovdy -#5\unitlength
%<latexrelease>        \ifdim \@ovdy<\z@  \@ovdy -\@ovdy \fi
%<latexrelease>        \ifdim \@ovyy<\@ovdy \@ovyy  \@ovdy \fi
%<latexrelease>      \@multicnt
%<latexrelease>         \ifdim \@ovxx>\@ovyy \@ovxx \else \@ovyy \fi
%<latexrelease>      \@ovxx .5\@halfwidth \divide\@multicnt\@ovxx
%<latexrelease>      \ifnum
%<latexrelease>        \qbeziermax<\@multicnt \@multicnt\qbeziermax\relax
%<latexrelease>      \fi
%<latexrelease>  \else \@multicnt#1\relax \fi
%<latexrelease>  \@tempcnta\@multicnt \advance\@tempcnta\@ne
%<latexrelease>  \@ovdx #4\unitlength \advance\@ovdx -#2\unitlength
%<latexrelease>      \multiply\@ovdx \tw@
%<latexrelease>  \@ovxx #6\unitlength \advance\@ovxx -#2\unitlength
%<latexrelease>      \advance\@ovxx -\@ovdx \divide\@ovxx\@multicnt
%<latexrelease>  \@ovdy #5\unitlength \advance\@ovdy -#3\unitlength
%<latexrelease>       \multiply\@ovdy \tw@
%<latexrelease>  \@ovyy #7\unitlength \advance\@ovyy -#3\unitlength
%<latexrelease>      \advance\@ovyy -\@ovdy \divide\@ovyy\@multicnt
%<latexrelease>  \setbox\@tempboxa\hbox{%
%<latexrelease>            \hskip -\@halfwidth
%<latexrelease>            \vrule \@height\@halfwidth
%<latexrelease>                   \@depth \@halfwidth
%<latexrelease>                   \@width \@wholewidth}%
%<latexrelease>   \put(#2,#3){%
%<latexrelease>     \count@\z@
%<latexrelease>     \@whilenum{\count@<\@tempcnta}\do
%<latexrelease>        {\@xdim\count@\@ovxx
%<latexrelease>           \advance\@xdim\@ovdx
%<latexrelease>           \divide\@xdim\@multicnt
%<latexrelease>           \multiply\@xdim\count@
%<latexrelease>         \@ydim\count@\@ovyy
%<latexrelease>            \advance\@ydim\@ovdy
%<latexrelease>            \divide\@ydim\@multicnt
%<latexrelease>            \multiply\@ydim\count@
%<latexrelease>         \raise \@ydim
%<latexrelease>            \hb@xt@\z@{\kern\@xdim
%<latexrelease>                        \unhcopy\@tempboxa\hss}%
%<latexrelease>         \advance\count@\@ne}}}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  As the commands above all use ``picture'' interface we couldn't define them with
% |\DeclareRobustCommand| so we do that now.
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2019/10/01}%
%<latexrelease>                 {\bezier}{Make commands robust}%
\MakeRobust\bezier
\MakeRobust\circle
\MakeRobust\dashbox
\MakeRobust\line
\MakeRobust\linethickness
\MakeRobust\multiput
\MakeRobust\oval
\MakeRobust\put
\MakeRobust\qbezier
\MakeRobust\shortstack
\MakeRobust\thinlines
\MakeRobust\vector
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\bezier}{Make commands robust}%
%<latexrelease>
%<latexrelease>\kernel@make@fragile\bezier
%<latexrelease>\kernel@make@fragile\circle
%<latexrelease>\kernel@make@fragile\dashbox
%<latexrelease>\kernel@make@fragile\line
%<latexrelease>\kernel@make@fragile\linethickness
%<latexrelease>\kernel@make@fragile\multiput
%<latexrelease>\kernel@make@fragile\oval
%<latexrelease>\kernel@make@fragile\put
%<latexrelease>\kernel@make@fragile\qbezier
%<latexrelease>\kernel@make@fragile\shortstack
%<latexrelease>\kernel@make@fragile\thinlines
%<latexrelease>\kernel@make@fragile\vector
%<latexrelease>
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
%
%
%    \begin{macrocode}
%</2ekernel>
%    \end{macrocode}
%
% \Finale
%
