|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 11788 (0x2e0c) Types: TextFile Names: »psfig.tex«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12 └─⟦af5ba6c8e⟧ »unix3.0/DVIWARE.tar.Z« └─⟦ca79c7339⟧ └─⟦this⟧ »DVIware/laser-setters/dvi-to-ps/TeXPS/psfig/psfig.tex«
% psfig Package GENERAL PUBLIC LICENSE % 17 Nov 1988 % This file is part of the TeXPS Software Package. % The TeXPS Software Package is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY. No author or distributor % accepts responsibility to anyone for the consequences of using it % or for whether it serves any particular purpose or works at all, % unless he says so in writing. Refer to the TeXPS Software Package % General Public License for full details. % Everyone is granted permission to copy, modify and redistribute % the TeXPS Software Package, but only under the conditions described in the % TeXPS Software Package General Public License. A copy of this license is % supposed to have been given to you along with TeXPS Software Package so you % can know your rights and responsibilities. It should be in a % file named CopyrightLong. Among other things, the copyright notice % and this notice must be preserved on all copies. */ \catcode`\@=11 % % Changes done by Stephan Bechtolsheim: % 1. Comments and indentation improved. % 2. The \special which instructs the driver, is specified here. % 3. Instead of numerical counter and dimension registers % symbolic register names are used. % 4. scale parameter of \psfig introduced. % \def\@SpecialCodeDriver{dvitps: } % \newcount\psfc@a \newcount\psfc@b \newcount\psfc@c \newcount\psfc@d \newcount\psfc@e \newcount\psfc@f \newcount\psfc@g \newcount\psfc@h \newcount\psfc@i \newcount\psfc@j \newcount\psscale@count \newtoks\psfigtoks@ % A dimension register for temporarily storing a dimension in % \@pDimenToSpNumber. \newdimen\psfig@dimen % \newwrite\@unused \def\typeout#1{{\let\protect\string\immediate\write\@unused{#1}}} % Identifying message is here. \typeout{psfig/tex 1.4 / TeXPS} % % @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}} % \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 \newif\if@noisy \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@scale \newif\if@verbose \def\@p@@sclip#1{\@cliptrue} \def\@p@@sfile#1{% %\typeout{file is #1} \def\@p@sfile{#1}% } \def\@p@@sfigure#1{% \def\@p@sfile{#1}% } % \@pDimenToSpNumber % ================== % Convert a dimension into scaled points. % #1: the name of macro which will expand to the dimension in % scaled points, without the unit 'sp' though, i.e. as a pure % integer. % #2: the dimension (not a dimension register, use % \the if dimension is stored in a dimension register). \def\@pDimenToSpNumber #1#2{% \psfig@dimen = #2\relax \edef#1{\number\psfig@dimen}% } \def\@p@@sbbllx#1{% %\typeout{bbllx is #1} \@bbllxtrue \@pDimenToSpNumber{\@p@sbbllx}{#1}% } \def\@p@@sbblly#1{% %\typeout{bblly is #1} \@bbllytrue \@pDimenToSpNumber{\@p@sbblly}{#1}% } \def\@p@@sbburx#1{% %\typeout{bburx is #1} \@bburxtrue \@pDimenToSpNumber{\@p@sbburx}{#1}% } \def\@p@@sbbury#1{% %\typeout{bbury is #1} \@bburytrue \@pDimenToSpNumber{\@p@sbbury}{#1}% } \def\@p@@sheight#1{ \@heighttrue \@pDimenToSpNumber{\@p@sheight}{#1}% %\typeout{Height is \@p@sheight} } \def\@p@@swidth#1{% %\typeout{Width is #1} \@widthtrue \@pDimenToSpNumber{\@p@swidth}{#1}% } \def\@p@@srheight#1{ %\typeout{Reserved height is #1} \@rheighttrue \@pDimenToSpNumber{\@p@srheight}{#1}% } \def\@p@@srwidth#1{ %\typeout{Reserved width is #1} \@rwidthtrue \@pDimenToSpNumber{\@p@srwidth}{#1}% } \def\@p@@ssilent#1{% \@verbosefalse } \def\@p@@sscale #1{% \def\@p@scale{#1}% \@scaletrue } \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. % \def\ps@init@parms{ \@bbllxfalse \@bbllyfalse \@bburxfalse \@bburyfalse \@heightfalse \@widthfalse \@rheightfalse \@rwidthfalse \@scalefalse \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 \newif\ifnot@eof \newread\ps@stream \def\bb@missing{% \if@verbose \typeout{psfig: searching \@p@sfile \space for bounding box}% \fi \openin\ps@stream=\@p@sfile \no@bbtrue \not@eoftrue \catcode`\%=12 \ifeof\ps@stream \errmessage{FATAL ERROR: cannot open \@p@sfile} \fi \loop \read\ps@stream to \line@in \global\psfigtoks@=\expandafter{\line@in} \ifeof\ps@stream \not@eoffalse \fi %\typeout{ looking at :: \the\psfigtoks@ } \@bbtest{\psfigtoks@} \if@bbmatch\not@eoffalse\expandafter\bb@cull\the\psfigtoks@\fi \ifnot@eof \repeat \catcode`\%=14 } \newif\if@bbmatch % '% ' becomes a regular character for a very short time. { \catcode`\%=12 \gdef\@bbtest#1{\expandafter\@a@\the#1%%BoundingBox:\@bbtest\@a@} \global\long\def\@a@#1%%BoundingBox:#2#3\@a@{\ifx\@bbtest#2\@bbmatchfalse\else\@bbmatchtrue\fi} } \long\def\bb@cull#1 #2 #3 #4 #5 { \@pDimenToSpNumber{\@p@sbbllx}{#2bp}% \@pDimenToSpNumber{\@p@sbblly}{#3bp}% \@pDimenToSpNumber{\@p@sbburx}{#4bp}% \@pDimenToSpNumber{\@p@sbbury}{#5bp}% \no@bbfalse } % Compute \@bbw and \@bbh, the width and height of the % bounding box. \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 \errmessage{\string\compute@bb: FATAL ERROR: no bounding box supplied (in \string\psfig) or found (in PostScript file).} \fi % Now compute the size of the bounding box. \psfc@c=\@p@sbburx \psfc@b=\@p@sbbury \advance\psfc@c by -\@p@sbbllx \advance\psfc@b by -\@p@sbblly \edef\@bbw{\number\psfc@c} \edef\@bbh{\number\psfc@b} %\typeout{\string\compute@bb: 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{% \psfc@g=#2 \psfc@d=#3 \psfc@a=\psfc@g % First digit #2/#3. \divide\psfc@a by \psfc@d \psfc@f=\psfc@a \multiply\psfc@f by \psfc@d \advance\psfc@g by -\psfc@f \multiply\psfc@g by 10 \psfc@f=\psfc@g % Second digit of #2/#3. \divide\psfc@f by \psfc@d \psfc@j=\psfc@f \multiply\psfc@j by \psfc@d \advance\psfc@g by -\psfc@j \multiply\psfc@g by 10 \psfc@j=\psfc@g % Third digit. \divide\psfc@j by \psfc@d \psfc@h=#1\psfc@i=0 \psfc@e=\psfc@h \multiply\psfc@e by \psfc@a \advance\psfc@i by \psfc@e \psfc@e=\psfc@h \divide\psfc@e by 10 \multiply\psfc@e by \psfc@f \advance\psfc@i by \psfc@e % \psfc@e=\psfc@h \divide\psfc@e by 100 \multiply\psfc@e by \psfc@j \advance\psfc@i by \psfc@e % \edef\@result{\number\psfc@i} } % Scale a value #1 by the current scaling factor and reassign the new % scaled value. \def\@ScaleInHundreds #1{% \in@hundreds{#1}{\@p@scale}{100}% \edef#1{\@result}% } % % % Compute width from height. \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} } % Compute height from width. \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} } % Compute height and width, i.e. \@p@sheight and \@p@swidth. \def\compute@handw{ % If height is given. \if@height % If width is given \if@width \else % Height, no width: compute width. \compute@wfromh \fi \else % No height. \if@width % Width is given, no height though: compute it. \compute@hfromw \else % Neither width no height is give. \edef\@p@sheight{\@bbh} \edef\@p@swidth{\@bbw} \fi \fi } % Compute the amount of space to reserve. Unless defined % using rheight and rwidth when \psfig is called, these values % default to \@p@sheight and \@p@swidth. \def\compute@resv{ \if@rheight \else \edef\@p@srheight{\@p@sheight} \fi \if@rwidth \else \edef\@p@srwidth{\@p@swidth} \fi } % % % \psfig % ====== % usage: \psfig{file=, height=, width=, bbllx=, bblly=, bburx=, bbury=, % rheight=, rwidth=, clip=, scale=} % % "clip=" is a switch and takes no value, but the `=' must be present. \def\psfig#1{% \vbox {% \ps@init@parms \parse@ps@parms{#1} % Compute any missing sizes. \compute@bb \compute@handw \compute@resv \if@scale \if@verbose \typeout{psfig: scaling by \@p@scale}% \fi % We now scale the width and height as reported to the PS printer. \@ScaleInHundreds{\@p@swidth}% \@ScaleInHundreds{\@p@sheight}% \@ScaleInHundreds{\@p@srwidth}% \@ScaleInHundreds{\@p@srheight}% \fi % \ifnum\@p@scost<\@psdraft \if@verbose \typeout{psfig: including \@p@sfile \space} \fi % Cause "psfig.pro" to be included during pass0 processing of % the driver. \special{\@SpecialCodeDriver Include0 "psfig.pro"} % Now generate the instruction to include the figure. \special{% \@SpecialCodeDriver Literal "\@p@swidth \space \@p@sheight \space \@p@sbbllx \space \@p@sbblly \space \@p@sbburx \space \@p@sbbury \space startTexFig \space"} % If clipping you may generate a message now. \if@clip \if@verbose \typeout{(clip)} \fi \special{\@SpecialCodeDriver Literal "doclip \space"} \fi \if@prologfile \special{\@SpecialCodeDriver Include0 "\@prologfileval"} \fi \special{\@SpecialCodeDriver Include1 "\@p@sfile"} \if@postlogfile \special{\@SpecialCodeDriver Include0 "\@postlogfileval"} \fi \special{\@SpecialCodeDriver Literal "endTexFig \space" } % End of \special generation. % Create a vbox to reserve the proper amount of space for the figure. \vbox to \@p@srheight true sp{ \hbox to \@p@srwidth true sp{} \vss } \else % Draft modus: reserve the space for the figure and print the % path name. \vbox to \@p@srheight true sp{ \hbox to \@p@srwidth true sp{% \if@verbose \@p@sfile \fi } \vss } \fi } } \catcode`\@=12