Hans et al,

I am going to assume that all of this is saved as math-ext.tex. None of it goes anywhere else at the moment. Correct?

Also, I assume that:

  \ifx\startalign\undefined \input math-ext.tex \fi

still needs to go into cont-new.tex.

Correct?

On Jan 17, 2006, at 5:50 AM, Hans Hagen wrote:

Hi,

Attached is a new version of math-ext

- multiple columns
- alignment per column

See examples in source (mixed &|cr and NC|NR is no longer supported).

That's all the math for this week.

Hans
%D \module
%D   [       file=math-ext,
%D        version=2006.01.14,
%D          title=\CONTEXT\ Math Macros,
%D       subtitle=Extra Macros,
%D         author={Hans Hagen \& Taco Hoekwater},
%D           date=\currentdate,
%D      copyright=\PRAGMA]
%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 This will go into core-mat

%M \ifx\startalign\undefined \input math-ext.tex \fi

% some simple math constructs (based on user requests)
%
% preliminary

\unprotect

% adapted stuff

% we need to make this plain code a bit more 'readable'

\def\openup
  {\afterassignment\dopenup\scratchdimen=}

\def\dopenup
  {\advance\lineskip     \scratchdimen
   \advance\baselineskip \scratchdimen
   \advance\lineskiplimit\scratchdimen}

\def\jot{.25\bodyfontsize} % plain tex: 3 pt (todo: better name)

[EMAIL PROTECTED]

[EMAIL PROTECTED] % \presetdisplayspacing or so
  [EMAIL PROTECTED]
   \openup\jot
   \mathsurround\zeropoint
   \everycr{\noalign{%
      [EMAIL PROTECTED]
        [EMAIL PROTECTED]
        \ifdim\prevdepth>-\thousandpoint
          \vskip-\lineskiplimit
          \vskip\normallineskiplimit
        \fi
      \else
        \penalty\interdisplaylinepenalty
      \fi}}}

% context (hooks)

[EMAIL PROTECTED]@y

[EMAIL PROTECTED]@y}

[EMAIL PROTECTED]

% plain tex value: \centering = 0pt plus 1000pt minus 1000pt
% plain tex valye: \jot = 3pt

% n>1 #### needed, strange # interaction (maybe we need a toks in recurse ane no macro)

\def\buildeqalign
  {\scratchtoks\emptytoks
   \dorecurse{\mathalignparameter\c!m}
     {\ifnum\recurselevel>\plusone
        \appendtoks
          \tabskip\mathalignparameter\c!distance&\tabskip\zeropoint
        \to\scratchtoks
      \fi
      \expanded{\scratchtoks{\the\scratchtoks\the\!!toksa}}%
      \dorecurse{\numexpr\mathalignparameter\c!n-\plusone\relax}
        {\expanded{\scratchtoks{\the\scratchtoks\the\!!toksb}}}}%
   \expanded{\scratchtoks{\the\scratchtoks\the\!!toksc}}}

\def\forgetalign
  {\tabskip\zeropoint\everycr\emptytoks}

\let\firstineqalign\empty
\let\nextineqalign \empty
\let\leftofeqalign \empty
\let\rightofeqalign\empty

\def\mathineqalign#1{$\forgetalign\displaystyle{{}#1{}}$}
\def\textineqalign#1{$\forgetalign#1$}

