Blame | Last modification | View Log | Download | RSS feed
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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: <anything>; directory%% [anonymous.siebenmann]. This is the master copy in 1992.%%%% --- ftp 129.69.1.12 (alias rusinfo.rus.uni-stuttgart.de);%% login: anonymous; password: <anything>;%% 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 <bkph@ai.mit.edu>\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\spacehscale=\Aux@\spacevscale=\Aux@}}}%% dvi2ps and dvitps by S.P. Bechtolsheim,% Introduced by B. Horn <bkph@ai.mit.edu> and Carl.M.Jones,% testing by R. Evans <Robert@cm.cardiff.ac.uk>% 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 <bkph@ai.mit.edu> and Carl.M.Jones,% testing by R. Evans <Robert@cm.cardiff.ac.uk>% 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 divdup 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 <bkph@ai.mit.edu>\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 <neumann@mps.ohio-state.edu>\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"\spacehscale=\Aux@\spacevscale=\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 <ISICA@ASTRPD.infn.it>\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 <jjc@jclark.uucp>% public domain; distributed by UK TeX Archive% computers: unix, msdos, vms, primos and vm/cms,% introduced by S. Ratz <spqr@uk.ac.southampton.ecs>\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 <bkph@ai.mit.edu>)\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 <bkph@ai.mit.edu>)% 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.%%%%%%%%%%%%%%%%%%%%%%%%%