%% %% WARMreader.sty v1.2 %% 5 July 2001 %% %% by Ross Moore, %% \edef\wrmprevat{\the\catcode`\@} \catcode`\@=11 %% %% If you have trouble finding files, %% then we may need to know the directory delimiter; %% so uncomment one of the following lines... %% \ifx\undefined\@currdir % ... get it from LaTeX's config file: % \input texsys.cfg \ifx\undefined\@currdir % ... or specify it directly: \def\@currdir{}% ... or try winging-it without % \def\@currdir{:}% for Macintosh % \def\@currdir{:}% for Unix \fi \fi \ifx\undefined\codeof {\catcode`\:=12 \gdef\codeof#1{\expandafter\codeof@\meaning#1<-:} \gdef\codeof@#1:->#2<-:{#2}% }\fi \newread\wrmread \newread\wrm@write \let\wrm@next=\relax \def\wrm@empty{}% \def\maxwrmlines{20} \let\wrm@tmp\relax \def\EndLinePattern{!;!} \let\wrm@quiet\relax \def\wrmquiet{\def\wrm@quiet{}} \def\wrmverbose{\let\wrm@quiet\relax} \newcount\wrmcounter \newcount\wrmdatacounter \newif\ifmorelines\morelinestrue \newwrite\wrm@tmpfile \def\wrm@recovercode{% \immediate\openout\wrm@tmpfile=\jobname.wrm \relax\immediate\write\wrm@tmpfile{{\codeof\wrm@text}}\relax \immediate\closeout\wrm@tmpfile\relax \immediate\openin\wrmread=\jobname.wrm \read\wrmread to \wrm@text \immediate\closein\wrmread \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter\wrm@text \expandafter\expandafter\expandafter{\expandafter \strip@endline\wrm@text \strip@endline}% } \let\WARM@PreDataString=\relax \let\WARM@EndFileString=\relax \def\wrm@defprefix{datapoint} \let\wrm@prefix=\wrm@defprefix \def\WARMprefix#1{\def\wrm@prefix{#1}\WARM@prefixMessage\ignorespaces} \def\WARM@prefixMessage{% \wrm@message{Using prefix '\wrm@prefix' for unlabelled points.}} \def\wrm@message#1{{\let\protect=\noexpand \let\\\relax \endlinechar=10 \immediate\write16{#1}}}% \def\WARMprocess#1#2#3{% \WARMprocessDir{\@currdir}{#1}{#2}{#3}}% \def\WARMprocessDir#1#2#3#4#5{\begingroup \begingroup \wrmdatacounter=\z@ \let\wrm@llx=\undefined % \def\CleanupAfterDir{\endgroup}% \def\fileprefix{#2}% \def\fileextn{#3}% \def\dataextn{#4}% \ifx\dataextn\wrm@empty \else \WARM@RelaxOpenFileMessage \edef\wrm@filename{#1\fileprefix.\dataextn}% \TryToOpenTheFile\relax \fi \ifnum\wrmdatacounter<\z@ \aftergroup\WARM@RelaxOpenFileMessage \aftergroup\WARM@RelaxBBWrite \aftergroup\WARM@ReadDataFromFile \else \edef\wrm@filename{\@currdir\fileprefix.\fileextn}% \TryToOpenTheFile\relax \ifnum\wrmdatacounter<\z@ \aftergroup\WARM@ReadDataToFile \else \aftergroup\WARM@NoFilesError \fi\fi \endgroup {#1#2}{#3}{#4}{#5}\CleanupAfterDir \edef\wrm@filename{#1#2.#3}% } \def\CleanupAfterDir{% \ifx\undefined\wrm@llx\expandafter\endgroup \else\expandafter\saveBBafterFile\fi} \def\WARM@NoFilesError#1#2#3#4{% \message{Cannot open file #1.#2 nor #1.#3 }} \def\WARM@ReadDataFromFile#1#2#3#4{% \edef\wrm@filename{#1.#3}% \expandafter\ProcessFile\expandafter{\wrm@filename}{#4}% } \def\WARM@ReadDataToFile#1#2#3#4{% \begingroup \edef\wrm@filename{#1.#3}% \immediate\openout\wrm@write=\wrm@filename \edef\wrm@filename{#1.#2}% \expandafter\ProcessFile\expandafter{\wrm@filename}{#4}% \immediate\closeout\wrm@write \endgroup \WARM@ReadDataFromFile{#1}{#2}{#3}{#4}% } \def\TryToOpenTheFile{% \immediate\openin\wrmread\wrm@filename\relax \ifeof\wrmread \expandafter\TryAgainToOpenTheFile \else \read\wrmread to\ThisFileLine \expandafter\FileIsOpen \fi } \def\ReadLineFromFile{% \ifeof\wrmread \morelinesfalse \else \read\wrmread to\ThisFileLine \fi {\ifx\ThisFileLine\wrm@empty \ifmorelines\aftergroup\ReadLineFromFile\fi\fi}% } \def\CloseTheFile#1{\immediate\closein\wrmread} \def\FileIsOpen{\ResetDataCounter\FileIsOpenMessage} \def\FileIsOpenMessage{\message{% opened file \wrm@filename\space successfully:\codeof\ThisFileLine}} \def\WARM@RelaxOpenFileMessage{\let\FileIsOpenMessage\relax} \def\TryAgainToOpenTheFile{% \immediate\closein\wrmread \immediate\openin\wrmread\wrm@filename\relax \ifeof\wrmread\expandafter\FileEmptyError \else\expandafter\FileIsOpen\fi } \def\FileEmptyError{% \message{file \wrm@filename\space could not be opened or is empty.}% \futurelet\next\CloseTheFile } {\obeylines \gdef\PrepareToOpenFile{% \begingroup \catcode`\%=12 \catcode` =9 \catcode`\{=12 \catcode`\}=12 } \gdef\EndLineAdjust{\def\strip@endline##1 \strip@endline{##1}} \gdef\strip@endline#1 \strip@endline{#1} %\gdef\strip@endline#1\strip@endline{#1} } \def\ProcessFile#1#2{% \edef\wrm@filename{#1}% \PrepareToOpenFile \TryToOpenTheFile#2% \CleanupAfterFile } \def\CleanupAfterFile{\endgroup} \def\TestIfEnd{% \ifx\ThisFileLine\WARM@EndFileString \message{Finishing with `\WARM@EndFileString' after \number\wrmcounter\space lines.}% \morelinesfalse \wrmcounter\maxwrmlines\advance\wrmcounter\@ne \fi } \def\TestMoreLines{% \ifnum\wrmcounter<\maxwrmlines\relax \else\morelinesfalse\fi} \def\TestReadLine#1#2{\begingroup \def\DataPattern{#2}\def\Empty{}% \ifx\DataPattern\Empty \def\next{\endgroup\TestExactLine#1}% \else \def\protect{\noexpand}% for "robust" LaTeX commands % \edef\testdata{\ThisFileLine\space\StrippedDataPattern\EndLinePattern}% \edef\testdata{\StrippedDataPattern\EndLinePattern}% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter\testdata \expandafter\expandafter\expandafter{\expandafter\ThisFileLine\testdata}% %\show\testdata \edef\tmp{\gdef\noexpand\ThisData\DataPattern\EndLinePattern}% \expandafter\tmp\expandafter{\the\WARM@ExpansionToks}% \expandafter\ThisData\testdata \relax \def\next{\endgroup}% \ifx\undefined\wrm@llx \ifdim\wrm@aspect\p@=\p@\else\SaveARvalues@\fi \else\SaveBBvalues@\fi \aftergroup\TestExactLine\aftergroup#1\relax \fi \next } \def\declareWRMdata#1#2#3{{%\gdef\wrm@namespace{#2}% \DN@{#2}\ifx\next@\empty\let\wrm@namespace\relax \else\gdef\wrm@namespace{#2}\fi \def\ThisFileLine{#1}\TestDataLine\WRM@DataPattern\WRM@DataStripped\relax}} \def\wrm@namespace{} \def\wrm@savedata{% check for End of Data \ifx\testdata\WARM@EndDataTestString\aftergroup\morelinesfalse \else\aftergroup\morelinestrue \ifx\testdata\WARM@PreDataString \aftergroup\AdvanceDataCount \ifx\wrm@namespace\relax \else \expandafter\expandafter\expandafter \def\expandafter\expandafter\expandafter\wrm@texstring \expandafter\expandafter\expandafter{\expandafter\wrm@namespace\wrm@texstring}% \fi \let\protect\noexpand \ifx\wrm@quiet\relax \wrm@message{Marked '\wrm@label' point at (\wrm@x,\wrm@y) for \codeof\wrm@texstring.}% \fi \edef\tmp@{\noexpand\def\noexpand\wrm@x{\wrm@x}% \noexpand\def\noexpand\wrm@y{\wrm@y}}% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter\tmp@ \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter\wrm@text \expandafter\expandafter\expandafter{% \expandafter\wrm@texstring\expandafter}\tmp@}% % \ifx\wrm@namespace\relax \expandafter\global\expandafter \let\csname WRM@\wrm@label\endcsname=\tmp@ \advance\wrmdatacounter\@ne \expandafter\global\expandafter \let\csname WRM@\the\wrmdatacounter @\endcsname=\tmp@ \else \ifx\wrm@namespace\wrm@empty \expandafter\global\expandafter \let\csname WRM@\wrm@label\endcsname=\tmp@ \advance\wrmdatacounter\@ne \expandafter\global\expandafter \let\csname WRM@\the\wrmdatacounter @\endcsname=\tmp@ \else \expandafter\global\expandafter \let\csname WRM@\wrm@label.\wrm@namespace\endcsname=\tmp@ \advance\wrmdatacounter\@ne \expandafter\global\expandafter \let\csname WRM@\the\wrmdatacounter @\endcsname=\tmp@ \expandafter\ifx\csname WRM@\wrm@label\endcsname\relax \expandafter\global\expandafter \let\csname WRM@\wrm@label\endcsname=\tmp@ \else \begingroup \def\wrm@message##1{\def\prev@name{##1}}% \csname WRM@\wrm@label\endcsname \ifx\wrm@text\wrm@empty \def\tmp@{\endgroup \edef\wrm@text{\wrm@namespace}}% \else \ifx\wrm@text\relax \edef\tmp@{\endgroup\def\noexpand\prev@name{\prev@name\space}% \let\noexpand\twoalready\relax}% \else %\show\wrm@text %\aftergroup\tracingall \edef\tmp@{\endgroup\def\noexpand\prev@name{\wrm@text\space}}% % \def\noexpand\wrm@text{\noexpand\wrm@namespace}}% \fi\fi \tmp@ \ifx\undefined\prev@name \else \ifx\twoalready\relax \edef\tmp@{\def\noexpand\wrm@x{\wrm@x}\def\noexpand\wrm@y{\wrm@y}% % \def\noexpand\wrm@text{\wrm@text}% \let\noexpand\wrm@text\relax \noexpand\wrm@message{\prev@name or \codeof\wrm@texstring}}% \else \edef\tmp@{\def\noexpand\wrm@x{\wrm@x}\def\noexpand\wrm@y{\wrm@y}% \let\noexpand\wrm@text\relax\noexpand\wrm@message % \def\noexpand\wrm@text{\wrm@text}\noexpand\wrm@message {\wrm@label\space could be \prev@name or \codeof\wrm@texstring}}% \fi\fi %\show\tmp@ \expandafter\global\expandafter \let\csname WRM@\wrm@label\endcsname=\tmp@ \fi \fi\fi \else %% all data occurs in a block --- unnecessary % \ifnum\wrmdatacounter>\z@\aftergroup\morelinesfalse\fi \fi\fi } \def\SaveBBvalues@{% \ifx\undefined\wrm@llx \def\next{\endgroup}% \else \edef\next{\endgroup \wrmdatacounter=\the\wrmdatacounter\relax \def\noexpand\wrm@llx{\wrm@llx}\def\noexpand\wrm@lly{\wrm@lly}% \def\noexpand\wrm@urx{\wrm@urx}\def\noexpand\wrm@ury{\wrm@ury}% \def\noexpand\wrm@aspect{\wrm@aspect}% \def\noexpand\wrm@offset{\wrm@offset}% \def\noexpand\wrm@filename{\wrm@filename}}% \fi } \def\saveBBafterFile{\SaveBBvalues@\next \def\CleanupAfterFile{\endgroup}} \def\SaveARvalues@{% \ifdim\wrm@aspect\p@=\p@ \def\next{\endgroup}% \else \edef\next{\endgroup \def\noexpand\wrm@aspect{\wrm@aspect}% \def\noexpand\wrm@offset{\wrm@offset}}% \fi } \def\saveARafterFile{\SaveARvalues@\next \def\CleanupAfterFile{\endgroup}} \def\TestExactLine#1{\ifx\ThisFileLine#1\morelinesfalse\fi} \def\TestDataString{% % \edef\testdata{\ThisFileLine\space\DataStripped\EndLinePattern}% \edef\testdata{\DataStripped\EndLinePattern}% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter\testdata \expandafter\expandafter\expandafter{\expandafter\ThisFileLine\testdata}% \edef\tmp{\def\noexpand\ThisData@Test\DataPattern\EndLinePattern}% \expandafter\tmp\expandafter{\the\WARM@ExpansionToks}% \expandafter\ThisData@Test\testdata} \def\TestDataLine#1#2#3{{% \def\DataPattern{#1}\def\Empty{}\def\DataStripped{#2}% \ifx\DataPattern\Empty \aftergroup\TestExactLine\aftergroup\WARM@PreDataString\relax \else \TestIfEnd\ifmorelines \ifnum\wrmdatacounter<\z@ \aftergroup\wrmdatacounter\aftergroup\z@ \else\expandafter\TestDataString\fi \else\morelinesfalse\fi \ifmorelines % found valid data #3% \else % no more data -- pass boolean to next level \aftergroup\morelinesfalse \fi \fi}} \def\PrintDataLine{% \wrm@message{\wrm@filename\space data: \codeof\ThisFileLine}} \def\PrintInfoLine{% \wrm@message{Found \codeof\ThisFileLine\space on line \number\wrmcounter}} \def\PrintNumberOfDataPoints{% \wrm@message{Found \number\wrmdatacounter\space data points.}} \def\WriteToBBfile{% \immediate\write\wrm@write{\codeof\ThisFileLine}} \def\WARM@RelaxBBWrite{\let\WriteToBBfile\relax} \def\AdvanceLineCount{\advance\wrmcounter\@ne} \def\RevertLineCount{\advance\wrmcounter\m@ne} \def\AdvanceDataCount{\advance\wrmdatacounter\@ne\RevertLineCount} \def\ResetDataCounter{\wrmdatacounter=\m@ne} \def\ReadSomeLines{\wrmcounter=\@ne \morelinestrue \loop \TestIfEnd \TestMoreLines \ifmorelines \AdvanceLineCount \ReadLineFromFile \repeat } \def\ReadToLine#1#2#3{\ifnum\wrmcounter=\z@\wrmcounter=\@ne\fi \ifnum\wrmcounter<\maxwrmlines\relax\morelinestrue\fi \loop %\PrintDataLine \TestReadLine #1{#2}\TestMoreLines \ifmorelines \advance\wrmcounter\@ne \ReadLineFromFile \repeat \ifnum\wrmcounter>0 \ifnum\maxwrmlines<\wrmcounter \message{Failed to find: #1}% \else \expandafter #3\fi \else \message{Failed to find: #1}\fi } \def\ReadDataLines#1#2#3{% \ResetDataCounter \edef\WARM@EndDataTestString{\WARM@EndDataString\space\ParenEmpty}% \ifnum\wrmcounter<\maxwrmlines\relax\morelinestrue\fi \loop \TestDataLine{#1}{#2}{#3}\TestIfEnd \TestMoreLines \ifmorelines \advance\wrmcounter\@ne \ReadLineFromFile \repeat \PrintNumberOfDataPoints } \newtoks\BBexpansiontoks \def\BBpattern{####1 ####2 ####3 ####4 ####5 ####6} \def\BBstripped{ , , , , } \BBexpansiontoks={\def\testcomment{#1}% \ifx\testcomment\AdobeBoundingBoxString \def\wrm@llx{#2}\def\wrm@lly{#3}% \def\wrm@urx{#4}\def\wrm@ury{#5}% % there can be only one \aftergroup\morelinesfalse \wrm@message{file: \wrm@filename}% \wrm@message{Bounding Box is (\wrm@llx,\wrm@lly)->(\wrm@urx,\wrm@ury)}% \WriteToBBfile %{\ThisFileLine}% \fi } \def\WRM@DataPattern{} \def\WRM@DataStripped{} \def\wrm@filename{} % % These are now defined later, for use with Adobe EPS files: % %\newtoks\ParenPointToks %\ParenPointToks={\def\wrm@x{#2}\def\wrm@y{#3}% % \def\afterdata{#7}% % \ifx\afterdata\ParenEmpty %% \edef\wrm@label{datapoint\the\wrmdatacounter}% % \edef\wrm@label{\wrm@prefix\the\wrmdatacounter}% % \def\wrm@texstring{#4}% % \else % \def\wrm@label{#4}\def\wrm@texstring{#5}% % \fi % \def\testdata{#1}\wrm@savedata } % %\def\ParenPointData{% % \let\WRM@DataPattern\ParenPointPattern % \let\WRM@DataStripped\ParenPointStripped % \def\SetExpansionToks{\let\WARM@ExpansionToks\ParenPointToks}% %} %% %% \RecoverData{}{}{}{} %% %% : symbolic label for a marked-point %% : macro to expand for the given label %% : action to take if is invalid %% : @ = numeric {}= symbolic %% %% this also sets a macro \wrm@name to expand to an identifying %% string WRM@ , as a name for the point itself. %% e.g. useful in Xy-pic to return to the marked point as a %% \def\RecoverData#1#2#3#4{% \expandafter\ifx\expandafter\relax\csname WRM@#1#4\endcsname \message{There is no data for label: #1}% \let\wrm@name\wrm@none \def\wrm@next{#3}% \else \def\wrm@name{WRM#1}\def\wrm@next{#2}% \csname WRM@#1#4\endcsname \fi \wrm@next } \newif\iftesting\global\testingfalse %% default value for \wrm@name when no valid marked-point. \def\wrm@none{@WRM@none} \let\wrm@name\wrm@none %% show information associated with a symbolic label: \def\ShowMarkedData#1{\RecoverData{#1}{\ShowMarkedData@{#1}}\relax{}} \def\ShowMarkedData@#1{% \wrm@message{'#1' (\wrm@x,\wrm@y) \codeof\wrm@name: \codeof\wrm@text}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% for use with Xy-pic %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% allow for top-to-bottom coordinates \def\Mac@orig{} \def\MacintoshOrigin{\def\Mac@orig{-}} %% %% This is the main macro for establishing a marked-point %% as the current , for placing a label, or whatever. %% It establishes "WRM@" as an easy recovery method. %% \def\xyMarkedPos#1{\RecoverData{#1}\xyMarkedPos@\POS{}} \def\xyMarkedPos@{\def\wrmtext{\wrm@text}% \edef\wrm@next{(\wrm@x,\Mac@orig\wrm@y)}% \ifx\wrm@quiet\relax\wrm@message{\wrm@name:\codeof\wrm@text: \wrm@next}\fi \let\protect\relax % for "robust" LaTeX commands \expandafter\expandafter\expandafter\POS \expandafter\wrm@next\expandafter=\expandafter"\wrm@name"} %% Default positioning of the label, %% with respect to the marked-points %% text: bottom-left corner, including a small margin %% math: centered %% \def\labelmathmodifiers{!C} \def\labeltextmodifiers{+!LD} \def\labelmathstyle{} \def\labeltextstyle{} \def\markobject{*\dir{x},*+<3pt>!UL{\scriptscriptstyle\the\wrmcounter}} \def\markobjectlabel#1{*\dir{x},*+<3pt>!U{\scriptscriptstyle#1}} \def\markedempty@@{} %% %% \xyShowMark {*}{} %% \xyShowMarkPoints {*}{} %% \xyShowMarksExcept {*}{} %% %% allows any valid Xy-pic code to be interpreted %% at the specified marked-point. %% defaults to use \markobject when the 1st argument is empty. %% \def\xyShowMark{\xyShowMarks@i\z@} \def\xyShowMarkPoints{\xyShowMarks@i\markedempty@@} \def\xyShowMarksExcept{\xyShowMarks@i\relax} \def\xyShowMarks@i#1#2#3{% \def\xymarkobject@{#2}% \ifx\xymarkobject@\markedempty@@ \let\xymarkobject@\markobject \fi \ifx#1\z@ \def\xymarkobject@{\markobjectlabel{#3}}% \DN@{\RecoverDataLabel{#3}}% \else \DN@{\RecoverDataPoints{#3}#1}% \fi \next@\xyShowMark@x\POS } \def\xyShowMark@x{% \expandafter\xyMarkedPos@\xymarkobject@\relax} %% %% \xyMarkedTxt {