aboutsummaryrefslogtreecommitdiff
path: root/js/mathjax/jax/input
diff options
context:
space:
mode:
Diffstat (limited to 'js/mathjax/jax/input')
-rw-r--r--js/mathjax/jax/input/AsciiMath/config.js48
-rw-r--r--js/mathjax/jax/input/AsciiMath/jax.js1543
-rw-r--r--js/mathjax/jax/input/MathML/config.js43
-rw-r--r--js/mathjax/jax/input/MathML/entities/a.js92
-rw-r--r--js/mathjax/jax/input/MathML/entities/b.js118
-rw-r--r--js/mathjax/jax/input/MathML/entities/c.js116
-rw-r--r--js/mathjax/jax/input/MathML/entities/d.js114
-rw-r--r--js/mathjax/jax/input/MathML/entities/e.js94
-rw-r--r--js/mathjax/jax/input/MathML/entities/f.js62
-rw-r--r--js/mathjax/jax/input/MathML/entities/fr.js81
-rw-r--r--js/mathjax/jax/input/MathML/entities/g.js85
-rw-r--r--js/mathjax/jax/input/MathML/entities/h.js54
-rw-r--r--js/mathjax/jax/input/MathML/entities/i.js88
-rw-r--r--js/mathjax/jax/input/MathML/entities/j.js37
-rw-r--r--js/mathjax/jax/input/MathML/entities/k.js39
-rw-r--r--js/mathjax/jax/input/MathML/entities/l.js181
-rw-r--r--js/mathjax/jax/input/MathML/entities/m.js63
-rw-r--r--js/mathjax/jax/input/MathML/entities/n.js222
-rw-r--r--js/mathjax/jax/input/MathML/entities/o.js92
-rw-r--r--js/mathjax/jax/input/MathML/entities/opf.js81
-rw-r--r--js/mathjax/jax/input/MathML/entities/p.js86
-rw-r--r--js/mathjax/jax/input/MathML/entities/q.js37
-rw-r--r--js/mathjax/jax/input/MathML/entities/r.js140
-rw-r--r--js/mathjax/jax/input/MathML/entities/s.js172
-rw-r--r--js/mathjax/jax/input/MathML/entities/scr.js81
-rw-r--r--js/mathjax/jax/input/MathML/entities/t.js88
-rw-r--r--js/mathjax/jax/input/MathML/entities/u.js94
-rw-r--r--js/mathjax/jax/input/MathML/entities/v.js75
-rw-r--r--js/mathjax/jax/input/MathML/entities/w.js37
-rw-r--r--js/mathjax/jax/input/MathML/entities/x.js49
-rw-r--r--js/mathjax/jax/input/MathML/entities/y.js43
-rw-r--r--js/mathjax/jax/input/MathML/entities/z.js44
-rw-r--r--js/mathjax/jax/input/MathML/jax.js783
-rw-r--r--js/mathjax/jax/input/TeX/config.js56
-rw-r--r--js/mathjax/jax/input/TeX/jax.js2373
35 files changed, 7411 insertions, 0 deletions
diff --git a/js/mathjax/jax/input/AsciiMath/config.js b/js/mathjax/jax/input/AsciiMath/config.js
new file mode 100644
index 0000000..97f5369
--- /dev/null
+++ b/js/mathjax/jax/input/AsciiMath/config.js
@@ -0,0 +1,48 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+
+/*************************************************************
+ *
+ * MathJax/jax/input/AsciiMath/config.js
+ *
+ * Initializes the AsciiMath InputJax (the main definition is in
+ * MathJax/jax/input/AsciiMath/jax.js, which is loaded when needed).
+ *
+ * Originally adapted for MathJax by David Lippman.
+ * Additional work done by Davide P. Cervone.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * Copyright (c) 2012-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+MathJax.InputJax.AsciiMath = MathJax.InputJax({
+ id: "AsciiMath",
+ version: "2.7.9",
+ directory: MathJax.InputJax.directory + "/AsciiMath",
+ extensionDir: MathJax.InputJax.extensionDir + "/AsciiMath",
+
+ config: {
+ fixphi: true, // switch phi and varphi unicode values
+ useMathMLspacing: true, // use MathML spacing rather than TeX spacing?
+ displaystyle: true, // put limits above and below operators
+ decimalsign: "." // can change to "," but watch out for "(1,2)"
+ }
+});
+MathJax.InputJax.AsciiMath.Register("math/asciimath");
+
+MathJax.InputJax.AsciiMath.loadComplete("config.js");
+// @license-end
diff --git a/js/mathjax/jax/input/AsciiMath/jax.js b/js/mathjax/jax/input/AsciiMath/jax.js
new file mode 100644
index 0000000..bad0cd8
--- /dev/null
+++ b/js/mathjax/jax/input/AsciiMath/jax.js
@@ -0,0 +1,1543 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+
+/*************************************************************
+ *
+ * MathJax/jax/input/AsciiMath/jax.js
+ *
+ * An Input Jax for AsciiMath notation
+ * (see http://www1.chapman.edu/~jipsen/mathml/asciimath.html).
+ *
+ * Originally adapted for MathJax by David Lippman.
+ * Additional work done by Davide P. Cervone.
+ *
+ * The current development repository for AsciiMathML is
+ * https://github.com/mathjax/asciimathml
+ *
+ * A portion of this file is taken from
+ * ASCIIMathML.js Version 2.2 Mar 3, 2014, (c) Peter Jipsen http://www.chapman.edu/~jipsen
+ * and is used by permission of Peter Jipsen, who has agreed to allow us to
+ * release it under the Apache2 license (see below). That portion is indicated
+ * via comments.
+ *
+ * The remainder falls under the copyright that follows.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * Copyright (c) 2012-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function (ASCIIMATH) {
+
+ var MML; // Filled in later
+
+ //
+ // Make a documentFragment work-alike that uses MML objects
+ // rather than DOM objects.
+ //
+ var DOCFRAG = MathJax.Object.Subclass({
+ firstChild: null,
+ lastChild: null,
+ Init: function () {
+ this.childNodes = [];
+ },
+ appendChild: function (node) {
+ if (node.parent) {node.parent.removeChild(node)}
+ if (this.lastChild) {this.lastChild.nextSibling = node}
+ if (!this.firstChild) {this.firstChild = node}
+ this.childNodes.push(node); node.parent = this;
+ this.lastChild = node;
+ return node;
+ },
+ removeChild: function (node) {
+ for (var i = 0, m = this.childNodes.length; i < m; i++)
+ {if (this.childNodes[i] === node) break}
+ if (i === m) return;
+ this.childNodes.splice(i,1);
+ if (node === this.firstChild) {this.firstChild = node.nextSibling}
+ if (node === this.lastChild) {
+ if (!this.childNodes.length) {this.lastChild = null}
+ else {this.lastChild = this.childNodes[this.childNodes.length-1]}
+ }
+ if (i) {this.childNodes[i-1].nextSibling = node.nextSibling}
+ node.nextSibling = node.parent = null;
+ return node;
+ },
+ replaceChild: function (node,old) {
+ for (var i = 0, m = this.childNodes.length; i < m; i++)
+ {if (this.childNodes[i] === old) break}
+ if (i) {this.childNodes[i-1].nextSibling = node} else {this.firstChild = node}
+ if (i >= m-1) {this.lastChild = node}
+ this.childNodes[i] = node; node.nextSibling = old.nextSibling;
+ old.nextSibling = old.parent = null;
+ return old;
+ },
+ hasChildNodes: function (node) {
+ return (this.childNodes.length>0);
+ },
+ toString: function () {return "{"+this.childNodes.join("")+"}"}
+ });
+
+ var INITASCIIMATH = function () {
+ MML = MathJax.ElementJax.mml;
+ var MBASEINIT = MML.mbase.prototype.Init;
+
+ //
+ // Make MML elements looks like DOM elements (add the
+ // methods that AsciiMath needs)
+ //
+ MML.mbase.Augment({
+ firstChild: null,
+ lastChild: null,
+ nodeValue: null,
+ nextSibling: null,
+ Init: function () {
+ var obj = MBASEINIT.apply(this,arguments) || this;
+ obj.childNodes = obj.data;
+ obj.nodeName = obj.type;
+ return obj;
+ },
+ appendChild: function (node) {
+ if (node.parent) {node.parent.removeChild(node)}
+ var nodes = arguments;
+ if (node.isa(DOCFRAG)) {
+ nodes = node.childNodes;
+ node.data = node.childNodes = [];
+ node.firstChild = node.lastChild = null;
+ }
+ for (var i = 0, m = nodes.length; i < m; i++) {
+ node = nodes[i];
+ if (this.lastChild) {this.lastChild.nextSibling = node}
+ if (!this.firstChild) {this.firstChild = node}
+ this.Append(node);
+ this.lastChild = node;
+ }
+ return node;
+ },
+ removeChild: function (node) {
+ for (var i = 0, m = this.childNodes.length; i < m; i++)
+ {if (this.childNodes[i] === node) break}
+ if (i === m) return;
+ this.childNodes.splice(i,1);
+ if (node === this.firstChild) {this.firstChild = node.nextSibling}
+ if (node === this.lastChild) {
+ if (!this.childNodes.length) {this.lastChild = null}
+ else {this.lastChild = this.childNodes[this.childNodes.length-1]}
+ }
+ if (i) {this.childNodes[i-1].nextSibling = node.nextSibling}
+ node.nextSibling = node.parent = null;
+ return node;
+ },
+ replaceChild: function (node,old) {
+ for (var i = 0, m = this.childNodes.length; i < m; i++)
+ {if (this.childNodes[i] === old) break}
+ // FIXME: make this work with DOCFRAG's?
+ if (i) {this.childNodes[i-1].nextSibling = node} else {this.firstChild = node}
+ if (i >= m-1) {this.lastChild = node}
+ this.SetData(i,node); node.nextSibling = old.nextSibling;
+ old.nextSibling = old.parent = null;
+ return old;
+ },
+ hasChildNodes: function (node) {
+ return (this.childNodes.length>0);
+ },
+ setAttribute: function (name,value) {this[name] = value}
+ });
+ };
+
+ //
+ // Set up to isolate ASCIIMathML.js
+ //
+
+ var window = {}; // hide the true window
+
+ //
+ // Hide the true document, and add functions that
+ // use and produce MML objects instead of DOM objects
+ //
+ var document = {
+ getElementById: true,
+ createElementNS: function (ns,type) {
+ var node = MML[type]();
+ if (type === "mo" && ASCIIMATH.config.useMathMLspacing) {node.useMMLspacing = 0x80}
+ return node;
+ },
+ createTextNode: function (text) {return MML.chars(text).With({nodeValue:text})},
+ createDocumentFragment: function () {return DOCFRAG()}
+ };
+
+ var navigator = {appName: "MathJax"}; // hide the true navigator object
+
+/******************************************************************
+ *
+ * The following section is ASCIIMathML.js Version 2.2
+ * (c) Peter Jipsen, used with permission.
+ *
+ * Some sections are commented out to save space in the
+ * minified version (but that is not strictly necessary).
+ *
+ ******************************************************************/
+
+/*
+ASCIIMathML.js
+==============
+This file contains JavaScript functions to convert ASCII math notation
+and (some) LaTeX to Presentation MathML. The conversion is done while the
+HTML page loads, and should work with Firefox and other browsers that can
+render MathML.
+
+Just add the next line to your HTML page with this file in the same folder:
+
+<script type="text/javascript" src="ASCIIMathML.js"></script>
+
+Version 2.2 Mar 3, 2014.
+Latest version at https://github.com/mathjax/asciimathml
+If you use it on a webpage, please send the URL to jipsen@chapman.edu
+
+Copyright (c) 2014 Peter Jipsen and other ASCIIMathML.js contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+//var asciimath = {};
+
+//(function(){
+var mathcolor = "blue"; // change it to "" (to inherit) or another color
+//var mathfontsize = "1em"; // change to e.g. 1.2em for larger math
+//var mathfontfamily = "serif"; // change to "" to inherit (works in IE)
+ // or another family (e.g. "arial")
+//var automathrecognize = false; // writing "amath" on page makes this true
+//var checkForMathML = true; // check if browser can display MathML
+//var notifyIfNoMathML = true; // display note at top if no MathML capability
+//var alertIfNoMathML = false; // show alert box if no MathML capability
+//var translateOnLoad = true; // set to false to do call translators from js
+//var translateASCIIMath = true; // false to preserve `..`
+var displaystyle = true; // puts limits above and below large operators
+var showasciiformulaonhover = true; // helps students learn ASCIIMath
+var decimalsign = "."; // change to "," if you like, beware of `(1,2)`!
+//var AMdelimiter1 = "`", AMescape1 = "\\\\`"; // can use other characters
+//var AMdocumentId = "wikitext" // PmWiki element containing math (default=body)
+var fixphi = true; //false to return to legacy phi/varphi mapping
+
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+
+var isIE = (navigator.appName.slice(0,9)=="Microsoft");
+/*
+var noMathML = false, translated = false;
+
+if (isIE) { // add MathPlayer info to IE webpages
+ document.write("<object id=\"mathplayer\"\
+ classid=\"clsid:32F66A20-7614-11D4-BD11-00104BD3F987\"></object>");
+ document.write("<?import namespace=\"m\" implementation=\"#mathplayer\"?>");
+}
+
+// Add a stylesheet, replacing any previous custom stylesheet (adapted from TW)
+function setStylesheet(s) {
+ var id = "AMMLcustomStyleSheet";
+ var n = document.getElementById(id);
+ if(document.createStyleSheet) {
+ // Test for IE's non-standard createStyleSheet method
+ if(n)
+ n.parentNode.removeChild(n);
+ // This failed without the &nbsp;
+ document.getElementsByTagName("head")[0].insertAdjacentHTML("beforeEnd","&nbsp;<style id='" + id + "'>" + s + "</style>");
+ } else {
+ if(n) {
+ n.replaceChild(document.createTextNode(s),n.firstChild);
+ } else {
+ n = document.createElement("style");
+ n.type = "text/css";
+ n.id = id;
+ n.appendChild(document.createTextNode(s));
+ document.getElementsByTagName("head")[0].appendChild(n);
+ }
+ }
+}
+
+setStylesheet("#AMMLcloseDiv \{font-size:0.8em; padding-top:1em; color:#014\}\n#AMMLwarningBox \{position:absolute; width:100%; top:0; left:0; z-index:200; text-align:center; font-size:1em; font-weight:bold; padding:0.5em 0 0.5em 0; color:#ffc; background:#c30\}");
+
+function init(){
+ var msg, warnings = new Array();
+ if (document.getElementById==null){
+ alert("This webpage requires a recent browser such as Mozilla Firefox");
+ return null;
+ }
+ if (checkForMathML && (msg = checkMathML())) warnings.push(msg);
+ if (warnings.length>0) displayWarnings(warnings);
+ if (!noMathML) initSymbols();
+ return true;
+}
+
+function checkMathML(){
+ if (navigator.appName.slice(0,8)=="Netscape")
+ if (navigator.appVersion.slice(0,1)>="5") noMathML = null;
+ else noMathML = true;
+ else if (navigator.appName.slice(0,9)=="Microsoft")
+ try {
+ var ActiveX = new ActiveXObject("MathPlayer.Factory.1");
+ noMathML = null;
+ } catch (e) {
+ noMathML = true;
+ }
+ else if (navigator.appName.slice(0,5)=="Opera")
+ if (navigator.appVersion.slice(0,3)>="9.5") noMathML = null;
+ else noMathML = true;
+//noMathML = true; //uncomment to check
+ if (noMathML && notifyIfNoMathML) {
+ var msg = "To view the ASCIIMathML notation use Internet Explorer + MathPlayer or Mozilla Firefox 2.0 or later.";
+ if (alertIfNoMathML)
+ alert(msg);
+ else return msg;
+ }
+}
+
+function hideWarning(){
+ var body = document.getElementsByTagName("body")[0];
+ body.removeChild(document.getElementById('AMMLwarningBox'));
+ body.onclick = null;
+}
+
+function displayWarnings(warnings) {
+ var i, frag, nd = createElementXHTML("div");
+ var body = document.getElementsByTagName("body")[0];
+ body.onclick=hideWarning;
+ nd.id = 'AMMLwarningBox';
+ for (i=0; i<warnings.length; i++) {
+ frag = createElementXHTML("div");
+ frag.appendChild(document.createTextNode(warnings[i]));
+ frag.style.paddingBottom = "1.0em";
+ nd.appendChild(frag);
+ }
+ nd.appendChild(createElementXHTML("p"));
+ nd.appendChild(document.createTextNode("For instructions see the "));
+ var an = createElementXHTML("a");
+ an.appendChild(document.createTextNode("ASCIIMathML"));
+ an.setAttribute("href","http://www.chapman.edu/~jipsen/asciimath.html");
+ nd.appendChild(an);
+ nd.appendChild(document.createTextNode(" homepage"));
+ an = createElementXHTML("div");
+ an.id = 'AMMLcloseDiv';
+ an.appendChild(document.createTextNode('(click anywhere to close this warning)'));
+ nd.appendChild(an);
+ var body = document.getElementsByTagName("body")[0];
+ body.insertBefore(nd,body.childNodes[0]);
+}
+
+function translate(spanclassAM) {
+ if (!translated) { // run this only once
+ translated = true;
+ var body = document.getElementsByTagName("body")[0];
+ var processN = document.getElementById(AMdocumentId);
+ if (translateASCIIMath) AMprocessNode((processN!=null?processN:body), false, spanclassAM);
+ }
+}
+*/
+function createElementXHTML(t) {
+ if (isIE) return document.createElement(t);
+ else return document.createElementNS("http://www.w3.org/1999/xhtml",t);
+}
+
+var AMmathml = "http://www.w3.org/1998/Math/MathML";
+
+function AMcreateElementMathML(t) {
+ if (isIE) return document.createElement("m:"+t);
+ else return document.createElementNS(AMmathml,t);
+}
+
+function createMmlNode(t,frag) {
+ var node;
+ if (isIE) node = document.createElement("m:"+t);
+ else node = document.createElementNS(AMmathml,t);
+ if (frag) node.appendChild(frag);
+ return node;
+}
+
+function newcommand(oldstr,newstr) {
+ AMsymbols.push({input:oldstr, tag:"mo", output:newstr, tex:null, ttype:DEFINITION});
+ refreshSymbols();
+}
+
+function newsymbol(symbolobj) {
+ AMsymbols.push(symbolobj);
+ refreshSymbols();
+}
+
+// character lists for Mozilla/Netscape fonts
+var AMcal = ["\uD835\uDC9C","\u212C","\uD835\uDC9E","\uD835\uDC9F","\u2130","\u2131","\uD835\uDCA2","\u210B","\u2110","\uD835\uDCA5","\uD835\uDCA6","\u2112","\u2133","\uD835\uDCA9","\uD835\uDCAA","\uD835\uDCAB","\uD835\uDCAC","\u211B","\uD835\uDCAE","\uD835\uDCAF","\uD835\uDCB0","\uD835\uDCB1","\uD835\uDCB2","\uD835\uDCB3","\uD835\uDCB4","\uD835\uDCB5","\uD835\uDCB6","\uD835\uDCB7","\uD835\uDCB8","\uD835\uDCB9","\u212F","\uD835\uDCBB","\u210A","\uD835\uDCBD","\uD835\uDCBE","\uD835\uDCBF","\uD835\uDCC0","\uD835\uDCC1","\uD835\uDCC2","\uD835\uDCC3","\u2134","\uD835\uDCC5","\uD835\uDCC6","\uD835\uDCC7","\uD835\uDCC8","\uD835\uDCC9","\uD835\uDCCA","\uD835\uDCCB","\uD835\uDCCC","\uD835\uDCCD","\uD835\uDCCE","\uD835\uDCCF"];
+
+var AMfrk = ["\uD835\uDD04","\uD835\uDD05","\u212D","\uD835\uDD07","\uD835\uDD08","\uD835\uDD09","\uD835\uDD0A","\u210C","\u2111","\uD835\uDD0D","\uD835\uDD0E","\uD835\uDD0F","\uD835\uDD10","\uD835\uDD11","\uD835\uDD12","\uD835\uDD13","\uD835\uDD14","\u211C","\uD835\uDD16","\uD835\uDD17","\uD835\uDD18","\uD835\uDD19","\uD835\uDD1A","\uD835\uDD1B","\uD835\uDD1C","\u2128","\uD835\uDD1E","\uD835\uDD1F","\uD835\uDD20","\uD835\uDD21","\uD835\uDD22","\uD835\uDD23","\uD835\uDD24","\uD835\uDD25","\uD835\uDD26","\uD835\uDD27","\uD835\uDD28","\uD835\uDD29","\uD835\uDD2A","\uD835\uDD2B","\uD835\uDD2C","\uD835\uDD2D","\uD835\uDD2E","\uD835\uDD2F","\uD835\uDD30","\uD835\uDD31","\uD835\uDD32","\uD835\uDD33","\uD835\uDD34","\uD835\uDD35","\uD835\uDD36","\uD835\uDD37"];
+
+var AMbbb = ["\uD835\uDD38","\uD835\uDD39","\u2102","\uD835\uDD3B","\uD835\uDD3C","\uD835\uDD3D","\uD835\uDD3E","\u210D","\uD835\uDD40","\uD835\uDD41","\uD835\uDD42","\uD835\uDD43","\uD835\uDD44","\u2115","\uD835\uDD46","\u2119","\u211A","\u211D","\uD835\uDD4A","\uD835\uDD4B","\uD835\uDD4C","\uD835\uDD4D","\uD835\uDD4E","\uD835\uDD4F","\uD835\uDD50","\u2124","\uD835\uDD52","\uD835\uDD53","\uD835\uDD54","\uD835\uDD55","\uD835\uDD56","\uD835\uDD57","\uD835\uDD58","\uD835\uDD59","\uD835\uDD5A","\uD835\uDD5B","\uD835\uDD5C","\uD835\uDD5D","\uD835\uDD5E","\uD835\uDD5F","\uD835\uDD60","\uD835\uDD61","\uD835\uDD62","\uD835\uDD63","\uD835\uDD64","\uD835\uDD65","\uD835\uDD66","\uD835\uDD67","\uD835\uDD68","\uD835\uDD69","\uD835\uDD6A","\uD835\uDD6B"];
+/*var AMcal = [0xEF35,0x212C,0xEF36,0xEF37,0x2130,0x2131,0xEF38,0x210B,0x2110,0xEF39,0xEF3A,0x2112,0x2133,0xEF3B,0xEF3C,0xEF3D,0xEF3E,0x211B,0xEF3F,0xEF40,0xEF41,0xEF42,0xEF43,0xEF44,0xEF45,0xEF46];
+var AMfrk = [0xEF5D,0xEF5E,0x212D,0xEF5F,0xEF60,0xEF61,0xEF62,0x210C,0x2111,0xEF63,0xEF64,0xEF65,0xEF66,0xEF67,0xEF68,0xEF69,0xEF6A,0x211C,0xEF6B,0xEF6C,0xEF6D,0xEF6E,0xEF6F,0xEF70,0xEF71,0x2128];
+var AMbbb = [0xEF8C,0xEF8D,0x2102,0xEF8E,0xEF8F,0xEF90,0xEF91,0x210D,0xEF92,0xEF93,0xEF94,0xEF95,0xEF96,0x2115,0xEF97,0x2119,0x211A,0x211D,0xEF98,0xEF99,0xEF9A,0xEF9B,0xEF9C,0xEF9D,0xEF9E,0x2124];*/
+
+var CONST = 0, UNARY = 1, BINARY = 2, INFIX = 3, LEFTBRACKET = 4,
+ RIGHTBRACKET = 5, SPACE = 6, UNDEROVER = 7, DEFINITION = 8,
+ LEFTRIGHT = 9, TEXT = 10, /*BIG = 11, LONG = 12, STRETCHY = 13,
+ MATRIX = 14,*/ UNARYUNDEROVER = 15; // token types
+
+var AMquote = {input:"\"", tag:"mtext", output:"mbox", tex:null, ttype:TEXT};
+
+var AMsymbols = [
+//some greek symbols
+{input:"alpha", tag:"mi", output:"\u03B1", tex:null, ttype:CONST},
+{input:"beta", tag:"mi", output:"\u03B2", tex:null, ttype:CONST},
+{input:"chi", tag:"mi", output:"\u03C7", tex:null, ttype:CONST},
+{input:"delta", tag:"mi", output:"\u03B4", tex:null, ttype:CONST},
+{input:"Delta", tag:"mo", output:"\u0394", tex:null, ttype:CONST},
+{input:"epsi", tag:"mi", output:"\u03B5", tex:"epsilon", ttype:CONST},
+{input:"varepsilon", tag:"mi", output:"\u025B", tex:null, ttype:CONST},
+{input:"eta", tag:"mi", output:"\u03B7", tex:null, ttype:CONST},
+{input:"gamma", tag:"mi", output:"\u03B3", tex:null, ttype:CONST},
+{input:"Gamma", tag:"mo", output:"\u0393", tex:null, ttype:CONST},
+{input:"iota", tag:"mi", output:"\u03B9", tex:null, ttype:CONST},
+{input:"kappa", tag:"mi", output:"\u03BA", tex:null, ttype:CONST},
+{input:"lambda", tag:"mi", output:"\u03BB", tex:null, ttype:CONST},
+{input:"Lambda", tag:"mo", output:"\u039B", tex:null, ttype:CONST},
+{input:"lamda", tag:"mi", output:"\u03BB", tex:null, ttype:CONST},
+{input:"Lamda", tag:"mo", output:"\u039B", tex:null, ttype:CONST},
+{input:"mu", tag:"mi", output:"\u03BC", tex:null, ttype:CONST},
+{input:"nu", tag:"mi", output:"\u03BD", tex:null, ttype:CONST},
+{input:"omega", tag:"mi", output:"\u03C9", tex:null, ttype:CONST},
+{input:"Omega", tag:"mo", output:"\u03A9", tex:null, ttype:CONST},
+{input:"phi", tag:"mi", output:fixphi?"\u03D5":"\u03C6", tex:null, ttype:CONST},
+{input:"varphi", tag:"mi", output:fixphi?"\u03C6":"\u03D5", tex:null, ttype:CONST},
+{input:"Phi", tag:"mo", output:"\u03A6", tex:null, ttype:CONST},
+{input:"pi", tag:"mi", output:"\u03C0", tex:null, ttype:CONST},
+{input:"Pi", tag:"mo", output:"\u03A0", tex:null, ttype:CONST},
+{input:"psi", tag:"mi", output:"\u03C8", tex:null, ttype:CONST},
+{input:"Psi", tag:"mi", output:"\u03A8", tex:null, ttype:CONST},
+{input:"rho", tag:"mi", output:"\u03C1", tex:null, ttype:CONST},
+{input:"sigma", tag:"mi", output:"\u03C3", tex:null, ttype:CONST},
+{input:"Sigma", tag:"mo", output:"\u03A3", tex:null, ttype:CONST},
+{input:"tau", tag:"mi", output:"\u03C4", tex:null, ttype:CONST},
+{input:"theta", tag:"mi", output:"\u03B8", tex:null, ttype:CONST},
+{input:"vartheta", tag:"mi", output:"\u03D1", tex:null, ttype:CONST},
+{input:"Theta", tag:"mo", output:"\u0398", tex:null, ttype:CONST},
+{input:"upsilon", tag:"mi", output:"\u03C5", tex:null, ttype:CONST},
+{input:"xi", tag:"mi", output:"\u03BE", tex:null, ttype:CONST},
+{input:"Xi", tag:"mo", output:"\u039E", tex:null, ttype:CONST},
+{input:"zeta", tag:"mi", output:"\u03B6", tex:null, ttype:CONST},
+
+//binary operation symbols
+//{input:"-", tag:"mo", output:"\u0096", tex:null, ttype:CONST},
+{input:"*", tag:"mo", output:"\u22C5", tex:"cdot", ttype:CONST},
+{input:"**", tag:"mo", output:"\u2217", tex:"ast", ttype:CONST},
+{input:"***", tag:"mo", output:"\u22C6", tex:"star", ttype:CONST},
+{input:"//", tag:"mo", output:"/", tex:null, ttype:CONST},
+{input:"\\\\", tag:"mo", output:"\\", tex:"backslash", ttype:CONST},
+{input:"setminus", tag:"mo", output:"\\", tex:null, ttype:CONST},
+{input:"xx", tag:"mo", output:"\u00D7", tex:"times", ttype:CONST},
+{input:"|><", tag:"mo", output:"\u22C9", tex:"ltimes", ttype:CONST},
+{input:"><|", tag:"mo", output:"\u22CA", tex:"rtimes", ttype:CONST},
+{input:"|><|", tag:"mo", output:"\u22C8", tex:"bowtie", ttype:CONST},
+{input:"-:", tag:"mo", output:"\u00F7", tex:"div", ttype:CONST},
+{input:"divide", tag:"mo", output:"-:", tex:null, ttype:DEFINITION},
+{input:"@", tag:"mo", output:"\u2218", tex:"circ", ttype:CONST},
+{input:"o+", tag:"mo", output:"\u2295", tex:"oplus", ttype:CONST},
+{input:"ox", tag:"mo", output:"\u2297", tex:"otimes", ttype:CONST},
+{input:"o.", tag:"mo", output:"\u2299", tex:"odot", ttype:CONST},
+{input:"sum", tag:"mo", output:"\u2211", tex:null, ttype:UNDEROVER},
+{input:"prod", tag:"mo", output:"\u220F", tex:null, ttype:UNDEROVER},
+{input:"^^", tag:"mo", output:"\u2227", tex:"wedge", ttype:CONST},
+{input:"^^^", tag:"mo", output:"\u22C0", tex:"bigwedge", ttype:UNDEROVER},
+{input:"vv", tag:"mo", output:"\u2228", tex:"vee", ttype:CONST},
+{input:"vvv", tag:"mo", output:"\u22C1", tex:"bigvee", ttype:UNDEROVER},
+{input:"nn", tag:"mo", output:"\u2229", tex:"cap", ttype:CONST},
+{input:"nnn", tag:"mo", output:"\u22C2", tex:"bigcap", ttype:UNDEROVER},
+{input:"uu", tag:"mo", output:"\u222A", tex:"cup", ttype:CONST},
+{input:"uuu", tag:"mo", output:"\u22C3", tex:"bigcup", ttype:UNDEROVER},
+
+//binary relation symbols
+{input:"!=", tag:"mo", output:"\u2260", tex:"ne", ttype:CONST},
+{input:":=", tag:"mo", output:":=", tex:null, ttype:CONST},
+{input:"lt", tag:"mo", output:"<", tex:null, ttype:CONST},
+{input:"<=", tag:"mo", output:"\u2264", tex:"le", ttype:CONST},
+{input:"lt=", tag:"mo", output:"\u2264", tex:"leq", ttype:CONST},
+{input:"gt", tag:"mo", output:">", tex:null, ttype:CONST},
+{input:">=", tag:"mo", output:"\u2265", tex:"ge", ttype:CONST},
+{input:"gt=", tag:"mo", output:"\u2265", tex:"geq", ttype:CONST},
+{input:"-<", tag:"mo", output:"\u227A", tex:"prec", ttype:CONST},
+{input:"-lt", tag:"mo", output:"\u227A", tex:null, ttype:CONST},
+{input:">-", tag:"mo", output:"\u227B", tex:"succ", ttype:CONST},
+{input:"-<=", tag:"mo", output:"\u2AAF", tex:"preceq", ttype:CONST},
+{input:">-=", tag:"mo", output:"\u2AB0", tex:"succeq", ttype:CONST},
+{input:"in", tag:"mo", output:"\u2208", tex:null, ttype:CONST},
+{input:"!in", tag:"mo", output:"\u2209", tex:"notin", ttype:CONST},
+{input:"sub", tag:"mo", output:"\u2282", tex:"subset", ttype:CONST},
+{input:"sup", tag:"mo", output:"\u2283", tex:"supset", ttype:CONST},
+{input:"sube", tag:"mo", output:"\u2286", tex:"subseteq", ttype:CONST},
+{input:"supe", tag:"mo", output:"\u2287", tex:"supseteq", ttype:CONST},
+{input:"-=", tag:"mo", output:"\u2261", tex:"equiv", ttype:CONST},
+{input:"~=", tag:"mo", output:"\u2245", tex:"cong", ttype:CONST},
+{input:"~~", tag:"mo", output:"\u2248", tex:"approx", ttype:CONST},
+{input:"prop", tag:"mo", output:"\u221D", tex:"propto", ttype:CONST},
+
+//logical symbols
+{input:"and", tag:"mtext", output:"and", tex:null, ttype:SPACE},
+{input:"or", tag:"mtext", output:"or", tex:null, ttype:SPACE},
+{input:"not", tag:"mo", output:"\u00AC", tex:"neg", ttype:CONST},
+{input:"=>", tag:"mo", output:"\u21D2", tex:"implies", ttype:CONST},
+{input:"if", tag:"mo", output:"if", tex:null, ttype:SPACE},
+{input:"<=>", tag:"mo", output:"\u21D4", tex:"iff", ttype:CONST},
+{input:"AA", tag:"mo", output:"\u2200", tex:"forall", ttype:CONST},
+{input:"EE", tag:"mo", output:"\u2203", tex:"exists", ttype:CONST},
+{input:"_|_", tag:"mo", output:"\u22A5", tex:"bot", ttype:CONST},
+{input:"TT", tag:"mo", output:"\u22A4", tex:"top", ttype:CONST},
+{input:"|--", tag:"mo", output:"\u22A2", tex:"vdash", ttype:CONST},
+{input:"|==", tag:"mo", output:"\u22A8", tex:"models", ttype:CONST},
+
+//grouping brackets
+{input:"(", tag:"mo", output:"(", tex:"left(", ttype:LEFTBRACKET},
+{input:")", tag:"mo", output:")", tex:"right)", ttype:RIGHTBRACKET},
+{input:"[", tag:"mo", output:"[", tex:"left[", ttype:LEFTBRACKET},
+{input:"]", tag:"mo", output:"]", tex:"right]", ttype:RIGHTBRACKET},
+{input:"{", tag:"mo", output:"{", tex:null, ttype:LEFTBRACKET},
+{input:"}", tag:"mo", output:"}", tex:null, ttype:RIGHTBRACKET},
+{input:"|", tag:"mo", output:"|", tex:null, ttype:LEFTRIGHT},
+{input:":|:", tag:"mo", output:"|", tex:null, ttype:CONST},
+{input:"|:", tag:"mo", output:"|", tex:null, ttype:LEFTBRACKET},
+{input:":|", tag:"mo", output:"|", tex:null, ttype:RIGHTBRACKET},
+//{input:"||", tag:"mo", output:"||", tex:null, ttype:LEFTRIGHT},
+{input:"(:", tag:"mo", output:"\u2329", tex:"langle", ttype:LEFTBRACKET},
+{input:":)", tag:"mo", output:"\u232A", tex:"rangle", ttype:RIGHTBRACKET},
+{input:"<<", tag:"mo", output:"\u2329", tex:null, ttype:LEFTBRACKET},
+{input:">>", tag:"mo", output:"\u232A", tex:null, ttype:RIGHTBRACKET},
+{input:"{:", tag:"mo", output:"{:", tex:null, ttype:LEFTBRACKET, invisible:true},
+{input:":}", tag:"mo", output:":}", tex:null, ttype:RIGHTBRACKET, invisible:true},
+
+//miscellaneous symbols
+{input:"int", tag:"mo", output:"\u222B", tex:null, ttype:CONST},
+{input:"dx", tag:"mi", output:"{:d x:}", tex:null, ttype:DEFINITION},
+{input:"dy", tag:"mi", output:"{:d y:}", tex:null, ttype:DEFINITION},
+{input:"dz", tag:"mi", output:"{:d z:}", tex:null, ttype:DEFINITION},
+{input:"dt", tag:"mi", output:"{:d t:}", tex:null, ttype:DEFINITION},
+{input:"oint", tag:"mo", output:"\u222E", tex:null, ttype:CONST},
+{input:"del", tag:"mo", output:"\u2202", tex:"partial", ttype:CONST},
+{input:"grad", tag:"mo", output:"\u2207", tex:"nabla", ttype:CONST},
+{input:"+-", tag:"mo", output:"\u00B1", tex:"pm", ttype:CONST},
+{input:"O/", tag:"mo", output:"\u2205", tex:"emptyset", ttype:CONST},
+{input:"oo", tag:"mo", output:"\u221E", tex:"infty", ttype:CONST},
+{input:"aleph", tag:"mo", output:"\u2135", tex:null, ttype:CONST},
+{input:"...", tag:"mo", output:"...", tex:"ldots", ttype:CONST},
+{input:":.", tag:"mo", output:"\u2234", tex:"therefore", ttype:CONST},
+{input:":'", tag:"mo", output:"\u2235", tex:"because", ttype:CONST},
+{input:"/_", tag:"mo", output:"\u2220", tex:"angle", ttype:CONST},
+{input:"/_\\", tag:"mo", output:"\u25B3", tex:"triangle", ttype:CONST},
+{input:"'", tag:"mo", output:"\u2032", tex:"prime", ttype:CONST},
+{input:"tilde", tag:"mover", output:"~", tex:null, ttype:UNARY, acc:true},
+{input:"\\ ", tag:"mo", output:"\u00A0", tex:null, ttype:CONST},
+{input:"frown", tag:"mo", output:"\u2322", tex:null, ttype:CONST},
+{input:"quad", tag:"mo", output:"\u00A0\u00A0", tex:null, ttype:CONST},
+{input:"qquad", tag:"mo", output:"\u00A0\u00A0\u00A0\u00A0", tex:null, ttype:CONST},
+{input:"cdots", tag:"mo", output:"\u22EF", tex:null, ttype:CONST},
+{input:"vdots", tag:"mo", output:"\u22EE", tex:null, ttype:CONST},
+{input:"ddots", tag:"mo", output:"\u22F1", tex:null, ttype:CONST},
+{input:"diamond", tag:"mo", output:"\u22C4", tex:null, ttype:CONST},
+{input:"square", tag:"mo", output:"\u25A1", tex:null, ttype:CONST},
+{input:"|__", tag:"mo", output:"\u230A", tex:"lfloor", ttype:CONST},
+{input:"__|", tag:"mo", output:"\u230B", tex:"rfloor", ttype:CONST},
+{input:"|~", tag:"mo", output:"\u2308", tex:"lceiling", ttype:CONST},
+{input:"~|", tag:"mo", output:"\u2309", tex:"rceiling", ttype:CONST},
+{input:"CC", tag:"mo", output:"\u2102", tex:null, ttype:CONST},
+{input:"NN", tag:"mo", output:"\u2115", tex:null, ttype:CONST},
+{input:"QQ", tag:"mo", output:"\u211A", tex:null, ttype:CONST},
+{input:"RR", tag:"mo", output:"\u211D", tex:null, ttype:CONST},
+{input:"ZZ", tag:"mo", output:"\u2124", tex:null, ttype:CONST},
+{input:"f", tag:"mi", output:"f", tex:null, ttype:UNARY, func:true},
+{input:"g", tag:"mi", output:"g", tex:null, ttype:UNARY, func:true},
+
+//standard functions
+{input:"lim", tag:"mo", output:"lim", tex:null, ttype:UNDEROVER},
+{input:"Lim", tag:"mo", output:"Lim", tex:null, ttype:UNDEROVER},
+{input:"sin", tag:"mo", output:"sin", tex:null, ttype:UNARY, func:true},
+{input:"cos", tag:"mo", output:"cos", tex:null, ttype:UNARY, func:true},
+{input:"tan", tag:"mo", output:"tan", tex:null, ttype:UNARY, func:true},
+{input:"sinh", tag:"mo", output:"sinh", tex:null, ttype:UNARY, func:true},
+{input:"cosh", tag:"mo", output:"cosh", tex:null, ttype:UNARY, func:true},
+{input:"tanh", tag:"mo", output:"tanh", tex:null, ttype:UNARY, func:true},
+{input:"cot", tag:"mo", output:"cot", tex:null, ttype:UNARY, func:true},
+{input:"sec", tag:"mo", output:"sec", tex:null, ttype:UNARY, func:true},
+{input:"csc", tag:"mo", output:"csc", tex:null, ttype:UNARY, func:true},
+{input:"arcsin", tag:"mo", output:"arcsin", tex:null, ttype:UNARY, func:true},
+{input:"arccos", tag:"mo", output:"arccos", tex:null, ttype:UNARY, func:true},
+{input:"arctan", tag:"mo", output:"arctan", tex:null, ttype:UNARY, func:true},
+{input:"coth", tag:"mo", output:"coth", tex:null, ttype:UNARY, func:true},
+{input:"sech", tag:"mo", output:"sech", tex:null, ttype:UNARY, func:true},
+{input:"csch", tag:"mo", output:"csch", tex:null, ttype:UNARY, func:true},
+{input:"exp", tag:"mo", output:"exp", tex:null, ttype:UNARY, func:true},
+{input:"abs", tag:"mo", output:"abs", tex:null, ttype:UNARY, rewriteleftright:["|","|"]},
+{input:"norm", tag:"mo", output:"norm", tex:null, ttype:UNARY, rewriteleftright:["\u2225","\u2225"]},
+{input:"floor", tag:"mo", output:"floor", tex:null, ttype:UNARY, rewriteleftright:["\u230A","\u230B"]},
+{input:"ceil", tag:"mo", output:"ceil", tex:null, ttype:UNARY, rewriteleftright:["\u2308","\u2309"]},
+{input:"log", tag:"mo", output:"log", tex:null, ttype:UNARY, func:true},
+{input:"ln", tag:"mo", output:"ln", tex:null, ttype:UNARY, func:true},
+{input:"det", tag:"mo", output:"det", tex:null, ttype:UNARY, func:true},
+{input:"dim", tag:"mo", output:"dim", tex:null, ttype:CONST},
+{input:"mod", tag:"mo", output:"mod", tex:null, ttype:CONST},
+{input:"gcd", tag:"mo", output:"gcd", tex:null, ttype:UNARY, func:true},
+{input:"lcm", tag:"mo", output:"lcm", tex:null, ttype:UNARY, func:true},
+{input:"lub", tag:"mo", output:"lub", tex:null, ttype:CONST},
+{input:"glb", tag:"mo", output:"glb", tex:null, ttype:CONST},
+{input:"min", tag:"mo", output:"min", tex:null, ttype:UNDEROVER},
+{input:"max", tag:"mo", output:"max", tex:null, ttype:UNDEROVER},
+{input:"Sin", tag:"mo", output:"Sin", tex:null, ttype:UNARY, func:true},
+{input:"Cos", tag:"mo", output:"Cos", tex:null, ttype:UNARY, func:true},
+{input:"Tan", tag:"mo", output:"Tan", tex:null, ttype:UNARY, func:true},
+{input:"Arcsin", tag:"mo", output:"Arcsin", tex:null, ttype:UNARY, func:true},
+{input:"Arccos", tag:"mo", output:"Arccos", tex:null, ttype:UNARY, func:true},
+{input:"Arctan", tag:"mo", output:"Arctan", tex:null, ttype:UNARY, func:true},
+{input:"Sinh", tag:"mo", output:"Sinh", tex:null, ttype:UNARY, func:true},
+{input:"Cosh", tag:"mo", output:"Cosh", tex:null, ttype:UNARY, func:true},
+{input:"Tanh", tag:"mo", output:"Tanh", tex:null, ttype:UNARY, func:true},
+{input:"Cot", tag:"mo", output:"Cot", tex:null, ttype:UNARY, func:true},
+{input:"Sec", tag:"mo", output:"Sec", tex:null, ttype:UNARY, func:true},
+{input:"Csc", tag:"mo", output:"Csc", tex:null, ttype:UNARY, func:true},
+{input:"Log", tag:"mo", output:"Log", tex:null, ttype:UNARY, func:true},
+{input:"Ln", tag:"mo", output:"Ln", tex:null, ttype:UNARY, func:true},
+{input:"Abs", tag:"mo", output:"abs", tex:null, ttype:UNARY, notexcopy:true, rewriteleftright:["|","|"]},
+
+//arrows
+{input:"uarr", tag:"mo", output:"\u2191", tex:"uparrow", ttype:CONST},
+{input:"darr", tag:"mo", output:"\u2193", tex:"downarrow", ttype:CONST},
+{input:"rarr", tag:"mo", output:"\u2192", tex:"rightarrow", ttype:CONST},
+{input:"->", tag:"mo", output:"\u2192", tex:"to", ttype:CONST},
+{input:">->", tag:"mo", output:"\u21A3", tex:"rightarrowtail", ttype:CONST},
+{input:"->>", tag:"mo", output:"\u21A0", tex:"twoheadrightarrow", ttype:CONST},
+{input:">->>", tag:"mo", output:"\u2916", tex:"twoheadrightarrowtail", ttype:CONST},
+{input:"|->", tag:"mo", output:"\u21A6", tex:"mapsto", ttype:CONST},
+{input:"larr", tag:"mo", output:"\u2190", tex:"leftarrow", ttype:CONST},
+{input:"harr", tag:"mo", output:"\u2194", tex:"leftrightarrow", ttype:CONST},
+{input:"rArr", tag:"mo", output:"\u21D2", tex:"Rightarrow", ttype:CONST},
+{input:"lArr", tag:"mo", output:"\u21D0", tex:"Leftarrow", ttype:CONST},
+{input:"hArr", tag:"mo", output:"\u21D4", tex:"Leftrightarrow", ttype:CONST},
+//commands with argument
+{input:"sqrt", tag:"msqrt", output:"sqrt", tex:null, ttype:UNARY},
+{input:"root", tag:"mroot", output:"root", tex:null, ttype:BINARY},
+{input:"frac", tag:"mfrac", output:"/", tex:null, ttype:BINARY},
+{input:"/", tag:"mfrac", output:"/", tex:null, ttype:INFIX},
+{input:"stackrel", tag:"mover", output:"stackrel", tex:null, ttype:BINARY},
+{input:"overset", tag:"mover", output:"stackrel", tex:null, ttype:BINARY},
+{input:"underset", tag:"munder", output:"stackrel", tex:null, ttype:BINARY},
+{input:"_", tag:"msub", output:"_", tex:null, ttype:INFIX},
+{input:"^", tag:"msup", output:"^", tex:null, ttype:INFIX},
+{input:"hat", tag:"mover", output:"\u005E", tex:null, ttype:UNARY, acc:true},
+{input:"bar", tag:"mover", output:"\u00AF", tex:"overline", ttype:UNARY, acc:true},
+{input:"vec", tag:"mover", output:"\u2192", tex:null, ttype:UNARY, acc:true},
+{input:"dot", tag:"mover", output:".", tex:null, ttype:UNARY, acc:true},
+{input:"ddot", tag:"mover", output:"..", tex:null, ttype:UNARY, acc:true},
+{input:"overarc", tag:"mover", output:"\u23DC", tex:"overparen", ttype:UNARY, acc:true},
+{input:"ul", tag:"munder", output:"\u0332", tex:"underline", ttype:UNARY, acc:true},
+{input:"ubrace", tag:"munder", output:"\u23DF", tex:"underbrace", ttype:UNARYUNDEROVER, acc:true},
+{input:"obrace", tag:"mover", output:"\u23DE", tex:"overbrace", ttype:UNARYUNDEROVER, acc:true},
+{input:"text", tag:"mtext", output:"text", tex:null, ttype:TEXT},
+{input:"mbox", tag:"mtext", output:"mbox", tex:null, ttype:TEXT},
+{input:"color", tag:"mstyle", ttype:BINARY},
+{input:"id", tag:"mrow", ttype:BINARY},
+{input:"class", tag:"mrow", ttype:BINARY},
+{input:"cancel", tag:"menclose", output:"cancel", tex:null, ttype:UNARY},
+AMquote,
+{input:"bb", tag:"mstyle", atname:"mathvariant", atval:"bold", output:"bb", tex:null, ttype:UNARY},
+{input:"mathbf", tag:"mstyle", atname:"mathvariant", atval:"bold", output:"mathbf", tex:null, ttype:UNARY},
+{input:"sf", tag:"mstyle", atname:"mathvariant", atval:"sans-serif", output:"sf", tex:null, ttype:UNARY},
+{input:"mathsf", tag:"mstyle", atname:"mathvariant", atval:"sans-serif", output:"mathsf", tex:null, ttype:UNARY},
+{input:"bbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"bbb", tex:null, ttype:UNARY, codes:AMbbb},
+{input:"mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"mathbb", tex:null, ttype:UNARY, codes:AMbbb},
+{input:"cc", tag:"mstyle", atname:"mathvariant", atval:"script", output:"cc", tex:null, ttype:UNARY, codes:AMcal},
+{input:"mathcal", tag:"mstyle", atname:"mathvariant", atval:"script", output:"mathcal", tex:null, ttype:UNARY, codes:AMcal},
+{input:"tt", tag:"mstyle", atname:"mathvariant", atval:"monospace", output:"tt", tex:null, ttype:UNARY},
+{input:"mathtt", tag:"mstyle", atname:"mathvariant", atval:"monospace", output:"mathtt", tex:null, ttype:UNARY},
+{input:"fr", tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"fr", tex:null, ttype:UNARY, codes:AMfrk},
+{input:"mathfrak", tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"mathfrak", tex:null, ttype:UNARY, codes:AMfrk}
+];
+
+function compareNames(s1,s2) {
+ if (s1.input > s2.input) return 1
+ else return -1;
+}
+
+var AMnames = []; //list of input symbols
+
+function initSymbols() {
+ var i;
+ var symlen = AMsymbols.length;
+ for (i=0; i<symlen; i++) {
+ if (AMsymbols[i].tex) {
+ AMsymbols.push({input:AMsymbols[i].tex,
+ tag:AMsymbols[i].tag, output:AMsymbols[i].output, ttype:AMsymbols[i].ttype,
+ acc:(AMsymbols[i].acc||false)});
+ }
+ }
+ refreshSymbols();
+}
+
+function refreshSymbols(){
+ var i;
+ AMsymbols.sort(compareNames);
+ for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input;
+}
+
+function define(oldstr,newstr) {
+ AMsymbols.push({input:oldstr, tag:"mo", output:newstr, tex:null, ttype:DEFINITION});
+ refreshSymbols(); // this may be a problem if many symbols are defined!
+}
+
+function AMremoveCharsAndBlanks(str,n) {
+//remove n characters and any following blanks
+ var st;
+ if (str.charAt(n)=="\\" && str.charAt(n+1)!="\\" && str.charAt(n+1)!=" ")
+ st = str.slice(n+1);
+ else st = str.slice(n);
+ for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1);
+ return st.slice(i);
+}
+
+function position(arr, str, n) {
+// return position >=n where str appears or would be inserted
+// assumes arr is sorted
+ if (n==0) {
+ var h,m;
+ n = -1;
+ h = arr.length;
+ while (n+1<h) {
+ m = (n+h) >> 1;
+ if (arr[m]<str) n = m; else h = m;
+ }
+ return h;
+ } else
+ for (var i=n; i<arr.length && arr[i]<str; i++);
+ return i; // i=arr.length || arr[i]>=str
+}
+
+function AMgetSymbol(str) {
+//return maximal initial substring of str that appears in names
+//return null if there is none
+ var k = 0; //new pos
+ var j = 0; //old pos
+ var mk; //match pos
+ var st;
+ var tagst;
+ var match = "";
+ var more = true;
+ for (var i=1; i<=str.length && more; i++) {
+ st = str.slice(0,i); //initial substring of length i
+ j = k;
+ k = position(AMnames, st, j);
+ if (k<AMnames.length && str.slice(0,AMnames[k].length)==AMnames[k]){
+ match = AMnames[k];
+ mk = k;
+ i = match.length;
+ }
+ more = k<AMnames.length && str.slice(0,AMnames[k].length)>=AMnames[k];
+ }
+ AMpreviousSymbol=AMcurrentSymbol;
+ if (match!=""){
+ AMcurrentSymbol=AMsymbols[mk].ttype;
+ return AMsymbols[mk];
+ }
+// if str[0] is a digit or - return maxsubstring of digits.digits
+ AMcurrentSymbol=CONST;
+ k = 1;
+ st = str.slice(0,1);
+ var integ = true;
+ while ("0"<=st && st<="9" && k<=str.length) {
+ st = str.slice(k,k+1);
+ k++;
+ }
+ if (st == decimalsign) {
+ st = str.slice(k,k+1);
+ if ("0"<=st && st<="9") {
+ integ = false;
+ k++;
+ while ("0"<=st && st<="9" && k<=str.length) {
+ st = str.slice(k,k+1);
+ k++;
+ }
+ }
+ }
+ if ((integ && k>1) || k>2) {
+ st = str.slice(0,k-1);
+ tagst = "mn";
+ } else {
+ k = 2;
+ st = str.slice(0,1); //take 1 character
+ tagst = (("A">st || st>"Z") && ("a">st || st>"z")?"mo":"mi");
+ }
+ if (st=="-" && AMpreviousSymbol==INFIX) {
+ AMcurrentSymbol = INFIX; //trick "/" into recognizing "-" on second parse
+ return {input:st, tag:tagst, output:st, ttype:UNARY, func:true};
+ }
+ return {input:st, tag:tagst, output:st, ttype:CONST};
+}
+
+function AMremoveBrackets(node) {
+ var st;
+ if (!node.hasChildNodes()) { return; }
+ if (node.firstChild.hasChildNodes() && (node.nodeName=="mrow" || node.nodeName=="M:MROW")) {
+ st = node.firstChild.firstChild.nodeValue;
+ if (st=="(" || st=="[" || st=="{") node.removeChild(node.firstChild);
+ }
+ if (node.lastChild.hasChildNodes() && (node.nodeName=="mrow" || node.nodeName=="M:MROW")) {
+ st = node.lastChild.firstChild.nodeValue;
+ if (st==")" || st=="]" || st=="}") node.removeChild(node.lastChild);
+ }
+}
+
+/*Parsing ASCII math expressions with the following grammar
+v ::= [A-Za-z] | greek letters | numbers | other constant symbols
+u ::= sqrt | text | bb | other unary symbols for font commands
+b ::= frac | root | stackrel binary symbols
+l ::= ( | [ | { | (: | {: left brackets
+r ::= ) | ] | } | :) | :} right brackets
+S ::= v | lEr | uS | bSS Simple expression
+I ::= S_S | S^S | S_S^S | S Intermediate expression
+E ::= IE | I/I Expression
+Each terminal symbol is translated into a corresponding mathml node.*/
+
+var AMnestingDepth,AMpreviousSymbol,AMcurrentSymbol;
+
+function AMparseSexpr(str) { //parses str and returns [node,tailstr]
+ var symbol, node, result, i, st,// rightvert = false,
+ newFrag = document.createDocumentFragment();
+ str = AMremoveCharsAndBlanks(str,0);
+ symbol = AMgetSymbol(str); //either a token or a bracket or empty
+ if (symbol == null || symbol.ttype == RIGHTBRACKET && AMnestingDepth > 0) {
+ return [null,str];
+ }
+ if (symbol.ttype == DEFINITION) {
+ str = symbol.output+AMremoveCharsAndBlanks(str,symbol.input.length);
+ symbol = AMgetSymbol(str);
+ }
+ switch (symbol.ttype) { case UNDEROVER:
+ case CONST:
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ return [createMmlNode(symbol.tag, //its a constant
+ document.createTextNode(symbol.output)),str];
+ case LEFTBRACKET: //read (expr+)
+ AMnestingDepth++;
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ result = AMparseExpr(str,true);
+ AMnestingDepth--;
+ if (typeof symbol.invisible == "boolean" && symbol.invisible)
+ node = createMmlNode("mrow",result[0]);
+ else {
+ node = createMmlNode("mo",document.createTextNode(symbol.output));
+ node = createMmlNode("mrow",node);
+ node.appendChild(result[0]);
+ }
+ return [node,result[1]];
+ case TEXT:
+ if (symbol!=AMquote) str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ if (str.charAt(0)=="{") i=str.indexOf("}");
+ else if (str.charAt(0)=="(") i=str.indexOf(")");
+ else if (str.charAt(0)=="[") i=str.indexOf("]");
+ else if (symbol==AMquote) i=str.slice(1).indexOf("\"")+1;
+ else i = 0;
+ if (i==-1) i = str.length;
+ st = str.slice(1,i);
+ if (st.charAt(0) == " ") {
+ node = createMmlNode("mspace");
+ node.setAttribute("width","1ex");
+ newFrag.appendChild(node);
+ }
+ newFrag.appendChild(
+ createMmlNode(symbol.tag,document.createTextNode(st)));
+ if (st.charAt(st.length-1) == " ") {
+ node = createMmlNode("mspace");
+ node.setAttribute("width","1ex");
+ newFrag.appendChild(node);
+ }
+ str = AMremoveCharsAndBlanks(str,i+1);
+ return [createMmlNode("mrow",newFrag),str];
+ case UNARYUNDEROVER:
+ case UNARY:
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ result = AMparseSexpr(str);
+ if (result[0]==null) return [createMmlNode(symbol.tag,
+ document.createTextNode(symbol.output)),str];
+ if (typeof symbol.func == "boolean" && symbol.func) { // functions hack
+ st = str.charAt(0);
+ if (st=="^" || st=="_" || st=="/" || st=="|" || st=="," ||
+ (symbol.input.length==1 && symbol.input.match(/\w/) && st!="(")) {
+ return [createMmlNode(symbol.tag,
+ document.createTextNode(symbol.output)),str];
+ } else {
+ node = createMmlNode("mrow",
+ createMmlNode(symbol.tag,document.createTextNode(symbol.output)));
+ node.appendChild(result[0]);
+ return [node,result[1]];
+ }
+ }
+ AMremoveBrackets(result[0]);
+ if (symbol.input == "sqrt") { // sqrt
+ return [createMmlNode(symbol.tag,result[0]),result[1]];
+ } else if (typeof symbol.rewriteleftright != "undefined") { // abs, floor, ceil
+ node = createMmlNode("mrow", createMmlNode("mo",document.createTextNode(symbol.rewriteleftright[0])));
+ node.appendChild(result[0]);
+ node.appendChild(createMmlNode("mo",document.createTextNode(symbol.rewriteleftright[1])));
+ return [node,result[1]];
+ } else if (symbol.input == "cancel") { // cancel
+ node = createMmlNode(symbol.tag,result[0]);
+ node.setAttribute("notation","updiagonalstrike");
+ return [node,result[1]];
+ } else if (typeof symbol.acc == "boolean" && symbol.acc) { // accent
+ node = createMmlNode(symbol.tag,result[0]);
+ var accnode = createMmlNode("mo",document.createTextNode(symbol.output));
+ if (symbol.input=="vec" && (
+ (result[0].nodeName=="mrow" && result[0].childNodes.length==1
+ && result[0].firstChild.firstChild.nodeValue !== null
+ && result[0].firstChild.firstChild.nodeValue.length==1) ||
+ (result[0].firstChild.nodeValue !== null
+ && result[0].firstChild.nodeValue.length==1) )) {
+ accnode.setAttribute("stretchy",false);
+ }
+ node.appendChild(accnode);
+ return [node,result[1]];
+ } else { // font change command
+ if (!isIE && typeof symbol.codes != "undefined") {
+ for (i=0; i<result[0].childNodes.length; i++)
+ if (result[0].childNodes[i].nodeName=="mi" || result[0].nodeName=="mi") {
+ st = (result[0].nodeName=="mi"?result[0].firstChild.nodeValue:
+ result[0].childNodes[i].firstChild.nodeValue);
+ var newst = [];
+ for (var j=0; j<st.length; j++)
+ if (st.charCodeAt(j)>64 && st.charCodeAt(j)<91)
+ newst = newst + symbol.codes[st.charCodeAt(j)-65];
+ else if (st.charCodeAt(j)>96 && st.charCodeAt(j)<123)
+ newst = newst + symbol.codes[st.charCodeAt(j)-71];
+ else newst = newst + st.charAt(j);
+ if (result[0].nodeName=="mi")
+ result[0]=createMmlNode("mo").
+ appendChild(document.createTextNode(newst));
+ else result[0].replaceChild(createMmlNode("mo").
+ appendChild(document.createTextNode(newst)),
+ result[0].childNodes[i]);
+ }
+ }
+ node = createMmlNode(symbol.tag,result[0]);
+ node.setAttribute(symbol.atname,symbol.atval);
+ return [node,result[1]];
+ }
+ case BINARY:
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ result = AMparseSexpr(str);
+ if (result[0]==null) return [createMmlNode("mo",
+ document.createTextNode(symbol.input)),str];
+ AMremoveBrackets(result[0]);
+ var result2 = AMparseSexpr(result[1]);
+ if (result2[0]==null) return [createMmlNode("mo",
+ document.createTextNode(symbol.input)),str];
+ AMremoveBrackets(result2[0]);
+ if (['color', 'class', 'id'].indexOf(symbol.input) >= 0) {
+
+ // Get the second argument
+ if (str.charAt(0)=="{") i=str.indexOf("}");
+ else if (str.charAt(0)=="(") i=str.indexOf(")");
+ else if (str.charAt(0)=="[") i=str.indexOf("]");
+ st = str.slice(1,i);
+
+ // Make a mathml node
+ node = createMmlNode(symbol.tag,result2[0]);
+
+ // Set the correct attribute
+ if (symbol.input === "color") node.setAttribute("mathcolor", st)
+ else if (symbol.input === "class") node.setAttribute("class", st)
+ else if (symbol.input === "id") node.setAttribute("id", st)
+ return [node,result2[1]];
+ }
+ if (symbol.input=="root" || symbol.output=="stackrel")
+ newFrag.appendChild(result2[0]);
+ newFrag.appendChild(result[0]);
+ if (symbol.input=="frac") newFrag.appendChild(result2[0]);
+ return [createMmlNode(symbol.tag,newFrag),result2[1]];
+ case INFIX:
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ return [createMmlNode("mo",document.createTextNode(symbol.output)),str];
+ case SPACE:
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ node = createMmlNode("mspace");
+ node.setAttribute("width","1ex");
+ newFrag.appendChild(node);
+ newFrag.appendChild(
+ createMmlNode(symbol.tag,document.createTextNode(symbol.output)));
+ node = createMmlNode("mspace");
+ node.setAttribute("width","1ex");
+ newFrag.appendChild(node);
+ return [createMmlNode("mrow",newFrag),str];
+ case LEFTRIGHT:
+// if (rightvert) return [null,str]; else rightvert = true;
+ AMnestingDepth++;
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ result = AMparseExpr(str,false);
+ AMnestingDepth--;
+ st = "";
+ if (result[0].lastChild!=null)
+ st = result[0].lastChild.firstChild.nodeValue;
+ if (st == "|" && str.charAt(0)!==",") { // its an absolute value subterm
+ node = createMmlNode("mo",document.createTextNode(symbol.output));
+ node = createMmlNode("mrow",node);
+ node.appendChild(result[0]);
+ return [node,result[1]];
+ } else { // the "|" is a \mid so use unicode 2223 (divides) for spacing
+ node = createMmlNode("mo",document.createTextNode("\u2223"));
+ node = createMmlNode("mrow",node);
+ return [node,str];
+ }
+ default:
+//alert("default");
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ return [createMmlNode(symbol.tag, //its a constant
+ document.createTextNode(symbol.output)),str];
+ }
+}
+
+function AMparseIexpr(str) {
+ var symbol, sym1, sym2, node, result, underover;
+ str = AMremoveCharsAndBlanks(str,0);
+ sym1 = AMgetSymbol(str);
+ result = AMparseSexpr(str);
+ node = result[0];
+ str = result[1];
+ symbol = AMgetSymbol(str);
+ if (symbol.ttype == INFIX && symbol.input != "/") {
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+// if (symbol.input == "/") result = AMparseIexpr(str); else ...
+ result = AMparseSexpr(str);
+ if (result[0] == null) // show box in place of missing argument
+ result[0] = createMmlNode("mo",document.createTextNode("\u25A1"));
+ else AMremoveBrackets(result[0]);
+ str = result[1];
+// if (symbol.input == "/") AMremoveBrackets(node);
+ underover = (sym1.ttype == UNDEROVER || sym1.ttype == UNARYUNDEROVER);
+ if (symbol.input == "_") {
+ sym2 = AMgetSymbol(str);
+ if (sym2.input == "^") {
+ str = AMremoveCharsAndBlanks(str,sym2.input.length);
+ var res2 = AMparseSexpr(str);
+ AMremoveBrackets(res2[0]);
+ str = res2[1];
+ node = createMmlNode((underover?"munderover":"msubsup"),node);
+ node.appendChild(result[0]);
+ node.appendChild(res2[0]);
+ node = createMmlNode("mrow",node); // so sum does not stretch
+ } else {
+ node = createMmlNode((underover?"munder":"msub"),node);
+ node.appendChild(result[0]);
+ }
+ } else if (symbol.input == "^" && underover) {
+ node = createMmlNode("mover",node);
+ node.appendChild(result[0]);
+ } else {
+ node = createMmlNode(symbol.tag,node);
+ node.appendChild(result[0]);
+ }
+ if (typeof sym1.func != 'undefined' && sym1.func) {
+ sym2 = AMgetSymbol(str);
+ if (sym2.ttype != INFIX && sym2.ttype != RIGHTBRACKET &&
+ (sym1.input.length>1 || sym2.ttype == LEFTBRACKET)) {
+ result = AMparseIexpr(str);
+ node = createMmlNode("mrow",node);
+ node.appendChild(result[0]);
+ str = result[1];
+ }
+ }
+ }
+ return [node,str];
+}
+
+function AMparseExpr(str,rightbracket) {
+ var symbol, node, result, i,
+ newFrag = document.createDocumentFragment();
+ do {
+ str = AMremoveCharsAndBlanks(str,0);
+ result = AMparseIexpr(str);
+ node = result[0];
+ str = result[1];
+ symbol = AMgetSymbol(str);
+ if (symbol.ttype == INFIX && symbol.input == "/") {
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ result = AMparseIexpr(str);
+ if (result[0] == null) // show box in place of missing argument
+ result[0] = createMmlNode("mo",document.createTextNode("\u25A1"));
+ else AMremoveBrackets(result[0]);
+ str = result[1];
+ AMremoveBrackets(node);
+ node = createMmlNode(symbol.tag,node);
+ node.appendChild(result[0]);
+ newFrag.appendChild(node);
+ symbol = AMgetSymbol(str);
+ }
+ else if (node!=undefined) newFrag.appendChild(node);
+ } while ((symbol.ttype != RIGHTBRACKET &&
+ (symbol.ttype != LEFTRIGHT || rightbracket)
+ || AMnestingDepth == 0) && symbol!=null && symbol.output!="");
+ if (symbol.ttype == RIGHTBRACKET || symbol.ttype == LEFTRIGHT) {
+// if (AMnestingDepth > 0) AMnestingDepth--;
+ var len = newFrag.childNodes.length;
+ if (len>0 && newFrag.childNodes[len-1].nodeName == "mrow"
+ && newFrag.childNodes[len-1].lastChild
+ && newFrag.childNodes[len-1].lastChild.firstChild ) { //matrix
+ //removed to allow row vectors: //&& len>1 &&
+ //newFrag.childNodes[len-2].nodeName == "mo" &&
+ //newFrag.childNodes[len-2].firstChild.nodeValue == ","
+ var right = newFrag.childNodes[len-1].lastChild.firstChild.nodeValue;
+ if (right==")" || right=="]") {
+ var left = newFrag.childNodes[len-1].firstChild.firstChild.nodeValue;
+ if (left=="(" && right==")" && symbol.output != "}" ||
+ left=="[" && right=="]") {
+ var pos = []; // positions of commas
+ var matrix = true;
+ var m = newFrag.childNodes.length;
+ for (i=0; matrix && i<m; i=i+2) {
+ pos[i] = [];
+ node = newFrag.childNodes[i];
+ if (matrix) matrix = node.nodeName=="mrow" &&
+ (i==m-1 || node.nextSibling.nodeName=="mo" &&
+ node.nextSibling.firstChild.nodeValue==",")&&
+ node.firstChild.firstChild.nodeValue==left &&
+ node.lastChild.firstChild.nodeValue==right;
+ if (matrix)
+ for (var j=0; j<node.childNodes.length; j++)
+ if (node.childNodes[j].firstChild.nodeValue==",")
+ pos[i][pos[i].length]=j;
+ if (matrix && i>1) matrix = pos[i].length == pos[i-2].length;
+ }
+ matrix = matrix && (pos.length>1 || pos[0].length>0);
+ var columnlines = [];
+ if (matrix) {
+ var row, frag, n, k, table = document.createDocumentFragment();
+ for (i=0; i<m; i=i+2) {
+ row = document.createDocumentFragment();
+ frag = document.createDocumentFragment();
+ node = newFrag.firstChild; // <mrow>(-,-,...,-,-)</mrow>
+ n = node.childNodes.length;
+ k = 0;
+ node.removeChild(node.firstChild); //remove (
+ for (j=1; j<n-1; j++) {
+ if (typeof pos[i][k] != "undefined" && j==pos[i][k]){
+ node.removeChild(node.firstChild); //remove ,
+ if (node.firstChild.nodeName=="mrow" && node.firstChild.childNodes.length==1 &&
+ node.firstChild.firstChild.firstChild.nodeValue=="\u2223") {
+ //is columnline marker - skip it
+ if (i==0) { columnlines.push("solid"); }
+ node.removeChild(node.firstChild); //remove mrow
+ node.removeChild(node.firstChild); //remove ,
+ j+=2;
+ k++;
+ } else if (i==0) { columnlines.push("none"); }
+ row.appendChild(createMmlNode("mtd",frag));
+ k++;
+ } else frag.appendChild(node.firstChild);
+ }
+ row.appendChild(createMmlNode("mtd",frag));
+ if (i==0) { columnlines.push("none"); }
+ if (newFrag.childNodes.length>2) {
+ newFrag.removeChild(newFrag.firstChild); //remove <mrow>)</mrow>
+ newFrag.removeChild(newFrag.firstChild); //remove <mo>,</mo>
+ }
+ table.appendChild(createMmlNode("mtr",row));
+ }
+ node = createMmlNode("mtable",table);
+ node.setAttribute("columnlines", columnlines.join(" "));
+ if (typeof symbol.invisible == "boolean" && symbol.invisible) node.setAttribute("columnalign","left");
+ newFrag.replaceChild(node,newFrag.firstChild);
+ }
+ }
+ }
+ }
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ if (typeof symbol.invisible != "boolean" || !symbol.invisible) {
+ node = createMmlNode("mo",document.createTextNode(symbol.output));
+ newFrag.appendChild(node);
+ }
+ }
+ return [newFrag,str];
+}
+
+function parseMath(str,latex) {
+ var frag, node;
+ AMnestingDepth = 0;
+ //some basic cleanup for dealing with stuff editors like TinyMCE adds
+ str = str.replace(/&nbsp;/g,"");
+ str = str.replace(/&gt;/g,">");
+ str = str.replace(/&lt;/g,"<");
+ frag = AMparseExpr(str.replace(/^\s+/g,""),false)[0];
+ node = createMmlNode("mstyle",frag);
+ if (mathcolor != "") node.setAttribute("mathcolor",mathcolor);
+ if (mathfontsize != "") {
+ node.setAttribute("fontsize", mathfontsize);
+ node.setAttribute("mathsize", mathfontsize);
+ }
+ if (mathfontfamily != "") {
+ node.setAttribute("fontfamily", mathfontfamily);
+ node.setAttribute("mathvariant", mathfontfamily);
+ }
+
+ if (displaystyle) node.setAttribute("displaystyle","true");
+ node = createMmlNode("math",node);
+ if (showasciiformulaonhover) //fixed by djhsu so newline
+ node.setAttribute("title",str.replace(/\s+/g," "));//does not show in Gecko
+ return node;
+}
+
+/*
+function strarr2docFrag(arr, linebreaks, latex) {
+ var newFrag=document.createDocumentFragment();
+ var expr = false;
+ for (var i=0; i<arr.length; i++) {
+ if (expr) newFrag.appendChild(parseMath(arr[i],latex));
+ else {
+ var arri = (linebreaks ? arr[i].split("\n\n") : [arr[i]]);
+ newFrag.appendChild(createElementXHTML("span").
+ appendChild(document.createTextNode(arri[0])));
+ for (var j=1; j<arri.length; j++) {
+ newFrag.appendChild(createElementXHTML("p"));
+ newFrag.appendChild(createElementXHTML("span").
+ appendChild(document.createTextNode(arri[j])));
+ }
+ }
+ expr = !expr;
+ }
+ return newFrag;
+}
+
+function AMautomathrec(str) {
+//formula is a space (or start of str) followed by a maximal sequence of *two* or more tokens, possibly separated by runs of digits and/or space.
+//tokens are single letters (except a, A, I) and ASCIIMathML tokens
+ var texcommand = "\\\\[a-zA-Z]+|\\\\\\s|";
+ var ambigAMtoken = "\\b(?:oo|lim|ln|int|oint|del|grad|aleph|prod|prop|sinh|cosh|tanh|cos|sec|pi|tt|fr|sf|sube|supe|sub|sup|det|mod|gcd|lcm|min|max|vec|ddot|ul|chi|eta|nu|mu)(?![a-z])|";
+ var englishAMtoken = "\\b(?:sum|ox|log|sin|tan|dim|hat|bar|dot)(?![a-z])|";
+ var secondenglishAMtoken = "|\\bI\\b|\\bin\\b|\\btext\\b"; // took if and or not out
+ var simpleAMtoken = "NN|ZZ|QQ|RR|CC|TT|AA|EE|sqrt|dx|dy|dz|dt|xx|vv|uu|nn|bb|cc|csc|cot|alpha|beta|delta|Delta|epsilon|gamma|Gamma|kappa|lambda|Lambda|omega|phi|Phi|Pi|psi|Psi|rho|sigma|Sigma|tau|theta|Theta|xi|Xi|zeta"; // uuu nnn?
+ var letter = "[a-zA-HJ-Z](?=(?:[^a-zA-Z]|$|"+ambigAMtoken+englishAMtoken+simpleAMtoken+"))|";
+ var token = letter+texcommand+"\\d+|[-()[\\]{}+=*&^_%\\\@/<>,\\|!:;'~]|\\.(?!(?:\x20|$))|"+ambigAMtoken+englishAMtoken+simpleAMtoken;
+ var re = new RegExp("(^|\\s)((("+token+")\\s?)(("+token+secondenglishAMtoken+")\\s?)+)([,.?]?(?=\\s|$))","g");
+ str = str.replace(re," `$2`$7");
+ var arr = str.split(AMdelimiter1);
+ var re1 = new RegExp("(^|\\s)([b-zB-HJ-Z+*<>]|"+texcommand+ambigAMtoken+simpleAMtoken+")(\\s|\\n|$)","g");
+ var re2 = new RegExp("(^|\\s)([a-z]|"+texcommand+ambigAMtoken+simpleAMtoken+")([,.])","g"); // removed |\d+ for now
+ for (i=0; i<arr.length; i++) //single nonenglish tokens
+ if (i%2==0) {
+ arr[i] = arr[i].replace(re1," `$2`$3");
+ arr[i] = arr[i].replace(re2," `$2`$3");
+ arr[i] = arr[i].replace(/([{}[\]])/,"`$1`");
+ }
+ str = arr.join(AMdelimiter1);
+ str = str.replace(/((^|\s)\([a-zA-Z]{2,}.*?)\)`/g,"$1`)"); //fix parentheses
+ str = str.replace(/`(\((a\s|in\s))(.*?[a-zA-Z]{2,}\))/g,"$1`$3"); //fix parentheses
+ str = str.replace(/\sin`/g,"` in");
+ str = str.replace(/`(\(\w\)[,.]?(\s|\n|$))/g,"$1`");
+ str = str.replace(/`([0-9.]+|e.g|i.e)`(\.?)/gi,"$1$2");
+ str = str.replace(/`([0-9.]+:)`/g,"$1");
+ return str;
+}
+
+function processNodeR(n, linebreaks,latex) {
+ var mtch, str, arr, frg, i;
+ if (n.childNodes.length == 0) {
+ if ((n.nodeType!=8 || linebreaks) &&
+ n.parentNode.nodeName!="form" && n.parentNode.nodeName!="FORM" &&
+ n.parentNode.nodeName!="textarea" && n.parentNode.nodeName!="TEXTAREA"
+ //&&
+ //n.parentNode.nodeName!="pre" && n.parentNode.nodeName!="PRE"
+ ) {
+ str = n.nodeValue;
+ if (!(str == null)) {
+ str = str.replace(/\r\n\r\n/g,"\n\n");
+ str = str.replace(/\x20+/g," ");
+ str = str.replace(/\s*\r\n/g," ");
+ if(latex) {
+// DELIMITERS:
+ mtch = (str.indexOf("\$")==-1 ? false : true);
+ str = str.replace(/([^\\])\$/g,"$1 \$");
+ str = str.replace(/^\$/," \$"); // in case \$ at start of string
+ arr = str.split(" \$");
+ for (i=0; i<arr.length; i++)
+ arr[i]=arr[i].replace(/\\\$/g,"\$");
+ } else {
+ mtch = false;
+ str = str.replace(new RegExp(AMescape1, "g"),
+ function(){mtch = true; return "AMescape1"});
+ str = str.replace(/\\?end{?a?math}?/i,
+ function(){automathrecognize = false; mtch = true; return ""});
+ str = str.replace(/amath\b|\\begin{a?math}/i,
+ function(){automathrecognize = true; mtch = true; return ""});
+ arr = str.split(AMdelimiter1);
+ if (automathrecognize)
+ for (i=0; i<arr.length; i++)
+ if (i%2==0) arr[i] = AMautomathrec(arr[i]);
+ str = arr.join(AMdelimiter1);
+ arr = str.split(AMdelimiter1);
+ for (i=0; i<arr.length; i++) // this is a problem ************
+ arr[i]=arr[i].replace(/AMescape1/g,AMdelimiter1);
+ }
+ if (arr.length>1 || mtch) {
+ if (!noMathML) {
+ frg = strarr2docFrag(arr,n.nodeType==8,latex);
+ var len = frg.childNodes.length;
+ n.parentNode.replaceChild(frg,n);
+ return len-1;
+ } else return 0;
+ }
+ }
+ } else return 0;
+ } else if (n.nodeName!="math") {
+ for (i=0; i<n.childNodes.length; i++)
+ i += processNodeR(n.childNodes[i], linebreaks,latex);
+ }
+ return 0;
+}
+
+function AMprocessNode(n, linebreaks, spanclassAM) {
+ var frag,st;
+ if (spanclassAM!=null) {
+ frag = document.getElementsByTagName("span")
+ for (var i=0;i<frag.length;i++)
+ if (frag[i].className == "AM")
+ processNodeR(frag[i],linebreaks,false);
+ } else {
+ try {
+ st = n.innerHTML; // look for AMdelimiter on page
+ } catch(err) {}
+//alert(st)
+ if (st==null || /amath\b|\\begin{a?math}/i.test(st) ||
+ st.indexOf(AMdelimiter1+" ")!=-1 || st.slice(-1)==AMdelimiter1 ||
+ st.indexOf(AMdelimiter1+"<")!=-1 || st.indexOf(AMdelimiter1+"\n")!=-1) {
+ processNodeR(n,linebreaks,false);
+ }
+ }
+}
+
+function generic(){
+ if(!init()) return;
+ if (translateOnLoad) {
+ translate();
+ }
+};
+//setup onload function
+if(typeof window.addEventListener != 'undefined'){
+ //.. gecko, safari, konqueror and standard
+ window.addEventListener('load', generic, false);
+}
+else if(typeof document.addEventListener != 'undefined'){
+ //.. opera 7
+ document.addEventListener('load', generic, false);
+}
+else if(typeof window.attachEvent != 'undefined'){
+ //.. win/ie
+ window.attachEvent('onload', generic);
+}else{
+ //.. mac/ie5 and anything else that gets this far
+ //if there's an existing onload function
+ if(typeof window.onload == 'function'){
+ //store it
+ var existing = onload;
+ //add new onload handler
+ window.onload = function(){
+ //call existing onload function
+ existing();
+ //call generic onload function
+ generic();
+ };
+ }else{
+ window.onload = generic;
+ }
+}
+
+//expose some functions to outside
+asciimath.newcommand = newcommand;
+asciimath.newsymbol = newsymbol;
+asciimath.AMprocesssNode = AMprocessNode;
+asciimath.parseMath = parseMath;
+asciimath.translate = translate;
+})();
+
+*/
+
+/******************************************************************
+ *
+ * The previous section is ASCIIMathML.js Version 2.2
+ * (c) Peter Jipsen, used with permission.
+ *
+ ******************************************************************/
+
+showasciiformulaonhover = false;
+mathfontfamily = "";
+mathcolor = "";
+mathfontsize = "";
+
+//
+// Remove remapping of mathvariants to plane1 (MathJax handles that)
+// Change functions to mi rather than mo (to get spacing right)
+//
+(function () {
+ for (var i = 0, m = AMsymbols.length; i < m; i++) {
+ if (AMsymbols[i].codes) {delete AMsymbols[i].codes}
+ if (AMsymbols[i].func) {AMsymbols[i].tag = "mi"}
+ }
+})();
+
+//
+// Access to AsciiMath functions and values
+//
+ASCIIMATH.Augment({
+ AM: {
+ Init: function () {
+ displaystyle = ASCIIMATH.config.displaystyle;
+ // Old versions use the "decimal" option, so take it into account if it
+ // is defined by the user. See issue 384.
+ decimalsign = (ASCIIMATH.config.decimal || ASCIIMATH.config.decimalsign);
+ // unfix phi and varphi, if requested
+ if (!ASCIIMATH.config.fixphi) {
+ for (var i = 0, m = AMsymbols.length; i < m; i++) {
+ if (AMsymbols[i].input === "phi") {AMsymbols[i].output = "\u03C6"}
+ if (AMsymbols[i].input === "varphi") {AMsymbols[i].output = "\u03D5"; i = m}
+ }
+ }
+
+ INITASCIIMATH();
+ initSymbols();
+ },
+ Augment: function (def) {
+ for (var id in def) {if (def.hasOwnProperty(id)) {
+ switch (id) {
+ case "displaystyle": displaystyle = def[id]; break;
+ case "decimal": decimal = def[id]; break;
+ case "parseMath": parseMath = def[id]; break;
+ case "parseExpr": AMparseExpr = def[id]; break;
+ case "parseIexpr": AMparseIexpr = def[id]; break;
+ case "parseSexpr": AMparseSexpr = def[id]; break;
+ case "removeBrackets": AMremoveBrackets = def[id]; break;
+ case "getSymbol": AMgetSymbol = def[id]; break;
+ case "position": position = def[id]; break;
+ case "removeCharsAndBlanks": AMremoveCharsAndBlanks = def[id]; break;
+ case "createMmlNode": createMmlNode = def[id]; break;
+ case "createElementMathML": AMcreateElementMathML = def[id]; break;
+ case "createElementXHTML": createElementXHTML = def[id]; break;
+ case "initSymbols": initSymbols = def[id]; break;
+ case "refreshSymbols": refreshSymbols = def[id]; break;
+ case "compareNames": compareNames = def[id]; break;
+ };
+ this[id] = def[id];
+ }};
+ },
+ parseMath: parseMath,
+ parseExpr: AMparseExpr,
+ parseIexpr: AMparseIexpr,
+ parseSexr: AMparseSexpr,
+ removeBrackets: AMremoveBrackets,
+ getSymbol: AMgetSymbol,
+ position: position,
+ removeCharsAndBlanks: AMremoveCharsAndBlanks,
+ createMmlNode: createMmlNode,
+ createElementMathML: AMcreateElementMathML,
+ createElementXHTML: createElementXHTML,
+ initSymbols: initSymbols,
+ refreshSymbols: refreshSymbols,
+ compareNames: compareNames,
+
+ createDocumentFragment: DOCFRAG,
+ document: document,
+
+ define: define,
+ newcommand: newcommand,
+ newsymbol: newsymbol,
+ symbols: AMsymbols,
+ names: AMnames,
+
+ TOKEN: {
+ CONST:CONST, UNARY:UNARY, BINARY:BINARY, INFIX:INFIX,
+ LEFTBRACKET:LEFTBRACKET, RIGHTBRACKET:RIGHTBRACKET, SPACE:SPACE,
+ UNDEROVER:UNDEROVER, DEFINITION:DEFINITION, LEFTRIGHT:LEFTRIGHT, TEXT:TEXT,
+ UNARYUNDEROVER:UNARYUNDEROVER
+ }
+ }
+});
+
+//
+// Make minimizer think these have been used
+//
+var junk = [window, navigator]; junk = null;
+
+})(MathJax.InputJax.AsciiMath);
+
+
+/************************************************************************/
+
+(function (ASCIIMATH) {
+ var MML;
+
+ ASCIIMATH.Augment({
+ sourceMenuTitle: /*_(MathMenu)*/ ["AsciiMathInput","AsciiMath Input"],
+ annotationEncoding: "text/x-asciimath",
+
+ prefilterHooks: MathJax.Callback.Hooks(true), // hooks to run before processing AsciiMath
+ postfilterHooks: MathJax.Callback.Hooks(true), // hooks to run after processing AsciiMath
+
+ Translate: function (script) {
+ var mml, math = MathJax.HTML.getScript(script);
+ var data = {math:math, script:script};
+ var callback = this.prefilterHooks.Execute(data); if (callback) return callback;
+ math = data.math;
+ try {
+ mml = this.AM.parseMath(math);
+ } catch(err) {
+ if (!err.asciimathError) {throw err}
+ mml = this.formatError(err,math);
+ }
+ data.math = MML(mml); this.postfilterHooks.Execute(data);
+ return this.postfilterHooks.Execute(data) || data.math;
+ },
+ formatError: function (err,math,script) {
+ var message = err.message.replace(/\n.*/,"");
+ MathJax.Hub.signal.Post(["AsciiMath Jax - parse error",message,math,script]);
+ return MML.Error(message);
+ },
+ Error: function (message) {
+ throw MathJax.Hub.Insert(Error(message),{asciimathError: true});
+ },
+ //
+ // Initialize the MML variable and AsciiMath itself
+ //
+ Startup: function () {
+ MML = MathJax.ElementJax.mml;
+ this.AM.Init();
+ }
+ });
+
+ ASCIIMATH.loadComplete("jax.js");
+
+})(MathJax.InputJax.AsciiMath);
+
+
+
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/config.js b/js/mathjax/jax/input/MathML/config.js
new file mode 100644
index 0000000..d5f902b
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/config.js
@@ -0,0 +1,43 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+
+/*************************************************************
+ *
+ * MathJax/jax/input/MathML/config.js
+ *
+ * Initializes the MathML InputJax (the main definition is in
+ * MathJax/jax/input/MathML/jax.js, which is loaded when needed).
+ *
+ * ---------------------------------------------------------------------
+ *
+ * Copyright (c) 2009-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+MathJax.InputJax.MathML = MathJax.InputJax({
+ id: "MathML",
+ version: "2.7.9",
+ directory: MathJax.InputJax.directory + "/MathML",
+ extensionDir: MathJax.InputJax.extensionDir + "/MathML",
+ entityDir: MathJax.InputJax.directory + "/MathML/entities",
+
+ config: {
+ useMathMLspacing: false // false means use TeX spacing, true means MML spacing
+ }
+});
+MathJax.InputJax.MathML.Register("math/mml");
+
+MathJax.InputJax.MathML.loadComplete("config.js");
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/a.js b/js/mathjax/jax/input/MathML/entities/a.js
new file mode 100644
index 0000000..4e7dae4
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/a.js
@@ -0,0 +1,92 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/a.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'AElig': '\u00C6',
+ 'AMP': '\u0026',
+ 'Aacute': '\u00C1',
+ 'Abreve': '\u0102',
+ 'Acirc': '\u00C2',
+ 'Acy': '\u0410',
+ 'Agrave': '\u00C0',
+ 'Alpha': '\u0391',
+ 'Amacr': '\u0100',
+ 'And': '\u2A53',
+ 'Aogon': '\u0104',
+ 'Aring': '\u00C5',
+ 'Assign': '\u2254',
+ 'Atilde': '\u00C3',
+ 'Auml': '\u00C4',
+ 'aacute': '\u00E1',
+ 'abreve': '\u0103',
+ 'ac': '\u223E',
+ 'acE': '\u223E\u0333',
+ 'acd': '\u223F',
+ 'acirc': '\u00E2',
+ 'acy': '\u0430',
+ 'aelig': '\u00E6',
+ 'af': '\u2061',
+ 'agrave': '\u00E0',
+ 'alefsym': '\u2135',
+ 'amacr': '\u0101',
+ 'amp': '\u0026',
+ 'andand': '\u2A55',
+ 'andd': '\u2A5C',
+ 'andslope': '\u2A58',
+ 'andv': '\u2A5A',
+ 'ange': '\u29A4',
+ 'angle': '\u2220',
+ 'angmsdaa': '\u29A8',
+ 'angmsdab': '\u29A9',
+ 'angmsdac': '\u29AA',
+ 'angmsdad': '\u29AB',
+ 'angmsdae': '\u29AC',
+ 'angmsdaf': '\u29AD',
+ 'angmsdag': '\u29AE',
+ 'angmsdah': '\u29AF',
+ 'angrt': '\u221F',
+ 'angrtvb': '\u22BE',
+ 'angrtvbd': '\u299D',
+ 'angst': '\u00C5',
+ 'angzarr': '\u237C',
+ 'aogon': '\u0105',
+ 'ap': '\u2248',
+ 'apE': '\u2A70',
+ 'apacir': '\u2A6F',
+ 'apid': '\u224B',
+ 'apos': '\u0027',
+ 'approx': '\u2248',
+ 'approxeq': '\u224A',
+ 'aring': '\u00E5',
+ 'ast': '\u002A',
+ 'asymp': '\u2248',
+ 'asympeq': '\u224D',
+ 'atilde': '\u00E3',
+ 'auml': '\u00E4',
+ 'awconint': '\u2233',
+ 'awint': '\u2A11'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/a.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/b.js b/js/mathjax/jax/input/MathML/entities/b.js
new file mode 100644
index 0000000..c3e04ee
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/b.js
@@ -0,0 +1,118 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/b.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'Barv': '\u2AE7',
+ 'Barwed': '\u2306',
+ 'Bcy': '\u0411',
+ 'Bernoullis': '\u212C',
+ 'Beta': '\u0392',
+ 'Bumpeq': '\u224E',
+ 'bNot': '\u2AED',
+ 'backcong': '\u224C',
+ 'backepsilon': '\u03F6',
+ 'barvee': '\u22BD',
+ 'barwed': '\u2305',
+ 'barwedge': '\u2305',
+ 'bbrk': '\u23B5',
+ 'bbrktbrk': '\u23B6',
+ 'bcong': '\u224C',
+ 'bcy': '\u0431',
+ 'bdquo': '\u201E',
+ 'becaus': '\u2235',
+ 'because': '\u2235',
+ 'bemptyv': '\u29B0',
+ 'bepsi': '\u03F6',
+ 'bernou': '\u212C',
+ 'bigcap': '\u22C2',
+ 'bigcup': '\u22C3',
+ 'bigvee': '\u22C1',
+ 'bigwedge': '\u22C0',
+ 'bkarow': '\u290D',
+ 'blacksquare': '\u25AA',
+ 'blacktriangleright': '\u25B8',
+ 'blank': '\u2423',
+ 'blk12': '\u2592',
+ 'blk14': '\u2591',
+ 'blk34': '\u2593',
+ 'block': '\u2588',
+ 'bne': '\u003D\u20E5',
+ 'bnequiv': '\u2261\u20E5',
+ 'bnot': '\u2310',
+ 'bot': '\u22A5',
+ 'bottom': '\u22A5',
+ 'boxDL': '\u2557',
+ 'boxDR': '\u2554',
+ 'boxDl': '\u2556',
+ 'boxDr': '\u2553',
+ 'boxH': '\u2550',
+ 'boxHD': '\u2566',
+ 'boxHU': '\u2569',
+ 'boxHd': '\u2564',
+ 'boxHu': '\u2567',
+ 'boxUL': '\u255D',
+ 'boxUR': '\u255A',
+ 'boxUl': '\u255C',
+ 'boxUr': '\u2559',
+ 'boxV': '\u2551',
+ 'boxVH': '\u256C',
+ 'boxVL': '\u2563',
+ 'boxVR': '\u2560',
+ 'boxVh': '\u256B',
+ 'boxVl': '\u2562',
+ 'boxVr': '\u255F',
+ 'boxbox': '\u29C9',
+ 'boxdL': '\u2555',
+ 'boxdR': '\u2552',
+ 'boxh': '\u2500',
+ 'boxhD': '\u2565',
+ 'boxhU': '\u2568',
+ 'boxhd': '\u252C',
+ 'boxhu': '\u2534',
+ 'boxuL': '\u255B',
+ 'boxuR': '\u2558',
+ 'boxv': '\u2502',
+ 'boxvH': '\u256A',
+ 'boxvL': '\u2561',
+ 'boxvR': '\u255E',
+ 'boxvh': '\u253C',
+ 'boxvl': '\u2524',
+ 'boxvr': '\u251C',
+ 'bprime': '\u2035',
+ 'breve': '\u02D8',
+ 'brvbar': '\u00A6',
+ 'bsemi': '\u204F',
+ 'bsim': '\u223D',
+ 'bsime': '\u22CD',
+ 'bsolb': '\u29C5',
+ 'bsolhsub': '\u27C8',
+ 'bullet': '\u2022',
+ 'bump': '\u224E',
+ 'bumpE': '\u2AAE',
+ 'bumpe': '\u224F',
+ 'bumpeq': '\u224F'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/b.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/c.js b/js/mathjax/jax/input/MathML/entities/c.js
new file mode 100644
index 0000000..90ef2e6
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/c.js
@@ -0,0 +1,116 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/c.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'CHcy': '\u0427',
+ 'COPY': '\u00A9',
+ 'Cacute': '\u0106',
+ 'CapitalDifferentialD': '\u2145',
+ 'Cayleys': '\u212D',
+ 'Ccaron': '\u010C',
+ 'Ccedil': '\u00C7',
+ 'Ccirc': '\u0108',
+ 'Cconint': '\u2230',
+ 'Cdot': '\u010A',
+ 'Cedilla': '\u00B8',
+ 'Chi': '\u03A7',
+ 'ClockwiseContourIntegral': '\u2232',
+ 'CloseCurlyDoubleQuote': '\u201D',
+ 'CloseCurlyQuote': '\u2019',
+ 'Colon': '\u2237',
+ 'Colone': '\u2A74',
+ 'Conint': '\u222F',
+ 'CounterClockwiseContourIntegral': '\u2233',
+ 'cacute': '\u0107',
+ 'capand': '\u2A44',
+ 'capbrcup': '\u2A49',
+ 'capcap': '\u2A4B',
+ 'capcup': '\u2A47',
+ 'capdot': '\u2A40',
+ 'caps': '\u2229\uFE00',
+ 'caret': '\u2041',
+ 'caron': '\u02C7',
+ 'ccaps': '\u2A4D',
+ 'ccaron': '\u010D',
+ 'ccedil': '\u00E7',
+ 'ccirc': '\u0109',
+ 'ccups': '\u2A4C',
+ 'ccupssm': '\u2A50',
+ 'cdot': '\u010B',
+ 'cedil': '\u00B8',
+ 'cemptyv': '\u29B2',
+ 'cent': '\u00A2',
+ 'centerdot': '\u00B7',
+ 'chcy': '\u0447',
+ 'checkmark': '\u2713',
+ 'cir': '\u25CB',
+ 'cirE': '\u29C3',
+ 'cire': '\u2257',
+ 'cirfnint': '\u2A10',
+ 'cirmid': '\u2AEF',
+ 'cirscir': '\u29C2',
+ 'clubsuit': '\u2663',
+ 'colone': '\u2254',
+ 'coloneq': '\u2254',
+ 'comma': '\u002C',
+ 'commat': '\u0040',
+ 'compfn': '\u2218',
+ 'complement': '\u2201',
+ 'complexes': '\u2102',
+ 'cong': '\u2245',
+ 'congdot': '\u2A6D',
+ 'conint': '\u222E',
+ 'coprod': '\u2210',
+ 'copy': '\u00A9',
+ 'copysr': '\u2117',
+ 'crarr': '\u21B5',
+ 'cross': '\u2717',
+ 'csub': '\u2ACF',
+ 'csube': '\u2AD1',
+ 'csup': '\u2AD0',
+ 'csupe': '\u2AD2',
+ 'cudarrl': '\u2938',
+ 'cudarrr': '\u2935',
+ 'cularrp': '\u293D',
+ 'cupbrcap': '\u2A48',
+ 'cupcap': '\u2A46',
+ 'cupcup': '\u2A4A',
+ 'cupdot': '\u228D',
+ 'cupor': '\u2A45',
+ 'cups': '\u222A\uFE00',
+ 'curarrm': '\u293C',
+ 'curlyeqprec': '\u22DE',
+ 'curlyeqsucc': '\u22DF',
+ 'curren': '\u00A4',
+ 'curvearrowleft': '\u21B6',
+ 'curvearrowright': '\u21B7',
+ 'cuvee': '\u22CE',
+ 'cuwed': '\u22CF',
+ 'cwconint': '\u2232',
+ 'cwint': '\u2231',
+ 'cylcty': '\u232D'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/c.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/d.js b/js/mathjax/jax/input/MathML/entities/d.js
new file mode 100644
index 0000000..7dd0375
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/d.js
@@ -0,0 +1,114 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/d.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'DD': '\u2145',
+ 'DDotrahd': '\u2911',
+ 'DJcy': '\u0402',
+ 'DScy': '\u0405',
+ 'DZcy': '\u040F',
+ 'Darr': '\u21A1',
+ 'Dashv': '\u2AE4',
+ 'Dcaron': '\u010E',
+ 'Dcy': '\u0414',
+ 'DiacriticalAcute': '\u00B4',
+ 'DiacriticalDot': '\u02D9',
+ 'DiacriticalDoubleAcute': '\u02DD',
+ 'DiacriticalGrave': '\u0060',
+ 'DiacriticalTilde': '\u02DC',
+ 'Dot': '\u00A8',
+ 'DotDot': '\u20DC',
+ 'DoubleContourIntegral': '\u222F',
+ 'DoubleDownArrow': '\u21D3',
+ 'DoubleLeftArrow': '\u21D0',
+ 'DoubleLeftRightArrow': '\u21D4',
+ 'DoubleLeftTee': '\u2AE4',
+ 'DoubleLongLeftArrow': '\u27F8',
+ 'DoubleLongLeftRightArrow': '\u27FA',
+ 'DoubleLongRightArrow': '\u27F9',
+ 'DoubleRightArrow': '\u21D2',
+ 'DoubleUpArrow': '\u21D1',
+ 'DoubleUpDownArrow': '\u21D5',
+ 'DownArrowBar': '\u2913',
+ 'DownArrowUpArrow': '\u21F5',
+ 'DownBreve': '\u0311',
+ 'DownLeftRightVector': '\u2950',
+ 'DownLeftTeeVector': '\u295E',
+ 'DownLeftVectorBar': '\u2956',
+ 'DownRightTeeVector': '\u295F',
+ 'DownRightVectorBar': '\u2957',
+ 'DownTeeArrow': '\u21A7',
+ 'Dstrok': '\u0110',
+ 'dArr': '\u21D3',
+ 'dHar': '\u2965',
+ 'darr': '\u2193',
+ 'dash': '\u2010',
+ 'dashv': '\u22A3',
+ 'dbkarow': '\u290F',
+ 'dblac': '\u02DD',
+ 'dcaron': '\u010F',
+ 'dcy': '\u0434',
+ 'dd': '\u2146',
+ 'ddagger': '\u2021',
+ 'ddotseq': '\u2A77',
+ 'demptyv': '\u29B1',
+ 'dfisht': '\u297F',
+ 'dharl': '\u21C3',
+ 'dharr': '\u21C2',
+ 'diam': '\u22C4',
+ 'diamond': '\u22C4',
+ 'diamondsuit': '\u2666',
+ 'diams': '\u2666',
+ 'die': '\u00A8',
+ 'disin': '\u22F2',
+ 'divide': '\u00F7',
+ 'divonx': '\u22C7',
+ 'djcy': '\u0452',
+ 'dlcorn': '\u231E',
+ 'dlcrop': '\u230D',
+ 'dollar': '\u0024',
+ 'doteq': '\u2250',
+ 'dotminus': '\u2238',
+ 'doublebarwedge': '\u2306',
+ 'downarrow': '\u2193',
+ 'downdownarrows': '\u21CA',
+ 'downharpoonleft': '\u21C3',
+ 'downharpoonright': '\u21C2',
+ 'drbkarow': '\u2910',
+ 'drcorn': '\u231F',
+ 'drcrop': '\u230C',
+ 'dscy': '\u0455',
+ 'dsol': '\u29F6',
+ 'dstrok': '\u0111',
+ 'dtri': '\u25BF',
+ 'dtrif': '\u25BE',
+ 'duarr': '\u21F5',
+ 'duhar': '\u296F',
+ 'dwangle': '\u29A6',
+ 'dzcy': '\u045F',
+ 'dzigrarr': '\u27FF'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/d.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/e.js b/js/mathjax/jax/input/MathML/entities/e.js
new file mode 100644
index 0000000..215047d
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/e.js
@@ -0,0 +1,94 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/e.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'ENG': '\u014A',
+ 'ETH': '\u00D0',
+ 'Eacute': '\u00C9',
+ 'Ecaron': '\u011A',
+ 'Ecirc': '\u00CA',
+ 'Ecy': '\u042D',
+ 'Edot': '\u0116',
+ 'Egrave': '\u00C8',
+ 'Emacr': '\u0112',
+ 'EmptySmallSquare': '\u25FB',
+ 'EmptyVerySmallSquare': '\u25AB',
+ 'Eogon': '\u0118',
+ 'Epsilon': '\u0395',
+ 'Equal': '\u2A75',
+ 'Esim': '\u2A73',
+ 'Eta': '\u0397',
+ 'Euml': '\u00CB',
+ 'eDDot': '\u2A77',
+ 'eDot': '\u2251',
+ 'eacute': '\u00E9',
+ 'easter': '\u2A6E',
+ 'ecaron': '\u011B',
+ 'ecirc': '\u00EA',
+ 'ecolon': '\u2255',
+ 'ecy': '\u044D',
+ 'edot': '\u0117',
+ 'ee': '\u2147',
+ 'eg': '\u2A9A',
+ 'egrave': '\u00E8',
+ 'egsdot': '\u2A98',
+ 'el': '\u2A99',
+ 'elinters': '\u23E7',
+ 'elsdot': '\u2A97',
+ 'emacr': '\u0113',
+ 'emptyset': '\u2205',
+ 'emptyv': '\u2205',
+ 'emsp': '\u2003',
+ 'emsp13': '\u2004',
+ 'emsp14': '\u2005',
+ 'eng': '\u014B',
+ 'ensp': '\u2002',
+ 'eogon': '\u0119',
+ 'epar': '\u22D5',
+ 'eparsl': '\u29E3',
+ 'eplus': '\u2A71',
+ 'epsilon': '\u03B5',
+ 'eqcirc': '\u2256',
+ 'eqcolon': '\u2255',
+ 'eqsim': '\u2242',
+ 'eqslantgtr': '\u2A96',
+ 'eqslantless': '\u2A95',
+ 'equals': '\u003D',
+ 'equest': '\u225F',
+ 'equiv': '\u2261',
+ 'equivDD': '\u2A78',
+ 'eqvparsl': '\u29E5',
+ 'erarr': '\u2971',
+ 'esdot': '\u2250',
+ 'esim': '\u2242',
+ 'euml': '\u00EB',
+ 'euro': '\u20AC',
+ 'excl': '\u0021',
+ 'exist': '\u2203',
+ 'expectation': '\u2130',
+ 'exponentiale': '\u2147'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/e.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/f.js b/js/mathjax/jax/input/MathML/entities/f.js
new file mode 100644
index 0000000..5319a4e
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/f.js
@@ -0,0 +1,62 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/f.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'Fcy': '\u0424',
+ 'FilledSmallSquare': '\u25FC',
+ 'Fouriertrf': '\u2131',
+ 'fallingdotseq': '\u2252',
+ 'fcy': '\u0444',
+ 'female': '\u2640',
+ 'ffilig': '\uFB03',
+ 'fflig': '\uFB00',
+ 'ffllig': '\uFB04',
+ 'filig': '\uFB01',
+ 'fjlig': '\u0066\u006A',
+ 'fllig': '\uFB02',
+ 'fltns': '\u25B1',
+ 'fnof': '\u0192',
+ 'forall': '\u2200',
+ 'forkv': '\u2AD9',
+ 'fpartint': '\u2A0D',
+ 'frac12': '\u00BD',
+ 'frac13': '\u2153',
+ 'frac14': '\u00BC',
+ 'frac15': '\u2155',
+ 'frac16': '\u2159',
+ 'frac18': '\u215B',
+ 'frac23': '\u2154',
+ 'frac25': '\u2156',
+ 'frac34': '\u00BE',
+ 'frac35': '\u2157',
+ 'frac38': '\u215C',
+ 'frac45': '\u2158',
+ 'frac56': '\u215A',
+ 'frac58': '\u215D',
+ 'frac78': '\u215E',
+ 'frasl': '\u2044'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/f.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/fr.js b/js/mathjax/jax/input/MathML/entities/fr.js
new file mode 100644
index 0000000..cf2aca7
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/fr.js
@@ -0,0 +1,81 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/fr.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'Afr': '\uD835\uDD04',
+ 'Bfr': '\uD835\uDD05',
+ 'Cfr': '\u212D',
+ 'Dfr': '\uD835\uDD07',
+ 'Efr': '\uD835\uDD08',
+ 'Ffr': '\uD835\uDD09',
+ 'Gfr': '\uD835\uDD0A',
+ 'Hfr': '\u210C',
+ 'Ifr': '\u2111',
+ 'Jfr': '\uD835\uDD0D',
+ 'Kfr': '\uD835\uDD0E',
+ 'Lfr': '\uD835\uDD0F',
+ 'Mfr': '\uD835\uDD10',
+ 'Nfr': '\uD835\uDD11',
+ 'Ofr': '\uD835\uDD12',
+ 'Pfr': '\uD835\uDD13',
+ 'Qfr': '\uD835\uDD14',
+ 'Rfr': '\u211C',
+ 'Sfr': '\uD835\uDD16',
+ 'Tfr': '\uD835\uDD17',
+ 'Ufr': '\uD835\uDD18',
+ 'Vfr': '\uD835\uDD19',
+ 'Wfr': '\uD835\uDD1A',
+ 'Xfr': '\uD835\uDD1B',
+ 'Yfr': '\uD835\uDD1C',
+ 'Zfr': '\u2128',
+ 'afr': '\uD835\uDD1E',
+ 'bfr': '\uD835\uDD1F',
+ 'cfr': '\uD835\uDD20',
+ 'dfr': '\uD835\uDD21',
+ 'efr': '\uD835\uDD22',
+ 'ffr': '\uD835\uDD23',
+ 'gfr': '\uD835\uDD24',
+ 'hfr': '\uD835\uDD25',
+ 'ifr': '\uD835\uDD26',
+ 'jfr': '\uD835\uDD27',
+ 'kfr': '\uD835\uDD28',
+ 'lfr': '\uD835\uDD29',
+ 'mfr': '\uD835\uDD2A',
+ 'nfr': '\uD835\uDD2B',
+ 'ofr': '\uD835\uDD2C',
+ 'pfr': '\uD835\uDD2D',
+ 'qfr': '\uD835\uDD2E',
+ 'rfr': '\uD835\uDD2F',
+ 'sfr': '\uD835\uDD30',
+ 'tfr': '\uD835\uDD31',
+ 'ufr': '\uD835\uDD32',
+ 'vfr': '\uD835\uDD33',
+ 'wfr': '\uD835\uDD34',
+ 'xfr': '\uD835\uDD35',
+ 'yfr': '\uD835\uDD36',
+ 'zfr': '\uD835\uDD37'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/fr.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/g.js b/js/mathjax/jax/input/MathML/entities/g.js
new file mode 100644
index 0000000..8c3f003
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/g.js
@@ -0,0 +1,85 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/g.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'GJcy': '\u0403',
+ 'GT': '\u003E',
+ 'Gammad': '\u03DC',
+ 'Gbreve': '\u011E',
+ 'Gcedil': '\u0122',
+ 'Gcirc': '\u011C',
+ 'Gcy': '\u0413',
+ 'Gdot': '\u0120',
+ 'GreaterGreater': '\u2AA2',
+ 'Gt': '\u226B',
+ 'gE': '\u2267',
+ 'gacute': '\u01F5',
+ 'gammad': '\u03DD',
+ 'gbreve': '\u011F',
+ 'gcirc': '\u011D',
+ 'gcy': '\u0433',
+ 'gdot': '\u0121',
+ 'ge': '\u2265',
+ 'gel': '\u22DB',
+ 'geq': '\u2265',
+ 'geqq': '\u2267',
+ 'geqslant': '\u2A7E',
+ 'ges': '\u2A7E',
+ 'gescc': '\u2AA9',
+ 'gesdot': '\u2A80',
+ 'gesdoto': '\u2A82',
+ 'gesdotol': '\u2A84',
+ 'gesl': '\u22DB\uFE00',
+ 'gesles': '\u2A94',
+ 'gg': '\u226B',
+ 'ggg': '\u22D9',
+ 'gjcy': '\u0453',
+ 'gl': '\u2277',
+ 'glE': '\u2A92',
+ 'gla': '\u2AA5',
+ 'glj': '\u2AA4',
+ 'gnapprox': '\u2A8A',
+ 'gneq': '\u2A88',
+ 'gneqq': '\u2269',
+ 'grave': '\u0060',
+ 'gsim': '\u2273',
+ 'gsime': '\u2A8E',
+ 'gsiml': '\u2A90',
+ 'gtcc': '\u2AA7',
+ 'gtcir': '\u2A7A',
+ 'gtlPar': '\u2995',
+ 'gtquest': '\u2A7C',
+ 'gtrapprox': '\u2A86',
+ 'gtrarr': '\u2978',
+ 'gtrdot': '\u22D7',
+ 'gtreqless': '\u22DB',
+ 'gtreqqless': '\u2A8C',
+ 'gtrless': '\u2277',
+ 'gtrsim': '\u2273',
+ 'gvertneqq': '\u2269\uFE00',
+ 'gvnE': '\u2269\uFE00'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/g.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/h.js b/js/mathjax/jax/input/MathML/entities/h.js
new file mode 100644
index 0000000..1a22014
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/h.js
@@ -0,0 +1,54 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/h.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'HARDcy': '\u042A',
+ 'Hcirc': '\u0124',
+ 'HilbertSpace': '\u210B',
+ 'HorizontalLine': '\u2500',
+ 'Hstrok': '\u0126',
+ 'hArr': '\u21D4',
+ 'hairsp': '\u200A',
+ 'half': '\u00BD',
+ 'hamilt': '\u210B',
+ 'hardcy': '\u044A',
+ 'harr': '\u2194',
+ 'harrcir': '\u2948',
+ 'hcirc': '\u0125',
+ 'hearts': '\u2665',
+ 'heartsuit': '\u2665',
+ 'hercon': '\u22B9',
+ 'hksearow': '\u2925',
+ 'hkswarow': '\u2926',
+ 'hoarr': '\u21FF',
+ 'homtht': '\u223B',
+ 'horbar': '\u2015',
+ 'hslash': '\u210F',
+ 'hstrok': '\u0127',
+ 'hybull': '\u2043',
+ 'hyphen': '\u2010'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/h.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/i.js b/js/mathjax/jax/input/MathML/entities/i.js
new file mode 100644
index 0000000..3ee68f4
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/i.js
@@ -0,0 +1,88 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/i.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'IEcy': '\u0415',
+ 'IJlig': '\u0132',
+ 'IOcy': '\u0401',
+ 'Iacute': '\u00CD',
+ 'Icirc': '\u00CE',
+ 'Icy': '\u0418',
+ 'Idot': '\u0130',
+ 'Igrave': '\u00CC',
+ 'Imacr': '\u012A',
+ 'Implies': '\u21D2',
+ 'Int': '\u222C',
+ 'Iogon': '\u012E',
+ 'Iota': '\u0399',
+ 'Itilde': '\u0128',
+ 'Iukcy': '\u0406',
+ 'Iuml': '\u00CF',
+ 'iacute': '\u00ED',
+ 'ic': '\u2063',
+ 'icirc': '\u00EE',
+ 'icy': '\u0438',
+ 'iecy': '\u0435',
+ 'iexcl': '\u00A1',
+ 'iff': '\u21D4',
+ 'igrave': '\u00EC',
+ 'ii': '\u2148',
+ 'iiiint': '\u2A0C',
+ 'iiint': '\u222D',
+ 'iinfin': '\u29DC',
+ 'iiota': '\u2129',
+ 'ijlig': '\u0133',
+ 'imacr': '\u012B',
+ 'image': '\u2111',
+ 'imagline': '\u2110',
+ 'imagpart': '\u2111',
+ 'imof': '\u22B7',
+ 'imped': '\u01B5',
+ 'in': '\u2208',
+ 'incare': '\u2105',
+ 'infintie': '\u29DD',
+ 'inodot': '\u0131',
+ 'int': '\u222B',
+ 'integers': '\u2124',
+ 'intercal': '\u22BA',
+ 'intlarhk': '\u2A17',
+ 'intprod': '\u2A3C',
+ 'iocy': '\u0451',
+ 'iogon': '\u012F',
+ 'iprod': '\u2A3C',
+ 'iquest': '\u00BF',
+ 'isin': '\u2208',
+ 'isinE': '\u22F9',
+ 'isindot': '\u22F5',
+ 'isins': '\u22F4',
+ 'isinsv': '\u22F3',
+ 'isinv': '\u2208',
+ 'it': '\u2062',
+ 'itilde': '\u0129',
+ 'iukcy': '\u0456',
+ 'iuml': '\u00EF'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/i.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/j.js b/js/mathjax/jax/input/MathML/entities/j.js
new file mode 100644
index 0000000..cea0ee9
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/j.js
@@ -0,0 +1,37 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/j.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'Jcirc': '\u0134',
+ 'Jcy': '\u0419',
+ 'Jsercy': '\u0408',
+ 'Jukcy': '\u0404',
+ 'jcirc': '\u0135',
+ 'jcy': '\u0439',
+ 'jsercy': '\u0458',
+ 'jukcy': '\u0454'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/j.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/k.js b/js/mathjax/jax/input/MathML/entities/k.js
new file mode 100644
index 0000000..2bb63b3
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/k.js
@@ -0,0 +1,39 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/k.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'KHcy': '\u0425',
+ 'KJcy': '\u040C',
+ 'Kappa': '\u039A',
+ 'Kcedil': '\u0136',
+ 'Kcy': '\u041A',
+ 'kcedil': '\u0137',
+ 'kcy': '\u043A',
+ 'kgreen': '\u0138',
+ 'khcy': '\u0445',
+ 'kjcy': '\u045C'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/k.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/l.js b/js/mathjax/jax/input/MathML/entities/l.js
new file mode 100644
index 0000000..9136ea5
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/l.js
@@ -0,0 +1,181 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/l.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'LJcy': '\u0409',
+ 'LT': '\u003C',
+ 'Lacute': '\u0139',
+ 'Lang': '\u27EA',
+ 'Laplacetrf': '\u2112',
+ 'Lcaron': '\u013D',
+ 'Lcedil': '\u013B',
+ 'Lcy': '\u041B',
+ 'LeftArrowBar': '\u21E4',
+ 'LeftDoubleBracket': '\u27E6',
+ 'LeftDownTeeVector': '\u2961',
+ 'LeftDownVectorBar': '\u2959',
+ 'LeftRightVector': '\u294E',
+ 'LeftTeeArrow': '\u21A4',
+ 'LeftTeeVector': '\u295A',
+ 'LeftTriangleBar': '\u29CF',
+ 'LeftUpDownVector': '\u2951',
+ 'LeftUpTeeVector': '\u2960',
+ 'LeftUpVectorBar': '\u2958',
+ 'LeftVectorBar': '\u2952',
+ 'LessLess': '\u2AA1',
+ 'Lmidot': '\u013F',
+ 'LowerLeftArrow': '\u2199',
+ 'LowerRightArrow': '\u2198',
+ 'Lstrok': '\u0141',
+ 'Lt': '\u226A',
+ 'lAarr': '\u21DA',
+ 'lArr': '\u21D0',
+ 'lAtail': '\u291B',
+ 'lBarr': '\u290E',
+ 'lE': '\u2266',
+ 'lHar': '\u2962',
+ 'lacute': '\u013A',
+ 'laemptyv': '\u29B4',
+ 'lagran': '\u2112',
+ 'lang': '\u27E8',
+ 'langd': '\u2991',
+ 'langle': '\u27E8',
+ 'laquo': '\u00AB',
+ 'larr': '\u2190',
+ 'larrb': '\u21E4',
+ 'larrbfs': '\u291F',
+ 'larrfs': '\u291D',
+ 'larrhk': '\u21A9',
+ 'larrpl': '\u2939',
+ 'larrsim': '\u2973',
+ 'lat': '\u2AAB',
+ 'latail': '\u2919',
+ 'late': '\u2AAD',
+ 'lates': '\u2AAD\uFE00',
+ 'lbarr': '\u290C',
+ 'lbbrk': '\u2772',
+ 'lbrke': '\u298B',
+ 'lbrksld': '\u298F',
+ 'lbrkslu': '\u298D',
+ 'lcaron': '\u013E',
+ 'lcedil': '\u013C',
+ 'lceil': '\u2308',
+ 'lcub': '\u007B',
+ 'lcy': '\u043B',
+ 'ldca': '\u2936',
+ 'ldquo': '\u201C',
+ 'ldquor': '\u201E',
+ 'ldrdhar': '\u2967',
+ 'ldrushar': '\u294B',
+ 'ldsh': '\u21B2',
+ 'leftarrow': '\u2190',
+ 'leftarrowtail': '\u21A2',
+ 'leftharpoondown': '\u21BD',
+ 'leftharpoonup': '\u21BC',
+ 'leftrightarrow': '\u2194',
+ 'leftrightarrows': '\u21C6',
+ 'leftrightharpoons': '\u21CB',
+ 'leftrightsquigarrow': '\u21AD',
+ 'leg': '\u22DA',
+ 'leq': '\u2264',
+ 'leqq': '\u2266',
+ 'leqslant': '\u2A7D',
+ 'les': '\u2A7D',
+ 'lescc': '\u2AA8',
+ 'lesdot': '\u2A7F',
+ 'lesdoto': '\u2A81',
+ 'lesdotor': '\u2A83',
+ 'lesg': '\u22DA\uFE00',
+ 'lesges': '\u2A93',
+ 'lessapprox': '\u2A85',
+ 'lesseqgtr': '\u22DA',
+ 'lesseqqgtr': '\u2A8B',
+ 'lessgtr': '\u2276',
+ 'lesssim': '\u2272',
+ 'lfisht': '\u297C',
+ 'lfloor': '\u230A',
+ 'lg': '\u2276',
+ 'lgE': '\u2A91',
+ 'lhard': '\u21BD',
+ 'lharu': '\u21BC',
+ 'lharul': '\u296A',
+ 'lhblk': '\u2584',
+ 'ljcy': '\u0459',
+ 'll': '\u226A',
+ 'llarr': '\u21C7',
+ 'llcorner': '\u231E',
+ 'llhard': '\u296B',
+ 'lltri': '\u25FA',
+ 'lmidot': '\u0140',
+ 'lmoustache': '\u23B0',
+ 'lnapprox': '\u2A89',
+ 'lneq': '\u2A87',
+ 'lneqq': '\u2268',
+ 'loang': '\u27EC',
+ 'loarr': '\u21FD',
+ 'lobrk': '\u27E6',
+ 'longleftarrow': '\u27F5',
+ 'longleftrightarrow': '\u27F7',
+ 'longrightarrow': '\u27F6',
+ 'looparrowleft': '\u21AB',
+ 'lopar': '\u2985',
+ 'loplus': '\u2A2D',
+ 'lotimes': '\u2A34',
+ 'lowbar': '\u005F',
+ 'lozenge': '\u25CA',
+ 'lozf': '\u29EB',
+ 'lpar': '\u0028',
+ 'lparlt': '\u2993',
+ 'lrarr': '\u21C6',
+ 'lrcorner': '\u231F',
+ 'lrhar': '\u21CB',
+ 'lrhard': '\u296D',
+ 'lrm': '\u200E',
+ 'lrtri': '\u22BF',
+ 'lsaquo': '\u2039',
+ 'lsh': '\u21B0',
+ 'lsim': '\u2272',
+ 'lsime': '\u2A8D',
+ 'lsimg': '\u2A8F',
+ 'lsqb': '\u005B',
+ 'lsquo': '\u2018',
+ 'lsquor': '\u201A',
+ 'lstrok': '\u0142',
+ 'ltcc': '\u2AA6',
+ 'ltcir': '\u2A79',
+ 'ltdot': '\u22D6',
+ 'lthree': '\u22CB',
+ 'ltlarr': '\u2976',
+ 'ltquest': '\u2A7B',
+ 'ltrPar': '\u2996',
+ 'ltrie': '\u22B4',
+ 'ltrif': '\u25C2',
+ 'lurdshar': '\u294A',
+ 'luruhar': '\u2966',
+ 'lvertneqq': '\u2268\uFE00',
+ 'lvnE': '\u2268\uFE00'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/l.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/m.js b/js/mathjax/jax/input/MathML/entities/m.js
new file mode 100644
index 0000000..823a6a2
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/m.js
@@ -0,0 +1,63 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/m.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'Map': '\u2905',
+ 'Mcy': '\u041C',
+ 'MediumSpace': '\u205F',
+ 'Mellintrf': '\u2133',
+ 'Mu': '\u039C',
+ 'mDDot': '\u223A',
+ 'male': '\u2642',
+ 'maltese': '\u2720',
+ 'map': '\u21A6',
+ 'mapsto': '\u21A6',
+ 'mapstodown': '\u21A7',
+ 'mapstoleft': '\u21A4',
+ 'mapstoup': '\u21A5',
+ 'marker': '\u25AE',
+ 'mcomma': '\u2A29',
+ 'mcy': '\u043C',
+ 'mdash': '\u2014',
+ 'measuredangle': '\u2221',
+ 'micro': '\u00B5',
+ 'mid': '\u2223',
+ 'midast': '\u002A',
+ 'midcir': '\u2AF0',
+ 'middot': '\u00B7',
+ 'minus': '\u2212',
+ 'minusb': '\u229F',
+ 'minusd': '\u2238',
+ 'minusdu': '\u2A2A',
+ 'mlcp': '\u2ADB',
+ 'mldr': '\u2026',
+ 'mnplus': '\u2213',
+ 'models': '\u22A7',
+ 'mp': '\u2213',
+ 'mstpos': '\u223E',
+ 'mumap': '\u22B8'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/m.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/n.js b/js/mathjax/jax/input/MathML/entities/n.js
new file mode 100644
index 0000000..491daf5
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/n.js
@@ -0,0 +1,222 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/n.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'NJcy': '\u040A',
+ 'Nacute': '\u0143',
+ 'Ncaron': '\u0147',
+ 'Ncedil': '\u0145',
+ 'Ncy': '\u041D',
+ 'NegativeMediumSpace': '\u200B',
+ 'NegativeThickSpace': '\u200B',
+ 'NegativeThinSpace': '\u200B',
+ 'NegativeVeryThinSpace': '\u200B',
+ 'NewLine': '\u000A',
+ 'NoBreak': '\u2060',
+ 'NonBreakingSpace': '\u00A0',
+ 'Not': '\u2AEC',
+ 'NotCongruent': '\u2262',
+ 'NotCupCap': '\u226D',
+ 'NotEqualTilde': '\u2242\u0338',
+ 'NotGreaterFullEqual': '\u2267\u0338',
+ 'NotGreaterGreater': '\u226B\u0338',
+ 'NotGreaterLess': '\u2279',
+ 'NotGreaterSlantEqual': '\u2A7E\u0338',
+ 'NotGreaterTilde': '\u2275',
+ 'NotHumpDownHump': '\u224E\u0338',
+ 'NotHumpEqual': '\u224F\u0338',
+ 'NotLeftTriangleBar': '\u29CF\u0338',
+ 'NotLessGreater': '\u2278',
+ 'NotLessLess': '\u226A\u0338',
+ 'NotLessSlantEqual': '\u2A7D\u0338',
+ 'NotLessTilde': '\u2274',
+ 'NotNestedGreaterGreater': '\u2AA2\u0338',
+ 'NotNestedLessLess': '\u2AA1\u0338',
+ 'NotPrecedesEqual': '\u2AAF\u0338',
+ 'NotReverseElement': '\u220C',
+ 'NotRightTriangleBar': '\u29D0\u0338',
+ 'NotSquareSubset': '\u228F\u0338',
+ 'NotSquareSubsetEqual': '\u22E2',
+ 'NotSquareSuperset': '\u2290\u0338',
+ 'NotSquareSupersetEqual': '\u22E3',
+ 'NotSubset': '\u2282\u20D2',
+ 'NotSucceedsEqual': '\u2AB0\u0338',
+ 'NotSucceedsTilde': '\u227F\u0338',
+ 'NotSuperset': '\u2283\u20D2',
+ 'NotTildeEqual': '\u2244',
+ 'NotTildeFullEqual': '\u2247',
+ 'NotTildeTilde': '\u2249',
+ 'Ntilde': '\u00D1',
+ 'Nu': '\u039D',
+ 'nGg': '\u22D9\u0338',
+ 'nGt': '\u226B\u20D2',
+ 'nGtv': '\u226B\u0338',
+ 'nLl': '\u22D8\u0338',
+ 'nLt': '\u226A\u20D2',
+ 'nLtv': '\u226A\u0338',
+ 'nabla': '\u2207',
+ 'nacute': '\u0144',
+ 'nang': '\u2220\u20D2',
+ 'nap': '\u2249',
+ 'napE': '\u2A70\u0338',
+ 'napid': '\u224B\u0338',
+ 'napos': '\u0149',
+ 'napprox': '\u2249',
+ 'natural': '\u266E',
+ 'naturals': '\u2115',
+ 'nbsp': '\u00A0',
+ 'nbump': '\u224E\u0338',
+ 'nbumpe': '\u224F\u0338',
+ 'ncap': '\u2A43',
+ 'ncaron': '\u0148',
+ 'ncedil': '\u0146',
+ 'ncong': '\u2247',
+ 'ncongdot': '\u2A6D\u0338',
+ 'ncup': '\u2A42',
+ 'ncy': '\u043D',
+ 'ndash': '\u2013',
+ 'ne': '\u2260',
+ 'neArr': '\u21D7',
+ 'nearhk': '\u2924',
+ 'nearrow': '\u2197',
+ 'nedot': '\u2250\u0338',
+ 'nequiv': '\u2262',
+ 'nesear': '\u2928',
+ 'nesim': '\u2242\u0338',
+ 'nexist': '\u2204',
+ 'nexists': '\u2204',
+ 'ngE': '\u2267\u0338',
+ 'nge': '\u2271',
+ 'ngeq': '\u2271',
+ 'ngeqq': '\u2267\u0338',
+ 'ngeqslant': '\u2A7E\u0338',
+ 'nges': '\u2A7E\u0338',
+ 'ngsim': '\u2275',
+ 'ngt': '\u226F',
+ 'ngtr': '\u226F',
+ 'nhArr': '\u21CE',
+ 'nhpar': '\u2AF2',
+ 'ni': '\u220B',
+ 'nis': '\u22FC',
+ 'nisd': '\u22FA',
+ 'niv': '\u220B',
+ 'njcy': '\u045A',
+ 'nlArr': '\u21CD',
+ 'nlE': '\u2266\u0338',
+ 'nldr': '\u2025',
+ 'nle': '\u2270',
+ 'nleftarrow': '\u219A',
+ 'nleftrightarrow': '\u21AE',
+ 'nleq': '\u2270',
+ 'nleqq': '\u2266\u0338',
+ 'nleqslant': '\u2A7D\u0338',
+ 'nles': '\u2A7D\u0338',
+ 'nless': '\u226E',
+ 'nlsim': '\u2274',
+ 'nlt': '\u226E',
+ 'nltri': '\u22EA',
+ 'nltrie': '\u22EC',
+ 'nmid': '\u2224',
+ 'notin': '\u2209',
+ 'notinE': '\u22F9\u0338',
+ 'notindot': '\u22F5\u0338',
+ 'notinva': '\u2209',
+ 'notinvb': '\u22F7',
+ 'notinvc': '\u22F6',
+ 'notni': '\u220C',
+ 'notniva': '\u220C',
+ 'notnivb': '\u22FE',
+ 'notnivc': '\u22FD',
+ 'npar': '\u2226',
+ 'nparallel': '\u2226',
+ 'nparsl': '\u2AFD\u20E5',
+ 'npart': '\u2202\u0338',
+ 'npolint': '\u2A14',
+ 'npr': '\u2280',
+ 'nprcue': '\u22E0',
+ 'npre': '\u2AAF\u0338',
+ 'nprec': '\u2280',
+ 'npreceq': '\u2AAF\u0338',
+ 'nrArr': '\u21CF',
+ 'nrarrc': '\u2933\u0338',
+ 'nrarrw': '\u219D\u0338',
+ 'nrightarrow': '\u219B',
+ 'nrtri': '\u22EB',
+ 'nrtrie': '\u22ED',
+ 'nsc': '\u2281',
+ 'nsccue': '\u22E1',
+ 'nsce': '\u2AB0\u0338',
+ 'nshortmid': '\u2224',
+ 'nshortparallel': '\u2226',
+ 'nsim': '\u2241',
+ 'nsime': '\u2244',
+ 'nsimeq': '\u2244',
+ 'nsmid': '\u2224',
+ 'nspar': '\u2226',
+ 'nsqsube': '\u22E2',
+ 'nsqsupe': '\u22E3',
+ 'nsub': '\u2284',
+ 'nsubE': '\u2AC5\u0338',
+ 'nsube': '\u2288',
+ 'nsubset': '\u2282\u20D2',
+ 'nsubseteq': '\u2288',
+ 'nsubseteqq': '\u2AC5\u0338',
+ 'nsucc': '\u2281',
+ 'nsucceq': '\u2AB0\u0338',
+ 'nsup': '\u2285',
+ 'nsupE': '\u2AC6\u0338',
+ 'nsupe': '\u2289',
+ 'nsupset': '\u2283\u20D2',
+ 'nsupseteq': '\u2289',
+ 'nsupseteqq': '\u2AC6\u0338',
+ 'ntgl': '\u2279',
+ 'ntilde': '\u00F1',
+ 'ntlg': '\u2278',
+ 'ntriangleleft': '\u22EA',
+ 'ntrianglelefteq': '\u22EC',
+ 'ntriangleright': '\u22EB',
+ 'ntrianglerighteq': '\u22ED',
+ 'num': '\u0023',
+ 'numero': '\u2116',
+ 'numsp': '\u2007',
+ 'nvHarr': '\u2904',
+ 'nvap': '\u224D\u20D2',
+ 'nvge': '\u2265\u20D2',
+ 'nvgt': '\u003E\u20D2',
+ 'nvinfin': '\u29DE',
+ 'nvlArr': '\u2902',
+ 'nvle': '\u2264\u20D2',
+ 'nvlt': '\u003C\u20D2',
+ 'nvltrie': '\u22B4\u20D2',
+ 'nvrArr': '\u2903',
+ 'nvrtrie': '\u22B5\u20D2',
+ 'nvsim': '\u223C\u20D2',
+ 'nwArr': '\u21D6',
+ 'nwarhk': '\u2923',
+ 'nwarrow': '\u2196',
+ 'nwnear': '\u2927'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/n.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/o.js b/js/mathjax/jax/input/MathML/entities/o.js
new file mode 100644
index 0000000..5017e8e
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/o.js
@@ -0,0 +1,92 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/o.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'OElig': '\u0152',
+ 'Oacute': '\u00D3',
+ 'Ocirc': '\u00D4',
+ 'Ocy': '\u041E',
+ 'Odblac': '\u0150',
+ 'Ograve': '\u00D2',
+ 'Omacr': '\u014C',
+ 'Omicron': '\u039F',
+ 'OpenCurlyDoubleQuote': '\u201C',
+ 'OpenCurlyQuote': '\u2018',
+ 'Or': '\u2A54',
+ 'Oslash': '\u00D8',
+ 'Otilde': '\u00D5',
+ 'Otimes': '\u2A37',
+ 'Ouml': '\u00D6',
+ 'OverBracket': '\u23B4',
+ 'OverParenthesis': '\u23DC',
+ 'oS': '\u24C8',
+ 'oacute': '\u00F3',
+ 'oast': '\u229B',
+ 'ocir': '\u229A',
+ 'ocirc': '\u00F4',
+ 'ocy': '\u043E',
+ 'odash': '\u229D',
+ 'odblac': '\u0151',
+ 'odiv': '\u2A38',
+ 'odot': '\u2299',
+ 'odsold': '\u29BC',
+ 'oelig': '\u0153',
+ 'ofcir': '\u29BF',
+ 'ogon': '\u02DB',
+ 'ograve': '\u00F2',
+ 'ogt': '\u29C1',
+ 'ohbar': '\u29B5',
+ 'ohm': '\u03A9',
+ 'oint': '\u222E',
+ 'olarr': '\u21BA',
+ 'olcir': '\u29BE',
+ 'olcross': '\u29BB',
+ 'oline': '\u203E',
+ 'olt': '\u29C0',
+ 'omacr': '\u014D',
+ 'omid': '\u29B6',
+ 'ominus': '\u2296',
+ 'opar': '\u29B7',
+ 'operp': '\u29B9',
+ 'oplus': '\u2295',
+ 'orarr': '\u21BB',
+ 'ord': '\u2A5D',
+ 'order': '\u2134',
+ 'orderof': '\u2134',
+ 'ordf': '\u00AA',
+ 'ordm': '\u00BA',
+ 'origof': '\u22B6',
+ 'oror': '\u2A56',
+ 'orslope': '\u2A57',
+ 'orv': '\u2A5B',
+ 'oslash': '\u00F8',
+ 'otilde': '\u00F5',
+ 'otimes': '\u2297',
+ 'otimesas': '\u2A36',
+ 'ouml': '\u00F6',
+ 'ovbar': '\u233D'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/o.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/opf.js b/js/mathjax/jax/input/MathML/entities/opf.js
new file mode 100644
index 0000000..8085482
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/opf.js
@@ -0,0 +1,81 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/opf.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'Aopf': '\uD835\uDD38',
+ 'Bopf': '\uD835\uDD39',
+ 'Copf': '\u2102',
+ 'Dopf': '\uD835\uDD3B',
+ 'Eopf': '\uD835\uDD3C',
+ 'Fopf': '\uD835\uDD3D',
+ 'Gopf': '\uD835\uDD3E',
+ 'Hopf': '\u210D',
+ 'Iopf': '\uD835\uDD40',
+ 'Jopf': '\uD835\uDD41',
+ 'Kopf': '\uD835\uDD42',
+ 'Lopf': '\uD835\uDD43',
+ 'Mopf': '\uD835\uDD44',
+ 'Nopf': '\u2115',
+ 'Oopf': '\uD835\uDD46',
+ 'Popf': '\u2119',
+ 'Qopf': '\u211A',
+ 'Ropf': '\u211D',
+ 'Sopf': '\uD835\uDD4A',
+ 'Topf': '\uD835\uDD4B',
+ 'Uopf': '\uD835\uDD4C',
+ 'Vopf': '\uD835\uDD4D',
+ 'Wopf': '\uD835\uDD4E',
+ 'Xopf': '\uD835\uDD4F',
+ 'Yopf': '\uD835\uDD50',
+ 'Zopf': '\u2124',
+ 'aopf': '\uD835\uDD52',
+ 'bopf': '\uD835\uDD53',
+ 'copf': '\uD835\uDD54',
+ 'dopf': '\uD835\uDD55',
+ 'eopf': '\uD835\uDD56',
+ 'fopf': '\uD835\uDD57',
+ 'gopf': '\uD835\uDD58',
+ 'hopf': '\uD835\uDD59',
+ 'iopf': '\uD835\uDD5A',
+ 'jopf': '\uD835\uDD5B',
+ 'kopf': '\uD835\uDD5C',
+ 'lopf': '\uD835\uDD5D',
+ 'mopf': '\uD835\uDD5E',
+ 'nopf': '\uD835\uDD5F',
+ 'oopf': '\uD835\uDD60',
+ 'popf': '\uD835\uDD61',
+ 'qopf': '\uD835\uDD62',
+ 'ropf': '\uD835\uDD63',
+ 'sopf': '\uD835\uDD64',
+ 'topf': '\uD835\uDD65',
+ 'uopf': '\uD835\uDD66',
+ 'vopf': '\uD835\uDD67',
+ 'wopf': '\uD835\uDD68',
+ 'xopf': '\uD835\uDD69',
+ 'yopf': '\uD835\uDD6A',
+ 'zopf': '\uD835\uDD6B'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/opf.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/p.js b/js/mathjax/jax/input/MathML/entities/p.js
new file mode 100644
index 0000000..41870fe
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/p.js
@@ -0,0 +1,86 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/p.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'Pcy': '\u041F',
+ 'Poincareplane': '\u210C',
+ 'Pr': '\u2ABB',
+ 'Prime': '\u2033',
+ 'Proportion': '\u2237',
+ 'par': '\u2225',
+ 'para': '\u00B6',
+ 'parallel': '\u2225',
+ 'parsim': '\u2AF3',
+ 'parsl': '\u2AFD',
+ 'part': '\u2202',
+ 'pcy': '\u043F',
+ 'percnt': '\u0025',
+ 'permil': '\u2030',
+ 'perp': '\u22A5',
+ 'pertenk': '\u2031',
+ 'phmmat': '\u2133',
+ 'phone': '\u260E',
+ 'pitchfork': '\u22D4',
+ 'planck': '\u210F',
+ 'planckh': '\u210E',
+ 'plankv': '\u210F',
+ 'plus': '\u002B',
+ 'plusacir': '\u2A23',
+ 'plusb': '\u229E',
+ 'pluscir': '\u2A22',
+ 'plusdo': '\u2214',
+ 'plusdu': '\u2A25',
+ 'pluse': '\u2A72',
+ 'plusmn': '\u00B1',
+ 'plussim': '\u2A26',
+ 'plustwo': '\u2A27',
+ 'pm': '\u00B1',
+ 'pointint': '\u2A15',
+ 'pound': '\u00A3',
+ 'pr': '\u227A',
+ 'prE': '\u2AB3',
+ 'prcue': '\u227C',
+ 'pre': '\u2AAF',
+ 'prec': '\u227A',
+ 'precapprox': '\u2AB7',
+ 'preccurlyeq': '\u227C',
+ 'preceq': '\u2AAF',
+ 'precsim': '\u227E',
+ 'primes': '\u2119',
+ 'prnE': '\u2AB5',
+ 'prnap': '\u2AB9',
+ 'prnsim': '\u22E8',
+ 'prod': '\u220F',
+ 'profalar': '\u232E',
+ 'profline': '\u2312',
+ 'profsurf': '\u2313',
+ 'prop': '\u221D',
+ 'propto': '\u221D',
+ 'prsim': '\u227E',
+ 'prurel': '\u22B0',
+ 'puncsp': '\u2008'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/p.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/q.js b/js/mathjax/jax/input/MathML/entities/q.js
new file mode 100644
index 0000000..c900aa4
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/q.js
@@ -0,0 +1,37 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/q.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'QUOT': '\u0022',
+ 'qint': '\u2A0C',
+ 'qprime': '\u2057',
+ 'quaternions': '\u210D',
+ 'quatint': '\u2A16',
+ 'quest': '\u003F',
+ 'questeq': '\u225F',
+ 'quot': '\u0022'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/q.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/r.js b/js/mathjax/jax/input/MathML/entities/r.js
new file mode 100644
index 0000000..92129bf
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/r.js
@@ -0,0 +1,140 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/r.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'RBarr': '\u2910',
+ 'REG': '\u00AE',
+ 'Racute': '\u0154',
+ 'Rang': '\u27EB',
+ 'Rarrtl': '\u2916',
+ 'Rcaron': '\u0158',
+ 'Rcedil': '\u0156',
+ 'Rcy': '\u0420',
+ 'ReverseElement': '\u220B',
+ 'ReverseUpEquilibrium': '\u296F',
+ 'Rho': '\u03A1',
+ 'RightArrowBar': '\u21E5',
+ 'RightDoubleBracket': '\u27E7',
+ 'RightDownTeeVector': '\u295D',
+ 'RightDownVectorBar': '\u2955',
+ 'RightTeeVector': '\u295B',
+ 'RightTriangleBar': '\u29D0',
+ 'RightUpDownVector': '\u294F',
+ 'RightUpTeeVector': '\u295C',
+ 'RightUpVectorBar': '\u2954',
+ 'RightVectorBar': '\u2953',
+ 'RoundImplies': '\u2970',
+ 'RuleDelayed': '\u29F4',
+ 'rAarr': '\u21DB',
+ 'rArr': '\u21D2',
+ 'rAtail': '\u291C',
+ 'rBarr': '\u290F',
+ 'rHar': '\u2964',
+ 'race': '\u223D\u0331',
+ 'racute': '\u0155',
+ 'radic': '\u221A',
+ 'raemptyv': '\u29B3',
+ 'rang': '\u27E9',
+ 'rangd': '\u2992',
+ 'range': '\u29A5',
+ 'rangle': '\u27E9',
+ 'raquo': '\u00BB',
+ 'rarr': '\u2192',
+ 'rarrap': '\u2975',
+ 'rarrb': '\u21E5',
+ 'rarrbfs': '\u2920',
+ 'rarrc': '\u2933',
+ 'rarrfs': '\u291E',
+ 'rarrhk': '\u21AA',
+ 'rarrlp': '\u21AC',
+ 'rarrpl': '\u2945',
+ 'rarrsim': '\u2974',
+ 'rarrw': '\u219D',
+ 'ratail': '\u291A',
+ 'ratio': '\u2236',
+ 'rationals': '\u211A',
+ 'rbarr': '\u290D',
+ 'rbbrk': '\u2773',
+ 'rbrke': '\u298C',
+ 'rbrksld': '\u298E',
+ 'rbrkslu': '\u2990',
+ 'rcaron': '\u0159',
+ 'rcedil': '\u0157',
+ 'rceil': '\u2309',
+ 'rcub': '\u007D',
+ 'rcy': '\u0440',
+ 'rdca': '\u2937',
+ 'rdldhar': '\u2969',
+ 'rdquo': '\u201D',
+ 'rdquor': '\u201D',
+ 'rdsh': '\u21B3',
+ 'real': '\u211C',
+ 'realine': '\u211B',
+ 'realpart': '\u211C',
+ 'reals': '\u211D',
+ 'rect': '\u25AD',
+ 'reg': '\u00AE',
+ 'rfisht': '\u297D',
+ 'rfloor': '\u230B',
+ 'rhard': '\u21C1',
+ 'rharu': '\u21C0',
+ 'rharul': '\u296C',
+ 'rightarrow': '\u2192',
+ 'rightarrowtail': '\u21A3',
+ 'rightharpoondown': '\u21C1',
+ 'rightharpoonup': '\u21C0',
+ 'rightleftarrows': '\u21C4',
+ 'rightleftharpoons': '\u21CC',
+ 'rightsquigarrow': '\u219D',
+ 'risingdotseq': '\u2253',
+ 'rlarr': '\u21C4',
+ 'rlhar': '\u21CC',
+ 'rlm': '\u200F',
+ 'rmoustache': '\u23B1',
+ 'rnmid': '\u2AEE',
+ 'roang': '\u27ED',
+ 'roarr': '\u21FE',
+ 'robrk': '\u27E7',
+ 'ropar': '\u2986',
+ 'roplus': '\u2A2E',
+ 'rotimes': '\u2A35',
+ 'rpar': '\u0029',
+ 'rpargt': '\u2994',
+ 'rppolint': '\u2A12',
+ 'rrarr': '\u21C9',
+ 'rsaquo': '\u203A',
+ 'rsh': '\u21B1',
+ 'rsqb': '\u005D',
+ 'rsquo': '\u2019',
+ 'rsquor': '\u2019',
+ 'rthree': '\u22CC',
+ 'rtrie': '\u22B5',
+ 'rtrif': '\u25B8',
+ 'rtriltri': '\u29CE',
+ 'ruluhar': '\u2968',
+ 'rx': '\u211E'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/r.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/s.js b/js/mathjax/jax/input/MathML/entities/s.js
new file mode 100644
index 0000000..181d853
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/s.js
@@ -0,0 +1,172 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/s.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'SHCHcy': '\u0429',
+ 'SHcy': '\u0428',
+ 'SOFTcy': '\u042C',
+ 'Sacute': '\u015A',
+ 'Sc': '\u2ABC',
+ 'Scaron': '\u0160',
+ 'Scedil': '\u015E',
+ 'Scirc': '\u015C',
+ 'Scy': '\u0421',
+ 'ShortDownArrow': '\u2193',
+ 'ShortLeftArrow': '\u2190',
+ 'ShortRightArrow': '\u2192',
+ 'ShortUpArrow': '\u2191',
+ 'Sub': '\u22D0',
+ 'Sup': '\u22D1',
+ 'sacute': '\u015B',
+ 'sbquo': '\u201A',
+ 'sc': '\u227B',
+ 'scE': '\u2AB4',
+ 'scaron': '\u0161',
+ 'sccue': '\u227D',
+ 'sce': '\u2AB0',
+ 'scedil': '\u015F',
+ 'scirc': '\u015D',
+ 'scpolint': '\u2A13',
+ 'scsim': '\u227F',
+ 'scy': '\u0441',
+ 'sdotb': '\u22A1',
+ 'sdote': '\u2A66',
+ 'seArr': '\u21D8',
+ 'searhk': '\u2925',
+ 'searrow': '\u2198',
+ 'semi': '\u003B',
+ 'seswar': '\u2929',
+ 'setminus': '\u2216',
+ 'setmn': '\u2216',
+ 'sext': '\u2736',
+ 'sfrown': '\u2322',
+ 'shchcy': '\u0449',
+ 'shcy': '\u0448',
+ 'shortmid': '\u2223',
+ 'shortparallel': '\u2225',
+ 'shy': '\u00AD',
+ 'sigmaf': '\u03C2',
+ 'sim': '\u223C',
+ 'simdot': '\u2A6A',
+ 'sime': '\u2243',
+ 'simeq': '\u2243',
+ 'simg': '\u2A9E',
+ 'simgE': '\u2AA0',
+ 'siml': '\u2A9D',
+ 'simlE': '\u2A9F',
+ 'simplus': '\u2A24',
+ 'simrarr': '\u2972',
+ 'slarr': '\u2190',
+ 'smallsetminus': '\u2216',
+ 'smashp': '\u2A33',
+ 'smeparsl': '\u29E4',
+ 'smid': '\u2223',
+ 'smt': '\u2AAA',
+ 'smte': '\u2AAC',
+ 'smtes': '\u2AAC\uFE00',
+ 'softcy': '\u044C',
+ 'sol': '\u002F',
+ 'solb': '\u29C4',
+ 'solbar': '\u233F',
+ 'spadesuit': '\u2660',
+ 'spar': '\u2225',
+ 'sqcap': '\u2293',
+ 'sqcaps': '\u2293\uFE00',
+ 'sqcup': '\u2294',
+ 'sqcups': '\u2294\uFE00',
+ 'sqsub': '\u228F',
+ 'sqsube': '\u2291',
+ 'sqsubset': '\u228F',
+ 'sqsubseteq': '\u2291',
+ 'sqsup': '\u2290',
+ 'sqsupe': '\u2292',
+ 'sqsupset': '\u2290',
+ 'sqsupseteq': '\u2292',
+ 'squ': '\u25A1',
+ 'square': '\u25A1',
+ 'squarf': '\u25AA',
+ 'squf': '\u25AA',
+ 'srarr': '\u2192',
+ 'ssetmn': '\u2216',
+ 'ssmile': '\u2323',
+ 'sstarf': '\u22C6',
+ 'star': '\u2606',
+ 'starf': '\u2605',
+ 'straightepsilon': '\u03F5',
+ 'straightphi': '\u03D5',
+ 'strns': '\u00AF',
+ 'subdot': '\u2ABD',
+ 'sube': '\u2286',
+ 'subedot': '\u2AC3',
+ 'submult': '\u2AC1',
+ 'subplus': '\u2ABF',
+ 'subrarr': '\u2979',
+ 'subset': '\u2282',
+ 'subseteq': '\u2286',
+ 'subseteqq': '\u2AC5',
+ 'subsetneq': '\u228A',
+ 'subsetneqq': '\u2ACB',
+ 'subsim': '\u2AC7',
+ 'subsub': '\u2AD5',
+ 'subsup': '\u2AD3',
+ 'succ': '\u227B',
+ 'succapprox': '\u2AB8',
+ 'succcurlyeq': '\u227D',
+ 'succeq': '\u2AB0',
+ 'succnapprox': '\u2ABA',
+ 'succneqq': '\u2AB6',
+ 'succnsim': '\u22E9',
+ 'succsim': '\u227F',
+ 'sum': '\u2211',
+ 'sung': '\u266A',
+ 'sup': '\u2283',
+ 'sup1': '\u00B9',
+ 'sup2': '\u00B2',
+ 'sup3': '\u00B3',
+ 'supdot': '\u2ABE',
+ 'supdsub': '\u2AD8',
+ 'supe': '\u2287',
+ 'supedot': '\u2AC4',
+ 'suphsol': '\u27C9',
+ 'suphsub': '\u2AD7',
+ 'suplarr': '\u297B',
+ 'supmult': '\u2AC2',
+ 'supplus': '\u2AC0',
+ 'supset': '\u2283',
+ 'supseteq': '\u2287',
+ 'supseteqq': '\u2AC6',
+ 'supsetneq': '\u228B',
+ 'supsetneqq': '\u2ACC',
+ 'supsim': '\u2AC8',
+ 'supsub': '\u2AD4',
+ 'supsup': '\u2AD6',
+ 'swArr': '\u21D9',
+ 'swarhk': '\u2926',
+ 'swarrow': '\u2199',
+ 'swnwar': '\u292A',
+ 'szlig': '\u00DF'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/s.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/scr.js b/js/mathjax/jax/input/MathML/entities/scr.js
new file mode 100644
index 0000000..c94df31
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/scr.js
@@ -0,0 +1,81 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/scr.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'Ascr': '\uD835\uDC9C',
+ 'Bscr': '\u212C',
+ 'Cscr': '\uD835\uDC9E',
+ 'Dscr': '\uD835\uDC9F',
+ 'Escr': '\u2130',
+ 'Fscr': '\u2131',
+ 'Gscr': '\uD835\uDCA2',
+ 'Hscr': '\u210B',
+ 'Iscr': '\u2110',
+ 'Jscr': '\uD835\uDCA5',
+ 'Kscr': '\uD835\uDCA6',
+ 'Lscr': '\u2112',
+ 'Mscr': '\u2133',
+ 'Nscr': '\uD835\uDCA9',
+ 'Oscr': '\uD835\uDCAA',
+ 'Pscr': '\uD835\uDCAB',
+ 'Qscr': '\uD835\uDCAC',
+ 'Rscr': '\u211B',
+ 'Sscr': '\uD835\uDCAE',
+ 'Tscr': '\uD835\uDCAF',
+ 'Uscr': '\uD835\uDCB0',
+ 'Vscr': '\uD835\uDCB1',
+ 'Wscr': '\uD835\uDCB2',
+ 'Xscr': '\uD835\uDCB3',
+ 'Yscr': '\uD835\uDCB4',
+ 'Zscr': '\uD835\uDCB5',
+ 'ascr': '\uD835\uDCB6',
+ 'bscr': '\uD835\uDCB7',
+ 'cscr': '\uD835\uDCB8',
+ 'dscr': '\uD835\uDCB9',
+ 'escr': '\u212F',
+ 'fscr': '\uD835\uDCBB',
+ 'gscr': '\u210A',
+ 'hscr': '\uD835\uDCBD',
+ 'iscr': '\uD835\uDCBE',
+ 'jscr': '\uD835\uDCBF',
+ 'kscr': '\uD835\uDCC0',
+ 'lscr': '\uD835\uDCC1',
+ 'mscr': '\uD835\uDCC2',
+ 'nscr': '\uD835\uDCC3',
+ 'oscr': '\u2134',
+ 'pscr': '\uD835\uDCC5',
+ 'qscr': '\uD835\uDCC6',
+ 'rscr': '\uD835\uDCC7',
+ 'sscr': '\uD835\uDCC8',
+ 'tscr': '\uD835\uDCC9',
+ 'uscr': '\uD835\uDCCA',
+ 'vscr': '\uD835\uDCCB',
+ 'wscr': '\uD835\uDCCC',
+ 'xscr': '\uD835\uDCCD',
+ 'yscr': '\uD835\uDCCE',
+ 'zscr': '\uD835\uDCCF'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/scr.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/t.js b/js/mathjax/jax/input/MathML/entities/t.js
new file mode 100644
index 0000000..b70d29c
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/t.js
@@ -0,0 +1,88 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/t.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'THORN': '\u00DE',
+ 'TRADE': '\u2122',
+ 'TSHcy': '\u040B',
+ 'TScy': '\u0426',
+ 'Tab': '\u0009',
+ 'Tau': '\u03A4',
+ 'Tcaron': '\u0164',
+ 'Tcedil': '\u0162',
+ 'Tcy': '\u0422',
+ 'ThickSpace': '\u205F\u200A',
+ 'ThinSpace': '\u2009',
+ 'TripleDot': '\u20DB',
+ 'Tstrok': '\u0166',
+ 'target': '\u2316',
+ 'tbrk': '\u23B4',
+ 'tcaron': '\u0165',
+ 'tcedil': '\u0163',
+ 'tcy': '\u0442',
+ 'tdot': '\u20DB',
+ 'telrec': '\u2315',
+ 'there4': '\u2234',
+ 'therefore': '\u2234',
+ 'thetasym': '\u03D1',
+ 'thickapprox': '\u2248',
+ 'thicksim': '\u223C',
+ 'thinsp': '\u2009',
+ 'thkap': '\u2248',
+ 'thksim': '\u223C',
+ 'thorn': '\u00FE',
+ 'timesb': '\u22A0',
+ 'timesbar': '\u2A31',
+ 'timesd': '\u2A30',
+ 'tint': '\u222D',
+ 'toea': '\u2928',
+ 'top': '\u22A4',
+ 'topbot': '\u2336',
+ 'topcir': '\u2AF1',
+ 'topfork': '\u2ADA',
+ 'tosa': '\u2929',
+ 'tprime': '\u2034',
+ 'trade': '\u2122',
+ 'triangledown': '\u25BF',
+ 'triangleleft': '\u25C3',
+ 'trianglelefteq': '\u22B4',
+ 'triangleright': '\u25B9',
+ 'trianglerighteq': '\u22B5',
+ 'tridot': '\u25EC',
+ 'trie': '\u225C',
+ 'triminus': '\u2A3A',
+ 'triplus': '\u2A39',
+ 'trisb': '\u29CD',
+ 'tritime': '\u2A3B',
+ 'trpezium': '\u23E2',
+ 'tscy': '\u0446',
+ 'tshcy': '\u045B',
+ 'tstrok': '\u0167',
+ 'twixt': '\u226C',
+ 'twoheadleftarrow': '\u219E',
+ 'twoheadrightarrow': '\u21A0'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/t.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/u.js b/js/mathjax/jax/input/MathML/entities/u.js
new file mode 100644
index 0000000..cf22bdc
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/u.js
@@ -0,0 +1,94 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/u.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'Uacute': '\u00DA',
+ 'Uarr': '\u219F',
+ 'Uarrocir': '\u2949',
+ 'Ubrcy': '\u040E',
+ 'Ubreve': '\u016C',
+ 'Ucirc': '\u00DB',
+ 'Ucy': '\u0423',
+ 'Udblac': '\u0170',
+ 'Ugrave': '\u00D9',
+ 'Umacr': '\u016A',
+ 'UnderBracket': '\u23B5',
+ 'UnderParenthesis': '\u23DD',
+ 'Uogon': '\u0172',
+ 'UpArrowBar': '\u2912',
+ 'UpArrowDownArrow': '\u21C5',
+ 'UpEquilibrium': '\u296E',
+ 'UpTeeArrow': '\u21A5',
+ 'UpperLeftArrow': '\u2196',
+ 'UpperRightArrow': '\u2197',
+ 'Upsi': '\u03D2',
+ 'Uring': '\u016E',
+ 'Utilde': '\u0168',
+ 'Uuml': '\u00DC',
+ 'uArr': '\u21D1',
+ 'uHar': '\u2963',
+ 'uacute': '\u00FA',
+ 'uarr': '\u2191',
+ 'ubrcy': '\u045E',
+ 'ubreve': '\u016D',
+ 'ucirc': '\u00FB',
+ 'ucy': '\u0443',
+ 'udarr': '\u21C5',
+ 'udblac': '\u0171',
+ 'udhar': '\u296E',
+ 'ufisht': '\u297E',
+ 'ugrave': '\u00F9',
+ 'uharl': '\u21BF',
+ 'uharr': '\u21BE',
+ 'uhblk': '\u2580',
+ 'ulcorn': '\u231C',
+ 'ulcorner': '\u231C',
+ 'ulcrop': '\u230F',
+ 'ultri': '\u25F8',
+ 'umacr': '\u016B',
+ 'uml': '\u00A8',
+ 'uogon': '\u0173',
+ 'uparrow': '\u2191',
+ 'updownarrow': '\u2195',
+ 'upharpoonleft': '\u21BF',
+ 'upharpoonright': '\u21BE',
+ 'uplus': '\u228E',
+ 'upsih': '\u03D2',
+ 'upsilon': '\u03C5',
+ 'urcorn': '\u231D',
+ 'urcorner': '\u231D',
+ 'urcrop': '\u230E',
+ 'uring': '\u016F',
+ 'urtri': '\u25F9',
+ 'utdot': '\u22F0',
+ 'utilde': '\u0169',
+ 'utri': '\u25B5',
+ 'utrif': '\u25B4',
+ 'uuarr': '\u21C8',
+ 'uuml': '\u00FC',
+ 'uwangle': '\u29A7'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/u.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/v.js b/js/mathjax/jax/input/MathML/entities/v.js
new file mode 100644
index 0000000..e944c95
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/v.js
@@ -0,0 +1,75 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/v.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'VDash': '\u22AB',
+ 'Vbar': '\u2AEB',
+ 'Vcy': '\u0412',
+ 'Vdashl': '\u2AE6',
+ 'Verbar': '\u2016',
+ 'Vert': '\u2016',
+ 'VerticalLine': '\u007C',
+ 'VerticalSeparator': '\u2758',
+ 'VeryThinSpace': '\u200A',
+ 'vArr': '\u21D5',
+ 'vBar': '\u2AE8',
+ 'vBarv': '\u2AE9',
+ 'vDash': '\u22A8',
+ 'vangrt': '\u299C',
+ 'varepsilon': '\u03F5',
+ 'varkappa': '\u03F0',
+ 'varnothing': '\u2205',
+ 'varphi': '\u03D5',
+ 'varpi': '\u03D6',
+ 'varpropto': '\u221D',
+ 'varr': '\u2195',
+ 'varrho': '\u03F1',
+ 'varsigma': '\u03C2',
+ 'varsubsetneq': '\u228A\uFE00',
+ 'varsubsetneqq': '\u2ACB\uFE00',
+ 'varsupsetneq': '\u228B\uFE00',
+ 'varsupsetneqq': '\u2ACC\uFE00',
+ 'vartheta': '\u03D1',
+ 'vartriangleleft': '\u22B2',
+ 'vartriangleright': '\u22B3',
+ 'vcy': '\u0432',
+ 'vdash': '\u22A2',
+ 'vee': '\u2228',
+ 'veeeq': '\u225A',
+ 'verbar': '\u007C',
+ 'vert': '\u007C',
+ 'vltri': '\u22B2',
+ 'vnsub': '\u2282\u20D2',
+ 'vnsup': '\u2283\u20D2',
+ 'vprop': '\u221D',
+ 'vrtri': '\u22B3',
+ 'vsubnE': '\u2ACB\uFE00',
+ 'vsubne': '\u228A\uFE00',
+ 'vsupnE': '\u2ACC\uFE00',
+ 'vsupne': '\u228B\uFE00',
+ 'vzigzag': '\u299A'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/v.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/w.js b/js/mathjax/jax/input/MathML/entities/w.js
new file mode 100644
index 0000000..2f2f9f9
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/w.js
@@ -0,0 +1,37 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/w.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'Wcirc': '\u0174',
+ 'wcirc': '\u0175',
+ 'wedbar': '\u2A5F',
+ 'wedge': '\u2227',
+ 'wedgeq': '\u2259',
+ 'wp': '\u2118',
+ 'wr': '\u2240',
+ 'wreath': '\u2240'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/w.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/x.js b/js/mathjax/jax/input/MathML/entities/x.js
new file mode 100644
index 0000000..7b23395
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/x.js
@@ -0,0 +1,49 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/x.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'xcap': '\u22C2',
+ 'xcirc': '\u25EF',
+ 'xcup': '\u22C3',
+ 'xdtri': '\u25BD',
+ 'xhArr': '\u27FA',
+ 'xharr': '\u27F7',
+ 'xlArr': '\u27F8',
+ 'xlarr': '\u27F5',
+ 'xmap': '\u27FC',
+ 'xnis': '\u22FB',
+ 'xodot': '\u2A00',
+ 'xoplus': '\u2A01',
+ 'xotime': '\u2A02',
+ 'xrArr': '\u27F9',
+ 'xrarr': '\u27F6',
+ 'xsqcup': '\u2A06',
+ 'xuplus': '\u2A04',
+ 'xutri': '\u25B3',
+ 'xvee': '\u22C1',
+ 'xwedge': '\u22C0'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/x.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/y.js b/js/mathjax/jax/input/MathML/entities/y.js
new file mode 100644
index 0000000..bcaebab
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/y.js
@@ -0,0 +1,43 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/y.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'YAcy': '\u042F',
+ 'YIcy': '\u0407',
+ 'YUcy': '\u042E',
+ 'Yacute': '\u00DD',
+ 'Ycirc': '\u0176',
+ 'Ycy': '\u042B',
+ 'Yuml': '\u0178',
+ 'yacute': '\u00FD',
+ 'yacy': '\u044F',
+ 'ycirc': '\u0177',
+ 'ycy': '\u044B',
+ 'yicy': '\u0457',
+ 'yucy': '\u044E',
+ 'yuml': '\u00FF'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/y.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/entities/z.js b/js/mathjax/jax/input/MathML/entities/z.js
new file mode 100644
index 0000000..2883e8d
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/entities/z.js
@@ -0,0 +1,44 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * MathJax/jax/output/HTML-CSS/entities/z.js
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+(function (MATHML) {
+ MathJax.Hub.Insert(MATHML.Parse.Entity,{
+ 'ZHcy': '\u0416',
+ 'Zacute': '\u0179',
+ 'Zcaron': '\u017D',
+ 'Zcy': '\u0417',
+ 'Zdot': '\u017B',
+ 'ZeroWidthSpace': '\u200B',
+ 'Zeta': '\u0396',
+ 'zacute': '\u017A',
+ 'zcaron': '\u017E',
+ 'zcy': '\u0437',
+ 'zdot': '\u017C',
+ 'zeetrf': '\u2128',
+ 'zhcy': '\u0436',
+ 'zwj': '\u200D',
+ 'zwnj': '\u200C'
+ });
+
+ MathJax.Ajax.loadComplete(MATHML.entityDir+"/z.js");
+
+})(MathJax.InputJax.MathML);
+// @license-end
diff --git a/js/mathjax/jax/input/MathML/jax.js b/js/mathjax/jax/input/MathML/jax.js
new file mode 100644
index 0000000..cc4081b
--- /dev/null
+++ b/js/mathjax/jax/input/MathML/jax.js
@@ -0,0 +1,783 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+
+/*************************************************************
+ *
+ * MathJax/jax/input/MathML/jax.js
+ *
+ * Implements the MathML InputJax that reads mathematics in
+ * MathML format and converts it to the MML ElementJax
+ * internal format.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * Copyright (c) 2010-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function (MATHML,BROWSER) {
+ var MML;
+
+ var _ = function (id) {
+ return MathJax.Localization._.apply(MathJax.Localization,
+ [["MathML",id]].concat([].slice.call(arguments,1)))
+ };
+
+ MATHML.Parse = MathJax.Object.Subclass({
+
+ Init: function (string,script) {this.Parse(string,script)},
+
+ //
+ // Parse the MathML and check for errors
+ //
+ Parse: function (math,script) {
+ var doc;
+ if (typeof math !== "string") {doc = math.parentNode} else {
+ doc = MATHML.ParseXML(this.preProcessMath.call(this,math));
+ if (doc == null) {MATHML.Error(["ErrorParsingMathML","Error parsing MathML"])}
+ }
+ var err = doc.getElementsByTagName("parsererror")[0];
+ if (err) MATHML.Error(["ParsingError","Error parsing MathML: %1",
+ err.textContent.replace(/This page.*?errors:|XML Parsing Error: |Below is a rendering of the page.*/g,"")]);
+ if (doc.childNodes.length !== 1)
+ {MATHML.Error(["MathMLSingleElement","MathML must be formed by a single element"])}
+ if (doc.firstChild.nodeName.toLowerCase() === "html") {
+ var h1 = doc.getElementsByTagName("h1")[0];
+ if (h1 && h1.textContent === "XML parsing error" && h1.nextSibling)
+ MATHML.Error(["ParsingError","Error parsing MathML: %1",
+ String(h1.nextSibling.nodeValue).replace(/fatal parsing error: /,"")]);
+ }
+ if (doc.firstChild.nodeName.toLowerCase().replace(/^[a-z]+:/,"") !== "math") {
+ MATHML.Error(["MathMLRootElement",
+ "MathML must be formed by a <math> element, not %1",
+ "<"+doc.firstChild.nodeName+">"]);
+ }
+ var data = {math:doc.firstChild, script:script};
+ MATHML.DOMfilterHooks.Execute(data);
+ this.mml = this.MakeMML(data.math);
+ },
+
+ //
+ // Convert the MathML structure to the MathJax Element jax structure
+ //
+ MakeMML: function (node) {
+ var CLASS = String(node.getAttribute("class")||""); // make sure CLASS is a string
+ var mml, type = node.nodeName.toLowerCase().replace(/^[a-z]+:/,"");
+ var match = (CLASS.match(/(^| )MJX-TeXAtom-([^ ]*)/));
+ if (match) {
+ mml = this.TeXAtom(match[2],match[2] === "OP" && !CLASS.match(/MJX-fixedlimits/));
+ } else if (!(MML[type] && MML[type].isa && MML[type].isa(MML.mbase))) {
+ MathJax.Hub.signal.Post(["MathML Jax - unknown node type",type]);
+ return MML.Error(_("UnknownNodeType","Unknown node type: %1",type));
+ } else {
+ mml = MML[type]();
+ }
+ this.AddAttributes(mml,node); this.CheckClass(mml,mml["class"]);
+ this.AddChildren(mml,node);
+ if (MATHML.config.useMathMLspacing) {mml.useMMLspacing = 0x08}
+ return mml;
+ },
+ TeXAtom: function (mclass,movablelimits) {
+ var mml = MML.TeXAtom().With({texClass:MML.TEXCLASS[mclass]});
+ if (movablelimits) {mml.movesupsub = mml.movablelimits = true}
+ return mml;
+ },
+ CheckClass: function (mml,CLASS) {
+ CLASS = (CLASS||"").split(/ /); var NCLASS = [];
+ for (var i = 0, m = CLASS.length; i < m; i++) {
+ if (CLASS[i].substr(0,4) === "MJX-") {
+ if (CLASS[i] === "MJX-arrow") {
+ // This class was used in former versions of MathJax to attach an
+ // arrow to the updiagonalstrike notation. For backward
+ // compatibility, let's continue to accept this case. See issue 481.
+ if (!mml.notation.match("/"+MML.NOTATION.UPDIAGONALARROW+"/"))
+ mml.notation += " "+MML.NOTATION.UPDIAGONALARROW;
+ } else if (CLASS[i] === "MJX-variant") {
+ mml.variantForm = true;
+ //
+ // Variant forms come from AMSsymbols, and it sets up the
+ // character mappings, so load that if needed.
+ //
+ if (!MathJax.Extension["TeX/AMSsymbols"])
+ {MathJax.Hub.RestartAfter(MathJax.Ajax.Require("[MathJax]/extensions/TeX/AMSsymbols.js"))}
+ } else if (CLASS[i].substr(0,11) !== "MJX-TeXAtom") {
+ mml.mathvariant = CLASS[i].substr(3);
+ //
+ // Caligraphic and oldstyle bold are set up in the boldsymbol
+ // extension, so load it if it isn't already loaded.
+ //
+ if (mml.mathvariant === "-tex-caligraphic-bold" ||
+ mml.mathvariant === "-tex-oldstyle-bold") {
+ if (!MathJax.Extension["TeX/boldsymbol"])
+ {MathJax.Hub.RestartAfter(MathJax.Ajax.Require("[MathJax]/extensions/TeX/boldsymbol.js"))}
+ }
+ }
+ } else {NCLASS.push(CLASS[i])}
+ }
+ if (NCLASS.length) {mml["class"] = NCLASS.join(" ")} else {delete mml["class"]}
+ },
+
+ //
+ // Add the attributes to the mml node
+ //
+ AddAttributes: function (mml,node) {
+ mml.attr = {}; mml.attrNames = [];
+ for (var i = 0, m = node.attributes.length; i < m; i++) {
+ var name = node.attributes[i].name;
+ if (name == "xlink:href") {name = "href"}
+ if (name.match(/:/)) continue;
+ if (name.match(/^_moz-math-((column|row)(align|line)|font-style)$/)) continue;
+ var value = node.attributes[i].value;
+ value = this.filterAttribute(name,value);
+ var defaults = (mml.type === "mstyle" ? MML.math.prototype.defaults : mml.defaults);
+ if (value != null) {
+ var val = value.toLowerCase();
+ if (val === "true" || val === "false") {
+ if (typeof (defaults[name]) === "boolean" || defaults[name] === MML.INHERIT ||
+ mml.type === "math" || mml.type === "mstyle" ||
+ (defaults[name] === MML.AUTO &&
+ (mml.defaultDef == null || typeof(mml.defaultDef[name]) === "boolean"))) {
+ value = (val === "true");
+ }
+ }
+ if (defaults[name] != null || MML.copyAttributes[name])
+ {mml[name] = value} else {mml.attr[name] = value}
+ mml.attrNames.push(name);
+ }
+ }
+ },
+ filterAttribute: function (name,value) {return value}, // safe mode overrides this
+
+ //
+ // Create the children for the mml node
+ //
+ AddChildren: function (mml,node) {
+ for (var i = 0, m = node.childNodes.length; i < m; i++) {
+ var child = node.childNodes[i];
+ if (child.nodeName === "#comment") continue;
+ if (child.nodeName === "#text") {
+ if ((mml.isToken || mml.isChars) && !mml.mmlSelfClosing) {
+ var text = child.nodeValue;
+ if (mml.isToken) {
+ text = text.replace(/&([a-z][a-z0-9]*);/ig,this.replaceEntity);
+ text = this.trimSpace(text);
+ }
+ mml.Append(MML.chars(text));
+ } else if (child.nodeValue.match(/\S/)) {
+ MATHML.Error(["UnexpectedTextNode",
+ "Unexpected text node: %1","'"+child.nodeValue+"'"]);
+ }
+ } else if (mml.type === "annotation-xml") {
+ mml.Append(MML.xml(child));
+ } else {
+ var cmml = this.MakeMML(child); mml.Append(cmml);
+ if (cmml.mmlSelfClosing && cmml.data.length)
+ {mml.Append.apply(mml,cmml.data); cmml.data = []}
+ }
+ }
+ if (mml.type === "mrow" && mml.data.length >= 2) {
+ var first = mml.data[0], last = mml.data[mml.data.length-1];
+ if (first.type === "mo" && first.Get("fence") &&
+ last.type === "mo" && last.Get("fence")) {
+ if (first.data[0]) {mml.open = first.data.join("")}
+ if (last.data[0]) {mml.close = last.data.join("")}
+ }
+ }
+ },
+
+ //
+ // Clean Up the <math> source to prepare for XML parsing
+ //
+ preProcessMath: function (math) {
+ if (math.match(/^<[a-z]+:/i) && !math.match(/^<[^<>]* xmlns:/)) {
+ math = math.replace(/^<([a-z]+)(:math)/i,'<$1$2 xmlns:$1="http://www.w3.org/1998/Math/MathML"')
+ }
+ // HTML5 removes xmlns: namespaces, so put them back for XML
+ var match = math.match(/^(<math( ('.*?'|".*?"|[^>])+)>)/i);
+ if (match && match[2].match(/ (?!xmlns=)[a-z]+=\"http:/i)) {
+ math = match[1].replace(/ (?!xmlns=)([a-z]+=(['"])http:.*?\2)/ig," xmlns:$1 $1") +
+ math.substr(match[0].length);
+ }
+ if (math.match(/^<math[ >]/i) && !math.match(/^<[^<>]* xmlns=/)) {
+ // append the MathML namespace
+ math = math.replace(/^<(math)/i,'<math xmlns="http://www.w3.org/1998/Math/MathML"')
+ }
+ math = math.replace(/^\s*(?:\/\/)?<!(--)?\[CDATA\[((.|\n)*)(\/\/)?\]\]\1>\s*$/,"$2");
+ return math.replace(/&([a-z][a-z0-9]*);/ig,this.replaceEntity);
+ },
+
+ //
+ // Remove attribute whitespace
+ //
+ trimSpace: function (string) {
+ return string.replace(/[\t\n\r]/g," ") // whitespace to spaces
+ .replace(/^ +/,"") // initial whitespace
+ .replace(/ +$/,"") // trailing whitespace
+ .replace(/ +/g," "); // internal multiple whitespace
+ },
+
+ //
+ // Replace a named entity by its value
+ // (look up from external files if necessary)
+ //
+ replaceEntity: function (match,entity) {
+ if (entity.match(/^(lt|amp|quot)$/)) {return match} // these mess up attribute parsing
+ if (MATHML.Parse.Entity[entity]) {return MATHML.Parse.Entity[entity]}
+ var file = entity.charAt(0).toLowerCase();
+ var font = entity.match(/^[a-zA-Z](fr|scr|opf)$/);
+ if (font) {file = font[1]}
+ if (!MATHML.Parse.loaded[file]) {
+ MATHML.Parse.loaded[file] = true;
+ MathJax.Hub.RestartAfter(MathJax.Ajax.Require(MATHML.entityDir+"/"+file+".js"));
+ }
+ return match;
+ }
+ }, {
+ loaded: [] // the entity files that are loaded
+ });
+
+ /************************************************************************/
+
+ MATHML.Augment({
+ sourceMenuTitle: /*_(MathMenu)*/ ["OriginalMathML","Original MathML"],
+
+ prefilterHooks: MathJax.Callback.Hooks(true), // hooks to run on MathML string before processing MathML
+ DOMfilterHooks: MathJax.Callback.Hooks(true), // hooks to run on MathML DOM before processing
+ postfilterHooks: MathJax.Callback.Hooks(true), // hooks to run on internal jax format after processing MathML
+
+ Translate: function (script) {
+ if (!this.ParseXML) {this.ParseXML = this.createParser()}
+ var mml, math, data = {script:script};
+ if (script.firstChild &&
+ script.firstChild.nodeName.toLowerCase().replace(/^[a-z]+:/,"") === "math") {
+ data.math = script.firstChild;
+ } else {
+ math = MathJax.HTML.getScript(script);
+ if (BROWSER.isMSIE) {math = math.replace(/(&nbsp;)+$/,"")}
+ data.math = math;
+ }
+ var callback = this.prefilterHooks.Execute(data); if (callback) return callback;
+ math = data.math;
+ try {
+ mml = MATHML.Parse(math,script).mml;
+ } catch(err) {
+ if (!err.mathmlError) {throw err}
+ mml = this.formatError(err,math,script);
+ }
+ data.math = MML(mml);
+ return this.postfilterHooks.Execute(data) || data.math;
+ },
+ prefilterMath: function (math,script) {return math},
+ prefilterMathML: function (math,script) {return math},
+ formatError: function (err,math,script) {
+ var message = err.message.replace(/\n.*/,"");
+ MathJax.Hub.signal.Post(["MathML Jax - parse error",message,math,script]);
+ return MML.Error(message);
+ },
+ Error: function (message) {
+ //
+ // Translate message if it is ["id","message",args]
+ //
+ if (MathJax.Object.isArray(message)) {message = _.apply(_,message)}
+ throw MathJax.Hub.Insert(Error(message),{mathmlError: true});
+ },
+ //
+ // Parsers for various forms (DOMParser, Windows ActiveX object, other)
+ //
+ parseDOM: function (string) {return this.parser.parseFromString(string,"text/xml")},
+ parseMS: function (string) {return (this.parser.loadXML(string) ? this.parser : null)},
+ parseDIV: function (string) {
+ this.div.innerHTML =
+ "<div>"+string.replace(/<([a-z]+)([^>]*)\/>/g,"<$1$2></$1>")+"</div>";
+ var doc = this.div.firstChild;
+ this.div.innerHTML = "";
+ return doc;
+ },
+ parseError: function (string) {return null},
+ createMSParser: function() {
+ var parser = null;
+ var xml = ["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.5.0",
+ "MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0",
+ "MSXML2.DOMDocument.2.0","Microsoft.XMLDOM"];
+ for (var i = 0, m = xml.length; i < m && !parser; i++) {
+ try {
+ parser = new ActiveXObject(xml[i])
+ } catch (err) {}
+ }
+ return parser;
+ },
+ //
+ // Create the parser using a DOMParser, or other fallback method
+ //
+ createParser: function () {
+ if (window.DOMParser) {
+ this.parser = new DOMParser();
+ return(this.parseDOM);
+ } else if (window.ActiveXObject) {
+ this.parser = this.createMSParser();
+ if (!this.parser) {
+ MathJax.Localization.Try(this.parserCreationError);
+ return(this.parseError);
+ }
+ this.parser.async = false;
+ return(this.parseMS);
+ }
+ this.div = MathJax.Hub.Insert(document.createElement("div"),{
+ style:{visibility:"hidden", overflow:"hidden", height:"1px",
+ position:"absolute", top:0}
+ });
+ if (!document.body.firstChild) {document.body.appendChild(this.div)}
+ else {document.body.insertBefore(this.div,document.body.firstChild)}
+ return(this.parseDIV);
+ },
+ parserCreationError: function () {
+ alert(_("CantCreateXMLParser",
+ "MathJax can't create an XML parser for MathML. Check that\n"+
+ "the 'Script ActiveX controls marked safe for scripting' security\n"+
+ "setting is enabled (use the Internet Options item in the Tools\n"+
+ "menu, and select the Security panel, then press the Custom Level\n"+
+ "button to check this).\n\n"+
+ "MathML equations will not be able to be processed by MathJax."));
+ },
+ //
+ // Initialize the parser object (whichever type is used)
+ //
+ Startup: function () {
+ MML = MathJax.ElementJax.mml;
+ MML.mspace.Augment({mmlSelfClosing: true});
+ MML.none.Augment({mmlSelfClosing: true});
+ MML.mprescripts.Augment({mmlSelfClosing:true});
+ MML.maligngroup.Augment({mmlSelfClosing:true});
+ MML.malignmark.Augment({mmlSelfClosing:true});
+ }
+ });
+
+ //
+ // Add the default pre-filter (for backward compatibility)
+ //
+ MATHML.prefilterHooks.Add(function (data) {
+ data.math = (typeof(data.math) === "string" ?
+ MATHML.prefilterMath(data.math,data.script) :
+ MATHML.prefilterMathML(data.math,data.script));
+ });
+
+ MATHML.Parse.Entity = {
+ ApplyFunction: '\u2061',
+ Backslash: '\u2216',
+ Because: '\u2235',
+ Breve: '\u02D8',
+ Cap: '\u22D2',
+ CenterDot: '\u00B7',
+ CircleDot: '\u2299',
+ CircleMinus: '\u2296',
+ CirclePlus: '\u2295',
+ CircleTimes: '\u2297',
+ Congruent: '\u2261',
+ ContourIntegral: '\u222E',
+ Coproduct: '\u2210',
+ Cross: '\u2A2F',
+ Cup: '\u22D3',
+ CupCap: '\u224D',
+ Dagger: '\u2021',
+ Del: '\u2207',
+ Delta: '\u0394',
+ Diamond: '\u22C4',
+ DifferentialD: '\u2146',
+ DotEqual: '\u2250',
+ DoubleDot: '\u00A8',
+ DoubleRightTee: '\u22A8',
+ DoubleVerticalBar: '\u2225',
+ DownArrow: '\u2193',
+ DownLeftVector: '\u21BD',
+ DownRightVector: '\u21C1',
+ DownTee: '\u22A4',
+ Downarrow: '\u21D3',
+ Element: '\u2208',
+ EqualTilde: '\u2242',
+ Equilibrium: '\u21CC',
+ Exists: '\u2203',
+ ExponentialE: '\u2147',
+ FilledVerySmallSquare: '\u25AA',
+ ForAll: '\u2200',
+ Gamma: '\u0393',
+ Gg: '\u22D9',
+ GreaterEqual: '\u2265',
+ GreaterEqualLess: '\u22DB',
+ GreaterFullEqual: '\u2267',
+ GreaterLess: '\u2277',
+ GreaterSlantEqual: '\u2A7E',
+ GreaterTilde: '\u2273',
+ Hacek: '\u02C7',
+ Hat: '\u005E',
+ HumpDownHump: '\u224E',
+ HumpEqual: '\u224F',
+ Im: '\u2111',
+ ImaginaryI: '\u2148',
+ Integral: '\u222B',
+ Intersection: '\u22C2',
+ InvisibleComma: '\u2063',
+ InvisibleTimes: '\u2062',
+ Lambda: '\u039B',
+ Larr: '\u219E',
+ LeftAngleBracket: '\u27E8',
+ LeftArrow: '\u2190',
+ LeftArrowRightArrow: '\u21C6',
+ LeftCeiling: '\u2308',
+ LeftDownVector: '\u21C3',
+ LeftFloor: '\u230A',
+ LeftRightArrow: '\u2194',
+ LeftTee: '\u22A3',
+ LeftTriangle: '\u22B2',
+ LeftTriangleEqual: '\u22B4',
+ LeftUpVector: '\u21BF',
+ LeftVector: '\u21BC',
+ Leftarrow: '\u21D0',
+ Leftrightarrow: '\u21D4',
+ LessEqualGreater: '\u22DA',
+ LessFullEqual: '\u2266',
+ LessGreater: '\u2276',
+ LessSlantEqual: '\u2A7D',
+ LessTilde: '\u2272',
+ Ll: '\u22D8',
+ Lleftarrow: '\u21DA',
+ LongLeftArrow: '\u27F5',
+ LongLeftRightArrow: '\u27F7',
+ LongRightArrow: '\u27F6',
+ Longleftarrow: '\u27F8',
+ Longleftrightarrow: '\u27FA',
+ Longrightarrow: '\u27F9',
+ Lsh: '\u21B0',
+ MinusPlus: '\u2213',
+ NestedGreaterGreater: '\u226B',
+ NestedLessLess: '\u226A',
+ NotDoubleVerticalBar: '\u2226',
+ NotElement: '\u2209',
+ NotEqual: '\u2260',
+ NotExists: '\u2204',
+ NotGreater: '\u226F',
+ NotGreaterEqual: '\u2271',
+ NotLeftTriangle: '\u22EA',
+ NotLeftTriangleEqual: '\u22EC',
+ NotLess: '\u226E',
+ NotLessEqual: '\u2270',
+ NotPrecedes: '\u2280',
+ NotPrecedesSlantEqual: '\u22E0',
+ NotRightTriangle: '\u22EB',
+ NotRightTriangleEqual: '\u22ED',
+ NotSubsetEqual: '\u2288',
+ NotSucceeds: '\u2281',
+ NotSucceedsSlantEqual: '\u22E1',
+ NotSupersetEqual: '\u2289',
+ NotTilde: '\u2241',
+ NotVerticalBar: '\u2224',
+ Omega: '\u03A9',
+ OverBar: '\u203E',
+ OverBrace: '\u23DE',
+ PartialD: '\u2202',
+ Phi: '\u03A6',
+ Pi: '\u03A0',
+ PlusMinus: '\u00B1',
+ Precedes: '\u227A',
+ PrecedesEqual: '\u2AAF',
+ PrecedesSlantEqual: '\u227C',
+ PrecedesTilde: '\u227E',
+ Product: '\u220F',
+ Proportional: '\u221D',
+ Psi: '\u03A8',
+ Rarr: '\u21A0',
+ Re: '\u211C',
+ ReverseEquilibrium: '\u21CB',
+ RightAngleBracket: '\u27E9',
+ RightArrow: '\u2192',
+ RightArrowLeftArrow: '\u21C4',
+ RightCeiling: '\u2309',
+ RightDownVector: '\u21C2',
+ RightFloor: '\u230B',
+ RightTee: '\u22A2',
+ RightTeeArrow: '\u21A6',
+ RightTriangle: '\u22B3',
+ RightTriangleEqual: '\u22B5',
+ RightUpVector: '\u21BE',
+ RightVector: '\u21C0',
+ Rightarrow: '\u21D2',
+ Rrightarrow: '\u21DB',
+ Rsh: '\u21B1',
+ Sigma: '\u03A3',
+ SmallCircle: '\u2218',
+ Sqrt: '\u221A',
+ Square: '\u25A1',
+ SquareIntersection: '\u2293',
+ SquareSubset: '\u228F',
+ SquareSubsetEqual: '\u2291',
+ SquareSuperset: '\u2290',
+ SquareSupersetEqual: '\u2292',
+ SquareUnion: '\u2294',
+ Star: '\u22C6',
+ Subset: '\u22D0',
+ SubsetEqual: '\u2286',
+ Succeeds: '\u227B',
+ SucceedsEqual: '\u2AB0',
+ SucceedsSlantEqual: '\u227D',
+ SucceedsTilde: '\u227F',
+ SuchThat: '\u220B',
+ Sum: '\u2211',
+ Superset: '\u2283',
+ SupersetEqual: '\u2287',
+ Supset: '\u22D1',
+ Therefore: '\u2234',
+ Theta: '\u0398',
+ Tilde: '\u223C',
+ TildeEqual: '\u2243',
+ TildeFullEqual: '\u2245',
+ TildeTilde: '\u2248',
+ UnderBar: '\u005F',
+ UnderBrace: '\u23DF',
+ Union: '\u22C3',
+ UnionPlus: '\u228E',
+ UpArrow: '\u2191',
+ UpDownArrow: '\u2195',
+ UpTee: '\u22A5',
+ Uparrow: '\u21D1',
+ Updownarrow: '\u21D5',
+ Upsilon: '\u03A5',
+ Vdash: '\u22A9',
+ Vee: '\u22C1',
+ VerticalBar: '\u2223',
+ VerticalTilde: '\u2240',
+ Vvdash: '\u22AA',
+ Wedge: '\u22C0',
+ Xi: '\u039E',
+ acute: '\u00B4',
+ aleph: '\u2135',
+ alpha: '\u03B1',
+ amalg: '\u2A3F',
+ and: '\u2227',
+ ang: '\u2220',
+ angmsd: '\u2221',
+ angsph: '\u2222',
+ ape: '\u224A',
+ backprime: '\u2035',
+ backsim: '\u223D',
+ backsimeq: '\u22CD',
+ beta: '\u03B2',
+ beth: '\u2136',
+ between: '\u226C',
+ bigcirc: '\u25EF',
+ bigodot: '\u2A00',
+ bigoplus: '\u2A01',
+ bigotimes: '\u2A02',
+ bigsqcup: '\u2A06',
+ bigstar: '\u2605',
+ bigtriangledown: '\u25BD',
+ bigtriangleup: '\u25B3',
+ biguplus: '\u2A04',
+ blacklozenge: '\u29EB',
+ blacktriangle: '\u25B4',
+ blacktriangledown: '\u25BE',
+ blacktriangleleft: '\u25C2',
+ bowtie: '\u22C8',
+ boxdl: '\u2510',
+ boxdr: '\u250C',
+ boxminus: '\u229F',
+ boxplus: '\u229E',
+ boxtimes: '\u22A0',
+ boxul: '\u2518',
+ boxur: '\u2514',
+ bsol: '\u005C',
+ bull: '\u2022',
+ cap: '\u2229',
+ check: '\u2713',
+ chi: '\u03C7',
+ circ: '\u02C6',
+ circeq: '\u2257',
+ circlearrowleft: '\u21BA',
+ circlearrowright: '\u21BB',
+ circledR: '\u00AE',
+ circledS: '\u24C8',
+ circledast: '\u229B',
+ circledcirc: '\u229A',
+ circleddash: '\u229D',
+ clubs: '\u2663',
+ colon: '\u003A',
+ comp: '\u2201',
+ ctdot: '\u22EF',
+ cuepr: '\u22DE',
+ cuesc: '\u22DF',
+ cularr: '\u21B6',
+ cup: '\u222A',
+ curarr: '\u21B7',
+ curlyvee: '\u22CE',
+ curlywedge: '\u22CF',
+ dagger: '\u2020',
+ daleth: '\u2138',
+ ddarr: '\u21CA',
+ deg: '\u00B0',
+ delta: '\u03B4',
+ digamma: '\u03DD',
+ div: '\u00F7',
+ divideontimes: '\u22C7',
+ dot: '\u02D9',
+ doteqdot: '\u2251',
+ dotplus: '\u2214',
+ dotsquare: '\u22A1',
+ dtdot: '\u22F1',
+ ecir: '\u2256',
+ efDot: '\u2252',
+ egs: '\u2A96',
+ ell: '\u2113',
+ els: '\u2A95',
+ empty: '\u2205',
+ epsi: '\u03B5',
+ epsiv: '\u03F5',
+ erDot: '\u2253',
+ eta: '\u03B7',
+ eth: '\u00F0',
+ flat: '\u266D',
+ fork: '\u22D4',
+ frown: '\u2322',
+ gEl: '\u2A8C',
+ gamma: '\u03B3',
+ gap: '\u2A86',
+ gimel: '\u2137',
+ gnE: '\u2269',
+ gnap: '\u2A8A',
+ gne: '\u2A88',
+ gnsim: '\u22E7',
+ gt: '\u003E',
+ gtdot: '\u22D7',
+ harrw: '\u21AD',
+ hbar: '\u210F',
+ hellip: '\u2026',
+ hookleftarrow: '\u21A9',
+ hookrightarrow: '\u21AA',
+ imath: '\u0131',
+ infin: '\u221E',
+ intcal: '\u22BA',
+ iota: '\u03B9',
+ jmath: '\u0237',
+ kappa: '\u03BA',
+ kappav: '\u03F0',
+ lEg: '\u2A8B',
+ lambda: '\u03BB',
+ lap: '\u2A85',
+ larrlp: '\u21AB',
+ larrtl: '\u21A2',
+ lbrace: '\u007B',
+ lbrack: '\u005B',
+ le: '\u2264',
+ leftleftarrows: '\u21C7',
+ leftthreetimes: '\u22CB',
+ lessdot: '\u22D6',
+ lmoust: '\u23B0',
+ lnE: '\u2268',
+ lnap: '\u2A89',
+ lne: '\u2A87',
+ lnsim: '\u22E6',
+ longmapsto: '\u27FC',
+ looparrowright: '\u21AC',
+ lowast: '\u2217',
+ loz: '\u25CA',
+ lt: '\u003C',
+ ltimes: '\u22C9',
+ ltri: '\u25C3',
+ macr: '\u00AF',
+ malt: '\u2720',
+ mho: '\u2127',
+ mu: '\u03BC',
+ multimap: '\u22B8',
+ nLeftarrow: '\u21CD',
+ nLeftrightarrow: '\u21CE',
+ nRightarrow: '\u21CF',
+ nVDash: '\u22AF',
+ nVdash: '\u22AE',
+ natur: '\u266E',
+ nearr: '\u2197',
+ nharr: '\u21AE',
+ nlarr: '\u219A',
+ not: '\u00AC',
+ nrarr: '\u219B',
+ nu: '\u03BD',
+ nvDash: '\u22AD',
+ nvdash: '\u22AC',
+ nwarr: '\u2196',
+ omega: '\u03C9',
+ omicron: '\u03BF',
+ or: '\u2228',
+ osol: '\u2298',
+ period: '\u002E',
+ phi: '\u03C6',
+ phiv: '\u03D5',
+ pi: '\u03C0',
+ piv: '\u03D6',
+ prap: '\u2AB7',
+ precnapprox: '\u2AB9',
+ precneqq: '\u2AB5',
+ precnsim: '\u22E8',
+ prime: '\u2032',
+ psi: '\u03C8',
+ rarrtl: '\u21A3',
+ rbrace: '\u007D',
+ rbrack: '\u005D',
+ rho: '\u03C1',
+ rhov: '\u03F1',
+ rightrightarrows: '\u21C9',
+ rightthreetimes: '\u22CC',
+ ring: '\u02DA',
+ rmoust: '\u23B1',
+ rtimes: '\u22CA',
+ rtri: '\u25B9',
+ scap: '\u2AB8',
+ scnE: '\u2AB6',
+ scnap: '\u2ABA',
+ scnsim: '\u22E9',
+ sdot: '\u22C5',
+ searr: '\u2198',
+ sect: '\u00A7',
+ sharp: '\u266F',
+ sigma: '\u03C3',
+ sigmav: '\u03C2',
+ simne: '\u2246',
+ smile: '\u2323',
+ spades: '\u2660',
+ sub: '\u2282',
+ subE: '\u2AC5',
+ subnE: '\u2ACB',
+ subne: '\u228A',
+ supE: '\u2AC6',
+ supnE: '\u2ACC',
+ supne: '\u228B',
+ swarr: '\u2199',
+ tau: '\u03C4',
+ theta: '\u03B8',
+ thetav: '\u03D1',
+ tilde: '\u02DC',
+ times: '\u00D7',
+ triangle: '\u25B5',
+ triangleq: '\u225C',
+ upsi: '\u03C5',
+ upuparrows: '\u21C8',
+ veebar: '\u22BB',
+ vellip: '\u22EE',
+ weierp: '\u2118',
+ xi: '\u03BE',
+ yen: '\u00A5',
+ zeta: '\u03B6',
+ zigrarr: '\u21DD'
+ };
+
+ MATHML.loadComplete("jax.js");
+
+})(MathJax.InputJax.MathML,MathJax.Hub.Browser);
+// @license-end
diff --git a/js/mathjax/jax/input/TeX/config.js b/js/mathjax/jax/input/TeX/config.js
new file mode 100644
index 0000000..76e751f
--- /dev/null
+++ b/js/mathjax/jax/input/TeX/config.js
@@ -0,0 +1,56 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+
+/*************************************************************
+ *
+ * MathJax/jax/input/TeX/config.js
+ *
+ * Initializes the TeX InputJax (the main definition is in
+ * MathJax/jax/input/TeX/jax.js, which is loaded when needed).
+ *
+ * ---------------------------------------------------------------------
+ *
+ * Copyright (c) 2009-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+MathJax.InputJax.TeX = MathJax.InputJax({
+ id: "TeX",
+ version: "2.7.9",
+ directory: MathJax.InputJax.directory + "/TeX",
+ extensionDir: MathJax.InputJax.extensionDir + "/TeX",
+
+ config: {
+ TagSide: "right",
+ TagIndent: "0.8em",
+ MultLineWidth: "85%",
+
+ equationNumbers: {
+ autoNumber: "none", // "AMS" for standard AMS numbering,
+ // or "all" for all displayed equations
+ formatNumber: function (n) {return n},
+ formatTag: function (n) {return '('+n+')'},
+ formatID: function (n) {return 'mjx-eqn-'+String(n).replace(/\s/g,"_")},
+ formatURL: function (id,base) {return base+'#'+encodeURIComponent(id)},
+ useLabelIds: true
+ }
+ },
+
+ resetEquationNumbers: function () {} // filled in by AMSmath extension
+});
+MathJax.InputJax.TeX.Register("math/tex");
+
+MathJax.InputJax.TeX.loadComplete("config.js");
+// @license-end
diff --git a/js/mathjax/jax/input/TeX/jax.js b/js/mathjax/jax/input/TeX/jax.js
new file mode 100644
index 0000000..9c36d31
--- /dev/null
+++ b/js/mathjax/jax/input/TeX/jax.js
@@ -0,0 +1,2373 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+
+/*************************************************************
+ *
+ * MathJax/jax/input/TeX/jax.js
+ *
+ * Implements the TeX InputJax that reads mathematics in
+ * TeX and LaTeX format and converts it to the MML ElementJax
+ * internal format.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * Copyright (c) 2009-2020 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function (TEX,HUB,AJAX) {
+ var MML, NBSP = "\u00A0";
+
+ var _ = function (id) {
+ return MathJax.Localization._.apply(MathJax.Localization,
+ [["TeX", id]].concat([].slice.call(arguments,1)));
+ };
+
+ var isArray = MathJax.Object.isArray;
+
+ var STACK = MathJax.Object.Subclass({
+ Init: function (env,inner) {
+ this.global = {isInner: inner};
+ this.data = [STACKITEM.start(this.global)];
+ if (env) {this.data[0].env = env}
+ this.env = this.data[0].env;
+ },
+ Push: function () {
+ var i, m, item, top;
+ for (i = 0, m = arguments.length; i < m; i++) {
+ item = arguments[i]; if (!item) continue;
+ if (item instanceof MML.mbase) {item = STACKITEM.mml(item)}
+ item.global = this.global;
+ top = (this.data.length ? this.Top().checkItem(item) : true);
+ if (top instanceof Array) {this.Pop(); this.Push.apply(this,top)}
+ else if (top instanceof STACKITEM) {this.Pop(); this.Push(top)}
+ else if (top) {
+ this.data.push(item);
+ if (item.env) {
+ if (item.copyEnv !== false) {
+ for (var id in this.env)
+ {if (this.env.hasOwnProperty(id)) {item.env[id] = this.env[id]}}
+ }
+ this.env = item.env;
+ } else {item.env = this.env}
+ }
+ }
+ },
+ Pop: function () {
+ var item = this.data.pop(); if (!item.isOpen) {delete item.env}
+ this.env = (this.data.length ? this.Top().env : {});
+ return item;
+ },
+ Top: function (n) {
+ if (n == null) {n = 1}
+ if (this.data.length < n) {return null}
+ return this.data[this.data.length-n];
+ },
+ Prev: function (noPop) {
+ var top = this.Top();
+ if (noPop) {return top.data[top.data.length-1]}
+ else {return top.Pop()}
+ },
+ toString: function () {return "stack[\n "+this.data.join("\n ")+"\n]"}
+ });
+
+ var STACKITEM = STACK.Item = MathJax.Object.Subclass({
+ type: "base",
+ endError: /*_()*/ ["ExtraOpenMissingClose","Extra open brace or missing close brace"],
+ closeError: /*_()*/ ["ExtraCloseMissingOpen","Extra close brace or missing open brace"],
+ rightError: /*_()*/ ["MissingLeftExtraRight","Missing \\left or extra \\right"],
+ Init: function () {
+ if (this.isOpen) {this.env = {}}
+ this.data = [];
+ this.Push.apply(this,arguments);
+ },
+ Push: function () {this.data.push.apply(this.data,arguments)},
+ Pop: function () {return this.data.pop()},
+ mmlData: function (inferred,forceRow) {
+ if (inferred == null) {inferred = true}
+ if (this.data.length === 1 && !forceRow) {return this.data[0]}
+ return MML.mrow.apply(MML,this.data).With((inferred ? {inferred: true}: {}));
+ },
+ checkItem: function (item) {
+ if (item.type === "over" && this.isOpen) {item.num = this.mmlData(false); this.data = []}
+ if (item.type === "cell" && this.isOpen) {
+ if (item.linebreak) {return false}
+ TEX.Error(["Misplaced","Misplaced %1",item.name]);
+ }
+ if (item.isClose && this[item.type+"Error"]) {TEX.Error(this[item.type+"Error"])}
+ if (!item.isNotStack) {return true}
+ this.Push(item.data[0]); return false;
+ },
+ With: function (def) {
+ for (var id in def) {if (def.hasOwnProperty(id)) {this[id] = def[id]}}
+ return this;
+ },
+ toString: function () {return this.type+"["+this.data.join("; ")+"]"}
+ });
+
+ STACKITEM.start = STACKITEM.Subclass({
+ type: "start", isOpen: true,
+ Init: function (global) {
+ this.SUPER(arguments).Init.call(this);
+ this.global = global;
+ },
+ checkItem: function (item) {
+ if (item.type === "stop") {return STACKITEM.mml(this.mmlData())}
+ return this.SUPER(arguments).checkItem.call(this,item);
+ }
+ });
+
+ STACKITEM.stop = STACKITEM.Subclass({
+ type: "stop", isClose: true
+ });
+
+ STACKITEM.open = STACKITEM.Subclass({
+ type: "open", isOpen: true,
+ stopError: /*_()*/ ["ExtraOpenMissingClose","Extra open brace or missing close brace"],
+ checkItem: function (item) {
+ if (item.type === "close") {
+ var mml = this.mmlData();
+ return STACKITEM.mml(MML.TeXAtom(mml)); // TeXAtom make it an ORD to prevent spacing (FIXME: should be another way)
+ }
+ return this.SUPER(arguments).checkItem.call(this,item);
+ }
+ });
+
+ STACKITEM.close = STACKITEM.Subclass({
+ type: "close", isClose: true
+ });
+
+ STACKITEM.prime = STACKITEM.Subclass({
+ type: "prime",
+ checkItem: function (item) {
+ if (this.data[0].type !== "msubsup")
+ {return [MML.msup(this.data[0],this.data[1]),item]}
+ this.data[0].SetData(this.data[0].sup,this.data[1]);
+ return [this.data[0],item];
+ }
+ });
+
+ STACKITEM.subsup = STACKITEM.Subclass({
+ type: "subsup",
+ stopError: /*_()*/ ["MissingScript","Missing superscript or subscript argument"],
+ supError: /*_()*/ ["MissingOpenForSup","Missing open brace for superscript"],
+ subError: /*_()*/ ["MissingOpenForSub","Missing open brace for subscript"],
+ checkItem: function (item) {
+ if (item.type === "open" || item.type === "left") {return true}
+ if (item.type === "mml") {
+ if (this.primes) {
+ if (this.position !== 2) {this.data[0].SetData(2,this.primes)}
+ else {item.data[0] = MML.mrow(this.primes.With({variantForm:true}),item.data[0])}
+ }
+ this.data[0].SetData(this.position,item.data[0]);
+ if (this.movesupsub != null) {this.data[0].movesupsub = this.movesupsub}
+ return STACKITEM.mml(this.data[0]);
+ }
+ if (this.SUPER(arguments).checkItem.call(this,item))
+ {TEX.Error(this[["","subError","supError"][this.position]])}
+ },
+ Pop: function () {}
+ });
+
+ STACKITEM.over = STACKITEM.Subclass({
+ type: "over", isClose: true, name: "\\over",
+ checkItem: function (item,stack) {
+ if (item.type === "over")
+ {TEX.Error(["AmbiguousUseOf","Ambiguous use of %1",item.name])}
+ if (item.isClose) {
+ var mml = MML.mfrac(this.num,this.mmlData(false));
+ if (this.thickness != null) {mml.linethickness = this.thickness}
+ if (this.open || this.close) {
+ mml.texWithDelims = true;
+ mml = TEX.fixedFence(this.open,mml,this.close);
+ }
+ return [STACKITEM.mml(mml), item];
+ }
+ return this.SUPER(arguments).checkItem.call(this,item);
+ },
+ toString: function () {return "over["+this.num+" / "+this.data.join("; ")+"]"}
+ });
+
+ STACKITEM.left = STACKITEM.Subclass({
+ type: "left", isOpen: true, delim: '(',
+ stopError: /*_()*/ ["ExtraLeftMissingRight", "Extra \\left or missing \\right"],
+ checkItem: function (item) {
+ if (item.type === "right")
+ {return STACKITEM.mml(TEX.fenced(this.delim,this.mmlData(),item.delim))}
+ return this.SUPER(arguments).checkItem.call(this,item);
+ }
+ });
+
+ STACKITEM.right = STACKITEM.Subclass({
+ type: "right", isClose: true, delim: ')'
+ });
+
+ STACKITEM.begin = STACKITEM.Subclass({
+ type: "begin", isOpen: true,
+ checkItem: function (item) {
+ if (item.type === "end") {
+ if (item.name !== this.name)
+ {TEX.Error(["EnvBadEnd","\\begin{%1} ended with \\end{%2}",this.name,item.name])}
+ if (!this.end) {return STACKITEM.mml(this.mmlData())}
+ return this.parse[this.end].call(this.parse,this,this.data);
+ }
+ if (item.type === "stop")
+ {TEX.Error(["EnvMissingEnd","Missing \\end{%1}",this.name])}
+ return this.SUPER(arguments).checkItem.call(this,item);
+ }
+ });
+
+ STACKITEM.end = STACKITEM.Subclass({
+ type: "end", isClose: true
+ });
+
+ STACKITEM.style = STACKITEM.Subclass({
+ type: "style",
+ checkItem: function (item) {
+ if (!item.isClose) {return this.SUPER(arguments).checkItem.call(this,item)}
+ var mml = MML.mstyle.apply(MML,this.data).With(this.styles);
+ return [STACKITEM.mml(mml),item];
+ }
+ });
+
+ STACKITEM.position = STACKITEM.Subclass({
+ type: "position",
+ checkItem: function (item) {
+ if (item.isClose) {TEX.Error(["MissingBoxFor","Missing box for %1",this.name])}
+ if (item.isNotStack) {
+ var mml = item.mmlData();
+ switch (this.move) {
+ case 'vertical':
+ mml = MML.mpadded(mml).With({height: this.dh, depth: this.dd, voffset: this.dh});
+ return [STACKITEM.mml(mml)];
+ case 'horizontal':
+ return [STACKITEM.mml(this.left),item,STACKITEM.mml(this.right)];
+ }
+ }
+ return this.SUPER(arguments).checkItem.call(this,item);
+ }
+ });
+
+ STACKITEM.array = STACKITEM.Subclass({
+ type: "array", isOpen: true, copyEnv: false, arraydef: {},
+ Init: function () {
+ this.table = []; this.row = []; this.frame = []; this.hfill = [];
+ this.SUPER(arguments).Init.apply(this,arguments);
+ },
+ checkItem: function (item) {
+ if (item.isClose && item.type !== "over") {
+ if (item.isEntry) {this.EndEntry(); this.clearEnv(); return false}
+ if (item.isCR) {this.EndEntry(); this.EndRow(); this.clearEnv(); return false}
+ this.EndTable(); this.clearEnv();
+ var scriptlevel = this.arraydef.scriptlevel; delete this.arraydef.scriptlevel;
+ var mml = MML.mtable.apply(MML,this.table).With(this.arraydef);
+ if (this.frame.length === 4) {
+ mml.frame = (this.frame.dashed ? "dashed" : "solid");
+ } else if (this.frame.length) {
+ mml.hasFrame = true;
+ if (this.arraydef.rowlines) {this.arraydef.rowlines = this.arraydef.rowlines.replace(/none( none)+$/,"none")}
+ mml = MML.menclose(mml).With({notation: this.frame.join(" "), isFrame: true});
+ if ((this.arraydef.columnlines||"none") != "none" ||
+ (this.arraydef.rowlines||"none") != "none") {mml.padding = 0} // HTML-CSS jax implements this
+ }
+ if (scriptlevel) {mml = MML.mstyle(mml).With({scriptlevel: scriptlevel})}
+ if (this.open || this.close) {mml = TEX.fenced(this.open,mml,this.close)}
+ mml = STACKITEM.mml(mml);
+ if (this.requireClose) {
+ if (item.type === 'close') {return mml}
+ TEX.Error(["MissingCloseBrace","Missing close brace"]);
+ }
+ return [mml,item];
+ }
+ return this.SUPER(arguments).checkItem.call(this,item);
+ },
+ EndEntry: function () {
+ var mtd = MML.mtd.apply(MML,this.data);
+ if (this.hfill.length) {
+ if (this.hfill[0] === 0) mtd.columnalign = "right";
+ if (this.hfill[this.hfill.length-1] === this.data.length)
+ mtd.columnalign = (mtd.columnalign ? "center" : "left");
+ }
+ this.row.push(mtd); this.data = []; this.hfill = [];
+ },
+ EndRow: function () {
+ var mtr = MML.mtr;
+ if (this.isNumbered && this.row.length === 3) {
+ this.row.unshift(this.row.pop()); // move equation number to first position
+ mtr = MML.mlabeledtr;
+ }
+ this.table.push(mtr.apply(MML,this.row)); this.row = [];
+ },
+ EndTable: function () {
+ if (this.data.length || this.row.length) {this.EndEntry(); this.EndRow()}
+ this.checkLines();
+ },
+ checkLines: function () {
+ if (this.arraydef.rowlines) {
+ var lines = this.arraydef.rowlines.split(/ /);
+ if (lines.length === this.table.length) {
+ this.frame.push("bottom"); lines.pop();
+ this.arraydef.rowlines = lines.join(' ');
+ } else if (lines.length < this.table.length-1) {
+ this.arraydef.rowlines += " none";
+ }
+ }
+ if (this.rowspacing) {
+ var rows = this.arraydef.rowspacing.split(/ /);
+ while (rows.length < this.table.length) {rows.push(this.rowspacing+"em")}
+ this.arraydef.rowspacing = rows.join(' ');
+ }
+ },
+ clearEnv: function () {
+ for (var id in this.env) {if (this.env.hasOwnProperty(id)) {delete this.env[id]}}
+ }
+ });
+
+ STACKITEM.cell = STACKITEM.Subclass({
+ type: "cell", isClose: true
+ });
+
+ STACKITEM.mml = STACKITEM.Subclass({
+ type: "mml", isNotStack: true,
+ Add: function () {this.data.push.apply(this.data,arguments); return this}
+ });
+
+ STACKITEM.fn = STACKITEM.Subclass({
+ type: "fn",
+ checkItem: function (item) {
+ if (this.data[0]) {
+ if (item.isOpen) {return true}
+ if (item.type !== "fn") {
+ if (item.type !== "mml" || !item.data[0]) {return [this.data[0],item]}
+ if (item.data[0].isa(MML.mspace)) {return [this.data[0],item]}
+ var mml = item.data[0]; if (mml.isEmbellished()) {mml = mml.CoreMO()}
+ if ([0,0,1,1,0,1,1,0,0,0][mml.Get("texClass")]) {return [this.data[0],item]}
+ }
+ return [this.data[0],MML.mo(MML.entity("#x2061")).With({texClass:MML.TEXCLASS.NONE}),item];
+ }
+ return this.SUPER(arguments).checkItem.apply(this,arguments);
+ }
+ });
+
+ STACKITEM.not = STACKITEM.Subclass({
+ type: "not",
+ checkItem: function (item) {
+ var mml, c;
+ if (item.type === "open" || item.type === "left") {return true}
+ if (item.type === "mml" && item.data[0].type.match(/^(mo|mi|mtext)$/)) {
+ mml = item.data[0], c = mml.data.join("");
+ if (c.length === 1 && !mml.movesupsub && mml.data.length === 1) {
+ c = STACKITEM.not.remap[c.charCodeAt(0)];
+ if (c) {mml.SetData(0,MML.chars(String.fromCharCode(c)))}
+ else {mml.Append(MML.chars("\u0338"))}
+ return item;
+ }
+ }
+ // \mathrel{\rlap{\notChar}}
+ mml = MML.mpadded(MML.mtext("\u29F8")).With({width:0});
+ mml = MML.TeXAtom(mml).With({texClass:MML.TEXCLASS.REL});
+ return [mml,item];
+ }
+ });
+ STACKITEM.not.remap = {
+ 0x2190:0x219A, 0x2192:0x219B, 0x2194:0x21AE,
+ 0x21D0:0x21CD, 0x21D2:0x21CF, 0x21D4:0x21CE,
+ 0x2208:0x2209, 0x220B:0x220C, 0x2223:0x2224, 0x2225:0x2226,
+ 0x223C:0x2241, 0x007E:0x2241, 0x2243:0x2244, 0x2245:0x2247,
+ 0x2248:0x2249, 0x224D:0x226D, 0x003D:0x2260, 0x2261:0x2262,
+ 0x003C:0x226E, 0x003E:0x226F, 0x2264:0x2270, 0x2265:0x2271,
+ 0x2272:0x2274, 0x2273:0x2275, 0x2276:0x2278, 0x2277:0x2279,
+ 0x227A:0x2280, 0x227B:0x2281, 0x2282:0x2284, 0x2283:0x2285,
+ 0x2286:0x2288, 0x2287:0x2289, 0x22A2:0x22AC, 0x22A8:0x22AD,
+ 0x22A9:0x22AE, 0x22AB:0x22AF, 0x227C:0x22E0, 0x227D:0x22E1,
+ 0x2291:0x22E2, 0x2292:0x22E3, 0x22B2:0x22EA, 0x22B3:0x22EB,
+ 0x22B4:0x22EC, 0x22B5:0x22ED, 0x2203:0x2204
+ };
+
+ STACKITEM.dots = STACKITEM.Subclass({
+ type: "dots",
+ checkItem: function (item) {
+ if (item.type === "open" || item.type === "left") {return true}
+ var dots = this.ldots;
+ if (item.type === "mml" && item.data[0].isEmbellished()) {
+ var tclass = item.data[0].CoreMO().Get("texClass");
+ if (tclass === MML.TEXCLASS.BIN || tclass === MML.TEXCLASS.REL) {dots = this.cdots}
+ }
+ return [dots,item];
+ }
+ });
+
+
+ var TEXDEF = {
+ //
+ // Add new definitions without overriding user-defined ones
+ //
+ Add: function (src,dst,nouser) {
+ if (!dst) {dst = this}
+ for (var id in src) {if (src.hasOwnProperty(id)) {
+ if (typeof src[id] === 'object' && !isArray(src[id]) &&
+ (typeof dst[id] === 'object' || typeof dst[id] === 'function'))
+ {this.Add(src[id],dst[id],src[id],nouser)}
+ else if (!dst[id] || !dst[id].isUser || !nouser) {dst[id] = src[id]}
+ }}
+ return dst;
+ }
+ };
+ var STARTUP = function () {
+ MML = MathJax.ElementJax.mml;
+ HUB.Insert(TEXDEF,{
+
+ // patterns for letters and numbers
+ letter: /[a-z]/i,
+ digit: /[0-9.]/,
+ number: /^(?:[0-9]+(?:\{,\}[0-9]{3})*(?:\.[0-9]*)*|\.[0-9]+)/,
+
+ special: {
+ '\\': 'ControlSequence',
+ '{': 'Open',
+ '}': 'Close',
+ '~': 'Tilde',
+ '^': 'Superscript',
+ '_': 'Subscript',
+ ' ': 'Space',
+ "\t": 'Space',
+ "\r": 'Space',
+ "\n": 'Space',
+ "'": 'Prime',
+ '%': 'Comment',
+ '&': 'Entry',
+ '#': 'Hash',
+ '\u00A0': 'Space',
+ '\u2019': 'Prime'
+ },
+
+ remap: {
+ '-': '2212',
+ '*': '2217',
+ '`': '2018' // map ` to back quote
+ },
+
+ mathchar0mi: {
+ // Lower-case greek
+ alpha: '03B1',
+ beta: '03B2',
+ gamma: '03B3',
+ delta: '03B4',
+ epsilon: '03F5',
+ zeta: '03B6',
+ eta: '03B7',
+ theta: '03B8',
+ iota: '03B9',
+ kappa: '03BA',
+ lambda: '03BB',
+ mu: '03BC',
+ nu: '03BD',
+ xi: '03BE',
+ omicron: '03BF', // added for completeness
+ pi: '03C0',
+ rho: '03C1',
+ sigma: '03C3',
+ tau: '03C4',
+ upsilon: '03C5',
+ phi: '03D5',
+ chi: '03C7',
+ psi: '03C8',
+ omega: '03C9',
+ varepsilon: '03B5',
+ vartheta: '03D1',
+ varpi: '03D6',
+ varrho: '03F1',
+ varsigma: '03C2',
+ varphi: '03C6',
+
+ // Ord symbols
+ S: ['00A7',{mathvariant: MML.VARIANT.NORMAL}],
+ aleph: ['2135',{mathvariant: MML.VARIANT.NORMAL}],
+ hbar: ['210F',{variantForm:true}],
+ imath: '0131',
+ jmath: '0237',
+ ell: '2113',
+ wp: ['2118',{mathvariant: MML.VARIANT.NORMAL}],
+ Re: ['211C',{mathvariant: MML.VARIANT.NORMAL}],
+ Im: ['2111',{mathvariant: MML.VARIANT.NORMAL}],
+ partial: ['2202',{mathvariant: MML.VARIANT.NORMAL}],
+ infty: ['221E',{mathvariant: MML.VARIANT.NORMAL}],
+ prime: ['2032',{mathvariant: MML.VARIANT.NORMAL, variantForm:true}],
+ emptyset: ['2205',{mathvariant: MML.VARIANT.NORMAL}],
+ nabla: ['2207',{mathvariant: MML.VARIANT.NORMAL}],
+ top: ['22A4',{mathvariant: MML.VARIANT.NORMAL}],
+ bot: ['22A5',{mathvariant: MML.VARIANT.NORMAL}],
+ angle: ['2220',{mathvariant: MML.VARIANT.NORMAL}],
+ triangle: ['25B3',{mathvariant: MML.VARIANT.NORMAL}],
+ backslash: ['2216',{mathvariant: MML.VARIANT.NORMAL, variantForm:true}],
+ forall: ['2200',{mathvariant: MML.VARIANT.NORMAL}],
+ exists: ['2203',{mathvariant: MML.VARIANT.NORMAL}],
+ neg: ['00AC',{mathvariant: MML.VARIANT.NORMAL}],
+ lnot: ['00AC',{mathvariant: MML.VARIANT.NORMAL}],
+ flat: ['266D',{mathvariant: MML.VARIANT.NORMAL}],
+ natural: ['266E',{mathvariant: MML.VARIANT.NORMAL}],
+ sharp: ['266F',{mathvariant: MML.VARIANT.NORMAL}],
+ clubsuit: ['2663',{mathvariant: MML.VARIANT.NORMAL}],
+ diamondsuit: ['2662',{mathvariant: MML.VARIANT.NORMAL}],
+ heartsuit: ['2661',{mathvariant: MML.VARIANT.NORMAL}],
+ spadesuit: ['2660',{mathvariant: MML.VARIANT.NORMAL}]
+ },
+
+ mathchar0mo: {
+ surd: '221A',
+
+ // big ops
+ coprod: ['2210',{texClass: MML.TEXCLASS.OP, movesupsub:true}],
+ bigvee: ['22C1',{texClass: MML.TEXCLASS.OP, movesupsub:true}],
+ bigwedge: ['22C0',{texClass: MML.TEXCLASS.OP, movesupsub:true}],
+ biguplus: ['2A04',{texClass: MML.TEXCLASS.OP, movesupsub:true}],
+ bigcap: ['22C2',{texClass: MML.TEXCLASS.OP, movesupsub:true}],
+ bigcup: ['22C3',{texClass: MML.TEXCLASS.OP, movesupsub:true}],
+ 'int': ['222B',{texClass: MML.TEXCLASS.OP}],
+ intop: ['222B',{texClass: MML.TEXCLASS.OP, movesupsub:true, movablelimits:true}],
+ iint: ['222C',{texClass: MML.TEXCLASS.OP}],
+ iiint: ['222D',{texClass: MML.TEXCLASS.OP}],
+ prod: ['220F',{texClass: MML.TEXCLASS.OP, movesupsub:true}],
+ sum: ['2211',{texClass: MML.TEXCLASS.OP, movesupsub:true}],
+ bigotimes: ['2A02',{texClass: MML.TEXCLASS.OP, movesupsub:true}],
+ bigoplus: ['2A01',{texClass: MML.TEXCLASS.OP, movesupsub:true}],
+ bigodot: ['2A00',{texClass: MML.TEXCLASS.OP, movesupsub:true}],
+ oint: ['222E',{texClass: MML.TEXCLASS.OP}],
+ bigsqcup: ['2A06',{texClass: MML.TEXCLASS.OP, movesupsub:true}],
+ smallint: ['222B',{largeop:false}],
+
+ // binary operations
+ triangleleft: '25C3',
+ triangleright: '25B9',
+ bigtriangleup: '25B3',
+ bigtriangledown: '25BD',
+ wedge: '2227',
+ land: '2227',
+ vee: '2228',
+ lor: '2228',
+ cap: '2229',
+ cup: '222A',
+ ddagger: '2021',
+ dagger: '2020',
+ sqcap: '2293',
+ sqcup: '2294',
+ uplus: '228E',
+ amalg: '2A3F',
+ diamond: '22C4',
+ bullet: '2219',
+ wr: '2240',
+ div: '00F7',
+ odot: ['2299',{largeop: false}],
+ oslash: ['2298',{largeop: false}],
+ otimes: ['2297',{largeop: false}],
+ ominus: ['2296',{largeop: false}],
+ oplus: ['2295',{largeop: false}],
+ mp: '2213',
+ pm: '00B1',
+ circ: '2218',
+ bigcirc: '25EF',
+ setminus: ['2216',{variantForm:true}],
+ cdot: '22C5',
+ ast: '2217',
+ times: '00D7',
+ star: '22C6',
+
+ // Relations
+ propto: '221D',
+ sqsubseteq: '2291',
+ sqsupseteq: '2292',
+ parallel: '2225',
+ mid: '2223',
+ dashv: '22A3',
+ vdash: '22A2',
+ leq: '2264',
+ le: '2264',
+ geq: '2265',
+ ge: '2265',
+ lt: '003C',
+ gt: '003E',
+ succ: '227B',
+ prec: '227A',
+ approx: '2248',
+ succeq: '2AB0', // or '227C',
+ preceq: '2AAF', // or '227D',
+ supset: '2283',
+ subset: '2282',
+ supseteq: '2287',
+ subseteq: '2286',
+ 'in': '2208',
+ ni: '220B',
+ notin: '2209',
+ owns: '220B',
+ gg: '226B',
+ ll: '226A',
+ sim: '223C',
+ simeq: '2243',
+ perp: '22A5',
+ equiv: '2261',
+ asymp: '224D',
+ smile: '2323',
+ frown: '2322',
+ ne: '2260',
+ neq: '2260',
+ cong: '2245',
+ doteq: '2250',
+ bowtie: '22C8',
+ models: '22A8',
+
+ notChar: '29F8',
+
+
+ // Arrows
+ Leftrightarrow: '21D4',
+ Leftarrow: '21D0',
+ Rightarrow: '21D2',
+ leftrightarrow: '2194',
+ leftarrow: '2190',
+ gets: '2190',
+ rightarrow: '2192',
+ to: '2192',
+ mapsto: '21A6',
+ leftharpoonup: '21BC',
+ leftharpoondown: '21BD',
+ rightharpoonup: '21C0',
+ rightharpoondown: '21C1',
+ nearrow: '2197',
+ searrow: '2198',
+ nwarrow: '2196',
+ swarrow: '2199',
+ rightleftharpoons: '21CC',
+ hookrightarrow: '21AA',
+ hookleftarrow: '21A9',
+ longleftarrow: '27F5',
+ Longleftarrow: '27F8',
+ longrightarrow: '27F6',
+ Longrightarrow: '27F9',
+ Longleftrightarrow: '27FA',
+ longleftrightarrow: '27F7',
+ longmapsto: '27FC',
+
+
+ // Misc.
+ ldots: '2026',
+ cdots: '22EF',
+ vdots: '22EE',
+ ddots: '22F1',
+ dotsc: '2026', // dots with commas
+ dotsb: '22EF', // dots with binary ops and relations
+ dotsm: '22EF', // dots with multiplication
+ dotsi: '22EF', // dots with integrals
+ dotso: '2026', // other dots
+
+ ldotp: ['002E', {texClass: MML.TEXCLASS.PUNCT}],
+ cdotp: ['22C5', {texClass: MML.TEXCLASS.PUNCT}],
+ colon: ['003A', {texClass: MML.TEXCLASS.PUNCT}]
+ },
+
+ mathchar7: {
+ Gamma: '0393',
+ Delta: '0394',
+ Theta: '0398',
+ Lambda: '039B',
+ Xi: '039E',
+ Pi: '03A0',
+ Sigma: '03A3',
+ Upsilon: '03A5',
+ Phi: '03A6',
+ Psi: '03A8',
+ Omega: '03A9',
+
+ '_': '005F',
+ '#': '0023',
+ '$': '0024',
+ '%': '0025',
+ '&': '0026',
+ And: '0026'
+ },
+
+ delimiter: {
+ '(': '(',
+ ')': ')',
+ '[': '[',
+ ']': ']',
+ '<': '27E8',
+ '>': '27E9',
+ '\\lt': '27E8',
+ '\\gt': '27E9',
+ '/': '/',
+ '|': ['|',{texClass:MML.TEXCLASS.ORD}],
+ '.': '',
+ '\\\\': '\\',
+ '\\lmoustache': '23B0', // non-standard
+ '\\rmoustache': '23B1', // non-standard
+ '\\lgroup': '27EE', // non-standard
+ '\\rgroup': '27EF', // non-standard
+ '\\arrowvert': '23D0',
+ '\\Arrowvert': '2016',
+ '\\bracevert': '23AA', // non-standard
+ '\\Vert': ['2016',{texClass:MML.TEXCLASS.ORD}],
+ '\\|': ['2016',{texClass:MML.TEXCLASS.ORD}],
+ '\\vert': ['|',{texClass:MML.TEXCLASS.ORD}],
+ '\\uparrow': '2191',
+ '\\downarrow': '2193',
+ '\\updownarrow': '2195',
+ '\\Uparrow': '21D1',
+ '\\Downarrow': '21D3',
+ '\\Updownarrow': '21D5',
+ '\\backslash': '\\',
+ '\\rangle': '27E9',
+ '\\langle': '27E8',
+ '\\rbrace': '}',
+ '\\lbrace': '{',
+ '\\}': '}',
+ '\\{': '{',
+ '\\rceil': '2309',
+ '\\lceil': '2308',
+ '\\rfloor': '230B',
+ '\\lfloor': '230A',
+ '\\lbrack': '[',
+ '\\rbrack': ']'
+ },
+
+ macros: {
+ displaystyle: ['SetStyle','D',true,0],
+ textstyle: ['SetStyle','T',false,0],
+ scriptstyle: ['SetStyle','S',false,1],
+ scriptscriptstyle: ['SetStyle','SS',false,2],
+
+ rm: ['SetFont',MML.VARIANT.NORMAL],
+ mit: ['SetFont',MML.VARIANT.ITALIC],
+ oldstyle: ['SetFont',MML.VARIANT.OLDSTYLE],
+ cal: ['SetFont',MML.VARIANT.CALIGRAPHIC],
+ it: ['SetFont',"-tex-mathit"], // needs special handling
+ bf: ['SetFont',MML.VARIANT.BOLD],
+ bbFont: ['SetFont',MML.VARIANT.DOUBLESTRUCK],
+ scr: ['SetFont',MML.VARIANT.SCRIPT],
+ frak: ['SetFont',MML.VARIANT.FRAKTUR],
+ sf: ['SetFont',MML.VARIANT.SANSSERIF],
+ tt: ['SetFont',MML.VARIANT.MONOSPACE],
+
+// font:
+
+ tiny: ['SetSize',0.5],
+ Tiny: ['SetSize',0.6], // non-standard
+ scriptsize: ['SetSize',0.7],
+ small: ['SetSize',0.85],
+ normalsize: ['SetSize',1.0],
+ large: ['SetSize',1.2],
+ Large: ['SetSize',1.44],
+ LARGE: ['SetSize',1.73],
+ huge: ['SetSize',2.07],
+ Huge: ['SetSize',2.49],
+
+ arcsin: ['NamedFn'],
+ arccos: ['NamedFn'],
+ arctan: ['NamedFn'],
+ arg: ['NamedFn'],
+ cos: ['NamedFn'],
+ cosh: ['NamedFn'],
+ cot: ['NamedFn'],
+ coth: ['NamedFn'],
+ csc: ['NamedFn'],
+ deg: ['NamedFn'],
+ det: 'NamedOp',
+ dim: ['NamedFn'],
+ exp: ['NamedFn'],
+ gcd: 'NamedOp',
+ hom: ['NamedFn'],
+ inf: 'NamedOp',
+ ker: ['NamedFn'],
+ lg: ['NamedFn'],
+ lim: 'NamedOp',
+ liminf: ['NamedOp','lim&thinsp;inf'],
+ limsup: ['NamedOp','lim&thinsp;sup'],
+ ln: ['NamedFn'],
+ log: ['NamedFn'],
+ max: 'NamedOp',
+ min: 'NamedOp',
+ Pr: 'NamedOp',
+ sec: ['NamedFn'],
+ sin: ['NamedFn'],
+ sinh: ['NamedFn'],
+ sup: 'NamedOp',
+ tan: ['NamedFn'],
+ tanh: ['NamedFn'],
+
+ limits: ['Limits',1],
+ nolimits: ['Limits',0],
+
+ overline: ['UnderOver','00AF',null,1],
+ underline: ['UnderOver','005F'],
+ overbrace: ['UnderOver','23DE',1],
+ underbrace: ['UnderOver','23DF',1],
+ overparen: ['UnderOver','23DC'],
+ underparen: ['UnderOver','23DD'],
+ overrightarrow: ['UnderOver','2192'],
+ underrightarrow: ['UnderOver','2192'],
+ overleftarrow: ['UnderOver','2190'],
+ underleftarrow: ['UnderOver','2190'],
+ overleftrightarrow: ['UnderOver','2194'],
+ underleftrightarrow: ['UnderOver','2194'],
+
+ overset: 'Overset',
+ underset: 'Underset',
+ stackrel: ['Macro','\\mathrel{\\mathop{#2}\\limits^{#1}}',2],
+
+ over: 'Over',
+ overwithdelims: 'Over',
+ atop: 'Over',
+ atopwithdelims: 'Over',
+ above: 'Over',
+ abovewithdelims: 'Over',
+ brace: ['Over','{','}'],
+ brack: ['Over','[',']'],
+ choose: ['Over','(',')'],
+
+ frac: 'Frac',
+ sqrt: 'Sqrt',
+ root: 'Root',
+ uproot: ['MoveRoot','upRoot'],
+ leftroot: ['MoveRoot','leftRoot'],
+
+ left: 'LeftRight',
+ right: 'LeftRight',
+ middle: 'Middle',
+
+ llap: 'Lap',
+ rlap: 'Lap',
+ raise: 'RaiseLower',
+ lower: 'RaiseLower',
+ moveleft: 'MoveLeftRight',
+ moveright: 'MoveLeftRight',
+
+ ',': ['Spacer',MML.LENGTH.THINMATHSPACE],
+ ':': ['Spacer',MML.LENGTH.MEDIUMMATHSPACE], // for LaTeX
+ '>': ['Spacer',MML.LENGTH.MEDIUMMATHSPACE],
+ ';': ['Spacer',MML.LENGTH.THICKMATHSPACE],
+ '!': ['Spacer',MML.LENGTH.NEGATIVETHINMATHSPACE],
+ enspace: ['Spacer',".5em"],
+ quad: ['Spacer',"1em"],
+ qquad: ['Spacer',"2em"],
+ thinspace: ['Spacer',MML.LENGTH.THINMATHSPACE],
+ negthinspace: ['Spacer',MML.LENGTH.NEGATIVETHINMATHSPACE],
+
+ hskip: 'Hskip',
+ hspace: 'Hskip',
+ kern: 'Hskip',
+ mskip: 'Hskip',
+ mspace: 'Hskip',
+ mkern: 'Hskip',
+ rule: 'rule',
+ Rule: ['Rule'],
+ Space: ['Rule','blank'],
+
+ big: ['MakeBig',MML.TEXCLASS.ORD,0.85],
+ Big: ['MakeBig',MML.TEXCLASS.ORD,1.15],
+ bigg: ['MakeBig',MML.TEXCLASS.ORD,1.45],
+ Bigg: ['MakeBig',MML.TEXCLASS.ORD,1.75],
+ bigl: ['MakeBig',MML.TEXCLASS.OPEN,0.85],
+ Bigl: ['MakeBig',MML.TEXCLASS.OPEN,1.15],
+ biggl: ['MakeBig',MML.TEXCLASS.OPEN,1.45],
+ Biggl: ['MakeBig',MML.TEXCLASS.OPEN,1.75],
+ bigr: ['MakeBig',MML.TEXCLASS.CLOSE,0.85],
+ Bigr: ['MakeBig',MML.TEXCLASS.CLOSE,1.15],
+ biggr: ['MakeBig',MML.TEXCLASS.CLOSE,1.45],
+ Biggr: ['MakeBig',MML.TEXCLASS.CLOSE,1.75],
+ bigm: ['MakeBig',MML.TEXCLASS.REL,0.85],
+ Bigm: ['MakeBig',MML.TEXCLASS.REL,1.15],
+ biggm: ['MakeBig',MML.TEXCLASS.REL,1.45],
+ Biggm: ['MakeBig',MML.TEXCLASS.REL,1.75],
+
+ mathord: ['TeXAtom',MML.TEXCLASS.ORD],
+ mathop: ['TeXAtom',MML.TEXCLASS.OP],
+ mathopen: ['TeXAtom',MML.TEXCLASS.OPEN],
+ mathclose: ['TeXAtom',MML.TEXCLASS.CLOSE],
+ mathbin: ['TeXAtom',MML.TEXCLASS.BIN],
+ mathrel: ['TeXAtom',MML.TEXCLASS.REL],
+ mathpunct: ['TeXAtom',MML.TEXCLASS.PUNCT],
+ mathinner: ['TeXAtom',MML.TEXCLASS.INNER],
+
+ vcenter: ['TeXAtom',MML.TEXCLASS.VCENTER],
+
+ mathchoice: ['Extension','mathchoice'],
+ buildrel: 'BuildRel',
+
+ hbox: ['HBox',0],
+ text: 'HBox',
+ mbox: ['HBox',0],
+ fbox: 'FBox',
+
+ strut: 'Strut',
+ mathstrut: ['Macro','\\vphantom{(}'],
+ phantom: 'Phantom',
+ vphantom: ['Phantom',1,0],
+ hphantom: ['Phantom',0,1],
+ smash: 'Smash',
+
+ acute: ['Accent', "00B4"], // or 0301 or 02CA
+ grave: ['Accent', "0060"], // or 0300 or 02CB
+ ddot: ['Accent', "00A8"], // or 0308
+ tilde: ['Accent', "007E"], // or 0303 or 02DC
+ bar: ['Accent', "00AF"], // or 0304 or 02C9
+ breve: ['Accent', "02D8"], // or 0306
+ check: ['Accent', "02C7"], // or 030C
+ hat: ['Accent', "005E"], // or 0302 or 02C6
+ vec: ['Accent', "2192"], // or 20D7
+ dot: ['Accent', "02D9"], // or 0307
+ widetilde: ['Accent', "007E",1], // or 0303 or 02DC
+ widehat: ['Accent', "005E",1], // or 0302 or 02C6
+
+ matrix: 'Matrix',
+ array: 'Matrix',
+ pmatrix: ['Matrix','(',')'],
+ cases: ['Matrix','{','',"left left",null,".1em",null,true],
+ eqalign: ['Matrix',null,null,"right left",MML.LENGTH.THICKMATHSPACE,".5em",'D'],
+ displaylines: ['Matrix',null,null,"center",null,".5em",'D'],
+ cr: 'Cr',
+ '\\': 'CrLaTeX',
+ newline: ['CrLaTeX',true],
+ hline: ['HLine','solid'],
+ hdashline: ['HLine','dashed'],
+// noalign: 'HandleNoAlign',
+ eqalignno: ['Matrix',null,null,"right left",MML.LENGTH.THICKMATHSPACE,".5em",'D',null,"right"],
+ leqalignno: ['Matrix',null,null,"right left",MML.LENGTH.THICKMATHSPACE,".5em",'D',null,"left"],
+ hfill: 'HFill',
+ hfil: 'HFill', // \hfil treated as \hfill for now
+ hfilll: 'HFill', // \hfilll treated as \hfill for now
+
+ // TeX substitution macros
+ bmod: ['Macro','\\mmlToken{mo}[lspace="thickmathspace" rspace="thickmathspace"]{mod}'],
+ pmod: ['Macro','\\pod{\\mmlToken{mi}{mod}\\kern 6mu #1}',1],
+ mod: ['Macro','\\mathchoice{\\kern18mu}{\\kern12mu}{\\kern12mu}{\\kern12mu}\\mmlToken{mi}{mod}\\,\\,#1',1],
+ pod: ['Macro','\\mathchoice{\\kern18mu}{\\kern8mu}{\\kern8mu}{\\kern8mu}(#1)',1],
+ iff: ['Macro','\\;\\Longleftrightarrow\\;'],
+ skew: ['Macro','{{#2{#3\\mkern#1mu}\\mkern-#1mu}{}}',3],
+ mathcal: ['Macro','{\\cal #1}',1],
+ mathscr: ['Macro','{\\scr #1}',1],
+ mathrm: ['Macro','{\\rm #1}',1],
+ mathbf: ['Macro','{\\bf #1}',1],
+ mathbb: ['Macro','{\\bbFont #1}',1],
+ Bbb: ['Macro','{\\bbFont #1}',1],
+ mathit: ['Macro','{\\it #1}',1],
+ mathfrak: ['Macro','{\\frak #1}',1],
+ mathsf: ['Macro','{\\sf #1}',1],
+ mathtt: ['Macro','{\\tt #1}',1],
+ textrm: ['Macro','\\mathord{\\rm\\text{#1}}',1],
+ textit: ['Macro','\\mathord{\\it\\text{#1}}',1],
+ textbf: ['Macro','\\mathord{\\bf\\text{#1}}',1],
+ textsf: ['Macro','\\mathord{\\sf\\text{#1}}',1],
+ texttt: ['Macro','\\mathord{\\tt\\text{#1}}',1],
+ pmb: ['Macro','\\rlap{#1}\\kern1px{#1}',1],
+ TeX: ['Macro','T\\kern-.14em\\lower.5ex{E}\\kern-.115em X'],
+ LaTeX: ['Macro','L\\kern-.325em\\raise.21em{\\scriptstyle{A}}\\kern-.17em\\TeX'],
+ ' ': ['Macro','\\text{ }'],
+
+ // Specially handled
+ not: 'Not',
+ dots: 'Dots',
+ space: 'Tilde',
+ '\u00A0': 'Tilde',
+
+
+ // LaTeX
+ begin: 'BeginEnd',
+ end: 'BeginEnd',
+
+ newcommand: ['Extension','newcommand'],
+ renewcommand: ['Extension','newcommand'],
+ newenvironment: ['Extension','newcommand'],
+ renewenvironment: ['Extension','newcommand'],
+ def: ['Extension','newcommand'],
+ 'let': ['Extension','newcommand'],
+
+ verb: ['Extension','verb'],
+
+ boldsymbol: ['Extension','boldsymbol'],
+
+ tag: ['Extension','AMSmath'],
+ notag: ['Extension','AMSmath'],
+ label: ['Extension','AMSmath'],
+ ref: ['Extension','AMSmath'],
+ eqref: ['Extension','AMSmath'],
+ nonumber: ['Macro','\\notag'],
+
+ // Extensions to TeX
+ unicode: ['Extension','unicode'],
+ color: 'Color',
+
+ href: ['Extension','HTML'],
+ 'class': ['Extension','HTML'],
+ style: ['Extension','HTML'],
+ cssId: ['Extension','HTML'],
+ bbox: ['Extension','bbox'],
+
+ mmlToken: 'MmlToken',
+
+ require: 'Require'
+
+ },
+
+ environment: {
+ array: ['AlignedArray'],
+ matrix: ['Array',null,null,null,'c'],
+ pmatrix: ['Array',null,'(',')','c'],
+ bmatrix: ['Array',null,'[',']','c'],
+ Bmatrix: ['Array',null,'\\{','\\}','c'],
+ vmatrix: ['Array',null,'\\vert','\\vert','c'],
+ Vmatrix: ['Array',null,'\\Vert','\\Vert','c'],
+ cases: ['Array',null,'\\{','.','ll',null,".2em",'T'],
+
+ equation: [null,'Equation'],
+ 'equation*': [null,'Equation'],
+
+ eqnarray: ['ExtensionEnv',null,'AMSmath'],
+ 'eqnarray*': ['ExtensionEnv',null,'AMSmath'],
+
+ align: ['ExtensionEnv',null,'AMSmath'],
+ 'align*': ['ExtensionEnv',null,'AMSmath'],
+ aligned: ['ExtensionEnv',null,'AMSmath'],
+ multline: ['ExtensionEnv',null,'AMSmath'],
+ 'multline*': ['ExtensionEnv',null,'AMSmath'],
+ split: ['ExtensionEnv',null,'AMSmath'],
+ gather: ['ExtensionEnv',null,'AMSmath'],
+ 'gather*': ['ExtensionEnv',null,'AMSmath'],
+ gathered: ['ExtensionEnv',null,'AMSmath'],
+ alignat: ['ExtensionEnv',null,'AMSmath'],
+ 'alignat*': ['ExtensionEnv',null,'AMSmath'],
+ alignedat: ['ExtensionEnv',null,'AMSmath']
+ },
+
+ p_height: 1.2 / .85 // cmex10 height plus depth over .85
+
+ });
+
+ //
+ // Add macros defined in the configuration
+ //
+ if (this.config.Macros) {
+ var MACROS = this.config.Macros;
+ for (var id in MACROS) {if (MACROS.hasOwnProperty(id)) {
+ if (typeof(MACROS[id]) === "string") {TEXDEF.macros[id] = ['Macro',MACROS[id]]}
+ else {TEXDEF.macros[id] = ["Macro"].concat(MACROS[id])}
+ TEXDEF.macros[id].isUser = true;
+ }}
+ }
+ };
+
+ /************************************************************************/
+ /*
+ * The TeX Parser
+ */
+
+ var PARSE = MathJax.Object.Subclass({
+ Init: function (string,env) {
+ this.string = string; this.i = 0; this.macroCount = 0;
+ var ENV; if (env) {ENV = {}; for (var id in env) {if (env.hasOwnProperty(id)) {ENV[id] = env[id]}}}
+ this.stack = TEX.Stack(ENV,!!env);
+ this.Parse(); this.Push(STACKITEM.stop());
+ },
+ Parse: function () {
+ var c, n;
+ while (this.i < this.string.length) {
+ c = this.string.charAt(this.i++); n = c.charCodeAt(0);
+ if (n >= 0xD800 && n < 0xDC00) {c += this.string.charAt(this.i++)}
+ if (TEXDEF.special.hasOwnProperty(c)) {this[TEXDEF.special[c]](c)}
+ else if (TEXDEF.letter.test(c)) {this.Variable(c)}
+ else if (TEXDEF.digit.test(c)) {this.Number(c)}
+ else {this.Other(c)}
+ }
+ },
+ Push: function () {this.stack.Push.apply(this.stack,arguments)},
+ mml: function () {
+ if (this.stack.Top().type !== "mml") {return null}
+ return this.stack.Top().data[0];
+ },
+ mmlToken: function (token) {return token}, // used by boldsymbol extension
+
+ /************************************************************************/
+ /*
+ * Handle various token classes
+ */
+
+ /*
+ * Lookup a control-sequence and process it
+ */
+ ControlSequence: function (c) {
+ var name = this.GetCS(), macro = this.csFindMacro(name);
+ if (macro) {
+ if (!isArray(macro)) {macro = [macro]}
+ var fn = macro[0]; if (!(fn instanceof Function)) {fn = this[fn]}
+ fn.apply(this,[c+name].concat(macro.slice(1)));
+ } else if (TEXDEF.mathchar0mi.hasOwnProperty(name)) {this.csMathchar0mi(name,TEXDEF.mathchar0mi[name])}
+ else if (TEXDEF.mathchar0mo.hasOwnProperty(name)) {this.csMathchar0mo(name,TEXDEF.mathchar0mo[name])}
+ else if (TEXDEF.mathchar7.hasOwnProperty(name)) {this.csMathchar7(name,TEXDEF.mathchar7[name])}
+ else if (TEXDEF.delimiter.hasOwnProperty("\\"+name)) {this.csDelimiter(name,TEXDEF.delimiter["\\"+name])}
+ else {this.csUndefined(c+name)}
+ },
+ //
+ // Look up a macro in the macros list
+ // (overridden in begingroup extension)
+ //
+ csFindMacro: function (name) {
+ return (TEXDEF.macros.hasOwnProperty(name) ? TEXDEF.macros[name] : null);
+ },
+ //
+ // Handle normal mathchar (as an mi)
+ //
+ csMathchar0mi: function (name,mchar) {
+ var def = {mathvariant: MML.VARIANT.ITALIC};
+ if (isArray(mchar)) {def = mchar[1]; mchar = mchar[0]}
+ this.Push(this.mmlToken(MML.mi(MML.entity("#x"+mchar)).With(def)));
+ },
+ //
+ // Handle normal mathchar (as an mo)
+ //
+ csMathchar0mo: function (name,mchar) {
+ var def = {stretchy: false};
+ if (isArray(mchar)) {def = mchar[1]; def.stretchy = false; mchar = mchar[0]}
+ this.Push(this.mmlToken(MML.mo(MML.entity("#x"+mchar)).With(def)));
+ },
+ //
+ // Handle mathchar in current family
+ //
+ csMathchar7: function (name,mchar) {
+ var def = {mathvariant: MML.VARIANT.NORMAL};
+ if (isArray(mchar)) {def = mchar[1]; mchar = mchar[0]}
+ if (this.stack.env.font) {def.mathvariant = this.stack.env.font}
+ this.Push(this.mmlToken(MML.mi(MML.entity("#x"+mchar)).With(def)));
+ },
+ //
+ // Handle delimiter
+ //
+ csDelimiter: function (name,delim) {
+ var def = {};
+ if (isArray(delim)) {def = delim[1]; delim = delim[0]}
+ if (delim.length === 4) {delim = MML.entity('#x'+delim)} else {delim = MML.chars(delim)}
+ this.Push(this.mmlToken(MML.mo(delim).With({fence: false, stretchy: false}).With(def)));
+ },
+ //
+ // Handle undefined control sequence
+ // (overridden in noUndefined extension)
+ //
+ csUndefined: function (name) {
+ TEX.Error(["UndefinedControlSequence","Undefined control sequence %1",name]);
+ },
+
+ /*
+ * Handle a variable (a single letter)
+ */
+ Variable: function (c) {
+ var def = {}; if (this.stack.env.font) {def.mathvariant = this.stack.env.font}
+ this.Push(this.mmlToken(MML.mi(MML.chars(c)).With(def)));
+ },
+
+ /*
+ * Determine the extent of a number (pattern may need work)
+ */
+ Number: function (c) {
+ var mml, n = this.string.slice(this.i-1).match(TEXDEF.number);
+ if (n) {mml = MML.mn(n[0].replace(/[{}]/g,"")); this.i += n[0].length - 1}
+ else {mml = MML.mo(MML.chars(c))}
+ if (this.stack.env.font) {mml.mathvariant = this.stack.env.font}
+ this.Push(this.mmlToken(mml));
+ },
+
+ /*
+ * Handle { and }
+ */
+ Open: function (c) {this.Push(STACKITEM.open())},
+ Close: function (c) {this.Push(STACKITEM.close())},
+
+ /*
+ * Handle tilde and spaces
+ */
+ Tilde: function (c) {this.Push(MML.mtext(MML.chars(NBSP)))},
+ Space: function (c) {},
+
+ /*
+ * Handle ^, _, and '
+ */
+ Superscript: function (c) {
+ if (this.GetNext().match(/\d/)) // don't treat numbers as a unit
+ {this.string = this.string.substr(0,this.i+1)+" "+this.string.substr(this.i+1)}
+ var primes, base, top = this.stack.Top();
+ if (top.type === "prime") {base = top.data[0]; primes = top.data[1]; this.stack.Pop()}
+ else {base = this.stack.Prev(); if (!base) {base = MML.mi("")}}
+ if (base.isEmbellishedWrapper) {base = base.data[0].data[0]}
+ var movesupsub = base.movesupsub, position = base.sup;
+ if ((base.type === "msubsup" && base.data[base.sup]) ||
+ (base.type === "munderover" && base.data[base.over] && !base.subsupOK))
+ {TEX.Error(["DoubleExponent","Double exponent: use braces to clarify"])}
+ if (base.type !== "msubsup") {
+ if (movesupsub) {
+ if (base.type !== "munderover" || base.data[base.over]) {
+ if (base.movablelimits && base.isa(MML.mi)) {base = this.mi2mo(base)}
+ base = MML.munderover(base,null,null).With({movesupsub:true})
+ }
+ position = base.over;
+ } else {
+ base = MML.msubsup(base,null,null);
+ position = base.sup;
+ }
+ }
+ this.Push(STACKITEM.subsup(base).With({
+ position: position, primes: primes, movesupsub: movesupsub
+ }));
+ },
+ Subscript: function (c) {
+ if (this.GetNext().match(/\d/)) // don't treat numbers as a unit
+ {this.string = this.string.substr(0,this.i+1)+" "+this.string.substr(this.i+1)}
+ var primes, base, top = this.stack.Top();
+ if (top.type === "prime") {base = top.data[0]; primes = top.data[1]; this.stack.Pop()}
+ else {base = this.stack.Prev(); if (!base) {base = MML.mi("")}}
+ if (base.isEmbellishedWrapper) {base = base.data[0].data[0]}
+ var movesupsub = base.movesupsub, position = base.sub;
+ if ((base.type === "msubsup" && base.data[base.sub]) ||
+ (base.type === "munderover" && base.data[base.under] && !base.subsupOK))
+ {TEX.Error(["DoubleSubscripts","Double subscripts: use braces to clarify"])}
+ if (base.type !== "msubsup") {
+ if (movesupsub) {
+ if (base.type !== "munderover" || base.data[base.under]) {
+ if (base.movablelimits && base.isa(MML.mi)) {base = this.mi2mo(base)}
+ base = MML.munderover(base,null,null).With({movesupsub:true})
+ }
+ position = base.under;
+ } else {
+ base = MML.msubsup(base,null,null);
+ position = base.sub;
+ }
+ }
+ this.Push(STACKITEM.subsup(base).With({
+ position: position, primes: primes, movesupsub: movesupsub
+ }));
+ },
+ PRIME: "\u2032", SMARTQUOTE: "\u2019",
+ Prime: function (c) {
+ var base = this.stack.Prev(); if (!base) {base = MML.mi()}
+ if (base.type === "msubsup" && base.data[base.sup]) {
+ TEX.Error(["DoubleExponentPrime",
+ "Prime causes double exponent: use braces to clarify"]);
+ }
+ var sup = ""; this.i--;
+ do {sup += this.PRIME; this.i++, c = this.GetNext()}
+ while (c === "'" || c === this.SMARTQUOTE);
+ sup = ["","\u2032","\u2033","\u2034","\u2057"][sup.length] || sup;
+ this.Push(STACKITEM.prime(base,this.mmlToken(MML.mo(sup))));
+ },
+ mi2mo: function (mi) {
+ var mo = MML.mo(); mo.Append.apply(mo,mi.data); var id;
+ for (id in mo.defaults)
+ {if (mo.defaults.hasOwnProperty(id) && mi[id] != null) {mo[id] = mi[id]}}
+ for (id in MML.copyAttributes)
+ {if (MML.copyAttributes.hasOwnProperty(id) && mi[id] != null) {mo[id] = mi[id]}}
+ mo.lspace = mo.rspace = "0"; // prevent mo from having space in NativeMML
+ mo.useMMLspacing &= ~(mo.SPACE_ATTR.lspace | mo.SPACE_ATTR.rspace); // don't count these explicit settings
+ return mo;
+ },
+
+ /*
+ * Handle comments
+ */
+ Comment: function (c) {
+ while (this.i < this.string.length && this.string.charAt(this.i) != "\n") {this.i++}
+ },
+
+ /*
+ * Handle hash marks outside of definitions
+ */
+ Hash: function (c) {
+ TEX.Error(["CantUseHash1",
+ "You can't use 'macro parameter character #' in math mode"]);
+ },
+
+ /*
+ * Handle other characters (as <mo> elements)
+ */
+ Other: function (c) {
+ var def, mo;
+ if (this.stack.env.font) {def = {mathvariant: this.stack.env.font}}
+ if (TEXDEF.remap.hasOwnProperty(c)) {
+ c = TEXDEF.remap[c];
+ if (isArray(c)) {def = c[1]; c = c[0]}
+ mo = MML.mo(MML.entity('#x'+c)).With(def);
+ } else {
+ mo = MML.mo(c).With(def);
+ }
+ if (mo.autoDefault("stretchy",true)) {mo.stretchy = false}
+ if (mo.autoDefault("texClass",true) == "") {mo = MML.TeXAtom(mo)}
+ this.Push(this.mmlToken(mo));
+ },
+
+ /************************************************************************/
+ /*
+ * Macros
+ */
+
+ SetFont: function (name,font) {this.stack.env.font = font},
+ SetStyle: function (name,texStyle,style,level) {
+ this.stack.env.style = texStyle; this.stack.env.level = level;
+ this.Push(STACKITEM.style().With({styles: {displaystyle: style, scriptlevel: level}}));
+ },
+ SetSize: function (name,size) {
+ this.stack.env.size = size;
+ this.Push(STACKITEM.style().With({styles: {mathsize: size+"em"}})); // convert to absolute?
+ },
+
+ Color: function (name) {
+ var color = this.GetArgument(name);
+ var old = this.stack.env.color; this.stack.env.color = color;
+ var math = this.ParseArg(name);
+ if (old) {this.stack.env.color = old} else {delete this.stack.env.color}
+ this.Push(MML.mstyle(math).With({mathcolor: color}));
+ },
+
+ Spacer: function (name,space) {
+ this.Push(MML.mspace().With({width: space, mathsize: MML.SIZE.NORMAL, scriptlevel:0}));
+ },
+
+ LeftRight: function (name) {
+ this.Push(STACKITEM[name.substr(1)]().With({delim: this.GetDelimiter(name)}));
+ },
+
+ Middle: function (name) {
+ var delim = this.GetDelimiter(name);
+ this.Push(MML.TeXAtom().With({texClass:MML.TEXCLASS.CLOSE}));
+ if (this.stack.Top().type !== "left")
+ {TEX.Error(["MisplacedMiddle","%1 must be within \\left and \\right",name])}
+ this.Push(MML.mo(delim).With({stretchy:true}));
+ this.Push(MML.TeXAtom().With({texClass:MML.TEXCLASS.OPEN}));
+ },
+
+ NamedFn: function (name,id) {
+ if (!id) {id = name.substr(1)};
+ var mml = MML.mi(id).With({texClass: MML.TEXCLASS.OP});
+ this.Push(STACKITEM.fn(this.mmlToken(mml)));
+ },
+ NamedOp: function (name,id) {
+ if (!id) {id = name.substr(1)};
+ id = id.replace(/&thinsp;/,"\u2006");
+ var mml = MML.mo(id).With({
+ movablelimits: true,
+ movesupsub: true,
+ form: MML.FORM.PREFIX,
+ texClass: MML.TEXCLASS.OP
+ });
+ this.Push(this.mmlToken(mml));
+ },
+ Limits: function (name,limits) {
+ var op = this.stack.Prev("nopop");
+ if (!op || (op.Get("texClass") !== MML.TEXCLASS.OP && op.movesupsub == null))
+ {TEX.Error(["MisplacedLimits","%1 is allowed only on operators",name])}
+ var top = this.stack.Top();
+ if (op.type === "munderover" && !limits) {
+ op = top.data[top.data.length-1] = MML.msubsup.apply(MML.subsup,op.data);
+ } else if (op.type === "msubsup" && limits) {
+ op = top.data[top.data.length-1] = MML.munderover.apply(MML.underover,op.data);
+ }
+ op.movesupsub = (limits ? true : false);
+ op.Core().movablelimits = false;
+ if (op.movablelimits) op.movablelimits = false;
+ },
+
+ Over: function (name,open,close) {
+ var mml = STACKITEM.over().With({name: name});
+ if (open || close) {
+ mml.open = open; mml.close = close;
+ } else if (name.match(/withdelims$/)) {
+ mml.open = this.GetDelimiter(name);
+ mml.close = this.GetDelimiter(name);
+ }
+ if (name.match(/^\\above/)) {mml.thickness = this.GetDimen(name)}
+ else if (name.match(/^\\atop/) || open || close) {mml.thickness = 0}
+ this.Push(mml);
+ },
+
+ Frac: function (name) {
+ var num = this.ParseArg(name);
+ var den = this.ParseArg(name);
+ this.Push(MML.mfrac(num,den));
+ },
+
+ Sqrt: function (name) {
+ var n = this.GetBrackets(name), arg = this.GetArgument(name);
+ if (arg === "\\frac") {arg += "{"+this.GetArgument(arg)+"}{"+this.GetArgument(arg)+"}"}
+ var mml = TEX.Parse(arg,this.stack.env).mml();
+ if (!n) {mml = MML.msqrt.apply(MML,mml.array())}
+ else {mml = MML.mroot(mml,this.parseRoot(n))}
+ this.Push(mml);
+ },
+ Root: function (name) {
+ var n = this.GetUpTo(name,"\\of");
+ var arg = this.ParseArg(name);
+ this.Push(MML.mroot(arg,this.parseRoot(n)));
+ },
+ parseRoot: function (n) {
+ var env = this.stack.env, inRoot = env.inRoot; env.inRoot = true;
+ var parser = TEX.Parse(n,env); n = parser.mml(); var global = parser.stack.global;
+ if (global.leftRoot || global.upRoot) {
+ n = MML.mpadded(n);
+ if (global.leftRoot) {n.width = global.leftRoot}
+ if (global.upRoot) {n.voffset = global.upRoot; n.height = global.upRoot}
+ }
+ env.inRoot = inRoot;
+ return n;
+ },
+ MoveRoot: function (name,id) {
+ if (!this.stack.env.inRoot)
+ {TEX.Error(["MisplacedMoveRoot","%1 can appear only within a root",name])}
+ if (this.stack.global[id])
+ {TEX.Error(["MultipleMoveRoot","Multiple use of %1",name])}
+ var n = this.GetArgument(name);
+ if (!n.match(/-?[0-9]+/))
+ {TEX.Error(["IntegerArg","The argument to %1 must be an integer",name])}
+ n = (n/15)+"em";
+ if (n.substr(0,1) !== "-") {n = "+"+n}
+ this.stack.global[id] = n;
+ },
+
+ Accent: function (name,accent,stretchy) {
+ var c = this.ParseArg(name);
+ var def = {accent: true}; if (this.stack.env.font) {def.mathvariant = this.stack.env.font}
+ var mml = this.mmlToken(MML.mo(MML.entity("#x"+accent)).With(def));
+ mml.stretchy = (stretchy ? true : false);
+ var mo = (c.isEmbellished() ? c.CoreMO() : c);
+ if (mo.isa(MML.mo)) mo.movablelimits = false;
+ this.Push(MML.TeXAtom(MML.munderover(c,null,mml).With({accent: true})));
+ },
+
+ UnderOver: function (name,c,stack,noaccent) {
+ var pos = {o: "over", u: "under"}[name.charAt(1)];
+ var base = this.ParseArg(name);
+ if (base.Get("movablelimits")) {base.movablelimits = false}
+ if (base.isa(MML.munderover) && base.isEmbellished()) {
+ base.Core().With({lspace:0,rspace:0}); // get spacing right for NativeMML
+ base = MML.mrow(MML.mo().With({rspace:0}),base); // add an empty <mi> so it's not embellished any more
+ }
+ var mml = MML.munderover(base,null,null);
+ mml.SetData(
+ mml[pos],
+ this.mmlToken(MML.mo(MML.entity("#x"+c)).With({stretchy:true, accent:!noaccent}))
+ );
+ if (stack) {mml = MML.TeXAtom(mml).With({texClass:MML.TEXCLASS.OP, movesupsub:true})}
+ this.Push(mml.With({subsupOK:true}));
+ },
+
+ Overset: function (name) {
+ var top = this.ParseArg(name), base = this.ParseArg(name);
+ base.movablelimits = false;
+ this.Push(MML.mover(base,top));
+ },
+ Underset: function (name) {
+ var bot = this.ParseArg(name), base = this.ParseArg(name);
+ base.movablelimits = false;
+ this.Push(MML.munder(base,bot));
+ },
+
+ TeXAtom: function (name,mclass) {
+ var def = {texClass: mclass}, mml;
+ if (mclass == MML.TEXCLASS.OP) {
+ def.movesupsub = def.movablelimits = true;
+ var arg = this.GetArgument(name);
+ var match = arg.match(/^\s*\\rm\s+([a-zA-Z0-9 ]+)$/);
+ if (match) {
+ def.mathvariant = MML.VARIANT.NORMAL;
+ mml = STACKITEM.fn(this.mmlToken(MML.mi(match[1]).With(def)));
+ } else {
+ mml = STACKITEM.fn(MML.TeXAtom(TEX.Parse(arg,this.stack.env).mml()).With(def));
+ }
+ } else {mml = MML.TeXAtom(this.ParseArg(name)).With(def)}
+ this.Push(mml);
+ },
+
+ MmlToken: function (name) {
+ var type = this.GetArgument(name),
+ attr = this.GetBrackets(name,"").replace(/^\s+/,""),
+ data = this.GetArgument(name),
+ def = {attrNames:[]}, match;
+ if (!MML[type] || !MML[type].prototype.isToken)
+ {TEX.Error(["NotMathMLToken","%1 is not a token element",type])}
+ while (attr !== "") {
+ match = attr.match(/^([a-z]+)\s*=\s*('[^']*'|"[^"]*"|[^ ,]*)\s*,?\s*/i);
+ if (!match)
+ {TEX.Error(["InvalidMathMLAttr","Invalid MathML attribute: %1",attr])}
+ if (MML[type].prototype.defaults[match[1]] == null && !this.MmlTokenAllow[match[1]]) {
+ TEX.Error(["UnknownAttrForElement",
+ "%1 is not a recognized attribute for %2",
+ match[1],type]);
+ }
+ var value = this.MmlFilterAttribute(match[1],match[2].replace(/^(['"])(.*)\1$/,"$2"));
+ if (value) {
+ if (value.toLowerCase() === "true") {value = true}
+ else if (value.toLowerCase() === "false") {value = false}
+ def[match[1]] = value;
+ def.attrNames.push(match[1]);
+ }
+ attr = attr.substr(match[0].length);
+ }
+ this.Push(this.mmlToken(MML[type](data).With(def)));
+ },
+ MmlFilterAttribute: function (name,value) {return value},
+ MmlTokenAllow: {
+ fontfamily:1, fontsize:1, fontweight:1, fontstyle:1,
+ color:1, background:1,
+ id:1, "class":1, href:1, style:1
+ },
+
+ Strut: function (name) {
+ this.Push(MML.mpadded(MML.mrow()).With({height: "8.6pt", depth: "3pt", width: 0}));
+ },
+
+ Phantom: function (name,v,h) {
+ var mml = this.ParseArg(name);
+ if (v || h) {
+ mml = MML.mpadded(mml);
+ if (h) {mml.height = mml.depth = 0}
+ if (v) {mml.width = 0}
+ }
+ this.Push(MML.TeXAtom(MML.mphantom(mml)));
+ },
+
+ Smash: function (name) {
+ var bt = this.trimSpaces(this.GetBrackets(name,""));
+ var smash = MML.mpadded(this.ParseArg(name));
+ switch (bt) {
+ case "b": smash.depth = 0; break;
+ case "t": smash.height = 0; break;
+ default: smash.height = smash.depth = 0;
+ }
+ this.Push(MML.TeXAtom(smash));
+ },
+
+ Lap: function (name) {
+ var mml = MML.mpadded(this.ParseArg(name)).With({width: 0});
+ if (name === "\\llap") {mml.lspace = "-1width"}
+ this.Push(MML.TeXAtom(mml));
+ },
+
+ RaiseLower: function (name) {
+ var h = this.GetDimen(name);
+ var item = STACKITEM.position().With({name: name, move: 'vertical'});
+ if (h.charAt(0) === '-') {h = h.slice(1); name = {raise: "\\lower", lower: "\\raise"}[name.substr(1)]}
+ if (name === "\\lower") {item.dh = '-'+h; item.dd = '+'+h} else {item.dh = '+'+h; item.dd = '-'+h}
+ this.Push(item);
+ },
+
+ MoveLeftRight: function (name) {
+ var h = this.GetDimen(name);
+ var nh = (h.charAt(0) === '-' ? h.slice(1) : '-'+h);
+ if (name === "\\moveleft") {var tmp = h; h = nh; nh = tmp}
+ this.Push(STACKITEM.position().With({
+ name: name, move: 'horizontal',
+ left: MML.mspace().With({width: h, mathsize: MML.SIZE.NORMAL}),
+ right: MML.mspace().With({width: nh, mathsize: MML.SIZE.NORMAL})
+ }));
+ },
+
+ Hskip: function (name) {
+ this.Push(MML.mspace().With({width: this.GetDimen(name), mathsize: MML.SIZE.NORMAL}));
+ },
+
+ Rule: function (name,style) {
+ var w = this.GetDimen(name),
+ h = this.GetDimen(name),
+ d = this.GetDimen(name);
+ var def = {width:w, height:h, depth:d};
+ if (style !== 'blank') {
+ def.mathbackground = (this.stack.env.color || "black");
+ }
+ this.Push(MML.mspace().With(def));
+ },
+ rule: function (name) {
+ var v = this.GetBrackets(name),
+ w = this.GetDimen(name),
+ h = this.GetDimen(name);
+ var mml = MML.mspace().With({
+ width: w, height:h,
+ mathbackground: (this.stack.env.color || "black")
+ });
+ if (v) {
+ mml = MML.mpadded(mml).With({voffset: v});
+ if (v.match(/^\-/)) {
+ mml.height = v;
+ mml.depth = '+' + v.substr(1);
+ } else {
+ mml.height = '+' + v;
+ }
+ }
+ this.Push(mml);
+ },
+
+ MakeBig: function (name,mclass,size) {
+ size *= TEXDEF.p_height;
+ size = String(size).replace(/(\.\d\d\d).+/,'$1')+"em";
+ var delim = this.GetDelimiter(name,true);
+ this.Push(MML.mstyle(MML.TeXAtom(MML.mo(delim).With({
+ minsize: size, maxsize: size,
+ fence: true, stretchy: true, symmetric: true
+ })).With({texClass: mclass})).With({scriptlevel: 0}));
+ },
+
+ BuildRel: function (name) {
+ var top = this.ParseUpTo(name,"\\over");
+ var bot = this.ParseArg(name);
+ this.Push(MML.TeXAtom(MML.munderover(bot,null,top)).With({texClass: MML.TEXCLASS.REL}));
+ },
+
+ HBox: function (name,style) {
+ this.Push.apply(this,this.InternalMath(this.GetArgument(name),style));
+ },
+
+ FBox: function (name) {
+ this.Push(MML.menclose.apply(MML,this.InternalMath(this.GetArgument(name))).With({notation:"box"}));
+ },
+
+ Not: function (name) {
+ this.Push(STACKITEM.not());
+ },
+
+ Dots: function (name) {
+ this.Push(STACKITEM.dots().With({
+ ldots: this.mmlToken(MML.mo(MML.entity("#x2026")).With({stretchy:false})),
+ cdots: this.mmlToken(MML.mo(MML.entity("#x22EF")).With({stretchy:false}))
+ }));
+ },
+
+ Require: function (name) {
+ var file = this.GetArgument(name)
+ .replace(/.*\//,"") // remove any leading path
+ .replace(/[^a-z0-9_.-]/ig,""); // remove illegal characters
+ this.Extension(null,file);
+ },
+
+ Extension: function (name,file,array) {
+ if (name && !typeof(name) === "string") {name = name.name}
+ file = TEX.extensionDir+"/"+file;
+ if (!file.match(/\.js$/)) {file += ".js"}
+ if (!AJAX.loaded[AJAX.fileURL(file)]) {
+ if (name != null) {delete TEXDEF[array || 'macros'][name.replace(/^\\/,"")]}
+ HUB.RestartAfter(AJAX.Require(file));
+ }
+ },
+
+ Macro: function (name,macro,argcount,def) {
+ if (argcount) {
+ var args = [];
+ if (def != null) {
+ var optional = this.GetBrackets(name);
+ args.push(optional == null ? def : optional);
+ }
+ for (var i = args.length; i < argcount; i++) {args.push(this.GetArgument(name))}
+ macro = this.SubstituteArgs(args,macro);
+ }
+ this.string = this.AddArgs(macro,this.string.slice(this.i));
+ this.i = 0;
+ if (++this.macroCount > TEX.config.MAXMACROS) {
+ TEX.Error(["MaxMacroSub1",
+ "MathJax maximum macro substitution count exceeded; " +
+ "is there a recursive macro call?"]);
+ }
+ },
+
+ Matrix: function (name,open,close,align,spacing,vspacing,style,cases,numbered) {
+ var c = this.GetNext();
+ if (c === "")
+ {TEX.Error(["MissingArgFor","Missing argument for %1",name])}
+ if (c === "{") {this.i++} else {this.string = c+"}"+this.string.slice(this.i+1); this.i = 0}
+ var array = STACKITEM.array().With({
+ requireClose: true,
+ arraydef: {
+ rowspacing: (vspacing||"4pt"),
+ columnspacing: (spacing||"1em")
+ }
+ });
+ if (cases) {array.isCases = true}
+ if (numbered) {array.isNumbered = true; array.arraydef.side = numbered}
+ if (open || close) {array.open = open; array.close = close}
+ if (style === "D") {array.arraydef.displaystyle = true}
+ if (align != null) {array.arraydef.columnalign = align}
+ this.Push(array);
+ },
+
+ Entry: function (name) {
+ this.Push(STACKITEM.cell().With({isEntry: true, name: name}));
+ if (this.stack.Top().isCases) {
+ //
+ // Make second column be in \text{...} (unless it is already
+ // in a \text{...}, for backward compatibility).
+ //
+ var string = this.string;
+ var braces = 0, close = -1, i = this.i, m = string.length;
+ //
+ // Look through the string character by character...
+ //
+ while (i < m) {
+ var c = string.charAt(i);
+ if (c === "{") {
+ //
+ // Increase the nested brace count and go on
+ //
+ braces++;
+ i++;
+ } else if (c === "}") {
+ //
+ // If there are too many close braces, just end (we will get an
+ // error message later when the rest of the string is parsed)
+ // Otherwise
+ // decrease the nested brace count,
+ // if it is now zero and we haven't already marked the end of the
+ // first brace group, record the position (use to check for \text{} later)
+ // go on to the next character.
+ //
+ if (braces === 0) {
+ m = 0;
+ } else {
+ braces--;
+ if (braces === 0 && close < 0) {
+ close = i - this.i;
+ }
+ i++;
+ }
+ } else if (c === "&" && braces === 0) {
+ //
+ // Extra alignment tabs are not allowed in cases
+ //
+ TEX.Error(["ExtraAlignTab","Extra alignment tab in \\cases text"]);
+ } else if (c === "\\") {
+ //
+ // If the macro is \cr or \\, end the search, otherwise skip the macro
+ // (multi-letter names don't matter, as we will skip the rest of the
+ // characters in the main loop)
+ //
+ if (string.substr(i).match(/^((\\cr)[^a-zA-Z]|\\\\)/)) {m = 0} else {i += 2}
+ } else {
+ //
+ // Go on to the next character
+ //
+ i++;
+ }
+ }
+ //
+ // Check if the second column text is already in \text{},
+ // If not, process the second column as text and continue parsing from there,
+ // (otherwise process the second column as normal, since it is in \text{}
+ //
+ var text = string.substr(this.i,i-this.i);
+ if (!text.match(/^\s*\\text[^a-zA-Z]/) || close !== text.replace(/\s+$/,'').length - 1) {
+ this.Push.apply(this,this.InternalMath(text,0));
+ this.i = i;
+ }
+ }
+ },
+
+ Cr: function (name) {
+ this.Push(STACKITEM.cell().With({isCR: true, name: name}));
+ },
+
+ CrLaTeX: function (name, nobrackets) {
+ var n;
+ if (!nobrackets && this.string.charAt(this.i) === "[") {
+ n = this.GetBrackets(name,"").replace(/ /g,"").replace(/,/,".");
+ if (n && !this.matchDimen(n)) {
+ TEX.Error(["BracketMustBeDimension",
+ "Bracket argument to %1 must be a dimension",name]);
+ }
+ }
+ this.Push(STACKITEM.cell().With({isCR: true, name: name, linebreak: true}));
+ var top = this.stack.Top();
+ if (top.isa(STACKITEM.array)) {
+ if (n && top.arraydef.rowspacing) {
+ var rows = top.arraydef.rowspacing.split(/ /);
+ if (!top.rowspacing) {top.rowspacing = this.dimen2em(rows[0])}
+ while (rows.length < top.table.length) {rows.push(this.Em(top.rowspacing))}
+ rows[top.table.length-1] = this.Em(Math.max(0,top.rowspacing+this.dimen2em(n)));
+ top.arraydef.rowspacing = rows.join(' ');
+ }
+ } else {
+ if (n) {this.Push(MML.mspace().With({depth:n}))}
+ this.Push(MML.mspace().With({linebreak:MML.LINEBREAK.NEWLINE}));
+ }
+ },
+ emPerInch: 7.2,
+ pxPerInch: 72,
+ matchDimen: function (dim) {
+ return dim.match(/^(-?(?:\.\d+|\d+(?:\.\d*)?))(px|pt|em|ex|mu|pc|in|mm|cm)$/);
+ },
+ dimen2em: function (dim) {
+ var match = this.matchDimen(dim);
+ var m = parseFloat(match[1]||"1"), unit = match[2];
+ if (unit === "em") {return m}
+ if (unit === "ex") {return m * .43}
+ if (unit === "pt") {return m / 10} // 10 pt to an em
+ if (unit === "pc") {return m * 1.2} // 12 pt to a pc
+ if (unit === "px") {return m * this.emPerInch / this.pxPerInch}
+ if (unit === "in") {return m * this.emPerInch}
+ if (unit === "cm") {return m * this.emPerInch / 2.54} // 2.54 cm to an inch
+ if (unit === "mm") {return m * this.emPerInch / 25.4} // 10 mm to a cm
+ if (unit === "mu") {return m / 18}
+ return 0;
+ },
+ Em: function (m) {
+ if (Math.abs(m) < .0006) {return "0em"}
+ return m.toFixed(3).replace(/\.?0+$/,"") + "em";
+ },
+
+ HLine: function (name,style) {
+ if (style == null) {style = "solid"}
+ var top = this.stack.Top();
+ if (!top.isa(STACKITEM.array) || top.data.length)
+ {TEX.Error(["Misplaced","Misplaced %1",name])}
+ if (top.table.length == 0) {
+ top.frame.push("top");
+ } else {
+ var lines = (top.arraydef.rowlines ? top.arraydef.rowlines.split(/ /) : []);
+ while (lines.length < top.table.length) {lines.push("none")}
+ lines[top.table.length-1] = style;
+ top.arraydef.rowlines = lines.join(' ');
+ }
+ },
+
+ HFill: function (name) {
+ var top = this.stack.Top();
+ if (top.isa(STACKITEM.array)) top.hfill.push(top.data.length);
+ else TEX.Error(["UnsupportedHFill","Unsupported use of %1",name]);
+ },
+
+
+
+ /************************************************************************/
+ /*
+ * LaTeX environments
+ */
+
+ BeginEnd: function (name) {
+ var env = this.GetArgument(name), isEnd = false;
+ if (env.match(/^\\end\\/)) {isEnd = true; env = env.substr(5)} // special \end{} for \newenvironment environments
+ if (env.match(/\\/i)) {TEX.Error(["InvalidEnv","Invalid environment name '%1'",env])}
+ var cmd = this.envFindName(env);
+ if (!cmd) {TEX.Error(["UnknownEnv","Unknown environment '%1'",env])}
+ if (!isArray(cmd)) {cmd = [cmd]}
+ var end = (isArray(cmd[1]) ? cmd[1][0] : cmd[1]);
+ var mml = STACKITEM.begin().With({name: env, end: end, parse:this});
+ if (name === "\\end") {
+ if (!isEnd && isArray(cmd[1]) && this[cmd[1][1]]) {
+ mml = this[cmd[1][1]].apply(this,[mml].concat(cmd.slice(2)));
+ } else {
+ mml = STACKITEM.end().With({name: env});
+ }
+ } else {
+ if (++this.macroCount > TEX.config.MAXMACROS) {
+ TEX.Error(["MaxMacroSub2",
+ "MathJax maximum substitution count exceeded; " +
+ "is there a recursive latex environment?"]);
+ }
+ if (cmd[0] && this[cmd[0]]) {mml = this[cmd[0]].apply(this,[mml].concat(cmd.slice(2)))}
+ }
+ this.Push(mml);
+ },
+ envFindName: function (name) {
+ return (TEXDEF.environment.hasOwnProperty(name) ? TEXDEF.environment[name] : null);
+ },
+
+ Equation: function (begin,row) {return row},
+
+ ExtensionEnv: function (begin,file) {this.Extension(begin.name,file,"environment")},
+
+ Array: function (begin,open,close,align,spacing,vspacing,style,raggedHeight) {
+ if (!align) {align = this.GetArgument("\\begin{"+begin.name+"}")}
+ var lines = ("c"+align).replace(/[^clr|:]/g,'').replace(/[^|:]([|:])+/g,'$1');
+ align = align.replace(/[^clr]/g,'').split('').join(' ');
+ align = align.replace(/l/g,'left').replace(/r/g,'right').replace(/c/g,'center');
+ var array = STACKITEM.array().With({
+ arraydef: {
+ columnalign: align,
+ columnspacing: (spacing||"1em"),
+ rowspacing: (vspacing||"4pt")
+ }
+ });
+ if (lines.match(/[|:]/)) {
+ if (lines.charAt(0).match(/[|:]/)) {array.frame.push("left"); array.frame.dashed = lines.charAt(0) === ":"}
+ if (lines.charAt(lines.length-1).match(/[|:]/)) {array.frame.push("right")}
+ lines = lines.substr(1,lines.length-2);
+ array.arraydef.columnlines =
+ lines.split('').join(' ').replace(/[^|: ]/g,'none').replace(/\|/g,'solid').replace(/:/g,'dashed');
+ }
+ if (open) {array.open = this.convertDelimiter(open)}
+ if (close) {array.close = this.convertDelimiter(close)}
+ if (style === "D") {array.arraydef.displaystyle = true}
+ else if (style) {array.arraydef.displaystyle = false}
+ if (style === "S") {array.arraydef.scriptlevel = 1} // FIXME: should use mstyle?
+ if (raggedHeight) {array.arraydef.useHeight = false}
+ this.Push(begin);
+ return array;
+ },
+
+ AlignedArray: function (begin) {
+ var align = this.GetBrackets("\\begin{"+begin.name+"}");
+ return this.setArrayAlign(this.Array.apply(this,arguments),align);
+ },
+ setArrayAlign: function (array,align) {
+ align = this.trimSpaces(align||"");
+ if (align === "t") {array.arraydef.align = "baseline 1"}
+ else if (align === "b") {array.arraydef.align = "baseline -1"}
+ else if (align === "c") {array.arraydef.align = "center"}
+ else if (align) {array.arraydef.align = align} // FIXME: should be an error?
+ return array;
+ },
+
+ /************************************************************************/
+ /*
+ * String handling routines
+ */
+
+ /*
+ * Convert delimiter to character
+ */
+ convertDelimiter: function (c) {
+ if (c) {c = (TEXDEF.delimiter.hasOwnProperty(c) ? TEXDEF.delimiter[c] : null)}
+ if (c == null) {return null}
+ if (isArray(c)) {c = c[0]}
+ if (c.length === 4) {c = String.fromCharCode(parseInt(c,16))}
+ return c;
+ },
+
+ /*
+ * Trim spaces from a string
+ */
+ trimSpaces: function (text) {
+ if (typeof(text) != 'string') {return text}
+ var TEXT = text.replace(/^\s+|\s+$/g,'');
+ if (TEXT.match(/\\$/) && text.match(/ $/)) TEXT += " ";
+ return TEXT;
+ },
+
+ /*
+ * Check if the next character is a space
+ */
+ nextIsSpace: function () {
+ return this.string.charAt(this.i).match(/\s/);
+ },
+
+ /*
+ * Get the next non-space character
+ */
+ GetNext: function () {
+ while (this.nextIsSpace()) {this.i++}
+ return this.string.charAt(this.i);
+ },
+
+ /*
+ * Get and return a control-sequence name
+ */
+ GetCS: function () {
+ var CS = this.string.slice(this.i).match(/^([a-z]+|.) ?/i);
+ if (CS) {this.i += CS[1].length; return CS[1]} else {this.i++; return " "}
+ },
+
+ /*
+ * Get and return a TeX argument (either a single character or control sequence,
+ * or the contents of the next set of braces).
+ */
+ GetArgument: function (name,noneOK) {
+ switch (this.GetNext()) {
+ case "":
+ if (!noneOK) {TEX.Error(["MissingArgFor","Missing argument for %1",name])}
+ return null;
+ case '}':
+ if (!noneOK) {
+ TEX.Error(["ExtraCloseMissingOpen",
+ "Extra close brace or missing open brace"]);
+ }
+ return null;
+ case '\\':
+ this.i++; return "\\"+this.GetCS();
+ case '{':
+ var j = ++this.i, parens = 1;
+ while (this.i < this.string.length) {
+ switch (this.string.charAt(this.i++)) {
+ case '\\': this.i++; break;
+ case '{': parens++; break;
+ case '}':
+ if (--parens == 0) {return this.string.slice(j,this.i-1)}
+ break;
+ }
+ }
+ TEX.Error(["MissingCloseBrace","Missing close brace"]);
+ break;
+ }
+ return this.string.charAt(this.i++);
+ },
+
+ /*
+ * Get an optional LaTeX argument in brackets
+ */
+ GetBrackets: function (name,def) {
+ if (this.GetNext() != '[') {return def};
+ var j = ++this.i, parens = 0;
+ while (this.i < this.string.length) {
+ switch (this.string.charAt(this.i++)) {
+ case '{': parens++; break;
+ case '\\': this.i++; break;
+ case '}':
+ if (parens-- <= 0) {
+ TEX.Error(["ExtraCloseLooking",
+ "Extra close brace while looking for %1","']'"]);
+ }
+ break;
+ case ']':
+ if (parens == 0) {return this.string.slice(j,this.i-1)}
+ break;
+ }
+ }
+ TEX.Error(["MissingCloseBracket",
+ "Couldn't find closing ']' for argument to %1",name]);
+ },
+
+ /*
+ * Get the name of a delimiter (check it in the delimiter list).
+ */
+ GetDelimiter: function (name,braceOK) {
+ while (this.nextIsSpace()) {this.i++}
+ var c = this.string.charAt(this.i); this.i++;
+ if (this.i <= this.string.length) {
+ if (c == "\\") {
+ c += this.GetCS(name);
+ } else if (c === "{" && braceOK) {
+ this.i--;
+ c = this.GetArgument(name).replace(/^\s+/,'').replace(/\s+$/,'');
+ }
+ if (TEXDEF.delimiter.hasOwnProperty(c)) {return this.convertDelimiter(c)}
+ }
+ TEX.Error(["MissingOrUnrecognizedDelim",
+ "Missing or unrecognized delimiter for %1",name]);
+ },
+
+ /*
+ * Get a dimension (including its units).
+ */
+ GetDimen: function (name) {
+ var dimen;
+ if (this.nextIsSpace()) {this.i++}
+ if (this.string.charAt(this.i) == '{') {
+ dimen = this.GetArgument(name);
+ if (dimen.match(/^\s*([-+]?([.,]\d+|\d+([.,]\d*)?))\s*(pt|em|ex|mu|px|mm|cm|in|pc)\s*$/))
+ {return dimen.replace(/ /g,"").replace(/,/,".")}
+ } else {
+ dimen = this.string.slice(this.i);
+ var match = dimen.match(/^\s*(([-+]?([.,]\d+|\d+([.,]\d*)?))\s*(pt|em|ex|mu|px|mm|cm|in|pc)) ?/);
+ if (match) {
+ this.i += match[0].length;
+ return match[1].replace(/ /g,"").replace(/,/,".");
+ }
+ }
+ TEX.Error(["MissingDimOrUnits",
+ "Missing dimension or its units for %1",name]);
+ },
+
+ /*
+ * Get everything up to the given control sequence (token)
+ */
+ GetUpTo: function (name,token) {
+ while (this.nextIsSpace()) {this.i++}
+ var j = this.i, k, c, parens = 0;
+ while (this.i < this.string.length) {
+ k = this.i; c = this.string.charAt(this.i++);
+ switch (c) {
+ case '\\': c += this.GetCS(); break;
+ case '{': parens++; break;
+ case '}':
+ if (parens == 0) {
+ TEX.Error(["ExtraCloseLooking",
+ "Extra close brace while looking for %1",token])
+ }
+ parens--;
+ break;
+ }
+ if (parens == 0 && c == token) {return this.string.slice(j,k)}
+ }
+ TEX.Error(["TokenNotFoundForCommand",
+ "Couldn't find %1 for %2",token,name]);
+ },
+
+ /*
+ * Parse various substrings
+ */
+ ParseArg: function (name) {return TEX.Parse(this.GetArgument(name),this.stack.env).mml()},
+ ParseUpTo: function (name,token) {return TEX.Parse(this.GetUpTo(name,token),this.stack.env).mml()},
+
+ /*
+ * Break up a string into text and math blocks
+ */
+ InternalMath: function (text,level) {
+ var def = (this.stack.env.font ? {mathvariant: this.stack.env.font} : {});
+ var mml = [], i = 0, k = 0, c, match = '', braces = 0;
+ if (text.match(/\\?[${}\\]|\\\(|\\(eq)?ref\s*\{/)) {
+ while (i < text.length) {
+ c = text.charAt(i++);
+ if (c === '$') {
+ if (match === '$' && braces === 0) {
+ mml.push(MML.TeXAtom(TEX.Parse(text.slice(k,i-1),{}).mml()));
+ match = ''; k = i;
+ } else if (match === '') {
+ if (k < i-1) mml.push(this.InternalText(text.slice(k,i-1),def));
+ match = '$'; k = i;
+ }
+ } else if (c === '{' && match !== '') {
+ braces++;
+ } else if (c === '}') {
+ if (match === '}' && braces === 0) {
+ mml.push(MML.TeXAtom(TEX.Parse(text.slice(k,i),{}).mml().With(def)));
+ match = ''; k = i;
+ } else if (match !== '') {
+ if (braces) braces--;
+ }
+ } else if (c === '\\') {
+ if (match === '' && text.substr(i).match(/^(eq)?ref\s*\{/)) {
+ var len = RegExp["$&"].length;
+ if (k < i-1) mml.push(this.InternalText(text.slice(k,i-1),def));
+ match = '}'; k = i-1; i += len;
+ } else {
+ c = text.charAt(i++);
+ if (c === '(' && match === '') {
+ if (k < i-2) mml.push(this.InternalText(text.slice(k,i-2),def));
+ match = ')'; k = i;
+ } else if (c === ')' && match === ')' && braces === 0) {
+ mml.push(MML.TeXAtom(TEX.Parse(text.slice(k,i-2),{}).mml()));
+ match = ''; k = i;
+ } else if (c.match(/[${}\\]/) && match === '') {
+ i--; text = text.substr(0,i-1) + text.substr(i); // remove \ from \$, \{, \}, or \\
+ }
+ }
+ }
+ }
+ if (match !== '') TEX.Error(["MathNotTerminated","Math not terminated in text box"]);
+ }
+ if (k < text.length) mml.push(this.InternalText(text.slice(k),def));
+ if (level != null) {
+ mml = [MML.mstyle.apply(MML,mml).With({displaystyle:false,scriptlevel:level})];
+ } else if (mml.length > 1) {
+ mml = [MML.mrow.apply(MML,mml)];
+ }
+ return mml;
+ },
+ InternalText: function (text,def) {
+ text = text.replace(/^\s+/,NBSP).replace(/\s+$/,NBSP);
+ return MML.mtext(MML.chars(text)).With(def);
+ },
+
+ /*
+ * Routines to set the macro and environment definitions
+ * (overridden by begingroup to make localized versions)
+ */
+ setDef: function (name,value) {value.isUser = true; TEXDEF.macros[name] = value},
+ setEnv: function (name,value) {value.isUser = true; TEXDEF.environment[name] = value},
+
+ /*
+ * Replace macro parameters with their values
+ */
+ SubstituteArgs: function (args,string) {
+ var text = ''; var newstring = ''; var c; var i = 0;
+ while (i < string.length) {
+ c = string.charAt(i++);
+ if (c === "\\") {text += c + string.charAt(i++)}
+ else if (c === '#') {
+ c = string.charAt(i++);
+ if (c === '#') {text += c} else {
+ if (!c.match(/[1-9]/) || c > args.length) {
+ TEX.Error(["IllegalMacroParam",
+ "Illegal macro parameter reference"]);
+ }
+ newstring = this.AddArgs(this.AddArgs(newstring,text),args[c-1]);
+ text = '';
+ }
+ } else {text += c}
+ }
+ return this.AddArgs(newstring,text);
+ },
+
+ /*
+ * Make sure that macros are followed by a space if their names
+ * could accidentally be continued into the following text.
+ */
+ AddArgs: function (s1,s2) {
+ if (s2.match(/^[a-z]/i) && s1.match(/(^|[^\\])(\\\\)*\\[a-z]+$/i)) {s1 += ' '}
+ if (s1.length + s2.length > TEX.config.MAXBUFFER) {
+ TEX.Error(["MaxBufferSize",
+ "MathJax internal buffer size exceeded; is there a recursive macro call?"]);
+ }
+ return s1+s2;
+ }
+
+ });
+
+ /************************************************************************/
+
+ TEX.Augment({
+ Stack: STACK, Parse: PARSE, Definitions: TEXDEF, Startup: STARTUP,
+
+ config: {
+ MAXMACROS: 10000, // maximum number of macro substitutions per equation
+ MAXBUFFER: 5*1024 // maximum size of TeX string to process
+ },
+
+ sourceMenuTitle: /*_(MathMenu)*/ ["TeXCommands","TeX Commands"],
+ annotationEncoding: "application/x-tex",
+
+ prefilterHooks: MathJax.Callback.Hooks(true), // hooks to run before processing TeX
+ postfilterHooks: MathJax.Callback.Hooks(true), // hooks to run after processing TeX
+
+ //
+ // Check if AMSmath extension must be loaded and push
+ // it on the extensions array, if needed
+ //
+ Config: function () {
+ this.SUPER(arguments).Config.apply(this,arguments);
+ if (this.config.equationNumbers.autoNumber !== "none") {
+ if (!this.config.extensions) {this.config.extensions = []}
+ this.config.extensions.push("AMSmath.js");
+ }
+ },
+
+ //
+ // Convert TeX to ElementJax
+ //
+ Translate: function (script) {
+ var mml, isError = false, math = MathJax.HTML.getScript(script);
+ var display = (script.type.replace(/\n/g," ").match(/(;|\s|\n)mode\s*=\s*display(;|\s|\n|$)/) != null);
+ var data = {math:math, display:display, script:script};
+ var callback = this.prefilterHooks.Execute(data); if (callback) return callback;
+ math = data.math;
+ try {
+ mml = TEX.Parse(math).mml();
+ } catch(err) {
+ if (!err.texError) {throw err}
+ mml = this.formatError(err,math,display,script);
+ isError = true;
+ }
+ if (mml.isa(MML.mtable) && mml.displaystyle === "inherit") mml.displaystyle = display; // for tagged equations
+ if (mml.inferred) {mml = MML.apply(MathJax.ElementJax,mml.data)} else {mml = MML(mml)}
+ if (display) {mml.root.display = "block"}
+ if (isError) {mml.texError = true}
+ data.math = mml;
+ return this.postfilterHooks.Execute(data) || data.math;
+ },
+ prefilterMath: function (math,displaystyle,script) {
+ return math;
+ },
+ postfilterMath: function (math,displaystyle,script) {
+ this.combineRelations(math.root);
+ return math;
+ },
+ formatError: function (err,math,display,script) {
+ var message = err.message.replace(/\n.*/,"");
+ HUB.signal.Post(["TeX Jax - parse error",message,math,display,script]);
+ return MML.Error(message);
+ },
+
+ //
+ // Produce an error and stop processing this equation
+ //
+ Error: function (message) {
+ //
+ // Translate message if it is ["id","message",args]
+ //
+ if (isArray(message)) {message = _.apply(_,message)}
+ throw HUB.Insert(Error(message),{texError: true});
+ },
+
+ //
+ // Add a user-defined macro to the macro list
+ //
+ Macro: function (name,def,argn) {
+ TEXDEF.macros[name] = ['Macro'].concat([].slice.call(arguments,1));
+ TEXDEF.macros[name].isUser = true;
+ },
+
+ /*
+ * Create an mrow that has stretchy delimiters at either end, as needed
+ */
+ fenced: function (open,mml,close) {
+ var mrow = MML.mrow().With({open:open, close:close, texClass:MML.TEXCLASS.INNER});
+ mrow.Append(
+ MML.mo(open).With({fence:true, stretchy:true, symmetric:true, texClass:MML.TEXCLASS.OPEN})
+ );
+ if (mml.type === "mrow" && mml.inferred) {
+ mrow.Append.apply(mrow, mml.data);
+ } else {
+ mrow.Append(mml);
+ }
+ mrow.Append(
+ MML.mo(close).With({fence:true, stretchy:true, symmetric:true, texClass:MML.TEXCLASS.CLOSE})
+ );
+ return mrow;
+ },
+ /*
+ * Create an mrow that has \mathchoice using \bigg and \big for the delimiters
+ */
+ fixedFence: function (open,mml,close) {
+ var mrow = MML.mrow().With({open:open, close:close, texClass:MML.TEXCLASS.ORD});
+ if (open) {mrow.Append(this.mathPalette(open,"l"))}
+ if (mml.type === "mrow") {mrow.Append.apply(mrow,mml.data)} else {mrow.Append(mml)}
+ if (close) {mrow.Append(this.mathPalette(close,"r"))}
+ return mrow;
+ },
+ mathPalette: function (fence,side) {
+ if (fence === '{' || fence === '}') {fence = "\\"+fence}
+ var D = '{\\bigg'+side+' '+fence+'}', T = '{\\big'+side+' '+fence+'}';
+ return TEX.Parse('\\mathchoice'+D+T+T+T,{}).mml();
+ },
+
+ //
+ // Combine adjacent <mo> elements that are relations
+ // (since MathML treats the spacing very differently)
+ //
+ combineRelations: function (mml) {
+ var i, m, m1, m2;
+ for (i = 0, m = mml.data.length; i < m; i++) {
+ if (mml.data[i]) {
+ if (mml.isa(MML.mrow)) {
+ while (i+1 < m && (m1 = mml.data[i]) && (m2 = mml.data[i+1]) &&
+ m1.isa(MML.mo) && m2.isa(MML.mo) &&
+ m1.Get("texClass") === MML.TEXCLASS.REL &&
+ m2.Get("texClass") === MML.TEXCLASS.REL) {
+ if (m1.variantForm == m2.variantForm &&
+ m1.Get("mathvariant") == m2.Get("mathvariant") && m1.style == m2.style &&
+ m1["class"] == m2["class"] && !m1.id && !m2.id) {
+ m1.Append.apply(m1,m2.data);
+ mml.data.splice(i+1,1); m--;
+ } else {
+ m1.rspace = m2.lspace = "0pt"; i++;
+ }
+ }
+ }
+ if (!mml.data[i].isToken) {this.combineRelations(mml.data[i])}
+ }
+ }
+ }
+ });
+
+ //
+ // Add the default filters
+ //
+ TEX.prefilterHooks.Add(function (data) {
+ data.math = TEX.prefilterMath(data.math,data.display,data.script);
+ });
+ TEX.postfilterHooks.Add(function (data) {
+ data.math = TEX.postfilterMath(data.math,data.display,data.script);
+ });
+
+ TEX.loadComplete("jax.js");
+
+})(MathJax.InputJax.TeX,MathJax.Hub,MathJax.Ajax);
+// @license-end