1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
|
% EPSF.TEX macro file:
% Written by Tomas Rokicki of Radical Eye Software, 29 Mar 1989.
% Revised by Don Knuth, 3 Jan 1990.
% Revised by Tomas Rokicki to accept bounding boxes with no
% space after the colon, 18 Jul 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 with the center environment of LaTeX, preface the \epsffile
% call with a \leavevmode. (LaTeX should probably supply this itself
% for the center environment.)
%
% 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
%
% Alternatively, you can type
%
% \epsfbox[0 0 30 50]{filename.ps} % to supply your own BB
%
% which 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 saying
% \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 proportiontally). The
% width (and height) is restored to zero after each use.
%
% 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), 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=1bp % Adobe points are `big'
\epsfxsize=0pt % Default value, means `use natural size'
\epsfysize=0pt % ditto
%
\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}}%
%
\def\epsfgetlitbb#1#2 #3 #4 #5]#6{\epsfgrab #2 #3 #4 #5 .\\%
\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
\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\fi
}\closein\epsffilein\fi}%
%
% Now we have to calculate the scale and offset values to use.
% First we compute the natural sizes.
%
\def\epsfsetgraph#1{%
\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
%
% 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\epsfrsize
\epsfxsize=\epsfysize \multiply\epsfxsize\epsftmp
\multiply\epsftmp\epsfrsize \advance\epsftsize-\epsftmp
\epsftmp=\epsfysize
\loop \advance\epsftsize\epsftsize \divide\epsftmp 2
\ifnum\epsftmp>0
\ifnum\epsftsize<\epsfrsize\else
\advance\epsftsize-\epsfrsize \advance\epsfxsize\epsftmp \fi
\repeat
\fi
\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}}%
\epsfxsize=0pt\epsfysize=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}\ifx\epsfllx\empty
\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
|