% This is latexpicobjs.tex, Version 1.1  9/11/87

% This file makes the LaTeX line, vector, circle, and oval constructions
% available to PiCTeX users who are running under plain TeX.
% It is distributed with Leslie Lamport's permission.

% Do not \input the files prepictex.tex and postpictex.tex along with
% this file.

\catcode`@=11 \catcode`!=11

% Save the meaning of plain TeX's \line command
\let\!texline=\line

% load LaTeX line and circle fonts
\font\tenln=line10
\font\tenlnw=linew10
\font\tencirc=circle10
\font\tencircw=circlew10

% set up LaTeX hacks
\let\@tfor=\!tfor
\let\@ifnextchar=\!ifnextchar

\def\@whilenoop#1{}
\def\@whiledim#1\do #2{\ifdim #1\relax#2\@iwhiledim{#1\relax#2}\fi}
\def\@iwhiledim#1{\ifdim #1\let\@nextwhile=\@iwhiledim
       \else\let\@nextwhile=\@whilenoop\fi\@nextwhile{#1}}

\def\@ifstar#1#2{\@ifnextchar *{\def\@tempa*{#1}\@tempa}{#2}}

\def\@height{height}
\def\@depth{depth}
\def\@width{width}


% The following are slightly modified versions of the LaTeX
% \@badlinearg and \@warning commands.
\def\!@badlinearg{%
  \errmessage{Bad LaTeX \string\line\space or \string\vector
  \space argument. See the LaTeX manual for an explanation.}}
\def\!@warning#1{\immediate\write16{LaTeX Warning: #1.}\ignorespaces}

% allocate registers
\newdimen\@tempdima
\newdimen\@tempdimb
\newcount\@tempcnta
\newcount\@tempcntb
\newbox\@tempboxa

% Until further notice (near the end) what follows are
% (slightly modified versions of) LaTeX's line/vector/circle/oval macros.
% See the latex.tex macro package for commentary.
\newdimen\@wholewidth
\newdimen\@halfwidth
\newdimen\unitlength \unitlength =1pt

\def\thinlines{%
 \let\@linefnt\tenln \let\@circlefnt\tencirc
 \@wholewidth\fontdimen8\tenln \@halfwidth .5\@wholewidth}
\def\thicklines{%
 \let\@linefnt\tenlnw \let\@circlefnt\tencircw
 \@wholewidth\fontdimen8\tenlnw \@halfwidth .5\@wholewidth}

\newif\if@negarg

\def\line(#1,#2)#3{%
 \@xarg #1\relax
 \@yarg #2\relax
 \@linelen=#3\unitlength
 \ifnum\@xarg =0
   \@vline
 \else
   \ifnum\@yarg =0
     \@hline
   \else
     \@sline
   \fi
 \fi}

\def\@sline{%
 \ifnum\@xarg< 0
   \@negargtrue
   \@xarg -\@xarg
   \@yyarg -\@yarg
 \else
   \@negargfalse
   \@yyarg \@yarg
 \fi
 \ifnum \@yyarg >0
   \@tempcnta\@yyarg
 \else
   \@tempcnta -\@yyarg
 \fi
 \ifnum\@tempcnta>6
   \!@badlinearg
   \@tempcnta0
 \fi
 \ifnum\@xarg>6
   \!@badlinearg
   \@xarg 1
 \fi
 \setbox\@linechar\hbox{\@linefnt\@getlinechar(\@xarg,\@yyarg)}%
 \ifnum \@yarg >0
   \let\@upordown\raise
   \@clnht\z@
 \else
   \let\@upordown\lower
   \@clnht \ht\@linechar
 \fi
 \@clnwd=\wd\@linechar
 \if@negarg
   \hskip -\wd\@linechar
   \def\@tempa{\hskip -2\wd\@linechar}%
 \else
   \let\@tempa\relax
 \fi
 \@whiledim \@clnwd <\@linelen \do
   {\@upordown\@clnht\copy\@linechar
   \@tempa
   \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
 \else
   \@upordown\@clnht\copy\@linechar
 \fi}

\def\@hline{%
 \ifnum \@xarg <0 \hskip -\@linelen \fi
 \vrule \@height \@halfwidth \@depth \@halfwidth \@width \@linelen
 \ifnum \@xarg <0 \hskip -\@linelen \fi}

\def\@getlinechar(#1,#2){%
 \@tempcnta#1\relax
 \multiply\@tempcnta 8
 \advance\@tempcnta -9
 \ifnum #2>0
   \advance\@tempcnta #2\relax
 \else
   \advance\@tempcnta -#2\relax
   \advance\@tempcnta 64
 \fi
 \char\@tempcnta}

\def\vector(#1,#2)#3{%
 \@xarg #1\relax
 \@yarg #2\relax
 \@tempcnta \ifnum\@xarg<0 -\@xarg\else\@xarg\fi
 \ifnum\@tempcnta<5\relax
   \@linelen=#3\unitlength
   \ifnum\@xarg =0
     \@vvector
   \else
     \ifnum\@yarg =0
       \@hvector
     \else
       \@svector
     \fi
   \fi
 \else
   \!@badlinearg
 \fi}

\def\@hvector{%
 \@hline
 \hbox to 0pt{%
   \@linefnt
   \ifnum \@xarg <0
     \@getlarrow(1,0)\hss
   \else
     \hss\@getrarrow(1,0)%
   \fi}}

\def\@vvector{\ifnum \@yarg <0 \@downvector \else \@upvector \fi}

\def\@svector{%
 \@sline
 \@tempcnta\@yarg
 \ifnum\@tempcnta <0
   \@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}

\def\@getlarrow(#1,#2){%
 \ifnum #2 =\z@
   \@tempcnta='33
 \else
   \@tempcnta=#1\relax
   \multiply\@tempcnta \sixt@@n
   \advance\@tempcnta -9
   \@tempcntb=#2\relax
   \multiply\@tempcntb \tw@
   \ifnum \@tempcntb >0
     \advance\@tempcnta \@tempcntb\relax
   \else\advance\@tempcnta -\@tempcntb
     \advance\@tempcnta 64
   \fi
 \fi
 \char\@tempcnta}

\def\@getrarrow(#1,#2){%
 \@tempcntb=#2\relax
 \ifnum\@tempcntb < 0
   \@tempcntb=-\@tempcntb\relax
 \fi
 \ifcase \@tempcntb\relax
   \@tempcnta='55
 \or
   \ifnum #1<3
     \@tempcnta=#1\relax
     \multiply\@tempcnta 24
     \advance\@tempcnta -6
   \else
     \ifnum #1=3
       \@tempcnta=49
     \else
       \@tempcnta=58
     \fi
   \fi
 \or
   \ifnum #1<3
     \@tempcnta=#1\relax
     \multiply\@tempcnta 24
     \advance\@tempcnta -3
   \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<0
   \advance\@tempcnta 64
 \fi
 \char\@tempcnta}

\def\@vline{%
 \ifnum \@yarg <0
   \@downline
 \else
   \@upline
 \fi}

\def\@upline{%
 \hbox to \z@{%
   \hskip -\@halfwidth
   \vrule \@width \@wholewidth \@height \@linelen \@depth \z@\hss}}

\def\@downline{%
 \hbox to \z@{%
   \hskip -\@halfwidth
   \vrule \@width \@wholewidth \@height \z@ \@depth \@linelen \hss}}

\def\@upvector{%
 \@upline
 \setbox\@tempboxa\hbox{%
   \@linefnt\char'66}%
   \raise \@linelen \hbox to\z@{\lower \ht\@tempboxa\box\@tempboxa\hss}}

\def\@downvector{%
 \@downline
 \lower \@linelen \hbox to \z@{\@linefnt\char'77\hss}}


\newif\if@ovt
\newif\if@ovb
\newif\if@ovl
\newif\if@ovr
\newdimen\@ovxx
\newdimen\@ovyy
\newdimen\@ovdx
\newdimen\@ovdy
\newdimen\@ovro
\newdimen\@ovri

\def\@getcirc#1{%
 \@tempdima #1\relax
 \@tempcnta\@tempdima
 \@tempdima 4pt\relax
 \divide\@tempcnta\@tempdima
 \ifnum \@tempcnta > 10\relax
   \@tempcnta 10\relax
 \fi
 \ifnum \@tempcnta >\z@
   \advance\@tempcnta \m@ne
 \else
   \!@warning{Oval too small}%
 \fi
 \multiply\@tempcnta 4\relax
 \setbox \@tempboxa \hbox{\@circlefnt \char \@tempcnta}%
 \@tempdima \wd \@tempboxa}

\def\@put#1#2#3{%
 \raise #2\hbox to \z@{\hskip #1#3\hss}}

\def\oval(#1,#2){%
 \@ifnextchar[{\@oval(#1,#2)}{\@oval(#1,#2)[]}}

\def\@oval(#1,#2)[#3]{%
 \begingroup
   \boxmaxdepth \maxdimen
   \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
   \@tfor\@tempa :=#3\do{%
     \csname @ov\@tempa false\endcsname}%
   \@ovxx #1\unitlength
   \@ovyy #2\unitlength
   \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx\else \@ovyy \fi
   \@getcirc \@tempdimb
   \@ovro \ht\@tempboxa
   \@ovri \dp\@tempboxa
   \@ovdx\@ovxx
   \advance\@ovdx -\@tempdima
   \divide\@ovdx \tw@
   \@ovdy\@ovyy
   \advance\@ovdy -\@tempdima
   \divide\@ovdy \tw@
   \@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}

\def\@ovvert#1#2{%
 \vbox to \@ovyy{%
   \if@ovb
     \@tempcntb \@tempcnta
     \advance \@tempcntb by #1\relax
     \kern -\@ovro
     \hbox{\char \@tempcntb}%
     \nointerlineskip
   \else
     \kern \@ovri
     \kern \@ovdy
   \fi
   \leaders\vrule width \@wholewidth\vfil
   \nointerlineskip
   \if@ovt
     \@tempcntb \@tempcnta
     \advance \@tempcntb by #2\relax
     \hbox{\char \@tempcntb}%
   \else
     \kern \@ovdy
     \kern \@ovro
   \fi}}

\def\@ovhorz{%
 \hbox to \@ovxx{%
   \kern \@ovro
   \if@ovr
   \else
     \kern \@ovdx
   \fi
   \leaders \hrule height \@wholewidth \hfil
   \if@ovl
   \else
     \kern \@ovdx
   \fi
   \kern \@ovri}}

\def\circle{%
 \@ifstar{\@dot}{\@circle}}
\def\@circle#1{%
 \begingroup
   \boxmaxdepth \maxdimen
   \@tempdimb #1\unitlength
   \ifdim \@tempdimb >15.5pt\relax
     \@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}

\def\@dot#1{%
 \@tempdimb #1\unitlength
 \@circ\@tempdimb{112}}

\def\@circ#1#2{%
 \@tempdima #1\relax
 \advance\@tempdima .5pt\relax
 \@tempcnta\@tempdima
 \@tempdima 1pt\relax
 \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}

\thinlines

\newcount\@xarg
\newcount\@yarg
\newcount\@yyarg
\newcount\@multicnt
\newdimen\@xdim
\newdimen\@ydim
\newbox\@linechar
\newdimen\@linelen
\newdimen\@clnwd
\newdimen\@clnht

% That's the end of the definitions of lines/vectors/circles/ovals.


% Save LaTeX's meaning of \line
\let\!latexline=\line

% Set variable meaning of line
\def\line{\!ifnextchar(\!latexline\!texline}

\catcode`@=12 \catcode`!=12