1%%% ==================================================================== 2%%% This file is freely redistributable and placed into the 3%%% public domain by Tomas Rokicki. 4%%% @TeX-file{ 5%%% author = "Tom Rokicki", 6%%% version = "2.7k", 7%%% date = "19 July 1997", 8%%% time = "10:00:05 MDT", 9%%% filename = "epsf.tex", 10%%% address = "Tom Rokicki 11%%% Box 2081 12%%% Stanford, CA 94309 13%%% USA", 14%%% telephone = "+1 415 855 9989", 15%%% email = "rokicki@cs.stanford.edu (Internet)", 16%%% codetable = "ISO/ASCII", 17%%% keywords = "PostScript, TeX", 18%%% supported = "yes", 19%%% abstract = "This file contains macros to support the inclusion 20%%% of Encapsulated PostScript files in TeX documents.", 21%%% docstring = "This file contains TeX macros to include an 22%%% Encapsulated PostScript graphic. It works 23%%% by finding the bounding box comment, 24%%% calculating the correct scale values, and 25%%% inserting a vbox of the appropriate size at 26%%% the current position in the TeX document. 27%%% 28%%% To use, simply say 29%%% 30%%% \input epsf % somewhere early on in your TeX file 31%%% 32%%% % then where you want to insert a vbox for a figure: 33%%% \epsfbox{filename.ps} 34%%% 35%%% Alternatively, you can supply your own 36%%% bounding box by 37%%% 38%%% \epsfbox[0 0 30 50]{filename.ps} 39%%% 40%%% This will not read in the file, and will 41%%% instead use the bounding box you specify. 42%%% 43%%% The effect will be to typeset the figure as 44%%% a TeX box, at the point of your \epsfbox 45%%% command. By default, the graphic will have 46%%% its `natural' width (namely the width of 47%%% its bounding box, as described in 48%%% filename.ps). The TeX box will have depth 49%%% zero. 50%%% 51%%% You can enlarge or reduce the figure by 52%%% saying 53%%% 54%%% \epsfxsize=<dimen> \epsfbox{filename.ps} 55%%% or 56%%% \epsfysize=<dimen> \epsfbox{filename.ps} 57%%% 58%%% instead. Then the width of the TeX box will 59%%% be \epsfxsize and its height will be scaled 60%%% proportionately (or the height will be 61%%% \epsfysize and its width will be scaled 62%%% proportionately). 63%%% 64%%% The width (and height) is restored to zero 65%%% after each use, so \epsfxsize or \epsfysize 66%%% must be specified before EACH use of 67%%% \epsfbox. 68%%% 69%%% A more general facility for sizing is 70%%% available by defining the \epsfsize macro. 71%%% Normally you can redefine this macro to do 72%%% almost anything. The first parameter is 73%%% the natural x size of the PostScript 74%%% graphic, the second parameter is the 75%%% natural y size of the PostScript graphic. 76%%% It must return the xsize to use, or 0 if 77%%% natural scaling is to be used. Common uses 78%%% include: 79%%% 80%%% \epsfxsize % just leave the old value alone 81%%% 0pt % use the natural sizes 82%%% #1 % use the natural sizes 83%%% \hsize % scale to full width 84%%% 0.5#1 % scale to 50% of natural size 85%%% \ifnum #1>\hsize\hsize\else#1\fi 86%%% % smaller of natural, hsize 87%%% 88%%% If you want TeX to report the size of the 89%%% figure (as a message on your terminal when 90%%% it processes each figure), say 91%%% `\epsfverbosetrue'. 92%%% 93%%% If you only want to get the bounding box 94%%% extents, without producing any output boxes 95%%% or \special{}, then say 96%%% \epsfgetbb{filename}. The extents will be 97%%% saved in the macros \epsfllx \epsflly 98%%% \epsfurx \epsfury in PostScript units of 99%%% big points. 100%%% 101%%% Revision history: 102%%% 103%%% --------------------------------------------- 104%%% epsf.tex macro file: 105%%% Originally written by Tomas Rokicki of 106%%% Radical Eye Software, 29 Mar 1989. 107%%% 108%%% --------------------------------------------- 109%%% Revised by Don Knuth, 3 Jan 1990. 110%%% 111%%% --------------------------------------------- 112%%% Revised by Tomas Rokicki, 18 Jul 1990. 113%%% Accept bounding boxes with no space after 114%%% the colon. 115%%% 116%%% --------------------------------------------- 117%%% Revised by Nelson H. F. Beebe 118%%% <beebe@math.utah.edu>, 03 Dec 1991 [2.0]. 119%%% Add version number and date typeout. 120%%% 121%%% Use \immediate\write16 instead of \message 122%%% to ensure output on new line. 123%%% 124%%% Handle nested EPS files. 125%%% 126%%% Handle %%BoundingBox: (atend) lines. 127%%% 128%%% Do not quit when blank lines are found. 129%%% 130%%% Add a few percents to remove generation of 131%%% spurious blank space. 132%%% 133%%% Move \special output to 134%%% \epsfspecial{filename} so that other macro 135%%% packages can input this one, then change 136%%% the definition of \epsfspecial to match 137%%% another DVI driver. 138%%% 139%%% Move size computation to \epsfsetsize which 140%%% can be called by the user; the verbose 141%%% output of the bounding box and scaled width 142%%% and height happens here. 143%%% 144%%% --------------------------------------------- 145%%% Revised by Nelson H. F. Beebe 146%%% <beebe@math.utah.edu>, 05 May 1992 [2.1]. 147%%% Wrap \leavevmode\hbox{} around \vbox{} with 148%%% the \special so that \epsffile{} can be 149%%% used inside \begin{center}...\end{center} 150%%% 151%%% --------------------------------------------- 152%%% Revised by Nelson H. F. Beebe 153%%% <beebe@math.utah.edu>, 09 Dec 1992 [2.2]. 154%%% Introduce \epsfshow{true,false} and 155%%% \epsfframe{true,false} macros; the latter 156%%% suppresses the insertion of the PostScript, 157%%% and instead just creates an empty box, 158%%% which may be handy for rapid prototyping. 159%%% 160%%% --------------------------------------------- 161%%% Revised by Nelson H. F. Beebe 162%%% <beebe@math.utah.edu>, 14 Dec 1992 [2.3]. 163%%% Add \epsfshowfilename{true,false}. When 164%%% true, and \epsfshowfalse is specified, the 165%%% PostScript file name will be displayed 166%%% centered in the figure box. 167%%% 168%%% --------------------------------------------- 169%%% Revised by Nelson H. F. Beebe 170%%% <beebe@math.utah.edu>, 20 June 1993 [2.4]. 171%%% Remove non-zero debug setting of \epsfframemargin, 172%%% and change margin handling to preserve EPS image 173%%% size and aspect ratio, so that the actual 174%%% box is \epsfxsize+\epsfframemargin wide by 175%%% \epsfysize+\epsfframemargin high. 176%%% Reduce output of \epsfshowfilenametrue to 177%%% just the bare file name. 178%%% 179%%% --------------------------------------------- 180%%% Revised by Nelson H. F. Beebe 181%%% <beebe@math.utah.edu>, 13 July 1993 [2.5]. 182%%% Add \epsfframethickness for control of 183%%% \epsfframe frame lines. 184%%% 185%%% --------------------------------------------- 186%%% Revised by Nelson H. F. Beebe 187%%% <beebe@math.utah.edu>, 02 July 1996 [2.6] 188%%% Add missing initialization \epsfatendfalse; 189%%% the lack of this resulted in the wrong 190%%% BoundingBox being picked up, mea culpa, sigh... 191%%% --------------------------------------------- 192%%% 193%%% --------------------------------------------- 194%%% Revised by Nelson H. F. Beebe 195%%% <beebe@math.utah.edu>, 25 October 1996 [2.7] 196%%% Update to match changes in from dvips 5-600 197%%% distribution: new user-accessible macros: 198%%% \epsfclipon, \epsfclipoff, \epsfdrafton, 199%%% \epsfdraftoff, change \empty to \epsfempty. 200%%% --------------------------------------------- 201%%% 202%%% Modified to avoid verbosity, give help. 203%%% --kb@cs.umb.edu, for Texinfo. 204%%% } 205%%% ==================================================================== 206% 207\ifx\epsfannounce\undefined \def\epsfannounce{\immediate\write16}\fi 208 \epsfannounce{This is `epsf.tex' v2.7k <10 July 1997>}% 209% 210\newread\epsffilein % file to \read 211\newif\ifepsfatend % need to scan to LAST %%BoundingBox comment? 212\newif\ifepsfbbfound % success? 213\newif\ifepsfdraft % use draft mode? 214\newif\ifepsffileok % continue looking for the bounding box? 215\newif\ifepsfframe % frame the bounding box? 216\newif\ifepsfshow % show PostScript file, or just bounding box? 217\epsfshowtrue % default is to display PostScript file 218\newif\ifepsfshowfilename % show the file name if \epsfshowfalse specified? 219\newif\ifepsfverbose % report what you're making? 220\newdimen\epsfframemargin % margin between box and frame 221\newdimen\epsfframethickness % thickness of frame rules 222\newdimen\epsfrsize % vertical size before scaling 223\newdimen\epsftmp % register for arithmetic manipulation 224\newdimen\epsftsize % horizontal size before scaling 225\newdimen\epsfxsize % horizontal size after scaling 226\newdimen\epsfysize % vertical size after scaling 227\newdimen\pspoints % conversion factor 228% 229\pspoints = 1bp % Adobe points are `big' 230\epsfxsize = 0pt % default value, means `use natural size' 231\epsfysize = 0pt % ditto 232\epsfframemargin = 0pt % default value: frame box flush around picture 233\epsfframethickness = 0.4pt % TeX's default rule thickness 234% 235\def\epsfbox#1{\global\def\epsfllx{72}\global\def\epsflly{72}% 236 \global\def\epsfurx{540}\global\def\epsfury{720}% 237 \def\lbracket{[}\def\testit{#1}\ifx\testit\lbracket 238 \let\next=\epsfgetlitbb\else\let\next=\epsfnormal\fi\next{#1}}% 239% 240% We use \epsfgetlitbb if the user specified an explicit bounding box, 241% and \epsfnormal otherwise. Because \epsfgetbb can be called 242% separately to retrieve the bounding box, we move the verbose 243% printing the bounding box extents and size on the terminal to 244% \epsfstatus. Therefore, when the user provided the bounding box, 245% \epsfgetbb will not be called, so we must call \epsfsetsize and 246% \epsfstatus ourselves. 247% 248\def\epsfgetlitbb#1#2 #3 #4 #5]#6{% 249 \epsfgrab #2 #3 #4 #5 .\\% 250 \epsfsetsize 251 \epsfstatus{#6}% 252 \epsfsetgraph{#6}% 253}% 254% 255\def\epsfnormal#1{% 256 \epsfgetbb{#1}% 257 \epsfsetgraph{#1}% 258}% 259% 260\newhelp\epsfnoopenhelp{The PostScript image file must be findable by 261TeX, i.e., somewhere in the TEXINPUTS (or equivalent) path.}% 262% 263\def\epsfgetbb#1{% 264% 265% The first thing we need to do is to open the 266% PostScript file, if possible. 267% 268 \openin\epsffilein=#1 269 \ifeof\epsffilein 270 \errhelp = \epsfnoopenhelp 271 \errmessage{Could not open file #1, ignoring it}% 272 \else %process the file 273 {% %start a group to contain catcode changes 274 % Make all special characters, except space, to be of type 275 % `other' so we process the file in almost verbatim mode 276 % (TeXbook, p. 344). 277 \chardef\other=12 278 \def\do##1{\catcode`##1=\other}% 279 \dospecials 280 \catcode`\ =10 281 \epsffileoktrue %true while we are looping 282 \epsfatendfalse %[02-Jul-1996]: add forgotten initialization 283 \loop %reading lines from the EPS file 284 \read\epsffilein to \epsffileline 285 \ifeof\epsffilein %then no more input 286 \epsffileokfalse %so set completion flag 287 \else %otherwise process one line 288 \expandafter\epsfaux\epsffileline:. \\% 289 \fi 290 \ifepsffileok 291 \repeat 292 \ifepsfbbfound 293 \else 294 \ifepsfverbose 295 \immediate\write16{No BoundingBox comment found in % 296 file #1; using defaults}% 297 \fi 298 \fi 299 }% %end catcode changes 300 \closein\epsffilein 301 \fi %end of file processing 302 \epsfsetsize %compute size parameters 303 \epsfstatus{#1}% 304}% 305% 306% Clipping control: 307\def\epsfclipon{\def\epsfclipstring{ clip}}% 308\def\epsfclipoff{\def\epsfclipstring{\ifepsfdraft\space clip\fi}}% 309\epsfclipoff % default for dvips is OFF 310% 311% The special that is emitted by \epsfsetgraph comes from this macro. 312% It is defined separately to allow easy customization by other 313% packages that first \input epsf.tex, then redefine \epsfspecial. 314% This macro is invoked in the lower-left corner of a box of the 315% width and height determined from the arguments to \epsffile, or 316% from the %%BoundingBox in the EPS file itself. 317% 318% This version is for dvips: 319\def\epsfspecial#1{% 320 \epsftmp=10\epsfxsize 321 \divide\epsftmp\pspoints 322 \ifnum\epsfrsize=0\relax 323 \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space 324 llx=\epsfllx\space 325 lly=\epsflly\space 326 urx=\epsfurx\space 327 ury=\epsfury\space 328 rwi=\number\epsftmp 329 \epsfclipstring 330 }% 331 \else 332 \epsfrsize=10\epsfysize 333 \divide\epsfrsize\pspoints 334 \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space 335 llx=\epsfllx\space 336 lly=\epsflly\space 337 urx=\epsfurx\space 338 ury=\epsfury\space 339 rwi=\number\epsftmp\space 340 rhi=\number\epsfrsize 341 \epsfclipstring 342 }% 343 \fi 344}% 345% 346% \epsfframe macro adapted from the TeXbook, exercise 21.3, p. 223, 331. 347% but modified to set the box width to the natural width, rather 348% than the line width, and to include space for margins and rules 349\def\epsfframe#1% 350{% 351 \leavevmode % so we can put this inside 352 % a centered environment 353 \setbox0 = \hbox{#1}% 354 \dimen0 = \wd0 % natural width of argument 355 \advance \dimen0 by 2\epsfframemargin % plus width of 2 margins 356 \advance \dimen0 by 2\epsfframethickness % plus width of 2 rule lines 357 \vbox 358 {% 359 \hrule height \epsfframethickness depth 0pt 360 \hbox to \dimen0 361 {% 362 \hss 363 \vrule width \epsfframethickness 364 \kern \epsfframemargin 365 \vbox {\kern \epsfframemargin \box0 \kern \epsfframemargin }% 366 \kern \epsfframemargin 367 \vrule width \epsfframethickness 368 \hss 369 }% end hbox 370 \hrule height 0pt depth \epsfframethickness 371 }% end vbox 372}% 373% 374\def\epsfsetgraph#1% 375{% 376 % 377 % Make the vbox and stick in a \special that the DVI driver can 378 % parse. \vfil and \hfil are used to place the \special origin at 379 % the lower-left corner of the vbox. \epsfspecial can be redefined 380 % to produce alternate \special syntaxes. 381 % 382 \leavevmode 383 \hbox{% so we can put this in \begin{center}...\end{center} 384 \ifepsfframe\expandafter\epsfframe\fi 385 {\vbox to\epsfysize 386 {% 387 \ifepsfshow 388 % output \special{} at lower-left corner of figure box 389 \vfil 390 \hbox to \epsfxsize{\epsfspecial{#1}\hfil}% 391 \else 392 \vfil 393 \hbox to\epsfxsize{% 394 \hss 395 \ifepsfshowfilename 396 {% 397 \epsfframemargin=3pt % local change of margin 398 \epsfframe{{\tt #1}}% 399 }% 400 \fi 401 \hss 402 }% 403 \vfil 404 \fi 405 }% 406 }}% 407 % 408 % Reset \epsfxsize and \epsfysize, as documented above. 409 % 410 \global\epsfxsize=0pt 411 \global\epsfysize=0pt 412}% 413% 414% Now we have to calculate the scale and offset values to use. 415% First we compute the natural sizes. 416% 417\def\epsfsetsize 418{% 419 \epsfrsize=\epsfury\pspoints 420 \advance\epsfrsize by-\epsflly\pspoints 421 \epsftsize=\epsfurx\pspoints 422 \advance\epsftsize by-\epsfllx\pspoints 423% 424% If `epsfxsize' is 0, we default to the natural size of the picture. 425% Otherwise we scale the graph to be \epsfxsize wide. 426% 427 \epsfxsize=\epsfsize{\epsftsize}{\epsfrsize}% 428 \ifnum \epsfxsize=0 429 \ifnum \epsfysize=0 430 \epsfxsize=\epsftsize 431 \epsfysize=\epsfrsize 432 \epsfrsize=0pt 433% 434% We have a sticky problem here: TeX doesn't do floating point arithmetic! 435% Our goal is to compute y = rx/t. The following loop does this reasonably 436% fast, with an error of at most about 16 sp (about 1/4000 pt). 437% 438 \else 439 \epsftmp=\epsftsize \divide\epsftmp\epsfrsize 440 \epsfxsize=\epsfysize \multiply\epsfxsize\epsftmp 441 \multiply\epsftmp\epsfrsize \advance\epsftsize-\epsftmp 442 \epsftmp=\epsfysize 443 \loop \advance\epsftsize\epsftsize \divide\epsftmp 2 444 \ifnum \epsftmp>0 445 \ifnum \epsftsize<\epsfrsize 446 \else 447 \advance\epsftsize-\epsfrsize \advance\epsfxsize\epsftmp 448 \fi 449 \repeat 450 \epsfrsize=0pt 451 \fi 452 \else 453 \ifnum \epsfysize=0 454 \epsftmp=\epsfrsize \divide\epsftmp\epsftsize 455 \epsfysize=\epsfxsize \multiply\epsfysize\epsftmp 456 \multiply\epsftmp\epsftsize \advance\epsfrsize-\epsftmp 457 \epsftmp=\epsfxsize 458 \loop \advance\epsfrsize\epsfrsize \divide\epsftmp 2 459 \ifnum \epsftmp>0 460 \ifnum \epsfrsize<\epsftsize 461 \else 462 \advance\epsfrsize-\epsftsize \advance\epsfysize\epsftmp 463 \fi 464 \repeat 465 \epsfrsize=0pt 466 \else 467 \epsfrsize=\epsfysize 468 \fi 469 \fi 470}% 471% 472% Issue some status messages if the user requested them 473% 474\def\epsfstatus#1{% arg = filename 475 \ifepsfverbose 476 \immediate\write16{#1: BoundingBox: 477 llx = \epsfllx\space lly = \epsflly\space 478 urx = \epsfurx\space ury = \epsfury\space}% 479 \immediate\write16{#1: scaled width = \the\epsfxsize\space 480 scaled height = \the\epsfysize}% 481 \fi 482}% 483% 484% We still need to define the tricky \epsfaux macro. This requires 485% a couple of magic constants for comparison purposes. 486% 487{\catcode`\%=12 \global\let\epsfpercent=%\global\def\epsfbblit{%BoundingBox}}% 488\global\def\epsfatend{(atend)}% 489% 490% So we're ready to check for `%BoundingBox:' and to grab the 491% values if they are found. 492% 493% If we find a line 494% 495% %%BoundingBox: (atend) 496% 497% then we ignore it, but set a flag to force parsing all of the 498% file, so the last %%BoundingBox parsed will be the one used. This 499% is necessary, because EPS files can themselves contain other EPS 500% files with their own %%BoundingBox comments. 501% 502% If we find a line 503% 504% %%BoundingBox: llx lly urx ury 505% 506% then we save the 4 values in \epsfllx, \epsflly, \epsfurx, \epsfury. 507% Then, if we have not previously parsed an (atend), we flag completion 508% and can stop reading the file. Otherwise, we must keep on reading 509% to end of file so that we find the values on the LAST %%BoundingBox. 510\long\def\epsfaux#1#2:#3\\% 511{% 512 \def\testit{#2}% % save second character up to just before colon 513 \ifx#1\epsfpercent % then first char is percent (quick test) 514 \ifx\testit\epsfbblit % then (slow test) we have %%BoundingBox 515 \epsfgrab #3 . . . \\% 516 \ifx\epsfllx\epsfatend % then ignore %%BoundingBox: (atend) 517 \global\epsfatendtrue 518 \else % else found %%BoundingBox: llx lly urx ury 519 \ifepsfatend % then keep parsing ALL %%BoundingBox lines 520 \else % else stop after first one parsed 521 \epsffileokfalse 522 \fi 523 \global\epsfbbfoundtrue 524 \fi 525 \fi 526 \fi 527}% 528% 529% Here we grab the values and stuff them in the appropriate definitions. 530% 531\def\epsfempty{}% 532\def\epsfgrab #1 #2 #3 #4 #5\\{% 533 \global\def\epsfllx{#1}\ifx\epsfllx\epsfempty 534 \epsfgrab #2 #3 #4 #5 .\\\else 535 \global\def\epsflly{#2}% 536 \global\def\epsfurx{#3}\global\def\epsfury{#4}\fi 537}% 538% 539% We default the epsfsize macro. 540% 541\def\epsfsize#1#2{\epsfxsize}% 542% 543% Finally, another definition for compatibility with older macros. 544% 545\let\epsffile=\epsfbox 546\endinput 547 548