jax.js 25 KB

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