HaRe-0.6: tools/interp/HaskellWorkshop/psfig.tex
% Psfig/TeX Release 1.3
% dvips version
%
% All software, documentation, and related files in this distribution of
% psfig/tex are Copyright 1987, 1988 Trevor J. Darrell
%
% Permission is granted for use and non-profit distribution of psfig/tex
% providing that this notice be clearly maintained, but the right to
% distribute any portion of psfig/tex for profit or as part of any commercial
% product is specifically reserved for the author.
%
% $Header: /cvs/programatica/tools/interp/HaskellWorkshop/psfig.tex,v 1.1 2001/04/25 23:52:51 wlh Exp $
% $Source: /cvs/programatica/tools/interp/HaskellWorkshop/psfig.tex,v $
%
% Thanks to Greg Hager (GDH) and Ned Batchelder for their contributions
% to this project.
%
% Modified by J. Daniel Smith on 9 October 1990 to accept the
% %%BoundingBox: comment with or without a space after the colon. Stole
% file reading code from Tom Rokicki's EPSF.TEX file (see below).
%
% from a suggestion by eijkhout@csrd.uiuc.edu to allow
% loading as a style file:
\edef\psfigRestoreAt{\catcode`@=\number\catcode`@\relax}
\catcode`\@=11\relax
\newwrite\@unused
\def\typeout#1{{\let\protect\string\immediate\write\@unused{#1}}}
\typeout{psfig/tex 1.4-dvips}
%% Here's how you define your figure path. Should be set up with null
%% default and a user useable definition.
\def\figurepath{./}
\def\psfigurepath#1{\edef\figurepath{#1}}
%
% @psdo control structure -- similar to Latex @for.
% I redefined these with different names so that psfig can
% be used with TeX as well as LaTeX, and so that it will not
% be vunerable to future changes in LaTeX's internal
% control structure,
%
\def\@nnil{\@nil}
\def\@empty{}
\def\@psdonoop#1\@@#2#3{}
\def\@psdo#1:=#2\do#3{\edef\@psdotmp{#2}\ifx\@psdotmp\@empty \else
\expandafter\@psdoloop#2,\@nil,\@nil\@@#1{#3}\fi}
\def\@psdoloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
#5\def#4{#2}\ifx #4\@nnil \else#5\@ipsdoloop #3\@@#4{#5}\fi\fi}
\def\@ipsdoloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
\let\@nextwhile=\@psdonoop \else
#4\relax\let\@nextwhile=\@ipsdoloop\fi\@nextwhile#2\@@#3{#4}}
\def\@tpsdo#1:=#2\do#3{\xdef\@psdotmp{#2}\ifx\@psdotmp\@empty \else
\@tpsdoloop#2\@nil\@nil\@@#1{#3}\fi}
\def\@tpsdoloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
\let\@nextwhile=\@psdonoop \else
#4\relax\let\@nextwhile=\@tpsdoloop\fi\@nextwhile#2\@@#3{#4}}
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% file reading stuff from epsf.tex
% 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.
% Portions modified/removed for use in PSFIG package by
% J. Daniel Smith, 9 October 1990.
%
\newread\ps@stream
\newif\ifnot@eof % continue looking for the bounding box?
\newif\if@noisy % report what you're making?
\newif\if@atend % %%BoundingBox: has (at end) specification
\newif\if@psfile % does this look like a PostScript file?
%
% PostScript files should start with `%!'
%
{\catcode`\%=12\global\gdef\epsf@start{%!}}
\def\epsf@PS{PS}
%
\def\epsf@getbb#1{%
%
% The first thing we need to do is to open the
% PostScript file, if possible.
%
\openin\ps@stream=#1
\ifeof\ps@stream\typeout{Error, File #1 not found}\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.
%
{\not@eoftrue \chardef\other=12
\def\do##1{\catcode`##1=\other}\dospecials \catcode`\ =10
\loop
\if@psfile
\read\ps@stream to \epsf@fileline
\else{
\obeyspaces
\read\ps@stream to \epsf@tmp\global\let\epsf@fileline\epsf@tmp}
\fi
\ifeof\ps@stream\not@eoffalse\else
%
% Check the first line for `%!'. Issue a warning message if its not
% there, since the file might not be a PostScript file.
%
\if@psfile\else
\expandafter\epsf@test\epsf@fileline:. \\%
\fi
%
% We check to see if the first character is a % sign;
% if so, we look further and stop only if the line begins with
% `%%BoundingBox:' and the `(atend)' specification was not found.
% That is, the only way to stop is when the end of file is reached,
% or a `%%BoundingBox: llx lly urx ury' line is found.
%
\expandafter\epsf@aux\epsf@fileline:. \\%
\fi
\ifnot@eof\repeat
}\closein\ps@stream\fi}%
%
% This tests if the file we are reading looks like a PostScript file.
%
\long\def\epsf@test#1#2#3:#4\\{\def\epsf@testit{#1#2}
\ifx\epsf@testit\epsf@start\else
\typeout{Warning! File does not start with `\epsf@start'. It may not be a PostScript file.}
\fi
\@psfiletrue} % don't test after 1st line
%
% We still need to define the tricky \epsf@aux macro. This requires
% a couple of magic constants for comparison purposes.
%
{\catcode`\%=12\global\let\epsf@percent=%\global\def\epsf@bblit{%BoundingBox}}
%
%
% So we're ready to check for `%BoundingBox:' and to grab the
% values if they are found. We continue searching if `(at end)'
% was found after the `%BoundingBox:'.
%
\long\def\epsf@aux#1#2:#3\\{\ifx#1\epsf@percent
\def\epsf@testit{#2}\ifx\epsf@testit\epsf@bblit
\@atendfalse
\epsf@atend #3 . \\%
\if@atend
\if@verbose{
\typeout{psfig: found `(atend)'; continuing search}
}\fi
\else
\epsf@grab #3 . . . \\%
\not@eoffalse
\global\no@bbfalse
\fi
\fi\fi}%
%
% Here we grab the values and stuff them in the appropriate definitions.
%
\def\epsf@grab #1 #2 #3 #4 #5\\{%
\global\def\epsf@llx{#1}\ifx\epsf@llx\empty
\epsf@grab #2 #3 #4 #5 .\\\else
\global\def\epsf@lly{#2}%
\global\def\epsf@urx{#3}\global\def\epsf@ury{#4}\fi}%
%
% Determine if the stuff following the %%BoundingBox is `(atend)'
% J. Daniel Smith. Copied from \epsf@grab above.
%
\def\epsf@atendlit{(atend)}
\def\epsf@atend #1 #2 #3\\{%
\def\epsf@tmp{#1}\ifx\epsf@tmp\empty
\epsf@atend #2 #3 .\\\else
\ifx\epsf@tmp\epsf@atendlit\@atendtrue\fi\fi}
% End of file reading stuff from epsf.tex
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\psdraft{
\def\@psdraft{0}
%\typeout{draft level now is \@psdraft \space . }
}
\def\psfull{
\def\@psdraft{100}
%\typeout{draft level now is \@psdraft \space . }
}
\psfull
\newif\if@prologfile
\newif\if@postlogfile
\def\pssilent{
\@noisyfalse
}
\def\psnoisy{
\@noisytrue
}
\psnoisy
%%% These are for the option list.
%%% A specification of the form a = b maps to calling \@p@@sa{b}
\newif\if@bbllx
\newif\if@bblly
\newif\if@bburx
\newif\if@bbury
\newif\if@height
\newif\if@width
\newif\if@rheight
\newif\if@rwidth
\newif\if@clip
\newif\if@verbose
\def\@p@@sclip#1{\@cliptrue}
%%% GDH 7/26/87 -- changed so that it first looks in the local directory,
%%% then in a specified global directory for the ps file.
\def\@p@@sfile#1{\def\@p@sfile{null}%
\openin1=#1
\ifeof1\closein1%
\openin1=\figurepath#1
\ifeof1\typeout{Error, File #1 not found}
\else\closein1
\edef\@p@sfile{\figurepath#1}%
\fi%
\else\closein1%
\def\@p@sfile{#1}%
\fi}
\def\@p@@sfigure#1{\def\@p@sfile{null}%
\openin1=#1
\ifeof1\closein1%
\openin1=\figurepath#1
\ifeof1\typeout{Error, File #1 not found}
\else\closein1
\def\@p@sfile{\figurepath#1}%
\fi%
\else\closein1%
\def\@p@sfile{#1}%
\fi}
\def\@p@@sbbllx#1{
%\typeout{bbllx is #1}
\@bbllxtrue
\dimen100=#1
\edef\@p@sbbllx{\number\dimen100}
}
\def\@p@@sbblly#1{
%\typeout{bblly is #1}
\@bbllytrue
\dimen100=#1
\edef\@p@sbblly{\number\dimen100}
}
\def\@p@@sbburx#1{
%\typeout{bburx is #1}
\@bburxtrue
\dimen100=#1
\edef\@p@sbburx{\number\dimen100}
}
\def\@p@@sbbury#1{
%\typeout{bbury is #1}
\@bburytrue
\dimen100=#1
\edef\@p@sbbury{\number\dimen100}
}
\def\@p@@sheight#1{
\@heighttrue
\dimen100=#1
\edef\@p@sheight{\number\dimen100}
%\typeout{Height is \@p@sheight}
}
\def\@p@@swidth#1{
%\typeout{Width is #1}
\@widthtrue
\dimen100=#1
\edef\@p@swidth{\number\dimen100}
}
\def\@p@@srheight#1{
%\typeout{Reserved height is #1}
\@rheighttrue
\dimen100=#1
\edef\@p@srheight{\number\dimen100}
}
\def\@p@@srwidth#1{
%\typeout{Reserved width is #1}
\@rwidthtrue
\dimen100=#1
\edef\@p@srwidth{\number\dimen100}
}
\def\@p@@ssilent#1{
\@verbosefalse
}
\def\@p@@sprolog#1{\@prologfiletrue\def\@prologfileval{#1}}
\def\@p@@spostlog#1{\@postlogfiletrue\def\@postlogfileval{#1}}
\def\@cs@name#1{\csname #1\endcsname}
\def\@setparms#1=#2,{\@cs@name{@p@@s#1}{#2}}
%
% initialize the defaults (size the size of the figure)
%
\def\ps@init@parms{
\@bbllxfalse \@bbllyfalse
\@bburxfalse \@bburyfalse
\@heightfalse \@widthfalse
\@rheightfalse \@rwidthfalse
\def\@p@sbbllx{}\def\@p@sbblly{}
\def\@p@sbburx{}\def\@p@sbbury{}
\def\@p@sheight{}\def\@p@swidth{}
\def\@p@srheight{}\def\@p@srwidth{}
\def\@p@sfile{}
\def\@p@scost{10}
\def\@sc{}
\@prologfilefalse
\@postlogfilefalse
\@clipfalse
\if@noisy
\@verbosetrue
\else
\@verbosefalse
\fi
}
%
% Go through the options setting things up.
%
\def\parse@ps@parms#1{
\@psdo\@psfiga:=#1\do
{\expandafter\@setparms\@psfiga,}}
%
% Compute bb height and width
%
\newif\ifno@bb
\def\bb@missing{
\if@verbose{
\typeout{psfig: searching \@p@sfile \space for bounding box}
}\fi
\no@bbtrue
\epsf@getbb{\@p@sfile}
\ifno@bb \else \bb@cull\epsf@llx\epsf@lly\epsf@urx\epsf@ury\fi
}
\def\bb@cull#1#2#3#4{
\dimen100=#1 bp\edef\@p@sbbllx{\number\dimen100}
\dimen100=#2 bp\edef\@p@sbblly{\number\dimen100}
\dimen100=#3 bp\edef\@p@sbburx{\number\dimen100}
\dimen100=#4 bp\edef\@p@sbbury{\number\dimen100}
\no@bbfalse
}
\def\compute@bb{
\no@bbfalse
\if@bbllx \else \no@bbtrue \fi
\if@bblly \else \no@bbtrue \fi
\if@bburx \else \no@bbtrue \fi
\if@bbury \else \no@bbtrue \fi
\ifno@bb \bb@missing \fi
\ifno@bb \typeout{FATAL ERROR: no bb supplied or found}
\no-bb-error
\fi
%
\count203=\@p@sbburx
\count204=\@p@sbbury
\advance\count203 by -\@p@sbbllx
\advance\count204 by -\@p@sbblly
\edef\@bbw{\number\count203}
\edef\@bbh{\number\count204}
%\typeout{ bbh = \@bbh, bbw = \@bbw }
}
%
% \in@hundreds performs #1 * (#2 / #3) correct to the hundreds,
% then leaves the result in @result
%
\def\in@hundreds#1#2#3{\count240=#2 \count241=#3
\count100=\count240 % 100 is first digit #2/#3
\divide\count100 by \count241
\count101=\count100
\multiply\count101 by \count241
\advance\count240 by -\count101
\multiply\count240 by 10
\count101=\count240 %101 is second digit of #2/#3
\divide\count101 by \count241
\count102=\count101
\multiply\count102 by \count241
\advance\count240 by -\count102
\multiply\count240 by 10
\count102=\count240 % 102 is the third digit
\divide\count102 by \count241
\count200=#1\count205=0
\count201=\count200
\multiply\count201 by \count100
\advance\count205 by \count201
\count201=\count200
\divide\count201 by 10
\multiply\count201 by \count101
\advance\count205 by \count201
%
\count201=\count200
\divide\count201 by 100
\multiply\count201 by \count102
\advance\count205 by \count201
%
\edef\@result{\number\count205}
}
\def\compute@wfromh{
% computing : width = height * (bbw / bbh)
\in@hundreds{\@p@sheight}{\@bbw}{\@bbh}
%\typeout{ \@p@sheight * \@bbw / \@bbh, = \@result }
\edef\@p@swidth{\@result}
%\typeout{w from h: width is \@p@swidth}
}
\def\compute@hfromw{
% computing : height = width * (bbh / bbw)
\in@hundreds{\@p@swidth}{\@bbh}{\@bbw}
%\typeout{ \@p@swidth * \@bbh / \@bbw = \@result }
\edef\@p@sheight{\@result}
%\typeout{h from w : height is \@p@sheight}
}
\def\compute@handw{
\if@height
\if@width
\else
\compute@wfromh
\fi
\else
\if@width
\compute@hfromw
\else
\edef\@p@sheight{\@bbh}
\edef\@p@swidth{\@bbw}
\fi
\fi
}
\def\compute@resv{
\if@rheight \else \edef\@p@srheight{\@p@sheight} \fi
\if@rwidth \else \edef\@p@srwidth{\@p@swidth} \fi
}
%
% Compute any missing values
\def\compute@sizes{
\compute@bb
\compute@handw
\compute@resv
}
%
% \psfig
% usage : \psfig{file=, height=, width=, bbllx=, bblly=, bburx=, bbury=,
% rheight=, rwidth=, clip=}
%
% "clip=" is a switch and takes no value, but the `=' must be present.
\def\psfig#1{\vbox {
% do a zero width hard space so that a single
% \psfig in a centering enviornment will behave nicely
%{\setbox0=\hbox{\ }\ \hskip-\wd0}
%
\ps@init@parms
\parse@ps@parms{#1}
\compute@sizes
%
\ifnum\@p@scost<\@psdraft{
\if@verbose{
\typeout{psfig: including \@p@sfile \space }
}\fi
%
\special{ps::[begin] \@p@swidth \space \@p@sheight \space
\@p@sbbllx \space \@p@sbblly \space
\@p@sbburx \space \@p@sbbury \space
startTexFig \space }
\if@clip{
\if@verbose{
\typeout{(clip)}
}\fi
\special{ps:: doclip \space }
}\fi
\if@prologfile
\special{ps: plotfile \@prologfileval \space } \fi
\special{ps: plotfile \@p@sfile \space }
\if@postlogfile
\special{ps: plotfile \@postlogfileval \space } \fi
\special{ps::[end] endTexFig \space }
% Create the vbox to reserve the space for the figure
\vbox to \@p@srheight true sp{
\hbox to \@p@srwidth true sp{
\hss
}
\vss
}
}\else{
% draft figure, just reserve the space and print the
% path name.
\vbox to \@p@srheight true sp{
\vss
\hbox to \@p@srwidth true sp{
\hss
\if@verbose{
\@p@sfile
}\fi
\hss
}
\vss
}
}\fi
}}
\def\psglobal{\typeout{psfig: PSGLOBAL is OBSOLETE; use psprint -m instead}}
\psfigRestoreAt