% EPSF.TEX macro file: % Written by Tomas Rokicki of Radical Eye Software, 29 Mar 1989. % Revised by Don Knuth, 3 Jan 1990. % % TeX macros to include an Encapsulated PostScript graphic. % 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 say % \input epsf % somewhere early on in your TeX file % \epsfbox{filename.ps} % where you want to insert a vbox for a figure % % 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 saying % \epsfxsize= \epsfille{filename.ps} % instead. Then the width of the TeX box will be \epsfxsize, and its % height will be scaled proportionately. % (The \epsfbox macro resets \epsfxsize to zero after each use.) % If you want TeX to report the size of the figure (as a message % on your terminal when it processes each figure), say `\epsfverbosetrue'. % \newread\epsffilein % file to \read \newif\ifepsffileok % continue looking for the bounding box? \newif\ifepsfbbfound % success? \newif\ifepsfverbose % report what you're making? \newdimen\epsfxsize % horizontal size after scaling \newdimen\epsfysize % vertical size after scaling \newdimen\epsftsize % horizontal size before scaling \newdimen\epsfrsize % vertical size before scaling \newdimen\epsftmp % register for arithmetic manipulation \newdimen\pspoints % conversion factor \pspoints=1truebp % Adobe points are `big' \epsfxsize=0pt % Default value, means `use natural size' % \def\epsfbox#1{% % % The first thing we need to do is to open the % PostScript file, if possible. % \openin\epsffilein=#1 \ifeof\epsffilein\errmessage{I couldn't open #1, will ignore it}\else % % Okay, we got it. Now we'll scan lines until we find one that doesn't % start with %. We're looking for the bounding box comment. % {\epsffileoktrue \chardef\other=12 \def\do##1{\catcode`##1=\other}\dospecials \catcode`\ =10 \loop \read\epsffilein to \epsffileline \ifeof\epsffilein\epsffileokfalse\else % % We check to see if the first character is a % sign; % if not, we stop reading (unless the line was entirely blank); % if so, we look further and stop only if the line begins with % `%%BoundingBox: '. % \expandafter\epsfaux\epsffileline. \\% \fi \ifepsffileok\repeat \ifepsfbbfound\else \ifepsfverbose\message{No bounding box comment in #1; using defaults}\fi \global\def\epsfllx{72}% \global\def\epsflly{72}% \global\def\epsfurx{540}% \global\def\epsfury{720}\fi }\closein\epsffilein % % Now we have to calculate the scale and offset values to use. % First we compute the natural sizes. % \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. % \ifnum\epsfxsize=0 \epsfxsize=\epsftsize \epsfysize=\epsfrsize % % 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=\epsfrsize \divide\epsftmp\epsftsize \epsfysize=\epsfxsize \multiply\epsfysize\epsftmp \multiply\epsftmp\epsftsize \advance\epsfrsize-\epsftmp \epsftmp=\epsfxsize \loop \advance\epsfrsize\epsfrsize \divide\epsftmp 2 \ifnum\epsftmp>0 \ifnum\epsfrsize<\epsftsize\else \advance\epsfrsize-\epsftsize \advance\epsfysize\epsftmp \fi \repeat \fi % % Finally, we make the vbox and stick in a \special that dvips can parse. % \ifepsfverbose\message{#1: width=\the\epsfxsize, height=\the\epsfysize}\fi \epsftmp=10\epsfxsize \divide\epsftmp\pspoints \vbox to\epsfysize{\vfil\hbox to\epsfxsize{% \special{psfile=#1 llx=\epsfllx\space lly=\epsflly\space urx=\epsfurx\space ury=\epsfury\space rwi=\number\epsftmp}% \hfil}}% \fi\epsfxsize=0pt}% % % 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:}}% % % So we're ready to check for `%BoundingBox:' and to grab the % values if they are found. % \long\def\epsfaux#1#2 #3\\{\ifx#1\epsfpercent \def\testit{#2}\ifx\testit\epsfbblit \epsfgrab #3 . . . \\% \epsffileokfalse \global\epsfbbfoundtrue \fi\else\ifx#1\par\else\epsffileokfalse\fi\fi}% % % Here we grab the values and stuff them in the appropriate definitions. % \def\epsfgrab#1 #2 #3 #4 #5\\{\global\def\epsfllx{#1}\global\def\epsflly{#2}% \global\def\epsfurx{#3}\global\def\epsfury{#4}}% % % Finally, another definition for compatibility with older macros. % \let\epsffile=\epsfbox