Add an initial model for testing TU encodings
[latex2e.git] / latex2e-20160331 / base / ltpictur.dtx
blobe5ca4262c8e77b747daaba49b7fcf43b623a42f3
1 % \iffalse meta-comment
3 % Copyright 1993-2016
4 % The LaTeX3 Project and any individual authors listed elsewhere
5 % in this file.
7 % This file is part of the LaTeX base system.
8 % -------------------------------------------
10 % It may be distributed and/or modified under the
11 % conditions of the LaTeX Project Public License, either version 1.3c
12 % of this license or (at your option) any later version.
13 % The latest version of this license is in
14 %    http://www.latex-project.org/lppl.txt
15 % and version 1.3c or later is part of all distributions of LaTeX
16 % version 2005/12/01 or later.
18 % This file has the LPPL maintenance status "maintained".
20 % The list of all files belonging to the LaTeX base distribution is
21 % given in the file `manifest.txt'. See also `legal.txt' for additional
22 % information.
24 % The list of derived (unpacked) files belonging to the distribution
25 % and covered by LPPL is defined by the unpacking scripts (with
26 % extension .ins) which are part of the distribution.
28 % \fi
30 % \iffalse
31 %%% From File: ltpictur.dtx
32 %<*driver>
33 % \fi
34       \ProvidesFile{ltpictur.dtx}
35                       [2016/03/29 v1.1l LaTeX Kernel (Picture Mode)]
36 % \iffalse
37 \documentclass{ltxdoc}
38 \GetFileInfo{ltpictur.dtx}
39 \title{\filename}
40 \date{\filedate}
41 \author{%
42   Johannes Braams\and
43   David Carlisle\and
44   Alan Jeffrey\and
45   Leslie Lamport\and
46   Frank Mittelbach\and
47   Chris Rowley\and
48   Rainer Sch\"opf}
49 \begin{document}
50  \MaintainedByLaTeXTeam{latex}
51  \maketitle
52  \DocInput{\filename}
53 \end{document}
54 %</driver>
55 % \fi
58 % \changes{v1.0g}{1995/05/07}{Use \cs{hb@xt@}}
59 % \changes{v1.1a}{1995/05/19}{Support autoloading feature}
60 % \changes{v1.1b}{1995/06/13}{Use \cs{ProvidesFile} in autoload}
61 % \changes{v1.1d}{1995/07/12}{allow 2e commands in 209 mode. latex/1737}
62 % \changes{v1.1e}{1995/10/03}{New autoload code}
63 % \changes{v1.1h}{1999/04/15}{Replaced octal numbers, CAR}
64 % \changes{v1.1k}{2015/02/21}{Removed autoload code}
66 % \section{Picture Mode}
67 % Picture mode commands. In addition to the commands available in
68 % \LaTeX2.09,  This section adds the new |\qbezier| command for
69 % drawing curves.
71 % \DescribeMacro{\qbezier}
72 %  |\qbezier|\oarg{N}\parg{AX,AY}\parg{BX,BY}\parg{CX,CY}
73 %  plots a quadratic Bezier curve from \parg{AX,AY} to \parg{CX,CY},
74 %  with \parg{BX,BY}  as the third Bezier point, using $N+1$ points
75 %  equally spaced parametrically.
76 %  If $N = 0$ (the default value), then a sufficient number of points
77 %  are used to draw a connected curve--except that at most
78 %  $|\qbeziermax| + 1$ points are drawn.  A ``point'' is a square of
79 %  side |\@wholewidth|.
81 % \DescribeMacro{\bezier}
82 % In addition, to be compatible with the old |bezier| package, a
83 % variant of this command, |\bezier|, is defined, in which the first
84 % argument is not optional.
86 % \StopEventually{}
89 % \changes{v0.1a}{1994/03/07}{Initial version, split from latex.dtx}
90 % \changes{v0.1a}{1994/03/07}{Long lines wrapped to 72 columns}
91 % \changes{v0.1b}{1994/04/24}
92 %     {Removed surplus spaces after \cs{hbox to } in several cases}
93 % \changes{v0.1d}{1994/05/13}
94 %     {Removed surplus braces from \cs{@if..} constructions}
95 % \changes{v0.1e}{1994/05/22}{Use new warning cmds}
96 % \changes{v1.0f}{1994/11/17}
97 %         {\cs{@tempa} to \cs{reserved@a}}
99 % \begin{oldcomments}
101 %  \unitlength     = value of dimension argument
102 %  \@wholewidth    = current line width
103 %  \@halfwidth     = half of current line width
104 %  \@linefnt       = font for drawing lines
105 %  \@circlefnt     = font for drawing circles
107 % \linethickness{DIM} : Sets the width of horizontal and vertical lines
108 %     in a picture to DIM.  Does not change width of slanted lines
109 %     or circles.   Width of all lines reset by \thinlines and
110 %     \thicklines
112 % \picture(XSIZE,YSIZE)(XORG,YORG)
113 %   BEGIN
114 %     \@picht :=L YSIZE * \unitlength
115 %     box \@picbox :=
116 %          \hb@xt@ XSIZE * \unitlength
117 %            {\hskip -XORG * \unitlength
118 %             \lower YORG * \unitlength
119 %             \hbox{
120 %             \ignorespaces    %% added 13 June 89
121 %   END
123 % \endpicture ==
124 %   BEGIN
125 %                   } \hss }
126 %                   height of \@picbox := \@picht
127 %                   depth  of \@picbox := 0
128 %                   \mbox{\box\@picbox}   %% change 26 Aug 91
129 %   END
131 % \put(X, Y){OBJ} ==
132 %   BEGIN
133 %     \@killglue
134 %     \raise Y * \unitlength  \hb@xt@ 0pt { \hskip X * \unitlength
135 %                                              OBJ \hss             }
136 %     \ignorespaces
137 %   END
139 % \multiput(X,Y)(DELX,DELY){N}{OBJ} ==
140 %   BEGIN
141 %    \@killglue
142 %    \@multicnt := N
143 %    \@xdim  := X * \unitlength
144 %    \@ydim  := Y * \unitlength
145 %    while \@multicnt > 0
146 %      do \raise \@ydim \hb@xt@ 0pt { \hskip \@xdim
147 %                                             OBJ \hss   }
148 %         \@multicnt := \@multicnt - 1
149 %         \@xdim     := \@xdim + DELX * \unitlength
150 %         \@ydim     := \@ydim + DELY * \unitlength
151 %      od
152 %    \ignorespaces
153 %   END
155 %  \shortstack[POS]{TEXT} : Makes a \vbox containing TEXT stacked as
156 %      a one-column array, positioned l, r or c as indicated by POS.
158 % \end{oldcomments}
160 % The `2ekernel' code ensures that a |\usepackage{autopict}| is
161 % essentially ignored if a `full' format is being used that has
162 % picture mode already in the format.
163 %    \begin{macrocode}
164 %<2ekernel>\expandafter\let\csname ver@autopict.sty\endcsname\fmtversion
165 %    \end{macrocode}
167 % \begin{macro}{\@wholewidth}
168 % \begin{macro}{\@halfwidth}
169 %    \begin{macrocode}
170 %<*2ekernel>
171 \newdimen\@wholewidth
172 \newdimen\@halfwidth
173 %    \end{macrocode}
174 % \end{macro}
175 % \end{macro}
177 % \begin{macro}{\unitlength}
178 %    \begin{macrocode}
179 \newdimen\unitlength \unitlength =1pt
180 %    \end{macrocode}
181 % \end{macro}
183 % \begin{macro}{\@picbox}
184 % \begin{macro}{\@picht}
185 %    \begin{macrocode}
186 \newbox\@picbox
187 \newdimen\@picht
188 %    \end{macrocode}
189 % \end{macro}
190 % \end{macro}
192 % \begin{macro}{\picture}
193 % \changes{v0.1c}{1994/04/28}{(DPC) Ignore spaces before (}
194 %  |#1| should be white space.
195 % \begin{macro}{\pictur@}
196 % \changes{v1.0h}{1995/05/12}{Macro added for latex/1355}
197 %  |#1| should be a |(| (eating any white space before the bracket),
198 %    \begin{macrocode}
199 \long\gdef\picture#1{\pictur@#1}
200 \gdef\pictur@(#1){%
201   \@ifnextchar({\@picture(#1)}{\@picture(#1)(0,0)}}
202 %    \end{macrocode}
203 % \end{macro}
204 % \end{macro}
206 % \begin{macro}{\@picture}
207 %    \begin{macrocode}
208 \gdef\@picture(#1,#2)(#3,#4){%
209   \@picht#2\unitlength
210   \setbox\@picbox\hb@xt@#1\unitlength\bgroup
211     \hskip -#3\unitlength
212     \lower #4\unitlength\hbox\bgroup
213       \ignorespaces}
214 %    \end{macrocode}
215 % \end{macro}
217 % \begin{macro}{\endpicture}
218 % \changes{LaTeX2.09}{1991/08/26}
219 %     {(RmS \& FMi) extra boxing level around \cs{@picbox}
220 %     to guard against unboxing in math mode
221 %     (proposed by John Hobby)}
223 %    \begin{macrocode}
224 \gdef\endpicture{%
225   \egroup\hss\egroup
226     \ht\@picbox\@picht\dp\@picbox\z@
227     \mbox{\box\@picbox}}
228 %    \end{macrocode}
229 % \end{macro}
231 % In the definitions of |\put| and |\multiput|, |\hskip| was replaced by
232 % |\kern| just in case arg |#3| = ``plus''.  (Bug detected by Don Knuth.
233 % changed 20 Jul 87).
235 %    \begin{macrocode}
236 \long\gdef\put(#1,#2)#3{%
237   \@killglue\raise#2\unitlength
238   \hb@xt@\z@{\kern#1\unitlength #3\hss}%
239   \ignorespaces}
240 %    \end{macrocode}
243 % \begin{macro}{\multiput}
244 % \changes{v0.1c}{1994/04/28}{(DPC) Ignore spaces between )(}
245 % |#3| had better be a |(|.
246 %    \begin{macrocode}
247 \gdef\multiput(#1,#2)#3{%
248   \@xdim #1\unitlength
249   \@ydim #2\unitlength
250    \@multiput(}
251 %    \end{macrocode}
252 % \end{macro}
254 % \begin{macro}{\multiput}
255 % \changes{v0.1c}{1994/04/28}{(DPC) Macro added}
256 %    \begin{macrocode}
257 \long\gdef\@multiput(#1,#2)#3#4{%
258   \@killglue\@multicnt #3\relax
259   \@whilenum \@multicnt >\z@\do
260     {\raise\@ydim\hb@xt@\z@{\kern\@xdim #4\hss}%
261      \advance\@multicnt\m@ne
262      \advance\@xdim#1\unitlength\advance\@ydim#2\unitlength}%
263   \ignorespaces}
264 %    \end{macrocode}
265 % \end{macro}
267 % \begin{macro}{\@killglue}
268 %    \begin{macrocode}
269 \gdef\@killglue{\unskip\@whiledim \lastskip >\z@\do{\unskip}}
270 %    \end{macrocode}
271 % \end{macro}
273 % \begin{macro}{\thinlines}
274 % \begin{macro}{\thicklines}
275 %    \begin{macrocode}
276 \gdef\thinlines{\let\@linefnt\tenln \let\@circlefnt\tencirc
277   \@wholewidth\fontdimen8\tenln \@halfwidth .5\@wholewidth}
278 \gdef\thicklines{\let\@linefnt\tenlnw \let\@circlefnt\tencircw
279   \@wholewidth\fontdimen8\tenlnw \@halfwidth .5\@wholewidth}
280 %    \end{macrocode}
281 % \end{macro}
282 % \end{macro}
284 % \begin{macro}{\linethickness}
285 %    \begin{macrocode}
286 \gdef\linethickness#1{\@wholewidth #1\relax \@halfwidth .5\@wholewidth}
287 %    \end{macrocode}
288 % \end{macro}
290 % \begin{macro}{\ishortstack}
291 %    \begin{macrocode}
292 \gdef\shortstack{\@ifnextchar[\@shortstack{\@shortstack[c]}}
293 %    \end{macrocode}
294 % \end{macro}
296 % \begin{macro}{\@ishortstack}
297 %    \begin{macrocode}
298 \gdef\@shortstack[#1]{%
299   \leavevmode
300   \vbox\bgroup
301     \baselineskip-\p@\lineskip 3\p@
302     \let\mb@l\hss\let\mb@r\hss
303     \expandafter\let\csname mb@#1\endcsname\relax
304     \let\\\@stackcr
305     \@ishortstack}
306 %    \end{macrocode}
307 % \end{macro}
310 % \changes{LaTeX2.09}{1991/08/14}
311 %         {(RmS) inserted extra braces around entry for NFSS}
312 % \changes{LaTeX2.09}{1993/11/03}
313 %         {(RmS) changed \cs{halign} to \cs{ialign} to initialize
314 %              \cs{tabskip} and \cs{everycr}}
316 % \begin{macro}{\@ishortstack}
317 %    \begin{macrocode}
318 \gdef\@ishortstack#1{\ialign{\mb@l {##}\unskip\mb@r\cr #1\crcr}\egroup}
319 %    \end{macrocode}
320 % \end{macro}
322 % \begin{macro}{\@stackcr}
323 % \begin{macro}{\@ixstackcr}
324 %    \begin{macrocode}
325 \gdef\@stackcr{\@ifstar\@ixstackcr\@ixstackcr}
326 \gdef\@ixstackcr{\@ifnextchar[\@istackcr{\cr\ignorespaces}}
327 %    \end{macrocode}
328 % \end{macro}
329 % \end{macro}
331 % \begin{macro}{\@istackcr}
332 %    \begin{macrocode}
333 \gdef\@istackcr[#1]{\cr\noalign{\vskip #1}\ignorespaces}
334 %    \end{macrocode}
335 % \end{macro}
337 % \begin{oldcomments}
338 % \line(X,Y){LEN} ==
339 % BEGIN
340 %  \@xarg    := X
341 %  \@yarg    := Y
342 %  \@linelen := LEN * \unitlength
343 %  if \@xarg = 0
344 %     then \@vline
345 %     else if \@yarg = 0
346 %            then \@hline
347 %            else \@sline
348 %          if
349 %  if
350 % END
352 % \@sline ==
353 %  BEGIN
354 %    if \@xarg < 0
355 %      then @negarg := T
356 %           \@xarg  := -\@xarg
357 %           \@yyarg := -\@yarg
358 %      else @negarg := F
359 %           \@yyarg := \@yarg
360 %    fi
361 %    \@tempcnta := |\@yyarg|
362 %    if \@tempcnta > 6
363 %      then error: 'LATEX ERROR: Illegal \line or \vector argument.'
364 %           \@tempcnta := 0
365 %    fi
366 %    \box\@linechar := \hbox{\@linefnt \@getlinechar(\@xarg,\@yyarg) }
367 %     if \@yarg > 0 then \@upordown = \raise
368 %                         \@clnht := 0
369 %                   else \@upordown = \lower
370 %                        \@clnht := height of \box\@linechar
371 %     fi
372 %     \@clnwd  := width of \box\@linechar
373 %     if @negarg
374 %       then \hskip - width of \box\@linechar
375 %            \reserved@a == \hskip - 2* width of box \@linechar
376 %       else \reserved@a == \relax
377 %     fi
378 %  %% Put out integral number of line segments
379 %     while \@clnwd <  \@linelen
380 %       do  \@upordown \@clnht \copy\@linechar
381 %           \reserved@a
382 %           \@clnht := \@clnht + ht of \box\@linechar
383 %           \@clnwd := \@clnwd + width of \box\@linechar
384 %       od
386 %  %% Put out last segment
387 %     \@clnht := \@clnht - height of \box\@linechar
388 %     \@clnwd := \@clnwd - width of \box\@linechar
389 %     \@tempdima   := \@linelen - \@clnwd
390 %     \@tempdimb   := \@tempdima - width of \box\@linechar
391 %     if @negarg  then \hskip -\@tempdimb
392 %                 else \hskip  \@tempdimb
393 %     fi
394 %     \@tempdima   := 1000 * \@tempdima
395 %     \@tempcnta   := \@tempdima / width of \box\@linechar
396 %     \@tempdima   := (\@tempcnta * ht of \box\@linechar)/1000
397 %     \@clnht := \@clnht + \@tempdima
398 %     if \@linelen < width of box\@linechar
399 %         then \hskip width of box\@linechar
400 %         else \hbox{\@upordown \@clnht \copy\@linechar}
401 %     fi
402 % END
404 % \@hline ==
405 %   BEGIN
406 %     if \@xarg < 0 then  \hskip -\@linelen \fi
407 %     \vrule height \@halfwidth depth \@halfwidth width \@linelen
408 %     if \@xarg < 0 then  \hskip -\@linelen \fi
409 %  END
411 % \@vline == if \@yarg < 0 \@downline else \@upline  fi
414 % \@getlinechar(X,Y) ==
415 %   BEGIN
416 %     \@tempcnta := 8*X - 9
417 %     if Y > 0
418 %       then \@tempcnta := \@tempcnta + Y
419 %       else \@tempcnta := \@tempcnta - Y + 64
420 %     fi
421 %     \char\@tempcnta
422 %   END
424 % \vector(X,Y){LEN} ==
425 % BEGIN
426 %  \@xarg    := X
427 %  \@yarg    := Y
428 %  \@linelen := LEN * \unitlength
429 %  if \@xarg = 0
430 %     then \@vvector
431 %     else if \@yarg = 0
432 %            then \@hvector
433 %            else \@svector
434 %          if
435 %  if
436 % END
438 % \@hvector ==
439 %   BEGIN
440 %     \@hline
441 %     {\@linefnt if \@xarg < 0 then  \@getlarrow(1,0)
442 %                              else  \@getrarrow(1,0)
443 %                 fi}
444 %   END
446 % \@vvector == if \@yarg < 0 \@downvector else \@upvector  fi
448 % \@svector ==
449 %  BEGIN
450 %   \@sline
451 %   \@tempcnta := |\@yarg|
452 %     if  \@tempcnta < 5
453 %        then  \hskip - width of \box\@linechar
454 %              \@upordown \@clnht \hbox
455 %                       {\@linefnt
456 %                        if @negarg then \@getlarrow(\@xarg,\@yyarg)
457 %                                   else \@getrarrow(\@xarg,\@yyarg)
458 %                        fi }
459 %        else  error: 'LATEX ERROR: Illegal \line or \vector argument.'
460 %     fi
461 %  END
463 % \@getlarrow(X,Y) ==
464 %  BEGIN
465 %   if Y = 0
466 %     then \@tempcnta := '33
467 %     else \@tempcnta := 16 * X  -  9
468 %          \@tempcntb := 2 * Y
469 %          if \@tempcntb > 0
470 %            then  \@tempcnta := \@tempcnta  +  \@tempcntb
471 %            else  \@tempcnta := \@tempcnta  -  \@tempcntb +  64
472 %          fi
473 %   fi
474 %   \char\@tempcnta
475 %  END
477 % \@getrarrow(X,Y) ==
478 %  BEGIN
479 %   \@tempcntb := |Y|
480 %   case of \@tempcntb
481 %     0 : \@tempcnta := '55
482 %     1 : if X < 3
483 %           then \@tempcnta :=  24*X - 6
484 %           else if X = 3
485 %                  then \@tempcnta := 49
486 %                  else \@tempcnta := 58  fi
487 %         fi
488 %     2 : if X < 3
489 %           then \@tempcnta :=  24*X - 3
490 %           else \@tempcnta := 51     % X must = 3
491 %         fi
492 %     3 : \@tempcnta := 16*X - 2
493 %     4 : \@tempcnta := 16*X + 7
494 %   endcase
495 %   if Y < 0
496 %     then \@tempcnta := \@tempcnta + 64
497 %   fi
498 %   \char\@tempcnta
499 %  END
500 % \end{oldcomments}
502 % \begin{macro}{\if@negarg}
503 %    \begin{macrocode}
504 \newif\if@negarg
505 %    \end{macrocode}
506 % \end{macro}
508 % \begin{macro}{\line}
509 %    \begin{macrocode}
510 \gdef\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
511   \@linelen #3\unitlength
512   \ifdim\@linelen<\z@\@badlinearg\else
513     \ifnum\@xarg =\z@ \@vline
514       \else \ifnum\@yarg =\z@ \@hline \else \@sline\fi
515     \fi
516   \fi}
517 %    \end{macrocode}
518 % \end{macro}
520 % \begin{macro}{\@sline}
521 %    \begin{macrocode}
522 \gdef\@sline{%
523   \ifnum\@xarg<\z@ \@negargtrue \@xarg -\@xarg \@yyarg -\@yarg
524   \else \@negargfalse \@yyarg \@yarg \fi
525 \ifnum \@yyarg >\z@ \@tempcnta\@yyarg \else \@tempcnta -\@yyarg \fi
526 \ifnum\@tempcnta>6 \@badlinearg\@tempcnta\z@ \fi
527 \ifnum\@xarg>6 \@badlinearg\@xarg \@ne \fi
528 \setbox\@linechar\hbox{\@linefnt\@getlinechar(\@xarg,\@yyarg)}%
529 %    \end{macrocode}
530 %    If we have something like |\line(5,5){30}| the |\@linechar| will
531 %    not contain a char and later on we will end in an infinite loop.
532 %    So we check the width of the box and put in something as an
533 %    emergency fix if necessary.
534 % \changes{v1.1k}{2003/08/27}{check for \cs{@linechar} being empty pr/3570}
535 %    \begin{macrocode}
536 \ifdim\wd\@linechar=\z@
537    \setbox\@linechar\hbox{.}%
538    \@badlinearg
540 \ifnum \@yarg >\z@ \let\@upordown\raise \@clnht\z@
541    \else\let\@upordown\lower \@clnht \ht\@linechar\fi
542 \@clnwd \wd\@linechar
543 \if@negarg
544   \hskip -\wd\@linechar \def\reserved@a{\hskip -2\wd\@linechar}%
545 \else
546      \let\reserved@a\relax
548 \@whiledim \@clnwd <\@linelen \do
549   {\@upordown\@clnht\copy\@linechar
550    \reserved@a
551    \advance\@clnht \ht\@linechar
552    \advance\@clnwd \wd\@linechar}%
553 \advance\@clnht -\ht\@linechar
554 \advance\@clnwd -\wd\@linechar
555 \@tempdima\@linelen\advance\@tempdima -\@clnwd
556 \@tempdimb\@tempdima\advance\@tempdimb -\wd\@linechar
557 \if@negarg \hskip -\@tempdimb \else \hskip \@tempdimb \fi
558 \multiply\@tempdima \@m
559 \@tempcnta \@tempdima
560 \@tempdima \wd\@linechar \divide\@tempcnta \@tempdima
561 \@tempdima \ht\@linechar \multiply\@tempdima \@tempcnta
562 \divide\@tempdima \@m
563 \advance\@clnht \@tempdima
564 \ifdim \@linelen <\wd\@linechar
565    \hskip \wd\@linechar
566 %    \end{macrocode}
567 %    Warn if line gets so short that it can't be printed.
568 % \changes{v1.1g}{1997/09/15}{Warn if lines become invisible pr/2524}
569 %    But don't warn if it is exactly zero since that was probably
570 %    deliberate (e.g., to get a vector head only).
571 % \changes{v1.1j}{2001/06/04}{Don't warn for exactly zero pr/3318}
572 %    \begin{macrocode}
573    \ifdim \@linelen = \z@
574    \else
575      \@picture@warn
576    \fi
577    \else\@upordown\@clnht\copy\@linechar\fi}
578 %    \end{macrocode}
579 % \end{macro}
581 % \begin{macro}{\@hline}
582 %    \begin{macrocode}
583 \gdef\@hline{\ifnum \@xarg <\z@ \hskip -\@linelen \fi
584 \vrule \@height \@halfwidth \@depth \@halfwidth \@width \@linelen
585 \ifnum \@xarg <\z@ \hskip -\@linelen \fi}
586 %    \end{macrocode}
587 % \end{macro}
589 % \begin{macro}{\getlinechar}
590 %    \begin{macrocode}
591 \gdef\@getlinechar(#1,#2){\@tempcnta#1\relax\multiply\@tempcnta 8%
592   \advance\@tempcnta -9\ifnum #2>\z@ \advance\@tempcnta #2\relax\else
593   \advance\@tempcnta -#2\relax\advance\@tempcnta 64 \fi
594   \char\@tempcnta}
595 %    \end{macrocode}
596 % \end{macro}
598 % \begin{macro}{\vector}
599 %    \begin{macrocode}
600 \gdef\vector(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
601   \@tempcnta \ifnum\@xarg<\z@ -\@xarg\else\@xarg\fi
602   \ifnum\@tempcnta<5\relax
603   \@linelen #3\unitlength
604   \ifdim\@linelen<\z@\@badlinearg\else
605     \ifnum\@xarg =\z@ \@vvector
606       \else \ifnum\@yarg =\z@ \@hvector \else \@svector\fi
607     \fi
608   \fi
609   \else\@badlinearg\fi}
610 %    \end{macrocode}
611 % \end{macro}
613 % \begin{macro}{\@hvector}
614 %    \begin{macrocode}
615 \gdef\@hvector{\@hline\hb@xt@\z@{\@linefnt
616  \ifnum \@xarg <\z@ \@getlarrow(1,0)\hss\else
617     \hss\@getrarrow(1,0)\fi}}
618 %    \end{macrocode}
619 % \end{macro}
621 % \begin{macro}{\@vvector}
622 %    \begin{macrocode}
623 \gdef\@vvector{\ifnum \@yarg <\z@ \@downvector \else \@upvector \fi}
624 %    \end{macrocode}
625 % \end{macro}
627 % \begin{macro}{\@svector}
628 %    \begin{macrocode}
629 \gdef\@svector{\@sline
630   \@tempcnta\@yarg \ifnum\@tempcnta <\z@ \@tempcnta -\@tempcnta\fi
631   \ifnum\@tempcnta <5%
632     \hskip -\wd\@linechar
633     \@upordown\@clnht \hbox{\@linefnt  \if@negarg
634     \@getlarrow(\@xarg,\@yyarg)\else \@getrarrow(\@xarg,\@yyarg)\fi}%
635   \else\@badlinearg\fi}
636 %    \end{macrocode}
637 % \end{macro}
639 % \begin{macro}{\@getlarrow}
640 % \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR}
641 %    \begin{macrocode}
642 \gdef\@getlarrow(#1,#2){\ifnum #2=\z@ \@tempcnta 27 % '33
643   \else
644   \@tempcnta #1\relax\multiply\@tempcnta \sixt@@n
645   \advance\@tempcnta -9 \@tempcntb #2\relax\multiply\@tempcntb \tw@
646   \ifnum \@tempcntb >\z@ \advance\@tempcnta \@tempcntb
647   \else\advance\@tempcnta -\@tempcntb\advance\@tempcnta 64
648   \fi\fi\char\@tempcnta}
649 %    \end{macrocode}
650 % \end{macro}
652 % \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR}
653 % \begin{macro}{\@getrarrow}
654 %    \begin{macrocode}
655 \gdef\@getrarrow(#1,#2){\@tempcntb #2\relax
656 \ifnum\@tempcntb <\z@ \@tempcntb -\@tempcntb\relax\fi
657 \ifcase \@tempcntb\relax \@tempcnta 45  % '55
659 \ifnum #1<\thr@@ \@tempcnta #1\relax\multiply\@tempcnta
660 24\advance\@tempcnta -6 \else \ifnum #1=\thr@@ \@tempcnta 49
661 \else\@tempcnta 58 \fi\fi\or
662 \ifnum #1<\thr@@ \@tempcnta=#1\relax\multiply\@tempcnta
663 24\advance\@tempcnta -\thr@@ \else \@tempcnta 51 \fi\or
664 \@tempcnta #1\relax\multiply\@tempcnta
665 \sixt@@n \advance\@tempcnta -\tw@ \else
666 \@tempcnta #1\relax\multiply\@tempcnta
667 \sixt@@n \advance\@tempcnta 7 \fi\ifnum #2<\z@ \advance\@tempcnta 64 \fi
668 \char\@tempcnta}
669 %    \end{macrocode}
670 % \end{macro}
672 % \begin{macro}{\@vline}
673 %    \begin{macrocode}
674 \gdef\@vline{\ifnum \@yarg <\z@ \@downline \else \@upline\fi}
675 %    \end{macrocode}
676 % \end{macro}
678 % \begin{macro}{\@upline}
679 %    \begin{macrocode}
680 \gdef\@upline{%
681   \hb@xt@\z@{\hskip -\@halfwidth \vrule \@width \@wholewidth
682    \@height \@linelen \@depth \z@\hss}}
683 %    \end{macrocode}
684 % \end{macro}
686 % \begin{macro}{\@downline}
687 %    \begin{macrocode}
688 \gdef\@downline{%
689   \hb@xt@\z@{\hskip -\@halfwidth \vrule \@width \@wholewidth
690    \@height \z@ \@depth \@linelen \hss}}
691 %    \end{macrocode}
692 % \end{macro}
694 % \begin{macro}{\@upvector}
695 % \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR}
696 % \changes{v1.1i}{2000/01/15}{Removed space at end-of-line, CAR}
697 %    \begin{macrocode}
698 \gdef\@upvector{\@upline\setbox\@tempboxa\hbox{\@linefnt\char 54}% '66
699   \raise \@linelen \hb@xt@\z@{\lower \ht\@tempboxa\box\@tempboxa\hss}}
700 %    \end{macrocode}
701 % \end{macro}
703 % \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR}
704 % \begin{macro}{\@downvector}
705 %    \begin{macrocode}
706 \gdef\@downvector{\@downline\lower \@linelen
707       \hb@xt@\z@{\@linefnt\char 63  % '77
708       \hss}}
709 %    \end{macrocode}
710 % \end{macro}
712 % \begin{oldcomments}
713 % \dashbox{D}(X,Y) ==
714 %  BEGIN
715 %  leave vertical mode
716 %  \hb@xt@ 0pt {
717 %       \baselineskip := 0pt
718 %       \lineskip     := 0pt
719 %  %% HORIZONTAL DASHES
720 %       \@dashdim := X * \unitlength
721 %       \@dashcnt := \@dashdim + 200 % to prevent roundoff error
722 %       \@dashdim := D * \unitlength
723 %       \@dashcnt := \@dashcnt / \@dashdim
724 %       if \@dashcnt is odd
725 %         then \@dashdim := 0pt
726 %              \@dashcnt := (\@dashcnt + 1) / 2
727 %         else \@dashdim := \@dashdim / 2
728 %              \@dashcnt := \@dashcnt / 2 - 1
729 %              \box\@dashbox   := \hbox{\vrule height \@halfwidth
730 %                             depth \@halfwidth width \@dashdim}
731 %              \put(0,0){\copy\@dashbox}
732 %              \put(0,Y){\copy\@dashbox}
733 %              \put(X,0){\hskip -\@dashdim\copy\@dashbox}
734 %              \put(X,Y){\hskip -\@dashdim\box\@dashbox}
735 %              \@dashdim := 3 * \@dashdim
736 %       fi
737 %       \box\@dashbox := \hbox{\vrule height \@halfwidth
738 %                         depth \@halfwidth width D * \unitlength
739 %                         \hskip D * \unitlength}
740 %       \@tempcnta := 0
741 %       \put(0,0){\hskip \@dashdim
742 %                while \@tempcnta < \@dascnt
743 %                  do \copy\@dashbox
744 %                     \@tempcnta := \@tempcnta + 1
745 %                  od
746 %               }
747 %       \@tempcnta := 0
748 %       put(0,Y){\hskip \@dashdim
749 %                while \@tempcnta < \@dascnt
750 %                  do \copy\@dashbox
751 %                     \@tempcnta := \@tempcnta + 1
752 %                  od
753 %               }
755 % %% vertical dashes
756 %       \@dashdim := Y * \unitlength
757 %       \@dashcnt := \@dashdim + 200 % to prevent roundoff error
758 %       \@dashdim := D * \unitlength
759 %       \@dashcnt := \@dashcnt / \@dashdim
760 %       if \@dashcnt is odd
761 %         then \@dashdim := 0pt
762 %              \@dashcnt := (\@dashcnt + 1) / 2
763 %         else \@dashdim := \@dashdim / 2
764 %              \@dashcnt := \@dashcnt / 2 - 1
765 %              \box\@dashbox   := \hbox{\hskip -\@halfwidth
766 %                                       \vrule width \@wholewidth
767 %                                                height \@dashdim  }
768 %              \put(0,0){\copy\@dashbox}
769 %              \put(X,0){\copy\@dashbox}
770 %              \put(0,Y){\lower\@dashdim\copy\@dashbox}
771 %              \put(X,Y){\lower\@dashdim\copy\@dashbox}
772 %              \@dashdim := 3 * \@dashdim
773 %       fi
774 %       \box\@dashbox := \hbox{\vrule width \@wholewidth
775 %                                 height D * \unitlength       }
776 %       \@tempcnta := 0
777 %       put(0,0){\hskip -\halfwidth
778 %                \vbox{while \@tempcnta < \@dashcnt
779 %                       do \vskip D*\unitlength
780 %                          \copy\@dashbox
781 %                          \@tempcnta := \@tempcnta + 1
782 %                       od
783 %                      \vskip \@dashdim
784 %                     } }
785 %       \@tempcnta := 0
786 %       put(X,0){\hskip -\halfwidth
787 %                \vbox{while \@tempcnta < \@dashcnt
788 %                       do \vskip D*\unitlength
789 %                          \copy\@dashbox
790 %                          \@tempcnta := \@tempcnta + 1
791 %                       od
792 %                      \vskip \@dashdim
793 %                     }
794 %               }
795 %    }     % END DASHES
797 %  \@imakepicbox(X,Y)
798 % END
799 % \end{oldcomments}
801 % \begin{macro}{\dashbox}
802 %    \begin{macrocode}
803 \gdef\dashbox#1(#2,#3){\leavevmode\hb@xt@\z@{\baselineskip \z@skip
804 \lineskip \z@skip
805 \@dashdim #2\unitlength
806 \@dashcnt \@dashdim \advance\@dashcnt 200
807 \@dashdim #1\unitlength\divide\@dashcnt \@dashdim
808 \ifodd\@dashcnt\@dashdim \z@
809 \advance\@dashcnt \@ne \divide\@dashcnt \tw@
810 \else \divide\@dashdim \tw@ \divide\@dashcnt \tw@
811 \advance\@dashcnt \m@ne
812 \setbox\@dashbox \hbox{\vrule \@height \@halfwidth \@depth \@halfwidth
813 \@width \@dashdim}\put(0,0){\copy\@dashbox}%
814 \put(0,#3){\copy\@dashbox}%
815 \put(#2,0){\hskip-\@dashdim\copy\@dashbox}%
816 \put(#2,#3){\hskip-\@dashdim\box\@dashbox}%
817 \multiply\@dashdim \thr@@
819 \setbox\@dashbox \hbox{\vrule \@height \@halfwidth \@depth \@halfwidth
820 \@width #1\unitlength\hskip #1\unitlength}\@tempcnta\z@
821 \put(0,0){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
822 \do{\copy\@dashbox\advance\@tempcnta \@ne }}\@tempcnta\z@
823 \put(0,#3){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
824 \do{\copy\@dashbox\advance\@tempcnta \@ne }}%
825 \@dashdim #3\unitlength
826 \@dashcnt \@dashdim \advance\@dashcnt 200
827 \@dashdim #1\unitlength\divide\@dashcnt \@dashdim
828 \ifodd\@dashcnt \@dashdim \z@
829 \advance\@dashcnt \@ne \divide\@dashcnt \tw@
830 \else
831 \divide\@dashdim \tw@ \divide\@dashcnt \tw@
832 \advance\@dashcnt \m@ne
833 \setbox\@dashbox\hbox{\hskip -\@halfwidth
834 \vrule \@width \@wholewidth
835 \@height \@dashdim}\put(0,0){\copy\@dashbox}%
836 \put(#2,0){\copy\@dashbox}%
837 \put(0,#3){\lower\@dashdim\copy\@dashbox}%
838 \put(#2,#3){\lower\@dashdim\copy\@dashbox}%
839 \multiply\@dashdim \thr@@
841 \setbox\@dashbox\hbox{\vrule \@width \@wholewidth
842 \@height #1\unitlength}\@tempcnta\z@
843 \put(0,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta <\@dashcnt
844 \do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }%
845 \vskip\@dashdim}}\@tempcnta\z@
846 \put(#2,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta<\@dashcnt
847 \do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }%
848 \vskip\@dashdim}}}\@makepicbox(#2,#3)}
849 %    \end{macrocode}
850 % \end{macro}
852 % \begin{oldcomments}
853 % CIRCLES AND OVALS
855 %  USER COMMANDS:
857 %  \circle{D} : Produces the circle with the diameter as close as
858 %               possible to D * \unitlength.  \put(X,Y){\circle{D}}
859 %               puts the circle with its center at (X,Y).
861 %  \oval(X,Y) : Makes an oval as round as possible that fits in the
862 %               rectangle of width X * \unitlength and height
863 %               Y * \unitlength. The reference point is the center.
865 % \oval(X,Y)[POS] : Save as \oval(X,Y) except it draws only the
866 %                   half or quadrant of the oval indicated by POS.
867 %                   E.G., \oval(X,Y)[t] draws just the top half
868 %                   and \oval(X,Y)[br] draws just the bottom right
869 %                   quadrant.  In all cases, the reference point is
870 %                   the same as the unqualified \oval(X,Y) command.
872 % \@ovvert {DELTA1} {DELTA2} : Makes a vbox containing either the left
873 %    side or the right side of the oval being constructed.  The baseline
874 %    will coincide with the outside bottom edge of the oval; the left
875 %    side of the box will coincide with the left edge of the vertical
876 %    rule.  The width of the box will be \@tempdima.
877 %    DELTA1 and DELTA2 are added to the character number in \@tempcnta
878 %    to get the characters for the top and bottom quarter circle pieces.
880 % \@ovhorz : Makes an hbox containing the straight rule for either the
881 %         top or the bottom of the oval being constructed.  The baseline
882 %         will coincide with bottom edge of the rule; the left side of
883 %         the box will coincide with the left side of the oval.
884 %         The width of the box will be \@ovxx.
886 % \@getcirc {DIAM} : Sets \@tempcnta to the character number
887 %               of the top-right quarter circle with the largest
888 %               diameter less than or equal to DIAM.
889 %               Sets \@tempboxa to an hbox containing that character.
890 %               Sets \@tempdima to \wd \@tempboxa, which is the distance
891 %               from the circle's left outside edge to its right
892 %               inside edge.
893 %               (These characters are like those described in the
894 %               TeXbook, pp. 389-90.)
896 % \@getcirc {DIAM} ==
897 %   BEGIN
898 %     \@tempcnta       := integer coercion of (DIAM + 2pt)
899 %                                           + 2pt added 1 Nov 88
900 %     \@tempcnta       := \@tempcnta / integer coercion of 4pt
901 %     if \@tempcnta > 10
902 %       then \@tempcnta := 10 fi
903 %     if \@tempcnta > 0
904 %       then \@tempcnta := \@tempcnta-1
905 %       else LaTeX Warning: Oval too small.
906 %     fi
907 %     \@tempcnta       := 4 * \@tempcnta
908 %     \@tempboxa       := \hbox{\@circlefnt \char \@tempcnta}
909 %     \@tempdima       := \wd \@tempboxa
910 %   END
912 % \@put{X}{Y}{OBJ} ==
913 %   BEGIN
914 %     \raise Y \hb@xt@ 0pt{\hskip X OBJ \hss}
915 %   END
917 % \@oval(X,Y)[POS] ==
918 %   BEGIN
919 %     \begingroup
920 %       \boxmaxdepth := \maxdimen
921 %       @ovt := @ovb := @ovl := @ovr := true
922 %       for all E in POS
923 %         do  @ovE := false od
924 %       \@ovxx      := X * \unitlength
925 %       \@ovyy      := Y * \unitlength
926 %       \@tempdimb := min(\@ovxx,\@ovyy)
927 %       \@getcirc{\@tempdimb-2pt}   %% "-2pt" added 7 Dec 89
928 %       \@ovro     := \ht \@tempboxa
929 %       \@ovri     := \dp \@tempboxa
930 %       \@ovdx     := \@ovxx - \@tempdima
931 %       \@ovdx     := \@ovdx/2
932 %       \@ovdy     := \@ovyy - \@tempdima
933 %       \@ovdy     := \@ovyy/2
934 %       \@circlefnt
935 %       \@tempboxa :=
936 %           \hbox{
937 %                 if @ovr
938 %                   then \@ovvert{3}{2} \kern -\@tempdima
939 %                 fi
940 %                 if @ovl
941 %                   then \kern \@ovxx \@ovvert{0}{1} \kern -\@tempdima
942 %                        \kern -\@ovxx
943 %                 fi
944 %                 if @ovt
945 %                   then \@ovhorz \kern -\@ovxx
946 %                 fi
947 %                 if @ovb
948 %                   then \raise \@ovyy \@ovhorz
949 %                 fi
950 %                }
951 %       \@ovdx    := \@ovdx + \@ovro
952 %       \@ovdy    := \@ovdy + \@ovro
953 %      \ht\@tempboxa := \dp\@tempboxa := 0
954 %       \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}
955 %    \endgroup
956 %   END
958 % \@ovvert {DELTA1} {DELTA2} ==
959 %   BEGIN
960 %      \vbox to \@ovyy {
961 %                      if @ovb
962 %                        then \@tempcntb := \@tempcnta + DELTA1
963 %                             \kern -\@ovro
964 %                             \hbox { \char \@tempcntb }
965 %                             \nointerlineskip
966 %                        else \kern \@ovri \kern \@ovdy
967 %                      fi
968 %                      \leaders \vrule width \@wholewidth \vfil
969 %                      \nointerlineskip
970 %                      if @ovt
971 %                        then \@tempcntb := \@tempcnta + DELTA2
972 %                             \hbox { \char \@tempcntb }
973 %                        else \kern \@ovdy \kern \@ovro
974 %                      fi
975 %                     }
976 %   END
978 % \@ovhorz ==
979 %   BEGIN
980 %    \hb@xt@ \@ovxx{
981 %                   \kern \@ovro
982 %                   if @ovr
983 %                     then
984 %                     else \kern \@ovdx
985 %                   fi
986 %                   \leaders \hrule height \@wholewidth \hfil
987 %                   if @ovl
988 %                     then
989 %                     else \kern \@ovdx
990 %                   fi
991 %                   \kern \@ovri
992 %                  }
993 %   END
995 % \circle{DIAM} ==
996 %   BEGIN
997 %    \begingroup
998 %    \boxmaxdepth := maxdimen
999 %    \@tempdimb := DIAM *\unitlength
1000 %    if \@tempdimb > 15.5pt
1001 %      then \@getcirc{\@tempdimb}
1002 %           \@ovro := \ht \@tempboxa
1003 %           \@tempboxa := \hbox{
1004 %                   \@circlefnt
1005 %                   \@tempcnta := \@tempcnta + 2
1006 %                   \char \@tempcnta
1007 %                   \@tempcnta := \@tempcnta - 1
1008 %                   \char \@tempcnta
1009 %                   \kern -2\@tempdima
1010 %                   \@tempcnta := \@tempcnta + 2
1011 %                   \raise \@tempdima \hbox { \char \@tempcnta }
1012 %                   \raise \@tempdima \box\@tempboxa
1013 %                  }
1014 %           \ht\@tempboxa := \dp\@tempboxa := 0
1015 %           \@put{-\@ovro}{-\@ovro}{\@tempboxa}
1016 %      else
1017 %           \@circ{\@tempdimb}{96}
1018 %    fi
1019 %   \endgroup
1020 %   END
1022 % \circle*{DIAM}  ==  \@dot{DIAM} == \@circ{DIAM*\unitlength}{112}
1024 % \@circ{DIAM}{CHAR} ==
1025 %  BEGIN
1026 %   \@tempcnta := integer coercion of (DIAM + .5pt)/1pt.
1027 %   if \@tempcnta > 15 then \@tempcnta := 15 fi
1028 %   if \@tempcnta > 1  then \@tempcnta := \@tempcnta - 1 fi
1029 %   \@tempcnta := \@tempcnta + CHAR
1030 %   \@circlefnt
1031 %   \char \@tempcnta
1032 %  END
1033 % \end{oldcomments}
1036 % \begin{macro}{\if@ovt}
1037 % \begin{macro}{\if@ovb}
1038 % \begin{macro}{\if@ovl}
1039 % \begin{macro}{\if@ovr}
1040 % If producing the Top Bottom Left or Right of an oval.
1041 %    \begin{macrocode}
1042 \newif\if@ovt
1043 \newif\if@ovb
1044 \newif\if@ovl
1045 \newif\if@ovr
1046 %    \end{macrocode}
1047 % \end{macro}
1048 % \end{macro}
1049 % \end{macro}
1050 % \end{macro}
1053 % \begin{macro}{\@ovxx}
1054 % \begin{macro}{\@ovyy}
1055 % \begin{macro}{\@ovdx}
1056 % \begin{macro}{\@ovdy}
1057 % \begin{macro}{\@ovro}
1058 % \begin{macro}{\@ovri}
1059 %    \begin{macrocode}
1060 \newdimen\@ovxx
1061 \newdimen\@ovyy
1062 \newdimen\@ovdx
1063 \newdimen\@ovdy
1064 \newdimen\@ovro
1065 \newdimen\@ovri
1066 %    \end{macrocode}
1067 % \end{macro}
1068 % \end{macro}
1069 % \end{macro}
1070 % \end{macro}
1071 % \end{macro}
1072 % \end{macro}
1075 % |\advance\@tempdima 2pt\relax| added 1 Nov 88 to fix bug in which
1076 % size of drawn circle not monotonic function of argument of |\circle|,
1077 % caused by different rounding for dimensions of large and small
1078 % circles.
1081 % \begin{macro}{\@getcirc}
1082 % \changes{v1.1j}{2003/12/30}{issue warning if circle size can't be met pr/3473}
1083 %    \begin{macrocode}
1084 \gdef\@getcirc#1{\@tempdima #1\relax \advance\@tempdima 2\p@
1085   \@tempcnta\@tempdima
1086   \@tempdima 4\p@ \divide\@tempcnta\@tempdima
1087   \ifnum \@tempcnta >10\relax
1088       \@picture@warn
1089       \@tempcnta 10\relax
1090   \fi
1091   \ifnum \@tempcnta >\z@ \advance\@tempcnta\m@ne
1092 %    \end{macrocode}
1093 %     Warn if requirements for oval or circle can't be met.
1094 % \changes{v1.1g}{1997/09/15}{Warn if lines become invisible pr/2524}
1095 %    \begin{macrocode}
1096     \else \@picture@warn \fi
1097   \multiply\@tempcnta 4\relax
1098   \setbox \@tempboxa \hbox{\@circlefnt
1099   \char \@tempcnta}\@tempdima \wd \@tempboxa}
1100 %    \end{macrocode}
1101 % \end{macro}
1103 % \begin{macro}{\@picture@warn}
1104 %     Generic warning for lines, vectors (used in |\@sline|) and
1105 %     oval or circle (used in |\@getcirc|) are not available at
1106 %     right size.
1107 % \changes{v1.1g}{1997/09/15}{Macro added pr/2524}
1108 %    \begin{macrocode}
1109 \def\@picture@warn{\@latex@warning{%
1110      \string\oval, \string\circle, or \string\line\space
1111      size unavailable}}
1112 %    \end{macrocode}
1113 % \end{macro}
1115 % \begin{macro}{\@put}
1116 %    \begin{macrocode}
1117 \gdef\@put#1#2#3{\raise #2\hb@xt@\z@{\hskip #1#3\hss}}
1118 %    \end{macrocode}
1119 % \end{macro}
1121 % \begin{macro}{\oval}
1122 %    \begin{macrocode}
1123 \gdef\oval(#1,#2){\@ifnextchar[{\@oval(#1,#2)}{\@oval(#1,#2)[]}}
1124 %    \end{macrocode}
1125 % \end{macro}
1127 %    \begin{macrocode}
1128 %</2ekernel>
1129 %<latexrelease>\IncludeInRelease{2016/03/31}%
1130 %<latexrelease>                 {\@ovhlinetrue}%
1131 %<latexrelease>                 {Avoid almost zero length leaders}%
1132 %<*2ekernel|latexrelease>
1133 %    \end{macrocode}
1135 % \begin{macro}{\if@ovvline}
1136 % \changes{v.1l}{2016/03/29}{macro added (latex/4452)}
1137 % \begin{macro}{\if@ovhline}
1138 % \changes{v.1l}{2016/03/29}{macro added (latex/4452)}
1139 % Tests whether horizontal or vertical lines are needed.
1140 %    \begin{macrocode}
1141 \newif\if@ovvline \@ovvlinetrue 
1142 \newif\if@ovhline \@ovhlinetrue
1143 %    \end{macrocode}
1144 % \end{macro}
1145 % \end{macro}
1147 % \begin{macro}{\@oval}
1148 %    \begin{macrocode}
1149 \gdef\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
1150   \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
1151 %    \end{macrocode}
1152 % \changes{v.1l}{2016/03/29}{initialise tests}
1153 %    \begin{macrocode}
1154   \@ovvlinefalse \@ovhlinefalse
1155 %    \end{macrocode}
1156 %    \begin{macrocode}
1157   \@tfor\reserved@a :=#3\do{\csname @ov\reserved@a false\endcsname}%
1158   \@ovxx #1\unitlength
1159   \@ovyy #2\unitlength
1160 %    \end{macrocode}
1161 % \changes{v.1l}{2016/03/29}{add setting of line tests}
1162 %    \begin{macrocode}
1163   \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx \@ovvlinetrue
1164   \else \@ovyy \ifdim \@ovyy =\@ovxx \else \@ovhlinetrue \fi\fi
1165 %    \end{macrocode}
1166 %    \begin{macrocode}
1167   \advance \@tempdimb -2\p@
1168   \@getcirc \@tempdimb
1169   \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa
1170   \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@
1171   \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@
1172 %    \end{macrocode}
1173 % \changes{v.1l}{2016/03/29}{add setting of line tests}
1174 %    \begin{macrocode}
1175   \ifdim \@ovdx >\z@ \@ovhlinetrue \fi
1176   \ifdim \@ovdy >\z@ \@ovvlinetrue \fi
1177 %    \end{macrocode}
1178 %    \begin{macrocode}
1179   \@circlefnt \setbox\@tempboxa
1180   \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi
1181   \if@ovl \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx \fi
1182   \if@ovt \@ovhorz \kern -\@ovxx \fi
1183   \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro
1184   \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@
1185   \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}%
1186   \endgroup}
1187 %    \end{macrocode}
1188 % \end{macro}
1190 % \begin{macro}{\@ovvert}
1191 %    \begin{macrocode}
1192 \gdef\@ovvert#1#2{\vbox to\@ovyy{%
1193     \if@ovb \@tempcntb \@tempcnta \advance \@tempcntb #1\relax
1194       \kern -\@ovro \hbox{\char \@tempcntb}\nointerlineskip
1195     \else \kern \@ovri \kern \@ovdy \fi
1196 %    \end{macrocode}
1197 % \changes{v.1l}{2016/03/29}
1198 %               {use glue not leaders if vertical line not required}
1199 %    \begin{macrocode}
1200     \if@ovvline \leaders\vrule \@width \@wholewidth \fi
1201 %    \end{macrocode}
1202 %    \begin{macrocode}
1203     \vfil \nointerlineskip
1204     \if@ovt \@tempcntb \@tempcnta \advance \@tempcntb #2\relax
1205       \hbox{\char \@tempcntb}%
1206     \else \kern \@ovdy \kern \@ovro \fi}}
1207 %    \end{macrocode}
1208 % \end{macro}
1210 % \begin{macro}{\@ovhorz}
1211 %    \begin{macrocode}
1212 \gdef\@ovhorz{\hb@xt@\@ovxx{\kern \@ovro
1213     \if@ovr \else \kern \@ovdx \fi
1214 %    \end{macrocode}
1215 % \changes{v.1l}{2016/03/29}
1216 %               {use glue not leaders if horizontal line not required}
1217 %    \begin{macrocode}
1218     \if@ovhline \leaders \hrule \@height \@wholewidth \fi
1219 %    \end{macrocode}
1220 %    \begin{macrocode}
1221     \hfil
1222     \if@ovl \else \kern \@ovdx \fi
1223     \kern \@ovri}}
1224 %    \end{macrocode}
1225 % \end{macro}
1227 %    \begin{macrocode}
1228 %</2ekernel|latexrelease>
1229 %<latexrelease>\EndIncludeInRelease
1230 %<latexrelease>\IncludeInRelease{0000/00/00}%
1231 %<latexrelease>                 {\@ovhlinetrue}%
1232 %<latexrelease>                 {Avoid almost zero length leaders}%
1233 %<latexrelease>\let\if@ovvline\@undefined
1234 %<latexrelease>\let\if@ovhline\@undefined
1235 %<latexrelease>\gdef\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
1236 %<latexrelease>  \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
1237 %<latexrelease>  \@tfor\reserved@a :=#3\do
1238 %<latexrelease>                {\csname @ov\reserved@a false\endcsname}%
1239 %<latexrelease>  \@ovxx #1\unitlength
1240 %<latexrelease>  \@ovyy #2\unitlength
1241 %<latexrelease>  \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx\else \@ovyy \fi
1242 %<latexrelease>  \advance \@tempdimb -2\p@
1243 %<latexrelease>  \@getcirc \@tempdimb
1244 %<latexrelease>  \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa
1245 %<latexrelease>  \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@
1246 %<latexrelease>  \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@
1247 %<latexrelease>  \@circlefnt \setbox\@tempboxa
1248 %<latexrelease>  \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi
1249 %<latexrelease>  \if@ovl
1250 %<latexrelease>   \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx 
1251 %<latexrelease>  \fi
1252 %<latexrelease>  \if@ovt \@ovhorz \kern -\@ovxx \fi
1253 %<latexrelease>  \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro
1254 %<latexrelease>  \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@
1255 %<latexrelease>  \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}%
1256 %<latexrelease>  \endgroup}
1257 %<latexrelease>\gdef\@ovvert#1#2{\vbox to\@ovyy{%
1258 %<latexrelease>    \if@ovb \@tempcntb \@tempcnta \advance \@tempcntb #1\relax
1259 %<latexrelease>      \kern -\@ovro \hbox{\char \@tempcntb}\nointerlineskip
1260 %<latexrelease>    \else \kern \@ovri \kern \@ovdy \fi
1261 %<latexrelease>    \leaders\vrule \@width \@wholewidth\vfil \nointerlineskip
1262 %<latexrelease>    \if@ovt \@tempcntb \@tempcnta \advance \@tempcntb #2\relax
1263 %<latexrelease>      \hbox{\char \@tempcntb}%
1264 %<latexrelease>    \else \kern \@ovdy \kern \@ovro \fi}}
1265 %<latexrelease>\gdef\@ovhorz{\hb@xt@\@ovxx{\kern \@ovro
1266 %<latexrelease>    \if@ovr \else \kern \@ovdx \fi
1267 %<latexrelease>    \leaders \hrule \@height \@wholewidth \hfil
1268 %<latexrelease>    \if@ovl \else \kern \@ovdx \fi
1269 %<latexrelease>    \kern \@ovri}}
1270 %<latexrelease>\EndIncludeInRelease
1271 %<*2ekernel>
1272 %    \end{macrocode}
1274 % \begin{macro}{\circle}
1275 % \changes{LaTeX2.09}{1993/08/05}
1276 %     {(RMS) Added error message if \cs{circle} is used in math mode.}
1277 %    \begin{macrocode}
1278 \gdef\circle{\@inmatherr\circle\@ifstar\@dot\@circle}
1279 %    \end{macrocode}
1280 % \end{macro}
1282 % \begin{macro}{\@circle}
1283 %    \begin{macrocode}
1284 \gdef\@circle#1{%
1285   \begingroup \boxmaxdepth \maxdimen \@tempdimb #1\unitlength
1286    \ifdim \@tempdimb >15.5\p@ \@getcirc\@tempdimb
1287       \@ovro\ht\@tempboxa
1288      \setbox\@tempboxa\hbox{\@circlefnt
1289       \advance\@tempcnta\tw@ \char \@tempcnta
1290       \advance\@tempcnta\m@ne \char \@tempcnta \kern -2\@tempdima
1291       \advance\@tempcnta\tw@
1292       \raise \@tempdima \hbox{\char\@tempcnta}\raise \@tempdima
1293         \box\@tempboxa}\ht\@tempboxa\z@ \dp\@tempboxa\z@
1294       \@put{-\@ovro}{-\@ovro}{\box\@tempboxa}%
1295    \else  \@circ\@tempdimb{96}\fi\endgroup}
1296 %    \end{macrocode}
1297 % \end{macro}
1299 % \begin{macro}{\@dot}
1300 % Internal form of |\circle*|.
1301 %    \begin{macrocode}
1302 \gdef\@dot#1{\@tempdimb #1\unitlength \@circ\@tempdimb{112}}
1303 %    \end{macrocode}
1304 % \end{macro}
1306 % \begin{macro}{\@circ}
1307 %    \begin{macrocode}
1308 \gdef\@circ#1#2{\@tempdima #1\relax \advance\@tempdima .5\p@
1309    \@tempcnta\@tempdima \@tempdima \p@
1310    \divide\@tempcnta\@tempdima
1311    \ifnum\@tempcnta >15\relax \@tempcnta 15\relax \fi
1312    \ifnum \@tempcnta >\z@ \advance\@tempcnta\m@ne\fi
1313    \advance\@tempcnta #2\relax
1314    \@circlefnt \char\@tempcnta}
1315 %    \end{macrocode}
1316 % \end{macro}
1319 % \begin{macro}{\@xarg}
1320 % \begin{macro}{\@yarg}
1321 % \begin{macro}{\@yyarg}
1322 % Counters used for manipulating the `slope' arguments.
1323 %    \begin{macrocode}
1324 \newcount\@xarg
1325 \newcount\@yarg
1326 \newcount\@yyarg
1327 %    \end{macrocode}
1328 % \end{macro}
1329 % \end{macro}
1330 % \end{macro}
1332 % \begin{macro}{\@multicnt}
1333 % Counter used in |\multiput|, and also |\multicolumn|.
1334 %    \begin{macrocode}
1335 \newcount\@multicnt
1336 %    \end{macrocode}
1337 % \end{macro}
1339 % \begin{macro}{\@xdim}
1340 % \begin{macro}{\yxdim}
1341 % Length registers.
1342 %    \begin{macrocode}
1343 \newdimen\@xdim
1344 \newdimen\@ydim
1345 %    \end{macrocode}
1346 % \end{macro}
1347 % \end{macro}
1349 % \begin{macro}{\@linechar}
1350 % Box for holding a line segment character, for sloping lines.
1351 %    \begin{macrocode}
1352 \newbox\@linechar
1353 %    \end{macrocode}
1354 % \end{macro}
1356 % \begin{macro}{\@linelen}
1357 % Length of the line currently being built.
1358 %    \begin{macrocode}
1359 \newdimen\@linelen
1360 %    \end{macrocode}
1361 % \end{macro}
1363 % \begin{macro}{\@clnwd}
1364 % \begin{macro}{\@clnht}
1365 % Height and width of current line segment.
1366 %    \begin{macrocode}
1367 \newdimen\@clnwd
1368 \newdimen\@clnht
1369 %    \end{macrocode}
1370 % \end{macro}
1371 % \end{macro}
1373 % \begin{macro}{\@dashdim}
1374 % \begin{macro}{\@dashbox}
1375 % \begin{macro}{\@dashcnt}
1376 % |\dashbox| internal registers.
1377 %    \begin{macrocode}
1378 \newdimen\@dashdim
1379 \newbox\@dashbox
1380 \newcount\@dashcnt
1381 %    \end{macrocode}
1382 % \end{macro}
1383 % \end{macro}
1384 % \end{macro}
1386 % Initialization: ``|\thinlines|''
1387 % \changes{v1.1f}{1995/10/27}
1388 %      {Move initialisation to kernel from autoload file}
1389 %    \begin{macrocode}
1390 \let\@linefnt\tenln
1391 \let\@circlefnt\tencirc
1392 \@wholewidth\fontdimen8\tenln
1393 \@halfwidth .5\@wholewidth
1394 %    \end{macrocode}
1398 % \subsection{Curves}
1399 % The new |\qbezier| command, based on the old |\bezier| defined in
1400 % |bezier.sty|.
1401 % \changes{v0.1c}{1994/04/28}{bezier curves added}
1403 % \begin{oldcomments}
1405 %  \qbezier[N] == \bezier{N}
1407 %  \bezier{N}(AX,AY)(BX,BY)(CX,CY) ==
1408 %    BEGIN
1409 %      IF N = 0
1410 %         THEN \@xdima := |BX - AX|
1411 %             \@xb := |CX - BX|
1412 %             \@xa := Max(\@xa, \@xb)
1413 %             \@ya := |BY - AY|
1414 %             \@yb := |CY - BY|
1415 %             \@ya := Max(\@ya, \@yb)
1416 %             @sc := Max(\@xa, \@ya)
1417 %             %% The coefficient .5 below is the degree of overlap of
1418 %             %% successive points, where 1 is no overlap and 0 is
1419 %             %% complete overlap.  A coefficient of C multiplies
1420 %             %% the number of points plotted by 1/C.
1421 %             %%
1422 %             \@xa := .5 * \@halfwidth
1423 %             @sc := @sc / \@halfwidth
1424 %             @sc := Max(@sc, qbeziermax)
1425 %          ELSE @sc := N
1426 %      @scp := @sc+1
1427 %      \@xb := 2 * (BX - AX) * \unitlength
1428 %      \@xa := ((CX-AX)*\unitlength - \@xb)/@sc
1429 %      \@yb := 2 * (BY - AY) * \unitlength
1430 %      \@ya := ((CY-AY)*\unitlength - \@yb)/@sc
1431 %      \@pictdot := square rule of width \@wholewidth
1432 %      \count@ := 0
1433 %      WHILE \count@ < @scp
1434 %        DO  \@xdim := ((\count@*\@xa + @xb) / @sc) * \count@
1435 %            \@ydim := ((\count@*\@ya + @yb) / @sc) * \count@
1436 %            plot pt with relative coords (\@xdim,\@ydim)
1437 %            \count@ := \count@+1
1438 %        OD
1440 % \end{oldcomments}
1442 %  \begin{macro}{\qbeziermax}
1443 % The maximum number of points to plot.
1444 %    \begin{macrocode}
1445 \gdef\qbeziermax{500}
1446 %    \end{macrocode}
1447 %  \end{macro}
1450 % In the code below, to save registers |\@a| \ldots\ are not used.
1451 % Instead other registers are reused.
1453 % |\newcounter{@sc} -> \c@multicnt|\par
1454 % |\newcounter{@scp} -> \@tempcnta|\par
1455 % |\newdimen\@xa ->  \@ovxx|\par
1457 % |\newdimen\@xb ->  \@ovdx|
1459 % |\newdimen\@ya ->  \@ovyy|\par
1460 % |\newdimen\@yb ->  \@ovdy|
1462 % |\newsavebox{\@pictdot} -> \@tempboxa|
1464 % \begin{macro}{\qbezier}
1465 % Main user-level command to plot quadratic bezier curves.
1466 % |#2| should be |(|.
1467 %    \begin{macrocode}
1468 \newcommand\qbezier[2][0]{\bezier{#1}#2}
1469 %    \end{macrocode}
1470 % \end{macro}
1472 %  \begin{macro}{\bezier}
1473 % Form of |\bezier| compatible with 2.09 |bezier.sty|, but modified to
1474 % ignore spaces between its arguments.
1475 % |#2| should be white space, and |#4| should be |(|.
1476 %    \begin{macrocode}
1477 \gdef\bezier#1)#2(#3)#4({\@bezier#1)(#3)(}
1478 %    \end{macrocode}
1480 %  \begin{macro}{\@bezier}
1481 %    \begin{macrocode}
1482 \gdef\@bezier#1(#2,#3)(#4,#5)(#6,#7){%
1483   \ifnum #1=\z@
1484       \@ovxx #4\unitlength
1485         \advance\@ovxx -#2\unitlength
1486         \ifdim \@ovxx<\z@ \@ovxx -\@ovxx \fi
1487       \@ovdx #6\unitlength
1488         \advance\@ovdx -#4\unitlength
1489         \ifdim \@ovdx<\z@ \@ovdx -\@ovdx \fi
1490         \ifdim \@ovxx<\@ovdx \@ovxx \@ovdx \fi
1491       \@ovyy #5\unitlength
1492         \advance\@ovyy -#3\unitlength
1493         \ifdim \@ovyy<\z@ \@ovyy -\@ovyy \fi
1494       \@ovdy #7\unitlength
1495         \advance\@ovdy -#5\unitlength
1496         \ifdim \@ovdy<\z@  \@ovdy -\@ovdy \fi
1497         \ifdim \@ovyy<\@ovdy \@ovyy  \@ovdy \fi
1498       \@multicnt
1499          \ifdim \@ovxx>\@ovyy \@ovxx \else \@ovyy \fi
1500       \@ovxx .5\@halfwidth \divide\@multicnt\@ovxx
1501       \ifnum \qbeziermax<\@multicnt \@multicnt\qbeziermax\relax \fi
1502   \else \@multicnt#1\relax \fi
1503   \@tempcnta\@multicnt \advance\@tempcnta\@ne
1504   \@ovdx #4\unitlength \advance\@ovdx -#2\unitlength
1505       \multiply\@ovdx \tw@
1506   \@ovxx #6\unitlength \advance\@ovxx -#2\unitlength
1507       \advance\@ovxx -\@ovdx \divide\@ovxx\@multicnt
1508   \@ovdy #5\unitlength \advance\@ovdy -#3\unitlength
1509        \multiply\@ovdy \tw@
1510   \@ovyy #7\unitlength \advance\@ovyy -#3\unitlength
1511       \advance\@ovyy -\@ovdy \divide\@ovyy\@multicnt
1512 %    \end{macrocode}
1514 % \changes{v1.1k}{2003/08/27}{added missing displacement pr/3566}
1515 %    \begin{macrocode}
1516   \setbox\@tempboxa\hbox{%
1517             \hskip -\@halfwidth
1518             \vrule \@height\@halfwidth
1519                    \@depth \@halfwidth
1520                    \@width \@wholewidth}%
1521    \put(#2,#3){%
1522      \count@\z@
1523      \@whilenum{\count@<\@tempcnta}\do
1524         {\@xdim\count@\@ovxx
1525            \advance\@xdim\@ovdx
1526            \divide\@xdim\@multicnt
1527            \multiply\@xdim\count@
1528          \@ydim\count@\@ovyy
1529             \advance\@ydim\@ovdy
1530             \divide\@ydim\@multicnt
1531             \multiply\@ydim\count@
1532          \raise \@ydim
1533             \hb@xt@\z@{\kern\@xdim
1534                         \unhcopy\@tempboxa\hss}%
1535          \advance\count@\@ne}}}
1536 %</2ekernel>
1537 %    \end{macrocode}
1538 %  \end{macro}
1539 %  \end{macro}
1541 % \Finale