% eepic Version 1.1e < Dec 21, 1999 > % Updated by Piet van Oostrum % eepic Version 1.1c < Nov 25, 1998 > % Updated by Piet van Oostrum % eepic Version 1.1b < Febrary 7, 1988 > % Written by Conrad Kwok % % Internet : kwok@iris.ucdavis.edu % csnet : kwok@ucd.csnet % csnet : kwok%iris.ucdavis.edu@csnet.relay % UUCP : ...!ucbvax!ucdavis!iris!kwok % % The macros are in public domain. % You may distribute or modify it in any ways you like. % Please report any bugs, enhancements, comments, suggestions, etc. % % This style file modify some of the commands in epic[1] and LaTeX[2] such % that \special commands will be generated in drawing lines if approriate. % The \special commands generated is the subset of the \specials used % by tpic[3]. % % [1] epic is written by Sunil Podar. Please read epic.sty for the % copyright notice. % [2] LaTeX is written by Leslie Lamport. Please read the book LaTeX % [3] tpic is modified from pic by Tim Morgan % %% This file contains extensions of the following epic commands: %% \dottedline \dashline \drawline %% \jput %% %% It also contains extensions of the following LaTeX commands: %% \circle \line \oval %% %% New commands include: %% \Thicklines \arc \ellipse %% \path \spline \allinethickness %% %% New commands for eepic 1.1 %% \blacken \whiten \shade %% \texture \filltype{type} type=black|white|shade %% %% For documentation, please see the accompanying manual %% %% Change Log; %% o (October 2, 88) %% Fixed the problem of \line (\@sline). When both x and y are %% large, it produced 'bad character code' error. %% %% o (January 17, 89) %% Add commands \blacken, \whiten, \shade, \texture %% %% o (January 17, 89) %% Add \filltype{xxxxx} %% xxxxx - black, white, shade %% \typeout{% Extension to Epic and LaTeX. Version 1.1e - Released Dec 21, 1999} % \newcount\@gphlinewidth \newcount\@eepictcnt \newdimen\@tempdimc \@gphlinewidth\@wholewidth \divide\@gphlinewidth 4736 %% Redefine \thinlines, \thicklines %% See also latex.tex \def\thinlines{\let\@linefnt\tenln \let\@circlefnt\tencirc \@wholewidth\fontdimen8\tenln \@halfwidth .5\@wholewidth \@gphlinewidth\@wholewidth \divide\@gphlinewidth 4736\relax} \def\thicklines{\let\@linefnt\tenlnw \let\@circlefnt\tencircw \@wholewidth\fontdimen8\tenlnw \@halfwidth .5\@wholewidth \@gphlinewidth\@wholewidth \divide\@gphlinewidth 4736 \advance\@gphlinewidth\@ne % Make the output looks better \relax} %% %% To indicate whether the dot character is defined in the dotted join %% environment or not (\@ifnodotdef) \newif\if@nodotdef \global\@nodotdeftrue %% %% Redefine \dottedjoin \def\dottedjoin{\global\@jointhemtrue \global\@joinkind=0\relax \bgroup\@ifnextchar[{\global\@nodotdeffalse\@idottedjoin}% {\global\@nodotdeftrue\@idottedjoin[\@empty]}} %%---------------------------------------------------------------------- %% Redefine \jput \long\def\jput(#1,#2)#3{\@killglue\raise#2\unitlength\hbox to \z@{\hskip #1\unitlength #3\hss}% \if@jointhem \if@firstpoint \gdef\x@one{#1} \gdef\y@one{#2} \global\@firstpointfalse \else\ifcase\@joinkind \if@nodotdef \@spdottedline{\dotgap@join\unitlength}% (\x@one\unitlength ,\y@one\unitlength)(#1\unitlength,#2\unitlength) \else \@dottedline[\dotchar@join]{\dotgap@join\unitlength}% (\x@one\unitlength,\y@one\unitlength)(#1\unitlength,#2\unitlength) \fi \or\@dashline[\dashlinestretch]{\dashlen@join\unitlength}[\dotgap@join]% (\x@one,\y@one)(#1,#2) \else\@drawline[\drawlinestretch](\x@one,\y@one)(#1,#2)\fi \gdef\x@one{#1}\gdef\y@one{#2}% \fi \fi\ignorespaces} %% %% Redefine \dottedline to generate special whenever possible. \def\dottedline{\@ifnextchar [{\@idottedline}{\@ispdottedline}} %% Similar to \@idottedline but it generate \special \def\@ispdottedline#1(#2,#3){\@ifnextchar (% {\@iispdottedline{#1}(#2,#3)}{\relax}} \def\@iispdottedline#1(#2,#3)(#4,#5){\@spdottedline{#1\unitlength}% (#2\unitlength,#3\unitlength)(#4\unitlength,#5\unitlength)% \@ispdottedline{#1}(#4,#5)} % \def\@spdottedline#1(#2,#3)(#4,#5){% \@killglue % This line added by Piet van Oostrum, Dec 21, 1999. \@tempcnta \@gphlinewidth\relax \advance\@tempcnta by 2 % solely for better output \special{pn \the\@tempcnta}% \@tempdimc=#2\relax \@tempcnta \@tempdimc\relax \advance\@tempcnta 2368 \divide\@tempcnta 4736 \@tempdimc=#3\relax \@tempcntb -\@tempdimc\relax\advance\@tempcntb -2368 \divide\@tempcntb 4736 \@paspecial{\the\@tempcnta}{\the\@tempcntb}% \@tempdimc=#4\relax \@tempcnta \@tempdimc\relax \advance\@tempcnta 2368 \divide\@tempcnta 4736 \@tempdimc=#5\relax \@tempcntb -\@tempdimc\relax\advance\@tempcntb -2368 \divide\@tempcntb 4736 \@paspecial{\the\@tempcnta}{\the\@tempcntb}% \@tempdimc=#1\relax %% %% Generate the pen width in terms of inch with 3 decimal digit. \@tempcnta \@tempdimc\relax \advance\@tempcnta 2368 \divide\@tempcnta 4736 %% \@tempcnta contain the pen width in terms of thousandth of a inch %% Then it is converted back to inch. I know the way I use is dumb but %% I cannot think of any better method \@tempcntb \@tempcnta\relax \divide\@tempcntb 1000 \multiply \@tempcntb 1000 \advance\@tempcnta -\@tempcntb \divide\@tempcntb 1000 \ifnum\@tempcnta < 10 \special{dt \the\@tempcntb.00\the\@tempcnta}% \else\ifnum\@tempcnta < 100 \special{dt \the\@tempcntb.0\the\@tempcnta}% \else \special{dt \the\@tempcntb.\the\@tempcnta}% \fi\fi \ignorespaces } % \def\@iiidashline[#1]#2[#3](#4,#5)(#6,#7){% \@dashline[#1]{#2\unitlength}[#3](#4,#5)(#6,#7)% \@iidashline[#1]{#2}[#3](#6,#7)} % %% Redefine \@dashline \long\def\@dashline[#1]#2[#3](#4,#5)(#6,#7){{% \x@diff=#6\unitlength \advance\x@diff by -#4\unitlength \y@diff=#7\unitlength \advance\y@diff by -#5\unitlength %% correction to get actual width since the dash-length as taken in arguement %% is the center-to-center of the end-points. \@tempdima=#2\relax \advance\@tempdima -\@wholewidth \sqrtandstuff{\x@diff}{\y@diff}{\@tempdima}% \ifnum\num@segments <3 \num@segments=3\fi% min number of dashes I can plot % is 2, 1 at either end, thus min num@segments is 3 (including 'empty dash'). \@tempdima=\x@diff \@tempdimb=\y@diff \divide\@tempdimb by\num@segments \divide\@tempdima by\num@segments %% ugly if-then-else. If optional dotgap specified, then use it otherwise %% make a solid dash. {\ifx#3\@empty \relax \ifdim\@tempdima < 0pt \x@diff=-\@tempdima\else\x@diff=\@tempdima\fi \ifdim\@tempdimb < 0pt \y@diff=-\@tempdimb\else\y@diff=\@tempdimb\fi \global\setbox\@dotbox\hbox{% \@absspdrawline(0pt,0pt)(\@tempdima,\@tempdimb)}% \else\global\setbox\@dotbox\hbox{% \@spdottedline{#3\unitlength}(0pt,0pt)(\@tempdima,\@tempdimb)}% \fi}% \advance\x@diff by -\@tempdima % both have same sign \advance\y@diff by -\@tempdimb % %%here we correct the number of dashes to be put by reducing them %%appropriately. (num@segments*\@wholewidth) is in some way the slack we %%have,and division by dash-length gives the reduction. reduction = %%(2*num@segments*\@wholewidth)/dash-length %% (num@segments includes empty ones) \@tempdima=\num@segments\@wholewidth \@tempdima=2\@tempdima \@tempcnta\@tempdima\relax \@tempdima=#2\relax \@tempdimb=0.5\@tempdima \@tempcntb\@tempdimb\relax \advance\@tempcnta by \@tempcntb % round-off error \divide\@tempcnta by\@tempdima \advance\num@segments by -\@tempcnta % \ifnum #1=0 \relax\else\ifnum #1 < -100 \typeout{***dashline: reduction > -100 percent implies blankness!***} \else\num@segmentsi=#1 \advance\num@segmentsi by 100 \multiply\num@segments by\num@segmentsi \divide\num@segments by 100 \fi\fi % \divide\num@segments by 2 % earlier num@segments included 'empty dashes' too. \ifnum\num@segments >0 % if =0 then don't divide => \x@diff & \y@diff \divide\x@diff by\num@segments% remain same. \divide\y@diff by\num@segments \advance\num@segments by\@ne %for the last segment for which I subtracted %\@tempdima & \@tempdimb from \x@diff & \y@diff \else\num@segments=2 % one at each end. \fi %%\typeout{num@segments finally = \the\num@segments} %% equiv to \multiput(#4,#5)(\x@diff,\y@diff){\num@segments}{\copy\@dotbox} %% with arguements in absolute dimensions. \@xdim=#4\unitlength \@ydim=#5\unitlength \@killglue \loop \ifnum\num@segments > 0 \unskip\raise\@ydim\hbox to\z@{\hskip\@xdim \copy\@dotbox\hss}% \advance\num@segments \m@ne\advance\@xdim\x@diff\advance\@ydim\y@diff% \repeat}% \ignorespaces} %% redefine \@drawline % \def\@drawline[#1](#2,#3)(#4,#5){{% \@drawitfalse\@horvlinefalse \ifnum#1 <0 \relax\else\@horvlinetrue\fi \if@horvline \@spdrawline(#2,#3)(#4,#5) \else\@drawittrue\fi %%------------------------------- \if@drawit \ifnum #1=0 \relax \else\ifnum #1 < -99 \typeout{***drawline: reduction <= -100 percent implies blankness!***}% \else\num@segmentsi=#1 \advance\num@segmentsi by 50 \multiply\num@segmentsi 2 \fi\fi \@dashline[\num@segmentsi]{10pt}[\@empty](#2,#3)(#4,#5) \fi}\ignorespaces}% for \if@drawit % \def\@spdrawline(#1,#2)(#3,#4){% \@absspdrawline(#1\unitlength,#2\unitlength)(#3\unitlength,#4\unitlength) \ignorespaces } \def\@absspdrawline(#1,#2)(#3,#4){% \@killglue % This line added by Piet van Oostrum, Dec 21, 1999. \special{pn \the\@gphlinewidth}% \@tempdimc=#1\relax \@tempcnta \@tempdimc\relax \advance\@tempcnta 2368 \divide\@tempcnta 4736 \@tempdimc=#2\relax \@tempcntb -\@tempdimc\relax \advance\@tempcntb -2368 \divide\@tempcntb 4736 \@paspecial{\the\@tempcnta}{\the\@tempcntb}% \@tempdimc=#3\relax \@tempcnta\@tempdimc\relax \advance\@tempcnta 2368 \divide\@tempcnta 4736 \@tempdimc=#4\relax \@tempcntb -\@tempdimc\relax \advance\@tempcntb -2368 \divide\@tempcntb 4736 \@paspecial{\the\@tempcnta}{\the\@tempcntb}% \special{fp}% \ignorespaces } %%---------------------------------------------------------------------- \def\@paspecial#1#2{% \special{pa #1 #2}% } %% %% Functions below modify the LaTeX commands and some additional commands %% are not supported by LaTeX nor epic such as ThickLines and arc. %% %% The macros are for use with LaTeX picture environment %% By including the macro file, you can draw %% 1) \line in any slope %% 2) \circle with any radius %% 3) \ellipse with any x-axis and y-axis length %% 4) Circular \arc by giving starting and ending angle (in radius) %% %% Furthermore you may draw lines in any thickness. %% %% %% Redefine \thinlines, \thicklines and define \Thickline %% See also latex.tex \def\Thicklines{\let\@linefnt\tenlnw \let\@circlefnt\tencircw \@wholewidth\fontdimen8\tenlnw \@wholewidth 1.5\@wholewidth \@halfwidth .5\@wholewidth \@gphlinewidth\@wholewidth \divide\@gphlinewidth 4736\relax} %% %% Generate the \special command for drawing arc \def\@circlespecial#1#2#3#4{% \special{pn \the\@gphlinewidth}% \special{ar 0 0 #1 #2 #3 #4} } %% %% Command for drawing an arc. Elliptical arc command can be generated %% but all iptex program I saw so far does not support that. \def\@arc#1#2#3#4{% %% convert TeX dimension to length in terms thousandth of an inch \@tempdima #1\unitlength \@tempdimb #2\unitlength \@tempcnta\@tempdima \advance\@tempcnta 4736 \divide\@tempcnta 9473 \@tempcntb\@tempdimb \advance\@tempcntb 4736 \divide\@tempcntb 9473 \setbox\@tempboxa\hbox{% \@circlespecial{\the\@tempcnta}{\the\@tempcntb}{#3}{#4}}% \wd\@tempboxa\z@ \box\@tempboxa} %% %% Command for drawing Circle and Ellipse in terms of \@arc %% replace original \circle \def\circle{% \@ifstar{\copy\@filltype\@circle}{\@circle}} \def\@circle#1{\@arc{#1}{#1}{0}{6.2832}} \def\ellipse{% \@ifstar{\copy\@filltype\@ellipse}{\@ellipse}} \def\@ellipse#1#2{{\@arc{#1}{#2}{0}{6.2832}}} \def\arc#1#2#3{\@arc{#1}{#1}{#2}{#3}} %% %% Generate \special commands for drawing line \def\@linespecial#1#2{% \special{pn \the\@gphlinewidth}% \special{pa 0 0}% \special{pa #1 #2}% \special{fp}% } %% Replace original \line. Only change is to call \@ssline instead %% of \@sline. For description, see latex.tex \def\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax \@linelen=#3\unitlength \ifnum\@xarg =0 \@vline \else \ifnum\@yarg =0 \@hline \else \@ssline\fi \fi} %% \def\@ssline{% \ifnum\@xarg< 0 \@negargtrue \@xarg -\@xarg \@tempdima -\@linelen \else \@negargfalse \@tempdima\@linelen \fi %% truncation is used in arithmetic \@tempcnta\@linelen \divide\@tempcnta 4736 \@yyarg -\@yarg \multiply\@yyarg \@tempcnta \divide\@yyarg\@xarg \if@negarg \@tempcnta -\@tempcnta \fi \setbox\@linechar\hbox{\@linespecial{\the\@tempcnta}{\the\@yyarg}}% \wd\@linechar\@tempdima \@clnht\@linelen \multiply\@clnht\@yarg \divide\@clnht\@xarg \ifnum\@yarg< 0 \@clnht -\@clnht \ht\@linechar\z@ \dp\@linechar\@clnht \else \ht\@linechar\@clnht \dp\@linechar\z@ \fi \box\@linechar } %% %% Replace original \@sline \def\@sline{% \@ssline %% Codes below (till end of the command) is only necessary %% when used with \@svector \if@negarg \@yyarg -\@yarg \else \@yyarg \@yarg \fi \setbox\@linechar\hbox{\@linefnt\@getlinechar(\@xarg,\@yyarg)}% \ifnum\@yarg> 0 \let\@upordown\raise \advance\@clnht -\ht\@linechar \else \let\@upordown\lower \fi \if@negarg \kern\wd\@linechar \fi } %% \def\spline(#1,#2){% \@killglue % This line added by Piet van Oostrum, Dec 21, 1999. \special{pn \the\@gphlinewidth}% \@spline(#1,#2)% } \def\@spline(#1,#2){% \@tempdima #1\unitlength \@tempdimb #2\unitlength \@tempcnta \@tempdima \advance\@tempcnta 2368 \divide\@tempcnta 4736 \@tempcntb -\@tempdimb \advance\@tempcntb -2368 \divide\@tempcntb 4736 \@paspecial{\the\@tempcnta}{\the\@tempcntb}% \@ifnextchar ({\@spline}{\special{sp}}% } \def\path(#1,#2){% \@killglue % This line added by Piet van Oostrum, Dec 20, 1999. \special{pn \the\@gphlinewidth}% \@path(#1,#2)% } \def\@path(#1,#2){% \@tempdima #1\unitlength \@tempdimb #2\unitlength \@tempcnta \@tempdima \advance\@tempcnta 2368 \divide\@tempcnta 4736 \@tempcntb -\@tempdimb \advance\@tempcntb -2368 \divide\@tempcntb 4736 \@paspecial{\the\@tempcnta}{\the\@tempcntb}% \@ifnextchar ({\@path}{\special{fp}}% } %%%%%%%%%% Beginning of \oval %%%%%%%%%%%%%%% \newdimen\maxovaldiam \maxovaldiam 40pt\relax \def\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue \@tfor\@tempa :=#3\do{\csname @ov\@tempa false\endcsname}\@ovxx #1\unitlength \@ovyy #2\unitlength \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx\else \@ovyy \fi \@ovro \ifdim \@tempdimb>\maxovaldiam \maxovaldiam\else\@tempdimb\fi\relax \divide \@ovro \tw@ \@ovdx\@ovxx \divide\@ovdx \tw@ \@ovdy\@ovyy \divide\@ovdy \tw@ \setbox\@tempboxa \hbox{% \if@ovr \@ovverta\fi \if@ovl \kern \@ovxx \@ovvertb\kern -\@ovxx \fi \if@ovt \@ovhorz \kern -\@ovxx \fi \if@ovb \raise \@ovyy \@ovhorz \fi}% Update by Piet van Oostrum (% added) \ht\@tempboxa\z@ \dp\@tempboxa\z@ \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}% \endgroup} \def\@qcirc#1#2#3#4{% \special{pn \the\@gphlinewidth}% \@eepictcnt \@gphlinewidth \divide\@eepictcnt 2 \@tempcnta #1 \advance\@tempcnta 2368 \divide\@tempcnta 4736 \advance\@tempcnta\@eepictcnt \@tempcntb #2 \divide\@tempcntb 4736 \advance\@tempcntb 2 \hbox{% \@qcircspecial{\the\@tempcnta}{-\the\@eepictcnt}{\the\@tempcntb}{#3}{#4}}% } \def\@qcircspecial#1#2#3#4#5{\special{ar #1 #2 #3 #3 #4 #5}} \def\@ovverta{\vbox to \@ovyy{% \if@ovb \kern \@ovro \@qcirc{\@ovro}{\@ovro}{3.1416}{4.7124}\nointerlineskip \else \kern \@ovdy \fi \leaders\vrule width \@wholewidth\vfil \nointerlineskip \if@ovt \@qcirc{\@ovro}{\@ovro}{1.5708}{3.1416}\nointerlineskip \kern \@ovro \else \kern \@ovdy \fi }\kern -\@wholewidth} \def\@ovvertb{\vbox to \@ovyy{% \if@ovb \kern \@ovro \@qcirc{-\@ovro}{\@ovro}{4.6124}{6.2832}\nointerlineskip \else \kern \@ovdy \fi \leaders\vrule width \@wholewidth\vfil \nointerlineskip \if@ovt \@qcirc{-\@ovro}{\@ovro}{0}{1.6708}\nointerlineskip \kern \@ovro \else \kern \@ovdy \fi }\kern -\@wholewidth} \def\@ovhorz{\hbox to \@ovxx{% \if@ovr \kern \@ovro\else \kern \@ovdx \fi \leaders \hrule height \@wholewidth \hfil \if@ovl \kern \@ovro\else \kern \@ovdx \fi }} %%%%%%%%% End of \oval %%%%%%%%%%%%%% \def\allinethickness#1{\let\@linefnt\tenlnw \let\@circlefnt\tencircw \@wholewidth #1 \@halfwidth .5\@wholewidth \@gphlinewidth\@wholewidth \divide\@gphlinewidth 4736\relax} \def\blacken{\special{bk}} \def\whiten{\special{wh}} \def\shade{\special{sh}} \def\texture#1{\special{tx #1}\ignorespaces} %% \newbox\@filltype \setbox\@filltype\hbox{\special{bk}} \def\filltype#1{\@nameuse{ft@#1}} \def\ft@black{\setbox\@filltype\hbox{\special{bk}}} \def\ft@white{\setbox\@filltype\hbox{\special{wh}}} \def\ft@shade{\setbox\@filltype\hbox{\special{sh}}} %%