%D The following bunch of macros come from plain \TEX\ by
%D Don Knuth and deal with basic alignment. We just include
%D them here so that they can be used if needed. Normally,
%D \CONTEXT\ users will fall back on one of the three table
%D environments.
%D
%D The hidden names are somewhat adapted and we use other
%D local variables.

\writestatus{loading}{ConTeXt Table Macros / Plain Tabular}

%D This code might become a module.

\unprotect

\newconditional \c_tabl_plain_cr
\newconditional \c_tabl_plain_use_tab
\newbox         \b_tabl_plain_tabs
\newbox         \b_tabl_plain_tabs_yet
\newbox         \b_tabl_plain_tabs_done
\newdimen       \d_tabl_plain_tab

\let\m_tabl_plain_next\relax

\def\cleartabs % visible
  {\global\setbox\b_tabl_plain_tabs_yet\emptyhbox
   \setbox\b_tabl_plain_tabs\emptyhbox}

\def\settabs % visible
  {\setbox\b_tabl_plain_tabs\emptyhbox
   \futurelet\m_tabl_plain_next\tabl_plain_set_tabs}

\def\tabalign % visible
  {\settrue\c_tabl_plain_use_tab
   \tabl_plain_make_tab_box}

\ifdefined\+ \else
    \let\+\tabalign % no outer here (can be overloaded)
\fi

\def\tabl_plain_set_tabs
  {\ifx\m_tabl_plain_next\+%
     \let\tabl_plain_nxt\tabl_plain_align
   \else\ifx\m_tabl_plain_next\tabalign % added hh
     \let\tabl_plain_nxt\tabl_plain_align
   \else
     \let\tabl_plain_nxt\tabl_plain_set_cols
   \fi\fi
   \let\m_tabl_plain_next\relax
   \tabl_plain_nxt}

\def\tabl_plain_align
  {\afterassignment\tabl_plain_set_tab
   \let\tabl_plain_nxt}

\def\tabl_plain_set_tab
  {\let\tabl_plain_nxt\relax
   \setfalse\c_tabl_plain_use_tab
   \tabl_plain_make_tab_box}

\def\tabl_plain_set_cols#1\columns
  {\scratchcounter#1\relax
   \d_tabl_plain_tab\hsize
   \loop
     \ifnum\scratchcounter>\zerocount
       \tabl_plain_other
   \repeat}

\def\tabl_plain_other
  {\scratchdimen\d_tabl_plain_tab
   \divide\scratchdimen\scratchcounter
   \setbox\b_tabl_plain_tabs\hbox
     {\hbox to\scratchdimen{}%
      \unhbox\b_tabl_plain_tabs}%
   \advance\d_tabl_plain_tab-\scratchdimen
   \advance\scratchcounter\minusone}

\def\tabl_plain_make_tab_box
  {\begingroup
   \let\+\tabalign % added hh
   \global\setbox\b_tabl_plain_tabs_yet\copy\b_tabl_plain_tabs
   \global\setbox\b_tabl_plain_tabs_done\emptyhbox
   \let\cr\tabl_plain_cr
   \setbox\scratchbox\vbox\bgroup
     \setfalse\c_tabl_plain_cr
     \ialign\bgroup
       \aligntab
       \tabl_plain_begin_tab_box
       \alignmark\alignmark
       \tabl_plain_end_tab_box
       \crcr}

\def\tabl_plain_cr
  {\settrue\c_tabl_plain_cr
   \crcr
   \egroup
   \egroup
   \ifconditional\c_tabl_plain_use_tab
     \unvbox\scratchbox
     \lastbox % okay?
   \fi
   \endgroup
   \setbox\b_tabl_plain_tabs\hbox
     {\unhbox\b_tabl_plain_tabs_yet
      \unhbox\b_tabl_plain_tabs_done}}

\def\tabl_plain_begin_tab_box
  {\setbox\scratchbox\hbox\bgroup}

\def\tabl_plain_end_tab_box
  {\ifconditional\c_tabl_plain_cr
     \egroup % now \box\scratchbox holds the column
   \else
     \hss
     \egroup
     \global\setbox\b_tabl_plain_tabs_yet\hbox
       {\unhbox\b_tabl_plain_tabs_yet
        \global\setbox\globalscratchbox\lastbox}% now \box\globalscratchbox holds its size
     \ifvoid\globalscratchbox
       \global\setbox\globalscratchbox\hbox to \wd\scratchbox
         {}%
     \else
       \setbox\scratchbox\hbox to \wd\globalscratchbox
         {\unhbox\scratchbox}%
     \fi
     \global\setbox\b_tabl_plain_tabs_done\hbox
       {\box\globalscratchbox
        \unhbox\b_tabl_plain_tabs_done}%
   \fi
   \box\scratchbox}

\protect \endinput
