%-------------------------------------------------------------------------- % This is small extension of T. Rokicki's EPSF.TEX (from DVIPS 5.58): % -- allows safe including of EPS files generated by DVIPS % -- can also display bounding boxes. %-------------------------------------------------------------------------- % AUTHORS: Bogus\l{}aw Jackowski and Piotr Pianowski % BOP s.c. % ul. Piastowska 70, 80-363 Gda\'nsk, Poland % email: B.Jackowski@GUST.org.pl % USAGE: % \eps{file.eps} % instead of \epsffile{file.eps} % The following settings of the parameter \tracingeps are recognized: % \tracingeps=0 % default, no extra information displayed % \tracingeps=1 % displays bounding boxes and file names % \tracingeps>1 % displays graphics, bounding boxes and file names % HISTORY: % ver. 0.5 19 VIII 1994 % ver. 0.51 25 VIII 1994 % * \epsnamecolor added % ver. 0.52 31 VIII 1994 % * \eps renamed to \epsraw % * \tps renamed to \eps % ver. 0.53 9 I 1995 % * `\isls false N' added to \eps % * virtually active slash neutralized % ver. 0.54 9 III 1995 % * \eps clears bop-hook % ver. 0.55 27 III 1995 % * a patch neutralizing unnecessary rounding added % ver. 0.56 3 X 1995 % * \special commands surrounding EPS box are to be nested in the \vbox % ver. 0.57 31 VIII 1996 % * odd characters in names enabled % ver. 0.58 21 III 1997 % * setpageparams and setpage neutralized % ver. 0.585 25 III 1997 % * comments touched % ver. 0.59 7 VI 1998 % * EPSF.TEX included % ver. 0.60 10 I 1999 % * safe multiplication of eps dimensions by 10 (expected to be % included in the newest version of Rokicki's package) % ver. 0.61 29 III 2000 % * \eps expands to \hbox % ver. 0.62 13 (Friday) VII 2001 % * setpagedevice neutralized (why only now?) along with a bundle of % commands specifying paper size (a0, a1, ... , b0, b1, ... , etc.) %-------------------------------------------------------------------------- \edef\slashcatcode{\the\catcode`\/} \catcode`\/12 % %%%%%%%%%%%%%%%%%%%%%%%%%%% \input epsf -- inserted below %%%%%%%%%%%%%%%%% % 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= \epsfbox{filename.ps} % (or % \epsfysize= \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? \newif\ifepsfdraft % use draft mode? \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\epsfclipon{\def\epsfclipstring{ clip}}% \def\epsfclipoff{\def\epsfclipstring{\ifepsfdraft\space clip\fi}}% \epsfclipoff % \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 \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\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 \epsfrsize=0pt \fi \else \ifnum\epsfysize=0 \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 \epsfrsize=0pt \else \epsfrsize=\epsfysize \fi \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{% \ifnum\epsfrsize=0\relax \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space llx=\epsfllx\space lly=\epsflly\space urx=\epsfurx\space ury=\epsfury\space rwi=\number\epsftmp \epsfclipstring}% \else \epsfrsize=10\epsfysize \divide\epsfrsize\pspoints \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space llx=\epsfllx\space lly=\epsflly\space urx=\epsfurx\space ury=\epsfury\space rwi=\number\epsftmp\space rhi=\number\epsfrsize \epsfclipstring}% \fi \hfil}}% \global\epsfxsize=0pt\global\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\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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% End of EPSF %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % --- \newcount\tracingeps \tracingeps0 % --- \newbox\tmpepsbox % --- \ifx\epsdirundefined\epsdir\def\epsdir{}\fi \def\epsnamecolor{1 0 0} % --- % BOTH \eps and \epsraw ``normalize'' the eps name, as one may wish % to use \epsraw separately % --- \def\epsraw{\begingroup\escapechar-1\catcode`\%12\def~{\string~}\epsrawcont} \def\epsrawcont#1{% \xdef\theepsname{\expandafter\string\csname#1\endcsname}\endgroup \ifnum\tracingeps=0 \hbox{\epsffile{\epsdir\theepsname}}\fi \ifnum\tracingeps>0 \hbox{\setbox\tmpepsbox\hbox{\epsffile{\epsdir\theepsname}}% \ifnum\tracingeps>1 \rlap{\copy\tmpepsbox}\fi \vbox{\offinterlineskip \hrule\vskip-.4pt \hbox to\wd\tmpepsbox{\vrule\hss\vbox to\ht\tmpepsbox{ \vss\hbox{\tt \special{ps:gsave \epsnamecolor\space setrgbcolor}% \theepsname\special{ps:grestore}}\vss}\hss\vrule} \vskip-.4pt\hrule }}\fi} % --- \def\eps{\hbox\bgroup \begingroup \escapechar-1 \catcode`\%12 \def~{\string~}\epscont} \def\epscont#1{% \xdef\theepsname{\expandafter\string\csname#1\endcsname}\endgroup \vbox{\special{ps: /SItps save N /isls false N statusdict begin /setpageparams {pop pop pop pop} def /setpage {pop pop pop} def end userdict begin /bop-hook {} def /setpagedevice {pop} def /a0 {} def /a1 {} def /a2 {} def /a3 {} def /a4 {} def /a5 {} def /a6 {} def /a7 {} def /a8 {} def /a9 {} def /a10 {} def /b0 {} def /b1 {} def /b2 {} def /b3 {} def /b4 {} def /b5 {} def /letter {} def /note {} def /legal {} def /halfletter {} def /11x17 {} def /ledger {} def /flsa {} def /flse {} def end }% \epsraw\theepsname\special{ps: SItps restore }}\egroup} % --- % Redefinition of epsf macros: % % The values of `rwi' and `rhi' parameters are to be given in tenths % of big point; the older version of the epsf package used to multiply % a dimen register by 10, which put severe limitations on the % available EPS size. % % The macro `\decimalshift' multiplies a given value by 10 ``syntactically,'' % i.e., accomplishes ``decimal shifting''; the following conditions % are assumed to hold: % * leading zeros are meaningless; % * + is a proper form of a dimen value; % * the command `\the' applied to a dimen register yields a canonical form: % []+[+] % where are `p' and `t' characters having category code 12. % \def\decimalshift#1{% #1 -- a dimen register \expandafter\expandafter\expandafter \decimalsplit\expandafter\gobblePT\the#1.\relax }% \def\decimalsplit#1.#2\relax{% \ifnum#1=0 \ifdim#11sp=-1sp -\fi \else #1\fi \ifdim0#2sp=0sp 0\else \fractionshift#2\fi }% \def\fractionshift#1#2.{\ifnum0#2=0 #1\else #1.#2\fi}% {\catcode`\p12 \catcode`\t12 \gdef\gobblePT#1pt{#1}}% \def\pttobp{0.99626401}% = 72/72.27 % --- \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 \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\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 \epsfrsize=0pt \fi \else \ifnum\epsfysize=0 \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 \epsfrsize=0pt \else \epsfrsize=\epsfysize \fi \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=\pttobp\epsfxsize \vbox to\epsfysize{\vfil\hbox to\epsfxsize{% \ifnum\epsfrsize=0\relax \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space llx=\epsfllx\space lly=\epsflly\space urx=\epsfurx\space ury=\epsfury\space rwi=\decimalshift\epsftmp \epsfclipstring}% \else \epsfrsize=\pttobp\epsfysize \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space llx=\epsfllx\space lly=\epsflly\space urx=\epsfurx\space ury=\epsfury\space rwi=\decimalshift\epsftmp\space rhi=\decimalshift\epsfrsize \epsfclipstring}% \fi \hfil}}% \global\epsfxsize=0pt\global\epsfysize=0pt}% % --- \catcode`\/\slashcatcode % --- \endinput