Rev 57970 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
%%% -*-TeX-*-%%% ====================================================================%%% @TeX-file{%%% author = "Tom Rokicki",%%% version = "2.7.4",%%% date = "14 February 2011",%%% time = "15:44:06 MST",%%% filename = "epsf.tex",%%% address = "Tom Rokicki%%% Box 2081%%% Stanford, CA 94309%%% USA",%%% telephone = "+1 415 855 9989",%%% checksum = "29223 653 3100 27123",%%% email = "rokicki@cs.stanford.edu (Internet)",%%% codetable = "ISO/ASCII",%%% copyright = "This file is freely redistributable and%%% placed into the public domain by Tomas%%% Rokicki.",%%% keywords = "PostScript, TeX",%%% license = "public domain",%%% supported = "yes",%%% abstract = "This file contains macros to support the%%% inclusion of Encapsulated PostScript files%%% in TeX documents.",%%% docstring = "This file contains TeX macros to include an%%% Encapsulated PostScript graphic. It works%%% by finding the bounding box comment,%%% calculating the correct scale values, and%%% inserting a vbox of the appropriate size at%%% the current position in the TeX document.%%%%%% To use, simply use%%%%%% \input epsf % somewhere early on in your TeX file%%%%%% % then where you want to insert a vbox for a figure:%%% \epsfbox{filename.ps}%%%%%% Alternatively, you can supply your own%%% bounding box by%%%%%% \epsfbox[0 0 30 50]{filename.ps}%%%%%% This will not read in the file, and will%%% instead use the bounding box you specify.%%%%%% The effect will be to typeset the figure as%%% a TeX box, at the point of your \epsfbox%%% command. By default, the graphic will have%%% its `natural' width (namely the width of%%% its bounding box, as described in%%% filename.ps). The TeX box will have depth%%% zero.%%%%%% You can enlarge or reduce the figure by%%% using%%%%%% \epsfxsize = <dimen> \epsfbox{filename.ps}%%% or%%% \epsfysize = <dimen> \epsfbox{filename.ps}%%%%%% instead. Then the width of the TeX box will%%% be \epsfxsize and its height will be scaled%%% proportionately (or the height will be%%% \epsfysize and its width will be scaled%%% proportionately).%%%%%% The width (and height) is restored to zero%%% after each use, so \epsfxsize or \epsfysize%%% must be specified before EACH use of%%% \epsfbox.%%%%%% A more general facility for sizing is%%% available by defining the \epsfsize macro.%%% Normally you can redefine this macro to do%%% almost anything. The first parameter is%%% the natural x size of the PostScript%%% graphic, the second parameter is the%%% natural y size of the PostScript graphic.%%% It must return the xsize to use, or 0 if%%% natural scaling is to be used. Common uses%%% include:%%%%%% \epsfxsize % just leave the old value alone%%% 0pt % use the natural sizes%%% #1 % use the natural sizes%%% \hsize % scale to full width%%% 0.5#1 % scale to 50% of natural size%%% \ifnum #1 > \hsize \hsize \else #1\fi%%% % smaller of natural, hsize%%%%%% If you want TeX to report the size of the%%% figure (as a message on your terminal when%%% it processes each figure), use%%% `\epsfverbosetrue'.%%%%%% If you only want to get the bounding box%%% extents, without producing any output boxes%%% or \special{}, then use \epsfgetbb{filename}.%%% The bounding box corner coordinates are saved%%% in the macros \epsfllx, \epsflly, \epsfurx,%%% and \epsfury in PostScript units of big%%% points.%%%%%% Revision history:%%%%%% ---------------------------------------------%%% epsf.tex macro file:%%% Originally written by Tomas Rokicki of%%% Radical Eye Software, 29 Mar 1989.%%%%%% ---------------------------------------------%%% Revised by Don Knuth, 3 Jan 1990.%%%%%% ---------------------------------------------%%% Revised by Tomas Rokicki, 18 Jul 1990.%%% Accept bounding boxes with no space after%%% the colon.%%%%%% ---------------------------------------------%%% Revised by Nelson H. F. Beebe%%% <beebe@math.utah.edu>, 03 Dec 1991 [2.0].%%% Add version number and date typeout.%%%%%% Use \immediate\write16 instead of \message%%% to ensure output on new line.%%%%%% Handle nested EPS files.%%%%%% Handle %%BoundingBox: (atend) lines.%%%%%% Do not quit when blank lines are found.%%%%%% Add a few percents to remove generation of%%% spurious blank space.%%%%%% Move \special output to%%% \epsfspecial{filename} so that other macro%%% packages can input this one, then change%%% the definition of \epsfspecial to match%%% another DVI driver.%%%%%% Move size computation to \epsfsetsize which%%% can be called by the user; the verbose%%% output of the bounding box and scaled width%%% and height happens here.%%%%%% ---------------------------------------------%%% Revised by Nelson H. F. Beebe%%% <beebe@math.utah.edu>, 05 May 1992 [2.1].%%% Wrap \leavevmode\hbox{} around \vbox{} with%%% the \special so that \epsffile{} can be%%% used inside \begin{center}...\end{center}%%%%%% ---------------------------------------------%%% Revised by Nelson H. F. Beebe%%% <beebe@math.utah.edu>, 09 Dec 1992 [2.2].%%% Introduce \epsfshow{true,false} and%%% \epsfframe{true,false} macros; the latter%%% suppresses the insertion of the PostScript,%%% and instead just creates an empty box,%%% which may be handy for rapid prototyping.%%%%%% ---------------------------------------------%%% Revised by Nelson H. F. Beebe%%% <beebe@math.utah.edu>, 14 Dec 1992 [2.3].%%% Add \epsfshowfilename{true,false}. When%%% true, and \epsfshowfalse is specified, the%%% PostScript file name will be displayed%%% centered in the figure box.%%%%%% ---------------------------------------------%%% Revised by Nelson H. F. Beebe%%% <beebe@math.utah.edu>, 20 June 1993 [2.4].%%% Remove non-zero debug setting of \epsfframemargin,%%% and change margin handling to preserve EPS image%%% size and aspect ratio, so that the actual%%% box is \epsfxsize+\epsfframemargin wide by%%% \epsfysize+\epsfframemargin high.%%% Reduce output of \epsfshowfilenametrue to%%% just the bare file name.%%%%%% ---------------------------------------------%%% Revised by Nelson H. F. Beebe%%% <beebe@math.utah.edu>, 13 July 1993 [2.5].%%% Add \epsfframethickness for control of%%% \epsfframe frame lines.%%%%%% ---------------------------------------------%%% Revised by Nelson H. F. Beebe%%% <beebe@math.utah.edu>, 02 July 1996 [2.6]%%% Add missing initialization \epsfatendfalse;%%% the lack of this resulted in the wrong%%% BoundingBox being picked up, mea culpa, sigh...%%%%%% ---------------------------------------------%%% Revised by Nelson H. F. Beebe%%% <beebe@math.utah.edu>, 25 October 1996 [2.7]%%% Update to match changes in from dvips 5-600%%% distribution: new user-accessible macros:%%% \epsfclipon, \epsfclipoff, \epsfdrafton,%%% \epsfdraftoff, change \empty to \epsfempty.%%%%%% ---------------------------------------------%%% Revised by Nelson H. F. Beebe%%% <beebe@math.utah.edu>, 18 May 2002 [2.7.1]%%% Add write statements to echo input file%%% names. Prior to that change, an error in%%% such a file could be quite hard to track%%% down: a long list of TeX page numbers could%%% suddenly be followed by ``TeX buffer%%% capacity'' exceeded, without any indication%%% of the file that was responsible.%%%%%% ---------------------------------------------%%% Revised by Nelson H. F. Beebe%%% <beebe@math.utah.edu>, 16 May 2003 [2.7.2]%%% Supply two critical percent characters that%%% were mistakenly omitted in version 2.7.1,%%% and resulted in a small amount of spurious%%% horizontal space.%%%%%% ---------------------------------------------%%% Revised by Nelson H. F. Beebe%%% <beebe@math.utah.edu>, 14 Feb 2011 [2.7.3]%%% Add previously-missing \space in rwi%%% assignments (bug reported 14-Feb-2011 by%%% Stefan Rueger <s.rueger@open.ac.uk>).%%%%%% ---------------------------------------------%%% Revised by Nelson H. F. Beebe%%% <beebe@math.utah.edu>, Karl Berry%%% <karl@freefriends.org>, and Robin Fairbairns%%% <Robin.Fairbairns@cl.cam.ac.uk>,%%% 23 July 2005 [2.7.3]%%% Add critical \hbox{} wrapper in \epsfsetgraph%%% so that \epsfbox{} does not conflict with%%% LaTeX center environment when \epsfbox{} is%%% surrounded by other horizonal objects.%%% Improve macro readability by adding legal,%%% but invisible-in-typeset-output, spaces.%%% Ensure that verbose status reports come%%% inside (filename ...) list.%%%%%% ---------------------------------------------%%% The checksum field above contains a CRC-16%%% checksum as the first value, followed by%%% the equivalent of the standard UNIX wc%%% (word count) utility output of lines,%%% words, and characters. This is produced by%%% Robert Solovay's checksum utility.",%%% }%%% ====================================================================%\immediate \write16 {This is `epsf.tex' v2.0 <02 Dec 1991>}%%\immediate \write16 {This is `epsf.tex' v2.1 <05 May 1992>}%%\immediate \write16 {This is `epsf.tex' v2.2 <09 Dec 1992>}%%\immediate \write16 {This is `epsf.tex' v2.3 <14 Dec 1992>}%%\immediate \write16 {This is `epsf.tex' v2.4 <20 June 1993>}%%\immediate \write16 {This is `epsf.tex' v2.5 <13 July 1993>}%%\immediate \write16 {This is `epsf.tex' v2.6 <02 July 1996>}%%\immediate \write16 {This is `epsf.tex' v2.7 <25 October 1996>}%%\immediate \write16 {This is `epsf.tex' v2.7.1 <18 May 2002>}%%\immediate \write16 {This is `epsf.tex' v2.7.2 <16 May 2003>}%%\immediate \write16 {This is `epsf.tex' v2.7.3 <23 July 2005>}%\immediate \write16 {This is `epsf.tex' v2.7.4 <14 February 2011>}%%\newread \epsffilein % file to \read\newif \ifepsfatend % need to scan to LAST %%BoundingBox comment?\newif \ifepsfbbfound % success?\newif \ifepsfdraft % use draft mode?\newif \ifepsffileok % continue looking for the bounding box?\newif \ifepsfframe % frame the bounding box?\newif \ifepsfshow % show PostScript file, or just bounding box?\epsfshowtrue % default is to display PostScript file\newif \ifepsfshowfilename % show the file name if \epsfshowfalse specified?\newif \ifepsfverbose % report what you're making?\newdimen \epsfframemargin % margin between box and frame\newdimen \epsfframethickness % thickness of frame rules\newdimen \epsfrsize % vertical size before scaling\newdimen \epsftmp % register for arithmetic manipulation\newdimen \epsftsize % horizontal size before scaling\newdimen \epsfxsize % horizontal size after scaling\newdimen \epsfysize % vertical size after scaling\newdimen \pspoints % conversion factor%\pspoints = 1bp % Adobe points are `big'\epsfxsize = 0pt % default value, means `use natural size'\epsfysize = 0pt % ditto\epsfframemargin = 0pt % default value: frame box flush around picture\epsfframethickness = 0.4pt % TeX's default rule thickness%\def \epsfbox #1{%\global \def \epsfllx {72}%\global \def \epsflly {72}%\global \def \epsfurx {540}%\global \def \epsfury {720}%\def \lbracket {[}%\def \testit {#1}%\ifx \testit \lbracket\let \next = \epsfgetlitbb\else\let \next = \epsfnormal\fi\next{#1}%}%%% We use \epsfgetlitbb if the user specified an explicit bounding box,% and \epsfnormal otherwise. Because \epsfgetbb can be called% separately to retrieve the bounding box, we move the verbose% printing the bounding box extents and size on the terminal to% \epsfstatus. Therefore, when the user provided the bounding box,% \epsfgetbb will not be called, so we must call \epsfsetsize and% \epsfstatus ourselves.%\def \epsfgetlitbb #1#2 #3 #4 #5]#6{%\epsfgrab #2 #3 #4 #5 .\\%\epsfsetsize\epsfstatus{#6}%\epsfsetgraph{#6}%}%%\def \epsfnormal #1{%\epsfgetbb{#1}%\epsfsetgraph{#1}%}%%\def \epsfgetbb #1{%%% The first thing we need to do is to open the% PostScript file, if possible.%\openin\epsffilein=#1\immediate \write16 {(#1}%\ifeof \epsffilein\errmessage{Could not open file #1, ignoring it}%\else %process the file{% %start a group to contain catcode changes% Make all special characters, except space, to be of type% `other' so we process the file in almost verbatim mode% (TeXbook, p. 344).\chardef \other = 12%\def \do ##1{\catcode`##1=\other}%\dospecials\catcode `\ = 10%\epsffileoktrue %true while we are looping\epsfatendfalse %[02-Jul-1996]: add forgotten initialization\loop %reading lines from the EPS file\read \epsffilein to \epsffileline\ifeof \epsffilein %then no more input\epsffileokfalse %so set completion flag\else %otherwise process one line\expandafter \epsfaux \epsffileline :. \\%\fi\ifepsffileok\repeat\ifepsfbbfound\else\ifepsfverbose\immediate \write16 {No BoundingBox comment found in %file #1; using defaults}%\fi\fi}% %end catcode changes\closein\epsffilein\fi %end of file processing\epsfsetsize %compute size parameters\epsfstatus{#1}%\immediate \write16 {)}%}%%% Clipping control:\def \epsfclipon {\def \epsfclipstring { clip}}%\def \epsfclipoff {\def \epsfclipstring {\ifepsfdraft \space clip\fi}}%\epsfclipoff % default for dvips is OFF%% The special that is emitted by \epsfsetgraph comes from this macro.% It is defined separately to allow easy customization by other% packages that first \input epsf.tex, then redefine \epsfspecial.% This macro is invoked in the lower-left corner of a box of the% width and height determined from the arguments to \epsffile, or% from the %%BoundingBox in the EPS file itself.%% This version is for dvips:\def \epsfspecial #1{%\epsftmp=10\epsfxsize\divide \epsftmp by \pspoints\ifnum \epsfrsize = 0%\relax\special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\spacellx=\epsfllx\spacelly=\epsflly\spaceurx=\epsfurx\spaceury=\epsfury\spacerwi=\number\epsftmp\space\epsfclipstring}%\else\epsfrsize=10\epsfysize\divide \epsfrsize by \pspoints\special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\spacellx=\epsfllx\spacelly=\epsflly\spaceurx=\epsfurx\spaceury=\epsfury\spacerwi=\number\epsftmp\spacerhi=\number\epsfrsize\epsfclipstring}%\fi}%%% \epsfframe macro adapted from the TeXbook, exercise 21.3, p. 223, 331.% but modified to set the box width to the natural width, rather% than the line width, and to include space for margins and rules\def \epsfframe #1%{%% method for detecting latex suggested by Robin Fairbairns, May 2005.\ifx \documentstyle \epsfundefined\relax\else% \leavevmode % so we can put this inside% a latex centered environment% The \leavevmode breaks under plain when this is inside a box,% because it forces the figure to be the entire \hsize. On the% other hand, we need the \leavevmode for it to work in LaTeX,% because the {center} environment works by adjusting TeX's% paragraph parameters.%% Compare the LaTeX sequence% \begin{center}% \epsfbox{tip.eps}q% \end{center}% (needs the \leavevmode to put the q right next to the image)%% with the plain TeX sequence:% \leftline{\vbox{\epsfbox{tip.eps}}q}% (had the q all the way over to the right, when \leavevmode was used)\fi%\setbox0 = \hbox{#1}%\dimen0 = \wd0 % natural width of argument\advance \dimen0 by 2\epsfframemargin % plus width of 2 margins\advance \dimen0 by 2\epsfframethickness % plus width of 2 rule lines\relax\hbox{%\vbox{%\hrule height \epsfframethickness depth 0pt\hbox to \dimen0{%\hss\vrule width \epsfframethickness\kern \epsfframemargin\vbox {\kern \epsfframemargin \box0 \kern \epsfframemargin }%\kern \epsfframemargin\vrule width \epsfframethickness\hss}% end hbox\hrule height 0pt depth \epsfframethickness}% end vbox}% end hbox\relax}%%\def \epsfsetgraph #1%{%%% Make the vbox and stick in a \special that the DVI driver can% parse. \vfil and \hfil are used to place the \special origin at% the lower-left corner of the vbox. \epsfspecial can be redefined% to produce alternate \special syntaxes.%\ifvmode \leavevmode \fi\relax\hbox{% so we can put this in \begin{center}...\end{center}\ifepsfframe \expandafter \epsfframe \fi{\vbox to\epsfysize{%\ifepsfshow% output \special{} at lower-left corner of figure box\vfil\hbox to \epsfxsize{\epsfspecial{#1}\hfil}%\else\vfil\hbox to\epsfxsize{%\hss\ifepsfshowfilename{%\epsfframemargin=3pt % local change of margin\epsfframe{{\tt #1}}%}%\fi\hss}%\vfil\fi}%}}%\relax%% Reset \epsfxsize and \epsfysize, as documented above.%\global \epsfxsize = 0pt\global \epsfysize = 0pt}%%% Now we have to calculate the scale and offset values to use.% First we compute the natural sizes.%\def \epsfsetsize{%\epsfrsize = \epsfury \pspoints\advance \epsfrsize by -\epsflly \pspoints\epsftsize = \epsfurx \pspoints\advance \epsftsize by -\epsfllx \pspoints%% If `epsfxsize' is 0, we default to the natural size of the picture.% Otherwise we scale the graph to be \epsfxsize wide.%\epsfxsize = \epsfsize{\epsftsize}{\epsfrsize}%\ifnum \epsfxsize = 0\ifnum \epsfysize = 0\epsfxsize = \epsftsize\epsfysize = \epsfrsize\epsfrsize = 0pt%% We have a sticky problem here: TeX doesn't do floating point arithmetic!% Our goal is to compute y = rx/t. The following loop does this reasonably% fast, with an error of at most about 16 sp (about 1/4000 pt).%\else\epsftmp = \epsftsize\divide \epsftmp by \epsfrsize\epsfxsize = \epsfysize\multiply \epsfxsize by \epsftmp\multiply \epsftmp by \epsfrsize\advance \epsftsize by -\epsftmp\epsftmp = \epsfysize\loop\advance \epsftsize by \epsftsize\divide \epsftmp by 2\ifnum \epsftmp > 0\ifnum \epsftsize < \epsfrsize\else\advance \epsftsize -\epsfrsize\advance \epsfxsize \epsftmp\fi\repeat\epsfrsize = 0pt\fi\else\ifnum \epsfysize = 0\epsftmp = \epsfrsize\divide \epsftmp by \epsftsize\epsfysize = \epsfxsize\multiply \epsfysize by \epsftmp\multiply \epsftmp by \epsftsize\advance \epsfrsize by -\epsftmp\epsftmp = \epsfxsize\loop\advance \epsfrsize by \epsfrsize\divide \epsftmp by 2\ifnum \epsftmp > 0\ifnum \epsfrsize < \epsftsize\else\advance \epsfrsize by -\epsftsize\advance \epsfysize by \epsftmp\fi\repeat\epsfrsize = 0pt\else\epsfrsize = \epsfysize\fi\fi}%%% Issue some status messages if the user requested them%\def \epsfstatus #1{% arg = filename\ifepsfverbose\immediate \write16 {#1: BoundingBox:llx = \epsfllx \space lly = \epsflly \spaceurx = \epsfurx \space ury = \epsfury \space}%\immediate \write16 {#1: scaled width = \the\epsfxsize \spacescaled height = \the\epsfysize}%\fi}%%% We still need to define the tricky \epsfaux macro. This requires% a couple of magic constants for comparison purposes.%{\catcode`\%=12 \global \let \epsfpercent=%\global \def \epsfbblit {%BoundingBox}}%\global \def \epsfatend{(atend)}%%% So we're ready to check for `%BoundingBox:' and to grab the% values if they are found.%% If we find a line%% %%BoundingBox: (atend)%% then we ignore it, but set a flag to force parsing all of the% file, so the last %%BoundingBox parsed will be the one used. This% is necessary, because EPS files can themselves contain other EPS% files with their own %%BoundingBox comments.%% If we find a line%% %%BoundingBox: llx lly urx ury%% then we save the 4 values in \epsfllx, \epsflly, \epsfurx, \epsfury.% Then, if we have not previously parsed an (atend), we flag completion% and can stop reading the file. Otherwise, we must keep on reading% to end of file so that we find the values on the LAST %%BoundingBox.\long \def \epsfaux#1#2:#3\\%{%\def \testit {#2}% % save second character up to just before colon\ifx#1\epsfpercent % then first char is percent (quick test)\ifx \testit \epsfbblit % then (slow test) we have %%BoundingBox\epsfgrab #3 . . . \\%\ifx \epsfllx\epsfatend % then ignore %%BoundingBox: (atend)\global \epsfatendtrue\else % else found %%BoundingBox: llx lly urx ury\ifepsfatend % then keep parsing ALL %%BoundingBox lines\else % else stop after first one parsed\epsffileokfalse\fi\global \epsfbbfoundtrue\fi\fi\fi}%%% Here we grab the values and stuff them in the appropriate definitions.%\def \epsfempty {}%\def \epsfgrab #1 #2 #3 #4 #5\\{%\global \def \epsfllx {#1}\ifx \epsfllx\epsfempty\epsfgrab #2 #3 #4 #5 .\\\else\global \def \epsflly {#2}%\global \def \epsfurx {#3}\global \def \epsfury {#4}\fi}%%% We default the epsfsize macro.%\def \epsfsize #1#2{\epsfxsize}%%% Finally, another definition for compatibility with older macros.%\let \epsffile = \epsfbox\endinput