\def\eqalign#1% why no halign here, probably because of displaywidth
  {\!!toksa{\strut\hfil$\displaystyle{##}$}%
   \!!toksb{&$\displaystyle{{}##{}}$\hfil}%
   \!!toksc\emptytoks
   \buildeqalign
   \null\,\vcenter
     {\openup\jot
      \mathsurround\zeropoint
\expandafter \ialign \expandafter {\the\scratchtoks\crcr#1 \crcr}%
   }\,}

% preamble is scanned for tabskips so we need the span to prevent an error message

\def\prepareeqalignno
{\!!toksa{\strut\firstineqalign\hfil\leftofeqalign\span \mathineqalign{##}\rightofeqalign\tabskip\zeropoint}% \!!toksb{&\nextineqalign\leftofeqalign\span\mathineqalign{##} \rightofeqalign\tabskip\zeropoint}% \!!toksc{\hfil\tabskip\centering&\llap{\span\textineqalign{##}} \tabskip\zeropoint}%
   \buildeqalign
   \presetdisplaymath
   \tabskip\centering}

\def\prepareleqalignno
{\!!toksa{\strut\firstineqalign\hfil\leftofeqalign\span \mathineqalign{##}\rightofeqalign\tabskip\zeropoint}% \!!toksb{&\nextineqalign\leftofeqalign\span\mathineqalign{##} \rightofeqalign\tabskip\zeropoint}% \!!toksc{\hfil\tabskip\centering&\kern-\displaywidth\rlap{\span \textineqalign{##}}\tabskip\displaywidth}%
   \buildeqalign
   \presetdisplaymath
   \tabskip\centering}

\chardef\eqalignmode=1

\def\eqalignno#1%
  {\prepareeqalignno
\halign \ifcase\eqalignmode \or to \displaywidth \fi [EMAIL PROTECTED] {\the \scratchtoks\crcr#1\crcr}}

\def\leqalignno#1%
  {\prepareleqaligno
\halign \ifcase\eqalignmode \or to \displaywidth \fi [EMAIL PROTECTED] {\the \scratchtoks\crcr#1\crcr}}

\def\aligneqalignno
  {\prepareeqalignno
\halign \ifcase\eqalignmode \or to \displaywidth \fi [EMAIL PROTECTED] \bgroup \the\scratchtoks\crcr}

\def\alignleqalignno
  {\prepareleqalignno
\halign \ifcase\eqalignmode \or to \displaywidth \fi [EMAIL PROTECTED] \bgroup \the\scratchtoks\crcr}

\def\finishalignno
  {\crcr\egroup}

\definesystemvariable{eq}

\def\setupmathalign
  {\dodoubleempty\dosetupmathalign}

\def\dosetupmathalign[#1][#2]%
  {\ifsecondargument
     \getparameters[\??eq#1][#2]%
   \else
     \getparameters[\??eq][#1]%
   \fi}

\let\currentmathalign\empty

\def\mathalignparameter#1%
{\executeifdefined{\??eq\currentmathalign#1}{\executeifdefined{\?? eq#1}\empty}}

\setupmathalign
  [\c!n=2,
   \c!m=1,
   \c!distance=1em]

\def\numberedeqalign
  {\doifelse\@@fmlocation\v!left\alignleqalignno\aligneqalignno}

\def\doxxdoubleempty#1#2%
{\ifx#2[\expandafter\dodoxxdoubleempty\else\expandafter \noxxdoubleempty\fi#1#2}

\def\dodoxxdoubleempty#1[#2]#3%
  {\ifx#3[\else\expandafter\nonoxxdoubleempty\fi#1[#2]#3}

\def\noxxdoubleempty      #1{#1[][]}
\def\nonoxxdoubleempty#1[#2]{#1[#2][]}

\newcount\eqaligncolumn

\def\firstineqalign{\global\eqaligncolumn\plusone}
\def\nextineqalign {\global\advance\eqaligncolumn\plusone}
\def\leftofeqalign {\getvalue{\??eq:\v!left :\number\eqaligncolumn}}
\def\rightofeqalign{\getvalue{\??eq:\v!right:\number\eqaligncolumn}}

\def\doseteqaligncolumn#1%
  {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\empty
   \letvalue{\??eq:\v!right:\number\eqaligncolumn}\empty
\doif{#1}\v!left {\letvalue{\??eq:\v!right:\number \eqaligncolumn}\hfill}% \doif{#1}\v!right {\letvalue{\??eq:\v!left :\number \eqaligncolumn}\hfill}% \doif{#1}\v!middle{\letvalue{\??eq:\v!right:\number \eqaligncolumn}\hfill \letvalue{\??eq:\v!left :\number \eqaligncolumn}\hfill}}

\def\dodoalignNC
  {\gdef\doalignNC##1{&##1}}

\def\doalignNR[#1][#2]%
  {\doifsomething{#1}
     {\doifelse{#1}{+}
        {\doformulanumber[][#2][]{}}
        {\doformulanumber[#1][#2][]{}}}%
   \crcr}

\def\dostartmathalign[#1][#2]%
  {\pushmacro\doalignNC
   \edef\currentmathalign{#1}%
   \doifassignmentelse{#2}{\setupmathalign[#1][#2]}\donothing
   \def\NC{\doalignNC}%
   \global\let\doalignNC\dodoalignNC
   \def\EQ{&=}%
\def\NR{&\global\let\doalignNC\dodoalignNC\doxxdoubleempty \doalignNR}%
   % amstex compatibility mode: (ugly)
   \def\notag{\def\\{&\crcr}}%
   \doifelse{#2}{*}{\def\\{&\crcr}}{\def\\{&\doalignNR[+][]\crcr}}%
   % end of compatibility mode
   \eqaligncolumn\zerocount
\processcommacommand[\mathalignparameter\c!align]{\advance \eqaligncolumn\plusone\doseteqaligncolumn}%
   % the real action
   \global\eqaligncolumn\plusone
   \numberedeqalign}

\def\dostopmathalign
  {\finishalignno
   \popmacro\doalignNC}

\def\definemathalign
  {\dodoubleempty\dodefinemathalign}

\def\dodefinemathalign[#1]% [#2]%
  {\setvalue{\e!start#1}{\dodoubleempty\dostartmathalign[#1]}%
   \setvalue{\e!stop #1}{\dostopmathalign}%
   \setupmathalign[#1]}% [#2]

\definemathalign[align]     % default case

% \def\startsplit
%   {\startalign[*]} % no number by default
%
% \def\stopsplit
%   {&\doalignNR[+][]\crcr % for a number on last line
%    \stopalign}

%D \startbuffer
%D \placeformula \startformula \eqalignno {
%D  a &= b & \formulanumber \cr
%D  c &= d \cr
%D    &= e \cr
%D    &= f & \formulanumber
%D } \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula \startformula \startalign
%D \NC  a \EQ b \NR[+]
%D \NC  c \EQ d \NR
%D \NC    \EQ f \NR[for:demo-a-1]
%D \NC    \EQ g \NR[for:demo-a-2][a]
%D \NC    \EQ h \NR[for:demo-a-3][b]
%D \NC    \EQ i \NR
%D \stopalign \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula \startformula \startalign
%D \NC a \EQ b \NR[+]
%D \NC c \EQ d \NR
%D \NC   \EQ f \NR
%D \NC   \EQ g \NR
%D \NC   \EQ h \NR
%D \NC   \EQ i \NR[+]
%D \stopalign \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula \startformula \startalign
%D a &= b \\
%D c &= d \notag \\
%D   &= e \notag \\
%D   &= f \\
%D \stopalign \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula \startformula \startalign
%D \NC  a \NC \eq  b \NR[+]
%D \NC  c \NC \neq d \NR
%D \NC    \NC \neq f \NR[for:demo-b-1]
%D \NC    \NC \geq g \NR[for:demo-b-2][a]
%D \NC    \NC \leq h \NR[for:demo-b-3][b]
%D \NC    \NC \neq i \NR
%D \stopalign \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula \startformula \startalign[*]
%D a &= b \\
%D c &= d \\
%D   &= e \\
%D   &= f \\
%D \stopalign \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula \startformula \startalign
%D     x &= y \\
%D     a &= b \\
%D \stopalign \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula \startformula \startalign[m=3]
%D     x &= y & x &= y & z &= t \\
%D     a &= b & p &= q & w &= s \\
%D \stopalign \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula \startformula \startalign[m=3,distance=0pt]
%D     x &= y &= x &= y &= z &= t \\
%D     a &= b &= p &= q &= w &= s \\
%D \stopalign \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula \startformula \startalign[n=5,distance=0pt]
%D     x &= yy &= xx &= yy &= zz \\
%D     a &= b  &= p  &= q  &= w  \\
%D \stopalign \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula \startformula \startalign[n=3,align= {left,middle,right}]
%D \NC       l \NC = \NC r     \NR
%D \NC    left \NC = \NC right \NR
%D \stopalign \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula \startformula \startalign[n=3,align= {right,middle,left}]
%D \NC       l \NC = \NC r     \NR
%D \NC    left \NC = \NC right \NR
%D \stopalign \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula \startformula \startalign[n=3,align= {middle,middle,middle}]
%D \NC       l \NC = \NC r     \NR
%D \NC    left \NC = \NC right \NR
%D \stopalign \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer

% BEGIN OF PATCH (CORE-MAT.TEX)

\def\doplaceformula[#1][#2]% #2 = dummy, gobbles spaces
  {\def\redoplaceformula
     {\bgroup
      \ifx\next\bgroup
        \egroup [EMAIL PROTECTED] % [ref]{}
      \else
        \def\nextnext{$}%
        \ifx\next\nextnext
          \egroup [EMAIL PROTECTED] % [ref]$$
        \else
          \egroup [EMAIL PROTECTED] % [ref]\start
        \fi
      \fi[#1]{}}%
   \futurelet\next\redoplaceformula}

\long\def\moreplaceformula[#1]#2#3#4% #2 dummy #4 gobbles spaces
  {\def\redoplaceformula
     {\bgroup
      \def\nextnext{$}%
      \ifx\next\nextnext
        \egroup [EMAIL PROTECTED] % [ref]$$
      \else
        \egroup [EMAIL PROTECTED] % [ref]\start
      \fi
      [#1]{#3}}%
   \futurelet\next\redoplaceformula#4}

% END OF PATCH

\def\startformulas#1\stopformulas
  {\bgroup
   \forgetdisplayskips
   \startdisplaymath
   \setlocalhsize
\long\def\startformula##1\stopformula{\advance\scratchcounter \plusone}%
   \scratchcounter\zerocount #1% preroll
   \divide \hsize \scratchcounter
   \hbox to \localhsize \bgroup
     \hss
     \def\normalstartformula{\vskip-\strutdepth$$}% i hate this
     \def\normalstopformula {$$}%
   % \def\jot{0pt}%
     \def\startformula{$\vcenter\bgroup\normalstartformula}%
     \def\stopformula {\normalstopformula\egroup$\hss}%
     #1%
     \egroup
     \stopdisplaymath
   \egroup}

%D \startbuffer
%D \placeformula
%D \startformula
%D     \startalign[n=3,align={middle,middle,middle}]
%D         \NC a  \NC = \NC b  \NR[+]
%D         \NC 2a \NC = \NC 2b \NR
%D     \stopalign
%D \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula
%D \startformulas
%D     \setupmathalign[n=3,align={middle,middle,middle}]%
%D     \startformula
%D         \startalign
%D             \NC a  \NC = \NC b  \NR[+]
%D             \NC 2a \NC = \NC 2b \NR
%D         \stopalign
%D     \stopformula
%D     \startformula
%D         \startalign
%D             \NC a  \NC = \NC b  \NR[+]
%D             \NC 2a \NC = \NC 2b \NR
%D         \stopalign
%D     \stopformula
%D \stopformulas
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D \startbuffer
%D \placeformula
%D \startformulas
%D     \dorecurse{5}{\startformula
%D         \startalign[n=3,align={middle,middle,middle}]
%D             \NC a  \NC = \NC b  \NR[+]
%D             \NC 2a \NC = \NC 2b \NR
%D         \stopalign
%D     \stopformula}
%D \stopformulas
%D \stopbuffer
%D
%D \typebuffer \getbuffer

\protect \endinput
_______________________________________________
ntg-context mailing list
ntg-context@ntg.nl
http://www.ntg.nl/mailman/listinfo/ntg-context

_______________________________________________
ntg-context mailing list
ntg-context@ntg.nl
http://www.ntg.nl/mailman/listinfo/ntg-context

Reply via email to