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
							 |