summaryrefslogtreecommitdiff
path: root/tex/context/base/core-mat.tex
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/core-mat.tex')
-rw-r--r--tex/context/base/core-mat.tex619
1 files changed, 518 insertions, 101 deletions
diff --git a/tex/context/base/core-mat.tex b/tex/context/base/core-mat.tex
index 4c85f1511..549218563 100644
--- a/tex/context/base/core-mat.tex
+++ b/tex/context/base/core-mat.tex
@@ -17,6 +17,17 @@
\unprotect
+\def\mathortext
+ {\ifmmode
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+% force text mode, will be overloaded later
+
+\ifx\text\undefined \let\text\hbox \fi
+
% will move to page-ini
\newevery \everybeginofpar \EveryBeginOfPar
@@ -84,10 +95,10 @@
\def\setdisplayskip#1#2#3% obsolete
{#1=#2\relax
- \advance#1 by -\parskip
- \advance#1 by -#3\relax}
+ \advance#1 -\parskip
+ \advance#1 -#3\relax}
-\def\setdisplayskips% obsolete
+\def\setdisplayskips % obsolete
{\setdisplayskip\abovedisplayskip \abovedisplayskipsize \!!zeropoint
\setdisplayskip\belowdisplayskip \belowdisplayskipsize \!!zeropoint
\setdisplayskip\abovedisplayshortskip\abovedisplayshortskipsize\baselineskip
@@ -95,11 +106,11 @@
% so far for unused stuff
-\def\forgetdisplayskips% to do
- {\abovedisplayskip \!!zeropoint
- \belowdisplayskip \!!zeropoint
- \abovedisplayshortskip\!!zeropoint
- \belowdisplayshortskip\!!zeropoint}
+\def\forgetdisplayskips % to do
+ {\abovedisplayskip \zeropoint
+ \belowdisplayskip \zeropoint
+ \abovedisplayshortskip\zeropoint
+ \belowdisplayshortskip\zeropoint}
\definieernummer % \doorlabelen
[\v!formule]
@@ -108,7 +119,7 @@
\c!blokwijze=\@@fmblokwijze,
\c!plaats=\v!intekst]
-\def\setupformulas%
+\def\setupformulas
{\dodoubleargument\getparameters[\??fm]}
\newconditional\handleformulanumber
@@ -121,18 +132,18 @@
\verhoognummer[\v!formule]%
\fi
\maakhetnummer[\v!formule]%
- \setbox0=\hbox{\ignorespaces#2\unskip}%
+ \setbox0\hbox{\ignorespaces#2\unskip}%
\ifdim\wd0>\zeropoint
\edef\hetsubnummer{#2}%
\else
\let\hetsubnummer\empty
\fi
\doifsomething{#1}{\rawreference{\s!for}{#1}{\hetnummer\hetsubnummer}}%
- \setbox0=\hbox{\ignorespaces#4\unskip}%
+ \setbox0\hbox{\ignorespaces#4\unskip}%
\ifdim\wd0>\zeropoint
\edef\hetsubnummer{#4}%
\fi
- \doifsomething{#3}{\rawreference{\s!for}{#3}{\hetnummer\hetsubnummer}}%
+ \doifsomething{#3}{\rawreference\s!for{#3}{\hetnummer\hetsubnummer}}%
\rm % nodig ?
\@@fmnummercommando
{\dostartattributes\??fm\c!nummerletter\c!nummerkleur
@@ -149,7 +160,7 @@
\def\dodoformulenummer[#1][#2][#3]%
{\doquadruplegroupempty\dododoformulenummer{#1}{#2}{#3}}
-\def\doformulenummer%
+\def\doformulenummer
{\dotripleempty\dodoformulenummer}
\setvalue{\e!start\e!formule}{\dostartformula{}}
@@ -167,12 +178,10 @@
\c!springvolgendein,\c!variant,
\c!strut,\c!uitlijnen,\c!afstand]%
\setupformulas[#1][#2]%
- \setvalue{\e!start#1\e!formule}%
- {\dostartformula{#1}}%
- \setvalue{\e!stop #1\e!formule}%
- {\dostopformula}}}
+ \setvalue{\e!start#1\e!formule}{\dostartformula{#1}}%
+ \setvalue{\e!stop #1\e!formule}{\dostopformula}}}
-\def\setupformulas%
+\def\setupformulas
{\dodoubleempty\dosetupformulas}
\def\dosetupformulas[#1][#2]%
@@ -211,16 +220,16 @@
\def\displaygridsnapping{\getvalue{\??fm\currentformula\c!grid}}
\def\beforedisplayspace
- {\doifnotvalue{\??fm\currentformula\c!voorwit}{\v!geen}
+ {\doifnotvalue{\??fm\currentformula\c!voorwit}\v!geen
{\blanko[\getvalue{\??fm\currentformula\c!voorwit}]}}
\def\afterdisplayspace
- {\doifnotvalue{\??fm\currentformula\c!nawit}{\v!geen}
+ {\doifnotvalue{\??fm\currentformula\c!nawit}\v!geen
{\blanko[\getvalue{\??fm\currentformula\c!nawit}]}}
\def\setpredisplaysize#1%
- {\predisplaysize=#1\relax
- \ifdim\predisplaysize>\!!zeropoint
+ {\predisplaysize#1\relax
+ \ifdim\predisplaysize>\zeropoint
\advance\predisplaysize \predisplaysizethreshhold
\fi
\advance\predisplaysize \displayindent % needed ?
@@ -228,11 +237,11 @@
\predisplaysize\hsize
\fi}
-\def\setdisplaydimensions%
- {\displayindent=\leftdisplayskip
+\def\setdisplaydimensions
+ {\displayindent\leftdisplayskip
\advance\displayindent\leftdisplaymargin
- \displaywidth=\hsize
- \ifdim\hangindent>\!!zeropoint
+ \displaywidth\hsize
+ \ifdim\hangindent>\zeropoint
\advance\displayindent\hangindent
\else
\advance\displaywidth\hangindent
@@ -243,8 +252,12 @@
\newif\ifoptimizedisplayspacing
-\def\dostartformula#1% setting leftskip adaption is slow !
+\def\dostartformula#1%
+ {\dodoubleempty\dodostartformula[#1]}
+
+\def\dodostartformula[#1][#2]% setting leftskip adaption is slow !
{\bgroup
+ \switchtoformulabodyfont[#2]%
\def\currentformula{#1}%
\doifvaluesomething{\??fm\currentformula\c!marge}% so we test first
{\dosetleftskipadaption{\getvalue{\??fm\currentformula\c!marge}}%
@@ -258,7 +271,7 @@
\forgetdisplayskips
\let\setdisplayskips\relax
\ifoptimizedisplayspacing
- \ifdim\lastlinewidth>\!!zeropoint\relax
+ \ifdim\lastlinewidth>\zeropoint
\abovedisplayshortskip-\ht\strutbox\relax
\fi
\else
@@ -266,57 +279,36 @@
\fi
\getvalue{\e!start\getvalue{\??fm\currentformula\c!variant}\e!formule}}
+\def\switchtoformulabodyfont{\switchtobodyfont}
+
+\setvalue{\e!formule}{\dosingleempty\doformula}
+
+\def\doformula[#1]#2%
+ {\begingroup
+ \switchtoformulabodyfont[#1]%
+ % not : \def\doformula[##1]##2{\mathematics{##2}}%
+ \mathematics{#2}%
+ \endgroup}
+
\let\doplaceformulanumber\empty
-\def\dostopformula%
+\def\dostopformula
{\doplaceformulanumber
\getvalue{\e!stop\getvalue{\??fm\currentformula\c!variant}\e!formule}%
- \egroup
- \resetlastlinewidth
- \nonoindentation
- \doifvalue{\??fm\currentformula\c!springvolgendein}{\v!nee}
- {\noindentation}}
+ \resetlastlinewidth
+ \nonoindentation
+ \doifvalue{\??fm\currentformula\c!springvolgendein}\v!nee\noindentation
+ \egroup}
\newif\ifinformula
-% \def\startdisplaymath%
-% {\ifgridsnapping
-% \beforedisplayspace
-% \snaptogrid[\displaygridsnapping]\vbox
-% \bgroup
-% \informulatrue
-% \forgetall
-% \else
-% \bgroup
-% \informulatrue
-% %\forgetall % otherwise backgrounds fail
-% \ifdim\lastskip<\!!zeropoint\else
-% \par\ifvmode\ifdim\parskip>\!!zeropoint\relax\vskip-\parskip\fi\fi
-% \fi
-% \beforedisplayspace
-% \par\ifvmode\vbox{\strut}\vskip-2\baselineskip\fi
-% \fi
-% $$\setdisplaydimensions
-% \setpredisplaysize\lastlinewidth
-% \startinnermath}
-%
-% \def\stopdisplaymath%
-% {\stopinnermath
-% $$%
-% \ifgridsnapping
-% \else
-% \par\ifvmode\ifdim\parskip>\zeropoint\vskip-\parskip\fi\fi
-% \fi
-% \afterdisplayspace
-% \egroup}
-
-\def\startdisplaymath%
+\def\startdisplaymath
{\ifgridsnapping
\beforedisplayspace
\snapmathtogrid\vbox
\bgroup
\informulatrue
- \forgetall
+ %\forgetall % breaks side floats
\else
\bgroup
\informulatrue
@@ -331,7 +323,7 @@
\setpredisplaysize\lastlinewidth
\startinnermath}
-\def\stopdisplaymath%
+\def\stopdisplaymath
{\stopinnermath
$$%
\ifgridsnapping
@@ -372,7 +364,7 @@
\def\moveformula
{\dosingleempty\domoveformula}
-\def\domoveformula[#1]%
+\def\domoveformula[#1]% brr gaat mogelijk fout
{\ifgridsnapping
\iffirstargument
\xdef\displaygridcorrection{#1}%
@@ -380,13 +372,13 @@
\gdef\displaygridcorrection{-\v!boven}% handy with short preline
\fi
\else
- \gdef\displaygridcorrection{\displaygridsnapping}
+ \gdef\displaygridcorrection{\displaygridsnapping}%
\fi}
\let\startinnermath\empty
\let\stopinnermath \empty
-\def\defineformulaalternative%
+\def\defineformulaalternative
{\dotripleargument\dodefineformulaalternative}
\def\dodefineformulaalternative[#1][#2][#3]%
@@ -415,14 +407,12 @@
\definieerformule
[mp]
- [%\c!voorwit=,\c!nawit=,
- \c!springvolgendein=\v!nee,
+ [\c!springvolgendein=\v!nee,
\c!variant=multi]
\definieerformule
[md]
- [%\c!voorwit=,\c!nawit=,
- \c!springvolgendein=\v!ja,
+ [\c!springvolgendein=\v!ja,
\c!variant=multi]
% in m-math
@@ -448,30 +438,61 @@
% \plaatsformule {f} \startspformule \fakespacingformula \stopspformule
% \fakewords{20}{40}
-\def\plaatsformule%
+% \convertcommand\next\to\ascii \getfirstcharacter\ascii
+% \ifx\firstcharacter\letterbackslash % a \cs
+
+\def\plaatsformule
{\settrue\incrementformulanumber
\dodoubleempty\doplaatsformule}
-\def\plaatssubformule%
+\def\plaatssubformule
{\setfalse\incrementformulanumber
\dodoubleempty\doplaatsformule}
+% \def\doplaatsformule[#1][#2]% #2 = dummy, gobbles spaces
+% {\def\redoplaatsformule
+% {\bgroup\def\dostartformula####1{\relax}%
+% \ifx\next\bgroup
+% \@EA\moreplaatsformule % [ref]{}
+% \else\if\next\relax % a \cs
+% \egroup \@EA\@EA\@EA\dodoplaatsformule % [ref]\start
+% \else
+% \egroup \@EA\@EA\@EA\dispplaatsformule % [ref]$$
+% \fi\fi
+% [#1]{}}%
+% \futurelet\next\redoplaatsformule}
+%
+% \long\def\moreplaatsformule[#1]#2#3#4% #2 dummy #4 gobbles spaces
+% {\def\redoplaatsformule%
+% {\if\next\relax % a \cs
+% \egroup \expandafter\dodoplaatsformule % [ref]{}\start
+% \else
+% \egroup \expandafter\dispplaatsformule % [ref]{}$$
+% \fi
+% [#1]{#3}}%
+% \futurelet\next\redoplaatsformule#4}
+
\def\doplaatsformule[#1][#2]% #2 = dummy, gobbles spaces
- {\def\redoplaatsformule%
+ {\def\redoplaatsformule
{\bgroup\def\dostartformula####1{\relax}%
\ifx\next\bgroup
\@EA\moreplaatsformule % [ref]{}
- \else\if\next\relax % a \cs
- \egroup \@EA\@EA\@EA\dodoplaatsformule % [ref]\start
\else
- \egroup \@EA\@EA\@EA\dispplaatsformule % [ref]$$
- \fi\fi
+ \convertcommand\next\to\ascii
+ \getfirstcharacter\ascii
+ \ifx\firstcharacter\letterbackslash % a \cs
+ \egroup \@EAEAEA\dodoplaatsformule % [ref]\start
+ \else
+ \egroup \@EAEAEA\dispplaatsformule % [ref]$$
+ \fi
+ \fi
[#1]{}}%
\futurelet\next\redoplaatsformule}
\long\def\moreplaatsformule[#1]#2#3#4% #2 dummy #4 gobbles spaces
- {\def\redoplaatsformule%
- {\if\next\relax % a \cs
+ {\def\redoplaatsformule
+ {\convertcommand\next\to\ascii \getfirstcharacter\ascii
+ \ifx\firstcharacter\letterbackslash % a \cs
\egroup \expandafter\dodoplaatsformule % [ref]{}\start
\else
\egroup \expandafter\dispplaatsformule % [ref]{}$$
@@ -492,15 +513,15 @@
{\setfalse\handleformulanumber}
{\settrue\handleformulanumber}}%
\ifconditional\handleformulanumber
- \def\formulenummer%
+ \def\formulenummer
{%\global\let\subformulenummer\doformulenummer % no, bug
\doformulenummer[#1][#2]}%
- \def\subformulenummer%
+ \def\subformulenummer
{\setfalse\incrementformulanumber
\formulenummer}%
- \gdef\doplaceformulanumber%
+ \gdef\doplaceformulanumber
{\global\let\doplaceformulanumber\empty
- \doifelse{\@@fmplaats}{\v!links}
+ \doifelse\@@fmplaats\v!links
{\normalleqno{\doformulenummer[#1][#2][]{}}}
{\normalreqno{\doformulenummer[#1][#2][]{}}}}%
\else
@@ -533,13 +554,13 @@
%D \type {\stopinnermath} can be overloaded in specialized
%D modules.
-\def\startinnermath%
+\def\startinnermath
{\getvalue{\e!start\??fm\getvalue{\??fm\currentformula\c!uitlijnen}}}
-\def\stopinnermath%
+\def\stopinnermath
{\getvalue{\e!stop \??fm\getvalue{\??fm\currentformula\c!uitlijnen}}}
-\def\mathinnerstrut%
+\def\mathinnerstrut
{\doifvalue{\??fm\currentformula\c!strut}{\v!ja}{\strut}}
\long\def\defineinnermathhandler#1#2#3%
@@ -548,7 +569,7 @@
\newif\iftracemath
-\def\mathhbox%
+\def\mathhbox
{\iftracemath\ruledhbox\else\hbox\fi}
\def\startmathbox#1#2%
@@ -725,6 +746,21 @@
%D We already redefined \type {\bordermatrix} in \type
%D {font-ini}.
+%D \macros
+%D {setuptextformulas}
+%D
+%D This command sets up in||line math. Most features deals
+%D with grid snapping and are experimental.
+
+\newevery \everysetuptextformulas \relax
+
+\def\setuptextformulas
+ {\dosingleempty\dosetuptextformulas}
+
+\def\dosetuptextformulas[#1]%
+ {\getparameters[\??mt][#1]%
+ \the\everysetuptextformulas}
+
%D \macros
%D {super, sub}
%D
@@ -740,7 +776,7 @@
\newevery\everysupersub \EverySuperSub
-\appendtoks \advance\supersubmode by 1 \to \everysupersub
+\appendtoks \advance\supersubmode \plusone \to \everysupersub
% \def\dodosuper#1{\normalsuper{\the\everysupersub#1}}
% \def\dodosuber#1{\normalsuber{\the\everysupersub#1}}
@@ -750,9 +786,101 @@
%
% \def\super{\futurelet\next\dosuper}
% \def\suber{\futurelet\next\dosuber}
+%
+% \def\super#1{\normalsuper{\the\everysupersub#1}}
+% \def\suber#1{\normalsuber{\the\everysupersub#1}}
+
+\appendtoks
+ \gridsupsubstyle
+\to \everysupersub
+
+\appendtoks
+ \doifelse\@@mtformaat\v!klein
+ {\let\gridsupsubstyle \scriptscriptstyle
+ \let\gridsupsubbodyfont \setsmallbodyfont}%
+ {\let\gridsupsubstyle \scriptstyle
+ \let\gridsupsubbodyfont \relax}%
+\to \everysetuptextformulas
+
+\setuptextformulas
+ [\c!formaat=\v!normaal]
+
+\def\dogridsupsub#1#2%
+ {\begingroup
+ \setbox\nextbox\iftracegridsnapping\ruledhbox\else\hbox\fi
+ {\gridsupsubbodyfont
+ $\strut^{\the\everysupersub#1}_{\the\everysupersub#2}$}%
+ \nextboxht\strutheight
+ \nextboxdp\strutdepth
+ \box\nextbox
+ \endgroup}
+
+\def\gridsupsub
+ {\ifconditional\crazymathsnapping
+ \ifgridsnapping
+ \@EAEAEA\dogridsupsub
+ \else
+ \@EAEAEA\normalsupsub
+ \fi
+ \else
+ \@EA\normalsupsub
+ \fi}
+
+\def\normalsupsub#1#2%
+ {^{\the\everysupersub#1}_{\the\everysupersub#2}}
-\def\super#1{\normalsuper{\the\everysupersub#1}}
-\def\suber#1{\normalsuber{\the\everysupersub#1}}
+\appendtoks
+ \let\gridsupsubstyle \relax
+ \let\gridsupsubbodyfont\relax
+ \let\gridsupsub \normalsupsub
+\to \everydisplay
+
+\def\super#1{^{\the\everysupersub#1}}
+\def\suber#1{_{\the\everysupersub#1}}
+\def\supsub#1#2{\super{#1}\suber{#2}}
+\def\subsup#1#2{\suber{#1}\super{#2}}
+
+%\def\super#1{\gridsupsub{#1}{}} %
+%\def\suber#1{\gridsupsub{}{#1}} %
+%
+%\def\supsub#1#2{\gridsupsub{#1}{#2}}
+%\def\subsup#1#2{\gridsupsub{#2}{#1}}
+
+\def\gridsuper#1{\gridsupsub{#1}{}}
+\def\gridsuber#1{\gridsupsub{}{#1}}
+
+% \let\sup\super % math char
+% \let\sub\suber
+
+% test set:
+%
+% \startbuffer
+% \sform{x\frac{1}{2}}
+% \sform{x\sup{\frac{1}{2}} + x\sup{2} + 2}
+% \sform{x\supsub{\frac{1}{2}}{\frac{1}{2}} + x\sup{2} + 2}
+% \stopbuffer
+%
+% \typebuffer
+%
+% \startlines
+% \getbuffer
+% \stoplines
+%
+% \startbuffer
+% $x\frac{1}{2}$
+% $x\sup{\frac{1}{2}} + x^2 + 2$
+% $x\supsub{\frac{1}{2}}{\frac{1}{2}} + x^2 + 2$
+% \stopbuffer
+%
+% \typebuffer
+%
+% \start
+% \enablesupersub
+% \enableautomath
+% \startlines
+% \getbuffer
+% \stoplines
+% \stop
%D \macros
%D {enablesupersub}
@@ -763,20 +891,267 @@
\bgroup
\catcode`\^=\@@active
\catcode`\_=\@@active
-\gdef\enablesupersub%
+\gdef\enablesupersub
{\catcode`\^=\@@active
\def^{\ifmmode\expandafter\super\else\expandafter\normalsuper\fi}%
\catcode`\_=\@@active
\def_{\ifmmode\expandafter\suber\else\expandafter\normalsuber\fi}}
\egroup
+%D \macros
+%D {enableautomath}
+%D
+%D The next one can be dangerous, but handy in controlled
+%D situations.
+
+\bgroup \catcode`\$=\active
+
+\gdef\enableautomath
+ {\catcode`\$=\active
+ \def$##1${\snappedinlineformula{##1}}}
+
+% \gdef\enableautomath
+% {\catcode`\$=\active
+% \def${\doifnextcharelse$\doautodmath\doautoimath}%
+% \def\doautoimath##1${\snappedinlineformula{##1}}%
+% \def\doautodmath$##1$${\startformula##1\stopformula}}
+
+\egroup
+
+%D \macros
+%D {...}
+%D
+%D New and experimental: snapping big inline math!
+
+\newconditional\halfcrazymathlines % \settrue\halfcrazymathlines
+\newconditional\crazymathsnapping % \settrue\crazymathsnapping
+
+\appendtoks
+ \doifelse\@@mtgrid\v!ja
+ {\settrue \crazymathsnapping }{\setfalse\crazymathsnapping}%
+ \doifelse\@@mtstap\v!halveregel
+ {\settrue \halfcrazymathlines}{\setfalse\halfcrazymathlines}%
+\to \everysetuptextformulas
+
+\setuptextformulas
+ [\c!grid=\v!ja,
+ \c!stap=\v!regel]
+
+\newcount\crazymathhack
+
+\let\lastcrazymathline \!!zeropoint
+\let\lastcrazymathpage \!!zerocount
+\let\lastcrazymathprelines \!!zerocount
+\let\lastcrazymathpostlines\!!zerocount
+
+\def\crazymathtag{amh:\the\crazymathhack}
+\def\crazytexttag{\v!tekst:\lastcrazymathpage}
+
+\def\crazymathindent{\hskip\MPx\crazymathtag\hskip-\MPx\crazytexttag}
+
+\def\flushcrazymathbox
+ {\nextboxht\strutheight
+ \nextboxdp\strutdepth
+ \hbox{\iftracegridsnapping\ruledhbox\fi{\flushnextbox}}}
+
+% possible pdftex bug:
+%
+% \dorecurse{100}{gest \vadjust {\strut} \par} \page
+% \dorecurse{100}{gest \vadjust pre {\strut} \par} \page
+%
+% duplicate depth compensation with pre
+
+\def\snappedinlineformula
+ {\dosingleempty\dosnappedinlineformula}
+
+\def\dosnappedinlineformula[#1]#2%
+ {\ifvmode\dontleavehmode\fi % tricky
+ \strut % prevents funny space at line break
+ \begingroup % interesting: \bgroup can make \vadjust disappear
+ \ifconditional\crazymathsnapping
+ \ifgridsnapping
+ \ifx\pdftexversion\undefined
+ \donefalse
+ \else
+ \checktextbackgrounds % we need pos tracking, to be made less redundant
+ \donetrue
+ \fi
+ \else
+ \donefalse
+ \fi
+ \else
+ \donefalse
+ \fi
+ \ifdone
+ \setbox\nextbox\hbox{$#2$}%
+ \ifdim\nextboxht>\strutheight\relax
+ \donetrue
+ \else\ifdim\nextboxdp>\strutdepth\relax
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \fi
+ \ifdone
+ \ifdim\nextboxht<\lineheight\relax
+ \ifdim\nextboxdp<\strutheight\relax
+ \donetrue
+ \else
+ \donefalse
+ \fi
+ \else
+ \donefalse
+ \fi
+ \ifdone
+ \flushcrazymathbox
+ \else
+ \doif{#1}-{\settrue \halfcrazymathlines}%
+ \doif{#1}+{\setfalse\halfcrazymathlines}%
+ \global\advance\crazymathhack\plusone
+ \donefalse
+ \ifnum\MPp\crazymathtag=\lastcrazymathpage\relax
+ \ifdim\MPy\crazymathtag=\lastcrazymathline\relax
+ \donetrue
+ \fi
+ \fi
+ \ifnum\MPp\crazymathtag=\zerocount \donefalse \fi
+ \ifdim\MPy\crazymathtag=\zeropoint \donefalse \fi
+ \ifdone
+ % same page and same line
+ \else
+ \global\let\lastcrazymathprelines \!!zerocount
+ \global\let\lastcrazymathpostlines\!!zerocount
+ \xdef\lastcrazymathpage{\MPp\crazymathtag}%
+ \xdef\lastcrazymathline{\MPy\crazymathtag}%
+ \fi
+ \getrawnoflines\nextboxht
+ \scratchcounter\noflines
+ \advance\noflines-\lastcrazymathprelines\relax
+ \ifnum\noflines>\zerocount
+ \xdef\lastcrazymathprelines{\the\scratchcounter}%
+ \scratchdimen\noflines\lineheight
+ \ifconditional\halfcrazymathlines
+ \advance\scratchdimen-.5\lineheight
+ \fi
+ \advance\scratchdimen-\strutdepth
+ \setbox\scratchbox\null
+ \wd\scratchbox2\bodyfontsize
+ \ht\scratchbox\scratchdimen
+ \dp\scratchbox\strutdepth
+ % % correct for fuzzy top of page situations
+ % \scratchdimen\lastcrazymathprelines\lineheight
+ % \advance\scratchdimen\MPy\crazymathtag
+ % \advance\scratchdimen\lineheight
+ % \advance\scratchdimen\topskip
+ % \advance\scratchdimen-\strutheight
+ % \dimen0=\MPy\crazytexttag
+ % \advance\dimen0 \MPh\crazytexttag
+ % \advance\scratchdimen-\dimen0\relax
+ % % do we need correction at all
+ % \ifdim\scratchdimen>\strutdepth\relax
+ % \donefalse
+ % \else\ifdim\scratchdimen<\zeropoint
+ % \donefalse
+ % \else
+ % \donetrue
+ % \fi\fi
+ % % analysis done
+ % \donefalse
+ % \ifdone
+ % \edef\crazymathcorrection{\the\scratchdimen}%
+ % \advance\scratchdimen-\dp\scratchbox
+ % \dp\scratchbox-\scratchdimen
+ % \else
+ % \let\crazymathcorrection\zeropoint
+ % \fi
+ \normalvadjust pre
+ {%\allowbreak % sometimes breaks spacing
+ \forgetall
+ \crazymathindent
+ \iftracegridsnapping\ruledhbox\fi{\box\scratchbox}%
+ \endgraf
+ \nobreak}%
+ \else\ifnum\scratchcounter>\zerocount
+ \normalvadjust pre
+ {\nobreak}%
+ \fi\fi
+ \getrawnoflines\nextboxdp
+ \scratchcounter\noflines
+ \advance\noflines-\lastcrazymathpostlines\relax
+ \ifnum\noflines>\zerocount
+ \donetrue
+ \else\ifnum\lastcrazymathpostlines=\zerocount
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \ifdone
+ \xdef\lastcrazymathpostlines{\the\scratchcounter}%
+ \ifnum\lastcrazymathpostlines=\zerocount
+ \global\let\lastcrazymathpostlines\!!plusone
+ \fi
+ \hbox{\setposition\crazymathtag\flushcrazymathbox}%
+ \scratchdimen\noflines\lineheight
+ \ifconditional\halfcrazymathlines
+ \advance\scratchdimen-.5\lineheight
+ \fi
+ \advance\scratchdimen+\strutheight
+ \setbox\scratchbox\null
+ \wd\scratchbox\bodyfontsize
+ \ht\scratchbox\scratchdimen
+ \dp\scratchbox\strutdepth
+ \normalvadjust
+ {\forgetall
+ \crazymathindent
+ \iftracegridsnapping\ruledhbox\fi{\box\scratchbox}%
+ \endgraf
+ \allowbreak}% else we stick below the text bottom
+ \else
+ \hbox{\setposition\crazymathtag\flushcrazymathbox}%
+ \fi
+ \fi
+ \else
+ \mathematics{#2}%
+ \fi
+ \endgroup}
+
+\let\tform\mathematics
+\let\gform\snappedinlineformula
+
+% test set:
+%
+% \startbuffer
+% Crazy math \sform {1+x} or \sform {\dorecurse {100} {1+} 1 =
+% 101} and even gore crazy \sform {2^{2^2}_{1_1}}
+% again\dorecurse {20} { and again} \sform {\sqrt {\frac
+% {x^{5^5}} {\frac {1} {2}}}} even gore\dorecurse {50} { and
+% gore} \iform {\dorecurse {12} {\sform {\sqrt {\frac
+% {x^{5^5}} {3}}}+\sform {\sqrt {\frac {x^{5^5}} {\frac {1}
+% {2}}}}+}x=10}\dorecurse{20} { super crazy math}: \iform
+% {\dorecurse {30} {\sform {\sqrt {\frac {x^{5^5}} {3}}}+
+% \sform {\sqrt {\frac {x^{5^5}} {\frac {1} {2}}}}+ }x = 10},
+% and we're\dorecurse {20} { done}!
+% \stopbuffer
+%
+% \setupcolors[state=start] \setuppapersize[S6][S6]
+%
+% \showgrid \tracegridsnappingtrue \showstruts
+%
+% \starttext
+% \setuplayout[grid=yes,lines=15]\getbuffer \page
+% \setuplayout[grid=yes,lines=16]\getbuffer \page
+% \setuplayout[grid=yes,lines=17]\getbuffer \page
+% \setuplayout[grid=yes,lines=18]\getbuffer \page
+% \setuplayout[grid=yes,lines=19]\getbuffer \page
+% \stoptext
+
%D \macro
%D {restoremathstyle}
%D
%D We can pick up the current math style by calling \type
%D {\restoremathstyle}.
-\def\restoremathstyle%
+\def\restoremathstyle
{\ifmmode
\ifcase\supersubmode
\textstyle
@@ -804,6 +1179,30 @@
{\scriptstyle #1}%
{\scriptscriptstyle#1}}
+%D Something similar can be used in the (re|)|definition
+%D of \type {\text}. This version is a variation on the one
+%D in the math module (see \type{m-math} and|/|or \type
+%D {m-newmat}).
+
+\unexpanded\def\mathtext
+ {\mathortext\domathtext\hbox}
+
+\def\domathtext#1%
+ {\mathchoice
+ {\dodomathtext\displaystyle\textface {#1}}%
+ {\dodomathtext\textstyle \textface {#1}}%
+ {\dodomathtext\textstyle \scriptface {#1}}%
+ {\dodomathtext\textstyle \scriptscriptface{#1}}}
+
+\def\dodomathtext#1#2#3% no \everymath !
+ %{\hbox{\everymath{#1}\switchtobodyfont [#2]#3}} % 15 sec
+ {\hbox{\everymath{#1}\setcurrentfontbody{#2}#3}} % 3 sec (no math)
+
+%D Because we may overload \type {\text} in other (structuring)
+%D macros, we say:
+
+\appendtoks \let\text\mathtext \to \everymath
+
%D \macros
%D {frac, xfrac, xxfrac}
%D
@@ -830,7 +1229,7 @@
%D \stoptypen
%D
%D The \type {\frac} macro kind of replaces the awkward \type
-%D {\over} primitive. Say that we habve the following formulas:
+%D {\over} primitive. Say that we have the following formulas:
%D
%D \startbuffer[sample]
%D test $\frac {1}{2}$ test $$1 + \frac {1}{2} = 1.5$$
@@ -875,9 +1274,27 @@
\def\dofrac#1#2#3{\relax\mathematics{{{#1{#2}}\over{#1{#3}}}}}
-\def\frac{\dofrac\mathstyle}
-\def\xfrac#1#2{\hbox{$\let\xfrac\xxfrac\dofrac\scriptstyle{#1}{#2}$}}
-\def\xxfrac#1#2{\hbox{$\dofrac\scriptscriptstyle{#1}{#2}$}}
+\def\frac {\dofrac\mathstyle}
+\def\xfrac #1#2{\begingroup
+ \let\xfrac\xxfrac
+ \dofrac\scriptstyle{#1}{#2}%
+ \endgroup}
+\def\xxfrac#1#2{\begingroup
+ \dofrac\scriptscriptstyle{#1}{#2}%
+ \endgroup}
+
+%D The \type {xx} variant looks still ugly, so maybe it's
+%D best to say:
+
+\def\xxfrac#1#2{\begingroup
+ \dofrac\scriptscriptstyle
+ {#1}{\raise.25ex\hbox{$\scriptscriptstyle#2$}}%
+ \endgroup}
+
+%D Something low level for scientific calculator notation:
+
+\def\scinot#1#2%
+ {#1\times10^{#2}}
%D The next macro, \type {\ch}, is \PPCHTEX\ aware. In
%D formulas one can therefore best use \type {\ch} instead of