summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/x-newmml.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/x-newmml.tex')
-rw-r--r--Master/texmf-dist/tex/context/base/x-newmml.tex2735
1 files changed, 3 insertions, 2732 deletions
diff --git a/Master/texmf-dist/tex/context/base/x-newmml.tex b/Master/texmf-dist/tex/context/base/x-newmml.tex
index f4847eeb94d..9eb994021f1 100644
--- a/Master/texmf-dist/tex/context/base/x-newmml.tex
+++ b/Master/texmf-dist/tex/context/base/x-newmml.tex
@@ -1,7 +1,7 @@
%D \module
%D [ file=x-newmml,
%D version=2005.06.10, % 1999.12.20,
-%D title=\CONTEXT\ XML Modules,
+%D title=\CONTEXT\ XML Macros,
%D subtitle=MathML Renderer,
%D author=Hans Hagen,
%D date=\currentdate,
@@ -11,2735 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D Remark: from now on this is a module and no longer an xtag
-%D filter. In due time it will replace the older renderer (which
-%D we will keep around for sentimental reasons). This variant has
-%D no namespace support yet, but eventually we will use a \MKIV\
-%D version.
+\loadmarkfile{x-newmml}
-\ifx\inlinemathematics\undefined
- \def\inlinemathematics {\dontleavehmode\mathematics} % already in kernel
- \long\def\inlinemath #1{\dontleavehmode\relax\ifmmode#1\else $#1$\fi}
-\fi
-
-% \defineXMLentity[x000AF]{\normalorfiller{x}\hrulefill}
-% CHECK FOR: \xmlrent
-% \enablemathpunctuation
-
-%D Then we start defining the rendering macros:
-
-\writestatus{loading}{Context XML Macros (MathML Renderer)}
-
-\startmodule [mathml]
-
-%D First we load the entities:
-
-\usemodule[newmme]
-
-% \setupmodule[a=c]
-% \setupmodule[a=c]
-
-\unprotect
-
-\def\MMLrm{\mr}
-
-\def\MMLseparator#1{{#1}} % nils space after separator
-
-%D First we define some general formula elements.
-
-\defineXMLenvironment [formula] [label=,sublabel=]
- {\dostartXMLformula\placeformula}
- {\dostopXMLformula}
-
-\defineXMLenvironment [subformula] [label=,sublabel=]
- {\dostartXMLformula\placesubformula}
- {\dostopXMLformula}
-
-\def\dostartXMLformula#1%
- {\doifelsenothingXMLop{label}
- {\startformula}
- {\expanded{#1[\XMLop{label}]{\XMLop{sublabel}}}\startformula}}
-
-\def\dostopXMLformula
- {\stopformula}
-
-%D Since I only had the draft of MathML 2 as example of
-%D rendering, there are probably a lot of omissions and
-%D misinterpretations. At least I learned some bits and
-%D pieces of math rendering.
-%D
-%D The main complications were not so much the math, but to
-%D find the most efficient way to handle elements without
-%D spacing beging messed up. The first implementation was
-%D aimed at getting reasonable output, this second
-%D implementation is already better in terms of handling
-%D nesting, and I will definitely need a third one that has
-%D more efficient and less ugly code.
-%D
-%D The \TEX\ part is not that complicated and once the
-%D preprocessor was okay, the rest way just a lot of keying
-%D and testing. It all comes down to gobbling, redefining,
-%D and not so much to parsing.
-%D
-%D The second implementation expanded the whole math sequence
-%D into an internal \TEX\ representation. This is a rather clean
-%D and fast process. Filtering and testing takes place by
-%D redefining the internal representation macros.
-%D
-%D The third implementation may look a bit more messy in some
-%D respects. This is because in \TEX\ it's not that trivial to
-%D implement a tree handler. We use a stack for the \type {apply}
-%D element and other sequential content. Occasionally we need to
-%D peek into child elements which involves messy code. This
-%D implementation is closer to the normal \XML\ handling in
-%D \CONTEXT.
-
-%D We start with the parent elements and the option handler.
-
-\defineXMLdirective [mathml] \setupMMLappearance
-
-\defineXMLargument [math] \automathematics
-\defineXMLargument [imath] \inlinemathematics
-\defineXMLargument [dmath] \displaymathematics
-\defineXMLargument [m] \inlinemathematics
-
-%D In the styles, options can be set with:
-
-\def\setupMMLappearance[#1]{\dodoubleargument\getparameters[@@MML#1]}
-
-\def\startusingMMLarguments % optional maken
- {\begingroup
- %\expandXMLta % expand entities first
- \getXMLta}
-
-\def\stopusingMMLarguments % optional maken
- {\endgroup}
-
-\def\MMLargumentprefix{@@MML\currentXMLelement}
-
-%D We will apply inner math to all bits and pieces made up by an
-%D \type {apply}.
-
-\def\MMLmathinner
- {\ifinner \expandafter \firstofoneargument \else \expandafter \mathinner \fi}
-
-%D A few math related macros:
-
-\let\MMLctempresetlist\empty \def\setMMLcreset{\edef\MMLctempresetlist}
-
-\newcount\MMLapplydepth \def\MMLcreset{\MMLapplydepth\zerocount}
-
-% Stack handler
-
-\startXMLmapping[xmlstack:test]
-
- \defineXMLnested
- [apply]
- {\startsavingXMLelements}
- {\stopsavingXMLelements}
-
-\stopXMLmapping
-
-%D Auxiliary MathML macros: (to be generalized)
-
-\def\doifelseMMCfunction
- {\begingroup
- \XMLdoifonstackelse{fn}
- {\donetrue}
- {\XMLdoifonstackelse{apply}
- {\defXMLfirstnamedtext\ascii{apply}%
- \startsavingXMLelements % best use a substack so that we do not need to \edef
- \ascii
- \stopsavingXMLelements}
- {}%
- \XMLdoifonstackelse{fn}
- {\donetrue}
- {\defineXMLsave[ci][type=]%
- \XMLfirstnamed{ci}%
- \doifelse{\XMLpar{ci}{type}{}}{fn}
- {\donetrue}
- {\donefalse}}}%
- \ifdone
- \endgroup\expandafter\firstoftwoarguments
- \else
- \endgroup\expandafter\secondoftwoarguments
- \fi}
-
-\def\doifelseMMCfunctioninapply#1#2% grouped
- {\begingroup
- \startXMLmapping[xmlstack:test]% take fast alternative
- \getXMLstackdata{#1}%
- \expanded{\doifinsetelse{\getXMLstackname\plusone}{#2}}
- {\stopXMLmapping
- \endgroup\firstoftwoarguments }
- {\stopXMLmapping
- \endgroup\secondoftwoarguments}}
-
-\def\dodoifelseMMCfunctioninapply#1#2%
- {\startXMLmapping[xmlstack:test]% take fast alternative
- \getXMLstackdata{#1}%
- \expanded{\doifinsetelse{\getXMLstackname\plusone}{#2}}
- {\stopXMLmapping
- \firstoftwoarguments }
- {\stopXMLmapping
- \secondoftwoarguments}}
-
-%D Special features:
-
-\newtoks \@@postponedMMLactions \setfalse \somepostponedMMLactions
-
-\def\postponeMMLactions#1%
- {\global\settrue\somepostponedMMLactions
- \global\@@postponedMMLactions\expandafter{\the\@@postponedMMLactions#1}}
-
-\def\postponedMMLactions
- {\global\setfalse\somepostponedMMLactions
- \@EA\global\@EA\@@postponedMMLactions\@EA\emptytoks
- \the\@@postponedMMLactions}
-
-%D A couple of lists:
-
-\def\MMLcmainresetlist
- {times,divide,power,%
- lt,gt,eq,leq,geq,%
- in,inverse,%
- fn,%
- floor,ceiling,%
- mean,%
- selector,%
- abs,int,limit,sum,product,%
- outerproduct,innerproduct,scalarproduct}
-
-\def\MMLcfunctionlist
- {sin,arcsin,sinh,arcsinh,%
- cos,arccos,cosh,arccosh,%
- tan,arctan,tanh,arctanh,%
- cot,arccot,coth,arccoth,%
- csc,arccsc,csch,arccsch,%
- sec,arcsec,sech,arcsech,%
- ln,exp,log,%
- abs,int,limit,sum,product,%
- fn} % ?
-
-\def\MMLcconstructlist
- {diff,partialdiff,root} % apply goes wrong on 1/2 * (a_2 + b_3)
-
-% apply
-%
-%D We use inner and grouping (begin/end and no b/e) else we
-%D get problems with 1/2(1+2) and alike (todo: ask taco).
-%D
-%D The problem with apply is that we need to take care of
-%D several situations, like:
-%D
-%D \starttyping
-%D <apply> <.../> ...
-%D <apply> <fn> ...
-%D <apply> <apply> <ci> ...
-%D <apply> <apply> <fn> <ci> ...
-%D \stoptyping
-%D
-%D Because we translated version 2 of this renderer into
-%D version 3 the following definitions may be sub optimal or
-%D more complex than actually needed.
-
-\defineXMLnested % why nested? could be just an environment
- [apply]
- [open=,close=]
- {\setups{mmc:apply:start}}
- {\setups{mmc:apply:stop}}
-
-\startsetups mmc:apply:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:apply:stop
- \stopsavingXMLelements
- \MMLmathinner {
- \expanded{\doifinsetelse{\getXMLstackname\plusone}{\MMLcmainresetlist,\MMLctempresetlist}}
- \MMLcreset
- \donothing
- \ifcase\MMLapplydepth \else
- \doifXMLparelse{apply}{open} \donothing{\getXMLarguments{apply}{open="("}}% slow
- \doifXMLparelse{apply}{close}\donothing{\getXMLarguments{apply}{close=")"}}% slow
- \fi
- \doifXMLparelse{apply}{open}{\left\XMLpar{apply}{open}{}}\donothing
- \advance\MMLapplydepth\plusone
- \begingroup
- \let\MMLctempresetlist\empty
- \doifelse {\getXMLstackname\plusone} {apply} {
- % <apply> <apply> ... </apply> <ci> .. </ci> </apply>
- \doifelseMMCfunctioninapply \plusone {plus,minus} {
- % yet incomplete and rather untested
- % <apply> <apply> <minus/> <tan/> <cos/> </apply> <ci>x</ci> </apply>
- } {
- \MMLcreset
- }
- \getXMLstackdata\plusone
- \ifconditional\somepostponedMMLactions
- \postponedMMLactions
- \else
- \left(\MMLcreset\getXMLstackdata\plustwo\right)
- \fi
- } {
- \doifelse {\getXMLstackname\plusone} {fn} {
- % also postpone
- \directsetup{mmc:fn:apply}
- } {
- \doifelse {\getXMLstackname\plusone} {csymbol} {
- % also postpone
- \directsetup{mmc:csymbol:apply}
- } {
- \doifelse {\getXMLstackname\plusone} {ci} {
- \getXMLstackdata\plusone
- \ifnum\XMLstacklevel>\plusone
- \left(\MMLcreset\flushXMLstackwith\plustwo{\MMLseparator,}\right)
- \fi
- } {
- \getXMLstackdata\plusone
- }
- }
- }
- }
- \endgroup
- \advance\MMLapplydepth\minusone
- \directsetup{apply:flush}
- \doifXMLparelse{apply}{close}{\right\XMLpar{apply}{close}{}}\donothing
- }
- \endgroup
-\stopsetups
-
-\startsetups apply:flush
-\relax
- \ifcase\MMLapplydepth
- \ifconditional\somepostponedMMLactions
- \postponedMMLactions
- \ifx\MMLpowerelement\empty\else
- ^{\MMLcreset\MMLpowerelement\empty}
- \global\let\MMLpowerelement\empty
- \fi
- \fi
- \fi
-\stopsetups
-
-% reln
-
-\defineXMLnestedenvironmentsave [reln]
- {\writestatus{XML}{MathML element "reln" is obsolete}}
- {}
-
-% fn
-
-\startsetups mmc:fn:plusminus
- \ifnum\XMLstacklevel>\plustwo
- \MMLcreset
- \left(\expandafter\flushXMLstackwith\expandafter\plustwo\expandafter{\XMLfnoperator}\right)
- \else
- \getXMLstackdata\plustwo
- \fi
-\stopsetups
-
-\startsetups mmc:fn:minusplus
- \directsetup{mmc:fn:plusminus}
-\stopsetups
-
-\defineXMLnested
- [fn]
- {\directsetup{mmc:fn:start}}
- {\directsetup{mmc:fn:stop}}
-
-\startsetups mmc:fn:apply
- \begingroup
- \startsavingXMLelements
- \rawXMLstacktext\plusone % still on stack, no check, just fn content
- \stopsavingXMLelements
- \doifelse {\getXMLstackname\plusone} {ci} {
- \flattenXMLcontent{\getXMLstackdata\plusone}
- \doifsetupselse{mmc:fn:\flattenedXMLcontent} {
- \global\defXMLstackdata\XMLfnoperator\plusone
- \expanded{\endgroup\noexpand\directsetup{mmc:fn:\flattenedXMLcontent}}
- } {
- \endgroup
- \MMLcreset
- \getXMLstackdata\plusone
- \ifnum\XMLstacklevel>\plusone
- \getXMLentity{NegThinSpace}
- \left(\MMLcreset\flushXMLstackwith\plustwo{\MMLseparator,}\right)
- \fi
- }
- } {
- \endgroup
- \MMLcreset
- \getXMLstackdata\plusone
- }
-\stopsetups
-
-\startsetups mmc:fn:start
- \ifnum\XMLstacklevel>\plustwo
- \def\MMCfnleft {\left(}
- \def\MMCfnright{\right)}
- \else
- \let\MMCfnleft \relax
- \let\MMCfnright\relax
- \fi
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:fn:stop
- \stopsavingXMLelements
- \doifelse {\getXMLstackname\plusone} {ci} {
- \flattenXMLcontent{\getXMLstackdata\plusone}
- \doifsetupselse{mmc:fn:\flattenedXMLcontent} {
- \global\defXMLstackdata\XMLfnoperator\plusone
- \directsetup{mmc:fn:\flattenedXMLcontent}
- } {
- \MMLcreset
- \getXMLstackdata\plusone
- }
- \endgroup
- } {
- \doifelse {\getXMLstackname\plusone} {apply} {
- \doifelseMMCfunctioninapply \plusone {plus,minus} {
- \left(
- \getXMLstackdata\plusone
- \right)
- } {
- \getXMLstackdata\plusone
- }
- \endgroup
- \ifnum\XMLstacklevel>\plusone
- \left(
- \getXMLstackdata\plustwo
- \right)
- \fi
- } {
- \MMLcreset
- \getXMLentity{NegThinSpace}
- \MMCfnleft
- \ifnum\XMLstacklevel=\plustwo\MMLccomma\fi
- \flushXMLstackwith\plustwo\MMLccomma
- \MMCfnright
- \endgroup
- }
- }
-\stopsetups
-
-% c*
-
-\defineXMLargument [ci] [type=] {\XMLval{mmc:ci}{\XMLop{type}} {\firstofoneargument}}
-\defineXMLargument [cn] [type=,base=] {\XMLval{mmc:cn}{\XMLop{type}} {\firstofoneargument}}
-\defineXMLargument [csymbol] [encoding=text] {\XMLval{mmc:cs}{\XMLop{encoding}}{\firstofoneargument}}
-
-%D The next definition provide a kind of plug-in mechanism (see
-%D the open math extension module).
-
-\defineXMLsingular
- [csymbol]
- [encoding=text,
- definitionURL=]
- {\doifsomething{\XMLop{definitionURL}}{\directsetup{mmc:csymbol:apply}}}
-
-\startsetups mmc:csymbol:apply
- \begingroup
- \startsavingXMLelements
- \rawXMLstacktext\plusone % still on stack, no check, just attr test
- \stopsavingXMLelements
- % http://www.publishers.com/SomeName
- \lowercasestring\XMLpar{csymbol}{definitionURL}{}\to\mmcSymbolURL
- \doifsetupselse{mmc:csymbol:} {\mmcSymbolURL} {
- \expanded{\endgroup\noexpand\directsetup{mmc:csymbol:\mmcSymbolURL}}
- } {
- % SomeName (fallback)
- \splitfilename{\XMLpar{csymbol}{definitionURL}{}}
- \doifsetupselse{mmc:csymbol:\splitoffbase} {
- \expanded{\endgroup\noexpand\directsetup{mmc:csymbol:\splitoffbase}}
- } {
- \endgroup
- \XMLval{mmc:cs}{\XMLop{encoding}}{\firstofoneargument}
- }
- }
-\stopsetups
-
-%D Alternative b will convert periods into comma's:
-%D
-%D \startbuffer
-%D \startXMLdata
-%D <imath><apply><cn>1.23</cn></apply></imath>
-%D <dmath><apply><cn>1.23</cn></apply></dmath>
-%D \stopXMLdata
-%D
-%D \type{\setupMMLappearance[cn] [alternative=b]}
-%D
-%D \startXMLdata
-%D <imath><apply><cn>1.23</cn></apply></imath>
-%D <dmath><apply><cn>1.23</cn></apply></dmath>
-%D \stopXMLdata
-%D \stopbuffer
-%D
-%D \start \typebuffer \getbuffer \stop
-
-\setupMMLappearance[cn] [\c!alternative=\v!a]
-
-\defineXMLargument[cn][type=,base=]{\MMLdocn}
-
-\def\MMLdocn#1%
- {\begingroup
- \doif\@@MMLcnalternative\v!b{\redefinemathcharacter [.][ord][mi]["3B]\relax}%
- \XMLval{mmc:cn}{\XMLop{type}}{\firstofoneargument}{#1}%
- \endgroup}
-
-\defineXMLsingular [sep] {\MMLcsep} \def\MMLcsep{\,}
-
-\setupMMLappearance[polar] [\c!alternative=\v!a] % a|b|c
-\setupMMLappearance[float] [\c!symbol=\v!no] % \v!yes|dot
-\setupMMLappearance[enotation][\c!symbol=\v!no] % \v!yes|dot
-\setupMMLappearance[base] [\c!symbol=\v!numbers] % digits|characters|text|no
-
-\mapXMLvalue {mmc:ci} {set} {\MMLcCIset}
-\mapXMLvalue {mmc:ci} {vector} {\MMLcCIvector}
-\mapXMLvalue {mmc:ci} {matrix} {\MMLcCImatrix}
-\mapXMLvalue {mmc:ci} {function} {\MMLcCIfunction}
-\mapXMLvalue {mmc:ci} {complex-cartesian} {\MMLccartesian}
-\mapXMLvalue {mmc:ci} {complex} {\MMLccartesian}
-\mapXMLvalue {mmc:ci} {complex-polar} {\MMLcpolar}
-\mapXMLvalue {mmc:ci} {polar} {\MMLcpolar}
-\mapXMLvalue {mmc:ci} {fn} {\MMLcCIfunction}
-
-\mapXMLvalue {mmc:cn} {integer} {\MMLcCNinteger}
-\mapXMLvalue {mmc:cn} {logical} {\MMLcCNlogical}
-\mapXMLvalue {mmc:cn} {rational} {\MMLcCNrational}
-\mapXMLvalue {mmc:cn} {complex-cartesian} {\MMLccartesian}
-\mapXMLvalue {mmc:cn} {complex} {\MMLccartesian}
-\mapXMLvalue {mmc:cn} {complex-polar} {\MMLcpolar}
-\mapXMLvalue {mmc:cn} {polar} {\MMLcpolar}
-\mapXMLvalue {mmc:cn} {e-notation} {\MMLcenotation} % new
-\mapXMLvalue {mmc:cn} {float} {\MMLcfloat} % obsolete
-\mapXMLvalue {mmc:cn} {real} {\MMLcfloat}
-
-\mapXMLvalue {mmc:cs} {text} {\MMLcCStext}
-
-\def\MMLcpolar#1%
- {\doifdefinedelse{MMLcdopolar\@@MMLpolaralternative}
- {\getvalue{MMLcdopolar\@@MMLpolaralternative}{#1}}
- {#1}}
-
-\def\MMLcdopolara#1%
- {\def\MMLcsep{\MMLseparator,}\getXMLentity{polar}\left(#1\right)}
-
-\def\MMLcdopolarb#1%
- {\def\MMLcsep##1\empty
- {\getXMLentity{exponentiale}^{##1\mskip2mu\getXMLentity{imaginaryi}}}
- #1\empty}
-
-\def\MMLcdopolarc#1%
- {\def\MMLcsep##1\empty
- {\getXMLentity{exp}\left(##1\mskip2mu\getXMLentity{imaginaryi}\right)}%
- #1\empty}
-
-\def\MMLccartesian#1%
- {\def\MMLcsep{+}#1\getXMLentity{imaginaryi}}
-
-% float will be obsolete, and is replace by e-notation
-
-\def\MMLcfloat#1%
- {\doifelse\@@MMLfloatsymbol\v!no
-% {{\MMLrm#1}}% make sure that e shows up ok
- {\mfunction{#1}}% make sure that e shows up ok
- {% we should ignore \entities !
- \beforesplitstring#1\at e\to\first
- \aftersplitstring #1\at e\to\last
- \ifx\first\empty #1\else
- \ifx\last \empty #1\else
- \first
- \doifelse\@@MMLfloatsymbol{dot}\cdot\times
- 10^{\last}%
- \fi\fi}}
-
-% we now have:
-
-\def\MMLcenotation#1%
- {\doifelse\@@MMLenotationsymbol\v!no
-% {\def\MMLcsep {\unskip{\MMLrm e}\ignorespaces}}
- {\def\MMLcsep {\unskip\mfunction{e}\ignorespaces}}
- {\def\MMLcsep##1\empty{\doifelse\@@MMLenotationsymbol{dot}\cdot\times10^{##1}}}%
- #1\empty}
-
-\def\MMLcCIset#1%
- {{\bbd#1}}
-
-\def\widevec#1%
- {\vbox{\m@th\ialign{##\crcr
- \rightarrowfill\crcr\noalign{\nointerlineskip}%
- $\hfil\displaystyle{#1}\hfil$\crcr}}}
-
-\def\MMLcCIvector#1%
- {\widevec{#1}}
-
-\def\MMLcCImatrix#1%
- {{\bi#1}}
-
-\def\MMLcCIfunction#1%
- {#1\getXMLentity{NegThinSpace}}
-
-\def\MMLcCNinteger#1%
- {\doifXMLparelse{cn}{base}
- {\def\MMLcCNbase{\XMLpar{cn}{base}{}}%
- \doifelse\@@MMLbasesymbol\v!no
- {\MMLcCNbasedata{#1}}
-% {\MMLcCNbasedata{#1}_{\hbox{$\MMLrm\scriptscriptstyle
- {\MMLcCNbasedata{#1}_{\mfunction{%
- \processaction
- [\@@MMLbasesymbol]
- [\v!characters=>\MMLcCNbasestring BODH,
- \v!text=>\MMLcCNbasestring{BIN}{OCT}{DEC}{HEX},
-% \s!unknown=>\MMLcCNbase]$}}}}
- \s!unknown=>\MMLcCNbase]}}}}
- {#1}}
-
-\def\MMLcCNbasedata#1%
-% {\ifnum\MMLcCNbase>10{\MMLrm#1}\else#1\fi}
- {\ifnum\MMLcCNbase>10\mfunction{#1}\else#1\fi}
-
-\def\MMLcCNbasestring#1#2#3#4%
- {\ifnum\MMLcCNbase= 2 #1\else
- \ifnum\MMLcCNbase= 8 #2\else
- \ifnum\MMLcCNbase=10 #3\else
- \ifnum\MMLcCNbase=16 #4\else
- \MMLcCNbase \fi\fi\fi\fi}
-
-\def\MMLcCNlogical#1%
-% {{\MMLrm#1}}
- {\mfunction{#1}}
-
-\bgroup \catcode`\<=\active
-
- % quick and dirty, best track the stack (todo)
-
- \gdef\MMLcCNrational#1%
- {\ConvertConstantAfter\doifinstringelse{sep}{#1}
- {\doMMLcCNrational#1\empty}
- {#1}}
-
- \gdef\doMMLcCNrational#1<sep#2>#3\empty
- {\hbox{$\frac{#1}{#3}$}}
-
-\egroup
-
-\def\MMLcCStext#1%
-% {{\MMLrm#1}}
- {\mfunction{#1}}
-
-% interval
-
-\defineXMLnested [interval]
- [closure=closed]
- {\directsetup{mmc:interval:start}}
- {\directsetup{mmc:interval:stop}}
-
-\startsetups mmc:interval:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:interval:stop
- \stopsavingXMLelements
- \XMLval{mmc:int}{\XMLpar{interval}{closure}{closed}}{error}
- \endgroup
-\stopsetups
-
-\startsetups mmc:interval:fetch
- \defineXMLnested [interval]
- [closure=closed]
- {\directsetup{mmc:interval:fetch:start}}
- {\directsetup{mmc:interval:fetch:stop}}
-\stopsetups
-
-\startsetups mmc:interval:fetch:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:interval:fetch:stop
- \stopsavingXMLelements
- \globallet\MMCintervalfrom\empty
- \globallet\MMCintervalto \empty
- \ifcase\XMLstacklevel
- \or
- \xdef\MMCintervalfrom{\getXMLstackdata\plusone}
- \or
- \xdef\MMCintervalfrom{\getXMLstackdata\plusone}
- \xdef\MMCintervalto {\getXMLstackdata\plustwo}
- \fi
- \endgroup
-\stopsetups
-
-\setupMMLappearance[interval][\c!alternative=\v!a,\c!separator={,}]
-
-\mapXMLvalue {mmc:int} {closed}
- {\left[\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right]}
-
-\mapXMLvalue {mmc:int} {open-closed}
- {\doifelse\@@MMLintervalalternative\v!b
- {\left<\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right]}
- {\left(\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right]}}
-
-\mapXMLvalue {mmc:int} {closed-open}
- {\doifelse\@@MMLintervalalternative\v!b
- {\left[\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right>}
- {\left[\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right)}}
-
-\mapXMLvalue {mmc:int} {open}
- {\doifelse\@@MMLintervalalternative\v!b
- {\left<\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right>}
- {\left(\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right)}}
-
-% inverse
-
-\defineXMLcommand [inverse] {\directsetup{mmc:inverse}}
-
-\startsetups mmc:inverse
- \ifnum\XMLstacklevel>\plustwo
- \getXMLentity{\getXMLstackname\plustwo}^{-1}
- \left[\getXMLstackdata\plusthree\right]
- \else
- \xdef\MMLpowerelement{-1}
- \expanded{\postponeMMLactions{\rawXMLstackdata\plustwo}}
- \eraseXMLdataonstack\plustwo
- \fi
-\stopsetups
-
-% condition
-
-\defineXMLnested
- [condition]
- {\directsetup{mmc:condition:start}}
- {\directsetup{mmc:condition:stop}}
-
-\startsetups mmc:condition:start
-% \XMLdoifonstackelse{bvar} {
-% \XMLfirstnamed{bvar}\mid
-% } { }
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:condition:stop
- \stopsavingXMLelements
- \flushXMLstackfrom\plusone
- \endgroup
-\stopsetups
-
-% declare
-
-\setupMMLappearance[declare][\c!state=\v!start]
-
-\defineXMLnested
- [declare]
- {\directsetup{mmc:declare:start}}
- {\directsetup{mmc:declare:stop}}
-
-\startsetups mmc:declare:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:declare:stop
- \stopsavingXMLelements
- \doif\@@MMLdeclarestate\v!start {
- \getXMLentity{declare}\getXMLstackdata\plusone
- \ifnum\XMLstacklevel>\plusone
- \getXMLentity{ThickSpace}
- \getXMLentity{as}
- \getXMLentity{ThickSpace}
- \fi
- \getXMLstackdata\plustwo
- }
- \endgroup
-\stopsetups
-
-% lambda
-
-\setupMMLappearance[lambda][\c!alternative=b]
-
-\defineXMLnested
- [lambda]
- {\directsetup{mmc:lambda:start}}
- {\directsetup{mmc:lambda:stop}}
-
-\startsetups mmc:lambda:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:lambda:stop
- \stopsavingXMLelements
- \doifelse\@@MMLlambdaalternative\v!a {
- \getXMLentity{lambda}(\flushXMLstackwith\plusone{\MMLseparator,})
- } {
- \countXMLnamedstack{bvar}
- \ifnum\scratchcounter>\plusone
- \left(\flushXMLnamedstackwith\plusone{bvar}{\MMLseparator,}\right)
- \else
- \XMLfirstnamed{bvar}
- \fi
- \getXMLentity{mapsto}
- \MMLcreset
- \XMLfirstnamed{apply,reln,ci,cn}
- }
- \endgroup
-\stopsetups
-
-\startsetups mmc:lambda:simple
- \defineXMLnested
- [lambda]
- {\directsetup{mmc:lambda:simple:start}}
- {\directsetup{mmc:lambda:simple:stop}}
-\stopsetups
-
-\startsetups mmc:lambda:simple:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:lambda:simple:stop
- \stopsavingXMLelements
- \MMLcreset % new
- \XMLfirstnamed{apply}
- \endgroup
-\stopsetups
-
-% compose
-
-\defineXMLcommand [compose] {\directsetup{mmc:compose}}
-
-\startsetups mmc:compose
- \begingroup
- \MMLcreset
- \let\MMLcCIfunction\firstofoneargument % brrr
- \doifelseMMCfunction {
- \left(\flushXMLstackwith\plustwo\circ\right)
- } {
- \flushXMLstackwith\plustwo\circ
- }
- \endgroup
-\stopsetups
-
-\defineXMLcommand [image] {\directsetup{mmc:image}}
-
-\startsetups mmc:image
- \getXMLentity{image}
- \left(
- \begingroup
- \startlocalsetups [mmc:function]
- \getXMLentity\currentXMLelement
- \stoplocalsetups
- \getXMLstackdata\plustwo
- \endgroup
- \right)
-\stopsetups
-
-\setupMMLappearance[piece][\c!separator=]
-
-\def\setMMLcPIECEseparator
- {\processaction
- [\@@MMLpieceseparator]
- [ \v!yes=>\def\theMMLpieceseparator{,\@col@amp@},
- \v!no=>\let\theMMLpieceseparator\@col@amp@,
- \s!default=>\let\theMMLpieceseparator\@col@amp@,
- \s!unknown=>\def\theMMLpieceseparator{\,\,\hbox{\@@MMLpieceseparator}\,\,}]}
-
-\defineXMLargument[piecewise] {\cases}
-
-\defineXMLnested
- [piece]
- {\directsetup{mmc:piece:start}}
- {\directsetup{mmc:piece:stop}}
-
-\defineXMLenvironmentsave
- [otherwise]
- {}
- {\directsetup{mmc:otherwise}}
-
-\startsetups mmc:piece:start
- \startsavingXMLelements
- \setMMLcPIECEseparator
-\stopsetups
-
-\startsetups mmc:piece:stop
- \stopsavingXMLelements
- \edef\ascii{\getXMLstackdata\plusone}
- \@EA\XMLRtoks\@EA{\ascii\theMMLpieceseparator}
- \edef\ascii{\getXMLstackdata\plustwo}
- \@EA\appendtoks\@EA\mathematics\@EA{\ascii}\to\XMLRtoks
- \the\XMLRtoks\crcr
-\stopsetups
-
-\startsetups mmc:otherwise
- \XMLflush{otherwise}\MMLcPIECEseparator\@col@amp@\mathematics{\getXMLentity{otherwise}}\crcr
-\stopsetups
-
-\defineXMLcommand [quotient] {\directsetup{mmc:quotient}}
-
-\startsetups mmc:quotient
- \lfloor\getXMLstackdata\plustwo/\getXMLstackdata\plusthree\rfloor
-\stopsetups
-
-\defineXMLcommand [factorial] {\getXMLstackdata\plustwo !}
-
-\defineXMLcommand [divide] [\MMLargumentprefix] [] {\directsetup{mmc:divide}} % brr not nested
-
-\setupMMLappearance [divide] [\c!level=\!!maxcard,\c!alternative=\v!a]
-
-\startsetups mmc:divide
- \startusingMMLarguments
- \increment\MMLcDIVIDElevel
- \doifelse \@@MMLdividealternative\v!b {
- \getXMLstackdata\plustwo/\getXMLstackdata\plusthree
- } {
- \ifnum\MMLcDIVIDElevel>\@@MMLdividelevel\space
- \getXMLstackdata\plustwo/\getXMLstackdata\plusthree
- \else
- \MMLcreset
- \frac{\MMLcreset\getXMLstackdata\plustwo}{\MMLcreset\getXMLstackdata\plusthree}%
- \fi
- }
- \decrement\MMLcDIVIDElevel
- \stopusingMMLarguments
-\stopsetups
-
-% min max
-
-\defineXMLcommand [min] {\min\directsetup{mmc:minmax}}
-\defineXMLcommand [max] {\max\directsetup{mmc:minmax}}
-
-\startsetups mmc:minmax
- \doifelse{\getXMLstackdata\plustwo}{bvar} {
- {}_{\getXMLstackdata\plustwo}
- \left\{\flushXMLstackwith\plusthree{\MMLseparator,}\right\}
- } {
- \left\{\flushXMLstackwith\plustwo {\MMLseparator,}\right\}
- }
-\stopsetups
-
-% minus plus
-
-\defineXMLcommand [minus] {\directsetup{mmc:minus}}
-\defineXMLcommand [plus] [\MMLargumentprefix] [] {\directsetup{mmc:plus}}
-
-\setupMMLappearance [plus] [\c!alternative=\v!a] % b = no sign -> 3 1/4
-\setupMMLappearance [sign] [\c!reduction=\v!yes]
-
-\startsetups mmc:minus
- \doif \@@MMLsignreduction \v!yes {
- \setMMLcreset{fn,\MMLcfunctionlist}
- }
- \ifcase\XMLstacklevel
- \or
- % self
- \or
- -\getXMLstackdata\plustwo
- \else
- \flushXMLstackwith\plustwo-
- \fi
-\stopsetups
-
-\startsetups mmc:plus
- \startusingMMLarguments
- \doifelse \@@MMLsignreduction \v!yes {
- \setMMLcreset{fn,plus,minus,\MMLcfunctionlist,\MMLcconstructlist}% was plus/, minus/
- \doifelse{\getXMLstackname\plustwo} {apply} {
- % branch needed, else (a-b) + (c-d) goes wrong
- % reset check in case of (-x) + 37
- \begingroup
- \dodoifelseMMCfunctioninapply \plustwo {minus} {
- \ifnum\XMLstacklevel>\plustwo
- \endgroup
- \else
- \endgroup
- \MMLcreset
- \fi
- } {
- \endgroup
- }
- \doifelse \@@MMLplusalternative \v!b {
- \getXMLstackdata\plustwo \,
- } {
- \flushXMLstackwith\plustwo +
- }
-
- } {
- \flushXMLstackwith\plustwo {
- \doifelse {\getXMLstackname\recurselevel} {apply} {
- \begingroup
- \dodoifelseMMCfunctioninapply \recurselevel {minus} {
- \ifnum\XMLstacklevel>\plustwo +\fi
- } {
- \doifelse \@@MMLplusalternative \v!b {
- \, % maybe 2 1/3
- } {
- +
- }
- }
- \endgroup
- \MMLcreset
- } {
- +
- }
- }
- }
- } {
- \ifcase\XMLstacklevel
- \or
- % self
- \or
- +\getXMLstackdata\plustwo
- \else
- \flushXMLstackwith\plustwo+
- \fi
- }
- \stopusingMMLarguments
-\stopsetups
-
-% power
-
-\defineXMLcommand [power] {\directsetup{mmc:power}}
-
-\setupMMLappearance[power][\c!reduction=\v!yes]
-
-\let\MMLpowerelement\empty
-
-\startsetups mmc:power
- \doifelse {\getXMLstackname\plustwo} {apply} {
- \doifelse\@@MMLpowerreduction\v!yes {
- \doifelseMMCfunctioninapply \plustwo \MMLcfunctionlist {
- \xdef\MMLpowerelement{\getXMLstackdata\plusthree}% postpone
- \MMLcreset\getXMLstackdata\plustwo
- } {
- \left(\MMLcreset\getXMLstackdata\plustwo\right)^{\MMLcreset\getXMLstackdata\plusthree}
- }
- } {
- \left(\MMLcreset\getXMLstackdata\plustwo\right)^{\MMLcreset\getXMLstackdata\plusthree}
- }
- } {
- \getXMLstackdata\plustwo^{\MMLcreset\getXMLstackdata\plusthree}
- }
-\stopsetups
-
-% rem
-
-\defineXMLcommand [rem] {\flushXMLstackwith\plustwo{\getXMLentity{mod}}}
-
-\setupMMLappearance [times] [\c!symbol=\v!no,\c!auto=\v!yes] % new, auto catches cn cn cn
-
-\defineXMLcommand [times] [\MMLargumentprefix] [] {\directsetup{mmc:times}}
-
-\startsetups mmc:times
- \startusingMMLarguments
- \setMMLcreset{\MMLcfunctionlist,\MMLcconstructlist}%
- \doifelse\@@MMLtimesauto\v!no {
- \let\@@MMLtimes@@symbol\@@MMLtimessymbol
- } {
- \countXMLnamedstack {cn}
- \ifnum\scratchcounter>\plusone
- \doifinsetelse\@@MMLtimessymbol{\v!yes,\v!no} {
- \let\@@MMLtimes@@symbol\v!yes
- } {
- \let\@@MMLtimes@@symbol\@@MMLtimessymbol
- }
- \else
- \let\@@MMLtimes@@symbol\@@MMLtimessymbol
- \fi
- }
- \doifelse\@@MMLtimes@@symbol\v!yes {
- \flushXMLstackwith\plustwo\times
- } {
- \doifelse\@@MMLtimes@@symbol{dot} {
- \flushXMLstackwith\plustwo\cdot
- } {
- \doifelse\@@MMLtimes@@symbol{times} {
- \flushXMLstackwith\plustwo\times
- } {
- \flushXMLstackwith\plustwo\empty
- }
- }
- }
- \stopusingMMLarguments
-\stopsetups
-
-\defineXMLcommand [root] {\directsetup{mmc:root}}
-
-\setupMMLappearance[root][\c!symbol=\v!yes]
-
-\startsetups mmc:root
- \XMLdoifonstackelse {degree} {
- \root
- \doifnot\@@MMLrootsymbol\v!no{\MMLcreset\XMLfirstnamed{degree}}
- \of
- } {
- \sqrt
- }
- {\MMLcreset\XMLfirstnamed{apply,reln,ci,cn}}
-\stopsetups
-
-% gcd
-
-\defineXMLcommand [gcd] {\gcd\left(\MMLcreset\flushXMLstackwith\plustwo{\MMLseparator,}\right)}
-
-% and or xor implies
-
-\defineXMLcommand [and] {\flushXMLstackwith\plustwo{\getXMLentity{and}}}
-\defineXMLcommand [or] {\flushXMLstackwith\plustwo{\getXMLentity{or}}}
-\defineXMLcommand [xor] {\flushXMLstackwith\plustwo{\getXMLentity{xor}}}
-\defineXMLcommand [implies] {\flushXMLstackwith\plustwo{\getXMLentity{implies}}}
-
-% not
-
-\defineXMLcommand [not] {\getXMLentity{not}\getXMLstackdata\plustwo}
-
-% forall exists
-
-\defineXMLcommand [forall] {\directsetup{mmc:forall}}
-\defineXMLcommand [exists] {\directsetup{mmc:exists}}
-
-%D We need to shift left below rotated A.
-
-\startsetups mmc:forall
- \getXMLentity{forall}
- \getXMLentity{NegThinSpace}
- \directsetup{mmc:forall-exists}
-\stopsetups
-
-\startsetups mmc:exists
- \getXMLentity{exists}
- \directsetup{mmc:forall-exists}
-\stopsetups
-
-\startsetups mmc:forall-exists
- _{\flushXMLnamedstackwith\plustwo{bvar}{\MMLseparator,}}
- \XMLdoifonstackelse {condition} {
- \getXMLentity{ThickSpace}
- \begingroup
- \XMLfirstnamed{condition}
- \endgroup
- \countXMLnamedstack {apply,reln,ci,cn}
- \ifcase\scratchcounter
- \or
- % == snelle volgende
- \left\vert \MMLcreset
- \getXMLentity{MediumSpace}
- \flushXMLnamedstackwith\plustwo{apply,reln,ci,cn}\empty
- \right.
- \else
- % special case
- % \defineXMLignore[condition]
- \collectXMLnamedstack{apply,reln,ci,cn}{\hfill\crcr}
- \left\vert
- \matrix{\the\XMLRtoks}
- \right.
- \fi
- } {
- :\XMLfirstnamed{apply,reln,ci,cn}
- }
-\stopsetups
-
-\defineXMLcommand [abs] {\left\vert \MMLcreset \flushXMLstackfrom\plustwo \right\vert}
-\defineXMLcommand [conjugate] {{\overline{\MMLcreset \flushXMLstackfrom\plustwo}}} % watch extra {}
-\defineXMLcommand [arg] {\getXMLentity{arg} \left(\MMLcreset\flushXMLstackfrom\plustwo\right)}
-\defineXMLcommand [real] {\getXMLentity{real} \left(\MMLcreset\flushXMLstackfrom\plustwo\right)}
-\defineXMLcommand [imaginary] {\getXMLentity{imaginary}\left(\MMLcreset\flushXMLstackfrom\plustwo\right)}
-\defineXMLcommand [lcm] {\getXMLentity{lcm} \left(\flushXMLstackwith\plustwo{\MMLseparator,}\right)}
-\defineXMLcommand [floor] {\getXMLentity{lfloor} \flushXMLstackfrom\plustwo \getXMLentity{rfloor}}
-\defineXMLcommand [ceiling] {\getXMLentity{lceiling} \flushXMLstackfrom\plustwo \getXMLentity{rceiling}}
-
-% relations
-
-\defineXMLcommand [eq] [\MMLargumentprefix] [\c!align=] {\MMLcrelation=}
-\defineXMLcommand [neq] [\MMLargumentprefix] [\c!align=] {\MMLcrelation\neq}
-\defineXMLcommand [gt] [\MMLargumentprefix] [\c!align=] {\MMLcrelation>}
-\defineXMLcommand [lt] [\MMLargumentprefix] [\c!align=] {\MMLcrelation<}
-\defineXMLcommand [geq] [\MMLargumentprefix] [\c!align=] {\MMLcrelation\geq}
-\defineXMLcommand [leq] [\MMLargumentprefix] [\c!align=] {\MMLcrelation\leq}
-\defineXMLcommand [equivalent] [\MMLargumentprefix] [\c!align=] {\MMLcrelation\equiv}
-\defineXMLcommand [approx] [\MMLargumentprefix] [\c!align=] {\MMLcrelation\approx}
-\defineXMLcommand [factorof] [\MMLargumentprefix] [\c!align=] {\MMLcrelation\mid}
-
-\setupMMLappearance[relation][\c!align=\v!no]
-
-\def\MMLcrelation
- {\startusingMMLarguments
- \MMLcreset
- \edef\@@MMLrelationalign{\executeifdefined{\MMLargumentprefix\c!align}\@@MMLrelationalign}%
- \processaction
- [\@@MMLrelationalign]
- [\v!last=>\let\next\lastMMLcrelation ,
- \v!first=>\let\next\firstMMLcrelation,
- \v!yes=>\let\next\leftMMLcrelation ,
- \v!left=>\let\next\leftMMLcrelation ,
- \v!right=>\let\next\rightMMLcrelation,
- \s!default=>\let\next\noMMLcrelation ,
- \s!unknown=>\let\next\noMMLcrelation ]
- \next}
-
-\def\noMMLcrelation#1%
- {\flushXMLstackwith\plustwo{#1}
- \stopusingMMLarguments}
-
-\def\lastMMLcrelation#1% weird, probably bugged
- {\XMLRtoks\emptytoks
- \dostepwiserecurse\plustwo\XMLstacklevel\plusone
- {\appendetoks\noexpand\getXMLstackdata{\recurselevel}\to\XMLRtoks
- \ifnum\recurselevel<\numexpr\XMLstacklevel-1\relax
- \appendtoks\@col@amp@#1\crcr\to\XMLRtoks
- \else\ifnum\recurselevel=\numexpr\XMLstacklevel-1\relax
- \appendtoks\@col@amp@#1\to\XMLRtoks
- \fi\fi}%
- \eqalign{\the\XMLRtoks\crcr}%
- \stopusingMMLarguments}
-
-\def\firstMMLcrelation#1%
- {\collectXMLstackrows\plusthree{\crcr\@col@amp@#1}%
- \eqalign{\getXMLstackdata\plustwo\@col@amp@#1\the\XMLRtoks}%
- \stopusingMMLarguments}
-
-\def\leftMMLcrelation#1%
- {\collectXMLstackrows\plustwo{\@col@amp@#1\crcr}%
- \eqalign{\the\XMLRtoks}%
- \stopusingMMLarguments}
-
-\def\rightMMLcrelation#1%
- {\collectXMLstackrows\plustwo{\crcr#1{}\@col@amp@}%
- \eqalign{\@col@amp@\the\XMLRtoks\crcr}%
- \stopusingMMLarguments}
-
-\defineXMLcommand [becomes] {\MMLcrelation{:=}}
-
-\addtocommalist{becomes/}\MMLcmainresetlist
-
-% calculus and vector calculus
-
-\setupMMLappearance[int][\c!location=\v!top]
-
-\def\doMMLlimits#1%
- {\doifelsevalue{@@MML#1\c!location}\v!top\limits\nolimits}
-
-\defineXMLnested
- [domainofapplication]
- {\directsetup{mmc:domainofapplication:start}}
- {\directsetup{mmc:domainofapplication:stop}}
-
-\startsetups mmc:domainofapplication:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:domainofapplication:stop
- \stopsavingXMLelements
-% \MMLcreset
- \flushXMLstackfrom\plusone
- \endgroup
-\stopsetups
-
-\defineXMLcommand [int] {\directsetup{mmc:int}}
-
-\startsetups mmc:int
- \MMLcreset
- \XMLdoifonstackelse{domainofapplication} {
- \int\doMMLlimits{int}_{\XMLfirstnamed{domainofapplication}}\relax
- } {
- \XMLdoifonstackelse{condition} {
- \int\doMMLlimits{int}_{\XMLfirstnamed{condition}}\relax
- } {
- \XMLdoifonstackelse{lowlimit} {
- \int\doMMLlimits{int}
- _{\XMLfirstnamed{lowlimit}}
- ^{\XMLfirstnamed{uplimit}}
- } {
- % funny, why do we have lowlimit/uplimit then
- \XMLdoifonstackelse{interval} {
- \begingroup
- \startlocalsetups mmc:interval:start %
- \begingroup
- \startsavingXMLelements
- \stoplocalsetups
- \startlocalsetups mmc:interval:stop %
- \stopsavingXMLelements
- \xdef\MMLfirstelement {\getXMLstackdata\plusone}
- \xdef\MMLsecondelement{\getXMLstackdata\plustwo}
- \endgroup
- \stoplocalsetups
- \globallet\MMLfirstelement \empty
- \globallet\MMLsecondelement\empty
- \XMLfirstnamed{interval}
- \endgroup
- \int\doMMLlimits{int}
- _{\MMLfirstelement}
- ^{\MMLsecondelement}
- } {
- \int
- }
- }
- }
- }
- \MMLcreset
- \XMLdoifonstackelse{apply} {
- \doifelseMMCfunction {
- \XMLfirstnamed{apply}
- } {
- % if there are too many () now, we need to be more clever
- \left(\XMLfirstnamed{apply}\right)
- }
- } {
- \XMLfirstnamed{ci}
- }
- \XMLdoifonstackelse{bvar} {
- \,% \getXMLentity{ThinSpace}%
-% {\MMLrm\getXMLentity{mathematicald}}
- \mfunction{\getXMLentity{mathematicald}}
- \XMLfirstnamed{bvar}
- } {
- % nothing
- }
-\stopsetups
-
-\setupMMLappearance[diff][\c!location=\v!top,\c!alternative=\v!a]
-
-\defineXMLcommand [diff] {\directsetup{mmc:diff}}
-\defineXMLcommand [partialdiff] {\directsetup{mmc:partialdiff}}
-
-% \setupMMLappearance[diff][alternative=b]
-%
-% \startXMLdata
-% <math><apply><apply><diff/><bvar><ci>x</ci></bvar><ci>f</ci></apply><ci>a</ci></apply></math>
-% <math><apply><apply><diff/><bvar><ci>x</ci></bvar><degree>2</degree><ci>f</ci></apply><ci>a</ci></apply></math>
-% \stopXMLdata
-
-% d^y/dx^2
-%
-% \startXMLdata
-% <math><apply><diff/>
-% <bvar><ci>x</ci><cn type="integer">2</cn></bvar>
-% <lambda><bvar><ci>x</ci></bvar><ci>y</ci></lambda>
-% </apply></math>
-% \stopXMLdata
-
-\startsetups mmc:diff
- \MMLcreset
- \doifelse\@@MMLdiffalternative\v!a {
- \XMLdoifonstackelse{lambda} {
- % a special case (mathadore/openmath)
- \begingroup
- \defineXMLsave[ci]
- \defineXMLsave[cn]
- \defineXMLprocess[lambda]
- \defineXMLprocess[bvar]
- \frac {
- d^{\XMLfirstnamed{bvar}\XMLflush{cn}}{\XMLfirstnamed{lambda}\XMLflush{ci}}
- } {
- d{\XMLfirstnamed{bvar}\XMLflush{ci}}^{\XMLfirstnamed{bvar}\XMLflush{cn}}
- }
- \endgroup
- } {
- \XMLdoifonstackelse{bvar} {
- \frac {
- \XMLdoifonstackelse{degree} {
- \collectXMLnamedstack{degree}\empty
- } {
- \collectXMLnamedstacknamed{bvar}{degree}+
- }
- \mfunction{\getXMLentity{mathematicald}}
- ^{\the\XMLRtoks}
- \doif\@@MMLdifflocation\v!top {
- \XMLdoifonstackelse{ci} {
- \XMLfirstnamed{ci}
- } {
- \MMLcreset\XMLfirstnamed{apply}
- }
- }
- } {
- \mfunction{\getXMLentity{mathematicald}}
- \begingroup
- \defineXMLsave[degree]
- \XMLfirstnamed{bvar}
- \doifXMLdata{degree} {
- ^{\XMLflush{degree}}
- }
- \endgroup
- }
- \doifnot\@@MMLdifflocation\v!top {
- \left(\MMLcreset\XMLfirstnamed{apply,ci}\right)
- }
- } {
- \flushXMLstackfrom\plustwo^\prime
- }
- }
- } {
- \MMLcreset
- \XMLfirstnamed{apply,ci}
- % there can be problems with nested diff's: ^^{} error
- % so we add an empty group here
- {}^
- {
- \XMLdoifonstackelse{degree} {
- \defXMLfirstnamedtext\ascii{degree}
- \dorecurse\ascii\prime
- } {
- \prime
- }
- }
- }
-\stopsetups
-
-\startsetups mmc:partialdiff
- \XMLdoifonstackelse{list} {
- \getXMLentity{capitaldifferentiald}_{
- \begingroup
- \setfalse\MMLlistdelimiters
- \XMLallnamed{list}
- \endgroup
- }
- \XMLfirstnamed{apply,reln,ci,cn}
- } {
- \XMLdoifonstackelse{bvar} {
- \frac {
- \XMLdoifonstackelse{degree} {
- \collectXMLnamedstack{degree}\empty
- } {
- \collectXMLnamedstacknamed{bvar}{degree}+
- }
- \getXMLentity{differentiald}^{\the\XMLRtoks}
- % \let\MMLcDEGREE\gobbletwoarguments
- % \doifelseMMCfunction\MMLcreset\donothing
- \MMLcreset
- \XMLfirstnamed{apply,reln,ci,cn}
- } {
- \defineXMLnested[bvar]
- {\directsetup{mmc:bvar:diff:start}}
- {\directsetup{mmc:bvar:diff:stop}}
- \XMLfirstnamed{bvar}
- }
- } {
- \XMLfirstnamed{apply,reln,ci,cn}
- }
- }
-\stopsetups
-
-\startsetups mmc:bvar:diff:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:bvar:diff:stop
- \stopsavingXMLelements
- \getXMLentity{differentiald}\XMLfirstnamed{apply,reln,ci,cn}
- \XMLdoifonstackelse{degree} {
- ^{\XMLfirstnamed{degree}}
- } {
- % nothing
- }
- \endgroup
-\stopsetups
-
-\def\subMMLcelement #1#2{_{#2}}
-\def\superMMLcelement#1#2{^{#2}}
-
-\defineXMLprocess [lowlimit]
-\defineXMLprocess [uplimit]
-\defineXMLprocess [bvar]
-\defineXMLprocess [degree]
-
-% option:
-%
-% \defineXMLentity [div] {\mathematics{\triangledown\times}}
-% \defineXMLentity [curl] {\mathematics{\triangledown .}}
-% \defineXMLentity [grad] {\mathematics{\triangledown }}
-
-\defineXMLcommand [divergence] {\getXMLentity{divergence}\directsetup{mmc:donamedfunction}}
-\defineXMLcommand [grad] {\getXMLentity {grad}\directsetup{mmc:donamedfunction}}
-\defineXMLcommand [curl] {\getXMLentity {curl}\directsetup{mmc:donamedfunction}}
-\defineXMLcommand [laplacian] {\getXMLentity {laplacian}\directsetup{mmc:donamedfunction}}
-
-\defineXMLcommand [ident] {\getXMLentity {identity}\directsetup{mmc:donamedfunction}}
-% \defineXMLcommand [domain] {\getXMLentity {domain}\directsetup{mmc:donamedfunction}}
-% \defineXMLcommand [codomain] {\getXMLentity {codomain}\directsetup{mmc:donamedfunction}}
-
-\defineXMLcommand[domain] {\directsetup{mmc:domain:action}}
-\defineXMLcommand[codomain]{\directsetup{mmc:codomain:action}}
-
-\setupMMLappearance[domain] [symbol=]
-\setupMMLappearance[codomain][symbol=]
-
-\startsetups mmc:domain:action
- \doifelsenothing\@@MMLdomainsymbol {
- \getXMLentity{domain}\directsetup{mmc:donamedfunction}
- } {
- \@@MMLdomainsymbol_{\flushXMLstackfrom\plustwo}
- }
-\stopsetups
-\startsetups mmc:codomain:action
- \doifelsenothing\@@MMLcodomainsymbol {
- \getXMLentity{codomain}\directsetup{mmc:donamedfunction}
- } {
- \@@MMLcodomainsymbol_{\flushXMLstackfrom\plustwo}
- }
-\stopsetups
-
-
-\startsetups mmc:donamedfunction
-% \left(
-% \begingroup
- \MMLcreset\flushXMLstackfrom\plustwo
-% \endgroup
-% \right)
-\stopsetups
-
-% theory of sets
-
-\defineXMLnested [set]
- {\setups{mmc:set:start}}
- {\setups{mmc:set:stop}}
-
-\startsetups mmc:set:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:set:stop
- \stopsavingXMLelements
- \XMLdoifonstackelse{condition} {
- \left\{\XMLfirstnamed{bvar}\,\middle\vert\,\XMLfirstnamed{condition}\right\}
- } {
- \left\{\flushXMLstackwith\plusone{\MMLseparator,}\right\}
- }
- \endgroup
-\stopsetups
-
-\defineXMLnested [list]
- {\setups{mmc:list:start}}
- {\setups{mmc:list:stop}}
-
-\settrue\MMLlistdelimiters
-
-\startsetups mmc:list:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:list:stop
- \stopsavingXMLelements
- \ifconditional\MMLlistdelimiters\left [\fi
- \begingroup
- \settrue\MMLlistdelimiters
- \flushXMLstackwith\plusone{\MMLseparator,}
- \endgroup
- \ifconditional\MMLlistdelimiters\right]\fi
- \endgroup
-\stopsetups
-
-\defineXMLcommand [union] {\MMLcset\cup}
-\defineXMLcommand [intersect] {\MMLcset\cap}
-\defineXMLcommand [in] {\MMLcset\in}
-\defineXMLcommand [notin] {\MMLcset{\not\in}}
-\defineXMLcommand [subset] {\MMLcset\subset}
-\defineXMLcommand [prsubset] {\MMLcset\subseteq}
-\defineXMLcommand [notsubset] {\MMLcset{\not\subset}}
-\defineXMLcommand [notprsubset] {\MMLcset{\not\subseteq}}
-\defineXMLcommand [setdiff] {\MMLcset\setminus}
-
-\def\MMLcset#1{\getXMLstackdata\plustwo#1\getXMLstackdata\plusthree}
-
-\defineXMLcommand [card] {\left\vert\flushXMLstackfrom\plustwo\right\vert}
-\defineXMLcommand [cartesianproduct] {\flushXMLstackwith\plustwo\times}
-
-% sequences and series
-
-\defineXMLcommand [sum] {\MMLcSUMandPRODUCT{sum}\sum}
-\defineXMLcommand [product]{\MMLcSUMandPRODUCT{product}\prod}
-
-\setupMMLappearance[sum] [\c!location=\v!top]
-\setupMMLappearance[product][\c!location=\v!top]
-
-\def\stackMMLsubscripts#1%
- {\vbox
- {\baselineskip\zeropoint % hack, taco vragen
- \halign{$\scriptstyle\hss##\hss$\cr#1\crcr}}}
-
-\def\MMLcSUMandPRODUCT#1#2%
- {\begingroup
- \XMLdoifonstackelse{condition,bvar,lowlimit}
- {\def\MMLcSUMlow
- {_{\XMLdoifonstackelse{condition}
- {\collectXMLnamedstack{condition}{\crcr}%
- \stackMMLsubscripts{\the\XMLRtoks}}
- {\XMLdoifonstackelse{bvar}
- {\XMLfirstnamed{bvar}%
- \XMLdoifonstackelse{lowlimit}{=}{}}%
- {}%
- \XMLfirstnamed{lowlimit}}}}}
- {\let\MMLcSUMlow\empty}%
- \XMLdoifonstackelse{uplimit}
- {\def\MMLcSUMup{^{\XMLfirstnamed{uplimit}}}}
- {\let\MMLcSUMup\empty}%
- \XMLdoifonstackelse{interval} % open math converter gives this
- {\begingroup
- \directsetup{mmc:interval:fetch}%
- \XMLfirstnamed{interval}%
- \endgroup
- \ifx\MMCintervalfrom\empty\else
- \def\MMLcSUMlow{_{\XMLdoifonstackelse{bvar}{\XMLfirstnamed{bvar}{=}}{}\MMCintervalfrom}}%
- \fi
- \ifx\MMCintervalto\empty \else
- \def\MMLcSUMup{^{\MMCintervalto}}%
- \fi}
- {}%
- \MMLcreset#2\doMMLlimits{#1}\MMLcSUMup\MMLcSUMlow
- \directsetup{mmc:lambda:simple}% a bit of open math conversion mess
- \MMLcreset\XMLfirstnamed{apply,lambda,ci}%
- \endgroup}
-
-\defineXMLcommand [limit] {\directsetup{mmc:limit}}
-
-\setupMMLappearance[limit][\c!location=\v!top]
-
-\startsetups mmc:limit
- \MMLcreset \lim
- \doMMLlimits{limit}_{
- \MMLcreset
- \XMLdoifonstackelse {condition} {
- \XMLfirstnamed{condition}
- } {
- \XMLdoifonstackelse {bvar} {
- \XMLfirstnamed{bvar}\rightarrow
- } {
- }
- \XMLfirstnamed{lowlimit}
- }
- }
- \begingroup
- \MMLcreset
- \directsetup{mmc:lambda:simple}% a bit of open math conversion mess
- \XMLfirstnamed{apply,lambda}% lambda needed for openmath
- \endgroup
-\stopsetups
-
-\defineXMLcommand [tendsto] [type=default] {\directsetup{mmc:tendsto}}
-
-\startsetups mmc:tendsto
- \MMLcreset \getXMLstackdata\plustwo
- \processaction
- [\XMLpar{tendsto}{type}{default}]
- [ above=>\downarrow,
- below=>\uparrow,
- unknown=>\rightarrow]
- \MMLcreset \getXMLstackdata\plusthree
-\stopsetups
-
-% elementary classical functions
-
-\defineXMLcommand [exp] {\directsetup{mmc:exp}}
-\defineXMLcommand [ln] {\directsetup{mmc:function}}
-\defineXMLcommand [log] {\directsetup{mmc:log}}
-\defineXMLignore [logbase]
-
-\setupMMLappearance[log][\c!location=\v!right]
-
-\startsetups mmc:exp
- \getXMLentity{exponentiale}^{\XMLfirstnamed{apply,reln,ci,cn}}
-\stopsetups
-
-\startsetups mmc:log
- \XMLdoifonstackelse {logbase} {
- \doifelse\@@MMLloglocation\v!left {
- \mathop{{}^{{\defineXMLprocess[logbase]\XMLfirstnamed{logbase}}}
- \getXMLentity{NegThinSpace}
- \getXMLentity{log}}
- } {
- \getXMLentity{log}_{{\defineXMLprocess[logbase]\XMLfirstnamed{logbase}}}
- }
- } {
- \getXMLentity{log}
- }
- \MMLcreset
- % mmc:function:argument assumes that the apply is second in the row (*1*)
- % \removeXMLdatafromstack{logbase}
- \directsetup{mmc:function:argument}
-\stopsetups
-
-% statistics
-
-\defineXMLcommand [mean] {\overline{\getXMLstackdata\plustwo}}
-\defineXMLcommand [sdev] {\sigma(\MMLcreset\getXMLstackdata\plustwo)}
-\defineXMLcommand [variance] {\sigma(\MMLcreset\getXMLstackdata\plustwo)^2}
-\defineXMLcommand [median] {\getXMLentity{median}(\MMLcreset\getXMLstackdata\plustwo)}
-\defineXMLcommand [mode] {\getXMLentity{mode}(\MMLcreset\getXMLstackdata\plustwo)}
-
-% moments
-
-\defineXMLcommand [moment] {\directsetup{mmc:moment}}
-\defineXMLprocess [momentabout]
-
-\startsetups mmc:moment
- \left\langle\XMLfirstnamed{apply,reln,ci,cn}^{\XMLfirstnamed{degree}}\right\rangle
- \XMLdoifonstackelse{momentabout} {
- _{\XMLfirstnamed{momentabout}}
- } {
- }
-\stopsetups
-
-% linear algebra
-
-\defineXMLcommand [vector] {\directsetup{mmc:vector}} % sequence
-
-\setupMMLappearance [vector] [\c!direction=\v!horizontal,\c!separator={,}]
-
-\defineXMLnested
- [vector]
- {\directsetup{mmc:vector:start}}
- {\directsetup{mmc:vector:stop}}
-
-\startsetups mmc:vector:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:vector:stop
- \stopsavingXMLelements
- \ifnum\XMLstacklevel>\plusone
- \doifelse\@@MMLvectordirection\v!horizontal {
- \left(\flushXMLstackwith\plusone{\MMLseparator\@@MMLvectorseparator}\right)
- } {
- \collectXMLstack\crcr
- \MMLcreset\left(\matrix{\the\XMLRtoks}\right)
- }
- \else
- \overrightarrow{\charhtstrut\getXMLstackdata\plusone}
- \fi
- \endgroup
-\stopsetups
-
-\defineXMLnestedenvironmentsave [matrix] {} {\directsetup{mmc:matrix}}
-\defineXMLnestedenvironmentsave [matrixrow] {} {\directsetup{mmc:matrixrow}}
-
-\unexpanded\def\@col@amp@{&}
-
-\settrue\MMCdelmatrix %( ) when true
-
-\startsetups mmc:matrix
- \begingroup
- \MMLcreset
- \defineXMLnestedenvironmentsave [matrixrow] {} {\directsetup{mmc:matrixrow:do}}
- \ifconditional\MMCdelmatrix
- \left(\matrix{\XMLflush{matrix}}\right)
- \else
- \settrue\MMCdelmatrix
- \matrix{\XMLflush{matrix}}
- \fi
- \endgroup
-\stopsetups
-
-\startsetups mmc:matrixrow
- \begingroup
- \MMLcreset
- \left(\matrix{\directsetup{mmc:matrixrow:do}}\right)
- \endgroup
-\stopsetups
-
-\startsetups mmc:matrixrow:do
- \begingroup
- \startsavingXMLelements
- \XMLflush{matrixrow}
- \stopsavingXMLelements
- \collectXMLstackrows\plusone\@col@amp@
- \edef\ascii{\the\XMLRtoks}
- \edef\ascii{\ascii}
- \expandafter\endgroup\ascii\crcr
-\stopsetups
-
-\defineXMLcommand [determinant] {\directsetup{mmc:determinant}}
-\defineXMLcommand [transpose] {\directsetup{mmc:transpose}}
-\defineXMLcommand [selector] {\directsetup{mmc:selector}}
-
-\startsetups mmc:determinant
- \begingroup
- \left|
- \setfalse\MMCdelmatrix
- \getXMLstackdata\plustwo
- \right|
- \endgroup
-\stopsetups
-
-\startsetups mmc:transpose
-% \getXMLstackdata\plustwo^{\MMLrm T}
- \getXMLstackdata\plustwo^{\mfunction{T}}
-\stopsetups
-
-\startsetups mmc:selector
- \MMLmathinner{\getXMLstackdata\plustwo}_{\MMLcreset\flushXMLstackwith\plusthree{\MMLseparator,}}
-\stopsetups
-
-\defineXMLcommand [vectorproduct] {\getXMLstackdata\plustwo\getXMLentity{vectorproduct}\getXMLstackdata\plusthree}
-\defineXMLcommand [scalarproduct] {\getXMLstackdata\plustwo\getXMLentity{scalarproduct}\getXMLstackdata\plusthree}
-\defineXMLcommand [outerproduct] {\getXMLstackdata\plustwo\getXMLentity {outerproduct}\getXMLstackdata\plusthree}
-
-% semantic mapping elements
-
-\defineXMLnested
- [semantics]
- {\directsetup{mmc:semantics:start}}
- {\directsetup{mmc:semantics:stop}}
-
-\startsetups mmc:semantics:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:semantics:stop
- \stopsavingXMLelements
- \XMLdoifonstackelse {annotation} {
- \flushXMLnamedstackwith\plusone{annotation}\empty
- } {
- \flushXMLnamedstackwith\plusone{apply}\empty
- }
- \endgroup
-\stopsetups
-
-\defineXMLenvironmentsave
- [annotation]
- [encoding=]
- {}
- {\directsetup{mmc:annotation}}
-
-\startsetups mmc:annotation
- \expanded{\doifinset{\XMLpar{annotation}{encoding}{}}{TeX,tex,TEX,ConTeXt,context,CONTEXT}} {
- \XMLtexdata{annotation}
- }
-\stopsetups
-
-\defineXMLignore [annotation-xml]
-
-% misc
-
-\defineXMLcommand [integers] {\getXMLentity{integers}}
-\defineXMLcommand [reals] {\getXMLentity{reals}}
-\defineXMLcommand [rationals] {\getXMLentity{rationals}}
-\defineXMLcommand [naturalnumbers] {\getXMLentity{naturalnumbers}}
-\defineXMLcommand [complexes] {\getXMLentity{complexes}}
-\defineXMLcommand [primes] {\getXMLentity{primes}}
-\defineXMLcommand [exponentiale] {\getXMLentity{ExponentialE}}
-\defineXMLcommand [imaginaryi] {\getXMLentity{ImaginaryI}}
-\defineXMLcommand [notanumber] {\mathop{\mfunction{NaN}}}
-\defineXMLcommand [true] {\mathop{\mfunction{true}}}
-\defineXMLcommand [false] {\mathop{\mfunction{false}}}
-\defineXMLcommand [emptyset] {\mathop{\O}}
-\defineXMLcommand [pi] {\pi}
-\defineXMLcommand [eulergamma] {\gamma}
-\defineXMLcommand [infinity] {\infty}
-
-% gonio functions
-
-\defineXMLcommand[sin] {\directsetup{mmc:function}} \defineXMLcommand[arcsin] {\directsetup{mmc:function}}
-\defineXMLcommand[sinh]{\directsetup{mmc:function}} \defineXMLcommand[arcsinh]{\directsetup{mmc:function}}
-\defineXMLcommand[cos] {\directsetup{mmc:function}} \defineXMLcommand[arccos] {\directsetup{mmc:function}}
-\defineXMLcommand[cosh]{\directsetup{mmc:function}} \defineXMLcommand[arccosh]{\directsetup{mmc:function}}
-\defineXMLcommand[tan] {\directsetup{mmc:function}} \defineXMLcommand[arctan] {\directsetup{mmc:function}}
-\defineXMLcommand[tanh]{\directsetup{mmc:function}} \defineXMLcommand[arctanh]{\directsetup{mmc:function}}
-\defineXMLcommand[cot] {\directsetup{mmc:function}} \defineXMLcommand[arccot] {\directsetup{mmc:function}}
-\defineXMLcommand[coth]{\directsetup{mmc:function}} \defineXMLcommand[arccoth]{\directsetup{mmc:function}}
-\defineXMLcommand[csc] {\directsetup{mmc:function}} \defineXMLcommand[arccsc] {\directsetup{mmc:function}}
-\defineXMLcommand[csch]{\directsetup{mmc:function}} \defineXMLcommand[arccsch]{\directsetup{mmc:function}}
-\defineXMLcommand[sec] {\directsetup{mmc:function}} \defineXMLcommand[arcsec] {\directsetup{mmc:function}}
-\defineXMLcommand[sech]{\directsetup{mmc:function}} \defineXMLcommand[arcsech]{\directsetup{mmc:function}}
-
-\setupMMLappearance[function][\c!reduction=\v!yes]
-
-\startsetups mmc:function
- \getXMLentity\currentXMLelement
- \ifx\MMLpowerelement\empty\else
- ^{\MMLcreset\MMLpowerelement\empty}
- \getXMLentity{NegThinSpace}
- \global\let\MMLpowerelement\empty
- \fi
- \doif {\getXMLstackname\plusone} {\currentXMLelement} {
- % rather fuzzy test; looks like an apply case
- \directsetup{mmc:function:argument}
- }
-\stopsetups
-
-\startsetups mmc:function:argument
- \doifelse\@@MMLfunctionreduction\v!yes {
- % \doifelse {\getXMLstackname\plustwo} {apply} {
- % \doifelseMMCfunctioninapply \plustwo \MMLcfunctionlist \donefalse \donetrue
- %
- % best is to grab the apply (independent of order), (*1*), so:
- %
- \XMLdoifonstackelse {apply} {
- \doifelseMMCfunctioninapply \XMLstackposition {\MMLcfunctionlist,divide} \donefalse \donetrue
- } {
- \donefalse
- }
- } {
- \donetrue
- }
- % beware, we still flush from 2 up
- \ifdone
- \left(\MMLcreset\flushXMLstackfrom\plustwo\right)
- \else
- \MMLcreset\flushXMLstackfrom\plustwo
- \fi
-\stopsetups
-
-% presentation mml
-
-\def\resetMMLseparator
- {\newcounter\MMLxxcounter
- \let\lastMMLseparator\empty}
-
-\def\grabMMLseparator#1%
- {\increment\MMLxxcounter
- \newcounter\MMLyycounter
- \expanded{\dograbMMLseparator#1\noexpand\relax}}
-
-\def\dograbMMLseparator
- {\increment\MMLyycounter
- \doifnextcharelse\relax
- {\lastMMLseparator\gobbleoneargument}
- {\doifnextcharelse\xmlrent\grabMMLseparatora\grabMMLseparatorb}}
-
-\def\grabMMLseparatora#1\xmlrent#2%
- {\ifnum\MMLxxcounter=\MMLyycounter\space
- \def\lastMMLseparator{\xmlrent{#2}}%
- \fi
- \dograbMMLseparator}
-
-\def\grabMMLseparatorb#1%
- {\ifnum\MMLxxcounter=\MMLyycounter\space
- \doifXMLentityelse{#1}
- {\def\lastMMLseparator{\xmlrent{#1}}}
- {\def\lastMMLseparator{#1}}%
- \fi
- \dograbMMLseparator}
-
-%
-
-\defineXMLargument [mi] \MMLpMI
-\defineXMLargument [mn] \MMLpMN
-\defineXMLargument [mo] \MMLpMO
-
-\def\MMLpMI#1%
- {\begingroup
- \setMMLpmathstyle{mstyle}%
- #1%
- \endgroup}
-
-% \def\MMLpMN#1%
-% {\begingroup
-% \MMLrm
-% \setMMLpmathstyle{mstyle}%
-% #1%
-% \endgroup}
-
-\def\MMLpMN#1%
- {\mfunction{\setMMLpmathstyle{mstyle}#1}}
-
-\def\MMLpMO#1% yes or no
- {\flattenXMLcontent{#1}%
- \doifXMLentityelse\flattenedXMLcontent
- {\getXMLentity\flattenedXMLcontent}
- {\ConvertConstantAfter\doifinstringelse{\xmlrent}{#1} % TODO ! ! ! ! ! ! ! !
- {#1}
- {\hbox
- {\setMMLpmathstyle{mstyle}%
- \ignorespaces#1\unskip}}}}
-
-% we need to get rid of spaces: <mo> &RightArrow; </mo>
-
-\def\MMLpMO#1% yes or no
- {\flattenXMLcontent{#1}%
- \doifXMLentityelse\flattenedXMLcontent
- {\getXMLentity\flattenedXMLcontent}
- {\ignorespaces#1\removeunwantedspaces}}
-
-\let\normalright=\right
-\let\normalleft =\left
-
-\def\doMMLleft #1{\pushmacro\left \let\left \empty\normalleft #1\popmacro\left}
-\def\doMMLright#1{\pushmacro\right\let\right\empty\normalright#1\popmacro\right}
-
-\let\MMLpopen \empty
-\let\MMLpclose\empty
-
-\defineXMLnested [mfenced] [open=(,close=),separators=]
- {\directsetup{mmp:mfenced:start}}
- {\directsetup{mmp:mfenced:stop}}
-
-\startsetups mmp:mfenced:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmp:mfenced:stop
- \stopsavingXMLelements
- \edef\MMLpopen {\XMLpar{mfenced}{open} {}}
- \edef\MMLpclose{\XMLpar{mfenced}{close}{}}
- \ifx\MMLpopen \space\let\MMLpopen \empty\fi
- \ifx\MMLpclose\space\let\MMLpclose\empty\fi
- \ifx\MMLpopen\empty
- \ifx\MMLpclose\empty
- \else
- \doMMLleft.
- \fi
- \else
- \doMMLleft\MMLpopen
- \fi
- \pushmacro\MMLpopen
- \pushmacro\MMLpclose
- \doifelsenothing{\XMLpar{mfenced}{separators}{}} {
- \flushXMLstackfrom\plusone
- } {
- \resetMMLseparator
- \flushXMLstackwith\plusone {
- \begingroup
- \let\myspecialnormalvert\myspecialstretchvert
- \grabMMLseparator{\XMLpar{mfenced}{separators}{}}
- \endgroup
- }
- }
- \popmacro\MMLpclose
- \popmacro\MMLpopen
- \ifx\MMLpclose\empty
- \ifx\MMLpopen\empty
- \else
- \doMMLright.
- \fi
- \else
- \doMMLright\MMLpclose
- \fi
- \endgroup
-\stopsetups
-
-% \startbuffer
-% <math><mfenced separators="" open="(" close=")"><mi>x</mi></mfenced></math>
-% <math><mfenced separators="" open="" close=")"><mi>x</mi></mfenced></math>
-% <math><mfenced separators="" open="(" close="" ><mi>x</mi></mfenced></math>
-% <math><mfenced separators="" open="" close="" ><mi>x</mi></mfenced></math>
-% <math><mfenced separators="" open="" close=" "><mi>x</mi></mfenced></math>
-% \stopbuffer
-%
-% \processXMLbuffer
-
-\defineXMLnestedenvironmentsave [menclose] [notation=]
- {\directsetup{mmp:menclose:start}}
- {\directsetup{mmp:menclose:stop}}
-
-\startsetups mmp:menclose:start
- \begingroup
-\stopsetups
-
-\startsetups mmp:menclose:stop
- \doifelse{\XMLpar{menclose}{notation}{}}{longdiv} {
- \overline{)\XMLflush{menclose}}
- } {
- \XMLflush{menclose}
- }
- \endgroup
-\stopsetups
-
-\defineXMLnested [mfrac] [linethickness=]
- {\directsetup{mmp:mfrac:start}}
- {\directsetup{mmp:mfrac:stop}}
-
-\startsetups mmp:mfrac:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmp:mfrac:stop
- \stopsavingXMLelements
- \doifXMLparelse{mfrac}{linethickness} {
- \edef\theXMLpar{\XMLpar{mfrac}{linethickness}{1}}
- \processaction
- [\theXMLpar]
- [ thin=>\scratchdimen=.2pt,
- medium=>\scratchdimen=.4pt,
- thick=>\scratchdimen=.8pt,
- unknown=>\setdimensionwithunit\scratchdimen{\theXMLpar}{}]
- {{\getXMLstackdata\plusone}\above\scratchdimen{\getXMLstackdata\plustwo}}
- } {
- \frac{\getXMLstackdata\plusone}{\getXMLstackdata\plustwo}
- }
- \endgroup
-\stopsetups
-
-\defineXMLargument
- [ms]
- [lquote=\xmlrent{quot},
- rquote=\xmlrent{quot},
- fontweight=,
- fontstyle=,
- mathstyle=,
- mathvariant=,
- background=,
- color=]
- {\MMLpSTRING}
-
-\def\MMLpSTRING#1%
- {\hbox
- {\tf % else encoding problems
- \MMLpTEXT{\XMLpar{ms}{lquote}{}%
- \doMMPpbackground{ms}{\doMMPpcolor{ms}{\setMMLptextstyle{ms}\ignorespaces#1\removeunwantedspaces}}%
- \XMLpar{ms}{rquote}{}}}}
-
-\defineXMLenvironment
- [mstyle]
- [fontweight=,
- fontstyle=,
- mathstyle=,
- mathvariant=,
- background=,
- color=]
- {\begingroup}
- {\endgroup}
-
-\defineXMLargument [mtext] [CPA] \MMLpTEXT
-\defineXMLargument [merror] [CPA] \MMLpERROR
-\defineXMLargument [mphantom] [CPA] \MMLpPHANTOM
-\defineXMLargument [mpadded] [CPA] \MMLpPADDED
-
-\mapXMLvalue{mmp}{normal} {\tf} \mapXMLvalue{mmp}{double-stuck} {\bf}
-\mapXMLvalue{mmp}{bolditalic} {\bi} \mapXMLvalue{mmp}{bold-italic} {\bi}
-\mapXMLvalue{mmp}{boldslanted}{\bs} \mapXMLvalue{mmp}{bold-slanted} {\bs}
-\mapXMLvalue{mmp}{boldnormal} {\bf} \mapXMLvalue{mmp}{bold} {\bf}
-\mapXMLvalue{mmp}{slanted} {\sl} \mapXMLvalue{mmp}{normalslanted}{\sl}
-\mapXMLvalue{mmp}{italic} {\it} \mapXMLvalue{mmp}{normalitalic} {\it}
-\mapXMLvalue{mmp}{fraktur} {\bf} \mapXMLvalue{mmp}{bold-fraktur} {\bf}
-\mapXMLvalue{mmp}{script} {\tf} \mapXMLvalue{mmp}{bold-script} {\bf}
-
-% and all kind of other crappy names
-
-\def\setMMLptextstyle#1%
- {\XMLval{mmp}{\XMLpar{#1}{fontweight}{}\XMLpar{#1}{fontstyle}{}}{}}
-
-\def\setMMLpmathstyle#1%
- {\XMLval{mmp}{\XMLpar{#1}{mathvariant}{}}{}}
-
-\def\doMMPpcolor#1#2%
- {\doifXMLparelse{#1}{color}{\color[\XMLpar{#1}{color}{}]{#2}}{#2}}
-
-\def\doMMPpbackground#1#2%
- {\doifXMLparelse{#1}{background}
- {\inframed
- [\c!frame=\v!off,
- \c!background=\v!color,
- \c!backgroundcolor=\XMLpar{#1}{background}{}]
- {#2}}
- {#2}}
-
-\def\MMLpTEXT#1%
- {\hbox
- {\tf % else encoding problems
- \doMMPpbackground{ms}{\doMMPpcolor{ms}{\setMMLptextstyle{ms}\ignorespaces#1\removeunwantedspaces}}}}
-
-\def\MMLpERROR#1%
- {\hbox{$\displaystyle#1$}}
-
-\def\MMLpPHANTOM#1%
- {\phantom{\ignorespaces{}#1\unskip}} % watch spacing {} hack
-
-\def\MMLpPADDED#1%
- {#1}
-
-% mrow
-
-\defineXMLenvironment [mrow] {\resetMMLbounds} {\finishMMLbounds}
-
-% \def\MMLleft #1{\increment\MMLboundslevel\left #1}
-% \def\MMLright#1{\right#1\decrement\MMLboundslevel}
-
-% \def\resetMMLbounds
-% {\let\MMLboundslevel\!!plusone\left.}
-
-% \def\finishMMLbounds
-% {\dorecurse\MMLboundslevel{\right.}}
-
-\def\resetMMLbounds
- {\pushmacro\MMLboundslevel
- \newcounter\MMLboundslevel}
-
-\def\MMLleft #1%
- {\increment\MMLboundslevel
- \normalleft#1}
-
-\def\MMLright#1%
- {\ifnum\MMLboundslevel=0 \normalleft.\!\fi
- \normalright#1%
- \decrement\MMLboundslevel}
-
-\def\finishMMLbounds
- {\ifnum\MMLboundslevel>0
- \normalright.\!%
- \decrement\MMLboundslevel
- \expandafter\finishMMLbounds
- \else
- \popmacro\MMLboundslevel
- \fi}
-
-\defineXMLnested [msqrt] {\directsetup{mmp:msqrt:start}} {\directsetup{mmp:msqrt:stop}}
-\defineXMLnested [mroot] {\directsetup{mmp:mroot:start}} {\directsetup{mmp:mroot:stop}}
-
-\startsetups mmp:msqrt:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmp:msqrt:stop
- \stopsavingXMLelements
- \sqrt{\flushXMLstackfrom\plusone}
- \endgroup
-\stopsetups
-
-\startsetups mmp:mroot:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmp:mroot:stop
- \stopsavingXMLelements
- \root{\getXMLstackdata\plustwo}\of{\getXMLstackdata\plusone}
- \endgroup
-\stopsetups
-
-\setupMMLappearance[scripts][\c!alternative=\v!a]
-
-\defineXMLnested [msub] {\directsetup{mmp:msub:start}} {\directsetup{mmp:msub:stop}}
-\defineXMLnested [msup] {\directsetup{mmp:msup:start}} {\directsetup{mmp:msup:stop}}
-\defineXMLnested [msubsup] {\directsetup{mmp:msbp:start}} {\directsetup{mmp:msbp:stop}}
-
-\startsetups mmp:msub:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmp:msub:stop
- \stopsavingXMLelements
- \doifelse\@@MMLscriptsalternative\v!a {
- {\getXMLstackdata\plusone}_{\getXMLstackdata\plustwo}
- } {
- \getXMLstackdata\plusone_{\getXMLstackdata\plustwo}
- }
- \endgroup
-\stopsetups
-
-\startsetups mmp:msup:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmp:msup:stop
- \stopsavingXMLelements
- \doifelse\@@MMLscriptsalternative\v!a {
- {\getXMLstackdata\plusone}^{\getXMLstackdata\plustwo}
- } {
- \getXMLstackdata\plusone^{\getXMLstackdata\plustwo}
- }
- \endgroup
-\stopsetups
-
-\startsetups mmp:msbp:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmp:msbp:stop
- \stopsavingXMLelements
- \getXMLstackdata\plusone_{\getXMLstackdata\plustwo}^{\getXMLstackdata\plusthree}
- \endgroup
-\stopsetups
-
-\defineXMLnested [mover] {\directsetup{mmp:mover:start}} {\directsetup{mmp:mover:stop}}
-\defineXMLnested [munder] {\directsetup{mmp:munder:start}} {\directsetup{mmp:munder:stop}}
-\defineXMLnested [munderover] {\directsetup{mmp:munderover:start}} {\directsetup{mmp:munderover:stop}}
-
-\startsetups mmp:mover:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmp:mover:stop
- \stopsavingXMLelements
- \mathop{\vbox{\m@th\ialign{\hss##\hss\crcr\noalign{\kern3\p@}%
- \disabledelimiter\doMMLfiller{\getXMLstackdata\plustwo}
- \crcr\noalign{\kern3\p@\nointerlineskip}%
- \disabledelimiter\doMMLfiller{\getXMLstackdata\plusone}
- \crcr}}}
- \limits
- \endgroup
-\stopsetups
-
-\startsetups mmp:munder:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmp:munder:stop
- \stopsavingXMLelements
- \mathop{\vtop{\m@th\ialign{\hss##\hss\crcr
- \disabledelimiter\doMMLfiller{\getXMLstackdata\plusone}
- \crcr\noalign{\kern3\p@\nointerlineskip}%
- \disabledelimiter\doMMLfiller{\getXMLstackdata\plustwo}
- \crcr\noalign{\kern3\p@}}}}
- \limits
- \endgroup
-\stopsetups
-
-\startsetups mmp:munderover:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmp:munderover:stop
- \stopsavingXMLelements
- \getXMLstackdata\plusone
- _{\disablefiller\disabledelimiter\getXMLstackdata\plustwo}
- ^{\disablefiller\disabledelimiter\getXMLstackdata\plusthree}
- \endgroup
-\stopsetups
-
-\def\doMMLfiller#1% bugged
- {\pushmacro\doMMLfiller
- \let\doMMLfiller\gobbleoneargument
- \gdef\dodoMMLfiller{\disablefiller\mathematics{#1}}%
- \hbox
- {\def\normalorfiller##1##2%
- {\gdef\dodoMMLfiller{\enablefiller#1}%
- \let\normalorfiller\gobbletwoarguments}%
- $#1$}%
- \popmacro\doMMLfiller
- \dodoMMLfiller}
-
-% tables
-
-% obsolete: \setupMMLappearance[mtable][\c!alternative=\v!a]
-
-\mapXMLvalue {mmp:mtable} {align:left} {right}
-\mapXMLvalue {mmp:mtable} {align:right} {left}
-\mapXMLvalue {mmp:mtable} {align:center} {middle}
-
-\mapXMLvalue {mmp:mtable} {frame:none} {off}
-\mapXMLvalue {mmp:mtable} {frame:solid} {on}
-\mapXMLvalue {mmp:mtable} {frame:on} {on}
-
-\defineXMLnested
- [mtable]
- [columnalign=,
- columnspacing=.25ex,
- rowspacing=.25ex,
- frame=,
- color=,
- background=]
- {\directsetup{mmp:mtable:start}}
- {\directsetup{mmp:mtable:stop}}
-
-\defineXMLnestedargument
- [mtr]
- {\MMPmtableHANDLEtr}
-
-\defineXMLnestedargument
- [mlabeledtr]
- {\MMPmtableHANDLEtr}
-
-\defineXMLnestedargument
- [mtd]
- [columnalign=,
- columnspacing=.25ex,
- rowspacing=.25ex,
- frame=,
- color=,
- background=]
- {\MMPmtableHANDLEtd}
-
-\startsetups mmp:mtable:start
- \vcenter \bgroup
- \MMLpTABLEsplitter{background} \c!backgroundcolor
- \MMLpTABLEsplitter{color} \c!color
- \MMLpTABLEmapper {frame} \c!frame
- \MMLpTABLEmapper {columnalign}\c!align
- \setMMLpunit{\XMLpar{mtable}{rowspacing}\empty}{.25ex}
- \let\MMLpTABLEoffset\MMLpunit
- \bTABLE[\c!frame=\v!off,\c!background=\v!color,\c!offset=\MMLpTABLEoffset]
-\stopsetups
-
-\startsetups mmp:mtable:stop
- \eTABLE
- \egroup
-\stopsetups
-
-\long\def\MMPmtableHANDLEtr#1{%
- \bTR\ignorespaces#1\removeunwantedspaces\eTR
-}
-
-\long\def\MMPmtableHANDLEtd#1{%
- \let\theMMLpTABLEmap\empty
- \MMLpTABLEmap{background} \c!backgroundcolor
- \MMLpTABLEmap{color} \c!color
- \MMLpTABLEmap{frame} \c!frame
- \MMLpTABLEmap{columnalign}\c!align
- \expanded{\bTD[\theMMLpTABLEmap]}%
- $\ignorespaces#1\removeunwantedspaces$\eTD
-}
-
-\def\MMLpTABLEmapper#1#2%
- {\doifXMLparelse{mtable}{#1}
- {\newcounter\MMLcounter
- \def\docommand##1%
- {\increment\MMLcounter
- \expanded{\setupTABLE[column][\MMLcounter][#2=\XMLval{mmp:mtable}{#2:##1}\empty]}}%
- \expanded{\processseparatedlist[\XMLpar{mtable}{#1}\empty]}[ ]\docommand}
- {}}
-
-\def\MMLpTABLEsplitter#1#2%
- {\doifXMLparelse{mtable}{#1}
- {\newcounter\MMLcounter
- \def\docommand##1%
- {\increment\MMLcounter
- \expanded{\setupTABLE[column][\MMLcounter][#2=##1]}}%
- \expanded{\processseparatedlist[\XMLpar{mtable}{#1}\empty]}[ ]\docommand}
- {}}
-
-\def\MMLpTABLEmap#1#2%
- {\doifXMLparelse{mtd}{#1}
- {\edef\theMMLpTABLEmap{#2=\XMLval{mmp:mtable}{#2:\XMLpar{mtd}{#1}\empty}\empty,\theMMLpTABLEmap}}
- {}}
-
-\defineXMLsingular [mspace] [width=.5em] {\directsetup{mmp:mspace}}
-
-\startsetups mmp:mspace
- \setMMLpunit{\XMLpar{mspace}{width}{}}{.5em}
- \hskip\MMLpunit\relax
-\stopsetups
-
-\def\setMMLpunit#1#2% i've forgotten what this means
- {\setbox\scratchbox=\hbox
- {\edef\ascii{#1}%
- \@EA\aftersplitstring\ascii\at.\to\ascii
- \scratchcounter=\ifx\ascii\empty#1\else\ascii\fi
- \unskip\unskip}%
- \ifdim\wd\scratchbox=\zeropoint
- \edef\MMLpunit{#1em}%
- \else
- \edefconvertedargument\ascii{#1}%
- \convertasciiafter\doifinstringelse{em}{\ascii}{\edef\MMLpunit{#1}}{%
- \convertasciiafter\doifinstringelse{ex}{\ascii}{\edef\MMLpunit{#1}}{%
- \convertasciiafter\doifinstringelse{pt}{\ascii}{\edef\MMLpunit{#1}}{%
- \edef\MMLpunit{#2}}}}%
- \fi}
-
-% end of tables
-
-\def\setMMLpunit#1#2%
- {\setbox\scratchbox=\hbox
- {\edef\ascii{#1}%
- \@EA\aftersplitstring\ascii\at.\to\ascii
- \scratchcounter=\ifx\ascii\empty#1\else\ascii\fi
- \unskip\unskip}%
- \ifdim\wd\scratchbox=\zeropoint
- \edef\MMLpunit{#1em}%
- \else
- \edefconvertedargument\ascii{#1}%
- \convertasciiafter\doifinstringelse{em}{\ascii}{\edef\MMLpunit{#1}}{%
- \convertasciiafter\doifinstringelse{ex}{\ascii}{\edef\MMLpunit{#1}}{%
- \convertasciiafter\doifinstringelse{pt}{\ascii}{\edef\MMLpunit{#1}}{%
- \edef\MMLpunit{#2}}}}%
- \fi}
-
-\defineXMLsingular [mspace] [width=.5em] {\directsetup{mmp:mspace}}
-
-\startsetups mmp:mspace
- \setMMLpunit{\XMLpar{mspace}{width}{}}{.5em}
- \hskip\MMLpunit
-\stopsetups
-
-\defineXMLsingular [mglyph] [fontfamily=,index=1,alt=] {\directsetup{mmp:mglyph}}
-
-\startsetups mmp:mglyph
- \def\MMLpglyph{\XMLpar{mglyph}{fontfamily}{}}%
- \doifelsenothing{\MMLpglyph} {
- \hbox{\tttf[fontfamily unspecified]}
- } {
- \doifdefinedelse{\MMLpglyph} {
- \hbox{\getvalue{\MMLpglyph}\char0\XMLpar{mglyph}{index}{1}}
- } {
- \doifelsenothing{\XMLpar{mglyph}{alt}{}} {
- \hbox{\tttf[unknown fontfamily \XMLpar{mglyph}{fontfamily}{}]}
- } {
- \hbox{\tttf\XMLpar{mglyph}{alt}{}}
- }
- }
- }
-\stopsetups
-
-\defineXMLsingular [malignmark] {}
-\defineXMLsingular [none] {}
-\defineXMLsingular [mprescripts] {}
-
-\defineXMLnested
- [mmultiscripts]
- {\setups{mmp:mmultiscripts:start}}
- {\setups{mmp:mmultiscripts:stop}}
-
-\startsetups mmp:mmultiscripts:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmp:mmultiscripts:stop
- \stopsavingXMLelements
- \donefalse
- \scratchcounter\zerocount
- \dorecurse\XMLstacklevel {
- % watch the extra {}'s
- \ifdone
- \ifodd\scratchcounter
- _{\getXMLstackdata\recurselevel}
- \else
- ^{\getXMLstackdata\recurselevel}{}
- \fi
- \else
- \doif{\getXMLstackname\recurselevel}{mprescripts}{\donetrue{}}
- \fi
- \ifdone \advance\scratchcounter\plusone \fi
-
- }
- \donetrue
- \scratchcounter\zerocount
- \dorecurse\XMLstacklevel {
- \ifdone
- % watch the extra {}'s
- \ifcase\scratchcounter
- \getXMLstackdata\recurselevel
- \else\ifodd\scratchcounter
- _{\getXMLstackdata\recurselevel}
- \else
- ^{\getXMLstackdata\recurselevel}{}
- \fi\fi
- \fi
- \doif{\getXMLstackname\recurselevel}{mprescripts}{\donefalse}
- \ifdone \advance\scratchcounter\plusone \fi
- }
- \endgroup
-\stopsetups
-
-% experimental patches
-
-\startmoduletestsection
-
-\let\MMLdoL\donothing
-\let\MMLdoR\donothing
-
-\startsetups mmc:apply:start
- \begingroup
- \startsavingXMLelements
-\stopsetups
-
-\startsetups mmc:apply:stop
- \stopsavingXMLelements
- \MMLmathinner {
- \expanded{\doifinsetelse{\getXMLstackname\plusone}{\MMLcmainresetlist,\MMLctempresetlist}}
- \MMLcreset
- \donothing
- \ifcase\MMLapplydepth \else
- \doifXMLparelse{apply}{open} \donothing{\getXMLarguments{apply}{open="("}}% slow
- \doifXMLparelse{apply}{close}\donothing{\getXMLarguments{apply}{close=")"}}% slow
- \fi
- \advance\MMLapplydepth\plusone
- \begingroup
- \doifXMLparelse{apply}{open} % now inside the group
- {\edef\MMLdoL{\noexpand\left \XMLpar{apply}{open} {(}}
- \edef\MMLdoR{\noexpand\right\XMLpar{apply}{close}{)}}}
- {\let\MMLdoL\donothing
- \let\MMLdoR\donothing}
- \let\MMLctempresetlist\empty
- \doifelse {\getXMLstackname\plusone} {apply} {
- % <apply> <apply> ... </apply> <ci> .. </ci> </apply>
- \doifelseMMCfunctioninapply \plusone {plus,minus} {
-% [a]
- % yet incomplete and rather untested
- % <apply> <apply> <minus/> <tan/> <cos/> </apply> <ci>x</ci> </apply>
- } {
-% [b]
- \MMLcreset
- }
- \MMLdoL
- \getXMLstackdata\plusone
- \ifconditional\somepostponedMMLactions
- \postponedMMLactions
- \else
- \left(\MMLcreset\getXMLstackdata\plustwo\right)
- \fi
- \MMLdoR
- } {
- \doifelse {\getXMLstackname\plusone} {fn} {
-% [c]
- % \MMLdoL/R are to be taken care of in the next setup
- \directsetup{mmc:fn:apply}
- } {
- \doifelse {\getXMLstackname\plusone} {csymbol} {
- % \MMLdoL/R are to be taken care of in the next setup
-% [d]
- \directsetup{mmc:csymbol:apply}
- } {
- \doifelse {\getXMLstackname\plusone} {ci} {
-% [e]
- % \MMLdoL/R are to be taken care of in the next setup
- \directsetup{mmc:ci:apply}
- } {
-% [f]
- \MMLdoL
- \getXMLstackdata\plusone
- \MMLdoR
- }
- }
- }
- }
- \endgroup
- \advance\MMLapplydepth\minusone
- \directsetup{apply:flush}
- }
- \endgroup
-\stopsetups
-
-\startsetups mmc:fn:apply
- \begingroup
- \startsavingXMLelements
- \rawXMLstacktext\plusone % still on stack, no check, just fn content
- \stopsavingXMLelements
- \doifelse {\getXMLstackname\plusone} {ci} {
- \flattenXMLcontent{\getXMLstackdata\plusone}
- \doifsetupselse{mmc:fn:\flattenedXMLcontent} {
- % \MMLdoL/MMLdoR to be handled in plugin
- \global\defXMLstackdata\XMLfnoperator\plusone
- \expanded{\endgroup\noexpand\directsetup{mmc:fn:\flattenedXMLcontent}}
- } {
- \endgroup
- \MMLcreset
- \MMLdoL
- \getXMLstackdata\plusone
- \ifnum\XMLstacklevel>\plusone
- \getXMLentity{NegThinSpace}
- \left(\MMLcreset\flushXMLstackwith\plustwo{\MMLseparator,}\right)
- \fi
- \MMLdoR
- }
- } {
- \endgroup
- \MMLcreset
- \MMLdoL
- \getXMLstackdata\plusone
- \MMLdoR
- }
-\stopsetups
-
-\startsetups mmc:csymbol:apply
- \begingroup
- \defineXMLsave[csymbol][definitionURL=,encoding=]
- \rawXMLstackdata\plusone % was text % still on stack, no check, just attr test
- % \MMLdoL/MMLdoR to be handled in plugin
- \lowercasestring\XMLpar{csymbol}{definitionURL}{}\to\mmcSymbolURL
- \doifsetupselse{mmc:csymbol:\mmcSymbolURL} {
- \expanded{\endgroup\noexpand\directsetup{mmc:csymbol:\mmcSymbolURL}}
- } {
- \endgroup
- %\XMLval{mmc:cs}{\XMLop{encoding}}{\firstofoneargument}% fails when no content
- \XMLval{mmc:cs}{\XMLop{encoding}}{}
- }
-\stopsetups
-
-\defineXMLsingular
- [csymbol]
- [encoding=text,
- definitionURL=]
- {\directsetup{mmc:csymbol:apply:singular}}
-
-\startsetups mmc:csymbol:apply:singular
- \lowercasestring\XMLpar{csymbol}{definitionURL}{}\to\mmcSymbolURL
- \directsetup{mmc:csymbol:\mmcSymbolURL}
-\stopsetups
-
-\startsetups mmc:ci:apply
- \getXMLstackdata\plusone
- \ifnum\XMLstacklevel>\plusone
- \left(\MMLcreset\flushXMLstackwith\plustwo{\MMLseparator,}\right)
- \fi
-\stopsetups
-
-\def\xflushXMLstackwith#1#2#3#4% num bgroup egroup whatever
- {\dostepwiserecurse{#1}\XMLstacklevel\plusone
- {#2\relax
- \ifnum\recurselevel>#1\relax#4\fi
- \getXMLstackdata\recurselevel
- #3}}
-
-\def\xflushXMLstackfrom#1#2#3%
- {\dostepwiserecurse{#1}\XMLstacklevel\plusone
- {#2\getXMLstackdata\recurselevel#3}}
-
-% <apply><divide/>
-% <apply><minus/>
-% <apply><minus/><ci>b</ci></apply>
-% <apply><minus/><ci>b</ci></apply>
-% <apply><root/> <ci>a</ci></apply>
-% </apply>
-% <apply><minus/>
-% <apply><minus/><ci>b</ci><ci>b</ci></apply>
-% <apply><minus/><ci>b</ci></apply>
-% <apply><root/> <ci>a</ci></apply>
-% </apply>
-% </apply>
-
-\startsetups mmc:minus
- \doif \@@MMLsignreduction \v!yes {
- \setMMLcreset{fn,\MMLcfunctionlist}
- }
- \ifcase\XMLstacklevel
- \or
- % self
- \or
- -\getXMLstackdata\plustwo
- \else
- \dostepwiserecurse\plustwo\XMLstacklevel\plusone {
- \begingroup
- \doifelse {\getXMLstackname\recurselevel} {apply} {
- \ifnum\recurselevel=\plustwo
- \begingroup
- \dodoifelseMMCfunctioninapply \recurselevel {minus} {
- \ifnum\XMLstacklevel>\plustwo
- \endgroup
- \else
- \endgroup
- \MMLcreset
- \fi
- } {
- \endgroup
- }
- \else
- \doifelseMMCfunctioninapply \recurselevel {\MMLcfunctionlist,\MMLcconstructlist} {
- \MMLcreset
- } {
- }
- \fi
- } {
- }
- \getXMLstackdata\recurselevel
- \ifnum\recurselevel<\XMLstacklevel\relax
- -
- \fi
- \endgroup
- }
- \fi
-\stopsetups
-
-\stopmoduletestsection
-
-\stopmodule
-
-\protect \endinput
+\endinput