diff options
Diffstat (limited to 'macros/latex/base/ltpictur.dtx')
-rw-r--r-- | macros/latex/base/ltpictur.dtx | 1542 |
1 files changed, 1542 insertions, 0 deletions
diff --git a/macros/latex/base/ltpictur.dtx b/macros/latex/base/ltpictur.dtx new file mode 100644 index 0000000000..6b84231ab5 --- /dev/null +++ b/macros/latex/base/ltpictur.dtx @@ -0,0 +1,1542 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 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 2005/12/01 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} + [2016/03/29 v1.1l 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. +% +% \StopEventually{} +% +% +% \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}} +% +% \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}{\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), +% \begin{macrocode} +\long\gdef\picture#1{\pictur@#1} +\gdef\pictur@(#1){% + \@ifnextchar({\@picture(#1)}{\@picture(#1)(0,0)}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@picture} +% \begin{macrocode} +\gdef\@picture(#1,#2)(#3,#4){% + \@picht#2\unitlength + \setbox\@picbox\hb@xt@#1\unitlength\bgroup + \hskip -#3\unitlength + \lower #4\unitlength\hbox\bgroup + \ignorespaces} +% \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} +\gdef\endpicture{% + \egroup\hss\egroup + \ht\@picbox\@picht\dp\@picbox\z@ + \mbox{\box\@picbox}} +% \end{macrocode} +% \end{macro} +% +% 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} +\long\gdef\put(#1,#2)#3{% + \@killglue\raise#2\unitlength + \hb@xt@\z@{\kern#1\unitlength #3\hss}% + \ignorespaces} +% \end{macrocode} +% +% +% \begin{macro}{\multiput} +% \changes{v0.1c}{1994/04/28}{(DPC) Ignore spaces between )(} +% |#3| had better be a |(|. +% \begin{macrocode} +\gdef\multiput(#1,#2)#3{% + \@xdim #1\unitlength + \@ydim #2\unitlength + \@multiput(} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\multiput} +% \changes{v0.1c}{1994/04/28}{(DPC) Macro added} +% \begin{macrocode} +\long\gdef\@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 + \advance\@xdim#1\unitlength\advance\@ydim#2\unitlength}% + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@killglue} +% \begin{macrocode} +\gdef\@killglue{\unskip\@whiledim \lastskip >\z@\do{\unskip}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thinlines} +% \begin{macro}{\thicklines} +% \begin{macrocode} +\gdef\thinlines{\let\@linefnt\tenln \let\@circlefnt\tencirc + \@wholewidth\fontdimen8\tenln \@halfwidth .5\@wholewidth} +\gdef\thicklines{\let\@linefnt\tenlnw \let\@circlefnt\tencircw + \@wholewidth\fontdimen8\tenlnw \@halfwidth .5\@wholewidth} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\linethickness} +% \begin{macrocode} +\gdef\linethickness#1{\@wholewidth #1\relax \@halfwidth .5\@wholewidth} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ishortstack} +% \begin{macrocode} +\gdef\shortstack{\@ifnextchar[\@shortstack{\@shortstack[c]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ishortstack} +% \begin{macrocode} +\gdef\@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} +\gdef\@ishortstack#1{\ialign{\mb@l {##}\unskip\mb@r\cr #1\crcr}\egroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@stackcr} +% \begin{macro}{\@ixstackcr} +% \begin{macrocode} +\gdef\@stackcr{\@ifstar\@ixstackcr\@ixstackcr} +\gdef\@ixstackcr{\@ifnextchar[\@istackcr{\cr\ignorespaces}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@istackcr} +% \begin{macrocode} +\gdef\@istackcr[#1]{\cr\noalign{\vskip #1}\ignorespaces} +% \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} +\gdef\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax + \@linelen #3\unitlength + \ifdim\@linelen<\z@\@badlinearg\else + \ifnum\@xarg =\z@ \@vline + \else \ifnum\@yarg =\z@ \@hline \else \@sline\fi + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@sline} +% \begin{macrocode} +\gdef\@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} +\gdef\@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} +\gdef\@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} +\gdef\vector(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax + \@tempcnta \ifnum\@xarg<\z@ -\@xarg\else\@xarg\fi + \ifnum\@tempcnta<5\relax + \@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} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@hvector} +% \begin{macrocode} +\gdef\@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} +\gdef\@vvector{\ifnum \@yarg <\z@ \@downvector \else \@upvector \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@svector} +% \begin{macrocode} +\gdef\@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} +\gdef\@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} +\gdef\@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} +\gdef\@vline{\ifnum \@yarg <\z@ \@downline \else \@upline\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@upline} +% \begin{macrocode} +\gdef\@upline{% + \hb@xt@\z@{\hskip -\@halfwidth \vrule \@width \@wholewidth + \@height \@linelen \@depth \z@\hss}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@downline} +% \begin{macrocode} +\gdef\@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} +\gdef\@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} +\gdef\@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} +\gdef\dashbox#1(#2,#3){\leavevmode\hb@xt@\z@{\baselineskip \z@skip +\lineskip \z@skip +\@dashdim #2\unitlength +\@dashcnt \@dashdim \advance\@dashcnt 200 +\@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{\vrule \@height \@halfwidth \@depth \@halfwidth +\@width #1\unitlength\hskip #1\unitlength}\@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 }}% +\@dashdim #3\unitlength +\@dashcnt \@dashdim \advance\@dashcnt 200 +\@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 +\setbox\@dashbox\hbox{\vrule \@width \@wholewidth +\@height #1\unitlength}\@tempcnta\z@ +\put(0,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta <\@dashcnt +\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }% +\vskip\@dashdim}}\@tempcnta\z@ +\put(#2,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta<\@dashcnt +\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }% +\vskip\@dashdim}}}\@makepicbox(#2,#3)} +% \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} +\gdef\@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} +\gdef\@put#1#2#3{\raise #2\hb@xt@\z@{\hskip #1#3\hss}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\oval} +% \begin{macrocode} +\gdef\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 +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@oval} +% \begin{macrocode} +\gdef\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen + \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue +% \end{macrocode} +% \changes{v1.1l}{2016/03/29}{initialise tests} +% \begin{macrocode} + \@ovvlinefalse \@ovhlinefalse +% \end{macrocode} +% \begin{macrocode} + \@tfor\reserved@a :=#3\do{\csname @ov\reserved@a false\endcsname}% + \@ovxx #1\unitlength + \@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} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ovvert} +% \begin{macrocode} +\gdef\@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}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ovhorz} +% \begin{macrocode} +\gdef\@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}} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</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>\gdef\@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>\gdef\@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>\gdef\@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} +% +% \begin{macro}{\circle} +% \changes{LaTeX2.09}{1993/08/05} +% {(RMS) Added error message if \cs{circle} is used in math mode.} +% \begin{macrocode} +\gdef\circle{\@inmatherr\circle\@ifstar\@dot\@circle} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@circle} +% \begin{macrocode} +\gdef\@circle#1{% + \begingroup \boxmaxdepth \maxdimen \@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} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@dot} +% Internal form of |\circle*|. +% \begin{macrocode} +\gdef\@dot#1{\@tempdimb #1\unitlength \@circ\@tempdimb{112}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@circ} +% \begin{macrocode} +\gdef\@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}{\yxdim} +% 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 initialisation 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} +\gdef\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} +\gdef\bezier#1)#2(#3)#4({\@bezier#1)(#3)(} +% \end{macrocode} +% +% \begin{macro}{\@bezier} +% \begin{macrocode} +\gdef\@bezier#1(#2,#3)(#4,#5)(#6,#7){% + \ifnum #1=\z@ + \@ovxx #4\unitlength + \advance\@ovxx -#2\unitlength + \ifdim \@ovxx<\z@ \@ovxx -\@ovxx \fi + \@ovdx #6\unitlength + \advance\@ovdx -#4\unitlength + \ifdim \@ovdx<\z@ \@ovdx -\@ovdx \fi + \ifdim \@ovxx<\@ovdx \@ovxx \@ovdx \fi + \@ovyy #5\unitlength + \advance\@ovyy -#3\unitlength + \ifdim \@ovyy<\z@ \@ovyy -\@ovyy \fi + \@ovdy #7\unitlength + \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 + \@ovdx #4\unitlength \advance\@ovdx -#2\unitlength + \multiply\@ovdx \tw@ + \@ovxx #6\unitlength \advance\@ovxx -#2\unitlength + \advance\@ovxx -\@ovdx \divide\@ovxx\@multicnt + \@ovdy #5\unitlength \advance\@ovdy -#3\unitlength + \multiply\@ovdy \tw@ + \@ovyy #7\unitlength \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> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \Finale +% |