home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / unixtex-6.1b-bin0.lha / lib / texmf / tex / plain / picmac.tex < prev    next >
Encoding:
Text File  |  1996-10-12  |  8.0 KB  |  179 lines

  1. % Pictures (a subset of \LaTeX's conventions, plus squines)
  2. \catcode`@=11 % enable private control sequences
  3. \def\wlog#1{} % don't put allocation info into the log
  4.  
  5. \newskip\hsssglue \hsssglue=0pt plus 1fill minus 1fill \def\hsss{\hskip\hsssglue}
  6.  
  7. \newdimen\unitlength \newdimen\linethickness
  8. \newdimen\@picheight \newdimen\@xdim \newdimen\@ydim \newdimen\@len \newdimen\@save
  9. \newcount\@multicount \newcount\@xarg \newcount\@yarg
  10. \newbox\@picbox \newbox\@mpbox
  11.  
  12. \font\tenln=line10     \font\tenlnw=linew10
  13. \font\tencirc=lcircle10 \font\tencircw=lcirclew10
  14.  
  15. \def\thinlines{\let\linefont=\tenln \let\circlefont=\tencirc
  16.   \linethickness=\fontdimen8\linefont}
  17. \def\thicklines{\let\linefont=\tenlnw \let\circlefont=\tencircw
  18.   \linethickness=\fontdimen8\linefont}
  19. \thinlines
  20.  
  21. \def\beginpicture(#1,#2)(#3,#4){\@picheight=#2\unitlength
  22.   \setbox\@picbox=\hbox to#1\unitlength\bgroup \let\line=\@line
  23.     \kern-#3\unitlength \lower#4\unitlength\hbox\bgroup\ignorespaces}
  24. \def\endpicture{\egroup\hss\egroup
  25.   \ht\@picbox=\@picheight \dp\@picbox=\z@
  26.   \leavevmode\box\@picbox}
  27.  
  28. \def\put(#1,#2)#3{\raise#2\unitlength\rlap{\kern#1\unitlength #3}\ignorespaces}
  29.  
  30. \def\multiput(#1,#2)(#3,#4)#5#6{\@multicount=#5\relax
  31.  \@xdim=#1\unitlength \@ydim=#2\unitlength \setbox\@mpbox=\hbox{#6}%
  32.  \loop\ifnum\@multicount>0
  33.    \raise\@ydim\rlap{\kern\@xdim \unhcopy\@mpbox}%
  34.    \advance\@xdim#3\unitlength \advance\@ydim#4\unitlength
  35.    \advance\@multicount\m@ne \repeat\ignorespaces}
  36.  
  37. \def\makebox(#1,#2)#3{\setbox\@picbox=\hbox to#1\unitlength{\hss#3\hss}%
  38.   \@ydim=\ht\@picbox \advance\@ydim-\dp\@picbox
  39.   \ht\@picbox=#2\unitlength \dp\@picbox=\z@
  40.   \leavevmode\lower.5\@ydim\box\@picbox}
  41.  
  42. \newif\ifneg
  43. \def\@line(#1,#2)#3{\@xarg=#1 \@yarg=#2 \@len=#3\unitlength \leavevmode
  44.  \ifnum\@xarg<0 \reverseline \else \negfalse \@ydim=\z@\fi
  45.  \ifnum\@xarg=0 \@vline
  46.  \else\ifnum\@yarg=0 \@hline \else\@sline\fi\fi
  47.  \ifneg\kern-\@len\else\@save=\@ydim\fi}
  48. \def\reverseline{\negtrue \kern-\@len \@xarg=-\@xarg
  49.  \@ydim=\@len \multiply\@ydim\@yarg \divide\@ydim\@xarg \@yarg=-\@yarg}
  50.  
  51. \def\@hline{\vrule height.5\linethickness depth.5\linethickness width\@len}
  52. \def\@vline{\kern-.5\linethickness\vrule width\linethickness
  53.   \ifnum\@yarg<0 height\z@ depth\else depth\z@ height\fi\@len
  54.   \kern-.5\linethickness}
  55.  
  56. \def\@sline{\setbox\@picbox=\hbox{\linefont \count@=\@xarg \multiply\count@ 8
  57.  \ifnum\@yarg>0 \advance\count@\@yarg \advance\count@-9
  58.  \else \advance\count@-\@yarg \advance\count@ 55 \fi \char\count@}%
  59.  \ifnum\@yarg<0 \@picheight=-\ht\@picbox \advance\@ydim\@picheight
  60.  \else \@picheight=\ht\@picbox \fi
  61.  \@xdim=\wd\@picbox \@save=\@ydim
  62.  \loop\ifdim\@xdim<\@len \raise\@ydim\copy\@picbox
  63.   \advance\@xdim\wd\@picbox \advance\@ydim\@picheight \repeat
  64.  \advance\@xdim-\@len \kern-\@xdim
  65.  \multiply\@xdim\@yarg \divide\@xdim\@xarg \advance\@ydim-\@xdim
  66.  \raise\@ydim\box\@picbox}
  67.  
  68. \def\vector(#1,#2)#3{\@line(#1,#2){#3}%
  69.  \ifnum\@xarg=0 \@vvector \else\ifnum\@yarg=0 \@hvector \else\@svector\fi\fi}
  70. \def\@hvector{\ifneg\rlap{\linefont\char27}\else
  71.  \smash{\llap{\linefont\char45}}\fi} % we have to smash because of font bug
  72. \def\@vvector{\ifnum\@yarg<0 \raise-\@len\rlap{\linefont\char63}%
  73.  \else\setbox\@picbox=\rlap{\linefont\char54}\advance\@len-\ht\@picbox
  74.  \raise\@len\box\@picbox\fi}
  75.  
  76. \def\@svector{\setbox\@picbox=\hbox to\z@{\linefont
  77.  \ifnum\@yarg<0 \count@=55 \@yarg=-\@yarg \else\count@=-9 \fi
  78.  \ifneg\multiply\@xarg16 \multiply\@yarg2
  79.  \else\hss % \llap
  80.   \ifnum\@xarg>2 \multiply\@xarg9 \multiply\@yarg2 \advance\count@29
  81.   \else\ifnum\@yarg>2 \multiply\@xarg16 \multiply\@yarg9 \advance\count@-20
  82.    \else\multiply\@xarg24 \multiply\@yarg3 \fi\fi\fi
  83.   \advance\count@\@xarg \advance\count@\@yarg \char\count@
  84.   \ifneg\hss\fi}% \rlap
  85.  \raise\@save\box\@picbox}
  86.  
  87. \def\disk#1{\@len=#1\unitlength \count@='160 \@diskcirc}
  88. \def\circle#1{\@len=#1\unitlength \count@='140 \@diskcirc}
  89. \def\@diskcirc{\setbox\@picbox=\hbox{\circlefont\char\count@}\@xdim=\wd\@picbox
  90.  \leavevmode \ifdim\@len>15.499\@xdim \@bigdc \else \@smalldc\fi}
  91. \def\@bigdc{\ifnum\count@<'160 \@bigcirc
  92.  \else \@len=15\@xdim \@diskcirc\fi}
  93. \def\@smalldc{{\advance\@len-.5\@xdim
  94.  \loop\ifdim\@xdim<\@len \advance\count@\@ne \advance\@xdim\wd\@picbox\repeat
  95.  \hbox{\circlefont\char\count@}}}
  96. \def\@bigcirc{{\circlefont\count@=15
  97.  \setbox\@picbox=\hbox{\char\count@}\@xdim=\wd\@picbox
  98.  \ifdim\@len>2.5\@xdim \@len=2.5\@xdim\fi
  99.  \advance\@len-.125\wd\@picbox
  100.  \loop\ifdim\@xdim<\@len \advance\count@ 4 \advance\@xdim.25\wd\@picbox\repeat
  101.  \@ydim=.5\@xdim \advance\@ydim.5\linethickness
  102.  \setbox\@picbox=\vbox{\hbox{\char\count@\advance\count@-3\char\count@}%
  103.   \nointerlineskip
  104.   \hbox{\advance\count@\m@ne\char\count@\advance\count@\m@ne\char\count@}}%
  105.  \kern-\@ydim\lower\@ydim\box\@picbox}}
  106.  
  107. \newif\ifovaltl \newif\ifovaltr \newif\ifovalbl \newif\ifovalbr
  108. \ovaltltrue \ovaltrtrue \ovalbltrue \ovalbrtrue
  109. \def\oval(#1,#2){\@xdim=#1\unitlength \@ydim=#2\unitlength
  110.  {\circlefont \setbox\@picbox=\hbox{\char0}
  111.  \ifdim\@xdim<\wd\@picbox \@xdim=\wd\@picbox\fi
  112.  \ifdim\@ydim<\wd\@picbox \@ydim=\wd\@picbox\fi
  113.  \@save=\@xdim \ifdim\@ydim<\@save \@save=\@ydim \fi
  114.  \count@=39
  115.  \loop \setbox\@picbox=\hbox{\char\count@}\ifdim\@save<\wd\@picbox
  116.   \advance\count@-4 \repeat
  117.  \setbox\strutbox=\hbox{\vrule height\ht\@picbox depth\dp\@picbox width\z@
  118.    \kern\wd\@picbox}%
  119.  \@save=.5\wd\@picbox \advance\@save-.5\linethickness
  120.  \setbox0=\hbox to\@xdim{\ifovaltl\char\count@\else\strut\fi
  121.   \kern-\@save\leaders\hrule height\ifovaltl\linethickness\else\z@\fi\hfil
  122.   \leaders\hrule height\ifovaltr\linethickness\else\z@\fi\hfil\kern\@save
  123.   \ifovaltr\advance\count@-3\char\count@\else\strut\fi\kern-\wd\@picbox}%
  124.   \advance\count@\m@ne
  125.  \setbox2=\hbox to\@xdim{\ifovalbl\char\count@\else\strut\fi
  126.   \kern-\@save\leaders\hrule height\ifovalbl\linethickness\else\z@\fi\hfil
  127.   \leaders\hrule height\ifovalbr\linethickness\else\z@\fi\hfil\kern\@save
  128.   \ifovalbr\advance\count@\m@ne\char\count@\else\strut\fi\kern-\wd\@picbox}%
  129.  \@save=\@ydim \advance\@save-\wd\@picbox \divide\@save 2
  130.  \setbox\@picbox=\vbox{\box0\nointerlineskip
  131.   \hbox to\@xdim{\vrule height\@save width\ifovaltl\linethickness\else\z@\fi
  132.     \hfil\ifovaltr\vrule width\linethickness\kern-\linethickness\fi}%
  133.   \nointerlineskip
  134.   \hbox to\@xdim{\vrule height\@save width\ifovalbl\linethickness\else\z@\fi
  135.     \hfil\ifovalbr\vrule width\linethickness\kern-\linethickness\fi}%
  136.   \nointerlineskip\box2}%
  137.   \@save=.5\@ydim \advance\@save.5\linethickness \leavevmode
  138.   \kern-.5\@xdim \kern-.5\linethickness \lower\@save\box\@picbox}}
  139.  
  140. \def\cpic#1\endcpic{\vcenter{\hbox{\beginpicture#1\endpicture}}}
  141.  
  142. % Squines (quadratic splines)
  143. % example of use: to plot f(x) between x0 and x1, you can say
  144. % \put(0,0){\squine(x0,xm,x1,y0,ym,y1)}, where y0=f(x0), y1=f(x1)
  145. % xm=(y0-y1+s1x1-s0x0)/(s1-s0), ym=(s0(s1x1-y1)-s1(s0x0-y0))/(s1-s0),
  146. % s0=f'(x0), and s1=f'(x1).
  147.  
  148. \newdimen\@xi \newdimen\@xii \newdimen\@xiii \newdimen\@xiv
  149. \newdimen\@xpt \newdimen\@xoldpt
  150. \newdimen\@yi \newdimen\@yii \newdimen\@yiii \newdimen\@yiv
  151. \newdimen\@ypt \newdimen\@yoldpt
  152. \def\squine(#1,#2,#3,#4,#5,#6){\setbox\@picbox\hbox{\tencirc q}%
  153.  \global\@xoldpt=#1\unitlength \global\@yoldpt=#4\unitlength \kern\@xoldpt
  154.  \@xi=\@xoldpt \@xii=#2\unitlength \@xiii=#3\unitlength
  155.  \@yi=\@yoldpt \@yii=#5\unitlength \@yiii=#6\unitlength
  156.  \squinerec
  157.  \@xpt=#3\unitlength \@ypt=#6\unitlength \@addpoint
  158.  \raise\@ypt\copy\@picbox}
  159. \newif\iffar
  160. \def\squinerec{\farfalse \testnear\@xi\@xiii \testnear\@yi\@yiii
  161.  \iffar \decast \fi}
  162. \def\testnear#1#2{\@save=#1\advance\@save-#2%
  163.  \ifdim\@save<\z@ \@save=-\@save\fi \ifdim\@save>\p@ \fartrue \fi}
  164. \def\decast{\@xpt=\@xi \advance\@xpt\@xii \divide\@xpt2
  165.  \advance\@xii\@xiii \divide\@xii2
  166.  \@xiv=\@xpt \advance\@xiv\@xii \divide\@xiv2
  167.  \@ypt=\@yi \advance\@ypt\@yii \divide\@ypt2
  168.  \advance\@yii\@yiii \divide\@yii2
  169.  \@yiv=\@ypt \advance\@yiv\@yii \divide\@yiv2
  170.  \begingroup\@xii=\@xpt \@xiii=\@xiv
  171.   \@yii=\@ypt \@yiii=\@yiv \squinerec\endgroup
  172.  \@xpt=\@xiv \@ypt=\@yiv \@addpoint
  173.  \@xi=\@xiv \@yi=\@yiv \squinerec}
  174. \def\@addpoint{%\message{(\the\@xpt,\the\@ypt)}%
  175.  \global\advance\@xoldpt-\@xpt \wd\@picbox=-\@xoldpt
  176.  \raise\@yoldpt\copy\@picbox \global\@xoldpt=\@xpt \global\@yoldpt=\@ypt}
  177.  
  178. \catcode`\@=12 % disable private control sequences
  179.