summaryrefslogtreecommitdiff
path: root/tex/context/base/strc-mat.mkiv
diff options
context:
space:
mode:
authorMarius <mariausol@gmail.com>2010-07-04 15:32:09 +0300
committerMarius <mariausol@gmail.com>2010-07-04 15:32:09 +0300
commit85b7bc695629926641c7cb752fd478adfdf374f3 (patch)
tree80293f5aaa7b95a500a78392c39688d8ee7a32fc /tex/context/base/strc-mat.mkiv
downloadcontext-85b7bc695629926641c7cb752fd478adfdf374f3.tar.gz
stable 2010-05-24 13:10
Diffstat (limited to 'tex/context/base/strc-mat.mkiv')
-rw-r--r--tex/context/base/strc-mat.mkiv771
1 files changed, 771 insertions, 0 deletions
diff --git a/tex/context/base/strc-mat.mkiv b/tex/context/base/strc-mat.mkiv
new file mode 100644
index 000000000..2064db2c5
--- /dev/null
+++ b/tex/context/base/strc-mat.mkiv
@@ -0,0 +1,771 @@
+%D \module
+%D [ file=strc-mat,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Math Numbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / Hans Hagen]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Math Numbering}
+
+\registerctxluafile{strc-mat}{1.001}
+
+% we have potential for captions
+
+\unprotect
+
+\definestructureconversionset[\v!formula][numbers,characters]
+
+\setupformulas
+ [%\c!way=\@@nrway,
+ %\c!blockway=,
+ %\c!sectionnumber=\@@nrsectionnumber,
+ %\c!conversion=\v!numbers,
+ \c!location=\v!right,
+ \c!left=(,
+ \c!right=),
+ %\c!numberstyle=,
+ %\c!numbercolor=,
+ %\c!numbercommand=,
+ \c!spacebefore=\v!big,
+ \c!spaceafter=\formulaparameter\c!spacebefore,
+ \c!leftmargin=\!!zeropoint,
+ \c!rightmargin=\!!zeropoint,
+ %\c!margin=,
+ \c!indentnext=\v!no,
+ \c!alternative=\s!default,
+ %\c!align=,
+ \c!strut=\v!no,
+ %\c!separator=\@@koseparator,
+ %\c!grid=,
+ \c!distance=1em]
+
+\definestructurecounter
+ [\v!formula]
+
+% \setupstructurecounter
+% [\v!formula]
+% [\c!numberconversionset=\v!formula]
+
+\presetstructurecountersetup\setupformulas\sharedstructurecounterparameter
+
+\appendtoks
+% \dostructurecountersetup\currentformula\formulaparameter
+% \docheckstructurecountersetup\currentformula
+ \dostructurecountersetup\v!formula\formulaparameter
+% \docheckstructurecountersetup\v!formula
+\to \everysetupformulas
+
+\setupformulas
+ [\c!numberconversionset=\v!formula] % why forgotten
+
+\def\storecurrentformulanumber#1#2#3#4#5% ref, todo:str, \sync % todo: title etc (like float)
+ {\dostructurecountercomponent
+ {formula}%
+ \getformulaparameters \formulaparameter \detokenizedformulaparameter
+ \relax \relax \relax
+% [\c!name=\currentformula,\s!counter=\currentformula,%
+ [\c!name=\v!formula,\s!counter=\v!formula,%
+ \s!hascaption=\v!yes,\s!hastitle=\v!yes,\s!hasnumber=\v!yes,%\s!haslevel=#6,%
+ \s!hasnumber=\v!no,%
+ \c!reference=#1,\c!title=,\c!bookmark=]%
+ [#2]%
+ \globallet#3\laststructurecounternumber
+ \globallet#4\laststructurecountersynchronize
+ \globallet#5\laststructurecounterattribute}
+
+\newif\ifnoformulanumber
+
+\newconditional\handleformulanumber
+\newconditional\incrementformulanumber
+
+\newtoks\everyresetformulas
+
+\newconditional\insideplaceformula
+\newconditional\insideplacesubformula
+\newconditional\insideformulas
+\newconditional\insidesubformulas
+
+% 0=unset, 1=forced, 2=none, 3=reference
+
+\def\handleplaceformulanumbering % place formula
+ {\settrue\handleformulanumber
+ \docheckformulareference\placeformulanumbermode\currentplaceformulareference
+ \glet\doplaceformulanumber \doplaceformulanumberindeed
+ \glet\donestedformulanumber\donestedformulanumberindeed}
+
+\def\handleformulasnumbering % formulas
+ {\docheckformulareference\formulasnumbermode\currentformularesference}
+
+\def\handlesubformulasnumbering % sub formulas
+ {\docheckformulareference\subformulasnumbermode\currentsubformulasreference
+ \doincrementsubstructurecounter[\v!formula][1]% always
+ \storecurrentformulanumber
+ \currentsubformulasreference
+ \empty
+ \currentsubformulasnumber
+ \currentsubformulassynchronize
+ \currentsubformulasattribute
+ }
+
+\def\tracedformulamode
+ {\hbox{\quad\tt\txx[\number\placeformulanumbermode,\number\formulasnumbermode,\number\subformulasnumbermode,\number\nestedformulanumbermode]}}
+
+\unexpanded\def\placecurrentformulanumber
+ {\rm % nodig ?
+ \doif{\formulaparameter\c!location}\v!right{\hskip\formulaparameter\c!distance}%
+ \formulaparameter\c!numbercommand
+ {\dosetformulaattributes\c!numberstyle\c!numbercolor
+ \strut
+ \formulaparameter\c!left
+ \labeltexts\v!formula{\ignorespaces\doplacecurrentformulanumber\unskip}%
+ \formulaparameter\c!right}%
+ \doif{\formulaparameter\c!location}\v!left{\hskip\formulaparameter\c!distance}}
+
+\def\doplacecurrentformulanumber
+ {\dohandlecurrentformulareferences
+ %\currentformulasattribute % todo
+ %\currentformulasattribute % todo
+ %\currentsubformulaattribute % todo
+ \labeltexts\currentformula{\doconvertedstructurecounter[\v!formula][]}}
+
+\appendtoks
+ \glet\currentplaceformulasynchronize \relax
+ \glet\currentformulassynchronize \relax
+ \glet\currentsubformulassynchronize \relax
+ \glet\currentnestedformulasynchronize\relax
+ \let\currentformula\empty
+\to \everyresetformulas
+
+\def\dohandlecurrentformulareferences
+ {\ifnum\placeformulanumbermode=\plusthree
+ \storecurrentformulanumber
+ \currentplaceformulareference
+ \empty
+ \currentplaceformulanumber
+ \currentplaceformulasynchronize
+ \currentplaceformulaattribute
+ \currentplaceformulasynchronize
+ \glet\currentplaceformulasynchronize\relax
+ \fi
+ \ifnum\formulasnumbermode=\plusthree
+ \storecurrentformulanumber
+ \currentformulasreference
+ \empty
+ \currentformulasnumber
+ \currentformulassynchronize
+ \currentformulasattribute
+ \currentformulassynchronize
+ \glet\currentformulassynchronize\relax
+ \fi
+ \ifnum\subformulasnumbermode=\plusthree
+ \currentsubformulassynchronize
+ \glet\currentsubformulassynchronize\relax
+ \fi
+ \ifnum\nestedformulanumbermode=\plusthree
+ \storecurrentformulanumber
+ \currentnestedformulareference
+ \empty
+ \currentnestedformulanumber
+ \currentnestedformulasynchronize
+ \currentnestedformulaattribute
+ \currentnestedformulasynchronize
+ \glet\currentnestedformulasynchronize\relax
+ \fi}
+
+\let\currentformulasreference \empty \let\currentformulassuffix \empty
+\let\currentformulareference \empty \let\currentformulasuffix \empty
+\let\currentsubformulareference \empty \let\currentsubformulasuffix \empty
+\let\currentnestedformulareference\empty \let\currentnestedformulasuffix\empty
+
+\let\currentformulasynchronize \relax \let\currentformulaattribute \relax
+\let\currentsubformulasynchronize\relax \let\currentsubformulaattribute\relax
+\let\currentformulassynchronize \relax \let\currentformulasattribute \relax
+
+\def\dohandleformulanumbering
+ {\doincrementsubstructurecounter[\v!formula][1]%
+ \doiftext\currentplaceformulasuffix{\setsubstructurecounterown[\v!formula][2]{\currentplaceformulasuffix}}%
+ \placecurrentformulanumber}
+
+\def\dohandlesubformulanumbering
+ {\doiftextelse\currentsubformulasuffix
+ {\setsubstructurecounterown[\v!formula][2]{\currentsubformulasuffix}}
+ {\doincrementsubstructurecounter[\v!formula][2]}%
+ \placecurrentformulanumber}
+
+\def\dododoformulanumber
+ {\ifconditional\handleformulanumber
+ \hbox\bgroup
+ % main counter
+ \ifconditional\insidesubformulas
+ % nothing
+ \else
+ \ifcase\formulasnumbermode
+ \ifcase\placeformulanumbermode
+ \dohandleformulanumbering
+ \or
+ \dohandleformulanumbering
+ \or
+ % nothing
+ \or
+ \dohandleformulanumbering
+ \fi
+ \or
+ \dohandleformulanumbering
+ \or
+ % nothing
+ \or
+ \dohandleformulanumbering
+ \fi
+ \fi
+ % subcounter
+ \ifconditional\insidesubformulas
+ \ifcase\subformulasnumbermode
+ % nothing
+ \or
+ \dohandlesubformulanumbering
+ \or
+ % nothing
+ \or
+ \dohandlesubformulanumbering
+ \fi
+ \fi
+ %\rlap{\tracedformulamode}%
+ \egroup
+ \fi}
+
+\definelist[\v!formula]
+
+\appendtoks
+ \global\setfalse\insideplaceformula
+ \global\setfalse\insideplacesubformula
+% \global\setfalse\insideformulas
+% \global\setfalse\insidesubformulas
+\to \everyresetformulas
+
+\newif\ifinformula
+
+%D We need a hook into the plain math alignment macros
+%D
+%D \starttyping
+%D \displaylines
+%D \eqalignno
+%D \eqalignno
+%D \stoptyping
+%D
+%D Otherwise we get a missing \type {$$} error reported.
+
+\def\resetdisplaymatheq
+ {\let\normalleqno\gobbleoneargument \let\leqno\gobbleoneargument
+ \let\normalreqno\gobbleoneargument \let\eqno \gobbleoneargument
+ \let\doplaceformulanumber\empty}
+
+%D
+
+\unexpanded\def\defineformula
+ {\dodoubleempty\dodefineformula}
+
+\def\dodefineformula[#1][#2]%
+ {\doifsomething{#1}
+ {\getparameters[\??fm#1][\s!parent=\??fm,#2]%
+ \definelist[#1]%
+ \setvalue{\e!start#1\v!formula}{\dostartformula{#1}}%
+ \setvalue{\e!stop #1\v!formula}{\dostopformula}}}
+
+\unexpanded\def\defineformulaalternative
+ {\dotripleargument\dodefineformulaalternative}
+
+\def\dodefineformulaalternative[#1][#2][#3]%
+ {\setvalue{\e!start#1\v!formula}{#2}%
+ \setvalue{\e!stop #1\v!formula}{#3}}
+
+% sp = single line paragraph sd = single line display
+% mp = multi line paragraph md = multy line display
+
+\defineformulaalternative[\s!default][\startdisplaymath][\stopdisplaymath]
+\defineformulaalternative[\s!single] [\startdisplaymath][\stopdisplaymath]
+\defineformulaalternative[\s!multi] [\startdisplaymath][\stopdisplaymath]
+
+\defineformula
+ [sp]
+ [\c!spacebefore=\v!none,
+ \c!spaceafter=\v!none,
+ \c!indentnext=\v!no,
+ \c!alternative=\s!single]
+
+\defineformula
+ [sd]
+ [\c!spacebefore=\v!none,
+ \c!spaceafter=\v!none,
+ \c!indentnext=\v!yes,
+ \c!alternative=\s!single]
+
+\defineformula
+ [mp]
+ [\c!indentnext=\v!no,
+ \c!alternative=\s!multi]
+
+\defineformula
+ [md]
+ [\c!indentnext=\v!yes,
+ \c!alternative=\s!multi]
+
+%D \macros
+%D {setupsubformulas, startsubformulas}
+
+\def\subformulaparameter#1{\ifcname\??fn#1\endcsname\cname\??fn#1\endcsname\fi}
+
+\unexpanded\def\setupsubformulas
+ {\dodoubleargument\getparameters[\??fn]}
+
+\setupsubformulas
+ [\c!indentnext=\formulaparameter\c!indentnext]
+
+% \setupsubformulas[conversion=romannumerals]
+%
+% \placeformula
+% \startsubformulas[Maxwell]
+% \startformulas
+% \startformula \startalign
+% \NC \nabla\cdot\bf E \NC = \frac{\rho}{\varepsilon_0} \NR[Maxwell 1]
+% \NC \nabla\times\bf E \NC = - \frac{\partial\bf B}{\partial t} \NR[Maxwell II]
+% \stopalign \stopformula
+% \startformula \startalign
+% \NC \nabla\cdot \bf B \NC = 0 \NR[Maxwell III]
+% \NC \nabla\times\bf B \NC = \mu_0{\bf j}+\varepsilon_0\mu_0\frac{\partial\bf E}{\partial t} \NR[Maxwell IV]
+% \stopalign \stopformula
+% \stopformulas
+% \stopsubformulas
+%
+% Maxwell : \in [Maxwell] and II : \in [Maxwell II]
+
+%D Tricky stuff:
+
+\newdimen\lastlinewidth
+
+\abovedisplayskip \zeropoint
+\abovedisplayshortskip \zeropoint % evt. 0pt minus 3pt
+\belowdisplayskip \zeropoint
+\belowdisplayshortskip \zeropoint % evt. 0pt minus 3pt
+
+\predisplaypenalty \zerocount
+\postdisplaypenalty \zerocount % -5000 gaat mis, zie penalty bij \paragraaf
+
+% we don't use the skip's
+
+\def\forgetdisplayskips % to do
+ {\abovedisplayskip \zeropoint
+ \belowdisplayskip \zeropoint
+ \abovedisplayshortskip\zeropoint
+ \belowdisplayshortskip\zeropoint}
+
+\setvalue{\e!start\v!formula}{\dostartformula{}}
+\setvalue{\e!stop \v!formula}{\dostopformula}
+
+\def\predisplaysizethreshhold{2em} % was 3em
+
+\def\leftdisplayskip {\leftskip}
+\def\rightdisplayskip {\rightskip}
+\def\leftdisplaymargin {\formulaparameter\c!leftmargin}
+\def\rightdisplaymargin {\formulaparameter\c!rightmargin}
+
+\def\beforedisplayspace
+ {\doifnot{\formulaparameter\c!spacebefore}\v!none{\blank[\formulaparameter\c!spacebefore]}}
+
+\def\afterdisplayspace
+ {\doifnot{\formulaparameter\c!spaceafter }\v!none{\blank[\formulaparameter\c!spaceafter ]}}
+
+% \def\setpredisplaysize
+% {\predisplaysize\lastlinewidth\relax
+% \ifdim\predisplaysize<\maxdimen
+% \ifdim\predisplaysize>\zeropoint
+% \advance\predisplaysize \predisplaysizethreshhold
+% \fi
+% \advance\predisplaysize \displayindent % needed ?
+% \ifdim\predisplaysize>\hsize
+% \predisplaysize\hsize
+% \fi
+% \else
+% \predisplaysize\zeropoint
+% \fi}
+
+\def\setdisplaydimensions
+ {\displayindent\leftdisplayskip
+ \advance\displayindent\leftdisplaymargin
+ \displaywidth\hsize
+ %\setlocalhsize
+ %\displaywidth\localhsize
+ \ifdim\hangindent>\zeropoint
+ \advance\displayindent\hangindent
+ \else
+ \advance\displaywidth\hangindent
+ \fi
+ \advance\displaywidth\dimexpr-\displayindent-\rightdisplayskip-\rightdisplaymargin\relax
+ \hsize\displaywidth} % new, else overfull in itemize
+
+\def\dostartformula#1%
+ {\dodoubleempty\dodostartformula[#1]}
+
+\newskip\formulaparskip
+\newskip\formulastrutht
+\newskip\formulastrutdp
+
+%D \startbuffer
+%D \startformula[9pt] x = 1 \stopformula
+%D \startformula[7pt] x = 1 \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\dodostartformula[#1][#2]% setting leftskip adaption is slow !
+ {\bgroup % HERE
+ \def\currentformula{#1}%
+ \the\everybeforedisplayformula
+ \formulaparskip\parskip
+ \formulastrutdp\strutdepth
+ \formulastrutht\strutheight
+ \doifsomething{#2}{\switchtoformulabodyfont[#2]}%
+ \parskip\formulaparskip
+ % may look better in itemizations
+ \doif{\formulaparameter\c!option}\v!middle
+ {\def\leftdisplayskip{\zeropoint}%
+ \def\rightdisplayskip{\zeropoint}}%
+ % this was an experiment
+ \doifsomething{\formulaparameter\c!margin}% so we test first
+ {\dosetleftskipadaption{\formulaparameter\c!margin}%
+ \edef\leftdisplaymargin{\the\leftskipadaption}}% overloaded
+ \long\def\dostartformula##1{\bgroup\let\dostopformula\egroup}%
+ \freezedimenmacro\leftdisplayskip
+ \freezedimenmacro\rightdisplayskip
+ \freezedimenmacro\leftdisplaymargin
+ \freezedimenmacro\rightdisplaymargin
+ \freezedimenmacro\predisplaysizethreshhold
+ \forgetdisplayskips
+ \getvalue{\e!start\formulaparameter\c!alternative\v!formula}}
+
+\def\switchtoformulabodyfont{\switchtobodyfont}
+
+\setvalue{\v!formula}{\dosingleempty\doformula}
+
+\def\doformula[#1]#2%
+ {\begingroup
+ \doifsomething{#1}{\switchtoformulabodyfont[#1]}%
+ % not : \def\doformula[##1]##2{\mathematics{##2}}%
+ \mathematics{#2}%
+ \endgroup}
+
+\def\dostopformula
+ {\doplaceformulanumber
+ \getvalue{\e!stop\formulaparameter\c!alternative\v!formula}%
+ \nonoindentation
+ \checknextindentation[\formulaparameter\c!indentnext]%
+ \egroup
+ \hangafter\minusone % added for side floats
+ \hangindent\zeropoint % added for side floats
+ \setfalse\handleformulanumber
+ \the\everyresetformulas
+ \dorechecknextindentation} % here ?
+
+%D \starttyping
+%D % test \par % no preceding hlist
+%D % $$x$$ % preceding hlist
+%D % \noindent $$x$$ % no preceding hlist
+%D \startformula x \stopformula % now has \noindent (in mkii we messed with baselineskip)
+%D \stoptyping
+
+\unexpanded\def\startdisplaymath
+ {\bgroup
+ \par
+ \informulatrue
+ \beforedisplayspace
+ \par
+ \ifvmode
+ \prevdepth-\maxdimen % texbook pagina 79-80
+ \fi
+ \noindent % else funny hlist with funny baselineskip
+ $$% \Ustartdisplaymath
+ \setdisplaydimensions
+ %\setpredisplaysize
+ \startinnermath}
+
+\unexpanded\def\stopdisplaymath
+ {\stopinnermath
+ $$% \Ustopdisplaymath
+ \par
+ \afterdisplayspace
+ \par
+ \egroup}
+
+\newif\ifclipdisplaymath \clipdisplaymathtrue
+\def\displaymathclipfactor{1.1}
+
+% already defined
+%
+% \let\startinnermath\empty
+% \let\stopinnermath \empty
+
+% \defineformulaalternative[multi][\begindmath][\enddmath]
+%
+% \fakewords{20}{40}\epar
+% \placeformula {a} $$ \fakespacingformula $$
+% \fakewords{20}{40}\epar
+% \placeformula {b} \startformule \fakespacingformula \stopformule
+% \placeformula {b} \startformule \fakespacingformula \stopformule
+% \fakewords{20}{40}\epar
+% \placeformula {c} \startmdformule \fakespacingformula \stopmdformule
+% \placeformula {c} \startmdformule \fakespacingformula \stopmdformule
+% \fakewords{20}{40}\epar
+% \placeformula {d} \startmpformule \fakespacingformula \stopmpformule
+% \placeformula {d} \startmpformule \fakespacingformula \stopmpformule
+% \fakewords{20}{40}\epar
+% \placeformula {e} \startsdformule \fakespacingformula \stopsdformule
+% \placeformula {e} \startsdformule \fakespacingformula \stopsdformule
+% \fakewords{20}{40}\epar
+% \placeformula {f} \startspformule \fakespacingformula \stopspformule
+% \placeformula {f} \startspformule \fakespacingformula \stopspformule
+% \fakewords{20}{40}
+
+\unexpanded\def\startsubformulas
+ {\dosingleempty\dostartsubformulas}
+
+\def\dostartsubformulas[#1]%
+ {\edef\currentsubformulasreference{#1}%
+ \global\settrue\insidesubformulas
+ \handlesubformulasnumbering}
+
+\unexpanded\def\stopsubformulas
+ {\nonoindentation
+ \checknextindentation[\formulaparameter\c!indentnext]%
+ \the\everyresetformulas % to be checked
+ \global\setfalse\insidesubformulas
+ \dorechecknextindentation} % here ?
+
+%D Named subformulas (to be redone)
+
+\unexpanded\def\startnamedsubformulas
+ {\dosingleempty\dostartnamedsubformulas}
+
+\def\dostartnamedsubformulas[#1]#2%
+ {\setformulalistentry{#2}%
+ \startsubformulas[#1]}
+
+\unexpanded\def\stopnamedsubformulas
+ {\stopsubformulas}
+
+%D Experimental goodie:
+%D
+%D \startbuffer
+%D \placelist[formula][criterium=text] \blank[2*big]
+%D \placenamedformula[one]{first} \startformula a = 1 \stopformula \endgraf
+%D \placeformula \startformula a = 2 \stopformula \endgraf
+%D \placenamedformula {second} \startformula a = 3 \stopformula \endgraf
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\unexpanded\def\startformulas
+ {\dosingleempty\dostartformulas}
+
+\def\dostartformulas[#1]#2\stopformulas % new / to be internationalized
+ {\bgroup
+ \global\settrue\insideformulas
+ \edef\currentformulasreference{#1}%
+ \handleformulasnumbering
+ \let\currentformula\empty
+ \forgetdisplayskips
+ \startdisplaymath
+ \setlocalhsize
+ \long\unexpanded\def\startformula##1\stopformula
+ {\advance\scratchcounter\plusone}%
+ \scratchcounter\zerocount
+ #2% preroll
+ \ifcase\scratchcounter\else
+ \divide \hsize \scratchcounter
+ \fi
+ \hbox to \localhsize \bgroup
+ \hss
+ \def\normalstartformula{\vskip-\strutdepth\Ustartdisplaymath}% i hate this
+ \def\normalstopformula {\Ustopdisplaymath}%
+ \unexpanded\def\startformula {\Ustartmath\vcenter\bgroup\normalstartformula}%
+ \unexpanded\def\stopformula {\normalstopformula\egroup\Ustopmath\hss}%
+ #2%
+ \egroup
+ \stopdisplaymath
+ \global\setfalse\insideformulas
+ \egroup
+ \the\everyresetformulas
+ \hangafter\minusone % added for side floats
+ \hangindent\zeropoint} % added for side floats
+
+% place
+
+% 0=unset, 1=forced, 2=none, 3=reference
+
+\chardef\placeformulanumbermode \zerocount
+\chardef\formulanumbermode \zerocount
+\chardef\formulasnumbermode \zerocount
+\chardef\subformulasnumbermode \zerocount
+\chardef\nestedformulanumbermode\zerocount
+
+\def\inhibitformulanumberflag{-}
+\def\forceformulanumberflag {+}
+
+\def\docheckformulareference#1#2%
+ {\chardef#1\ifx#2\empty
+ \zerocount
+ \else\ifx#2\forceformulanumberflag
+ \plusone
+ \else\ifx#2\inhibitformulanumberflag
+ \plustwo
+ \else
+ \plusthree
+ \fi\fi\fi}
+
+\def\formulanumber{\doformulanumber} % for the moment
+
+\def\doformulanumber
+ {\dosingleempty\dodoformulanumber}
+
+\def\dodoformulanumber[#1]%
+ {\def\currentformulareference{#1}%
+ \dosinglegroupempty\dododoformulanumber}
+
+\def\redoformulanumber#1%
+ {\def\currentformulasuffix{#1}%
+ \dododoformulanumber}
+
+\unexpanded\def\placeformula
+ {\doglobal\settrue\insideplaceformula
+ \settrue\incrementformulanumber
+ \dodoubleempty\doplaceformula}
+
+\unexpanded\def\placesubformula
+ {\doglobal\settrue\insideplacesubformula
+ \setfalse\incrementformulanumber
+ \dodoubleempty\doplaceformula}
+
+% \def\doplaceformula[#1][#2]% #2 = dummy, gobbles spaces
+% {\def\currentplaceformulareference{#1}%
+% \let\currentplaceformulasuffix\empty
+% \futurelet\next\redoplaceformulaone}
+%
+% \let\mathdollarsign$ % no def
+%
+% \def\redoplaceformulaone % use doifnextcharelse
+% {\ifx\next\bgroup
+% \@EA\moreplaceformula % [ref]{}
+% \else
+% \@EA\redoplaceformulatwo
+% \fi}
+%
+% \long\def\moreplaceformula#1#2% #1 dummy #1 gobbles spaces
+% {\def\currentplaceformulasuffix{#1}%
+% \futurelet\next\redoplaceformulatwo#2}
+%
+% \def\redoplaceformulatwo
+% {\ifx\next\mathdollarsign
+% \@EA\dispplaceformula % [ref]$$
+% \else
+% \@EA\dodoplaceformula % [ref]\start
+% \fi}%
+
+\def\doplaceformula[#1][#2]% #2 = dummy, gobbles spaces
+ {\def\currentplaceformulareference{#1}%
+ \let\currentplaceformulasuffix\empty
+ \doifnextbgroupelse\moreplaceformula\redoplaceformula} % [ref]{}
+
+\long\def\moreplaceformula#1%
+ {\def\currentplaceformulasuffix{#1}%
+ \redoplaceformula}
+
+\long\def\redoplaceformula
+ {\doifnextcharelse$\dispplaceformula\dodoplaceformula} % [ref]$$ [ref]\start
+
+\def\dodoplaceformula
+ {\handleplaceformulanumbering}
+
+\def\dispplaceformula$$#1$$%
+ {\handleplaceformulanumbering
+ \dostartformula{}#1\dostopformula}
+
+\let\startplaceformula\placeformula
+\let\stopplaceformula \relax
+
+% to be checked
+
+\def\doformulanumber
+ {\dosingleempty\dodoformulanumber}
+
+\def\dodoformulanumber[#1]%
+ {\def\currentformulareference{#1}%
+ \dosinglegroupempty\dododoformulanumber}
+
+\def\redoformulanumber#1%
+ {\def\currentformulasuffix{#1}%
+ \dododoformulanumber}
+
+\glet\doplaceformulanumber \relax
+\glet\donestedformulanumber\gobbletwoarguments
+
+\def\donestedformulanumberindeed#1#2%
+ {\def\currentnestedformulareference{#1}%
+ \def\currentnestedformulasuffix{#2}%
+ \glet\doplaceformulanumber\relax
+ \docheckformulareference\nestedformulanumbermode\currentnestedformulareference
+ \ifcase\nestedformulanumbermode
+ % nothing
+ \or
+ \doformulanumber
+ \or
+ % nothing
+ \or
+ \doformulanumber
+ \fi}
+
+\def\doplaceformulanumberindeed
+ {\glet\doplaceformulanumber\relax
+ \doifelse{\formulaparameter\c!location}\v!left
+ {\normalleqno{\dododoformulanumber}}
+ {\normalreqno{\dododoformulanumber}}}
+
+% todo
+
+\unexpanded\def\placenamedformula
+ {\dosingleempty\doplacenamedformula}
+
+\def\doplacenamedformula[#1]#2%
+ {\iffirstargument
+ \def\next{\placeformula[#1]}%
+ \else
+ \let\next\placeformula
+ \fi
+ \setformulalistentry{#2}%
+ \next}
+
+\global\let\doflushformulalistentry\gobbleoneargument
+
+\def\setformulalistentry#1%
+ {\gdef\doflushformulalistentry##1%
+ {\normalexpanded{\noexpand\writetolist[\v!formula]{##1}}{#1}%
+ \global\let\doflushformulalistentry\gobbleoneargument}}
+
+\protect \endinput
+
+% \abovedisplayshortskip0pt \belowdisplayshortskip0pt \abovedisplayskip0pt \belowdisplayskip0pt \forgetall
+%
+% test \par $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+% test \par $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+% test plus \par \prevdepth \maxdimen $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+% test minus \par \prevdepth-\maxdimen $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+%
+% \parskip\baselineskip
+%
+% test \par $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+% test \par $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+% test plus \par \prevdepth \maxdimen $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+% test minus \par \prevdepth-\maxdimen $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par