%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% boxedeps.tex %%%%% MACROS FOR FIGURE INSERTS OF EPSF NORM %%%%% %%%%% (EPSF = Encapsulated PostScript File) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%% AUTHOR: Laurent Siebenmann %% lcs@topo.math.u-psud.fr %% %%% VERSIONS: Feb 1991 -- Feb 1995 %% Revisions bi-annual approx. %% %%% 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. %% %%%% ACTIVATION: %% by a driver-by-driver protocol %% see \SetTexturesEPSFSpecial %% and its companions below. %% %%%% DOCUMENTATION: %% --- see boxedeps.doc %% The complete utility is called BoxedEPSF %% %%%% POSTINGS: anonymous ftp %% --- ftp matups.math.u-psud.fr [192.54.146.4] %% is the master copy in 1994. %% --- ftp.uni-stuttgart.de %% --- ftp ftp.TeX.AC.UK %% --- ftp ftp.SHSU.edu %% Locate the full package on these three %% "CTAN" servers by using (while connected) the command %% QUOTE SITE INDEX boxedeps %%%% RECENT ADDITIONS: \SetepsfEPSFSpecial simultaneously serves %% dvips, the Y&Y drivers, DirectTeX, CMacTeX, OzTeX>=1.7 %% \SetOldOzTeXEPSFSpecial %% OzTeX 1.42--1.6x \ifx\MYUNDEFINED\BoxedEPSF \let\temp\relax \else \message{} \message{ !!! \string\BoxedEPSF or \string\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 BoxedEPSF % \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@ \newtoks\URXtoks@ %% further useful epsf.tex syntax \newtoks\URYtoks@ \newif\ifNotIn@ \newif\ifForcedDim@ \newif\ifForceOn@ \newif\ifForcedHeight@ \newif\ifPSOrigin \newread\EPSFile@ %%%% MESSAGES (separate macro best 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}}}% $\relax}% \CleanRegisters@ \ms@g{ *** Box composed for the % EPS 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@{%!}\gdef\pct@@{%%}} %% %! 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"00=14 \catcode"7F=14 \catcode`\\=14 %% 14 = comment, terminates input line; %% 5 = CR just picks up extra space \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 is not PostScript.}% \ms@g{ !!! It should begin with the "\P@S@". }% \ms@g{ !!! Also, all other header lines until }% \ms@g{ !!! "\pct@@ EndComments" should begin with "\pct@@". }% \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 for Oz \URXtoks@={#3}\URYtoks@={#4}%% useful for epsf.tex \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 } \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@ } %%% \ShowDisplacementBoxes %% shows (prints) corrected scaled and positioned %% bounding boxes; for diagnostics %%% \HideDisplacementBoxes makes them invisible again %% \def\HideDisplacementBoxes{\global\def\FrameSpider##1{\null}} \def\ShowDisplacementBoxes{\global\def\FrameSpider##1{##1}} \let\HideFigureFrames\HideDisplacementBoxes %% some synonyms \let\ShowFigureFrames\ShowDisplacementBoxes \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 %% \SetepsfEPSFSpecial %% ******* will work for many: %% ----- dvips, the Y&Y drivers, DirectTeX, CMacTeX, OzTeX>=1.7 %% \SetRokickiEPSFSpecial %% dvips by Tom Rokicki %% \SetDVIPSoneEPSFSpecial %% DVIPSONE of Y&Y same as %% \SetDVIWindowEPSFSpecial %% DVIWindow of Y&Y %% \SetDirectTeXEPSFSpecial %% DirectTeX by Wilfried Ricken %% \SetCMacTeXEPSFSpecial %% CMacTeX by Tom Kiffe %% \SetOzTeXEPSFSpecial %% OzTeX (>=1.7) by Andrew Trevorrow %% ----- %% \SetOldOzTeXEPSFSpecial %% OzTeX 1.42--1.6x %% \SetPSprintEPSFSpecial %% PSprint by Andrew Trevorrow %% --- also for OzTeX versions <= 1.41 !! %% \SetArborEPSFSpecial %% ArborTeX DVILASER/PS %% \SetClarkEPSFSpecial %% dvitops by James Clark %% \SetBeebeEPSFSpecial %% DVIALW by N. Beebe %% \SetNorthlakeEPSFSpecial %% Northlake Software %% \SetStandardEPSFSpecial %% Nonexistant: Placebo used %% %% These many drivers are 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\specialtemp{##2}% \SPLIT@0.@\specialtemp.@\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 % and George Denk % 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 1 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}% }} %%% Rokicki's epsf.tex syntax. %% Is followed by DirectTeX (W. Ricken) %% CMacTeX (Tom Kiffe), Y&Y's drivers, and OzTeX >= 1.7 \def\SetepsfEPSFSpecial{\PSOriginfalse \gdef\epsfclipstring{}% %% make { clip} if you want to clip (non-portably) %% down to the PostScript bounding box. \gdef\EPSFSpecial##1##2{% \dimen6=\the\URXtoks@ pt %% not bp!!!!! \advance\dimen6 by -\the\LLXtoks@ pt %% \dimen6 now bbox width * points \dimen4=##2pt %% convert mil scale to dimen \divide\dimen4 by 100 %% 1000ths to 10ths \Real{\dimen4}%% dimens 0,2 used here \dimen6=\the\Realtoks\dimen6 \Real{\dimen6}%% dimens 0,2 used here %% \Realtoks now holds decimal real no %% 10 times desired "real width" (rwi) in bp \special{PSfile=##1\space llx=\the\LLXtoks@\space lly=\the\LLYtoks@\space urx=\the\URXtoks@\space ury=\the\URYtoks@\space rwi=\the\Realtoks\space \epsfclipstring}% }} %% Minor Bug (my laziness): scaling not performed if bb width zero %% Rmk: Under epsf.tex only multiples of (1/10) bp available widths %% but considerably more accuracy available here. \let\SetDirectTeXEPSFSpecial=\SetepsfEPSFSpecial \let\SetCMacTeXEPSFSpecial=\SetepsfEPSFSpecial \let\SetOzTeXEPSFSpecial=\SetepsfEPSFSpecial %%% \SetOzTeXEPSFSpecial only for OzTeX in versions 1.7 and later %%% Old OzTeX versions (1.42 to 1.6), by Andrew Trevorrow. %%% For versions <= 1.41 use \SetPSprintEPSFSpecial below. %% Nota: Version 1.42--1.5 may give %% spurious "offpage" error notices on printing. \def\SetOldOzTeXEPSFSpecial{\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\SetepsfEPSFSpecial \let\SetDVIPSoneEPSFSpecial\SetepsfEPSFSpecial \let\SetDVIWindowEPSFSpecial\SetepsfEPSFSpecial %% 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@}}} %%% MultiSpecial for Textures PLUS drivers supporting epsf.tex %%% syntax of Rokicki (one of many dvips syntaxes) %% *experimental* 2-95 \def\SetEPSFMultiSpecial{\PSOriginfalse \csname newwrite\endcsname \EPSFile@@ \immediate\openout\EPSFile@@ illustration \immediate\write\EPSFile@@ {\P@S@}% \immediate\write\EPSFile@@ {\pct@@ Remark: Tranquilizer for OzTeX...}% \immediate\closeout\EPSFile@@ \gdef\EPSFSpecial##1##2{%% epsf but have dropped \clipstring \dimen6=\the\URXtoks@ pt %% not bp!!!!! \advance\dimen6 by -\the\LLXtoks@ pt %% \dimen6 now bbox width * points \dimen4=##2pt %% convert mil scale to dimen \divide\dimen4 by 100 %% 1000ths to 10ths \Real{\dimen4}%% dimens 0,2 used here \dimen6=\the\Realtoks\dimen6 \Real{\dimen6}%% dimens 0,2 used here %% \Realtoks now holds decimal real no %% 10 times desired "real width" (rwi) in bp \special{PSfile=##1\space llx=\the\LLXtoks@\space lly=\the\LLYtoks@\space urx=\the\URXtoks@\space ury=\the\URYtoks@\space rwi=\the\Realtoks}% % \edef\specialtemp{##2}% \SPLIT@0.@\specialtemp.@\relax \special{illustration ##1 scaled \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.}% \ms@g{% Update your BoxedEPSF and read the documentation.}% \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. % %%%%%%%%%%%%%%%%%%%%%%%%