home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / inputs / misc / epsfig.sty < prev    next >
Text File  |  1994-06-08  |  27KB  |  859 lines

  1. \def\fileversion{v1.0}
  2. \def\filedate{3 Dec 91}
  3. \immediate\write16{Document style option `epsfig', \fileversion\space
  4. <\filedate> (edited by SPQR)}
  5. %%%--------------------------------------------------------------------
  6. %%% psfig merged with EPSF =epsfig Release 1 
  7. %%%
  8. %%% code rearranged by Sebastian Rahtz from work by
  9. %%% Trevor Darrell; Tom Rokicki; Daniel Smith; H. Payne, Robert Russell
  10. %%%
  11. %%% This is a version of Darrell's `psfig' macros which are designed  only
  12. %%% to be used with Rokicki's dvips program and the `epsf' macros (these
  13. %%% are automaticaly included by the style file). I did this because the
  14. %%% \special commands used by `epsf' appear to be more robust and 
  15. %%% portable than the raw \specials used by `psfig', but I preferred the
  16. %%% psfig interface, and wanted to use some of its features which epsf
  17. %%% did not offer (specifically, clipping to the BoundingBox). This system
  18. %%% preserves the psfig interface, but mainly uses epsf macros to carry out
  19. %%% the job. The user interface is identical to \psfig, but you just use  
  20. %%% \epsfig instead. Clipping and rotation uses the original psfig macros, 
  21. %%% as do specific settings of the Bounding Box in the call to the macro. 
  22. %%% I could not work out how to do rotation or clipping with the epsf macros.
  23. %%%
  24. %%% One behaviour which may confuse people is that setting width= and 
  25. %%% height will *not* force a change in the aspect ratio. If you need
  26. %%% behaviour, use the \psfig macro instead of \epsfig. Rokicki's macros
  27. %%% do not provide a way of doing the aspect ration stuff.
  28. %%%  
  29. %%% If you *really* want old psfig behaviour regardless, use \psfig. It is
  30. %%% still there. Some of the features have gone, however. \figurepath
  31. %%% seemed redundant, since it could be controlled by the TEXINPUTS
  32. %%% variable anyway. I am not sure whether rheight= etc work or not, I
  33. %%% cannot remember the syntax!
  34. %%%  
  35. %%% As an added feature, if a file cannot be found, a file called `file'.bb
  36. %%% is searched for. This should simply contain a %%BoundingBox line. It is
  37. %%% assumed that if this exists, then `file'.Z exists, and is a Unix
  38. %%% compressed file. The macros then read the BB from `file'.bb, but insert
  39. %%% "zcat `file'.Z" in the  output for dvips to interpret (don't worry, it
  40. %%% knows about this). Saves a lot  of space! Actually, its more
  41. %%% complicated than that; the string passed to dvips for file `foo.ps' is
  42. %%% actually "zcat `texfind foo.ps.Z`", where `texfind' is assumed to be  a
  43. %%% shell script which searches the TEXINPUTS path for `foo.ps.Z'. Such a
  44. %%% script comes with dvips. Just alias it to `cat' if you have problems.
  45. %%% If you are *not* on a Unix system and use this, deliberately or by 
  46. %%% mischance, you will have problems!
  47. %%% 
  48. %%% This file can be included in a dumped format, or used as a LaTeX
  49. %%% style file, or used in plain TeX. It does not load itself twice.
  50. %%%
  51. %%% Sebastian Rahtz December 1991 spqr@uk.ac.soton.ecs
  52. %--------------------------------------------------------------------
  53. %--------------------------------------------------------------------
  54. %%% previous notes. this copy of psfig.tex inherited from version 1.7
  55. %--------------------------------------------------------------------
  56. %%% All psfig/tex software, documentation, and related files
  57. %%% in this distribution of psfig/tex are 
  58. %%% Copyright 1987, 1988, 1991 Trevor J. Darrell
  59. %
  60. %%% Permission is granted for use and non-profit distribution of psfig/tex 
  61. %%% providing that this notice be clearly maintained. The right to
  62. %%% distribute any portion of psfig/tex for profit or as part of any commercial
  63. %%% product is specifically reserved for the author(s) of that portion.
  64. %%%
  65. %%% Thanks to Greg Hager (GDH) and Ned Batchelder for their contributions
  66. %%% to this project.
  67. %%%--------------------------------------------------------------------------
  68. %%% GDH 7/26/87 -- changed so that it first looks in the local directory,
  69. %%% then in a specified global directory for the ps file.
  70. %%% SPQR 12/91 removed that last change. it follows TEXINPUTS anyway
  71. %%% RPR 6/25/91 -- changed so that it defaults to user-supplied name if
  72. %%% boundingbox info is specified, assuming graphic will be created by
  73. %%% print time.
  74. %%% SPQR 12/91 removed that last change. use LaTeX error message instead
  75. %%% SPQR 12/91 -- `no file found' produces LaTeX error message.
  76. %%%                If you recover from that the file name is set in draft
  77. %%%                mode in place of the file.
  78. %%%
  79. %%% Modified by J. Daniel Smith on 9 October 1990 to accept the
  80. %%% %%BoundingBox: comment with or without a space after the colon.  Stole
  81. %%% file reading code from Tom Rokicki's EPSF.TEX file (see below).
  82. %%% --- SPQR 12.91 removed most of this to use epsf directly
  83. %%%
  84. %%% More modifications by J. Daniel Smith on 29 March 1991 to allow the
  85. %%% the included PostScript figure to be rotated.  The amount of
  86. %%% rotation is specified by the "angle=" parameter of the \epsfig command.
  87. %%%
  88. %%% Modified by Robert Russell on June 25, 1991 to allow users to specify
  89. %%% .ps filenames which don't yet exist, provided they explicitly provide
  90. %%% boundingbox information via the \epsfig command. Note: This will only work
  91. %%% if the "file=" parameter follows all four "bb???=" parameters in the
  92. %%% command. This is due to the order in which psfig interprets these params.
  93. %%% ---- SPQR 12.91 removed all this
  94. %%%
  95. %%% 3 Jul 1991    JDS    check if file already read in once
  96. %%%
  97. %%% Modified by H. Payne on 9 October 1991 to allow rotation through
  98. %%% arbitrary angles, not just angles in the first quadrant.
  99. %--------------------------------------------------------------------------
  100. %%%
  101. %%% check to see if macros already loaded in (maybe some other file says
  102. %%% "\input epsfig") ...
  103. %%% from a suggestion by eijkhout@csrd.uiuc.edu to allow
  104. %%% loading as a style file:
  105. \edef\epsfigRestoreAt{\catcode`@=\number\catcode`@\relax}
  106. \catcode`\@=11\relax
  107. \ifx\typeout\undefined%
  108.     \newwrite\@unused
  109.     \def\typeout#1{{\let\protect\string\immediate\write\@unused{#1}}}
  110. \fi
  111. \ifx\undefined\epsfig%
  112. \else
  113.     \typeout{EPSFIG --- already loaded}\endinput
  114. \fi
  115. %
  116. %
  117. % we try to put a box round space of missing figures. plain TeX
  118. % doesn't have an easy command, so just ignore it
  119. \ifx\undefined\fbox\def\fbox#1{#1}\fi
  120. %%%
  121. %%% we need Rokicki's EPSF macros anyway, unless they are already loaded
  122. %
  123. \ifx\undefined\epsfbox\input epsf\fi
  124. %
  125. %% SPQR 12.91 handling of errors using standard LaTeX error 
  126. %% mechanism. In case we are plain TeX we first define the
  127. %% error routines...
  128. \ifx\undefined\@latexerr
  129.     \newlinechar`\^^J
  130.     \def\@spaces{\space\space\space\space}
  131.     \def\@latexerr#1#2{%
  132.     \edef\@tempc{#2}\expandafter\errhelp\expandafter{\@tempc}%
  133.     \typeout{Error. \space see a manual for explanation.^^J
  134.      \space\@spaces\@spaces\@spaces Type \space H <return> \space for
  135.      immediate help.}\errmessage{#1}}
  136. \fi
  137. %------------------------
  138. %% a couple of LaTeX error messages
  139. \def\@whattodo{You tried to include a PostScript figure which 
  140. cannot be found^^JIf you press return to carry on anyway,^^J
  141. The failed name will be printed in place of the figure.^^J
  142. or type X to quit}
  143. \def\@whattodobb{You tried to include a PostScript figure which 
  144. has no^^Jbounding box, and you supplied none.^^J
  145. If you press return to carry on anyway,^^J
  146. The failed name will be printed in place of the figure.^^J
  147. or type X to quit}
  148. %------------------------
  149. %
  150. \newwrite\@unused
  151. %------------------------------------------------------------------------
  152. %------------------------------------------------------------------------
  153. %%% @psdo control structure -- similar to Latex @for.
  154. %%% I redefined these with different names so that psfig can
  155. %%% be used with TeX as well as LaTeX, and so that it will not 
  156. %%% be vunerable to future changes in LaTeX's internal
  157. %%% control structure,
  158. %
  159. \def\@nnil{\@nil}
  160. \def\@empty{}
  161. \def\@psdonoop#1\@@#2#3{}
  162. \def\@psdo#1:=#2\do#3{\edef\@psdotmp{#2}\ifx\@psdotmp\@empty \else
  163.     \expandafter\@psdoloop#2,\@nil,\@nil\@@#1{#3}\fi}
  164. \def\@psdoloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
  165.        #5\def#4{#2}\ifx #4\@nnil \else#5\@ipsdoloop #3\@@#4{#5}\fi\fi}
  166. \def\@ipsdoloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil 
  167.        \let\@nextwhile=\@psdonoop \else
  168.       #4\relax\let\@nextwhile=\@ipsdoloop\fi\@nextwhile#2\@@#3{#4}}
  169. \def\@tpsdo#1:=#2\do#3{\xdef\@psdotmp{#2}\ifx\@psdotmp\@empty \else
  170.     \@tpsdoloop#2\@nil\@nil\@@#1{#3}\fi}
  171. \def\@tpsdoloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil 
  172.        \let\@nextwhile=\@psdonoop \else
  173.       #4\relax\let\@nextwhile=\@tpsdoloop\fi\@nextwhile#2\@@#3{#4}}
  174. %%% 
  175. %
  176. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  177. %%% file reading stuff from epsf.tex
  178. %%%   EPSF.TEX macro file:
  179. %%%   Written by Tomas Rokicki of Radical Eye Software, 29 Mar 1989.
  180. %%%   Revised by Don Knuth, 3 Jan 1990.
  181. %%%   Revised by Tomas Rokicki to accept bounding boxes with no
  182. %%%      space after the colon, 18 Jul 1990.
  183. %%%   Portions modified/removed for use in PSFIG package by
  184. %%%      J. Daniel Smith, 9 October 1990.
  185. %%%   Just the bit which knows about (atend) as a BoundingBox
  186. %
  187. %%%    hacked back a bit by SPQR 12/91
  188. %
  189. \long\def\epsfaux#1#2:#3\\{\ifx#1\epsfpercent
  190.    \def\testit{#2}\ifx\testit\epsfbblit
  191.     \@atendfalse
  192.         \epsf@atend #3 . \\%
  193.     \if@atend    
  194.        \if@verbose
  195.         \typeout{epsfig: found `(atend)'; continuing search}
  196.        \fi
  197.         \else
  198.         \epsfgrab #3 . . . \\%
  199.             \global\no@bbfalse
  200.         \fi
  201.    \fi\fi}%
  202. %
  203. %%% Determine if the stuff following the %%BoundingBox is `(atend)'
  204. %%% J. Daniel Smith.  Copied from \epsf@grab above.
  205. %
  206. \def\epsf@atendlit{(atend)} 
  207. %
  208. \def\epsf@atend #1 #2 #3\\{%
  209.    \def\epsf@tmp{#1}\ifx\epsf@tmp\empty
  210.       \epsf@atend #2 #3 .\\\else
  211.    \ifx\epsf@tmp\epsf@atendlit\@atendtrue\fi\fi}
  212.  
  213.  
  214. %%% End of file reading stuff from epsf.tex
  215. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  216.  
  217. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  218. %%% trigonometry stuff from "trig.tex"
  219. \chardef\letter = 11
  220. \chardef\other = 12
  221.  
  222. \newif \ifdebug %%% turn me on to see TeX hard at work ...
  223. \newif\ifc@mpute %%% don't need to compute some values
  224. \newif\if@atend
  225. \c@mputetrue % but assume that we do
  226.  
  227. \let\then = \relax
  228. \def\r@dian{pt }
  229. \let\r@dians = \r@dian
  230. \let\dimensionless@nit = \r@dian
  231. \let\dimensionless@nits = \dimensionless@nit
  232. \def\internal@nit{sp }
  233. \let\internal@nits = \internal@nit
  234. \newif\ifstillc@nverging
  235. \def \Mess@ge #1{\ifdebug \then \message {#1} \fi}
  236.  
  237. { %%% Things that need abnormal catcodes %%%
  238.     \catcode `\@ = \letter
  239.     \gdef \nodimen {\expandafter \n@dimen \the \dimen}
  240.     \gdef \term #1 #2 #3%
  241.            {\edef \t@ {\the #1}%%% freeze parameter 1 (count, by value)
  242.         \edef \t@@ {\expandafter \n@dimen \the #2\r@dian}%
  243.                    %%% freeze parameter 2 (dimen, by value)
  244.         \t@rm {\t@} {\t@@} {#3}%
  245.            }
  246.     \gdef \t@rm #1 #2 #3%
  247.            {{%
  248.         \count 0 = 0
  249.         \dimen 0 = 1 \dimensionless@nit
  250.         \dimen 2 = #2\relax
  251.         \Mess@ge {Calculating term #1 of \nodimen 2}%
  252.         \loop
  253.         \ifnum    \count 0 < #1
  254.         \then    \advance \count 0 by 1
  255.             \Mess@ge {Iteration \the \count 0 \space}%
  256.             \Multiply \dimen 0 by {\dimen 2}%
  257.             \Mess@ge {After multiplication, term = \nodimen 0}%
  258.             \Divide \dimen 0 by {\count 0}%
  259.             \Mess@ge {After division, term = \nodimen 0}%
  260.         \repeat
  261.         \Mess@ge {Final value for term #1 of 
  262.                 \nodimen 2 \space is \nodimen 0}%
  263.         \xdef \Term {#3 = \nodimen 0 \r@dians}%
  264.         \aftergroup \Term
  265.            }}
  266.     \catcode `\p = \other
  267.     \catcode `\t = \other
  268.     \gdef \n@dimen #1pt{#1} %%% throw away the ``pt''
  269. }
  270.  
  271. \def \Divide #1by #2{\divide #1 by #2} %%% just a synonym
  272.  
  273. \def \Multiply #1by #2%%% allows division of a dimen by a dimen
  274.        {{%%% should really freeze parameter 2 (dimen, passed by value)
  275.     \count 0 = #1\relax
  276.     \count 2 = #2\relax
  277.     \count 4 = 65536
  278.     \Mess@ge {Before scaling, count 0 = \the \count 0 \space and
  279.             count 2 = \the \count 2}%
  280.     \ifnum    \count 0 > 32767 %%% do our best to avoid overflow
  281.     \then    \divide \count 0 by 4
  282.         \divide \count 4 by 4
  283.     \else    \ifnum    \count 0 < -32767
  284.         \then    \divide \count 0 by 4
  285.             \divide \count 4 by 4
  286.         \else
  287.         \fi
  288.     \fi
  289.     \ifnum    \count 2 > 32767 %%% while retaining reasonable accuracy
  290.     \then    \divide \count 2 by 4
  291.         \divide \count 4 by 4
  292.     \else    \ifnum    \count 2 < -32767
  293.         \then    \divide \count 2 by 4
  294.             \divide \count 4 by 4
  295.         \else
  296.         \fi
  297.     \fi
  298.     \multiply \count 0 by \count 2
  299.     \divide \count 0 by \count 4
  300.     \xdef \product {#1 = \the \count 0 \internal@nits}%
  301.     \aftergroup \product
  302.        }}
  303.  
  304. \def\r@duce{\ifdim\dimen0 > 90\r@dian \then   % sin(x) = sin(180-x)
  305.         \multiply\dimen0 by -1
  306.         \advance\dimen0 by 180\r@dian
  307.         \r@duce
  308.         \else \ifdim\dimen0 < -90\r@dian \then  % sin(x) = sin(360+x)
  309.         \advance\dimen0 by 360\r@dian
  310.         \r@duce
  311.         \fi
  312.         \fi}
  313.  
  314. \def\Sine#1%
  315.        {{%
  316.     \dimen 0 = #1 \r@dian
  317.     \r@duce
  318.     \ifdim\dimen0 = -90\r@dian \then
  319.        \dimen4 = -1\r@dian
  320.        \c@mputefalse
  321.     \fi
  322.     \ifdim\dimen0 = 90\r@dian \then
  323.        \dimen4 = 1\r@dian
  324.        \c@mputefalse
  325.     \fi
  326.     \ifdim\dimen0 = 0\r@dian \then
  327.        \dimen4 = 0\r@dian
  328.        \c@mputefalse
  329.     \fi
  330. %
  331.     \ifc@mpute \then
  332.             % convert degrees to radians
  333.         \divide\dimen0 by 180
  334.         \dimen0=3.141592654\dimen0
  335. %
  336.         \dimen 2 = 3.1415926535897963\r@dian %%% a well-known constant
  337.         \divide\dimen 2 by 2 %%% we only deal with -pi/2 : pi/2
  338.         \Mess@ge {Sin: calculating Sin of \nodimen 0}%
  339.         \count 0 = 1 %%% see power-series expansion for sine
  340.         \dimen 2 = 1 \r@dian %%% ditto
  341.         \dimen 4 = 0 \r@dian %%% ditto
  342.         \loop
  343.             \ifnum    \dimen 2 = 0 %%% then we've done
  344.             \then    \stillc@nvergingfalse 
  345.             \else    \stillc@nvergingtrue
  346.             \fi
  347.             \ifstillc@nverging %%% then calculate next term
  348.             \then    \term {\count 0} {\dimen 0} {\dimen 2}%
  349.                 \advance \count 0 by 2
  350.                 \count 2 = \count 0
  351.                 \divide \count 2 by 2
  352.                 \ifodd    \count 2 %%% signs alternate
  353.                 \then    \advance \dimen 4 by \dimen 2
  354.                 \else    \advance \dimen 4 by -\dimen 2
  355.                 \fi
  356.         \repeat
  357.     \fi        
  358.             \xdef \sine {\nodimen 4}%
  359.             %\typeout {Sin: sine of #1 \space is \sine \space}%
  360.        }}
  361.  
  362. %%% Now the Cosine can be calculated easily by calling \Sine:
  363. %%%  cos(x) = sin(90-x)
  364. \def\Cosine#1{\ifx\sine\UnDefined\edef\Savesine{\relax}\else
  365.                      \edef\Savesine{\sine}\fi
  366.     {\dimen0=#1\r@dian\multiply\dimen0 by -1
  367.      \advance\dimen0 by 90\r@dian
  368.      \Sine{\nodimen 0}
  369.      \xdef\cosine{\sine}
  370.      %\typeout {Cosine: cos of \space \nodimen 0 \space is \cosine \space}%
  371.      \xdef\sine{\Savesine}}}          
  372. %%% end of trig stuff
  373. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  374. %
  375. \def\psdraft{\def\@psdraft{0}}
  376. \def\psfull{\def\@psdraft{100}}
  377. \psfull
  378. %
  379. \newif\if@draftbox
  380. \def\psnodraftbox{\@draftboxfalse}
  381. \@draftboxtrue
  382. %
  383. \newif\if@noisy
  384. \def\pssilent{\@noisyfalse}
  385. \def\psnoisy{\@noisytrue}
  386. \@noisyfalse
  387.  
  388. %%% These are for the option list.
  389. %%% A specification of the form a = b maps to calling \@p@@sa{b}
  390. \newif\if@bbllx
  391. \newif\if@bblly
  392. \newif\if@bburx
  393. \newif\if@bbury
  394. \newif\if@height
  395. \newif\if@width
  396. \newif\if@rheight
  397. \newif\if@rwidth
  398. \newif\if@angle
  399. \newif\if@clip
  400. \newif\if@verbose
  401. \def\@p@@sclip#1{\@cliptrue}
  402. \newif\if@prologfile
  403. \@prologfiletrue
  404. %
  405. %%% if this is true, the original Darrell macros and specials are used
  406. \newif\ifuse@psfig
  407. %
  408. \def\@p@@sfile#1{%
  409. \def\@p@sfile{NO FILE: #1}%
  410. \def\@p@sfilefinal{NO FILE: #1}%
  411.     \openin1=#1
  412.     \ifeof1\closein1
  413.         \openin1=#1.bb
  414.             \ifeof1\closein1
  415.                 \if@bbllx\if@bblly\if@bburx\if@bbury% added 6/91 Rob Russell
  416.                           \def\@p@sfile{#1}%
  417.                           \def\@p@sfilefinal{#1}%
  418.                     \fi\fi\fi
  419.                 \else
  420.                     \@latexerr{ERROR! PostScript file #1 not found}\@whattodo
  421.                     \@p@@sbbllx{100bp}
  422.                     \@p@@sbblly{100bp}
  423.                     \@p@@sbburx{200bp}
  424.                     \@p@@sbbury{200bp}
  425.                     \def\@p@scost{200}
  426.                 \fi
  427.             \else
  428.                 \closein1%
  429.                 \edef\@p@sfile{#1.bb}%
  430.                 \edef\@p@sfilefinal{"`zcat `texfind #1.Z`"}%
  431.             \fi
  432.     \else\closein1
  433.             \edef\@p@sfile{#1}%
  434.             \edef\@p@sfilefinal{#1}%
  435.     \fi%
  436. }
  437.  % alternative syntax: figure=
  438. \let\@p@@sfigure\@p@@sfile
  439. %
  440. \def\@p@@sbbllx#1{
  441.         %\typeout{bbllx is #1}
  442.         \use@psfigtrue
  443.         \@bbllxtrue
  444.         \dimen100=#1
  445.         \edef\@p@sbbllx{\number\dimen100}
  446. }
  447. \def\@p@@sbblly#1{
  448.         %\typeout{bblly is #1}
  449.         \use@psfigtrue
  450.         \@bbllytrue
  451.         \dimen100=#1
  452.         \edef\@p@sbblly{\number\dimen100}
  453. }
  454. \def\@p@@sbburx#1{
  455.         %\typeout{bburx is #1}
  456.         \use@psfigtrue
  457.         \@bburxtrue
  458.         \dimen100=#1
  459.         \edef\@p@sbburx{\number\dimen100}
  460. }
  461. \def\@p@@sbbury#1{
  462.         %\typeout{bbury is #1}
  463.         \use@psfigtrue
  464.         \@bburytrue
  465.         \dimen100=#1
  466.         \edef\@p@sbbury{\number\dimen100}
  467. }
  468. \def\@p@@sheight#1{
  469.         \@heighttrue
  470.         \epsfysize=#1
  471.         \dimen100=#1
  472.            \edef\@p@sheight{\number\dimen100}
  473.         %\typeout{Height is \@p@sheight}
  474. }
  475. \def\@p@@swidth#1{
  476.         %\typeout{Width is #1}
  477.         \@widthtrue
  478.         \epsfxsize=#1
  479.         \dimen100=#1
  480.         \edef\@p@swidth{\number\dimen100}
  481. }
  482. \def\@p@@srheight#1{
  483.         %\typeout{Reserved height is #1}
  484.         \@rheighttrue
  485.         \dimen100=#1
  486.         \edef\@p@srheight{\number\dimen100}
  487. }
  488. \def\@p@@srwidth#1{
  489.         %\typeout{Reserved width is #1}
  490.         \@rwidthtrue
  491.         \dimen100=#1
  492.         \edef\@p@srwidth{\number\dimen100}
  493. }
  494. \def\@p@@sangle#1{
  495.         %\typeout{Rotation is #1}
  496.         \use@psfigtrue
  497.         \@angletrue
  498. %        \dimen100=#1
  499.         \edef\@p@sangle{#1} %\number\dimen100}
  500. }
  501. \def\@p@@ssilent#1{ 
  502.         \@verbosefalse
  503. }
  504. \def\@cs@name#1{\csname #1\endcsname}
  505. \def\@setparms#1=#2,{\@cs@name{@p@@s#1}{#2}}
  506. %
  507. %%% initialize the defaults (size the size of the figure)
  508. %
  509. \def\ps@init@parms{
  510.         \@bbllxfalse \@bbllyfalse
  511.         \@bburxfalse \@bburyfalse
  512.         \@heightfalse \@widthfalse
  513.         \@rheightfalse \@rwidthfalse
  514.         \def\@p@sbbllx{}\def\@p@sbblly{}
  515.         \def\@p@sbburx{}\def\@p@sbbury{}
  516.         \def\@p@sheight{}\def\@p@swidth{}
  517.         \def\@p@srheight{}\def\@p@srwidth{}
  518.         \def\@p@sangle{0}
  519.         \def\@p@sfile{}
  520.         \def\@p@scost{10}
  521.         \use@psfigfalse
  522.         \def\@sc{}
  523.         \if@noisy
  524.             \@verbosetrue
  525.         \else
  526.             \@verbosefalse
  527.         \fi
  528.         \@clipfalse
  529. }
  530. %
  531. %%% Go through the options setting things up.
  532. %
  533. \def\parse@ps@parms#1{
  534.          \@psdo\@psfiga:=#1\do
  535.            {\expandafter\@setparms\@psfiga,}}
  536. %
  537. %%% Compute bb height and width
  538. %
  539. \newif\ifno@bb
  540. \def\bb@missing{
  541.     \epsfgetbb{\@p@sfile}
  542.         \ifepsfbbfound\no@bbfalse\else\no@bbtrue\bb@cull\epsfllx\epsflly\epsfurx\epsfury\fi
  543. }    
  544. \def\bb@cull#1#2#3#4{
  545.     \dimen100=#1 bp\edef\@p@sbbllx{\number\dimen100}
  546.     \dimen100=#2 bp\edef\@p@sbblly{\number\dimen100}
  547.     \dimen100=#3 bp\edef\@p@sbburx{\number\dimen100}
  548.     \dimen100=#4 bp\edef\@p@sbbury{\number\dimen100}
  549.     \no@bbfalse
  550. }
  551.  
  552. \newdimen\p@intvaluex
  553. \newdimen\p@intvaluey
  554. \newdimen\@ffsetvalue
  555. \newdimen\x@ffsetvalue
  556. \newdimen\y@ffsetvalue
  557.  
  558. %%% Calculate \@ffsetvalue = (#2 - #1) \sin\theta
  559. %%%  The sine of the angle is already stored in \sine.
  560. %%%  If (#2-#1)>0, then the result is zero in the 2nd and 4th quadrants, and
  561. %%%  if (#2-#1)<0, then the result is zero in the 1st and 3rd quadrants.
  562. %%%  Only the x coordinate needs an offset in the 1st and 3rd quadrants,
  563. %%%  and only the y coordinate needs an offset otherwise.
  564.  
  565. \def\compute@offset#1#2{{\dimen0=#1 sp\dimen1=#2 sp
  566.             \advance\dimen1 by -\dimen0
  567.             \dimen1=\sine\dimen1
  568.             \dimen0=\cosine\dimen1
  569.             \ifdim\dimen0<0sp \dimen1=0sp \fi
  570.             \global\@ffsetvalue=\dimen1}}
  571.  
  572. %%% rotate point (#1,#2) about (0,0).
  573. %%% The sine and cosine of the angle are already stored in \sine and
  574. %%% \cosine.  The result is placed in (\p@intvaluex, \p@intvaluey).
  575. \def\rotate@#1#2{{\dimen0=#1 sp\dimen1=#2 sp
  576. %%%                calculate x' = x \cos\theta - y \sin\theta
  577.           \global\p@intvaluex=\cosine\dimen0
  578.           \dimen3=\sine\dimen1
  579.           \global\advance\p@intvaluex by -\dimen3
  580. %%%         calculate y' = x \sin\theta + y \cos\theta
  581.           \global\p@intvaluey=\sine\dimen0
  582.           \dimen3=\cosine\dimen1
  583.           \global\advance\p@intvaluey by \dimen3
  584.           }}
  585. %%% rotate point (#1,#2) about the point (#3,#4), finding the x value.
  586. %%% The sine and cosine of the angle are already stored in \sine and
  587. %%% \cosine.  The result is placed in \p@intvaluex
  588. %\def\rotate@x#1#2#3#4{{\dimen0=#1 sp
  589. %            \dimen1=#2 sp
  590. %            \dimen2=#3 sp
  591. %            \dimen4=#4 sp
  592. %            \advance\dimen0 by -\dimen3
  593. %            \dimen0=\cosine\dimen0
  594. %            \advance\dimen4 by -\dimen2
  595. %            \dimen4=\sine\dimen4
  596. %               \global\p@intvaluex=\dimen0
  597. %               \global\advance\p@intvaluex by \dimen4
  598. %            \global\advance\p@intvaluex by \dimen3
  599. %
  600. %}}
  601. \def\compute@bb{
  602.         \no@bbfalse
  603.         \if@bbllx \else \no@bbtrue \fi
  604.         \if@bblly \else \no@bbtrue \fi
  605.         \if@bburx \else \no@bbtrue \fi
  606.         \if@bbury \else \no@bbtrue \fi
  607.         \ifno@bb \bb@missing \fi
  608.         \ifno@bb
  609.             \@latexerr{ERROR! cannot locate BB!}\@whattodobb
  610.             \@p@@sbbllx{100bp}
  611.             \@p@@sbblly{100bp}
  612.             \@p@@sbburx{200bp}
  613.             \@p@@sbbury{200bp}
  614.             \def\@p@scost{200}
  615.         \fi
  616.         %\typeout{BB: \@p@sbbllx, \@p@sbblly, \@p@sbburx, \@p@sbbury} 
  617.         \if@angle 
  618.             \Sine{\@p@sangle}\Cosine{\@p@sangle}
  619.             \compute@offset{\@p@sbblly}{\@p@sbbury}
  620.             \x@ffsetvalue=\@ffsetvalue
  621.             % Note that arguments are reversed to
  622.             %  give a negative interval:
  623.             \compute@offset{\@p@sbburx}{\@p@sbbllx}
  624.             \y@ffsetvalue=\@ffsetvalue
  625.  
  626.             \rotate@{\@p@sbbllx}{\@p@sbblly}
  627.             \advance\p@intvaluex by -\x@ffsetvalue
  628.             \advance\p@intvaluey by -\y@ffsetvalue
  629.             \edef\@p@sbbllx{\number\p@intvaluex}
  630.             \edef\@p@sbblly{\number\p@intvaluey}
  631.  
  632.             \rotate@{\@p@sbburx}{\@p@sbbury}
  633.             \advance\p@intvaluex by \x@ffsetvalue
  634.             \advance\p@intvaluey by \y@ffsetvalue
  635.             \edef\@p@sbburx{\number\p@intvaluex}
  636.             \edef\@p@sbbury{\number\p@intvaluey}
  637. %        swap LL and UR if necessary
  638. %\typeout{rotated BB: \@p@sbbllx, \@p@sbblly, \@p@sbburx, \@p@sbbury}
  639.             {
  640.              \count0=\@p@sbbllx \count1=\@p@sbblly
  641.               \count2=\@p@sbburx \count3=\@p@sbbury
  642.              \dimen0=\@p@sbbllx sp\dimen1=\@p@sbblly sp
  643.               \dimen2=\@p@sbburx sp\dimen3=\@p@sbbury sp
  644.              \dimen203=\dimen2 \advance\dimen203 by -\dimen0
  645.              \dimen204=\dimen3 \advance\dimen204 by -\dimen1
  646.              \ifdim\dimen203<0sp 
  647.                   \count203=\count2 \count2=\count0 
  648.                   \count0=\count203 
  649.                   \global\edef\@p@sbbllx{\number\count0}
  650.                   \global\edef\@p@sbburx{\number\count2}
  651.              \fi
  652.              \ifdim\dimen204<0sp 
  653.                    \count204=\count3
  654.                    \count3=\count1
  655.                    \count1=\count204
  656.                    \global\edef\@p@sbblly{\number\count1}
  657.                    \global\edef\@p@sbbury{\number\count3}
  658.              \fi
  659.             }
  660. %\typeout{after swap BB: \@p@sbbllx, \@p@sbblly, \@p@sbburx, \@p@sbbury}
  661.         \fi
  662.         \count203=\@p@sbburx
  663.         \count204=\@p@sbbury
  664.         \advance\count203 by -\@p@sbbllx
  665.         \advance\count204 by -\@p@sbblly
  666.         \edef\@bbw{\number\count203}
  667.         \edef\@bbh{\number\count204}
  668.         %\typeout{ bbh = \@bbh, bbw = \@bbw }
  669. }
  670. %
  671. %%% \in@hundreds performs #1 * (#2 / #3) correct to the hundreds,
  672. %    then leaves the result in @result
  673. %
  674. \def\in@hundreds#1#2#3{\count240=#2 \count241=#3
  675.              \count100=\count240    % 100 is first digit #2/#3
  676.              \divide\count100 by \count241
  677.              \count101=\count100
  678.              \multiply\count101 by \count241
  679.              \advance\count240 by -\count101
  680.              \multiply\count240 by 10
  681.              \count101=\count240    %101 is second digit of #2/#3
  682.              \divide\count101 by \count241
  683.              \count102=\count101
  684.              \multiply\count102 by \count241
  685.              \advance\count240 by -\count102
  686.              \multiply\count240 by 10
  687.              \count102=\count240    % 102 is the third digit
  688.              \divide\count102 by \count241
  689.              \count200=#1\count205=0
  690.              \count201=\count200
  691.             \multiply\count201 by \count100
  692.              \advance\count205 by \count201
  693.              \count201=\count200
  694.             \divide\count201 by 10
  695.             \multiply\count201 by \count101
  696.             \advance\count205 by \count201
  697.             %
  698.              \count201=\count200
  699.             \divide\count201 by 100
  700.             \multiply\count201 by \count102
  701.             \advance\count205 by \count201
  702.             %
  703.              \edef\@result{\number\count205}
  704. }
  705. \def\compute@wfromh{
  706.         % computing : width = height * (bbw / bbh)
  707.         \in@hundreds{\@p@sheight}{\@bbw}{\@bbh}
  708.         %\typeout{ \@p@sheight * \@bbw / \@bbh, = \@result }
  709.         \edef\@p@swidth{\@result}
  710.         %\typeout{w from h: width is \@p@swidth}
  711. }
  712. \def\compute@hfromw{
  713.         % computing : height = width * (bbh / bbw)
  714.         \in@hundreds{\@p@swidth}{\@bbh}{\@bbw}
  715.         %\typeout{ \@p@swidth * \@bbh / \@bbw = \@result }
  716.         \edef\@p@sheight{\@result}
  717.         %\typeout{h from w : height is \@p@sheight}
  718. }
  719. \def\compute@handw{
  720.         \if@height 
  721.             \if@width
  722.             \else
  723.                 \compute@wfromh
  724.             \fi
  725.         \else 
  726.             \if@width
  727.                 \compute@hfromw
  728.             \else
  729.                 \edef\@p@sheight{\@bbh}
  730.                 \edef\@p@swidth{\@bbw}
  731.             \fi
  732.         \fi
  733. }
  734. \def\compute@resv{
  735.         \if@rheight \else \edef\@p@srheight{\@p@sheight} \fi
  736.         \if@rwidth \else \edef\@p@srwidth{\@p@swidth} \fi
  737.         %\typeout{rheight = \@p@srheight, rwidth = \@p@srwidth}
  738. }
  739. %        
  740. %%% Compute any missing values
  741. \def\compute@sizes{
  742.     \compute@bb
  743.     \compute@handw
  744.     \compute@resv
  745. }
  746. %
  747. %%% \epsfig
  748. %%% usage : \epsfig{file=, height=, width=, bbllx=, bblly=, bburx=, bbury=,
  749. %            rheight=, rwidth=, angle=, clip=}
  750. %
  751. %%% "clip=" is a switch and takes no value, but the `=' must be present.
  752. %------------------------------------------------------------------
  753. %%% by the way, possible parameters to the PSfile= command in dvips are:
  754. %%%                    llx
  755. %%%                    lly
  756. %%%                    urx
  757. %%%                    ury
  758. %%%                    rwi
  759. %    hoffset    The horizontal offset (default 0)
  760. %    voffset    The vertical offset (default 0)
  761. %    hsize    The horizontal clipping size (default 612)
  762. %    vsize    The vertical clipping size (default 792)
  763. %    hscale    The horizontal scaling factor (default 100)
  764. %    vscale    The vertical scaling factor (default 100)
  765. %    angle    The rotation (default 0)
  766. %------------------------------------------------------------------
  767. \def\psfig#1{\vbox {
  768.     % do a zero width hard space so that a single
  769.     % \epsfig in a centering enviornment will behave nicely
  770.     %{\setbox0=\hbox{\ }\ \hskip-\wd0}
  771.     %
  772.     \ps@init@parms
  773.     \parse@ps@parms{#1}
  774.     %
  775.     \ifnum\@p@scost<\@psdraft
  776.         \typeout{[\@p@sfilefinal]}
  777.         \if@verbose
  778.             \typeout{epsfig: using PSFIG macros}
  779.         \fi
  780.         \psfig@method
  781.     \else
  782.         \epsfig@draft
  783.     \fi
  784. }}
  785.  
  786. \def\epsfig#1{\vbox {
  787.     % do a zero width hard space so that a single
  788.     % \epsfig in a centering enviornment will behave nicely
  789.     %{\setbox0=\hbox{\ }\ \hskip-\wd0}
  790.     %
  791.     \ps@init@parms
  792.     \parse@ps@parms{#1}
  793.     %
  794.     \ifnum\@p@scost<\@psdraft
  795.         \typeout{[\@p@sfilefinal]}
  796.         \if@clip\use@psfigtrue\fi
  797.         \if@angle\use@psfigtrue\fi
  798.         \ifuse@psfig
  799.             \if@verbose
  800.                 \typeout{epsfig: using PSFIG macros}
  801.             \fi
  802.             \psfig@method
  803.         \else
  804.             \if@verbose
  805.                 \typeout{epsfig: using EPSF macros}
  806.             \fi
  807.             \epsf@method
  808.         \fi
  809.     \else
  810.         \epsfig@draft
  811.     \fi
  812. }}
  813.  
  814.  
  815. \def\epsf@method{%
  816.     \epsfgetbb{\@p@sfile}%
  817.     \epsfsetgraph{\@p@sfilefinal}
  818. }
  819. \def\psfig@method{%
  820.     \compute@sizes
  821.     \special{ps::[begin]  \@p@swidth \space \@p@sheight \space%
  822.     \@p@sbbllx \space \@p@sbblly \space%
  823.     \@p@sbburx \space \@p@sbbury \space%
  824.     startTexFig \space }%
  825.     \if@angle
  826.         \special {ps:: \@p@sangle \space rotate \space} 
  827.     \fi
  828.     \if@clip
  829.         \if@verbose
  830.             \typeout{(clipped to BB) }
  831.         \fi
  832.         \special{ps:: doclip \space }%
  833.     \fi
  834.     \special{ps: plotfile \@p@sfilefinal \space }%
  835.     \special{ps::[end] endTexFig \space }%
  836.     % Create the vbox to reserve the space for the figure%
  837.     \vbox to \@p@srheight true sp{\hbox to \@p@srwidth true sp{\hss}\vss}
  838. }
  839. %
  840. % draft figure, just reserve the space and print the
  841. % path name.
  842. \def\epsfig@draft{
  843. \compute@sizes
  844. \if@draftbox
  845.     % Verbose draft: print file name in box
  846.     % NOTE: fbox is a LaTeX command!
  847.     \hbox{\fbox{\vbox to \@p@srheight true sp{
  848.     \vss\hbox to \@p@srwidth true sp{ \hss \@p@sfilefinal \hss }\vss
  849.     }}}
  850. \else
  851.     % Non-verbose draft
  852.     \vbox to \@p@srheight true sp{%
  853.     \vss\hbox to \@p@srwidth true sp{\hss}\vss}
  854. \fi    
  855. }
  856. \epsfigRestoreAt
  857.  
  858.  
  859.