You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
5.2 KiB
138 lines
5.2 KiB
% 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=<dimen> \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
|