| 1 | molod | 1.1 | %   EPSF.TEX macro file: | 
| 2 |  |  | %   Written by Tomas Rokicki of Radical Eye Software, 29 Mar 1989. | 
| 3 |  |  | %   Revised by Don Knuth, 3 Jan 1990. | 
| 4 |  |  | %   Revised by Tomas Rokicki to accept bounding boxes with no | 
| 5 |  |  | %      space after the colon, 18 Jul 1990. | 
| 6 |  |  | % | 
| 7 |  |  | %   TeX macros to include an Encapsulated PostScript graphic. | 
| 8 |  |  | %   Works by finding the bounding box comment, | 
| 9 |  |  | %   calculating the correct scale values, and inserting a vbox | 
| 10 |  |  | %   of the appropriate size at the current position in the TeX document. | 
| 11 |  |  | % | 
| 12 |  |  | %   To use with the center environment of LaTeX, preface the \epsffile | 
| 13 |  |  | %   call with a \leavevmode.  (LaTeX should probably supply this itself | 
| 14 |  |  | %   for the center environment.) | 
| 15 |  |  | % | 
| 16 |  |  | %   To use, simply say | 
| 17 |  |  | %   \input epsf           % somewhere early on in your TeX file | 
| 18 |  |  | %   \epsfbox{filename.ps} % where you want to insert a vbox for a figure | 
| 19 |  |  | % | 
| 20 |  |  | %   Alternatively, you can type | 
| 21 |  |  | % | 
| 22 |  |  | %   \epsfbox[0 0 30 50]{filename.ps} % to supply your own BB | 
| 23 |  |  | % | 
| 24 |  |  | %   which will not read in the file, and will instead use the bounding | 
| 25 |  |  | %   box you specify. | 
| 26 |  |  | % | 
| 27 |  |  | %   The effect will be to typeset the figure as a TeX box, at the | 
| 28 |  |  | %   point of your \epsfbox command. By default, the graphic will have its | 
| 29 |  |  | %   `natural' width (namely the width of its bounding box, as described | 
| 30 |  |  | %   in filename.ps). The TeX box will have depth zero. | 
| 31 |  |  | % | 
| 32 |  |  | %   You can enlarge or reduce the figure by saying | 
| 33 |  |  | %     \epsfxsize=<dimen> \epsfbox{filename.ps} | 
| 34 |  |  | %   (or | 
| 35 |  |  | %     \epsfysize=<dimen> \epsfbox{filename.ps}) | 
| 36 |  |  | %   instead. Then the width of the TeX box will be \epsfxsize and its | 
| 37 |  |  | %   height will be scaled proportionately (or the height will be | 
| 38 |  |  | %   \epsfysize and its width will be scaled proportiontally).  The | 
| 39 |  |  | %   width (and height) is restored to zero after each use. | 
| 40 |  |  | % | 
| 41 |  |  | %   A more general facility for sizing is available by defining the | 
| 42 |  |  | %   \epsfsize macro.    Normally you can redefine this macro | 
| 43 |  |  | %   to do almost anything.  The first parameter is the natural x size of | 
| 44 |  |  | %   the PostScript graphic, the second parameter is the natural y size | 
| 45 |  |  | %   of the PostScript graphic.  It must return the xsize to use, or 0 if | 
| 46 |  |  | %   natural scaling is to be used.  Common uses include: | 
| 47 |  |  | % | 
| 48 |  |  | %      \epsfxsize  % just leave the old value alone | 
| 49 |  |  | %      0pt         % use the natural sizes | 
| 50 |  |  | %      #1          % use the natural sizes | 
| 51 |  |  | %      \hsize      % scale to full width | 
| 52 |  |  | %      0.5#1       % scale to 50% of natural size | 
| 53 |  |  | %      \ifnum#1>\hsize\hsize\else#1\fi  % smaller of natural, hsize | 
| 54 |  |  | % | 
| 55 |  |  | %   If you want TeX to report the size of the figure (as a message | 
| 56 |  |  | %   on your terminal when it processes each figure), say `\epsfverbosetrue'. | 
| 57 |  |  | % | 
| 58 |  |  | \newread\epsffilein    % file to \read | 
| 59 |  |  | \newif\ifepsffileok    % continue looking for the bounding box? | 
| 60 |  |  | \newif\ifepsfbbfound   % success? | 
| 61 |  |  | \newif\ifepsfverbose   % report what you're making? | 
| 62 |  |  | \newdimen\epsfxsize    % horizontal size after scaling | 
| 63 |  |  | \newdimen\epsfysize    % vertical size after scaling | 
| 64 |  |  | \newdimen\epsftsize    % horizontal size before scaling | 
| 65 |  |  | \newdimen\epsfrsize    % vertical size before scaling | 
| 66 |  |  | \newdimen\epsftmp      % register for arithmetic manipulation | 
| 67 |  |  | \newdimen\pspoints     % conversion factor | 
| 68 |  |  | % | 
| 69 |  |  | \pspoints=1bp          % Adobe points are `big' | 
| 70 |  |  | \epsfxsize=0pt         % Default value, means `use natural size' | 
| 71 |  |  | \epsfysize=0pt         % ditto | 
| 72 |  |  | % | 
| 73 |  |  | \def\epsfbox#1{\global\def\epsfllx{72}\global\def\epsflly{72}% | 
| 74 |  |  | \global\def\epsfurx{540}\global\def\epsfury{720}% | 
| 75 |  |  | \def\lbracket{[}\def\testit{#1}\ifx\testit\lbracket | 
| 76 |  |  | \let\next=\epsfgetlitbb\else\let\next=\epsfnormal\fi\next{#1}}% | 
| 77 |  |  | % | 
| 78 |  |  | \def\epsfgetlitbb#1#2 #3 #4 #5]#6{\epsfgrab #2 #3 #4 #5 .\\% | 
| 79 |  |  | \epsfsetgraph{#6}}% | 
| 80 |  |  | % | 
| 81 |  |  | \def\epsfnormal#1{\epsfgetbb{#1}\epsfsetgraph{#1}}% | 
| 82 |  |  | % | 
| 83 |  |  | \def\epsfgetbb#1{% | 
| 84 |  |  | % | 
| 85 |  |  | %   The first thing we need to do is to open the | 
| 86 |  |  | %   PostScript file, if possible. | 
| 87 |  |  | % | 
| 88 |  |  | \openin\epsffilein=#1 | 
| 89 |  |  | \ifeof\epsffilein\errmessage{I couldn't open #1, will ignore it}\else | 
| 90 |  |  | % | 
| 91 |  |  | %   Okay, we got it. Now we'll scan lines until we find one that doesn't | 
| 92 |  |  | %   start with %. We're looking for the bounding box comment. | 
| 93 |  |  | % | 
| 94 |  |  | {\epsffileoktrue \chardef\other=12 | 
| 95 |  |  | \def\do##1{\catcode`##1=\other}\dospecials \catcode`\ =10 | 
| 96 |  |  | \loop | 
| 97 |  |  | \read\epsffilein to \epsffileline | 
| 98 |  |  | \ifeof\epsffilein\epsffileokfalse\else | 
| 99 |  |  | % | 
| 100 |  |  | %   We check to see if the first character is a % sign; | 
| 101 |  |  | %   if not, we stop reading (unless the line was entirely blank); | 
| 102 |  |  | %   if so, we look further and stop only if the line begins with | 
| 103 |  |  | %   `%%BoundingBox:'. | 
| 104 |  |  | % | 
| 105 |  |  | \expandafter\epsfaux\epsffileline:. \\% | 
| 106 |  |  | \fi | 
| 107 |  |  | \ifepsffileok\repeat | 
| 108 |  |  | \ifepsfbbfound\else | 
| 109 |  |  | \ifepsfverbose\message{No bounding box comment in #1; using defaults}\fi\fi | 
| 110 |  |  | }\closein\epsffilein\fi}% | 
| 111 |  |  | % | 
| 112 |  |  | %   Now we have to calculate the scale and offset values to use. | 
| 113 |  |  | %   First we compute the natural sizes. | 
| 114 |  |  | % | 
| 115 |  |  | \def\epsfclipstring{}% do we clip or not?  If so, | 
| 116 |  |  | \def\epsfclipon{\def\epsfclipstring{ clip}}% | 
| 117 |  |  | \def\epsfclipoff{\def\epsfclipstring{}}% | 
| 118 |  |  | % | 
| 119 |  |  | \def\epsfsetgraph#1{% | 
| 120 |  |  | \epsfrsize=\epsfury\pspoints | 
| 121 |  |  | \advance\epsfrsize by-\epsflly\pspoints | 
| 122 |  |  | \epsftsize=\epsfurx\pspoints | 
| 123 |  |  | \advance\epsftsize by-\epsfllx\pspoints | 
| 124 |  |  | % | 
| 125 |  |  | %   If `epsfxsize' is 0, we default to the natural size of the picture. | 
| 126 |  |  | %   Otherwise we scale the graph to be \epsfxsize wide. | 
| 127 |  |  | % | 
| 128 |  |  | \epsfxsize\epsfsize\epsftsize\epsfrsize | 
| 129 |  |  | \ifnum\epsfxsize=0 \ifnum\epsfysize=0 | 
| 130 |  |  | \epsfxsize=\epsftsize \epsfysize=\epsfrsize | 
| 131 |  |  | \epsfrsize=0pt | 
| 132 |  |  | % | 
| 133 |  |  | %   We have a sticky problem here:  TeX doesn't do floating point arithmetic! | 
| 134 |  |  | %   Our goal is to compute y = rx/t. The following loop does this reasonably | 
| 135 |  |  | %   fast, with an error of at most about 16 sp (about 1/4000 pt). | 
| 136 |  |  | % | 
| 137 |  |  | \else\epsftmp=\epsftsize \divide\epsftmp\epsfrsize | 
| 138 |  |  | \epsfxsize=\epsfysize \multiply\epsfxsize\epsftmp | 
| 139 |  |  | \multiply\epsftmp\epsfrsize \advance\epsftsize-\epsftmp | 
| 140 |  |  | \epsftmp=\epsfysize | 
| 141 |  |  | \loop \advance\epsftsize\epsftsize \divide\epsftmp 2 | 
| 142 |  |  | \ifnum\epsftmp>0 | 
| 143 |  |  | \ifnum\epsftsize<\epsfrsize\else | 
| 144 |  |  | \advance\epsftsize-\epsfrsize \advance\epsfxsize\epsftmp \fi | 
| 145 |  |  | \repeat | 
| 146 |  |  | \epsfrsize=0pt | 
| 147 |  |  | \fi | 
| 148 |  |  | \else \ifnum\epsfysize=0 | 
| 149 |  |  | \epsftmp=\epsfrsize \divide\epsftmp\epsftsize | 
| 150 |  |  | \epsfysize=\epsfxsize \multiply\epsfysize\epsftmp | 
| 151 |  |  | \multiply\epsftmp\epsftsize \advance\epsfrsize-\epsftmp | 
| 152 |  |  | \epsftmp=\epsfxsize | 
| 153 |  |  | \loop \advance\epsfrsize\epsfrsize \divide\epsftmp 2 | 
| 154 |  |  | \ifnum\epsftmp>0 | 
| 155 |  |  | \ifnum\epsfrsize<\epsftsize\else | 
| 156 |  |  | \advance\epsfrsize-\epsftsize \advance\epsfysize\epsftmp \fi | 
| 157 |  |  | \repeat | 
| 158 |  |  | \epsfrsize=0pt | 
| 159 |  |  | \else | 
| 160 |  |  | \epsfrsize=\epsfysize | 
| 161 |  |  | \fi | 
| 162 |  |  | \fi | 
| 163 |  |  | % | 
| 164 |  |  | %  Finally, we make the vbox and stick in a \special that dvips can parse. | 
| 165 |  |  | % | 
| 166 |  |  | \ifepsfverbose\message{#1: width=\the\epsfxsize, height=\the\epsfysize}\fi | 
| 167 |  |  | \epsftmp=10\epsfxsize \divide\epsftmp\pspoints | 
| 168 |  |  | \vbox to\epsfysize{\vfil\hbox to\epsfxsize{% | 
| 169 |  |  | \ifnum\epsfrsize=0\relax | 
| 170 |  |  | \special{PSfile=#1 llx=\epsfllx\space lly=\epsflly\space | 
| 171 |  |  | urx=\epsfurx\space ury=\epsfury\space rwi=\number\epsftmp | 
| 172 |  |  | \epsfclipstring}% | 
| 173 |  |  | \else | 
| 174 |  |  | \epsfrsize=10\epsfysize \divide\epsfrsize\pspoints | 
| 175 |  |  | \special{PSfile=#1 llx=\epsfllx\space lly=\epsflly\space | 
| 176 |  |  | urx=\epsfurx\space ury=\epsfury\space rwi=\number\epsftmp\space | 
| 177 |  |  | rhi=\number\epsfrsize \epsfclipstring}% | 
| 178 |  |  | \fi | 
| 179 |  |  | \hfil}}% | 
| 180 |  |  | \global\epsfxsize=0pt\global\epsfysize=0pt}% | 
| 181 |  |  | % | 
| 182 |  |  | %   We still need to define the tricky \epsfaux macro. This requires | 
| 183 |  |  | %   a couple of magic constants for comparison purposes. | 
| 184 |  |  | % | 
| 185 |  |  | {\catcode`\%=12 \global\let\epsfpercent=%\global\def\epsfbblit{%BoundingBox}}% | 
| 186 |  |  | % | 
| 187 |  |  | %   So we're ready to check for `%BoundingBox:' and to grab the | 
| 188 |  |  | %   values if they are found. | 
| 189 |  |  | % | 
| 190 |  |  | \long\def\epsfaux#1#2:#3\\{\ifx#1\epsfpercent | 
| 191 |  |  | \def\testit{#2}\ifx\testit\epsfbblit | 
| 192 |  |  | \epsfgrab #3 . . . \\% | 
| 193 |  |  | \epsffileokfalse | 
| 194 |  |  | \global\epsfbbfoundtrue | 
| 195 |  |  | \fi\else\ifx#1\par\else\epsffileokfalse\fi\fi}% | 
| 196 |  |  | % | 
| 197 |  |  | %   Here we grab the values and stuff them in the appropriate definitions. | 
| 198 |  |  | % | 
| 199 |  |  | \def\epsfempty{}% | 
| 200 |  |  | \def\epsfgrab #1 #2 #3 #4 #5\\{% | 
| 201 |  |  | \global\def\epsfllx{#1}\ifx\epsfllx\epsfempty | 
| 202 |  |  | \epsfgrab #2 #3 #4 #5 .\\\else | 
| 203 |  |  | \global\def\epsflly{#2}% | 
| 204 |  |  | \global\def\epsfurx{#3}\global\def\epsfury{#4}\fi}% | 
| 205 |  |  | % | 
| 206 |  |  | %   We default the epsfsize macro. | 
| 207 |  |  | % | 
| 208 |  |  | \def\epsfsize#1#2{\epsfxsize} | 
| 209 |  |  | % | 
| 210 |  |  | %   Finally, another definition for compatibility with older macros. | 
| 211 |  |  | % | 
| 212 |  |  | \let\epsffile=\epsfbox | 
| 213 |  |  |  |