home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Tex / Tex29 / StTeXmac.zoo / macros / piclatex.sty < prev    next >
Text File  |  1988-10-16  |  79KB  |  2,208 lines

  1. \catcode`@=11 \catcode`!=11
  2. \expandafter\ifx\csname fiverm\endcsname\relax
  3.   \let\fiverm\fivrm
  4. \fi
  5. \let\!latexendpicture=\endpicture 
  6. \let\!latexframe=\frame
  7. \let\!latexlinethickness=\linethickness
  8. \let\!latexmultiput=\multiput
  9. \let\!latexput=\put
  10. \def\@picture(#1,#2)(#3,#4){%
  11.   \@picht #2\unitlength
  12.   \setbox\@picbox\hbox to #1\unitlength\bgroup 
  13.   \let\endpicture=\!latexendpicture
  14.   \let\frame=\!latexframe
  15.   \let\linethickness=\!latexlinethickness
  16.   \let\multiput=\!latexmultiput
  17.   \let\put=\!latexput
  18.   \hskip -#3\unitlength \lower #4\unitlength \hbox\bgroup}
  19. \catcode`@=12 \catcode`!=12
  20. \catcode`!=11 %  ***** THIS MUST NEVER BE OMITTED
  21. \def\PiC{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC}
  22. \def\PiCTeX{\PiC\kern-.11em\TeX}
  23. \def\!ifnextchar#1#2#3{%
  24.   \let\!testchar=#1%
  25.   \def\!first{#2}%
  26.   \def\!second{#3}%
  27.   \futurelet\!nextchar\!testnext}
  28. \def\!testnext{%
  29.   \ifx \!nextchar \!spacetoken 
  30.     \let\!next=\!skipspacetestagain
  31.   \else
  32.     \ifx \!nextchar \!testchar
  33.       \let\!next=\!first
  34.     \else 
  35.       \let\!next=\!second 
  36.     \fi 
  37.   \fi
  38.   \!next}
  39. \def\\{\!skipspacetestagain} 
  40.   \expandafter\def\\ {\futurelet\!nextchar\!testnext} 
  41. \def\\{\let\!spacetoken= } \\  %  ** set \spacetoken to a space token
  42. \def\!tfor#1:=#2\do#3{%
  43.   \edef\!fortemp{#2}%
  44.   \ifx\!fortemp\!empty 
  45.     \else
  46.     \!tforloop#2\!nil\!nil\!!#1{#3}%
  47.   \fi}
  48. \def\!tforloop#1#2\!!#3#4{%
  49.   \def#3{#1}%
  50.   \ifx #3\!nnil
  51.     \let\!nextwhile=\!fornoop
  52.   \else
  53.     #4\relax
  54.     \let\!nextwhile=\!tforloop
  55.   \fi 
  56.   \!nextwhile#2\!!#3{#4}}
  57. \def\!etfor#1:=#2\do#3{%
  58.   \def\!!tfor{\!tfor#1:=}%
  59.   \edef\!!!tfor{#2}%
  60.   \expandafter\!!tfor\!!!tfor\do{#3}}
  61. \def\!cfor#1:=#2\do#3{%
  62.   \edef\!fortemp{#2}%
  63.   \ifx\!fortemp\!empty 
  64.   \else
  65.     \!cforloop#2,\!nil,\!nil\!!#1{#3}%
  66.   \fi}
  67. \def\!cforloop#1,#2\!!#3#4{%
  68.   \def#3{#1}%
  69.   \ifx #3\!nnil
  70.     \let\!nextwhile=\!fornoop 
  71.   \else
  72.     #4\relax
  73.     \let\!nextwhile=\!cforloop
  74.   \fi
  75.   \!nextwhile#2\!!#3{#4}}
  76. \def\!ecfor#1:=#2\do#3{%
  77.   \def\!!cfor{\!cfor#1:=}%
  78.   \edef\!!!cfor{#2}%
  79.   \expandafter\!!cfor\!!!cfor\do{#3}}
  80. \def\!empty{}
  81. \def\!nnil{\!nil}
  82. \def\!fornoop#1\!!#2#3{}
  83. \def\!ifempty#1#2#3{%
  84.   \edef\!emptyarg{#1}%
  85.   \ifx\!emptyarg\!empty
  86.     #2%
  87.   \else
  88.     #3%
  89.   \fi}
  90. \def\!getnext#1\from#2{%
  91.   \expandafter\!gnext#2\!#1#2}%
  92. \def\!gnext\\#1#2\!#3#4{%
  93.   \def#3{#1}%
  94.   \def#4{#2\\{#1}}%
  95.   \ignorespaces}
  96. \def\!getnextvalueof#1\from#2{%
  97.   \expandafter\!gnextv#2\!#1#2}%
  98. \def\!gnextv\\#1#2\!#3#4{%
  99.   #3=#1%
  100.   \def#4{#2\\{#1}}%
  101.   \ignorespaces}
  102. \def\!copylist#1\to#2{%
  103.   \expandafter\!!copylist#1\!#2}
  104. \def\!!copylist#1\!#2{%
  105.   \def#2{#1}\ignorespaces}
  106. \def\!wlet#1=#2{%
  107.   \let#1=#2 
  108.   \wlog{\string#1=\string#2}}
  109. \def\!listaddon#1#2{%
  110.   \expandafter\!!listaddon#2\!{#1}#2}
  111. \def\!!listaddon#1\!#2#3{%
  112.   \def#3{#1\\#2}}
  113. \def\!rightappend#1\withCS#2\to#3{\expandafter\!!rightappend#3\!#2{#1}#3}
  114. \def\!!rightappend#1\!#2#3#4{\def#4{#1#2{#3}}}
  115. \def\!leftappend#1\withCS#2\to#3{\expandafter\!!leftappend#3\!#2{#1}#3}
  116. \def\!!leftappend#1\!#2#3#4{\def#4{#2{#3}#1}}
  117. \def\!lop#1\to#2{\expandafter\!!lop#1\!#1#2}
  118. \def\!!lop\\#1#2\!#3#4{\def#4{#1}\def#3{#2}}
  119. \def\!loop#1\repeat{\def\!body{#1}\!iterate}
  120. \def\!iterate{\!body\let\!next=\!iterate\else\let\!next=\relax\fi\!next}
  121. \def\!!loop#1\repeat{\def\!!body{#1}\!!iterate}
  122. \def\!!iterate{\!!body\let\!!next=\!!iterate\else\let\!!next=\relax\fi\!!next}
  123. \def\!removept#1#2{\edef#2{\expandafter\!!removePT\the#1}}
  124. {\catcode`p=12 \catcode`t=12 \gdef\!!removePT#1pt{#1}}
  125. \def\placevalueinpts of <#1> in #2 {%
  126.   \!removept{#1}{#2}}
  127. \def\!mlap#1{\hbox to 0pt{\hss#1\hss}}
  128. \def\!vmlap#1{\vbox to 0pt{\vss#1\vss}}
  129. \def\!not#1{%
  130.   #1\relax
  131.     \!switchfalse
  132.   \else
  133.     \!switchtrue
  134.   \fi
  135.   \if!switch
  136.   \ignorespaces}
  137. \let\!!!wlog=\wlog              % "\wlog" is defined in plain TeX
  138. \def\wlog#1{}    
  139. \newdimen\headingtoplotskip     %.A.................
  140. \newdimen\linethickness         %.A..X....U........T
  141. \newdimen\longticklength        %.A................T
  142. \newdimen\plotsymbolspacing     %......D...L....Q...
  143. \newdimen\shortticklength       %.A................T
  144. \newdimen\stackleading          %.A..........P......
  145. \newdimen\tickstovaluesleading  %.A................T
  146. \newdimen\totalarclength        %......D...L....Q...
  147. \newdimen\valuestolabelleading  %.A.................
  148. \newbox\!boxA                   %.AW...............T
  149. \newbox\!boxB                   %..W................
  150. \newbox\!picbox                 %............P......
  151. \newbox\!plotsymbol             %..........L..O.....
  152. \newbox\!putobject              %............PO...S.
  153. \newbox\!shadesymbol            %.................S.
  154. \newcount\!countA               %.A....D..UL....Q.ST
  155. \newcount\!countB               %......D..U.....Q.ST
  156. \newcount\!countC               %...............Q..T
  157. \newcount\!countD               %...................
  158. \newcount\!countE               %.............O....T
  159. \newcount\!countF               %.............O....T
  160. \newcount\!countG               %..................T
  161. \newcount\!fiftypt              %.........U.........
  162. \newcount\!intervalno           %..........L....Q...
  163. \newcount\!npoints              %..........L........
  164. \newcount\!nsegments            %.........U.........
  165. \newcount\!ntemp                %............P......
  166. \newcount\!parity               %.................S.
  167. \newcount\!scalefactor          %..................T
  168. \newcount\!tfs                  %.......V...........
  169. \newcount\!tickcase             %..................T
  170. \newdimen\!Xleft                %............P......
  171. \newdimen\!Xright               %............P......
  172. \newdimen\!Xsave                %.A................T
  173. \newdimen\!Ybot                 %............P......
  174. \newdimen\!Ysave                %.A................T
  175. \newdimen\!Ytop                 %............P......
  176. \newdimen\!angle                %........E..........
  177. \newdimen\!arclength            %..W......UL....Q...
  178. \newdimen\!areabloc             %.A........L........
  179. \newdimen\!arealloc             %.A........L........
  180. \newdimen\!arearloc             %.A........L........
  181. \newdimen\!areatloc             %.A........L........
  182. \newdimen\!bshrinkage           %.................S.
  183. \newdimen\!checkbot             %..........L........
  184. \newdimen\!checkleft            %..........L........
  185. \newdimen\!checkright           %..........L........
  186. \newdimen\!checktop             %..........L........
  187. \newdimen\!dimenA               %.AW.X.DVEUL..OYQRST
  188. \newdimen\!dimenB               %....X.DVEU...O.QRS.
  189. \newdimen\!dimenC               %..W.X.DVEU......RS.
  190. \newdimen\!dimenD               %..W.X.DVEU....Y.RS.
  191. \newdimen\!dimenE               %..W........G..YQ.S.
  192. \newdimen\!dimenF               %...........G..YQ.S.
  193. \newdimen\!dimenG               %...........G..YQ.S.
  194. \newdimen\!dimenH               %...........G..Y..S.
  195. \newdimen\!dimenI               %...BX.........Y....
  196. \newdimen\!distacross           %..........L....Q...
  197. \newdimen\!downlength           %..........L........
  198. \newdimen\!dp                   %.A..X.......P....S.
  199. \newdimen\!dshade               %.................S.
  200. \newdimen\!dxpos                %..W......U..P....S.
  201. \newdimen\!dxprime              %...............Q...
  202. \newdimen\!dypos                %..WB.....U..P......
  203. \newdimen\!dyprime              %...............Q...
  204. \newdimen\!ht                   %.A..X.......P....S.
  205. \newdimen\!leaderlength         %......D..U.........
  206. \newdimen\!lshrinkage           %.................S.
  207. \newdimen\!midarclength         %...............Q...
  208. \newdimen\!offset               %.A................T
  209. \newdimen\!plotheadingoffset    %.A.................
  210. \newdimen\!plotsymbolxshift     %..........L..O.....
  211. \newdimen\!plotsymbolyshift     %..........L..O.....
  212. \newdimen\!plotxorigin          %..........L..O.....
  213. \newdimen\!plotyorigin          %..........L..O.....
  214. \newdimen\!rootten              %...........G.......
  215. \newdimen\!rshrinkage           %.................S.
  216. \newdimen\!shadesymbolxshift    %.................S.
  217. \newdimen\!shadesymbolyshift    %.................S.
  218. \newdimen\!tenAa                %...........G.......
  219. \newdimen\!tenAc                %...........G.......
  220. \newdimen\!tenAe                %...........G.......
  221. \newdimen\!tshrinkage           %.................S.
  222. \newdimen\!uplength             %..........L........
  223. \newdimen\!wd                   %....X.......P....S.
  224. \newdimen\!wmax                 %...............Q...
  225. \newdimen\!wmin                 %...............Q...
  226. \newdimen\!xB                   %...............Q...
  227. \newdimen\!xC                   %...............Q...
  228. \newdimen\!xE                   %..W.....E.L....Q.S.
  229. \newdimen\!xM                   %..W.....E......Q.S.
  230. \newdimen\!xS                   %..W.....E.L....Q.S.
  231. \newdimen\!xaxislength          %.A................T
  232. \newdimen\!xdiff                %..........L........
  233. \newdimen\!xleft                %............P......
  234. \newdimen\!xloc                 %..WB.....U.......S.
  235. \newdimen\!xorigin              %.A........L.P....S.
  236. \newdimen\!xpivot               %................R..
  237. \newdimen\!xpos                 %..........L.P..Q.ST
  238. \newdimen\!xprime               %...............Q...
  239. \newdimen\!xright               %............P......
  240. \newdimen\!xshade               %.................S.
  241. \newdimen\!xshift               %..W.........PO...S.
  242. \newdimen\!xtemp                %............P......
  243. \newdimen\!xunit                %.AWBX...EUL.P..QRS.
  244. \newdimen\!xxE                  %........E..........
  245. \newdimen\!xxM                  %........E..........
  246. \newdimen\!xxS                  %........E..........
  247. \newdimen\!xxloc                %..WB....EU.........
  248. \newdimen\!yB                   %...............Q...
  249. \newdimen\!yC                   %...............Q...
  250. \newdimen\!yE                   %..W.....E.L....Q...
  251. \newdimen\!yM                   %..W.....E......Q...
  252. \newdimen\!yS                   %..W.....E.L....Q...
  253. \newdimen\!yaxislength          %.A................T
  254. \newdimen\!ybot                 %............P......
  255. \newdimen\!ydiff                %..........L........
  256. \newdimen\!yloc                 %..WB.....U.......S.
  257. \newdimen\!yorigin              %.A........L.P....S.
  258. \newdimen\!ypivot               %................R..
  259. \newdimen\!ypos                 %..........L.P..Q.ST
  260. \newdimen\!yprime               %...............Q...
  261. \newdimen\!yshade               %.................S.
  262. \newdimen\!yshift               %..W.........PO...S.
  263. \newdimen\!ytemp                %............P......
  264. \newdimen\!ytop                 %............P......
  265. \newdimen\!yunit                %.AWBX...EUL.P..QRS.
  266. \newdimen\!yyE                  %........E..........
  267. \newdimen\!yyM                  %........E..........
  268. \newdimen\!yyS                  %........E..........
  269. \newdimen\!yyloc                %..WB....EU.........
  270. \newdimen\!zpt                  %.AWBX.DVEULGP.YQ.ST
  271. \newif\if!axisvisible           %.A.................
  272. \newif\if!gridlinestoo          %..................T
  273. \newif\if!keepPO                %...................
  274. \newif\if!placeaxislabel        %.A.................
  275. \newif\if!switch                %H..................
  276. \newif\if!xswitch               %.A................T
  277. \newtoks\!axisLaBeL             %.A.................
  278. \newtoks\!keywordtoks           %.A.................
  279. \newwrite\!replotfile           %.............O.....
  280. \newhelp\!keywordhelp{The keyword mentioned in the error message in unknown. 
  281. Replace NEW KEYWORD in the indicated response by the keyword that 
  282. should have been specified.}    %.A.................
  283. \!wlet\!!origin=\!xM                   %.A................T
  284. \!wlet\!!unit=\!uplength               %.A................T
  285. \!wlet\!Lresiduallength=\!dimenG       %.........U.........
  286. \!wlet\!Rresiduallength=\!dimenF       %.........U.........
  287. \!wlet\!axisLength=\!distacross        %.A................T
  288. \!wlet\!axisend=\!ydiff                %.A................T
  289. \!wlet\!axisstart=\!xdiff              %.A................T
  290. \!wlet\!axisxlevel=\!arclength         %.A................T
  291. \!wlet\!axisylevel=\!downlength        %.A................T
  292. \!wlet\!beta=\!dimenE                  %...............Q...
  293. \!wlet\!gamma=\!dimenF                 %...............Q...
  294. \!wlet\!shadexorigin=\!plotxorigin     %.................S.
  295. \!wlet\!shadeyorigin=\!plotyorigin     %.................S.
  296. \!wlet\!ticklength=\!xS                %..................T
  297. \!wlet\!ticklocation=\!xE              %..................T
  298. \!wlet\!ticklocationincr=\!yE          %..................T
  299. \!wlet\!tickwidth=\!yS                 %..................T
  300. \!wlet\!totalleaderlength=\!dimenE     %.........U.........
  301. \!wlet\!xone=\!xprime                  %....X..............
  302. \!wlet\!xtwo=\!dxprime                 %....X..............
  303. \!wlet\!ySsave=\!yM                    %...................
  304. \!wlet\!ybB=\!yB                       %.................S.
  305. \!wlet\!ybC=\!yC                       %.................S.
  306. \!wlet\!ybE=\!yE                       %.................S.
  307. \!wlet\!ybM=\!yM                       %.................S.
  308. \!wlet\!ybS=\!yS                       %.................S.
  309. \!wlet\!ybpos=\!yyloc                  %.................S.
  310. \!wlet\!yone=\!yprime                  %....X..............
  311. \!wlet\!ytB=\!xB                       %.................S.
  312. \!wlet\!ytC=\!xC                       %.................S.
  313. \!wlet\!ytE=\!downlength               %.................S.
  314. \!wlet\!ytM=\!arclength                %.................S.
  315. \!wlet\!ytS=\!distacross               %.................S.
  316. \!wlet\!ytpos=\!xxloc                  %.................S.
  317. \!wlet\!ytwo=\!dyprime                 %....X..............
  318. \!zpt=0pt                              % static
  319. \!xunit=1pt
  320. \!yunit=1pt
  321. \!arearloc=\!xunit
  322. \!areatloc=\!yunit
  323. \!dshade=5pt
  324. \!leaderlength=24in
  325. \!tfs=256                              % static
  326. \!wmax=5.3pt                           % static
  327. \!wmin=2.7pt                           % static
  328. \!xaxislength=\!xunit
  329. \!xpivot=\!zpt
  330. \!yaxislength=\!yunit 
  331. \!ypivot=\!zpt
  332. \plotsymbolspacing=.4pt
  333.   \!dimenA=50pt \!fiftypt=\!dimenA     % static
  334. \!rootten=3.162278pt                   % static
  335. \!tenAa=8.690286pt                     % static  (A5)
  336. \!tenAc=2.773839pt                     % static  (A3)
  337. \!tenAe=2.543275pt                     % static  (A1)
  338. \def\!cosrotationangle{1}      %................R..
  339. \def\!sinrotationangle{0}      %................R..
  340. \def\!xpivotcoord{0}           %................R..
  341. \def\!xref{0}                  %............P......
  342. \def\!xshadesave{0}            %.................S.
  343. \def\!ypivotcoord{0}           %................R..
  344. \def\!yref{0}                  %............P......
  345. \def\!yshadesave{0}            %.................S.
  346. \def\!zero{0}                  %..................T
  347. \let\wlog=\!!!wlog
  348. \def\normalgraphs{%
  349.   \longticklength=.4\baselineskip
  350.   \shortticklength=.25\baselineskip
  351.   \tickstovaluesleading=.25\baselineskip
  352.   \valuestolabelleading=.8\baselineskip
  353.   \linethickness=.4pt
  354.   \stackleading=.17\baselineskip
  355.   \headingtoplotskip=1.5\baselineskip
  356.   \visibleaxes
  357.   \ticksout
  358.   \nogridlines
  359.   \unloggedticks}
  360. \def\setplotarea x from #1 to #2, y from #3 to #4 {%
  361.   \!arealloc=\!M{#1}\!xunit \advance \!arealloc -\!xorigin
  362.   \!areabloc=\!M{#3}\!yunit \advance \!areabloc -\!yorigin
  363.   \!arearloc=\!M{#2}\!xunit \advance \!arearloc -\!xorigin
  364.   \!areatloc=\!M{#4}\!yunit \advance \!areatloc -\!yorigin
  365.   \!initinboundscheck
  366.   \!xaxislength=\!arearloc  \advance\!xaxislength -\!arealloc
  367.   \!yaxislength=\!areatloc  \advance\!yaxislength -\!areabloc
  368.   \!plotheadingoffset=\!zpt
  369.   \!dimenput {{\setbox0=\hbox{}\wd0=\!xaxislength\ht0=\!yaxislength\box0}}
  370.      [bl] (\!arealloc,\!areabloc)}
  371. \def\visibleaxes{%
  372.   \def\!axisvisibility{\!axisvisibletrue}}
  373. \def\invisibleaxes{%
  374.   \def\!axisvisibility{\!axisvisiblefalse}}
  375. \def\!fixkeyword#1{%
  376.   \errhelp=\!keywordhelp
  377.   \errmessage{Unrecognized keyword `#1': \the\!keywordtoks{NEW KEYWORD}'}}
  378. \!keywordtoks={enter `i\fixkeyword}
  379. \def\fixkeyword#1{%
  380.   \!nextkeyword#1 }
  381. \def\axis {%
  382.   \def\!nextkeyword##1 {%
  383.     \expandafter\ifx\csname !axis##1\endcsname \relax
  384.       \def\!next{\!fixkeyword{##1}}%
  385.     \else
  386.       \def\!next{\csname !axis##1\endcsname}%
  387.     \fi
  388.     \!next}%
  389.   \!offset=\!zpt
  390.   \!axisvisibility
  391.   \!placeaxislabelfalse
  392.   \!nextkeyword}
  393. \def\!axisbottom{%
  394.   \!axisylevel=\!areabloc
  395.   \def\!tickxsign{0}%
  396.   \def\!tickysign{-}%
  397.   \def\!axissetup{\!axisxsetup}%
  398.   \def\!axislabeltbrl{t}%
  399.   \!nextkeyword}
  400. \def\!axistop{%
  401.   \!axisylevel=\!areatloc
  402.   \def\!tickxsign{0}%
  403.   \def\!tickysign{+}%
  404.   \def\!axissetup{\!axisxsetup}%
  405.   \def\!axislabeltbrl{b}%
  406.   \!nextkeyword}
  407. \def\!axisleft{%
  408.   \!axisxlevel=\!arealloc
  409.   \def\!tickxsign{-}%
  410.   \def\!tickysign{0}%
  411.   \def\!axissetup{\!axisysetup}%
  412.   \def\!axislabeltbrl{r}%
  413.   \!nextkeyword}
  414. \def\!axisright{%
  415.   \!axisxlevel=\!arearloc
  416.   \def\!tickxsign{+}%
  417.   \def\!tickysign{0}%
  418.   \def\!axissetup{\!axisysetup}%
  419.   \def\!axislabeltbrl{l}%
  420.   \!nextkeyword}
  421. \def\!axisshiftedto#1=#2 {%
  422.   \if 0\!tickxsign
  423.     \!axisylevel=\!M{#2}\!yunit
  424.     \advance\!axisylevel -\!yorigin
  425.   \else
  426.     \!axisxlevel=\!M{#2}\!xunit
  427.     \advance\!axisxlevel -\!xorigin
  428.   \fi
  429.   \!nextkeyword}
  430. \def\!axisvisible{%
  431.   \!axisvisibletrue  
  432.   \!nextkeyword}
  433. \def\!axisinvisible{%
  434.   \!axisvisiblefalse
  435.   \!nextkeyword}
  436. \def\!axislabel#1 {%
  437.   \!axisLaBeL={#1}%
  438.   \!placeaxislabeltrue
  439.   \!nextkeyword}
  440. \expandafter\def\csname !axis/\endcsname{%
  441.   \!axissetup % This could done already by "ticks"; if so, now \relax
  442.   \if!placeaxislabel
  443.     \!placeaxislabel
  444.   \fi
  445.   \if +\!tickysign %                 ** (A "top" axis)
  446.     \!dimenA=\!axisylevel
  447.     \advance\!dimenA \!offset %      ** dimA = top of the axis structure
  448.     \advance\!dimenA -\!areatloc %   ** dimA = excess over the plot area
  449.     \ifdim \!dimenA>\!plotheadingoffset
  450.       \!plotheadingoffset=\!dimenA % ** Greatest excess over the plot area
  451.     \fi
  452.   \fi}
  453. \def\grid #1 #2 {%
  454.   \!countA=#1\advance\!countA 1
  455.   \axis bottom invisible ticks length <\!zpt> andacross quantity {\!countA} /
  456.   \!countA=#2\advance\!countA 1
  457.   \axis left   invisible ticks length <\!zpt> andacross quantity {\!countA} / }
  458. \def\plotheading#1 {%
  459.   \advance\!plotheadingoffset \headingtoplotskip
  460.   \!dimenput {#1} [B] <.5\!xaxislength,\!plotheadingoffset>
  461.     (\!arealloc,\!areatloc)}
  462. \def\!axisxsetup{%
  463.   \!axisxlevel=\!arealloc
  464.   \!axisstart=\!arealloc
  465.   \!axisend=\!arearloc
  466.   \!axisLength=\!xaxislength
  467.   \!!origin=\!xorigin
  468.   \!!unit=\!xunit
  469.   \!xswitchtrue
  470.   \if!axisvisible 
  471.     \!makeaxis
  472.   \fi}
  473. \def\!axisysetup{%
  474.   \!axisylevel=\!areabloc
  475.   \!axisstart=\!areabloc
  476.   \!axisend=\!areatloc
  477.   \!axisLength=\!yaxislength
  478.   \!!origin=\!yorigin
  479.   \!!unit=\!yunit
  480.   \!xswitchfalse
  481.   \if!axisvisible
  482.     \!makeaxis
  483.   \fi}
  484. \def\!makeaxis{%
  485.   \setbox\!boxA=\hbox{% (Make a pseudo-y[x] tick for an x[y]-axis)
  486.     \beginpicture
  487.       \!setdimenmode
  488.       \setcoordinatesystem point at {\!zpt} {\!zpt}   
  489.       \putrule from {\!zpt} {\!zpt} to
  490.         {\!tickysign\!tickysign\!axisLength} 
  491.         {\!tickxsign\!tickxsign\!axisLength}
  492.     \endpicturesave <\!Xsave,\!Ysave>}%
  493.     \wd\!boxA=\!zpt
  494.     \!placetick\!axisstart}
  495. \def\!placeaxislabel{%
  496.   \advance\!offset \valuestolabelleading
  497.   \if!xswitch
  498.     \!dimenput {\the\!axisLaBeL} [\!axislabeltbrl]
  499.       <.5\!axisLength,\!tickysign\!offset> (\!axisxlevel,\!axisylevel)
  500.     \advance\!offset \!dp  % ** advance offset by the "tallness"
  501.     \advance\!offset \!ht  % ** of the label
  502.   \else
  503.     \!dimenput {\the\!axisLaBeL} [\!axislabeltbrl]
  504.       <\!tickxsign\!offset,.5\!axisLength> (\!axisxlevel,\!axisylevel)
  505.   \fi
  506.   \!axisLaBeL={}}
  507. \def\arrow <#1> [#2,#3]{%
  508.   \!ifnextchar<{\!arrow{#1}{#2}{#3}}{\!arrow{#1}{#2}{#3}<\!zpt,\!zpt> }}
  509. \def\!arrow#1#2#3<#4,#5> from #6 #7 to #8 #9 {%
  510.   \!xloc=\!M{#8}\!xunit   
  511.   \!yloc=\!M{#9}\!yunit
  512.   \!dxpos=\!xloc  \!dimenA=\!M{#6}\!xunit  \advance \!dxpos -\!dimenA
  513.   \!dypos=\!yloc  \!dimenA=\!M{#7}\!yunit  \advance \!dypos -\!dimenA
  514.   \let\!MAH=\!M%                         ** save current c/d mode
  515.   \!setdimenmode%                        ** go into dimension mode
  516.   \!xshift=#4\relax  \!yshift=#5\relax%  ** pick up shift
  517.   \!reverserotateonly\!xshift\!yshift%   ** back rotate shift
  518.   \advance\!xshift\!xloc  \advance\!yshift\!yloc
  519.   \!xS=-\!dxpos  \advance\!xS\!xshift
  520.   \!yS=-\!dypos  \advance\!yS\!yshift
  521.   \!start (\!xS,\!yS)
  522.   \!ljoin (\!xshift,\!yshift)
  523.   \!Pythag\!dxpos\!dypos\!arclength
  524.   \!divide\!dxpos\!arclength\!dxpos  
  525.   \!dxpos=32\!dxpos  \!removept\!dxpos\!!cos
  526.   \!divide\!dypos\!arclength\!dypos  
  527.   \!dypos=32\!dypos  \!removept\!dypos\!!sin
  528.   \!halfhead{#1}{#2}{#3}%                ** draw half of arrow head
  529.   \!halfhead{#1}{-#2}{-#3}%              ** draw other half
  530.   \let\!M=\!MAH%                         ** restore old c/d mode
  531.   \ignorespaces}
  532.   \def\!halfhead#1#2#3{%
  533.     \!dimenC=-#1%                
  534.     \divide \!dimenC 2 %                 ** half way back
  535.     \!dimenD=#2\!dimenC%                 ** half the mid width
  536.     \!rotate(\!dimenC,\!dimenD)by(\!!cos,\!!sin)to(\!xM,\!yM)
  537.     \!dimenC=-#1%                        ** all the way back
  538.     \!dimenD=#3\!dimenC
  539.     \!dimenD=.5\!dimenD%                 ** half the full width
  540.     \!rotate(\!dimenC,\!dimenD)by(\!!cos,\!!sin)to(\!xE,\!yE)
  541.     \!start (\!xshift,\!yshift)
  542.     \advance\!xM\!xshift  \advance\!yM\!yshift
  543.     \advance\!xE\!xshift  \advance\!yE\!yshift
  544.     \!qjoin (\!xM,\!yM) (\!xE,\!yE) 
  545.     \ignorespaces}
  546. \def\betweenarrows #1#2 from #3 #4 to #5 #6 {%
  547.   \!xloc=\!M{#3}\!xunit  \!xxloc=\!M{#5}\!xunit%   
  548.   \!yloc=\!M{#4}\!yunit  \!yyloc=\!M{#6}\!yunit%           
  549.   \!dxpos=\!xxloc  \advance\!dxpos by -\!xloc
  550.   \!dypos=\!yyloc  \advance\!dypos by -\!yloc
  551.   \advance\!xloc .5\!dxpos
  552.   \advance\!yloc .5\!dypos
  553.   \let\!MBA=\!M%           ** save current coord\dimen mode
  554.   \!setdimenmode%          ** express locations in dimens
  555.   \ifdim\!dypos=\!zpt
  556.     \ifdim\!dxpos<\!zpt \!dxpos=-\!dxpos \fi
  557.     \put {\!lrarrows{\!dxpos}{#1}}#2{} at {\!xloc} {\!yloc}
  558.   \else
  559.     \ifdim\!dxpos=\!zpt
  560.       \ifdim\!dypos<\!zpt \!dypos=-\!zpt \fi
  561.       \put {\!udarrows{\!dypos}{#1}}#2{} at {\!xloc} {\!yloc}
  562.     \fi
  563.   \fi
  564.   \let\!M=\!MBA%           ** restore previous c/d mode
  565.   \ignorespaces}
  566. \def\!lrarrows#1#2{% #1=width, #2=text
  567.   {\setbox\!boxA=\hbox{$\mkern-2mu\mathord-\mkern-2mu$}%
  568.    \setbox\!boxB=\hbox{$\leftarrow$}\!dimenE=\ht\!boxB
  569.    \setbox\!boxB=\hbox{}\ht\!boxB=2\!dimenE
  570.    \hbox to #1{$\mathord\leftarrow\mkern-6mu
  571.      \cleaders\copy\!boxA\hfil
  572.      \mkern-6mu\mathord-$%
  573.      \kern.4em $\vcenter{\box\!boxB}$$\vcenter{\hbox{#2}}$\kern.4em
  574.      $\mathord-\mkern-6mu
  575.      \cleaders\copy\!boxA\hfil
  576.      \mkern-6mu\mathord\rightarrow$}}}
  577. \def\!udarrows#1#2{% #1=width, #2=text
  578.   {\setbox\!boxB=\hbox{#2}%
  579.    \setbox\!boxA=\hbox to \wd\!boxB{\hss$\vert$\hss}%
  580.    \!dimenE=\ht\!boxA \advance\!dimenE \dp\!boxA \divide\!dimenE 2
  581.    \vbox to #1{\offinterlineskip
  582.       \vskip .05556\!dimenE
  583.       \hbox to \wd\!boxB{\hss$\mkern.4mu\uparrow$\hss}\vskip-\!dimenE
  584.       \cleaders\copy\!boxA\vfil
  585.       \vskip-\!dimenE\copy\!boxA
  586.       \vskip\!dimenE\copy\!boxB\vskip.4em
  587.       \copy\!boxA\vskip-\!dimenE
  588.       \cleaders\copy\!boxA\vfil
  589.       \vskip-\!dimenE \hbox to \wd\!boxB{\hss$\mkern.4mu\downarrow$\hss}
  590.       \vskip .05556\!dimenE}}}
  591. \def\putbar#1breadth <#2> from #3 #4 to #5 #6 {%
  592.   \!xloc=\!M{#3}\!xunit  \!xxloc=\!M{#5}\!xunit%   
  593.   \!yloc=\!M{#4}\!yunit  \!yyloc=\!M{#6}\!yunit%           
  594.   \!dypos=\!yyloc  \advance\!dypos by -\!yloc
  595.   \!dimenI=#2  
  596.   \ifdim \!dimenI=\!zpt %            ** If 0 breadth
  597.     \putrule#1from {#3} {#4} to {#5} {#6} % ** Then draw line
  598.   \else %                            ** Else, put in a rectangle
  599.     \let\!MBar=\!M%                  ** save current c/d mode
  600.     \!setdimenmode %                 ** go into dimension mode
  601.     \divide\!dimenI 2
  602.     \ifdim \!dypos=\!zpt             
  603.       \advance \!yloc -\!dimenI %    ** Equal y coordinates
  604.       \advance \!yyloc \!dimenI
  605.     \else
  606.       \advance \!xloc -\!dimenI %    ** Equal x coordinates
  607.       \advance \!xxloc \!dimenI
  608.     \fi
  609.     \putrectangle#1corners at {\!xloc} {\!yloc} and {\!xxloc} {\!yyloc}
  610.     \let\!M=\!MBar %                 ** restore c/d mode
  611.   \fi
  612.   \ignorespaces}
  613. \def\setbars#1breadth <#2> baseline at #3 = #4 {%
  614.   \edef\!barshift{#1}%
  615.   \edef\!barbreadth{#2}%
  616.   \edef\!barorientation{#3}%
  617.   \edef\!barbaseline{#4}%
  618.   \def\!bardobaselabel{\!bardoendlabel}%
  619.   \def\!bardoendlabel{\!barfinish}%
  620.   \let\!drawcurve=\!barcurve
  621.   \!setbars}
  622. \def\!setbars{%
  623.   \futurelet\!nextchar\!!setbars}
  624. \def\!!setbars{%
  625.   \if b\!nextchar
  626.     \def\!!!setbars{\!setbarsbget}%
  627.   \else 
  628.     \if e\!nextchar
  629.       \def\!!!setbars{\!setbarseget}%
  630.     \else
  631.       \def\!!!setbars{\relax}%
  632.     \fi
  633.   \fi
  634.   \!!!setbars}
  635. \def\!setbarsbget baselabels (#1) {%
  636.   \def\!barbaselabelorientation{#1}%
  637.   \def\!bardobaselabel{\!!bardobaselabel}%
  638.   \!setbars}
  639. \def\!setbarseget endlabels (#1) {%
  640.   \edef\!barendlabelorientation{#1}%
  641.   \def\!bardoendlabel{\!!bardoendlabel}%
  642.   \!setbars}
  643. \def\!barcurve #1 #2 {%
  644.   \if y\!barorientation
  645.     \def\!basexarg{#1}%
  646.     \def\!baseyarg{\!barbaseline}%
  647.   \else
  648.     \def\!basexarg{\!barbaseline}%
  649.     \def\!baseyarg{#2}%
  650.   \fi
  651.   \expandafter\putbar\!barshift breadth <\!barbreadth> from {\!basexarg}
  652.     {\!baseyarg} to {#1} {#2}
  653.   \def\!endxarg{#1}%
  654.   \def\!endyarg{#2}%
  655.   \!bardobaselabel}
  656. \def\!!bardobaselabel "#1" {%
  657.   \put {#1}\!barbaselabelorientation{} at {\!basexarg} {\!baseyarg}
  658.   \!bardoendlabel}
  659. \def\!!bardoendlabel "#1" {%
  660.   \put {#1}\!barendlabelorientation{} at {\!endxarg} {\!endyarg}
  661.   \!barfinish}
  662. \def\!barfinish{%
  663.   \!ifnextchar/{\!finish}{\!barcurve}}
  664. \def\putrectangle{%
  665.   \!ifnextchar<{\!putrectangle}{\!putrectangle<\!zpt,\!zpt> }}
  666. \def\!putrectangle<#1,#2> corners at #3 #4 and #5 #6 {%
  667.   \!xone=\!M{#3}\!xunit  \!xtwo=\!M{#5}\!xunit%   
  668.   \!yone=\!M{#4}\!yunit  \!ytwo=\!M{#6}\!yunit%           
  669.   \ifdim \!xtwo<\!xone
  670.     \!dimenI=\!xone  \!xone=\!xtwo  \!xtwo=\!dimenI
  671.   \fi
  672.   \ifdim \!ytwo<\!yone
  673.     \!dimenI=\!yone  \!yone=\!ytwo  \!ytwo=\!dimenI
  674.   \fi
  675.   \!dimenI=#1\relax  \advance\!xone\!dimenI  \advance\!xtwo\!dimenI
  676.   \!dimenI=#2\relax  \advance\!yone\!dimenI  \advance\!ytwo\!dimenI
  677.   \let\!MRect=\!M%                  ** save current coord/dimen mode
  678.   \!setdimenmode
  679.   \!shaderectangle
  680.   \!dimenI=.5\linethickness
  681.   \advance \!xone  -\!dimenI%       ** adjust x-location to overlap corners
  682.   \advance \!xtwo   \!dimenI%       ** ditto
  683.   \putrule from {\!xone} {\!yone} to {\!xtwo} {\!yone} 
  684.   \putrule from {\!xone} {\!ytwo} to {\!xtwo} {\!ytwo} 
  685.   \advance \!xone   \!dimenI%       ** restore original x-values
  686.   \advance \!xtwo  -\!dimenI% 
  687.   \advance \!yone  -\!dimenI%       ** adjust y-location to overlap corners
  688.   \advance \!ytwo   \!dimenI%       ** ditto
  689.   \putrule from {\!xone} {\!yone} to {\!xone} {\!ytwo} 
  690.   \putrule from {\!xtwo} {\!yone} to {\!xtwo} {\!ytwo} 
  691.   \let\!M=\!MRect%                  ** restore coord/dimen mode
  692.   \ignorespaces}
  693. \def\shaderectangleson{%     
  694.   \def\!shaderectangle{\!!shaderectangle}%
  695.   \ignorespaces}
  696. \def\shaderectanglesoff{%
  697.   \def\!shaderectangle{}%
  698.   \ignorespaces}
  699. \shaderectanglesoff
  700. \def\!!shaderectangle{%
  701.   \!dimenA=\!xtwo  \advance \!dimenA -\!xone
  702.   \!dimenB=\!ytwo  \advance \!dimenB -\!yone
  703.   \ifdim \!dimenA<\!dimenB
  704.     \!startvshade (\!xone,\!yone,\!ytwo)
  705.     \!lshade      (\!xtwo,\!yone,\!ytwo)
  706.   \else
  707.     \!starthshade (\!yone,\!xone,\!xtwo)
  708.     \!lshade      (\!ytwo,\!xone,\!xtwo)
  709.   \fi
  710.   \ignorespaces}
  711. \def\frame{%
  712.   \!ifnextchar<{\!frame}{\!frame<\!zpt> }}
  713. \long\def\!frame<#1> #2{%
  714.   \beginpicture
  715.     \setcoordinatesystem units <1pt,1pt> point at 0 0 
  716.     \put {#2} [Bl] at 0 0 
  717.     \!dimenA=#1\relax
  718.     \!dimenB=\!wd \advance \!dimenB \!dimenA
  719.     \!dimenC=\!ht \advance \!dimenC \!dimenA
  720.     \!dimenD=\!dp \advance \!dimenD \!dimenA
  721.     \let\!MFr=\!M
  722.     \!setdimenmode
  723.     \putrectangle corners at {-\!dimenA} {-\!dimenD} and {\!dimenB} {\!dimenC}
  724.     \!setcoordmode
  725.     \let\!M=\!MFr
  726.   \endpicture
  727.   \ignorespaces}
  728. \def\rectangle <#1> <#2> {%
  729.   \setbox0=\hbox{}\wd0=#1\ht0=#2\frame {\box0}}
  730. \def\plot{%
  731.   \!ifnextchar"{\!plotfromfile}{\!drawcurve}}
  732. \def\!plotfromfile"#1"{%
  733.   \expandafter\!drawcurve \input #1 /}
  734. \def\setquadratic{%
  735.   \let\!drawcurve=\!qcurve
  736.   \let\!!Shade=\!!qShade
  737.   \let\!!!Shade=\!!!qShade}
  738. \def\setlinear{%
  739.   \let\!drawcurve=\!lcurve
  740.   \let\!!Shade=\!!lShade
  741.   \let\!!!Shade=\!!!lShade}
  742. \def\sethistograms{%
  743.   \let\!drawcurve=\!hcurve}
  744. \def\!qcurve #1 #2 {%
  745.   \!start (#1,#2)
  746.   \!Qjoin}
  747. \def\!Qjoin#1 #2 #3 #4 {%
  748.   \!qjoin (#1,#2) (#3,#4)             % \!qjoin  is defined in QUADRATIC
  749.   \!ifnextchar/{\!finish}{\!Qjoin}}
  750. \def\!lcurve #1 #2 {%
  751.   \!start (#1,#2)
  752.   \!Ljoin}
  753. \def\!Ljoin#1 #2 {%
  754.   \!ljoin (#1,#2)                    % \!ljoin  is defined in LINEAR
  755.   \!ifnextchar/{\!finish}{\!Ljoin}}
  756. \def\!finish/{\ignorespaces}
  757. \def\!hcurve #1 #2 {%
  758.   \edef\!hxS{#1}%
  759.   \edef\!hyS{#2}%
  760.   \!hjoin}
  761. \def\!hjoin#1 #2 {%
  762.   \putrectangle corners at {\!hxS} {\!hyS} and {#1} {#2}
  763.   \edef\!hxS{#1}%
  764.   \!ifnextchar/{\!finish}{\!hjoin}}
  765. \def\vshade #1 #2 #3 {%
  766.   \!startvshade (#1,#2,#3)
  767.   \!Shadewhat}
  768. \def\hshade #1 #2 #3 {%
  769.   \!starthshade (#1,#2,#3)
  770.   \!Shadewhat}
  771. \def\!Shadewhat{%
  772.   \futurelet\!nextchar\!Shade}
  773. \def\!Shade{%
  774.   \if <\!nextchar
  775.     \def\!nextShade{\!!Shade}%
  776.   \else
  777.     \if /\!nextchar
  778.       \def\!nextShade{\!finish}%
  779.     \else
  780.       \def\!nextShade{\!!!Shade}%
  781.     \fi
  782.   \fi
  783.   \!nextShade}
  784. \def\!!lShade<#1> #2 #3 #4 {%
  785.   \!lshade <#1> (#2,#3,#4)                 % \!lshade is defined in SHADING
  786.   \!Shadewhat}
  787. \def\!!!lShade#1 #2 #3 {%
  788.   \!lshade (#1,#2,#3)
  789.   \!Shadewhat} 
  790. \def\!!qShade<#1> #2 #3 #4 #5 #6 #7 {%
  791.   \!qshade <#1> (#2,#3,#4) (#5,#6,#7)      % \!qshade is defined in SHADING
  792.   \!Shadewhat}
  793. \def\!!!qShade#1 #2 #3 #4 #5 #6 {%
  794.   \!qshade (#1,#2,#3) (#4,#5,#6)
  795.   \!Shadewhat} 
  796. \setlinear
  797. \def\setdashpattern <#1>{%
  798.   \def\!Flist{}\def\!Blist{}\def\!UDlist{}%
  799.   \!countA=0
  800.   \!ecfor\!item:=#1\do{%
  801.     \!dimenA=\!item\relax
  802.     \expandafter\!rightappend\the\!dimenA\withCS{\\}\to\!UDlist%
  803.     \advance\!countA  1
  804.     \ifodd\!countA
  805.       \expandafter\!rightappend\the\!dimenA\withCS{\!Rule}\to\!Flist%
  806.       \expandafter\!leftappend\the\!dimenA\withCS{\!Rule}\to\!Blist%
  807.     \else 
  808.       \expandafter\!rightappend\the\!dimenA\withCS{\!Skip}\to\!Flist%
  809.       \expandafter\!leftappend\the\!dimenA\withCS{\!Skip}\to\!Blist%
  810.     \fi}%
  811.   \!leaderlength=\!zpt
  812.   \def\!Rule##1{\advance\!leaderlength  ##1}%
  813.   \def\!Skip##1{\advance\!leaderlength  ##1}%
  814.   \!Flist%
  815.   \ifdim\!leaderlength>\!zpt 
  816.   \else
  817.     \def\!Flist{\!Skip{24in}}\def\!Blist{\!Skip{24in}}\ignorespaces
  818.     \def\!UDlist{\\{\!zpt}\\{24in}}\ignorespaces
  819.     \!leaderlength=24in
  820.   \fi
  821.   \!dashingon}   
  822. \def\!dashingon{%
  823.   \def\!advancedashing{\!!advancedashing}%
  824.   \def\!drawlinearsegment{\!lineardashed}%
  825.   \def\!puthline{\!putdashedhline}%
  826.   \def\!putvline{\!putdashedvline}%
  827.   \ignorespaces}% 
  828. \def\!dashingoff{%
  829.   \def\!advancedashing{\relax}%
  830.   \def\!drawlinearsegment{\!linearsolid}%
  831.   \def\!puthline{\!putsolidhline}%
  832.   \def\!putvline{\!putsolidvline}%
  833.   \ignorespaces}
  834. \def\setdots{%
  835.   \!ifnextchar<{\!setdots}{\!setdots<5pt>}}
  836. \def\!setdots<#1>{%
  837.   \!dimenB=#1\advance\!dimenB -\plotsymbolspacing
  838.   \ifdim\!dimenB<\!zpt
  839.     \!dimenB=\!zpt
  840.   \fi
  841. \setdashpattern <\plotsymbolspacing,\!dimenB>}
  842. \def\setdotsnear <#1> for <#2>{%
  843.   \!dimenB=#2\relax  \advance\!dimenB -.05pt  
  844.   \!dimenC=#1\relax  \!countA=\!dimenC 
  845.   \!dimenD=\!dimenB  \advance\!dimenD .5\!dimenC  \!countB=\!dimenD
  846.   \divide \!countB  \!countA
  847.   \ifnum 1>\!countB 
  848.     \!countB=1
  849.   \fi
  850.   \divide\!dimenB  \!countB
  851.   \setdots <\!dimenB>}
  852. \def\setdashes{%
  853.   \!ifnextchar<{\!setdashes}{\!setdashes<5pt>}}
  854. \def\!setdashes<#1>{\setdashpattern <#1,#1>}
  855. \def\setdashesnear <#1> for <#2>{%
  856.   \!dimenB=#2\relax  
  857.   \!dimenC=#1\relax  \!countA=\!dimenC 
  858.   \!dimenD=\!dimenB  \advance\!dimenD .5\!dimenC  \!countB=\!dimenD
  859.   \divide \!countB  \!countA
  860.   \ifodd \!countB 
  861.   \else 
  862.     \advance \!countB  1
  863.   \fi
  864.   \divide\!dimenB  \!countB
  865.   \setdashes <\!dimenB>}
  866. \def\setsolid{%
  867.   \def\!Flist{\!Rule{24in}}\def\!Blist{\!Rule{24in}}%  
  868.   \def\!UDlist{\\{24in}\\{\!zpt}}%
  869.   \!dashingoff}  
  870. \setsolid
  871. \def\findlength#1{%
  872.   \begingroup
  873.     \setdashpattern <0pt, \maxdimen>
  874.     \setplotsymbol ({})  
  875.     \dontsavelinesandcurves
  876.     #1%
  877.   \endgroup
  878.   \ignorespaces}
  879. \def\!divide#1#2#3{%
  880.   \!dimenB=#1%                      **  dimB  holds current remainder (r)
  881.   \!dimenC=#2%                      **  dimC  holds divisor (d)
  882.   \!dimenD=\!dimenB%                **  dimD  holds quotient q=r/d for this 
  883.   \divide \!dimenD \!dimenC%        **    step, in units of scaled pts
  884.   \!dimenA=\!dimenD%                **  dimA  eventually holds answer (a)
  885.   \multiply\!dimenD \!dimenC%       **  r <-- r - dq
  886.   \advance\!dimenB -\!dimenD%       **  First step complete. Have integer part
  887.   \!dimenD=\!dimenC%                **  Temporarily use dimD to hold |d|
  888.     \ifdim\!dimenD<\!zpt \!dimenD=-\!dimenD 
  889.   \fi
  890.   \ifdim\!dimenD<64pt%              **  Branch on the magnitude of |d|
  891.     \!divstep[\!tfs]\!divstep[\!tfs]%
  892.   \else 
  893.     \!!divide
  894.   \fi
  895.   #3=\!dimenA\ignorespaces}
  896. \def\!!divide{%
  897.   \ifdim\!dimenD<256pt
  898.     \!divstep[64]\!divstep[32]\!divstep[32]%
  899.   \else 
  900.     \!divstep[8]\!divstep[8]\!divstep[8]\!divstep[8]\!divstep[8]%
  901.     \!dimenA=2\!dimenA
  902.   \fi}
  903. \def\!divstep[#1]{%                 **  #1 = "B"
  904.   \!dimenB=#1\!dimenB%              **  r <-- B*r
  905.   \!dimenD=\!dimenB%                **  dimD  holds quotient q=r/d for this 
  906.     \divide \!dimenD by \!dimenC%   **    step, in units of scaled pts
  907.   \!dimenA=#1\!dimenA%              **  a <-- B*a + q
  908.     \advance\!dimenA by \!dimenD%
  909.   \multiply\!dimenD by \!dimenC%    **  r <-- r - dq
  910.     \advance\!dimenB by -\!dimenD}
  911. \def\Divide <#1> by <#2> forming <#3> {%
  912.   \!divide{#1}{#2}{#3}}
  913. \def\circulararc{%
  914.   \ellipticalarc axes ratio 1:1 }
  915. \def\ellipticalarc axes ratio #1:#2 #3 degrees from #4 #5 center at #6 #7 {%
  916.   \!angle=#3pt\relax%                    ** get angle
  917.   \ifdim\!angle>\!zpt 
  918.     \def\!sign{}%                        ** counterclockwise
  919.   \else 
  920.     \def\!sign{-}\!angle=-\!angle%       ** clockwise
  921.   \fi
  922.   \!xxloc=\!M{#6}\!xunit%                ** convert CENTER to dimension
  923.   \!yyloc=\!M{#7}\!yunit     
  924.   \!xxS=\!M{#4}\!xunit%                  ** get STARTing point on rim of ellipse
  925.   \!yyS=\!M{#5}\!yunit
  926.   \advance\!xxS -\!xxloc%                ** make center of ellipse (0,0)
  927.   \advance\!yyS -\!yyloc
  928.   \!divide\!xxS{#1pt}\!xxS %             ** scale point on ellipse to point on 
  929.   \!divide\!yyS{#2pt}\!yyS %                 corresponding circle
  930.   \let\!MC=\!M%                          ** save current c/d mode
  931.   \!setdimenmode%                        ** go into dimension mode
  932.   \!xS=#1\!xxS  \advance\!xS\!xxloc
  933.   \!yS=#2\!yyS  \advance\!yS\!yyloc
  934.   \!start (\!xS,\!yS)%
  935.   \!loop\ifdim\!angle>14.9999pt%         ** draw in major portion of ellipse 
  936.     \!rotate(\!xxS,\!yyS)by(\!cos,\!sign\!sin)to(\!xxM,\!yyM) 
  937.     \!rotate(\!xxM,\!yyM)by(\!cos,\!sign\!sin)to(\!xxE,\!yyE)
  938.     \!xM=#1\!xxM  \advance\!xM\!xxloc  \!yM=#2\!yyM  \advance\!yM\!yyloc
  939.     \!xE=#1\!xxE  \advance\!xE\!xxloc  \!yE=#2\!yyE  \advance\!yE\!yyloc
  940.     \!qjoin (\!xM,\!yM) (\!xE,\!yE)
  941.     \!xxS=\!xxE  \!yyS=\!yyE 
  942.     \advance \!angle -15pt
  943.   \repeat
  944.   \ifdim\!angle>\!zpt%                   ** complete remaining arc, if any
  945.     \!angle=100.53096\!angle%            ** convert angle to radians, divide
  946.     \divide \!angle 360 %                **   by 2, and multiply by 32
  947.     \!sinandcos\!angle\!!sin\!!cos%      ** get 32*sin & 32*cos
  948.     \!rotate(\!xxS,\!yyS)by(\!!cos,\!sign\!!sin)to(\!xxM,\!yyM) 
  949.     \!rotate(\!xxM,\!yyM)by(\!!cos,\!sign\!!sin)to(\!xxE,\!yyE)
  950.     \!xM=#1\!xxM  \advance\!xM\!xxloc  \!yM=#2\!yyM  \advance\!yM\!yyloc
  951.     \!xE=#1\!xxE  \advance\!xE\!xxloc  \!yE=#2\!yyE  \advance\!yE\!yyloc
  952.     \!qjoin (\!xM,\!yM) (\!xE,\!yE)
  953.   \fi
  954.   \let\!M=\!MC%                          ** restore c/d mode
  955.   \ignorespaces}%                        **   if appropriate
  956. \def\!rotate(#1,#2)by(#3,#4)to(#5,#6){% 
  957.   \!dimenA=#3#1\advance \!dimenA -#4#2%   ** Rcos(x+t)=Rcosx*cost - Rsinx*sint
  958.   \!dimenB=#3#2\advance \!dimenB  #4#1%   ** Rsin(x+t)=Rsinx*cost + Rcosx*sint
  959.   \divide \!dimenA 32  \divide \!dimenB 32 
  960.   #5=\!dimenA  #6=\!dimenB
  961.   \ignorespaces}
  962. \def\!sin{4.17684}%                       ** 32*sin(pi/24) (pi/24=7.5deg)
  963. \def\!cos{31.72624}%                      ** 32*cos(pi/24)
  964. \def\!sinandcos#1#2#3{%
  965.  \!dimenD=#1%                **  angle is expressed in radians/32: 1pt = 1/32rad
  966.  \!dimenA=\!dimenD%          **  dimA will eventually contain 32sin(angle)in pts
  967.  \!dimenB=32pt%              **  dimB will eventually contain 32cos(angle)in pts
  968.  \!removept\!dimenD\!value%  **  get value of 32*angle, without "pt"
  969.  \!dimenC=\!dimenD%          **  holds 32*angle**i/i! in pts
  970.  \!dimenC=\!value\!dimenC \divide\!dimenC by 64 %   ** now 32*angle**2/2
  971.  \advance\!dimenB by -\!dimenC%                     ** 32-32*angle**2/2
  972.  \!dimenC=\!value\!dimenC \divide\!dimenC by 96 %   ** now 32*angle**3/3!
  973.  \advance\!dimenA by -\!dimenC%                     ** now 32*(angle-angle**3/6)
  974.  \!dimenC=\!value\!dimenC \divide\!dimenC by 128 %  ** now 32*angle**4/4!
  975.  \advance\!dimenB by \!dimenC%
  976.  \!removept\!dimenA#2%                              ** set 32*sin(angle)
  977.  \!removept\!dimenB#3%                              ** set 32*cos(angle)
  978.  \ignorespaces}
  979. \def\putrule#1from #2 #3 to #4 #5 {%
  980.   \!xloc=\!M{#2}\!xunit  \!xxloc=\!M{#4}\!xunit%   
  981.   \!yloc=\!M{#3}\!yunit  \!yyloc=\!M{#5}\!yunit%           
  982.   \!dxpos=\!xxloc  \advance\!dxpos by -\!xloc
  983.   \!dypos=\!yyloc  \advance\!dypos by -\!yloc
  984.   \ifdim\!dypos=\!zpt
  985.     \def\!!Line{\!puthline{#1}}\ignorespaces
  986.   \else
  987.     \ifdim\!dxpos=\!zpt
  988.       \def\!!Line{\!putvline{#1}}\ignorespaces
  989.     \else 
  990.        \def\!!Line{}
  991.     \fi
  992.   \fi
  993.   \let\!ML=\!M%           ** save current coord\dimen mode
  994.   \!setdimenmode%         ** express locations in dimens
  995.   \!!Line%
  996.   \let\!M=\!ML%           ** restore previous c/d mode
  997.   \ignorespaces}
  998. \def\!putsolidhline#1{%
  999.   \ifdim\!dxpos>\!zpt 
  1000.     \put{\!hline\!dxpos}#1[l] at {\!xloc} {\!yloc}
  1001.   \else 
  1002.     \put{\!hline{-\!dxpos}}#1[l] at {\!xxloc} {\!yyloc}
  1003.   \fi
  1004.   \ignorespaces}
  1005. \def\!putsolidvline#1{%
  1006.   \ifdim\!dypos>\!zpt 
  1007.     \put{\!vline\!dypos}#1[b] at {\!xloc} {\!yloc}
  1008.   \else 
  1009.     \put{\!vline{-\!dypos}}#1[b] at {\!xxloc} {\!yyloc}
  1010.   \fi
  1011.   \ignorespaces}
  1012. \def\!hline#1{\hbox to #1{\leaders \hrule height\linethickness\hfill}}
  1013. \def\!vline#1{\vbox to #1{\leaders \vrule width\linethickness\vfill}}
  1014. \def\!putdashedhline#1{%
  1015.   \ifdim\!dxpos>\!zpt 
  1016.     \!DLsetup\!Flist\!dxpos
  1017.     \put{\hbox to \!totalleaderlength{\!hleaders}\!hpartialpattern\!Rtrunc}
  1018.       #1[l] at {\!xloc} {\!yloc} 
  1019.   \else 
  1020.     \!DLsetup\!Blist{-\!dxpos}
  1021.     \put{\!hpartialpattern\!Ltrunc\hbox to \!totalleaderlength{\!hleaders}}
  1022.       #1[r] at {\!xloc} {\!yloc} 
  1023.   \fi
  1024.   \ignorespaces}
  1025. \def\!putdashedvline#1{%
  1026.   \!dypos=-\!dypos%            ** vertical leaders go from top to bottom
  1027.   \ifdim\!dypos>\!zpt 
  1028.     \!DLsetup\!Flist\!dypos 
  1029.     \put{\vbox{\vbox to \!totalleaderlength{\!vleaders}
  1030.       \!vpartialpattern\!Rtrunc}}#1[t] at {\!xloc} {\!yloc} 
  1031.   \else 
  1032.     \!DLsetup\!Blist{-\!dypos}
  1033.     \put{\vbox{\!vpartialpattern\!Ltrunc
  1034.       \vbox to \!totalleaderlength{\!vleaders}}}#1[b] at {\!xloc} {\!yloc} 
  1035.   \fi
  1036.   \ignorespaces}
  1037. \def\!DLsetup#1#2{%            ** Dashed-Line set up
  1038.   \let\!RSlist=#1%             ** set !Rule-Skip list
  1039.   \!countB=#2%                 ** convert rule length to integer (number of sps)
  1040.   \!countA=\!leaderlength%     ** ditto, leaderlength
  1041.   \divide\!countB by \!countA% ** number of complete leader units
  1042.   \!totalleaderlength=\!countB\!leaderlength
  1043.   \!Rresiduallength=#2%
  1044.   \advance \!Rresiduallength by -\!totalleaderlength%  \** excess length
  1045.   \!Lresiduallength=\!leaderlength
  1046.   \advance \!Lresiduallength by -\!Rresiduallength
  1047.   \ignorespaces}
  1048. \def\!hleaders{%
  1049.   \def\!Rule##1{\vrule height\linethickness width##1}%
  1050.   \def\!Skip##1{\hskip##1}%
  1051.   \leaders\hbox{\!RSlist}\hfill}
  1052. \def\!hpartialpattern#1{%
  1053.   \!dimenA=\!zpt \!dimenB=\!zpt 
  1054.   \def\!Rule##1{#1{##1}\vrule height\linethickness width\!dimenD}%
  1055.   \def\!Skip##1{#1{##1}\hskip\!dimenD}%
  1056.   \!RSlist}
  1057. \def\!vleaders{%
  1058.   \def\!Rule##1{\hrule width\linethickness height##1}%
  1059.   \def\!Skip##1{\vskip##1}%
  1060.   \leaders\vbox{\!RSlist}\vfill}
  1061. \def\!vpartialpattern#1{%
  1062.   \!dimenA=\!zpt \!dimenB=\!zpt 
  1063.   \def\!Rule##1{#1{##1}\hrule width\linethickness height\!dimenD}%
  1064.   \def\!Skip##1{#1{##1}\vskip\!dimenD}%
  1065.   \!RSlist}
  1066. \def\!Rtrunc#1{\!trunc{#1}>\!Rresiduallength}
  1067. \def\!Ltrunc#1{\!trunc{#1}<\!Lresiduallength}
  1068. \def\!trunc#1#2#3{%          
  1069.   \!dimenA=\!dimenB         
  1070.   \advance\!dimenB by #1%
  1071.   \!dimenD=\!dimenB  \ifdim\!dimenD#2#3\!dimenD=#3\fi
  1072.   \!dimenC=\!dimenA  \ifdim\!dimenC#2#3\!dimenC=#3\fi
  1073.   \advance \!dimenD by -\!dimenC}
  1074. \def\!start (#1,#2){%
  1075.   \!plotxorigin=\!xorigin  \advance \!plotxorigin by \!plotsymbolxshift
  1076.   \!plotyorigin=\!yorigin  \advance \!plotyorigin by \!plotsymbolyshift
  1077.   \!xS=\!M{#1}\!xunit \!yS=\!M{#2}\!yunit
  1078.   \!rotateaboutpivot\!xS\!yS
  1079.   \!copylist\!UDlist\to\!!UDlist% **\!UDlist has the form \\{dimen1}\\{dimen2}..
  1080.   \!getnextvalueof\!downlength\from\!!UDlist
  1081.   \!distacross=\!zpt%             ** 1st point goes at start of curve
  1082.   \!intervalno=0 %                ** initialize interval counter
  1083.   \global\totalarclength=\!zpt%   ** initialize distance traveled along curve
  1084.   \ignorespaces}
  1085. \def\!ljoin (#1,#2){%
  1086.   \advance\!intervalno by 1
  1087.   \!xE=\!M{#1}\!xunit \!yE=\!M{#2}\!yunit
  1088.   \!rotateaboutpivot\!xE\!yE
  1089.   \!xdiff=\!xE \advance \!xdiff by -\!xS%**  xdiff = xE - xS
  1090.   \!ydiff=\!yE \advance \!ydiff by -\!yS%**  ydiff = yE - yS
  1091.   \!Pythag\!xdiff\!ydiff\!arclength%     **  arclength = sqrt(xdiff**2+ydiff**2) 
  1092.   \global\advance \totalarclength by \!arclength%
  1093.   \!drawlinearsegment%   ** set by dashpat to \!linearsolid or \!lineardashed
  1094.   \!xS=\!xE \!yS=\!yE%   ** shift ending points to starting points
  1095.   \ignorespaces}
  1096. \def\!linearsolid{%
  1097.   \!npoints=\!arclength
  1098.   \!countA=\plotsymbolspacing
  1099.   \divide\!npoints by \!countA%      ** now #pts =. arclength/plotsymbolspacing
  1100.   \ifnum \!npoints<1 
  1101.     \!npoints=1 
  1102.   \fi
  1103.   \divide\!xdiff by \!npoints
  1104.   \divide\!ydiff by \!npoints
  1105.   \!xpos=\!xS \!ypos=\!yS
  1106.   \loop\ifnum\!npoints>-1
  1107.     \!plotifinbounds
  1108.     \advance \!xpos by \!xdiff
  1109.     \advance \!ypos by \!ydiff
  1110.     \advance \!npoints by -1
  1111.   \repeat
  1112.   \ignorespaces}
  1113. \def\!lineardashed{%
  1114.   \ifdim\!distacross>\!arclength
  1115.     \advance \!distacross by -\!arclength  %nothing to plot in this interval
  1116.   \else
  1117.     \loop\ifdim\!distacross<\!arclength
  1118.       \!divide\!distacross\!arclength\!dimenA%  ** dimA = across/arclength
  1119.       \!removept\!dimenA\!t%  ** \!t holds value in dimA, without the "pt"
  1120.       \!xpos=\!t\!xdiff \advance \!xpos by \!xS
  1121.       \!ypos=\!t\!ydiff \advance \!ypos by \!yS
  1122.       \!plotifinbounds
  1123.       \advance\!distacross by \plotsymbolspacing
  1124.       \!advancedashing
  1125.     \repeat  
  1126.     \advance \!distacross by -\!arclength%    ** prepare for next interval 
  1127.   \fi
  1128.   \ignorespaces}
  1129. \def\!!advancedashing{%
  1130.   \advance\!downlength by -\plotsymbolspacing
  1131.   \ifdim \!downlength>\!zpt
  1132.   \else
  1133.     \advance\!distacross by \!downlength
  1134.     \!getnextvalueof\!uplength\from\!!UDlist
  1135.     \advance\!distacross by \!uplength
  1136.     \!getnextvalueof\!downlength\from\!!UDlist
  1137.   \fi}
  1138. \def\inboundscheckoff{%
  1139.   \def\!plotifinbounds{\!plot(\!xpos,\!ypos)}%
  1140.   \def\!initinboundscheck{\relax}\ignorespaces}
  1141. \def\inboundscheckon{%
  1142.   \def\!plotifinbounds{\!!plotifinbounds}%
  1143.   \def\!initinboundscheck{\!!initinboundscheck}%
  1144.   \!initinboundscheck\ignorespaces} 
  1145. \inboundscheckoff
  1146. \def\!!plotifinbounds{%
  1147.   \ifdim \!xpos<\!checkleft
  1148.   \else
  1149.     \ifdim \!xpos>\!checkright
  1150.     \else
  1151.       \ifdim \!ypos<\!checkbot
  1152.       \else
  1153.          \ifdim \!ypos>\!checktop
  1154.          \else
  1155.            \!plot(\!xpos,\!ypos)
  1156.          \fi 
  1157.       \fi
  1158.     \fi
  1159.   \fi}
  1160. \def\!!initinboundscheck{%
  1161.   \!checkleft=\!arealloc     \advance\!checkleft by \!xorigin
  1162.   \!checkright=\!arearloc    \advance\!checkright by \!xorigin
  1163.   \!checkbot=\!areabloc      \advance\!checkbot by \!yorigin
  1164.   \!checktop=\!areatloc      \advance\!checktop by \!yorigin}
  1165. \def\!logten#1#2{%
  1166.   \expandafter\!!logten#1\!nil
  1167.   \!removept\!dimenF#2%
  1168.   \ignorespaces}
  1169. \def\!!logten#1#2\!nil{%
  1170.   \if -#1%
  1171.     \!dimenF=\!zpt
  1172.     \def\!next{\ignorespaces}%
  1173.   \else
  1174.     \if +#1%
  1175.       \def\!next{\!!logten#2\!nil}%
  1176.     \else
  1177.       \if .#1%
  1178.         \def\!next{\!!logten0.#2\!nil}%
  1179.       \else
  1180.         \def\!next{\!!!logten#1#2..\!nil}%
  1181.       \fi
  1182.     \fi
  1183.   \fi
  1184.   \!next}
  1185. \def\!!!logten#1#2.#3.#4\!nil{%
  1186.   \!dimenF=1pt %                 ** DimF holds log10 original argument
  1187.   \if 0#1%                      
  1188.     \!!logshift#3pt %            ** Argument < 1
  1189.   \else %                        ** Argument >= 1
  1190.     \!logshift#2/%               ** Shift decimal pt as many places
  1191.     \!dimenE=#1.#2#3pt %         **   as there are figures in #2
  1192.   \fi %                          ** Now dimE holds revised X want log10 of
  1193.   \ifdim \!dimenE<\!rootten%          ** Transform X to XX between sqrt(10) 
  1194.     \multiply \!dimenE 10 %           **   and 10*sqrt(10)
  1195.     \advance  \!dimenF -1pt
  1196.   \fi
  1197.   \!dimenG=\!dimenE%                  ** dimG <- (XX + 10)
  1198.     \advance\!dimenG 10pt
  1199.   \advance\!dimenE -10pt %            ** dimE <- (XX - 10)
  1200.   \multiply\!dimenE 10 %              ** dimE = 10*(XX-10)
  1201.   \!divide\!dimenE\!dimenG\!dimenE%   ** Now dimE=10t==10*(XX-10)/(XX+10)
  1202.   \!removept\!dimenE\!t%              ** !t=10t, with "pt" removed
  1203.   \!dimenG=\!t\!dimenE%               ** dimG=100t**2
  1204.   \!removept\!dimenG\!tt%             ** !tt=100t**2, with "pt" removed
  1205.   \!dimenH=\!tt\!tenAe%               ** dimH=10*a5*(10t)**2 /100
  1206.     \divide\!dimenH 100
  1207.   \advance\!dimenH \!tenAc%           ** ditto + 10*a3
  1208.   \!dimenH=\!tt\!dimenH%              ** ditto * (10t)**2 /100
  1209.     \divide\!dimenH 100   
  1210.   \advance\!dimenH \!tenAa%           ** ditto + 10*a1
  1211.   \!dimenH=\!t\!dimenH%               ** ditto * 10t / 100
  1212.     \divide\!dimenH 100 %             ** Now dimH = log10(XX) - 1
  1213.   \advance\!dimenF \!dimenH}%         ** dimF = log10(X)
  1214. \def\!logshift#1{%
  1215.   \if #1/%
  1216.     \def\!next{\ignorespaces}%
  1217.   \else
  1218.     \advance\!dimenF 1pt 
  1219.     \def\!next{\!logshift}%
  1220.   \fi 
  1221.   \!next}
  1222.  \def\!!logshift#1{%
  1223.    \advance\!dimenF -1pt
  1224.    \if 0#1%
  1225.      \def\!next{\!!logshift}%
  1226.    \else
  1227.      \if p#1%
  1228.        \!dimenF=1pt
  1229.        \def\!next{\!dimenE=1p}%
  1230.      \else
  1231.        \def\!next{\!dimenE=#1.}%
  1232.      \fi
  1233.    \fi
  1234.    \!next}
  1235. \def\beginpicture{%
  1236.   \setbox\!picbox=\hbox\bgroup%
  1237.   \!xleft=\maxdimen  
  1238.   \!xright=-\maxdimen
  1239.   \!ybot=\maxdimen
  1240.   \!ytop=-\maxdimen}
  1241. \def\endpicture{%
  1242.   \ifdim\!xleft=\maxdimen%  ** check if nothing was put in picbox
  1243.     \!xleft=\!zpt \!xright=\!zpt \!ybot=\!zpt \!ytop=\!zpt 
  1244.   \fi
  1245.   \global\!Xleft=\!xleft \global\!Xright=\!xright
  1246.   \global\!Ybot=\!ybot \global\!Ytop=\!ytop
  1247.   \egroup%
  1248.   \ht\!picbox=\!Ytop  \dp\!picbox=-\!Ybot
  1249.   \ifdim\!Ybot>\!zpt
  1250.   \else 
  1251.     \ifdim\!Ytop<\!zpt
  1252.       \!Ybot=\!Ytop
  1253.     \else
  1254.       \!Ybot=\!zpt
  1255.     \fi
  1256.   \fi
  1257.   \hbox{\kern-\!Xleft\lower\!Ybot\box\!picbox\kern\!Xright}}
  1258. \def\endpicturesave <#1,#2>{%
  1259.   \endpicture \global #1=\!Xleft \global #2=\!Ybot \ignorespaces}
  1260. \def\setcoordinatesystem{%
  1261.   \!ifnextchar{u}{\!getlengths }
  1262.     {\!getlengths units <\!xunit,\!yunit>}}
  1263. \def\!getlengths units <#1,#2>{%
  1264.   \!xunit=#1\relax
  1265.   \!yunit=#2\relax
  1266.   \!ifcoordmode 
  1267.     \let\!SCnext=\!SCccheckforRP
  1268.   \else
  1269.     \let\!SCnext=\!SCdcheckforRP
  1270.   \fi
  1271.   \!SCnext}
  1272. \def\!SCccheckforRP{%
  1273.   \!ifnextchar{p}{\!cgetreference }
  1274.     {\!cgetreference point at {\!xref} {\!yref} }}
  1275. \def\!cgetreference point at #1 #2 {%
  1276.   \edef\!xref{#1}\edef\!yref{#2}%
  1277.   \!xorigin=\!xref\!xunit  \!yorigin=\!yref\!yunit  
  1278.   \!initinboundscheck % ** See linear.tex
  1279.   \ignorespaces}
  1280. \def\!SCdcheckforRP{%
  1281.   \!ifnextchar{p}{\!dgetreference}%
  1282.     {\ignorespaces}}
  1283. \def\!dgetreference point at #1 #2 {%
  1284.   \!xorigin=#1\relax  \!yorigin=#2\relax
  1285.   \ignorespaces}
  1286. \long\def\put#1#2 at #3 #4 {%
  1287.   \!setputobject{#1}{#2}%
  1288.   \!xpos=\!M{#3}\!xunit  \!ypos=\!M{#4}\!yunit  
  1289.   \!rotateaboutpivot\!xpos\!ypos%
  1290.   \advance\!xpos -\!xorigin  \advance\!xpos -\!xshift
  1291.   \advance\!ypos -\!yorigin  \advance\!ypos -\!yshift
  1292.   \kern\!xpos\raise\!ypos\box\!putobject\kern-\!xpos%
  1293.   \!doaccounting\ignorespaces}
  1294. \long\def\multiput #1#2 at {%
  1295.   \!setputobject{#1}{#2}%
  1296.   \!ifnextchar"{\!putfromfile}{\!multiput}}
  1297. \def\!putfromfile"#1"{%
  1298.   \expandafter\!multiput \input #1 /}
  1299. \def\!multiput{%
  1300.   \futurelet\!nextchar\!!multiput}
  1301. \def\!!multiput{%
  1302.   \if *\!nextchar
  1303.     \def\!nextput{\!alsoby}%
  1304.   \else
  1305.     \if /\!nextchar
  1306.       \def\!nextput{\!finishmultiput}%
  1307.     \else
  1308.       \def\!nextput{\!alsoat}%
  1309.     \fi
  1310.   \fi
  1311.   \!nextput}
  1312. \def\!finishmultiput/{%
  1313.   \setbox\!putobject=\hbox{}%
  1314.   \ignorespaces}
  1315. \def\!alsoat#1 #2 {%
  1316.   \!xpos=\!M{#1}\!xunit  \!ypos=\!M{#2}\!yunit  
  1317.   \!rotateaboutpivot\!xpos\!ypos%
  1318.   \advance\!xpos -\!xorigin  \advance\!xpos -\!xshift
  1319.   \advance\!ypos -\!yorigin  \advance\!ypos -\!yshift
  1320.   \kern\!xpos\raise\!ypos\copy\!putobject\kern-\!xpos%
  1321.   \!doaccounting
  1322.   \!multiput}
  1323. \def\!alsoby*#1 #2 #3 {%
  1324.   \!dxpos=\!M{#2}\!xunit \!dypos=\!M{#3}\!yunit 
  1325.   \!rotateonly\!dxpos\!dypos
  1326.   \!ntemp=#1%
  1327.   \!!loop\ifnum\!ntemp>0
  1328.     \advance\!xpos by \!dxpos  \advance\!ypos by \!dypos
  1329.     \kern\!xpos\raise\!ypos\copy\!putobject\kern-\!xpos%
  1330.     \advance\!ntemp by -1
  1331.   \repeat
  1332.   \!doaccounting 
  1333.   \!multiput}
  1334. \def\accountingon{\def\!doaccounting{\!!doaccounting}\ignorespaces}
  1335. \def\accountingoff{\def\!doaccounting{}\ignorespaces}
  1336. \accountingon
  1337. \def\!!doaccounting{%
  1338.   \!xtemp=\!xpos  
  1339.   \!ytemp=\!ypos
  1340.   \ifdim\!xtemp<\!xleft 
  1341.      \!xleft=\!xtemp 
  1342.   \fi
  1343.   \advance\!xtemp by  \!wd 
  1344.   \ifdim\!xright<\!xtemp 
  1345.     \!xright=\!xtemp
  1346.   \fi
  1347.   \advance\!ytemp by -\!dp
  1348.   \ifdim\!ytemp<\!ybot  
  1349.     \!ybot=\!ytemp
  1350.   \fi
  1351.   \advance\!ytemp by  \!dp
  1352.   \advance\!ytemp by  \!ht 
  1353.   \ifdim\!ytemp>\!ytop  
  1354.     \!ytop=\!ytemp  
  1355.   \fi}
  1356. \long\def\!setputobject#1#2{%
  1357.   \setbox\!putobject=\hbox{#1}%
  1358.   \!ht=\ht\!putobject  \!dp=\dp\!putobject  \!wd=\wd\!putobject
  1359.   \wd\!putobject=\!zpt
  1360.   \!xshift=.5\!wd   \!yshift=.5\!ht   \advance\!yshift by -.5\!dp
  1361.   \edef\!putorientation{#2}%
  1362.   \expandafter\!SPOreadA\!putorientation[]\!nil%
  1363.   \expandafter\!SPOreadB\!putorientation<\!zpt,\!zpt>\!nil\ignorespaces}
  1364. \def\!SPOreadA#1[#2]#3\!nil{\!etfor\!orientation:=#2\do\!SPOreviseshift}
  1365. \def\!SPOreadB#1<#2,#3>#4\!nil{\advance\!xshift by -#2\advance\!yshift by -#3}
  1366. \def\!SPOreviseshift{%
  1367.   \if l\!orientation 
  1368.     \!xshift=\!zpt
  1369.   \else 
  1370.     \if r\!orientation 
  1371.       \!xshift=\!wd
  1372.     \else 
  1373.       \if b\!orientation
  1374.         \!yshift=-\!dp
  1375.       \else 
  1376.         \if B\!orientation 
  1377.           \!yshift=\!zpt
  1378.         \else 
  1379.           \if t\!orientation 
  1380.             \!yshift=\!ht
  1381.           \fi 
  1382.         \fi
  1383.       \fi
  1384.     \fi
  1385.   \fi}
  1386. \long\def\!dimenput#1#2(#3,#4){%
  1387.   \!setputobject{#1}{#2}%
  1388.   \!xpos=#3\advance\!xpos by -\!xshift
  1389.   \!ypos=#4\advance\!ypos by -\!yshift
  1390.   \kern\!xpos\raise\!ypos\box\!putobject\kern-\!xpos%
  1391.   \!doaccounting\ignorespaces}
  1392. \def\!setdimenmode{%
  1393.   \let\!M=\!M!!\ignorespaces}
  1394. \def\!setcoordmode{%
  1395.   \let\!M=\!M!\ignorespaces}
  1396. \def\!ifcoordmode{%
  1397.   \ifx \!M \!M!}
  1398. \def\!ifdimenmode{%
  1399.   \ifx \!M \!M!!}
  1400. \def\!M!#1#2{#1#2} 
  1401. \def\!M!!#1#2{#1}
  1402. \!setcoordmode
  1403. \let\setdimensionmode=\!setdimenmode
  1404. \let\setcoordinatemode=\!setcoordmode
  1405. \def\Xdistance#1{%
  1406.   \!M{#1}\!xunit
  1407.   \ignorespaces}
  1408. \def\Ydistance#1{%
  1409.   \!M{#1}\!yunit
  1410.   \ignorespaces}
  1411. \def\stack{%
  1412.   \!ifnextchar[{\!stack}{\!stack[c]}}
  1413. \def\!stack[#1]{%
  1414.   \let\!lglue=\hfill \let\!rglue=\hfill
  1415.   \expandafter\let\csname !#1glue\endcsname=\relax
  1416.   \!ifnextchar<{\!!stack}{\!!stack<\stackleading>}}
  1417. \def\!!stack<#1>#2{%
  1418.   \vbox{\def\!valueslist{}\!ecfor\!value:=#2\do{%
  1419.     \expandafter\!rightappend\!value\withCS{\\}\to\!valueslist}%
  1420.     \!lop\!valueslist\to\!value
  1421.     \let\\=\cr\lineskiplimit=\maxdimen\lineskip=#1%
  1422.     \baselineskip=-1000pt\halign{\!lglue##\!rglue\cr \!value\!valueslist\cr}}%
  1423.   \ignorespaces}
  1424. \def\lines{%
  1425.   \!ifnextchar[{\!lines}{\!lines[c]}}
  1426. \def\!lines[#1]#2{%
  1427.   \let\!lglue=\hfill \let\!rglue=\hfill
  1428.   \expandafter\let\csname !#1glue\endcsname=\relax
  1429.   \vbox{\halign{\!lglue##\!rglue\cr #2\crcr}}%
  1430.   \ignorespaces}
  1431. \def\Lines{%
  1432.   \!ifnextchar[{\!Lines}{\!Lines[c]}}
  1433. \def\!Lines[#1]#2{%
  1434.   \let\!lglue=\hfill \let\!rglue=\hfill
  1435.   \expandafter\let\csname !#1glue\endcsname=\relax
  1436.   \vtop{\halign{\!lglue##\!rglue\cr #2\crcr}}%
  1437.   \ignorespaces}
  1438. \def\setplotsymbol(#1#2){%
  1439.   \!setputobject{#1}{#2}
  1440.   \setbox\!plotsymbol=\box\!putobject%
  1441.   \!plotsymbolxshift=\!xshift 
  1442.   \!plotsymbolyshift=\!yshift 
  1443.   \ignorespaces}
  1444. \setplotsymbol({\fiverm .})%       ** initialize plotsymbol
  1445. \def\!!plot(#1,#2){%
  1446.   \!dimenA=-\!plotxorigin \advance \!dimenA by #1%    ** over
  1447.   \!dimenB=-\!plotyorigin \advance \!dimenB by #2%    ** up
  1448.   \kern\!dimenA\raise\!dimenB\copy\!plotsymbol\kern-\!dimenA%
  1449.   \ignorespaces}
  1450. \def\!!!plot(#1,#2){%
  1451.   \!dimenA=-\!plotxorigin \advance \!dimenA by #1%    ** over
  1452.   \!dimenB=-\!plotyorigin \advance \!dimenB by #2%    ** up
  1453.   \kern\!dimenA\raise\!dimenB\copy\!plotsymbol\kern-\!dimenA%
  1454.   \!countE=\!dimenA
  1455.   \!countF=\!dimenB
  1456.   \immediate\write\!replotfile{\the\!countE,\the\!countF.}%
  1457.   \ignorespaces}
  1458. \def\savelinesandcurves on "#1" {%
  1459.   \immediate\closeout\!replotfile
  1460.   \immediate\openout\!replotfile=#1%
  1461.   \let\!plot=\!!!plot}
  1462. \def\dontsavelinesandcurves {%
  1463.   \let\!plot=\!!plot}
  1464. \dontsavelinesandcurves
  1465. {\catcode`\%=11\xdef\!Commentsignal{%}}
  1466. \def\writesavefile#1 {%
  1467.   \immediate\write\!replotfile{\!Commentsignal #1}%
  1468.   \ignorespaces}
  1469. \def\replot"#1" {%
  1470.   \expandafter\!replot\input #1 /}
  1471. \def\!replot#1,#2. {%
  1472.   \!dimenA=#1sp
  1473.   \kern\!dimenA\raise#2sp\copy\!plotsymbol\kern-\!dimenA
  1474.   \futurelet\!nextchar\!!replot}
  1475. \def\!!replot{%
  1476.   \if /\!nextchar 
  1477.     \def\!next{\!finish}%
  1478.   \else
  1479.     \def\!next{\!replot}%
  1480.   \fi
  1481.   \!next}
  1482. \def\!Pythag#1#2#3{%
  1483.   \!dimenE=#1\relax                                     
  1484.   \ifdim\!dimenE<\!zpt 
  1485.     \!dimenE=-\!dimenE 
  1486.   \fi%                                            ** dimE = |x|
  1487.   \!dimenF=#2\relax
  1488.   \ifdim\!dimenF<\!zpt 
  1489.     \!dimenF=-\!dimenF 
  1490.   \fi%                                            ** dimF = |y|
  1491.   \advance \!dimenF by \!dimenE%                  ** dimF = s = |x|+|y|
  1492.   \ifdim\!dimenF=\!zpt 
  1493.     \!dimenG=\!zpt%                               ** dimG = z = sqrt(x**2+y**2)
  1494.   \else 
  1495.     \!divide{8\!dimenE}\!dimenF\!dimenE%          ** now dimE = 8t = (8|x|)/s
  1496.     \advance\!dimenE by -4pt%                     ** 8tau = (8t-4)*2
  1497.       \!dimenE=2\!dimenE%                         **   (tau = 2*t - 1)
  1498.     \!removept\!dimenE\!!t%                       ** 8tau, without "pt"
  1499.     \!dimenE=\!!t\!dimenE%                        ** (8tau)**2, in pts
  1500.     \advance\!dimenE by 64pt%                     ** u = [64 + (8tau)**2]/2
  1501.     \divide \!dimenE by 2%                        **   [u = (8f)**2]
  1502.     \!dimenH=7pt%                                 ** initial guess g at sqrt(u)
  1503.     \!!Pythag\!!Pythag\!!Pythag%                  ** 3 iterations give sqrt(u)
  1504.     \!removept\!dimenH\!!t%                       ** 8f=sqrt(u), without "pt"
  1505.     \!dimenG=\!!t\!dimenF%                        ** z = (8f)*s/8
  1506.     \divide\!dimenG by 8
  1507.   \fi
  1508.   #3=\!dimenG
  1509.   \ignorespaces}
  1510. \def\!!Pythag{%                                   ** Newton-Raphson for sqrt
  1511.   \!divide\!dimenE\!dimenH\!dimenI%               ** v = u/g
  1512.   \advance\!dimenH by \!dimenI%                   ** g <-- (g + u/g)/2
  1513.     \divide\!dimenH by 2}
  1514. \def\placehypotenuse for <#1> and <#2> in <#3> {%
  1515.   \!Pythag{#1}{#2}{#3}}
  1516. \def\!qjoin (#1,#2) (#3,#4){%
  1517.   \advance\!intervalno by 1
  1518.   \!ifcoordmode
  1519.     \edef\!xmidpt{#1}\edef\!ymidpt{#2}%
  1520.   \else
  1521.     \!dimenA=#1\relax \edef\!xmidpt{\the\!dimenA}%
  1522.     \!dimenA=#2\relax \edef\!ymidpt{\the\!dimenA}%
  1523.   \fi
  1524.   \!xM=\!M{#1}\!xunit  \!yM=\!M{#2}\!yunit   \!rotateaboutpivot\!xM\!yM
  1525.   \!xE=\!M{#3}\!xunit  \!yE=\!M{#4}\!yunit   \!rotateaboutpivot\!xE\!yE
  1526.   \!dimenA=\!xM  \advance \!dimenA by -\!xS%   ** dimA = I = xM - xS
  1527.   \!dimenB=\!xE  \advance \!dimenB by -\!xM%   ** dimB = II = xE-xM
  1528.   \!xB=3\!dimenA \advance \!xB by -\!dimenB%   ** b=3I-II
  1529.   \!xC=2\!dimenB \advance \!xC by -2\!dimenA%  ** c=2(II-I)
  1530.   \!dimenA=\!yM  \advance \!dimenA by -\!yS%   
  1531.   \!dimenB=\!yE  \advance \!dimenB by -\!yM%  
  1532.   \!yB=3\!dimenA \advance \!yB by -\!dimenB%  
  1533.   \!yC=2\!dimenB \advance \!yC by -2\!dimenA% 
  1534.   \!xprime=\!xB  \!yprime=\!yB%          ** x'(t) = b + 2ct
  1535.   \!dxprime=.5\!xC  \!dyprime=.5\!yC%    ** dt=1/4 ==> dx'(t) = c/2
  1536.   \!getf \!midarclength=\!dimenA
  1537.   \!getf \advance \!midarclength by 4\!dimenA
  1538.   \!getf \advance \!midarclength by \!dimenA
  1539.   \divide \!midarclength by 12
  1540.   \!arclength=\!dimenA
  1541.   \!getf \advance \!arclength by 4\!dimenA
  1542.   \!getf \advance \!arclength by \!dimenA
  1543.   \divide \!arclength by 12%             ** Now have arc length over [1/2,1]
  1544.   \advance \!arclength by \!midarclength
  1545.   \global\advance \totalarclength by \!arclength
  1546.   \ifdim\!distacross>\!arclength 
  1547.     \advance \!distacross by -\!arclength%   ** nothing 
  1548.   \else
  1549.     \!initinverseinterp%  ** initialize for inverse interpolation on arc length
  1550.     \loop\ifdim\!distacross<\!arclength%     ** loop over points on arc 
  1551.       \!inverseinterp%    ** find  t  such that arc length[0,t] = distacross,
  1552.       \!xpos=\!t\!xC \advance\!xpos by \!xB
  1553.         \!xpos=\!t\!xpos \advance \!xpos by \!xS
  1554.       \!ypos=\!t\!yC \advance\!ypos by \!yB
  1555.         \!ypos=\!t\!ypos \advance \!ypos by \!yS
  1556.       \!plotifinbounds%                       ** plot point if in bounds
  1557.       \advance\!distacross \plotsymbolspacing%** advance arc length for next pt
  1558.       \!advancedashing%                       ** see "linear"
  1559.     \repeat  
  1560.     \advance \!distacross by -\!arclength%    ** prepare for next interval 
  1561.   \fi
  1562.   \!xS=\!xE%              ** shift ending points to starting points
  1563.   \!yS=\!yE
  1564.   \ignorespaces}
  1565. \def\!getf{\!Pythag\!xprime\!yprime\!dimenA%
  1566.   \advance\!xprime by \!dxprime
  1567.   \advance\!yprime by \!dyprime}
  1568. \def\!initinverseinterp{%
  1569.   \ifdim\!arclength>\!zpt
  1570.     \!divide{8\!midarclength}\!arclength\!dimenE% ** dimE=8w=8r/s, where  r 
  1571.     \ifdim\!dimenE<\!wmin \!setinverselinear
  1572.     \else 
  1573.       \ifdim\!dimenE>\!wmax \!setinverselinear
  1574.       \else%                                    ** w  in range: initialize
  1575.         \def\!inverseinterp{\!inversequad}\ignorespaces
  1576.          \!removept\!dimenE\!Ew%           **  8w, without "pt"
  1577.          \!dimenF=-\!Ew\!dimenE%           **  -(8w)**2
  1578.          \advance\!dimenF by 32pt%         **  32 - (8w)**2
  1579.          \!dimenG=8pt 
  1580.          \advance\!dimenG by -\!dimenE%    **  8 - 8w
  1581.          \!dimenG=\!Ew\!dimenG%            **  (8w)*(8-8w)
  1582.          \!divide\!dimenF\!dimenG\!beta%   **  beta = (32-(8w)**2)/(8w(8-8w))
  1583.          \!gamma=1pt
  1584.          \advance \!gamma by -\!beta%      **  gamma = 1-beta
  1585.       \fi%       ** end of the \ifdim\!dimenE>\!wmax
  1586.     \fi%         ** end of the \ifdim\!dimenE<\!wmin
  1587.   \fi%           ** end of the \ifdim\!arclength>\!zpt
  1588.   \ignorespaces}
  1589. \def\!inversequad{%
  1590.   \!divide\!distacross\!arclength\!dimenG%   ** dimG = v = distacross/arclength
  1591.   \!removept\!dimenG\!v%                     ** v, without "pt"
  1592.   \!dimenG=\!v\!gamma%                       ** gamma*v
  1593.   \advance\!dimenG by \!beta%                ** beta + gamma*v
  1594.   \!dimenG=\!v\!dimenG%                      ** t = v*(beta + gamma*v)
  1595.   \!removept\!dimenG\!t}%                    ** t, without "pt"
  1596. \def\!setinverselinear{%
  1597.   \def\!inverseinterp{\!inverselinear}%
  1598.   \divide\!dimenE by 8 \!removept\!dimenE\!t
  1599.   \!countC=\!intervalno \multiply \!countC 2
  1600.   \!countB=\!countC     \advance \!countB -1
  1601.   \!countA=\!countB     \advance \!countA -1
  1602.   \wlog{\the\!countB th point (\!xmidpt,\!ymidpt) being plotted 
  1603.     doesn't lie in the}%
  1604.   \wlog{ middle third of the arc between the \the\!countA th 
  1605.     and \the\!countC th points:}%
  1606.   \wlog{ [arc length \the\!countA\space to \the\!countB]/[arc length 
  1607.     \the \!countA\space to \the\!countC]=\!t.}%
  1608.   \ignorespaces}
  1609. \def\!inverselinear{% 
  1610.   \!divide\!distacross\!arclength\!dimenG
  1611.   \!removept\!dimenG\!t}
  1612. \def\startrotation{%
  1613.   \let\!rotateaboutpivot=\!!rotateaboutpivot
  1614.   \let\!rotateonly=\!!rotateonly
  1615.   \!ifnextchar{b}{\!getsincos }%
  1616.     {\!getsincos by {\!cosrotationangle} {\!sinrotationangle} }}
  1617. \def\!getsincos by #1 #2 {%
  1618.   \edef\!cosrotationangle{#1}%
  1619.   \edef\!sinrotationangle{#2}%
  1620.   \!ifcoordmode 
  1621.     \let\!ROnext=\!ccheckforpivot
  1622.   \else
  1623.     \let\!ROnext=\!dcheckforpivot
  1624.   \fi
  1625.   \!ROnext}
  1626. \def\!ccheckforpivot{%
  1627.   \!ifnextchar{a}{\!cgetpivot}%
  1628.     {\!cgetpivot about {\!xpivotcoord} {\!ypivotcoord} }}
  1629. \def\!cgetpivot about #1 #2 {%
  1630.   \edef\!xpivotcoord{#1}%
  1631.   \edef\!ypivotcoord{#2}%
  1632.   \!xpivot=#1\!xunit  \!ypivot=#2\!yunit
  1633.   \ignorespaces}
  1634. \def\!dcheckforpivot{%
  1635.   \!ifnextchar{a}{\!dgetpivot}{\ignorespaces}}
  1636. \def\!dgetpivot about #1 #2 {%
  1637.   \!xpivot=#1\relax  \!ypivot=#2\relax
  1638.   \ignorespaces}
  1639. \def\stoprotation{%
  1640.   \let\!rotateaboutpivot=\!!!rotateaboutpivot
  1641.   \let\!rotateonly=\!!!rotateonly
  1642.   \ignorespaces}
  1643. \def\!!rotateaboutpivot#1#2{%
  1644.   \!dimenA=#1\relax  \advance\!dimenA -\!xpivot
  1645.   \!dimenB=#2\relax  \advance\!dimenB -\!ypivot
  1646.   \!dimenC=\!cosrotationangle\!dimenA
  1647.     \advance \!dimenC -\!sinrotationangle\!dimenB
  1648.   \!dimenD=\!cosrotationangle\!dimenB
  1649.     \advance \!dimenD  \!sinrotationangle\!dimenA
  1650.   \advance\!dimenC \!xpivot  \advance\!dimenD \!ypivot
  1651.   #1=\!dimenC  #2=\!dimenD
  1652.   \ignorespaces}
  1653. \def\!!rotateonly#1#2{%
  1654.   \!dimenA=#1\relax  \!dimenB=#2\relax 
  1655.   \!dimenC=\!cosrotationangle\!dimenA
  1656.     \advance \!dimenC -\!rotsign\!sinrotationangle\!dimenB
  1657.   \!dimenD=\!cosrotationangle\!dimenB
  1658.     \advance \!dimenD  \!rotsign\!sinrotationangle\!dimenA
  1659.   #1=\!dimenC  #2=\!dimenD
  1660.   \ignorespaces}
  1661. \def\!rotsign{}
  1662. \def\!!!rotateaboutpivot#1#2{\relax}
  1663. \def\!!!rotateonly#1#2{\relax}
  1664. \stoprotation
  1665. \def\!reverserotateonly#1#2{%
  1666.   \def\!rotsign{-}%
  1667.   \!rotateonly{#1}{#2}%
  1668.   \def\!rotsign{}%
  1669.   \ignorespaces}
  1670. \def\setshadegrid{%
  1671.   \!ifnextchar{s}{\!getspan }
  1672.     {\!getspan span <\!dshade>}}
  1673. \def\!getspan span <#1>{%
  1674.   \!dshade=#1\relax
  1675.   \!ifcoordmode 
  1676.     \let\!GRnext=\!GRccheckforAP
  1677.   \else
  1678.     \let\!GRnext=\!GRdcheckforAP
  1679.   \fi
  1680.   \!GRnext}
  1681. \def\!GRccheckforAP{%
  1682.   \!ifnextchar{p}{\!cgetanchor }
  1683.     {\!cgetanchor point at {\!xshadesave} {\!yshadesave} }}
  1684. \def\!cgetanchor point at #1 #2 {%
  1685.   \edef\!xshadesave{#1}\edef\!yshadesave{#2}%
  1686.   \!xshade=\!xshadesave\!xunit  \!yshade=\!yshadesave\!yunit
  1687.   \ignorespaces}
  1688. \def\!GRdcheckforAP{%
  1689.   \!ifnextchar{p}{\!dgetanchor}%
  1690.     {\ignorespaces}}
  1691. \def\!dgetanchor point at #1 #2 {%
  1692.   \!xshade=#1\relax  \!yshade=#2\relax
  1693.   \ignorespaces}
  1694. \def\setshadesymbol{%
  1695.   \!ifnextchar<{\!setshadesymbol}{\!setshadesymbol<,,,> }}
  1696. \def\!setshadesymbol <#1,#2,#3,#4> (#5#6){%
  1697.   \!setputobject{#5}{#6}%                        
  1698.   \setbox\!shadesymbol=\box\!putobject%
  1699.   \!shadesymbolxshift=\!xshift \!shadesymbolyshift=\!yshift
  1700.   \!dimenA=\!xshift \advance\!dimenA \!smidge% ** default LS = xshift - smidge
  1701.   \!override\!dimenA{#1}\!lshrinkage%         
  1702.   \!dimenA=\!wd \advance \!dimenA -\!xshift%   ** default RS = width - xshift
  1703.     \advance\!dimenA \!smidge%                                  - smidge
  1704.     \!override\!dimenA{#2}\!rshrinkage
  1705.   \!dimenA=\!dp \advance \!dimenA \!yshift%    ** default BS = depth + yshift
  1706.     \advance\!dimenA \!smidge%                                  - smidge
  1707.     \!override\!dimenA{#3}\!bshrinkage
  1708.   \!dimenA=\!ht \advance \!dimenA -\!yshift%   ** default TS = height - yshift
  1709.     \advance\!dimenA \!smidge%                                  - smidge
  1710.     \!override\!dimenA{#4}\!tshrinkage
  1711.   \ignorespaces}
  1712. \def\!smidge{-.2pt}%
  1713. \def\!override#1#2#3{%
  1714.   \edef\!!override{#2}% 
  1715.   \ifx \!!override\empty
  1716.     #3=#1\relax
  1717.   \else
  1718.     \if z\!!override
  1719.       #3=\!zpt
  1720.     \else
  1721.       \ifx \!!override\!blankz
  1722.         #3=\!zpt
  1723.       \else
  1724.         #3=#2\relax
  1725.       \fi
  1726.     \fi
  1727.   \fi
  1728.   \ignorespaces}
  1729. \def\!blankz{ z}
  1730. \setshadesymbol ({\fiverm .})%       ** initialize plotsymbol
  1731. \def\!startvshade#1(#2,#3,#4){%
  1732.   \let\!!xunit=\!xunit%
  1733.   \let\!!yunit=\!yunit%
  1734.   \let\!!xshade=\!xshade%
  1735.   \let\!!yshade=\!yshade%
  1736.   \def\!getshrinkages{\!vgetshrinkages}%
  1737.   \let\!setshadelocation=\!vsetshadelocation%
  1738.   \!xS=\!M{#2}\!!xunit
  1739.   \!ybS=\!M{#3}\!!yunit
  1740.   \!ytS=\!M{#4}\!!yunit
  1741.   \!shadexorigin=\!xorigin  \advance \!shadexorigin \!shadesymbolxshift
  1742.   \!shadeyorigin=\!yorigin  \advance \!shadeyorigin \!shadesymbolyshift
  1743.   \ignorespaces}
  1744. \def\!starthshade#1(#2,#3,#4){%
  1745.   \let\!!xunit=\!yunit%
  1746.   \let\!!yunit=\!xunit%
  1747.   \let\!!xshade=\!yshade%
  1748.   \let\!!yshade=\!xshade%
  1749.   \def\!getshrinkages{\!hgetshrinkages}%
  1750.   \let\!setshadelocation=\!hsetshadelocation%
  1751.   \!xS=\!M{#2}\!!xunit
  1752.   \!ybS=\!M{#3}\!!yunit
  1753.   \!ytS=\!M{#4}\!!yunit
  1754.   \!shadexorigin=\!xorigin  \advance \!shadexorigin \!shadesymbolxshift
  1755.   \!shadeyorigin=\!yorigin  \advance \!shadeyorigin \!shadesymbolyshift
  1756.   \ignorespaces}
  1757. \def\!lattice#1#2#3#4#5{%
  1758.   \!dimenA=#1%                        ** dimA = ANCHOR
  1759.   \!dimenB=#2%                        ** dimB = SPAN  (assumed > 0pt)
  1760.   \!countB=\!dimenB%                  ** ctB  = SPAN, as a count
  1761.   \!dimenC=#3%                        ** dimC = LOCATION
  1762.   \advance\!dimenC -\!dimenA%         ** now dimC = LOCATION-ANCHOR
  1763.   \!countA=\!dimenC%                  ** ctA = above, as a count
  1764.   \divide\!countA \!countB%           ** now ctA = desired index, if dimC <= 0
  1765.   \ifdim\!dimenC>\!zpt
  1766.     \!dimenD=\!countA\!dimenB%        ** (tentative k)*span
  1767.     \ifdim\!dimenD<\!dimenC%          ** if this is false, ctA = desired index
  1768.       \advance\!countA 1 %            ** if true, have to add 1
  1769.     \fi
  1770.   \fi
  1771.   \!dimenC=\!countA\!dimenB%          ** lattice location = anchor + ctA*span
  1772.     \advance\!dimenC \!dimenA
  1773.   #4=\!countA%                        ** the desired index
  1774.   #5=\!dimenC%                        ** corresponding lattice location
  1775.   \ignorespaces}
  1776. \def\!qshade#1(#2,#3,#4)#5(#6,#7,#8){%
  1777.   \!xM=\!M{#2}\!!xunit
  1778.   \!ybM=\!M{#3}\!!yunit
  1779.   \!ytM=\!M{#4}\!!yunit
  1780.   \!xE=\!M{#6}\!!xunit
  1781.   \!ybE=\!M{#7}\!!yunit
  1782.   \!ytE=\!M{#8}\!!yunit
  1783.   \!getcoeffs\!xS\!ybS\!xM\!ybM\!xE\!ybE\!ybB\!ybC%**Get coefficients B & C for
  1784.   \!getcoeffs\!xS\!ytS\!xM\!ytM\!xE\!ytE\!ytB\!ytC%**y=y0 + B(x-X0) + C(x-X0)**2
  1785.   \def\!getylimits{\!qgetylimits}%
  1786.   \!shade{#1}\ignorespaces}
  1787. \def\!lshade#1(#2,#3,#4){%
  1788.   \!xE=\!M{#2}\!!xunit
  1789.   \!ybE=\!M{#3}\!!yunit
  1790.   \!ytE=\!M{#4}\!!yunit
  1791.   \!dimenE=\!xE  \advance \!dimenE -\!xS%   ** xE-xS
  1792.   \!dimenC=\!ytE \advance \!dimenC -\!ytS%  ** ytE-ytS
  1793.   \!divide\!dimenC\!dimenE\!ytB%            ** ytB = (ytE-ytS)/(xE-xS)
  1794.   \!dimenC=\!ybE \advance \!dimenC -\!ybS%  ** ybE-ybS
  1795.   \!divide\!dimenC\!dimenE\!ybB%            ** ybB = (ybE-ybS)/(xE-xS)
  1796.   \def\!getylimits{\!lgetylimits}%
  1797.   \!shade{#1}\ignorespaces}
  1798. \def\!getcoeffs#1#2#3#4#5#6#7#8{% 
  1799.   \!dimenC=#4\advance \!dimenC -#2%            ** dimC=Y1-Y0
  1800.   \!dimenE=#3\advance \!dimenE -#1%            ** dimE=X1-X0
  1801.   \!divide\!dimenC\!dimenE\!dimenF%            ** dimF=S1
  1802.   \!dimenC=#6\advance \!dimenC -#4%            ** dimC=Y2-Y1
  1803.   \!dimenH=#5\advance \!dimenH -#3%            ** dimH=X2-X1
  1804.   \!divide\!dimenC\!dimenH\!dimenG%            ** dimG=S2
  1805.   \advance\!dimenG -\!dimenF%                  ** dimG=S2-S1
  1806.   \advance \!dimenH \!dimenE%                  ** dimH=X2-X0
  1807.   \!divide\!dimenG\!dimenH#8%                  ** C=(S2-S1)/(X2-X0)
  1808.   \!removept#8\!t%                             ** C, without "pt"
  1809.   #7=-\!t\!dimenE%                             ** -C*(X1-X0)
  1810.   \advance #7\!dimenF%                         ** B=S1-C*(X1-X0)
  1811.   \ignorespaces}
  1812. \def\!shade#1{%
  1813.   \!getshrinkages#1<,,,>\!nil% %       ** now effective LS=dimE, RS=dimF,
  1814.   \advance \!dimenE \!xS%              ** now dimE=xS+LS
  1815.   \!lattice\!!xshade\!dshade\!dimenE%  ** set parity=index of left-mst x-lattice
  1816.     \!parity\!xpos%                    **   point >= xS+LS, xpos=its location
  1817.   \!dimenF=-\!dimenF%                  ** set dimF=xE-RS
  1818.     \advance\!dimenF \!xE
  1819.   \!loop\!not{\ifdim\!xpos>\!dimenF}%  ** loop over x-lattice points <= xE-RS
  1820.     \!shadecolumn%                 
  1821.     \advance\!xpos \!dshade%           ** move over to next column
  1822.     \advance\!parity 1%                ** increase index of x-point
  1823.   \repeat
  1824.   \!xS=\!xE%                           ** shift ending values to starting values
  1825.   \!ybS=\!ybE
  1826.   \!ytS=\!ytE
  1827.   \ignorespaces}
  1828. \def\!vgetshrinkages#1<#2,#3,#4,#5>#6\!nil{%
  1829.   \!override\!lshrinkage{#2}\!dimenE
  1830.   \!override\!rshrinkage{#3}\!dimenF
  1831.   \!override\!bshrinkage{#4}\!dimenG
  1832.   \!override\!tshrinkage{#5}\!dimenH
  1833.   \ignorespaces}
  1834. \def\!hgetshrinkages#1<#2,#3,#4,#5>#6\!nil{%
  1835.   \!override\!lshrinkage{#2}\!dimenG
  1836.   \!override\!rshrinkage{#3}\!dimenH
  1837.   \!override\!bshrinkage{#4}\!dimenE
  1838.   \!override\!tshrinkage{#5}\!dimenF
  1839.   \ignorespaces}
  1840. \def\!shadecolumn{%
  1841.   \!dxpos=\!xpos
  1842.   \advance\!dxpos -\!xS%            ** dx = x - xS
  1843.   \!removept\!dxpos\!dx%            ** ditto, without "pt"
  1844.   \!getylimits%                     ** get top and bottom y-values
  1845.   \advance\!ytpos -\!dimenH%        ** less TS
  1846.   \advance\!ybpos \!dimenG%         ** plus BS
  1847.   \!yloc=\!!yshade%                 ** get anchor point for this column
  1848.   \ifodd\!parity 
  1849.      \advance\!yloc \!dshade
  1850.   \fi
  1851.   \!lattice\!yloc{2\!dshade}\!ybpos%
  1852.     \!countA\!ypos%                 ** ypos=smallest y point for this column
  1853.   \!dimenA=-\!shadexorigin \advance \!dimenA \!xpos%      ** over
  1854.   \loop\!not{\ifdim\!ypos>\!ytpos}% ** loop over ypos <= yt(t)
  1855.     \!setshadelocation%             ** vmode: xloc=xpos, yloc=ypos 
  1856.     \!rotateaboutpivot\!xloc\!yloc%
  1857.     \!dimenA=-\!shadexorigin \advance \!dimenA \!xloc%    ** over
  1858.     \!dimenB=-\!shadeyorigin \advance \!dimenB \!yloc%    ** up
  1859.     \kern\!dimenA \raise\!dimenB\copy\!shadesymbol \kern-\!dimenA
  1860.     \advance\!ypos 2\!dshade
  1861.   \repeat
  1862.   \ignorespaces}
  1863. \def\!qgetylimits{%
  1864.   \!dimenA=\!dx\!ytC              
  1865.   \advance\!dimenA \!ytB%         ** yt(t)=ytS + dx*(Bt + dx*Ct)
  1866.   \!ytpos=\!dx\!dimenA
  1867.   \advance\!ytpos \!ytS
  1868.   \!dimenA=\!dx\!ybC              
  1869.   \advance\!dimenA \!ybB%         ** yb(t)=ybS + dx*(Bb + dx*Cb)
  1870.   \!ybpos=\!dx\!dimenA
  1871.   \advance\!ybpos \!ybS}
  1872. \def\!lgetylimits{%
  1873.   \!ytpos=\!dx\!ytB%              ** yt(t)=ytS + dx*Bt
  1874.   \advance\!ytpos \!ytS
  1875.   \!ybpos=\!dx\!ybB%              ** yb(t)=ybS + dx*Bb
  1876.   \advance\!ybpos \!ybS}
  1877. \def\!vsetshadelocation{%         ** vmode: xloc=xpos, yloc=ypos 
  1878.   \!xloc=\!xpos
  1879.   \!yloc=\!ypos}
  1880. \def\!hsetshadelocation{%         ** hmode: xloc=ypos, yloc=xpos 
  1881.   \!xloc=\!ypos
  1882.   \!yloc=\!xpos}
  1883. \def\!axisticks {%
  1884.   \def\!nextkeyword##1 {%
  1885.     \expandafter\ifx\csname !ticks##1\endcsname \relax
  1886.       \def\!next{\!fixkeyword{##1}}%
  1887.     \else
  1888.       \def\!next{\csname !ticks##1\endcsname}%
  1889.     \fi
  1890.     \!next}%
  1891.   \!axissetup
  1892.     \def\!axissetup{\relax}%
  1893.   \edef\!ticksinoutsign{\!ticksinoutSign}%
  1894.   \!ticklength=\longticklength
  1895.   \!tickwidth=\linethickness
  1896.   \!gridlinestatus
  1897.   \!setticktransform
  1898.   \!maketick
  1899.   \!tickcase=0
  1900.   \def\!LTlist{}%
  1901.   \!nextkeyword}
  1902. \def\ticksout{%
  1903.   \def\!ticksinoutSign{+}}
  1904. \def\ticksin{%
  1905.   \def\!ticksinoutSign{-}}
  1906. \ticksout
  1907. \def\gridlines{%
  1908.   \def\!gridlinestatus{\!gridlinestootrue}}
  1909. \def\nogridlines{%
  1910.   \def\!gridlinestatus{\!gridlinestoofalse}}
  1911. \nogridlines
  1912. \def\loggedticks{%
  1913.   \def\!setticktransform{\let\!ticktransform=\!logten}}
  1914. \def\unloggedticks{%
  1915.   \def\!setticktransform{\let\!ticktransform=\!donothing}}
  1916. \def\!donothing#1#2{\def#2{#1}}
  1917. \unloggedticks
  1918. \expandafter\def\csname !ticks/\endcsname{%
  1919.   \!not {\ifx \!LTlist\empty}
  1920.     \!placetickvalues
  1921.   \fi
  1922.   \def\!tickvalueslist{}%
  1923.   \def\!LTlist{}%
  1924.   \expandafter\csname !axis/\endcsname}
  1925. \def\!maketick{%
  1926.   \setbox\!boxA=\hbox{%
  1927.     \beginpicture
  1928.       \!setdimenmode
  1929.       \setcoordinatesystem point at {\!zpt} {\!zpt}   
  1930.       \linethickness=\!tickwidth
  1931.       \ifdim\!ticklength>\!zpt
  1932.         \putrule from {\!zpt} {\!zpt} to
  1933.           {\!ticksinoutsign\!tickxsign\!ticklength}
  1934.           {\!ticksinoutsign\!tickysign\!ticklength}
  1935.       \fi
  1936.       \if!gridlinestoo
  1937.         \putrule from {\!zpt} {\!zpt} to
  1938.           {-\!tickxsign\!xaxislength} {-\!tickysign\!yaxislength}
  1939.       \fi
  1940.     \endpicturesave <\!Xsave,\!Ysave>}%
  1941.     \wd\!boxA=\!zpt}
  1942. \def\!ticksin{%
  1943.   \def\!ticksinoutsign{-}%
  1944.   \!maketick
  1945.   \!nextkeyword}
  1946. \def\!ticksout{%
  1947.   \def\!ticksinoutsign{+}%
  1948.   \!maketick
  1949.   \!nextkeyword}
  1950. \def\!tickslength<#1> {%
  1951.   \!ticklength=#1\relax
  1952.   \!maketick
  1953.   \!nextkeyword}
  1954. \def\!tickslong{%
  1955.   \!tickslength<\longticklength> }
  1956. \def\!ticksshort{%
  1957.   \!tickslength<\shortticklength> }
  1958. \def\!tickswidth<#1> {%
  1959.   \!tickwidth=#1\relax
  1960.   \!maketick
  1961.   \!nextkeyword}
  1962. \def\!ticksandacross{%
  1963.   \!gridlinestootrue
  1964.   \!maketick
  1965.   \!nextkeyword}
  1966. \def\!ticksbutnotacross{%
  1967.   \!gridlinestoofalse
  1968.   \!maketick
  1969.   \!nextkeyword}
  1970. \def\!tickslogged{%
  1971.   \let\!ticktransform=\!logten
  1972.   \!nextkeyword}
  1973. \def\!ticksunlogged{%
  1974.   \let\!ticktransform=\!donothing
  1975.   \!nextkeyword}
  1976. \def\!ticksunlabeled{%
  1977.   \!tickcase=0
  1978.   \!nextkeyword}
  1979. \def\!ticksnumbered{%
  1980.   \!tickcase=1
  1981.   \!nextkeyword}
  1982. \def\!tickswithvalues#1/ {%
  1983.   \edef\!tickvalueslist{#1! /}%
  1984.   \!tickcase=2
  1985.   \!nextkeyword}
  1986. \def\!ticksquantity#1 {%
  1987.   \ifnum #1>1
  1988.     \!updatetickoffset
  1989.     \!countA=#1\relax
  1990.     \advance \!countA -1
  1991.     \!ticklocationincr=\!axisLength
  1992.       \divide \!ticklocationincr \!countA
  1993.     \!ticklocation=\!axisstart
  1994.     \loop \!not{\ifdim \!ticklocation>\!axisend}
  1995.       \!placetick\!ticklocation
  1996.       \ifcase\!tickcase
  1997.           \relax %  Case 0: no labels
  1998.         \or
  1999.           \relax %  Case 1: numbered -- not available here
  2000.         \or
  2001.           \expandafter\!gettickvaluefrom\!tickvalueslist
  2002.           \edef\!tickfield{{\the\!ticklocation}{\!value}}%
  2003.           \expandafter\!listaddon\expandafter{\!tickfield}\!LTlist%
  2004.       \fi
  2005.       \advance \!ticklocation \!ticklocationincr
  2006.     \repeat
  2007.   \fi
  2008.   \!nextkeyword}
  2009. \def\!ticksat#1 {%
  2010.   \!updatetickoffset
  2011.   \edef\!Loc{#1}%
  2012.   \if /\!Loc
  2013.     \def\next{\!nextkeyword}%
  2014.   \else
  2015.     \!ticksincommon
  2016.     \def\next{\!ticksat}%
  2017.   \fi
  2018.   \next}    
  2019. \def\!ticksfrom#1 to #2 by #3 {%
  2020.   \!updatetickoffset
  2021.   \edef\!arg{#3}%
  2022.   \expandafter\!separate\!arg\!nil
  2023.   \!scalefactor=1
  2024.   \expandafter\!countfigures\!arg/
  2025.   \edef\!arg{#1}%
  2026.   \!scaleup\!arg by\!scalefactor to\!countE
  2027.   \edef\!arg{#2}%
  2028.   \!scaleup\!arg by\!scalefactor to\!countF
  2029.   \edef\!arg{#3}%
  2030.   \!scaleup\!arg by\!scalefactor to\!countG
  2031.   \loop \!not{\ifnum\!countE>\!countF}
  2032.     \ifnum\!scalefactor=1
  2033.       \edef\!Loc{\the\!countE}%
  2034.     \else
  2035.       \!scaledown\!countE by\!scalefactor to\!Loc
  2036.     \fi
  2037.     \!ticksincommon
  2038.     \advance \!countE \!countG
  2039.   \repeat
  2040.   \!nextkeyword}
  2041. \def\!updatetickoffset{%
  2042.   \!dimenA=\!ticksinoutsign\!ticklength
  2043.   \ifdim \!dimenA>\!offset
  2044.     \!offset=\!dimenA
  2045.   \fi}
  2046. \def\!placetick#1{%
  2047.   \if!xswitch
  2048.     \!xpos=#1\relax
  2049.     \!ypos=\!axisylevel
  2050.   \else
  2051.     \!xpos=\!axisxlevel
  2052.     \!ypos=#1\relax
  2053.   \fi
  2054.   \advance\!xpos \!Xsave
  2055.   \advance\!ypos \!Ysave
  2056.   \kern\!xpos\raise\!ypos\copy\!boxA\kern-\!xpos
  2057.   \ignorespaces}
  2058. \def\!gettickvaluefrom#1 #2 /{%
  2059.   \edef\!value{#1}%
  2060.   \edef\!tickvalueslist{#2 /}%
  2061.   \ifx \!tickvalueslist\!endtickvaluelist
  2062.     \!tickcase=0
  2063.   \fi}
  2064. \def\!endtickvaluelist{! /}
  2065. \def\!ticksincommon{%
  2066.   \!ticktransform\!Loc\!t
  2067.   \!ticklocation=\!t\!!unit
  2068.   \advance\!ticklocation -\!!origin
  2069.   \!placetick\!ticklocation
  2070.   \ifcase\!tickcase
  2071.     \relax % Case 0: no labels
  2072.   \or %      Case 1: numbered
  2073.     \ifdim\!ticklocation<-\!!origin
  2074.       \edef\!Loc{$\!Loc$}%
  2075.     \fi
  2076.     \edef\!tickfield{{\the\!ticklocation}{\!Loc}}%
  2077.     \expandafter\!listaddon\expandafter{\!tickfield}\!LTlist%
  2078.   \or %      Case 2: labeled
  2079.     \expandafter\!gettickvaluefrom\!tickvalueslist
  2080.     \edef\!tickfield{{\the\!ticklocation}{\!value}}%
  2081.     \expandafter\!listaddon\expandafter{\!tickfield}\!LTlist%
  2082.   \fi}
  2083. \def\!separate#1\!nil{%
  2084.   \!ifnextchar{-}{\!!separate}{\!!!separate}#1\!nil}
  2085. \def\!!separate-#1\!nil{%
  2086.   \def\!sign{-}%
  2087.   \!!!!separate#1..\!nil}
  2088. \def\!!!separate#1\!nil{%
  2089.   \def\!sign{+}%
  2090.   \!!!!separate#1..\!nil}
  2091. \def\!!!!separate#1.#2.#3\!nil{%
  2092.   \def\!arg{#1}%
  2093.   \ifx\!arg\!empty
  2094.     \!countA=0
  2095.   \else
  2096.     \!countA=\!arg
  2097.   \fi
  2098.   \def\!arg{#2}%
  2099.   \ifx\!arg\!empty
  2100.     \!countB=0
  2101.   \else
  2102.     \!countB=\!arg
  2103.   \fi}
  2104. \def\!countfigures#1{%
  2105.   \if #1/%
  2106.     \def\!next{\ignorespaces}%
  2107.   \else
  2108.     \multiply\!scalefactor 10
  2109.     \def\!next{\!countfigures}%
  2110.   \fi
  2111.   \!next}
  2112. \def\!scaleup#1by#2to#3{%
  2113.   \expandafter\!separate#1\!nil
  2114.   \multiply\!countA #2\relax
  2115.   \advance\!countA \!countB
  2116.   \if -\!sign
  2117.     \!countA=-\!countA
  2118.   \fi
  2119.   #3=\!countA
  2120.   \ignorespaces}
  2121. \def\!scaledown#1by#2to#3{%
  2122.   \!countA=#1\relax%                          ** get original #
  2123.   \ifnum \!countA<0 %                         ** take abs value,
  2124.     \def\!sign{-}%                            **   remember sign
  2125.     \!countA=-\!countA
  2126.   \else
  2127.     \def\!sign{}%
  2128.   \fi
  2129.   \!countB=\!countA%                          ** copy |#|
  2130.   \divide\!countB #2\relax%                   ** integer part (|#|/sf)
  2131.   \!countC=\!countB%                          ** get sf * (|#|/sf)
  2132.     \multiply\!countC #2\relax
  2133.   \advance \!countA -\!countC%                ** ctA is now remainder
  2134.   \edef#3{\!sign\the\!countB.}%               ** +- integerpart.
  2135.   \!countC=\!countA %                         ** Tack on proper number
  2136.   \ifnum\!countC=0 %                          **   of zeros after .
  2137.     \!countC=1
  2138.   \fi
  2139.   \multiply\!countC 10
  2140.   \!loop \ifnum #2>\!countC
  2141.     \edef#3{#3\!zero}%
  2142.     \multiply\!countC 10
  2143.   \repeat
  2144.   \edef#3{#3\the\!countA}%                    ** Add on rest of remainder
  2145.   \ignorespaces}
  2146. \def\!placetickvalues{%
  2147.   \advance\!offset \tickstovaluesleading
  2148.   \if!xswitch
  2149.     \setbox\!boxA=\hbox{%
  2150.       \def\\##1##2{%
  2151.         \!dimenput {##2} [B] (##1,\!axisylevel)}%
  2152.       \beginpicture 
  2153.         \!LTlist
  2154.       \endpicturesave <\!Xsave,\!Ysave>}%
  2155.     \!dimenA=\!axisylevel
  2156.       \advance\!dimenA -\!Ysave
  2157.       \advance\!dimenA \!tickysign\!offset
  2158.       \if -\!tickysign
  2159.         \advance\!dimenA -\ht\!boxA
  2160.       \else
  2161.         \advance\!dimenA  \dp\!boxA
  2162.       \fi
  2163.     \advance\!offset \ht\!boxA 
  2164.       \advance\!offset \dp\!boxA
  2165.     \!dimenput {\box\!boxA} [Bl] <\!Xsave,\!Ysave> (\!zpt,\!dimenA)
  2166.   \else
  2167.     \setbox\!boxA=\hbox{%
  2168.       \def\\##1##2{%
  2169.         \!dimenput {##2} [r] (\!axisxlevel,##1)}%
  2170.       \beginpicture 
  2171.         \!LTlist
  2172.       \endpicturesave <\!Xsave,\!Ysave>}%
  2173.     \!dimenA=\!axisxlevel
  2174.       \advance\!dimenA -\!Xsave
  2175.       \advance\!dimenA \!tickxsign\!offset
  2176.       \if -\!tickxsign
  2177.         \advance\!dimenA -\wd\!boxA
  2178.       \fi
  2179.     \advance\!offset \wd\!boxA
  2180.     \!dimenput {\box\!boxA} [Bl] <\!Xsave,\!Ysave> (\!dimenA,\!zpt)
  2181.   \fi}
  2182. \normalgraphs
  2183. \catcode`!=12 %  *****  THIS MUST NEVER BE OMITTED
  2184. \catcode`@=11 \catcode`!=11
  2185. \let\!pictexendpicture=\endpicture 
  2186. \let\!pictexframe=\frame
  2187. \let\!pictexlinethickness=\linethickness
  2188. \let\!pictexmultiput=\multiput
  2189. \let\!pictexput=\put
  2190. \def\beginpicture{%
  2191.   \setbox\!picbox=\hbox\bgroup%
  2192.   \let\endpicture=\!pictexendpicture
  2193.   \let\frame=\!pictexframe
  2194.   \let\linethickness=\!pictexlinethickness
  2195.   \let\multiput=\!pictexmultiput
  2196.   \let\put=\!pictexput
  2197.   \let\input=\@@input   % \@@input is LaTeX's saved version of TeX's primitive
  2198.   \!xleft=\maxdimen  
  2199.   \!xright=-\maxdimen
  2200.   \!ybot=\maxdimen
  2201.   \!ytop=-\maxdimen}
  2202. \let\frame=\!latexframe
  2203. \let\pictexframe=\!pictexframe
  2204. \let\linethickness=\!latexlinethickness
  2205. \let\pictexlinethickness=\!pictexlinethickness
  2206. \let\\=\@normalcr
  2207. \catcode`@=12 \catcode`!=12
  2208.