commit e6a1aed03a919aa98fa6893f5206abc28177453a
parent 75ffd88dc1389b44467d442f2dc61e41cef5fe78
Author: Christian Perfect <christianperfect@gmail.com>
Date: Fri, 25 Apr 2014 16:47:20 +0100
copy ctop.js into the content-mathml extension
Developed in mathjax/ctop. Uses the MathML jax's DOMfilterHooks to manipulate MathML elements before they're parsed into the internal format.
Diffstat:
1 file changed, 1460 insertions(+), 69 deletions(-)
diff --git a/unpacked/extensions/MathML/content-mathml.js b/unpacked/extensions/MathML/content-mathml.js
@@ -44,86 +44,1477 @@
*/
-MathJax.Extension["MathML/content-mathml"] = {
- version: "2.3"
-};
+MathJax.Extension["MathML/content-mathml"] = (function() {
+ /*
+ * Content MathML to Presentation MathML conversion
+ *
+ * based on David Carlisle's ctop.js - https://web-xslt.googlecode.com/svn/trunk/ctop/ctop.js
+ *
+ */
-MathJax.Hub.Register.StartupHook("MathML Jax Ready",function () {
+ var CToP = {
+ version: "2.4",
- var MATHML = MathJax.InputJax.MathML,
- PARSE = MATHML.Parse.prototype;
+ /* Transform the given <math> elements from Content MathML to Presentation MathML and replace the original elements
+ */
+ transform: function(elements){
+ for (var i = 0; i< elements.length;i++){
+ var mathNode = CToP.transformElement(elements[i]);
+ elements[i].parentNode.replaceChild(mathNode,elements[i]);
+ }
+ },
+
+ /* Transform a Content MathML element into Presentation MathML, and return the new element
+ */
+ transformElement: function(element) {
+ var mathNode = element.cloneNode(false);
+ for(var j=0;j<element.childNodes.length; j++ ) {
+ CToP.applyTransform(mathNode,element.childNodes[j],0);
+ }
+ return mathNode;
+ },
- MATHML.prefilterHooks.Add(function (data) {
- if (!MATHML.ctopXSLT) return;
+ /* Create an element with given name, belonging to the MathML namespace
+ */
+ createElement: function(name) {
+ return document.createElementNS("http://www.w3.org/1998/Math/MathML",name);
+ },
- // Parse the <math> but use MATHML.Parse's preProcessMath to apply the normal preprocessing.
- if (!MATHML.ParseXML) {MATHML.ParseXML = MATHML.createParser()}
- var doc = MATHML.ParseXML(PARSE.preProcessMath(data.math));
+ /* Get node's children
+ */
+ children: function(node) {
+ var children=[];
+ for(var j=0;j<node.childNodes.length; j++ ) {
+ if(node.childNodes[j].nodeType==document.ELEMENT_NODE) {
+ children.push(node.childNodes[j]);
+ }
+ }
+ return children;
+ },
+
+ /* Classify node's children as argumentss, variable bindings, or qualifiers
+ */
+ classifyChildren: function(contentMMLNode) {
+ var args = [], bvars = [], qualifiers = [];
+ for(var j=0;j<contentMMLNode.childNodes.length; j++ ) {
+ if(contentMMLNode.childNodes[j].nodeType==document.ELEMENT_NODE) {
+ var childNode = contentMMLNode.childNodes[j], name = childNode.localName;
+ if(name=='bvar'){
+ bvars.push(childNode);
+ } else if(name=='condition'||
+ name=='degree'||
+ name=='momentabout'||
+ name=='logbase'||
+ name=='lowlimit'||
+ name=='uplimit'||
+ (name=='interval' && args.length<2)||
+ name=='domainofapplication') {
+ qualifiers.push(childNode);
+ } else {
+ args.push(childNode);
+ }
+ }
+ }
+ return {
+ args:args,
+ bvars:bvars,
+ qualifiers:qualifiers
+ };
+ },
+
+ /* Add an element with given name and text content
+ */
+ appendToken: function(parentNode,name,textContent) {
+ var element = CToP.createElement(name);
+ element.textContent = textContent;
+ parentNode.appendChild(element);
+ return element;
+ },
+
+ /* Transform a Content MathML node to Presentation MathML node(s), and attach it to the parent
+ */
+ applyTransform: function(parentNode,contentMMLNode,precedence) {
+ if (contentMMLNode.nodeType==document.ELEMENT_NODE) {
+ if(CToP.tokens[contentMMLNode.localName]) {
+ CToP.tokens[contentMMLNode.localName](parentNode,contentMMLNode,precedence);
+ } else if (contentMMLNode.childNodes.length==0) {
+ CToP.appendToken(parentNode,'mi',contentMMLNode.localName);
+ } else {
+ var clonedChild = contentMMLNode.cloneNode(false);
+ parentNode.appendChild(clonedChild);
+ for(var j=0;j<contentMMLNode.childNodes.length; j++ ) {
+ CToP.applyTransform(clonedChild,contentMMLNode.childNodes[j],precedence);
+ }
+ }
+ } else if (contentMMLNode.nodeType==document.TEXT_NODE) {
+ parentNode.appendChild(contentMMLNode.cloneNode(false));
+ }
+ },
+
+ /* Transform an identifier symbol
+ */
+ identifier: function(textContent) {
+ return function(parentNode,contentMMLNode,precedence) {
+ CToP.appendToken(parentNode,'mi',textContent);
+ }
+ },
+
+ /* Make an mfenced environment
+ */
+ mfenced: function(children,open,close) {
+ var mf = CToP.createElement('mfenced');
+ mf.setAttribute('open',open);
+ mf.setAttribute('close',close);
+ for(var j=0;j<children.length; j++ ) {
+ CToP.applyTransform(mf,children[j],0);
+ }
+ return mf;
+ },
- // Now transform the <math> using the ctop stylesheet.
- var newdoc = MATHML.ctopXSLT.transformToDocument(doc);
+ /* Transform a set or set-like notation
+ */
+ set: function(open,close) {
+ var bindSet = CToP.bind('',',','|');
+ return function(parentNode,contentMMLNode) {
+ var children = CToP.classifyChildren(contentMMLNode);
- if ((typeof newdoc) === "string") {
- // Internet Explorer returns a string, so just use it.
- data.math = newdoc;
- } else if (window.XMLSerializer) {
- // Serialize the <math> again. We could directly provide the DOM content
- // but other prefilterHooks may assume data.math is still a string.
- var serializer = new XMLSerializer();
- data.math = serializer.serializeToString(newdoc.documentElement, doc);
+ var args = children.args, bvars = children.bvars, qualifiers = children.qualifiers;
+ if(bvars.length) {
+ var firstArg=children.args[0];
+ args = args.slice(1);
+ var mfenced = CToP.createElement('mfenced');
+ mfenced.setAttribute('open',open);
+ mfenced.setAttribute('close',close);
+ bindSet(mfenced,contentMMLNode,firstArg,args,bvars,qualifiers,0);
+ parentNode.appendChild(mfenced);
+ } else {
+ parentNode.appendChild(CToP.mfenced(args,open,close));
+ }
+ }
+ },
+
+ /* Transform a content token to a presentation token
+ *
+ * (function factory)
+ * @param {string} name - name of the corresponding presentation MML tag
+ */
+ token: function(name) {
+ return function(parentNode,contentMMLNode) {
+ if(contentMMLNode.childNodes.length==1 && contentMMLNode.childNodes[0].nodeType==document.TEXT_NODE) {
+ CToP.appendToken(parentNode,name,contentMMLNode.textContent);
+ } else {
+ var mrow = CToP.createElement('mrow');
+ for(var j=0;j<contentMMLNode.childNodes.length; j++ ) {
+ if (contentMMLNode.childNodes[j].nodeType==document.TEXT_NODE) {
+ CToP.appendToken(parentNode,name,contentMMLNode.childNodes[j].textContent);
+ }else{
+ CToP.applyTransform(mrow,contentMMLNode.childNodes[j],0);
+ }
+ }
+ if(mrow.childNodes.length) {
+ parentNode.appendChild(mrow);
+ }
+ }
+ }
+ },
+
+ /* Transform a binary operation
+ *
+ * (function factory)
+ */
+ binary: function(name,tokenPrecedence) {
+ return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ var needsBrackets = tokenPrecedence<precedence || (tokenPrecedence==precedence && name=="-");
+ if(needsBrackets) {
+ CToP.appendToken(mrow,'mo','(');
+ }
+ if(args.length>1){
+ CToP.applyTransform(mrow,args[0],tokenPrecedence);
+ }
+ CToP.appendToken(mrow,'mo',name);
+ if(args.length>0){
+ var z = args[(args.length==1)?0:1];
+ CToP.applyTransform(mrow,z,tokenPrecedence);
+ }
+ if(needsBrackets) {
+ CToP.appendToken(mrow,'mo',')');
+ }
+ parentNode.appendChild(mrow);
+ }
+ },
+
+ /* Transform an infix operator
+ *
+ * (function factory)
+ */
+ infix: function(name,tokenPrecedence) {
+ return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ var needsBrackets = precedence>tokenPrecedence;
+ if(needsBrackets) {
+ CToP.appendToken(mrow,'mo','(');
+ }
+ for(var j=0;j<args.length; j++ ) {
+ if(j>0) {
+ CToP.appendToken(mrow,'mo',name);
+ }
+ CToP.applyTransform(mrow,args[j],tokenPrecedence);
+ }
+ if(needsBrackets) {
+ CToP.appendToken(mrow,'mo',')');
+ }
+ parentNode.appendChild(mrow);
+ }
+ },
+
+ /* Transform an iterated operation, e.g. summation
+ *
+ * (function factory
+ */
+ iteration: function(name,limitSymbol) {
+ return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ var mo = CToP.createElement('mo');
+ mo.textContent = name;
+ var munderover = CToP.createElement('munderover');
+ munderover.appendChild(mo);
+ var mrow1 = CToP.createElement('mrow');
+ for(var i=0; i<qualifiers.length;i++){
+ if(qualifiers[i].localName=='lowlimit'||
+ qualifiers[i].localName=='condition'||
+ qualifiers[i].localName=='domainofapplication')
+ {
+ if(qualifiers[i].localName=='lowlimit'){
+ for(var j=0; j<bvars.length;j++){
+ var bvar = bvars[j];
+ var children = CToP.children(bvar);
+ if(children.length){
+ CToP.applyTransform(mrow1,children[0],0);
+ }
+ }
+ if(bvars.length){
+ CToP.appendToken(mrow1,"mo",limitSymbol);
+ }
+ }
+ var children = CToP.children(qualifiers[i]);
+ for(j=0;j<children.length;j++){
+ CToP.applyTransform(mrow1,children[j],0);
+ }
+ } else {
+ var children = CToP.children(qualifiers[i]);
+ if (qualifiers[i].localName=='interval' && children.length==2) {
+ for(var j=0; j<bvars.length;j++){
+ var bvar = b[j];
+ var children = CToP.children(bvar);
+ if(children.length){
+ CToP.applyTransform(mrow1,children[0],0);
+ }
+ }
+ if(bvars.length){
+ CToP.appendToken(mrow1,"mo","=");
+ }
+ CToP.applyTransform(mrow1,CToP.children(qualifiers[i])[0],0);
+ }
+ }
+ }
+ munderover.appendChild(mrow1);
+ var mjrow = CToP.createElement('mrow');
+ for(var i=0; i<qualifiers.length;i++){
+ if(qualifiers[i].localName=='uplimit' ||qualifiers[i].localName=='interval' )
+ {
+ var children = CToP.children(qualifiers[i]);
+ for(j=0;j<children.length;j++){
+ CToP.applyTransform(mjrow,children[j],0);
+ }
+ }
+ }
+ munderover.appendChild(mjrow);
+ mrow.appendChild(munderover);
+
+ for(var i=0; i<args.length;i++){
+ CToP.applyTransform(mrow,args[i],precedence);
+ }
+
+ parentNode.appendChild(mrow);
+ }
+ },
+
+ /* Transform something which binds a variable, e.g. forall or lambda
+ *
+ * (function factory)
+ */
+ bind: function(name,argSeparator,conditionSeparator) {
+ return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ if(name) {
+ CToP.appendToken(mrow,'mo',name);
+ }
+ for(var j=0; j<bvars.length;j++){
+ var bvar = bvars[j];
+ if(j>0) {
+ CToP.appendToken(mrow,'mo',',');
+ }
+ var children = CToP.children(bvar);
+ if(children.length){
+ CToP.applyTransform(mrow,children[0],0);
+ }
+ }
+
+ var conditions_mrow = CToP.createElement('mrow');
+ var conditions = false, children;
+ for(var i=0; i<qualifiers.length;i++){
+ if(qualifiers[i].localName=='condition') {
+ conditions = true;
+ children = CToP.children(qualifiers[i]);
+ for(var j=0;j<children.length;j++){
+ CToP.applyTransform(conditions_mrow,children[j],0);
+ }
+ }
+ }
+ if(conditions){
+ CToP.appendToken(mrow,'mo',conditionSeparator);
+ }
+ mrow.appendChild(conditions_mrow);
+ for(var i=0; i<qualifiers.length;i++){
+ if(qualifiers[i].localName!='condition') {
+ CToP.appendToken(mrow,'mo','\u2208');
+ children = CToP.children(qualifiers[i]);
+ for(var j=0;j<children.length;j++){
+ CToP.applyTransform(mrow,children[j],0);
+ }
+ }
+ }
+ if(args.length && (bvars.length||children.length)) {
+ CToP.appendToken(mrow,'mo',argSeparator);
+ }
+ for(var i=0; i<args.length;i++){
+ CToP.applyTransform(mrow,args[i],0);
+ }
+ parentNode.appendChild(mrow);
+ }
+ },
+
+ /** Transform a function application
+ *
+ * i.e. something which ends up looking like `f(x,y,z)`, where `f` is a string
+ *
+ * (function factory)
+ */
+ fn: function(name) {
+ return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ if(firstArg.childNodes.length){
+ CToP.applyTransform(mrow,firstArg,1);
+ } else {
+ CToP.appendToken(mrow,'mi',name);
+ }
+ CToP.appendToken(mrow,'mo','\u2061');
+ mrow.appendChild(CToP.mfenced(args,'(',')'));
+ parentNode.appendChild(mrow);
+ }
+ },
+
+ /** Transform a min/max operation
+ *
+ * (function factory)
+ */
+ minmax: function(name) {
+ return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,'mi',name);
+ var mrow2 = CToP.createElement('mrow');
+ CToP.appendToken(mrow2,'mo','{');
+ for(var i=0;i<args.length;i++) {
+ if(i>0) {
+ CToP.appendToken(mrow2,'mo',',');
+ }
+ CToP.applyTransform(mrow2,args[i],0);
+ }
+ if(qualifiers.length) {
+ CToP.appendToken(mrow2,'mo','|');
+ for(var i=0;i<qualifiers.length;i++) {
+ CToP.applyTransform(mrow2,qualifiers[i],0);
+ }
+ }
+ CToP.appendToken(mrow2,'mo','}');
+ mrow.appendChild(mrow2);
+ parentNode.appendChild(mrow);
+ }
}
- });
+ }
- /*
- * The following is taken from ctop.xsl and mml3mml2.xsl
- * (https://web-xslt.googlecode.com/svn/trunk/ctop/)
- * which is Copyright (c) David Carlisle 2001, 2002, 2008, 2009, 2013.
- * It is used by permission of David Carlisle, who has agreed to allow it to
- * be released under the Apache2 licesnse.
+ /* mathvariant to use with corresponding <ci> type attribute */
+ CToP.cistyles = {
+ "vector": 'bold-italic',
+ "matrix": 'bold-upright'
+ }
+
+ /* Functions to transform variable/atom tokens
*/
- var ctopStylesheet = '<x:stylesheet version="1.0" xmlns:x="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1998/Math/MathML" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:c="http://exslt.org/common" exclude-result-prefixes="m c"><!-- Copyright David Carlisle 2001, 2002, 2008, 2009, 2013. Use and distribution of this code are permitted under the terms of the <a href="http://www.w3.org/Consortium/Legal/copyright-software-19980720" >W3C Software Notice and License</a>. Or the Apache 2, MIT or MPL 1.1 or MPL 2.0 licences. --> <x:output method="xml" /><x:template match="/"><x:apply-templates/></x:template><x:template match="*"><x:copy><x:copy-of select="@*"/><x:apply-templates/></x:copy></x:template><x:template match="m:cn"><mn><x:apply-templates/></mn></x:template><x:template match="m:cn[@type=\'complex-cartesian\']"><mrow><mn><x:apply-templates select="text()[1]"/></mn><mo>+</mo><mn><x:apply-templates select="text()[2]"/></mn><mo>⁢<!--invisible times--></mo><mi>i<!-- imaginary i --></mi></mrow></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'complex_cartesian\']]"><mrow><mn><x:apply-templates select="*[2]"/></mn><mo>+</mo><mn><x:apply-templates select="*[3]"/></mn><mo>⁢<!--invisible times--></mo><mi>i<!-- imaginary i --></mi></mrow></x:template><x:template match="m:cn[@type=\'rational\']"><mrow><mn><x:apply-templates select="text()[1]"/></mn><mo>/</mo><mn><x:apply-templates select="text()[2]"/></mn></mrow></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'rational\']]"><mrow><mn><x:apply-templates select="*[2]"/></mn><mo>/</mo><mn><x:apply-templates select="*[3]"/></mn></mrow></x:template><x:template match="m:cn[not(@type) or @type=\'integer\']"><x:choose><x:when test="not(@base) or @base=10"><mn><x:apply-templates/></mn></x:when><x:otherwise><msub><mn><x:apply-templates/></mn><mn><x:value-of select="@base"/></mn></msub></x:otherwise></x:choose></x:template><x:template match="m:cn[@type=\'complex-polar\']"><mrow><mn><x:apply-templates select="text()[1]"/></mn><mo>⁢<!--invisible times--></mo><msup><mi>e<!-- exponential e--></mi><mrow><mi>i<!-- imaginary i--></mi><mo>⁢<!--invisible times--></mo><mn><x:apply-templates select="text()[2]"/></mn></mrow></msup></mrow></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'complex_polar\']]"><mrow><x:apply-templates select="*[2]"/><mo>⁢<!--invisible times--></mo><msup><mi>e<!-- exponential e--></mi><mrow><mi>i<!-- imaginary i--></mi><mo>⁢<!--invisible times--></mo><x:apply-templates select="*[3]"/></mrow></msup></mrow></x:template><x:template match="m:cn[@type=\'e-notation\']"><mn><x:apply-templates select="m:sep/preceding-sibling::node()"/><x:text>E</x:text><x:apply-templates select="m:sep/following-sibling::node()"/></mn></x:template><x:template match="m:cn[@type=\'hexdouble\']"><mn><x:text>0x</x:text><x:apply-templates/></mn></x:template><x:template match="m:ci/text()"><mi><x:value-of select="."/></mi></x:template><x:template match="m:ci"><mrow><x:apply-templates/></mrow></x:template><x:template match="m:csymbol/text()"><mi><x:value-of select="."/></mi></x:template><x:template match="m:csymbol"><mrow><x:apply-templates/></mrow></x:template><x:template match="m:apply|m:reln"><mrow><x:choose><x:when test="*[1]/*/*"><mfenced separators=""><x:apply-templates select="*[1]"><x:with-param name="p" select="10"/></x:apply-templates></mfenced></x:when><x:otherwise><x:apply-templates select="*[1]"><x:with-param name="p" select="10"/></x:apply-templates></x:otherwise></x:choose><mo>⁡<!--function application--></mo><mfenced open="(" close=")" separators=","><x:apply-templates select="*[position()>1]"/></mfenced></mrow></x:template><x:template match="m:bind"><mrow><x:choose><x:when test="*[1]/*/*"><mfenced separators=""><x:apply-templates select="*[1]"><x:with-param name="p" select="10"/></x:apply-templates></mfenced></x:when><x:otherwise><x:apply-templates select="*[1]"><x:with-param name="p" select="10"/></x:apply-templates></x:otherwise></x:choose><x:apply-templates select="bvar/*"/><mo>.</mo><x:apply-templates select="*[position()>1][not(self::m:bvar)]"/></mrow></x:template><x:template match="m:fn"><mrow><x:apply-templates/></mrow></x:template><x:template match="m:interval[*[2]]"><mfenced open="[" close="]"><x:apply-templates/></mfenced></x:template><x:template match="m:interval[*[2]][@closure=\'open\']" priority="2"><mfenced open="(" close=")"><x:apply-templates/></mfenced></x:template><x:template match="m:interval[*[2]][@closure=\'open-closed\']" priority="2"><mfenced open="(" close="]"><x:apply-templates/></mfenced></x:template><x:template match="m:interval[*[2]][@closure=\'closed-open\']" priority="2"><mfenced open="[" close=")"><x:apply-templates/></mfenced></x:template><x:template match="m:interval"><mfenced open="{{" close="}}"><x:apply-templates/></mfenced></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'integer_interval\']]"><mfenced open="[" close="]"><x:apply-templates select="*[position()!=1]"/></mfenced></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'interval\']]"><mfenced open="[" close="]"><x:apply-templates select="*[position()!=1]"/></mfenced></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'interval-cc\']]"><mfenced open="[" close="]"><x:apply-templates select="*[position()!=1]"/></mfenced></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'interval-oo\']]"><mfenced open="(" close=")"><x:apply-templates select="*[position()!=1]"/></mfenced></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'oriented_interval\']]"><mfenced open="(" close=")"><x:apply-templates select="*[position()!=1]"/></mfenced></x:template><x:template match="m:apply[*[1][self::m:inverse]] |m:apply[*[1][self::m:csymbol=\'inverse\']]"><msup><x:apply-templates select="*[2]"/><mrow><mo>(</mo><mn>-1</mn><mo>)</mo></mrow></msup></x:template><x:template match="m:condition"><mrow><x:apply-templates/></mrow></x:template><x:template match="m:declare"/><x:template match="m:lambda |m:apply[*[1][self::m:csymbol=\'lambda\']] |m:bind[*[1][self::m:csymbol=\'lambda\']]"><mrow><mi>λ<!--lambda--></mi><mrow><x:choose><x:when test="m:condition"><x:apply-templates select="m:condition/*"/></x:when><x:otherwise><x:apply-templates select="m:bvar/*"/></x:otherwise></x:choose><x:if test="m:domainofapplication"><mo>∈</mo><x:apply-templates select="m:domainofapplication/*"/></x:if></mrow><mo>.</mo><mfenced><x:apply-templates select="*[last()]"/></mfenced></mrow></x:template><x:template match="m:lambda[not(m:bvar)]" priority="2"><mrow><x:apply-templates select="*[last()]"/><msub><mo>|</mo><mrow><x:apply-templates select="m:condition|m:interval|m:domainofapplication/*"/></mrow></msub></mrow></x:template><x:template match="m:apply[*[1][self::m:compose]] |m:apply[*[1][self::m:csymbol=\'left_compose\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="1"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>∘<!-- o --></mo></x:with-param></x:call-template></x:template><x:template match="m:ident"><mi>id</mi></x:template><x:template match="m:domain"><mi>domain</mi></x:template><x:template match="m:codomain"><mi>codomain</mi></x:template><x:template match="m:image"><mi>image</mi></x:template><x:template match="m:domainofapplication"><merror><mtext>unexpected domainofapplication</mtext></merror></x:template><x:template match="m:apply[*[2][self::m:bvar]][m:domainofapplication]" priority="0.4"><mrow><munder><x:apply-templates select="*[1]"/><mrow><x:apply-templates select="m:bvar/*"/><mo>∈<!-- in --></mo><x:apply-templates select="m:domainofapplication/*"/></mrow></munder><mfenced><x:apply-templates select="m:domainofapplication/following-sibling::*"/></mfenced></mrow></x:template><x:template match="m:apply[m:domainofapplication]" priority="0.3"><mrow><mrow><mi>restriction</mi><mfenced><x:apply-templates select="*[1]"/><x:apply-templates select="m:domainofapplication/*"/></mfenced></mrow><mfenced><x:apply-templates select="m:domainofapplication/following-sibling::*"/></mfenced></mrow></x:template><x:template match="m:piecewise"><mrow><mo>{</mo><mtable><x:for-each select="m:piece|m:otherwise"><mtr><mtd><x:apply-templates select="*[1]"/></mtd><x:choose><x:when test="self::m:piece"><mtd columnalign="left"><mtext>  if  </mtext></mtd><mtd><x:apply-templates select="*[2]"/></mtd></x:when><x:otherwise><mtd columnspan="2" columnalign="left"><mtext>  otherwise</mtext></mtd></x:otherwise></x:choose></mtr></x:for-each></mtable></mrow></x:template><x:template match="m:apply[*[1][self::m:quotient]] |m:apply[*[1][self::m:csymbol=\'quotient\']]"><mrow><mo>⌊<!-- lfloor--></mo><x:apply-templates select="*[2]"/><mo>/</mo><x:apply-templates select="*[3]"/><mo>⌋<!-- rfloor--></mo></mrow></x:template><x:template match="m:apply[*[1][self::m:factorial]] |m:apply[*[1][self::m:csymbol=\'factorial\']]"><mrow><x:apply-templates select="*[2]"><x:with-param name="p" select="7"/></x:apply-templates><mo>!</mo></mrow></x:template><x:template match="m:apply[*[1][self::m:divide]] |m:apply[*[1][self::m:csymbol=\'divide\']]"><x:param name="p" select="0"/><x:call-template name="binary"><x:with-param name="mo"><mo>/</mo></x:with-param><x:with-param name="p" select="$p"/><x:with-param name="this-p" select="3"/></x:call-template></x:template><x:template match="m:apply[*[1][self::m:max]] |m:apply[*[1][self::m:csymbol=\'max\']]"><mrow><mi>max</mi><x:call-template name="set"/></mrow></x:template><x:template match="m:apply[*[1][self::m:min]]|m:reln[*[1][self::m:min]]"><mrow><mi>min</mi><x:call-template name="set"/></mrow></x:template><x:template match="m:apply[*[1][self::m:minus] and count(*)=2] |m:apply[*[1][self::m:csymbol=\'unary_minus\']]"><mrow><mo>−<!--minus--></mo><x:apply-templates select="*[2]"><x:with-param name="p" select="5"/></x:apply-templates></mrow></x:template><x:template match="m:apply[*[1][self::m:minus] and count(*)>2] |m:apply[*[1][self::m:csymbol=\'minus\']]"><x:param name="p" select="0"/><x:call-template name="binary"><x:with-param name="mo"><mo>−<!--minus--></mo></x:with-param><x:with-param name="p" select="$p"/><x:with-param name="this-p" select="2"/></x:call-template></x:template><x:template match="m:apply[*[1][self::m:plus]] |m:apply[*[1][self::m:csymbol=\'plus\']]"><x:param name="p" select="0"/><mrow><x:if test="$p > 2"><mo>(</mo></x:if><x:for-each select="*[position()>1]"><x:choose><x:when test="self::m:apply[*[1][self::m:times] and *[2][self::m:apply/*[1][self::m:minus] or self::m:cn[not(m:sep) and (number(.) < 0)]]] or self::m:apply[count(*)=2 and *[1][self::m:minus]] or self::m:cn[not(m:sep) and (number(.) < 0)]"><mo>−<!--minus--></mo></x:when><x:when test="position()!=1"><mo>+</mo></x:when></x:choose><x:choose><x:when test="self::m:cn[not(m:sep) and (number(.) < 0)]"><mn><x:value-of select="-(.)"/></mn></x:when><x:when test=" self::m:apply[count(*)=2 and *[1][self::m:minus]]"><x:apply-templates select="*[2]"><x:with-param name="first" select="2"/><x:with-param name="p" select="2"/></x:apply-templates></x:when><x:when test="self::m:apply[*[1][self::m:times] and *[2][self::m:cn[not(m:sep) and (number(.) <0)]]]"><mrow><mn><x:value-of select="-(*[2])"/></mn><mo>⁢<!--invisible times--></mo><x:apply-templates select="."><x:with-param name="first" select="2"/><x:with-param name="p" select="2"/></x:apply-templates></mrow></x:when><x:when test="self::m:apply[*[1][self::m:times] and *[2][self::m:apply/*[1][self::m:minus]]]"><mrow><x:apply-templates select="./*[2]/*[2]"/><x:apply-templates select="."><x:with-param name="first" select="2"/><x:with-param name="p" select="2"/></x:apply-templates></mrow></x:when><x:otherwise><x:apply-templates select="."><x:with-param name="p" select="2"/></x:apply-templates></x:otherwise></x:choose></x:for-each><x:if test="$p > 2"><mo>)</mo></x:if></mrow></x:template><x:template match="m:apply[*[1][self::m:power]] |m:apply[*[1][self::m:csymbol=\'power\']]"><x:param name="p" select="0"/><x:choose><x:when test="$p>=5"><mrow><mo>(</mo><msup><x:apply-templates select="*[2]"><x:with-param name="p" select="5"/></x:apply-templates><x:apply-templates select="*[3]"><x:with-param name="p" select="5"/></x:apply-templates></msup><mo>)</mo></mrow></x:when><x:otherwise><msup><x:apply-templates select="*[2]"><x:with-param name="p" select="5"/></x:apply-templates><x:apply-templates select="*[3]"><x:with-param name="p" select="5"/></x:apply-templates></msup></x:otherwise></x:choose></x:template><x:template match="m:apply[*[1][self::m:rem]] |m:apply[*[1][self::m:csymbol=\'rem\']]"><x:param name="p" select="0"/><x:call-template name="binary"><x:with-param name="mo"><mo>mod</mo></x:with-param><x:with-param name="p" select="$p"/><x:with-param name="this-p" select="3"/></x:call-template></x:template><x:template match="m:apply[*[1][self::m:times]] |m:apply[*[1][self::m:csymbol=\'times\']]" name="times"><x:param name="p" select="0"/><x:param name="first" select="1"/><mrow><x:if test="$p > 3"><mo>(</mo></x:if><x:for-each select="*[position()>1]"><x:if test="position() > 1"><mo><x:choose><x:when test="self::m:cn">×<!-- times --></x:when><x:otherwise>⁢<!--invisible times--></x:otherwise></x:choose></mo></x:if><x:if test="position()>= $first"><x:apply-templates select="."><x:with-param name="p" select="3"/></x:apply-templates></x:if></x:for-each><x:if test="$p > 3"><mo>)</mo></x:if></mrow></x:template><x:template match="m:apply[*[1][self::m:root] and not(m:degree) or m:degree=2]" priority="4"><msqrt><x:apply-templates select="*[position()>1]"/></msqrt></x:template><x:template match="m:apply[*[1][self::m:root]]"><mroot><x:apply-templates select="*[position()>1 and not(self::m:degree)]"/><mrow><x:apply-templates select="m:degree/*"/></mrow></mroot></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'root\']]"><mroot><x:apply-templates select="*[position()!=1]"/></mroot></x:template><x:template match="m:gcd"><mi>gcd</mi></x:template><x:template match="m:apply[*[1][self::m:and]] |m:reln[*[1][self::m:and]] |m:apply[*[1][self::m:csymbol=\'and\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="2"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>∧<!-- and --></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:or]] |m:apply[*[1][self::m:csymbol=\'or\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="3"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>∨<!-- or --></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:xor]] |m:apply[*[1][self::m:csymbol=\'xor\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="3"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>xor</mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:not]] |m:apply[*[1][self::m:csymbol=\'not\']]"><mrow><mo>¬<!-- not --></mo><x:apply-templates select="*[2]"><x:with-param name="p" select="7"/></x:apply-templates></mrow></x:template><x:template match="m:apply[*[1][self::m:implies]] |m:reln[*[1][self::m:implies]] |m:apply[*[1][self::m:csymbol=\'implies\']]"><x:param name="p" select="0"/><x:call-template name="binary"><x:with-param name="mo"><mo>⇒<!-- Rightarrow --></mo></x:with-param><x:with-param name="p" select="$p"/><x:with-param name="this-p" select="3"/></x:call-template></x:template><x:template match="m:apply[*[1][self::m:forall]] |m:apply[*[1][self::m:csymbol=\'forall\']] |m:bind[*[1][self::m:forall]] |m:bind[*[1][self::m:csymbol=\'forall\']]"><mrow><mo>∀<!--forall--></mo><mrow><x:apply-templates select="m:bvar[not(current()/m:condition)]/*|m:condition/*"/></mrow><mo>.</mo><mfenced><x:apply-templates select="*[last()]"/></mfenced></mrow></x:template><x:template match="m:apply[*[1][self::m:exists]] |m:apply[*[1][self::m:csymbol=\'exists\']] |m:bind[*[1][self::m:exists]] |m:bind[*[1][self::m:csymbol=\'exists\']]"><mrow><mo>∃<!--exists--></mo><mrow><x:apply-templates select="m:bvar[not(current()/m:condition)]/*|m:condition/*"/></mrow><mo>.</mo><mfenced separators=""><x:choose><x:when test="m:condition"><x:apply-templates select="m:condition/*"/><mo>∧<!-- and --></mo></x:when><x:when test="m:domainofapplication"><mrow><mrow><x:for-each select="m:bvar"><x:apply-templates/><x:if test="position()!=last()"><mo>,</mo></x:if></x:for-each></mrow><mo>∈<!-- in --></mo><x:apply-templates select="m:domainofapplication/*"/></mrow><mo>∧<!-- and --></mo></x:when></x:choose><x:apply-templates select="*[last()]"/></mfenced></mrow></x:template><x:template match="m:apply[*[1][self::m:abs]] |m:apply[*[1][self::m:csymbol=\'abs\']]"><mrow><mo>|</mo><x:apply-templates select="*[2]"/><mo>|</mo></mrow></x:template><x:template match="m:apply[*[1][self::m:conjugate]] |m:apply[*[1][self::m:csymbol=\'conjugate\']]"><mover><x:apply-templates select="*[2]"/><mo>¯<!-- overline --></mo></mover></x:template><x:template match="m:arg"><mi>arg</mi></x:template><x:template match="m:real|m:csymbol[.=\'real\']"><mo>ℛ<!-- real --></mo></x:template><x:template match="m:imaginary|m:csymbol[.=\'imaginary\']"><mo>ℑ<!-- imaginary --></mo></x:template><x:template match="m:lcm"><mi>lcm</mi></x:template><x:template match="m:apply[*[1][self::m:floor]] |m:apply[*[1][self::m:csymbol=\'floor\']]"><mrow><mo>⌊<!-- lfloor--></mo><x:apply-templates select="*[2]"/><mo>⌋<!-- rfloor--></mo></mrow></x:template><x:template match="m:apply[*[1][self::m:ceiling]] |m:apply[*[1][self::m:csymbol=\'ceiling\']]"><mrow><mo>⌈<!-- lceil--></mo><x:apply-templates select="*[2]"/><mo>⌉<!-- rceil--></mo></mrow></x:template><x:template match="m:apply[*[1][self::m:eq]] |m:reln[*[1][self::m:eq]] |m:apply[*[1][self::m:csymbol=\'eq\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="1"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>=</mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:neq]] |m:apply[*[1][self::m:csymbol=\'neq\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="1"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>≠<!-- neq --></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:gt]] |m:reln[*[1][self::m:gt]] |m:apply[*[1][self::m:csymbol=\'gt\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="1"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:lt]] |m:reln[*[1][self::m:lt]] |m:apply[*[1][self::m:csymbol=\'lt\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="1"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo><</mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:geq]] |m:apply[*[1][self::m:csymbol=\'geq\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="1"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>≥</mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:leq]] |m:apply[*[1][self::m:csymbol=\'leq\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="1"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>≤</mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:equivalent]] |m:apply[*[1][self::m:csymbol=\'equivalent\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="1"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>≡</mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:approx]] |m:apply[*[1][self::m:csymbol=\'approx\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="1"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>≃</mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:factorof]] |m:apply[*[1][self::m:csymbol=\'factorof\']]"><x:param name="p" select="0"/><x:call-template name="binary"><x:with-param name="mo"><mo>|</mo></x:with-param><x:with-param name="p" select="$p"/><x:with-param name="this-p" select="3"/></x:call-template></x:template><x:template match="m:apply[*[1][self::m:int]] |m:apply[*[1][self::m:csymbol=\'int\']] |m:bind[*[1][self::m:int]] |m:bind[*[1][self::m:csymbol=\'int\']]"><mrow><msubsup><mi>∫<!--int--></mi><mrow><x:apply-templates select="m:lowlimit/*|m:interval/*[1]|m:condition/*|m:domainofapplication/*"/></mrow><mrow><x:apply-templates select="m:uplimit/*|m:interval/*[2]"/></mrow></msubsup><x:apply-templates select="*[last()]"/><x:if test="m:bvar"><mi>d</mi><x:apply-templates select="m:bvar"/></x:if></mrow></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'defint\']]"><mrow><munder><mi>∫<!--int--></mi><x:apply-templates select="*[2]"/></munder><x:apply-templates select="*[last()]"/></mrow></x:template><x:template match="m:apply[*[1][self::m:diff] and not(m:bvar)]| m:apply[*[1][self::m:csymbol=\'diff\']]" priority="2"><msup><mrow><x:apply-templates select="*[2]"/></mrow><mo>′<!--prime--></mo></msup></x:template><x:template match="m:apply[*[1][self::m:diff]]" priority="1"><mfrac><x:choose><x:when test="m:bvar/m:degree"><mrow><msup><mi>d</mi><x:apply-templates select="m:bvar/m:degree/node()"/></msup><x:apply-templates select="*[last()]"/></mrow><mrow><mi>d</mi><msup><x:apply-templates select="m:bvar/node()"/><x:apply-templates select="m:bvar/m:degree/node()"/></msup></mrow></x:when><x:otherwise><mrow><mi>d</mi><x:apply-templates select="*[last()]"/></mrow><mrow><mi>d</mi><x:apply-templates select="m:bvar"/></mrow></x:otherwise></x:choose></mfrac></x:template><x:template match="m:apply[*[1][self::m:partialdiff] and m:list and not(m:bvar) and count(*)=3]" priority="2"><mrow><msub><mi>D</mi><mrow><x:for-each select="m:list[1]/*"><x:apply-templates select="."/><x:if test="position()<last()"><mo>,</mo></x:if></x:for-each></mrow></msub><mrow><x:apply-templates select="*[3]"/></mrow></mrow></x:template><x:template match="m:apply[*[1][self::m:partialdiff] and m:list and m:lambda]" priority="3"><mfrac><mrow><x:choose><x:when test="count(m:list/*)=1"><mo>∂<!-- partial --></mo></x:when><x:otherwise><msup><mo>∂<!-- partial --></mo><mrow><x:choose><x:when test="m:degree"><x:apply-templates select="m:degree/node()"/></x:when><x:otherwise><mn><x:value-of select="count(m:list/*)"/></mn></x:otherwise></x:choose></mrow></msup></x:otherwise></x:choose><x:apply-templates select="m:lambda/*[last()]"/></mrow><mrow><x:call-template name="pddx"/></mrow></mfrac></x:template><x:template name="pddx"><x:param name="n" select="1"/><x:param name="b" select="m:lambda/m:bvar"/><x:param name="l" select="m:list/*"/><x:choose><x:when test="number($l[1])=number($l[2])"><x:call-template name="pddx"><x:with-param name="n" select="$n+1"/><x:with-param name="b" select="$b"/><x:with-param name="l" select="$l[position()!=1]"/></x:call-template></x:when><x:otherwise><mrow><mo>∂<!-- partial --></mo><x:choose><x:when test="$n=1"><x:apply-templates select="$b[position()=$l[1]]/*"/></x:when><x:otherwise><msup><x:apply-templates select="$b[position()=$l[1]]/*"/><mn><x:value-of select="$n"/></mn></msup></x:otherwise></x:choose></mrow><x:if test="$l[2]"><x:call-template name="pddx"><x:with-param name="b" select="$b"/><x:with-param name="l" select="$l[position()!=1]"/></x:call-template></x:if></x:otherwise></x:choose></x:template><x:template match="m:apply[*[1][self::m:partialdiff]]" priority="1"><mfrac><mrow><x:choose><x:when test="not(m:bvar/m:degree) and not(m:bvar[2])"><mo>∂<!-- partial --></mo></x:when><x:otherwise><msup><mo>∂<!-- partial --></mo><mrow><x:choose><x:when test="m:degree"><x:apply-templates select="m:degree/node()"/></x:when><x:when test="m:bvar/m:degree[string(number(.))=\'NaN\']"><x:for-each select="m:bvar/m:degree"><x:apply-templates select="node()"/><x:if test="position()<last()"><mo>+</mo></x:if></x:for-each><x:if test="count(m:bvar[not(m:degree)])>0"><mo>+</mo><mn><x:value-of select="count(m:bvar[not(m:degree)])"/></mn></x:if></x:when><x:otherwise><mn><x:value-of select="number(sum(m:bvar/m:degree))+count(m:bvar[not(m:degree)])"/></mn></x:otherwise></x:choose></mrow></msup></x:otherwise></x:choose><x:apply-templates select="*[last()]"/></mrow><mrow><x:for-each select="m:bvar"><mrow><mo>∂<!-- partial --></mo><msup><x:apply-templates select="node()"/><mrow><x:apply-templates select="m:degree/node()"/></mrow></msup></mrow></x:for-each></mrow></mfrac></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'partialdiffdegree\']]"><mrow><msub><mo>∂<!-- partial --></mo><mrow><x:apply-templates select="*[2]"/></mrow></msub><mfenced><x:apply-templates select="*[4]"/></mfenced></mrow></x:template><x:template match="m:lowlimit"/><x:template match="m:uplimit"/><x:template match="m:bvar"><mi><x:apply-templates/></mi><x:if test="following-sibling::m:bvar"><mo>,</mo></x:if></x:template><x:template match="m:degree"/><x:template match="m:divergence"><mi>div</mi></x:template><x:template match="m:apply[*[1][self::m:divergence]and m:bvar and m:vector]"><x:variable name="v" select="m:bvar"/><mrow><mi>div</mi><mo>⁡<!--function application--></mo><mo>(</mo><mtable><x:for-each select="m:vector/*"><x:variable name="p" select="position()"/><mtr><mtd><x:apply-templates select="$v[$p]/*"/><mo>↦<!-- map--></mo><x:apply-templates select="."/></mtd></mtr></x:for-each></mtable><mo>)</mo></mrow></x:template><x:template match="m:grad"><mi>grad</mi></x:template><x:template match="m:apply[*[1][self::m:grad]and m:bvar]"><mrow><mi>grad</mi><mo>⁡<!--function application--></mo><mrow><mo>(</mo><mfenced><x:apply-templates select="m:bvar/*"/></mfenced><mo>↦<!-- map--></mo><x:apply-templates select="*[position()!=1][not(self::m:bvar)]"/><mo>)</mo></mrow></mrow></x:template><x:template match="m:curl"><mi>curl</mi></x:template><x:template match="m:laplacian"><msup><mo>∇<!-- nabla --></mo><mn>2</mn></msup></x:template><x:template match="m:apply[*[1][self::m:laplacian]and m:bvar]"><mrow><x:apply-templates select="*[1]"/><mo>⁡<!--function application--></mo><mrow><mo>(</mo><mfenced><x:apply-templates select="m:bvar/*"/></mfenced><mo>↦<!-- map--></mo><x:apply-templates select="*[position()!=1][not(self::m:bvar)]"/><mo>)</mo></mrow></mrow></x:template><x:template match="m:set"><x:call-template name="set"/></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'set\']]"><mfenced open="{{" close="}}" separators=","><x:apply-templates select="*[position()!=1]"/></mfenced></x:template><x:template match="m:list"><x:call-template name="set"><x:with-param name="o" select="\'(\'"/><x:with-param name="c" select="\')\'"/></x:call-template></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'list\']]"><mfenced open="(" close=")" separators=","><x:apply-templates select="*[position()!=1]"/></mfenced></x:template><x:template match="m:apply[*[1][self::m:union]] |m:apply[*[1][self::m:csymbol=\'union\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="2"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>∪<!-- union --></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:union]][m:bvar] |m:apply[*[1][self::m:csymbol=\'union\']][m:bvar]" priority="2" ><x:call-template name="sum"><x:with-param name="mo"><mo>⋃</mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:intersect]] |m:apply[*[1][self::m:csymbol=\'intersect\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="3"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>∩<!-- intersect --></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:intersect]][m:bvar] |m:apply[*[1][self::m:csymbol=\'intersect\']][m:bvar]" priority="2" ><x:call-template name="sum"><x:with-param name="mo"><mo>⋂</mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:in]] |m:apply[*[1][self::m:csymbol=\'in\']]"><x:param name="p" select="0"/><x:call-template name="binary"><x:with-param name="mo"><mo>∈<!-- in --></mo></x:with-param><x:with-param name="p" select="$p"/><x:with-param name="this-p" select="3"/></x:call-template></x:template><x:template match="m:apply[*[1][self::m:notin]]|m:reln[*[1][self::m:notin]] |m:apply[*[1][self::m:csymbol=\'notin\']]"><x:param name="p" select="0"/><x:call-template name="binary"><x:with-param name="mo"><mo>∉<!-- not in --></mo></x:with-param><x:with-param name="p" select="$p"/><x:with-param name="this-p" select="3"/></x:call-template></x:template><x:template match="m:apply[*[1][self::m:subset]] |m:apply[*[1][self::m:csymbol=\'subset\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="2"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>⊆<!-- subseteq --></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:prsubset]] |m:apply[*[1][self::m:csymbol=\'prsubset\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="2"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>⊂<!-- prsubset --></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:notsubset]] |m:apply[*[1][self::m:csymbol=\'notsubset\']]"><x:param name="p" select="0"/><x:call-template name="binary"><x:with-param name="this-p" select="2"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>⊈<!-- notsubseteq --></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:notprsubset]] |m:apply[*[1][self::m:csymbol=\'notprsubset\']]"><x:param name="p" select="0"/><x:call-template name="binary"><x:with-param name="this-p" select="2"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>⊄<!-- prsubset --></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:setdiff]] |m:apply[*[1][self::m:csymbol=\'setdiff\']]"><x:param name="p" select="0"/><x:call-template name="binary"><x:with-param name="this-p" select="2"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>∖<!-- setminus --></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:card]] |m:apply[*[1][self::m:csymbol=\'card\']]"><mrow><mo>|</mo><x:apply-templates select="*[2]"/><mo>|</mo></mrow></x:template><x:template match="m:apply[*[1][self::m:cartesianproduct or self::m:vectorproduct]] |m:apply[*[1][self::m:csymbol[.=\'cartesian_product\' or . = \'vectorproduct\']]]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="2"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>×<!-- times --></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:cartesianproduct][count(following-sibling::m:reals)=count(following-sibling::*)]]" priority="2"><msup><x:apply-templates select="*[2]"><x:with-param name="p" select="5"/></x:apply-templates><mn><x:value-of select="count(*)-1"/></mn></msup></x:template><x:template name="sum" match="m:apply[*[1][self::m:sum]]"><x:param name="mo"><mo>∑<!--sum--></mo></x:param><mrow><munderover><x:copy-of select="$mo"/><mrow><x:apply-templates select="m:lowlimit|m:interval/*[1]|m:condition/*|m:domainofapplication/*"/></mrow><mrow><x:apply-templates select="m:uplimit/*|m:interval/*[2]"/></mrow></munderover><x:apply-templates select="*[last()]"/></mrow></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'sum\']]"><mrow><munder><mo>∑<!--sum--></mo><x:apply-templates select="*[2]"/></munder><x:apply-templates select="*[last()]"/></mrow></x:template><x:template match="m:apply/m:lowlimit" priority="3"><mrow><x:if test="../m:bvar"><x:apply-templates select="../m:bvar/node()"/><mo>=</mo></x:if><x:apply-templates/></mrow></x:template><x:template match="m:apply[*[1][self::m:product]]"><x:call-template name="sum"><x:with-param name="mo"><mo>∏<!--product--></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'product\']]"><mrow><munder><mo>∏<!--product--></mo><x:apply-templates select="*[2]"/></munder><x:apply-templates select="*[last()]"/></mrow></x:template><x:template match="m:apply[*[1][self::m:limit]]"><mrow><munder><mi>lim</mi><mrow><x:apply-templates select="m:lowlimit|m:condition/*"/></mrow></munder><x:apply-templates select="*[last()]"/></mrow></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'limit\']][m:bind]"><mrow><munder><mi>lim</mi><mrow><x:apply-templates select="m:bind/m:bvar/*"/><mo><x:choose><x:when test="*[3]=\'above\'">↘<!--searrow--></x:when><x:when test="*[3]=\'below\'">↗<!--nearrow--></x:when><x:otherwise>→<!--rightarrow--></x:otherwise></x:choose></mo><x:apply-templates select="*[2]"/></mrow></munder><x:apply-templates select="m:bind/*[last()]"/></mrow></x:template><x:template match="m:apply[m:limit]/m:lowlimit" priority="4"><mrow><x:apply-templates select="../m:bvar/node()"/><mo>→<!--rightarrow--></mo><x:apply-templates/></mrow></x:template><x:template match="m:apply[*[1][self::m:tendsto]]|m:reln[*[1][self::m:tendsto]]"><x:param name="p"/><x:call-template name="binary"><x:with-param name="this-p" select="2"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo><x:choose><x:when test="@type=\'above\'">↘<!--searrow--></x:when><x:when test="@type=\'below\'">↗<!--nearrow--></x:when><x:when test="@type=\'two-sided\'">→<!--rightarrow--></x:when><x:otherwise>→<!--rightarrow--></x:otherwise></x:choose></mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'tendsto\']]"><mrow><x:apply-templates select="*[3]"/><mo><x:choose><x:when test="*[1][self::above]">↘<!--searrow--></x:when><x:when test="*[1][self::below]">↗<!--nearrow--></x:when><x:when test="*[1][self::two-sided]">→<!--rightarrow--></x:when><x:otherwise>→<!--rightarrow--></x:otherwise></x:choose></mo><x:apply-templates select="*[4]"/></mrow></x:template><x:template match="m:apply[*[1][self::m:semantics/m:ci=\'tendsto\']]"><mrow><x:apply-templates select="*[2]"/><mo>→<!--rightarrow--></mo><x:apply-templates select="*[3]"/></mrow></x:template><x:template match="m:tendsto"><mi>tendsto</mi></x:template><x:template match="m:apply[*[1][ self::m:sin or self::m:cos or self::m:tan or self::m:sec or self::m:csc or self::m:cot or self::m:sinh or self::m:cosh or self::m:tanh or self::m:sech or self::m:csch or self::m:coth or self::m:arcsin or self::m:arccos or self::m:arctan or self::m:arccosh or self::m:arccot or self::m:arccoth or self::m:arccsc or self::m:arccsch or self::m:arcsec or self::m:arcsech or self::m:arcsinh or self::m:arctanh or self::m:ln]]"><mrow><mi><x:value-of select="local-name(*[1])"/></mi><mo>⁡<!--function application--></mo><x:if test="m:apply"><mo>(</mo></x:if><x:apply-templates select="*[2]"/><x:if test="m:apply"><mo>)</mo></x:if></mrow></x:template><x:template match=" m:sin | m:cos | m:tan | m:sec | m:csc | m:cot | m:sinh | m:cosh | m:tanh | m:sech | m:csch | m:coth | m:arcsin | m:arccos | m:arctan | m:arccosh | m:arccot | m:arccoth | m:arccsc | m:arccsch | m:arcsec | m:arcsech | m:arcsinh | m:arctanh | m:ln|m:mean| m:plus|m:minus"><mi><x:value-of select="local-name()"/></mi></x:template><x:template match="m:apply[*[1][self::m:exp]] |m:apply[*[1][self::m:csymbol=\'exp\']]"><msup><mi>e<!-- exponential e--></mi><mrow><x:apply-templates select="*[2]"/></mrow></msup></x:template><x:template match="m:apply[*[1][self::m:log]] |m:apply[*[1][self::m:csymbol=\'log\']]"><mrow><x:choose><x:when test="not(m:logbase) or m:logbase=10"><mi>log</mi></x:when><x:otherwise><msub><mi>log</mi><mrow><x:apply-templates select="m:logbase/node()"/></mrow></msub></x:otherwise></x:choose><mo>⁡<!--function application--></mo><x:apply-templates select="*[last()]"><x:with-param name="p" select="7"/></x:apply-templates></mrow></x:template><x:template match="m:apply[*[1][self::m:mean]] |m:apply[*[1][self::m:csymbol=\'mean\']]"><mrow><mo>〈<!--langle--></mo><x:for-each select="*[position()>1]"><x:apply-templates select="."/><x:if test="position() !=last()"><mo>,</mo></x:if></x:for-each><mo>〉<!--rangle--></mo></mrow></x:template><x:template match="m:sdev|m:csymbol[.=\'sdev\']"><mo>σ<!--sigma--></mo></x:template><x:template match="m:apply[*[1][self::m:variance]] |m:apply[*[1][self::m:csymbol=\'variance\']]"><msup><mrow><mo>σ<!--sigma--></mo><mo>⁡<!--function application--></mo><mfenced><x:apply-templates select="*[position()!=1]"/></mfenced></mrow><mn>2</mn></msup></x:template><x:template match="m:median"><mi>median</mi></x:template><x:template match="m:mode"><mi>mode</mi></x:template><x:template match="m:apply[*[1][self::m:moment]]"><mrow><mo>〈<!--langle--></mo><msup><x:variable name="data" select="*[not(position()=1)] [not(self::m:degree or self::m:momentabout)]"/><x:choose><x:when test="$data[2]"><mfenced><x:apply-templates select="$data"/></mfenced></x:when><x:otherwise><x:apply-templates select="$data"/></x:otherwise></x:choose><mrow><x:apply-templates select="m:degree/node()"/></mrow></msup><mo>〉<!--rangle--></mo></mrow></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'moment\']]"><msub><mrow><mo>〈<!--langle--></mo><msup><x:apply-templates select="*[4]"/><x:apply-templates select="*[2]"/></msup><mo>〉<!--rangle--></mo></mrow><x:apply-templates select="*[3]"/></msub></x:template><x:template match="m:momentabout"/><x:template match="m:apply[*[1][self::m:moment]][m:momentabout]" priority="2"><msub><mrow><mo>〈<!--langle--></mo><msup><x:variable name="data" select="*[not(position()=1)] [not(self::m:degree or self::m:momentabout)]"/><x:choose><x:when test="$data[2]"><mfenced><x:apply-templates select="$data"/></mfenced></x:when><x:otherwise><x:apply-templates select="$data"/></x:otherwise></x:choose><mrow><x:apply-templates select="m:degree/node()"/></mrow></msup><mo>〉<!--rangle--></mo></mrow><mrow><x:apply-templates select="m:momentabout/*"/></mrow></msub></x:template><x:template match="m:vector"><mrow><mo>(</mo><mtable><x:for-each select="*"><mtr><mtd><x:apply-templates select="."/></mtd></mtr></x:for-each></mtable><mo>)</mo></mrow></x:template><x:template match="m:vector[m:condition]"><mrow><mo>[</mo><x:apply-templates select="*[last()]"/><mo>|</mo><x:apply-templates select="m:condition"/><mo>]</mo></mrow></x:template><x:template match="m:vector[m:domainofapplication]"><mrow><mo>[</mo><x:apply-templates select="*[last()]"/><mo>|</mo><x:apply-templates select="m:bvar/*"/><mo>∈</mo><x:apply-templates select="m:domainofapplication/*"/><mo>]</mo></mrow></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'vector\']]"><mrow><mo>(</mo><mtable><x:for-each select="*[position()!=1]"><mtr><mtd><x:apply-templates select="."/></mtd></mtr></x:for-each></mtable><mo>)</mo></mrow></x:template><x:template match="m:matrix"><mrow><mo>(</mo><mtable><x:apply-templates/></mtable><mo>)</mo></mrow></x:template><x:template match="m:matrix[m:condition]"><mrow><mo>[</mo><msub><mi>m</mi><mrow><x:for-each select="m:bvar"><x:apply-templates/><x:if test="position()!=last()"><mo>,</mo></x:if></x:for-each></mrow></msub><mo>|</mo><mrow><msub><mi>m</mi><mrow><x:for-each select="m:bvar"><x:apply-templates/><x:if test="position()!=last()"><mo>,</mo></x:if></x:for-each></mrow></msub><mo>=</mo><x:apply-templates select="*[last()]"/></mrow><mo>;</mo><x:apply-templates select="m:condition"/><mo>]</mo></mrow></x:template><x:template match="m:apply[*[1][self::m:csymbol=\'matrix\']]"><mrow><mo>(</mo><mtable><x:apply-templates select="*[position()!=1]"/></mtable><mo>)</mo></mrow></x:template><x:template match="m:matrix/m:matrixrow"><mtr><x:for-each select="*"><mtd><x:apply-templates select="."/></mtd></x:for-each></mtr></x:template><x:template match="m:matrixrow"><mtable><mtr><x:for-each select="*"><mtd><x:apply-templates select="."/></mtd></x:for-each></mtr></mtable></x:template><x:template match="m:apply[*[1][self::m:csymbol.=\'matrixrow\']]"><mtr><x:for-each select="*[position()!=1]"><mtd><x:apply-templates select="."/></mtd></x:for-each></mtr></x:template><x:template match="m:apply[*[1][self::m:determinant]] |m:apply[*[1][self::m:csymbol=\'determinant\']]"><mrow><mi>det</mi><mo>⁡<!--function application--></mo><x:apply-templates select="*[2]"><x:with-param name="p" select="7"/></x:apply-templates></mrow></x:template><x:template match="m:apply[*[1][self::m:determinant]][*[2][self::m:matrix]]" priority="2"><mrow><mo>|</mo><mtable><x:apply-templates select="m:matrix/*"/></mtable><mo>|</mo></mrow></x:template><x:template match="m:apply[*[1][self::m:transpose]] |m:apply[*[1][self::m:csymbol=\'transpose\']]"><msup><x:apply-templates select="*[2]"><x:with-param name="p" select="7"/></x:apply-templates><mi>T</mi></msup></x:template><x:template match="m:apply[*[1][self::m:selector]] |m:apply[*[1][self::m:csymbol=\'selector\']]"><msub><x:apply-templates select="*[2]"><x:with-param name="p" select="7"/></x:apply-templates><mrow><x:for-each select="*[position()>2]"><x:apply-templates select="."/><x:if test="position() !=last()"><mo>,</mo></x:if></x:for-each></mrow></msub></x:template><x:template match="m:apply[*[1][self::m:scalarproduct]] |m:apply[*[1][self::m:csymbol=\'scalarproduct\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="2"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>.</mo></x:with-param></x:call-template></x:template><x:template match="m:apply[*[1][self::m:outerproduct]] |m:apply[*[1][self::m:csymbol=\'outerproduct\']]"><x:param name="p" select="0"/><x:call-template name="infix"><x:with-param name="this-p" select="2"/><x:with-param name="p" select="$p"/><x:with-param name="mo"><mo>⊗</mo></x:with-param></x:call-template></x:template><x:template match="m:semantics"><x:apply-templates select="*[1]"/></x:template><x:template match="m:semantics[m:annotation-xml/@encoding=\'MathML-Presentation\']"><x:apply-templates select="m:annotation-xml[@encoding=\'MathML-Presentation\']/node()"/></x:template><x:template match="m:integers"><mi mathvariant="double-struck">Z</mi></x:template><x:template match="m:reals"><mi mathvariant="double-struck">R</mi></x:template><x:template match="m:rationals"><mi mathvariant="double-struck">Q</mi></x:template><x:template match="m:naturalnumbers"><mi mathvariant="double-struck">N</mi></x:template><x:template match="m:complexes"><mi mathvariant="double-struck">C</mi></x:template><x:template match="m:primes"><mi mathvariant="double-struck">P</mi></x:template><x:template match="m:exponentiale"><mi>e<!-- exponential e--></mi></x:template><x:template match="m:imaginaryi"><mi>i<!-- imaginary i--></mi></x:template><x:template match="m:notanumber"><mi>NaN</mi></x:template><x:template match="m:true"><mi>true</mi></x:template><x:template match="m:false"><mi>false</mi></x:template><x:template match="m:emptyset|m:csymbol[.=\'emptyset\']"><mi>∅<!-- emptyset --></mi></x:template><x:template match="m:pi|m:csymbol[.=\'pi\']"><mi>π<!-- pi --></mi></x:template><x:template match="m:eulergamma|m:csymbol[.=\'gamma\']"><mi>γ<!-- gamma --></mi></x:template><x:template match="m:infinity|m:csymbol[.=\'infinity\']"><mi>∞<!-- infinity --></mi></x:template><x:template name="infix" ><x:param name="mo"/><x:param name="p" select="0"/><x:param name="this-p" select="0"/><x:variable name="dmo"><x:choose><x:when test="m:domainofapplication"><munder><x:copy-of select="$mo"/><mrow><x:apply-templates select="m:domainofapplication/*"/></mrow></munder></x:when><x:otherwise><x:copy-of select="$mo"/></x:otherwise></x:choose></x:variable><mrow><x:if test="$this-p < $p"><mo>(</mo></x:if><x:for-each select="*[not(self::m:domainofapplication)][position()>1]"><x:if test="position() > 1"><x:copy-of select="$dmo"/></x:if><x:apply-templates select="."><x:with-param name="p" select="$this-p"/></x:apply-templates></x:for-each><x:if test="$this-p < $p"><mo>)</mo></x:if></mrow></x:template><x:template name="binary" ><x:param name="mo"/><x:param name="p" select="0"/><x:param name="this-p" select="0"/><mrow><x:if test="($this-p < $p) or ($this-p=$p and $mo=\'−\')"><mo>(</mo></x:if><x:apply-templates select="*[2]"><x:with-param name="p" select="$this-p"/></x:apply-templates><x:copy-of select="$mo"/><x:apply-templates select="*[3]"><x:with-param name="p" select="$this-p"/></x:apply-templates><x:if test="($this-p < $p) or ($this-p=$p and $mo=\'−\')"><mo>)</mo></x:if></mrow></x:template><x:template name="set" ><x:param name="o" select="\'{\'"/><x:param name="c" select="\'}\'"/><mrow><mo><x:value-of select="$o"/></mo><x:choose><x:when test="m:condition"><mrow><x:apply-templates select="m:condition/following-sibling::*"/></mrow><mo>|</mo><mrow><x:apply-templates select="m:condition/node()"/></mrow></x:when><x:when test="m:domainofapplication"><mrow><x:apply-templates select="m:domainofapplication/following-sibling::*"/></mrow><mo>|</mo><mrow><x:apply-templates select="m:bvar/node()"/></mrow><mo>∈<!-- in --></mo><mrow><x:apply-templates select="m:domainofapplication/node()"/></mrow></x:when><x:otherwise><x:for-each select="*[not(position()=1 and parent::m:apply)]"><x:apply-templates select="."/><x:if test="position() !=last()"><mo>,</mo></x:if></x:for-each></x:otherwise></x:choose><mo><x:value-of select="$c"/></mo></mrow></x:template><x:template match="m:cs"><ms><x:value-of select=" translate(., \'	  \', \'    \')"/></ms></x:template><x:template match="m:cbytes"><mrow/></x:template><x:template match="m:cerror"><merror><x:apply-templates/></merror></x:template><x:template match="m:share" priority="4"><mi href="{@href}">share<x:value-of select="substring-after(@href,\'#\')"/></mi></x:template><x:output indent="yes" omit-xml-declaration="yes"/><x:template match="*"><x:copy><x:copy-of select="@*"/><x:apply-templates/></x:copy></x:template><x:template match="*[@dir=\'rtl\']" priority="10"><x:apply-templates mode="rtl" select="."/></x:template><x:template match="@*" mode="rtl"><x:copy-of select="."/></x:template><x:template match="*" mode="rtl"><x:copy><x:apply-templates select="@*" mode="rtl"/><x:for-each select="node()"><x:sort data-type="number" order="descending" select="position()"/><x:text></x:text><x:apply-templates mode="rtl" select="."/></x:for-each></x:copy></x:template><x:template match="@open" mode="rtl"><x:attribute name="close"><x:value-of select="."/></x:attribute></x:template><x:template match="@open[.=\'(\']" mode="rtl"><x:attribute name="close">)</x:attribute></x:template><x:template match="@open[.=\')\']" mode="rtl"><x:attribute name="close">(</x:attribute></x:template><x:template match="@open[.=\'[\']" mode="rtl"><x:attribute name="close">]</x:attribute></x:template><x:template match="@open[.=\']\']" mode="rtl"><x:attribute name="close">[</x:attribute></x:template><x:template match="@open[.=\'{\']" mode="rtl"><x:attribute name="close">}</x:attribute></x:template><x:template match="@open[.=\'}\']" mode="rtl"><x:attribute name="close">{</x:attribute></x:template><x:template match="@close" mode="rtl"><x:attribute name="open"><x:value-of select="."/></x:attribute></x:template><x:template match="@close[.=\'(\']" mode="rtl"><x:attribute name="open">)</x:attribute></x:template><x:template match="@close[.=\')\']" mode="rtl"><x:attribute name="open">(</x:attribute></x:template><x:template match="@close[.=\'[\']" mode="rtl"><x:attribute name="open">]</x:attribute></x:template><x:template match="@close[.=\']\']" mode="rtl"><x:attribute name="open">[</x:attribute></x:template><x:template match="@close[.=\'{\']" mode="rtl"><x:attribute name="open">}</x:attribute></x:template><x:template match="@close[.=\'}\']" mode="rtl"><x:attribute name="open">{</x:attribute></x:template><x:template match="m:mfrac[@bevelled=\'true\']" mode="rtl"><mrow><msub><mi></mi><x:apply-templates select="*[2]" mode="rtl"/></msub><mo>\</mo><msup><mi></mi><x:apply-templates select="*[1]" mode="rtl"/></msup></mrow></x:template><x:template match="m:mfrac" mode="rtl"><x:copy><x:apply-templates mode="rtl" select="@*|*"/></x:copy></x:template><x:template match="m:mroot" mode="rtl"><msup><menclose notation="top right"><x:apply-templates mode="rtl" select="@*|*[1]"/></menclose><x:apply-templates mode="rtl" select="*[2]"/></msup></x:template><x:template match="m:msqrt" mode="rtl"><menclose notation="top right"><x:apply-templates mode="rtl" select="@*|*[1]"/></menclose></x:template><x:template match="m:mtable|m:munder|m:mover|m:munderover" mode="rtl" priority="2"><x:copy><x:apply-templates select="@*" mode="rtl"/><x:apply-templates mode="rtl"></x:apply-templates></x:copy></x:template><x:template match="m:msup" mode="rtl" priority="2"><mmultiscripts><x:apply-templates select="*[1]" mode="rtl"/><mprescripts/><none/><x:apply-templates select="*[2]" mode="rtl"/></mmultiscripts></x:template><x:template match="m:msub" mode="rtl" priority="2"><mmultiscripts><x:apply-templates select="*[1]" mode="rtl"/><mprescripts/><x:apply-templates select="*[2]" mode="rtl"/><none/></mmultiscripts></x:template><x:template match="m:msubsup" mode="rtl" priority="2"><mmultiscripts><x:apply-templates select="*[1]" mode="rtl"/><mprescripts/><x:apply-templates select="*[2]" mode="rtl"/><x:apply-templates select="*[3]" mode="rtl"/></mmultiscripts></x:template><x:template match="m:mmultiscripts" mode="rtl" priority="2"><mmultiscripts><x:apply-templates select="*[1]" mode="rtl"/><x:for-each select="m:mprescripts/following-sibling::*[position() mod 2 = 1]"><x:sort data-type="number" order="descending" select="position()"/><x:apply-templates select="." mode="rtl"/><x:apply-templates select="following-sibling::*[1]" mode="rtl"/></x:for-each><mprescripts/><x:for-each select="m:mprescripts/preceding-sibling::*[position()!=last()][position() mod 2 = 0]"><x:sort data-type="number" order="descending" select="position()"/><x:apply-templates select="." mode="rtl"/><x:apply-templates select="following-sibling::*[1]" mode="rtl"/></x:for-each></mmultiscripts></x:template><x:template match="m:mmultiscripts[not(m:mprescripts)]" mode="rtl" priority="3"><mmultiscripts><x:apply-templates select="*[1]" mode="rtl"/><mprescripts/><x:for-each select="*[position() mod 2 = 0]"><x:sort data-type="number" order="descending" select="position()"/><x:apply-templates select="." mode="rtl"/><x:apply-templates select="following-sibling::*[1]" mode="rtl"/></x:for-each></mmultiscripts></x:template><x:template match="text()[.=\'(\']" mode="rtl">)</x:template><x:template match="text()[.=\')\']" mode="rtl">(</x:template><x:template match="text()[.=\'{\']" mode="rtl">}</x:template><x:template match="text()[.=\'}\']" mode="rtl">{</x:template><x:template match="text()[.=\'<\']" mode="rtl">></x:template><x:template match="text()[.=\'>\']" mode="rtl"><</x:template><x:template match="text()[.=\'∈\']" mode="rtl">∋</x:template><x:template match="text()[.=\'∋\']" mode="rtl">∈</x:template><x:template match="@notation[.=\'radical\']" mode="rtl"><x:attribute name="notation">top right</x:attribute></x:template><x:template name="mml2attrib"><!-- <x:copy-of select="@*[not(local-name()=\'href\')]"/> --><x:copy-of select="@*[not(local-name()=\'href\')]"/><x:attribute name="style"><x:if test="@style"><x:value-of select="@style"/>;</x:if><x:if test="@mathcolor">color:<x:value-of select="@mathcolor"/>;</x:if><x:if test="@mathbackground">background-color:<x:value-of select="@mathbackground"/>;</x:if></x:attribute></x:template><!-- <x:template match="*[@href]" priority="3"><a xmlns="http://www.w3.org/1999/xhtml" style="text-decoration: none" href="{@href}"><x:copy><x:call-template name="mml2attrib"/><x:attribute name="class"><x:text>mmlhref </x:text><x:value-of select="@class"/></x:attribute><x:apply-templates/></x:copy></a></x:template> --><x:template match="*[@mathcolor|@mathbackground]"><x:copy><x:call-template name="mml2attrib"/><x:apply-templates/></x:copy></x:template><x:param name="hascolspan" select="true()"/><x:template match="m:mstack"><mtable columnspacing="0em"><x:variable name="t"><x:apply-templates select="*" mode="mstack1"><x:with-param name="p" select="0"/></x:apply-templates></x:variable><x:variable name="maxl"><x:for-each select="c:node-set($t)/*/@l"><x:sort data-type="number" order="descending"/><x:if test="position()=1"><x:value-of select="."/></x:if></x:for-each></x:variable><x:for-each select="c:node-set($t)/*[not(@class=\'mscarries\') or following-sibling::*[1]/@class=\'mscarries\']"><x:variable name="c" select="preceding-sibling::*[1][@class=\'mscarries\']"/><x:text> </x:text><mtr><x:variable name="offset" select="$maxl - @l"/><x:choose><x:when test="$hascolspan and @class=\'msline\' and (string(*[1]/@columnspan)=\'\' or string(*[1]/@columnspan)=\'0\')"><mtd columnspan="{$maxl}"><x:copy-of select="*/@style"/></mtd></x:when><x:when test="@class=\'msline\' and @l=\'*\'"><x:variable name="msl" select="*[1]"/><x:for-each select="(//node())[position()<=$maxl]"><x:copy-of select="$msl"/></x:for-each></x:when><x:when test="$c"><x:variable name="ldiff" select="$c/@l - @l"/><x:variable name="loffset" select="$maxl - $c/@l"/><x:for-each select="(//*)[position()<= $offset]"><x:variable name="pn" select="position()"/><x:variable name="cy" select="$c/*[position()=$pn - $loffset]"/> <mtd> <x:if test="$cy/*"/> <mover><mphantom><mn>0</mn></mphantom><mpadded width="0em" lspace="-0.5width"><x:copy-of select="$cy/*/*"/></mpadded></mover> </mtd></x:for-each><x:for-each select="*"><x:variable name="pn" select="position()"/><x:variable name="cy" select="$c/*[position()=$pn + $ldiff]"/><x:copy> <x:copy-of select="@*"/> <x:variable name="b"> <x:choose> <x:when test="not(string($cy/@crossout) or $cy/@crossout=\'none\')"><x:copy-of select="*"/></x:when> <x:otherwise> <menclose notation="{$cy/@crossout}"><x:copy-of select="*"/></menclose> </x:otherwise> </x:choose> </x:variable> <x:choose> <x:when test="$cy/*/m:none or not($cy/*/*)"><x:copy-of select="$b"/></x:when> <x:when test="not(string($cy/@location)) or $cy/@location=\'n\'"> <mover><x:copy-of select="$b"/><mpadded width="0em" lspace="-0.5width"><x:copy-of select="$cy/*/*"/></mpadded></mover> </x:when> <x:when test="$cy/@location=\'nw\'"> <mmultiscripts><x:copy-of select="$b"/><mprescripts/><none/><mpadded lspace="-1width" width="0em"><x:copy-of select="$cy/*/*"/></mpadded></mmultiscripts> </x:when> <x:when test="$cy/@location=\'s\'"> <munder><x:copy-of select="$b"/><mpadded width="0em" lspace="-0.5width"><x:copy-of select="$cy/*/*"/></mpadded></munder> </x:when> <x:when test="$cy/@location=\'sw\'"> <mmultiscripts><x:copy-of select="$b"/><mprescripts/><mpadded lspace="-1width" width="0em"><x:copy-of select="$cy/*/*"/></mpadded><none/></mmultiscripts> </x:when> <x:when test="$cy/@location=\'ne\'"> <msup><x:copy-of select="$b"/><mpadded width="0em"><x:copy-of select="$cy/*/*"/></mpadded></msup> </x:when> <x:when test="$cy/@location=\'se\'"> <msub><x:copy-of select="$b"/><mpadded width="0em"><x:copy-of select="$cy/*/*"/></mpadded></msub> </x:when> <x:when test="$cy/@location=\'w\'"> <msup><mrow/><mpadded lspace="-1width" width="0em"><x:copy-of select="$cy/*/*"/></mpadded></msup> <x:copy-of select="$b"/> </x:when> <x:when test="$cy/@location=\'e\'"> <x:copy-of select="$b"/> <msup><mrow/><mpadded width="0em"><x:copy-of select="$cy/*/*"/></mpadded></msup> </x:when> <x:otherwise> <x:copy-of select="$b"/> </x:otherwise> </x:choose></x:copy></x:for-each></x:when><x:otherwise><x:for-each select="(//*)[position()<= $offset]"><mtd/></x:for-each><x:copy-of select="*"/></x:otherwise></x:choose></mtr></x:for-each></mtable></x:template><x:template mode="mstack1" match="*"><x:param name="p"/><x:param name="maxl" select="0"/><mtr l="{1 + $p}"><x:if test="ancestor::mstack[1]/@stackalign=\'left\'"><x:attribute name="l"><x:value-of select="$p"/></x:attribute></x:if><mtd><x:apply-templates select="."/></mtd></mtr></x:template><x:template mode="mstack1" match="m:msrow"><x:param name="p"/><x:param name="maxl" select="0"/><x:variable name="align1" select="ancestor::m:mstack[1]/@stackalign"/><x:variable name="align"><x:choose><x:when test="string($align1)=\'\'">decimalpoint</x:when><x:otherwise><x:value-of select="$align1"/></x:otherwise></x:choose></x:variable><x:variable name="row"><x:apply-templates mode="mstack1" select="*"><x:with-param name="p" select="0"/></x:apply-templates></x:variable><x:text> </x:text><x:variable name="l1"><x:choose><x:when test="$align=\'decimalpoint\' and m:mn"><x:for-each select="c:node-set($row)/m:mtr[m:mtd/m:mn][1]"><x:value-of select="number(sum(@l))+count(preceding-sibling::*/@l)"/></x:for-each></x:when><x:when test="$align=\'right\' or $align=\'decimalpoint\'"><x:value-of select="count(c:node-set($row)/m:mtr/m:mtd)"/></x:when><x:otherwise><x:value-of select="0"/></x:otherwise></x:choose></x:variable><mtr class="msrow" l="{number($l1) + number(sum(@position)) +$p}"><x:copy-of select="c:node-set($row)/m:mtr/*"/></mtr></x:template><x:template mode="mstack1" match="m:mn"><x:param name="p"/><x:variable name="align1" select="ancestor::m:mstack[1]/@stackalign"/><x:variable name="dp1" select="ancestor::*[@decimalpoint][1]/@decimalpoint"/><x:variable name="align"><x:choose><x:when test="string($align1)=\'\'">decimalpoint</x:when><x:otherwise><x:value-of select="$align1"/></x:otherwise></x:choose></x:variable><x:variable name="dp"><x:choose><x:when test="string($dp1)=\'\'">.</x:when><x:otherwise><x:value-of select="$dp1"/></x:otherwise></x:choose></x:variable><mtr l="$p"><x:variable name="mn" select="normalize-space(.)"/><x:variable name="len" select="string-length($mn)"/><x:choose><x:when test="$align=\'right\' or ($align=\'decimalpoint\' and not(contains($mn,$dp)))"><x:attribute name="l"><x:value-of select="$p + $len"/></x:attribute></x:when><x:when test="$align=\'decimalpoint\'"><x:attribute name="l"><x:value-of select="$p + string-length(substring-before($mn,$dp))"/></x:attribute></x:when></x:choose><x:for-each select="(//node())[position() <=$len]"><x:variable name="pos" select="position()"/><mtd><mn><x:value-of select="substring($mn,$pos,1)"/></mn></mtd></x:for-each></mtr></x:template><x:template match="m:msgroup" mode="mstack1"><x:param name="p"/><x:variable name="s" select="number(sum(@shift))"/><x:variable name="thisp" select="number(sum(@position))"/><x:for-each select="*"><x:apply-templates mode="mstack1" select="."><x:with-param name="p" select="number($p)+$thisp+(position()-1)*$s"/></x:apply-templates></x:for-each></x:template><x:template match="m:msline" mode="mstack1"><x:param name="p"/><x:variable name="align1" select="ancestor::m:mstack[1]/@stackalign"/><x:variable name="align"><x:choose><x:when test="string($align1)=\'\'">decimalpoint</x:when><x:otherwise><x:value-of select="$align1"/></x:otherwise></x:choose></x:variable><mtr class="msline"><x:attribute name="l"><x:choose><x:when test="not(string(@length)) or @length=0">*</x:when><x:when test="string($align)=\'right\' or string($align)=\'decimalpoint\' "><x:value-of select="$p+ @length"/></x:when><x:otherwise><x:value-of select="$p"/></x:otherwise></x:choose></x:attribute><x:variable name="w"><x:choose><x:when test="@mslinethickness=\'thin\'">0.1em</x:when><x:when test="@mslinethickness=\'medium\'">0.15em</x:when><x:when test="@mslinethickness=\'thick\'">0.2em</x:when><x:when test="@mslinethickness"><x:value-of select="@mslinethickness"/></x:when><x:otherwise>0.15em</x:otherwise></x:choose></x:variable><x:choose><x:when test="$hascolspan"><mtd class="msline" columnspan="{@length}"><x:copy-of select="@position"/><x:attribute name="style"><x:value-of select="concat(\'border-style: solid; border-width: 0 0 \',$w,\' 0\')"/></x:attribute></mtd></x:when><x:when test="not(string(@length)) or @length=0"><mtd class="mslinemax"><mpadded lspace="-0.5em" width="0em" height="0em"><mfrac linethickness="{$w}"><mspace width="1em"/><mrow/></mfrac></mpadded></mtd></x:when><x:otherwise><x:variable name="l" select="@length"/><x:for-each select="(//node())[position()<=$l]"><mtd class="msline"><mpadded lspace="-0.5em" width="0em" height="0em"><mfrac linethickness="{$w}"> <mspace width="1em"/> <mrow/></mfrac></mpadded></mtd></x:for-each></x:otherwise></x:choose></mtr></x:template><x:template match="m:mscarries" mode="mstack1"><x:param name="p"/><x:variable name="align1" select="ancestor::m:mstack[1]/@stackalign"/><x:variable name="l1"><x:choose><x:when test="string($align1)=\'left\'">0</x:when><x:otherwise><x:value-of select="count(*)"/></x:otherwise></x:choose></x:variable><mtr class="mscarries" l="{$p + $l1 + sum(@position)}"><x:apply-templates select="*" mode="msc"/></mtr></x:template><x:template match="*" mode="msc"><mtd><x:copy-of select="../@location|../@crossout"/><mstyle mathsize="70%"><x:apply-templates select="."/></mstyle></mtd></x:template><x:template match="m:mscarry" mode="msc"><mtd><x:copy-of select="@location|@crossout"/><mstyle mathsize="70%"><x:apply-templates select="*"/></mstyle></mtd></x:template><x:template match="m:mlongdiv"><x:variable name="ms"><mstack><x:copy-of select="(ancestor-or-self::*/@decimalpoint)[last()]"/><x:choose><x:when test="@longdivstyle=\'left/\right\'"><msrow><mrow><x:copy-of select="*[1]"/></mrow><mo>/</mo><x:copy-of select="*[3]"/><mo>\</mo><x:copy-of select="*[2]"/></msrow></x:when><x:when test="@longdivstyle=\'left)(right\'"><msrow><mrow><x:copy-of select="*[1]"/></mrow><mo>)</mo><x:copy-of select="*[3]"/><mo>(</mo><x:copy-of select="*[2]"/></msrow></x:when><x:when test="@longdivstyle=\':right=right\'"><msrow><x:copy-of select="*[3]"/><mo>:</mo><x:copy-of select="*[1]"/><mo>=</mo><x:copy-of select="*[2]"/></msrow></x:when><x:otherwise><x:copy-of select="*[2]"/><msline length="{string-length(*[3])}"/><msrow><mrow><x:copy-of select="*[1]"/></mrow><mo>)</mo><x:copy-of select="*[3]"/></msrow></x:otherwise></x:choose><x:copy-of select="*[position()>3]"/></mstack></x:variable><x:apply-templates select="c:node-set($ms)"/></x:template><x:template match="m:menclose[@notation=\'madruwb\']" mode="rtl"><menclose notation="bottom right"><x:apply-templates mode="rtl"/></menclose></x:template></x:stylesheet>';
- /*
- * End of ctop.xsl amd mml3mml2.csl material.
+ CToP.tokens = {
+ "ci": function(parentNode,contentMMLNode,precedence) {
+ if(contentMMLNode.childNodes.length==1 && contentMMLNode.childNodes[0].nodeType==document.TEXT_NODE) {
+ var mi = CToP.appendToken(parentNode,'mi',contentMMLNode.textContent);
+ var type = contentMMLNode.getAttribute('type');
+ if(type in CToP.cistyles) {
+ mi.setAttribute('mathvariant',CToP.cistyles[type]);
+ }
+ } else {
+ CToP.token('mi')(parentNode,contentMMLNode,precedence);
+ }
+ },
+ "cs": CToP.token('ms'),
+
+ "csymbol": function(parentNode,contentMMLNode,precedence) {
+ var cd = contentMMLNode.getAttribute('cd');
+ if(cd && CToP.contentDictionaries[cd]) {
+ CToP.contentDictionaries[cd](parentNode,contentMMLNode,precedence);
+ } else if(CToP.symbols[name]){
+ CToP.appendToken(parentNode,'mi',CToP.symbols[name]);
+ } else {
+ CToP.tokens['ci'](parentNode,contentMMLNode);
+ }
+ },
+ "fn": function(parentNode,contentMMLNode,precedence) {
+ CToP.applyTransform(parentNode,CToP.children(contentMMLNode)[0],precedence);
+ },
+
+ "naturalnumbers": CToP.identifier('\u2115'),
+ "integers": CToP.identifier('\u2124'),
+ "reals": CToP.identifier('\u211D'),
+ "rationals": CToP.identifier('\u211A'),
+ "complexes": CToP.identifier('\u2102'),
+ "primes": CToP.identifier('\u2119'),
+ "exponentiale": CToP.identifier('e'),
+ "imaginaryi": CToP.identifier('i'),
+ "notanumber": CToP.identifier('NaN'),
+ "eulergamma": CToP.identifier('\u03B3'),
+ "gamma": CToP.identifier('\u0263'),
+ "pi": CToP.identifier('\u03C0'),
+ "infinity": CToP.identifier('\u221E'),
+ "emptyset": CToP.identifier('\u2205'),
+ "true": CToP.identifier('true'),
+ "false": CToP.identifier('false'),
+ 'set': CToP.set('{','}'),
+ 'list': CToP.set('(',')')
+ }
+
+ CToP.tokens['interval'] = function(parentNode,contentMMLNode,precedence) {
+ var closure = contentMMLNode.getAttribute('closure');
+
+ var open, close;
+ switch(closure) {
+ case 'open':
+ open = '(';
+ close = ')';
+ break;
+ case 'open-closed':
+ open = '(';
+ close = ']';
+ break;
+ case 'closed-open':
+ open = '[';
+ close = ')';
+ break;
+ case 'closed':
+ default:
+ open = '[';
+ close = ']';
+ }
+
+ parentNode.appendChild(CToP.mfenced(CToP.children(contentMMLNode),open,close));
+ }
+ CToP.tokens['apply'] = CToP.tokens['reln'] = CToP.tokens['bind'] = function(parentNode,contentMMLNode,precedence) {
+ var children = CToP.classifyChildren(contentMMLNode);
+
+ var firstArg=children.args[0];
+ var args = children.args.slice(1), bvars = children.bvars, qualifiers = children.qualifiers;
+
+ if(firstArg) {
+ var name = firstArg.localName;
+ name = (name=="csymbol") ? firstArg.textContent.toLowerCase() : name;
+ if(CToP.applyTokens[name]) {
+ CToP.applyTokens[name](parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ } else {
+ CToP.fn(name)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ }
+ } else {
+ parentNode.appendChild(CToP.createElement('mrow'));
+ }
+ }
+
+ CToP.tokens['cn'] = function(parentNode,contentMMLNode,precedence) {
+ var type = contentMMLNode.getAttribute("type");
+ var base = contentMMLNode.getAttribute("base");
+ if(type || base) {
+ if(base) {
+ type = 'based-integer';
+ }
+ switch(type) {
+ case 'integer':
+ case 'real':
+ case 'double':
+ case 'constant':
+ CToP.token('mn')(parentNode,contentMMLNode);
+ break;
+ case 'hexdouble':
+ CToP.appendToken(parentNode,'mn','0x'+contentMMLNode.textContent);
+ break;
+ default:
+ var apply = CToP.createElement('apply');
+ var mrow = CToP.createElement('mrow');
+ var c = CToP.createElement(type);
+ apply.appendChild(c);
+ if(base) {
+ CToP.appendToken(apply,'mn',base);
+ }
+ for(var j=0;j<contentMMLNode.childNodes.length; j++ ) {
+ if (contentMMLNode.childNodes[j].nodeType==document.TEXT_NODE) {
+ CToP.appendToken(mrow,'cn',contentMMLNode.childNodes[j].textContent);
+ }else if (contentMMLNode.childNodes[j].localName=='sep'){
+ apply.appendChild(mrow);
+ mrow = CToP.createElement('mrow');
+ } else {
+ mrow.appendChild(contentMMLNode.childNodes[j].cloneNode(true));
+ }
+ }
+ apply.appendChild(mrow);
+ CToP.applyTransform(parentNode,apply,0);
+ }
+ } else {
+ CToP.token('mn')(parentNode,contentMMLNode);
+ }
+ }
+
+ CToP.tokens['vector'] = function(parentNode,contentMMLNode,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,'mo','(');
+
+ var mtable = CToP.createElement('mtable');
+ var children = CToP.children(contentMMLNode);
+ for(var i=0;i<children.length;i++) {
+ var mtr = CToP.createElement('mtr');
+ var mtd = CToP.createElement('mtd');
+ CToP.applyTransform(mtd,children[i],0);
+ mtr.appendChild(mtd);
+ mtable.appendChild(mtr);
+ }
+
+ mrow.appendChild(mtable);
+ CToP.appendToken(mrow,'mo',')');
+ parentNode.appendChild(mrow);
+ }
+
+ CToP.tokens['piecewise'] = function(parentNode,contentMMLNode,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,'mo','{');
+ var mtable = CToP.createElement('mtable');
+ mrow.appendChild(mtable);
+ var children = CToP.children(contentMMLNode);
+ for(var i=0;i<children.length;i++){
+ CToP.applyTransform(mtable,children[i],0);
+ }
+ parentNode.appendChild(mrow);
+ }
+
+ CToP.tokens['piece'] = function(parentNode,contentMMLNode,precedence) {
+ var mtr = CToP.createElement('mtr');
+ var children = CToP.children(contentMMLNode);
+ for(i=0;i<children.length;i++){
+ var mtd = CToP.createElement('mtd');
+ mtr.appendChild(mtd);
+ CToP.applyTransform(mtd,children[i],0);
+ if(i==0){
+ var mtd = CToP.createElement('mtd');
+ CToP.appendToken(mtd,"mtext","\u00A0if\u00A0");
+ mtr.appendChild(mtd);
+ }
+ }
+ parentNode.appendChild(mtr);
+ }
+
+ CToP.tokens['otherwise'] = function(parentNode,contentMMLNode,precedence) {
+ var mtr = CToP.createElement('mtr');
+ var children = CToP.children(contentMMLNode);
+ if(children.length){
+ var mtd = CToP.createElement('mtd');
+ mtr.appendChild(mtd);
+ CToP.applyTransform(mtd,children[0],0);
+ var mtd = CToP.createElement('mtd');
+ mtd.setAttribute('columnspan','2');
+ CToP.appendToken(mtd,"mtext","\u00A0otherwise");
+ mtr.appendChild(mtd);
+ }
+ parentNode.appendChild(mtr);
+ }
+
+ CToP.tokens['matrix'] = function(parentNode,contentMMLNode,precedence) {
+ var children = CToP.classifyChildren(contentMMLNode);
+ var args = children.args, bvars = children.bvars, qualifiers = children.qualifiers;
+
+ if(bvars.length || qualifiers.length) {
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,"mo","[");
+ var msub = CToP.createElement('msub');
+ CToP.appendToken(msub,'mi','m');
+ var mrow2 = CToP.createElement('mrow');
+ for(var i=0;i<bvars.length;i++){
+ if(i!=0){
+ CToP.appendToken(mrow2,'mo',',');
+ }
+ CToP.applyTransform(mrow2,bvars[i].childNodes[0],0);
+ }
+ msub.appendChild(mrow2);
+ mrow.appendChild(msub);
+ var msub2 = msub.cloneNode(true);
+ CToP.appendToken(mrow,'mo','|');
+ mrow.appendChild(msub2);
+ CToP.appendToken(mrow,'mo','=');
+ for(var i=0;i<args.length;i++){
+ if(i!=0){
+ CToP.appendToken(mrow,'mo',',');
+ }
+ CToP.applyTransform(mrow,args[i],0);
+ }
+ CToP.appendToken(mrow,'mo',';');
+ for(var i=0;i<qualifiers.length;i++){
+ if(i!=0){
+ CToP.appendToken(mrow,'mo',',');
+ }
+ CToP.applyTransform(mrow,qualifiers[i],0);
+ }
+ CToP.appendToken(mrow,'mo',']');
+ parentNode.appendChild(mrow);
+ } else {
+ var mfenced = CToP.createElement('mfenced');
+ var mtable = CToP.createElement('mtable');
+ for(var i=0;i<args.length;i++){
+ CToP.applyTransform(mtable,args[i],0);
+ }
+ mfenced.appendChild(mtable);
+ parentNode.appendChild(mfenced);
+ }
+ }
+
+ CToP.tokens['matrixrow'] = function(parentNode,contentMMLNode,precedence) {
+ var mtr = CToP.createElement('mtr');
+ var children = CToP.children(contentMMLNode);
+ for(var i=0;i<children.length;i++){
+ var mtd = CToP.createElement('mtd');
+ CToP.applyTransform(mtd,children[i],0);
+ mtr.appendChild(mtd);
+ }
+ parentNode.appendChild(mtr);
+ }
+
+ CToP.tokens['condition'] = function(parentNode,contentMMLNode,precedence) {
+ var mrow = CToP.createElement('mrow');
+ var children = CToP.children(contentMMLNode);
+ for(var i=0;i<children.length;i++){
+ CToP.applyTransform(mrow,children[i],0);
+ }
+ parentNode.appendChild(mrow);
+ }
+ CToP.tokens['lambda'] = function(parentNode,contentMMLNode,precedence) {
+ var firstArg = CToP.createElement('lambda');
+ var children = CToP.classifyChildren(contentMMLNode);
+ var args = children.args, bvars = children.bvars, qualifiers = children.qualifiers;
+
+ if(bvars.length){
+ CToP.applyTokens["lambda"](parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ } else {
+ var mrow=CToP.createElement('mrow');
+ for(var i=0;i<args.length;i++){
+ CToP.applyTransform(mrow,args[i],0);
+ }
+ if(qualifiers.length){
+ var msub = CToP.createElement('msub');
+ CToP.appendToken(msub,'mo','|');
+ var mrow2 = CToP.createElement('mrow');
+ for(var i=0;i<qualifiers.length;i++){
+ var children = CToP.children(qualifiers[i]);
+ for(var j=0;j<children.length;j++){
+ CToP.applyTransform(mrow2,children[j],0);
+ }
+ }
+ msub.appendChild(mrow2);
+ mrow.appendChild(msub);
+ }
+ parentNode.appendChild(mrow);
+ }
+ }
+ CToP.tokens["ident"] = function(parentNode,contentMMLNode,precedence) {
+ CToP.appendToken(parentNode,"mi","id")
+ }
+
+ CToP.tokens["domainofapplication"] = function(parentNode,contentMMLNode,precedence) {
+ var merror = CToP.createElement('merror');
+ CToP.appendToken(merror,'mtext','unexpected domainofapplication');
+ parentNode.appendChild(merror);
+ }
+
+ CToP.tokens["share"] = function(parentNode,contentMMLNode,precedence) {
+ var mi = CToP.createElement('mi');
+ mi.setAttribute('href',contentMMLNode.getAttribute('href'));
+ mi.textContent = "share" + contentMMLNode.getAttribute('href');
+ parentNode.appendChild(mi);
+ }
+
+ CToP.tokens["cerror"] = function(parentNode,contentMMLNode,precedence) {
+ var merror = CToP.createElement('merror');
+ var children = CToP.children(contentMMLNode);
+ for(var i=0;i<children.length;i++){
+ CToP.applyTransform(merror,children[i],0);
+ }
+ parentNode.appendChild(merror);
+ }
+
+ CToP.tokens["semantics"] = function(parentNode,contentMMLNode,precedence) {
+ var mrow = CToP.createElement('mrow');
+ var children = CToP.children(contentMMLNode);
+ if(children.length){
+ var z = children[0];
+ for(var i=0;i<children.length;i++){
+ if(children[i].localName=='annotation-xml' && children[i].getAttribute('encoding')=='MathML-Presentation'){
+ z = children[i];
+ break;
+ }
+ }
+ CToP.applyTransform(mrow,z,0);
+ }
+ parentNode.appendChild(mrow);
+ }
+
+ CToP.tokens["annotation-xml"] = function(parentNode,contentMMLNode,precedence) {
+ var mrow = CToP.createElement('mrow');
+ var children = CToP.children(contentMMLNode);
+ for(var i=0;i<children.length;i++){
+ CToP.applyTransform(mrow,children[i],0);
+ }
+ parentNode.appendChild(mrow);
+ }
+
+
+ /* Symbol names to translate to characters
+ */
+ CToP.symbols = {
+ "gamma": '\u03B3'
+ }
+ CToP.contentDictionaries = {
+ "setname1": function(parentNode,contentMMLNode,precedence) {
+ var sets = {
+ "C": '\u2102',
+ "N": '\u2115',
+ "P": '\u2119',
+ "Q": '\u211A',
+ "R": '\u211D',
+ "Z": '\u2124'
+ }
+ var name = contentMMLNode.textContent;
+ CToP.appendToken(parentNode,'mi',sets[name]);
+ },
+ "aritherror": function(parentNode,contentMMLNode,precedence) {
+ var name = contentMMLNode.textContent;
+ CToP.appendToken(parentNode,'mi',name+':');
+ }
+ }
+
+ /* Functions to transform function/operation application tokens
*/
-
- var ctop;
- if (window.XSLTProcessor) {
- // standard method: just use an XSLTProcessor and parse the stylesheet
- if (!MATHML.ParseXML) {MATHML.ParseXML = MATHML.createParser()}
- MATHML.ctopXSLT = new XSLTProcessor();
- MATHML.ctopXSLT.importStylesheet(MATHML.ParseXML(ctopStylesheet));
- } else if (MathJax.Hub.Browser.isMSIE) {
- // nonstandard methods for Internet Explorer
- if (MathJax.Hub.Browser.versionAtLeast("9.0")) {
- // For Internet Explorer >= 9, use createProcessor
- ctop = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
- ctop.loadXML(ctopStylesheet);
- var xslt = new ActiveXObject("Msxml2.XSLTemplate");
- xslt.stylesheet = ctop;
- MATHML.ctopXSLT = {
- ctop: xslt.createProcessor(),
- transformToDocument: function(doc) {
- this.ctop.input = doc;
- this.ctop.transform();
- return this.ctop.output;
- }
- }
- } else {
- // For Internet Explorer <= 8, use transformNode
- ctop = MATHML.createMSParser();
- ctop.async = false;
- ctop.loadXML(ctopStylesheet);
- MATHML.ctopXSLT = {
- ctop: ctop,
- transformToDocument: function(doc) {
- return doc.documentElement.transformNode(this.ctop);
- }
- }
- }
- } else {
- // No XSLT support. Do not change the <math> content.
- MATHML.ctopXSLT = null;
+ CToP.applyTokens = {
+ "rem": CToP.binary('mod',3),
+ "divide": CToP.binary('/',3),
+ "remainder": CToP.binary('mod',3),
+ "implies": CToP.binary('\u21D2',3),
+ "factorof": CToP.binary('|',3),
+ "in": CToP.binary('\u2208',3),
+ "notin": CToP.binary('\u2209',3),
+ "notsubset": CToP.binary('\u2288',2),
+ "notprsubset": CToP.binary('\u2284',2),
+ "setdiff": CToP.binary('\u2216',2),
+ "eq": CToP.infix('=',1),
+ "compose": CToP.infix('\u2218',0),
+ "left_compose": CToP.infix('\u2218',1),
+ "xor": CToP.infix('xor',3),
+ "neq": CToP.infix('\u2260',1),
+ "gt": CToP.infix('>',1),
+ "lt": CToP.infix('<',1),
+ "geq": CToP.infix('\u2265',1),
+ "leq": CToP.infix('\u2264',1),
+ "equivalent": CToP.infix('\u2261',1),
+ "approx": CToP.infix('\u2248',1),
+ "subset": CToP.infix('\u2286',2),
+ "prsubset": CToP.infix('\u2282',2),
+ "cartesianproduct": CToP.infix('\u00D7',2),
+ "cartesian_product": CToP.infix('\u00D7',2),
+ "vectorproduct": CToP.infix('\u00D7',2),
+ "scalarproduct": CToP.infix('.',2),
+ "outerproduct": CToP.infix('\u2297',2),
+ "sum": CToP.iteration('\u2211','='),
+ "product": CToP.iteration('\u220F','='),
+ "forall": CToP.bind('\u2200',',',','),
+ "exists": CToP.bind('\u2203','\u007c',','),
+ "lambda": CToP.bind('\u03BB','.',','),
+ "limit": CToP.iteration('lim','\u2192'),
+ "sdev": CToP.fn('\u03c3'),
+ "determinant": CToP.fn('det'),
+ "max": CToP.minmax('max'),
+ "min": CToP.minmax('min'),
+ "real": CToP.fn('\u211b'),
+ "imaginary": CToP.fn('\u2111'),
+ "set": CToP.set('{','}'),
+ "list": CToP.set('(',')')
}
+ CToP.applyTokens['exp'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var msup = CToP.createElement('msup');
+ CToP.appendToken(msup,'mi','e');
+ CToP.applyTransform(msup,args[0],0);
+ parentNode.appendChild(msup);
+ }
+
+ CToP.applyTokens['union'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ if(bvars.length) {
+ CToP.iteration('\u22C3','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ } else {
+ CToP.infix('\u222A',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ }
+ }
+ CToP.applyTokens['intersect'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ if(bvars.length) {
+ CToP.iteration('\u22C2','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ } else {
+ CToP.infix('\u2229',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ }
+ }
+
+ CToP.applyTokens['floor'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,'mo','\u230a');
+ CToP.applyTransform(mrow,args[0],0);
+ CToP.appendToken(mrow,'mo','\u230b');
+ parentNode.appendChild(mrow);
+ }
+ CToP.applyTokens['conjugate'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mover = CToP.createElement('mover');
+ CToP.applyTransform(mover,args[0],0);
+ CToP.appendToken(mover,'mo','\u00af');
+ parentNode.appendChild(mover);
+ }
+ CToP.applyTokens['abs'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,'mo','|');
+ CToP.applyTransform(mrow,args[0],0);
+ CToP.appendToken(mrow,'mo','|');
+ parentNode.appendChild(mrow);
+ }
+ CToP.applyTokens['and'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ if(bvars.length || qualifiers.length) {
+ CToP.iteration('\u22c0','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,4);
+ } else {
+ CToP.infix('\u2227',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ }
+ }
+ CToP.applyTokens['or'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ if(bvars.length || qualifiers.length) {
+ CToP.iteration('\u22c1','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,4);
+ } else {
+ CToP.infix('\u2228',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ }
+ }
+ CToP.applyTokens['xor'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ if(bvars.length || qualifiers.length) {
+ CToP.iteration('xor','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,4);
+ } else {
+ CToP.infix('xor',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ }
+ }
+ CToP.applyTokens['card'] = CToP.applyTokens['size'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,'mo','|');
+ CToP.applyTransform(mrow,args[0],0);
+ CToP.appendToken(mrow,'mo','|');
+ parentNode.appendChild(mrow);
+ }
+ CToP.applyTokens['mean'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ if(args.length==1) {
+ var mover = CToP.createElement('mover');
+ CToP.applyTransform(mover,args[0],0);
+ CToP.appendToken(mover,'mo','\u00af');
+ parentNode.appendChild(mover);
+ } else {
+ parentNode.appendChild(CToP.mfenced(args,'\u27e8','\u27e9'));
+ }
+ }
+ CToP.applyTokens['moment'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var degree,momentabout;
+
+ for(var i=0; i<qualifiers.length;i++){
+ if(qualifiers[i].localName=='degree') {
+ degree = qualifiers[i];
+ } else if(qualifiers[i].localName=='momentabout') {
+ momentabout = qualifiers[i];
+ }
+ }
+
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,'mo','\u27e8');
+ var argrow = CToP.createElement('mrow');
+ if(args.length>1) {
+ argrow.appendChild(CToP.mfenced(args,'(',')'));
+ } else {
+ CToP.applyTransform(argrow,args[0],0);
+ }
+ if(degree) {
+ var msup = CToP.createElement('msup');
+ msup.appendChild(argrow);
+ var children = CToP.children(degree);
+ for(var j=0;j<children.length;j++){
+ CToP.applyTransform(msup,children[j],0);
+ }
+ mrow.appendChild(msup);
+ } else {
+ mrow.appendChild(argrow);
+ }
+ CToP.appendToken(mrow,'mo','\u27e9');
+
+ if(momentabout) {
+ var msub = CToP.createElement('msub');
+ msub.appendChild(mrow);
+ var children = CToP.children(momentabout);
+ for(var j=0;j<children.length;j++){
+ CToP.applyTransform(msub,children[j],0);
+ }
+ parentNode.appendChild(msub);
+ } else {
+ parentNode.appendChild(mrow);
+ }
+ }
+
+ CToP.applyTokens['variance'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ var msup = CToP.createElement('msup');
+ CToP.appendToken(msup,'mo','\u03c3');
+ CToP.appendToken(msup,'mn','2');
+ mrow.appendChild(msup);
+ CToP.appendToken(mrow,'mo','\u2061');
+ mrow.appendChild(CToP.mfenced(args,'(',')'));
+ parentNode.appendChild(mrow);
+ }
+ CToP.applyTokens['grad'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,'mo','\u2207');
+ CToP.appendToken(mrow,'mo','\u2061');
+ mrow.appendChild(CToP.mfenced(args,'(',')'));
+ parentNode.appendChild(mrow);
+ };
+ CToP.applyTokens['laplacian'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ var msup = CToP.createElement('msup');
+ CToP.appendToken(msup,'mo','\u2207');
+ CToP.appendToken(msup,'mn','2');
+ mrow.appendChild(msup);
+ CToP.appendToken(mrow,'mo','\u2061');
+ mrow.appendChild(CToP.mfenced(args,'(',')'));
+ parentNode.appendChild(mrow);
+ };
+ CToP.applyTokens['curl'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,'mo','\u2207');
+ CToP.appendToken(mrow,'mo','\u00d7');
+ var needsBrackets = args[0].localName == 'apply';
+ if(needsBrackets) {
+ mrow.appendChild(CToP.mfenced(args,'(', ')'));
+ }
+ else {
+ CToP.applyTransform(mrow,args[0],precedence);
+ }
+ parentNode.appendChild(mrow);
+ };
+ CToP.applyTokens['divergence'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,'mo','\u2207');
+ CToP.appendToken(mrow,'mo','\u22c5');
+ var needsBrackets = args[0].localName == 'apply';
+ if(needsBrackets) {
+ mrow.appendChild(CToP.mfenced(args,'(', ')'));
+ }
+ else {
+ CToP.applyTransform(mrow,args[0],precedence);
+ }
+ parentNode.appendChild(mrow);
+ };
+ CToP.applyTokens['not'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,'mo','\u00ac');
+ var needsBrackets = args[0].localName=='apply' || args[0].localName=='bind';
+ if(needsBrackets) {
+ CToP.appendToken(mrow,'mo','(');
+ }
+ CToP.applyTransform(mrow,args[0],precedence);
+ if(needsBrackets) {
+ CToP.appendToken(mrow,'mo',')');
+ }
+ parentNode.appendChild(mrow)
+ }
+ CToP.applyTokens['divide'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mfrac = CToP.createElement('mfrac');
+ CToP.applyTransform(mfrac,args[0],0);
+ CToP.applyTransform(mfrac,args[1],0);
+ parentNode.appendChild(mfrac);
+ }
+ CToP.applyTokens['tendsto'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var type;
+ if(firstArg.localName=='tendsto') {
+ type = firstArg.getAttribute('type');
+ } else {
+ type = args[0].textContent;
+ args = args.slice(1);
+ }
+ var name = (type=='above')? '\u2198' :
+ (type=='below') ? '\u2197' : '\u2192' ;
+ CToP.binary(name,2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ }
+ CToP.applyTokens['minus'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ if(args.length==1) {
+ CToP.binary('-',5)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ } else {
+ CToP.binary('-',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
+ }
+ }
+ CToP.applyTokens['complex-cartesian'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.applyTransform(mrow,args[0],0);
+ CToP.appendToken(mrow,'mo','+');
+ CToP.applyTransform(mrow,args[1],0);
+ CToP.appendToken(mrow,'mo','\u2062');
+ CToP.appendToken(mrow,'mi','i');
+ parentNode.appendChild(mrow);
+ }
+
+ CToP.applyTokens['complex-polar'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.applyTransform(mrow,args[0],0);
+ CToP.appendToken(mrow,'mo','\u2062');
+ var msup = CToP.createElement('msup');
+ CToP.appendToken(msup,'mi','e');
+ var exponent = CToP.createElement('mrow');
+ CToP.applyTransform(exponent,args[1],0);
+ CToP.appendToken(exponent,'mo','\u2062');
+ CToP.appendToken(exponent,'mi','i');
+ msup.appendChild(exponent);
+ mrow.appendChild(msup);
+ parentNode.appendChild(mrow);
+ }
+
+ CToP.applyTokens['integer'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ CToP.applyTransform(parentNode,args[0],0);
+ }
+
+ CToP.applyTokens['based-integer'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var msub = CToP.createElement('msub');
+ CToP.applyTransform(msub,args[1],0);
+ CToP.applyTransform(msub,args[0],0);
+ parentNode.appendChild(msub);
+ }
+
+ CToP.applyTokens['rational'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mfrac = CToP.createElement('mfrac');
+ CToP.applyTransform(mfrac,args[0],0);
+ CToP.applyTransform(mfrac,args[1],0);
+ parentNode.appendChild(mfrac);
+ }
+
+ CToP.applyTokens['times'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ var needsBrackets = precedence>3;
+ if(needsBrackets) {
+ CToP.appendToken(mrow,'mo','(');
+ }
+ for(var j=0;j<args.length; j++ ) {
+ if(j>0) {
+ CToP.appendToken(mrow,'mo',(args[j].localName=='cn') ? "\u00D7" :"\u2062");
+ }
+ CToP.applyTransform(mrow,args[j],3);
+ }
+ if(needsBrackets) {
+ CToP.appendToken(mrow,'mo',')');
+ }
+ parentNode.appendChild(mrow);
+ }
+
+ CToP.applyTokens["plus"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ var needsBrackets = precedence>2;
+ if(needsBrackets) {
+ CToP.appendToken(mrow,'mo','(');
+ }
+ for(var j=0;j<args.length; j++ ) {
+ var arg = args[j];
+ var children = CToP.children(arg);
+ if(j>0) {
+ var n;
+ if(arg.localName=='cn' && !(children.length) && (n=Number(arg.textContent)) <0) {
+ CToP.appendToken(mrow,'mo','\u2212');
+ CToP.appendToken(mrow,'mn', -n);
+ } else if(arg.localName=='apply' && children.length==2 && children[0].localName=='minus') {
+ CToP.appendToken(mrow,'mo','\u2212');
+ CToP.applyTransform(mrow,children[1],2);
+ } else if(arg.localName=='apply' && children.length>2 && children[0].localName=='times' && children[1].localName=='cn' && ( n=Number(children[1].textContent) < 0)) {
+ CToP.appendToken(mrow,'mo','\u2212');
+ children[1].textContent=-n;// fix me: modifying document
+ CToP.applyTransform(mrow,arg,2);
+ } else{
+ CToP.appendToken(mrow,'mo','+');
+ CToP.applyTransform(mrow,arg,2);
+ }
+ } else {
+ CToP.applyTransform(mrow,arg,2);
+ }
+ }
+ if(needsBrackets) {
+ CToP.appendToken(mrow,'mo',')');
+ }
+ parentNode.appendChild(mrow);
+ }
+
+ CToP.applyTokens['transpose'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var msup = CToP.createElement('msup');
+ CToP.applyTransform(msup,args[0],precedence);
+ CToP.appendToken(msup,'mi','T');
+ parentNode.appendChild(msup);
+ }
+
+ CToP.applyTokens['power'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var msup = CToP.createElement('msup');
+ CToP.applyTransform(msup,args[0],3);
+ CToP.applyTransform(msup,args[1],precedence);
+ parentNode.appendChild(msup);
+ }
+
+ CToP.applyTokens['selector'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var msub = CToP.createElement('msub');
+ var mrow = args ? args[0]: CToP.createElement('mrow');
+ CToP.applyTransform(msub,mrow,0);
+ var mrow2 = CToP.createElement('mrow');
+ for(var i=1;i<args.length;i++){
+ if(i!=1){
+ CToP.appendToken(mrow2,'mo',',');
+ }
+ CToP.applyTransform(mrow2,args[i],0);
+ }
+ msub.appendChild(mrow2);
+ parentNode.appendChild(msub);
+ }
+
+ CToP.applyTokens["log"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ var mi = CToP.createElement('mi');
+ mi.textContent = 'log';
+ if(qualifiers.length && qualifiers[0].localName=='logbase'){
+ var msub = CToP.createElement('msub');
+ msub.appendChild(mi);
+ CToP.applyTransform(msub,CToP.children(qualifiers[0])[0],0);
+ mrow.appendChild(msub);
+ } else {
+ mrow.appendChild(mi);
+ }
+ CToP.applyTransform(mrow,args[0],7);
+ parentNode.appendChild(mrow);
+ }
+
+ CToP.applyTokens["int"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ var mo = CToP.createElement('mo');
+ mo.textContent='\u222B';
+ var msubsup = CToP.createElement('msubsup');
+ msubsup.appendChild(mo);
+ var mrow1 = CToP.createElement('mrow');
+ for(var i=0; i<qualifiers.length;i++){
+ if(qualifiers[i].localName=='lowlimit'||
+ qualifiers[i].localName=='condition'||
+ qualifiers[i].localName=='domainofapplication')
+ {
+ var children = CToP.children(qualifiers[i]);
+ for(var j=0;j<children.length;j++){
+ CToP.applyTransform(mrow1,children[j],0);
+ }
+ } else {
+ var children = CToP.children(qualifiers[i]);
+ if (qualifiers[i].localName=='interval' && children.length==2) {
+ CToP.applyTransform(mrow1,children[0],0);
+ }
+ }
+ }
+ msubsup.appendChild(mrow1);
+ var mrow2 = CToP.createElement('mrow');
+ for(var i=0; i<qualifiers.length;i++){
+ if(qualifiers[i].localName=='uplimit'){
+ var children = CToP.children(qualifiers[i]);
+ for(j=0;j<children.length;j++){
+ CToP.applyTransform(mrow2,children[j],0);
+ }
+ break;
+ } else if(qualifiers[i].localName=='interval' ){
+ var children = CToP.children(qualifiers[i]);
+ CToP.applyTransform(mrow2,children[children.length-1],0);
+ break;
+ }
+ }
+ msubsup.appendChild(mrow2);
+ mrow.appendChild(msubsup);
+ for(var i=0; i<args.length;i++){
+ CToP.applyTransform(mrow,args[i],0);
+ }
+ for(var i=0; i<bvars.length;i++){
+ var bvar = bvars[i];
+ var children = CToP.children(bvar);
+ if(children.length){
+ var mrow3 = CToP.createElement("mrow");
+ CToP.appendToken(mrow3,'mi','d');
+ CToP.applyTransform(mrow3,children[0],0);
+ mrow.appendChild(mrow3);
+ }
+ }
+ parentNode.appendChild(mrow);
+ }
+
+ CToP.applyTokens["inverse"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var msup = CToP.createElement('msup');
+ var arg = (args.length) ? args[0] : CToP.createElement('mrow');
+ CToP.applyTransform(msup,arg,precedence);
+ var mfenced = CToP.createElement('mfenced');
+ CToP.appendToken(mfenced,'mn','-1');
+ msup.appendChild(mfenced);
+ parentNode.appendChild(msup);
+ }
+
+ CToP.applyTokens["quotient"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.appendToken(mrow,'mo','\u230A');
+ if(args.length) {
+ CToP.applyTransform(mrow,args[0],0);
+ CToP.appendToken(mrow,'mo','/');
+ if(args.length>1){
+ CToP.applyTransform(mrow,args[1],0);
+ }
+ }
+ CToP.appendToken(mrow,'mo','\u230B');
+ parentNode.appendChild(mrow);
+ }
+
+ CToP.applyTokens["factorial"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mrow = CToP.createElement('mrow');
+ CToP.applyTransform(mrow,args[0],4);
+ CToP.appendToken(mrow,'mo','!');
+ parentNode.appendChild(mrow);
+ }
+
+ CToP.applyTokens["root"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var mr;
+ if(firstArg.localName=='root' && (qualifiers.length==0 || (qualifiers[0].localName=='degree' && qualifiers[0].textContent=='2'))){
+ mr = CToP.createElement('msqrt');
+ for(var i=0;i<args.length;i++){
+ CToP.applyTransform(mr,args[i],0);
+ }
+ } else {
+ mr = CToP.createElement('mroot');
+ CToP.applyTransform(mr,args[0],0);
+ var arg = (firstArg.localName=='root') ? qualifiers[0].childNodes[0] : args[1];
+ CToP.applyTransform(mr,arg,0);
+ }
+ parentNode.appendChild(mr);
+ }
+
+ CToP.applyTokens["diff"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var m;
+ var mrow1 = CToP.createElement('mrow');
+ if(bvars.length){
+ m = CToP.createElement('mfrac');
+ var msup, bvar;
+ var mi = CToP.createElement('mi');
+ mi.textContent = 'd';
+ var children = CToP.children(bvars[0]);
+ for(var j=0;j<children.length;j++){
+ if(children[j].localName=='degree'){
+ var childNode = CToP.children(children[j])[0];
+ if(childNode.textContent!='1'){
+ msup = CToP.createElement('msup');
+ msup.appendChild(mi);
+ CToP.applyTransform(msup,childNode,0);
+ }
+ } else {
+ bvar = CToP.children(bvars[0])[j];
+ }
+ }
+ mrow1.appendChild(msup || mi);
+ if(args.length){
+ CToP.applyTransform(mrow1,args[0],0);
+ }
+ m.appendChild(mrow1);
+ mrow1 = CToP.createElement('mrow');
+ CToP.appendToken(mrow1,'mi','d');
+ if(msup){
+ var msup2 = msup.cloneNode(true);
+ msup2.replaceChild(bvar,msup2.childNodes[0]); // fix me
+ mrow1.appendChild(msup2);
+ //CToP.applyTransform(bv,0);
+ } else {
+ CToP.applyTransform(mrow1,bvar,0);
+ }
+ m.appendChild(mrow1);
+ } else {
+ m = CToP.createElement('msup');
+ m.appendChild(mrow1);
+ CToP.applyTransform(mrow1,args[0],0);
+ CToP.appendToken(m,'mo','\u2032');
+ }
+ parentNode.appendChild(m);
+ }
+
+ CToP.applyTokens["partialdiff"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
+ var m, mi, msup, mrow, mo, z;
+
+ if(bvars.length==0 && args.length==2 && args[0].localName=='list'){
+ if(args[1].localName=='lambda') {
+ m = CToP.createElement('mfrac');
+ msup = CToP.createElement('msup');
+ CToP.appendToken(msup,'mo','\u2202');
+ var degree = CToP.children(args[0]).length;
+ CToP.appendToken(msup,'mn',degree);
+ mrow = CToP.createElement('mrow');
+ mrow.appendChild(msup);
+ var children = CToP.children(args[1]);
+ z = children[children.length - 1];
+ CToP.applyTransform(mrow,z,0);
+ m.appendChild(mrow);
+ mrow = CToP.createElement('mrow');
+ var bvarNames = [];
+ var lambdaChildren = CToP.children(args[1]); // names of bound variables
+ var lambdaSequence = CToP.children(args[0]); // indices of bound variable names, in order
+ for(var i=0;i<lambdaChildren.length;i++){
+ if(lambdaChildren[i].localName=='bvar'){
+ bvarNames.push(CToP.children(lambdaChildren[i])[0]);
+ }
+ }
+ var lastN = null, degree = 0;
+ function addDiff(n,degree) {
+ CToP.appendToken(mrow,'mo','\u2202');
+ var bvar = bvarNames[n];
+ if(degree>1) {
+ var msup = CToP.createElement('msup');
+ CToP.applyTransform(msup,bvar,0);
+ CToP.appendToken(msup,'mn',degree);
+ mrow.appendChild(msup);
+ } else {
+ CToP.applyTransform(mrow,bvar,0);
+ }
+ }
+ for(var i=0;i<lambdaSequence.length;i++){
+ var n = Number(lambdaSequence[i].textContent)-1;
+ if(lastN!==null && n!=lastN) {
+ addDiff(lastN,degree);
+ degree = 0;
+ }
+ lastN = n;
+ degree += 1;
+ }
+ if(lastN) {
+ addDiff(lastN,degree);
+ }
+ m.appendChild(mrow);
+ parentNode.appendChild(m);
+ } else {
+ m = CToP.createElement('mrow');
+ var msub = CToP.createElement('msub');
+ CToP.appendToken(msub,'mi','D');
+ var bvar = CToP.children(args[0]);
+ msub.appendChild(CToP.mfenced(bvar,'',''));
+ m.appendChild(msub);
+ CToP.applyTransform(m,args[1],0);
+ parentNode.appendChild(m);
+ }
+ } else {
+ m = CToP.createElement('mfrac');
+ msup = CToP.createElement('msup');
+ CToP.appendToken(msup,'mo','\u2202');
+ mrow = CToP.createElement('mrow');
+ if(qualifiers.length && qualifiers[0].localName=='degree' && CToP.children(qualifiers[0]).length){
+ var qualifier = CToP.children(qualifiers[0])[0];
+ CToP.applyTransform(mrow,qualifier,0);
+ } else {
+ var degree = 0;
+ var hadFirst = false;
+ for(var i=0;i<bvars.length;i++){
+ var children = CToP.children(bvars[i]);
+ if(children.length==2){
+ for(j=0;j<2;j++){
+ if(children[j].localName=='degree') {
+ if(/^\s*\d+\s*$/.test(children[j].textContent)){
+ degree += Number(children[j].textContent);
+ } else {
+ if(hadFirst){
+ CToP.appendToken(mrow,'mo','+');
+ }
+ }
+ hadFirst = true;
+ var degreeNode = CToP.children(children[j])[0];
+ CToP.applyTransform(mrow,degreeNode,0);
+ }
+ }
+ } else {
+ degree++;
+ }
+ }
+ if(degree>0){
+ if(hadFirst){
+ CToP.appendToken(mrow,'mo','+');
+ }
+ CToP.appendToken(mrow,'mn',degree);
+ }
+ }
+ msup.appendChild(mrow);
+ mrow = CToP.createElement('mrow');
+ mrow.appendChild(msup);
+ if(args.length){
+ CToP.applyTransform(mrow,args[0],0);
+ }
+ m.appendChild(mrow);
+ mrow = CToP.createElement('mrow');
+ for(var i=0;i<bvars.length;i++){
+ CToP.appendToken(mrow,'mo','\u2202');
+ var children = CToP.children(bvars[i]);
+ if(children.length==2){
+ for(j=0;j<2;j++){
+ if(children[j].localName=='degree'){
+ msup = CToP.createElement('msup');
+ CToP.applyTransform(msup,children[1-j],0);
+ var degreeNode = CToP.children(children[j])[0];
+ CToP.applyTransform(msup,degreeNode,0);
+ mrow.appendChild(msup);
+ }
+ }
+ } else if(children.length==1) {
+ CToP.applyTransform(mrow,children[0],0);
+ }
+ }
+ m.appendChild(mrow);
+ parentNode.appendChild(m);
+ }
+ }
+ return CToP;
+ })();
+
+
+MathJax.Hub.Register.StartupHook("MathML Jax Ready",function () {
+
+ var MATHML = MathJax.InputJax.MathML,
+ PARSE = MATHML.Parse.prototype;
+ var CToP = MathJax.Extension["MathML/content-mathml"];
+
+ MATHML.DOMfilterHooks.Add(function (data) {
+ data.math = CToP.transformElement(data.math);
+ });
MathJax.Hub.Startup.signal.Post("MathML content-mathml Ready");
});