%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% BoxedEPS.tex FOR FIGURE INSERTS OF EPSF NORM %%%%% %%%%% (EPSF = Encapsulated PostScript File) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%% AUTHOR: Laurent Siebenmann %% lcs@matups.matups.fr %% %%% VERSIONS: Feb 1991 -- October, 1992 %% %%% SOMMAIRE: BoxedEPS.tex d\'efinit des macro-commandes %% qui permettent d'int\'egrer dans un document TeX des %% objets graphiques d\'ecrits par fichier de norme EPSF, %% tout en accordant a chacun le statut d'une bo\^ite TeX ayant %% les bonnes dimensions. La (seule!) contribution unique %% de ce fichier est de faire cela d'une fa{\c}con universelle. %% C'est a dire de fa{\c}con \`a pouvoir commod\'ement %% servir avec tout pilote d'imprimante de norme %% PostScript --- malgr\'e l'absence d'une norme %% pour \special. %% %%% POSTINGS: anonymous ftp %% --- ftp 130.84.128.100 (alias rsovax.circe.fr); %% login: anonymous; password: ; directory %% [anonymous.siebenmann]. This is the master copy in 1992. %% %% --- ftp 129.69.1.12 (alias rusinfo.rus.uni-stuttgart.de); %% login: anonymous; password: ; %% directory hints .../tex/graphics/... %% %%%% DOCUMENTATION: %% --- see BoxedEPS.doc %% %%%% ACTIVATION: %% by a driver-by-driver protocol %% see \SetTexturesEPSFSpecial %% and its companions below. %% \ifx\MYUNDEFINED\BoxedEPSF \let\temp\relax \else \message{} \message{ !!! BoxedEPS % or BoxedArt macros already defined !!!} \let\temp\endinput \fi \temp \chardef\EPSFCatAt\the\catcode`\@ \catcode`\@=11 \chardef\C@tColon\the\catcode`\: \chardef\C@tSemicolon\the\catcode`\; \chardef\C@tQmark\the\catcode`\? \chardef\C@tEmark\the\catcode`\! \chardef\C@tDqt\the\catcode`\" \def\PunctOther@{\catcode`\:=12 \catcode`\;=12 \catcode`\?=12 \catcode`\!=12 \catcode`\"=12} \PunctOther@ %%temporarily suppress Plain's logging of allocations \let\wlog@ld\wlog \def\wlog#1{\relax} %% New for TOOLS \newif\ifIN@ \newdimen\XShift@ \newdimen\YShift@ \newtoks\Realtoks %%% New for Boxed EPSF % \newdimen\Wd@ \newdimen\Ht@ \newdimen\Wd@@ \newdimen\Ht@@ % \newdimen\TT@ \newdimen\LT@ \newdimen\BT@ \newdimen\RT@ % \newdimen\XSlide@ \newdimen\YSlide@ % \newdimen\TheScale %% secretly scale in mils: 1pt= 1mil \newdimen\FigScale %% secretly scale in mils: 1pt= 1mil % \newdimen\ForcedDim@@ \newtoks\EPSFDirectorytoks@ \newtoks\EPSFNametoks@ \newtoks\BdBoxtoks@ \newtoks\LLXtoks@ %% useful info for Oz \newtoks\LLYtoks@ \newif\ifNotIn@ \newif\ifForcedDim@ \newif\ifForceOn@ \newif\ifForcedHeight@ \newif\ifPSOrigin \newread\EPSFile@ %%%% MESSAGES (separate macro needed for Europe) %% \def\ms@g{\immediate\write16} %%%% WORD-PROCESSING MACROS %% %%% \IN@0#1@#2@ : Is 1st exp of #1 in 1st exp of #2 ?? %% Answer in \ifIN@ \newif\ifIN@\def\IN@{\expandafter\INN@\expandafter} \long\def\INN@0#1@#2@{\long\def\NI@##1#1##2##3\ENDNI@ {\ifx\m@rker##2\IN@false\else\IN@true\fi}% \expandafter\NI@#2@@#1\m@rker\ENDNI@} \def\m@rker{\m@@rker} %%% \SPLIT@0#1@#2@ : Split 1st exp of #2 at 1st exp of #1 %% \Initialtoks@ , \Terminaltoks@ will contain pieces \newtoks\Initialtoks@ \newtoks\Terminaltoks@ \def\SPLIT@{\expandafter\SPLITT@\expandafter} \def\SPLITT@0#1@#2@{\def\TTILPS@##1#1##2@{% \Initialtoks@{##1}\Terminaltoks@{##2}}\expandafter\TTILPS@#2@} %%%% MACROS TO TRIM \ForeTrim@0#1@ and \Trim@0#1@ %% result appears in \Trimtoks@ %% LIMITATION: assume no multiple spaces to trim \newtoks\Trimtoks@ %%% \ForeTrim@0#1@ trims initial space of first erpansion of #1 %% #1 of form \the\toks0 or \mymacro \def\ForeTrim@{\expandafter\ForeTrim@@\expandafter} \def\ForePrim@0 #1@{\Trimtoks@{#1}} \def\ForeTrim@@0#1@{\IN@0\m@rker. @\m@rker.#1@% \ifIN@\ForePrim@0#1@% \else\Trimtoks@\expandafter{#1}\fi} %%\m@rker expands here to \m@@rker since spot initial, %% so no confusuion with \m@rker %%% \Trim@0#1@ trims init and terminal spaces %% Same syntax. %% Warns if internal spaces found. %% \def\Trim@0#1@{% \ForeTrim@0#1@% \IN@0 @\the\Trimtoks@ @% \ifIN@ \SPLIT@0 @\the\Trimtoks@ @\Trimtoks@\Initialtoks@ \IN@0\the\Terminaltoks@ @ @% \ifIN@ \else \Trimtoks@ {FigNameWithSpace}% \fi \fi } %%%% MATH MACROS (provisional) %% use dimen registers for reals; unit 1pt %% (numerical dimension arguments OK unless contrary noted) %%%% One needs the point token seq (pt with cat 12) USES dimen 0 \newtoks\pt@ks \def \getpt@ks 0.0#1@{\pt@ks{#1}} \dimen0=0pt\relax\expandafter\getpt@ks\the\dimen0@ %%% Convert dimen to "decimal multiplier"% USES dimens 0,2 \newtoks\Realtoks% the output! \def\Real#1{% \dimen2=#1% \SPLIT@0\the\pt@ks @\the\dimen2@%% lop off the points \Realtoks=\Initialtoks@%\showthe\Realtoks } %%% Multiplication % USES dimens 0,2,4,6; preserves args; output \Product \newdimen\Product \def\Mult#1#2{% \dimen4=#1\relax \dimen6=#2% \Real{\dimen4}% \Product=\the\Realtoks\dimen6% } %%% Inverse % USES dimens 0; preserves arg; output \Inverse \newdimen\Inverse \newdimen\hmxdim@ \hmxdim@=8192pt%halfmaxdimen \def\Invert#1{% \Inverse=\hmxdim@ \dimen0=#1% \divide\Inverse \dimen0% \multiply\Inverse 8} %%% \Rescale#1#2#3 % USES dimens 0,2,4,6 %% alters dimen register #1 by ratio #2/#3 %% where #2,#3 can be raw dimensions OR dimen registers \def\Rescale#1#2#3{% Adequate accuracy. Can improve. \divide #1 by 100\relax \dimen2=#3\divide\dimen2 by 100 \Invert{\dimen2}% \Mult{#1}{#2}% \Mult\Product\Inverse #1=\Product} %%% \Scale#1 scales dimen register #1 % by dimen register real \TheScale; USES dimens 0 \def\Scale#1{\dimen0=\TheScale % \divide #1 by 1280 %% 1280*5120*10=1000*2^16 \divide \dimen0 by 5120 % \multiply#1 by \dimen0 \divide#1 by 10 %% max size of #1 about 32000/10 pt } %%% SCRUNCHING BOXES AND SHIFTING CONTENTS %% TeX has to do this in general %% since some drivers do not let %% one do it readily using Postscript \newbox\scrunchbox %%% \Scrunched#1 puts #1 in an hbox %% then in effect zeros the dimensions of this box \def\Scrunched#1{{\setbox\scrunchbox\hbox{#1}% \wd\scrunchbox=0pt \ht\scrunchbox=0pt \dp\scrunchbox=0pt \box\scrunchbox}} %%% \Shifted@#1 puts #1 in \hbox %% then locates basepoint to bottom left corner %% then translates ink only by \XShift@,\YShift@ %% with Postscript convention %% For simplicity use only on scrunched boxes %\newdimen\XShift@ %\newdimen\YShift@ \def\Shifted@#1{% \vbox {\kern-\YShift@ \hbox {\kern\XShift@\hbox{#1}\kern-\XShift@}% \kern\YShift@}} %%% \cBoxedEPSF#1 the main macro %% component macros are explained in order below \def\cBoxedEPSF#1{{\leavevmode %% double brace for amstex \allign, \alligned, ... \ReadNameAndScale@{#1}% \SetEPSFSpec@ \ReadEPSFile@ \ReadBdB@x %% Calculations \TrimFigDims@ \CalculateFigScale@ \ScaleFigDims@ \SetInkShift@ \hbox{$\mathsurround=0pt\relax \vcenter{\hbox{% \FrameSpider{\hskip-.4pt\vrule}% \vbox to \Ht@{\offinterlineskip\parindent=\z@% \FrameSpider{\vskip-.4pt\hrule}\vfil \hbox to \Wd@{\hfil}% \vfil \InkShift@{\EPSFSpecial{\EPSFSpec@}{\FigSc@leReal}}% \FrameSpider{\hrule\vskip-.4pt}}% \FrameSpider{\vrule\hskip-.4pt}}}% $}% \CleanRegisters@ \ms@g{ *** Box composed for the % EPSF file \the\EPSFNametoks@}% }} \def\tBoxedEPSF#1{\setbox4\hbox{\cBoxedEPSF{#1}}% \setbox4\hbox{\raise -\ht4 \hbox{\box4}}% \box4 } \def\bBoxedEPSF#1{\setbox4\hbox{\cBoxedEPSF{#1}}% \setbox4\hbox{\raise \dp4 \hbox{\box4}}% \box4 } \let\BoxedEPSF\cBoxedEPSF% default setting %% Some compatibility with BoxedArt.tex % \let\BoxedArt\BoxedEPSF %% Some compatibility with Sweet-teX % \def\gLinefigure[#1scaled#2]_#3{% \BoxedEPSF{#3 scaled #2}} %% Some compatibility with Rokicki's dvips % \let\EPSFbox\bBoxedEPSF \let\EPSFfile\bBoxedEPSF \def\EPSFxsize{\afterassignment\ForceW@\ForcedDim@@} \def\ForceW@{\ForcedDim@true\ForcedHeight@false} \def\EPSFysize{\afterassignment\ForceH@\ForcedDim@@} \def\ForceH@{\ForcedDim@true\ForcedHeight@true} \def\EmulateRokicki{% \let\epsfbox\bBoxedEPSF \let\epsffile\bBoxedEPSF \let\epsfxsize\EPSFxsize \let\epsfysize\EPSFysize} %%% \ReadNameAndScale@#1 % \def\ReadNameAndScale@#1{\IN@0 scaled@#1@% DOUBLE BARRELED \ifIN@\ReadNameAndScale@@0#1@% \else \ReadNameAndScale@@0#1 scaled\DefaultMilScale @% \fi} \def\ReadNameAndScale@@0#1scaled#2@{% HELPER MACRO \let\OldBackslash@\\% \def\\{\OtherB@ckslash}% \edef\temp@{#1}% \Trim@0\temp@ @% \EPSFNametoks@\expandafter{\the\Trimtoks@ }% \FigScale=#2 pt% \let\\\OldBackslash@ } \def\SetDefaultEPSFScale#1{% \global\def\DefaultMilScale{#1}} \SetDefaultEPSFScale{1000} %%% \ReadEPSFile@ % \def \SetBogusBbox@{% \global\BdBoxtoks@{ BoundingBox:0 0 100 100 }% \global\def\BdBoxLine@{ BoundingBox:0 0 100 100 }% \ms@g{ !!! Will use placeholder !!!}% } {\catcode`\%=12\gdef\P@S@{%!}} %% %! min sign of PS file \def\ReadEPSFile@{%\show\EPSFSpec@% \openin\EPSFile@\EPSFSpec@ \relax %necessary to prevent precocious expansion of \ifeof \ifeof\EPSFile@ \ms@g{}% \ms@g{ !!! EPS FILE \the\EPSFDirectorytoks@ \the\EPSFNametoks@\space WAS NOT FOUND !!!}% \SetBogusBbox@ \else%\fi \begingroup%% \catcode`\%=12\catcode`\:=12\catcode`\!=12 \catcode`\G=14\catcode`\\=14\relax% 14 is comment \global\read\EPSFile@ to \BdBoxLine@%\show\BdBoxLine@ \IN@0\P@S@ @\BdBoxLine@ @% \ifIN@ %% %! accepted as %!PS so do BdBox search!! \NotIn@true \loop \ifeof\EPSFile@\NotIn@false \ms@g{}% \ms@g{ !!! BoundingBox NOT FOUND IN % \the\EPSFDirectorytoks@\the\EPSFNametoks@\space!!! }% \SetBogusBbox@ \else\global\read\EPSFile@ to \BdBoxLine@ %\show\BdBoxLine@ \fi \global\BdBoxtoks@\expandafter{\BdBoxLine@}% \IN@0BoundingBox:@\the\BdBoxtoks@ @% \ifIN@\NotIn@false\fi% \ifNotIn@\repeat \else \ms@g{}% \ms@g{ !!! \the\EPSFNametoks@\space not PS!\space !!!}% \SetBogusBbox@ \fi \endgroup\relax \fi \closein\EPSFile@ } %%% \ReadBdB@x % Rmk For simplicity 0 not used in syntax % of \ReadBdB@x@, \ReadBdB@x@@ \def\ReadBdB@x{% PART 0 \expandafter\ReadBdB@x@\the\BdBoxtoks@ @} \def\ReadBdB@x@#1BoundingBox:#2@{% PART 1 \ForeTrim@0#2@% \IN@0atend@\the\Trimtoks@ @% \ifIN@\Trimtoks@={0 0 100 100 }% \ms@g{}% \ms@g{ !!! BoundingBox not found in % \the\EPSFDirectorytoks@\the\EPSFNametoks@\space !!!}% \ms@g{ !!! It must not be at end of EPSF !!!}% \ms@g{ !!! Will use placeholder !!!}% \fi%% cf \SetBogusBbox@ \expandafter\ReadBdB@x@@\the\Trimtoks@ @% } \def\ReadBdB@x@@#1 #2 #3 #4@{% PART 2 \Wd@=#3bp\advance\Wd@ by -#1bp% \Ht@=#4bp\advance\Ht@ by-#2bp% \Wd@@=\Wd@ \Ht@@=\Ht@ %% useful info for Clark \LLXtoks@={#1}\LLYtoks@={#2}%% useful info for Oz \ifPSOrigin\XShift@=-#1bp\YShift@=-#2bp\fi } %%% \SetEPSFDirectory % \def\G@bbl@#1{} \bgroup \global\edef\OtherB@ckslash{\expandafter\G@bbl@\string\\} \egroup \def\SetEPSFDirectory{% Part 1 \bgroup\PunctOther@\relax \let\\\OtherB@ckslash \SetEPSFDirectory@} \def\SetEPSFDirectory@#1{% Part 2 \edef\temp@{#1}% \Trim@0\temp@ @% result in \Trimtoks@ \global\toks1\expandafter{\the\Trimtoks@ }\relax \egroup \EPSFDirectorytoks@=\toks1 } %%% \SetEPSFSpec@ \def\SetEPSFSpec@{% \bgroup \let\\=\OtherB@ckslash \global\edef\EPSFSpec@{% \the\EPSFDirectorytoks@\the\EPSFNametoks@}% \global\edef\EPSFSpec@{\EPSFSpec@}% \egroup} %%% \TrimFigDims@ % \def\TrimTop#1{\advance\TT@ by #1} \def\TrimLeft#1{\advance\LT@ by #1} \def\TrimBottom#1{\advance\BT@ by #1} \def\TrimRight#1{\advance\RT@ by #1} \def\TrimBoundingBox#1{% \TrimTop{#1}% \TrimLeft{#1}% \TrimBottom{#1}% \TrimRight{#1}% } \def\TrimFigDims@{% \advance\Wd@ by -\LT@ \advance\Wd@ by -\RT@ \RT@=\z@ \advance\Ht@ by -\TT@ \TT@=\z@ \advance\Ht@ by -\BT@ } %%% \CalculateFigScale@ % \def\ForceWidth#1{\ForcedDim@true \ForcedDim@@#1\ForcedHeight@false} \def\ForceHeight#1{\ForcedDim@true \ForcedDim@@=#1\ForcedHeight@true} \def\ForceOn{\ForceOn@true} \def\ForceOff{\ForceOn@false\ForcedDim@false} \def\CalculateFigScale@{% %Have default \FigScale or read \FigScale \ifForcedDim@\FigScale=1000pt% %% start afresh \ifForcedHeight@ \Rescale\FigScale\ForcedDim@@\Ht@ \else \Rescale\FigScale\ForcedDim@@\Wd@ \fi \fi \Real{\FigScale}% \edef\FigSc@leReal{\the\Realtoks}% } \def\ScaleFigDims@{\TheScale=\FigScale \ifForcedDim@ \ifForcedHeight@ \Ht@=\ForcedDim@@ \Scale\Wd@ \else \Wd@=\ForcedDim@@ \Scale\Ht@ \fi \else \Scale\Wd@\Scale\Ht@ \fi \ifForceOn@\relax\else\global\ForcedDim@false\fi \Scale\LT@\Scale\BT@ %%%\Scale\Wd@\Scale\Ht@ \Scale\XShift@\Scale\YShift@ } %%% \ShowReservedBoxes %% shows (prints) corrected scaled and positioned %% bounding boxes; for diagnostics %%% \HideReservedBoxes makes them invisible again %% \def\HideReservedBoxes{\global\def\FrameSpider##1{\null}} \def\ShowReservedBoxes{\global\def\FrameSpider##1{##1}} \let\HideDisplacementBoxes\HideReservedBoxes %% some synonyms \let\ShowDisplacementBoxes\ShowReservedBoxes \let\HideFigureFrames\HideReservedBoxes \let\ShowFigureFrames\ShowReservedBoxes \ShowDisplacementBoxes %%% \hSlide#1, \vSlide#1 %% \def\hSlide#1{\advance\XSlide@ by #1} \def\vSlide#1{\advance\YSlide@ by #1} %%% \SetInkShift@, \InkShift@#1 %% \def\SetInkShift@{% \advance\XShift@ by -\LT@ \advance\XShift@ by \XSlide@ \advance\YShift@ by -\BT@ \advance\YShift@ by -\YSlide@ } % \def\InkShift@#1{\Shifted@{\Scrunched{#1}}} %%% \CleanRegisters@ % \def\CleanRegisters@{% \globaldefs=1\relax \XShift@=\z@\YShift@=\z@\XSlide@=\z@\YSlide@=\z@ \TT@=\z@\LT@=\z@\BT@=\z@\RT@=\z@ \globaldefs=0\relax} %%% Special syntax for several drivers. The macros %%\SetTexturesEPSFSpecial %% Textures %% \SetUnixCoopEPSFSpecial %% dvi2ps early unix %% \SetBechtolsheimDVI2PSEPSFSpecial and %% \SetBechtolsheimDVITPSEPSFSpecial %% by S.P.Bechtolsheim %% \SetLisEPSFSpecial %% dvi2ps by Tony Lis %% \SetRokickiEPSFSpecial %% dvips by Tom Rokicki %% --- also for DVIReader, in DirectTeX by W. Ricken %% \SetOzTeXEPSFSpecial %% OzTeX (>=1.42) by Andrew Trevorrow %% \SetPSprintEPSFSpecial %% PSprint by Andrew Trevorrow %% --- also for OzTeX versions <= 1.41 !! %% \SetArborEPSFSpecial %% ArborTeX DVILASER/PS %% \SetClarkEPSFSpecial %% dvitops by James Clark %% \SetDVIPSoneEPSFSpecial %% DVIPSONE of Y&Y %% \SetBeebeEPSFSpecial %% DVIALW by N. Beebe %% \SetNorthlakeEPSFSpecial %% Northlake Software %% \SetStandardEPSFSpecial %% Nonexistant: Placebo below %% Many drivers supported roughly %% by (re-)defining the macro \EPSFSpecial#1#2, where %% #1 = EPS file pathname (use \\ for the letter backslash) %% #2 = scale in mils %% Be wary of using strange characters in pathnames! %% Textures, Blue Sky Research, Barry Smith \def\SetTexturesEPSFSpecial{\PSOriginfalse%\PSOrigintrue \gdef\EPSFSpecial##1##2{\relax \edef\specialthis{##2}% \SPLIT@0.@\specialthis.@\relax \special{illustration ##1 scaled \the\Initialtoks@}}} %% Unix : dvi2ps by: Mark Senn, Stephan Bechtolsheim, % Bob Brown, Richard, Furuta, James Schaad, Robert Wells, % Norm Hutchinson, Neal Holt, Scott Jones, Howard Trickey. % Introduced by B. Horn \def\SetUnixCoopEPSFSpecial{\PSOrigintrue % Please test! \gdef\EPSFSpecial##1##2{% \dimen4=##2pt% convert real to dimen \divide\dimen4 by 1000\relax \Real{\dimen4}%dimens 0,2 used here \edef\Aux@{\the\Realtoks}% %%convert dimen to real \special{psfile=##1\space hscale=\Aux@\space vscale=\Aux@}}} %% dvi2ps and dvitps by S.P. Bechtolsheim, % Introduced by B. Horn and Carl.M.Jones, % testing by R. Evans % Note that a prolog file psfig.pro % specific to the driver should be available. \def\SetBechtolsheimEPSFSpecial@{%% tool macro only \PSOrigintrue \special{\DriverTag@ Include0 "psfig.pro"}% \gdef\EPSFSpecial##1##2{% \dimen4=##2pt %% convert real to dimen \divide\dimen4 by 1000\relax \Real{\dimen4} %% dimens 0,2 used here \edef\Aux@{\the\Realtoks}%% convert dimen to real \special{\DriverTag@ Literal "10 10 0 0 10 10 startTexFig \the\mag\space 1000 div 3.25 neg mul \the\mag\space 1000 div .25 neg mul translate %% correction \the\mag\space 1000 div \Aux@\space mul \the\mag\space 1000 div \Aux@\space mul scale "}% \special{\DriverTag@ Include1 "##1"}% \special{\DriverTag@ Literal "endTexFig "}% }} %% dvi2ps and dvitps by S.P. Bechtolsheim, % Introduced by B. Horn and Carl.M.Jones, % testing by R. Evans % Note that a prolog file psfig.pro % specific to the driver should be available. \def\SetBechtolsheimEPSFSpecial@{%% tool macro only \PSOrigintrue \special{\DriverTag@ Include0 "psfig.pro"}% \gdef\EPSFSpecial##1##2{% \dimen4=##2pt %% convert real to dimen \divide\dimen4 by 1000\relax \Real{\dimen4} %% dimens 0,2 used here \edef\Aux@{\the\Realtoks}%% convert dimen to real \special{\DriverTag@ Literal "10 10 0 0 10 10 startTexFig \the\mag\space 1000 div dup 3.25 neg mul 2 index .25 neg mul translate %% correction line \Aux@\space mul dup scale "}% \special{\DriverTag@ Include1 "##1"}% \special{\DriverTag@ Literal "endTexFig "}% }} \def\SetBechtolsheimDVITPSEPSFSpecial{\def\DriverTag@{dvitps: }% \SetBechtolsheimEPSFSpecial@} \def\SetBechtolsheimDVI2PSEPSFSSpecial{\def\DriverTag@{DVI2PS: }% \SetBechtolsheimEPSFSpecial@} %% dvi2ps by Tony Lis, % implantations? ; dates?; availability? % Introduced by B. Horn \def\SetLisEPSFSpecial{\PSOrigintrue \gdef\EPSFSpecial##1##2{% \dimen4=##2pt% convert real to dimen \divide\dimen4 by 1000\relax \Real{\dimen4}% dimens 0,2 used here \edef\Aux@{\the\Realtoks}% %%convert dimen to real \special{pstext="10 10 0 0 10 10 startTexFig\space \the\mag\space 1000 div \Aux@\space mul \the\mag\space 1000 div \Aux@\space mul scale"}% \special{psfile=##1}% \special{pstext=endTexFig}% }} %% dvips by Tom Rokicki; free driver in portable C % Introduced by W.D. Neumann \def\SetRokickiEPSFSpecial{\PSOrigintrue \gdef\EPSFSpecial##1##2{% \dimen4=##2pt% convert real to dimen \divide\dimen4 by 10\relax \Real{\dimen4}% dimens 0,2 used here \edef\Aux@{\the\Realtoks}% %%convert dimen to real \special{psfile="##1"\space hscale=\Aux@\space vscale=\Aux@}}} \def\SetInlineRokickiEPSFSpecial{\PSOrigintrue \gdef\EPSFSpecial##1##2{% \dimen4=##2pt% convert real to dimen \divide\dimen4 by 1000\relax \Real{\dimen4}% dimens 0,2 used here \edef\Aux@{\the\Realtoks}% %%convert dimen to real \special{ps::[begin] 10 10 0 0 10 10 startTexFig\space \the\mag\space 1000 div \Aux@\space mul \the\mag\space 1000 div \Aux@\space mul scale}% \special{ps: plotfile ##1}% \special{ps::[end] endTexFig}% }} %%% OzTeX (versions 1.42 and later), by Andrew Trevorrow %%% (for earlier versions see PSprint below!!) %% complete public domain TeX for Macintosh %% Send 10 UNFORMATTED 800K disks %% with return postage to %% Peter Abbott, Computing Service, %% Aston University, Aston Triangle, Birmingham B4 7ET %% Posting: ftp midway.uchicago.edu %% Nota: Version 1.42 may give %% spurious "offpage" error notices on printing. %% Nota: Support for MacPaint files not here yet. \def\SetOzTeXEPSFSpecial{\PSOrigintrue \gdef\EPSFSpecial##1##2{% \dimen4=##2pt%% convert real to dimen \divide\dimen4 by 1000\relax \Real{\dimen4}%% dimens 0,2 used here \edef\Aux@{\the\Realtoks}%% convert dimen to real \special{epsf=\string"##1\string"\space scale=\Aux@}% }} %% PSprint, by AndrewTrevorrow for VaX VMS %% and OzTeX versions <= 1.41 % tested 2-91 by Max Calviani \def\SetPSprintEPSFSpecial{\PSOriginFALSE % artifice; see below \gdef\EPSFSpecial##1##2{%note order \special{##1\space ##2 1000 div \the\mag\space 1000 div mul ##2 1000 div \the\mag\space 1000 div mul scale \the\LLXtoks@\space neg \the\LLYtoks@\space neg translate }}} %% DVILASER/PS driver originally written by David Fuchs % marketed and supported by ArborTeXt 535 W. William St. % Suite 300, Ann Arbor, MI 48103, U.S.A % (313) 996-3566 (313) 996-3573 % help@arbortext.com, Andrew Dobrowolski \def\SetArborEPSFSpecial{\PSOriginfalse % check! \gdef\EPSFSpecial##1##2{% \edef\specialthis{##2}% \SPLIT@0.@\specialthis.@\relax % suppress decimals (nec!) \special{ps: epsfile ##1\space \the\Initialtoks@}}} %% dvitops, (c) James Clark % public domain; distributed by UK TeX Archive % computers: unix, msdos, vms, primos and vm/cms, % introduced by S. Ratz \def\SetClarkEPSFSpecial{\PSOriginfalse % please test! \gdef\EPSFSpecial##1##2{% \Rescale {\Wd@@}{##2pt}{1000pt}% \Rescale {\Ht@@}{##2pt}{1000pt}% \special{dvitops: import ##1\space\the\Wd@@\space\the\Ht@@}}} %% DVIPSONE, for PC compatibles % Y&Y, 106 Indian Hill, Carlisle MA 01741, USA % (508) 371-3286 % (introduced by B. Horn ) \let\SetDVIPSONEEPSFSpecial\SetUnixCoopEPSFSpecial \let\SetDVIPSoneEPSFSpecial\SetUnixCoopEPSFSpecial %% DVIALW by N. Beebe, public domain % DVI Driver Distribution, Center for Scientific Computing, % Department of Mathematics, 220 South Physics Building, % University of Utah, Salt Lake City, UT 84112, USA % (introduced by B. Horn ) % Proposed standard; see TUGboat article 1993. \def\SetBeebeEPSFSpecial{%please test! \PSOriginfalse% \gdef\EPSFSpecial##1##2{\relax \special{language "PS", literal "##2 1000 div ##2 1000 div scale", position = "bottom left", include "##1"}}} \let\SetDVIALWEPSFSpecial\SetBeebeEPSFSpecial %% Northlake software \def\SetNorthlakeEPSFSpecial{\PSOrigintrue \gdef\EPSFSpecial##1##2{% \edef\specialthis{##2}% \SPLIT@0.@\specialthis.@\relax % suppress decimals (nec!) \special{insert ##1,magnification=\the\Initialtoks@}}} \def\SetStandardEPSFSpecial{% \gdef\EPSFSpecial##1##2{% \ms@g{} \ms@g{% !!! Sorry! There is still no standard for \string% \special\space EPSF integration !!!}% \ms@g{% --- So you will have to identify your driver using a command}% \ms@g{% --- of the form \string\Set...EPSFSpecial, in order to get}% \ms@g{% --- your graphics to print. See BoxedEPS.doc.}% \ms@g{} \gdef\EPSFSpecial####1####2{} }} \SetStandardEPSFSpecial %% currently gives warning \let\wlog\wlog@ld %%restore logging \catcode`\:=\C@tColon \catcode`\;=\C@tSemicolon \catcode`\?=\C@tQmark \catcode`\!=\C@tEmark \catcode`\"=\C@tDqt \catcode`\@=\EPSFCatAt \endinput %%%%%%%%%%%% ASCII Character test % % Upper case letters: ABCDEFGHIJKLMNOPQRSTUVWXYZ % Lower case letters: abcdefghijklmnopqrstuvwxyz % Digits: 0123456789 % Square, curly, angle braces, parentheses: [] {} <> () % Backslash, slash, vertical bar: \ / | % Punctuation: . ? ! , : ; % Underscore, hyphen, equals sign: _ - = % Quotes--right left double: ' ` " %"at", "number" "dollar", "percent", "and": @ # $ % & % "hat", "star", "plus", "tilde": ^ * + ~ % %%%%%%%%%%%%%%%%%%%%%%%% % % Une seule erreur de transmission peut empoisoner un programme! % % A single transmission error can poison a whole program. % %%%%%%%%%%%%%%%%%%%%%%%%