%D \module
%D   [       file=supp-ali,
%D        version=2000.4.17,
%D          title=\CONTEXT\ Support Macros,
%D       subtitle=Alignment,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for 
%C details. 

%D Yet undocumented. 

% 0 = centered 
% 1 = left  in before
% 2 = right in before 
% 3 = left  in after 
% 4 = right in after 

\unprotect 

% \starttabulatie[|cg{.}|cg{,}|cg{,}|]
% \NC period     \NC comma      \NC comma   \NC\NR
% \NG 100.000,00 \NG 100.000,00 \NG 100,00  \NC\NR
% \NG 10.000,00  \NG 10.000,00  \NG 1000,00 \NC\NR
% \NG 100,00     \NG 100,00     \NG 10,00   \NC\NR
% \NG 100,00     \NG 100,00     \NG 10,00   \NC\NR
% \NG 10\\       \NG 10\\       \NG 0,00    \NC\NR
% \NG 10         \NG 10         \NG 0,00    \NC\NR
% \NG 10         \NG 10         \NG 0,00    \NC\NR
% \stoptabulatie

\chardef\characteralignmentmode=4
\chardef\characteralignmentslot=1

\let\afterassignwidth \!!zeropoint
\let\beforeassignwidth\!!zeropoint

\def\alignmentcharacter{.}

\let\alignmentclass\s!default % can be used to handle multiple mixed ones

\def\setfirstpasscharacteralign
  {\popcharacteralign
   \expanded{\dosetfirstpasscharacteralign{\alignmentcharacter}}}

\def\dosetfirstpasscharacteralign#1%
  {\def\checkalignment##1%
     {\popcharacteralign
      \let\\\empty
      \setbox\scratchbox\hbox{#1}%
      \edef\characterassignwidth{\the\wd\scratchbox}%
      \setbox\scratchbox\hbox{}%
      \docheckalignment#1##1#1\relax\relax
      \scratchdimen-\wd\scratchbox
      \setbox\scratchbox\hbox{##1}%
      \advance\scratchdimen \wd\scratchbox
      \ifdim\scratchdimen>\beforeassignwidth\relax
        \edef\beforeassignwidth{\the\scratchdimen}%
      \fi
      \ifdim\scratchdimen=\zeropoint
        \setbox\scratchbox\hbox{##1}%
        \scratchdimen\wd\scratchbox
        \ifcase\characteralignmentmode
          % do nothing 
        \else\ifnum\characteralignmentmode<3
          \advance\scratchdimen \characterassignwidth
          \ifdim\scratchdimen>\beforeassignwidth\relax
            \edef\beforeassignwidth{\the\scratchdimen}%
          \fi
        \else
          \ifdim\scratchdimen>\afterassignwidth\relax
            \edef\afterassignwidth{\the\scratchdimen}%
          \fi
        \fi\fi
      \fi
      \pushcharacteralign}%
   \def\docheckalignment##1#1##2##3\relax
     {\ifx##2\relax
        \setbox\scratchbox\hbox{##1}%
        \ifdim\wd\scratchbox>\afterassignwidth
          \edef\afterassignwidth{\the\wd\scratchbox}%
        \fi
      \else
        \docheckalignment##2##3\relax
      \fi}}

\def\setsecondpasscharacteralign
  {\popcharacteralign
   \expanded{\dosetsecondpasscharacteralign{\alignmentcharacter}}}

\def\dosetsecondpasscharacteralign#1%
  {\def\checkalignment##1%
     {\popcharacteralign
      \let\\\empty % beware, no grouping 
      \setbox\scratchbox\hbox{#1}%
      \edef\characterassignwidth{\the\wd\scratchbox}%
      \setbox\scratchbox\hbox{}%
      % new 12,34 vs 10\\ where 10 aligns on 12 if #1 = , 
      \ifcase\characteralignmentslot
        \docheckalignment#1##1#1\relax\relax
        \scratchdimen\wd\scratchbox
        \setbox\scratchbox\hbox{##1\unskip}%
      \else
        \def\\{#1}%
        \expanded{\docheckalignment#1##1#1\relax\relax}%
        \scratchdimen\wd\scratchbox
        \setbox\scratchbox\hbox
          {\def\\{\hphantom{#1}}##1}%     
      \fi
      \ifdim\scratchdimen=\wd\scratchbox
        \ifcase\characteralignmentmode
          \noindent\box\scratchbox
        \else
          \noindent\hbox
            {\dontcomplain
             \hbox to \beforeassignwidth
               {\ifcase\characteralignmentmode\or
                  \box\scratchbox\hss
                \or
                  \hss\box\scratchbox\hskip\characterassignwidth
                \or
                  \hss\rlap{\box\scratchbox}%
                \or
                  \hss\rlap{\hbox to \afterassignwidth{\hss\box\scratchbox}}%
                \fi}%
             \hskip\afterassignwidth}%
        \fi
      \else
        \noindent\hbox
          {\hbox to \beforeassignwidth
             {\hss\box\scratchbox\hskip-\scratchdimen}%
           \hskip\afterassignwidth}%
      \fi}%
   \def\docheckalignment##1#1##2##3\relax
     {\ifx##2\relax
        \setbox\scratchbox\hbox{##1}%
      \else
        \docheckalignment##2##3\relax
      \fi}}

% provide a means to use multiple alignments mixed

\def\pushcharacteralign
  {\setxvalue{@cac@\alignmentclass}{\noexpand\do
     {\afterassignwidth}{\beforeassignwidth}{\alignmentcharacter}}}

\def\popcharacteralign
  {\def\do##1##2##3%
     {\def\afterassignwidth  {##1}%
      \def\beforeassignwidth {##2}%
      \def\alignmentcharacter{##3}}%
   \getvalue{@cac@\alignmentclass}}

\long\def\startcharacteralign#1\stopcharacteralign
  {\bgroup
   \setfirstpasscharacteralign #1%
   \setsecondpasscharacteralign#1%
   \egroup}

\protect \endinput 
