summaryrefslogtreecommitdiff
path: root/tex/context/base/mkii/xtag-mmp.mkii
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkii/xtag-mmp.mkii')
-rw-r--r--tex/context/base/mkii/xtag-mmp.mkii553
1 files changed, 553 insertions, 0 deletions
diff --git a/tex/context/base/mkii/xtag-mmp.mkii b/tex/context/base/mkii/xtag-mmp.mkii
new file mode 100644
index 000000000..93f0a1504
--- /dev/null
+++ b/tex/context/base/mkii/xtag-mmp.mkii
@@ -0,0 +1,553 @@
+%D \module
+%D [ file=xtag-mmp,
+%D version=2000.12.20,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Presentation MathML,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% \points should become \bodyfontsize
+
+% under reconstruction
+%
+% \starttext
+% \usemodule[mathml] \useXMLfilter[utf]
+% \unprotect
+%
+% \remapXMLsequence [mover] [CPA] \MMLpOVER
+% \remapXMLsequence [munder] [CPA] \MMLpUNDER
+%
+% \def\MMLpUNDER#1#2%
+% {\getXMLarguments{munder}{accent="false" #1}%
+% \withnexttwoXMLRelements\doMMLpUNDER#2}
+%
+% \def\MMLpOVER#1#2%
+% {\getXMLarguments{mover}{accent="false" #1}%
+% \withnexttwoXMLRelements\doMMLpOVER #2}
+%
+% \def\doMMLpUNDER
+% {\doifelse{\XMLpar{munder}{accent}{}}{true}
+% {\secondXMLRelement\firstXMLRelement}
+% {\mathop{\vtop{\mathsurround\zeropoint\ialign{\hss##\hss\crcr
+% \disabledelimiter\doMMLfiller\firstXMLRelement
+% \crcr\noalign{\kern3\points\nointerlineskip}%
+% \disabledelimiter\doMMLfiller\secondXMLRelement
+% \crcr\noalign{\kern3\points}}}}\limits}}
+%
+% \def\doMMLpOVER
+% {\doifelse{\XMLpar{mover}{accent}{}}{true}
+% {\secondXMLRelement\firstXMLRelement}
+% {\mathop{\vbox{\mathsurround\zeropoint\ialign{\hss##\hss\crcr\noalign{\kern3\points}%
+% \disabledelimiter\doMMLfiller\secondXMLRelement
+% \crcr\noalign{\kern3\points\nointerlineskip}%
+% \disabledelimiter\doMMLfiller\firstXMLRelement
+% \crcr}}}\limits}}
+%
+% \protect
+%
+% Normal: \startXMLdata<math><mover ><mi>a</mi><mo>¯</mo></mover></math>\stopXMLdata \par
+% Accent: \startXMLdata<math><mover accent="true"><mi>x</mi><mo>¯</mo></mover></math>\stopXMLdata \par
+%
+% \stoptext
+
+\writestatus{loading}{ConTeXt XML Macros / Presentational MathML}
+
+\unprotect
+
+\def\convertasciiafter#1#2%
+ {\defconvertedargument\asciiafter{#2}%
+ \@EA#1\@EA{\asciiafter}}
+
+\def\checkMMLoperator#1#2% temp hack
+ {\unspaceargument#1\to\ascii
+ \doifXMLentityelse\ascii{\getXMLentity\ascii}{#2}}
+
+\startXMLmapping [mml]
+
+\remapXMLsequence [mi] [CPA] \MMLpMI
+\remapXMLsequence [mn] [CPA] \MMLpMN
+\remapXMLsequence [mo] [CPA] \MMLpMO
+
+\def\MMLpmath#1#2%
+ {\begingroup
+ \getXMLarguments{mstyle}{#1}\setMMLpmathstyle{mstyle}#2%
+ \endgroup}
+
+\def\MMLpMI#1#2%
+ {\MMLpmath{#1}{\checkMMLoperator{#2}{#2}}}
+
+\def\MMLpMN#1#2%
+ {\begingroup\rm\MMLpmath{#1}{#2}\endgroup}
+
+\def\MMLpMO#1#2% yes or no
+ {\checkMMLoperator
+ {#2}
+ {\ConvertConstantAfter\doifinstringelse{\xmlrent}{#2}
+ {#2}{\hbox{\MMLpmath{#1}{\ignorespaces#2\unskip}}}}} % \hbox ?
+
+\remapXMLsequence [mfenced] [CPA] \MMLpFENCED
+
+\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
+
+\def\MMLpFENCED#1#2%
+ {\getXMLarguments{mfenced}{open="(" close=")" separators="" #1}%
+ \edef\MMLpopen {\XMLpar{mfenced}{open}{}}%
+ \edef\MMLpclose{\XMLpar{mfenced}{close}{}}%
+ \ifx\MMLpopen\empty\else\doMMLleft\MMLpopen\fi
+ \pushmacro\MMLpopen
+ \pushmacro\MMLpclose
+ \doifXMLparelse{mfenced}{separators}
+ {\resetMMLseparator
+ \encapsulateXMLR
+ {}%
+ {\pushmacro\myspecialnormalvert % hack
+ \def\myspecialnormalvert{\;\vrule\;}%
+ \grabMMLseparator{\XMLpar{mfenced}{separators}{}}%
+ \popmacro\myspecialnormalvert}
+ {}%
+ {#2\empty}}
+ {#2}%
+ \popmacro\MMLpclose
+ \popmacro\MMLpopen
+ \ifx\MMLpclose\empty
+ \ifx\MMLpopen\empty\else\right.\fi
+ \else\doMMLright\MMLpclose\fi}
+
+\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% better use \checkMMLoperator
+ {\ifnum\MMLxxcounter=\MMLyycounter\space
+\doifXMLentityelse{#1}
+ {\def\lastMMLseparator{\xmlrent{#1}}}
+ {\def\lastMMLseparator{#1}}%
+ \fi
+ \dograbMMLseparator}
+
+\remapXMLsequence [menclose] [CPA] \MMLpENCLOSE
+
+\def\MMLpENCLOSE#1#2%
+ {\getXMLarguments{menclose}{notation="" #1}%
+ \doifelse{\XMLpar{menclose}{notation}{}}{longdiv}
+ {\overline{)#2}}
+ {#2}}
+
+\remapXMLsequence [mfrac] [CPA] \MMLpFRAC
+
+\def\MMLpFRAC#1#2% \above is suboptimal since the spacing changes
+ {\withnexttwoXMLRelements
+ {\getXMLarguments{mfrac}{linethickness="" #1}%
+ \doifXMLparelse{mfrac}{linethickness}
+ {\edef\theXMLpar{\XMLpar{mfrac}{linethickness}{1}}%
+ \processaction
+ [\theXMLpar]
+ [ thin=>\scratchdimen=.2pt,
+ medium=>\scratchdimen=.4pt,
+ thick=>\scratchdimen=.8pt,
+ unknown=>\setdimensionwithunit\scratchdimen{\theXMLpar}{}]%
+ {{\firstXMLRelement}\above\scratchdimen{\secondXMLRelement}}}
+ {\frac{\firstXMLRelement}{\secondXMLRelement}}}%
+ #2}
+
+\remapXMLsequence [ms] [CPA] \MMLpSTRING
+
+\def\MMLpSTRING#1#2%
+ {\MMLpTEXT{#1}
+ {\getXMLarguments{mstyle}{#1}%
+ \getXMLarguments{ms}{lquote="\xmlrent{quot}" rquote="\xmlrent{quot}" #1}%
+ \XMLpar{ms}{lquote}{}\ignorespaces#2\unskip\unskip\XMLpar{ms}{rquote}{}}}
+
+\remapXMLsequence [mstyle] [CPA] \MMLpSTYLE
+
+\getXMLarguments
+ {mstyle}
+ {fontweight="" fontstyle="" mathstyle="" mathvariant="" background="" color=""}
+
+\def\MMLpSTYLE#1#2%
+ {\getXMLarguments{mstyle}{#1}#2}
+
+\remapXMLsequence [mtext] [CPA] \MMLpTEXT
+\remapXMLsequence [merror] [CPA] \MMLpERROR
+\remapXMLsequence [mphantom] [CPA] \MMLpPHANTOM
+\remapXMLsequence [mpadded] [CPA] \MMLpPADDED
+
+\def\MMLpTEXT#1#2%
+ {\hbox
+ {\tf % else encoding problems
+ \getXMLarguments{mstyle}{#1}%
+ \doMMPpbackground{mstyle}
+ {\doMMPpcolor{mstyle}
+ {\setMMLptextstyle{mstyle}%
+ \ignorespaces#2\unskip\unskip}}}}
+
+\def\setMMLpstyle#1%
+ {\doifdefined{MMLpstyle:#1}{\getvalue{MMLpstyle:#1}}}
+
+\def\defineMMLstyle[#1]#2%
+ {\setvalue{MMLpstyle:#1}{#2}}
+
+\defineMMLstyle[normal] {\tf} \defineMMLstyle[double-stuck] {\bf}
+\defineMMLstyle[bolditalic] {\bi} \defineMMLstyle[bold-italic] {\bi}
+\defineMMLstyle[boldslanted]{\bs} \defineMMLstyle[bold-slanted] {\bs}
+\defineMMLstyle[boldnormal] {\bf} \defineMMLstyle[bold] {\bf}
+\defineMMLstyle[slanted] {\sl} \defineMMLstyle[normalslanted]{\sl}
+\defineMMLstyle[italic] {\it} \defineMMLstyle[normalitalic] {\it}
+\defineMMLstyle[fraktur] {\bf} \defineMMLstyle[bold-fraktur] {\bf}
+\defineMMLstyle[script] {\tf} \defineMMLstyle[bold-script] {\bf}
+
+% and all kind of other crappy names
+
+\def\setMMLptextstyle#1%
+ {\setMMLpstyle{\XMLpar{#1}{fontweight}{}\XMLpar{#1}{fontstyle}{}}}
+
+\def\setMMLpmathstyle#1%
+ {\setMMLpstyle{\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\MMLpERROR #1#2{\hbox{$\displaystyle#2$}}
+\def\MMLpPHANTOM#1#2{\phantom{\ignorespaces{}#2\unskip}} % watch spacing {} hack
+\def\MMLpPADDED #1#2{#2}
+
+\remapXMLsequence [mrow] [CPA] \MMLpROW
+
+\def\MMLpROW#1#2{#2}
+
+\remapXMLsequence [msqrt] [CPA] \MMLpSQRT
+\remapXMLsequence [mroot] [CPA] \MMLpROOT
+
+\def\MMLpSQRT#1#2%
+ {\sqrt{#2}}
+
+\def\MMLpROOT#1#2%
+ {\withnexttwoXMLRelements{\root{\secondXMLRelement}\of{\firstXMLRelement}}#2}
+
+\remapXMLsequence [msup] [CPA] \MMLpSUP
+\remapXMLsequence [msub] [CPA] \MMLpSUB
+
+\setupMMLappearance[scripts][\c!alternative=\v!a]
+
+\def\MMLpSUBP#1#2%
+ {\withnexttwoXMLRelements
+ {\doifelse\@@MMLscriptsalternative\v!a
+ {{\firstXMLRelement}#1{\secondXMLRelement}} % both {} essential
+ {\firstXMLRelement#1{\secondXMLRelement}}}%
+ #2}
+
+\def\MMLpSUP#1{\MMLpSUBP ^}
+\def\MMLpSUB#1{\MMLpSUBP _}
+
+\remapXMLsequence [msubsup] [CPA] \MMLpSUBSUP
+
+\def\MMLpSUBSUP#1#2%
+ {\withnextthreeXMLRelements
+ {\firstXMLRelement _{\secondXMLRelement}^{\thirdXMLRelement}}%
+ #2}
+
+\remapXMLsequence [mover] [CPA] \MMLpOVER
+\remapXMLsequence [munder] [CPA] \MMLpUNDER
+\remapXMLsequence [munderover] [CPA] \MMLpUNDEROVER
+
+% hack, cannot be nested
+
+\def\MMLpUNDER#1#2{\withnexttwoXMLRelements\doMMLpUNDER#2}
+\def\MMLpOVER #1#2{\withnexttwoXMLRelements\doMMLpOVER #2}
+
+\def\doMMLfiller#1%
+ {\pushmacro\doMMLfiller
+ \let\doMMLfiller\gobbleoneargument
+ \gdef\dodoMMLfiller{\disablefiller\mathematics{#1}}%
+ \setbox\scratchbox=\hbox
+ {\def\normalorfiller##1##2%
+ {\gdef\dodoMMLfiller{\enablefiller#1}%
+ \let\normalorfiller\gobbletwoarguments}%
+ $#1$}%
+ \popmacro\doMMLfiller
+ \dodoMMLfiller}
+
+\def\doMMLpUNDER
+ {\mathop{\vtop{\mathsurround\zeropoint\ialign{\hss##\hss\crcr
+ \disabledelimiter\doMMLfiller\firstXMLRelement
+ \crcr\noalign{\kern3\points\nointerlineskip}%
+ \disabledelimiter\doMMLfiller\secondXMLRelement
+ \crcr\noalign{\kern3\points}}}}\limits}
+
+\def\doMMLpOVER
+ {\mathop{\vbox{\mathsurround\zeropoint\ialign{\hss##\hss\crcr\noalign{\kern3\points}%
+ \disabledelimiter\doMMLfiller\secondXMLRelement
+ \crcr\noalign{\kern3\points\nointerlineskip}%
+ \disabledelimiter\doMMLfiller\firstXMLRelement
+ \crcr}}}\limits}
+
+\def\MMLpUNDEROVER#1#2%
+ {\withnextthreeXMLRelements
+ {\firstXMLRelement
+ _{\disablefiller\disabledelimiter\secondXMLRelement}%
+ ^{\disablefiller\disabledelimiter\thirdXMLRelement}}#2}
+
+\remapXMLsequence [mtable] [CPA] \MMLpTABLE
+\remapXMLsequence [mtr] [CPA] \MMLpTR
+\remapXMLsequence [mtd] [CPA] \MMLpTD
+\remapXMLsequence [mlabeledtr] [CPA] \MMLpLABELEDTR
+
+\unexpanded\def\@col@amp@{&}
+
+\def\MMLpTR#1#2{\collectbetweenXMLR{\@col@amp@}{#2}\the\XMLRtoks\crcr}
+\def\MMLpTD#1#2{#2}
+
+\def\MMLpLABELEDTR{\MMLpTR}
+
+\def\MMLpTABLEmapper#1#2#3%
+ {\doifXMLparelse{mtable}{#1}
+ {\newcounter\MMLcounter
+ \def\docommand##1%
+ {\increment\MMLcounter
+ \let\MMLpREMAP\doMMLpREMAP
+ \def\MMLsetting{##1}#3% remap list
+ \expanded{\setupTABLE[column][\MMLcounter][#2=\MMLsetting]}}%
+ \expanded{\processseparatedlist[\XMLpar{mtable}{#1}{}][ ]\noexpand\docommand}}
+ {}}
+
+\def\MMLpTABLEmap#1#2#3%
+ {\doifXMLparelse{mtbl}{#1}
+ {\edef\MMLsetting{\XMLpar{mtbl}{#1}{}}#3% remap list
+ \edef\theMMLpTABLEmap{#2=\MMLsetting,\theMMLpTABLEmap}}
+ {}}
+
+\def\doMMLpREMAP#1#2%
+ {\doif{\MMLsetting}{#1}
+ {\def\MMLsetting{#2}%
+ \let\MMLpREMAP\gobbletwoarguments}}
+
+\let\MMLpREMAP\doMMLpREMAP
+
+\def\doMMLpTABLE#1#2%
+ {\begingroup
+ \getXMLarguments{mtable}
+ {columnalign="" columnspacing=".25ex" rowspacing=".25ex"
+ frame="" color="" background="" #1}%
+ \setupTABLE[\c!frame=\v!off]%
+ \MMLpTABLEmapper{background}{\c!backgroundcolor}{}%
+ \MMLpTABLEmapper{color}{\c!color}{}%
+ \MMLpTABLEmapper{frame}{\c!frame}
+ {\MMLpREMAP{none}{off}\MMLpREMAP{solid}{on}}%
+ \MMLpTABLEmapper{columnalign}{\c!align}
+ {\MMLpREMAP{left}{right}%
+ \MMLpREMAP{right}{left}%
+ \MMLpREMAP{center}{middle}}%
+ \setMMLpunit{\XMLpar{mtable}{rowspacing}{}}{.25ex}%
+ \let\MMLpTABLEoffset\MMLpunit
+ \let\MMLpTR\doMMLpTR
+ \let\MMLpTD\doMMLpTD
+ \bTABLE[\c!background=\v!color,\c!offset=\MMLpTABLEoffset]#2\eTABLE
+ \endgroup}
+
+\def\doMMLpTR#1#2%
+ {\doifXMLRchildelse{mtd}{#2}
+ {\bTR\ignorespaces#2\unskip\eTR}
+ {\bTR\doMMLpTD{#1}{#2}\eTR}}
+
+\def\doMMLpTD#1#2%
+ {\getXMLarguments{mtbl}
+ {columnalign="" columnspacing="" rowspacing=""
+ frame="" color="" background="" #1}%
+ \let\theMMLpTABLEmap\empty
+ \MMLpTABLEmap{background}{\c!backgroundcolor}{}%
+ \MMLpTABLEmap{color}{\c!color}{}%
+ \MMLpTABLEmap{frame}{\c!frame}
+ {\MMLpREMAP{none}{off}\MMLpREMAP{solid}{on}}%
+ \MMLpTABLEmap{columnalign}{\c!align}
+ {\MMLpREMAP{left}{right}\MMLpREMAP{right}{left}}%
+ \@EA\bTD\@EA[\theMMLpTABLEmap]$\ignorespaces#2\unskip$\eTD}
+
+\setupMMLappearance[mtable][\c!alternative=\v!a]
+
+\def\MMLpTABLE
+ {\doifelse\@@MMLmtablealternative\v!a
+ {\expandafter\MMLpTABLEa}
+ {\expandafter\MMLpTABLEb}}
+
+\def\MMLpTABLEa#1#2%
+ {\begingroup
+ \doifelsenothing{#1}
+ {\global\setfalse\mmlTABLEargs}
+ {\global\settrue\mmlTABLEargs}%
+ \ifconditional\mmlTABLEargs \else
+ \setbox\scratchbox=\hbox
+ {$\displaystyle
+ \def\MMLpTABLE##1##2%
+ {\ifconditional\mmlTABLEargs \else
+ \doifelsenothing{##1}{##2}{\global\settrue\mmlTABLEargs}%
+ \fi}%
+ \let\MMLpTR\MMLpTABLE
+ \let\MMLpTD\MMLpTABLE
+ #2$}%
+ \fi
+ \ifconditional\mmlTABLEargs
+ \let\MMLpTABLE\doMMLpTABLE
+ \def\next{\MMLpTABLE{#1}}%
+ \else
+ \let\next\matrix
+ \fi
+ \next{#2}%
+ \endgroup}
+
+\let\MMLpTABLEb\doMMLpTABLE
+
+\remapXMLsingular [mspace] [CPA] \MMLpSPACE
+
+\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}
+
+\def\MMLpSPACE#1#2%
+ {\getXMLarguments{mspace}{width=".5em" #1}%
+ \setMMLpunit{\XMLpar{mspace}{width}{}}{.5em}%
+ \hskip\MMLpunit\relax}
+
+
+\remapXMLsingular [mglyph] [CPA] \MMLpGLYPH
+
+\def\MMLpGLYPH#1#2% we assume \definefont usage
+ {\getXMLarguments{mglyph}{fontfamily="" index="1" alt="" #1}%
+ \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}{}}}}}}
+
+\remapXMLsingular [malignmark] [CPA] \MMLpALIGNMARK
+
+\def\MMLpALIGNMARK#1#2%
+ {}
+
+\remapXMLsingular [none] [CPA] \MMLpNONE
+\remapXMLsingular [mprescripts] [CPA] \MMLpMPRESCRIPTS
+\remapXMLsequence [mmultiscripts] [CPA] \MMLpMULTISCRIPTS
+
+\def\MMLpNONE #1#2{}
+\def\MMLpMPRESCRIPTS#1#2{}
+
+\def\MMLpMULTISCRIPTS#1#2%
+ {\pushmacro\xmlr
+ \let\xmlr\pMULTISCRIPTmmlPRE
+ \donefalse \scratchcounter=0 #2\empty
+ \let\xmlr\pMULTISCRIPTmmlPOST
+ \donetrue \scratchcounter=0 #2\empty
+ \popmacro\xmlr}
+
+\def\pMULTISCRIPTmmlPRE#1#2#3#4%
+ {\ifdone
+ \ifodd\scratchcounter
+ _{\naturalxmlr{#1}{#2}{#3}{#4}}%
+ \else
+ ^{\naturalxmlr{#1}{#2}{#3}{#4}}{}%
+ \fi
+ \else
+ \doif{mprescripts/}{#1}{\donetrue{}}% weak, the / here
+ \fi
+ \ifdone \advance\scratchcounter \plusone \fi}
+
+\let\pMULTISCRIPTmmlPOST\pMULTISCRIPTmmlPRE
+
+\stopXMLmapping
+
+\protect \endinput
+
+% extra samples
+
+\startXMLdata
+<formula>
+ <dmath>
+ <mfrac>
+ <mrow>
+ <mfrac>
+ <mrow>
+ <mtext>Q</mtext>
+ </mrow>
+ <mrow>
+ <mtext>P</mtext>
+ </mrow>
+ </mfrac>
+ </mrow>
+ <mrow>
+ <mtext>R</mtext>
+ </mrow>
+ </mfrac>
+ </dmath>
+</formula>
+\stopXMLdata
+
+\startXMLdata
+<formula>
+ <dmath>
+ <mfrac>
+ <mrow>
+ <mfrac>
+ <mrow>
+ <mi mathvariant='normal'>R</mi>
+ </mrow>
+ <mrow>
+ <mi mathvariant='normal'>P</mi>
+ </mrow>
+ </mfrac>
+ </mrow>
+ <mrow>
+ <mi mathvariant='normal'>R</mi>
+ </mrow>
+ </mfrac>
+ </dmath>
+</formula>
+\stopXMLdata