  %%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %%
 %%%%%   LabelFig.tex FOR LABELLING FIGURE INSERTS %%%%%
  %%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %%
 %%%  AUTHORS: Raymond S\'eroul and Laurent Siebenmann
  %%    A18645@FRCCSC21.bitnet and lcs@matups.matups.fr
  %%
 %%%  VERSIONS: July, October, December 1991
  %%
 %%%  PURPOSE:
  %%  Occasionally, figures imported into TeX lack some labels.
  %%  It may then be most appropriate to use TeX to provide
  %%  the labels.  Several macro sets, notably the 
  %%  LaTeX picture environment, provide means to insert 
  %%  labels.  LabelFig.tex is a macro set offering 
  %%  labelling capability for other TeX formats such
  %%  as Plain and AmSTeX. Unlike most graphics tools it is 
  %%  fast and of moderate size (costing about 1 Ko of main 
  %%  memory and 60 control sequences). Hopefully it will work 
  %%  in essentially all TeX environments.
  %%
 %%%  THE IDEA:
  %%  A grid is laid down on the figure, as in the LaTeX
  %%  picture environment, and the labels are then
  %%  located with respect to the grid.
  %%  There are two auxiliary devices that give this 
  %%  macro package a touch of novelty even for LateX users.
  %%  (a)  the grid appears on the preview/preprint.
  %%  For users with a fast preview this makes 
  %%  labeling an interactive process.
  %%  (b)  the grid is canonical, i.e. so naturally chosen
  %%  that labels will probably remain well placed
  %%  if the figure scale is changed.
  %% 
 %%%  MAIN POSTINGS : anonymous ftp
  %%  ---  ftp 129.69.1.12 (alias
  %%  rusinfo.rus.uni-stuttgart.de); login: anonymous;  
  %%  password: <anything>. 
  %%  ---  ftp 130.84.128.100 (alias rsovax.circe.fr);
  %%  login: anonymous; password: <anything>; directory
  %%  [anonymous.siebenmann]
  %%  ---  ftp 28.146.7.200 (alias shape.mps.ohio-state.edu);
  %%  login: anonymous;  password: <anything>; 
  %%  directory pub/osutex
  %%
 %%%% DOCUMENTATION:
  %%  --- see LabelFig.doc 
  %% (may be included at end, after \endinput)
  %%
 %%%% EXAMPLE OF USAGE:
  %%    \input \LabelFig.tex
  %%    \SetLabels
  %%      (.3*.7) first label\\
  %%         % center of baseline of the label
  %%         % will go to position .3 from left 
  %%         % and .7 from bottom
  %%      \L(.61*.333) $\Lambda_1\leq\Gamma$\\
  %%         % \L places left edge of label 
  %%         % (rather than the center)
  %%         % similarly use \R for right edge;
  %%         % and \B for bottom, \E for equator, and \T for top
  %%      \T\R(.3*.7) last label \\
  %%    \endSetLabels
  %%    \ShowGrid
  %%         % lays grid on figure to label; 
  %%         % delete for final printing
  %%    \AffixLabels{\BoxedEPSF{MyFigure}}
  %%         % argument of \AffixLabels#1 should be a TeX box;
  %%         % the grid will cover exactly that box.
  %%         % (Here \BoxedEPSF is the figure insertion macro
  %%         % of the package \BoxedEPS.tex (same sources) 
  %%         % for inserting encapsulated PostScript graphics. 
  %%         % But any other means of inserting 
  %%         % the figure can be used.)
  %%         


 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 %%%%% FORBID REREADING %%%%%
  %
  \ifx\LabelFigloaded\MYundefined\relax
  \else
    \message{ !!! LabelFig.tex ALREADY loaded !!!}
  \endinput\fi

  \def\LabelFigloaded{\relax}% now loaded

  %%% Beyond this point we use some control sequences
  %%% that are 'padlocked'  with @ of category 11

  \chardef\LabelFigCatAt\the\catcode`\@
  \catcode`\@=11

 %%temporarily suppress Plain's logging of allocations
 \let\LabelFigwlog@ld\wlog
 \def\wlog#1{\relax}

 \ifx\\\MYundefined@
    \let\\\relax
 \fi

 %%%%%%% end of preamble

  \def\ms@g{\immediate\write16}

 \def\N@wif{\csname newif\endcsname }
 \def\Temp@ {\N@wif\ifIN@}
 \ifx\INN@\MYundefined@
    \else \let\Temp@\relax
 \fi
 \Temp@

  %%% \IN@0#1@#2@ : Is 1st exp of #1 in 1st exp of #2 ??
   %% Answer in \ifIN@
  %\newif\ifIN@ %% conserve if's
  \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@}

   %%% \Shifted@@#1#2#3 puts #3 in \hbox
   %% leaves basepoint as is
   %% then translates ink only by dims #1,#2
   %% with Postscript convention
   %% For simplicity use only on scrunched boxes
 \def\Shifted@@#1#2#3{\setbox0=\hbox{#3}%
   \raise -\dp0\vbox {\kern-#2%
       \hbox {\kern#1\unhbox0\kern-#1}%
           \kern#2}}

 \newcount\gridcount
 \newbox\auxGridbox@ \newbox\hGridbox@ \newbox\vGridbox@
 \newbox\Labelbox@ \newbox\auxLabelbox@
 \newbox\Coordinatebox@
 \newtoks\Labeltoks@
 \newdimen\Wdd@ \newdimen\Htt@

 \def\hRule@{\advance\gridcount -2%
   \vskip-.2pt\hrule\vskip-.2pt\vfil
   \llap{\smash{\raise -2.5pt
     \hbox{.\number\gridcount\kern2pt}}}%
           \vskip-.2pt\hrule\vskip-.2pt\vfil}

 \def\vRule@{\advance\gridcount 2%
   \hskip-.2pt\vrule\hskip-.2pt\hfil
   \setbox\auxGridbox@=\vbox to 0pt
      {\vskip \Htt@\vskip 2pt
        \hbox{\kern-3.5pt.\number\gridcount}\vss}%
      \wd\auxGridbox@=0pt \box\auxGridbox@
   \hskip-.2pt\vrule\hskip-.2pt\hfil}

 \def\PlaceGrid@@{\gridcount=10%
  \setbox\hGridbox@=%
    \hbox{\hbox{\hskip-.4pt\vrule
             \vbox to \Htt@{\offinterlineskip\parindent=\z@\relax
                \vskip-.4pt\hrule\vfil
                \hRule@\hRule@\hRule@\hRule@
                  \vskip-.2pt\hrule\vskip-.2pt\vfil
                \hbox to \Wdd@{\hfil}%
             \hrule\vskip-.4pt}%
         \vrule\hskip-.4pt}}%
  \gridcount=0%
  \setbox\vGridbox@=
     \hbox{\vbox{\offinterlineskip\parindent=0pt\hsize=0pt
       \vskip-.4pt\hrule%
             \hbox to \Wdd@{%
                \hskip-.4pt\vrule\hfil
                \vtop to \Htt@{\vfil}%
                     \vRule@\vRule@\vRule@\vRule@
                     \hskip-.2pt\vrule\hskip-.2pt\hfil
             \vrule\hskip-.4pt}%
         \hrule\vskip-.4pt}}%
  %
  \wd\hGridbox@=0pt\ht\hGridbox@=0pt
  \wd\vGridbox@=0pt\ht\vGridbox@=0pt
  %
  \hbox{\box\hGridbox@\box\vGridbox@}%
  }

 \def\LabelsGlobal{\def\LabGl@b{\global}}
 \def\LabelsLocal{\def\LabGl@b{}}
 \LabelsGlobal %% default

 \def\SetLabels#1\endSetLabels{%
   \LabGl@b\Labeltoks@={#1()\\}%
   }

 \LabGl@b\Labeltoks@={()\\}

 \let\PlaceGrid@\relax
 \def\ShowGrid{\let\PlaceGrid@\PlaceGrid@@}

 \def\bAdjust@@{%
     \setbox\auxLabelbox@=\hbox{\raise \dp\auxLabelbox@
            \box\auxLabelbox@}}
 \def\bAdjust@{\let\vAdjust@\bAdjust@@}

 \def\eAdjust@@{\dimen0=-.5\ht\auxLabelbox@
     \advance\dimen0 by .5\dp\auxLabelbox@
     \setbox\auxLabelbox@=
            \hbox{\raise\dimen0\box\auxLabelbox@}}
 \def\eAdjust@{\let\vAdjust@\eAdjust@@}

 \def\tAdjust@@{%
     \setbox\auxLabelbox@=\hbox{\raise-\ht\auxLabelbox@
            \box\auxLabelbox@}}
 \def\tAdjust@{\let\vAdjust@\tAdjust@@}

 \let\vAdjust@\relax

 \def\lAdjust@{\let\hAdjust@\rlap}
 \def\rAdjust@{\let\hAdjust@\llap}

 \let\hAdjust@\relax\let\vAdjust@\relax

 \def\FetchLabel@#1(#2)#3\\{%
     \IN@0#2@@\ifIN@
        \setbox0=\hbox{\ignorespaces#1#3\unskip}%
        \ifdim\wd0>0pt
           \ms@g{}%
           \ms@g{ !!! Bad label(s)? !!!}%
           \message{ #1(#2)#3}%
        \fi
        \def\LabelMole@##1\endFetchLabel@{%
            \IN@0()\\@##1@%
            \ifIN@\def\Temp@{\FetchLabel@##1\endFetchLabel@}%
            \else\def\Temp@{}%
            \fi
            \Temp@
           }%
     \else
       \ignorespaces#1\unskip
       \setbox\auxLabelbox@=%
         \hbox to 0pt{\hss\ignorespaces\hAdjust@
          {\ignorespaces#3\unskip}\hss}%
       \vAdjust@
       \let\hAdjust@\relax\let\vAdjust@\relax
       \AugmentLabelBox@@{#2}%
       \ht\Labelbox@=0pt\dp\Labelbox@=0pt
       \let\LabelMole@\FetchLabel@%
     \fi\LabelMole@}

 \newtoks\XYSep@ %\XYSep@{*}
 \def\SetXYSeparator#1{%
     \IN@0#1@@\ifIN@\XYSep@{*}%
     \else
     \XYSep@{#1}%
     \fi
     }

 \SetXYSeparator*

 \def\AugmentLabelBox@@#1{%
     \IN@0\the\XYSep@ @#1@\ifIN@
       \SPLIT@0\the\XYSep@ @#1@%
       \setbox\Labelbox@=\hbox to 0pt{%
         \unhbox\Labelbox@
         \Shifted@@{\the\Initialtoks@\Wdd@}%
         {\the\Terminaltoks@\Htt@}%
         {\box\auxLabelbox@}}%
     \else
         \ms@g{}%
         \ms@g{ !!! Bad insertion point. !!!}%
         \message{ (#1\ this point was rejected.)}%
     \fi
    }
 

 \def\PlaceLabels@@{\bgroup\mathsurround=0pt%
     \def\Cr@{\\}%
     \let\L\lAdjust@\let\R\rAdjust@
     \let\B\bAdjust@\let\E\eAdjust@\let\T\tAdjust@
     \expandafter\FetchLabel@\the\Labeltoks@\endFetchLabel@
     \box\Labelbox@\egroup
     }%

 \let \PlaceLabels@\PlaceLabels@@

 \def\AffixLabels#1{\setbox\Coordinatebox@=\hbox{#1}%
      \Wdd@=\wd\Coordinatebox@ \Htt@=\ht\Coordinatebox@
      \advance\Htt@ \dp\Coordinatebox@
      \hbox{\copy\Coordinatebox@\kern-\Wdd@ 
           \Shifted@@{0pt}{-\dp\Coordinatebox@}%
            {\PlaceGrid@\PlaceLabels@}\kern\Wdd@}%
      \let\PlaceGrid@\relax
      \LabGl@b\Labeltoks@{()\\}%
      }
 
 %%% Restoring
   \let\wlog\LabelFigwlog@ld   %%restore logging
   \catcode`\@=\LabelFigCatAt  %%12 or 13

  \endinput

 %% end of  LabelFig.tex
 
