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
 |