% eepic Version 1.1c <  Nov 25, 1998>
% Updated by Piet van Oostrum <piet@cs.uu.nl>
% 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.1b - Released Febrary 7, 1988}
%
\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){%
    \@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){%
    \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){%
    \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){%
    \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}}}
%%
