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