%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% v 1.3 % DraTex % % Copyright (C) 1992 by Eitan M. Gurari % % % % Permission is granted to use and copy this package, % % but not to sell any part of it without the author's % % written permission. This notice must remain in any % % copy or derivative. % % % % gurari@cis.ohio-state.edu % % http://www.cis.ohio-state.edu/~gurari % % ftp.cis.ohio-state.edu : pub/tex/osu/gurari/ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \expandafter\edef\csname :RestoreCatcodes\endcsname{% \catcode`\noexpand :=\the\catcode`:% \catcode`\noexpand @=\the\catcode`@% \catcode`\noexpand /=\the\catcode`/% \catcode`\noexpand &=\the\catcode`&% \catcode`\noexpand \^^M=\the\catcode`\^^M% \catcode`\noexpand \^^I=\the\catcode`\^^I% \expandafter\let\csname:RestoreCatcodes\endcsname=\noexpand\undefined} \catcode`\:11 \catcode`\@11 \let\:wlog\wlog \def\wlog#1{} \def\:wrn#1#2{\immediate\write\sixt@@n{--DraTeX warning-- \ifcase #1 DraTex.sty already loaded \or \string\Draw\space within \string\Draw \or Changing definition of \string#2 \or No intersection points: #2 \or Improper rotation of axes: #2 \or (#2) in \string\DSeg\space is a point \fi}} \def\:err#1#2{\errmessage{--DraTeX error-- \ifcase #1 \string#2\space meaningless in three dimensions \or \string#2\space meaningless in two dimensions \or No \string\MarkLoc(#2) \or \string#2 in three dimensions \or Too many parameters in definition \or \string\MoveFToOval(#2)? \fi}} \ifx\:Xunits\:undefined \else \:wrn0{} \fi \catcode`\ 9 \catcode`\^^M9 \catcode`\^^I9 \newdimen\:LBorder \newdimen\:RBorder\chardef\:eight=8 \mathchardef\:cccvx=360 \newdimen\:mp \:mp 0.1\p@ \newdimen\:mmp \:mmp 0.01\p@ \newdimen\:mmmp \:mmmp 0.001\p@ \newdimen\:XC \:XC 90\p@ \newdimen\:CVXXX \:CVXXX180\p@ \newdimen\:CCCVX \:CCCVX\:cccvx\p@ \newdimen\:TeXLoc \newbox\:box\newif\if:IIID \newdimen\:Z \newdimen\:Zunits \newdimen\:Ex \newdimen\:Ey \newdimen\:Ez \def\:AbsVal#1{ \ifdim#1<\z@-\fi #1 } \def\:abs#1{\ifdim #1<\z@ #1-#1 \fi} \def\:AbsDif#1#2#3{ #1#2 \advance#1 -#3 \ifdim #1<\z@ #1-#1 \fi} \def\:diff#1#2#3{ #1#2 \advance#1 -#3 } \def\:average#1#2#3{ #1#2 \advance#1 #3 \divide#1 \tw@}\def\:Opt#1#2#3#4{ \def\:temp{ \ifx \:next\ifnum \def\:next{#3#1#4#2} \else\ifx \:next#1 \def\:next{#3} \else \def\:next{#3#1#4#2}\fi\fi \:next} \futurelet\:next\:temp}\def\Define#1{\:multid#1 \:Opt(){\:Define#1}0} \def\:DraCatCodes{\catcode`\ 9 \catcode`\^^M9 \catcode`\^^I9 \catcode`\&13 \catcode`\~13 } \def\:Define#1(#2){\begingroup \:DraCatCodes \::Define#1(#2)} \def\::Define#1(#2)#3{\endgroup \let\:NextDefine\NextDefine \let\NextDefine\relax \ifcase#2\relax \def#1{#3}\or \:TxtPar\def#1(##1){#3}\or \:TxtPar\def#1(##1,##2){#3}\or \:TxtPar\def#1(##1,##2,##3){#3}\or \:TxtPar\def#1(##1,##2,##3,##4){#3}\or \:TxtPar\def#1(##1,##2,##3,##4,##5){#3}\or \:TxtPar\def#1(##1,##2,##3,##4,##5,##6){#3}\or \:TxtPar\def#1(##1,##2,##3,##4,##5,##6,##7){#3}\or \:TxtPar\def#1(##1,##2,##3,##4,##5,##6,##7,##8){#3}\or \:TxtPar\def#1(##1,##2,##3,##4,##5,##6,##7,##8,##9){#3}\or \:err4{}\fi \let\:TxtPar\relax \:NextDefine} \let\NextDefine\relax\let\:TxtPar\relax \def\WarningOn{\def\:multid##1{ \ifx ##1\:undefined \else \:wrn2##1\fi}} \def\:gobble#1{} \def\WarningOff{\let\:multid\:gobble} \WarningOff \Define\Indirect{\futurelet\:next\:Indirect} \Define\:Indirect{\:theDoReg \ifx \:next< \def\:temp{\let\DoReg\:DoReg} \def\:next<##1>{\expandafter\:temp\csname :<##1>\endcsname} \else \def\:next##1<##2>{ \expandafter\ifx \csname :<##2> \endcsname \relax \def\:next{##1} \fi \:indrwrn\Define \:indrwrn\Object \:indrwrn\Table \:indrwrn\IntVar \:indrwrn\DecVar \def\:temp{\let\DoReg\:DoReg##1} \expandafter\:temp \csname :<##2> \endcsname} \fi \:next} \def\:indrwrn#1{ \def\:temp{#1} \ifx \:next\:temp \def\:wrn##1##2{\let\:wrn\::wrn} \fi} \let\::wrn\:wrn \Define\:Hline{ \setbox\:box\hbox{\vrule height0.5\:thickness depth 0.5\:thickness width\:x} {\:d\:X \advance\:d \wd\:box \advance\:X -\:TeXLoc \global\:TeXLoc\:d \vrule width\:X depth\z@ height\z@ \raise \:Y \box\:box} }\Define\:Vline{ \setbox\:box\hbox{\vrule width\:thickness \ifdim \:y>\z@ height\:y depth\z@ \else height\z@ depth-\:y \fi} \advance\:X -0.5\:thickness {\:d\:X \advance\:d \wd\:box \advance\:X -\:TeXLoc \global\:TeXLoc\:d \vrule width\:X depth\z@ height\z@ \raise \:Y \box\:box} }\Define\:MvTo(2){\:X#1\:Xunits \:Y#2\:Yunits} \Define\:Mv(2){\advance\:X #1\:Xunits \advance\:Y #2\:Yunits} \def\:DLn(#1,#2,{\:MvTo(#1,#2) \:LnTo(}\Define\:LnTo(2){ \:x#1\:Xunits \advance\:x -\:X \:y#2\:Yunits \advance\:y -\:Y \:Ln(\:x\du,\:y\du) }\Define\:Ln(2){ \:x#1\:Xunits \:y#2\:Yunits { \ifdim \:x<\z@ \advance\:X \:x \:x-\:x \advance\:Y \:y \:y-\:y \fi \:yy\:AbsVal\:y \:dd\:yy \advance\:dd \:x \ifdim \:dd>\:mmmp \ifdim \:x>\:yy { \ifdim\:X<\:LBorder \global\:LBorder\:X\fi \advance \:X \:x \ifdim \:X>\:RBorder \global\:RBorder\:X\fi } \let\:Yunitsy\:x \let\:Xunitsx\:y \let\:temp\:Hline \:dd0.6\:yy \:divide\:dd\:x \else { \advance \:X -0.5\:thickness \ifdim \:X<\:LBorder \global\:LBorder\:X \fi \advance \:X \:thickness \advance \:X \:x \ifdim \:X>\:RBorder \global\:RBorder\:X\fi } \let\:Yunitsy\:y \let\:Xunitsx\:x \let\:temp\:Vline \:dd0.6\:x \ifdim \:x>\:mmp \:divide\:dd\:yy \fi \fi \advance\:dd 0.4\p@ \:ragged\:Cons\:dd\:ragged \:HVLn \fi } \advance\:X \:x \advance\:Y \:y}\Define\:HVLn{ \:xx\:AbsVal\:Xunitsx \:divide\:xx\:ragged \advance\:xx 0.99\p@ \:K\:InCons\:xx \relax \ifnum \:K>\z@ \divide\:Xunitsx \:K \advance\:K \@ne \divide\:Yunitsy \:K \else \:K\@ne \fi \:NextLn} \Define\:NextLn{ \ifnum\:K=\z@ \let\:NextLn\relax \else { \:temp } \advance\:K \m@ne \advance\:X \:x \advance\:Y \:y \fi \:NextLn}\newdimen\:ragged \Define\Ragged(1){ \:ragged#1\p@ \:ragged0.1\:ragged } \Ragged(7.5) \Define\PaintUnderCurve(4){{ \:Z\:Y \def\:next{\Curve(#1,#2,#3,#4)} \MoveToLoc(#1) \:d\:X \MoveToLoc(#4) \advance\:d -\:X \ifdim \:AbsVal\:d<\:mmp \def\:next{} \else \def\:CrvLnTo(##1,##2){ \:x \:X \:y \:Y \:X\:DJ \:Y\:yyyy \:xx\:X \:dddd \:Y \:X\:x \:Y\:y { \advance\:Y \:dddd \divide\:Y \tw@ \advance\:Z -\:Y \advance\:Y 0.5\:Z \:dddd \:AbsVal \:Z \:d\z@ \def\:CrvLnTo{\:LnTo} \:yy\:Y \:dd\:dddd \:ddd\:dddd \::paint }} \fi \:next }} \Define\DoCurve(1){ \let\:StopCurve\:SlowCurve \def\:CMv(##1){ \:x\:X \:y\:Y \:MvTo(##1) \advance\:x -\:X \advance\:y -\:Y \:xxx \:x \:yyy\:y} \:DoCurve{\Curve(#1)} \let\:StopCurve\:FastCurve} \def\:DoCurve#1(#2)#3{{\XSaveUnits \def\:next{#1} \:MvTo(#2,#2) \:x\:AbsVal\:X \:y\:Y \:ddd\z@ \:length \:Z\:d \:divide\:Z{1.41421\p@} \edef\:tempa{\the\:DoDist} \global\:DoDist\z@ \def\:CrvLnTo(##1){ \MarkLoc(1^) \:CMv(##1) { \MarkLoc(2^) \:ddd\z@ \:length \:dd \:DoDist \global\advance\:DoDist \:d \:ddd \:DoDist \:divide\:ddd\:Z \DoReg\:InCons\:ddd \:Z\DoReg\:Z \ifdim \:Z>\:dd \advance\:Z -\:DoDist \advance\:dd -\:DoDist \:divide\:Z\:dd \advance\:X \:Cons\:Z\:xxx \advance\:Y \:Cons\:Z\:yyy \:DoRot \def\:CrvLnTo{\:LnTo} \def\:OvalLn{\:Ln} \XRecallUnits #3 \fi}} \:next \xdef\:DoDim{\:Cons\:DoDist} \global\:DoDist\:tempa } \let\DoDim\:DoDim} \newdimen\:DoDist\def\:DoRot{ \DSeg\RotateTo(1^,2^) } \def\DoLine(#1,#2)(#3)#4{ \MarkLoc($1) \Move(#1,#2) \def\:next{ { \MarkLoc($2) \DSeg\RotateTo($1,$2) \let\:DoRot\relax \edef\:RecallRagged{\the\:ragged} \MoveTo(#3,#3) \:x\:AbsVal\:X \:y\:Y \:ddd\z@ \:length \:ragged\:d \divide\:ragged \tw@ \DoCurve($1,$1,$2,$2)(#3) {\:ragged\:RecallRagged #4} } \let\DoDim\:DoDim} \:next } \def\Table#1{\begingroup \:DraCatCodes \:multid#1 \:DefineData#1} \def\:DefineData#1#2{\endgroup \let\:temp~ \def~{\noexpand~} \edef#1{\noexpand\:DoPoly\expandafter\noexpand\csname :\string#1\endcsname} \expandafter\edef \csname :\string#1\endcsname ##1{\noexpand\ifcase##1(#2)\noexpand\fi} \let~\:temp \:DoNextPoly \:DoNextPoly} \def\:OR{\let\:or\or} \:OR \catcode`\&13 \def&{)\noexpand\:or(} \def\TableData{\begingroup \:DraCatCodes \:TableData} \def\:TableData#1#2#3{\endgroup \Table\:temp{#3} \:K\z@ \:J\z@ \def\:tempa(##1){\advance\:J \@ne } \:temp(0,999){\:tempa} \let\:tempa& \def\:temp{\def#1} \def&##1&{ \ifnum \:K<\:J \advance\:K \@ne \ifnum \:K=\@ne \def#1{#2(##1)} \else \:IIIexpandafter\:temp\expandafter{ #1 & #2(##1) } \fi \else \let\:next\relax \fi \:next} \let\:next& && \let&\:tempa } \catcode`\&4 \def\:DoPoly#1(#2,#3)#4{ \expandafter\let \csname :Back\the\:level\endcsname\:or \expandafter\edef\csname :DoVars\the\:level\endcsname{ \:DoB\the\:DoB} \advance\:level \@ne \:DoB#3 \advance\:DoB -#2 \def\:PolyOr(##1){ \ifnum \:DoB=\z@ \:OR \else #4(##1) \advance\:DoB \m@ne \fi} \:OR \def\:temp{\let\:or\:PolyOr #4} \:IIIexpandafter\:temp#1{#2} \advance\:level \m@ne \csname :DoVars\the\:level\endcsname \def\:temp{\let\:or} \expandafter\:temp\csname :Back\the\:level\endcsname } \Define\PaintRect(2){\def\:next{{ \MarkLoc(^) \MoveToLoc(^) \Move( #1,0) \MarkLoc(^1) \Move(0,#2) \MarkLoc(^2) \Move(-#1,0) \MarkLoc(^3) \PaintQuad(^,^1,^2,^3) }}\:next} \Define\PaintRectAt(4){\def\:next{{ \MoveTo(#1,#2) \:K#3 \advance\:K -#1 \:DoB#4 \advance\:DoB -#2 \PaintRect(\:K,\:DoB)}} \:next}\def\::paint{ \ifdim \:d<\:ragged \advance\:xx -\:X \:yyy\:Y \:xxx\:dddd \advance\:Y \:yy \divide\:Y \tw@ \:average\:dddd\:dd\:ddd \def\:next{\:brush(\:xx,\z@)\:Y\:yyy\:dddd\:xxx} \else \divide\:d \tw@ \:average\:x\:X\:xx \:average\:y\:Y\:yy \:average\:dddd\:dd\:ddd \fi \:next}\Define\:paint{{ \:AbsDif\:d\:xx\:x \ifdim \:d<\:mmp \let\::paint\relax \else \ifdim \:y >\:yyy \:dd\:y \:y \:yyy \:yyy \:dd \fi \ifdim \:yy>\:yyyy \:dd\:yy \:yy\:yyyy \:yyyy\:dd \fi \:AbsDif\:dd\:yyyy\:yyy \:AbsDif\:ddd\:yy\:y \ifdim \:dd<\:ddd \:dd\:ddd \fi \ifdim \:d >\:dd \:d\:dd \fi \advance\:d \:d \:diff\:dd\:y\:yyy \:diff\:ddd\:yy\:yyyy \advance\:y -0.5\:dd \:abs\:dd \advance\:yy -0.5\:ddd \:abs\:ddd \:X\:x \:Y\:y \:average\:dddd\:dd\:ddd \def\:next{ \:lpaint \:rpaint } \fi \::paint }} \Define\:lpaint{ { \:xx\:x \:yy \:y \:ddd\:dddd \::paint} } \Define\:rpaint{ { \:X \:x \:Y \:y \:dd \:dddd \::paint} } \Define\PaintQuad(4){\def\:next{{\Units(1pt,1pt) \MoveToLoc(#1) \:x \:X \:y \:Y \MoveToLoc(#2) \:xx \:X \:yy \:Y \MoveToLoc(#3) \:xxx\:X \:yyy\:Y \MoveToLoc(#4) \:xxxx \:X \:yyyy \:Y \:paintQuad }}\:next} \def\:paintQuad{{ \:SetVal\:a\:x\:y\:xx\:yy\:xxxx\:yyyy \:SetVal\:b\:xx\:yy\:xxx\:yyy\:x\:y \:SetVal\:c\:xxx\:yyy\:xx\:yy\:xxxx\:yyyy \:SetVal\:cc\:xxxx\:yyyy\:xxx\:yyy\:x\:y \def\:A{\:a} \def\:B{\:b} \def\:C{\:c} \def\:D{\:cc} \:sort\:B\:A \:sort\:C\:B \:sort\:B\:A \:sort\:D\:C \:sort\:C\:B \:sort\:B\:A \let\:temp\relax \:IsTriang\:A\:B \:IsTriang\:B\:C \:IsTriang\:C\:D \:temp \:Quad\:A\:temp> \:xxxx\:xx \:yyyy\:yy \:Z\:d \:Quad\:D\:next< \:PrePaint(\:xx,\:yy,\:d,\:xxxx,\:yyyy,\:Z) \:temp \:next }} \Define\:PrePaint(6){ \:x#1 \:y#2 \:yyy#3 \:xx#4 \:yy#5 \:yyyy#6 \:paint }\def\:Quad#1#2#3{ \:GetVal#1\:x\:y0 \:GetVal#1\:xx\:yy1 \:GetVal#1\:xxx\:yyy2 \ifdim \:xx#3\:xxx \:ddd\:xx \:xx\:xxx \:xxx\:ddd \:ddd\:yy \:yy\:yyy \:yyy\:ddd \fi \def#2{} \:diff\:dd\:xxx\:xx \ifdim \ifdim\:AbsVal\:dd<\:mp \:yy=\:yyy \else \z@>\z@ \fi \:d\:yy \else \ifdim \:AbsVal\:dd>\:mp \:diff\:dd\:xxx\:x \:diff\:ddd\:yyy\:y \:divide\:ddd\:dd \:diff\:dd\:xx\:xxx \:ddd\:Cons\:ddd\:dd \advance\:ddd \:yyy \:d\:ddd \else \:d\:yyy \fi \edef#2{ \noexpand\:PrePaint (\the\:x ,\the\:y ,\the\:y, \the\:xx,\the\:yy,\the\:d) } \fi}\def\:SetVal#1#2#3#4#5#6#7{ \edef#1{(\the#2,\the#3,\the#4,\the#5,\the#6,\the#7)}} \def\:sort#1#2{ \ifdim \:IIIexpandafter\:field#1 < \:IIIexpandafter\:field#2 \let\:temp#1 \let#1#2 \let#2\:temp \fi } \Define\:field(6){#1} \def\:GetVal#1#2#3{ \:IIIexpandafter\::GetVal #1#2#3} \def\::GetVal(#1,#2,#3,#4,#5,#6)#7#8#9{ \ifcase #9 #7#1 #8#2\or #7#3 #8#4\or #7#5 #8#6 \fi} \def\:IsTriang#1#2{ \ifdim \:IIIexpandafter\:field#1 = \:IIIexpandafter\:field#2 \ifdim \:IIIexpandafter\:fieldB#1 = \:IIIexpandafter\:fieldB#2 \def\:temp{ \:FixTria } \fi \fi } \def\:FixTria{ \edef\:temp{\:IIIexpandafter\:FrsII\:B} \ifdim \:IIIexpandafter\:field\:A = \:IIIexpandafter\:field\:B \ifdim \:IIIexpandafter\:fieldB\:A = \:IIIexpandafter\:fieldB\:B \edef\:temp{\:IIIexpandafter\:FrsII\:C} \fi\fi \edef\:A{\:IIIexpandafter\:FrsII\:A} \edef\:D{\:IIIexpandafter\:FrsII\:D} \edef\:temp{ \def\noexpand\:a{(\:A,\:temp,\:D)} \def\noexpand\:b{(\:temp,\:A,\:D)} \def\noexpand\:c{\noexpand\:b} \def\noexpand\:cc{(\:D,\:A,\:temp)}} \:temp \def\:A{\:a} \def\:B{\:b} \def\:C{\:c} \def\:D{\:cc} } \Define\:fieldB(6){#2} \Define\:FrsII(6){#1,#2} \def\:IIIexpandafter{\expandafter\expandafter\expandafter} \Define\DrawRect(2){ \Line( #1,0) \Line(0, #2) \Line(-#1,0) \Line(0,-#2)} \Define\DrawRectAt(4){{ \MoveTo(#1,#2) \LineTo(#3,#2) \LineTo(#3,#4) \LineTo(#1,#4) \LineTo(#1,#2)}} \def\du#1{ \ifx#1\:Xunits \else\ifx#1\:Yunits \else\ifx#1\:Zunits \else #1 \fi \fi \fi} \let\:svdu=\du \Define\XSaveUnits{ \expandafter\edef\csname XRecallUnits\the\:level\endcsname{ \:StoreUnits} \advance\:level \@ne} \Define\XRecallUnits{ \advance\:level \m@ne \csname XRecallUnits\the\:level \endcsname} \Define\SaveUnits{ \edef\RecallUnits{ \:StoreUnits } } \Define\:StoreUnits{ \:Xunits \the\:Xunits \:Yunits \the\:Yunits \:Zunits \the\:Zunits \:Xunitsx\the\:Xunitsx \:Xunitsy\the\:Xunitsy \:Yunitsx\the\:Yunitsx \:Yunitsy\the\:Yunitsy } \Define\:SearchDir{ \ifdim \:x<\z@ \:x-\:x \:y-\:y \edef\:tempA{\advance\:ddd \ifdim \:y<\z@ - \fi\:CVXXX} \else \def\:tempA{} \fi \ifdim \:y<\z@ \edef\:tempA{\:ddd-\:ddd \advance\:ddd \:CCCVX \:tempA} \:y-\:y \fi \ifdim \:y>\:x \:ddd\:y \:y\:x \:x\:ddd \edef\:tempA{\advance\:ddd -\:XC \:ddd-\:ddd \:tempA} \fi \:divide\:y\:x \:d57.29578\:y \:ddd\:d \:sqr\:y \:K \@ne \Do(1,30){\advance\:K \tw@ \:d-\:Cons\:y\:d \:dd\:d \divide\:dd \:K \advance\:ddd \:dd } \advance\:ddd -0.49182\:dd \:tempA }\Define\Curve(4){\def\:next{{ \XSaveUnits \Units(1pt,1pt) \MoveToLoc(#1) \:DI \:X \:DK \:Y \MoveToLoc(#2) \:ddd \:X \:Ez \:Y \MoveToLoc(#3) \:dd\:X \:Ey\:Y \MoveToLoc(#4) \:DJ\:X \:yyyy\:Y \:Curve }}\:next} \Define\:FastCurve{ \:AbsDif\:d\:DI\:ddd \:AbsDif\:dddd\:DK\:Ez \advance\:d \:dddd \ifnum \:d<\:ragged \:AbsDif\:d\:DJ\:dd \:AbsDif\:dddd\:yyyy\:Ey \advance\:d \:dddd \fi} \let\:StopCurve\:FastCurve \Define\:SlowCurve{ \:AbsDif\:d\:DI\:DJ \:AbsDif\:dddd\:DK\:yyyy \advance\:d \:dddd } \Define\:Curve{ \:StopCurve \ifnum \:d<\:ragged \:X\:DI \:Y\:DK \:CrvLnTo(\:Cons\:DJ,\:Cons\:yyyy) \def\:SubCurves{} \fi \:SubCurves} \def\:CrvLnTo{\:LnTo}\Define\:SubCurves{ \:average\:yy\:DI\:ddd \:average\:Ex\:DK\:Ez \:average\:ddd\:ddd\:dd \:average\:Ez\:Ez\:Ey \:average\:dd\:dd\:DJ \:average\:Ey\:Ey\:yyyy \:average\:Zunits\:yy\:ddd \:average\:Vdirection\:Ex\:Ez \:average\:ddd\:ddd\:dd \:average\:Ez\:Ez\:Ey \:average\:DL\:Zunits\:ddd \:average\:xxxx\:Vdirection\:Ez { \:ddd \:yy \:Ez \:Ex \:dd\:Zunits \:Ey\:Vdirection \:DJ\:DL \:yyyy\:xxxx \:Curve } \:DI \:DL \:DK \:xxxx \:Curve } \def\MoveToCurve[#1]{ \Define\:BiSect(3){\MoveToLoc(##1) \CSeg[#1]\Move(##1,##2) \MarkLoc(##3) }\:MvToCrv} \Define\:MvToCrv(4){ \:BiSect(#1,#2,:a) \:BiSect(#2,#3,:b) \:BiSect(#3,#4,:c) \:BiSect(:a,:b,:A) \:BiSect(:b,:c,:B) \:BiSect(:A,:B,:Q)} \Define\:OvalDir(3){ \:CosSin{#3\p@} \:Zunits\p@ \:d#2\:Zunits \:x\:Cons\:d\:x \:Zunits\p@ \:d#1\:Zunits \:y\:Cons\:d\:y \:SearchDir }\Define\DrawOval (2){ \DrawOvalArc(#1,#2)(0,\:cccvx) } \Define\PaintOval (2){ \PaintOvalArc(#1,#2)(0,\:cccvx) } \Define\DrawCircle (1){ \DrawOval(#1,#1) } \Define\PaintCircle(1){ \PaintOval(#1,#1) } \def\DrawOvalArc(#1,#2)(#3,#4){{ \:xxxx#4\p@ \advance\:xxxx -#3\p@ \ifdim \:xxxx=\z@ \else \let\:SinOne\:SinB \:OvalDir(#1,#2,#3) \:DJ\:ddd \:OvalDir(#1,#2,#4) \:diff\:DI\:ddd\:DJ \ifdim\:DI<\z@ \advance\:DI \:CCCVX \fi \ifdim \:xxxx<\:CCCVX \else \:DI\:CCCVX \fi \:InitOval(#1,#2) \:CosSin\:DJ \:xxxx\:x \:yyyy\:y \:xx\:X \:yy\:Y \advance\:X \:Xx\:x \advance\:X \:Yx\:y \advance\:Y \:Xy\:x \advance\:Y \:Yy\:y \let\:Xunits\empty \let\:Yunits\empty \Do(1,\:InCons\:DI){ \:dd\:X \:ddd\:Y \:X\:xx \:Y\:yy \:AdvOv\:xxx\:yyy\:xxxx\:yyyy \:X\:dd \:Y\:ddd \advance\:xxx -\:X \advance\:yyy -\:Y \:d\:AbsVal\:xxx \advance\:d \:AbsVal\:yyy \ifdim \:d>\:ragged \:OvalLn(\:xxx,\:yyy) \fi } \:OvalDir(#1,#2,#4) \:CosSin\:ddd \advance\:xx \:Xx\:x \advance\:xx \:Yx\:y \advance\:yy \:Xy\:x \advance\:yy \:Yy\:y \advance\:xx -\:X \advance\:yy -\:Y \:OvalLn(\:xx,\:yy) \fi }} \def\:OvalLn{\:Ln}\def\DoOvalArc(#1)(#2){ \:xx\:X \:yy\:Y \def\:CMv(##1){ \:Mv(\:xxx,\:yyy) \:x\:xxx \:y\:yyy} \:DoCurve{ \:X\:xx \:Y\:yy \def\:DoRot{ \let\:Xunits\:XunitsReg \let\:Yunits\:YunitsReg \DSeg\RotateTo(1^,2^) } \let\::OvalLn\:CrvLnTo \Define\:OvalLn(2){ \:dd\:AbsVal####1 \advance\:dd \:AbsVal####2 \:divide\:dd\:ragged \:J\:InCons\:dd \advance\:J \@ne \divide####1 \:J \divide####2 \:J \Do(1,\:J){\::OvalLn(####1,####2)}} \DrawOvalArc(#1)(#2)}} \def\NextTable{\begingroup \:DraCatCodes \:NextTable} \def\:NextTable#1{\endgroup \def\:DoNextPoly{#1\NextTable{}}} \NextTable{}\def\:AdvOv#1#2#3#4{ \:d\:CosOne#3 \advance\:d -\:SinOne#4 #4\:CosOne#4 \advance#4 \:SinOne#3 #3\:d \divide#3 \:eight \divide#4 \:eight #1\:X #2\:Y \:d\:Xx#3 \advance\:d \:Yx#4 \advance#1 \:d \:d\:Xy#3 \advance\:d \:Yy#4 \advance#2 \:d } \def\:CosOne{7.99878} \def\:SinB{0.13962} \def\PaintOvalArc(#1,#2)(#3,#4){{ \ifdim #3\p@=#4\p@ \let\:next\relax \else \:d\:AbsVal{#1\:Xunits} \advance\:d \:AbsVal{#2\:Yunits} \ifdim \:d<3\:ragged \divide \:d \tw@ \PenSize(\:d) \:Mv(-0.5\:d\du,0) \:Ln(\:d\du,0) \else \:InitOval(#1,#2) \MarkLoc(o$) \RotateTo(#3) \MoveFToOval(#1,#2) \:Ex\:X \:Ey\:Y \edef\:FirstOvDir{\:Cons\:ddd\p@} \MoveToLoc(o$) \RotateTo(#4) \MoveFToOval(#1,#2) \:Ez \:X \:Vdirection \:Y \edef\:LastOvDir{\:Cons\:ddd\p@} \MoveToLoc(o$) \if:rotated \:Zunits\p@ \:Zunits#1\:Zunits \:xx\:Cons\:Zunits\:Xunitsx \:Zunits\p@ \:Zunits#2\:Zunits \:yy\:Cons\:Zunits\:Yunitsx \:x\:xx \:y\:yy \:ddd\z@ \:length \:ddd\:d \:divide\:xx\:ddd \:divide\:yy\:ddd \else \:xx\p@ \:yy\z@ \fi \:AbsDif\:d{#3\p@}{#4\p@} \ifdim \:d>359\p@ \:Ez-\:Xx\:xx \advance\:Ez -\:Yx\:yy \:Vdirection-\:Xy\:xx \advance\:Vdirection -\:Yy\:yy \advance\:Ez \:X \advance\:Vdirection \:Y \:setpaint\:PaintOvOv<> \else \:x\:xx \:y\:yy \:SearchDir \:xxx\:FirstOvDir \advance\:xxx -\:ddd \ifdim \:xxx<\z@ \advance\:xxx \:CCCVX \fi \:yyy\:LastOvDir \advance\:yyy -\:ddd \ifdim \:yyy<\z@ \advance\:yyy \:CCCVX \fi \:J\z@ \ifdim \:xxx<\:yyy \ifdim \:yyy<\:CVXXX \:Pntovln\:FirstOvDir\:FirstOvDir\:LastOvDir \else \ifdim \:xxx>\:CVXXX \:Pntovln\:FirstOvDir\:FirstOvDir\:LastOvDir \else \:yyy-\:yyy \advance\:yyy \:CCCVX \ifdim \:xxx<\:yyy \:setpaint\:PntLeftOvOv>< \:PntMovln\:FirstOvDir\:xx \else \:FxLx \:setpaint\:PntLeftOvOv>< \:Pntmovln\:LastOvDir \fi \fi \fi \else \ifdim \:xxx<\:CVXXX { \:setpaint\:PaintOvOv<> } \:FxLx \:setpaint\:PntLeftOvOv>< \:Usrch \:PaintMidOvLn\:LastOvDir\:FirstOvDir \else \ifdim \:yyy>\:CVXXX { \:FxLx \:setpaint\:PaintOvOv<> } \:setpaint\:PntLeftOvOv>< \:Dsrch \:PaintMidOvLn\:LastOvDir\:FirstOvDir \else \:xxx-\:xxx \advance\:xxx \:CCCVX \ifdim \:yyy<\:xxx \:setpaint\:PaintOvOv<> \:PntMovln\:FirstOvDir\:xx \else \:FxLx \:setpaint\:PaintOvOv<> \:Pntmovln\:LastOvDir \fi \fi \fi \fi \fi \fi \fi}}\def\:setpaint#1#2#3{{\aftergroup#1 \:d\:Xx\:xx \advance\:d \:Yx\:yy \ifdim \:d<\z@ \aftergroup#3 \else \aftergroup#2 \fi}} \def\:FxLx{\:d\:Ex \:Ex\:Ez \:Ez\:d} \def\:Pntovln#1{ \let\:SinOne\:SinB \:CosSin#1 \:xxxx\:Ex \:yyyy\:Ey \:Z\z@ \:PaintOvLn} \def\:PntMovln{ \:Dsrch \:FxLx \:xx\:ddd \:PaintOvLn} \def\:Pntmovln{ \:Usrch \:FxLx \:xx\:ddd \:PaintOvLn\:xx} \def\:PaintMidOvLn#1#2{ \:FxLx \:xx\:ddd \:PaintOvLn#1#2 \:xxx\:Ez \:yyy\:Vdirection \:ddd\:Xy\:x \advance\:ddd \:Yy\:y \advance\:ddd \:Y \:PaintSlice} \def\:PntLeftOvOv{ \:xx-\:xx \:yy-\:yy \:PaintOvOv} \def\:Dsrch{ \def\:SinOne{-\:SinB} \:xx\:x \:yy\:y \:SearchDir \:x\:xx \:y\:yy \:d\:Ey \:Ey\:Vdirection \:Vdirection\:d } \def\:Usrch{ \let\:SinOne\:SinB \:x\:xx \:y\:yy \:SearchDir \:x\:xx \:y\:yy}\def\:PaintOvLn#1#2{ \:diff\:dd\:Ey\:Vdirection \:diff\:ddd\:Ex\:Ez \ifdim \:AbsVal\:ddd>\:mp \:divide\:dd\:ddd \:d#2 \advance\:d -#1 \ifnum \:d<\z@ \advance\:d \:CCCVX \fi \:DoB\:InCons\:d \let\:next\:PntDo \:next \fi} \def\:PntDo{ \ifnum\:DoB=\z@ \let\:next\relax \else \::AdvOv\:x\:y \ifdim \:d>\:ragged \:ddd\:xxx \advance\:ddd -\:Ez \:ddd\:Cons\:dd\:ddd \advance\:ddd \:Vdirection \:PaintSlice \fi \advance\:DoB \m@ne \fi \:next}\Define\:PaintSlice{ \:AbsDif\:dddd\:yyy\:ddd \advance\:yyy \:ddd \divide\:yyy \tw@ { \advance\:dddd \:Z \divide\:dddd \tw@ \:X\:xxxx \:Y\:yyy \:xx\:xxx \advance\:xxx -\:xxxx \:d\z@ \:yy\:Y \:dd\:dddd \:ddd\:dddd \::paint } \:xxxx\:xxx \:yyyy\:yyy \:Z\:dddd \:J\z@} \def\::AdvOv#1#2{ \:AdvOv\:xxx\:yyy#1#2 \:AbsDif\:d\:xxxx\:xxx \advance\:J \@ne \ifnum \:J=\sixt@@n \multiply\:d \@cclvi \fi }\def\:PaintOvOv#1{ \def\:hdir{#1} \:xxx\:Xx\:xx \advance\:xxx \:Yx\:yy \:yyy\:Xy\:xx \advance\:yyy \:Yy\:yy \advance\:xxx \:X \advance\:yyy \:Y \:Z\z@ \:xxxx\:xxx \:yyyy\:yyy \:x\:xx \:y\:yy \:DoB\z@ \:J\z@ \let\:next\:scanOvOv \:next } \Define\:scanOvOv{ \advance\:DoB \@ne \advance\:J \@ne \:AbsDif\:d\:xxx\:Ez \ifdim \ifdim \:xxx\:hdir\:Ez - \else\ifdim \thr@@\:d<\:ragged - \else\ifnum \:DoB>358 - \fi \fi \fi \p@<\z@ \:ddd\:yyyy \advance\:ddd -0.5\:dddd \:yyy\:yyyy \advance\:yyy 0.5\:dddd \:xxx\:Ez \:PaintSlice \let\:next\relax \else \:d\:xx \advance\:d -\:x \:xxx\:yy \advance\:xxx -\:y \ifdim -\:Xx\:d\:hdir\:Yx\:xxx \let\:SinOne\:SinB \::AdvOv\:xx\:yy \ifdim \ifdim \:d >\:ragged - \else \ifnum \:J>\sixt@@n - \fi\fi \p@<\z@ \:J\z@ \def\:SinOne{-\:SinB} \:AdvOv\:dd\:ddd\:x\:y \:PaintSlice \fi \else \def\:SinOne{-\:SinB} \::AdvOv\:x\:y \ifdim \ifdim \:d >\:ragged - \else \ifnum \:J>\sixt@@n - \fi\fi \p@<\z@ \:J\z@ \let\:SinOne\:SinB \:AdvOv\:dd\:ddd\:xx\:yy \:PaintSlice \fi \fi \fi \:next}\Define\SetBrush{\:Opt[]\:SetBrush{}} \def\:SetBrush[#1](#2,#3)#4{ \def\:temp{#4} \ifx \:temp\empty \def\:brush{ \let\:Xunits\empty \let\:Yunits\empty \:thickness\:dddd \:Ln } \else \def\:BruShape{#4} \:dd#2\:Xunits \:ddd#3\:Yunits \edef\:Grd{ \:dd\the\:dd \:ddd\the\:ddd } \MarkLoc($$) \def\:temp{#1} \ifx \:temp\empty \:X\z@ \:Y\z@ \else \MoveTo(#1) \fi \edef\:BrOrg{ \:x\the\:X \:y\the\:Y } \MoveToLoc($$) \def\:brush(##1,##2){ \::brush } \fi } \SetBrush(,){}\def\::brush{{ \SetBrush(,){} \let\:Xunits\:XunitsReg \let\:Yunits\:YunitsReg \advance\:Y -0.5\:dddd \:yy\:Y \advance\:yy \:dddd \:BrOrg \:Grd \advance\:xx \:X \ifdim \:xx<\:X \:d\:X \:X\:xx \:xx\:d \fi \:GridPt\:X\:x\:dd \:GridPt\:Y\:y\:ddd \:x\:X \:DoBrush }}\Define\:DoBrush{ \ifdim \:Y>\:yy \let\:DoBrush\relax \else \ifdim \:X>\:xx \advance\:Y \:ddd \:X\:x \else { \:BruShape } \advance\:X \:dd \fi \fi \:DoBrush }\def\:GridPt#1#2#3{ \:xxxx#1 \advance#1 -#2 \:divide#1#3 #1\:InCons#1#3 \advance#1 #2 \ifdim #1=\:xxxx \else \ifdim \:xxxx>#2 \advance#1 #3 \fi \fi } \newcount\:IntId \edef\:IntCount{0\space} \newcount\:DecId \edef\:DecCount{0\space} \Define\:NewCount{\alloc@ 0\count \countdef \insc@unt } \Define\:NewDimen{\alloc@ 1\dimen \dimendef \insc@unt } \def\:NewVar#1#2#3#4#5{ \:multid#1 \def\:temp{ \csname \string#4\the#4\endcsname\z@ \edef#1{\noexpand#3 \csname \string#4\the#4\endcsname}} \def\:next{ \xdef#5{\the#4\space} #2#1 \def\:next{\global\let} \expandafter\:next \csname \string#4\the#4\endcsname#1 \:temp } \advance#4 \@ne \ifnum #4 > #5 \expandafter\:next \else \expandafter\:temp \fi } \def\IntVar#1{\:NewVar#1\:NewCount\:IntOp\:IntId\:IntCount} \def\DecVar#1{\:NewVar#1\:NewDimen\:DecOp\:DecId\:DecCount} \DecVar\Q \DecVar\R \DecVar\T \IntVar\I \IntVar\J \IntVar\K \def\WriteVal#1{\immediate\write\sixt@@n{...\string#1=#1;}} \newdimen\:X \newdimen\:Y \newdimen\:x \newdimen\:y \newdimen\:d \newdimen\:xx \newdimen\:yy \newdimen\:dd \newdimen\:xxx \newdimen\:yyy \newdimen\:ddd \newdimen\:xxxx\newdimen\:yyyy\newdimen\:dddd \newcount\:J \newcount\:K \newdimen\:DI \newdimen\:DJ \newdimen\:DK \newdimen\:DL \newtoks\:t \def\:IntFromPt#1#2{ \:d#2\relax \advance\:d \ifdim\:d<-0.5\p@-\fi 0.5\p@ #1\:d \divide#1 65536\relax} \def\:temp{\catcode`\p12 \catcode`\t12} \def\:Cons{\catcode`\p11 \catcode`\t11} \:temp \def\:Frac#1pt{#1} \def\:rnd#1.#2pt{#1} \:Cons \def\:Cons#1{\expandafter\:Frac\the#1} \def\:sqr#1{#1\expandafter\:Frac\the#1#1} \def\:InCons#1{\expandafter\:rnd\the#1}\def\:Val#1{#1;} \let\Val\:Val\def\:IntOp#1#2{\csname :Op#2\endcsname#1} \let\:SvIntOp\:IntOp \def\:PreIntOp{\let\:IntOp\empty \let\Val\empty} \def\:PostIntOp{\let\:IntOp\:SvIntOp \let\Val\:Val} \expandafter\def\csname :Op;\endcsname#1{ \the#1} \expandafter\def\csname :Op=\endcsname#1#2;{ \:PreIntOp#1#2\:PostIntOp} \expandafter\def\csname :Op+\endcsname#1#2;{ \:PreIntOp\advance #1 #2\:PostIntOp} \expandafter\def\csname :Op-\endcsname#1#2;{ \:PreIntOp\advance #1 -#2\:PostIntOp} \expandafter\def\csname :Op/\endcsname#1#2;{ \:PreIntOp\divide#1 #2\:PostIntOp} \expandafter\def\csname :Op*\endcsname#1#2;{ \:PreIntOp\multiply#1 #2\:PostIntOp} \def\:DecOp#1#2{ \csname :xOp#2\endcsname#1} \let\:SvDecOp\:DecOp \def\:PreDecOp{\let\:IntOp\the \def\:DecOp{\:Cons} \let\Val\empty \let\:du\empty} \def\:PostDecOp{\let\:IntOp\:SvIntOp \let\Val\:Val \let\:DecOp\:SvDecOp \let\:du\::du } \def\::du#1{\p@ \ifx#1\p@ \let\:temp\relax \else \def\:temp{\du{#1}} \fi\:temp} \:PostDecOp \expandafter\def\csname :xOp;\endcsname#1{ \:Cons#1} \expandafter\def\csname :Op[\endcsname#1#2];{ \:PreDecOp \:dd#2\p@ \:IntFromPt#1\:dd \:PostDecOp } \expandafter\def\csname :xOp=\endcsname#1#2;{ \:PreDecOp#1#2\p@\:PostDecOp } \expandafter\def\csname :xOp(\endcsname#1#2){ \:PreDecOp#1#2\p@\:PostDecOp } \expandafter\def\csname :xOp+\endcsname#1#2;{ \:PreDecOp\advance #1 #2\p@\:PostDecOp } \expandafter\def\csname :xOp-\endcsname#1#2;{ \:PreDecOp\advance #1 -#2\p@\:PostDecOp } \expandafter\def\csname :xOp*\endcsname#1#2;{ \:PreDecOp#1 #2#1\:PostDecOp } \expandafter\def\csname :xOp/\endcsname#1#2;{ \:PreDecOp \:divide#1{#2\p@} \:PostDecOp } \let\IF\ifnum \let\THEN\relax \let\ELSE\else \let\FI\fi \def\EqText(#1,#2){ \z@=\z@ \fi \def\:temp{#1} \def\:next{#2} \ifx \:temp\:next } \def\:IfInt#1(#2,#3){ \z@=\z@ \fi \:IntOp\:K=#2; \:IntOp\:J=#3; \ifnum \:K#1\:J } \def\:IfDim#1(#2,#3){ \z@=\z@ \fi \:DecOp\:d=#2; \:DecOp\:dd=#3; \ifdim \:d#1\:dd } \def\EqInt{ \:IfInt= } \def\LtInt{ \:IfInt< } \def\GtInt{ \:IfInt> } \def\EqDec{ \:IfDim= } \def\LtDec{ \:IfDim< } \def\GtDec{ \:IfDim> } \def\Do(#1,#2)#3{ \expandafter\let \csname :Back\the\:level\endcsname\:Do \expandafter\edef\csname :DoVars\the\:level\endcsname{ \DoReg\the\DoReg \:DoB\the\:DoB} \advance\:level \@ne \DoReg#1 \:DoB#2 \relax \ifnum \DoReg<\:DoB \def\:Do{\ifnum \DoReg>\:DoB \let\:Do\relax \else #3\advance\DoReg \@ne \fi \:Do} \else \def\:Do{\ifnum \DoReg<\:DoB \let\:Do\relax \else #3\advance\DoReg \m@ne \fi \:Do} \fi \def\:nextdo{ \:Do \advance\:level \m@ne \csname :DoVars\the\:level\endcsname \def\:temp{\let\:Do} \expandafter\:temp\csname :Back\the\:level\endcsname } \:nextdo} \let\:Do\relax \newcount\DoReg \let\:DoReg\DoReg \newcount\:DoB \newcount\:level\def\::divide#1{ \:DI\:DK \:dddd\:DL \advance\:DI -\:Cons\:dddd#1 \:IntFromPt\:J\:dddd \advance\:dddd -\:J\p@ \multiply\:J \@M \:IntFromPt\:K{\@M\:dddd} \advance\:J \:K \:dddd\@M\p@ \divide\:dddd \:J \advance#1 \:Cons\:DI\:dddd } \def\:divide#1#2{ \:DK#1 \:DL#2 #1\z@ \::divide#1 \::divide#1 \::divide#1 \::divide#1 \::divide#1 } \def\:Sqrt#1{ \ifdim #1<\:mmp #1\z@ \else \:dd#1 \divide\:dd \tw@ \def\::Sqrt{ \:ddd#1 \:divide\:ddd\:dd \:AbsDif\:d\:dd\:ddd \advance\:dd \:ddd \divide\:dd \tw@ \ifdim \:d < \:mmmp \let\::Sqrt\relax \fi \::Sqrt} \::Sqrt #1\:dd \fi }\Define\:length{ \:dd \:AbsVal \:ddd \:abs\:x \:abs\:y \ifdim \:dd<\:x \:dd\:x \fi \ifdim \:dd<\:y \:dd\:y \fi \ifdim \:dd>\:mp \:divide\:x\:dd \:sqr\:x \:divide\:y\:dd \:sqr\:y \:divide\:ddd\:dd \:sqr\:ddd \advance\:x \:y \advance\:x \:ddd \:y\:dd \:Sqrt\:x \:d\:Cons\:x\:y \else \:d\:dd \fi}\Define\:distance(2){\MarkLoc(@^) \MoveToLoc(#1) \:x \:X \:y \:Y \:ddd\:Z \MoveToLoc(#2) \advance\:x -\:X \advance\:y -\:Y \advance\:ddd -\if:IIID \:Z \else \:ddd \fi \:length \MoveToLoc(@^)}\def\:NormalizeDeg#1{ \:DL#1 \:K\:InCons\:DL \divide\:K \:cccvx \multiply\:K \:cccvx \advance #1 -\:K\p@ \ifdim #1<\z@ \advance #1 \:CCCVX \fi \ifdim #1=\z@ \ifdim\:DL=\z@ \else \advance #1 \:CCCVX \fi \fi }\def\:CosSin#1{ \:DK#1 \:NormalizeDeg\:DK \def\:tempA{} \ifdim \:CVXXX<\:DK \def\:tempA{\:y-\:y} \advance\:DK -\:CCCVX \:DK-\:DK \fi \ifdim \:XC<\:DK \edef\:tempA{\:x-\:x \:tempA} \advance\:DK -\:CVXXX \:DK-\:DK \fi \ifdim 45\p@<\:DK \edef\:tempA{\:d\:x \:x\:y \:y\:d \:tempA} \advance\:DK -\:XC \:DK-\:DK \fi \:x\p@ \:y0.01745\:DK \:d\:y \:K\@ne \edef\:next{\advance\:K \@ne \:sqr\:d \divide\:d \:K \advance} \:next \:x -\:d \:next \:y -\:d \:next \:x \:d \:next \:y \:d \:next \:x -\:d \:next \:y -\:d \:next \:x \:d \:next \:y \:d \:tempA } \Define\:rInitOval(2){ \XSaveUnits \let\du=\:rdu \:Zunits\p@ \:dd#1\:Zunits \:d\:Cons\:dd\:Xunitsx \edef\:Xx{\:Cons\:d} \:d\:Cons\:dd\:Xunitsy \edef\:Xy{\:Cons\:d} \:dd#2\:Zunits \:d\:Cons\:dd\:Yunitsx \edef\:Yx{\:Cons\:d} \:d\:Cons\:dd\:Yunitsy \edef\:Yy{\:Cons\:d} \XRecallUnits \let\du=\:svdu } \Define\:xyInitOval(2){ \:d#1\:Xunits \edef\:Xx{\:Cons\:d} \def\:Xy{0} \:d#2\:Yunits \edef\:Yy{\:Cons\:d} \def\:Yx{0} } \def\:FigSize#1#2#3{ \:x\:LBorder \:y\:RBorder \:d\:TeXLoc {\Object\:temp{#3} \setbox\:box\hbox{ \:temp \multiply\:x by \tw@ \multiply\:y by \tw@ \xdef\:FSize{ \noexpand#1=\:Cons\:x; \noexpand#2=\:Cons\:y;}}} \global\:LBorder\:x \global\:RBorder\:y \global\:TeXLoc \:d \:FSize} \expandafter\let \csname 0:Ln \endcsname\:Ln \expandafter\def\csname 1:Ln \endcsname{ \advance\:x -\:X \advance\:y -\:Y \csname 0:Ln \endcsname(\:x,\:y) } \newcount\:ClipLevel \:ClipLevel\@ne \Define\Clip{\futurelet\:next\:Clip} \Define\:Clip{ \ifx \:next[ \expandafter\:DefClipOut \else \expandafter\:DefClip \fi } \def\:DefClipOut[#1]{ \:DefClip(#1) } \Define\:DefClip(1){ \def\:temp{#1} \ifx \:temp\empty \:ClipLevel\@ne \def\:next{\let\:Ln} \expandafter\:next\csname 0:Ln \endcsname \else \def\:temp{\::DefClip(#1)} \fi \:temp } \Define\::DefClip(1){ \MarkLoc(^) \:x\:X \:y \:Y \Move(#1) \ifdim\:x>\:X \:dd\:X \:X\:x \:x\:dd \fi \ifdim\:y>\:Y \:dd\:Y \:Y\:y \:y\:dd \fi \advance\:ClipLevel \@ne \expandafter\edef\csname \the \:ClipLevel :Ln \endcsname{ \:xxx \the\:x \:yyy \the\:y \:xxxx\the\:X \:yyyy\the\:Y \ifx \:next[ \noexpand\:ClipOut \else \noexpand\:ClipIn \fi } \let\:Ln\:ClipLn \MoveToLoc(^) }\def\:ClipLn(#1,#2){ \:x#1\:Xunits \:y#2\:Yunits { \let\:Xunits\empty \let\:Yunits\empty \advance\:x \:X \advance\:y \:Y \ifdim \:x<\:X \:dd\:X \:X\:x \:x\:dd \:dd\:Y \:Y\:y \:y\:dd \fi \:diff\:dd\:X\:x \:diff\:ddd\:Y\:y \:Z \:AbsVal \:dd \advance\:Z \:AbsVal\:ddd \ifdim \:Z>\sixt@@n\p@ \divide\:dd 128 \divide\:ddd 128 \fi \:Z\:Cons\:y\:dd \advance\:Z -\:Cons\:x\:ddd \ifdim \:dd<\z@ \:dd-\:dd \:ddd-\:ddd \:Z-\:Z \fi \csname \the \:ClipLevel :Ln \endcsname } \advance\:X \:x \advance\:Y \:y }\Define\:ClipIn{ \def\:next{\let\:next} \expandafter\:next\csname \the \:ClipLevel :Ln \endcsname \advance\:ClipLevel \m@ne { \:ClipLeft\:xxxx \:ClipDown\:yyy \:ClipUp\:yyyy \:next } { \:ClipRight\:xxx \:ClipDown\:yyy \:ClipUp\:yyyy \:next } { \:ClipDown\:yyyy \:next } \:ClipUp\:yyy \:next } \Define\:ClipOut{ \:ClipLeft\:xxx \:ClipRight\:xxxx \:ClipUp \:yyyy \:ClipDown \:yyy \def\:next{\let\:next} \expandafter\:next \csname \the\:ClipLevel :Ln \endcsname \advance\:ClipLevel \m@ne \:next }\def\:ClipLeft#1{ \ifdim \:x<#1 \:KilledLine \else \ifdim \:X<#1 \:X#1 \ifdim \:dd>\:mmmp \:Y\:Cons\:ddd\:X \advance\:Y \:Z \:divide\:Y\:dd \fi \fi \fi \:CondKilLn } \def\:ClipRight#1{ \ifdim \:X>#1 \:KilledLine \else \ifdim \:x>#1 \:x#1 \ifdim \:dd>\:mmmp \:y\:Cons\:ddd\:x \advance\:y \:Z \:divide\:y\:dd \fi \fi \fi \:CondKilLn } \Define\:CondKilLn{ \:d\:x \advance\:d -\:X \ifdim \:d<\z@ \:d-\:d \fi \ifdim \:y<\:Y \advance\:d \:Y \advance\:d -\:y \else \advance\:d \:y \advance\:d -\:Y \fi \ifdim \:d<\:mmp \:KilledLine \fi \ifdim \:thickness=\z@ \:KilledLine \fi} \Define\:KilledLine{ \let\:ClipLeft\:gobble \let\:ClipRight\:gobble \let\:ClipUp \:gobble \let\:ClipDown \:gobble \let\:next\relax \expandafter\def\csname 1:Ln \endcsname{}}\def\:ClipUp#1{ \:AbsDif\:d\:y\:Y \ifdim \:d<\:ragged \advance\:y 0.5\:thickness \advance\:Y -0.5\:thickness \ifdim \:Y>#1 \:KilledLine \else \ifdim \:y>#1 \:thickness#1 \advance\:thickness -\:Y \advance\:Y 0.5\:thickness \:y\:Y \else \advance\:Y 0.5\:thickness \advance\:y -0.5\:thickness \fi \fi \:dd\p@ \:ddd\z@ \def\:temp{ \:Z\:Y } \:temp \else \let\:temp\relax \ifdim \ifdim\:Y<\:y\:Y\else\:y\fi >#1 \:KilledLine \else \ifdim \::ClipUp#1\:X\:Y \else \ifdim \::ClipUp#1\:x\:y \fi \fi \fi \fi \:CondKilLn } \def\::ClipUp#1#2#3{ #3>#1 #3#1 \ifdim \:AbsVal\:ddd>\:mmmp #2\:Cons\:dd#3 \advance#2 -\:Z \:divide#2\:ddd \fi }\def\:ClipDown#1{ \:Ex2#1 \:Flip\:y \:Flip\:Y \:ClipUp#1 \:Flip\:y \:Flip\:Y \:temp } \def\:Flip#1{ #1-#1 \advance#1 \:Ex } \Define\:SetDrawWidth{ \hsize\:RBorder \advance\hsize -\:LBorder \leftskip -\:LBorder \rightskip\z@} \newdimen\:thickness \:thickness0.75\p@ \Define\PenSize(1){\:thickness#1\relax} \Define\:Draw{ \ifvmode \noindent\hfil\fi \global\:TeXLoc\z@ \vbox\bgroup \begingroup \def\EndDraw{ \endgroup \:SetDrawWidth \egroup} \:DraCatCodes \parindent\z@ \everypar{} \leftskip\z@ \rightskip\z@ \boxmaxdepth\maxdimen \let\FigSize\:FigSize \def\Draw{\:wrn1{}} \:CommonIID \:InDraw } \Define\:CommonIID{\def\RotateTo{\:RotateTo} \def\Rotate{\:Rotate} \def\MoveF{\:MvF}\def\LineToLoc{\:LnToLoc}}\newdimen\:Xunits \:Xunits\p@ \newdimen\:Yunits \:Yunits\p@ \Define\:InDraw{\:Opt()\::InDraw{\:Xunits,\:Yunits}} \Define\::InDraw(2){ \:X\z@ \:Y\z@ \:Xunits#1 \relax \:Yunits#2 \:AdjRunits \global\:LBorder\z@ \global\:RBorder\z@ \:loadIID \leavevmode } \Define\:Resize(2){ \:Xunits#1\:Xunits \relax \:Yunits#2\:Yunits \:AdjRunits } \Define\:Units(2){ \:Xunits#1 \relax \:Yunits#2 \:AdjRunits } \Define\:loadIID{ \def\LineAt{\:DLn} \def\LineTo{\:LnTo} \def\MoveTo{\:MvTo} \def\Line{\:Ln} \def\Move{\:Mv} \def\MoveF{\:MvF} \:rotatedfalse\def\:InitOval{\:xyInitOval} \def\Scale{\:Resize} \def\Units{\:Units}}\let\SaveAll\begingroup \let\RecallAll\endgroup \def\DrawOn{\def\Draw{\:Draw}} \DrawOn \def\DrawOff{\def\Draw{\begingroup \:J\@cclv \:NoDrawSpecials \:NoDraw}} \catcode`\/0 \catcode`\\11 /def/:NoDraw#1\EndDraw{/endgroup} /catcode`/\0 /catcode`//12 \def\:NoDrawSpecials{\catcode\:J11 \ifnum \:J=\z@ \let \:NoDrawSpecials\relax \fi \advance\:J \m@ne \:NoDrawSpecials} \let\:XunitsReg\:Xunits \let\:YunitsReg\:Yunits \Define\EntryExit(4){ \edef\:InOut##1{ \noexpand\ifcase ##1\space #1\noexpand\or #2\noexpand\or #3\noexpand\or #4\noexpand\fi}} \EntryExit(0,0,0,0)\Define\:DrawBox{ \:x0.5\wd\:box \:y\ht\:box \advance\:y \dp\:box \divide\:y \tw@ \advance \:X -\:InOut0\:x \advance \:Y -\:InOut1\:y { \advance \:X -\:x \advance \:Y -\:y { \ifdim\:X<\:LBorder \global\:LBorder\:X\fi \advance\:X \wd\:box \ifdim\:X>\:RBorder \global\:RBorder\:X\fi } \advance \:Y \dp\:box {\:d\:X \advance\:d \wd\:box \advance\:X -\:TeXLoc \global\:TeXLoc\:d \vrule width\:X depth\z@ height\z@ \raise \:Y \box\:box} } \edef\MoveToExit(##1,##2){ \:X\the\:X \:Y\the\:Y \:x\the\:x \:y\the\:y \advance\:X ##1\:x \advance\:Y ##2\:y} \advance \:X \:InOut2\:x \advance \:Y \:InOut3\:y } \Define\ThreeDim{\:Opt[]\:ThreeDim{\p@}} \def\:ThreeDim[#1](#2){\::ThreeDim[#1](#2,,)} \def\::ThreeDim[#1](#2,#3,#4,#5){ \bgroup\begingroup \def\EndThreeDim{ \endgroup\egroup} \:IIIDtrue \:Zunits#1 \:Z\z@ \def\:temp{#4} \ifx \:temp\empty \:CosSin{#3\p@} \:divide\:x\:y \:Ey\:x \:CosSin{#2\p@} \:Ex\:Cons\:Ey\:x \:Ey\:Cons\:Ey\:y \let\:project\:projectPar \else \:Ex#2\:Xunits \:Ey#3\:Yunits \:Ez#4\:Zunits \let\:project\:projectPer \fi \def\LineAt{\:tDLn} \def\LineTo{\:tLnTo} \def\MoveTo{\:tMvTo} \def\Line{\:tLn} \def\Move{\:tMv} \def\Scale{\:tResize} \def\Units{\:tUnits}\def\RotateTo{\:tRotateTo} \def\Rotate{\:tRotate} \def\MoveF{\:tMvF} \:Vdirection\z@ \def\LineToLoc{\:tLnToLoc} } \Define\:projectPer{ \:diff\:x\:X\:Ex \:diff\:y\:Y\:Ey \:diff\:xxxx\:Z\:Ez \:divide\:x\:xxxx \:divide\:y\:xxxx \:x-\:Cons\:Ez\:x \:y-\:Cons\:Ez\:y \advance\:x \:Ex \advance\:y \:Ey} \Define\:projectPar{ \:x\:Cons\:Ex\:Z \advance\:x \:X \:y\:Cons\:Ey\:Z \advance\:y \:Y} \def\:tDLn(#1,#2,#3,{\:tMvTo(#1,#2,#3) \:tLnTo(} \Define\:tMvTo(3){ \:X#1\:Xunits \:Y#2\:Yunits \:Z#3\:Zunits} \Define\:tMv(3){ \advance\:X #1\:Xunits \advance\:Y #2\:Yunits \advance\:Z #3\:Zunits} \Define\:tResize(3){ \:Xunits#1\:Xunits \:Yunits#2\:Yunits \:Zunits#3\:Zunits \:AdjRunits} \Define\:tUnits(3){ \:Xunits#1 \relax \:Yunits#2 \relax \:Zunits#3 \:AdjRunits}\Define\:tLnTo(3){ \:project \edef\:temp{\:x\the\:x \:y\the\:y} \:X#1\:Xunits \:Y#2\:Yunits \:Z#3\:Zunits \:DLN} \Define\:tLn(3){ \:project \edef\:temp{\:x\the\:x \:y\the\:y} \advance\:X #1\:Xunits \advance\:Y #2\:Yunits \advance\:Z #3\:Zunits \:DLN} \Define\:DLN{ \TwoDim \:temp \LineTo(\:x\du,\:y\du) \EndTwoDim }\Define\TwoDim{\bgroup\begingroup \def\EndTwoDim{\endgroup\egroup} \:loadIID \if:IIID \:IIIDfalse \:project \:X\:x \:Y\:y \:CommonIID \fi \Units(\:Xunits,\:Yunits)} \newif\if:rotated \Define\RotatedAxes(2){\begingroup \def\EndRotatedAxes{\endgroup} \if:IIID \:IIIDfalse \:project \:X\:x \:Y\:y \:CommonIID \fi \:DK#2\p@ \advance\:DK -#1\p@ \advance\:DK -\:CVXXX \:NormalizeDeg\:DK \ifdim \:DK<\:mmp \:wrn4{(#1,#2)} \else \:DK#1\p@ \:NormalizeDeg\:DK \:CosSin\:DK \:Xunitsx\:x \:Xunitsy\:y \:DK#2\p@ \advance\:DK -\:XC \:NormalizeDeg\:DK \:CosSin\:DK \edef\Units(##1,##2){\noexpand\:Units(##1,##2) \:Xunitsx \:Cons\:Xunitsx\:Xunits \:Xunitsy \:Cons\:Xunitsy\:Xunits \:Yunitsx-\:Cons\:y\:Yunits \:Yunitsy \:Cons\:x\:Yunits } \fi \def\Scale{\:rResize} \def\MoveTo{\:rMvTo} \def\Move{\:rMv} \def\LineTo{\:rLnTo} \def\Line{\:rLn} \def\LineAt{\:rDLn} \def\MoveF{\:rMvF}\def\:InitOval{\:rInitOval} \MarkLoc(:org) \Units(\:Xunits,\:Yunits) \:rotatedtrue } \newdimen\:Xunitsx \newdimen\:Xunitsy \newdimen\:Yunitsx \newdimen\:Yunitsy \Define\:rResize(2){ \:Xunits #1\:Xunits \:Yunits #2\:Yunits \:Xunitsx#1\:Xunitsx \:Xunitsy#1\:Xunitsy \:Yunitsx#2\:Yunitsx \:Yunitsy#2\:Yunitsy } \def\:rdu#1{% \ifx #1\:Xunits \units:i\else \ifx #1\:Yunits \units:i\else \ifx #1\:Zunits \units:i\else #1\fi \fi \fi } \def\units:i{\Units(\p@,\p@)} \Define\:rMvTo{\MoveToLoc(:org) \:rMv} \Define\:rMv(1){ \:rxy(#1) \advance\:X \:x \advance\:Y \:y} \Define\:rLnTo(1){ \MarkLoc(:a) \:rMvTo(#1) {\LineToLoc(:a)} } \Define\:rLn(1){ \:rxy(#1) \:Ln(\:x\du,\:y\du) } \def\:rDLn(#1,#2,{\:rMvTo(#1,#2)\:rLnTo(} \Define\:rxy(2){ \XSaveUnits \let\du=\:rdu \:Zunits\p@ \:Zunits#1\:Zunits \:x\:Cons\:Zunits\:Xunitsx \:y\:Cons\:Zunits\:Xunitsy \XRecallUnits \XSaveUnits \:Zunits\p@ \:Zunits#2\:Zunits \advance\:x \:Cons\:Zunits\:Yunitsx \advance\:y \:Cons\:Zunits\:Yunitsy \XRecallUnits \let\du=\:svdu} \Define\:rMvF(1){ \:CosSin\:direction \XSaveUnits \let\du=\:rdu \:Zunits\p@ \:Zunits#1\:Zunits \:x\:Cons\:Zunits\:x \:y\:Cons\:Zunits\:y \edef\:temp{(\:Cons\:x,\:Cons\:y)} \expandafter\Move\:temp \XRecallUnits \let\du=\:svdu} \Define\:AdjRunits{ \:Xunitsx\:Xunits \:Xunitsy\z@ \:Yunitsx\z@ \:Yunitsy\:Yunits} \Define\Text{ \setbox\:box \vtop\bgroup \edef\DoReg{\the\DoReg} \hyphenpenalty\@M \exhyphenpenalty\@M \catcode`\ 10 \catcode`\^^M13 \catcode`\^^I10 \catcode`\&4 \let~\space \:Text} \catcode`\^^M13 % \def\:Text(--#1--){% \:SetLines#1\hbox{}^^M--)^^M % \egroup % \if:IIID \TwoDim \:DrawBox \EndTwoDim % \else \:DrawBox \fi} % \def\:SetLines#1^^M{ % \def\:TextLine{#1} % \ifx \:TextLine\:LastLine \let\:temp\relax % \else \def\:temp{ % \:IndirectLines#1\relax~~--)~~\:SetLines}% \fi \:temp } \catcode`\^^M9 \def\:IndirectLines#1~~{ \def\:TextLine{#1} \ifx \:TextLine\:LastLine \let\:temp\relax \else \def\:temp{\:AddLine{#1}\:IndirectLines} \fi \:temp } \Define\:LastLine{--)} \def\:AddLine#1{ \ifvmode \noindent \hsize\z@ \else \hfil \penalty-500 \hbox{} \fi \hfil#1 \setbox\:box\hbox{#1} \ifdim \wd\:box>\hsize \hsize\wd\:box \fi}\def\TextPar#1#2{ \def\:TxtPar##1(##2){##1(--##2--)} \edef\:temp{\expandafter\noexpand\csname :\string#2\endcsname} \edef#2{\noexpand\:TextPar\expandafter\noexpand\:temp} \expandafter\let\:temp\:undefined \expandafter#1\:temp} \catcode`\^^M13 \def\:TextPar#1{\begingroup \catcode`\&4 % \catcode`\ 10 \catcode`\^^M13 \catcode`\^^I10 % \:TPar{#1}} \catcode`\^^M9 % \def\:TPar#1(--#2--){\endgroup #1(--#2--) } \newdimen\:direction \newdimen\:Vdirection \Define\:Rotate(1){ \advance \:direction #1\p@ \:NormalizeDeg\:direction } \Define\:RotateTo(1){ \:direction #1\p@ \:NormalizeDeg\:direction } \Define\:tRotate(2){ \advance\:Vdirection #2\p@ \:NormalizeDeg\:Vdirection \:Rotate(#1)} \Define\:tRotateTo(2){ \:Vdirection #2\p@ \:NormalizeDeg\:Vdirection \:RotateTo(#1)} \Define\LineF(1){\MarkLoc(,)\MoveF(#1) {\LineToLoc(,)}} \Define\:MvF(1){ \:CosSin\:direction \:d#1\:Xunits \advance\:X \:Cons\:d\:x \:d#1\:Yunits \advance\:Y \:Cons\:d\:y } \Define\MoveFToOval(2){ \:NormalizeDeg\:direction \:CosSin\:direction \:Zunits\p@ \:d#2\:Zunits \:x\:Cons\:d\:x \ifdim \:d=\z@ \:err5{...,\:Cons\:d} \fi \:d#1\:Zunits \:y\:Cons\:d\:y \ifdim \:d=\z@ \:err5{\:Cons\:d,...} \fi \:SearchDir \XSaveUnits \if:rotated \:Zunits\p@ \:Zunits#1\:Zunits \:x\:Cons\:Zunits\:Xunits \:Zunits\p@ \:Zunits#2\:Zunits \:y\:Cons\:Zunits\:Yunits \else \:x#1\:Xunits \:y#2\:Yunits \fi \relax \Units(\:x,\:y) \:Vdirection\:direction \:direction\:ddd \MoveF(\@ne) \:direction\:Vdirection \XRecallUnits } \Define\:tMvF(1){ \:CosSin\:Vdirection \:d #1\:Zunits \advance\:Z \:Cons\:y\:d \:xx#1\:Xunits \:yy#1\:Yunits \:xx\:Cons\:x\:xx \:yy\:Cons\:x\:yy \:CosSin\:direction \:x\:Cons\:xx\:x \:y\:Cons\:yy\:y \advance\:X \:x \advance\:Y \:y } \Define\CSeg{\:Opt[]\:CSeg1} \def\:CSeg[#1]#2(#3,#4){ \MarkLoc($^) \MoveToLoc(#4) \:x\:X \:y\:Y \if:IIID \:d\:Z \fi \MoveToLoc(#3) \advance\:x -\:X \:x#1\:x \advance\:y -\:Y \:y#1\:y \if:IIID \advance\:d -\:Z \:d#1\:d \fi \:t{#2} \edef\:temp{\the\:t( \expandafter\:Frac\the\:x\noexpand\:du, \expandafter\:Frac\the\:y\noexpand\:du \if:IIID , \expandafter\:Frac\the\:d\noexpand\:du \fi)} \MoveToLoc($^) \:temp}\Define\LSeg{\:Opt[]\:LSeg1} \def\:LSeg[#1]#2(#3,#4){ \:distance(#3,#4) \:d#1\:d \:t{#2} \edef\:temp{\the\:t(\expandafter\:Frac\the\:d\noexpand\:du)} \:temp}\Define\DSeg{\:Opt[]\:DSeg1} \def\:DSeg[#1]#2(#3,#4){ \MarkLoc(^) \MoveToLoc(#4) \:xxx\:X \:yyy\:Y \:xxxx\:Z \MoveToLoc(#3) \advance\:xxx -\:X \advance\:yyy -\:Y \ifdim \:AbsVal\:xxx<\:mmmp \ifdim \:AbsVal\:yyy<\:mmmp \:wrn5{#3,#4} \fi\fi \if:IIID \advance \:xxxx -\:Z \:divide\:xxx\:Xunitsx \:divide\:yyy\:Yunitsy \:divide\:xxxx\:Zunits \:x\:xxx \:y\:yyy \:ddd\z@ \:length \:x\:d \:y\:xxxx \:SearchDir \:yyyy\:ddd \:x\:xxx \:y\:yyy \else \:x \:AbsVal\:Yunitsy \:y \:AbsVal\:Xunitsy \ifdim \:y>\:x \:x\:y \fi \:y \:AbsVal\:Yunitsx \ifdim \:y>\:x \:x\:y \fi \:y \:AbsVal\:Xunitsx \ifdim \:y>\:x \:x\:y \fi \:K \:InCons\:x \relax \ifnum \:K<\thr@@ \:K\@ne \else \ifnum \:K<\sixt@@n \:K4 \else \ifnum \:K<\:XC \:K\sixt@@n \else \ifnum \:K<\@m \:K\@cclvi \fi \fi \fi \fi \divide\:xxx \:K \divide\:yyy \:K \:x \:Cons\:Yunitsy\:xxx \advance\:x -\:Cons\:Yunitsx\:yyy \:y-\:Cons\:Xunitsy\:xxx \advance\:y \:Cons\:Xunitsx\:yyy \fi \:SearchDir \:ddd#1\:ddd \:t{#2} \edef\:temp{\the\:t( \:Cons\:ddd \if:IIID ,\:Cons\:yyyy \fi)} \MoveToLoc(^) \:temp} \def\:theDoReg{\def\DoReg{\the\:DoReg}} \Define\MarkLoc{ \:theDoReg \expandafter\edef \csname \:MarkLoc} \Define\MarkGLoc{ \:theDoReg \expandafter\xdef \csname \:MarkLoc} \Define\:MarkLoc(1){ Loc\space#1:\endcsname{ \:X\the\:X \:Y\the\:Y \if:IIID \:Z\the\:Z \fi } \let\DoReg\:DoReg } \Define\MoveToLoc(1){ \:theDoReg \expandafter\ifx \csname Loc\space#1:\endcsname\relax \:err2{#1}\fi \csname Loc\space#1:\endcsname \let\DoReg\:DoReg } \Define\MarkPLoc(1){ \:theDoReg \if:IIID \:project \expandafter\edef \csname Loc\space#1:\endcsname{ \:X\the\:x \:Y\the\:y \:Z\z@} \else \:err1\MarkPLoc \fi \let\DoReg\:DoReg} \Define\WriteLoc(1){{ \:theDoReg \edef\:temp{#1} \ifx \:temp\empty \else \MoveToLoc(#1) \fi \immediate\write\sixt@@n{... \:temp=(\the\:X,\the\:Y\if:IIID,\the\:Z\fi)}}} \Define\:LnToLoc(1){ \:x\:X \:y\:Y \MoveToLoc(#1) { \:LnTo(\:x\du,\:y\du) }} \Define\:tLnToLoc(1){ \:xx\:X \:yy\:Y \:dd\:Z \MoveToLoc(#1) { \:tLnTo(\:xx\du,\:yy\du,\:dd\du) }}\def\:GetLine#1#2#3#4#5{ \MoveToLoc(#1) \divide\:X \:eight \divide\:Y \:eight #3\:X #4\:Y \MoveToLoc(#2) \divide\:X \:eight \divide\:Y \:eight \advance #3 -\:X \advance #4 -\:Y #5\:Cons#3\:Y \advance #5 -\:Cons#4\:X \divide #3 \:eight \divide #4 \:eight \relax } \def\MoveToLL(#1,#2)(#3,#4){ \:GetLine{#1}{#2}\:x \:y \:xxx \:GetLine{#3}{#4}\:xx\:yy\:xxxx \:ddd \:Cons\:x \:yy \advance\:ddd -\:Cons\:xx\:y \ifdim \:AbsVal\:ddd < \:mmmp \:X\@cclv\p@ \:Y\:X \:wrn3{(\string#1,\string#2)(\string#3,\string#4)} \else \:divide\:xxx\:ddd \:divide\:xxxx\:ddd \:X\:Cons\:xxx\:xx \advance\:X -\:Cons\:xxxx\:x \:Y\:Cons\:xxx\:yy \advance\:Y -\:Cons\:xxxx\:y \fi }\Define\MoveToCC{\:Opt[]\:MoveToCC{}} \def\:MoveToCC[#1](#2,#3)(#4,#5){ \:UserUnits(#2,#3)(#4,#5) \:distance($#2,$#4) \ifnum \:d<\:mp \MoveToLoc(#3) \:wrn3{(#1,#2)(#3,#4)} \else \:xx \:d \:distance($#2,$#3) \:xxx\:d \:distance($#5,$#4) \:yy \:xxx \advance\:yy -\:d \:yyy\:xxx \advance\:yyy \:d \:divide\:yy\:xx \:yy\:Cons\:yy\:yyy \advance\:yy \:xx \divide\:yy \tw@ \:yyy \ifdim \:AbsVal\:xxx>\:AbsVal\:yy \:xxx \else \:yy \fi \ifdim \:AbsVal\:yyy<\:mp \:yyy\z@ \else \:divide\:xxx\:yyy \:sqr\:xxx \:yyyy\:yy \:divide\:yyyy\:yyy \:sqr\:yyyy \advance\:xxx -\:yyyy \:Sqrt\:xxx \:yyy\:Cons\:yyy\:xxx \fi \MoveToLoc($#4) \:x\:X \:y\:Y \:divide\:yy\:xx \MoveToLoc($#2) \advance\:x -\:X \advance\:y -\:Y \advance\:X \:Cons\:yy\:x \advance\:Y \:Cons\:yy\:y \:divide\:yyy\:xx \advance\:X #1\:Cons\:yyy\:y \advance\:Y -#1\:Cons\:yyy\:x \fi \:SysUnits }\def\:UserUnits(#1,#2)(#3,#4){ \:xx\:Xunitsx \:xxx\:Xunitsy \:yy\:Yunitsx \:yyy\:Yunitsy \:xxxx\:Cons\:yy\:xxx \advance\:xxxx \:Cons\:yyy\:xx \ifdim \:AbsVal\:xxxx>\:mmmp \:divide\:xx\:xxxx \:divide\:xxx{-\:xxxx} \:divide\:yy{\:xxxx} \:divide\:yyy\:xxxx \fi \:UnLoc(#1) \:UnLoc(#2) \:UnLoc(#3) \:UnLoc(#4)}\Define\:SysUnits{ \MoveTo(\:Cons\:X,\:Cons\:Y)}\Define\:UnLoc(1){ \MoveToLoc(#1) \:d\:Cons\:yyy\:X \advance\:d \:Cons\:yy\:Y \:Y\:Cons\:xx\:Y \advance\:Y \:Cons\:xxx\:X \:X\:d \MarkLoc($#1)}\def\MoveToLC{\:Opt[]\:MoveToLC{}} \def\:MoveToLC[#1](#2,#3)(#4,#5){ \:UserUnits(#2,#3)(#4,#5) \MoveToLoc($#2) \:x\:X \:y\:Y \MoveToLoc($#3) \advance\:x -\:X \advance\:y -\:Y \edef\:temp{ \:xxx\the\:x \:yyy\the\:y } \MoveToLoc($#4) \advance\:X \:y \advance\:Y -\:x \MarkLoc(^$) \MoveToLL($#4,^$)($#2,$#3) \MarkLoc(^$) \:distance($#4,$#5) \:xx\:d \:distance($#4,^$) \ifdim \:d>\:xx \:wrn3{(#2,#3)(#4,#5)} \else \ifdim \:d<\:mmp \:yy\:xx \else \:yy\:d \:divide\:yy\:xx \:sqr\:yy \:yy-\:yy \advance\:yy \p@ \:Sqrt\:yy \:yy\:Cons\:xx\:yy \fi \fi \:temp \:x\:xxx \:y\:yyy \:length \:xx\:d \:divide\:xxx\:xx \:divide\:yyy\:xx \advance\:X #1\:Cons\:yy\:xxx \advance\:Y #1\:Cons\:yy\:yyy \:SysUnits } \def\Object#1{\:Opt(){\:DefineSD#1}0} \def\:DefineSD#1(#2){\begingroup \:multid#1 \:DraCatCodes \:DefSD#1(#2)} \def\:DefSD#1(#2)#3{ \expandafter\::Define\csname\string#1.\endcsname(#2){ \:t{\:SubD{#3}} \if:IIID \edef\:temp{\noexpand\TwoDim \the\:t \noexpand\EndTwoDim} \else \def\:temp{\the\:t} \fi \:temp} \def#1{\def\:SDname{\csname\string#1.\endcsname} \:Opt[]\:CallSD{}}} \def\:CallSD[#1]{ \edef\:Entry{#1} \:SDname }\def\:SubD#1{ \let\::RecallXLoc\:AddXLoc \gdef\:AddXLoc{} \edef\:RecallBor{ \global\:LBorder \the\:LBorder \global\:RBorder \the\:RBorder \global\:TeXLoc\the\:TeXLoc } \global\:TeXLoc\z@ \setbox\:box\vbox{\EntryExit(0,0,0,0) \begingroup \def\MarkXLoc{\:MarkXLoc} \:InDraw #1 \endgroup \:SetDrawWidth \let\:XLoc\relax \xdef\:AddXLoc{\:dd\the\:LBorder \:AddXLoc}} \:RecallBor \:ddd\dp\:box \ifx \:Entry\empty \:DrawBox \else \let\:RecallIn\:InOut \:x\:X \:y\:Y \def\:XLoc(##1,##2,##3){ \def\:temp{##1} \ifx \:temp\:Entry \:X\:x \advance\:X -##2 \:Y\:y \advance\:Y -##3 \fi} \:AddXLoc \advance\:X \:dd \advance\:Y -\:ddd \EntryExit(-1,-1,\:InOut2,\:InOut3) \:DrawBox \let\:InOut\:RecallIn \fi \MarkLoc(^) \MoveToExit(-1,-1) \:xxx\:X \:yyy\:Y \advance\:yyy \:ddd \def\:XLoc(##1,##2,##3){ \:X\:xxx \advance\:X ##2 \advance\:X -\:dd \:Y\:yyy \advance\:Y ##3 \MarkLoc(##1)} \:AddXLoc \MoveToLoc(^) \ifx \:Entry\empty \else \MoveToLoc(\:Entry) \fi \global\let\:AddXLoc\::RecallXLoc } \Define\:MarkXLoc(1){ \:theDoReg \let\:XLoc\relax \xdef\:AddXLoc{\:AddXLoc \:XLoc(#1,\the\:X,\the\:Y)} \let\DoReg\:DoReg} \catcode`\ 10 \catcode`\^^M5 \catcode`\^^I10 \let\wlog\:wlog \let\:wlog\:undefined \:RestoreCatcodes \tracingstats1 \endinput