www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

jax.js (25200B)


      1 /* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
      2 /* vim: set ts=2 et sw=2 tw=80: */
      3 
      4 /*************************************************************
      5  *
      6  *  MathJax/jax/input/MathML/jax.js
      7  *  
      8  *  Implements the MathML InputJax that reads mathematics in
      9  *  MathML format and converts it to the MML ElementJax
     10  *  internal format.
     11  *
     12  *  ---------------------------------------------------------------------
     13  *  
     14  *  Copyright (c) 2010-2015 The MathJax Consortium
     15  * 
     16  *  Licensed under the Apache License, Version 2.0 (the "License");
     17  *  you may not use this file except in compliance with the License.
     18  *  You may obtain a copy of the License at
     19  * 
     20  *      http://www.apache.org/licenses/LICENSE-2.0
     21  * 
     22  *  Unless required by applicable law or agreed to in writing, software
     23  *  distributed under the License is distributed on an "AS IS" BASIS,
     24  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     25  *  See the License for the specific language governing permissions and
     26  *  limitations under the License.
     27  */
     28 
     29 (function (MATHML,BROWSER) {
     30   var MML;
     31   
     32   var _ = function (id) {
     33     return MathJax.Localization._.apply(MathJax.Localization,
     34       [["MathML",id]].concat([].slice.call(arguments,1)))
     35   };
     36 
     37   MATHML.Parse = MathJax.Object.Subclass({
     38 
     39     Init: function (string,script) {this.Parse(string,script)},
     40     
     41     //
     42     //  Parse the MathML and check for errors
     43     //
     44     Parse: function (math,script) {
     45       var doc;
     46       if (typeof math !== "string") {doc = math.parentNode} else {
     47         doc = MATHML.ParseXML(this.preProcessMath.call(this,math));
     48         if (doc == null) {MATHML.Error(["ErrorParsingMathML","Error parsing MathML"])}
     49       }
     50       var err = doc.getElementsByTagName("parsererror")[0];
     51       if (err) MATHML.Error(["ParsingError","Error parsing MathML: %1",
     52            err.textContent.replace(/This page.*?errors:|XML Parsing Error: |Below is a rendering of the page.*/g,"")]);
     53       if (doc.childNodes.length !== 1)
     54         {MATHML.Error(["MathMLSingleElement","MathML must be formed by a single element"])}
     55       if (doc.firstChild.nodeName.toLowerCase() === "html") {
     56         var h1 = doc.getElementsByTagName("h1")[0];
     57         if (h1 && h1.textContent === "XML parsing error" && h1.nextSibling)
     58           MATHML.Error(["ParsingError","Error parsing MathML: %1",
     59               String(h1.nextSibling.nodeValue).replace(/fatal parsing error: /,"")]);
     60       }
     61       if (doc.firstChild.nodeName.toLowerCase().replace(/^[a-z]+:/,"") !== "math") {
     62         MATHML.Error(["MathMLRootElement",
     63             "MathML must be formed by a <math> element, not %1",
     64             "<"+doc.firstChild.nodeName+">"]);
     65       }
     66       var data = {math:doc.firstChild, script:script};
     67       MATHML.DOMfilterHooks.Execute(data);
     68       this.mml = this.MakeMML(data.math);
     69     },
     70     
     71     //
     72     //  Convert the MathML structure to the MathJax Element jax structure
     73     //
     74     MakeMML: function (node) {
     75       var CLASS = String(node.getAttribute("class")||""); // make sure CLASS is a string
     76       var mml, type = node.nodeName.toLowerCase().replace(/^[a-z]+:/,"");
     77       var match = (CLASS.match(/(^| )MJX-TeXAtom-([^ ]*)/));
     78       if (match) {
     79         mml = this.TeXAtom(match[2],match[2] === "OP" && !CLASS.match(/MJX-fixedlimits/));
     80       } else if (!(MML[type] && MML[type].isa && MML[type].isa(MML.mbase))) {
     81         MathJax.Hub.signal.Post(["MathML Jax - unknown node type",type]);
     82         return MML.Error(_("UnknownNodeType","Unknown node type: %1",type));
     83       } else {
     84         mml = MML[type]();
     85       }
     86       this.AddAttributes(mml,node); this.CheckClass(mml,mml["class"]);
     87       this.AddChildren(mml,node);
     88       if (MATHML.config.useMathMLspacing) {mml.useMMLspacing = 0x08}
     89       return mml;
     90     },
     91     TeXAtom: function (mclass,movablelimits) {
     92       var mml = MML.TeXAtom().With({texClass:MML.TEXCLASS[mclass]});
     93       if (movablelimits) {mml.movesupsub = mml.movablelimits = true}
     94       return mml;
     95     },
     96     CheckClass: function (mml,CLASS) {
     97       CLASS = (CLASS||"").split(/ /); var NCLASS = [];
     98       for (var i = 0, m = CLASS.length; i < m; i++) {
     99         if (CLASS[i].substr(0,4) === "MJX-") {
    100           if (CLASS[i] === "MJX-arrow") {
    101             // This class was used in former versions of MathJax to attach an
    102             // arrow to the updiagonalstrike notation. For backward
    103             // compatibility, let's continue to accept this case. See issue 481.
    104             if (!mml.notation.match("/"+MML.NOTATION.UPDIAGONALARROW+"/"))
    105                 mml.notation += " "+MML.NOTATION.UPDIAGONALARROW;
    106           } else if (CLASS[i] === "MJX-variant") {
    107             mml.variantForm = true;
    108             //
    109             //  Variant forms come from AMSsymbols, and it sets up the
    110             //  character mappings, so load that if needed.
    111             //
    112             if (!MathJax.Extension["TeX/AMSsymbols"])
    113               {MathJax.Hub.RestartAfter(MathJax.Ajax.Require("[MathJax]/extensions/TeX/AMSsymbols.js"))}
    114           } else if (CLASS[i].substr(0,11) !== "MJX-TeXAtom") {
    115             mml.mathvariant = CLASS[i].substr(3);
    116             //
    117             //  Caligraphic and oldstyle bold are set up in the boldsymbol
    118             //  extension, so load it if it isn't already loaded.
    119             //  
    120             if (mml.mathvariant === "-tex-caligraphic-bold" ||
    121                 mml.mathvariant === "-tex-oldstyle-bold") {
    122               if (!MathJax.Extension["TeX/boldsymbol"])
    123                 {MathJax.Hub.RestartAfter(MathJax.Ajax.Require("[MathJax]/extensions/TeX/boldsymbol.js"))}
    124             }
    125           }
    126         } else {NCLASS.push(CLASS[i])}
    127       }
    128       if (NCLASS.length) {mml["class"] = NCLASS.join(" ")} else {delete mml["class"]}
    129     },
    130     
    131     //
    132     //  Add the attributes to the mml node
    133     //
    134     AddAttributes: function (mml,node) {
    135       mml.attr = {}; mml.attrNames = [];
    136       for (var i = 0, m = node.attributes.length; i < m; i++) {
    137         var name = node.attributes[i].name;
    138         if (name == "xlink:href") {name = "href"}
    139         if (name.match(/:/)) continue;
    140         if (name.match(/^_moz-math-((column|row)(align|line)|font-style)$/)) continue;
    141         var value = node.attributes[i].value;
    142         value = this.filterAttribute(name,value);
    143         var defaults = (mml.type === "mstyle" ? MML.math.prototype.defaults : mml.defaults);
    144         if (value != null) {
    145           if (value.toLowerCase() === "true") {value = true}
    146             else if (value.toLowerCase() === "false") {value = false}
    147           if (defaults[name] != null || MML.copyAttributes[name])
    148             {mml[name] = value} else {mml.attr[name] = value}
    149           mml.attrNames.push(name);
    150         }
    151       }
    152     },
    153     filterAttribute: function (name,value) {return value}, // safe mode overrides this
    154     
    155     //
    156     //  Create the children for the mml node
    157     //
    158     AddChildren: function (mml,node) {
    159       for (var i = 0, m = node.childNodes.length; i < m; i++) {
    160         var child = node.childNodes[i];
    161         if (child.nodeName === "#comment") continue;
    162         if (child.nodeName === "#text") {
    163           if ((mml.isToken || mml.isChars) && !mml.mmlSelfClosing) {
    164             var text = child.nodeValue;
    165             if (mml.isToken) {
    166               text = text.replace(/&([a-z][a-z0-9]*);/ig,this.replaceEntity);
    167               text = this.trimSpace(text);
    168             }
    169             mml.Append(MML.chars(text));
    170           } else if (child.nodeValue.match(/\S/)) {
    171             MATHML.Error(["UnexpectedTextNode",
    172               "Unexpected text node: %1","'"+child.nodeValue+"'"]);
    173           }
    174         } else if (mml.type === "annotation-xml") {
    175           mml.Append(MML.xml(child));
    176         } else {
    177           var cmml = this.MakeMML(child); mml.Append(cmml);
    178           if (cmml.mmlSelfClosing && cmml.data.length)
    179             {mml.Append.apply(mml,cmml.data); cmml.data = []}
    180         }
    181       }
    182       if (mml.type === "mrow" && mml.data.length >= 2) {
    183         var first = mml.data[0], last = mml.data[mml.data.length-1];
    184         if (first.type === "mo" && first.Get("fence") &&
    185             last.type === "mo" && last.Get("fence")) {
    186           if (first.data[0]) {mml.open = first.data.join("")}
    187           if (last.data[0]) {mml.close = last.data.join("")}
    188         }
    189       }
    190     },
    191     
    192     //
    193     // Clean Up the <math> source to prepare for XML parsing
    194     //
    195     preProcessMath: function (math) {
    196       if (math.match(/^<[a-z]+:/i) && !math.match(/^<[^<>]* xmlns:/)) {
    197         math = math.replace(/^<([a-z]+)(:math)/i,'<$1$2 xmlns:$1="http://www.w3.org/1998/Math/MathML"')
    198       }
    199       // HTML5 removes xmlns: namespaces, so put them back for XML
    200       var match = math.match(/^(<math( ('.*?'|".*?"|[^>])+)>)/i);
    201       if (match && match[2].match(/ (?!xmlns=)[a-z]+=\"http:/i)) {
    202 	math = match[1].replace(/ (?!xmlns=)([a-z]+=(['"])http:.*?\2)/ig," xmlns:$1 $1") +
    203                math.substr(match[0].length);
    204       }
    205       if (math.match(/^<math/i) && !math.match(/^<[^<>]* xmlns=/)) {
    206         // append the MathML namespace
    207         math = math.replace(/^<(math)/i,'<math xmlns="http://www.w3.org/1998/Math/MathML"')
    208       }
    209       math = math.replace(/^\s*(?:\/\/)?<!(--)?\[CDATA\[((.|\n)*)(\/\/)?\]\]\1>\s*$/,"$2");
    210       return math.replace(/&([a-z][a-z0-9]*);/ig,this.replaceEntity);
    211     },
    212 
    213     //
    214     //  Remove attribute whitespace
    215     //
    216     trimSpace: function (string) {
    217       return string.replace(/[\t\n\r]/g," ")    // whitespace to spaces
    218                    .replace(/^ +/,"")           // initial whitespace
    219                    .replace(/ +$/,"")           // trailing whitespace
    220                    .replace(/  +/g," ");        // internal multiple whitespace
    221     },
    222     
    223     //
    224     //  Replace a named entity by its value
    225     //  (look up from external files if necessary)
    226     //
    227     replaceEntity: function (match,entity) {
    228       if (entity.match(/^(lt|amp|quot)$/)) {return match} // these mess up attribute parsing
    229       if (MATHML.Parse.Entity[entity]) {return MATHML.Parse.Entity[entity]}
    230       var file = entity.charAt(0).toLowerCase();
    231       var font = entity.match(/^[a-zA-Z](fr|scr|opf)$/);
    232       if (font) {file = font[1]}
    233       if (!MATHML.Parse.loaded[file]) {
    234         MATHML.Parse.loaded[file] = true;
    235         MathJax.Hub.RestartAfter(MathJax.Ajax.Require(MATHML.entityDir+"/"+file+".js"));
    236       }
    237       return match;
    238     }
    239   }, {
    240     loaded: []    // the entity files that are loaded
    241   });
    242   
    243   /************************************************************************/
    244 
    245   MATHML.Augment({
    246     sourceMenuTitle: /*_(MathMenu)*/ ["OriginalMathML","Original MathML"],
    247     
    248     prefilterHooks:    MathJax.Callback.Hooks(true),   // hooks to run on MathML string before processing MathML
    249     DOMfilterHooks:    MathJax.Callback.Hooks(true),   // hooks to run on MathML DOM before processing
    250     postfilterHooks:   MathJax.Callback.Hooks(true),   // hooks to run on internal jax format after processing MathML
    251 
    252     Translate: function (script) {
    253       if (!this.ParseXML) {this.ParseXML = this.createParser()}
    254       var mml, math, data = {script:script};
    255       if (script.firstChild &&
    256           script.firstChild.nodeName.toLowerCase().replace(/^[a-z]+:/,"") === "math") {
    257         data.math = script.firstChild;
    258       } else {
    259         math = MathJax.HTML.getScript(script);
    260         if (BROWSER.isMSIE) {math = math.replace(/(&nbsp;)+$/,"")}
    261         data.math = math;
    262       }
    263       var callback = this.prefilterHooks.Execute(data); if (callback) return callback;
    264       math = data.math;
    265       try {
    266         mml = MATHML.Parse(math,script).mml;
    267       } catch(err) {
    268         if (!err.mathmlError) {throw err}
    269         mml = this.formatError(err,math,script);
    270       }
    271       data.math = MML(mml);
    272       return this.postfilterHooks.Execute(data) || data.math;
    273     },
    274     prefilterMath: function (math,script) {return math},
    275     prefilterMathML: function (math,script) {return math},
    276     formatError: function (err,math,script) {
    277       var message = err.message.replace(/\n.*/,"");
    278       MathJax.Hub.signal.Post(["MathML Jax - parse error",message,math,script]);
    279       return MML.Error(message);
    280     },
    281     Error: function (message) {
    282       //
    283       //  Translate message if it is ["id","message",args]
    284       //
    285       if (message instanceof Array) {message = _.apply(_,message)}
    286       throw MathJax.Hub.Insert(Error(message),{mathmlError: true});
    287     },
    288     //
    289     //  Parsers for various forms (DOMParser, Windows ActiveX object, other)
    290     //
    291     parseDOM: function (string) {return this.parser.parseFromString(string,"text/xml")},
    292     parseMS: function (string) {return (this.parser.loadXML(string) ? this.parser : null)},
    293     parseDIV: function (string) {
    294       this.div.innerHTML = 
    295         "<div>"+string.replace(/<([a-z]+)([^>]*)\/>/g,"<$1$2></$1>")+"</div>";
    296       var doc = this.div.firstChild;
    297       this.div.innerHTML = "";
    298       return doc;
    299     },
    300     parseError: function (string) {return null},
    301     createMSParser: function() {
    302       var parser = null;
    303       var xml = ["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.5.0",
    304                  "MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0",
    305                  "MSXML2.DOMDocument.2.0","Microsoft.XMLDOM"];
    306       for (var i = 0, m = xml.length; i < m && !parser; i++) {
    307         try {
    308           parser = new ActiveXObject(xml[i])
    309         } catch (err) {}
    310       }
    311       return parser;
    312     },
    313     //
    314     //  Create the parser using a DOMParser, or other fallback method
    315     //
    316     createParser: function () {
    317       if (window.DOMParser) {
    318         this.parser = new DOMParser();
    319         return(this.parseDOM);
    320       } else if (window.ActiveXObject) {
    321         this.parser = this.createMSParser();
    322         if (!this.parser) {
    323           MathJax.Localization.Try(this.parserCreationError); 
    324           return(this.parseError);
    325         }
    326         this.parser.async = false;
    327         return(this.parseMS);
    328       }
    329       this.div = MathJax.Hub.Insert(document.createElement("div"),{
    330            style:{visibility:"hidden", overflow:"hidden", height:"1px",
    331                   position:"absolute", top:0}
    332       });
    333       if (!document.body.firstChild) {document.body.appendChild(this.div)}
    334         else {document.body.insertBefore(this.div,document.body.firstChild)}
    335       return(this.parseDIV);
    336     },
    337     parserCreationError: function () {
    338       alert(_("CantCreateXMLParser",
    339         "MathJax can't create an XML parser for MathML.  Check that\n"+
    340         "the 'Script ActiveX controls marked safe for scripting' security\n"+
    341         "setting is enabled (use the Internet Options item in the Tools\n"+
    342         "menu, and select the Security panel, then press the Custom Level\n"+
    343         "button to check this).\n\n"+
    344         "MathML equations will not be able to be processed by MathJax."));
    345     },
    346     //
    347     //  Initialize the parser object (whichever type is used)
    348     //
    349     Startup: function () {
    350       MML = MathJax.ElementJax.mml;
    351       MML.mspace.Augment({mmlSelfClosing: true});
    352       MML.none.Augment({mmlSelfClosing: true});
    353       MML.mprescripts.Augment({mmlSelfClosing:true});
    354       MML.maligngroup.Augment({mmlSelfClosing:true});
    355       MML.malignmark.Augment({mmlSelfClosing:true});
    356     }
    357   });
    358   
    359   //
    360   //  Add the default pre-filter (for backward compatibility)
    361   //
    362   MATHML.prefilterHooks.Add(function (data) {
    363     data.math = (typeof(data.math) === "string" ?
    364       MATHML.prefilterMath(data.math,data.script) :
    365       MATHML.prefilterMathML(data.math,data.script));
    366   });
    367 
    368   MATHML.Parse.Entity = {
    369     ApplyFunction: '\u2061',
    370     Backslash: '\u2216',
    371     Because: '\u2235',
    372     Breve: '\u02D8',
    373     Cap: '\u22D2',
    374     CenterDot: '\u00B7',
    375     CircleDot: '\u2299',
    376     CircleMinus: '\u2296',
    377     CirclePlus: '\u2295',
    378     CircleTimes: '\u2297',
    379     Congruent: '\u2261',
    380     ContourIntegral: '\u222E',
    381     Coproduct: '\u2210',
    382     Cross: '\u2A2F',
    383     Cup: '\u22D3',
    384     CupCap: '\u224D',
    385     Dagger: '\u2021',
    386     Del: '\u2207',
    387     Delta: '\u0394',
    388     Diamond: '\u22C4',
    389     DifferentialD: '\u2146',
    390     DotEqual: '\u2250',
    391     DoubleDot: '\u00A8',
    392     DoubleRightTee: '\u22A8',
    393     DoubleVerticalBar: '\u2225',
    394     DownArrow: '\u2193',
    395     DownLeftVector: '\u21BD',
    396     DownRightVector: '\u21C1',
    397     DownTee: '\u22A4',
    398     Downarrow: '\u21D3',
    399     Element: '\u2208',
    400     EqualTilde: '\u2242',
    401     Equilibrium: '\u21CC',
    402     Exists: '\u2203',
    403     ExponentialE: '\u2147',
    404     FilledVerySmallSquare: '\u25AA',
    405     ForAll: '\u2200',
    406     Gamma: '\u0393',
    407     Gg: '\u22D9',
    408     GreaterEqual: '\u2265',
    409     GreaterEqualLess: '\u22DB',
    410     GreaterFullEqual: '\u2267',
    411     GreaterLess: '\u2277',
    412     GreaterSlantEqual: '\u2A7E',
    413     GreaterTilde: '\u2273',
    414     Hacek: '\u02C7',
    415     Hat: '\u005E',
    416     HumpDownHump: '\u224E',
    417     HumpEqual: '\u224F',
    418     Im: '\u2111',
    419     ImaginaryI: '\u2148',
    420     Integral: '\u222B',
    421     Intersection: '\u22C2',
    422     InvisibleComma: '\u2063',
    423     InvisibleTimes: '\u2062',
    424     Lambda: '\u039B',
    425     Larr: '\u219E',
    426     LeftAngleBracket: '\u27E8',
    427     LeftArrow: '\u2190',
    428     LeftArrowRightArrow: '\u21C6',
    429     LeftCeiling: '\u2308',
    430     LeftDownVector: '\u21C3',
    431     LeftFloor: '\u230A',
    432     LeftRightArrow: '\u2194',
    433     LeftTee: '\u22A3',
    434     LeftTriangle: '\u22B2',
    435     LeftTriangleEqual: '\u22B4',
    436     LeftUpVector: '\u21BF',
    437     LeftVector: '\u21BC',
    438     Leftarrow: '\u21D0',
    439     Leftrightarrow: '\u21D4',
    440     LessEqualGreater: '\u22DA',
    441     LessFullEqual: '\u2266',
    442     LessGreater: '\u2276',
    443     LessSlantEqual: '\u2A7D',
    444     LessTilde: '\u2272',
    445     Ll: '\u22D8',
    446     Lleftarrow: '\u21DA',
    447     LongLeftArrow: '\u27F5',
    448     LongLeftRightArrow: '\u27F7',
    449     LongRightArrow: '\u27F6',
    450     Longleftarrow: '\u27F8',
    451     Longleftrightarrow: '\u27FA',
    452     Longrightarrow: '\u27F9',
    453     Lsh: '\u21B0',
    454     MinusPlus: '\u2213',
    455     NestedGreaterGreater: '\u226B',
    456     NestedLessLess: '\u226A',
    457     NotDoubleVerticalBar: '\u2226',
    458     NotElement: '\u2209',
    459     NotEqual: '\u2260',
    460     NotExists: '\u2204',
    461     NotGreater: '\u226F',
    462     NotGreaterEqual: '\u2271',
    463     NotLeftTriangle: '\u22EA',
    464     NotLeftTriangleEqual: '\u22EC',
    465     NotLess: '\u226E',
    466     NotLessEqual: '\u2270',
    467     NotPrecedes: '\u2280',
    468     NotPrecedesSlantEqual: '\u22E0',
    469     NotRightTriangle: '\u22EB',
    470     NotRightTriangleEqual: '\u22ED',
    471     NotSubsetEqual: '\u2288',
    472     NotSucceeds: '\u2281',
    473     NotSucceedsSlantEqual: '\u22E1',
    474     NotSupersetEqual: '\u2289',
    475     NotTilde: '\u2241',
    476     NotVerticalBar: '\u2224',
    477     Omega: '\u03A9',
    478     OverBar: '\u203E',
    479     OverBrace: '\u23DE',
    480     PartialD: '\u2202',
    481     Phi: '\u03A6',
    482     Pi: '\u03A0',
    483     PlusMinus: '\u00B1',
    484     Precedes: '\u227A',
    485     PrecedesEqual: '\u2AAF',
    486     PrecedesSlantEqual: '\u227C',
    487     PrecedesTilde: '\u227E',
    488     Product: '\u220F',
    489     Proportional: '\u221D',
    490     Psi: '\u03A8',
    491     Rarr: '\u21A0',
    492     Re: '\u211C',
    493     ReverseEquilibrium: '\u21CB',
    494     RightAngleBracket: '\u27E9',
    495     RightArrow: '\u2192',
    496     RightArrowLeftArrow: '\u21C4',
    497     RightCeiling: '\u2309',
    498     RightDownVector: '\u21C2',
    499     RightFloor: '\u230B',
    500     RightTee: '\u22A2',
    501     RightTeeArrow: '\u21A6',
    502     RightTriangle: '\u22B3',
    503     RightTriangleEqual: '\u22B5',
    504     RightUpVector: '\u21BE',
    505     RightVector: '\u21C0',
    506     Rightarrow: '\u21D2',
    507     Rrightarrow: '\u21DB',
    508     Rsh: '\u21B1',
    509     Sigma: '\u03A3',
    510     SmallCircle: '\u2218',
    511     Sqrt: '\u221A',
    512     Square: '\u25A1',
    513     SquareIntersection: '\u2293',
    514     SquareSubset: '\u228F',
    515     SquareSubsetEqual: '\u2291',
    516     SquareSuperset: '\u2290',
    517     SquareSupersetEqual: '\u2292',
    518     SquareUnion: '\u2294',
    519     Star: '\u22C6',
    520     Subset: '\u22D0',
    521     SubsetEqual: '\u2286',
    522     Succeeds: '\u227B',
    523     SucceedsEqual: '\u2AB0',
    524     SucceedsSlantEqual: '\u227D',
    525     SucceedsTilde: '\u227F',
    526     SuchThat: '\u220B',
    527     Sum: '\u2211',
    528     Superset: '\u2283',
    529     SupersetEqual: '\u2287',
    530     Supset: '\u22D1',
    531     Therefore: '\u2234',
    532     Theta: '\u0398',
    533     Tilde: '\u223C',
    534     TildeEqual: '\u2243',
    535     TildeFullEqual: '\u2245',
    536     TildeTilde: '\u2248',
    537     UnderBar: '\u005F',
    538     UnderBrace: '\u23DF',
    539     Union: '\u22C3',
    540     UnionPlus: '\u228E',
    541     UpArrow: '\u2191',
    542     UpDownArrow: '\u2195',
    543     UpTee: '\u22A5',
    544     Uparrow: '\u21D1',
    545     Updownarrow: '\u21D5',
    546     Upsilon: '\u03A5',
    547     Vdash: '\u22A9',
    548     Vee: '\u22C1',
    549     VerticalBar: '\u2223',
    550     VerticalTilde: '\u2240',
    551     Vvdash: '\u22AA',
    552     Wedge: '\u22C0',
    553     Xi: '\u039E',
    554     acute: '\u00B4',
    555     aleph: '\u2135',
    556     alpha: '\u03B1',
    557     amalg: '\u2A3F',
    558     and: '\u2227',
    559     ang: '\u2220',
    560     angmsd: '\u2221',
    561     angsph: '\u2222',
    562     ape: '\u224A',
    563     backprime: '\u2035',
    564     backsim: '\u223D',
    565     backsimeq: '\u22CD',
    566     beta: '\u03B2',
    567     beth: '\u2136',
    568     between: '\u226C',
    569     bigcirc: '\u25EF',
    570     bigodot: '\u2A00',
    571     bigoplus: '\u2A01',
    572     bigotimes: '\u2A02',
    573     bigsqcup: '\u2A06',
    574     bigstar: '\u2605',
    575     bigtriangledown: '\u25BD',
    576     bigtriangleup: '\u25B3',
    577     biguplus: '\u2A04',
    578     blacklozenge: '\u29EB',
    579     blacktriangle: '\u25B4',
    580     blacktriangledown: '\u25BE',
    581     blacktriangleleft: '\u25C2',
    582     bowtie: '\u22C8',
    583     boxdl: '\u2510',
    584     boxdr: '\u250C',
    585     boxminus: '\u229F',
    586     boxplus: '\u229E',
    587     boxtimes: '\u22A0',
    588     boxul: '\u2518',
    589     boxur: '\u2514',
    590     bsol: '\u005C',
    591     bull: '\u2022',
    592     cap: '\u2229',
    593     check: '\u2713',
    594     chi: '\u03C7',
    595     circ: '\u02C6',
    596     circeq: '\u2257',
    597     circlearrowleft: '\u21BA',
    598     circlearrowright: '\u21BB',
    599     circledR: '\u00AE',
    600     circledS: '\u24C8',
    601     circledast: '\u229B',
    602     circledcirc: '\u229A',
    603     circleddash: '\u229D',
    604     clubs: '\u2663',
    605     colon: '\u003A',
    606     comp: '\u2201',
    607     ctdot: '\u22EF',
    608     cuepr: '\u22DE',
    609     cuesc: '\u22DF',
    610     cularr: '\u21B6',
    611     cup: '\u222A',
    612     curarr: '\u21B7',
    613     curlyvee: '\u22CE',
    614     curlywedge: '\u22CF',
    615     dagger: '\u2020',
    616     daleth: '\u2138',
    617     ddarr: '\u21CA',
    618     deg: '\u00B0',
    619     delta: '\u03B4',
    620     digamma: '\u03DD',
    621     div: '\u00F7',
    622     divideontimes: '\u22C7',
    623     dot: '\u02D9',
    624     doteqdot: '\u2251',
    625     dotplus: '\u2214',
    626     dotsquare: '\u22A1',
    627     dtdot: '\u22F1',
    628     ecir: '\u2256',
    629     efDot: '\u2252',
    630     egs: '\u2A96',
    631     ell: '\u2113',
    632     els: '\u2A95',
    633     empty: '\u2205',
    634     epsi: '\u03B5',
    635     epsiv: '\u03F5',
    636     erDot: '\u2253',
    637     eta: '\u03B7',
    638     eth: '\u00F0',
    639     flat: '\u266D',
    640     fork: '\u22D4',
    641     frown: '\u2322',
    642     gEl: '\u2A8C',
    643     gamma: '\u03B3',
    644     gap: '\u2A86',
    645     gimel: '\u2137',
    646     gnE: '\u2269',
    647     gnap: '\u2A8A',
    648     gne: '\u2A88',
    649     gnsim: '\u22E7',
    650     gt: '\u003E',
    651     gtdot: '\u22D7',
    652     harrw: '\u21AD',
    653     hbar: '\u210F',
    654     hellip: '\u2026',
    655     hookleftarrow: '\u21A9',
    656     hookrightarrow: '\u21AA',
    657     imath: '\u0131',
    658     infin: '\u221E',
    659     intcal: '\u22BA',
    660     iota: '\u03B9',
    661     jmath: '\u0237',
    662     kappa: '\u03BA',
    663     kappav: '\u03F0',
    664     lEg: '\u2A8B',
    665     lambda: '\u03BB',
    666     lap: '\u2A85',
    667     larrlp: '\u21AB',
    668     larrtl: '\u21A2',
    669     lbrace: '\u007B',
    670     lbrack: '\u005B',
    671     le: '\u2264',
    672     leftleftarrows: '\u21C7',
    673     leftthreetimes: '\u22CB',
    674     lessdot: '\u22D6',
    675     lmoust: '\u23B0',
    676     lnE: '\u2268',
    677     lnap: '\u2A89',
    678     lne: '\u2A87',
    679     lnsim: '\u22E6',
    680     longmapsto: '\u27FC',
    681     looparrowright: '\u21AC',
    682     lowast: '\u2217',
    683     loz: '\u25CA',
    684     lt: '\u003C',
    685     ltimes: '\u22C9',
    686     ltri: '\u25C3',
    687     macr: '\u00AF',
    688     malt: '\u2720',
    689     mho: '\u2127',
    690     mu: '\u03BC',
    691     multimap: '\u22B8',
    692     nLeftarrow: '\u21CD',
    693     nLeftrightarrow: '\u21CE',
    694     nRightarrow: '\u21CF',
    695     nVDash: '\u22AF',
    696     nVdash: '\u22AE',
    697     natur: '\u266E',
    698     nearr: '\u2197',
    699     nharr: '\u21AE',
    700     nlarr: '\u219A',
    701     not: '\u00AC',
    702     nrarr: '\u219B',
    703     nu: '\u03BD',
    704     nvDash: '\u22AD',
    705     nvdash: '\u22AC',
    706     nwarr: '\u2196',
    707     omega: '\u03C9',
    708     omicron: '\u03BF',
    709     or: '\u2228',
    710     osol: '\u2298',
    711     period: '\u002E',
    712     phi: '\u03C6',
    713     phiv: '\u03D5',
    714     pi: '\u03C0',
    715     piv: '\u03D6',
    716     prap: '\u2AB7',
    717     precnapprox: '\u2AB9',
    718     precneqq: '\u2AB5',
    719     precnsim: '\u22E8',
    720     prime: '\u2032',
    721     psi: '\u03C8',
    722     rarrtl: '\u21A3',
    723     rbrace: '\u007D',
    724     rbrack: '\u005D',
    725     rho: '\u03C1',
    726     rhov: '\u03F1',
    727     rightrightarrows: '\u21C9',
    728     rightthreetimes: '\u22CC',
    729     ring: '\u02DA',
    730     rmoust: '\u23B1',
    731     rtimes: '\u22CA',
    732     rtri: '\u25B9',
    733     scap: '\u2AB8',
    734     scnE: '\u2AB6',
    735     scnap: '\u2ABA',
    736     scnsim: '\u22E9',
    737     sdot: '\u22C5',
    738     searr: '\u2198',
    739     sect: '\u00A7',
    740     sharp: '\u266F',
    741     sigma: '\u03C3',
    742     sigmav: '\u03C2',
    743     simne: '\u2246',
    744     smile: '\u2323',
    745     spades: '\u2660',
    746     sub: '\u2282',
    747     subE: '\u2AC5',
    748     subnE: '\u2ACB',
    749     subne: '\u228A',
    750     supE: '\u2AC6',
    751     supnE: '\u2ACC',
    752     supne: '\u228B',
    753     swarr: '\u2199',
    754     tau: '\u03C4',
    755     theta: '\u03B8',
    756     thetav: '\u03D1',
    757     tilde: '\u02DC',
    758     times: '\u00D7',
    759     triangle: '\u25B5',
    760     triangleq: '\u225C',
    761     upsi: '\u03C5',
    762     upuparrows: '\u21C8',
    763     veebar: '\u22BB',
    764     vellip: '\u22EE',
    765     weierp: '\u2118',
    766     xi: '\u03BE',
    767     yen: '\u00A5',
    768     zeta: '\u03B6',
    769     zigrarr: '\u21DD'
    770   };
    771   
    772   MATHML.loadComplete("jax.js");
    773   
    774 })(MathJax.InputJax.MathML,MathJax.Hub.Browser);