| [ Index ] |
PHP Cross Reference of WordPress Trunk (Updated Daily) |
[Summary view] [Print] [Text view]
1 { 2 "version": 3, 3 "sources": ["../../../node_modules/temml/dist/temml.mjs", "../../../packages/latex-to-mathml/src/index.ts"], 4 "sourcesContent": ["/**\n * This is the ParseError class, which is the main error thrown by Temml\n * functions when something has gone wrong. This is used to distinguish internal\n * errors from errors in the expression that the user provided.\n *\n * If possible, a caller should provide a Token or ParseNode with information\n * about where in the source string the problem occurred.\n */\nclass ParseError {\n constructor(\n message, // The error message\n token // An object providing position information\n ) {\n let error = \" \" + message;\n let start;\n\n const loc = token && token.loc;\n if (loc && loc.start <= loc.end) {\n // If we have the input and a position, make the error a bit fancier\n\n // Get the input\n const input = loc.lexer.input;\n\n // Prepend some information\n start = loc.start;\n const end = loc.end;\n if (start === input.length) {\n error += \" at end of input: \";\n } else {\n error += \" at position \" + (start + 1) + \": \";\n }\n\n // Underline token in question using combining underscores\n const underlined = input.slice(start, end).replace(/[^]/g, \"$&\\u0332\");\n\n // Extract some context from the input and add it to the error\n let left;\n if (start > 15) {\n left = \"\u2026\" + input.slice(start - 15, start);\n } else {\n left = input.slice(0, start);\n }\n let right;\n if (end + 15 < input.length) {\n right = input.slice(end, end + 15) + \"\u2026\";\n } else {\n right = input.slice(end);\n }\n error += left + underlined + right;\n }\n\n // Some hackery to make ParseError a prototype of Error\n // See http://stackoverflow.com/a/8460753\n const self = new Error(error);\n self.name = \"ParseError\";\n self.__proto__ = ParseError.prototype;\n self.position = start;\n return self;\n }\n}\n\nParseError.prototype.__proto__ = Error.prototype;\n\n//\n/**\n * This file contains a list of utility functions which are useful in other\n * files.\n */\n\n/**\n * Provide a default value if a setting is undefined\n */\nconst deflt = function(setting, defaultIfUndefined) {\n return setting === undefined ? defaultIfUndefined : setting;\n};\n\n// hyphenate and escape adapted from Facebook's React under Apache 2 license\n\nconst uppercase = /([A-Z])/g;\nconst hyphenate = function(str) {\n return str.replace(uppercase, \"-$1\").toLowerCase();\n};\n\nconst ESCAPE_LOOKUP = {\n \"&\": \"&\",\n \">\": \">\",\n \"<\": \"<\",\n '\"': \""\",\n \"'\": \"'\"\n};\n\nconst ESCAPE_REGEX = /[&><\"']/g;\n\n/**\n * Escapes text to prevent scripting attacks.\n */\nfunction escape(text) {\n return String(text).replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]);\n}\n\n/**\n * Sometimes we want to pull out the innermost element of a group. In most\n * cases, this will just be the group itself, but when ordgroups and colors have\n * a single element, we want to pull that out.\n */\nconst getBaseElem = function(group) {\n if (group.type === \"ordgroup\") {\n if (group.body.length === 1) {\n return getBaseElem(group.body[0]);\n } else {\n return group;\n }\n } else if (group.type === \"color\") {\n if (group.body.length === 1) {\n return getBaseElem(group.body[0]);\n } else {\n return group;\n }\n } else if (group.type === \"font\") {\n return getBaseElem(group.body);\n } else {\n return group;\n }\n};\n\n/**\n * TeXbook algorithms often reference \"character boxes\", which are simply groups\n * with a single character in them. To decide if something is a character box,\n * we find its innermost group, and see if it is a single character.\n */\nconst isCharacterBox = function(group) {\n const baseElem = getBaseElem(group);\n\n // These are all the types of groups which hold single characters\n return baseElem.type === \"mathord\" || baseElem.type === \"textord\" || baseElem.type === \"atom\"\n};\n\nconst assert = function(value) {\n if (!value) {\n throw new Error(\"Expected non-null, but got \" + String(value));\n }\n return value;\n};\n\n/**\n * Return the protocol of a URL, or \"_relative\" if the URL does not specify a\n * protocol (and thus is relative), or `null` if URL has invalid protocol\n * (so should be outright rejected).\n */\nconst protocolFromUrl = function(url) {\n // Check for possible leading protocol.\n // https://url.spec.whatwg.org/#url-parsing strips leading whitespace\n // (\\x00) or C0 control (\\x00-\\x1F) characters.\n // eslint-disable-next-line no-control-regex\n const protocol = /^[\\x00-\\x20]*([^\\\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(url);\n if (!protocol) {\n return \"_relative\";\n }\n // Reject weird colons\n if (protocol[2] !== \":\") {\n return null;\n }\n // Reject invalid characters in scheme according to\n // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1\n if (!/^[a-zA-Z][a-zA-Z0-9+\\-.]*$/.test(protocol[1])) {\n return null;\n }\n // Lowercase the protocol\n return protocol[1].toLowerCase();\n};\n\n/**\n * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. The TeXbook\n * gives an acceptable rounding error of 100sp (which would be the nearest\n * 1/6551.6em with our ptPerEm = 10):\n * http://www.ctex.org/documents/shredder/src/texbook.pdf#page=69\n */\nconst round = function(n) {\n return +n.toFixed(4);\n};\n\nvar utils = {\n deflt,\n escape,\n hyphenate,\n getBaseElem,\n isCharacterBox,\n protocolFromUrl,\n round\n};\n\n/**\n * This is a module for storing settings passed into Temml. It correctly handles\n * default settings.\n */\n\n\n/**\n * The main Settings object\n */\nclass Settings {\n constructor(options) {\n // allow null options\n options = options || {};\n this.displayMode = utils.deflt(options.displayMode, false); // boolean\n this.annotate = utils.deflt(options.annotate, false); // boolean\n this.leqno = utils.deflt(options.leqno, false); // boolean\n this.throwOnError = utils.deflt(options.throwOnError, false); // boolean\n this.errorColor = utils.deflt(options.errorColor, \"#b22222\"); // string\n this.macros = options.macros || {};\n this.wrap = utils.deflt(options.wrap, \"tex\"); // \"tex\" | \"=\"\n this.xml = utils.deflt(options.xml, false); // boolean\n this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false); // booelean\n this.strict = utils.deflt(options.strict, false); // boolean\n this.trust = utils.deflt(options.trust, false); // trust context. See html.js.\n this.maxSize = (options.maxSize === undefined\n ? [Infinity, Infinity]\n : Array.isArray(options.maxSize)\n ? options.maxSize\n : [Infinity, Infinity]\n );\n this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); // number\n }\n\n /**\n * Check whether to test potentially dangerous input, and return\n * `true` (trusted) or `false` (untrusted). The sole argument `context`\n * should be an object with `command` field specifying the relevant LaTeX\n * command (as a string starting with `\\`), and any other arguments, etc.\n * If `context` has a `url` field, a `protocol` field will automatically\n * get added by this function (changing the specified object).\n */\n isTrusted(context) {\n if (context.url && !context.protocol) {\n const protocol = utils.protocolFromUrl(context.url);\n if (protocol == null) {\n return false\n }\n context.protocol = protocol;\n }\n const trust = typeof this.trust === \"function\" ? this.trust(context) : this.trust;\n return Boolean(trust);\n }\n}\n\n/**\n * All registered functions.\n * `functions.js` just exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary.\n */\nconst _functions = {};\n\n/**\n * All MathML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n */\nconst _mathmlGroupBuilders = {};\n\nfunction defineFunction({\n type,\n names,\n props,\n handler,\n mathmlBuilder\n}) {\n // Set default values of functions\n const data = {\n type,\n numArgs: props.numArgs,\n argTypes: props.argTypes,\n allowedInArgument: !!props.allowedInArgument,\n allowedInText: !!props.allowedInText,\n allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath,\n numOptionalArgs: props.numOptionalArgs || 0,\n infix: !!props.infix,\n primitive: !!props.primitive,\n handler: handler\n };\n for (let i = 0; i < names.length; ++i) {\n _functions[names[i]] = data;\n }\n if (type) {\n if (mathmlBuilder) {\n _mathmlGroupBuilders[type] = mathmlBuilder;\n }\n }\n}\n\n/**\n * Use this to register only the MathML builder for a function(e.g.\n * if the function's ParseNode is generated in Parser.js rather than via a\n * stand-alone handler provided to `defineFunction`).\n */\nfunction defineFunctionBuilders({ type, mathmlBuilder }) {\n defineFunction({\n type,\n names: [],\n props: { numArgs: 0 },\n handler() {\n throw new Error(\"Should never be called.\")\n },\n mathmlBuilder\n });\n}\n\nconst normalizeArgument = function(arg) {\n return arg.type === \"ordgroup\" && arg.body.length === 1 ? arg.body[0] : arg\n};\n\n// Since the corresponding buildMathML function expects a\n// list of elements, we normalize for different kinds of arguments\nconst ordargument = function(arg) {\n return arg.type === \"ordgroup\" ? arg.body : [arg]\n};\n\n/**\n * This node represents a document fragment, which contains elements, but when\n * placed into the DOM doesn't have any representation itself. It only contains\n * children and doesn't have any DOM node properties.\n */\nclass DocumentFragment {\n constructor(children) {\n this.children = children;\n this.classes = [];\n this.style = {};\n }\n\n hasClass(className) {\n return this.classes.includes(className);\n }\n\n /** Convert the fragment into a node. */\n toNode() {\n const frag = document.createDocumentFragment();\n\n for (let i = 0; i < this.children.length; i++) {\n frag.appendChild(this.children[i].toNode());\n }\n\n return frag;\n }\n\n /** Convert the fragment into HTML markup. */\n toMarkup() {\n let markup = \"\";\n\n // Simply concatenate the markup for the children together.\n for (let i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n return markup;\n }\n\n /**\n * Converts the math node into a string, similar to innerText. Applies to\n * MathDomNode's only.\n */\n toText() {\n // To avoid this, we would subclass documentFragment separately for\n // MathML, but polyfills for subclassing is expensive per PR 1469.\n const toText = (child) => child.toText();\n return this.children.map(toText).join(\"\");\n }\n}\n\n/**\n * These objects store the data about the DOM nodes we create, as well as some\n * extra data. They can then be transformed into real DOM nodes with the\n * `toNode` function or HTML markup using `toMarkup`. They are useful for both\n * storing extra properties on the nodes, as well as providing a way to easily\n * work with the DOM.\n *\n * Similar functions for working with MathML nodes exist in mathMLTree.js.\n *\n */\n\n/**\n * Create an HTML className based on a list of classes. In addition to joining\n * with spaces, we also remove empty classes.\n */\nconst createClass = function(classes) {\n return classes.filter((cls) => cls).join(\" \");\n};\n\nconst initNode = function(classes, style) {\n this.classes = classes || [];\n this.attributes = {};\n this.style = style || {};\n};\n\n/**\n * Convert into an HTML node\n */\nconst toNode = function(tagName) {\n const node = document.createElement(tagName);\n\n // Apply the class\n node.className = createClass(this.classes);\n\n // Apply inline styles\n for (const style in this.style) {\n if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n node.style[style] = this.style[style];\n }\n }\n\n // Apply attributes\n for (const attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) {\n node.setAttribute(attr, this.attributes[attr]);\n }\n }\n\n // Append the children, also as HTML nodes\n for (let i = 0; i < this.children.length; i++) {\n node.appendChild(this.children[i].toNode());\n }\n\n return node;\n};\n\n/**\n * Convert into an HTML markup string\n */\nconst toMarkup = function(tagName) {\n let markup = `<$tagName}`;\n\n // Add the class\n if (this.classes.length) {\n markup += ` class=\"$utils.escape(createClass(this.classes))}\"`;\n }\n\n let styles = \"\";\n\n // Add the styles, after hyphenation\n for (const style in this.style) {\n if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n styles += `$utils.hyphenate(style)}:$this.style[style]};`;\n }\n }\n\n if (styles) {\n markup += ` style=\"$styles}\"`;\n }\n\n // Add the attributes\n for (const attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) {\n markup += ` $attr}=\"$utils.escape(this.attributes[attr])}\"`;\n }\n }\n\n markup += \">\";\n\n // Add the markup of the children, also as markup\n for (let i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n markup += `</$tagName}>`;\n\n return markup;\n};\n\n/**\n * This node represents a span node, with a className, a list of children, and\n * an inline style.\n *\n */\nclass Span {\n constructor(classes, children, style) {\n initNode.call(this, classes, style);\n this.children = children || [];\n }\n\n setAttribute(attribute, value) {\n this.attributes[attribute] = value;\n }\n\n toNode() {\n return toNode.call(this, \"span\");\n }\n\n toMarkup() {\n return toMarkup.call(this, \"span\");\n }\n}\n\nlet TextNode$1 = class TextNode {\n constructor(text) {\n this.text = text;\n }\n toNode() {\n return document.createTextNode(this.text);\n }\n toMarkup() {\n return utils.escape(this.text);\n }\n};\n\n// Create an <a href=\"\u2026\"> node.\nclass AnchorNode {\n constructor(href, classes, children) {\n this.href = href;\n this.classes = classes;\n this.children = children || [];\n }\n\n toNode() {\n const node = document.createElement(\"a\");\n node.setAttribute(\"href\", this.href);\n if (this.classes.length > 0) {\n node.className = createClass(this.classes);\n }\n for (let i = 0; i < this.children.length; i++) {\n node.appendChild(this.children[i].toNode());\n }\n return node\n }\n\n toMarkup() {\n let markup = `<a href='$utils.escape(this.href)}'`;\n if (this.classes.length > 0) {\n markup += ` class=\"$utils.escape(createClass(this.classes))}\"`;\n }\n markup += \">\";\n for (let i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n markup += \"</a>\";\n return markup\n }\n}\n\n/*\n * This node represents an image embed (<img>) element.\n */\nclass Img {\n constructor(src, alt, style) {\n this.alt = alt;\n this.src = src;\n this.classes = [\"mord\"];\n this.style = style;\n }\n\n hasClass(className) {\n return this.classes.includes(className);\n }\n\n toNode() {\n const node = document.createElement(\"img\");\n node.src = this.src;\n node.alt = this.alt;\n node.className = \"mord\";\n\n // Apply inline styles\n for (const style in this.style) {\n if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n node.style[style] = this.style[style];\n }\n }\n\n return node;\n }\n\n toMarkup() {\n let markup = `<img src='$this.src}' alt='$this.alt}'`;\n\n // Add the styles, after hyphenation\n let styles = \"\";\n for (const style in this.style) {\n if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n styles += `$utils.hyphenate(style)}:$this.style[style]};`;\n }\n }\n if (styles) {\n markup += ` style=\"$utils.escape(styles)}\"`;\n }\n\n markup += \">\";\n return markup;\n }\n}\n\n//\n/**\n * These objects store data about MathML nodes.\n * The `toNode` and `toMarkup` functions create namespaced DOM nodes and\n * HTML text markup respectively.\n */\n\n\nfunction newDocumentFragment(children) {\n return new DocumentFragment(children);\n}\n\n/**\n * This node represents a general purpose MathML node of any type,\n * for example, `\"mo\"` or `\"mspace\"`, corresponding to `<mo>` and\n * `<mspace>` tags).\n */\nclass MathNode {\n constructor(type, children, classes, style) {\n this.type = type;\n this.attributes = {};\n this.children = children || [];\n this.classes = classes || [];\n this.style = style || {}; // Used for <mstyle> elements\n this.label = \"\";\n }\n\n /**\n * Sets an attribute on a MathML node. MathML depends on attributes to convey a\n * semantic content, so this is used heavily.\n */\n setAttribute(name, value) {\n this.attributes[name] = value;\n }\n\n /**\n * Gets an attribute on a MathML node.\n */\n getAttribute(name) {\n return this.attributes[name];\n }\n\n setLabel(value) {\n this.label = value;\n }\n\n /**\n * Converts the math node into a MathML-namespaced DOM element.\n */\n toNode() {\n const node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", this.type);\n\n for (const attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n node.setAttribute(attr, this.attributes[attr]);\n }\n }\n\n if (this.classes.length > 0) {\n node.className = createClass(this.classes);\n }\n\n // Apply inline styles\n for (const style in this.style) {\n if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n node.style[style] = this.style[style];\n }\n }\n\n for (let i = 0; i < this.children.length; i++) {\n node.appendChild(this.children[i].toNode());\n }\n\n return node;\n }\n\n /**\n * Converts the math node into an HTML markup string.\n */\n toMarkup() {\n let markup = \"<\" + this.type;\n\n // Add the attributes\n for (const attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n markup += \" \" + attr + '=\"';\n markup += utils.escape(this.attributes[attr]);\n markup += '\"';\n }\n }\n\n if (this.classes.length > 0) {\n markup += ` class=\"$utils.escape(createClass(this.classes))}\"`;\n }\n\n let styles = \"\";\n\n // Add the styles, after hyphenation\n for (const style in this.style) {\n if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n styles += `$utils.hyphenate(style)}:$this.style[style]};`;\n }\n }\n\n if (styles) {\n markup += ` style=\"$styles}\"`;\n }\n\n markup += \">\";\n\n for (let i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n markup += \"</\" + this.type + \">\";\n\n return markup;\n }\n\n /**\n * Converts the math node into a string, similar to innerText, but escaped.\n */\n toText() {\n return this.children.map((child) => child.toText()).join(\"\");\n }\n}\n\n/**\n * This node represents a piece of text.\n */\nclass TextNode {\n constructor(text) {\n this.text = text;\n }\n\n /**\n * Converts the text node into a DOM text node.\n */\n toNode() {\n return document.createTextNode(this.text);\n }\n\n /**\n * Converts the text node into escaped HTML markup\n * (representing the text itself).\n */\n toMarkup() {\n return utils.escape(this.toText());\n }\n\n /**\n * Converts the text node into a string\n * (representing the text itself).\n */\n toText() {\n return this.text;\n }\n}\n\n// Do not make an <mrow> the only child of a <mstyle>.\n// An <mstyle> acts as its own implicit <mrow>.\nconst wrapWithMstyle = expression => {\n let node;\n if (expression.length === 1 && expression[0].type === \"mrow\") {\n node = expression.pop();\n node.type = \"mstyle\";\n } else {\n node = new MathNode(\"mstyle\", expression);\n }\n return node\n};\n\nvar mathMLTree = {\n MathNode,\n TextNode,\n newDocumentFragment\n};\n\n/**\n * This file provides support for building horizontal stretchy elements.\n */\n\n\n// TODO: Remove when Chromium stretches \\widetilde & \\widehat\nconst estimatedWidth = node => {\n let width = 0;\n if (node.body) {\n for (const item of node.body) {\n width += estimatedWidth(item);\n }\n } else if (node.type === \"supsub\") {\n width += estimatedWidth(node.base);\n if (node.sub) { width += 0.7 * estimatedWidth(node.sub); }\n if (node.sup) { width += 0.7 * estimatedWidth(node.sup); }\n } else if (node.type === \"mathord\" || node.type === \"textord\") {\n for (const ch of node.text.split('')) {\n const codePoint = ch.codePointAt(0);\n if ((0x60 < codePoint && codePoint < 0x7B) || (0x03B0 < codePoint && codePoint < 0x3CA)) {\n width += 0.56; // lower case latin or greek. Use advance width of letter n\n } else if (0x2F < codePoint && codePoint < 0x3A) {\n width += 0.50; // numerals.\n } else {\n width += 0.92; // advance width of letter M\n }\n }\n } else {\n width += 1.0;\n }\n return width\n};\n\nconst stretchyCodePoint = {\n widehat: \"^\",\n widecheck: \"\u02C7\",\n widetilde: \"~\",\n wideparen: \"\u23DC\", // \\u23dc\n utilde: \"~\",\n overleftarrow: \"\\u2190\",\n underleftarrow: \"\\u2190\",\n xleftarrow: \"\\u2190\",\n overrightarrow: \"\\u2192\",\n underrightarrow: \"\\u2192\",\n xrightarrow: \"\\u2192\",\n underbrace: \"\\u23df\",\n overbrace: \"\\u23de\",\n overgroup: \"\\u23e0\",\n overparen: \"\u23DC\",\n undergroup: \"\\u23e1\",\n underparen: \"\\u23dd\",\n overleftrightarrow: \"\\u2194\",\n underleftrightarrow: \"\\u2194\",\n xleftrightarrow: \"\\u2194\",\n Overrightarrow: \"\\u21d2\",\n xRightarrow: \"\\u21d2\",\n overleftharpoon: \"\\u21bc\",\n xleftharpoonup: \"\\u21bc\",\n overrightharpoon: \"\\u21c0\",\n xrightharpoonup: \"\\u21c0\",\n xLeftarrow: \"\\u21d0\",\n xLeftrightarrow: \"\\u21d4\",\n xhookleftarrow: \"\\u21a9\",\n xhookrightarrow: \"\\u21aa\",\n xmapsto: \"\\u21a6\",\n xrightharpoondown: \"\\u21c1\",\n xleftharpoondown: \"\\u21bd\",\n xtwoheadleftarrow: \"\\u219e\",\n xtwoheadrightarrow: \"\\u21a0\",\n xlongequal: \"=\",\n xrightleftarrows: \"\\u21c4\",\n yields: \"\\u2192\",\n yieldsLeft: \"\\u2190\",\n mesomerism: \"\\u2194\",\n longrightharpoonup: \"\\u21c0\",\n longleftharpoondown: \"\\u21bd\",\n eqrightharpoonup: \"\\u21c0\",\n eqleftharpoondown: \"\\u21bd\",\n \"\\\\cdrightarrow\": \"\\u2192\",\n \"\\\\cdleftarrow\": \"\\u2190\",\n \"\\\\cdlongequal\": \"=\"\n};\n\nconst mathMLnode = function(label) {\n const child = new mathMLTree.TextNode(stretchyCodePoint[label.slice(1)]);\n const node = new mathMLTree.MathNode(\"mo\", [child]);\n node.setAttribute(\"stretchy\", \"true\");\n return node\n};\n\nconst crookedWides = [\"\\\\widetilde\", \"\\\\widehat\", \"\\\\widecheck\", \"\\\\utilde\"];\n\n// TODO: Remove when Chromium stretches \\widetilde & \\widehat\nconst accentNode = (group) => {\n const mo = mathMLnode(group.label);\n if (crookedWides.includes(group.label)) {\n const width = estimatedWidth(group.base);\n if (1 < width && width < 1.6) {\n mo.classes.push(\"tml-crooked-2\");\n } else if (1.6 <= width && width < 2.5) {\n mo.classes.push(\"tml-crooked-3\");\n } else if (2.5 <= width) {\n mo.classes.push(\"tml-crooked-4\");\n }\n }\n return mo\n};\n\nvar stretchy = {\n mathMLnode,\n accentNode\n};\n\n/**\n * This file holds a list of all no-argument functions and single-character\n * symbols (like 'a' or ';').\n *\n * For each of the symbols, there are two properties they can have:\n * - group (required): the ParseNode group type the symbol should have (i.e.\n \"textord\", \"mathord\", etc).\n * - replace: the character that this symbol or function should be\n * replaced with (i.e. \"\\phi\" has a replace value of \"\\u03d5\", the phi\n * character in the main font).\n *\n * The outermost map in the table indicates what mode the symbols should be\n * accepted in (e.g. \"math\" or \"text\").\n */\n\n// Some of these have a \"-token\" suffix since these are also used as `ParseNode`\n// types for raw text tokens, and we want to avoid conflicts with higher-level\n// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by\n// looking up the `symbols` map.\nconst ATOMS = {\n bin: 1,\n close: 1,\n inner: 1,\n open: 1,\n punct: 1,\n rel: 1\n};\nconst NON_ATOMS = {\n \"accent-token\": 1,\n mathord: 1,\n \"op-token\": 1,\n spacing: 1,\n textord: 1\n};\n\nconst symbols = {\n math: {},\n text: {}\n};\n\n/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */\nfunction defineSymbol(mode, group, replace, name, acceptUnicodeChar) {\n symbols[mode][name] = { group, replace };\n\n if (acceptUnicodeChar && replace) {\n symbols[mode][replace] = symbols[mode][name];\n }\n}\n\n// Some abbreviations for commonly used strings.\n// This helps minify the code, and also spotting typos using jshint.\n\n// modes:\nconst math = \"math\";\nconst text = \"text\";\n\n// groups:\nconst accent = \"accent-token\";\nconst bin = \"bin\";\nconst close = \"close\";\nconst inner = \"inner\";\nconst mathord = \"mathord\";\nconst op = \"op-token\";\nconst open = \"open\";\nconst punct = \"punct\";\nconst rel = \"rel\";\nconst spacing = \"spacing\";\nconst textord = \"textord\";\n\n// Now comes the symbol table\n\n// Relation Symbols\ndefineSymbol(math, rel, \"\\u2261\", \"\\\\equiv\", true);\ndefineSymbol(math, rel, \"\\u227a\", \"\\\\prec\", true);\ndefineSymbol(math, rel, \"\\u227b\", \"\\\\succ\", true);\ndefineSymbol(math, rel, \"\\u223c\", \"\\\\sim\", true);\ndefineSymbol(math, rel, \"\\u27c2\", \"\\\\perp\", true);\ndefineSymbol(math, rel, \"\\u2aaf\", \"\\\\preceq\", true);\ndefineSymbol(math, rel, \"\\u2ab0\", \"\\\\succeq\", true);\ndefineSymbol(math, rel, \"\\u2243\", \"\\\\simeq\", true);\ndefineSymbol(math, rel, \"\\u224c\", \"\\\\backcong\", true);\ndefineSymbol(math, rel, \"|\", \"\\\\mid\", true);\ndefineSymbol(math, rel, \"\\u226a\", \"\\\\ll\", true);\ndefineSymbol(math, rel, \"\\u226b\", \"\\\\gg\", true);\ndefineSymbol(math, rel, \"\\u224d\", \"\\\\asymp\", true);\ndefineSymbol(math, rel, \"\\u2225\", \"\\\\parallel\");\ndefineSymbol(math, rel, \"\\u2323\", \"\\\\smile\", true);\ndefineSymbol(math, rel, \"\\u2291\", \"\\\\sqsubseteq\", true);\ndefineSymbol(math, rel, \"\\u2292\", \"\\\\sqsupseteq\", true);\ndefineSymbol(math, rel, \"\\u2250\", \"\\\\doteq\", true);\ndefineSymbol(math, rel, \"\\u2322\", \"\\\\frown\", true);\ndefineSymbol(math, rel, \"\\u220b\", \"\\\\ni\", true);\ndefineSymbol(math, rel, \"\\u220c\", \"\\\\notni\", true);\ndefineSymbol(math, rel, \"\\u221d\", \"\\\\propto\", true);\ndefineSymbol(math, rel, \"\\u22a2\", \"\\\\vdash\", true);\ndefineSymbol(math, rel, \"\\u22a3\", \"\\\\dashv\", true);\ndefineSymbol(math, rel, \"\\u220b\", \"\\\\owns\");\ndefineSymbol(math, rel, \"\\u2258\", \"\\\\arceq\", true);\ndefineSymbol(math, rel, \"\\u2259\", \"\\\\wedgeq\", true);\ndefineSymbol(math, rel, \"\\u225a\", \"\\\\veeeq\", true);\ndefineSymbol(math, rel, \"\\u225b\", \"\\\\stareq\", true);\ndefineSymbol(math, rel, \"\\u225d\", \"\\\\eqdef\", true);\ndefineSymbol(math, rel, \"\\u225e\", \"\\\\measeq\", true);\ndefineSymbol(math, rel, \"\\u225f\", \"\\\\questeq\", true);\ndefineSymbol(math, rel, \"\\u2260\", \"\\\\ne\", true);\ndefineSymbol(math, rel, \"\\u2260\", \"\\\\neq\");\n// unicodemath\ndefineSymbol(math, rel, \"\\u2a75\", \"\\\\eqeq\", true);\ndefineSymbol(math, rel, \"\\u2a76\", \"\\\\eqeqeq\", true);\n// mathtools.sty\ndefineSymbol(math, rel, \"\\u2237\", \"\\\\dblcolon\", true);\ndefineSymbol(math, rel, \"\\u2254\", \"\\\\coloneqq\", true);\ndefineSymbol(math, rel, \"\\u2255\", \"\\\\eqqcolon\", true);\ndefineSymbol(math, rel, \"\\u2239\", \"\\\\eqcolon\", true);\ndefineSymbol(math, rel, \"\\u2A74\", \"\\\\Coloneqq\", true);\n\n// Punctuation\ndefineSymbol(math, punct, \"\\u002e\", \"\\\\ldotp\");\ndefineSymbol(math, punct, \"\\u00b7\", \"\\\\cdotp\");\n\n// Misc Symbols\ndefineSymbol(math, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(text, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(math, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(text, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(math, textord, \"\\u2135\", \"\\\\aleph\", true);\ndefineSymbol(math, textord, \"\\u2200\", \"\\\\forall\", true);\ndefineSymbol(math, textord, \"\\u210f\", \"\\\\hbar\", true);\ndefineSymbol(math, textord, \"\\u2203\", \"\\\\exists\", true);\n// \u2207 is actually a unary operator, not binary. But this works.\ndefineSymbol(math, bin, \"\\u2207\", \"\\\\nabla\", true);\ndefineSymbol(math, textord, \"\\u266d\", \"\\\\flat\", true);\ndefineSymbol(math, textord, \"\\u2113\", \"\\\\ell\", true);\ndefineSymbol(math, textord, \"\\u266e\", \"\\\\natural\", true);\ndefineSymbol(math, textord, \"\u212B\", \"\\\\Angstrom\", true);\ndefineSymbol(text, textord, \"\u212B\", \"\\\\Angstrom\", true);\ndefineSymbol(math, textord, \"\\u2663\", \"\\\\clubsuit\", true);\ndefineSymbol(math, textord, \"\\u2667\", \"\\\\varclubsuit\", true);\ndefineSymbol(math, textord, \"\\u2118\", \"\\\\wp\", true);\ndefineSymbol(math, textord, \"\\u266f\", \"\\\\sharp\", true);\ndefineSymbol(math, textord, \"\\u2662\", \"\\\\diamondsuit\", true);\ndefineSymbol(math, textord, \"\\u2666\", \"\\\\vardiamondsuit\", true);\ndefineSymbol(math, textord, \"\\u211c\", \"\\\\Re\", true);\ndefineSymbol(math, textord, \"\\u2661\", \"\\\\heartsuit\", true);\ndefineSymbol(math, textord, \"\\u2665\", \"\\\\varheartsuit\", true);\ndefineSymbol(math, textord, \"\\u2111\", \"\\\\Im\", true);\ndefineSymbol(math, textord, \"\\u2660\", \"\\\\spadesuit\", true);\ndefineSymbol(math, textord, \"\\u2664\", \"\\\\varspadesuit\", true);\ndefineSymbol(math, textord, \"\\u2640\", \"\\\\female\", true);\ndefineSymbol(math, textord, \"\\u2642\", \"\\\\male\", true);\ndefineSymbol(math, textord, \"\\u00a7\", \"\\\\S\", true);\ndefineSymbol(text, textord, \"\\u00a7\", \"\\\\S\");\ndefineSymbol(math, textord, \"\\u00b6\", \"\\\\P\", true);\ndefineSymbol(text, textord, \"\\u00b6\", \"\\\\P\");\ndefineSymbol(text, textord, \"\\u263a\", \"\\\\smiley\", true);\ndefineSymbol(math, textord, \"\\u263a\", \"\\\\smiley\", true);\n\n// Math and Text\ndefineSymbol(math, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, textord, \"\\u2020\", \"\\\\textdagger\");\ndefineSymbol(math, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, textord, \"\\u2021\", \"\\\\textdaggerdbl\");\n\n// Large Delimiters\ndefineSymbol(math, close, \"\\u23b1\", \"\\\\rmoustache\", true);\ndefineSymbol(math, open, \"\\u23b0\", \"\\\\lmoustache\", true);\ndefineSymbol(math, close, \"\\u27ef\", \"\\\\rgroup\", true);\ndefineSymbol(math, open, \"\\u27ee\", \"\\\\lgroup\", true);\n\n// Binary Operators\ndefineSymbol(math, bin, \"\\u2213\", \"\\\\mp\", true);\ndefineSymbol(math, bin, \"\\u2296\", \"\\\\ominus\", true);\ndefineSymbol(math, bin, \"\\u228e\", \"\\\\uplus\", true);\ndefineSymbol(math, bin, \"\\u2293\", \"\\\\sqcap\", true);\ndefineSymbol(math, bin, \"\\u2217\", \"\\\\ast\");\ndefineSymbol(math, bin, \"\\u2294\", \"\\\\sqcup\", true);\ndefineSymbol(math, bin, \"\\u25ef\", \"\\\\bigcirc\", true);\ndefineSymbol(math, bin, \"\\u2219\", \"\\\\bullet\", true);\ndefineSymbol(math, bin, \"\\u2021\", \"\\\\ddagger\");\ndefineSymbol(math, bin, \"\\u2240\", \"\\\\wr\", true);\ndefineSymbol(math, bin, \"\\u2a3f\", \"\\\\amalg\");\ndefineSymbol(math, bin, \"\\u0026\", \"\\\\And\"); // from amsmath\ndefineSymbol(math, bin, \"\\u2AFD\", \"\\\\sslash\", true); // from stmaryrd\n\n// Arrow Symbols\ndefineSymbol(math, rel, \"\\u27f5\", \"\\\\longleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21d0\", \"\\\\Leftarrow\", true);\ndefineSymbol(math, rel, \"\\u27f8\", \"\\\\Longleftarrow\", true);\ndefineSymbol(math, rel, \"\\u27f6\", \"\\\\longrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21d2\", \"\\\\Rightarrow\", true);\ndefineSymbol(math, rel, \"\\u27f9\", \"\\\\Longrightarrow\", true);\ndefineSymbol(math, rel, \"\\u2194\", \"\\\\leftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u27f7\", \"\\\\longleftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21d4\", \"\\\\Leftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u27fa\", \"\\\\Longleftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21a4\", \"\\\\mapsfrom\", true);\ndefineSymbol(math, rel, \"\\u21a6\", \"\\\\mapsto\", true);\ndefineSymbol(math, rel, \"\\u27fc\", \"\\\\longmapsto\", true);\ndefineSymbol(math, rel, \"\\u2197\", \"\\\\nearrow\", true);\ndefineSymbol(math, rel, \"\\u21a9\", \"\\\\hookleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21aa\", \"\\\\hookrightarrow\", true);\ndefineSymbol(math, rel, \"\\u2198\", \"\\\\searrow\", true);\ndefineSymbol(math, rel, \"\\u21bc\", \"\\\\leftharpoonup\", true);\ndefineSymbol(math, rel, \"\\u21c0\", \"\\\\rightharpoonup\", true);\ndefineSymbol(math, rel, \"\\u2199\", \"\\\\swarrow\", true);\ndefineSymbol(math, rel, \"\\u21bd\", \"\\\\leftharpoondown\", true);\ndefineSymbol(math, rel, \"\\u21c1\", \"\\\\rightharpoondown\", true);\ndefineSymbol(math, rel, \"\\u2196\", \"\\\\nwarrow\", true);\ndefineSymbol(math, rel, \"\\u21cc\", \"\\\\rightleftharpoons\", true);\ndefineSymbol(math, mathord, \"\\u21af\", \"\\\\lightning\", true);\ndefineSymbol(math, mathord, \"\\u220E\", \"\\\\QED\", true);\ndefineSymbol(math, mathord, \"\\u2030\", \"\\\\permil\", true);\ndefineSymbol(text, textord, \"\\u2030\", \"\\\\permil\");\ndefineSymbol(math, mathord, \"\\u2609\", \"\\\\astrosun\", true);\ndefineSymbol(math, mathord, \"\\u263c\", \"\\\\sun\", true);\ndefineSymbol(math, mathord, \"\\u263e\", \"\\\\leftmoon\", true);\ndefineSymbol(math, mathord, \"\\u263d\", \"\\\\rightmoon\", true);\ndefineSymbol(math, mathord, \"\\u2295\", \"\\\\Earth\");\n\n// AMS Negated Binary Relations\ndefineSymbol(math, rel, \"\\u226e\", \"\\\\nless\", true);\n// Symbol names preceeded by \"@\" each have a corresponding macro.\ndefineSymbol(math, rel, \"\\u2a87\", \"\\\\lneq\", true);\ndefineSymbol(math, rel, \"\\u2268\", \"\\\\lneqq\", true);\ndefineSymbol(math, rel, \"\\u2268\\ufe00\", \"\\\\lvertneqq\");\ndefineSymbol(math, rel, \"\\u22e6\", \"\\\\lnsim\", true);\ndefineSymbol(math, rel, \"\\u2a89\", \"\\\\lnapprox\", true);\ndefineSymbol(math, rel, \"\\u2280\", \"\\\\nprec\", true);\n// unicode-math maps \\u22e0 to \\npreccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u22e0\", \"\\\\npreceq\", true);\ndefineSymbol(math, rel, \"\\u22e8\", \"\\\\precnsim\", true);\ndefineSymbol(math, rel, \"\\u2ab9\", \"\\\\precnapprox\", true);\ndefineSymbol(math, rel, \"\\u2241\", \"\\\\nsim\", true);\ndefineSymbol(math, rel, \"\\u2224\", \"\\\\nmid\", true);\ndefineSymbol(math, rel, \"\\u2224\", \"\\\\nshortmid\");\ndefineSymbol(math, rel, \"\\u22ac\", \"\\\\nvdash\", true);\ndefineSymbol(math, rel, \"\\u22ad\", \"\\\\nvDash\", true);\ndefineSymbol(math, rel, \"\\u22ea\", \"\\\\ntriangleleft\");\ndefineSymbol(math, rel, \"\\u22ec\", \"\\\\ntrianglelefteq\", true);\ndefineSymbol(math, rel, \"\\u2284\", \"\\\\nsubset\", true);\ndefineSymbol(math, rel, \"\\u2285\", \"\\\\nsupset\", true);\ndefineSymbol(math, rel, \"\\u228a\", \"\\\\subsetneq\", true);\ndefineSymbol(math, rel, \"\\u228a\\ufe00\", \"\\\\varsubsetneq\");\ndefineSymbol(math, rel, \"\\u2acb\", \"\\\\subsetneqq\", true);\ndefineSymbol(math, rel, \"\\u2acb\\ufe00\", \"\\\\varsubsetneqq\");\ndefineSymbol(math, rel, \"\\u226f\", \"\\\\ngtr\", true);\ndefineSymbol(math, rel, \"\\u2a88\", \"\\\\gneq\", true);\ndefineSymbol(math, rel, \"\\u2269\", \"\\\\gneqq\", true);\ndefineSymbol(math, rel, \"\\u2269\\ufe00\", \"\\\\gvertneqq\");\ndefineSymbol(math, rel, \"\\u22e7\", \"\\\\gnsim\", true);\ndefineSymbol(math, rel, \"\\u2a8a\", \"\\\\gnapprox\", true);\ndefineSymbol(math, rel, \"\\u2281\", \"\\\\nsucc\", true);\n// unicode-math maps \\u22e1 to \\nsucccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u22e1\", \"\\\\nsucceq\", true);\ndefineSymbol(math, rel, \"\\u22e9\", \"\\\\succnsim\", true);\ndefineSymbol(math, rel, \"\\u2aba\", \"\\\\succnapprox\", true);\n// unicode-math maps \\u2246 to \\simneqq. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u2246\", \"\\\\ncong\", true);\ndefineSymbol(math, rel, \"\\u2226\", \"\\\\nparallel\", true);\ndefineSymbol(math, rel, \"\\u2226\", \"\\\\nshortparallel\");\ndefineSymbol(math, rel, \"\\u22af\", \"\\\\nVDash\", true);\ndefineSymbol(math, rel, \"\\u22eb\", \"\\\\ntriangleright\");\ndefineSymbol(math, rel, \"\\u22ed\", \"\\\\ntrianglerighteq\", true);\ndefineSymbol(math, rel, \"\\u228b\", \"\\\\supsetneq\", true);\ndefineSymbol(math, rel, \"\\u228b\", \"\\\\varsupsetneq\");\ndefineSymbol(math, rel, \"\\u2acc\", \"\\\\supsetneqq\", true);\ndefineSymbol(math, rel, \"\\u2acc\\ufe00\", \"\\\\varsupsetneqq\");\ndefineSymbol(math, rel, \"\\u22ae\", \"\\\\nVdash\", true);\ndefineSymbol(math, rel, \"\\u2ab5\", \"\\\\precneqq\", true);\ndefineSymbol(math, rel, \"\\u2ab6\", \"\\\\succneqq\", true);\ndefineSymbol(math, bin, \"\\u22b4\", \"\\\\unlhd\");\ndefineSymbol(math, bin, \"\\u22b5\", \"\\\\unrhd\");\n\n// AMS Negated Arrows\ndefineSymbol(math, rel, \"\\u219a\", \"\\\\nleftarrow\", true);\ndefineSymbol(math, rel, \"\\u219b\", \"\\\\nrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21cd\", \"\\\\nLeftarrow\", true);\ndefineSymbol(math, rel, \"\\u21cf\", \"\\\\nRightarrow\", true);\ndefineSymbol(math, rel, \"\\u21ae\", \"\\\\nleftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21ce\", \"\\\\nLeftrightarrow\", true);\n\n// AMS Misc\ndefineSymbol(math, rel, \"\\u25b3\", \"\\\\vartriangle\");\ndefineSymbol(math, textord, \"\\u210f\", \"\\\\hslash\");\ndefineSymbol(math, textord, \"\\u25bd\", \"\\\\triangledown\");\ndefineSymbol(math, textord, \"\\u25ca\", \"\\\\lozenge\");\ndefineSymbol(math, textord, \"\\u24c8\", \"\\\\circledS\");\ndefineSymbol(math, textord, \"\\u00ae\", \"\\\\circledR\", true);\ndefineSymbol(text, textord, \"\\u00ae\", \"\\\\circledR\");\ndefineSymbol(text, textord, \"\\u00ae\", \"\\\\textregistered\");\ndefineSymbol(math, textord, \"\\u2221\", \"\\\\measuredangle\", true);\ndefineSymbol(math, textord, \"\\u2204\", \"\\\\nexists\");\ndefineSymbol(math, textord, \"\\u2127\", \"\\\\mho\");\ndefineSymbol(math, textord, \"\\u2132\", \"\\\\Finv\", true);\ndefineSymbol(math, textord, \"\\u2141\", \"\\\\Game\", true);\ndefineSymbol(math, textord, \"\\u2035\", \"\\\\backprime\");\ndefineSymbol(math, textord, \"\\u2036\", \"\\\\backdprime\");\ndefineSymbol(math, textord, \"\\u2037\", \"\\\\backtrprime\");\ndefineSymbol(math, textord, \"\\u25b2\", \"\\\\blacktriangle\");\ndefineSymbol(math, textord, \"\\u25bc\", \"\\\\blacktriangledown\");\ndefineSymbol(math, textord, \"\\u25a0\", \"\\\\blacksquare\");\ndefineSymbol(math, textord, \"\\u29eb\", \"\\\\blacklozenge\");\ndefineSymbol(math, textord, \"\\u2605\", \"\\\\bigstar\");\ndefineSymbol(math, textord, \"\\u2222\", \"\\\\sphericalangle\", true);\ndefineSymbol(math, textord, \"\\u2201\", \"\\\\complement\", true);\n// unicode-math maps U+F0 to \\matheth. We map to AMS function \\eth\ndefineSymbol(math, textord, \"\\u00f0\", \"\\\\eth\", true);\ndefineSymbol(text, textord, \"\\u00f0\", \"\\u00f0\");\ndefineSymbol(math, textord, \"\\u2571\", \"\\\\diagup\");\ndefineSymbol(math, textord, \"\\u2572\", \"\\\\diagdown\");\ndefineSymbol(math, textord, \"\\u25a1\", \"\\\\square\");\ndefineSymbol(math, textord, \"\\u25a1\", \"\\\\Box\");\ndefineSymbol(math, textord, \"\\u25ca\", \"\\\\Diamond\");\n// unicode-math maps U+A5 to \\mathyen. We map to AMS function \\yen\ndefineSymbol(math, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(text, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(math, textord, \"\\u2713\", \"\\\\checkmark\", true);\ndefineSymbol(text, textord, \"\\u2713\", \"\\\\checkmark\");\ndefineSymbol(math, textord, \"\\u2717\", \"\\\\ballotx\", true);\ndefineSymbol(text, textord, \"\\u2717\", \"\\\\ballotx\");\ndefineSymbol(text, textord, \"\\u2022\", \"\\\\textbullet\");\n\n// AMS Hebrew\ndefineSymbol(math, textord, \"\\u2136\", \"\\\\beth\", true);\ndefineSymbol(math, textord, \"\\u2138\", \"\\\\daleth\", true);\ndefineSymbol(math, textord, \"\\u2137\", \"\\\\gimel\", true);\n\n// AMS Greek\ndefineSymbol(math, textord, \"\\u03dd\", \"\\\\digamma\", true);\ndefineSymbol(math, textord, \"\\u03f0\", \"\\\\varkappa\");\n\n// AMS Delimiters\ndefineSymbol(math, open, \"\\u231C\", \"\\\\ulcorner\", true);\ndefineSymbol(math, close, \"\\u231D\", \"\\\\urcorner\", true);\ndefineSymbol(math, open, \"\\u231E\", \"\\\\llcorner\", true);\ndefineSymbol(math, close, \"\\u231F\", \"\\\\lrcorner\", true);\n\n// AMS Binary Relations\ndefineSymbol(math, rel, \"\\u2266\", \"\\\\leqq\", true);\ndefineSymbol(math, rel, \"\\u2a7d\", \"\\\\leqslant\", true);\ndefineSymbol(math, rel, \"\\u2a95\", \"\\\\eqslantless\", true);\ndefineSymbol(math, rel, \"\\u2272\", \"\\\\lesssim\", true);\ndefineSymbol(math, rel, \"\\u2a85\", \"\\\\lessapprox\", true);\ndefineSymbol(math, rel, \"\\u224a\", \"\\\\approxeq\", true);\ndefineSymbol(math, bin, \"\\u22d6\", \"\\\\lessdot\");\ndefineSymbol(math, rel, \"\\u22d8\", \"\\\\lll\", true);\ndefineSymbol(math, rel, \"\\u2276\", \"\\\\lessgtr\", true);\ndefineSymbol(math, rel, \"\\u22da\", \"\\\\lesseqgtr\", true);\ndefineSymbol(math, rel, \"\\u2a8b\", \"\\\\lesseqqgtr\", true);\ndefineSymbol(math, rel, \"\\u2251\", \"\\\\doteqdot\");\ndefineSymbol(math, rel, \"\\u2253\", \"\\\\risingdotseq\", true);\ndefineSymbol(math, rel, \"\\u2252\", \"\\\\fallingdotseq\", true);\ndefineSymbol(math, rel, \"\\u223d\", \"\\\\backsim\", true);\ndefineSymbol(math, rel, \"\\u22cd\", \"\\\\backsimeq\", true);\ndefineSymbol(math, rel, \"\\u2ac5\", \"\\\\subseteqq\", true);\ndefineSymbol(math, rel, \"\\u22d0\", \"\\\\Subset\", true);\ndefineSymbol(math, rel, \"\\u228f\", \"\\\\sqsubset\", true);\ndefineSymbol(math, rel, \"\\u227c\", \"\\\\preccurlyeq\", true);\ndefineSymbol(math, rel, \"\\u22de\", \"\\\\curlyeqprec\", true);\ndefineSymbol(math, rel, \"\\u227e\", \"\\\\precsim\", true);\ndefineSymbol(math, rel, \"\\u2ab7\", \"\\\\precapprox\", true);\ndefineSymbol(math, rel, \"\\u22b2\", \"\\\\vartriangleleft\");\ndefineSymbol(math, rel, \"\\u22b4\", \"\\\\trianglelefteq\");\ndefineSymbol(math, rel, \"\\u22a8\", \"\\\\vDash\", true);\ndefineSymbol(math, rel, \"\\u22ab\", \"\\\\VDash\", true);\ndefineSymbol(math, rel, \"\\u22aa\", \"\\\\Vvdash\", true);\ndefineSymbol(math, rel, \"\\u2323\", \"\\\\smallsmile\");\ndefineSymbol(math, rel, \"\\u2322\", \"\\\\smallfrown\");\ndefineSymbol(math, rel, \"\\u224f\", \"\\\\bumpeq\", true);\ndefineSymbol(math, rel, \"\\u224e\", \"\\\\Bumpeq\", true);\ndefineSymbol(math, rel, \"\\u2267\", \"\\\\geqq\", true);\ndefineSymbol(math, rel, \"\\u2a7e\", \"\\\\geqslant\", true);\ndefineSymbol(math, rel, \"\\u2a96\", \"\\\\eqslantgtr\", true);\ndefineSymbol(math, rel, \"\\u2273\", \"\\\\gtrsim\", true);\ndefineSymbol(math, rel, \"\\u2a86\", \"\\\\gtrapprox\", true);\ndefineSymbol(math, bin, \"\\u22d7\", \"\\\\gtrdot\");\ndefineSymbol(math, rel, \"\\u22d9\", \"\\\\ggg\", true);\ndefineSymbol(math, rel, \"\\u2277\", \"\\\\gtrless\", true);\ndefineSymbol(math, rel, \"\\u22db\", \"\\\\gtreqless\", true);\ndefineSymbol(math, rel, \"\\u2a8c\", \"\\\\gtreqqless\", true);\ndefineSymbol(math, rel, \"\\u2256\", \"\\\\eqcirc\", true);\ndefineSymbol(math, rel, \"\\u2257\", \"\\\\circeq\", true);\ndefineSymbol(math, rel, \"\\u225c\", \"\\\\triangleq\", true);\ndefineSymbol(math, rel, \"\\u223c\", \"\\\\thicksim\");\ndefineSymbol(math, rel, \"\\u2248\", \"\\\\thickapprox\");\ndefineSymbol(math, rel, \"\\u2ac6\", \"\\\\supseteqq\", true);\ndefineSymbol(math, rel, \"\\u22d1\", \"\\\\Supset\", true);\ndefineSymbol(math, rel, \"\\u2290\", \"\\\\sqsupset\", true);\ndefineSymbol(math, rel, \"\\u227d\", \"\\\\succcurlyeq\", true);\ndefineSymbol(math, rel, \"\\u22df\", \"\\\\curlyeqsucc\", true);\ndefineSymbol(math, rel, \"\\u227f\", \"\\\\succsim\", true);\ndefineSymbol(math, rel, \"\\u2ab8\", \"\\\\succapprox\", true);\ndefineSymbol(math, rel, \"\\u22b3\", \"\\\\vartriangleright\");\ndefineSymbol(math, rel, \"\\u22b5\", \"\\\\trianglerighteq\");\ndefineSymbol(math, rel, \"\\u22a9\", \"\\\\Vdash\", true);\ndefineSymbol(math, rel, \"\\u2223\", \"\\\\shortmid\");\ndefineSymbol(math, rel, \"\\u2225\", \"\\\\shortparallel\");\ndefineSymbol(math, rel, \"\\u226c\", \"\\\\between\", true);\ndefineSymbol(math, rel, \"\\u22d4\", \"\\\\pitchfork\", true);\ndefineSymbol(math, rel, \"\\u221d\", \"\\\\varpropto\");\ndefineSymbol(math, rel, \"\\u25c0\", \"\\\\blacktriangleleft\");\n// unicode-math says that \\therefore is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, rel, \"\\u2234\", \"\\\\therefore\", true);\ndefineSymbol(math, rel, \"\\u220d\", \"\\\\backepsilon\");\ndefineSymbol(math, rel, \"\\u25b6\", \"\\\\blacktriangleright\");\n// unicode-math says that \\because is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, rel, \"\\u2235\", \"\\\\because\", true);\ndefineSymbol(math, rel, \"\\u22d8\", \"\\\\llless\");\ndefineSymbol(math, rel, \"\\u22d9\", \"\\\\gggtr\");\ndefineSymbol(math, bin, \"\\u22b2\", \"\\\\lhd\");\ndefineSymbol(math, bin, \"\\u22b3\", \"\\\\rhd\");\ndefineSymbol(math, rel, \"\\u2242\", \"\\\\eqsim\", true);\ndefineSymbol(math, rel, \"\\u2251\", \"\\\\Doteq\", true);\ndefineSymbol(math, rel, \"\\u297d\", \"\\\\strictif\", true);\ndefineSymbol(math, rel, \"\\u297c\", \"\\\\strictfi\", true);\n\n// AMS Binary Operators\ndefineSymbol(math, bin, \"\\u2214\", \"\\\\dotplus\", true);\ndefineSymbol(math, bin, \"\\u2216\", \"\\\\smallsetminus\");\ndefineSymbol(math, bin, \"\\u22d2\", \"\\\\Cap\", true);\ndefineSymbol(math, bin, \"\\u22d3\", \"\\\\Cup\", true);\ndefineSymbol(math, bin, \"\\u2a5e\", \"\\\\doublebarwedge\", true);\ndefineSymbol(math, bin, \"\\u229f\", \"\\\\boxminus\", true);\ndefineSymbol(math, bin, \"\\u229e\", \"\\\\boxplus\", true);\ndefineSymbol(math, bin, \"\\u29C4\", \"\\\\boxslash\", true);\ndefineSymbol(math, bin, \"\\u22c7\", \"\\\\divideontimes\", true);\ndefineSymbol(math, bin, \"\\u22c9\", \"\\\\ltimes\", true);\ndefineSymbol(math, bin, \"\\u22ca\", \"\\\\rtimes\", true);\ndefineSymbol(math, bin, \"\\u22cb\", \"\\\\leftthreetimes\", true);\ndefineSymbol(math, bin, \"\\u22cc\", \"\\\\rightthreetimes\", true);\ndefineSymbol(math, bin, \"\\u22cf\", \"\\\\curlywedge\", true);\ndefineSymbol(math, bin, \"\\u22ce\", \"\\\\curlyvee\", true);\ndefineSymbol(math, bin, \"\\u229d\", \"\\\\circleddash\", true);\ndefineSymbol(math, bin, \"\\u229b\", \"\\\\circledast\", true);\ndefineSymbol(math, bin, \"\\u22ba\", \"\\\\intercal\", true);\ndefineSymbol(math, bin, \"\\u22d2\", \"\\\\doublecap\");\ndefineSymbol(math, bin, \"\\u22d3\", \"\\\\doublecup\");\ndefineSymbol(math, bin, \"\\u22a0\", \"\\\\boxtimes\", true);\ndefineSymbol(math, bin, \"\\u22c8\", \"\\\\bowtie\", true);\ndefineSymbol(math, bin, \"\\u22c8\", \"\\\\Join\");\ndefineSymbol(math, bin, \"\\u27d5\", \"\\\\leftouterjoin\", true);\ndefineSymbol(math, bin, \"\\u27d6\", \"\\\\rightouterjoin\", true);\ndefineSymbol(math, bin, \"\\u27d7\", \"\\\\fullouterjoin\", true);\n\n// stix Binary Operators\ndefineSymbol(math, bin, \"\\u2238\", \"\\\\dotminus\", true);\ndefineSymbol(math, bin, \"\\u27D1\", \"\\\\wedgedot\", true);\ndefineSymbol(math, bin, \"\\u27C7\", \"\\\\veedot\", true);\ndefineSymbol(math, bin, \"\\u2A62\", \"\\\\doublebarvee\", true);\ndefineSymbol(math, bin, \"\\u2A63\", \"\\\\veedoublebar\", true);\ndefineSymbol(math, bin, \"\\u2A5F\", \"\\\\wedgebar\", true);\ndefineSymbol(math, bin, \"\\u2A60\", \"\\\\wedgedoublebar\", true);\ndefineSymbol(math, bin, \"\\u2A54\", \"\\\\Vee\", true);\ndefineSymbol(math, bin, \"\\u2A53\", \"\\\\Wedge\", true);\ndefineSymbol(math, bin, \"\\u2A43\", \"\\\\barcap\", true);\ndefineSymbol(math, bin, \"\\u2A42\", \"\\\\barcup\", true);\ndefineSymbol(math, bin, \"\\u2A48\", \"\\\\capbarcup\", true);\ndefineSymbol(math, bin, \"\\u2A40\", \"\\\\capdot\", true);\ndefineSymbol(math, bin, \"\\u2A47\", \"\\\\capovercup\", true);\ndefineSymbol(math, bin, \"\\u2A46\", \"\\\\cupovercap\", true);\ndefineSymbol(math, bin, \"\\u2A4D\", \"\\\\closedvarcap\", true);\ndefineSymbol(math, bin, \"\\u2A4C\", \"\\\\closedvarcup\", true);\ndefineSymbol(math, bin, \"\\u2A2A\", \"\\\\minusdot\", true);\ndefineSymbol(math, bin, \"\\u2A2B\", \"\\\\minusfdots\", true);\ndefineSymbol(math, bin, \"\\u2A2C\", \"\\\\minusrdots\", true);\ndefineSymbol(math, bin, \"\\u22BB\", \"\\\\Xor\", true);\ndefineSymbol(math, bin, \"\\u22BC\", \"\\\\Nand\", true);\ndefineSymbol(math, bin, \"\\u22BD\", \"\\\\Nor\", true);\ndefineSymbol(math, bin, \"\\u22BD\", \"\\\\barvee\");\ndefineSymbol(math, bin, \"\\u2AF4\", \"\\\\interleave\", true);\ndefineSymbol(math, bin, \"\\u29E2\", \"\\\\shuffle\", true);\ndefineSymbol(math, bin, \"\\u2AF6\", \"\\\\threedotcolon\", true);\ndefineSymbol(math, bin, \"\\u2982\", \"\\\\typecolon\", true);\ndefineSymbol(math, bin, \"\\u223E\", \"\\\\invlazys\", true);\ndefineSymbol(math, bin, \"\\u2A4B\", \"\\\\twocaps\", true);\ndefineSymbol(math, bin, \"\\u2A4A\", \"\\\\twocups\", true);\ndefineSymbol(math, bin, \"\\u2A4E\", \"\\\\Sqcap\", true);\ndefineSymbol(math, bin, \"\\u2A4F\", \"\\\\Sqcup\", true);\ndefineSymbol(math, bin, \"\\u2A56\", \"\\\\veeonvee\", true);\ndefineSymbol(math, bin, \"\\u2A55\", \"\\\\wedgeonwedge\", true);\ndefineSymbol(math, bin, \"\\u29D7\", \"\\\\blackhourglass\", true);\ndefineSymbol(math, bin, \"\\u29C6\", \"\\\\boxast\", true);\ndefineSymbol(math, bin, \"\\u29C8\", \"\\\\boxbox\", true);\ndefineSymbol(math, bin, \"\\u29C7\", \"\\\\boxcircle\", true);\ndefineSymbol(math, bin, \"\\u229C\", \"\\\\circledequal\", true);\ndefineSymbol(math, bin, \"\\u29B7\", \"\\\\circledparallel\", true);\ndefineSymbol(math, bin, \"\\u29B6\", \"\\\\circledvert\", true);\ndefineSymbol(math, bin, \"\\u29B5\", \"\\\\circlehbar\", true);\ndefineSymbol(math, bin, \"\\u27E1\", \"\\\\concavediamond\", true);\ndefineSymbol(math, bin, \"\\u27E2\", \"\\\\concavediamondtickleft\", true);\ndefineSymbol(math, bin, \"\\u27E3\", \"\\\\concavediamondtickright\", true);\ndefineSymbol(math, bin, \"\\u22C4\", \"\\\\diamond\", true);\ndefineSymbol(math, bin, \"\\u29D6\", \"\\\\hourglass\", true);\ndefineSymbol(math, bin, \"\\u27E0\", \"\\\\lozengeminus\", true);\ndefineSymbol(math, bin, \"\\u233D\", \"\\\\obar\", true);\ndefineSymbol(math, bin, \"\\u29B8\", \"\\\\obslash\", true);\ndefineSymbol(math, bin, \"\\u2A38\", \"\\\\odiv\", true);\ndefineSymbol(math, bin, \"\\u29C1\", \"\\\\ogreaterthan\", true);\ndefineSymbol(math, bin, \"\\u29C0\", \"\\\\olessthan\", true);\ndefineSymbol(math, bin, \"\\u29B9\", \"\\\\operp\", true);\ndefineSymbol(math, bin, \"\\u2A37\", \"\\\\Otimes\", true);\ndefineSymbol(math, bin, \"\\u2A36\", \"\\\\otimeshat\", true);\ndefineSymbol(math, bin, \"\\u22C6\", \"\\\\star\", true);\ndefineSymbol(math, bin, \"\\u25B3\", \"\\\\triangle\", true);\ndefineSymbol(math, bin, \"\\u2A3A\", \"\\\\triangleminus\", true);\ndefineSymbol(math, bin, \"\\u2A39\", \"\\\\triangleplus\", true);\ndefineSymbol(math, bin, \"\\u2A3B\", \"\\\\triangletimes\", true);\ndefineSymbol(math, bin, \"\\u27E4\", \"\\\\whitesquaretickleft\", true);\ndefineSymbol(math, bin, \"\\u27E5\", \"\\\\whitesquaretickright\", true);\ndefineSymbol(math, bin, \"\\u2A33\", \"\\\\smashtimes\", true);\n\n// AMS Arrows\n// Note: unicode-math maps \\u21e2 to their own function \\rightdasharrow.\n// We'll map it to AMS function \\dashrightarrow. It produces the same atom.\ndefineSymbol(math, rel, \"\\u21e2\", \"\\\\dashrightarrow\", true);\n// unicode-math maps \\u21e0 to \\leftdasharrow. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u21e0\", \"\\\\dashleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21c7\", \"\\\\leftleftarrows\", true);\ndefineSymbol(math, rel, \"\\u21c6\", \"\\\\leftrightarrows\", true);\ndefineSymbol(math, rel, \"\\u21da\", \"\\\\Lleftarrow\", true);\ndefineSymbol(math, rel, \"\\u219e\", \"\\\\twoheadleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21a2\", \"\\\\leftarrowtail\", true);\ndefineSymbol(math, rel, \"\\u21ab\", \"\\\\looparrowleft\", true);\ndefineSymbol(math, rel, \"\\u21cb\", \"\\\\leftrightharpoons\", true);\ndefineSymbol(math, rel, \"\\u21b6\", \"\\\\curvearrowleft\", true);\n// unicode-math maps \\u21ba to \\acwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u21ba\", \"\\\\circlearrowleft\", true);\ndefineSymbol(math, rel, \"\\u21b0\", \"\\\\Lsh\", true);\ndefineSymbol(math, rel, \"\\u21c8\", \"\\\\upuparrows\", true);\ndefineSymbol(math, rel, \"\\u21bf\", \"\\\\upharpoonleft\", true);\ndefineSymbol(math, rel, \"\\u21c3\", \"\\\\downharpoonleft\", true);\ndefineSymbol(math, rel, \"\\u22b6\", \"\\\\origof\", true);\ndefineSymbol(math, rel, \"\\u22b7\", \"\\\\imageof\", true);\ndefineSymbol(math, rel, \"\\u22b8\", \"\\\\multimap\", true);\ndefineSymbol(math, rel, \"\\u21ad\", \"\\\\leftrightsquigarrow\", true);\ndefineSymbol(math, rel, \"\\u21c9\", \"\\\\rightrightarrows\", true);\ndefineSymbol(math, rel, \"\\u21c4\", \"\\\\rightleftarrows\", true);\ndefineSymbol(math, rel, \"\\u21a0\", \"\\\\twoheadrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21a3\", \"\\\\rightarrowtail\", true);\ndefineSymbol(math, rel, \"\\u21ac\", \"\\\\looparrowright\", true);\ndefineSymbol(math, rel, \"\\u21b7\", \"\\\\curvearrowright\", true);\n// unicode-math maps \\u21bb to \\cwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u21bb\", \"\\\\circlearrowright\", true);\ndefineSymbol(math, rel, \"\\u21b1\", \"\\\\Rsh\", true);\ndefineSymbol(math, rel, \"\\u21ca\", \"\\\\downdownarrows\", true);\ndefineSymbol(math, rel, \"\\u21be\", \"\\\\upharpoonright\", true);\ndefineSymbol(math, rel, \"\\u21c2\", \"\\\\downharpoonright\", true);\ndefineSymbol(math, rel, \"\\u21dd\", \"\\\\rightsquigarrow\", true);\ndefineSymbol(math, rel, \"\\u21dd\", \"\\\\leadsto\");\ndefineSymbol(math, rel, \"\\u21db\", \"\\\\Rrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21be\", \"\\\\restriction\");\n\ndefineSymbol(math, textord, \"\\u2018\", \"`\");\ndefineSymbol(math, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, textord, \"$\", \"\\\\textdollar\");\ndefineSymbol(math, textord, \"\u00A2\", \"\\\\cent\");\ndefineSymbol(text, textord, \"\u00A2\", \"\\\\cent\");\ndefineSymbol(math, textord, \"%\", \"\\\\%\");\ndefineSymbol(text, textord, \"%\", \"\\\\%\");\ndefineSymbol(math, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, textord, \"_\", \"\\\\textunderscore\");\ndefineSymbol(text, textord, \"\\u2423\", \"\\\\textvisiblespace\", true);\ndefineSymbol(math, textord, \"\\u2220\", \"\\\\angle\", true);\ndefineSymbol(math, textord, \"\\u221e\", \"\\\\infty\", true);\ndefineSymbol(math, textord, \"\\u2032\", \"\\\\prime\");\ndefineSymbol(math, textord, \"\\u2033\", \"\\\\dprime\");\ndefineSymbol(math, textord, \"\\u2034\", \"\\\\trprime\");\ndefineSymbol(math, textord, \"\\u2057\", \"\\\\qprime\");\ndefineSymbol(math, textord, \"\\u25b3\", \"\\\\triangle\");\ndefineSymbol(text, textord, \"\\u0391\", \"\\\\Alpha\", true);\ndefineSymbol(text, textord, \"\\u0392\", \"\\\\Beta\", true);\ndefineSymbol(text, textord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(text, textord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(text, textord, \"\\u0395\", \"\\\\Epsilon\", true);\ndefineSymbol(text, textord, \"\\u0396\", \"\\\\Zeta\", true);\ndefineSymbol(text, textord, \"\\u0397\", \"\\\\Eta\", true);\ndefineSymbol(text, textord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(text, textord, \"\\u0399\", \"\\\\Iota\", true);\ndefineSymbol(text, textord, \"\\u039a\", \"\\\\Kappa\", true);\ndefineSymbol(text, textord, \"\\u039b\", \"\\\\Lambda\", true);\ndefineSymbol(text, textord, \"\\u039c\", \"\\\\Mu\", true);\ndefineSymbol(text, textord, \"\\u039d\", \"\\\\Nu\", true);\ndefineSymbol(text, textord, \"\\u039e\", \"\\\\Xi\", true);\ndefineSymbol(text, textord, \"\\u039f\", \"\\\\Omicron\", true);\ndefineSymbol(text, textord, \"\\u03a0\", \"\\\\Pi\", true);\ndefineSymbol(text, textord, \"\\u03a1\", \"\\\\Rho\", true);\ndefineSymbol(text, textord, \"\\u03a3\", \"\\\\Sigma\", true);\ndefineSymbol(text, textord, \"\\u03a4\", \"\\\\Tau\", true);\ndefineSymbol(text, textord, \"\\u03a5\", \"\\\\Upsilon\", true);\ndefineSymbol(text, textord, \"\\u03a6\", \"\\\\Phi\", true);\ndefineSymbol(text, textord, \"\\u03a7\", \"\\\\Chi\", true);\ndefineSymbol(text, textord, \"\\u03a8\", \"\\\\Psi\", true);\ndefineSymbol(text, textord, \"\\u03a9\", \"\\\\Omega\", true);\ndefineSymbol(math, mathord, \"\\u0391\", \"\\\\Alpha\", true);\ndefineSymbol(math, mathord, \"\\u0392\", \"\\\\Beta\", true);\ndefineSymbol(math, mathord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(math, mathord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(math, mathord, \"\\u0395\", \"\\\\Epsilon\", true);\ndefineSymbol(math, mathord, \"\\u0396\", \"\\\\Zeta\", true);\ndefineSymbol(math, mathord, \"\\u0397\", \"\\\\Eta\", true);\ndefineSymbol(math, mathord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(math, mathord, \"\\u0399\", \"\\\\Iota\", true);\ndefineSymbol(math, mathord, \"\\u039a\", \"\\\\Kappa\", true);\ndefineSymbol(math, mathord, \"\\u039b\", \"\\\\Lambda\", true);\ndefineSymbol(math, mathord, \"\\u039c\", \"\\\\Mu\", true);\ndefineSymbol(math, mathord, \"\\u039d\", \"\\\\Nu\", true);\ndefineSymbol(math, mathord, \"\\u039e\", \"\\\\Xi\", true);\ndefineSymbol(math, mathord, \"\\u039f\", \"\\\\Omicron\", true);\ndefineSymbol(math, mathord, \"\\u03a0\", \"\\\\Pi\", true);\ndefineSymbol(math, mathord, \"\\u03a1\", \"\\\\Rho\", true);\ndefineSymbol(math, mathord, \"\\u03a3\", \"\\\\Sigma\", true);\ndefineSymbol(math, mathord, \"\\u03a4\", \"\\\\Tau\", true);\ndefineSymbol(math, mathord, \"\\u03a5\", \"\\\\Upsilon\", true);\ndefineSymbol(math, mathord, \"\\u03a6\", \"\\\\Phi\", true);\ndefineSymbol(math, mathord, \"\\u03a7\", \"\\\\Chi\", true);\ndefineSymbol(math, mathord, \"\\u03a8\", \"\\\\Psi\", true);\ndefineSymbol(math, mathord, \"\\u03a9\", \"\\\\Omega\", true);\ndefineSymbol(math, open, \"\\u00ac\", \"\\\\neg\", true);\ndefineSymbol(math, open, \"\\u00ac\", \"\\\\lnot\");\ndefineSymbol(math, textord, \"\\u22a4\", \"\\\\top\");\ndefineSymbol(math, textord, \"\\u22a5\", \"\\\\bot\");\ndefineSymbol(math, textord, \"\\u2205\", \"\\\\emptyset\");\ndefineSymbol(math, textord, \"\\u2300\", \"\\\\varnothing\");\ndefineSymbol(math, mathord, \"\\u03b1\", \"\\\\alpha\", true);\ndefineSymbol(math, mathord, \"\\u03b2\", \"\\\\beta\", true);\ndefineSymbol(math, mathord, \"\\u03b3\", \"\\\\gamma\", true);\ndefineSymbol(math, mathord, \"\\u03b4\", \"\\\\delta\", true);\ndefineSymbol(math, mathord, \"\\u03f5\", \"\\\\epsilon\", true);\ndefineSymbol(math, mathord, \"\\u03b6\", \"\\\\zeta\", true);\ndefineSymbol(math, mathord, \"\\u03b7\", \"\\\\eta\", true);\ndefineSymbol(math, mathord, \"\\u03b8\", \"\\\\theta\", true);\ndefineSymbol(math, mathord, \"\\u03b9\", \"\\\\iota\", true);\ndefineSymbol(math, mathord, \"\\u03ba\", \"\\\\kappa\", true);\ndefineSymbol(math, mathord, \"\\u03bb\", \"\\\\lambda\", true);\ndefineSymbol(math, mathord, \"\\u03bc\", \"\\\\mu\", true);\ndefineSymbol(math, mathord, \"\\u03bd\", \"\\\\nu\", true);\ndefineSymbol(math, mathord, \"\\u03be\", \"\\\\xi\", true);\ndefineSymbol(math, mathord, \"\\u03bf\", \"\\\\omicron\", true);\ndefineSymbol(math, mathord, \"\\u03c0\", \"\\\\pi\", true);\ndefineSymbol(math, mathord, \"\\u03c1\", \"\\\\rho\", true);\ndefineSymbol(math, mathord, \"\\u03c3\", \"\\\\sigma\", true);\ndefineSymbol(math, mathord, \"\\u03c4\", \"\\\\tau\", true);\ndefineSymbol(math, mathord, \"\\u03c5\", \"\\\\upsilon\", true);\ndefineSymbol(math, mathord, \"\\u03d5\", \"\\\\phi\", true);\ndefineSymbol(math, mathord, \"\\u03c7\", \"\\\\chi\", true);\ndefineSymbol(math, mathord, \"\\u03c8\", \"\\\\psi\", true);\ndefineSymbol(math, mathord, \"\\u03c9\", \"\\\\omega\", true);\ndefineSymbol(math, mathord, \"\\u03b5\", \"\\\\varepsilon\", true);\ndefineSymbol(math, mathord, \"\\u03d1\", \"\\\\vartheta\", true);\ndefineSymbol(math, mathord, \"\\u03d6\", \"\\\\varpi\", true);\ndefineSymbol(math, mathord, \"\\u03f1\", \"\\\\varrho\", true);\ndefineSymbol(math, mathord, \"\\u03c2\", \"\\\\varsigma\", true);\ndefineSymbol(math, mathord, \"\\u03c6\", \"\\\\varphi\", true);\ndefineSymbol(math, mathord, \"\\u03d8\", \"\\\\Coppa\", true);\ndefineSymbol(math, mathord, \"\\u03d9\", \"\\\\coppa\", true);\ndefineSymbol(math, mathord, \"\\u03d9\", \"\\\\varcoppa\", true);\ndefineSymbol(math, mathord, \"\\u03de\", \"\\\\Koppa\", true);\ndefineSymbol(math, mathord, \"\\u03df\", \"\\\\koppa\", true);\ndefineSymbol(math, mathord, \"\\u03e0\", \"\\\\Sampi\", true);\ndefineSymbol(math, mathord, \"\\u03e1\", \"\\\\sampi\", true);\ndefineSymbol(math, mathord, \"\\u03da\", \"\\\\Stigma\", true);\ndefineSymbol(math, mathord, \"\\u03db\", \"\\\\stigma\", true);\ndefineSymbol(math, mathord, \"\\u2aeb\", \"\\\\Bot\");\ndefineSymbol(math, bin, \"\\u2217\", \"\\u2217\", true);\ndefineSymbol(math, bin, \"+\", \"+\");\ndefineSymbol(math, bin, \"\\u2217\", \"*\");\ndefineSymbol(math, bin, \"\\u2044\", \"/\", true);\ndefineSymbol(math, bin, \"\\u2044\", \"\\u2044\");\ndefineSymbol(math, bin, \"\\u2212\", \"-\", true);\ndefineSymbol(math, bin, \"\\u22c5\", \"\\\\cdot\", true);\ndefineSymbol(math, bin, \"\\u2218\", \"\\\\circ\", true);\ndefineSymbol(math, bin, \"\\u00f7\", \"\\\\div\", true);\ndefineSymbol(math, bin, \"\\u00b1\", \"\\\\pm\", true);\ndefineSymbol(math, bin, \"\\u00d7\", \"\\\\times\", true);\ndefineSymbol(math, bin, \"\\u2229\", \"\\\\cap\", true);\ndefineSymbol(math, bin, \"\\u222a\", \"\\\\cup\", true);\ndefineSymbol(math, bin, \"\\u2216\", \"\\\\setminus\", true);\ndefineSymbol(math, bin, \"\\u2227\", \"\\\\land\");\ndefineSymbol(math, bin, \"\\u2228\", \"\\\\lor\");\ndefineSymbol(math, bin, \"\\u2227\", \"\\\\wedge\", true);\ndefineSymbol(math, bin, \"\\u2228\", \"\\\\vee\", true);\ndefineSymbol(math, open, \"\\u27e6\", \"\\\\llbracket\", true); // stmaryrd/semantic packages\ndefineSymbol(math, close, \"\\u27e7\", \"\\\\rrbracket\", true);\ndefineSymbol(math, open, \"\\u27e8\", \"\\\\langle\", true);\ndefineSymbol(math, open, \"\\u27ea\", \"\\\\lAngle\", true);\ndefineSymbol(math, open, \"\\u2989\", \"\\\\llangle\", true);\ndefineSymbol(math, open, \"|\", \"\\\\lvert\");\ndefineSymbol(math, open, \"\\u2016\", \"\\\\lVert\", true);\ndefineSymbol(math, textord, \"!\", \"\\\\oc\"); // cmll package\ndefineSymbol(math, textord, \"?\", \"\\\\wn\");\ndefineSymbol(math, textord, \"\\u2193\", \"\\\\shpos\");\ndefineSymbol(math, textord, \"\\u2195\", \"\\\\shift\");\ndefineSymbol(math, textord, \"\\u2191\", \"\\\\shneg\");\ndefineSymbol(math, close, \"?\", \"?\");\ndefineSymbol(math, close, \"!\", \"!\");\ndefineSymbol(math, close, \"\u203C\", \"\u203C\");\ndefineSymbol(math, close, \"\\u27e9\", \"\\\\rangle\", true);\ndefineSymbol(math, close, \"\\u27eb\", \"\\\\rAngle\", true);\ndefineSymbol(math, close, \"\\u298a\", \"\\\\rrangle\", true);\ndefineSymbol(math, close, \"|\", \"\\\\rvert\");\ndefineSymbol(math, close, \"\\u2016\", \"\\\\rVert\");\ndefineSymbol(math, open, \"\\u2983\", \"\\\\lBrace\", true); // stmaryrd/semantic packages\ndefineSymbol(math, close, \"\\u2984\", \"\\\\rBrace\", true);\ndefineSymbol(math, rel, \"=\", \"\\\\equal\", true);\ndefineSymbol(math, rel, \":\", \":\");\ndefineSymbol(math, rel, \"\\u2248\", \"\\\\approx\", true);\ndefineSymbol(math, rel, \"\\u2245\", \"\\\\cong\", true);\ndefineSymbol(math, rel, \"\\u2265\", \"\\\\ge\");\ndefineSymbol(math, rel, \"\\u2265\", \"\\\\geq\", true);\ndefineSymbol(math, rel, \"\\u2190\", \"\\\\gets\");\ndefineSymbol(math, rel, \">\", \"\\\\gt\", true);\ndefineSymbol(math, rel, \"\\u2208\", \"\\\\in\", true);\ndefineSymbol(math, rel, \"\\u2209\", \"\\\\notin\", true);\ndefineSymbol(math, rel, \"\\ue020\", \"\\\\@not\");\ndefineSymbol(math, rel, \"\\u2282\", \"\\\\subset\", true);\ndefineSymbol(math, rel, \"\\u2283\", \"\\\\supset\", true);\ndefineSymbol(math, rel, \"\\u2286\", \"\\\\subseteq\", true);\ndefineSymbol(math, rel, \"\\u2287\", \"\\\\supseteq\", true);\ndefineSymbol(math, rel, \"\\u2288\", \"\\\\nsubseteq\", true);\ndefineSymbol(math, rel, \"\\u2288\", \"\\\\nsubseteqq\");\ndefineSymbol(math, rel, \"\\u2289\", \"\\\\nsupseteq\", true);\ndefineSymbol(math, rel, \"\\u2289\", \"\\\\nsupseteqq\");\ndefineSymbol(math, rel, \"\\u22a8\", \"\\\\models\");\ndefineSymbol(math, rel, \"\\u2190\", \"\\\\leftarrow\", true);\ndefineSymbol(math, rel, \"\\u2264\", \"\\\\le\");\ndefineSymbol(math, rel, \"\\u2264\", \"\\\\leq\", true);\ndefineSymbol(math, rel, \"<\", \"\\\\lt\", true);\ndefineSymbol(math, rel, \"\\u2192\", \"\\\\rightarrow\", true);\ndefineSymbol(math, rel, \"\\u2192\", \"\\\\to\");\ndefineSymbol(math, rel, \"\\u2271\", \"\\\\ngeq\", true);\ndefineSymbol(math, rel, \"\\u2271\", \"\\\\ngeqq\");\ndefineSymbol(math, rel, \"\\u2271\", \"\\\\ngeqslant\");\ndefineSymbol(math, rel, \"\\u2270\", \"\\\\nleq\", true);\ndefineSymbol(math, rel, \"\\u2270\", \"\\\\nleqq\");\ndefineSymbol(math, rel, \"\\u2270\", \"\\\\nleqslant\");\ndefineSymbol(math, rel, \"\\u2aeb\", \"\\\\Perp\", true); //cmll package\ndefineSymbol(math, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(math, spacing, \"\\u00a0\", \"\\\\space\");\n// Ref: LaTeX Source 2e: \\DeclareRobustCommand{\\nobreakspace}{%\ndefineSymbol(math, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(text, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(text, spacing, \"\\u00a0\", \" \");\ndefineSymbol(text, spacing, \"\\u00a0\", \"\\\\space\");\ndefineSymbol(text, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(math, spacing, null, \"\\\\nobreak\");\ndefineSymbol(math, spacing, null, \"\\\\allowbreak\");\ndefineSymbol(math, punct, \",\", \",\");\ndefineSymbol(text, punct, \":\", \":\");\ndefineSymbol(math, punct, \";\", \";\");\ndefineSymbol(math, bin, \"\\u22bc\", \"\\\\barwedge\");\ndefineSymbol(math, bin, \"\\u22bb\", \"\\\\veebar\");\ndefineSymbol(math, bin, \"\\u2299\", \"\\\\odot\", true);\n// Firefox turns \u2295 into an emoji. So append \\uFE0E. Define Unicode character in macros, not here.\ndefineSymbol(math, bin, \"\\u2295\\uFE0E\", \"\\\\oplus\");\ndefineSymbol(math, bin, \"\\u2297\", \"\\\\otimes\", true);\ndefineSymbol(math, textord, \"\\u2202\", \"\\\\partial\", true);\ndefineSymbol(math, bin, \"\\u2298\", \"\\\\oslash\", true);\ndefineSymbol(math, bin, \"\\u229a\", \"\\\\circledcirc\", true);\ndefineSymbol(math, bin, \"\\u22a1\", \"\\\\boxdot\", true);\ndefineSymbol(math, bin, \"\\u25b3\", \"\\\\bigtriangleup\");\ndefineSymbol(math, bin, \"\\u25bd\", \"\\\\bigtriangledown\");\ndefineSymbol(math, bin, \"\\u2020\", \"\\\\dagger\");\ndefineSymbol(math, bin, \"\\u22c4\", \"\\\\diamond\");\ndefineSymbol(math, bin, \"\\u25c3\", \"\\\\triangleleft\");\ndefineSymbol(math, bin, \"\\u25b9\", \"\\\\triangleright\");\ndefineSymbol(math, open, \"{\", \"\\\\{\");\ndefineSymbol(text, textord, \"{\", \"\\\\{\");\ndefineSymbol(text, textord, \"{\", \"\\\\textbraceleft\");\ndefineSymbol(math, close, \"}\", \"\\\\}\");\ndefineSymbol(text, textord, \"}\", \"\\\\}\");\ndefineSymbol(text, textord, \"}\", \"\\\\textbraceright\");\ndefineSymbol(math, open, \"{\", \"\\\\lbrace\");\ndefineSymbol(math, close, \"}\", \"\\\\rbrace\");\ndefineSymbol(math, open, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(text, textord, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(math, close, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(text, textord, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(math, open, \"(\", \"\\\\lparen\", true);\ndefineSymbol(math, close, \")\", \"\\\\rparen\", true);\ndefineSymbol(math, open, \"\u2987\", \"\\\\llparenthesis\", true);\ndefineSymbol(math, close, \"\u2988\", \"\\\\rrparenthesis\", true);\ndefineSymbol(text, textord, \"<\", \"\\\\textless\", true); // in T1 fontenc\ndefineSymbol(text, textord, \">\", \"\\\\textgreater\", true); // in T1 fontenc\ndefineSymbol(math, open, \"\\u230a\", \"\\\\lfloor\", true);\ndefineSymbol(math, close, \"\\u230b\", \"\\\\rfloor\", true);\ndefineSymbol(math, open, \"\\u2308\", \"\\\\lceil\", true);\ndefineSymbol(math, close, \"\\u2309\", \"\\\\rceil\", true);\ndefineSymbol(math, textord, \"\\\\\", \"\\\\backslash\");\ndefineSymbol(math, textord, \"|\", \"|\");\ndefineSymbol(math, textord, \"|\", \"\\\\vert\");\ndefineSymbol(text, textord, \"|\", \"\\\\textbar\", true); // in T1 fontenc\ndefineSymbol(math, textord, \"\\u2016\", \"\\\\|\");\ndefineSymbol(math, textord, \"\\u2016\", \"\\\\Vert\");\ndefineSymbol(text, textord, \"\\u2016\", \"\\\\textbardbl\");\ndefineSymbol(text, textord, \"~\", \"\\\\textasciitilde\");\ndefineSymbol(text, textord, \"\\\\\", \"\\\\textbackslash\");\ndefineSymbol(text, textord, \"^\", \"\\\\textasciicircum\");\ndefineSymbol(math, rel, \"\\u2191\", \"\\\\uparrow\", true);\ndefineSymbol(math, rel, \"\\u21d1\", \"\\\\Uparrow\", true);\ndefineSymbol(math, rel, \"\\u2193\", \"\\\\downarrow\", true);\ndefineSymbol(math, rel, \"\\u21d3\", \"\\\\Downarrow\", true);\ndefineSymbol(math, rel, \"\\u2195\", \"\\\\updownarrow\", true);\ndefineSymbol(math, rel, \"\\u21d5\", \"\\\\Updownarrow\", true);\ndefineSymbol(math, op, \"\\u2210\", \"\\\\coprod\");\ndefineSymbol(math, op, \"\\u22c1\", \"\\\\bigvee\");\ndefineSymbol(math, op, \"\\u22c0\", \"\\\\bigwedge\");\ndefineSymbol(math, op, \"\\u2a04\", \"\\\\biguplus\");\ndefineSymbol(math, op, \"\\u2a04\", \"\\\\bigcupplus\");\ndefineSymbol(math, op, \"\\u2a03\", \"\\\\bigcupdot\");\ndefineSymbol(math, op, \"\\u2a07\", \"\\\\bigdoublevee\");\ndefineSymbol(math, op, \"\\u2a08\", \"\\\\bigdoublewedge\");\ndefineSymbol(math, op, \"\\u22c2\", \"\\\\bigcap\");\ndefineSymbol(math, op, \"\\u22c3\", \"\\\\bigcup\");\ndefineSymbol(math, op, \"\\u222b\", \"\\\\int\");\ndefineSymbol(math, op, \"\\u222b\", \"\\\\intop\");\ndefineSymbol(math, op, \"\\u222c\", \"\\\\iint\");\ndefineSymbol(math, op, \"\\u222d\", \"\\\\iiint\");\ndefineSymbol(math, op, \"\\u220f\", \"\\\\prod\");\ndefineSymbol(math, op, \"\\u2211\", \"\\\\sum\");\ndefineSymbol(math, op, \"\\u2a02\", \"\\\\bigotimes\");\ndefineSymbol(math, op, \"\\u2a01\", \"\\\\bigoplus\");\ndefineSymbol(math, op, \"\\u2a00\", \"\\\\bigodot\");\ndefineSymbol(math, op, \"\\u2a09\", \"\\\\bigtimes\");\ndefineSymbol(math, op, \"\\u222e\", \"\\\\oint\");\ndefineSymbol(math, op, \"\\u222f\", \"\\\\oiint\");\ndefineSymbol(math, op, \"\\u2230\", \"\\\\oiiint\");\ndefineSymbol(math, op, \"\\u2231\", \"\\\\intclockwise\");\ndefineSymbol(math, op, \"\\u2232\", \"\\\\varointclockwise\");\ndefineSymbol(math, op, \"\\u2a0c\", \"\\\\iiiint\");\ndefineSymbol(math, op, \"\\u2a0d\", \"\\\\intbar\");\ndefineSymbol(math, op, \"\\u2a0e\", \"\\\\intBar\");\ndefineSymbol(math, op, \"\\u2a0f\", \"\\\\fint\");\ndefineSymbol(math, op, \"\\u2a12\", \"\\\\rppolint\");\ndefineSymbol(math, op, \"\\u2a13\", \"\\\\scpolint\");\ndefineSymbol(math, op, \"\\u2a15\", \"\\\\pointint\");\ndefineSymbol(math, op, \"\\u2a16\", \"\\\\sqint\");\ndefineSymbol(math, op, \"\\u2a17\", \"\\\\intlarhk\");\ndefineSymbol(math, op, \"\\u2a18\", \"\\\\intx\");\ndefineSymbol(math, op, \"\\u2a19\", \"\\\\intcap\");\ndefineSymbol(math, op, \"\\u2a1a\", \"\\\\intcup\");\ndefineSymbol(math, op, \"\\u2a05\", \"\\\\bigsqcap\");\ndefineSymbol(math, op, \"\\u2a06\", \"\\\\bigsqcup\");\ndefineSymbol(math, op, \"\\u222b\", \"\\\\smallint\");\ndefineSymbol(text, inner, \"\\u2026\", \"\\\\textellipsis\");\ndefineSymbol(math, inner, \"\\u2026\", \"\\\\mathellipsis\");\ndefineSymbol(text, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, inner, \"\\u22f0\", \"\\\\iddots\", true);\ndefineSymbol(math, inner, \"\\u22ef\", \"\\\\@cdots\", true);\ndefineSymbol(math, inner, \"\\u22f1\", \"\\\\ddots\", true);\ndefineSymbol(math, textord, \"\\u22ee\", \"\\\\varvdots\"); // \\vdots is a macro\ndefineSymbol(text, textord, \"\\u22ee\", \"\\\\varvdots\");\ndefineSymbol(math, accent, \"\\u02ca\", \"\\\\acute\");\ndefineSymbol(math, accent, \"\\u0060\", \"\\\\grave\");\ndefineSymbol(math, accent, \"\\u00a8\", \"\\\\ddot\");\ndefineSymbol(math, accent, \"\\u2026\", \"\\\\dddot\");\ndefineSymbol(math, accent, \"\\u2026\\u002e\", \"\\\\ddddot\");\ndefineSymbol(math, accent, \"\\u007e\", \"\\\\tilde\");\ndefineSymbol(math, accent, \"\\u203e\", \"\\\\bar\");\ndefineSymbol(math, accent, \"\\u02d8\", \"\\\\breve\");\ndefineSymbol(math, accent, \"\\u02c7\", \"\\\\check\");\ndefineSymbol(math, accent, \"\\u005e\", \"\\\\hat\");\ndefineSymbol(math, accent, \"\\u2192\", \"\\\\vec\");\ndefineSymbol(math, accent, \"\\u02d9\", \"\\\\dot\");\ndefineSymbol(math, accent, \"\\u02da\", \"\\\\mathring\");\ndefineSymbol(math, mathord, \"\\u0131\", \"\\\\imath\", true);\ndefineSymbol(math, mathord, \"\\u0237\", \"\\\\jmath\", true);\ndefineSymbol(math, textord, \"\\u0131\", \"\\u0131\");\ndefineSymbol(math, textord, \"\\u0237\", \"\\u0237\");\ndefineSymbol(text, textord, \"\\u0131\", \"\\\\i\", true);\ndefineSymbol(text, textord, \"\\u0237\", \"\\\\j\", true);\ndefineSymbol(text, textord, \"\\u00df\", \"\\\\ss\", true);\ndefineSymbol(text, textord, \"\\u00e6\", \"\\\\ae\", true);\ndefineSymbol(text, textord, \"\\u0153\", \"\\\\oe\", true);\ndefineSymbol(text, textord, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(math, mathord, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(text, textord, \"\\u00c6\", \"\\\\AE\", true);\ndefineSymbol(text, textord, \"\\u0152\", \"\\\\OE\", true);\ndefineSymbol(text, textord, \"\\u00d8\", \"\\\\O\", true);\ndefineSymbol(math, mathord, \"\\u00d8\", \"\\\\O\", true);\ndefineSymbol(text, accent, \"\\u02ca\", \"\\\\'\"); // acute\ndefineSymbol(text, accent, \"\\u02cb\", \"\\\\`\"); // grave\ndefineSymbol(text, accent, \"\\u02c6\", \"\\\\^\"); // circumflex\ndefineSymbol(text, accent, \"\\u02dc\", \"\\\\~\"); // tilde\ndefineSymbol(text, accent, \"\\u02c9\", \"\\\\=\"); // macron\ndefineSymbol(text, accent, \"\\u02d8\", \"\\\\u\"); // breve\ndefineSymbol(text, accent, \"\\u02d9\", \"\\\\.\"); // dot above\ndefineSymbol(text, accent, \"\\u00b8\", \"\\\\c\"); // cedilla\ndefineSymbol(text, accent, \"\\u02da\", \"\\\\r\"); // ring above\ndefineSymbol(text, accent, \"\\u02c7\", \"\\\\v\"); // caron\ndefineSymbol(text, accent, \"\\u00a8\", '\\\\\"'); // diaresis\ndefineSymbol(text, accent, \"\\u02dd\", \"\\\\H\"); // double acute\ndefineSymbol(math, accent, \"\\u02ca\", \"\\\\'\"); // acute\ndefineSymbol(math, accent, \"\\u02cb\", \"\\\\`\"); // grave\ndefineSymbol(math, accent, \"\\u02c6\", \"\\\\^\"); // circumflex\ndefineSymbol(math, accent, \"\\u02dc\", \"\\\\~\"); // tilde\ndefineSymbol(math, accent, \"\\u02c9\", \"\\\\=\"); // macron\ndefineSymbol(math, accent, \"\\u02d8\", \"\\\\u\"); // breve\ndefineSymbol(math, accent, \"\\u02d9\", \"\\\\.\"); // dot above\ndefineSymbol(math, accent, \"\\u00b8\", \"\\\\c\"); // cedilla\ndefineSymbol(math, accent, \"\\u02da\", \"\\\\r\"); // ring above\ndefineSymbol(math, accent, \"\\u02c7\", \"\\\\v\"); // caron\ndefineSymbol(math, accent, \"\\u00a8\", '\\\\\"'); // diaresis\ndefineSymbol(math, accent, \"\\u02dd\", \"\\\\H\"); // double acute\n\n// These ligatures are detected and created in Parser.js's `formLigatures`.\nconst ligatures = {\n \"--\": true,\n \"---\": true,\n \"``\": true,\n \"''\": true\n};\n\ndefineSymbol(text, textord, \"\\u2013\", \"--\", true);\ndefineSymbol(text, textord, \"\\u2013\", \"\\\\textendash\");\ndefineSymbol(text, textord, \"\\u2014\", \"---\", true);\ndefineSymbol(text, textord, \"\\u2014\", \"\\\\textemdash\");\ndefineSymbol(text, textord, \"\\u2018\", \"`\", true);\ndefineSymbol(text, textord, \"\\u2018\", \"\\\\textquoteleft\");\ndefineSymbol(text, textord, \"\\u2019\", \"'\", true);\ndefineSymbol(text, textord, \"\\u2019\", \"\\\\textquoteright\");\ndefineSymbol(text, textord, \"\\u201c\", \"``\", true);\ndefineSymbol(text, textord, \"\\u201c\", \"\\\\textquotedblleft\");\ndefineSymbol(text, textord, \"\\u201d\", \"''\", true);\ndefineSymbol(text, textord, \"\\u201d\", \"\\\\textquotedblright\");\n// \\degree from gensymb package\ndefineSymbol(math, textord, \"\\u00b0\", \"\\\\degree\", true);\ndefineSymbol(text, textord, \"\\u00b0\", \"\\\\degree\");\n// \\textdegree from inputenc package\ndefineSymbol(text, textord, \"\\u00b0\", \"\\\\textdegree\", true);\n// TODO: In LaTeX, \\pounds can generate a different character in text and math\n// mode, but among our fonts, only Main-Regular defines this character \"163\".\ndefineSymbol(math, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(math, textord, \"\\u00a3\", \"\\\\mathsterling\", true);\ndefineSymbol(text, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(text, textord, \"\\u00a3\", \"\\\\textsterling\", true);\ndefineSymbol(math, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(text, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(math, textord, \"\\u20ac\", \"\\\\euro\", true);\ndefineSymbol(text, textord, \"\\u20ac\", \"\\\\euro\", true);\ndefineSymbol(text, textord, \"\\u20ac\", \"\\\\texteuro\");\ndefineSymbol(math, textord, \"\\u00a9\", \"\\\\copyright\", true);\ndefineSymbol(text, textord, \"\\u00a9\", \"\\\\textcopyright\");\ndefineSymbol(math, textord, \"\\u2300\", \"\\\\diameter\", true);\ndefineSymbol(text, textord, \"\\u2300\", \"\\\\diameter\");\n\n// Italic Greek\ndefineSymbol(math, textord, \"\uD835\uDEE4\", \"\\\\varGamma\");\ndefineSymbol(math, textord, \"\uD835\uDEE5\", \"\\\\varDelta\");\ndefineSymbol(math, textord, \"\uD835\uDEE9\", \"\\\\varTheta\");\ndefineSymbol(math, textord, \"\uD835\uDEEC\", \"\\\\varLambda\");\ndefineSymbol(math, textord, \"\uD835\uDEEF\", \"\\\\varXi\");\ndefineSymbol(math, textord, \"\uD835\uDEF1\", \"\\\\varPi\");\ndefineSymbol(math, textord, \"\uD835\uDEF4\", \"\\\\varSigma\");\ndefineSymbol(math, textord, \"\uD835\uDEF6\", \"\\\\varUpsilon\");\ndefineSymbol(math, textord, \"\uD835\uDEF7\", \"\\\\varPhi\");\ndefineSymbol(math, textord, \"\uD835\uDEF9\", \"\\\\varPsi\");\ndefineSymbol(math, textord, \"\uD835\uDEFA\", \"\\\\varOmega\");\ndefineSymbol(text, textord, \"\uD835\uDEE4\", \"\\\\varGamma\");\ndefineSymbol(text, textord, \"\uD835\uDEE5\", \"\\\\varDelta\");\ndefineSymbol(text, textord, \"\uD835\uDEE9\", \"\\\\varTheta\");\ndefineSymbol(text, textord, \"\uD835\uDEEC\", \"\\\\varLambda\");\ndefineSymbol(text, textord, \"\uD835\uDEEF\", \"\\\\varXi\");\ndefineSymbol(text, textord, \"\uD835\uDEF1\", \"\\\\varPi\");\ndefineSymbol(text, textord, \"\uD835\uDEF4\", \"\\\\varSigma\");\ndefineSymbol(text, textord, \"\uD835\uDEF6\", \"\\\\varUpsilon\");\ndefineSymbol(text, textord, \"\uD835\uDEF7\", \"\\\\varPhi\");\ndefineSymbol(text, textord, \"\uD835\uDEF9\", \"\\\\varPsi\");\ndefineSymbol(text, textord, \"\uD835\uDEFA\", \"\\\\varOmega\");\n\n\n// There are lots of symbols which are the same, so we add them in afterwards.\n// All of these are textords in math mode\nconst mathTextSymbols = '0123456789/@.\"';\nfor (let i = 0; i < mathTextSymbols.length; i++) {\n const ch = mathTextSymbols.charAt(i);\n defineSymbol(math, textord, ch, ch);\n}\n\n// All of these are textords in text mode\nconst textSymbols = '0123456789!@*()-=+\";:?/.,';\nfor (let i = 0; i < textSymbols.length; i++) {\n const ch = textSymbols.charAt(i);\n defineSymbol(text, textord, ch, ch);\n}\n\n// All of these are textords in text mode, and mathords in math mode\nconst letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nfor (let i = 0; i < letters.length; i++) {\n const ch = letters.charAt(i);\n defineSymbol(math, mathord, ch, ch);\n defineSymbol(text, textord, ch, ch);\n}\n\n// Some more letters in Unicode Basic Multilingual Plane.\nconst narrow = \"\u00C7\u00D0\u00DE\u00E7\u00FE\u2102\u210D\u2115\u2119\u211A\u211D\u2124\u210E\u210F\u210A\u210B\u210C\u2110\u2111\u2112\u2113\u2118\u211B\u211C\u212C\u2130\u2131\u2133\u212D\u2128\";\nfor (let i = 0; i < narrow.length; i++) {\n const ch = narrow.charAt(i);\n defineSymbol(math, mathord, ch, ch);\n defineSymbol(text, textord, ch, ch);\n}\n\n// The next loop loads wide (surrogate pair) characters.\n// We support some letters in the Unicode range U+1D400 to U+1D7FF,\n// Mathematical Alphanumeric Symbols.\nlet wideChar = \"\";\nfor (let i = 0; i < letters.length; i++) {\n // The hex numbers in the next line are a surrogate pair.\n // 0xD835 is the high surrogate for all letters in the range we support.\n // 0xDC00 is the low surrogate for bold A.\n wideChar = String.fromCharCode(0xd835, 0xdc00 + i); // A-Z a-z bold\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdc34 + i); // A-Z a-z italic\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdc68 + i); // A-Z a-z bold italic\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdd04 + i); // A-Z a-z Fractur\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdda0 + i); // A-Z a-z sans-serif\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xddd4 + i); // A-Z a-z sans bold\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xde08 + i); // A-Z a-z sans italic\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xde70 + i); // A-Z a-z monospace\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdd38 + i); // A-Z a-z double struck\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n const ch = letters.charAt(i);\n wideChar = String.fromCharCode(0xd835, 0xdc9c + i); // A-Z a-z calligraphic\n defineSymbol(math, mathord, ch, wideChar);\n defineSymbol(text, textord, ch, wideChar);\n}\n\n// Next, some wide character numerals\nfor (let i = 0; i < 10; i++) {\n wideChar = String.fromCharCode(0xd835, 0xdfce + i); // 0-9 bold\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdfe2 + i); // 0-9 sans serif\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdfec + i); // 0-9 bold sans\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdff6 + i); // 0-9 monospace\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n}\n\n/*\n * Neither Firefox nor Chrome support hard line breaks or soft line breaks.\n * (Despite https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs)\n * So Temml has work-arounds for both hard and soft breaks.\n * The work-arounds sadly do not work simultaneously. Any top-level hard\n * break makes soft line breaks impossible.\n *\n * Hard breaks are simulated by creating a <mtable> and putting each line in its own <mtr>.\n *\n * To create soft line breaks, Temml avoids using the <semantics> and <annotation> tags.\n * Then the top level of a <math> element can be occupied by <mrow> elements, and the browser\n * will break after a <mrow> if the expression extends beyond the container limit.\n *\n * The default is for soft line breaks after each top-level binary or\n * relational operator, per TeXbook p. 173. So we gather the expression into <mrow>s so that\n * each <mrow> ends in a binary or relational operator.\n *\n * An option is for soft line breaks before an \"=\" sign. That changes the <mrow>s.\n *\n * Soft line breaks will not work in Chromium and Safari, only Firefox.\n *\n * Hopefully browsers will someday do their own linebreaking and we will be able to delete\n * much of this module.\n */\n\nconst openDelims = \"([{\u230A\u2308\u27E8\u27EE\u23B0\u27E6\u2983\";\nconst closeDelims = \")]}\u230B\u2309\u27E9\u27EF\u23B1\u27E6\u2984\";\n\nfunction setLineBreaks(expression, wrapMode, isDisplayMode) {\n const mtrs = [];\n let mrows = [];\n let block = [];\n let numTopLevelEquals = 0;\n let i = 0;\n let level = 0;\n while (i < expression.length) {\n while (expression[i] instanceof DocumentFragment) {\n expression.splice(i, 1, ...expression[i].children); // Expand the fragment.\n }\n const node = expression[i];\n if (node.attributes && node.attributes.linebreak &&\n node.attributes.linebreak === \"newline\") {\n // A hard line break. Create a <mtr> for the current block.\n if (block.length > 0) {\n mrows.push(new mathMLTree.MathNode(\"mrow\", block));\n }\n mrows.push(node);\n block = [];\n const mtd = new mathMLTree.MathNode(\"mtd\", mrows);\n mtd.style.textAlign = \"left\";\n mtrs.push(new mathMLTree.MathNode(\"mtr\", [mtd]));\n mrows = [];\n i += 1;\n continue\n }\n block.push(node);\n if (node.type && node.type === \"mo\" && node.children.length === 1 &&\n !Object.hasOwn(node.attributes, \"movablelimits\")) {\n const ch = node.children[0].text;\n if (openDelims.indexOf(ch) > -1) {\n level += 1;\n } else if (closeDelims.indexOf(ch) > -1) {\n level -= 1;\n } else if (level === 0 && wrapMode === \"=\" && ch === \"=\") {\n numTopLevelEquals += 1;\n if (numTopLevelEquals > 1) {\n block.pop();\n // Start a new block. (Insert a soft linebreak.)\n const element = new mathMLTree.MathNode(\"mrow\", block);\n mrows.push(element);\n block = [node];\n }\n } else if (level === 0 && wrapMode === \"tex\" && ch !== \"\u2207\") {\n // Check if the following node is a \\nobreak text node, e.g. \"~\"\"\n const next = i < expression.length - 1 ? expression[i + 1] : null;\n let glueIsFreeOfNobreak = true;\n if (\n !(\n next &&\n next.type === \"mtext\" &&\n next.attributes.linebreak &&\n next.attributes.linebreak === \"nobreak\"\n )\n ) {\n // We may need to start a new block.\n // First, put any post-operator glue on same line as operator.\n for (let j = i + 1; j < expression.length; j++) {\n const nd = expression[j];\n if (\n nd.type &&\n nd.type === \"mspace\" &&\n !(nd.attributes.linebreak && nd.attributes.linebreak === \"newline\")\n ) {\n block.push(nd);\n i += 1;\n if (\n nd.attributes &&\n nd.attributes.linebreak &&\n nd.attributes.linebreak === \"nobreak\"\n ) {\n glueIsFreeOfNobreak = false;\n }\n } else {\n break;\n }\n }\n }\n if (glueIsFreeOfNobreak) {\n // Start a new block. (Insert a soft linebreak.)\n const element = new mathMLTree.MathNode(\"mrow\", block);\n mrows.push(element);\n block = [];\n }\n }\n }\n i += 1;\n }\n if (block.length > 0) {\n const element = new mathMLTree.MathNode(\"mrow\", block);\n mrows.push(element);\n }\n if (mtrs.length > 0) {\n const mtd = new mathMLTree.MathNode(\"mtd\", mrows);\n mtd.style.textAlign = \"left\";\n const mtr = new mathMLTree.MathNode(\"mtr\", [mtd]);\n mtrs.push(mtr);\n const mtable = new mathMLTree.MathNode(\"mtable\", mtrs);\n if (!isDisplayMode) {\n mtable.setAttribute(\"columnalign\", \"left\");\n mtable.setAttribute(\"rowspacing\", \"0em\");\n }\n return mtable\n }\n return mathMLTree.newDocumentFragment(mrows);\n}\n\n/**\n * This file converts a parse tree into a corresponding MathML tree. The main\n * entry point is the `buildMathML` function, which takes a parse tree from the\n * parser.\n */\n\n\n/**\n * Takes a symbol and converts it into a MathML text node after performing\n * optional replacement from symbols.js.\n */\nconst makeText = function(text, mode, style) {\n if (\n symbols[mode][text] &&\n symbols[mode][text].replace &&\n text.charCodeAt(0) !== 0xd835 &&\n !(\n Object.prototype.hasOwnProperty.call(ligatures, text) &&\n style &&\n ((style.fontFamily && style.fontFamily.slice(4, 6) === \"tt\") ||\n (style.font && style.font.slice(4, 6) === \"tt\"))\n )\n ) {\n text = symbols[mode][text].replace;\n }\n\n return new mathMLTree.TextNode(text);\n};\n\nconst copyChar = (newRow, child) => {\n if (newRow.children.length === 0 ||\n newRow.children[newRow.children.length - 1].type !== \"mtext\") {\n const mtext = new mathMLTree.MathNode(\n \"mtext\",\n [new mathMLTree.TextNode(child.children[0].text)]\n );\n newRow.children.push(mtext);\n } else {\n newRow.children[newRow.children.length - 1].children[0].text += child.children[0].text;\n }\n};\n\nconst consolidateText = mrow => {\n // If possible, consolidate adjacent <mtext> elements into a single element.\n if (mrow.type !== \"mrow\" && mrow.type !== \"mstyle\") { return mrow }\n if (mrow.children.length === 0) { return mrow } // empty group, e.g., \\text{}\n const newRow = new mathMLTree.MathNode(\"mrow\");\n for (let i = 0; i < mrow.children.length; i++) {\n const child = mrow.children[i];\n if (child.type === \"mtext\" && Object.keys(child.attributes).length === 0) {\n copyChar(newRow, child);\n } else if (child.type === \"mrow\") {\n // We'll also check the children of an mrow. One level only. No recursion.\n let canConsolidate = true;\n for (let j = 0; j < child.children.length; j++) {\n const grandChild = child.children[j];\n if (grandChild.type !== \"mtext\" || Object.keys(child.attributes).length !== 0) {\n canConsolidate = false;\n break\n }\n }\n if (canConsolidate) {\n for (let j = 0; j < child.children.length; j++) {\n const grandChild = child.children[j];\n copyChar(newRow, grandChild);\n }\n } else {\n newRow.children.push(child);\n }\n } else {\n newRow.children.push(child);\n }\n }\n for (let i = 0; i < newRow.children.length; i++) {\n if (newRow.children[i].type === \"mtext\") {\n const mtext = newRow.children[i];\n // Firefox does not render a space at either end of an <mtext> string.\n // To get proper rendering, we replace leading or trailing spaces with no-break spaces.\n if (mtext.children[0].text.charAt(0) === \" \") {\n mtext.children[0].text = \"\\u00a0\" + mtext.children[0].text.slice(1);\n }\n const L = mtext.children[0].text.length;\n if (L > 0 && mtext.children[0].text.charAt(L - 1) === \" \") {\n mtext.children[0].text = mtext.children[0].text.slice(0, -1) + \"\\u00a0\";\n }\n for (const [key, value] of Object.entries(mrow.attributes)) {\n mtext.attributes[key] = value;\n }\n }\n }\n if (newRow.children.length === 1 && newRow.children[0].type === \"mtext\") {\n return newRow.children[0]; // A consolidated <mtext>\n } else {\n return newRow\n }\n};\n\n/**\n * Wrap the given array of nodes in an <mrow> node if needed, i.e.,\n * unless the array has length 1. Always returns a single node.\n */\nconst makeRow = function(body, semisimple = false) {\n if (body.length === 1 && !(body[0] instanceof DocumentFragment)) {\n return body[0];\n } else if (!semisimple) {\n // Suppress spacing on <mo> nodes at both ends of the row.\n if (body[0] instanceof MathNode && body[0].type === \"mo\" && !body[0].attributes.fence) {\n body[0].attributes.lspace = \"0em\";\n body[0].attributes.rspace = \"0em\";\n }\n const end = body.length - 1;\n if (body[end] instanceof MathNode && body[end].type === \"mo\" && !body[end].attributes.fence) {\n body[end].attributes.lspace = \"0em\";\n body[end].attributes.rspace = \"0em\";\n }\n }\n return new mathMLTree.MathNode(\"mrow\", body);\n};\n\n/**\n * Check for <mi>.</mi> which is how a dot renders in MathML,\n * or <mo separator=\"true\" lspace=\"0em\" rspace=\"0em\">,</mo>\n * which is how a braced comma {,} renders in MathML\n */\nfunction isNumberPunctuation(group) {\n if (!group) {\n return false\n }\n if (group.type === 'mi' && group.children.length === 1) {\n const child = group.children[0];\n return child instanceof TextNode && child.text === '.'\n } else if (group.type === \"mtext\" && group.children.length === 1) {\n const child = group.children[0];\n return child instanceof TextNode && child.text === '\\u2008' // punctuation space\n } else if (group.type === 'mo' && group.children.length === 1 &&\n group.getAttribute('separator') === 'true' &&\n group.getAttribute('lspace') === '0em' &&\n group.getAttribute('rspace') === '0em') {\n const child = group.children[0];\n return child instanceof TextNode && child.text === ','\n } else {\n return false\n }\n}\nconst isComma = (expression, i) => {\n const node = expression[i];\n const followingNode = expression[i + 1];\n return (node.type === \"atom\" && node.text === \",\") &&\n // Don't consolidate if there is a space after the comma.\n node.loc && followingNode.loc && node.loc.end === followingNode.loc.start\n};\n\nconst isRel = item => {\n return (item.type === \"atom\" && item.family === \"rel\") ||\n (item.type === \"mclass\" && item.mclass === \"mrel\")\n};\n\n/**\n * Takes a list of nodes, builds them, and returns a list of the generated\n * MathML nodes. Also do a couple chores along the way:\n * (1) Suppress spacing when an author wraps an operator w/braces, as in {=}.\n * (2) Suppress spacing between two adjacent relations.\n */\nconst buildExpression = function(expression, style, semisimple = false) {\n if (!semisimple && expression.length === 1) {\n const group = buildGroup$1(expression[0], style);\n if (group instanceof MathNode && group.type === \"mo\") {\n // When TeX writers want to suppress spacing on an operator,\n // they often put the operator by itself inside braces.\n group.setAttribute(\"lspace\", \"0em\");\n group.setAttribute(\"rspace\", \"0em\");\n }\n return [group];\n }\n\n const groups = [];\n const groupArray = [];\n let lastGroup;\n for (let i = 0; i < expression.length; i++) {\n groupArray.push(buildGroup$1(expression[i], style));\n }\n\n for (let i = 0; i < groupArray.length; i++) {\n const group = groupArray[i];\n\n // Suppress spacing between adjacent relations\n if (i < expression.length - 1 && isRel(expression[i]) && isRel(expression[i + 1])) {\n group.setAttribute(\"rspace\", \"0em\");\n }\n if (i > 0 && isRel(expression[i]) && isRel(expression[i - 1])) {\n group.setAttribute(\"lspace\", \"0em\");\n }\n\n // Concatenate numbers\n if (group.type === 'mn' && lastGroup && lastGroup.type === 'mn') {\n // Concatenate <mn>...</mn> followed by <mi>.</mi>\n lastGroup.children.push(...group.children);\n continue\n } else if (isNumberPunctuation(group) && lastGroup && lastGroup.type === 'mn') {\n // Concatenate <mn>...</mn> followed by <mi>.</mi>\n lastGroup.children.push(...group.children);\n continue\n } else if (lastGroup && lastGroup.type === \"mn\" && i < groupArray.length - 1 &&\n groupArray[i + 1].type === \"mn\" && isComma(expression, i)) {\n lastGroup.children.push(...group.children);\n continue\n } else if (group.type === 'mn' && isNumberPunctuation(lastGroup)) {\n // Concatenate <mi>.</mi> followed by <mn>...</mn>\n group.children = [...lastGroup.children, ...group.children];\n groups.pop();\n } else if ((group.type === 'msup' || group.type === 'msub') &&\n group.children.length >= 1 && lastGroup &&\n (lastGroup.type === 'mn' || isNumberPunctuation(lastGroup))) {\n // Put preceding <mn>...</mn> or <mi>.</mi> inside base of\n // <msup><mn>...base...</mn>...exponent...</msup> (or <msub>)\n const base = group.children[0];\n if (base instanceof MathNode && base.type === 'mn' && lastGroup) {\n base.children = [...lastGroup.children, ...base.children];\n groups.pop();\n }\n }\n groups.push(group);\n lastGroup = group;\n }\n return groups\n};\n\n/**\n * Equivalent to buildExpression, but wraps the elements in an <mrow>\n * if there's more than one. Returns a single node instead of an array.\n */\nconst buildExpressionRow = function(expression, style, semisimple = false) {\n return makeRow(buildExpression(expression, style, semisimple), semisimple);\n};\n\n/**\n * Takes a group from the parser and calls the appropriate groupBuilders function\n * on it to produce a MathML node.\n */\nconst buildGroup$1 = function(group, style) {\n if (!group) {\n return new mathMLTree.MathNode(\"mrow\");\n }\n\n if (_mathmlGroupBuilders[group.type]) {\n // Call the groupBuilders function\n const result = _mathmlGroupBuilders[group.type](group, style);\n return result;\n } else {\n throw new ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n }\n};\n\nconst glue$1 = _ => {\n return new mathMLTree.MathNode(\"mtd\", [], [], { padding: \"0\", width: \"50%\" })\n};\n\nconst labelContainers = [\"mrow\", \"mtd\", \"mtable\", \"mtr\"];\nconst getLabel = parent => {\n for (const node of parent.children) {\n if (node.type && labelContainers.includes(node.type)) {\n if (node.classes && node.classes[0] === \"tml-label\") {\n const label = node.label;\n return label\n } else {\n const label = getLabel(node);\n if (label) { return label }\n }\n } else if (!node.type) {\n const label = getLabel(node);\n if (label) { return label }\n }\n }\n};\n\nconst taggedExpression = (expression, tag, style, leqno) => {\n tag = buildExpressionRow(tag[0].body, style);\n tag = consolidateText(tag);\n tag.classes.push(\"tml-tag\");\n\n const label = getLabel(expression); // from a \\label{} function.\n expression = new mathMLTree.MathNode(\"mtd\", [expression]);\n const rowArray = [glue$1(), expression, glue$1()];\n rowArray[leqno ? 0 : 2].classes.push(leqno ? \"tml-left\" : \"tml-right\");\n rowArray[leqno ? 0 : 2].children.push(tag);\n const mtr = new mathMLTree.MathNode(\"mtr\", rowArray, [\"tml-tageqn\"]);\n if (label) { mtr.setAttribute(\"id\", label); }\n const table = new mathMLTree.MathNode(\"mtable\", [mtr]);\n table.style.width = \"100%\";\n table.setAttribute(\"displaystyle\", \"true\");\n return table\n};\n\n/**\n * Takes a full parse tree and settings and builds a MathML representation of\n * it.\n */\nfunction buildMathML(tree, texExpression, style, settings) {\n // Strip off outer tag wrapper for processing below.\n let tag = null;\n if (tree.length === 1 && tree[0].type === \"tag\") {\n tag = tree[0].tag;\n tree = tree[0].body;\n }\n\n const expression = buildExpression(tree, style);\n\n if (expression.length === 1 && expression[0] instanceof AnchorNode) {\n return expression[0]\n }\n\n const wrap = (settings.displayMode || settings.annotate) ? \"none\" : settings.wrap;\n\n const n1 = expression.length === 0 ? null : expression[0];\n let wrapper = expression.length === 1 && tag === null && (n1 instanceof MathNode)\n ? expression[0]\n : setLineBreaks(expression, wrap, settings.displayMode);\n\n if (tag) {\n wrapper = taggedExpression(wrapper, tag, style, settings.leqno);\n }\n\n if (settings.annotate) {\n // Build a TeX annotation of the source\n const annotation = new mathMLTree.MathNode(\n \"annotation\", [new mathMLTree.TextNode(texExpression)]);\n annotation.setAttribute(\"encoding\", \"application/x-tex\");\n wrapper = new mathMLTree.MathNode(\"semantics\", [wrapper, annotation]);\n }\n\n const math = new mathMLTree.MathNode(\"math\", [wrapper]);\n\n if (settings.xml) {\n math.setAttribute(\"xmlns\", \"http://www.w3.org/1998/Math/MathML\");\n }\n if (wrapper.style.width) {\n math.style.width = \"100%\";\n }\n if (settings.displayMode) {\n math.setAttribute(\"display\", \"block\");\n math.style.display = \"block math\"; // necessary in Chromium.\n // Firefox and Safari do not recognize display: \"block math\".\n // Set a class so that the CSS file can set display: block.\n math.classes = [\"tml-display\"];\n }\n return math;\n}\n\nconst smalls = \"aceg\u0131\u0237mnopqrsuvwxyz\u03B1\u03B3\u03B5\u03B7\u03B9\u03BA\u03BC\u03BD\u03BF\u03C0\u03C1\u03C2\u03C3\u03C4\u03C5\u03C7\u03C9\u03D5\uD835\uDC1A\uD835\uDC1C\uD835\uDC1E\uD835\uDC20\uD835\uDC26\uD835\uDC27\uD835\uDC28\uD835\uDC29\uD835\uDC2A\uD835\uDC2B\uD835\uDC2C\uD835\uDC2E\uD835\uDC2F\uD835\uDC30\uD835\uDC31\uD835\uDC32\uD835\uDC33\";\nconst talls = \"ABCDEFGHIJKLMNOPQRSTUVWXYZbdfhklt\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03B2\u03B4\u03BB\u03B6\u03C6\u03B8\u03C8\"\n + \"\uD835\uDC00\uD835\uDC01\uD835\uDC02\uD835\uDC03\uD835\uDC04\uD835\uDC05\uD835\uDC06\uD835\uDC07\uD835\uDC08\uD835\uDC09\uD835\uDC0A\uD835\uDC0B\uD835\uDC0C\uD835\uDC0D\uD835\uDC0E\uD835\uDC0F\uD835\uDC10\uD835\uDC11\uD835\uDC12\uD835\uDC13\uD835\uDC14\uD835\uDC15\uD835\uDC16\uD835\uDC17\uD835\uDC18\uD835\uDC19\uD835\uDC1B\uD835\uDC1D\uD835\uDC1F\uD835\uDC21\uD835\uDC24\uD835\uDC25\uD835\uDC2D\";\nconst longSmalls = new Set([\"\\\\alpha\", \"\\\\gamma\", \"\\\\delta\", \"\\\\epsilon\", \"\\\\eta\", \"\\\\iota\",\n \"\\\\kappa\", \"\\\\mu\", \"\\\\nu\", \"\\\\pi\", \"\\\\rho\", \"\\\\sigma\", \"\\\\tau\", \"\\\\upsilon\", \"\\\\chi\", \"\\\\psi\",\n \"\\\\omega\", \"\\\\imath\", \"\\\\jmath\"]);\nconst longTalls = new Set([\"\\\\Gamma\", \"\\\\Delta\", \"\\\\Sigma\", \"\\\\Omega\", \"\\\\beta\", \"\\\\delta\",\n \"\\\\lambda\", \"\\\\theta\", \"\\\\psi\"]);\n\nconst mathmlBuilder$a = (group, style) => {\n const accentNode = group.isStretchy\n ? stretchy.accentNode(group)\n : new mathMLTree.MathNode(\"mo\", [makeText(group.label, group.mode)]);\n\n if (group.label === \"\\\\vec\") {\n accentNode.style.transform = \"scale(0.75) translate(10%, 30%)\";\n } else {\n accentNode.style.mathStyle = \"normal\";\n accentNode.style.mathDepth = \"0\";\n if (needWebkitShift.has(group.label) && utils.isCharacterBox(group.base)) {\n let shift = \"\";\n const ch = group.base.text;\n if (smalls.indexOf(ch) > -1 || longSmalls.has(ch)) { shift = \"tml-xshift\"; }\n if (talls.indexOf(ch) > -1 || longTalls.has(ch)) { shift = \"tml-capshift\"; }\n if (shift) { accentNode.classes.push(shift); }\n }\n }\n if (!group.isStretchy) {\n accentNode.setAttribute(\"stretchy\", \"false\");\n }\n\n const node = new mathMLTree.MathNode((group.label === \"\\\\c\" ? \"munder\" : \"mover\"),\n [buildGroup$1(group.base, style), accentNode]\n );\n\n return node;\n};\n\nconst nonStretchyAccents = new Set([\n \"\\\\acute\",\n \"\\\\grave\",\n \"\\\\ddot\",\n \"\\\\dddot\",\n \"\\\\ddddot\",\n \"\\\\tilde\",\n \"\\\\bar\",\n \"\\\\breve\",\n \"\\\\check\",\n \"\\\\hat\",\n \"\\\\vec\",\n \"\\\\dot\",\n \"\\\\mathring\"\n]);\n\nconst needWebkitShift = new Set([\n \"\\\\acute\",\n \"\\\\bar\",\n \"\\\\breve\",\n \"\\\\check\",\n \"\\\\dot\",\n \"\\\\ddot\",\n \"\\\\grave\",\n \"\\\\hat\",\n \"\\\\mathring\",\n \"\\\\'\", \"\\\\^\", \"\\\\~\", \"\\\\=\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\r\", \"\\\\H\", \"\\\\v\"\n]);\n\nconst combiningChar = {\n \"\\\\`\": \"\\u0300\",\n \"\\\\'\": \"\\u0301\",\n \"\\\\^\": \"\\u0302\",\n \"\\\\~\": \"\\u0303\",\n \"\\\\=\": \"\\u0304\",\n \"\\\\u\": \"\\u0306\",\n \"\\\\.\": \"\\u0307\",\n '\\\\\"': \"\\u0308\",\n \"\\\\r\": \"\\u030A\",\n \"\\\\H\": \"\\u030B\",\n \"\\\\v\": \"\\u030C\"\n};\n\n// Accents\ndefineFunction({\n type: \"accent\",\n names: [\n \"\\\\acute\",\n \"\\\\grave\",\n \"\\\\ddot\",\n \"\\\\dddot\",\n \"\\\\ddddot\",\n \"\\\\tilde\",\n \"\\\\bar\",\n \"\\\\breve\",\n \"\\\\check\",\n \"\\\\hat\",\n \"\\\\vec\",\n \"\\\\dot\",\n \"\\\\mathring\",\n \"\\\\overparen\",\n \"\\\\widecheck\",\n \"\\\\widehat\",\n \"\\\\wideparen\",\n \"\\\\widetilde\",\n \"\\\\overrightarrow\",\n \"\\\\overleftarrow\",\n \"\\\\Overrightarrow\",\n \"\\\\overleftrightarrow\",\n \"\\\\overgroup\",\n \"\\\\overleftharpoon\",\n \"\\\\overrightharpoon\"\n ],\n props: {\n numArgs: 1\n },\n handler: (context, args) => {\n const base = normalizeArgument(args[0]);\n\n const isStretchy = !nonStretchyAccents.has(context.funcName);\n\n return {\n type: \"accent\",\n mode: context.parser.mode,\n label: context.funcName,\n isStretchy: isStretchy,\n base: base\n };\n },\n mathmlBuilder: mathmlBuilder$a\n});\n\n// Text-mode accents\ndefineFunction({\n type: \"accent\",\n names: [\"\\\\'\", \"\\\\`\", \"\\\\^\", \"\\\\~\", \"\\\\=\", \"\\\\c\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\r\", \"\\\\H\", \"\\\\v\"],\n props: {\n numArgs: 1,\n allowedInText: true,\n allowedInMath: true,\n argTypes: [\"primitive\"]\n },\n handler: (context, args) => {\n const base = normalizeArgument(args[0]);\n const mode = context.parser.mode;\n\n if (mode === \"math\" && context.parser.settings.strict) {\n // LaTeX only writes a warning. It doesn't stop. We'll issue the same warning.\n // eslint-disable-next-line no-console\n console.log(`Temml parse error: Command $context.funcName} is invalid in math mode.`);\n }\n\n if (mode === \"text\" && base.text && base.text.length === 1\n && context.funcName in combiningChar && smalls.indexOf(base.text) > -1) {\n // Return a combining accent character\n return {\n type: \"textord\",\n mode: \"text\",\n text: base.text + combiningChar[context.funcName]\n }\n } else {\n // Build up the accent\n return {\n type: \"accent\",\n mode: mode,\n label: context.funcName,\n isStretchy: false,\n base: base\n }\n }\n },\n mathmlBuilder: mathmlBuilder$a\n});\n\ndefineFunction({\n type: \"accentUnder\",\n names: [\n \"\\\\underleftarrow\",\n \"\\\\underrightarrow\",\n \"\\\\underleftrightarrow\",\n \"\\\\undergroup\",\n \"\\\\underparen\",\n \"\\\\utilde\"\n ],\n props: {\n numArgs: 1\n },\n handler: ({ parser, funcName }, args) => {\n const base = args[0];\n return {\n type: \"accentUnder\",\n mode: parser.mode,\n label: funcName,\n base: base\n };\n },\n mathmlBuilder: (group, style) => {\n const accentNode = stretchy.accentNode(group);\n accentNode.style[\"math-depth\"] = 0;\n const node = new mathMLTree.MathNode(\"munder\", [\n buildGroup$1(group.base, style),\n accentNode\n ]);\n return node;\n }\n});\n\n/**\n * This file does conversion between units. In particular, it provides\n * calculateSize to convert other units into CSS units.\n */\n\n\nconst ptPerUnit = {\n // Convert to CSS (Postscipt) points, not TeX points\n // https://en.wikibooks.org/wiki/LaTeX/Lengths and\n // https://tex.stackexchange.com/a/8263\n pt: 800 / 803, // convert TeX point to CSS (Postscript) point\n pc: (12 * 800) / 803, // pica\n dd: ((1238 / 1157) * 800) / 803, // didot\n cc: ((14856 / 1157) * 800) / 803, // cicero (12 didot)\n nd: ((685 / 642) * 800) / 803, // new didot\n nc: ((1370 / 107) * 800) / 803, // new cicero (12 new didot)\n sp: ((1 / 65536) * 800) / 803, // scaled point (TeX's internal smallest unit)\n mm: (25.4 / 72),\n cm: (2.54 / 72),\n in: (1 / 72),\n px: (96 / 72)\n};\n\n/**\n * Determine whether the specified unit (either a string defining the unit\n * or a \"size\" parse node containing a unit field) is valid.\n */\nconst validUnits = [\n \"em\",\n \"ex\",\n \"mu\",\n \"pt\",\n \"mm\",\n \"cm\",\n \"in\",\n \"px\",\n \"bp\",\n \"pc\",\n \"dd\",\n \"cc\",\n \"nd\",\n \"nc\",\n \"sp\"\n];\n\nconst validUnit = function(unit) {\n if (typeof unit !== \"string\") {\n unit = unit.unit;\n }\n return validUnits.indexOf(unit) > -1\n};\n\nconst emScale = styleLevel => {\n const scriptLevel = Math.max(styleLevel - 1, 0);\n return [1, 0.7, 0.5][scriptLevel]\n};\n\n/*\n * Convert a \"size\" parse node (with numeric \"number\" and string \"unit\" fields,\n * as parsed by functions.js argType \"size\") into a CSS value.\n */\nconst calculateSize = function(sizeValue, style) {\n let number = sizeValue.number;\n if (style.maxSize[0] < 0 && number > 0) {\n return { number: 0, unit: \"em\" }\n }\n const unit = sizeValue.unit;\n switch (unit) {\n case \"mm\":\n case \"cm\":\n case \"in\":\n case \"px\": {\n const numInCssPts = number * ptPerUnit[unit];\n if (numInCssPts > style.maxSize[1]) {\n return { number: style.maxSize[1], unit: \"pt\" }\n }\n return { number, unit }; // absolute CSS units.\n }\n case \"em\":\n case \"ex\": {\n // In TeX, em and ex do not change size in \\scriptstyle.\n if (unit === \"ex\") { number *= 0.431; }\n number = Math.min(number / emScale(style.level), style.maxSize[0]);\n return { number: utils.round(number), unit: \"em\" };\n }\n case \"bp\": {\n if (number > style.maxSize[1]) { number = style.maxSize[1]; }\n return { number, unit: \"pt\" }; // TeX bp is a CSS pt. (1/72 inch).\n }\n case \"pt\":\n case \"pc\":\n case \"dd\":\n case \"cc\":\n case \"nd\":\n case \"nc\":\n case \"sp\": {\n number = Math.min(number * ptPerUnit[unit], style.maxSize[1]);\n return { number: utils.round(number), unit: \"pt\" }\n }\n case \"mu\": {\n number = Math.min(number / 18, style.maxSize[0]);\n return { number: utils.round(number), unit: \"em\" }\n }\n default:\n throw new ParseError(\"Invalid unit: '\" + unit + \"'\")\n }\n};\n\n// Helper functions\n\nconst padding$2 = width => {\n const node = new mathMLTree.MathNode(\"mspace\");\n node.setAttribute(\"width\", width + \"em\");\n return node\n};\n\nconst paddedNode = (group, lspace = 0.3, rspace = 0, mustSmash = false) => {\n if (group == null && rspace === 0) { return padding$2(lspace) }\n const row = group ? [group] : [];\n if (lspace !== 0) { row.unshift(padding$2(lspace)); }\n if (rspace > 0) { row.push(padding$2(rspace)); }\n if (mustSmash) {\n // Used for the bottom arrow in a {CD} environment\n const mpadded = new mathMLTree.MathNode(\"mpadded\", row);\n mpadded.setAttribute(\"height\", \"0\");\n return mpadded\n } else {\n return new mathMLTree.MathNode(\"mrow\", row)\n }\n};\n\nconst labelSize = (size, scriptLevel) => Number(size) / emScale(scriptLevel);\n\nconst munderoverNode = (fName, body, below, style) => {\n const arrowNode = stretchy.mathMLnode(fName);\n // Is this the short part of a mhchem equilibrium arrow?\n const isEq = fName.slice(1, 3) === \"eq\";\n const minWidth = fName.charAt(1) === \"x\"\n ? \"1.75\" // mathtools extensible arrows are \u2265 1.75em long\n : fName.slice(2, 4) === \"cd\"\n ? \"3.0\" // cd package arrows\n : isEq\n ? \"1.0\" // The shorter harpoon of a mhchem equilibrium arrow\n : \"2.0\"; // other mhchem arrows\n // TODO: When Firefox supports minsize, use the next line.\n //arrowNode.setAttribute(\"minsize\", String(minWidth) + \"em\")\n arrowNode.setAttribute(\"lspace\", \"0\");\n arrowNode.setAttribute(\"rspace\", (isEq ? \"0.5em\" : \"0\"));\n\n // <munderover> upper and lower labels are set to scriptlevel by MathML\n // So we have to adjust our label dimensions accordingly.\n const labelStyle = style.withLevel(style.level < 2 ? 2 : 3);\n const minArrowWidth = labelSize(minWidth, labelStyle.level);\n // The dummyNode will be inside a <mover> inside a <mover>\n // So it will be at scriptlevel 3\n const dummyWidth = labelSize(minWidth, 3);\n const emptyLabel = paddedNode(null, minArrowWidth.toFixed(4), 0);\n const dummyNode = paddedNode(null, dummyWidth.toFixed(4), 0);\n // The arrow is a little longer than the label. Set a spacer length.\n const space = labelSize((isEq ? 0 : 0.3), labelStyle.level).toFixed(4);\n let upperNode;\n let lowerNode;\n\n const gotUpper = (body && body.body &&\n // \\hphantom visible content\n (body.body.body || body.body.length > 0));\n if (gotUpper) {\n let label = buildGroup$1(body, labelStyle);\n const mustSmash = (fName === \"\\\\\\\\cdrightarrow\" || fName === \"\\\\\\\\cdleftarrow\");\n label = paddedNode(label, space, space, mustSmash);\n // Since Firefox does not support minsize, stack a invisible node\n // on top of the label. Its width will serve as a min-width.\n // TODO: Refactor this after Firefox supports minsize.\n upperNode = new mathMLTree.MathNode(\"mover\", [label, dummyNode]);\n }\n const gotLower = (below && below.body &&\n (below.body.body || below.body.length > 0));\n if (gotLower) {\n let label = buildGroup$1(below, labelStyle);\n label = paddedNode(label, space, space);\n lowerNode = new mathMLTree.MathNode(\"munder\", [label, dummyNode]);\n }\n\n let node;\n if (!gotUpper && !gotLower) {\n node = new mathMLTree.MathNode(\"mover\", [arrowNode, emptyLabel]);\n } else if (gotUpper && gotLower) {\n node = new mathMLTree.MathNode(\"munderover\", [arrowNode, lowerNode, upperNode]);\n } else if (gotUpper) {\n node = new mathMLTree.MathNode(\"mover\", [arrowNode, upperNode]);\n } else {\n node = new mathMLTree.MathNode(\"munder\", [arrowNode, lowerNode]);\n }\n if (minWidth === \"3.0\") { node.style.height = \"1em\"; } // CD environment\n node.setAttribute(\"accent\", \"false\"); // Necessary for MS Word\n return node\n};\n\n// Stretchy arrows with an optional argument\ndefineFunction({\n type: \"xArrow\",\n names: [\n \"\\\\xleftarrow\",\n \"\\\\xrightarrow\",\n \"\\\\xLeftarrow\",\n \"\\\\xRightarrow\",\n \"\\\\xleftrightarrow\",\n \"\\\\xLeftrightarrow\",\n \"\\\\xhookleftarrow\",\n \"\\\\xhookrightarrow\",\n \"\\\\xmapsto\",\n \"\\\\xrightharpoondown\",\n \"\\\\xrightharpoonup\",\n \"\\\\xleftharpoondown\",\n \"\\\\xleftharpoonup\",\n \"\\\\xlongequal\",\n \"\\\\xtwoheadrightarrow\",\n \"\\\\xtwoheadleftarrow\",\n // The next 5 functions are here only to support mhchem\n \"\\\\yields\",\n \"\\\\yieldsLeft\",\n \"\\\\mesomerism\",\n \"\\\\longrightharpoonup\",\n \"\\\\longleftharpoondown\",\n // The next 3 functions are here only to support the {CD} environment.\n \"\\\\\\\\cdrightarrow\",\n \"\\\\\\\\cdleftarrow\",\n \"\\\\\\\\cdlongequal\"\n ],\n props: {\n numArgs: 1,\n numOptionalArgs: 1\n },\n handler({ parser, funcName }, args, optArgs) {\n return {\n type: \"xArrow\",\n mode: parser.mode,\n name: funcName,\n body: args[0],\n below: optArgs[0]\n };\n },\n mathmlBuilder(group, style) {\n // Build the arrow and its labels.\n const node = munderoverNode(group.name, group.body, group.below, style);\n // Create operator spacing for a relation.\n const row = [node];\n row.unshift(padding$2(0.2778));\n row.push(padding$2(0.2778));\n return new mathMLTree.MathNode(\"mrow\", row)\n }\n});\n\nconst arrowComponent = {\n \"\\\\xtofrom\": [\"\\\\xrightarrow\", \"\\\\xleftarrow\"],\n \"\\\\xleftrightharpoons\": [\"\\\\xleftharpoonup\", \"\\\\xrightharpoondown\"],\n \"\\\\xrightleftharpoons\": [\"\\\\xrightharpoonup\", \"\\\\xleftharpoondown\"],\n \"\\\\yieldsLeftRight\": [\"\\\\yields\", \"\\\\yieldsLeft\"],\n // The next three all get the same harpoon glyphs. Only the lengths and paddings differ.\n \"\\\\equilibrium\": [\"\\\\longrightharpoonup\", \"\\\\longleftharpoondown\"],\n \"\\\\equilibriumRight\": [\"\\\\longrightharpoonup\", \"\\\\eqleftharpoondown\"],\n \"\\\\equilibriumLeft\": [\"\\\\eqrightharpoonup\", \"\\\\longleftharpoondown\"]\n};\n\n// Browsers are not good at stretching a glyph that contains a pair of stacked arrows such as \u21C4.\n// So we stack a pair of single arrows.\ndefineFunction({\n type: \"stackedArrow\",\n names: [\n \"\\\\xtofrom\", // expfeil\n \"\\\\xleftrightharpoons\", // mathtools\n \"\\\\xrightleftharpoons\", // mathtools\n \"\\\\yieldsLeftRight\", // mhchem\n \"\\\\equilibrium\", // mhchem\n \"\\\\equilibriumRight\",\n \"\\\\equilibriumLeft\"\n ],\n props: {\n numArgs: 1,\n numOptionalArgs: 1\n },\n handler({ parser, funcName }, args, optArgs) {\n const lowerArrowBody = args[0]\n ? {\n type: \"hphantom\",\n mode: parser.mode,\n body: args[0]\n }\n : null;\n const upperArrowBelow = optArgs[0]\n ? {\n type: \"hphantom\",\n mode: parser.mode,\n body: optArgs[0]\n }\n : null;\n return {\n type: \"stackedArrow\",\n mode: parser.mode,\n name: funcName,\n body: args[0],\n upperArrowBelow,\n lowerArrowBody,\n below: optArgs[0]\n };\n },\n mathmlBuilder(group, style) {\n const topLabel = arrowComponent[group.name][0];\n const botLabel = arrowComponent[group.name][1];\n const topArrow = munderoverNode(topLabel, group.body, group.upperArrowBelow, style);\n const botArrow = munderoverNode(botLabel, group.lowerArrowBody, group.below, style);\n let wrapper;\n\n const raiseNode = new mathMLTree.MathNode(\"mpadded\", [topArrow]);\n raiseNode.setAttribute(\"voffset\", \"0.3em\");\n raiseNode.setAttribute(\"height\", \"+0.3em\");\n raiseNode.setAttribute(\"depth\", \"-0.3em\");\n // One of the arrows is given ~zero width. so the other has the same horzontal alignment.\n if (group.name === \"\\\\equilibriumLeft\") {\n const botNode = new mathMLTree.MathNode(\"mpadded\", [botArrow]);\n botNode.setAttribute(\"width\", \"0.5em\");\n wrapper = new mathMLTree.MathNode(\n \"mpadded\",\n [padding$2(0.2778), botNode, raiseNode, padding$2(0.2778)]\n );\n } else {\n raiseNode.setAttribute(\"width\", (group.name === \"\\\\equilibriumRight\" ? \"0.5em\" : \"0\"));\n wrapper = new mathMLTree.MathNode(\n \"mpadded\",\n [padding$2(0.2778), raiseNode, botArrow, padding$2(0.2778)]\n );\n }\n\n wrapper.setAttribute(\"voffset\", \"-0.18em\");\n wrapper.setAttribute(\"height\", \"-0.18em\");\n wrapper.setAttribute(\"depth\", \"+0.18em\");\n return wrapper\n }\n});\n\n/**\n * Asserts that the node is of the given type and returns it with stricter\n * typing. Throws if the node's type does not match.\n */\nfunction assertNodeType(node, type) {\n if (!node || node.type !== type) {\n throw new Error(\n `Expected node of type $type}, but got ` +\n (node ? `node of type $node.type}` : String(node))\n );\n }\n return node;\n}\n\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction assertSymbolNodeType(node) {\n const typedNode = checkSymbolNodeType(node);\n if (!typedNode) {\n throw new Error(\n `Expected node of symbol group type, but got ` +\n (node ? `node of type $node.type}` : String(node))\n );\n }\n return typedNode;\n}\n\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction checkSymbolNodeType(node) {\n if (node && (node.type === \"atom\" ||\n Object.prototype.hasOwnProperty.call(NON_ATOMS, node.type))) {\n return node;\n }\n return null;\n}\n\nconst cdArrowFunctionName = {\n \">\": \"\\\\\\\\cdrightarrow\",\n \"<\": \"\\\\\\\\cdleftarrow\",\n \"=\": \"\\\\\\\\cdlongequal\",\n A: \"\\\\uparrow\",\n V: \"\\\\downarrow\",\n \"|\": \"\\\\Vert\",\n \".\": \"no arrow\"\n};\n\nconst newCell = () => {\n // Create an empty cell, to be filled below with parse nodes.\n return { type: \"styling\", body: [], mode: \"math\", scriptLevel: \"display\" };\n};\n\nconst isStartOfArrow = (node) => {\n return node.type === \"textord\" && node.text === \"@\";\n};\n\nconst isLabelEnd = (node, endChar) => {\n return (node.type === \"mathord\" || node.type === \"atom\") && node.text === endChar;\n};\n\nfunction cdArrow(arrowChar, labels, parser) {\n // Return a parse tree of an arrow and its labels.\n // This acts in a way similar to a macro expansion.\n const funcName = cdArrowFunctionName[arrowChar];\n switch (funcName) {\n case \"\\\\\\\\cdrightarrow\":\n case \"\\\\\\\\cdleftarrow\":\n return parser.callFunction(funcName, [labels[0]], [labels[1]]);\n case \"\\\\uparrow\":\n case \"\\\\downarrow\": {\n const leftLabel = parser.callFunction(\"\\\\\\\\cdleft\", [labels[0]], []);\n const bareArrow = {\n type: \"atom\",\n text: funcName,\n mode: \"math\",\n family: \"rel\"\n };\n const sizedArrow = parser.callFunction(\"\\\\Big\", [bareArrow], []);\n const rightLabel = parser.callFunction(\"\\\\\\\\cdright\", [labels[1]], []);\n const arrowGroup = {\n type: \"ordgroup\",\n mode: \"math\",\n body: [leftLabel, sizedArrow, rightLabel],\n semisimple: true\n };\n return parser.callFunction(\"\\\\\\\\cdparent\", [arrowGroup], []);\n }\n case \"\\\\\\\\cdlongequal\":\n return parser.callFunction(\"\\\\\\\\cdlongequal\", [], []);\n case \"\\\\Vert\": {\n const arrow = { type: \"textord\", text: \"\\\\Vert\", mode: \"math\" };\n return parser.callFunction(\"\\\\Big\", [arrow], []);\n }\n default:\n return { type: \"textord\", text: \" \", mode: \"math\" };\n }\n}\n\nfunction parseCD(parser) {\n // Get the array's parse nodes with \\\\ temporarily mapped to \\cr.\n const parsedRows = [];\n parser.gullet.beginGroup();\n parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n parser.gullet.beginGroup();\n while (true) {\n // Get the parse nodes for the next row.\n parsedRows.push(parser.parseExpression(false, \"\\\\\\\\\"));\n parser.gullet.endGroup();\n parser.gullet.beginGroup();\n const next = parser.fetch().text;\n if (next === \"&\" || next === \"\\\\\\\\\") {\n parser.consume();\n } else if (next === \"\\\\end\") {\n if (parsedRows[parsedRows.length - 1].length === 0) {\n parsedRows.pop(); // final row ended in \\\\\n }\n break;\n } else {\n throw new ParseError(\"Expected \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n }\n }\n\n let row = [];\n const body = [row];\n\n // Loop thru the parse nodes. Collect them into cells and arrows.\n for (let i = 0; i < parsedRows.length; i++) {\n // Start a new row.\n const rowNodes = parsedRows[i];\n // Create the first cell.\n let cell = newCell();\n\n for (let j = 0; j < rowNodes.length; j++) {\n if (!isStartOfArrow(rowNodes[j])) {\n // If a parseNode is not an arrow, it goes into a cell.\n cell.body.push(rowNodes[j]);\n } else {\n // Parse node j is an \"@\", the start of an arrow.\n // Before starting on the arrow, push the cell into `row`.\n row.push(cell);\n\n // Now collect parseNodes into an arrow.\n // The character after \"@\" defines the arrow type.\n j += 1;\n const arrowChar = assertSymbolNodeType(rowNodes[j]).text;\n\n // Create two empty label nodes. We may or may not use them.\n const labels = new Array(2);\n labels[0] = { type: \"ordgroup\", mode: \"math\", body: [] };\n labels[1] = { type: \"ordgroup\", mode: \"math\", body: [] };\n\n // Process the arrow.\n if (\"=|.\".indexOf(arrowChar) > -1) ; else if (\"<>AV\".indexOf(arrowChar) > -1) {\n // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take\n // two optional labels. E.g. the right-point arrow syntax is\n // really: @>{optional label}>{optional label}>\n // Collect parseNodes into labels.\n for (let labelNum = 0; labelNum < 2; labelNum++) {\n let inLabel = true;\n for (let k = j + 1; k < rowNodes.length; k++) {\n if (isLabelEnd(rowNodes[k], arrowChar)) {\n inLabel = false;\n j = k;\n break;\n }\n if (isStartOfArrow(rowNodes[k])) {\n throw new ParseError(\n \"Missing a \" + arrowChar + \" character to complete a CD arrow.\",\n rowNodes[k]\n );\n }\n\n labels[labelNum].body.push(rowNodes[k]);\n }\n if (inLabel) {\n // isLabelEnd never returned a true.\n throw new ParseError(\n \"Missing a \" + arrowChar + \" character to complete a CD arrow.\",\n rowNodes[j]\n );\n }\n }\n } else {\n throw new ParseError(`Expected one of \"<>AV=|.\" after @.`);\n }\n\n // Now join the arrow to its labels.\n const arrow = cdArrow(arrowChar, labels, parser);\n\n // Wrap the arrow in a styling node\n row.push(arrow);\n // In CD's syntax, cells are implicit. That is, everything that\n // is not an arrow gets collected into a cell. So create an empty\n // cell now. It will collect upcoming parseNodes.\n cell = newCell();\n }\n }\n if (i % 2 === 0) {\n // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell\n // The last cell is not yet pushed into `row`, so:\n row.push(cell);\n } else {\n // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow\n // Remove the empty cell that was placed at the beginning of `row`.\n row.shift();\n }\n row = [];\n body.push(row);\n }\n body.pop();\n\n // End row group\n parser.gullet.endGroup();\n // End array group defining \\\\\n parser.gullet.endGroup();\n\n return {\n type: \"array\",\n mode: \"math\",\n body,\n tags: null,\n labels: new Array(body.length + 1).fill(\"\"),\n envClasses: [\"jot\", \"cd\"],\n cols: [],\n hLinesBeforeRow: new Array(body.length + 1).fill([])\n };\n}\n\n// The functions below are not available for general use.\n// They are here only for internal use by the {CD} environment in placing labels\n// next to vertical arrows.\n\n// We don't need any such functions for horizontal arrows because we can reuse\n// the functionality that already exists for extensible arrows.\n\ndefineFunction({\n type: \"cdlabel\",\n names: [\"\\\\\\\\cdleft\", \"\\\\\\\\cdright\"],\n props: {\n numArgs: 1\n },\n handler({ parser, funcName }, args) {\n return {\n type: \"cdlabel\",\n mode: parser.mode,\n side: funcName.slice(4),\n label: args[0]\n };\n },\n mathmlBuilder(group, style) {\n if (group.label.body.length === 0) {\n return new mathMLTree.MathNode(\"mrow\", style) // empty label\n }\n // Abuse an <mtable> to create vertically centered content.\n const mtd = new mathMLTree.MathNode(\"mtd\", [buildGroup$1(group.label, style)]);\n mtd.style.padding = \"0\";\n const mtr = new mathMLTree.MathNode(\"mtr\", [mtd]);\n const mtable = new mathMLTree.MathNode(\"mtable\", [mtr]);\n const label = new mathMLTree.MathNode(\"mpadded\", [mtable]);\n // Set the label width to zero so that the arrow will be centered under the corner cell.\n label.setAttribute(\"width\", \"0\");\n label.setAttribute(\"displaystyle\", \"false\");\n label.setAttribute(\"scriptlevel\", \"1\");\n if (group.side === \"left\") {\n label.style.display = \"flex\";\n label.style.justifyContent = \"flex-end\";\n }\n return label;\n }\n});\n\ndefineFunction({\n type: \"cdlabelparent\",\n names: [\"\\\\\\\\cdparent\"],\n props: {\n numArgs: 1\n },\n handler({ parser }, args) {\n return {\n type: \"cdlabelparent\",\n mode: parser.mode,\n fragment: args[0]\n };\n },\n mathmlBuilder(group, style) {\n return new mathMLTree.MathNode(\"mrow\", [buildGroup$1(group.fragment, style)]);\n }\n});\n\n// \\@char is an internal function that takes a grouped decimal argument like\n// {123} and converts into symbol with code 123. It is used by the *macro*\n// \\char defined in macros.js.\ndefineFunction({\n type: \"textord\",\n names: [\"\\\\@char\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler({ parser, token }, args) {\n const arg = assertNodeType(args[0], \"ordgroup\");\n const group = arg.body;\n let number = \"\";\n for (let i = 0; i < group.length; i++) {\n const node = assertNodeType(group[i], \"textord\");\n number += node.text;\n }\n const code = parseInt(number);\n if (isNaN(code)) {\n throw new ParseError(`\\\\@char has non-numeric argument $number}`, token)\n }\n return {\n type: \"textord\",\n mode: parser.mode,\n text: String.fromCodePoint(code)\n }\n }\n});\n\n// Helpers\nconst htmlRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6})$/i;\nconst htmlOrNameRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i;\nconst RGBregEx = /^ *\\d{1,3} *(?:, *\\d{1,3} *){2}$/;\nconst rgbRegEx = /^ *[10](?:\\.\\d*)? *(?:, *[10](?:\\.\\d*)? *){2}$/;\nconst xcolorHtmlRegEx = /^[a-f0-9]{6}$/i;\nconst toHex = num => {\n let str = num.toString(16);\n if (str.length === 1) { str = \"0\" + str; }\n return str\n};\n\n// Colors from Tables 4.1 and 4.2 of the xcolor package.\n// Table 4.1 (lower case) RGB values are taken from chroma and xcolor.dtx.\n// Table 4.2 (Capitalizzed) values were sampled, because Chroma contains a unreliable\n// conversion from cmyk to RGB. See https://tex.stackexchange.com/a/537274.\nconst xcolors = JSON.parse(`{\n \"Apricot\": \"#ffb484\",\n \"Aquamarine\": \"#08b4bc\",\n \"Bittersweet\": \"#c84c14\",\n \"blue\": \"#0000FF\",\n \"Blue\": \"#303494\",\n \"BlueGreen\": \"#08b4bc\",\n \"BlueViolet\": \"#503c94\",\n \"BrickRed\": \"#b8341c\",\n \"brown\": \"#BF8040\",\n \"Brown\": \"#802404\",\n \"BurntOrange\": \"#f8941c\",\n \"CadetBlue\": \"#78749c\",\n \"CarnationPink\": \"#f884b4\",\n \"Cerulean\": \"#08a4e4\",\n \"CornflowerBlue\": \"#40ace4\",\n \"cyan\": \"#00FFFF\",\n \"Cyan\": \"#08acec\",\n \"Dandelion\": \"#ffbc44\",\n \"darkgray\": \"#404040\",\n \"DarkOrchid\": \"#a8548c\",\n \"Emerald\": \"#08ac9c\",\n \"ForestGreen\": \"#089c54\",\n \"Fuchsia\": \"#90348c\",\n \"Goldenrod\": \"#ffdc44\",\n \"gray\": \"#808080\",\n \"Gray\": \"#98949c\",\n \"green\": \"#00FF00\",\n \"Green\": \"#08a44c\",\n \"GreenYellow\": \"#e0e474\",\n \"JungleGreen\": \"#08ac9c\",\n \"Lavender\": \"#f89cc4\",\n \"lightgray\": \"#c0c0c0\",\n \"lime\": \"#BFFF00\",\n \"LimeGreen\": \"#90c43c\",\n \"magenta\": \"#FF00FF\",\n \"Magenta\": \"#f0048c\",\n \"Mahogany\": \"#b0341c\",\n \"Maroon\": \"#b03434\",\n \"Melon\": \"#f89c7c\",\n \"MidnightBlue\": \"#086494\",\n \"Mulberry\": \"#b03c94\",\n \"NavyBlue\": \"#086cbc\",\n \"olive\": \"#7F7F00\",\n \"OliveGreen\": \"#407c34\",\n \"orange\": \"#FF8000\",\n \"Orange\": \"#f8843c\",\n \"OrangeRed\": \"#f0145c\",\n \"Orchid\": \"#b074ac\",\n \"Peach\": \"#f8945c\",\n \"Periwinkle\": \"#8074bc\",\n \"PineGreen\": \"#088c74\",\n \"pink\": \"#ff7f7f\",\n \"Plum\": \"#98248c\",\n \"ProcessBlue\": \"#08b4ec\",\n \"purple\": \"#BF0040\",\n \"Purple\": \"#a0449c\",\n \"RawSienna\": \"#983c04\",\n \"red\": \"#ff0000\",\n \"Red\": \"#f01c24\",\n \"RedOrange\": \"#f86434\",\n \"RedViolet\": \"#a0246c\",\n \"Rhodamine\": \"#f0549c\",\n \"Royallue\": \"#0874bc\",\n \"RoyalPurple\": \"#683c9c\",\n \"RubineRed\": \"#f0047c\",\n \"Salmon\": \"#f8948c\",\n \"SeaGreen\": \"#30bc9c\",\n \"Sepia\": \"#701404\",\n \"SkyBlue\": \"#48c4dc\",\n \"SpringGreen\": \"#c8dc64\",\n \"Tan\": \"#e09c74\",\n \"teal\": \"#007F7F\",\n \"TealBlue\": \"#08acb4\",\n \"Thistle\": \"#d884b4\",\n \"Turquoise\": \"#08b4cc\",\n \"violet\": \"#800080\",\n \"Violet\": \"#60449c\",\n \"VioletRed\": \"#f054a4\",\n \"WildStrawberry\": \"#f0246c\",\n \"yellow\": \"#FFFF00\",\n \"Yellow\": \"#fff404\",\n \"YellowGreen\": \"#98cc6c\",\n \"YellowOrange\": \"#ffa41c\"\n}`);\n\nconst colorFromSpec = (model, spec) => {\n let color = \"\";\n if (model === \"HTML\") {\n if (!htmlRegEx.test(spec)) {\n throw new ParseError(\"Invalid HTML input.\")\n }\n color = spec;\n } else if (model === \"RGB\") {\n if (!RGBregEx.test(spec)) {\n throw new ParseError(\"Invalid RGB input.\")\n }\n spec.split(\",\").map(e => { color += toHex(Number(e.trim())); });\n } else {\n if (!rgbRegEx.test(spec)) {\n throw new ParseError(\"Invalid rbg input.\")\n }\n spec.split(\",\").map(e => {\n const num = Number(e.trim());\n if (num > 1) { throw new ParseError(\"Color rgb input must be < 1.\") }\n color += toHex(Number((num * 255).toFixed(0)));\n });\n }\n if (color.charAt(0) !== \"#\") { color = \"#\" + color; }\n return color\n};\n\nconst validateColor = (color, macros, token) => {\n const macroName = `\\\\\\\\color@$color}`; // from \\defineColor.\n const match = htmlOrNameRegEx.exec(color);\n if (!match) { throw new ParseError(\"Invalid color: '\" + color + \"'\", token) }\n // We allow a 6-digit HTML color spec without a leading \"#\".\n // This follows the xcolor package's HTML color model.\n // Predefined color names are all missed by this RegEx pattern.\n if (xcolorHtmlRegEx.test(color)) {\n return \"#\" + color\n } else if (color.charAt(0) === \"#\") {\n return color\n } else if (macros.has(macroName)) {\n color = macros.get(macroName).tokens[0].text;\n } else if (xcolors[color]) {\n color = xcolors[color];\n }\n return color\n};\n\nconst mathmlBuilder$9 = (group, style) => {\n // In LaTeX, color is not supposed to change the spacing of any node.\n // So instead of wrapping the group in an <mstyle>, we apply\n // the color individually to each node and return a document fragment.\n let expr = buildExpression(group.body, style.withColor(group.color));\n expr = expr.map(e => {\n e.style.color = group.color;\n return e\n });\n return mathMLTree.newDocumentFragment(expr)\n};\n\ndefineFunction({\n type: \"color\",\n names: [\"\\\\textcolor\"],\n props: {\n numArgs: 2,\n numOptionalArgs: 1,\n allowedInText: true,\n argTypes: [\"raw\", \"raw\", \"original\"]\n },\n handler({ parser, token }, args, optArgs) {\n const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n let color = \"\";\n if (model) {\n const spec = assertNodeType(args[0], \"raw\").string;\n color = colorFromSpec(model, spec);\n } else {\n color = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros, token);\n }\n const body = args[1];\n return {\n type: \"color\",\n mode: parser.mode,\n color,\n isTextColor: true,\n body: ordargument(body)\n }\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\ndefineFunction({\n type: \"color\",\n names: [\"\\\\color\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1,\n allowedInText: true,\n argTypes: [\"raw\", \"raw\"]\n },\n handler({ parser, breakOnTokenText, token }, args, optArgs) {\n const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n let color = \"\";\n if (model) {\n const spec = assertNodeType(args[0], \"raw\").string;\n color = colorFromSpec(model, spec);\n } else {\n color = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros, token);\n }\n\n // Parse out the implicit body that should be colored.\n const body = parser.parseExpression(true, breakOnTokenText, true);\n\n return {\n type: \"color\",\n mode: parser.mode,\n color,\n isTextColor: false,\n body\n }\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\ndefineFunction({\n type: \"color\",\n names: [\"\\\\definecolor\"],\n props: {\n numArgs: 3,\n allowedInText: true,\n argTypes: [\"raw\", \"raw\", \"raw\"]\n },\n handler({ parser, funcName, token }, args) {\n const name = assertNodeType(args[0], \"raw\").string;\n if (!/^[A-Za-z]+$/.test(name)) {\n throw new ParseError(\"Color name must be latin letters.\", token)\n }\n const model = assertNodeType(args[1], \"raw\").string;\n if (![\"HTML\", \"RGB\", \"rgb\"].includes(model)) {\n throw new ParseError(\"Color model must be HTML, RGB, or rgb.\", token)\n }\n const spec = assertNodeType(args[2], \"raw\").string;\n const color = colorFromSpec(model, spec);\n parser.gullet.macros.set(`\\\\\\\\color@$name}`, { tokens: [{ text: color }], numArgs: 0 });\n return { type: \"internal\", mode: parser.mode }\n }\n // No mathmlBuilder. The point of \\definecolor is to set a macro.\n});\n\n// Row breaks within tabular environments, and line breaks at top level\n\n\n// \\DeclareRobustCommand\\\\{...\\@xnewline}\ndefineFunction({\n type: \"cr\",\n names: [\"\\\\\\\\\"],\n props: {\n numArgs: 0,\n numOptionalArgs: 0,\n allowedInText: true\n },\n\n handler({ parser }, args, optArgs) {\n const size = parser.gullet.future().text === \"[\" ? parser.parseSizeGroup(true) : null;\n const newLine = !parser.settings.displayMode;\n return {\n type: \"cr\",\n mode: parser.mode,\n newLine,\n size: size && assertNodeType(size, \"size\").value\n }\n },\n\n // The following builder is called only at the top level,\n // not within tabular/array environments.\n\n mathmlBuilder(group, style) {\n // MathML 3.0 calls for newline to occur in an <mo> or an <mspace>.\n // Ref: https://www.w3.org/TR/MathML3/chapter3.html#presm.linebreaking\n const node = new mathMLTree.MathNode(\"mo\");\n if (group.newLine) {\n node.setAttribute(\"linebreak\", \"newline\");\n if (group.size) {\n const size = calculateSize(group.size, style);\n node.setAttribute(\"height\", size.number + size.unit);\n }\n }\n return node\n }\n});\n\nconst globalMap = {\n \"\\\\global\": \"\\\\global\",\n \"\\\\long\": \"\\\\\\\\globallong\",\n \"\\\\\\\\globallong\": \"\\\\\\\\globallong\",\n \"\\\\def\": \"\\\\gdef\",\n \"\\\\gdef\": \"\\\\gdef\",\n \"\\\\edef\": \"\\\\xdef\",\n \"\\\\xdef\": \"\\\\xdef\",\n \"\\\\let\": \"\\\\\\\\globallet\",\n \"\\\\futurelet\": \"\\\\\\\\globalfuture\"\n};\n\nconst checkControlSequence = (tok) => {\n const name = tok.text;\n if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n throw new ParseError(\"Expected a control sequence\", tok);\n }\n return name;\n};\n\nconst getRHS = (parser) => {\n let tok = parser.gullet.popToken();\n if (tok.text === \"=\") {\n // consume optional equals\n tok = parser.gullet.popToken();\n if (tok.text === \" \") {\n // consume one optional space\n tok = parser.gullet.popToken();\n }\n }\n return tok;\n};\n\nconst letCommand = (parser, name, tok, global) => {\n let macro = parser.gullet.macros.get(tok.text);\n if (macro == null) {\n // don't expand it later even if a macro with the same name is defined\n // e.g., \\let\\foo=\\frac \\def\\frac{\\relax} \\frac12\n tok.noexpand = true;\n macro = {\n tokens: [tok],\n numArgs: 0,\n // reproduce the same behavior in expansion\n unexpandable: !parser.gullet.isExpandable(tok.text)\n };\n }\n parser.gullet.macros.set(name, macro, global);\n};\n\n// <assignment> -> <non-macro assignment>|<macro assignment>\n// <non-macro assignment> -> <simple assignment>|\\global<non-macro assignment>\n// <macro assignment> -> <definition>|<prefix><macro assignment>\n// <prefix> -> \\global|\\long|\\outer\ndefineFunction({\n type: \"internal\",\n names: [\n \"\\\\global\",\n \"\\\\long\",\n \"\\\\\\\\globallong\" // can\u2019t be entered directly\n ],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler({ parser, funcName }) {\n parser.consumeSpaces();\n const token = parser.fetch();\n if (globalMap[token.text]) {\n // Temml doesn't have \\par, so ignore \\long\n if (funcName === \"\\\\global\" || funcName === \"\\\\\\\\globallong\") {\n token.text = globalMap[token.text];\n }\n return assertNodeType(parser.parseFunction(), \"internal\");\n }\n throw new ParseError(`Invalid token after macro prefix`, token);\n }\n});\n\n// Basic support for macro definitions: \\def, \\gdef, \\edef, \\xdef\n// <definition> -> <def><control sequence><definition text>\n// <def> -> \\def|\\gdef|\\edef|\\xdef\n// <definition text> -> <parameter text><left brace><balanced text><right brace>\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\def\", \"\\\\gdef\", \"\\\\edef\", \"\\\\xdef\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler({ parser, funcName }) {\n let tok = parser.gullet.popToken();\n const name = tok.text;\n if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n throw new ParseError(\"Expected a control sequence\", tok);\n }\n\n let numArgs = 0;\n let insert;\n const delimiters = [[]];\n // <parameter text> contains no braces\n while (parser.gullet.future().text !== \"{\") {\n tok = parser.gullet.popToken();\n if (tok.text === \"#\") {\n // If the very last character of the <parameter text> is #, so that\n // this # is immediately followed by {, TeX will behave as if the {\n // had been inserted at the right end of both the parameter text\n // and the replacement text.\n if (parser.gullet.future().text === \"{\") {\n insert = parser.gullet.future();\n delimiters[numArgs].push(\"{\");\n break;\n }\n\n // A parameter, the first appearance of # must be followed by 1,\n // the next by 2, and so on; up to nine #\u2019s are allowed\n tok = parser.gullet.popToken();\n if (!/^[1-9]$/.test(tok.text)) {\n throw new ParseError(`Invalid argument number \"$tok.text}\"`);\n }\n if (parseInt(tok.text) !== numArgs + 1) {\n throw new ParseError(`Argument number \"$tok.text}\" out of order`);\n }\n numArgs++;\n delimiters.push([]);\n } else if (tok.text === \"EOF\") {\n throw new ParseError(\"Expected a macro definition\");\n } else {\n delimiters[numArgs].push(tok.text);\n }\n }\n // replacement text, enclosed in '{' and '}' and properly nested\n let { tokens } = parser.gullet.consumeArg();\n if (insert) {\n tokens.unshift(insert);\n }\n\n if (funcName === \"\\\\edef\" || funcName === \"\\\\xdef\") {\n tokens = parser.gullet.expandTokens(tokens);\n if (tokens.length > parser.gullet.settings.maxExpand) {\n throw new ParseError(\"Too many expansions in an \" + funcName);\n }\n tokens.reverse(); // to fit in with stack order\n }\n // Final arg is the expansion of the macro\n parser.gullet.macros.set(\n name,\n { tokens, numArgs, delimiters },\n funcName === globalMap[funcName]\n );\n return { type: \"internal\", mode: parser.mode };\n }\n});\n\n// <simple assignment> -> <let assignment>\n// <let assignment> -> \\futurelet<control sequence><token><token>\n// | \\let<control sequence><equals><one optional space><token>\n// <equals> -> <optional spaces>|<optional spaces>=\ndefineFunction({\n type: \"internal\",\n names: [\n \"\\\\let\",\n \"\\\\\\\\globallet\" // can\u2019t be entered directly\n ],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler({ parser, funcName }) {\n const name = checkControlSequence(parser.gullet.popToken());\n parser.gullet.consumeSpaces();\n const tok = getRHS(parser);\n letCommand(parser, name, tok, funcName === \"\\\\\\\\globallet\");\n return { type: \"internal\", mode: parser.mode };\n }\n});\n\n// ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf\ndefineFunction({\n type: \"internal\",\n names: [\n \"\\\\futurelet\",\n \"\\\\\\\\globalfuture\" // can\u2019t be entered directly\n ],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler({ parser, funcName }) {\n const name = checkControlSequence(parser.gullet.popToken());\n const middle = parser.gullet.popToken();\n const tok = parser.gullet.popToken();\n letCommand(parser, name, tok, funcName === \"\\\\\\\\globalfuture\");\n parser.gullet.pushToken(tok);\n parser.gullet.pushToken(middle);\n return { type: \"internal\", mode: parser.mode };\n }\n});\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\newcommand\", \"\\\\renewcommand\", \"\\\\providecommand\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler({ parser, funcName }) {\n let name = \"\";\n const tok = parser.gullet.popToken();\n if (tok.text === \"{\") {\n name = checkControlSequence(parser.gullet.popToken());\n parser.gullet.popToken();\n } else {\n name = checkControlSequence(tok);\n }\n\n const exists = parser.gullet.isDefined(name);\n if (exists && funcName === \"\\\\newcommand\") {\n throw new ParseError(\n `\\\\newcommand{$name}} attempting to redefine $name}; use \\\\renewcommand`\n );\n }\n if (!exists && funcName === \"\\\\renewcommand\") {\n throw new ParseError(\n `\\\\renewcommand{$name}} when command $name} does not yet exist; use \\\\newcommand`\n );\n }\n\n let numArgs = 0;\n if (parser.gullet.future().text === \"[\") {\n let tok = parser.gullet.popToken();\n tok = parser.gullet.popToken();\n if (!/^[0-9]$/.test(tok.text)) {\n throw new ParseError(`Invalid number of arguments: \"$tok.text}\"`);\n }\n numArgs = parseInt(tok.text);\n tok = parser.gullet.popToken();\n if (tok.text !== \"]\") {\n throw new ParseError(`Invalid argument \"$tok.text}\"`);\n }\n }\n\n // replacement text, enclosed in '{' and '}' and properly nested\n const { tokens } = parser.gullet.consumeArg();\n\n if (!(funcName === \"\\\\providecommand\" && parser.gullet.macros.has(name))) {\n // Ignore \\providecommand\n parser.gullet.macros.set(\n name,\n { tokens, numArgs }\n );\n }\n\n return { type: \"internal\", mode: parser.mode };\n\n }\n});\n\n// Extra data needed for the delimiter handler down below\nconst delimiterSizes = {\n \"\\\\bigl\": { mclass: \"mopen\", size: 1 },\n \"\\\\Bigl\": { mclass: \"mopen\", size: 2 },\n \"\\\\biggl\": { mclass: \"mopen\", size: 3 },\n \"\\\\Biggl\": { mclass: \"mopen\", size: 4 },\n \"\\\\bigr\": { mclass: \"mclose\", size: 1 },\n \"\\\\Bigr\": { mclass: \"mclose\", size: 2 },\n \"\\\\biggr\": { mclass: \"mclose\", size: 3 },\n \"\\\\Biggr\": { mclass: \"mclose\", size: 4 },\n \"\\\\bigm\": { mclass: \"mrel\", size: 1 },\n \"\\\\Bigm\": { mclass: \"mrel\", size: 2 },\n \"\\\\biggm\": { mclass: \"mrel\", size: 3 },\n \"\\\\Biggm\": { mclass: \"mrel\", size: 4 },\n \"\\\\big\": { mclass: \"mord\", size: 1 },\n \"\\\\Big\": { mclass: \"mord\", size: 2 },\n \"\\\\bigg\": { mclass: \"mord\", size: 3 },\n \"\\\\Bigg\": { mclass: \"mord\", size: 4 }\n};\n\nconst delimiters = [\n \"(\",\n \"\\\\lparen\",\n \")\",\n \"\\\\rparen\",\n \"[\",\n \"\\\\lbrack\",\n \"]\",\n \"\\\\rbrack\",\n \"\\\\{\",\n \"\\\\lbrace\",\n \"\\\\}\",\n \"\\\\rbrace\",\n \"\u2987\",\n \"\\\\llparenthesis\",\n \"\u2988\",\n \"\\\\rrparenthesis\",\n \"\\\\lfloor\",\n \"\\\\rfloor\",\n \"\\u230a\",\n \"\\u230b\",\n \"\\\\lceil\",\n \"\\\\rceil\",\n \"\\u2308\",\n \"\\u2309\",\n \"<\",\n \">\",\n \"\\\\langle\",\n \"\\u27e8\",\n \"\\\\rangle\",\n \"\\u27e9\",\n \"\\\\lAngle\",\n \"\\u27ea\",\n \"\\\\rAngle\",\n \"\\u27eb\",\n \"\\\\llangle\",\n \"\u2989\",\n \"\\\\rrangle\",\n \"\u298A\",\n \"\\\\lt\",\n \"\\\\gt\",\n \"\\\\lvert\",\n \"\\\\rvert\",\n \"\\\\lVert\",\n \"\\\\rVert\",\n \"\\\\lgroup\",\n \"\\\\rgroup\",\n \"\\u27ee\",\n \"\\u27ef\",\n \"\\\\lmoustache\",\n \"\\\\rmoustache\",\n \"\\u23b0\",\n \"\\u23b1\",\n \"\\\\llbracket\",\n \"\\\\rrbracket\",\n \"\\u27e6\",\n \"\\u27e6\",\n \"\\\\lBrace\",\n \"\\\\rBrace\",\n \"\\u2983\",\n \"\\u2984\",\n \"/\",\n \"\\\\backslash\",\n \"|\",\n \"\\\\vert\",\n \"\\\\|\",\n \"\\\\Vert\",\n \"\\u2016\",\n \"\\\\uparrow\",\n \"\\\\Uparrow\",\n \"\\\\downarrow\",\n \"\\\\Downarrow\",\n \"\\\\updownarrow\",\n \"\\\\Updownarrow\",\n \".\"\n];\n\n// Export isDelimiter for benefit of parser.\nconst dels = [\"}\", \"\\\\left\", \"\\\\middle\", \"\\\\right\"];\nconst isDelimiter = str => str.length > 0 &&\n (delimiters.includes(str) || delimiterSizes[str] || dels.includes(str));\n\n// Metrics of the different sizes. Found by looking at TeX's output of\n// $\\bigl| // \\Bigl| \\biggl| \\Biggl| \\showlists$\n// Used to create stacked delimiters of appropriate sizes in makeSizedDelim.\nconst sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];\n\n// Delimiter functions\nfunction checkDelimiter(delim, context) {\n const symDelim = checkSymbolNodeType(delim);\n if (symDelim && delimiters.includes(symDelim.text)) {\n // If a character is not in the MathML operator dictionary, it will not stretch.\n // Replace such characters w/characters that will stretch.\n if ([\"<\", \"\\\\lt\"].includes(symDelim.text)) { symDelim.text = \"\u27E8\"; }\n if ([\">\", \"\\\\gt\"].includes(symDelim.text)) { symDelim.text = \"\u27E9\"; }\n return symDelim;\n } else if (symDelim) {\n throw new ParseError(`Invalid delimiter '$symDelim.text}' after '$context.funcName}'`, delim);\n } else {\n throw new ParseError(`Invalid delimiter type '$delim.type}'`, delim);\n }\n}\n\n// / \\\nconst needExplicitStretch = [\"\\u002F\", \"\\u005C\", \"\\\\backslash\", \"\\\\vert\", \"|\"];\n\ndefineFunction({\n type: \"delimsizing\",\n names: [\n \"\\\\bigl\",\n \"\\\\Bigl\",\n \"\\\\biggl\",\n \"\\\\Biggl\",\n \"\\\\bigr\",\n \"\\\\Bigr\",\n \"\\\\biggr\",\n \"\\\\Biggr\",\n \"\\\\bigm\",\n \"\\\\Bigm\",\n \"\\\\biggm\",\n \"\\\\Biggm\",\n \"\\\\big\",\n \"\\\\Big\",\n \"\\\\bigg\",\n \"\\\\Bigg\"\n ],\n props: {\n numArgs: 1,\n argTypes: [\"primitive\"]\n },\n handler: (context, args) => {\n const delim = checkDelimiter(args[0], context);\n\n return {\n type: \"delimsizing\",\n mode: context.parser.mode,\n size: delimiterSizes[context.funcName].size,\n mclass: delimiterSizes[context.funcName].mclass,\n delim: delim.text\n };\n },\n mathmlBuilder: (group) => {\n const children = [];\n\n if (group.delim === \".\") { group.delim = \"\"; }\n children.push(makeText(group.delim, group.mode));\n\n const node = new mathMLTree.MathNode(\"mo\", children);\n\n if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n // Only some of the delimsizing functions act as fences, and they\n // return \"mopen\" or \"mclose\" mclass.\n node.setAttribute(\"fence\", \"true\");\n } else {\n // Explicitly disable fencing if it's not a fence, to override the\n // defaults.\n node.setAttribute(\"fence\", \"false\");\n }\n if (needExplicitStretch.includes(group.delim) || group.delim.indexOf(\"arrow\") > -1) {\n // We have to explicitly set stretchy to true.\n node.setAttribute(\"stretchy\", \"true\");\n }\n node.setAttribute(\"symmetric\", \"true\"); // Needed for tall arrows in Firefox.\n node.setAttribute(\"minsize\", sizeToMaxHeight[group.size] + \"em\");\n node.setAttribute(\"maxsize\", sizeToMaxHeight[group.size] + \"em\");\n return node;\n }\n});\n\nfunction assertParsed(group) {\n if (!group.body) {\n throw new Error(\"Bug: The leftright ParseNode wasn't fully parsed.\");\n }\n}\n\ndefineFunction({\n type: \"leftright-right\",\n names: [\"\\\\right\"],\n props: {\n numArgs: 1,\n argTypes: [\"primitive\"]\n },\n handler: (context, args) => {\n return {\n type: \"leftright-right\",\n mode: context.parser.mode,\n delim: checkDelimiter(args[0], context).text\n };\n }\n});\n\ndefineFunction({\n type: \"leftright\",\n names: [\"\\\\left\"],\n props: {\n numArgs: 1,\n argTypes: [\"primitive\"]\n },\n handler: (context, args) => {\n const delim = checkDelimiter(args[0], context);\n\n const parser = context.parser;\n // Parse out the implicit body\n ++parser.leftrightDepth;\n // parseExpression stops before '\\\\right' or `\\\\middle`\n let body = parser.parseExpression(false, null, true);\n let nextToken = parser.fetch();\n while (nextToken.text === \"\\\\middle\") {\n // `\\middle`, from the \u03B5-TeX package, ends one group and starts another group.\n // We had to parse this expression with `breakOnMiddle` enabled in order\n // to get TeX-compliant parsing of \\over.\n // But we do not want, at this point, to end on \\middle, so continue\n // to parse until we fetch a `\\right`.\n parser.consume();\n const middle = parser.fetch().text;\n if (!symbols.math[middle]) {\n throw new ParseError(`Invalid delimiter '$middle}' after '\\\\middle'`);\n }\n checkDelimiter({ type: \"atom\", mode: \"math\", text: middle }, { funcName: \"\\\\middle\" });\n body.push({ type: \"middle\", mode: \"math\", delim: middle });\n parser.consume();\n body = body.concat(parser.parseExpression(false, null, true));\n nextToken = parser.fetch();\n }\n --parser.leftrightDepth;\n // Check the next token\n parser.expect(\"\\\\right\", false);\n const right = assertNodeType(parser.parseFunction(), \"leftright-right\");\n return {\n type: \"leftright\",\n mode: parser.mode,\n body,\n left: delim.text,\n right: right.delim\n };\n },\n mathmlBuilder: (group, style) => {\n assertParsed(group);\n const inner = buildExpression(group.body, style);\n\n if (group.left === \".\") { group.left = \"\"; }\n const leftNode = new mathMLTree.MathNode(\"mo\", [makeText(group.left, group.mode)]);\n leftNode.setAttribute(\"fence\", \"true\");\n leftNode.setAttribute(\"form\", \"prefix\");\n if (group.left === \"/\" || group.left === \"\\u005C\" || group.left.indexOf(\"arrow\") > -1) {\n leftNode.setAttribute(\"stretchy\", \"true\");\n }\n inner.unshift(leftNode);\n\n if (group.right === \".\") { group.right = \"\"; }\n const rightNode = new mathMLTree.MathNode(\"mo\", [makeText(group.right, group.mode)]);\n rightNode.setAttribute(\"fence\", \"true\");\n rightNode.setAttribute(\"form\", \"postfix\");\n if (group.right === \"\\u2216\" || group.right.indexOf(\"arrow\") > -1) {\n rightNode.setAttribute(\"stretchy\", \"true\");\n }\n if (group.body.length > 0) {\n const lastElement = group.body[group.body.length - 1];\n if (lastElement.type === \"color\" && !lastElement.isTextColor) {\n // \\color is a switch. If the last element is of type \"color\" then\n // the user set the \\color switch and left it on.\n // A \\right delimiter turns the switch off, but the delimiter itself gets the color.\n rightNode.setAttribute(\"mathcolor\", lastElement.color);\n }\n }\n inner.push(rightNode);\n\n return makeRow(inner);\n }\n});\n\ndefineFunction({\n type: \"middle\",\n names: [\"\\\\middle\"],\n props: {\n numArgs: 1,\n argTypes: [\"primitive\"]\n },\n handler: (context, args) => {\n const delim = checkDelimiter(args[0], context);\n if (!context.parser.leftrightDepth) {\n throw new ParseError(\"\\\\middle without preceding \\\\left\", delim);\n }\n\n return {\n type: \"middle\",\n mode: context.parser.mode,\n delim: delim.text\n };\n },\n mathmlBuilder: (group, style) => {\n const textNode = makeText(group.delim, group.mode);\n const middleNode = new mathMLTree.MathNode(\"mo\", [textNode]);\n middleNode.setAttribute(\"fence\", \"true\");\n if (group.delim.indexOf(\"arrow\") > -1) {\n middleNode.setAttribute(\"stretchy\", \"true\");\n }\n // The next line is not semantically correct, but\n // Chromium fails to stretch if it is not there.\n middleNode.setAttribute(\"form\", \"prefix\");\n // MathML gives 5/18em spacing to each <mo> element.\n // \\middle should get delimiter spacing instead.\n middleNode.setAttribute(\"lspace\", \"0.05em\");\n middleNode.setAttribute(\"rspace\", \"0.05em\");\n return middleNode;\n }\n});\n\nconst padding$1 = _ => {\n const node = new mathMLTree.MathNode(\"mspace\");\n node.setAttribute(\"width\", \"3pt\");\n return node\n};\n\nconst mathmlBuilder$8 = (group, style) => {\n let node;\n if (group.label.indexOf(\"colorbox\") > -1 || group.label === \"\\\\boxed\") {\n // MathML core does not support +width attribute in <mpadded>.\n // Firefox does not reliably add side padding.\n // Insert <mspace>\n node = new mathMLTree.MathNode(\"mrow\", [\n padding$1(),\n buildGroup$1(group.body, style),\n padding$1()\n ]);\n } else {\n node = new mathMLTree.MathNode(\"menclose\", [buildGroup$1(group.body, style)]);\n }\n switch (group.label) {\n case \"\\\\overline\":\n node.setAttribute(\"notation\", \"top\"); // for Firefox & WebKit\n node.classes.push(\"tml-overline\"); // for Chromium\n break\n case \"\\\\underline\":\n node.setAttribute(\"notation\", \"bottom\");\n node.classes.push(\"tml-underline\");\n break\n case \"\\\\cancel\":\n node.setAttribute(\"notation\", \"updiagonalstrike\");\n node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"tml-cancel\", \"upstrike\"]));\n break\n case \"\\\\bcancel\":\n node.setAttribute(\"notation\", \"downdiagonalstrike\");\n node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"tml-cancel\", \"downstrike\"]));\n break\n case \"\\\\sout\":\n node.setAttribute(\"notation\", \"horizontalstrike\");\n node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"tml-cancel\", \"sout\"]));\n break\n case \"\\\\xcancel\":\n node.setAttribute(\"notation\", \"updiagonalstrike downdiagonalstrike\");\n node.classes.push(\"tml-xcancel\");\n break\n case \"\\\\longdiv\":\n node.setAttribute(\"notation\", \"longdiv\");\n node.classes.push(\"longdiv-top\");\n node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"longdiv-arc\"]));\n break\n case \"\\\\phase\":\n node.setAttribute(\"notation\", \"phasorangle\");\n node.classes.push(\"phasor-bottom\");\n node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"phasor-angle\"]));\n break\n case \"\\\\textcircled\":\n node.setAttribute(\"notation\", \"circle\");\n node.classes.push(\"circle-pad\");\n node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"textcircle\"]));\n break\n case \"\\\\angl\":\n node.setAttribute(\"notation\", \"actuarial\");\n node.classes.push(\"actuarial\");\n break\n case \"\\\\boxed\":\n // \\newcommand{\\boxed}[1]{\\fbox{\\m@th$\\displaystyle#1$}} from amsmath.sty\n node.setAttribute(\"notation\", \"box\");\n node.classes.push(\"tml-box\");\n node.setAttribute(\"scriptlevel\", \"0\");\n node.setAttribute(\"displaystyle\", \"true\");\n break\n case \"\\\\fbox\":\n node.setAttribute(\"notation\", \"box\");\n node.classes.push(\"tml-fbox\");\n break\n case \"\\\\fcolorbox\":\n case \"\\\\colorbox\": {\n // <menclose> doesn't have a good notation option for \\colorbox.\n // So use <mpadded> instead. Set some attributes that come\n // included with <menclose>.\n //const fboxsep = 3; // 3 pt from LaTeX source2e\n //node.setAttribute(\"height\", `+$2 * fboxsep}pt`)\n //node.setAttribute(\"voffset\", `${fboxsep}pt`)\n const style = { padding: \"3pt 0 3pt 0\" };\n\n if (group.label === \"\\\\fcolorbox\") {\n style.border = \"0.0667em solid \" + String(group.borderColor);\n }\n node.style = style;\n break\n }\n }\n if (group.backgroundColor) {\n node.setAttribute(\"mathbackground\", group.backgroundColor);\n }\n return node;\n};\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\colorbox\"],\n props: {\n numArgs: 2,\n numOptionalArgs: 1,\n allowedInText: true,\n argTypes: [\"raw\", \"raw\", \"text\"]\n },\n handler({ parser, funcName }, args, optArgs) {\n const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n let color = \"\";\n if (model) {\n const spec = assertNodeType(args[0], \"raw\").string;\n color = colorFromSpec(model, spec);\n } else {\n color = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros);\n }\n const body = args[1];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n backgroundColor: color,\n body\n };\n },\n mathmlBuilder: mathmlBuilder$8\n});\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\fcolorbox\"],\n props: {\n numArgs: 3,\n numOptionalArgs: 1,\n allowedInText: true,\n argTypes: [\"raw\", \"raw\", \"raw\", \"text\"]\n },\n handler({ parser, funcName }, args, optArgs) {\n const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n let borderColor = \"\";\n let backgroundColor;\n if (model) {\n const borderSpec = assertNodeType(args[0], \"raw\").string;\n const backgroundSpec = assertNodeType(args[0], \"raw\").string;\n borderColor = colorFromSpec(model, borderSpec);\n backgroundColor = colorFromSpec(model, backgroundSpec);\n } else {\n borderColor = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros);\n backgroundColor = validateColor(assertNodeType(args[1], \"raw\").string, parser.gullet.macros);\n }\n const body = args[2];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n backgroundColor,\n borderColor,\n body\n };\n },\n mathmlBuilder: mathmlBuilder$8\n});\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\fbox\"],\n props: {\n numArgs: 1,\n argTypes: [\"hbox\"],\n allowedInText: true\n },\n handler({ parser }, args) {\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: \"\\\\fbox\",\n body: args[0]\n };\n }\n});\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\angl\", \"\\\\cancel\", \"\\\\bcancel\", \"\\\\xcancel\", \"\\\\sout\", \"\\\\overline\",\n \"\\\\boxed\", \"\\\\longdiv\", \"\\\\phase\"],\n props: {\n numArgs: 1\n },\n handler({ parser, funcName }, args) {\n const body = args[0];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n body\n };\n },\n mathmlBuilder: mathmlBuilder$8\n});\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\underline\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler({ parser, funcName }, args) {\n const body = args[0];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n body\n };\n },\n mathmlBuilder: mathmlBuilder$8\n});\n\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\textcircled\"],\n props: {\n numArgs: 1,\n argTypes: [\"text\"],\n allowedInArgument: true,\n allowedInText: true\n },\n handler({ parser, funcName }, args) {\n const body = args[0];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n body\n };\n },\n mathmlBuilder: mathmlBuilder$8\n});\n\n/**\n * All registered environments.\n * `environments.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `environments.js`.\n */\nconst _environments = {};\n\nfunction defineEnvironment({ type, names, props, handler, mathmlBuilder }) {\n // Set default values of environments.\n const data = {\n type,\n numArgs: props.numArgs || 0,\n allowedInText: false,\n numOptionalArgs: 0,\n handler\n };\n for (let i = 0; i < names.length; ++i) {\n _environments[names[i]] = data;\n }\n if (mathmlBuilder) {\n _mathmlGroupBuilders[type] = mathmlBuilder;\n }\n}\n\n/**\n * Lexing or parsing positional information for error reporting.\n * This object is immutable.\n */\nclass SourceLocation {\n constructor(lexer, start, end) {\n this.lexer = lexer; // Lexer holding the input string.\n this.start = start; // Start offset, zero-based inclusive.\n this.end = end; // End offset, zero-based exclusive.\n }\n\n /**\n * Merges two `SourceLocation`s from location providers, given they are\n * provided in order of appearance.\n * - Returns the first one's location if only the first is provided.\n * - Returns a merged range of the first and the last if both are provided\n * and their lexers match.\n * - Otherwise, returns null.\n */\n static range(first, second) {\n if (!second) {\n return first && first.loc;\n } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) {\n return null;\n } else {\n return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end);\n }\n }\n}\n\n/**\n * Interface required to break circular dependency between Token, Lexer, and\n * ParseError.\n */\n\n/**\n * The resulting token returned from `lex`.\n *\n * It consists of the token text plus some position information.\n * The position information is essentially a range in an input string,\n * but instead of referencing the bare input string, we refer to the lexer.\n * That way it is possible to attach extra metadata to the input string,\n * like for example a file name or similar.\n *\n * The position information is optional, so it is OK to construct synthetic\n * tokens if appropriate. Not providing available position information may\n * lead to degraded error reporting, though.\n */\nclass Token {\n constructor(\n text, // the text of this token\n loc\n ) {\n this.text = text;\n this.loc = loc;\n }\n\n /**\n * Given a pair of tokens (this and endToken), compute a `Token` encompassing\n * the whole input range enclosed by these two.\n */\n range(\n endToken, // last token of the range, inclusive\n text // the text of the newly constructed token\n ) {\n return new Token(text, SourceLocation.range(this, endToken));\n }\n}\n\n// In TeX, there are actually three sets of dimensions, one for each of\n// textstyle, scriptstyle, and scriptscriptstyle. These are\n// provided in the the arrays below, in that order.\n//\n\n// Math style is not quite the same thing as script level.\nconst StyleLevel = {\n DISPLAY: 0,\n TEXT: 1,\n SCRIPT: 2,\n SCRIPTSCRIPT: 3\n};\n\n/**\n * All registered global/built-in macros.\n * `macros.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `macros.js`.\n */\nconst _macros = {};\n\n// This function might one day accept an additional argument and do more things.\nfunction defineMacro(name, body) {\n _macros[name] = body;\n}\n\n/**\n * Predefined macros for Temml.\n * This can be used to define some commands in terms of others.\n */\n\nconst macros = _macros;\n\n//////////////////////////////////////////////////////////////////////\n// macro tools\n\ndefineMacro(\"\\\\noexpand\", function(context) {\n // The expansion is the token itself; but that token is interpreted\n // as if its meaning were \u2018\\relax\u2019 if it is a control sequence that\n // would ordinarily be expanded by TeX\u2019s expansion rules.\n const t = context.popToken();\n if (context.isExpandable(t.text)) {\n t.noexpand = true;\n t.treatAsRelax = true;\n }\n return { tokens: [t], numArgs: 0 };\n});\n\ndefineMacro(\"\\\\expandafter\", function(context) {\n // TeX first reads the token that comes immediately after \\expandafter,\n // without expanding it; let\u2019s call this token t. Then TeX reads the\n // token that comes after t (and possibly more tokens, if that token\n // has an argument), replacing it by its expansion. Finally TeX puts\n // t back in front of that expansion.\n const t = context.popToken();\n context.expandOnce(true); // expand only an expandable token\n return { tokens: [t], numArgs: 0 };\n});\n\n// LaTeX's \\@firstoftwo{#1}{#2} expands to #1, skipping #2\n// TeX source: \\long\\def\\@firstoftwo#1#2{#1}\ndefineMacro(\"\\\\@firstoftwo\", function(context) {\n const args = context.consumeArgs(2);\n return { tokens: args[0], numArgs: 0 };\n});\n\n// LaTeX's \\@secondoftwo{#1}{#2} expands to #2, skipping #1\n// TeX source: \\long\\def\\@secondoftwo#1#2{#2}\ndefineMacro(\"\\\\@secondoftwo\", function(context) {\n const args = context.consumeArgs(2);\n return { tokens: args[1], numArgs: 0 };\n});\n\n// LaTeX's \\@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)\n// symbol that isn't a space, consuming any spaces but not consuming the\n// first nonspace character. If that nonspace character matches #1, then\n// the macro expands to #2; otherwise, it expands to #3.\ndefineMacro(\"\\\\@ifnextchar\", function(context) {\n const args = context.consumeArgs(3); // symbol, if, else\n context.consumeSpaces();\n const nextToken = context.future();\n if (args[0].length === 1 && args[0][0].text === nextToken.text) {\n return { tokens: args[1], numArgs: 0 };\n } else {\n return { tokens: args[2], numArgs: 0 };\n }\n});\n\n// LaTeX's \\@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.\n// If it is `*`, then it consumes the symbol, and the macro expands to #1;\n// otherwise, the macro expands to #2 (without consuming the symbol).\n// TeX source: \\def\\@ifstar#1{\\@ifnextchar *{\\@firstoftwo{#1}}}\ndefineMacro(\"\\\\@ifstar\", \"\\\\@ifnextchar *{\\\\@firstoftwo{#1}}\");\n\n// LaTeX's \\TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode\ndefineMacro(\"\\\\TextOrMath\", function(context) {\n const args = context.consumeArgs(2);\n if (context.mode === \"text\") {\n return { tokens: args[0], numArgs: 0 };\n } else {\n return { tokens: args[1], numArgs: 0 };\n }\n});\n\nconst stringFromArg = arg => {\n // Reverse the order of the arg and return a string.\n let str = \"\";\n for (let i = arg.length - 1; i > -1; i--) {\n str += arg[i].text;\n }\n return str\n};\n\n// Lookup table for parsing numbers in base 8 through 16\nconst digitToNumber = {\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3,\n 4: 4,\n 5: 5,\n 6: 6,\n 7: 7,\n 8: 8,\n 9: 9,\n a: 10,\n A: 10,\n b: 11,\n B: 11,\n c: 12,\n C: 12,\n d: 13,\n D: 13,\n e: 14,\n E: 14,\n f: 15,\n F: 15\n};\n\nconst nextCharNumber = context => {\n const numStr = context.future().text;\n if (numStr === \"EOF\") { return [null, \"\"] }\n return [digitToNumber[numStr.charAt(0)], numStr]\n};\n\nconst appendCharNumbers = (number, numStr, base) => {\n for (let i = 1; i < numStr.length; i++) {\n const digit = digitToNumber[numStr.charAt(i)];\n number *= base;\n number += digit;\n }\n return number\n};\n\n// TeX \\char makes a literal character (catcode 12) using the following forms:\n// (see The TeXBook, p. 43)\n// \\char123 -- decimal\n// \\char'123 -- octal\n// \\char\"123 -- hex\n// \\char`x -- character that can be written (i.e. isn't active)\n// \\char`\\x -- character that cannot be written (e.g. %)\n// These all refer to characters from the font, so we turn them into special\n// calls to a function \\@char dealt with in the Parser.\ndefineMacro(\"\\\\char\", function(context) {\n let token = context.popToken();\n let base;\n let number = \"\";\n if (token.text === \"'\") {\n base = 8;\n token = context.popToken();\n } else if (token.text === '\"') {\n base = 16;\n token = context.popToken();\n } else if (token.text === \"`\") {\n token = context.popToken();\n if (token.text[0] === \"\\\\\") {\n number = token.text.charCodeAt(1);\n } else if (token.text === \"EOF\") {\n throw new ParseError(\"\\\\char` missing argument\");\n } else {\n number = token.text.charCodeAt(0);\n }\n } else {\n base = 10;\n }\n if (base) {\n // Parse a number in the given base, starting with first `token`.\n let numStr = token.text;\n number = digitToNumber[numStr.charAt(0)];\n if (number == null || number >= base) {\n throw new ParseError(`Invalid base-$base} digit $token.text}`);\n }\n number = appendCharNumbers(number, numStr, base);\n let digit;\n [digit, numStr] = nextCharNumber(context);\n while (digit != null && digit < base) {\n number *= base;\n number += digit;\n number = appendCharNumbers(number, numStr, base);\n context.popToken();\n [digit, numStr] = nextCharNumber(context);\n }\n }\n return `\\\\@char{$number}}`;\n});\n\nfunction recreateArgStr(context) {\n // Recreate the macro's original argument string from the array of parse tokens.\n const tokens = context.consumeArgs(1)[0];\n let str = \"\";\n let expectedLoc = tokens[tokens.length - 1].loc.start;\n for (let i = tokens.length - 1; i >= 0; i--) {\n const actualLoc = tokens[i].loc.start;\n if (actualLoc > expectedLoc) {\n // context.consumeArgs has eaten a space.\n str += \" \";\n expectedLoc = actualLoc;\n }\n str += tokens[i].text;\n expectedLoc += tokens[i].text.length;\n }\n return str\n}\n\n// The Latin Modern font renders <mi>\u221A</mi> at the wrong vertical alignment.\n// This macro provides a better rendering.\ndefineMacro(\"\\\\surd\", '\\\\sqrt{\\\\vphantom{|}}');\n\n// See comment for \\oplus in symbols.js.\ndefineMacro(\"\\u2295\", \"\\\\oplus\");\n\n// Since Temml has no \\par, ignore \\long.\ndefineMacro(\"\\\\long\", \"\");\n\n//////////////////////////////////////////////////////////////////////\n// Grouping\n// \\let\\bgroup={ \\let\\egroup=}\ndefineMacro(\"\\\\bgroup\", \"{\");\ndefineMacro(\"\\\\egroup\", \"}\");\n\n// Symbols from latex.ltx:\n// \\def~{\\nobreakspace{}}\n// \\def\\lq{`}\n// \\def\\rq{'}\n// \\def \\aa {\\r a}\ndefineMacro(\"~\", \"\\\\nobreakspace\");\ndefineMacro(\"\\\\lq\", \"`\");\ndefineMacro(\"\\\\rq\", \"'\");\ndefineMacro(\"\\\\aa\", \"\\\\r a\");\n\ndefineMacro(\"\\\\Bbbk\", \"\\\\Bbb{k}\");\n\n// \\mathstrut from the TeXbook, p 360\ndefineMacro(\"\\\\mathstrut\", \"\\\\vphantom{(}\");\n\n// \\underbar from TeXbook p 353\ndefineMacro(\"\\\\underbar\", \"\\\\underline{\\\\text{#1}}\");\n\n//////////////////////////////////////////////////////////////////////\n// LaTeX_2\u03B5\n\n// \\vdots{\\vbox{\\baselineskip4\\p@ \\lineskiplimit\\z@\n// \\kern6\\p@\\hbox{.}\\hbox{.}\\hbox{.}}}\n// We'll call \\varvdots, which gets a glyph from symbols.js.\n// The zero-width rule gets us an equivalent to the vertical 6pt kern.\ndefineMacro(\"\\\\vdots\", \"{\\\\varvdots\\\\rule{0pt}{15pt}}\");\ndefineMacro(\"\\u22ee\", \"\\\\vdots\");\n\n// {array} environment gaps\ndefineMacro(\"\\\\arraystretch\", \"1\"); // line spacing factor times 12pt\ndefineMacro(\"\\\\arraycolsep\", \"6pt\"); // half the width separating columns\n\n//////////////////////////////////////////////////////////////////////\n// amsmath.sty\n// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf\n\n//\\newcommand{\\substack}[1]{\\subarray{c}#1\\endsubarray}\ndefineMacro(\"\\\\substack\", \"\\\\begin{subarray}{c}#1\\\\end{subarray}\");\n\n// \\def\\iff{\\DOTSB\\;\\Longleftrightarrow\\;}\n// \\def\\implies{\\DOTSB\\;\\Longrightarrow\\;}\n// \\def\\impliedby{\\DOTSB\\;\\Longleftarrow\\;}\ndefineMacro(\"\\\\iff\", \"\\\\DOTSB\\\\;\\\\Longleftrightarrow\\\\;\");\ndefineMacro(\"\\\\implies\", \"\\\\DOTSB\\\\;\\\\Longrightarrow\\\\;\");\ndefineMacro(\"\\\\impliedby\", \"\\\\DOTSB\\\\;\\\\Longleftarrow\\\\;\");\n\n// AMSMath's automatic \\dots, based on \\mdots@@ macro.\nconst dotsByToken = {\n \",\": \"\\\\dotsc\",\n \"\\\\not\": \"\\\\dotsb\",\n // \\keybin@ checks for the following:\n \"+\": \"\\\\dotsb\",\n \"=\": \"\\\\dotsb\",\n \"<\": \"\\\\dotsb\",\n \">\": \"\\\\dotsb\",\n \"-\": \"\\\\dotsb\",\n \"*\": \"\\\\dotsb\",\n \":\": \"\\\\dotsb\",\n // Symbols whose definition starts with \\DOTSB:\n \"\\\\DOTSB\": \"\\\\dotsb\",\n \"\\\\coprod\": \"\\\\dotsb\",\n \"\\\\bigvee\": \"\\\\dotsb\",\n \"\\\\bigwedge\": \"\\\\dotsb\",\n \"\\\\biguplus\": \"\\\\dotsb\",\n \"\\\\bigcap\": \"\\\\dotsb\",\n \"\\\\bigcup\": \"\\\\dotsb\",\n \"\\\\prod\": \"\\\\dotsb\",\n \"\\\\sum\": \"\\\\dotsb\",\n \"\\\\bigotimes\": \"\\\\dotsb\",\n \"\\\\bigoplus\": \"\\\\dotsb\",\n \"\\\\bigodot\": \"\\\\dotsb\",\n \"\\\\bigsqcap\": \"\\\\dotsb\",\n \"\\\\bigsqcup\": \"\\\\dotsb\",\n \"\\\\bigtimes\": \"\\\\dotsb\",\n \"\\\\And\": \"\\\\dotsb\",\n \"\\\\longrightarrow\": \"\\\\dotsb\",\n \"\\\\Longrightarrow\": \"\\\\dotsb\",\n \"\\\\longleftarrow\": \"\\\\dotsb\",\n \"\\\\Longleftarrow\": \"\\\\dotsb\",\n \"\\\\longleftrightarrow\": \"\\\\dotsb\",\n \"\\\\Longleftrightarrow\": \"\\\\dotsb\",\n \"\\\\mapsto\": \"\\\\dotsb\",\n \"\\\\longmapsto\": \"\\\\dotsb\",\n \"\\\\hookrightarrow\": \"\\\\dotsb\",\n \"\\\\doteq\": \"\\\\dotsb\",\n // Symbols whose definition starts with \\mathbin:\n \"\\\\mathbin\": \"\\\\dotsb\",\n // Symbols whose definition starts with \\mathrel:\n \"\\\\mathrel\": \"\\\\dotsb\",\n \"\\\\relbar\": \"\\\\dotsb\",\n \"\\\\Relbar\": \"\\\\dotsb\",\n \"\\\\xrightarrow\": \"\\\\dotsb\",\n \"\\\\xleftarrow\": \"\\\\dotsb\",\n // Symbols whose definition starts with \\DOTSI:\n \"\\\\DOTSI\": \"\\\\dotsi\",\n \"\\\\int\": \"\\\\dotsi\",\n \"\\\\oint\": \"\\\\dotsi\",\n \"\\\\iint\": \"\\\\dotsi\",\n \"\\\\iiint\": \"\\\\dotsi\",\n \"\\\\iiiint\": \"\\\\dotsi\",\n \"\\\\idotsint\": \"\\\\dotsi\",\n // Symbols whose definition starts with \\DOTSX:\n \"\\\\DOTSX\": \"\\\\dotsx\"\n};\n\ndefineMacro(\"\\\\dots\", function(context) {\n // TODO: If used in text mode, should expand to \\textellipsis.\n // However, in Temml, \\textellipsis and \\ldots behave the same\n // (in text mode), and it's unlikely we'd see any of the math commands\n // that affect the behavior of \\dots when in text mode. So fine for now\n // (until we support \\ifmmode ... \\else ... \\fi).\n let thedots = \"\\\\dotso\";\n const next = context.expandAfterFuture().text;\n if (next in dotsByToken) {\n thedots = dotsByToken[next];\n } else if (next.slice(0, 4) === \"\\\\not\") {\n thedots = \"\\\\dotsb\";\n } else if (next in symbols.math) {\n if ([\"bin\", \"rel\"].includes(symbols.math[next].group)) {\n thedots = \"\\\\dotsb\";\n }\n }\n return thedots;\n});\n\nconst spaceAfterDots = {\n // \\rightdelim@ checks for the following:\n \")\": true,\n \"]\": true,\n \"\\\\rbrack\": true,\n \"\\\\}\": true,\n \"\\\\rbrace\": true,\n \"\\\\rangle\": true,\n \"\\\\rceil\": true,\n \"\\\\rfloor\": true,\n \"\\\\rgroup\": true,\n \"\\\\rmoustache\": true,\n \"\\\\right\": true,\n \"\\\\bigr\": true,\n \"\\\\biggr\": true,\n \"\\\\Bigr\": true,\n \"\\\\Biggr\": true,\n // \\extra@ also tests for the following:\n $: true,\n // \\extrap@ checks for the following:\n \";\": true,\n \".\": true,\n \",\": true\n};\n\ndefineMacro(\"\\\\dotso\", function(context) {\n const next = context.future().text;\n if (next in spaceAfterDots) {\n return \"\\\\ldots\\\\,\";\n } else {\n return \"\\\\ldots\";\n }\n});\n\ndefineMacro(\"\\\\dotsc\", function(context) {\n const next = context.future().text;\n // \\dotsc uses \\extra@ but not \\extrap@, instead specially checking for\n // ';' and '.', but doesn't check for ','.\n if (next in spaceAfterDots && next !== \",\") {\n return \"\\\\ldots\\\\,\";\n } else {\n return \"\\\\ldots\";\n }\n});\n\ndefineMacro(\"\\\\cdots\", function(context) {\n const next = context.future().text;\n if (next in spaceAfterDots) {\n return \"\\\\@cdots\\\\,\";\n } else {\n return \"\\\\@cdots\";\n }\n});\n\ndefineMacro(\"\\\\dotsb\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsm\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsi\", \"\\\\!\\\\cdots\");\ndefineMacro(\"\\\\idotsint\", \"\\\\dotsi\");\n// amsmath doesn't actually define \\dotsx, but \\dots followed by a macro\n// starting with \\DOTSX implies \\dotso, and then \\extra@ detects this case\n// and forces the added `\\,`.\ndefineMacro(\"\\\\dotsx\", \"\\\\ldots\\\\,\");\n\n// \\let\\DOTSI\\relax\n// \\let\\DOTSB\\relax\n// \\let\\DOTSX\\relax\ndefineMacro(\"\\\\DOTSI\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSB\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSX\", \"\\\\relax\");\n\n// Spacing, based on amsmath.sty's override of LaTeX defaults\n// \\DeclareRobustCommand{\\tmspace}[3]{%\n// \\ifmmode\\mskip#1#2\\else\\kern#1#3\\fi\\relax}\ndefineMacro(\"\\\\tmspace\", \"\\\\TextOrMath{\\\\kern#1#3}{\\\\mskip#1#2}\\\\relax\");\n// \\renewcommand{\\,}{\\tmspace+\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\,\", \"{\\\\tmspace+{3mu}{.1667em}}\");\n// \\let\\thinspace\\,\ndefineMacro(\"\\\\thinspace\", \"\\\\,\");\n// \\def\\>{\\mskip\\medmuskip}\n// \\renewcommand{\\:}{\\tmspace+\\medmuskip{.2222em}}\n// TODO: \\> and math mode of \\: should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\>\", \"\\\\mskip{4mu}\");\ndefineMacro(\"\\\\:\", \"{\\\\tmspace+{4mu}{.2222em}}\");\n// \\let\\medspace\\:\ndefineMacro(\"\\\\medspace\", \"\\\\:\");\n// \\renewcommand{\\;}{\\tmspace+\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip = 5mu plus 5mu\ndefineMacro(\"\\\\;\", \"{\\\\tmspace+{5mu}{.2777em}}\");\n// \\let\\thickspace\\;\ndefineMacro(\"\\\\thickspace\", \"\\\\;\");\n// \\renewcommand{\\!}{\\tmspace-\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\!\", \"{\\\\tmspace-{3mu}{.1667em}}\");\n// \\let\\negthinspace\\!\ndefineMacro(\"\\\\negthinspace\", \"\\\\!\");\n// \\newcommand{\\negmedspace}{\\tmspace-\\medmuskip{.2222em}}\n// TODO: math mode should use \\medmuskip\ndefineMacro(\"\\\\negmedspace\", \"{\\\\tmspace-{4mu}{.2222em}}\");\n// \\newcommand{\\negthickspace}{\\tmspace-\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip\ndefineMacro(\"\\\\negthickspace\", \"{\\\\tmspace-{5mu}{.277em}}\");\n// \\def\\enspace{\\kern.5em }\ndefineMacro(\"\\\\enspace\", \"\\\\kern.5em \");\n// \\def\\enskip{\\hskip.5em\\relax}\ndefineMacro(\"\\\\enskip\", \"\\\\hskip.5em\\\\relax\");\n// \\def\\quad{\\hskip1em\\relax}\ndefineMacro(\"\\\\quad\", \"\\\\hskip1em\\\\relax\");\n// \\def\\qquad{\\hskip2em\\relax}\ndefineMacro(\"\\\\qquad\", \"\\\\hskip2em\\\\relax\");\n\ndefineMacro(\"\\\\AA\", \"\\\\TextOrMath{\\\\Angstrom}{\\\\mathring{A}}\\\\relax\");\n\n// \\tag@in@display form of \\tag\ndefineMacro(\"\\\\tag\", \"\\\\@ifstar\\\\tag@literal\\\\tag@paren\");\ndefineMacro(\"\\\\tag@paren\", \"\\\\tag@literal{({#1})}\");\ndefineMacro(\"\\\\tag@literal\", (context) => {\n if (context.macros.get(\"\\\\df@tag\")) {\n throw new ParseError(\"Multiple \\\\tag\");\n }\n return \"\\\\gdef\\\\df@tag{\\\\text{#1}}\";\n});\ndefineMacro(\"\\\\notag\", \"\\\\nonumber\");\ndefineMacro(\"\\\\nonumber\", \"\\\\gdef\\\\@eqnsw{0}\");\n\n// \\renewcommand{\\bmod}{\\nonscript\\mskip-\\medmuskip\\mkern5mu\\mathbin\n// {\\operator@font mod}\\penalty900\n// \\mkern5mu\\nonscript\\mskip-\\medmuskip}\n// \\newcommand{\\pod}[1]{\\allowbreak\n// \\if@display\\mkern18mu\\else\\mkern8mu\\fi(#1)}\n// \\renewcommand{\\pmod}[1]{\\pod{{\\operator@font mod}\\mkern6mu#1}}\n// \\newcommand{\\mod}[1]{\\allowbreak\\if@display\\mkern18mu\n// \\else\\mkern12mu\\fi{\\operator@font mod}\\,\\,#1}\n// TODO: math mode should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\bmod\", \"\\\\mathbin{\\\\text{mod}}\");\ndefineMacro(\n \"\\\\pod\",\n \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern8mu}{\\\\mkern8mu}{\\\\mkern8mu}(#1)\"\n);\ndefineMacro(\"\\\\pmod\", \"\\\\pod{{\\\\rm mod}\\\\mkern6mu#1}\");\ndefineMacro(\n \"\\\\mod\",\n \"\\\\allowbreak\" +\n \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\mkern12mu}\" +\n \"{\\\\rm mod}\\\\,\\\\,#1\"\n);\n\n//////////////////////////////////////////////////////////////////////\n// LaTeX source2e\n\n// \\expandafter\\let\\expandafter\\@normalcr\n// \\csname\\expandafter\\@gobble\\string\\\\ \\endcsname\n// \\DeclareRobustCommand\\newline{\\@normalcr\\relax}\ndefineMacro(\"\\\\newline\", \"\\\\\\\\\\\\relax\");\n\n// \\def\\TeX{T\\kern-.1667em\\lower.5ex\\hbox{E}\\kern-.125emX\\@}\n// TODO: Doesn't normally work in math mode because \\@ fails.\ndefineMacro(\"\\\\TeX\", \"\\\\textrm{T}\\\\kern-.1667em\\\\raisebox{-.5ex}{E}\\\\kern-.125em\\\\textrm{X}\");\n\ndefineMacro(\n \"\\\\LaTeX\",\n \"\\\\textrm{L}\\\\kern-.35em\\\\raisebox{0.2em}{\\\\scriptstyle A}\\\\kern-.15em\\\\TeX\"\n);\n\ndefineMacro(\n \"\\\\Temml\",\n // eslint-disable-next-line max-len\n \"\\\\textrm{T}\\\\kern-0.2em\\\\lower{0.2em}{\\\\textrm{E}}\\\\kern-0.08em{\\\\textrm{M}\\\\kern-0.08em\\\\raise{0.2em}\\\\textrm{M}\\\\kern-0.08em\\\\textrm{L}}\"\n);\n\n// \\DeclareRobustCommand\\hspace{\\@ifstar\\@hspacer\\@hspace}\n// \\def\\@hspace#1{\\hskip #1\\relax}\n// \\def\\@hspacer#1{\\vrule \\@width\\z@\\nobreak\n// \\hskip #1\\hskip \\z@skip}\ndefineMacro(\"\\\\hspace\", \"\\\\@ifstar\\\\@hspacer\\\\@hspace\");\ndefineMacro(\"\\\\@hspace\", \"\\\\hskip #1\\\\relax\");\ndefineMacro(\"\\\\@hspacer\", \"\\\\rule{0pt}{0pt}\\\\hskip #1\\\\relax\");\n\ndefineMacro(\"\\\\colon\", `\\\\mathpunct{\\\\char\"3a}`);\n\n//////////////////////////////////////////////////////////////////////\n// mathtools.sty\n\ndefineMacro(\"\\\\prescript\", \"\\\\pres@cript{_{#1}^{#2}}{}{#3}\");\n\n//\\providecommand\\ordinarycolon{:}\ndefineMacro(\"\\\\ordinarycolon\", `\\\\char\"3a`);\n// Raise to center on the math axis, as closely as possible.\ndefineMacro(\"\\\\vcentcolon\", \"\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}}\");\n// \\providecommand*\\coloneq{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\coloneq\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"2212}');\n// \\providecommand*\\Coloneq{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\Coloneq\", '\\\\mathrel{\\\\char\"2237\\\\char\"2212}');\n// \\providecommand*\\Eqqcolon{=\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqqcolon\", '\\\\mathrel{\\\\char\"3d\\\\char\"2237}');\n// \\providecommand*\\Eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqcolon\", '\\\\mathrel{\\\\char\"2212\\\\char\"2237}');\n// \\providecommand*\\colonapprox{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\colonapprox\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"2248}');\n// \\providecommand*\\Colonapprox{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\Colonapprox\", '\\\\mathrel{\\\\char\"2237\\\\char\"2248}');\n// \\providecommand*\\colonsim{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\colonsim\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"223c}');\n// \\providecommand*\\Colonsim{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\Colonsim\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"223c}');\n\n//////////////////////////////////////////////////////////////////////\n// colonequals.sty\n\n// Alternate names for mathtools's macros:\ndefineMacro(\"\\\\ratio\", \"\\\\vcentcolon\");\ndefineMacro(\"\\\\coloncolon\", \"\\\\dblcolon\");\ndefineMacro(\"\\\\colonequals\", \"\\\\coloneqq\");\ndefineMacro(\"\\\\coloncolonequals\", \"\\\\Coloneqq\");\ndefineMacro(\"\\\\equalscolon\", \"\\\\eqqcolon\");\ndefineMacro(\"\\\\equalscoloncolon\", \"\\\\Eqqcolon\");\ndefineMacro(\"\\\\colonminus\", \"\\\\coloneq\");\ndefineMacro(\"\\\\coloncolonminus\", \"\\\\Coloneq\");\ndefineMacro(\"\\\\minuscolon\", \"\\\\eqcolon\");\ndefineMacro(\"\\\\minuscoloncolon\", \"\\\\Eqcolon\");\n// \\colonapprox name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonapprox\", \"\\\\Colonapprox\");\n// \\colonsim name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonsim\", \"\\\\Colonsim\");\n\n// Present in newtxmath, pxfonts and txfonts\ndefineMacro(\"\\\\notni\", \"\\\\mathrel{\\\\char`\\u220C}\");\ndefineMacro(\"\\\\limsup\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,sup}\");\ndefineMacro(\"\\\\liminf\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,inf}\");\n\n//////////////////////////////////////////////////////////////////////\n// From amsopn.sty\ndefineMacro(\"\\\\injlim\", \"\\\\DOTSB\\\\operatorname*{inj\\\\,lim}\");\ndefineMacro(\"\\\\projlim\", \"\\\\DOTSB\\\\operatorname*{proj\\\\,lim}\");\ndefineMacro(\"\\\\varlimsup\", \"\\\\DOTSB\\\\operatorname*{\\\\overline{\\\\text{lim}}}\");\ndefineMacro(\"\\\\varliminf\", \"\\\\DOTSB\\\\operatorname*{\\\\underline{\\\\text{lim}}}\");\ndefineMacro(\"\\\\varinjlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underrightarrow{\\\\text{lim}}}\");\ndefineMacro(\"\\\\varprojlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underleftarrow{\\\\text{lim}}}\");\n\ndefineMacro(\"\\\\centerdot\", \"{\\\\medspace\\\\rule{0.167em}{0.189em}\\\\medspace}\");\n\n//////////////////////////////////////////////////////////////////////\n// statmath.sty\n// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf\n\ndefineMacro(\"\\\\argmin\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,min}\");\ndefineMacro(\"\\\\argmax\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,max}\");\ndefineMacro(\"\\\\plim\", \"\\\\DOTSB\\\\operatorname*{plim}\");\n\n//////////////////////////////////////////////////////////////////////\n// MnSymbol.sty\n\ndefineMacro(\"\\\\leftmodels\", \"\\\\mathop{\\\\reflectbox{$\\\\models$}}\");\n\n//////////////////////////////////////////////////////////////////////\n// braket.sty\n// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf\n\ndefineMacro(\"\\\\bra\", \"\\\\mathinner{\\\\langle{#1}|}\");\ndefineMacro(\"\\\\ket\", \"\\\\mathinner{|{#1}\\\\rangle}\");\ndefineMacro(\"\\\\braket\", \"\\\\mathinner{\\\\langle{#1}\\\\rangle}\");\ndefineMacro(\"\\\\Bra\", \"\\\\left\\\\langle#1\\\\right|\");\ndefineMacro(\"\\\\Ket\", \"\\\\left|#1\\\\right\\\\rangle\");\n// A helper for \\Braket and \\Set\nconst replaceVert = (argStr, match) => {\n const ch = match[0] === \"|\" ? \"\\\\vert\" : \"\\\\Vert\";\n const replaceStr = `}\\\\,\\\\middle$ch}\\\\,{`;\n return argStr.slice(0, match.index) + replaceStr + argStr.slice(match.index + match[0].length)\n};\ndefineMacro(\"\\\\Braket\", function(context) {\n let argStr = recreateArgStr(context);\n const regEx = /\\|\\||\\||\\\\\\|/g;\n let match;\n while ((match = regEx.exec(argStr)) !== null) {\n argStr = replaceVert(argStr, match);\n }\n return \"\\\\left\\\\langle{\" + argStr + \"}\\\\right\\\\rangle\"\n});\ndefineMacro(\"\\\\Set\", function(context) {\n let argStr = recreateArgStr(context);\n const match = /\\|\\||\\||\\\\\\|/.exec(argStr);\n if (match) {\n argStr = replaceVert(argStr, match);\n }\n return \"\\\\left\\\\{\\\\:{\" + argStr + \"}\\\\:\\\\right\\\\}\"\n});\ndefineMacro(\"\\\\set\", function(context) {\n const argStr = recreateArgStr(context);\n return \"\\\\{{\" + argStr.replace(/\\|/, \"}\\\\mid{\") + \"}\\\\}\"\n});\n\n//////////////////////////////////////////////////////////////////////\n// actuarialangle.dtx\ndefineMacro(\"\\\\angln\", \"{\\\\angl n}\");\n\n//////////////////////////////////////////////////////////////////////\n// derivative.sty\ndefineMacro(\"\\\\odv\", \"\\\\@ifstar\\\\odv@next\\\\odv@numerator\");\ndefineMacro(\"\\\\odv@numerator\", \"\\\\frac{\\\\mathrm{d}#1}{\\\\mathrm{d}#2}\");\ndefineMacro(\"\\\\odv@next\", \"\\\\frac{\\\\mathrm{d}}{\\\\mathrm{d}#2}#1\");\ndefineMacro(\"\\\\pdv\", \"\\\\@ifstar\\\\pdv@next\\\\pdv@numerator\");\n\nconst pdvHelper = args => {\n const numerator = args[0][0].text;\n const denoms = stringFromArg(args[1]).split(\",\");\n const power = String(denoms.length);\n const numOp = power === \"1\" ? \"\\\\partial\" : `\\\\partial^$power}`;\n let denominator = \"\";\n denoms.map(e => { denominator += \"\\\\partial \" + e.trim() + \"\\\\,\";});\n return [numerator, numOp, denominator.replace(/\\\\,$/, \"\")]\n};\ndefineMacro(\"\\\\pdv@numerator\", function(context) {\n const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2));\n return `\\\\frac{$numOp} $numerator}}{$denominator}}`\n});\ndefineMacro(\"\\\\pdv@next\", function(context) {\n const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2));\n return `\\\\frac{$numOp}}{$denominator}} $numerator}`\n});\n\n//////////////////////////////////////////////////////////////////////\n// upgreek.dtx\ndefineMacro(\"\\\\upalpha\", \"\\\\up@greek{\\\\alpha}\");\ndefineMacro(\"\\\\upbeta\", \"\\\\up@greek{\\\\beta}\");\ndefineMacro(\"\\\\upgamma\", \"\\\\up@greek{\\\\gamma}\");\ndefineMacro(\"\\\\updelta\", \"\\\\up@greek{\\\\delta}\");\ndefineMacro(\"\\\\upepsilon\", \"\\\\up@greek{\\\\epsilon}\");\ndefineMacro(\"\\\\upzeta\", \"\\\\up@greek{\\\\zeta}\");\ndefineMacro(\"\\\\upeta\", \"\\\\up@greek{\\\\eta}\");\ndefineMacro(\"\\\\uptheta\", \"\\\\up@greek{\\\\theta}\");\ndefineMacro(\"\\\\upiota\", \"\\\\up@greek{\\\\iota}\");\ndefineMacro(\"\\\\upkappa\", \"\\\\up@greek{\\\\kappa}\");\ndefineMacro(\"\\\\uplambda\", \"\\\\up@greek{\\\\lambda}\");\ndefineMacro(\"\\\\upmu\", \"\\\\up@greek{\\\\mu}\");\ndefineMacro(\"\\\\upnu\", \"\\\\up@greek{\\\\nu}\");\ndefineMacro(\"\\\\upxi\", \"\\\\up@greek{\\\\xi}\");\ndefineMacro(\"\\\\upomicron\", \"\\\\up@greek{\\\\omicron}\");\ndefineMacro(\"\\\\uppi\", \"\\\\up@greek{\\\\pi}\");\ndefineMacro(\"\\\\upalpha\", \"\\\\up@greek{\\\\alpha}\");\ndefineMacro(\"\\\\uprho\", \"\\\\up@greek{\\\\rho}\");\ndefineMacro(\"\\\\upsigma\", \"\\\\up@greek{\\\\sigma}\");\ndefineMacro(\"\\\\uptau\", \"\\\\up@greek{\\\\tau}\");\ndefineMacro(\"\\\\upupsilon\", \"\\\\up@greek{\\\\upsilon}\");\ndefineMacro(\"\\\\upphi\", \"\\\\up@greek{\\\\phi}\");\ndefineMacro(\"\\\\upchi\", \"\\\\up@greek{\\\\chi}\");\ndefineMacro(\"\\\\uppsi\", \"\\\\up@greek{\\\\psi}\");\ndefineMacro(\"\\\\upomega\", \"\\\\up@greek{\\\\omega}\");\n\n//////////////////////////////////////////////////////////////////////\n// cmll package\ndefineMacro(\"\\\\invamp\", '\\\\mathbin{\\\\char\"214b}');\ndefineMacro(\"\\\\parr\", '\\\\mathbin{\\\\char\"214b}');\ndefineMacro(\"\\\\with\", '\\\\mathbin{\\\\char\"26}');\ndefineMacro(\"\\\\multimapinv\", '\\\\mathrel{\\\\char\"27dc}');\ndefineMacro(\"\\\\multimapboth\", '\\\\mathrel{\\\\char\"29df}');\ndefineMacro(\"\\\\scoh\", '{\\\\mkern5mu\\\\char\"2322\\\\mkern5mu}');\ndefineMacro(\"\\\\sincoh\", '{\\\\mkern5mu\\\\char\"2323\\\\mkern5mu}');\ndefineMacro(\"\\\\coh\", `{\\\\mkern5mu\\\\rule{}{0.7em}\\\\mathrlap{\\\\smash{\\\\raise2mu{\\\\char\"2322}}}\n{\\\\smash{\\\\lower4mu{\\\\char\"2323}}}\\\\mkern5mu}`);\ndefineMacro(\"\\\\incoh\", `{\\\\mkern5mu\\\\rule{}{0.7em}\\\\mathrlap{\\\\smash{\\\\raise2mu{\\\\char\"2323}}}\n{\\\\smash{\\\\lower4mu{\\\\char\"2322}}}\\\\mkern5mu}`);\n\n\n//////////////////////////////////////////////////////////////////////\n// chemstyle package\ndefineMacro(\"\\\\standardstate\", \"\\\\text{\\\\tiny\\\\char`\u29B5}\");\n\n\uFEFF/* eslint-disable */\n/* -*- Mode: JavaScript; indent-tabs-mode:nil; js-indent-level: 2 -*- */\n/* vim: set ts=2 et sw=2 tw=80: */\n\n/*************************************************************\n *\n * Temml mhchem.js\n *\n * This file implements a Temml version of mhchem version 3.3.0.\n * It is adapted from MathJax/extensions/TeX/mhchem.js\n * It differs from the MathJax version as follows:\n * 1. The interface is changed so that it can be called from Temml, not MathJax.\n * 2. \\rlap and \\llap are replaced with \\mathrlap and \\mathllap.\n * 3. The reaction arrow code is simplified. All reaction arrows are rendered\n * using Temml extensible arrows instead of building non-extensible arrows.\n * 4. The ~bond forms are composed entirely of \\rule elements.\n * 5. Two dashes in _getBond are wrapped in braces to suppress spacing. i.e., {-}\n * 6. The electron dot uses \\textbullet instead of \\bullet.\n * 7. \\smash[T] has been removed. (WebKit hides anything inside \\smash{\u2026})\n *\n * This code, as other Temml code, is released under the MIT license.\n * \n * /*************************************************************\n *\n * MathJax/extensions/TeX/mhchem.js\n *\n * Implements the \\ce command for handling chemical formulas\n * from the mhchem LaTeX package.\n *\n * ---------------------------------------------------------------------\n *\n * Copyright (c) 2011-2015 The MathJax Consortium\n * Copyright (c) 2015-2018 Martin Hensel\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//\n// Coding Style\n// - use '' for identifiers that can by minified/uglified\n// - use \"\" for strings that need to stay untouched\n\n// version: \"3.3.0\" for MathJax and Temml\n\n\n// Add \\ce, \\pu, and \\tripleDash to the Temml macros.\n\ndefineMacro(\"\\\\ce\", function(context) {\n return chemParse(context.consumeArgs(1)[0], \"ce\")\n});\n\ndefineMacro(\"\\\\pu\", function(context) {\n return chemParse(context.consumeArgs(1)[0], \"pu\");\n});\n\n// Math fonts do not include glyphs for the ~ form of bonds. So we'll send path geometry\n// So we'll compose characters built from \\rule elements.\ndefineMacro(\"\\\\uniDash\", `{\\\\rule{0.672em}{0.06em}}`)\ndefineMacro(\"\\\\triDash\", `{\\\\rule{0.15em}{0.06em}\\\\kern2mu\\\\rule{0.15em}{0.06em}\\\\kern2mu\\\\rule{0.15em}{0.06em}}`)\ndefineMacro(\"\\\\tripleDash\", `\\\\kern0.075em\\\\raise0.25em{\\\\triDash}\\\\kern0.075em`)\ndefineMacro(\"\\\\tripleDashOverLine\", `\\\\kern0.075em\\\\mathrlap{\\\\raise0.125em{\\\\uniDash}}\\\\raise0.34em{\\\\triDash}\\\\kern0.075em`)\ndefineMacro(\"\\\\tripleDashOverDoubleLine\", `\\\\kern0.075em\\\\mathrlap{\\\\mathrlap{\\\\raise0.48em{\\\\triDash}}\\\\raise0.27em{\\\\uniDash}}{\\\\raise0.05em{\\\\uniDash}}\\\\kern0.075em`)\ndefineMacro(\"\\\\tripleDashBetweenDoubleLine\", `\\\\kern0.075em\\\\mathrlap{\\\\mathrlap{\\\\raise0.48em{\\\\uniDash}}\\\\raise0.27em{\\\\triDash}}{\\\\raise0.05em{\\\\uniDash}}\\\\kern0.075em`)\n\n //\n // This is the main function for handing the \\ce and \\pu commands.\n // It takes the argument to \\ce or \\pu and returns the corresponding TeX string.\n //\n\n var chemParse = function (tokens, stateMachine) {\n // Recreate the argument string from Temml's array of tokens.\n var str = \"\";\n var expectedLoc = tokens.length && tokens[tokens.length - 1].loc.start\n for (var i = tokens.length - 1; i >= 0; i--) {\n if(tokens[i].loc.start > expectedLoc) {\n // context.consumeArgs has eaten a space.\n str += \" \";\n expectedLoc = tokens[i].loc.start;\n }\n str += tokens[i].text;\n expectedLoc += tokens[i].text.length;\n }\n // Call the mhchem core parser.\n var tex = texify.go(mhchemParser.go(str, stateMachine));\n return tex;\n };\n\n //\n // Core parser for mhchem syntax (recursive)\n //\n /** @type {MhchemParser} */\n var mhchemParser = {\n //\n // Parses mchem \\ce syntax\n //\n // Call like\n // go(\"H2O\");\n //\n go: function (input, stateMachine) {\n if (!input) { return []; }\n if (stateMachine === undefined) { stateMachine = 'ce'; }\n var state = '0';\n\n //\n // String buffers for parsing:\n //\n // buffer.a == amount\n // buffer.o == element\n // buffer.b == left-side superscript\n // buffer.p == left-side subscript\n // buffer.q == right-side subscript\n // buffer.d == right-side superscript\n //\n // buffer.r == arrow\n // buffer.rdt == arrow, script above, type\n // buffer.rd == arrow, script above, content\n // buffer.rqt == arrow, script below, type\n // buffer.rq == arrow, script below, content\n //\n // buffer.text_\n // buffer.rm\n // etc.\n //\n // buffer.parenthesisLevel == int, starting at 0\n // buffer.sb == bool, space before\n // buffer.beginsWithBond == bool\n //\n // These letters are also used as state names.\n //\n // Other states:\n // 0 == begin of main part (arrow/operator unlikely)\n // 1 == next entity\n // 2 == next entity (arrow/operator unlikely)\n // 3 == next atom\n // c == macro\n //\n /** @type {Buffer} */\n var buffer = {};\n buffer['parenthesisLevel'] = 0;\n\n input = input.replace(/\\n/g, \" \");\n input = input.replace(/[\\u2212\\u2013\\u2014\\u2010]/g, \"-\");\n input = input.replace(/[\\u2026]/g, \"...\");\n\n //\n // Looks through mhchemParser.transitions, to execute a matching action\n // (recursive)\n //\n var lastInput;\n var watchdog = 10;\n /** @type {ParserOutput[]} */\n var output = [];\n while (true) {\n if (lastInput !== input) {\n watchdog = 10;\n lastInput = input;\n } else {\n watchdog--;\n }\n //\n // Find actions in transition table\n //\n var machine = mhchemParser.stateMachines[stateMachine];\n var t = machine.transitions[state] || machine.transitions['*'];\n iterateTransitions:\n for (var i=0; i<t.length; i++) {\n var matches = mhchemParser.patterns.match_(t[i].pattern, input);\n if (matches) {\n //\n // Execute actions\n //\n var task = t[i].task;\n for (var iA=0; iA<task.action_.length; iA++) {\n var o;\n //\n // Find and execute action\n //\n if (machine.actions[task.action_[iA].type_]) {\n o = machine.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);\n } else if (mhchemParser.actions[task.action_[iA].type_]) {\n o = mhchemParser.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);\n } else {\n throw [\"MhchemBugA\", \"mhchem bug A. Please report. (\" + task.action_[iA].type_ + \")\"]; // Trying to use non-existing action\n }\n //\n // Add output\n //\n mhchemParser.concatArray(output, o);\n }\n //\n // Set next state,\n // Shorten input,\n // Continue with next character\n // (= apply only one transition per position)\n //\n state = task.nextState || state;\n if (input.length > 0) {\n if (!task.revisit) {\n input = matches.remainder;\n }\n if (!task.toContinue) {\n break iterateTransitions;\n }\n } else {\n return output;\n }\n }\n }\n //\n // Prevent infinite loop\n //\n if (watchdog <= 0) {\n throw [\"MhchemBugU\", \"mhchem bug U. Please report.\"]; // Unexpected character\n }\n }\n },\n concatArray: function (a, b) {\n if (b) {\n if (Array.isArray(b)) {\n for (var iB=0; iB<b.length; iB++) {\n a.push(b[iB]);\n }\n } else {\n a.push(b);\n }\n }\n },\n\n patterns: {\n //\n // Matching patterns\n // either regexps or function that return null or {match_:\"a\", remainder:\"bc\"}\n //\n patterns: {\n // property names must not look like integers (\"2\") for correct property traversal order, later on\n 'empty': /^$/,\n 'else': /^./,\n 'else2': /^./,\n 'space': /^\\s/,\n 'space A': /^\\s(?=[A-Z\\\\$])/,\n 'space$': /^\\s$/,\n 'a-z': /^[a-z]/,\n 'x': /^x/,\n 'x$': /^x$/,\n 'i$': /^i$/,\n 'letters': /^(?:[a-zA-Z\\u03B1-\\u03C9\\u0391-\\u03A9?@]|(?:\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\\s+|\\{\\}|(?![a-zA-Z]))))+/,\n '\\\\greek': /^\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\\s+|\\{\\}|(?![a-zA-Z]))/,\n 'one lowercase latin letter $': /^(?:([a-z])(?:$|[^a-zA-Z]))$/,\n '$one lowercase latin letter$ $': /^\\$(?:([a-z])(?:$|[^a-zA-Z]))\\$$/,\n 'one lowercase greek letter $': /^(?:\\$?[\\u03B1-\\u03C9]\\$?|\\$?\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\\s*\\$?)(?:\\s+|\\{\\}|(?![a-zA-Z]))$/,\n 'digits': /^[0-9]+/,\n '-9.,9': /^[+\\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))/,\n '-9.,9 no missing 0': /^[+\\-]?[0-9]+(?:[.,][0-9]+)?/,\n '(-)(9.,9)(e)(99)': function (input) {\n var m = input.match(/^(\\+\\-|\\+\\/\\-|\\+|\\-|\\\\pm\\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))?(\\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))\\))?(?:([eE]|\\s*(\\*|x|\\\\times|\\u00D7)\\s*10\\^)([+\\-]?[0-9]+|\\{[+\\-]?[0-9]+\\}))?/);\n if (m && m[0]) {\n return { match_: m.splice(1), remainder: input.substr(m[0].length) };\n }\n return null;\n },\n '(-)(9)^(-9)': function (input) {\n var m = input.match(/^(\\+\\-|\\+\\/\\-|\\+|\\-|\\\\pm\\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+)?)\\^([+\\-]?[0-9]+|\\{[+\\-]?[0-9]+\\})/);\n if (m && m[0]) {\n return { match_: m.splice(1), remainder: input.substr(m[0].length) };\n }\n return null;\n },\n 'state of aggregation $': function (input) { // ... or crystal system\n var a = mhchemParser.patterns.findObserveGroups(input, \"\", /^\\([a-z]{1,3}(?=[\\),])/, \")\", \"\"); // (aq), (aq,$\\infty$), (aq, sat)\n if (a && a.remainder.match(/^($|[\\s,;\\)\\]\\}])/)) { return a; } // AND end of 'phrase'\n var m = input.match(/^(?:\\((?:\\\\ca\\s?)?\\$[amothc]\\$\\))/); // OR crystal system ($o$) (\\ca$c$)\n if (m) {\n return { match_: m[0], remainder: input.substr(m[0].length) };\n }\n return null;\n },\n '_{(state of aggregation)}$': /^_\\{(\\([a-z]{1,3}\\))\\}/,\n '{[(': /^(?:\\\\\\{|\\[|\\()/,\n ')]}': /^(?:\\)|\\]|\\\\\\})/,\n ', ': /^[,;]\\s*/,\n ',': /^[,;]/,\n '.': /^[.]/,\n '. ': /^([.\\u22C5\\u00B7\\u2022])\\s*/,\n '...': /^\\.\\.\\.(?=$|[^.])/,\n '* ': /^([*])\\s*/,\n '^{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^{\", \"\", \"\", \"}\"); },\n '^($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", \"$\", \"$\", \"\"); },\n '^a': /^\\^([0-9]+|[^\\\\_])/,\n '^\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n '^\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n '^\\\\x': /^\\^(\\\\[a-zA-Z]+)\\s*/,\n '^(-1)': /^\\^(-?\\d+)/,\n '\\'': /^'/,\n '_{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_{\", \"\", \"\", \"}\"); },\n '_($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", \"$\", \"$\", \"\"); },\n '_9': /^_([+\\-]?[0-9]+|[^\\\\])/,\n '_\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n '_\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n '_\\\\x': /^_(\\\\[a-zA-Z]+)\\s*/,\n '^_': /^(?:\\^(?=_)|\\_(?=\\^)|[\\^_]$)/,\n '{}': /^\\{\\}/,\n '{...}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", \"{\", \"}\", \"\"); },\n '{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"{\", \"\", \"\", \"}\"); },\n '$...$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", \"$\", \"$\", \"\"); },\n '${(...)}$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"${\", \"\", \"\", \"}$\"); },\n '$(...)$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"$\", \"\", \"\", \"$\"); },\n '=<>': /^[=<>]/,\n '#': /^[#\\u2261]/,\n '+': /^\\+/,\n '-$': /^-(?=[\\s_},;\\]/]|$|\\([a-z]+\\))/, // -space -, -; -] -/ -$ -state-of-aggregation\n '-9': /^-(?=[0-9])/,\n '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\\s,;\\)\\]\\}]))/,\n '-': /^-/,\n 'pm-operator': /^(?:\\\\pm|\\$\\\\pm\\$|\\+-|\\+\\/-)/,\n 'operator': /^(?:\\+|(?:[\\-=<>]|<<|>>|\\\\approx|\\$\\\\approx\\$)(?=\\s|$|-?[0-9]))/,\n 'arrowUpDown': /^(?:v|\\(v\\)|\\^|\\(\\^\\))(?=$|[\\s,;\\)\\]\\}])/,\n '\\\\bond{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\bond{\", \"\", \"\", \"}\"); },\n '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\\u2192\\u27F6\\u21CC])/,\n 'CMT': /^[CMT](?=\\[)/,\n '[(...)]': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"[\", \"\", \"\", \"]\"); },\n '1st-level escape': /^(&|\\\\\\\\|\\\\hline)\\s*/,\n '\\\\,': /^(?:\\\\[,\\ ;:])/, // \\\\x - but output no space before\n '\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n '\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n '\\\\ca': /^\\\\ca(?:\\s+|(?![a-zA-Z]))/,\n '\\\\x': /^(?:\\\\[a-zA-Z]+\\s*|\\\\[_&{}%])/,\n 'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/, // only those with numbers in front, because the others will be formatted correctly anyway\n 'others': /^[\\/~|]/,\n '\\\\frac{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\frac{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n '\\\\overset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\overset{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n '\\\\underset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\underset{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n '\\\\underbrace{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\underbrace{\", \"\", \"\", \"}_\", \"{\", \"\", \"\", \"}\"); },\n '\\\\color{(...)}0': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color{\", \"\", \"\", \"}\"); },\n '\\\\color{(...)}{(...)}1': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n '\\\\color(...){(...)}2': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color\", \"\\\\\", \"\", /^(?=\\{)/, \"{\", \"\", \"\", \"}\"); },\n '\\\\ce{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\ce{\", \"\", \"\", \"}\"); },\n 'oxidation$': /^(?:[+-][IVX]+|\\\\pm\\s*0|\\$\\\\pm\\$\\s*0)$/,\n 'd-oxidation$': /^(?:[+-]?\\s?[IVX]+|\\\\pm\\s*0|\\$\\\\pm\\$\\s*0)$/, // 0 could be oxidation or charge\n 'roman numeral': /^[IVX]+/,\n '1/2$': /^[+\\-]?(?:[0-9]+|\\$[a-z]\\$|[a-z])\\/[0-9]+(?:\\$[a-z]\\$|[a-z])?$/,\n 'amount': function (input) {\n var match;\n // e.g. 2, 0.5, 1/2, -2, n/2, +; $a$ could be added later in parsing\n match = input.match(/^(?:(?:(?:\\([+\\-]?[0-9]+\\/[0-9]+\\)|[+\\-]?(?:[0-9]+|\\$[a-z]\\$|[a-z])\\/[0-9]+|[+\\-]?[0-9]+[.,][0-9]+|[+\\-]?\\.[0-9]+|[+\\-]?[0-9]+)(?:[a-z](?=\\s*[A-Z]))?)|[+\\-]?[a-z](?=\\s*[A-Z])|\\+(?!\\s))/);\n if (match) {\n return { match_: match[0], remainder: input.substr(match[0].length) };\n }\n var a = mhchemParser.patterns.findObserveGroups(input, \"\", \"$\", \"$\", \"\");\n if (a) { // e.g. $2n-1$, $-$\n match = a.match_.match(/^\\$(?:\\(?[+\\-]?(?:[0-9]*[a-z]?[+\\-])?[0-9]*[a-z](?:[+\\-][0-9]*[a-z]?)?\\)?|\\+|-)\\$$/);\n if (match) {\n return { match_: match[0], remainder: input.substr(match[0].length) };\n }\n }\n return null;\n },\n 'amount2': function (input) { return this['amount'](input); },\n '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/,\n 'formula$': function (input) {\n if (input.match(/^\\([a-z]+\\)$/)) { return null; } // state of aggregation = no formula\n var match = input.match(/^(?:[a-z]|(?:[0-9\\ \\+\\-\\,\\.\\(\\)]+[a-z])+[0-9\\ \\+\\-\\,\\.\\(\\)]*|(?:[a-z][0-9\\ \\+\\-\\,\\.\\(\\)]+)+[a-z]?)$/);\n if (match) {\n return { match_: match[0], remainder: input.substr(match[0].length) };\n }\n return null;\n },\n 'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,\n '/': /^\\s*(\\/)\\s*/,\n '//': /^\\s*(\\/\\/)\\s*/,\n '*': /^\\s*[*.]\\s*/\n },\n findObserveGroups: function (input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) {\n /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */\n var _match = function (input, pattern) {\n if (typeof pattern === \"string\") {\n if (input.indexOf(pattern) !== 0) { return null; }\n return pattern;\n } else {\n var match = input.match(pattern);\n if (!match) { return null; }\n return match[0];\n }\n };\n /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */\n var _findObserveGroups = function (input, i, endChars) {\n var braces = 0;\n while (i < input.length) {\n var a = input.charAt(i);\n var match = _match(input.substr(i), endChars);\n if (match !== null && braces === 0) {\n return { endMatchBegin: i, endMatchEnd: i + match.length };\n } else if (a === \"{\") {\n braces++;\n } else if (a === \"}\") {\n if (braces === 0) {\n throw [\"ExtraCloseMissingOpen\", \"Extra close brace or missing open brace\"];\n } else {\n braces--;\n }\n }\n i++;\n }\n if (braces > 0) {\n return null;\n }\n return null;\n };\n var match = _match(input, begExcl);\n if (match === null) { return null; }\n input = input.substr(match.length);\n match = _match(input, begIncl);\n if (match === null) { return null; }\n var e = _findObserveGroups(input, match.length, endIncl || endExcl);\n if (e === null) { return null; }\n var match1 = input.substring(0, (endIncl ? e.endMatchEnd : e.endMatchBegin));\n if (!(beg2Excl || beg2Incl)) {\n return {\n match_: match1,\n remainder: input.substr(e.endMatchEnd)\n };\n } else {\n var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl);\n if (group2 === null) { return null; }\n /** @type {string[]} */\n var matchRet = [match1, group2.match_];\n return {\n match_: (combine ? matchRet.join(\"\") : matchRet),\n remainder: group2.remainder\n };\n }\n },\n\n //\n // Matching function\n // e.g. match(\"a\", input) will look for the regexp called \"a\" and see if it matches\n // returns null or {match_:\"a\", remainder:\"bc\"}\n //\n match_: function (m, input) {\n var pattern = mhchemParser.patterns.patterns[m];\n if (pattern === undefined) {\n throw [\"MhchemBugP\", \"mhchem bug P. Please report. (\" + m + \")\"]; // Trying to use non-existing pattern\n } else if (typeof pattern === \"function\") {\n return mhchemParser.patterns.patterns[m](input); // cannot use cached var pattern here, because some pattern functions need this===mhchemParser\n } else { // RegExp\n var match = input.match(pattern);\n if (match) {\n var mm;\n if (match[2]) {\n mm = [ match[1], match[2] ];\n } else if (match[1]) {\n mm = match[1];\n } else {\n mm = match[0];\n }\n return { match_: mm, remainder: input.substr(match[0].length) };\n }\n return null;\n }\n }\n },\n\n //\n // Generic state machine actions\n //\n actions: {\n 'a=': function (buffer, m) { buffer.a = (buffer.a || \"\") + m; },\n 'b=': function (buffer, m) { buffer.b = (buffer.b || \"\") + m; },\n 'p=': function (buffer, m) { buffer.p = (buffer.p || \"\") + m; },\n 'o=': function (buffer, m) { buffer.o = (buffer.o || \"\") + m; },\n 'q=': function (buffer, m) { buffer.q = (buffer.q || \"\") + m; },\n 'd=': function (buffer, m) { buffer.d = (buffer.d || \"\") + m; },\n 'rm=': function (buffer, m) { buffer.rm = (buffer.rm || \"\") + m; },\n 'text=': function (buffer, m) { buffer.text_ = (buffer.text_ || \"\") + m; },\n 'insert': function (buffer, m, a) { return { type_: a }; },\n 'insert+p1': function (buffer, m, a) { return { type_: a, p1: m }; },\n 'insert+p1+p2': function (buffer, m, a) { return { type_: a, p1: m[0], p2: m[1] }; },\n 'copy': function (buffer, m) { return m; },\n 'rm': function (buffer, m) { return { type_: 'rm', p1: m || \"\"}; },\n 'text': function (buffer, m) { return mhchemParser.go(m, 'text'); },\n '{text}': function (buffer, m) {\n var ret = [ \"{\" ];\n mhchemParser.concatArray(ret, mhchemParser.go(m, 'text'));\n ret.push(\"}\");\n return ret;\n },\n 'tex-math': function (buffer, m) { return mhchemParser.go(m, 'tex-math'); },\n 'tex-math tight': function (buffer, m) { return mhchemParser.go(m, 'tex-math tight'); },\n 'bond': function (buffer, m, k) { return { type_: 'bond', kind_: k || m }; },\n 'color0-output': function (buffer, m) { return { type_: 'color0', color: m[0] }; },\n 'ce': function (buffer, m) { return mhchemParser.go(m); },\n '1/2': function (buffer, m) {\n /** @type {ParserOutput[]} */\n var ret = [];\n if (m.match(/^[+\\-]/)) {\n ret.push(m.substr(0, 1));\n m = m.substr(1);\n }\n var n = m.match(/^([0-9]+|\\$[a-z]\\$|[a-z])\\/([0-9]+)(\\$[a-z]\\$|[a-z])?$/);\n n[1] = n[1].replace(/\\$/g, \"\");\n ret.push({ type_: 'frac', p1: n[1], p2: n[2] });\n if (n[3]) {\n n[3] = n[3].replace(/\\$/g, \"\");\n ret.push({ type_: 'tex-math', p1: n[3] });\n }\n return ret;\n },\n '9,9': function (buffer, m) { return mhchemParser.go(m, '9,9'); }\n },\n //\n // createTransitions\n // convert { 'letter': { 'state': { action_: 'output' } } } to { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] }\n // with expansion of 'a|b' to 'a' and 'b' (at 2 places)\n //\n createTransitions: function (o) {\n var pattern, state;\n /** @type {string[]} */\n var stateArray;\n var i;\n //\n // 1. Collect all states\n //\n /** @type {Transitions} */\n var transitions = {};\n for (pattern in o) {\n for (state in o[pattern]) {\n stateArray = state.split(\"|\");\n o[pattern][state].stateArray = stateArray;\n for (i=0; i<stateArray.length; i++) {\n transitions[stateArray[i]] = [];\n }\n }\n }\n //\n // 2. Fill states\n //\n for (pattern in o) {\n for (state in o[pattern]) {\n stateArray = o[pattern][state].stateArray || [];\n for (i=0; i<stateArray.length; i++) {\n //\n // 2a. Normalize actions into array: 'text=' ==> [{type_:'text='}]\n // (Note to myself: Resolving the function here would be problematic. It would need .bind (for *this*) and currying (for *option*).)\n //\n /** @type {any} */\n var p = o[pattern][state];\n if (p.action_) {\n p.action_ = [].concat(p.action_);\n for (var k=0; k<p.action_.length; k++) {\n if (typeof p.action_[k] === \"string\") {\n p.action_[k] = { type_: p.action_[k] };\n }\n }\n } else {\n p.action_ = [];\n }\n //\n // 2.b Multi-insert\n //\n var patternArray = pattern.split(\"|\");\n for (var j=0; j<patternArray.length; j++) {\n if (stateArray[i] === '*') { // insert into all\n for (var t in transitions) {\n transitions[t].push({ pattern: patternArray[j], task: p });\n }\n } else {\n transitions[stateArray[i]].push({ pattern: patternArray[j], task: p });\n }\n }\n }\n }\n }\n return transitions;\n },\n stateMachines: {}\n };\n\n //\n // Definition of state machines\n //\n mhchemParser.stateMachines = {\n //\n // \\ce state machines\n //\n //#region ce\n 'ce': { // main parser\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n 'else': {\n '0|1|2': { action_: 'beginsWithBond=false', revisit: true, toContinue: true } },\n 'oxidation$': {\n '0': { action_: 'oxidation-output' } },\n 'CMT': {\n 'r': { action_: 'rdt=', nextState: 'rt' },\n 'rd': { action_: 'rqt=', nextState: 'rdt' } },\n 'arrowUpDown': {\n '0|1|2|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '1' } },\n 'uprightEntities': {\n '0|1|2': { action_: [ 'o=', 'output' ], nextState: '1' } },\n 'orbital': {\n '0|1|2|3': { action_: 'o=', nextState: 'o' } },\n '->': {\n '0|1|2|3': { action_: 'r=', nextState: 'r' },\n 'a|as': { action_: [ 'output', 'r=' ], nextState: 'r' },\n '*': { action_: [ 'output', 'r=' ], nextState: 'r' } },\n '+': {\n 'o': { action_: 'd= kv', nextState: 'd' },\n 'd|D': { action_: 'd=', nextState: 'd' },\n 'q': { action_: 'd=', nextState: 'qd' },\n 'qd|qD': { action_: 'd=', nextState: 'qd' },\n 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' },\n '3': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } },\n 'amount': {\n '0|2': { action_: 'a=', nextState: 'a' } },\n 'pm-operator': {\n '0|1|2|a|as': { action_: [ 'sb=false', 'output', { type_: 'operator', option: '\\\\pm' } ], nextState: '0' } },\n 'operator': {\n '0|1|2|a|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } },\n '-$': {\n 'o|q': { action_: [ 'charge or bond', 'output' ], nextState: 'qd' },\n 'd': { action_: 'd=', nextState: 'd' },\n 'D': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' },\n 'q': { action_: 'd=', nextState: 'qd' },\n 'qd': { action_: 'd=', nextState: 'qd' },\n 'qD|dq': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' } },\n '-9': {\n '3|o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '3' } },\n '- orbital overlap': {\n 'o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' },\n 'd': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' } },\n '-': {\n '0|1|2': { action_: [ { type_: 'output', option: 1 }, 'beginsWithBond=true', { type_: 'bond', option: \"-\" } ], nextState: '3' },\n '3': { action_: { type_: 'bond', option: \"-\" } },\n 'a': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' },\n 'as': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: \"-\" } ], nextState: '3' },\n 'b': { action_: 'b=' },\n 'o': { action_: { type_: '- after o/d', option: false }, nextState: '2' },\n 'q': { action_: { type_: '- after o/d', option: false }, nextState: '2' },\n 'd|qd|dq': { action_: { type_: '- after o/d', option: true }, nextState: '2' },\n 'D|qD|p': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' } },\n 'amount2': {\n '1|3': { action_: 'a=', nextState: 'a' } },\n 'letters': {\n '0|1|2|3|a|as|b|p|bp|o': { action_: 'o=', nextState: 'o' },\n 'q|dq': { action_: ['output', 'o='], nextState: 'o' },\n 'd|D|qd|qD': { action_: 'o after d', nextState: 'o' } },\n 'digits': {\n 'o': { action_: 'q=', nextState: 'q' },\n 'd|D': { action_: 'q=', nextState: 'dq' },\n 'q': { action_: [ 'output', 'o=' ], nextState: 'o' },\n 'a': { action_: 'o=', nextState: 'o' } },\n 'space A': {\n 'b|p|bp': {} },\n 'space': {\n 'a': { nextState: 'as' },\n '0': { action_: 'sb=false' },\n '1|2': { action_: 'sb=true' },\n 'r|rt|rd|rdt|rdq': { action_: 'output', nextState: '0' },\n '*': { action_: [ 'output', 'sb=true' ], nextState: '1'} },\n '1st-level escape': {\n '1|2': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ] },\n '*': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ], nextState: '0' } },\n '[(...)]': {\n 'r|rt': { action_: 'rd=', nextState: 'rd' },\n 'rd|rdt': { action_: 'rq=', nextState: 'rdq' } },\n '...': {\n 'o|d|D|dq|qd|qD': { action_: [ 'output', { type_: 'bond', option: \"...\" } ], nextState: '3' },\n '*': { action_: [ { type_: 'output', option: 1 }, { type_: 'insert', option: 'ellipsis' } ], nextState: '1' } },\n '. |* ': {\n '*': { action_: [ 'output', { type_: 'insert', option: 'addition compound' } ], nextState: '1' } },\n 'state of aggregation $': {\n '*': { action_: [ 'output', 'state of aggregation' ], nextState: '1' } },\n '{[(': {\n 'a|as|o': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' },\n '0|1|2|3': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' },\n '*': { action_: [ 'output', 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' } },\n ')]}': {\n '0|1|2|3|b|p|bp|o': { action_: [ 'o=', 'parenthesisLevel--' ], nextState: 'o' },\n 'a|as|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=', 'parenthesisLevel--' ], nextState: 'o' } },\n ', ': {\n '*': { action_: [ 'output', 'comma' ], nextState: '0' } },\n '^_': { // ^ and _ without a sensible argument\n '*': { } },\n '^{(...)}|^($...$)': {\n '0|1|2|as': { action_: 'b=', nextState: 'b' },\n 'p': { action_: 'b=', nextState: 'bp' },\n '3|o': { action_: 'd= kv', nextState: 'D' },\n 'q': { action_: 'd=', nextState: 'qD' },\n 'd|D|qd|qD|dq': { action_: [ 'output', 'd=' ], nextState: 'D' } },\n '^a|^\\\\x{}{}|^\\\\x{}|^\\\\x|\\'': {\n '0|1|2|as': { action_: 'b=', nextState: 'b' },\n 'p': { action_: 'b=', nextState: 'bp' },\n '3|o': { action_: 'd= kv', nextState: 'd' },\n 'q': { action_: 'd=', nextState: 'qd' },\n 'd|qd|D|qD': { action_: 'd=' },\n 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' } },\n '_{(state of aggregation)}$': {\n 'd|D|q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } },\n '_{(...)}|_($...$)|_9|_\\\\x{}{}|_\\\\x{}|_\\\\x': {\n '0|1|2|as': { action_: 'p=', nextState: 'p' },\n 'b': { action_: 'p=', nextState: 'bp' },\n '3|o': { action_: 'q=', nextState: 'q' },\n 'd|D': { action_: 'q=', nextState: 'dq' },\n 'q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } },\n '=<>': {\n '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: '3' } },\n '#': {\n '0|1|2|3|a|as|o': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: \"#\" } ], nextState: '3' } },\n '{}': {\n '*': { action_: { type_: 'output', option: 1 }, nextState: '1' } },\n '{...}': {\n '0|1|2|3|a|as|b|p|bp': { action_: 'o=', nextState: 'o' },\n 'o|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } },\n '$...$': {\n 'a': { action_: 'a=' }, // 2$n$\n '0|1|2|3|as|b|p|bp|o': { action_: 'o=', nextState: 'o' }, // not 'amount'\n 'as|o': { action_: 'o=' },\n 'q|d|D|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } },\n '\\\\bond{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: \"3\" } },\n '\\\\frac{(...)}': {\n '*': { action_: [ { type_: 'output', option: 1 }, 'frac-output' ], nextState: '3' } },\n '\\\\overset{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'overset-output' ], nextState: '3' } },\n '\\\\underset{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'underset-output' ], nextState: '3' } },\n '\\\\underbrace{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'underbrace-output' ], nextState: '3' } },\n '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'color-output' ], nextState: '3' } },\n '\\\\color{(...)}0': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'color0-output' ] } },\n '\\\\ce{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'ce' ], nextState: '3' } },\n '\\\\,': {\n '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '1' } },\n '\\\\x{}{}|\\\\x{}|\\\\x': {\n '0|1|2|3|a|as|b|p|bp|o|c0': { action_: [ 'o=', 'output' ], nextState: '3' },\n '*': { action_: ['output', 'o=', 'output' ], nextState: '3' } },\n 'others': {\n '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '3' } },\n 'else2': {\n 'a': { action_: 'a to o', nextState: 'o', revisit: true },\n 'as': { action_: [ 'output', 'sb=true' ], nextState: '1', revisit: true },\n 'r|rt|rd|rdt|rdq': { action_: [ 'output' ], nextState: '0', revisit: true },\n '*': { action_: [ 'output', 'copy' ], nextState: '3' } }\n }),\n actions: {\n 'o after d': function (buffer, m) {\n var ret;\n if ((buffer.d || \"\").match(/^[0-9]+$/)) {\n var tmp = buffer.d;\n buffer.d = undefined;\n ret = this['output'](buffer);\n buffer.b = tmp;\n } else {\n ret = this['output'](buffer);\n }\n mhchemParser.actions['o='](buffer, m);\n return ret;\n },\n 'd= kv': function (buffer, m) {\n buffer.d = m;\n buffer.dType = 'kv';\n },\n 'charge or bond': function (buffer, m) {\n if (buffer['beginsWithBond']) {\n /** @type {ParserOutput[]} */\n var ret = [];\n mhchemParser.concatArray(ret, this['output'](buffer));\n mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, \"-\"));\n return ret;\n } else {\n buffer.d = m;\n }\n },\n '- after o/d': function (buffer, m, isAfterD) {\n var c1 = mhchemParser.patterns.match_('orbital', buffer.o || \"\");\n var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || \"\");\n var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || \"\");\n var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || \"\");\n var hyphenFollows = m===\"-\" && ( c1 && c1.remainder===\"\" || c2 || c3 || c4 );\n if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) {\n buffer.o = '$' + buffer.o + '$';\n }\n /** @type {ParserOutput[]} */\n var ret = [];\n if (hyphenFollows) {\n mhchemParser.concatArray(ret, this['output'](buffer));\n ret.push({ type_: 'hyphen' });\n } else {\n c1 = mhchemParser.patterns.match_('digits', buffer.d || \"\");\n if (isAfterD && c1 && c1.remainder==='') {\n mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m));\n mhchemParser.concatArray(ret, this['output'](buffer));\n } else {\n mhchemParser.concatArray(ret, this['output'](buffer));\n mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, \"-\"));\n }\n }\n return ret;\n },\n 'a to o': function (buffer) {\n buffer.o = buffer.a;\n buffer.a = undefined;\n },\n 'sb=true': function (buffer) { buffer.sb = true; },\n 'sb=false': function (buffer) { buffer.sb = false; },\n 'beginsWithBond=true': function (buffer) { buffer['beginsWithBond'] = true; },\n 'beginsWithBond=false': function (buffer) { buffer['beginsWithBond'] = false; },\n 'parenthesisLevel++': function (buffer) { buffer['parenthesisLevel']++; },\n 'parenthesisLevel--': function (buffer) { buffer['parenthesisLevel']--; },\n 'state of aggregation': function (buffer, m) {\n return { type_: 'state of aggregation', p1: mhchemParser.go(m, 'o') };\n },\n 'comma': function (buffer, m) {\n var a = m.replace(/\\s*$/, '');\n var withSpace = (a !== m);\n if (withSpace && buffer['parenthesisLevel'] === 0) {\n return { type_: 'comma enumeration L', p1: a };\n } else {\n return { type_: 'comma enumeration M', p1: a };\n }\n },\n 'output': function (buffer, m, entityFollows) {\n // entityFollows:\n // undefined = if we have nothing else to output, also ignore the just read space (buffer.sb)\n // 1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1)\n // 2 = 1 + the entity can have an amount, so output a\\, instead of converting it to o (can only apply to states a|as)\n /** @type {ParserOutput | ParserOutput[]} */\n var ret;\n if (!buffer.r) {\n ret = [];\n if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) {\n //ret = [];\n } else {\n if (buffer.sb) {\n ret.push({ type_: 'entitySkip' });\n }\n if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows!==2) {\n buffer.o = buffer.a;\n buffer.a = undefined;\n } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) {\n buffer.o = buffer.a;\n buffer.d = buffer.b;\n buffer.q = buffer.p;\n buffer.a = buffer.b = buffer.p = undefined;\n } else {\n if (buffer.o && buffer.dType==='kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || \"\")) {\n buffer.dType = 'oxidation';\n } else if (buffer.o && buffer.dType==='kv' && !buffer.q) {\n buffer.dType = undefined;\n }\n }\n ret.push({\n type_: 'chemfive',\n a: mhchemParser.go(buffer.a, 'a'),\n b: mhchemParser.go(buffer.b, 'bd'),\n p: mhchemParser.go(buffer.p, 'pq'),\n o: mhchemParser.go(buffer.o, 'o'),\n q: mhchemParser.go(buffer.q, 'pq'),\n d: mhchemParser.go(buffer.d, (buffer.dType === 'oxidation' ? 'oxidation' : 'bd')),\n dType: buffer.dType\n });\n }\n } else { // r\n /** @type {ParserOutput[]} */\n var rd;\n if (buffer.rdt === 'M') {\n rd = mhchemParser.go(buffer.rd, 'tex-math');\n } else if (buffer.rdt === 'T') {\n rd = [ { type_: 'text', p1: buffer.rd || \"\" } ];\n } else {\n rd = mhchemParser.go(buffer.rd);\n }\n /** @type {ParserOutput[]} */\n var rq;\n if (buffer.rqt === 'M') {\n rq = mhchemParser.go(buffer.rq, 'tex-math');\n } else if (buffer.rqt === 'T') {\n rq = [ { type_: 'text', p1: buffer.rq || \"\"} ];\n } else {\n rq = mhchemParser.go(buffer.rq);\n }\n ret = {\n type_: 'arrow',\n r: buffer.r,\n rd: rd,\n rq: rq\n };\n }\n for (var p in buffer) {\n if (p !== 'parenthesisLevel' && p !== 'beginsWithBond') {\n delete buffer[p];\n }\n }\n return ret;\n },\n 'oxidation-output': function (buffer, m) {\n var ret = [ \"{\" ];\n mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation'));\n ret.push(\"}\");\n return ret;\n },\n 'frac-output': function (buffer, m) {\n return { type_: 'frac-ce', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n },\n 'overset-output': function (buffer, m) {\n return { type_: 'overset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n },\n 'underset-output': function (buffer, m) {\n return { type_: 'underset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n },\n 'underbrace-output': function (buffer, m) {\n return { type_: 'underbrace', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n },\n 'color-output': function (buffer, m) {\n return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1]) };\n },\n 'r=': function (buffer, m) { buffer.r = m; },\n 'rdt=': function (buffer, m) { buffer.rdt = m; },\n 'rd=': function (buffer, m) { buffer.rd = m; },\n 'rqt=': function (buffer, m) { buffer.rqt = m; },\n 'rq=': function (buffer, m) { buffer.rq = m; },\n 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; }\n }\n },\n 'a': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n '1/2$': {\n '0': { action_: '1/2' } },\n 'else': {\n '0': { nextState: '1', revisit: true } },\n '$(...)$': {\n '*': { action_: 'tex-math tight', nextState: '1' } },\n ',': {\n '*': { action_: { type_: 'insert', option: 'commaDecimal' } } },\n 'else2': {\n '*': { action_: 'copy' } }\n }),\n actions: {}\n },\n 'o': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n '1/2$': {\n '0': { action_: '1/2' } },\n 'else': {\n '0': { nextState: '1', revisit: true } },\n 'letters': {\n '*': { action_: 'rm' } },\n '\\\\ca': {\n '*': { action_: { type_: 'insert', option: 'circa' } } },\n '\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'copy' } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n '{(...)}': {\n '*': { action_: '{text}' } },\n 'else2': {\n '*': { action_: 'copy' } }\n }),\n actions: {}\n },\n 'text': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n '{...}': {\n '*': { action_: 'text=' } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n '\\\\greek': {\n '*': { action_: [ 'output', 'rm' ] } },\n '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: [ 'output', 'copy' ] } },\n 'else': {\n '*': { action_: 'text=' } }\n }),\n actions: {\n 'output': function (buffer) {\n if (buffer.text_) {\n /** @type {ParserOutput} */\n var ret = { type_: 'text', p1: buffer.text_ };\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n }\n },\n 'pq': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n 'state of aggregation $': {\n '*': { action_: 'state of aggregation' } },\n 'i$': {\n '0': { nextState: '!f', revisit: true } },\n '(KV letters),': {\n '0': { action_: 'rm', nextState: '0' } },\n 'formula$': {\n '0': { nextState: 'f', revisit: true } },\n '1/2$': {\n '0': { action_: '1/2' } },\n 'else': {\n '0': { nextState: '!f', revisit: true } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n '{(...)}': {\n '*': { action_: 'text' } },\n 'a-z': {\n 'f': { action_: 'tex-math' } },\n 'letters': {\n '*': { action_: 'rm' } },\n '-9.,9': {\n '*': { action_: '9,9' } },\n ',': {\n '*': { action_: { type_: 'insert+p1', option: 'comma enumeration S' } } },\n '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n '*': { action_: 'color-output' } },\n '\\\\color{(...)}0': {\n '*': { action_: 'color0-output' } },\n '\\\\ce{(...)}': {\n '*': { action_: 'ce' } },\n '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'copy' } },\n 'else2': {\n '*': { action_: 'copy' } }\n }),\n actions: {\n 'state of aggregation': function (buffer, m) {\n return { type_: 'state of aggregation subscript', p1: mhchemParser.go(m, 'o') };\n },\n 'color-output': function (buffer, m) {\n return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'pq') };\n }\n }\n },\n 'bd': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n 'x$': {\n '0': { nextState: '!f', revisit: true } },\n 'formula$': {\n '0': { nextState: 'f', revisit: true } },\n 'else': {\n '0': { nextState: '!f', revisit: true } },\n '-9.,9 no missing 0': {\n '*': { action_: '9,9' } },\n '.': {\n '*': { action_: { type_: 'insert', option: 'electron dot' } } },\n 'a-z': {\n 'f': { action_: 'tex-math' } },\n 'x': {\n '*': { action_: { type_: 'insert', option: 'KV x' } } },\n 'letters': {\n '*': { action_: 'rm' } },\n '\\'': {\n '*': { action_: { type_: 'insert', option: 'prime' } } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n '{(...)}': {\n '*': { action_: 'text' } },\n '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n '*': { action_: 'color-output' } },\n '\\\\color{(...)}0': {\n '*': { action_: 'color0-output' } },\n '\\\\ce{(...)}': {\n '*': { action_: 'ce' } },\n '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'copy' } },\n 'else2': {\n '*': { action_: 'copy' } }\n }),\n actions: {\n 'color-output': function (buffer, m) {\n return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'bd') };\n }\n }\n },\n 'oxidation': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n 'roman numeral': {\n '*': { action_: 'roman-numeral' } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n 'else': {\n '*': { action_: 'copy' } }\n }),\n actions: {\n 'roman-numeral': function (buffer, m) { return { type_: 'roman numeral', p1: m || \"\" }; }\n }\n },\n 'tex-math': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n '\\\\ce{(...)}': {\n '*': { action_: [ 'output', 'ce' ] } },\n '{...}|\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'o=' } },\n 'else': {\n '*': { action_: 'o=' } }\n }),\n actions: {\n 'output': function (buffer) {\n if (buffer.o) {\n /** @type {ParserOutput} */\n var ret = { type_: 'tex-math', p1: buffer.o };\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n }\n },\n 'tex-math tight': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n '\\\\ce{(...)}': {\n '*': { action_: [ 'output', 'ce' ] } },\n '{...}|\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'o=' } },\n '-|+': {\n '*': { action_: 'tight operator' } },\n 'else': {\n '*': { action_: 'o=' } }\n }),\n actions: {\n 'tight operator': function (buffer, m) { buffer.o = (buffer.o || \"\") + \"{\"+m+\"}\"; },\n 'output': function (buffer) {\n if (buffer.o) {\n /** @type {ParserOutput} */\n var ret = { type_: 'tex-math', p1: buffer.o };\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n }\n },\n '9,9': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n ',': {\n '*': { action_: 'comma' } },\n 'else': {\n '*': { action_: 'copy' } }\n }),\n actions: {\n 'comma': function () { return { type_: 'commaDecimal' }; }\n }\n },\n //#endregion\n //\n // \\pu state machines\n //\n //#region pu\n 'pu': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n 'space$': {\n '*': { action_: [ 'output', 'space' ] } },\n '{[(|)]}': {\n '0|a': { action_: 'copy' } },\n '(-)(9)^(-9)': {\n '0': { action_: 'number^', nextState: 'a' } },\n '(-)(9.,9)(e)(99)': {\n '0': { action_: 'enumber', nextState: 'a' } },\n 'space': {\n '0|a': {} },\n 'pm-operator': {\n '0|a': { action_: { type_: 'operator', option: '\\\\pm' }, nextState: '0' } },\n 'operator': {\n '0|a': { action_: 'copy', nextState: '0' } },\n '//': {\n 'd': { action_: 'o=', nextState: '/' } },\n '/': {\n 'd': { action_: 'o=', nextState: '/' } },\n '{...}|else': {\n '0|d': { action_: 'd=', nextState: 'd' },\n 'a': { action_: [ 'space', 'd=' ], nextState: 'd' },\n '/|q': { action_: 'q=', nextState: 'q' } }\n }),\n actions: {\n 'enumber': function (buffer, m) {\n /** @type {ParserOutput[]} */\n var ret = [];\n if (m[0] === \"+-\" || m[0] === \"+/-\") {\n ret.push(\"\\\\pm \");\n } else if (m[0]) {\n ret.push(m[0]);\n }\n if (m[1]) {\n mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));\n if (m[2]) {\n if (m[2].match(/[,.]/)) {\n mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9'));\n } else {\n ret.push(m[2]);\n }\n }\n m[3] = m[4] || m[3];\n if (m[3]) {\n m[3] = m[3].trim();\n if (m[3] === \"e\" || m[3].substr(0, 1) === \"*\") {\n ret.push({ type_: 'cdot' });\n } else {\n ret.push({ type_: 'times' });\n }\n }\n }\n if (m[3]) {\n ret.push(\"10^{\"+m[5]+\"}\");\n }\n return ret;\n },\n 'number^': function (buffer, m) {\n /** @type {ParserOutput[]} */\n var ret = [];\n if (m[0] === \"+-\" || m[0] === \"+/-\") {\n ret.push(\"\\\\pm \");\n } else if (m[0]) {\n ret.push(m[0]);\n }\n mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));\n ret.push(\"^{\"+m[2]+\"}\");\n return ret;\n },\n 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; },\n 'space': function () { return { type_: 'pu-space-1' }; },\n 'output': function (buffer) {\n /** @type {ParserOutput | ParserOutput[]} */\n var ret;\n var md = mhchemParser.patterns.match_('{(...)}', buffer.d || \"\");\n if (md && md.remainder === '') { buffer.d = md.match_; }\n var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || \"\");\n if (mq && mq.remainder === '') { buffer.q = mq.match_; }\n if (buffer.d) {\n buffer.d = buffer.d.replace(/\\u00B0C|\\^oC|\\^{o}C/g, \"{}^{\\\\circ}C\");\n buffer.d = buffer.d.replace(/\\u00B0F|\\^oF|\\^{o}F/g, \"{}^{\\\\circ}F\");\n }\n if (buffer.q) { // fraction\n buffer.q = buffer.q.replace(/\\u00B0C|\\^oC|\\^{o}C/g, \"{}^{\\\\circ}C\");\n buffer.q = buffer.q.replace(/\\u00B0F|\\^oF|\\^{o}F/g, \"{}^{\\\\circ}F\");\n var b5 = {\n d: mhchemParser.go(buffer.d, 'pu'),\n q: mhchemParser.go(buffer.q, 'pu')\n };\n if (buffer.o === '//') {\n ret = { type_: 'pu-frac', p1: b5.d, p2: b5.q };\n } else {\n ret = b5.d;\n if (b5.d.length > 1 || b5.q.length > 1) {\n ret.push({ type_: ' / ' });\n } else {\n ret.push({ type_: '/' });\n }\n mhchemParser.concatArray(ret, b5.q);\n }\n } else { // no fraction\n ret = mhchemParser.go(buffer.d, 'pu-2');\n }\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n },\n 'pu-2': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n '*': {\n '*': { action_: [ 'output', 'cdot' ], nextState: '0' } },\n '\\\\x': {\n '*': { action_: 'rm=' } },\n 'space': {\n '*': { action_: [ 'output', 'space' ], nextState: '0' } },\n '^{(...)}|^(-1)': {\n '1': { action_: '^(-1)' } },\n '-9.,9': {\n '0': { action_: 'rm=', nextState: '0' },\n '1': { action_: '^(-1)', nextState: '0' } },\n '{...}|else': {\n '*': { action_: 'rm=', nextState: '1' } }\n }),\n actions: {\n 'cdot': function () { return { type_: 'tight cdot' }; },\n '^(-1)': function (buffer, m) { buffer.rm += \"^{\"+m+\"}\"; },\n 'space': function () { return { type_: 'pu-space-2' }; },\n 'output': function (buffer) {\n /** @type {ParserOutput | ParserOutput[]} */\n var ret = [];\n if (buffer.rm) {\n var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || \"\");\n if (mrm && mrm.remainder === '') {\n ret = mhchemParser.go(mrm.match_, 'pu');\n } else {\n ret = { type_: 'rm', p1: buffer.rm };\n }\n }\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n },\n 'pu-9,9': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '0': { action_: 'output-0' },\n 'o': { action_: 'output-o' } },\n ',': {\n '0': { action_: [ 'output-0', 'comma' ], nextState: 'o' } },\n '.': {\n '0': { action_: [ 'output-0', 'copy' ], nextState: 'o' } },\n 'else': {\n '*': { action_: 'text=' } }\n }),\n actions: {\n 'comma': function () { return { type_: 'commaDecimal' }; },\n 'output-0': function (buffer) {\n /** @type {ParserOutput[]} */\n var ret = [];\n buffer.text_ = buffer.text_ || \"\";\n if (buffer.text_.length > 4) {\n var a = buffer.text_.length % 3;\n if (a === 0) { a = 3; }\n for (var i=buffer.text_.length-3; i>0; i-=3) {\n ret.push(buffer.text_.substr(i, 3));\n ret.push({ type_: '1000 separator' });\n }\n ret.push(buffer.text_.substr(0, a));\n ret.reverse();\n } else {\n ret.push(buffer.text_);\n }\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n },\n 'output-o': function (buffer) {\n /** @type {ParserOutput[]} */\n var ret = [];\n buffer.text_ = buffer.text_ || \"\";\n if (buffer.text_.length > 4) {\n var a = buffer.text_.length - 3;\n for (var i=0; i<a; i+=3) {\n ret.push(buffer.text_.substr(i, 3));\n ret.push({ type_: '1000 separator' });\n }\n ret.push(buffer.text_.substr(i));\n } else {\n ret.push(buffer.text_);\n }\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n }\n //#endregion\n };\n\n //\n // texify: Take MhchemParser output and convert it to TeX\n //\n /** @type {Texify} */\n var texify = {\n go: function (input, isInner) { // (recursive, max 4 levels)\n if (!input) { return \"\"; }\n var res = \"\";\n var cee = false;\n for (var i=0; i < input.length; i++) {\n var inputi = input[i];\n if (typeof inputi === \"string\") {\n res += inputi;\n } else {\n res += texify._go2(inputi);\n if (inputi.type_ === '1st-level escape') { cee = true; }\n }\n }\n if (!isInner && !cee && res) {\n res = \"{\" + res + \"}\";\n }\n return res;\n },\n _goInner: function (input) {\n if (!input) { return input; }\n return texify.go(input, true);\n },\n _go2: function (buf) {\n /** @type {undefined | string} */\n var res;\n switch (buf.type_) {\n case 'chemfive':\n res = \"\";\n var b5 = {\n a: texify._goInner(buf.a),\n b: texify._goInner(buf.b),\n p: texify._goInner(buf.p),\n o: texify._goInner(buf.o),\n q: texify._goInner(buf.q),\n d: texify._goInner(buf.d)\n };\n //\n // a\n //\n if (b5.a) {\n if (b5.a.match(/^[+\\-]/)) { b5.a = \"{\"+b5.a+\"}\"; }\n res += b5.a + \"\\\\,\";\n }\n //\n // b and p\n //\n if (b5.b || b5.p) {\n res += \"{\\\\vphantom{X}}\";\n res += \"^{\\\\hphantom{\"+(b5.b||\"\")+\"}}_{\\\\hphantom{\"+(b5.p||\"\")+\"}}\";\n res += \"{\\\\vphantom{X}}\";\n // In the next two lines, I've removed \\smash[t] (ron)\n // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n //res += \"^{\\\\smash[t]{\\\\vphantom{2}}\\\\mathllap{\"+(b5.b||\"\")+\"}}\";\n res += \"^{\\\\vphantom{2}\\\\mathllap{\"+(b5.b||\"\")+\"}}\";\n //res += \"_{\\\\vphantom{2}\\\\mathllap{\\\\smash[t]{\"+(b5.p||\"\")+\"}}}\";\n res += \"_{\\\\vphantom{2}\\\\mathllap{\"+(b5.p||\"\")+\"}}\";\n }\n //\n // o\n //\n if (b5.o) {\n if (b5.o.match(/^[+\\-]/)) { b5.o = \"{\"+b5.o+\"}\"; }\n res += b5.o;\n }\n //\n // q and d\n //\n if (buf.dType === 'kv') {\n if (b5.d || b5.q) {\n res += \"{\\\\vphantom{X}}\";\n }\n if (b5.d) {\n res += \"^{\"+b5.d+\"}\";\n }\n if (b5.q) {\n // In the next line, I've removed \\smash[t] (ron)\n // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n //res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n res += \"_{\"+b5.q+\"}\";\n }\n } else if (buf.dType === 'oxidation') {\n if (b5.d) {\n res += \"{\\\\vphantom{X}}\";\n res += \"^{\"+b5.d+\"}\";\n }\n if (b5.q) {\n // A Firefox bug adds a bogus depth to <mphantom>, so we change \\vphantom{X} to {}\n // TODO: Reinstate \\vphantom{X} when the Firefox bug is fixed.\n// res += \"{\\\\vphantom{X}}\";\n res += \"{{}}\";\n // In the next line, I've removed \\smash[t] (ron)\n // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n //res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n res += \"_{\"+b5.q+\"}\";\n }\n } else {\n if (b5.q) {\n // TODO: Reinstate \\vphantom{X} when the Firefox bug is fixed.\n// res += \"{\\\\vphantom{X}}\";\n res += \"{{}}\";\n // In the next line, I've removed \\smash[t] (ron)\n // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n //res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n res += \"_{\"+b5.q+\"}\";\n }\n if (b5.d) {\n // TODO: Reinstate \\vphantom{X} when the Firefox bug is fixed.\n// res += \"{\\\\vphantom{X}}\";\n res += \"{{}}\";\n res += \"^{\"+b5.d+\"}\";\n }\n }\n break;\n case 'rm':\n res = \"\\\\mathrm{\"+buf.p1+\"}\";\n break;\n case 'text':\n if (buf.p1.match(/[\\^_]/)) {\n buf.p1 = buf.p1.replace(\" \", \"~\").replace(\"-\", \"\\\\text{-}\");\n res = \"\\\\mathrm{\"+buf.p1+\"}\";\n } else {\n res = \"\\\\text{\"+buf.p1+\"}\";\n }\n break;\n case 'roman numeral':\n res = \"\\\\mathrm{\"+buf.p1+\"}\";\n break;\n case 'state of aggregation':\n res = \"\\\\mskip2mu \"+texify._goInner(buf.p1);\n break;\n case 'state of aggregation subscript':\n res = \"\\\\mskip1mu \"+texify._goInner(buf.p1);\n break;\n case 'bond':\n res = texify._getBond(buf.kind_);\n if (!res) {\n throw [\"MhchemErrorBond\", \"mhchem Error. Unknown bond type (\" + buf.kind_ + \")\"];\n }\n break;\n case 'frac':\n var c = \"\\\\frac{\" + buf.p1 + \"}{\" + buf.p2 + \"}\";\n res = \"\\\\mathchoice{\\\\textstyle\"+c+\"}{\"+c+\"}{\"+c+\"}{\"+c+\"}\";\n break;\n case 'pu-frac':\n var d = \"\\\\frac{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n res = \"\\\\mathchoice{\\\\textstyle\"+d+\"}{\"+d+\"}{\"+d+\"}{\"+d+\"}\";\n break;\n case 'tex-math':\n res = buf.p1 + \" \";\n break;\n case 'frac-ce':\n res = \"\\\\frac{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n break;\n case 'overset':\n res = \"\\\\overset{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n break;\n case 'underset':\n res = \"\\\\underset{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n break;\n case 'underbrace':\n res = \"\\\\underbrace{\" + texify._goInner(buf.p1) + \"}_{\" + texify._goInner(buf.p2) + \"}\";\n break;\n case 'color':\n res = \"{\\\\color{\" + buf.color1 + \"}{\" + texify._goInner(buf.color2) + \"}}\";\n break;\n case 'color0':\n res = \"\\\\color{\" + buf.color + \"}\";\n break;\n case 'arrow':\n var b6 = {\n rd: texify._goInner(buf.rd),\n rq: texify._goInner(buf.rq)\n };\n var arrow = texify._getArrow(buf.r);\n if (b6.rq) { arrow += \"[{\\\\rm \" + b6.rq + \"}]\"; }\n if (b6.rd) {\n arrow += \"{\\\\rm \" + b6.rd + \"}\";\n } else {\n arrow += \"{}\";\n }\n res = arrow;\n break;\n case 'operator':\n res = texify._getOperator(buf.kind_);\n break;\n case '1st-level escape':\n res = buf.p1+\" \"; // &, \\\\\\\\, \\\\hlin\n break;\n case 'space':\n res = \" \";\n break;\n case 'entitySkip':\n res = \"~\";\n break;\n case 'pu-space-1':\n res = \"~\";\n break;\n case 'pu-space-2':\n res = \"\\\\mkern3mu \";\n break;\n case '1000 separator':\n res = \"\\\\mkern2mu \";\n break;\n case 'commaDecimal':\n res = \"{,}\";\n break;\n case 'comma enumeration L':\n res = \"{\"+buf.p1+\"}\\\\mkern6mu \";\n break;\n case 'comma enumeration M':\n res = \"{\"+buf.p1+\"}\\\\mkern3mu \";\n break;\n case 'comma enumeration S':\n res = \"{\"+buf.p1+\"}\\\\mkern1mu \";\n break;\n case 'hyphen':\n res = \"\\\\text{-}\";\n break;\n case 'addition compound':\n res = \"\\\\,{\\\\cdot}\\\\,\";\n break;\n case 'electron dot':\n res = \"\\\\mkern1mu \\\\text{\\\\textbullet}\\\\mkern1mu \";\n break;\n case 'KV x':\n res = \"{\\\\times}\";\n break;\n case 'prime':\n res = \"\\\\prime \";\n break;\n case 'cdot':\n res = \"\\\\cdot \";\n break;\n case 'tight cdot':\n res = \"\\\\mkern1mu{\\\\cdot}\\\\mkern1mu \";\n break;\n case 'times':\n res = \"\\\\times \";\n break;\n case 'circa':\n res = \"{\\\\sim}\";\n break;\n case '^':\n res = \"uparrow\";\n break;\n case 'v':\n res = \"downarrow\";\n break;\n case 'ellipsis':\n res = \"\\\\ldots \";\n break;\n case '/':\n res = \"/\";\n break;\n case ' / ':\n res = \"\\\\,/\\\\,\";\n break;\n default:\n assertNever(buf);\n throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"]; // Missing texify rule or unknown MhchemParser output\n }\n assertString(res);\n return res;\n },\n _getArrow: function (a) {\n switch (a) {\n case \"->\": return \"\\\\yields\";\n case \"\\u2192\": return \"\\\\yields\";\n case \"\\u27F6\": return \"\\\\yields\";\n case \"<-\": return \"\\\\yieldsLeft\";\n case \"<->\": return \"\\\\mesomerism\";\n case \"<-->\": return \"\\\\yieldsLeftRight\";\n case \"<=>\": return \"\\\\equilibrium\";\n case \"\\u21CC\": return \"\\\\equilibrium\";\n case \"<=>>\": return \"\\\\equilibriumRight\";\n case \"<<=>\": return \"\\\\equilibriumLeft\";\n default:\n assertNever(a);\n throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n }\n },\n _getBond: function (a) {\n switch (a) {\n case \"-\": return \"{-}\";\n case \"1\": return \"{-}\";\n case \"=\": return \"{=}\";\n case \"2\": return \"{=}\";\n case \"#\": return \"{\\\\equiv}\";\n case \"3\": return \"{\\\\equiv}\";\n case \"~\": return \"{\\\\tripleDash}\";\n case \"~-\": return \"{\\\\tripleDashOverLine}\";\n case \"~=\": return \"{\\\\tripleDashOverDoubleLine}\";\n case \"~--\": return \"{\\\\tripleDashOverDoubleLine}\";\n case \"-~-\": return \"{\\\\tripleDashBetweenDoubleLine}\";\n case \"...\": return \"{{\\\\cdot}{\\\\cdot}{\\\\cdot}}\";\n case \"....\": return \"{{\\\\cdot}{\\\\cdot}{\\\\cdot}{\\\\cdot}}\";\n case \"->\": return \"{\\\\rightarrow}\";\n case \"<-\": return \"{\\\\leftarrow}\";\n case \"<\": return \"{<}\";\n case \">\": return \"{>}\";\n default:\n assertNever(a);\n throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n }\n },\n _getOperator: function (a) {\n switch (a) {\n case \"+\": return \" {}+{} \";\n case \"-\": return \" {}-{} \";\n case \"=\": return \" {}={} \";\n case \"<\": return \" {}<{} \";\n case \">\": return \" {}>{} \";\n case \"<<\": return \" {}\\\\ll{} \";\n case \">>\": return \" {}\\\\gg{} \";\n case \"\\\\pm\": return \" {}\\\\pm{} \";\n case \"\\\\approx\": return \" {}\\\\approx{} \";\n case \"$\\\\approx$\": return \" {}\\\\approx{} \";\n case \"v\": return \" \\\\downarrow{} \";\n case \"(v)\": return \" \\\\downarrow{} \";\n case \"^\": return \" \\\\uparrow{} \";\n case \"(^)\": return \" \\\\uparrow{} \";\n default:\n assertNever(a);\n throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n }\n }\n };\n\n //\n // Helpers for code analysis\n // Will show type error at calling position\n //\n /** @param {number} a */\n function assertNever(a) {}\n /** @param {string} a */\n function assertString(a) {}\n\n/* eslint-disable no-undef */\n\n//////////////////////////////////////////////////////////////////////\n// texvc.sty\n\n// The texvc package contains macros available in mediawiki pages.\n// We omit the functions deprecated at\n// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax\n\n// We also omit texvc's \\O, which conflicts with \\text{\\O}\n\ndefineMacro(\"\\\\darr\", \"\\\\downarrow\");\ndefineMacro(\"\\\\dArr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\Darr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\lang\", \"\\\\langle\");\ndefineMacro(\"\\\\rang\", \"\\\\rangle\");\ndefineMacro(\"\\\\uarr\", \"\\\\uparrow\");\ndefineMacro(\"\\\\uArr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\Uarr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\N\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\R\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Z\", \"\\\\mathbb{Z}\");\ndefineMacro(\"\\\\alef\", \"\\\\aleph\");\ndefineMacro(\"\\\\alefsym\", \"\\\\aleph\");\ndefineMacro(\"\\\\bull\", \"\\\\bullet\");\ndefineMacro(\"\\\\clubs\", \"\\\\clubsuit\");\ndefineMacro(\"\\\\cnums\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Complex\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Dagger\", \"\\\\ddagger\");\ndefineMacro(\"\\\\diamonds\", \"\\\\diamondsuit\");\ndefineMacro(\"\\\\empty\", \"\\\\emptyset\");\ndefineMacro(\"\\\\exist\", \"\\\\exists\");\ndefineMacro(\"\\\\harr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\hArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Harr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\hearts\", \"\\\\heartsuit\");\ndefineMacro(\"\\\\image\", \"\\\\Im\");\ndefineMacro(\"\\\\infin\", \"\\\\infty\");\ndefineMacro(\"\\\\isin\", \"\\\\in\");\ndefineMacro(\"\\\\larr\", \"\\\\leftarrow\");\ndefineMacro(\"\\\\lArr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\Larr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\lrarr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\lrArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Lrarr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\natnums\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\plusmn\", \"\\\\pm\");\ndefineMacro(\"\\\\rarr\", \"\\\\rightarrow\");\ndefineMacro(\"\\\\rArr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\Rarr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\real\", \"\\\\Re\");\ndefineMacro(\"\\\\reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\sdot\", \"\\\\cdot\");\ndefineMacro(\"\\\\sect\", \"\\\\S\");\ndefineMacro(\"\\\\spades\", \"\\\\spadesuit\");\ndefineMacro(\"\\\\sub\", \"\\\\subset\");\ndefineMacro(\"\\\\sube\", \"\\\\subseteq\");\ndefineMacro(\"\\\\supe\", \"\\\\supseteq\");\ndefineMacro(\"\\\\thetasym\", \"\\\\vartheta\");\ndefineMacro(\"\\\\weierp\", \"\\\\wp\");\n\n/* eslint-disable no-undef */\n\n/****************************************************\n *\n * physics.js\n *\n * Implements the Physics Package for LaTeX input.\n *\n * ---------------------------------------------------------------------\n *\n * The original version of this file is licensed as follows:\n * Copyright (c) 2015-2016 Kolen Cheung <https://github.com/ickc/MathJax-third-party-extensions>.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ---------------------------------------------------------------------\n *\n * This file has been revised from the original in the following ways:\n * 1. The interface is changed so that it can be called from Temml, not MathJax.\n * 2. \\Re and \\Im are not used, to avoid conflict with existing LaTeX letters.\n *\n * This revision of the file is released under the MIT license.\n * https://mit-license.org/\n */\ndefineMacro(\"\\\\quantity\", \"{\\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\qty\", \"{\\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\pqty\", \"{\\\\left( #1 \\\\right)}\");\ndefineMacro(\"\\\\bqty\", \"{\\\\left[ #1 \\\\right]}\");\ndefineMacro(\"\\\\vqty\", \"{\\\\left\\\\vert #1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\Bqty\", \"{\\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\absolutevalue\", \"{\\\\left\\\\vert #1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\abs\", \"{\\\\left\\\\vert #1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\norm\", \"{\\\\left\\\\Vert #1 \\\\right\\\\Vert}\");\ndefineMacro(\"\\\\evaluated\", \"{\\\\left.#1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\eval\", \"{\\\\left.#1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\order\", \"{\\\\mathcal{O} \\\\left( #1 \\\\right)}\");\ndefineMacro(\"\\\\commutator\", \"{\\\\left[ #1 , #2 \\\\right]}\");\ndefineMacro(\"\\\\comm\", \"{\\\\left[ #1 , #2 \\\\right]}\");\ndefineMacro(\"\\\\anticommutator\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\acomm\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\poissonbracket\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\pb\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\vectorbold\", \"{\\\\boldsymbol{ #1 }}\");\ndefineMacro(\"\\\\vb\", \"{\\\\boldsymbol{ #1 }}\");\ndefineMacro(\"\\\\vectorarrow\", \"{\\\\vec{\\\\boldsymbol{ #1 }}}\");\ndefineMacro(\"\\\\va\", \"{\\\\vec{\\\\boldsymbol{ #1 }}}\");\ndefineMacro(\"\\\\vectorunit\", \"{{\\\\boldsymbol{\\\\hat{ #1 }}}}\");\ndefineMacro(\"\\\\vu\", \"{{\\\\boldsymbol{\\\\hat{ #1 }}}}\");\ndefineMacro(\"\\\\dotproduct\", \"\\\\mathbin{\\\\boldsymbol\\\\cdot}\");\ndefineMacro(\"\\\\vdot\", \"{\\\\boldsymbol\\\\cdot}\");\ndefineMacro(\"\\\\crossproduct\", \"\\\\mathbin{\\\\boldsymbol\\\\times}\");\ndefineMacro(\"\\\\cross\", \"\\\\mathbin{\\\\boldsymbol\\\\times}\");\ndefineMacro(\"\\\\cp\", \"\\\\mathbin{\\\\boldsymbol\\\\times}\");\ndefineMacro(\"\\\\gradient\", \"{\\\\boldsymbol\\\\nabla}\");\ndefineMacro(\"\\\\grad\", \"{\\\\boldsymbol\\\\nabla}\");\ndefineMacro(\"\\\\divergence\", \"{\\\\grad\\\\vdot}\");\n//defineMacro(\"\\\\div\", \"{\\\\grad\\\\vdot}\"); Not included in Temml. Conflicts w/LaTeX \\div\ndefineMacro(\"\\\\curl\", \"{\\\\grad\\\\cross}\");\ndefineMacro(\"\\\\laplacian\", \"\\\\nabla^2\");\ndefineMacro(\"\\\\tr\", \"{\\\\operatorname{tr}}\");\ndefineMacro(\"\\\\Tr\", \"{\\\\operatorname{Tr}}\");\ndefineMacro(\"\\\\rank\", \"{\\\\operatorname{rank}}\");\ndefineMacro(\"\\\\erf\", \"{\\\\operatorname{erf}}\");\ndefineMacro(\"\\\\Res\", \"{\\\\operatorname{Res}}\");\ndefineMacro(\"\\\\principalvalue\", \"{\\\\mathcal{P}}\");\ndefineMacro(\"\\\\pv\", \"{\\\\mathcal{P}}\");\ndefineMacro(\"\\\\PV\", \"{\\\\operatorname{P.V.}}\");\n// Temml does not use the next two lines. They conflict with LaTeX letters.\n//defineMacro(\"\\\\Re\", \"{\\\\operatorname{Re} \\\\left\\\\{ #1 \\\\right\\\\}}\");\n//defineMacro(\"\\\\Im\", \"{\\\\operatorname{Im} \\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\qqtext\", \"{\\\\quad\\\\text{ #1 }\\\\quad}\");\ndefineMacro(\"\\\\qq\", \"{\\\\quad\\\\text{ #1 }\\\\quad}\");\ndefineMacro(\"\\\\qcomma\", \"{\\\\text{,}\\\\quad}\");\ndefineMacro(\"\\\\qc\", \"{\\\\text{,}\\\\quad}\");\ndefineMacro(\"\\\\qcc\", \"{\\\\quad\\\\text{c.c.}\\\\quad}\");\ndefineMacro(\"\\\\qif\", \"{\\\\quad\\\\text{if}\\\\quad}\");\ndefineMacro(\"\\\\qthen\", \"{\\\\quad\\\\text{then}\\\\quad}\");\ndefineMacro(\"\\\\qelse\", \"{\\\\quad\\\\text{else}\\\\quad}\");\ndefineMacro(\"\\\\qotherwise\", \"{\\\\quad\\\\text{otherwise}\\\\quad}\");\ndefineMacro(\"\\\\qunless\", \"{\\\\quad\\\\text{unless}\\\\quad}\");\ndefineMacro(\"\\\\qgiven\", \"{\\\\quad\\\\text{given}\\\\quad}\");\ndefineMacro(\"\\\\qusing\", \"{\\\\quad\\\\text{using}\\\\quad}\");\ndefineMacro(\"\\\\qassume\", \"{\\\\quad\\\\text{assume}\\\\quad}\");\ndefineMacro(\"\\\\qsince\", \"{\\\\quad\\\\text{since}\\\\quad}\");\ndefineMacro(\"\\\\qlet\", \"{\\\\quad\\\\text{let}\\\\quad}\");\ndefineMacro(\"\\\\qfor\", \"{\\\\quad\\\\text{for}\\\\quad}\");\ndefineMacro(\"\\\\qall\", \"{\\\\quad\\\\text{all}\\\\quad}\");\ndefineMacro(\"\\\\qeven\", \"{\\\\quad\\\\text{even}\\\\quad}\");\ndefineMacro(\"\\\\qodd\", \"{\\\\quad\\\\text{odd}\\\\quad}\");\ndefineMacro(\"\\\\qinteger\", \"{\\\\quad\\\\text{integer}\\\\quad}\");\ndefineMacro(\"\\\\qand\", \"{\\\\quad\\\\text{and}\\\\quad}\");\ndefineMacro(\"\\\\qor\", \"{\\\\quad\\\\text{or}\\\\quad}\");\ndefineMacro(\"\\\\qas\", \"{\\\\quad\\\\text{as}\\\\quad}\");\ndefineMacro(\"\\\\qin\", \"{\\\\quad\\\\text{in}\\\\quad}\");\ndefineMacro(\"\\\\differential\", \"{\\\\text{d}}\");\ndefineMacro(\"\\\\dd\", \"{\\\\text{d}}\");\ndefineMacro(\"\\\\derivative\", \"{\\\\frac{\\\\text{d}{ #1 }}{\\\\text{d}{ #2 }}}\");\ndefineMacro(\"\\\\dv\", \"{\\\\frac{\\\\text{d}{ #1 }}{\\\\text{d}{ #2 }}}\");\ndefineMacro(\"\\\\partialderivative\", \"{\\\\frac{\\\\partial{ #1 }}{\\\\partial{ #2 }}}\");\ndefineMacro(\"\\\\variation\", \"{\\\\delta}\");\ndefineMacro(\"\\\\var\", \"{\\\\delta}\");\ndefineMacro(\"\\\\functionalderivative\", \"{\\\\frac{\\\\delta{ #1 }}{\\\\delta{ #2 }}}\");\ndefineMacro(\"\\\\fdv\", \"{\\\\frac{\\\\delta{ #1 }}{\\\\delta{ #2 }}}\");\ndefineMacro(\"\\\\innerproduct\", \"{\\\\left\\\\langle {#1} \\\\mid { #2} \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\outerproduct\",\n \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\dyad\",\n \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\ketbra\",\n \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\op\",\n \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\expectationvalue\", \"{\\\\left\\\\langle {#1 } \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\expval\", \"{\\\\left\\\\langle {#1 } \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\ev\", \"{\\\\left\\\\langle {#1 } \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\matrixelement\",\n \"{\\\\left\\\\langle{ #1 }\\\\right\\\\vert{ #2 }\\\\left\\\\vert{#3}\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\matrixel\",\n \"{\\\\left\\\\langle{ #1 }\\\\right\\\\vert{ #2 }\\\\left\\\\vert{#3}\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\mel\",\n \"{\\\\left\\\\langle{ #1 }\\\\right\\\\vert{ #2 }\\\\left\\\\vert{#3}\\\\right\\\\rangle}\");\n\n// Helper functions\nfunction getHLines(parser) {\n // Return an array. The array length = number of hlines.\n // Each element in the array tells if the line is dashed.\n const hlineInfo = [];\n parser.consumeSpaces();\n let nxt = parser.fetch().text;\n if (nxt === \"\\\\relax\") {\n parser.consume();\n parser.consumeSpaces();\n nxt = parser.fetch().text;\n }\n while (nxt === \"\\\\hline\" || nxt === \"\\\\hdashline\") {\n parser.consume();\n hlineInfo.push(nxt === \"\\\\hdashline\");\n parser.consumeSpaces();\n nxt = parser.fetch().text;\n }\n return hlineInfo;\n}\n\nconst validateAmsEnvironmentContext = context => {\n const settings = context.parser.settings;\n if (!settings.displayMode) {\n throw new ParseError(`{$context.envName}} can be used only in display mode.`);\n }\n};\n\nconst sizeRegEx$1 = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/;\nconst arrayGaps = macros => {\n let arraystretch = macros.get(\"\\\\arraystretch\");\n if (typeof arraystretch !== \"string\") {\n arraystretch = stringFromArg(arraystretch.tokens);\n }\n arraystretch = isNaN(arraystretch) ? null : Number(arraystretch);\n let arraycolsepStr = macros.get(\"\\\\arraycolsep\");\n if (typeof arraycolsepStr !== \"string\") {\n arraycolsepStr = stringFromArg(arraycolsepStr.tokens);\n }\n const match = sizeRegEx$1.exec(arraycolsepStr);\n const arraycolsep = match\n ? { number: +(match[1] + match[2]), unit: match[3] }\n : null;\n return [arraystretch, arraycolsep]\n};\n\nconst checkCellForLabels = cell => {\n // Check if the author wrote a \\tag{} inside this cell.\n let rowLabel = \"\";\n for (let i = 0; i < cell.length; i++) {\n if (cell[i].type === \"label\") {\n if (rowLabel) { throw new ParseError((\"Multiple \\\\labels in one row\")) }\n rowLabel = cell[i].string;\n }\n }\n return rowLabel\n};\n\n// autoTag (an argument to parseArray) can be one of three values:\n// * undefined: Regular (not-top-level) array; no tags on each row\n// * true: Automatic equation numbering, overridable by \\tag\n// * false: Tags allowed on each row, but no automatic numbering\n// This function *doesn't* work with the \"split\" environment name.\nfunction getAutoTag(name) {\n if (name.indexOf(\"ed\") === -1) {\n return name.indexOf(\"*\") === -1;\n }\n // return undefined;\n}\n\n/**\n * Parse the body of the environment, with rows delimited by \\\\ and\n * columns delimited by &, and create a nested list in row-major order\n * with one group per cell. If given an optional argument scriptLevel\n * (\"text\", \"display\", etc.), then each cell is cast into that scriptLevel.\n */\nfunction parseArray(\n parser,\n {\n cols, // [{ type: string , align: l|c|r|null }]\n envClasses, // align(ed|at|edat) | array | cases | cd | small | multline\n autoTag, // boolean\n singleRow, // boolean\n emptySingleRow, // boolean\n maxNumCols, // number\n leqno, // boolean\n arraystretch, // number | null\n arraycolsep // size value | null\n},\n scriptLevel\n) {\n parser.gullet.beginGroup();\n if (!singleRow) {\n // \\cr is equivalent to \\\\ without the optional size argument (see below)\n // TODO: provide helpful error when \\cr is used outside array environment\n parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n }\n\n // Start group for first cell\n parser.gullet.beginGroup();\n\n let row = [];\n const body = [row];\n const rowGaps = [];\n const labels = [];\n\n const hLinesBeforeRow = [];\n\n const tags = (autoTag != null ? [] : undefined);\n\n // amsmath uses \\global\\@eqnswtrue and \\global\\@eqnswfalse to represent\n // whether this row should have an equation number. Simulate this with\n // a \\@eqnsw macro set to 1 or 0.\n function beginRow() {\n if (autoTag) {\n parser.gullet.macros.set(\"\\\\@eqnsw\", \"1\", true);\n }\n }\n function endRow() {\n if (tags) {\n if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n tags.push(parser.subparse([new Token(\"\\\\df@tag\")]));\n parser.gullet.macros.set(\"\\\\df@tag\", undefined, true);\n } else {\n tags.push(Boolean(autoTag) &&\n parser.gullet.macros.get(\"\\\\@eqnsw\") === \"1\");\n }\n }\n }\n beginRow();\n\n // Test for \\hline at the top of the array.\n hLinesBeforeRow.push(getHLines(parser));\n\n while (true) {\n // Parse each cell in its own group (namespace)\n let cell = parser.parseExpression(false, singleRow ? \"\\\\end\" : \"\\\\\\\\\");\n parser.gullet.endGroup();\n parser.gullet.beginGroup();\n\n cell = {\n type: \"ordgroup\",\n mode: parser.mode,\n body: cell,\n semisimple: true\n };\n row.push(cell);\n const next = parser.fetch().text;\n if (next === \"&\") {\n if (maxNumCols && row.length === maxNumCols) {\n if (envClasses.includes(\"array\")) {\n if (parser.settings.strict) {\n throw new ParseError(\"Too few columns \" + \"specified in the {array} column argument.\",\n parser.nextToken)\n }\n } else if (maxNumCols === 2) {\n throw new ParseError(\"The split environment accepts no more than two columns\",\n parser.nextToken);\n } else {\n throw new ParseError(\"The equation environment accepts only one column\",\n parser.nextToken)\n }\n }\n parser.consume();\n } else if (next === \"\\\\end\") {\n endRow();\n // Arrays terminate newlines with `\\crcr` which consumes a `\\cr` if\n // the last line is empty. However, AMS environments keep the\n // empty row if it's the only one.\n // NOTE: Currently, `cell` is the last item added into `row`.\n if (row.length === 1 && cell.body.length === 0 && (body.length > 1 || !emptySingleRow)) {\n body.pop();\n }\n labels.push(checkCellForLabels(cell.body));\n if (hLinesBeforeRow.length < body.length + 1) {\n hLinesBeforeRow.push([]);\n }\n break;\n } else if (next === \"\\\\\\\\\") {\n parser.consume();\n let size;\n // \\def\\Let@{\\let\\\\\\math@cr}\n // \\def\\math@cr{...\\math@cr@}\n // \\def\\math@cr@{\\new@ifnextchar[\\math@cr@@{\\math@cr@@[\\z@]}}\n // \\def\\math@cr@@[#1]{...\\math@cr@@@...}\n // \\def\\math@cr@@@{\\cr}\n if (parser.gullet.future().text !== \" \") {\n size = parser.parseSizeGroup(true);\n }\n rowGaps.push(size ? size.value : null);\n endRow();\n\n labels.push(checkCellForLabels(cell.body));\n\n // check for \\hline(s) following the row separator\n hLinesBeforeRow.push(getHLines(parser));\n\n row = [];\n body.push(row);\n beginRow();\n } else {\n throw new ParseError(\"Expected & or \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n }\n }\n\n // End cell group\n parser.gullet.endGroup();\n // End array group defining \\cr\n parser.gullet.endGroup();\n\n return {\n type: \"array\",\n mode: parser.mode,\n body,\n cols,\n rowGaps,\n hLinesBeforeRow,\n envClasses,\n autoTag,\n scriptLevel,\n tags,\n labels,\n leqno,\n arraystretch,\n arraycolsep\n };\n}\n\n// Decides on a scriptLevel for cells in an array according to whether the given\n// environment name starts with the letter 'd'.\nfunction dCellStyle(envName) {\n return envName.slice(0, 1) === \"d\" ? \"display\" : \"text\"\n}\n\nconst alignMap = {\n c: \"center \",\n l: \"left \",\n r: \"right \"\n};\n\nconst glue = group => {\n const glueNode = new mathMLTree.MathNode(\"mtd\", []);\n glueNode.style = { padding: \"0\", width: \"50%\" };\n if (group.envClasses.includes(\"multline\")) {\n glueNode.style.width = \"7.5%\";\n }\n return glueNode\n};\n\nconst mathmlBuilder$7 = function(group, style) {\n const tbl = [];\n const numRows = group.body.length;\n const hlines = group.hLinesBeforeRow;\n\n for (let i = 0; i < numRows; i++) {\n const rw = group.body[i];\n const row = [];\n const cellLevel = group.scriptLevel === \"text\"\n ? StyleLevel.TEXT\n : group.scriptLevel === \"script\"\n ? StyleLevel.SCRIPT\n : StyleLevel.DISPLAY;\n\n for (let j = 0; j < rw.length; j++) {\n const mtd = new mathMLTree.MathNode(\n \"mtd\",\n [buildGroup$1(rw[j], style.withLevel(cellLevel))]\n );\n\n if (group.envClasses.includes(\"multline\")) {\n const align = i === 0 ? \"left\" : i === numRows - 1 ? \"right\" : \"center\";\n mtd.setAttribute(\"columnalign\", align);\n if (align !== \"center\") {\n mtd.classes.push(\"tml-\" + align);\n }\n }\n row.push(mtd);\n }\n const numColumns = group.body[0].length;\n // Fill out a short row with empty <mtd> elements.\n for (let k = 0; k < numColumns - rw.length; k++) {\n row.push(new mathMLTree.MathNode(\"mtd\", [], style));\n }\n if (group.autoTag) {\n const tag = group.tags[i];\n let tagElement;\n if (tag === true) { // automatic numbering\n tagElement = new mathMLTree.MathNode(\"mtext\", [new Span([\"tml-eqn\"])]);\n } else if (tag === false) {\n // \\nonumber/\\notag or starred environment\n tagElement = new mathMLTree.MathNode(\"mtext\", [], []);\n } else { // manual \\tag\n tagElement = buildExpressionRow(tag[0].body, style.withLevel(cellLevel), true);\n tagElement = consolidateText(tagElement);\n tagElement.classes = [\"tml-tag\"];\n }\n if (tagElement) {\n row.unshift(glue(group));\n row.push(glue(group));\n if (group.leqno) {\n row[0].children.push(tagElement);\n row[0].classes.push(\"tml-left\");\n } else {\n row[row.length - 1].children.push(tagElement);\n row[row.length - 1].classes.push(\"tml-right\");\n }\n }\n }\n const mtr = new mathMLTree.MathNode(\"mtr\", row, []);\n const label = group.labels.shift();\n if (label && group.tags && group.tags[i]) {\n mtr.setAttribute(\"id\", label);\n if (Array.isArray(group.tags[i])) { mtr.classes.push(\"tml-tageqn\"); }\n }\n\n // Write horizontal rules\n if (i === 0 && hlines[0].length > 0) {\n if (hlines[0].length === 2) {\n mtr.children.forEach(cell => { cell.style.borderTop = \"0.15em double\"; });\n } else {\n mtr.children.forEach(cell => {\n cell.style.borderTop = hlines[0][0] ? \"0.06em dashed\" : \"0.06em solid\";\n });\n }\n }\n if (hlines[i + 1].length > 0) {\n if (hlines[i + 1].length === 2) {\n mtr.children.forEach(cell => { cell.style.borderBottom = \"0.15em double\"; });\n } else {\n mtr.children.forEach(cell => {\n cell.style.borderBottom = hlines[i + 1][0] ? \"0.06em dashed\" : \"0.06em solid\";\n });\n }\n }\n tbl.push(mtr);\n }\n\n if (group.envClasses.length > 0) {\n if (group.arraystretch && group.arraystretch !== 1) {\n // In LaTeX, \\arraystretch is a factor applied to a 12pt strut height.\n // It defines a baseline to baseline distance.\n // Here, we do an approximation of that approach.\n const pad = String(1.4 * group.arraystretch - 0.8) + \"ex\";\n for (let i = 0; i < tbl.length; i++) {\n for (let j = 0; j < tbl[i].children.length; j++) {\n tbl[i].children[j].style.paddingTop = pad;\n tbl[i].children[j].style.paddingBottom = pad;\n }\n }\n }\n let sidePadding = group.envClasses.includes(\"abut\")\n ? \"0\"\n : group.envClasses.includes(\"cases\")\n ? \"0\"\n : group.envClasses.includes(\"small\")\n ? \"0.1389\"\n : group.envClasses.includes(\"cd\")\n ? \"0.25\"\n : \"0.4\"; // default side padding\n let sidePadUnit = \"em\";\n if (group.arraycolsep) {\n const arraySidePad = calculateSize(group.arraycolsep, style);\n sidePadding = arraySidePad.number.toFixed(4);\n sidePadUnit = arraySidePad.unit;\n }\n\n const numCols = tbl.length === 0 ? 0 : tbl[0].children.length;\n\n const sidePad = (j, hand) => {\n if (j === 0 && hand === 0) { return \"0\" }\n if (j === numCols - 1 && hand === 1) { return \"0\" }\n if (group.envClasses[0] !== \"align\") { return sidePadding }\n if (hand === 1) { return \"0\" }\n if (group.autoTag) {\n return (j % 2) ? \"1\" : \"0\"\n } else {\n return (j % 2) ? \"0\" : \"1\"\n }\n };\n\n // Side padding\n for (let i = 0; i < tbl.length; i++) {\n for (let j = 0; j < tbl[i].children.length; j++) {\n tbl[i].children[j].style.paddingLeft = `$sidePad(j, 0)}$sidePadUnit}`;\n tbl[i].children[j].style.paddingRight = `$sidePad(j, 1)}$sidePadUnit}`;\n }\n }\n\n // Justification\n const align = group.envClasses.includes(\"align\") || group.envClasses.includes(\"alignat\");\n for (let i = 0; i < tbl.length; i++) {\n const row = tbl[i];\n if (align) {\n for (let j = 0; j < row.children.length; j++) {\n // Chromium does not recognize text-align: left. Use -webkit-\n // TODO: Remove -webkit- when Chromium no longer needs it.\n row.children[j].classes = [\"tml-\" + (j % 2 ? \"left\" : \"right\")];\n }\n if (group.autoTag) {\n const k = group.leqno ? 0 : row.children.length - 1;\n row.children[k].classes = [\"tml-\" + (group.leqno ? \"left\" : \"right\")];\n }\n }\n if (row.children.length > 1 && group.envClasses.includes(\"cases\")) {\n row.children[1].style.paddingLeft = \"1em\";\n }\n\n if (group.envClasses.includes(\"cases\") || group.envClasses.includes(\"subarray\")) {\n for (const cell of row.children) {\n cell.classes.push(\"tml-left\");\n }\n }\n }\n } else {\n // Set zero padding on side of the matrix\n for (let i = 0; i < tbl.length; i++) {\n tbl[i].children[0].style.paddingLeft = \"0em\";\n if (tbl[i].children.length === tbl[0].children.length) {\n tbl[i].children[tbl[i].children.length - 1].style.paddingRight = \"0em\";\n }\n }\n }\n\n let table = new mathMLTree.MathNode(\"mtable\", tbl);\n if (group.envClasses.length > 0) {\n // Top & bottom padding\n if (group.envClasses.includes(\"jot\")) {\n table.classes.push(\"tml-jot\");\n } else if (group.envClasses.includes(\"small\")) {\n table.classes.push(\"tml-small\");\n }\n }\n if (group.scriptLevel === \"display\") { table.setAttribute(\"displaystyle\", \"true\"); }\n\n if (group.autoTag || group.envClasses.includes(\"multline\")) {\n table.style.width = \"100%\";\n }\n\n // Column separator lines and column alignment\n let align = \"\";\n\n if (group.cols && group.cols.length > 0) {\n const cols = group.cols;\n let prevTypeWasAlign = false;\n let iStart = 0;\n let iEnd = cols.length;\n\n while (cols[iStart].type === \"separator\") {\n iStart += 1;\n }\n while (cols[iEnd - 1].type === \"separator\") {\n iEnd -= 1;\n }\n\n if (cols[0].type === \"separator\") {\n const sep = cols[1].type === \"separator\"\n ? \"0.15em double\"\n : cols[0].separator === \"|\"\n ? \"0.06em solid \"\n : \"0.06em dashed \";\n for (const row of table.children) {\n row.children[0].style.borderLeft = sep;\n }\n }\n let iCol = group.autoTag ? 0 : -1;\n for (let i = iStart; i < iEnd; i++) {\n if (cols[i].type === \"align\") {\n const colAlign = alignMap[cols[i].align];\n align += colAlign;\n iCol += 1;\n for (const row of table.children) {\n if (colAlign.trim() !== \"center\" && iCol < row.children.length) {\n row.children[iCol].classes = [\"tml-\" + colAlign.trim()];\n }\n }\n prevTypeWasAlign = true;\n } else if (cols[i].type === \"separator\") {\n // MathML accepts only single lines between cells.\n // So we read only the first of consecutive separators.\n if (prevTypeWasAlign) {\n const sep = cols[i + 1].type === \"separator\"\n ? \"0.15em double\"\n : cols[i].separator === \"|\"\n ? \"0.06em solid\"\n : \"0.06em dashed\";\n for (const row of table.children) {\n if (iCol < row.children.length) {\n row.children[iCol].style.borderRight = sep;\n }\n }\n }\n prevTypeWasAlign = false;\n }\n }\n if (cols[cols.length - 1].type === \"separator\") {\n const sep = cols[cols.length - 2].type === \"separator\"\n ? \"0.15em double\"\n : cols[cols.length - 1].separator === \"|\"\n ? \"0.06em solid\"\n : \"0.06em dashed\";\n for (const row of table.children) {\n row.children[row.children.length - 1].style.borderRight = sep;\n row.children[row.children.length - 1].style.paddingRight = \"0.4em\";\n }\n }\n }\n if (group.autoTag) {\n // allow for glue cells on each side\n align = \"left \" + (align.length > 0 ? align : \"center \") + \"right \";\n }\n if (align) {\n // Firefox reads this attribute, not the -webkit-left|right written above.\n // TODO: When Chrome no longer needs \"-webkit-\", use CSS and delete the next line.\n table.setAttribute(\"columnalign\", align.trim());\n }\n\n if (group.envClasses.includes(\"small\")) {\n // A small array. Wrap in scriptstyle.\n table = new mathMLTree.MathNode(\"mstyle\", [table]);\n table.setAttribute(\"scriptlevel\", \"1\");\n }\n\n return table\n};\n\n// Convenience function for align, align*, aligned, alignat, alignat*, alignedat, split.\nconst alignedHandler = function(context, args) {\n if (context.envName.indexOf(\"ed\") === -1) {\n validateAmsEnvironmentContext(context);\n }\n const isSplit = context.envName === \"split\";\n const cols = [];\n const res = parseArray(\n context.parser,\n {\n cols,\n emptySingleRow: true,\n autoTag: isSplit ? undefined : getAutoTag(context.envName),\n envClasses: [\"abut\", \"jot\"], // set row spacing & provisional column spacing\n maxNumCols: context.envName === \"split\" ? 2 : undefined,\n leqno: context.parser.settings.leqno\n },\n \"display\"\n );\n\n // Determining number of columns.\n // 1. If the first argument is given, we use it as a number of columns,\n // and makes sure that each row doesn't exceed that number.\n // 2. Otherwise, just count number of columns = maximum number\n // of cells in each row (\"aligned\" mode -- isAligned will be true).\n //\n // At the same time, prepend empty group {} at beginning of every second\n // cell in each row (starting with second cell) so that operators become\n // binary. This behavior is implemented in amsmath's \\start@aligned.\n let numMaths;\n let numCols = 0;\n const isAlignedAt = context.envName.indexOf(\"at\") > -1;\n if (args[0] && isAlignedAt) {\n // alignat environment takes an argument w/ number of columns\n let arg0 = \"\";\n for (let i = 0; i < args[0].body.length; i++) {\n const textord = assertNodeType(args[0].body[i], \"textord\");\n arg0 += textord.text;\n }\n if (isNaN(arg0)) {\n throw new ParseError(\"The alignat enviroment requires a numeric first argument.\")\n }\n numMaths = Number(arg0);\n numCols = numMaths * 2;\n }\n res.body.forEach(function(row) {\n if (isAlignedAt) {\n // Case 1\n const curMaths = row.length / 2;\n if (numMaths < curMaths) {\n throw new ParseError(\n \"Too many math in a row: \" + `expected $numMaths}, but got $curMaths}`,\n row[0]\n );\n }\n } else if (numCols < row.length) {\n // Case 2\n numCols = row.length;\n }\n });\n\n // Adjusting alignment.\n // In aligned mode, we add one \\qquad between columns;\n // otherwise we add nothing.\n for (let i = 0; i < numCols; ++i) {\n let align = \"r\";\n if (i % 2 === 1) {\n align = \"l\";\n }\n cols[i] = {\n type: \"align\",\n align: align\n };\n }\n if (context.envName === \"split\") ; else if (isAlignedAt) {\n res.envClasses.push(\"alignat\"); // Sets justification\n } else {\n res.envClasses[0] = \"align\"; // Sets column spacing & justification\n }\n return res;\n};\n\n// Arrays are part of LaTeX, defined in lttab.dtx so its documentation\n// is part of the source2e.pdf file of LaTeX2e source documentation.\n// {darray} is an {array} environment where cells are set in \\displaystyle,\n// as defined in nccmath.sty.\ndefineEnvironment({\n type: \"array\",\n names: [\"array\", \"darray\"],\n props: {\n numArgs: 1\n },\n handler(context, args) {\n // Since no types are specified above, the two possibilities are\n // - The argument is wrapped in {} or [], in which case Parser's\n // parseGroup() returns an \"ordgroup\" wrapping some symbol node.\n // - The argument is a bare symbol node.\n const symNode = checkSymbolNodeType(args[0]);\n const colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n const cols = colalign.map(function(nde) {\n const node = assertSymbolNodeType(nde);\n const ca = node.text;\n if (\"lcr\".indexOf(ca) !== -1) {\n return {\n type: \"align\",\n align: ca\n };\n } else if (ca === \"|\") {\n return {\n type: \"separator\",\n separator: \"|\"\n };\n } else if (ca === \":\") {\n return {\n type: \"separator\",\n separator: \":\"\n };\n }\n throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n });\n const [arraystretch, arraycolsep] = arrayGaps(context.parser.gullet.macros);\n const res = {\n cols,\n envClasses: [\"array\"],\n maxNumCols: cols.length,\n arraystretch,\n arraycolsep\n };\n return parseArray(context.parser, res, dCellStyle(context.envName));\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\n// The matrix environments of amsmath builds on the array environment\n// of LaTeX, which is discussed above.\n// The mathtools package adds starred versions of the same environments.\n// These have an optional argument to choose left|center|right justification.\ndefineEnvironment({\n type: \"array\",\n names: [\n \"matrix\",\n \"pmatrix\",\n \"bmatrix\",\n \"Bmatrix\",\n \"vmatrix\",\n \"Vmatrix\",\n \"matrix*\",\n \"pmatrix*\",\n \"bmatrix*\",\n \"Bmatrix*\",\n \"vmatrix*\",\n \"Vmatrix*\"\n ],\n props: {\n numArgs: 0\n },\n handler(context) {\n const delimiters = {\n matrix: null,\n pmatrix: [\"(\", \")\"],\n bmatrix: [\"[\", \"]\"],\n Bmatrix: [\"\\\\{\", \"\\\\}\"],\n vmatrix: [\"|\", \"|\"],\n Vmatrix: [\"\\\\Vert\", \"\\\\Vert\"]\n }[context.envName.replace(\"*\", \"\")];\n // \\hskip -\\arraycolsep in amsmath\n let colAlign = \"c\";\n const payload = {\n envClasses: [],\n cols: []\n };\n if (context.envName.charAt(context.envName.length - 1) === \"*\") {\n // It's one of the mathtools starred functions.\n // Parse the optional alignment argument.\n const parser = context.parser;\n parser.consumeSpaces();\n if (parser.fetch().text === \"[\") {\n parser.consume();\n parser.consumeSpaces();\n colAlign = parser.fetch().text;\n if (\"lcr\".indexOf(colAlign) === -1) {\n throw new ParseError(\"Expected l or c or r\", parser.nextToken);\n }\n parser.consume();\n parser.consumeSpaces();\n parser.expect(\"]\");\n parser.consume();\n payload.cols = [];\n }\n }\n const res = parseArray(context.parser, payload, \"text\");\n res.cols = new Array(res.body[0].length).fill({ type: \"align\", align: colAlign });\n const [arraystretch, arraycolsep] = arrayGaps(context.parser.gullet.macros);\n return delimiters\n ? {\n type: \"leftright\",\n mode: context.mode,\n body: [res],\n left: delimiters[0],\n right: delimiters[1],\n rightColor: undefined, // \\right uninfluenced by \\color in array\n arraystretch,\n arraycolsep\n }\n : res;\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\ndefineEnvironment({\n type: \"array\",\n names: [\"smallmatrix\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n const payload = { type: \"small\" };\n const res = parseArray(context.parser, payload, \"script\");\n res.envClasses = [\"small\"];\n return res;\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\ndefineEnvironment({\n type: \"array\",\n names: [\"subarray\"],\n props: {\n numArgs: 1\n },\n handler(context, args) {\n // Parsing of {subarray} is similar to {array}\n const symNode = checkSymbolNodeType(args[0]);\n const colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n const cols = colalign.map(function(nde) {\n const node = assertSymbolNodeType(nde);\n const ca = node.text;\n // {subarray} only recognizes \"l\" & \"c\"\n if (\"lc\".indexOf(ca) !== -1) {\n return {\n type: \"align\",\n align: ca\n };\n }\n throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n });\n if (cols.length > 1) {\n throw new ParseError(\"{subarray} can contain only one column\");\n }\n let res = {\n cols,\n envClasses: [\"small\"]\n };\n res = parseArray(context.parser, res, \"script\");\n if (res.body.length > 0 && res.body[0].length > 1) {\n throw new ParseError(\"{subarray} can contain only one column\");\n }\n return res;\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\n// A cases environment (in amsmath.sty) is almost equivalent to\n// \\def\n// \\left\\{\\begin{array}{@{}l@{\\quad}l@{}} \u2026 \\end{array}\\right.\n// {dcases} is a {cases} environment where cells are set in \\displaystyle,\n// as defined in mathtools.sty.\n// {rcases} is another mathtools environment. It's brace is on the right side.\ndefineEnvironment({\n type: \"array\",\n names: [\"cases\", \"dcases\", \"rcases\", \"drcases\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n const payload = {\n cols: [],\n envClasses: [\"cases\"]\n };\n const res = parseArray(context.parser, payload, dCellStyle(context.envName));\n return {\n type: \"leftright\",\n mode: context.mode,\n body: [res],\n left: context.envName.indexOf(\"r\") > -1 ? \".\" : \"\\\\{\",\n right: context.envName.indexOf(\"r\") > -1 ? \"\\\\}\" : \".\",\n rightColor: undefined\n };\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\n// In the align environment, one uses ampersands, &, to specify number of\n// columns in each row, and to locate spacing between each column.\n// align gets automatic numbering. align* and aligned do not.\n// The alignedat environment can be used in math mode.\ndefineEnvironment({\n type: \"array\",\n names: [\"align\", \"align*\", \"aligned\", \"split\"],\n props: {\n numArgs: 0\n },\n handler: alignedHandler,\n mathmlBuilder: mathmlBuilder$7\n});\n\n// alignat environment is like an align environment, but one must explicitly\n// specify maximum number of columns in each row, and can adjust where spacing occurs.\ndefineEnvironment({\n type: \"array\",\n names: [\"alignat\", \"alignat*\", \"alignedat\"],\n props: {\n numArgs: 1\n },\n handler: alignedHandler,\n mathmlBuilder: mathmlBuilder$7\n});\n\n// A gathered environment is like an array environment with one centered\n// column, but where rows are considered lines so get \\jot line spacing\n// and contents are set in \\displaystyle.\ndefineEnvironment({\n type: \"array\",\n names: [\"gathered\", \"gather\", \"gather*\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n if (context.envName !== \"gathered\") {\n validateAmsEnvironmentContext(context);\n }\n const res = {\n cols: [],\n envClasses: [\"abut\", \"jot\"],\n autoTag: getAutoTag(context.envName),\n emptySingleRow: true,\n leqno: context.parser.settings.leqno\n };\n return parseArray(context.parser, res, \"display\");\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\ndefineEnvironment({\n type: \"array\",\n names: [\"equation\", \"equation*\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n validateAmsEnvironmentContext(context);\n const res = {\n autoTag: getAutoTag(context.envName),\n emptySingleRow: true,\n singleRow: true,\n maxNumCols: 1,\n envClasses: [\"align\"],\n leqno: context.parser.settings.leqno\n };\n return parseArray(context.parser, res, \"display\");\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\ndefineEnvironment({\n type: \"array\",\n names: [\"multline\", \"multline*\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n validateAmsEnvironmentContext(context);\n const res = {\n autoTag: context.envName === \"multline\",\n maxNumCols: 1,\n envClasses: [\"jot\", \"multline\"],\n leqno: context.parser.settings.leqno\n };\n return parseArray(context.parser, res, \"display\");\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\ndefineEnvironment({\n type: \"array\",\n names: [\"CD\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n validateAmsEnvironmentContext(context);\n return parseCD(context.parser);\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\n// Catch \\hline outside array environment\ndefineFunction({\n type: \"text\", // Doesn't matter what this is.\n names: [\"\\\\hline\", \"\\\\hdashline\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n allowedInMath: true\n },\n handler(context, args) {\n throw new ParseError(`$context.funcName} valid only within array environment`);\n }\n});\n\nconst environments = _environments;\n\n// Environment delimiters. HTML/MathML rendering is defined in the corresponding\n// defineEnvironment definitions.\ndefineFunction({\n type: \"environment\",\n names: [\"\\\\begin\", \"\\\\end\"],\n props: {\n numArgs: 1,\n argTypes: [\"text\"]\n },\n handler({ parser, funcName }, args) {\n const nameGroup = args[0];\n if (nameGroup.type !== \"ordgroup\") {\n throw new ParseError(\"Invalid environment name\", nameGroup);\n }\n let envName = \"\";\n for (let i = 0; i < nameGroup.body.length; ++i) {\n envName += assertNodeType(nameGroup.body[i], \"textord\").text;\n }\n\n if (funcName === \"\\\\begin\") {\n // begin...end is similar to left...right\n if (!Object.prototype.hasOwnProperty.call(environments, envName )) {\n throw new ParseError(\"No such environment: \" + envName, nameGroup);\n }\n // Build the environment object. Arguments and other information will\n // be made available to the begin and end methods using properties.\n const env = environments[envName];\n const { args, optArgs } = parser.parseArguments(\"\\\\begin{\" + envName + \"}\", env);\n const context = {\n mode: parser.mode,\n envName,\n parser\n };\n const result = env.handler(context, args, optArgs);\n parser.expect(\"\\\\end\", false);\n const endNameToken = parser.nextToken;\n const end = assertNodeType(parser.parseFunction(), \"environment\");\n if (end.name !== envName) {\n throw new ParseError(\n `Mismatch: \\\\begin{$envName}} matched by \\\\end{$end.name}}`,\n endNameToken\n );\n }\n return result;\n }\n\n return {\n type: \"environment\",\n mode: parser.mode,\n name: envName,\n nameGroup\n };\n }\n});\n\ndefineFunction({\n type: \"envTag\",\n names: [\"\\\\env@tag\"],\n props: {\n numArgs: 1,\n argTypes: [\"math\"]\n },\n handler({ parser }, args) {\n return {\n type: \"envTag\",\n mode: parser.mode,\n body: args[0]\n };\n },\n mathmlBuilder(group, style) {\n return new mathMLTree.MathNode(\"mrow\");\n }\n});\n\ndefineFunction({\n type: \"noTag\",\n names: [\"\\\\env@notag\"],\n props: {\n numArgs: 0\n },\n handler({ parser }) {\n return {\n type: \"noTag\",\n mode: parser.mode\n };\n },\n mathmlBuilder(group, style) {\n return new mathMLTree.MathNode(\"mrow\");\n }\n});\n\nconst isLongVariableName = (group, font) => {\n if (font !== \"mathrm\" || group.body.type !== \"ordgroup\" || group.body.body.length === 1) {\n return false\n }\n if (group.body.body[0].type !== \"mathord\") { return false }\n for (let i = 1; i < group.body.body.length; i++) {\n const parseNodeType = group.body.body[i].type;\n if (!(parseNodeType === \"mathord\" ||\n (parseNodeType === \"textord\" && !isNaN(group.body.body[i].text)))) {\n return false\n }\n }\n return true\n};\n\nconst mathmlBuilder$6 = (group, style) => {\n const font = group.font;\n const newStyle = style.withFont(font);\n const mathGroup = buildGroup$1(group.body, newStyle);\n\n if (mathGroup.children.length === 0) { return mathGroup } // empty group, e.g., \\mathrm{}\n if (font === \"boldsymbol\" && [\"mo\", \"mpadded\", \"mrow\"].includes(mathGroup.type)) {\n mathGroup.style.fontWeight = \"bold\";\n return mathGroup\n }\n // Check if it is possible to consolidate elements into a single <mi> element.\n if (isLongVariableName(group, font)) {\n // This is a \\mathrm{\u2026} group. It gets special treatment because symbolsOrd.js\n // wraps <mi> elements with <mrow>s to work around a Firefox bug.\n const mi = mathGroup.children[0].children[0];\n delete mi.attributes.mathvariant;\n for (let i = 1; i < mathGroup.children.length; i++) {\n mi.children[0].text += mathGroup.children[i].type === \"mn\"\n ? mathGroup.children[i].children[0].text\n : mathGroup.children[i].children[0].children[0].text;\n }\n // Wrap in a <mrow> to prevent the same Firefox bug.\n const bogus = new mathMLTree.MathNode(\"mtext\", new mathMLTree.TextNode(\"\\u200b\"));\n return new mathMLTree.MathNode(\"mrow\", [bogus, mi])\n }\n let canConsolidate = mathGroup.children[0].type === \"mo\";\n for (let i = 1; i < mathGroup.children.length; i++) {\n if (mathGroup.children[i].type === \"mo\" && font === \"boldsymbol\") {\n mathGroup.children[i].style.fontWeight = \"bold\";\n }\n if (mathGroup.children[i].type !== \"mi\") { canConsolidate = false; }\n const localVariant = mathGroup.children[i].attributes &&\n mathGroup.children[i].attributes.mathvariant || \"\";\n if (localVariant !== \"normal\") { canConsolidate = false; }\n }\n if (!canConsolidate) { return mathGroup }\n // Consolidate the <mi> elements.\n const mi = mathGroup.children[0];\n for (let i = 1; i < mathGroup.children.length; i++) {\n mi.children.push(mathGroup.children[i].children[0]);\n }\n if (mi.attributes.mathvariant && mi.attributes.mathvariant === \"normal\") {\n // Workaround for a Firefox bug that renders spurious space around\n // a <mi mathvariant=\"normal\">\n // Ref: https://bugs.webkit.org/show_bug.cgi?id=129097\n // We insert a text node that contains a zero-width space and wrap in an mrow.\n // TODO: Get rid of this <mi> workaround when the Firefox bug is fixed.\n const bogus = new mathMLTree.MathNode(\"mtext\", new mathMLTree.TextNode(\"\\u200b\"));\n return new mathMLTree.MathNode(\"mrow\", [bogus, mi])\n }\n return mi\n};\n\nconst fontAliases = {\n \"\\\\Bbb\": \"\\\\mathbb\",\n \"\\\\bold\": \"\\\\mathbf\",\n \"\\\\frak\": \"\\\\mathfrak\",\n \"\\\\bm\": \"\\\\boldsymbol\"\n};\n\ndefineFunction({\n type: \"font\",\n names: [\n // styles\n \"\\\\mathrm\",\n \"\\\\mathit\",\n \"\\\\mathbf\",\n \"\\\\mathnormal\",\n \"\\\\up@greek\",\n \"\\\\boldsymbol\",\n\n // families\n \"\\\\mathbb\",\n \"\\\\mathcal\",\n \"\\\\mathfrak\",\n \"\\\\mathscr\",\n \"\\\\mathsf\",\n \"\\\\mathsfit\",\n \"\\\\mathtt\",\n\n // aliases\n \"\\\\Bbb\",\n \"\\\\bm\",\n \"\\\\bold\",\n \"\\\\frak\"\n ],\n props: {\n numArgs: 1,\n allowedInArgument: true\n },\n handler: ({ parser, funcName }, args) => {\n const body = normalizeArgument(args[0]);\n let func = funcName;\n if (func in fontAliases) {\n func = fontAliases[func];\n }\n return {\n type: \"font\",\n mode: parser.mode,\n font: func.slice(1),\n body\n };\n },\n mathmlBuilder: mathmlBuilder$6\n});\n\n// Old font changing functions\ndefineFunction({\n type: \"font\",\n names: [\"\\\\rm\", \"\\\\sf\", \"\\\\tt\", \"\\\\bf\", \"\\\\it\", \"\\\\cal\"],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler: ({ parser, funcName, breakOnTokenText }, args) => {\n const { mode } = parser;\n const body = parser.parseExpression(true, breakOnTokenText, true);\n const fontStyle = `math$funcName.slice(1)}`;\n\n return {\n type: \"font\",\n mode: mode,\n font: fontStyle,\n body: {\n type: \"ordgroup\",\n mode: parser.mode,\n body\n }\n };\n },\n mathmlBuilder: mathmlBuilder$6\n});\n\nconst stylArray = [\"display\", \"text\", \"script\", \"scriptscript\"];\nconst scriptLevel = { auto: -1, display: 0, text: 0, script: 1, scriptscript: 2 };\n\nconst mathmlBuilder$5 = (group, style) => {\n // Track the scriptLevel of the numerator and denominator.\n // We may need that info for \\mathchoice or for adjusting em dimensions.\n const childOptions = group.scriptLevel === \"auto\"\n ? style.incrementLevel()\n : group.scriptLevel === \"display\"\n ? style.withLevel(StyleLevel.TEXT)\n : group.scriptLevel === \"text\"\n ? style.withLevel(StyleLevel.SCRIPT)\n : style.withLevel(StyleLevel.SCRIPTSCRIPT);\n\n // Chromium (wrongly) continues to shrink fractions beyond scriptscriptlevel.\n // So we check for levels that Chromium shrinks too small.\n // If necessary, set an explicit fraction depth.\n const numer = buildGroup$1(group.numer, childOptions);\n const denom = buildGroup$1(group.denom, childOptions);\n if (style.level === 3) {\n numer.style.mathDepth = \"2\";\n numer.setAttribute(\"scriptlevel\", \"2\");\n denom.style.mathDepth = \"2\";\n denom.setAttribute(\"scriptlevel\", \"2\");\n }\n\n let node = new mathMLTree.MathNode(\"mfrac\", [numer, denom]);\n\n if (!group.hasBarLine) {\n node.setAttribute(\"linethickness\", \"0px\");\n } else if (group.barSize) {\n const ruleWidth = calculateSize(group.barSize, style);\n node.setAttribute(\"linethickness\", ruleWidth.number + ruleWidth.unit);\n }\n\n if (group.leftDelim != null || group.rightDelim != null) {\n const withDelims = [];\n\n if (group.leftDelim != null) {\n const leftOp = new mathMLTree.MathNode(\"mo\", [\n new mathMLTree.TextNode(group.leftDelim.replace(\"\\\\\", \"\"))\n ]);\n leftOp.setAttribute(\"fence\", \"true\");\n withDelims.push(leftOp);\n }\n\n withDelims.push(node);\n\n if (group.rightDelim != null) {\n const rightOp = new mathMLTree.MathNode(\"mo\", [\n new mathMLTree.TextNode(group.rightDelim.replace(\"\\\\\", \"\"))\n ]);\n rightOp.setAttribute(\"fence\", \"true\");\n withDelims.push(rightOp);\n }\n\n node = makeRow(withDelims);\n }\n\n if (group.scriptLevel !== \"auto\") {\n node = new mathMLTree.MathNode(\"mstyle\", [node]);\n node.setAttribute(\"displaystyle\", String(group.scriptLevel === \"display\"));\n node.setAttribute(\"scriptlevel\", scriptLevel[group.scriptLevel]);\n }\n\n return node;\n};\n\ndefineFunction({\n type: \"genfrac\",\n names: [\n \"\\\\dfrac\",\n \"\\\\frac\",\n \"\\\\tfrac\",\n \"\\\\dbinom\",\n \"\\\\binom\",\n \"\\\\tbinom\",\n \"\\\\\\\\atopfrac\", // can\u2019t be entered directly\n \"\\\\\\\\bracefrac\",\n \"\\\\\\\\brackfrac\" // ditto\n ],\n props: {\n numArgs: 2,\n allowedInArgument: true\n },\n handler: ({ parser, funcName }, args) => {\n const numer = args[0];\n const denom = args[1];\n let hasBarLine = false;\n let leftDelim = null;\n let rightDelim = null;\n let scriptLevel = \"auto\";\n\n switch (funcName) {\n case \"\\\\dfrac\":\n case \"\\\\frac\":\n case \"\\\\tfrac\":\n hasBarLine = true;\n break;\n case \"\\\\\\\\atopfrac\":\n hasBarLine = false;\n break;\n case \"\\\\dbinom\":\n case \"\\\\binom\":\n case \"\\\\tbinom\":\n leftDelim = \"(\";\n rightDelim = \")\";\n break;\n case \"\\\\\\\\bracefrac\":\n leftDelim = \"\\\\{\";\n rightDelim = \"\\\\}\";\n break;\n case \"\\\\\\\\brackfrac\":\n leftDelim = \"[\";\n rightDelim = \"]\";\n break;\n default:\n throw new Error(\"Unrecognized genfrac command\");\n }\n\n switch (funcName) {\n case \"\\\\dfrac\":\n case \"\\\\dbinom\":\n scriptLevel = \"display\";\n break;\n case \"\\\\tfrac\":\n case \"\\\\tbinom\":\n scriptLevel = \"text\";\n break;\n }\n\n return {\n type: \"genfrac\",\n mode: parser.mode,\n continued: false,\n numer,\n denom,\n hasBarLine,\n leftDelim,\n rightDelim,\n scriptLevel,\n barSize: null\n };\n },\n mathmlBuilder: mathmlBuilder$5\n});\n\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\cfrac\"],\n props: {\n numArgs: 2\n },\n handler: ({ parser, funcName }, args) => {\n const numer = args[0];\n const denom = args[1];\n\n return {\n type: \"genfrac\",\n mode: parser.mode,\n continued: true,\n numer,\n denom,\n hasBarLine: true,\n leftDelim: null,\n rightDelim: null,\n scriptLevel: \"display\",\n barSize: null\n };\n }\n});\n\n// Infix generalized fractions -- these are not rendered directly, but replaced\n// immediately by one of the variants above.\ndefineFunction({\n type: \"infix\",\n names: [\"\\\\over\", \"\\\\choose\", \"\\\\atop\", \"\\\\brace\", \"\\\\brack\"],\n props: {\n numArgs: 0,\n infix: true\n },\n handler({ parser, funcName, token }) {\n let replaceWith;\n switch (funcName) {\n case \"\\\\over\":\n replaceWith = \"\\\\frac\";\n break;\n case \"\\\\choose\":\n replaceWith = \"\\\\binom\";\n break;\n case \"\\\\atop\":\n replaceWith = \"\\\\\\\\atopfrac\";\n break;\n case \"\\\\brace\":\n replaceWith = \"\\\\\\\\bracefrac\";\n break;\n case \"\\\\brack\":\n replaceWith = \"\\\\\\\\brackfrac\";\n break;\n default:\n throw new Error(\"Unrecognized infix genfrac command\");\n }\n return {\n type: \"infix\",\n mode: parser.mode,\n replaceWith,\n token\n };\n }\n});\n\nconst delimFromValue = function(delimString) {\n let delim = null;\n if (delimString.length > 0) {\n delim = delimString;\n delim = delim === \".\" ? null : delim;\n }\n return delim;\n};\n\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\genfrac\"],\n props: {\n numArgs: 6,\n allowedInArgument: true,\n argTypes: [\"math\", \"math\", \"size\", \"text\", \"math\", \"math\"]\n },\n handler({ parser }, args) {\n const numer = args[4];\n const denom = args[5];\n\n // Look into the parse nodes to get the desired delimiters.\n const leftNode = normalizeArgument(args[0]);\n const leftDelim = leftNode.type === \"atom\" && leftNode.family === \"open\"\n ? delimFromValue(leftNode.text)\n : null;\n const rightNode = normalizeArgument(args[1]);\n const rightDelim =\n rightNode.type === \"atom\" && rightNode.family === \"close\"\n ? delimFromValue(rightNode.text)\n : null;\n\n const barNode = assertNodeType(args[2], \"size\");\n let hasBarLine;\n let barSize = null;\n if (barNode.isBlank) {\n // \\genfrac acts differently than \\above.\n // \\genfrac treats an empty size group as a signal to use a\n // standard bar size. \\above would see size = 0 and omit the bar.\n hasBarLine = true;\n } else {\n barSize = barNode.value;\n hasBarLine = barSize.number > 0;\n }\n\n // Find out if we want displaystyle, textstyle, etc.\n let scriptLevel = \"auto\";\n let styl = args[3];\n if (styl.type === \"ordgroup\") {\n if (styl.body.length > 0) {\n const textOrd = assertNodeType(styl.body[0], \"textord\");\n scriptLevel = stylArray[Number(textOrd.text)];\n }\n } else {\n styl = assertNodeType(styl, \"textord\");\n scriptLevel = stylArray[Number(styl.text)];\n }\n\n return {\n type: \"genfrac\",\n mode: parser.mode,\n numer,\n denom,\n continued: false,\n hasBarLine,\n barSize,\n leftDelim,\n rightDelim,\n scriptLevel\n };\n },\n mathmlBuilder: mathmlBuilder$5\n});\n\n// \\above is an infix fraction that also defines a fraction bar size.\ndefineFunction({\n type: \"infix\",\n names: [\"\\\\above\"],\n props: {\n numArgs: 1,\n argTypes: [\"size\"],\n infix: true\n },\n handler({ parser, funcName, token }, args) {\n return {\n type: \"infix\",\n mode: parser.mode,\n replaceWith: \"\\\\\\\\abovefrac\",\n barSize: assertNodeType(args[0], \"size\").value,\n token\n };\n }\n});\n\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\\\\\abovefrac\"],\n props: {\n numArgs: 3,\n argTypes: [\"math\", \"size\", \"math\"]\n },\n handler: ({ parser, funcName }, args) => {\n const numer = args[0];\n const barSize = assert(assertNodeType(args[1], \"infix\").barSize);\n const denom = args[2];\n\n const hasBarLine = barSize.number > 0;\n return {\n type: \"genfrac\",\n mode: parser.mode,\n numer,\n denom,\n continued: false,\n hasBarLine,\n barSize,\n leftDelim: null,\n rightDelim: null,\n scriptLevel: \"auto\"\n };\n },\n\n mathmlBuilder: mathmlBuilder$5\n});\n\n// \\hbox is provided for compatibility with LaTeX functions that act on a box.\n// This function by itself doesn't do anything but set scriptlevel to \\textstyle\n// and prevent a soft line break.\n\ndefineFunction({\n type: \"hbox\",\n names: [\"\\\\hbox\"],\n props: {\n numArgs: 1,\n argTypes: [\"hbox\"],\n allowedInArgument: true,\n allowedInText: false\n },\n handler({ parser }, args) {\n return {\n type: \"hbox\",\n mode: parser.mode,\n body: ordargument(args[0])\n };\n },\n mathmlBuilder(group, style) {\n const newStyle = style.withLevel(StyleLevel.TEXT);\n const mrow = buildExpressionRow(group.body, newStyle);\n return consolidateText(mrow)\n }\n});\n\nconst mathmlBuilder$4 = (group, style) => {\n const accentNode = stretchy.mathMLnode(group.label);\n accentNode.style[\"math-depth\"] = 0;\n return new mathMLTree.MathNode(group.isOver ? \"mover\" : \"munder\", [\n buildGroup$1(group.base, style),\n accentNode\n ]);\n};\n\n// Horizontal stretchy braces\ndefineFunction({\n type: \"horizBrace\",\n names: [\"\\\\overbrace\", \"\\\\underbrace\"],\n props: {\n numArgs: 1\n },\n handler({ parser, funcName }, args) {\n return {\n type: \"horizBrace\",\n mode: parser.mode,\n label: funcName,\n isOver: /^\\\\over/.test(funcName),\n base: args[0]\n };\n },\n mathmlBuilder: mathmlBuilder$4\n});\n\ndefineFunction({\n type: \"href\",\n names: [\"\\\\href\"],\n props: {\n numArgs: 2,\n argTypes: [\"url\", \"original\"],\n allowedInText: true\n },\n handler: ({ parser, token }, args) => {\n const body = args[1];\n const href = assertNodeType(args[0], \"url\").url;\n\n if (\n !parser.settings.isTrusted({\n command: \"\\\\href\",\n url: href\n })\n ) {\n throw new ParseError(`Function \"\\\\href\" is not trusted`, token)\n }\n\n return {\n type: \"href\",\n mode: parser.mode,\n href,\n body: ordargument(body)\n };\n },\n mathmlBuilder: (group, style) => {\n const math = new MathNode(\"math\", [buildExpressionRow(group.body, style)]);\n const anchorNode = new AnchorNode(group.href, [], [math]);\n return anchorNode\n }\n});\n\ndefineFunction({\n type: \"href\",\n names: [\"\\\\url\"],\n props: {\n numArgs: 1,\n argTypes: [\"url\"],\n allowedInText: true\n },\n handler: ({ parser, token }, args) => {\n const href = assertNodeType(args[0], \"url\").url;\n\n if (\n !parser.settings.isTrusted({\n command: \"\\\\url\",\n url: href\n })\n ) {\n throw new ParseError(`Function \"\\\\url\" is not trusted`, token)\n }\n\n const chars = [];\n for (let i = 0; i < href.length; i++) {\n let c = href[i];\n if (c === \"~\") {\n c = \"\\\\textasciitilde\";\n }\n chars.push({\n type: \"textord\",\n mode: \"text\",\n text: c\n });\n }\n const body = {\n type: \"text\",\n mode: parser.mode,\n font: \"\\\\texttt\",\n body: chars\n };\n return {\n type: \"href\",\n mode: parser.mode,\n href,\n body: ordargument(body)\n };\n }\n});\n\ndefineFunction({\n type: \"html\",\n names: [\"\\\\class\", \"\\\\id\", \"\\\\style\", \"\\\\data\"],\n props: {\n numArgs: 2,\n argTypes: [\"raw\", \"original\"],\n allowedInText: true\n },\n handler: ({ parser, funcName, token }, args) => {\n const value = assertNodeType(args[0], \"raw\").string;\n const body = args[1];\n\n if (parser.settings.strict) {\n throw new ParseError(`Function \"$funcName}\" is disabled in strict mode`, token)\n }\n\n let trustContext;\n const attributes = {};\n\n switch (funcName) {\n case \"\\\\class\":\n attributes.class = value;\n trustContext = {\n command: \"\\\\class\",\n class: value\n };\n break;\n case \"\\\\id\":\n attributes.id = value;\n trustContext = {\n command: \"\\\\id\",\n id: value\n };\n break;\n case \"\\\\style\":\n attributes.style = value;\n trustContext = {\n command: \"\\\\style\",\n style: value\n };\n break;\n case \"\\\\data\": {\n const data = value.split(\",\");\n for (let i = 0; i < data.length; i++) {\n const keyVal = data[i].split(\"=\");\n if (keyVal.length !== 2) {\n throw new ParseError(\"Error parsing key-value for \\\\data\");\n }\n attributes[\"data-\" + keyVal[0].trim()] = keyVal[1].trim();\n }\n\n trustContext = {\n command: \"\\\\data\",\n attributes\n };\n break;\n }\n default:\n throw new Error(\"Unrecognized html command\");\n }\n\n if (!parser.settings.isTrusted(trustContext)) {\n throw new ParseError(`Function \"$funcName}\" is not trusted`, token)\n }\n return {\n type: \"html\",\n mode: parser.mode,\n attributes,\n body: ordargument(body)\n };\n },\n mathmlBuilder: (group, style) => {\n const element = buildExpressionRow(group.body, style);\n\n const classes = [];\n if (group.attributes.class) {\n classes.push(...group.attributes.class.trim().split(/\\s+/));\n }\n element.classes = classes;\n\n for (const attr in group.attributes) {\n if (attr !== \"class\" && Object.prototype.hasOwnProperty.call(group.attributes, attr)) {\n element.setAttribute(attr, group.attributes[attr]);\n }\n }\n\n return element;\n }\n});\n\nconst sizeData = function(str) {\n if (/^[-+]? *(\\d+(\\.\\d*)?|\\.\\d+)$/.test(str)) {\n // str is a number with no unit specified.\n // default unit is bp, per graphix package.\n return { number: +str, unit: \"bp\" }\n } else {\n const match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(str);\n if (!match) {\n throw new ParseError(\"Invalid size: '\" + str + \"' in \\\\includegraphics\");\n }\n const data = {\n number: +(match[1] + match[2]), // sign + magnitude, cast to number\n unit: match[3]\n };\n if (!validUnit(data)) {\n throw new ParseError(\"Invalid unit: '\" + data.unit + \"' in \\\\includegraphics.\");\n }\n return data\n }\n};\n\ndefineFunction({\n type: \"includegraphics\",\n names: [\"\\\\includegraphics\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1,\n argTypes: [\"raw\", \"url\"],\n allowedInText: false\n },\n handler: ({ parser, token }, args, optArgs) => {\n let width = { number: 0, unit: \"em\" };\n let height = { number: 0.9, unit: \"em\" }; // sorta character sized.\n let totalheight = { number: 0, unit: \"em\" };\n let alt = \"\";\n\n if (optArgs[0]) {\n const attributeStr = assertNodeType(optArgs[0], \"raw\").string;\n\n // Parser.js does not parse key/value pairs. We get a string.\n const attributes = attributeStr.split(\",\");\n for (let i = 0; i < attributes.length; i++) {\n const keyVal = attributes[i].split(\"=\");\n if (keyVal.length === 2) {\n const str = keyVal[1].trim();\n switch (keyVal[0].trim()) {\n case \"alt\":\n alt = str;\n break\n case \"width\":\n width = sizeData(str);\n break\n case \"height\":\n height = sizeData(str);\n break\n case \"totalheight\":\n totalheight = sizeData(str);\n break\n default:\n throw new ParseError(\"Invalid key: '\" + keyVal[0] + \"' in \\\\includegraphics.\")\n }\n }\n }\n }\n\n const src = assertNodeType(args[0], \"url\").url;\n\n if (alt === \"\") {\n // No alt given. Use the file name. Strip away the path.\n alt = src;\n alt = alt.replace(/^.*[\\\\/]/, \"\");\n alt = alt.substring(0, alt.lastIndexOf(\".\"));\n }\n\n if (\n !parser.settings.isTrusted({\n command: \"\\\\includegraphics\",\n url: src\n })\n ) {\n throw new ParseError(`Function \"\\\\includegraphics\" is not trusted`, token)\n }\n\n return {\n type: \"includegraphics\",\n mode: parser.mode,\n alt: alt,\n width: width,\n height: height,\n totalheight: totalheight,\n src: src\n }\n },\n mathmlBuilder: (group, style) => {\n const height = calculateSize(group.height, style);\n const depth = { number: 0, unit: \"em\" };\n\n if (group.totalheight.number > 0) {\n if (group.totalheight.unit === height.unit &&\n group.totalheight.number > height.number) {\n depth.number = group.totalheight.number - height.number;\n depth.unit = height.unit;\n }\n }\n\n let width = 0;\n if (group.width.number > 0) {\n width = calculateSize(group.width, style);\n }\n\n const graphicStyle = { height: height.number + depth.number + \"em\" };\n if (width.number > 0) {\n graphicStyle.width = width.number + width.unit;\n }\n if (depth.number > 0) {\n graphicStyle.verticalAlign = -depth.number + depth.unit;\n }\n\n const node = new Img(group.src, group.alt, graphicStyle);\n node.height = height;\n node.depth = depth;\n return new mathMLTree.MathNode(\"mtext\", [node])\n }\n});\n\n// Horizontal spacing commands\n\n\n// TODO: \\hskip and \\mskip should support plus and minus in lengths\n\ndefineFunction({\n type: \"kern\",\n names: [\"\\\\kern\", \"\\\\mkern\", \"\\\\hskip\", \"\\\\mskip\"],\n props: {\n numArgs: 1,\n argTypes: [\"size\"],\n primitive: true,\n allowedInText: true\n },\n handler({ parser, funcName, token }, args) {\n const size = assertNodeType(args[0], \"size\");\n if (parser.settings.strict) {\n const mathFunction = funcName[1] === \"m\"; // \\mkern, \\mskip\n const muUnit = size.value.unit === \"mu\";\n if (mathFunction) {\n if (!muUnit) {\n throw new ParseError(`LaTeX's $funcName} supports only mu units, ` +\n `not $size.value.unit} units`, token)\n }\n if (parser.mode !== \"math\") {\n throw new ParseError(`LaTeX's $funcName} works only in math mode`, token)\n }\n } else {\n // !mathFunction\n if (muUnit) {\n throw new ParseError(`LaTeX's $funcName} doesn't support mu units`, token)\n }\n }\n }\n return {\n type: \"kern\",\n mode: parser.mode,\n dimension: size.value\n };\n },\n mathmlBuilder(group, style) {\n const dimension = calculateSize(group.dimension, style);\n const ch = dimension.unit === \"em\" ? spaceCharacter(dimension.number) : \"\";\n if (group.mode === \"text\" && ch.length > 0) {\n const character = new mathMLTree.TextNode(ch);\n return new mathMLTree.MathNode(\"mtext\", [character]);\n } else {\n const node = new mathMLTree.MathNode(\"mspace\");\n node.setAttribute(\"width\", dimension.number + dimension.unit);\n if (dimension.number < 0) {\n node.style.marginLeft = dimension.number + dimension.unit;\n }\n return node;\n }\n }\n});\n\nconst spaceCharacter = function(width) {\n if (width >= 0.05555 && width <= 0.05556) {\n return \"\\u200a\"; //  \n } else if (width >= 0.1666 && width <= 0.1667) {\n return \"\\u2009\"; //  \n } else if (width >= 0.2222 && width <= 0.2223) {\n return \"\\u2005\"; //  \n } else if (width >= 0.2777 && width <= 0.2778) {\n return \"\\u2005\\u200a\"; //   \n } else {\n return \"\";\n }\n};\n\n// Limit valid characters to a small set, for safety.\nconst invalidIdRegEx = /[^A-Za-z_0-9-]/g;\n\ndefineFunction({\n type: \"label\",\n names: [\"\\\\label\"],\n props: {\n numArgs: 1,\n argTypes: [\"raw\"]\n },\n handler({ parser }, args) {\n return {\n type: \"label\",\n mode: parser.mode,\n string: args[0].string.replace(invalidIdRegEx, \"\")\n };\n },\n mathmlBuilder(group, style) {\n // Return a no-width, no-ink element with an HTML id.\n const node = new mathMLTree.MathNode(\"mrow\", [], [\"tml-label\"]);\n if (group.string.length > 0) {\n node.setLabel(group.string);\n }\n return node\n }\n});\n\n// Horizontal overlap functions\n\nconst textModeLap = [\"\\\\clap\", \"\\\\llap\", \"\\\\rlap\"];\n\ndefineFunction({\n type: \"lap\",\n names: [\"\\\\mathllap\", \"\\\\mathrlap\", \"\\\\mathclap\", \"\\\\clap\", \"\\\\llap\", \"\\\\rlap\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: ({ parser, funcName, token }, args) => {\n if (textModeLap.includes(funcName)) {\n if (parser.settings.strict && parser.mode !== \"text\") {\n throw new ParseError(`{$funcName}} can be used only in text mode.\n Try \\\\math$funcName.slice(1)}`, token)\n }\n funcName = funcName.slice(1);\n } else {\n funcName = funcName.slice(5);\n }\n const body = args[0];\n return {\n type: \"lap\",\n mode: parser.mode,\n alignment: funcName,\n body\n }\n },\n mathmlBuilder: (group, style) => {\n // mathllap, mathrlap, mathclap\n let strut;\n if (group.alignment === \"llap\") {\n // We need an invisible strut with the same depth as the group.\n // We can't just read the depth, so we use \\vphantom methods.\n const phantomInner = buildExpression(ordargument(group.body), style);\n const phantom = new mathMLTree.MathNode(\"mphantom\", phantomInner);\n strut = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n strut.setAttribute(\"width\", \"0px\");\n }\n\n const inner = buildGroup$1(group.body, style);\n let node;\n if (group.alignment === \"llap\") {\n inner.style.position = \"absolute\";\n inner.style.right = \"0\";\n inner.style.bottom = `0`; // If we could have read the ink depth, it would go here.\n node = new mathMLTree.MathNode(\"mpadded\", [strut, inner]);\n } else {\n node = new mathMLTree.MathNode(\"mpadded\", [inner]);\n }\n\n if (group.alignment === \"rlap\") {\n if (group.body.body.length > 0 && group.body.body[0].type === \"genfrac\") {\n // In Firefox, a <mpadded> squashes the 3/18em padding of a child \\frac. Put it back.\n node.setAttribute(\"lspace\", \"0.16667em\");\n }\n } else {\n const offset = group.alignment === \"llap\" ? \"-1\" : \"-0.5\";\n node.setAttribute(\"lspace\", offset + \"width\");\n if (group.alignment === \"llap\") {\n node.style.position = \"relative\";\n } else {\n node.style.display = \"flex\";\n node.style.justifyContent = \"center\";\n }\n }\n node.setAttribute(\"width\", \"0px\");\n return node\n }\n});\n\n// Switching from text mode back to math mode\ndefineFunction({\n type: \"ordgroup\",\n names: [\"\\\\(\", \"$\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n allowedInMath: false\n },\n handler({ funcName, parser }, args) {\n const outerMode = parser.mode;\n parser.switchMode(\"math\");\n const close = funcName === \"\\\\(\" ? \"\\\\)\" : \"$\";\n const body = parser.parseExpression(false, close);\n parser.expect(close);\n parser.switchMode(outerMode);\n return {\n type: \"ordgroup\",\n mode: parser.mode,\n body\n };\n }\n});\n\n// Check for extra closing math delimiters\ndefineFunction({\n type: \"text\", // Doesn't matter what this is.\n names: [\"\\\\)\", \"\\\\]\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n allowedInMath: false\n },\n handler(context, token) {\n throw new ParseError(`Mismatched $context.funcName}`, token);\n }\n});\n\nconst chooseStyle = (group, style) => {\n switch (style.level) {\n case StyleLevel.DISPLAY: // 0\n return group.display;\n case StyleLevel.TEXT: // 1\n return group.text;\n case StyleLevel.SCRIPT: // 2\n return group.script;\n case StyleLevel.SCRIPTSCRIPT: // 3\n return group.scriptscript;\n default:\n return group.text;\n }\n};\n\ndefineFunction({\n type: \"mathchoice\",\n names: [\"\\\\mathchoice\"],\n props: {\n numArgs: 4,\n primitive: true\n },\n handler: ({ parser }, args) => {\n return {\n type: \"mathchoice\",\n mode: parser.mode,\n display: ordargument(args[0]),\n text: ordargument(args[1]),\n script: ordargument(args[2]),\n scriptscript: ordargument(args[3])\n };\n },\n mathmlBuilder: (group, style) => {\n const body = chooseStyle(group, style);\n return buildExpressionRow(body, style);\n }\n});\n\nconst textAtomTypes = [\"text\", \"textord\", \"mathord\", \"atom\"];\n\nconst padding = width => {\n const node = new mathMLTree.MathNode(\"mspace\");\n node.setAttribute(\"width\", width + \"em\");\n return node\n};\n\nfunction mathmlBuilder$3(group, style) {\n let node;\n const inner = buildExpression(group.body, style);\n\n if (group.mclass === \"minner\") {\n node = new mathMLTree.MathNode(\"mpadded\", inner);\n } else if (group.mclass === \"mord\") {\n if (group.isCharacterBox || inner[0].type === \"mathord\") {\n node = inner[0];\n node.type = \"mi\";\n if (node.children.length === 1 && node.children[0].text && node.children[0].text === \"\u2207\") {\n node.setAttribute(\"mathvariant\", \"normal\");\n }\n } else {\n node = new mathMLTree.MathNode(\"mi\", inner);\n }\n } else {\n node = new mathMLTree.MathNode(\"mrow\", inner);\n if (group.mustPromote) {\n node = inner[0];\n node.type = \"mo\";\n if (group.isCharacterBox && group.body[0].text && /[A-Za-z]/.test(group.body[0].text)) {\n node.setAttribute(\"mathvariant\", \"italic\");\n }\n } else {\n node = new mathMLTree.MathNode(\"mrow\", inner);\n }\n\n // Set spacing based on what is the most likely adjacent atom type.\n // See TeXbook p170.\n const doSpacing = style.level < 2; // Operator spacing is zero inside a (sub|super)script.\n if (node.type === \"mrow\") {\n if (doSpacing ) {\n if (group.mclass === \"mbin\") {\n // medium space\n node.children.unshift(padding(0.2222));\n node.children.push(padding(0.2222));\n } else if (group.mclass === \"mrel\") {\n // thickspace\n node.children.unshift(padding(0.2778));\n node.children.push(padding(0.2778));\n } else if (group.mclass === \"mpunct\") {\n node.children.push(padding(0.1667));\n } else if (group.mclass === \"minner\") {\n node.children.unshift(padding(0.0556)); // 1 mu is the most likely option\n node.children.push(padding(0.0556));\n }\n }\n } else {\n if (group.mclass === \"mbin\") {\n // medium space\n node.attributes.lspace = (doSpacing ? \"0.2222em\" : \"0\");\n node.attributes.rspace = (doSpacing ? \"0.2222em\" : \"0\");\n } else if (group.mclass === \"mrel\") {\n // thickspace\n node.attributes.lspace = (doSpacing ? \"0.2778em\" : \"0\");\n node.attributes.rspace = (doSpacing ? \"0.2778em\" : \"0\");\n } else if (group.mclass === \"mpunct\") {\n node.attributes.lspace = \"0em\";\n node.attributes.rspace = (doSpacing ? \"0.1667em\" : \"0\");\n } else if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n node.attributes.lspace = \"0em\";\n node.attributes.rspace = \"0em\";\n } else if (group.mclass === \"minner\" && doSpacing) {\n node.attributes.lspace = \"0.0556em\"; // 1 mu is the most likely option\n node.attributes.width = \"+0.1111em\";\n }\n }\n\n if (!(group.mclass === \"mopen\" || group.mclass === \"mclose\")) {\n delete node.attributes.stretchy;\n delete node.attributes.form;\n }\n }\n return node;\n}\n\n// Math class commands except \\mathop\ndefineFunction({\n type: \"mclass\",\n names: [\n \"\\\\mathord\",\n \"\\\\mathbin\",\n \"\\\\mathrel\",\n \"\\\\mathopen\",\n \"\\\\mathclose\",\n \"\\\\mathpunct\",\n \"\\\\mathinner\"\n ],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler({ parser, funcName }, args) {\n const body = args[0];\n const isCharacterBox = utils.isCharacterBox(body);\n // We should not wrap a <mo> around a <mi> or <mord>. That would be invalid MathML.\n // In that case, we instead promote the text contents of the body to the parent.\n let mustPromote = true;\n const mord = { type: \"mathord\", text: \"\", mode: parser.mode };\n const arr = (body.body) ? body.body : [body];\n for (const arg of arr) {\n if (textAtomTypes.includes(arg.type)) {\n if (symbols[parser.mode][arg.text]) {\n mord.text += symbols[parser.mode][arg.text].replace;\n } else if (arg.text) {\n mord.text += arg.text;\n } else if (arg.body) {\n arg.body.map(e => { mord.text += e.text; });\n }\n } else {\n mustPromote = false;\n break\n }\n }\n return {\n type: \"mclass\",\n mode: parser.mode,\n mclass: \"m\" + funcName.slice(5),\n body: ordargument(mustPromote ? mord : body),\n isCharacterBox,\n mustPromote\n };\n },\n mathmlBuilder: mathmlBuilder$3\n});\n\nconst binrelClass = (arg) => {\n // \\binrel@ spacing varies with (bin|rel|ord) of the atom in the argument.\n // (by rendering separately and with {}s before and after, and measuring\n // the change in spacing). We'll do roughly the same by detecting the\n // atom type directly.\n const atom = arg.type === \"ordgroup\" && arg.body.length ? arg.body[0] : arg;\n if (atom.type === \"atom\" && (atom.family === \"bin\" || atom.family === \"rel\")) {\n return \"m\" + atom.family;\n } else {\n return \"mord\";\n }\n};\n\n// \\@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord.\n// This is equivalent to \\binrel@{x}\\binrel@@{y} in AMSTeX.\ndefineFunction({\n type: \"mclass\",\n names: [\"\\\\@binrel\"],\n props: {\n numArgs: 2\n },\n handler({ parser }, args) {\n return {\n type: \"mclass\",\n mode: parser.mode,\n mclass: binrelClass(args[0]),\n body: ordargument(args[1]),\n isCharacterBox: utils.isCharacterBox(args[1])\n };\n }\n});\n\n// Build a relation or stacked op by placing one symbol on top of another\ndefineFunction({\n type: \"mclass\",\n names: [\"\\\\stackrel\", \"\\\\overset\", \"\\\\underset\"],\n props: {\n numArgs: 2\n },\n handler({ parser, funcName }, args) {\n const baseArg = args[1];\n const shiftedArg = args[0];\n\n const baseOp = {\n type: \"op\",\n mode: baseArg.mode,\n limits: true,\n alwaysHandleSupSub: true,\n parentIsSupSub: false,\n symbol: false,\n stack: true,\n suppressBaseShift: funcName !== \"\\\\stackrel\",\n body: ordargument(baseArg)\n };\n\n return {\n type: \"supsub\",\n mode: shiftedArg.mode,\n base: baseOp,\n sup: funcName === \"\\\\underset\" ? null : shiftedArg,\n sub: funcName === \"\\\\underset\" ? shiftedArg : null\n };\n },\n mathmlBuilder: mathmlBuilder$3\n});\n\n// Helper function\nconst buildGroup = (el, style, noneNode) => {\n if (!el) { return noneNode }\n const node = buildGroup$1(el, style);\n if (node.type === \"mrow\" && node.children.length === 0) { return noneNode }\n return node\n};\n\ndefineFunction({\n type: \"multiscript\",\n names: [\"\\\\sideset\", \"\\\\pres@cript\"], // See macros.js for \\prescript\n props: {\n numArgs: 3\n },\n handler({ parser, funcName, token }, args) {\n if (args[2].body.length === 0) {\n throw new ParseError(funcName + `cannot parse an empty base.`)\n }\n const base = args[2].body[0];\n if (parser.settings.strict && funcName === \"\\\\sideset\" && !base.symbol) {\n throw new ParseError(`The base of \\\\sideset must be a big operator. Try \\\\prescript.`)\n }\n\n if ((args[0].body.length > 0 && args[0].body[0].type !== \"supsub\") ||\n (args[1].body.length > 0 && args[1].body[0].type !== \"supsub\")) {\n throw new ParseError(\"\\\\sideset can parse only subscripts and \" +\n \"superscripts in its first two arguments\", token)\n }\n\n // The prescripts and postscripts come wrapped in a supsub.\n const prescripts = args[0].body.length > 0 ? args[0].body[0] : null;\n const postscripts = args[1].body.length > 0 ? args[1].body[0] : null;\n\n if (!prescripts && !postscripts) {\n return base\n } else if (!prescripts) {\n // It's not a multi-script. Get a \\textstyle supsub.\n return {\n type: \"styling\",\n mode: parser.mode,\n scriptLevel: \"text\",\n body: [{\n type: \"supsub\",\n mode: parser.mode,\n base,\n sup: postscripts.sup,\n sub: postscripts.sub\n }]\n }\n } else {\n return {\n type: \"multiscript\",\n mode: parser.mode,\n isSideset: funcName === \"\\\\sideset\",\n prescripts,\n postscripts,\n base\n }\n }\n },\n mathmlBuilder(group, style) {\n const base = buildGroup$1(group.base, style);\n\n const prescriptsNode = new mathMLTree.MathNode(\"mprescripts\");\n const noneNode = new mathMLTree.MathNode(\"none\");\n let children = [];\n\n const preSub = buildGroup(group.prescripts.sub, style, noneNode);\n const preSup = buildGroup(group.prescripts.sup, style, noneNode);\n if (group.isSideset) {\n // This seems silly, but LaTeX does this. Firefox ignores it, which does not make me sad.\n preSub.setAttribute(\"style\", \"text-align: left;\");\n preSup.setAttribute(\"style\", \"text-align: left;\");\n }\n\n if (group.postscripts) {\n const postSub = buildGroup(group.postscripts.sub, style, noneNode);\n const postSup = buildGroup(group.postscripts.sup, style, noneNode);\n children = [base, postSub, postSup, prescriptsNode, preSub, preSup];\n } else {\n children = [base, prescriptsNode, preSub, preSup];\n }\n\n return new mathMLTree.MathNode(\"mmultiscripts\", children);\n }\n});\n\ndefineFunction({\n type: \"not\",\n names: [\"\\\\not\"],\n props: {\n numArgs: 1,\n primitive: true,\n allowedInText: false\n },\n handler({ parser }, args) {\n const isCharacterBox = utils.isCharacterBox(args[0]);\n let body;\n if (isCharacterBox) {\n body = ordargument(args[0]);\n if (body[0].text.charAt(0) === \"\\\\\") {\n body[0].text = symbols.math[body[0].text].replace;\n }\n // \\u0338 is the Unicode Combining Long Solidus Overlay\n body[0].text = body[0].text.slice(0, 1) + \"\\u0338\" + body[0].text.slice(1);\n } else {\n // When the argument is not a character box, TeX does an awkward, poorly placed overlay.\n // We'll do the same.\n const notNode = { type: \"textord\", mode: \"math\", text: \"\\u0338\" };\n const kernNode = { type: \"kern\", mode: \"math\", dimension: { number: -0.6, unit: \"em\" } };\n body = [notNode, kernNode, args[0]];\n }\n return {\n type: \"not\",\n mode: parser.mode,\n body,\n isCharacterBox\n };\n },\n mathmlBuilder(group, style) {\n if (group.isCharacterBox) {\n const inner = buildExpression(group.body, style, true);\n return inner[0]\n } else {\n return buildExpressionRow(group.body, style)\n }\n }\n});\n\n// Limits, symbols\n\n// Some helpers\n\nconst ordAtomTypes = [\"textord\", \"mathord\", \"atom\"];\n\n// Most operators have a large successor symbol, but these don't.\nconst noSuccessor = [\"\\\\smallint\"];\n\n// Math operators (e.g. \\sin) need a space between these types and themselves:\nconst ordTypes = [\"textord\", \"mathord\", \"ordgroup\", \"close\", \"leftright\", \"font\"];\n\n// NOTE: Unlike most `builders`s, this one handles not only \"op\", but also\n// \"supsub\" since some of them (like \\int) can affect super/subscripting.\n\nconst setSpacing = node => {\n // The user wrote a \\mathop{\u2026} function. Change spacing from default to OP spacing.\n // The most likely spacing for an OP is a thin space per TeXbook p170.\n node.attributes.lspace = \"0.1667em\";\n node.attributes.rspace = \"0.1667em\";\n};\n\nconst mathmlBuilder$2 = (group, style) => {\n let node;\n\n if (group.symbol) {\n // This is a symbol. Just add the symbol.\n node = new MathNode(\"mo\", [makeText(group.name, group.mode)]);\n if (noSuccessor.includes(group.name)) {\n node.setAttribute(\"largeop\", \"false\");\n } else {\n node.setAttribute(\"movablelimits\", \"false\");\n }\n if (group.fromMathOp) { setSpacing(node); }\n } else if (group.body) {\n // This is an operator with children. Add them.\n node = new MathNode(\"mo\", buildExpression(group.body, style));\n if (group.fromMathOp) { setSpacing(node); }\n } else {\n // This is a text operator. Add all of the characters from the operator's name.\n node = new MathNode(\"mi\", [new TextNode(group.name.slice(1))]);\n\n if (!group.parentIsSupSub) {\n // Append an invisible <mo>⁡</mo>.\n // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n const operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n const row = [node, operator];\n // Set spacing\n if (group.needsLeadingSpace) {\n const lead = new MathNode(\"mspace\");\n lead.setAttribute(\"width\", \"0.1667em\"); // thin space.\n row.unshift(lead);\n }\n if (!group.isFollowedByDelimiter) {\n const trail = new MathNode(\"mspace\");\n trail.setAttribute(\"width\", \"0.1667em\"); // thin space.\n row.push(trail);\n }\n node = new MathNode(\"mrow\", row);\n }\n }\n\n return node;\n};\n\nconst singleCharBigOps = {\n \"\\u220F\": \"\\\\prod\",\n \"\\u2210\": \"\\\\coprod\",\n \"\\u2211\": \"\\\\sum\",\n \"\\u22c0\": \"\\\\bigwedge\",\n \"\\u22c1\": \"\\\\bigvee\",\n \"\\u22c2\": \"\\\\bigcap\",\n \"\\u22c3\": \"\\\\bigcup\",\n \"\\u2a00\": \"\\\\bigodot\",\n \"\\u2a01\": \"\\\\bigoplus\",\n \"\\u2a02\": \"\\\\bigotimes\",\n \"\\u2a04\": \"\\\\biguplus\",\n \"\\u2a05\": \"\\\\bigsqcap\",\n \"\\u2a06\": \"\\\\bigsqcup\",\n \"\\u2a03\": \"\\\\bigcupdot\",\n \"\\u2a07\": \"\\\\bigdoublevee\",\n \"\\u2a08\": \"\\\\bigdoublewedge\",\n \"\\u2a09\": \"\\\\bigtimes\"\n};\n\ndefineFunction({\n type: \"op\",\n names: [\n \"\\\\coprod\",\n \"\\\\bigvee\",\n \"\\\\bigwedge\",\n \"\\\\biguplus\",\n \"\\\\bigcupplus\",\n \"\\\\bigcupdot\",\n \"\\\\bigcap\",\n \"\\\\bigcup\",\n \"\\\\bigdoublevee\",\n \"\\\\bigdoublewedge\",\n \"\\\\intop\",\n \"\\\\prod\",\n \"\\\\sum\",\n \"\\\\bigotimes\",\n \"\\\\bigoplus\",\n \"\\\\bigodot\",\n \"\\\\bigsqcap\",\n \"\\\\bigsqcup\",\n \"\\\\bigtimes\",\n \"\\\\smallint\",\n \"\\u220F\",\n \"\\u2210\",\n \"\\u2211\",\n \"\\u22c0\",\n \"\\u22c1\",\n \"\\u22c2\",\n \"\\u22c3\",\n \"\\u2a00\",\n \"\\u2a01\",\n \"\\u2a02\",\n \"\\u2a04\",\n \"\\u2a06\"\n ],\n props: {\n numArgs: 0\n },\n handler: ({ parser, funcName }, args) => {\n let fName = funcName;\n if (fName.length === 1) {\n fName = singleCharBigOps[fName];\n }\n return {\n type: \"op\",\n mode: parser.mode,\n limits: true,\n parentIsSupSub: false,\n symbol: true,\n stack: false, // This is true for \\stackrel{}, not here.\n name: fName\n };\n },\n mathmlBuilder: mathmlBuilder$2\n});\n\n// Note: calling defineFunction with a type that's already been defined only\n// works because the same mathmlBuilder is being used.\ndefineFunction({\n type: \"op\",\n names: [\"\\\\mathop\"],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler: ({ parser }, args) => {\n const body = args[0];\n // It would be convienient to just wrap a <mo> around the argument.\n // But if the argument is a <mi> or <mord>, that would be invalid MathML.\n // In that case, we instead promote the text contents of the body to the parent.\n const arr = (body.body) ? body.body : [body];\n const isSymbol = arr.length === 1 && ordAtomTypes.includes(arr[0].type);\n return {\n type: \"op\",\n mode: parser.mode,\n limits: true,\n parentIsSupSub: false,\n symbol: isSymbol,\n fromMathOp: true,\n stack: false,\n name: isSymbol ? arr[0].text : null,\n body: isSymbol ? null : ordargument(body)\n };\n },\n mathmlBuilder: mathmlBuilder$2\n});\n\n// There are 2 flags for operators; whether they produce limits in\n// displaystyle, and whether they are symbols and should grow in\n// displaystyle. These four groups cover the four possible choices.\n\nconst singleCharIntegrals = {\n \"\\u222b\": \"\\\\int\",\n \"\\u222c\": \"\\\\iint\",\n \"\\u222d\": \"\\\\iiint\",\n \"\\u222e\": \"\\\\oint\",\n \"\\u222f\": \"\\\\oiint\",\n \"\\u2230\": \"\\\\oiiint\",\n \"\\u2231\": \"\\\\intclockwise\",\n \"\\u2232\": \"\\\\varointclockwise\",\n \"\\u2a0c\": \"\\\\iiiint\",\n \"\\u2a0d\": \"\\\\intbar\",\n \"\\u2a0e\": \"\\\\intBar\",\n \"\\u2a0f\": \"\\\\fint\",\n \"\\u2a12\": \"\\\\rppolint\",\n \"\\u2a13\": \"\\\\scpolint\",\n \"\\u2a15\": \"\\\\pointint\",\n \"\\u2a16\": \"\\\\sqint\",\n \"\\u2a17\": \"\\\\intlarhk\",\n \"\\u2a18\": \"\\\\intx\",\n \"\\u2a19\": \"\\\\intcap\",\n \"\\u2a1a\": \"\\\\intcup\"\n};\n\n// No limits, not symbols\ndefineFunction({\n type: \"op\",\n names: [\n \"\\\\arcsin\",\n \"\\\\arccos\",\n \"\\\\arctan\",\n \"\\\\arctg\",\n \"\\\\arcctg\",\n \"\\\\arg\",\n \"\\\\ch\",\n \"\\\\cos\",\n \"\\\\cosec\",\n \"\\\\cosh\",\n \"\\\\cot\",\n \"\\\\cotg\",\n \"\\\\coth\",\n \"\\\\csc\",\n \"\\\\ctg\",\n \"\\\\cth\",\n \"\\\\deg\",\n \"\\\\dim\",\n \"\\\\exp\",\n \"\\\\hom\",\n \"\\\\ker\",\n \"\\\\lg\",\n \"\\\\ln\",\n \"\\\\log\",\n \"\\\\sec\",\n \"\\\\sin\",\n \"\\\\sinh\",\n \"\\\\sh\",\n \"\\\\sgn\",\n \"\\\\tan\",\n \"\\\\tanh\",\n \"\\\\tg\",\n \"\\\\th\"\n ],\n props: {\n numArgs: 0\n },\n handler({ parser, funcName }) {\n const prevAtomType = parser.prevAtomType;\n const next = parser.gullet.future().text;\n return {\n type: \"op\",\n mode: parser.mode,\n limits: false,\n parentIsSupSub: false,\n symbol: false,\n stack: false,\n isFollowedByDelimiter: isDelimiter(next),\n needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType),\n name: funcName\n };\n },\n mathmlBuilder: mathmlBuilder$2\n});\n\n// Limits, not symbols\ndefineFunction({\n type: \"op\",\n names: [\"\\\\det\", \"\\\\gcd\", \"\\\\inf\", \"\\\\lim\", \"\\\\max\", \"\\\\min\", \"\\\\Pr\", \"\\\\sup\"],\n props: {\n numArgs: 0\n },\n handler({ parser, funcName }) {\n const prevAtomType = parser.prevAtomType;\n const next = parser.gullet.future().text;\n return {\n type: \"op\",\n mode: parser.mode,\n limits: true,\n parentIsSupSub: false,\n symbol: false,\n stack: false,\n isFollowedByDelimiter: isDelimiter(next),\n needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType),\n name: funcName\n };\n },\n mathmlBuilder: mathmlBuilder$2\n});\n\n// No limits, symbols\ndefineFunction({\n type: \"op\",\n names: [\n \"\\\\int\",\n \"\\\\iint\",\n \"\\\\iiint\",\n \"\\\\iiiint\",\n \"\\\\oint\",\n \"\\\\oiint\",\n \"\\\\oiiint\",\n \"\\\\intclockwise\",\n \"\\\\varointclockwise\",\n \"\\\\intbar\",\n \"\\\\intBar\",\n \"\\\\fint\",\n \"\\\\rppolint\",\n \"\\\\scpolint\",\n \"\\\\pointint\",\n \"\\\\sqint\",\n \"\\\\intlarhk\",\n \"\\\\intx\",\n \"\\\\intcap\",\n \"\\\\intcup\",\n \"\\u222b\",\n \"\\u222c\",\n \"\\u222d\",\n \"\\u222e\",\n \"\\u222f\",\n \"\\u2230\",\n \"\\u2231\",\n \"\\u2232\",\n \"\\u2a0c\",\n \"\\u2a0d\",\n \"\\u2a0e\",\n \"\\u2a0f\",\n \"\\u2a12\",\n \"\\u2a13\",\n \"\\u2a15\",\n \"\\u2a16\",\n \"\\u2a17\",\n \"\\u2a18\",\n \"\\u2a19\",\n \"\\u2a1a\"\n ],\n props: {\n numArgs: 0\n },\n handler({ parser, funcName }) {\n let fName = funcName;\n if (fName.length === 1) {\n fName = singleCharIntegrals[fName];\n }\n return {\n type: \"op\",\n mode: parser.mode,\n limits: false,\n parentIsSupSub: false,\n symbol: true,\n stack: false,\n name: fName\n };\n },\n mathmlBuilder: mathmlBuilder$2\n});\n\n// NOTE: Unlike most builders, this one handles not only\n// \"operatorname\", but also \"supsub\" since \\operatorname* can\n// affect super/subscripting.\n\nconst mathmlBuilder$1 = (group, style) => {\n let expression = buildExpression(group.body, style.withFont(\"mathrm\"));\n\n // Is expression a string or has it something like a fraction?\n let isAllString = true; // default\n for (let i = 0; i < expression.length; i++) {\n let node = expression[i];\n if (node instanceof mathMLTree.MathNode) {\n if (node.type === \"mrow\" && node.children.length === 1 &&\n node.children[0] instanceof mathMLTree.MathNode) {\n node = node.children[0];\n }\n switch (node.type) {\n case \"mi\":\n case \"mn\":\n case \"ms\":\n case \"mtext\":\n break; // Do nothing yet.\n case \"mspace\":\n {\n if (node.attributes.width) {\n const width = node.attributes.width.replace(\"em\", \"\");\n const ch = spaceCharacter(Number(width));\n if (ch === \"\") {\n isAllString = false;\n } else {\n expression[i] = new mathMLTree.MathNode(\"mtext\", [new mathMLTree.TextNode(ch)]);\n }\n }\n }\n break\n case \"mo\": {\n const child = node.children[0];\n if (node.children.length === 1 && child instanceof mathMLTree.TextNode) {\n child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n } else {\n isAllString = false;\n }\n break\n }\n default:\n isAllString = false;\n }\n } else {\n isAllString = false;\n }\n }\n\n if (isAllString) {\n // Write a single TextNode instead of multiple nested tags.\n const word = expression.map((node) => node.toText()).join(\"\");\n expression = [new mathMLTree.TextNode(word)];\n } else if (\n expression.length === 1\n && [\"mover\", \"munder\"].includes(expression[0].type) &&\n (expression[0].children[0].type === \"mi\" || expression[0].children[0].type === \"mtext\")\n ) {\n expression[0].children[0].type = \"mi\";\n if (group.parentIsSupSub) {\n return new mathMLTree.MathNode(\"mrow\", expression)\n } else {\n const operator = new mathMLTree.MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n return mathMLTree.newDocumentFragment([expression[0], operator])\n }\n }\n\n let wrapper;\n if (isAllString) {\n wrapper = new mathMLTree.MathNode(\"mi\", expression);\n if (expression[0].text.length === 1) {\n wrapper.setAttribute(\"mathvariant\", \"normal\");\n }\n } else {\n wrapper = new mathMLTree.MathNode(\"mrow\", expression);\n }\n\n if (!group.parentIsSupSub) {\n // Append an <mo>⁡</mo>.\n // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n const operator = new mathMLTree.MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n const fragment = [wrapper, operator];\n if (group.needsLeadingSpace) {\n // LaTeX gives operator spacing, but a <mi> gets ord spacing.\n // So add a leading space.\n const space = new mathMLTree.MathNode(\"mspace\");\n space.setAttribute(\"width\", \"0.1667em\"); // thin space.\n fragment.unshift(space);\n }\n if (!group.isFollowedByDelimiter) {\n const trail = new mathMLTree.MathNode(\"mspace\");\n trail.setAttribute(\"width\", \"0.1667em\"); // thin space.\n fragment.push(trail);\n }\n return mathMLTree.newDocumentFragment(fragment)\n }\n\n return wrapper\n};\n\n// \\operatorname\n// amsopn.dtx: \\mathop{#1\\kern\\z@\\operator@font#3}\\newmcodes@\ndefineFunction({\n type: \"operatorname\",\n names: [\"\\\\operatorname@\", \"\\\\operatornamewithlimits\"],\n props: {\n numArgs: 1,\n allowedInArgument: true\n },\n handler: ({ parser, funcName }, args) => {\n const body = args[0];\n const prevAtomType = parser.prevAtomType;\n const next = parser.gullet.future().text;\n return {\n type: \"operatorname\",\n mode: parser.mode,\n body: ordargument(body),\n alwaysHandleSupSub: (funcName === \"\\\\operatornamewithlimits\"),\n limits: false,\n parentIsSupSub: false,\n isFollowedByDelimiter: isDelimiter(next),\n needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType)\n };\n },\n mathmlBuilder: mathmlBuilder$1\n});\n\ndefineMacro(\"\\\\operatorname\",\n \"\\\\@ifstar\\\\operatornamewithlimits\\\\operatorname@\");\n\ndefineFunctionBuilders({\n type: \"ordgroup\",\n mathmlBuilder(group, style) {\n return buildExpressionRow(group.body, style, group.semisimple);\n }\n});\n\ndefineFunction({\n type: \"phantom\",\n names: [\"\\\\phantom\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: ({ parser }, args) => {\n const body = args[0];\n return {\n type: \"phantom\",\n mode: parser.mode,\n body: ordargument(body)\n };\n },\n mathmlBuilder: (group, style) => {\n const inner = buildExpression(group.body, style);\n return new mathMLTree.MathNode(\"mphantom\", inner);\n }\n});\n\ndefineFunction({\n type: \"hphantom\",\n names: [\"\\\\hphantom\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: ({ parser }, args) => {\n const body = args[0];\n return {\n type: \"hphantom\",\n mode: parser.mode,\n body\n };\n },\n mathmlBuilder: (group, style) => {\n const inner = buildExpression(ordargument(group.body), style);\n const phantom = new mathMLTree.MathNode(\"mphantom\", inner);\n const node = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n node.setAttribute(\"height\", \"0px\");\n node.setAttribute(\"depth\", \"0px\");\n return node;\n }\n});\n\ndefineFunction({\n type: \"vphantom\",\n names: [\"\\\\vphantom\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: ({ parser }, args) => {\n const body = args[0];\n return {\n type: \"vphantom\",\n mode: parser.mode,\n body\n };\n },\n mathmlBuilder: (group, style) => {\n const inner = buildExpression(ordargument(group.body), style);\n const phantom = new mathMLTree.MathNode(\"mphantom\", inner);\n const node = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n node.setAttribute(\"width\", \"0px\");\n return node;\n }\n});\n\n// In LaTeX, \\pmb is a simulation of bold font.\n// The version of \\pmb in ambsy.sty works by typesetting three copies of the argument\n// with small offsets. We use CSS font-weight:bold.\n\ndefineFunction({\n type: \"pmb\",\n names: [\"\\\\pmb\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler({ parser }, args) {\n return {\n type: \"pmb\",\n mode: parser.mode,\n body: ordargument(args[0])\n }\n },\n mathmlBuilder(group, style) {\n const inner = buildExpression(group.body, style);\n // Wrap with an <mstyle> element.\n const node = wrapWithMstyle(inner);\n node.setAttribute(\"style\", \"font-weight:bold\");\n return node\n }\n});\n\n// \\raise, \\lower, and \\raisebox\n\nconst mathmlBuilder = (group, style) => {\n const newStyle = style.withLevel(StyleLevel.TEXT);\n const node = new mathMLTree.MathNode(\"mpadded\", [buildGroup$1(group.body, newStyle)]);\n const dy = calculateSize(group.dy, style);\n node.setAttribute(\"voffset\", dy.number + dy.unit);\n // Add padding, which acts to increase height in Chromium.\n // TODO: Figure out some way to change height in Firefox w/o breaking Chromium.\n if (dy.number > 0) {\n node.style.padding = dy.number + dy.unit + \" 0 0 0\";\n } else {\n node.style.padding = \"0 0 \" + Math.abs(dy.number) + dy.unit + \" 0\";\n }\n return node\n};\n\ndefineFunction({\n type: \"raise\",\n names: [\"\\\\raise\", \"\\\\lower\"],\n props: {\n numArgs: 2,\n argTypes: [\"size\", \"primitive\"],\n primitive: true\n },\n handler({ parser, funcName }, args) {\n const amount = assertNodeType(args[0], \"size\").value;\n if (funcName === \"\\\\lower\") { amount.number *= -1; }\n const body = args[1];\n return {\n type: \"raise\",\n mode: parser.mode,\n dy: amount,\n body\n };\n },\n mathmlBuilder\n});\n\n\ndefineFunction({\n type: \"raise\",\n names: [\"\\\\raisebox\"],\n props: {\n numArgs: 2,\n argTypes: [\"size\", \"hbox\"],\n allowedInText: true\n },\n handler({ parser, funcName }, args) {\n const amount = assertNodeType(args[0], \"size\").value;\n const body = args[1];\n return {\n type: \"raise\",\n mode: parser.mode,\n dy: amount,\n body\n };\n },\n mathmlBuilder\n});\n\ndefineFunction({\n type: \"ref\",\n names: [\"\\\\ref\", \"\\\\eqref\"],\n props: {\n numArgs: 1,\n argTypes: [\"raw\"]\n },\n handler({ parser, funcName }, args) {\n return {\n type: \"ref\",\n mode: parser.mode,\n funcName,\n string: args[0].string.replace(invalidIdRegEx, \"\")\n };\n },\n mathmlBuilder(group, style) {\n // Create an empty <a> node. Set a class and an href attribute.\n // The post-processor will populate with the target's tag or equation number.\n const classes = group.funcName === \"\\\\ref\" ? [\"tml-ref\"] : [\"tml-ref\", \"tml-eqref\"];\n return new AnchorNode(\"#\" + group.string, classes, null)\n }\n});\n\ndefineFunction({\n type: \"reflect\",\n names: [\"\\\\reflectbox\"],\n props: {\n numArgs: 1,\n argTypes: [\"hbox\"],\n allowedInText: true\n },\n handler({ parser }, args) {\n return {\n type: \"reflect\",\n mode: parser.mode,\n body: args[0]\n };\n },\n mathmlBuilder(group, style) {\n const node = buildGroup$1(group.body, style);\n node.style.transform = \"scaleX(-1)\";\n return node\n }\n});\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\relax\"],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler({ parser }) {\n return {\n type: \"internal\",\n mode: parser.mode\n };\n }\n});\n\ndefineFunction({\n type: \"rule\",\n names: [\"\\\\rule\"],\n props: {\n numArgs: 2,\n numOptionalArgs: 1,\n allowedInText: true,\n allowedInMath: true,\n argTypes: [\"size\", \"size\", \"size\"]\n },\n handler({ parser }, args, optArgs) {\n const shift = optArgs[0];\n const width = assertNodeType(args[0], \"size\");\n const height = assertNodeType(args[1], \"size\");\n return {\n type: \"rule\",\n mode: parser.mode,\n shift: shift && assertNodeType(shift, \"size\").value,\n width: width.value,\n height: height.value\n };\n },\n mathmlBuilder(group, style) {\n const width = calculateSize(group.width, style);\n const height = calculateSize(group.height, style);\n const shift = group.shift\n ? calculateSize(group.shift, style)\n : { number: 0, unit: \"em\" };\n const color = (style.color && style.getColor()) || \"black\";\n\n const rule = new mathMLTree.MathNode(\"mspace\");\n if (width.number > 0 && height.number > 0) {\n rule.setAttribute(\"mathbackground\", color);\n }\n rule.setAttribute(\"width\", width.number + width.unit);\n rule.setAttribute(\"height\", height.number + height.unit);\n if (shift.number === 0) { return rule }\n\n const wrapper = new mathMLTree.MathNode(\"mpadded\", [rule]);\n if (shift.number >= 0) {\n wrapper.setAttribute(\"height\", \"+\" + shift.number + shift.unit);\n } else {\n wrapper.setAttribute(\"height\", shift.number + shift.unit);\n wrapper.setAttribute(\"depth\", \"+\" + -shift.number + shift.unit);\n }\n wrapper.setAttribute(\"voffset\", shift.number + shift.unit);\n return wrapper;\n }\n});\n\n// The size mappings are taken from TeX with \\normalsize=10pt.\n// We don't have to track script level. MathML does that.\nconst sizeMap = {\n \"\\\\tiny\": 0.5,\n \"\\\\sixptsize\": 0.6,\n \"\\\\Tiny\": 0.6,\n \"\\\\scriptsize\": 0.7,\n \"\\\\footnotesize\": 0.8,\n \"\\\\small\": 0.9,\n \"\\\\normalsize\": 1.0,\n \"\\\\large\": 1.2,\n \"\\\\Large\": 1.44,\n \"\\\\LARGE\": 1.728,\n \"\\\\huge\": 2.074,\n \"\\\\Huge\": 2.488\n};\n\ndefineFunction({\n type: \"sizing\",\n names: [\n \"\\\\tiny\",\n \"\\\\sixptsize\",\n \"\\\\Tiny\",\n \"\\\\scriptsize\",\n \"\\\\footnotesize\",\n \"\\\\small\",\n \"\\\\normalsize\",\n \"\\\\large\",\n \"\\\\Large\",\n \"\\\\LARGE\",\n \"\\\\huge\",\n \"\\\\Huge\"\n ],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler: ({ breakOnTokenText, funcName, parser }, args) => {\n if (parser.settings.strict && parser.mode === \"math\") {\n // eslint-disable-next-line no-console\n console.log(`Temml strict-mode warning: Command $funcName} is invalid in math mode.`);\n }\n const body = parser.parseExpression(false, breakOnTokenText, true);\n return {\n type: \"sizing\",\n mode: parser.mode,\n funcName,\n body\n };\n },\n mathmlBuilder: (group, style) => {\n const newStyle = style.withFontSize(sizeMap[group.funcName]);\n const inner = buildExpression(group.body, newStyle);\n // Wrap with an <mstyle> element.\n const node = wrapWithMstyle(inner);\n const factor = (sizeMap[group.funcName] / style.fontSize).toFixed(4);\n node.setAttribute(\"mathsize\", factor + \"em\");\n return node;\n }\n});\n\n// smash, with optional [tb], as in AMS\n\ndefineFunction({\n type: \"smash\",\n names: [\"\\\\smash\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1,\n allowedInText: true\n },\n handler: ({ parser }, args, optArgs) => {\n let smashHeight = false;\n let smashDepth = false;\n const tbArg = optArgs[0] && assertNodeType(optArgs[0], \"ordgroup\");\n if (tbArg) {\n // Optional [tb] argument is engaged.\n // ref: amsmath: \\renewcommand{\\smash}[1][tb]{%\n // def\\mb@t{\\ht}\\def\\mb@b{\\dp}\\def\\mb@tb{\\ht\\z@\\z@\\dp}%\n let letter = \"\";\n for (let i = 0; i < tbArg.body.length; ++i) {\n const node = tbArg.body[i];\n // TODO: Write an AssertSymbolNode\n letter = node.text;\n if (letter === \"t\") {\n smashHeight = true;\n } else if (letter === \"b\") {\n smashDepth = true;\n } else {\n smashHeight = false;\n smashDepth = false;\n break;\n }\n }\n } else {\n smashHeight = true;\n smashDepth = true;\n }\n\n const body = args[0];\n return {\n type: \"smash\",\n mode: parser.mode,\n body,\n smashHeight,\n smashDepth\n };\n },\n mathmlBuilder: (group, style) => {\n const node = new mathMLTree.MathNode(\"mpadded\", [buildGroup$1(group.body, style)]);\n\n if (group.smashHeight) {\n node.setAttribute(\"height\", \"0px\");\n }\n\n if (group.smashDepth) {\n node.setAttribute(\"depth\", \"0px\");\n }\n\n return node;\n }\n});\n\ndefineFunction({\n type: \"sqrt\",\n names: [\"\\\\sqrt\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1\n },\n handler({ parser }, args, optArgs) {\n const index = optArgs[0];\n const body = args[0];\n return {\n type: \"sqrt\",\n mode: parser.mode,\n body,\n index\n };\n },\n mathmlBuilder(group, style) {\n const { body, index } = group;\n return index\n ? new mathMLTree.MathNode(\"mroot\", [\n buildGroup$1(body, style),\n buildGroup$1(index, style.incrementLevel())\n ])\n : new mathMLTree.MathNode(\"msqrt\", [buildGroup$1(body, style)]);\n }\n});\n\nconst styleMap = {\n display: 0,\n text: 1,\n script: 2,\n scriptscript: 3\n};\n\nconst styleAttributes = {\n display: [\"0\", \"true\"],\n text: [\"0\", \"false\"],\n script: [\"1\", \"false\"],\n scriptscript: [\"2\", \"false\"]\n};\n\ndefineFunction({\n type: \"styling\",\n names: [\"\\\\displaystyle\", \"\\\\textstyle\", \"\\\\scriptstyle\", \"\\\\scriptscriptstyle\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler({ breakOnTokenText, funcName, parser }, args) {\n // parse out the implicit body\n const body = parser.parseExpression(true, breakOnTokenText, true);\n\n const scriptLevel = funcName.slice(1, funcName.length - 5);\n return {\n type: \"styling\",\n mode: parser.mode,\n // Figure out what scriptLevel to use by pulling out the scriptLevel from\n // the function name\n scriptLevel,\n body\n };\n },\n mathmlBuilder(group, style) {\n // Figure out what scriptLevel we're changing to.\n const newStyle = style.withLevel(styleMap[group.scriptLevel]);\n // The style argument in the next line does NOT directly set a MathML script level.\n // It just tracks the style level, in case we need to know it for supsub or mathchoice.\n const inner = buildExpression(group.body, newStyle);\n // Wrap with an <mstyle> element.\n const node = wrapWithMstyle(inner);\n\n const attr = styleAttributes[group.scriptLevel];\n\n // Here is where we set the MathML script level.\n node.setAttribute(\"scriptlevel\", attr[0]);\n node.setAttribute(\"displaystyle\", attr[1]);\n\n return node;\n }\n});\n\n/**\n * Sometimes, groups perform special rules when they have superscripts or\n * subscripts attached to them. This function lets the `supsub` group know that\n * Sometimes, groups perform special rules when they have superscripts or\n * its inner element should handle the superscripts and subscripts instead of\n * handling them itself.\n */\n\n// Helpers\nconst symbolRegEx = /^m(over|under|underover)$/;\n\n// Super scripts and subscripts, whose precise placement can depend on other\n// functions that precede them.\ndefineFunctionBuilders({\n type: \"supsub\",\n mathmlBuilder(group, style) {\n // Is the inner group a relevant horizonal brace?\n let isBrace = false;\n let isOver;\n let isSup;\n let appendApplyFunction = false;\n let appendSpace = false;\n let needsLeadingSpace = false;\n\n if (group.base && group.base.type === \"horizBrace\") {\n isSup = !!group.sup;\n if (isSup === group.base.isOver) {\n isBrace = true;\n isOver = group.base.isOver;\n }\n }\n\n if (group.base && !group.base.stack &&\n (group.base.type === \"op\" || group.base.type === \"operatorname\")) {\n group.base.parentIsSupSub = true;\n appendApplyFunction = !group.base.symbol;\n appendSpace = appendApplyFunction && !group.isFollowedByDelimiter;\n needsLeadingSpace = group.base.needsLeadingSpace;\n }\n\n const children = group.base && group.base.stack\n ? [buildGroup$1(group.base.body[0], style)]\n : [buildGroup$1(group.base, style)];\n\n // Note regarding scriptstyle level.\n // (Sub|super)scripts should not shrink beyond MathML scriptlevel 2 aka \\scriptscriptstyle\n // Ref: https://w3c.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes\n // (BTW, MathML scriptlevel 2 is equal to Temml level 3.)\n // But Chromium continues to shrink the (sub|super)scripts. So we explicitly set scriptlevel 2.\n\n const childStyle = style.inSubOrSup();\n if (group.sub) {\n const sub = buildGroup$1(group.sub, childStyle);\n if (style.level === 3) { sub.setAttribute(\"scriptlevel\", \"2\"); }\n children.push(sub);\n }\n\n if (group.sup) {\n const sup = buildGroup$1(group.sup, childStyle);\n if (style.level === 3) { sup.setAttribute(\"scriptlevel\", \"2\"); }\n const testNode = sup.type === \"mrow\" ? sup.children[0] : sup;\n if ((testNode && testNode.type === \"mo\" && testNode.classes.includes(\"tml-prime\"))\n && group.base && group.base.text && \"fF\".indexOf(group.base.text) > -1) {\n // Chromium does not address italic correction on prime. Prevent f\u2032 from overlapping.\n testNode.classes.push(\"prime-pad\");\n }\n children.push(sup);\n }\n\n let nodeType;\n if (isBrace) {\n nodeType = isOver ? \"mover\" : \"munder\";\n } else if (!group.sub) {\n const base = group.base;\n if (\n base &&\n base.type === \"op\" &&\n base.limits &&\n (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub)\n ) {\n nodeType = \"mover\";\n } else if (\n base &&\n base.type === \"operatorname\" &&\n base.alwaysHandleSupSub &&\n (base.limits || style.level === StyleLevel.DISPLAY)\n ) {\n nodeType = \"mover\";\n } else {\n nodeType = \"msup\";\n }\n } else if (!group.sup) {\n const base = group.base;\n if (\n base &&\n base.type === \"op\" &&\n base.limits &&\n (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub)\n ) {\n nodeType = \"munder\";\n } else if (\n base &&\n base.type === \"operatorname\" &&\n base.alwaysHandleSupSub &&\n (base.limits || style.level === StyleLevel.DISPLAY)\n ) {\n nodeType = \"munder\";\n } else {\n nodeType = \"msub\";\n }\n } else {\n const base = group.base;\n if (base && ((base.type === \"op\" && base.limits) || base.type === \"multiscript\") &&\n (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub)\n ) {\n nodeType = \"munderover\";\n } else if (\n base &&\n base.type === \"operatorname\" &&\n base.alwaysHandleSupSub &&\n (style.level === StyleLevel.DISPLAY || base.limits)\n ) {\n nodeType = \"munderover\";\n } else {\n nodeType = \"msubsup\";\n }\n }\n\n let node = new mathMLTree.MathNode(nodeType, children);\n if (appendApplyFunction) {\n // Append an <mo>⁡</mo>.\n // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n const operator = new mathMLTree.MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n if (needsLeadingSpace) {\n const space = new mathMLTree.MathNode(\"mspace\");\n space.setAttribute(\"width\", \"0.1667em\"); // thin space.\n node = mathMLTree.newDocumentFragment([space, node, operator]);\n } else {\n node = mathMLTree.newDocumentFragment([node, operator]);\n }\n if (appendSpace) {\n const space = new mathMLTree.MathNode(\"mspace\");\n space.setAttribute(\"width\", \"0.1667em\"); // thin space.\n node.children.push(space);\n }\n } else if (symbolRegEx.test(nodeType)) {\n // Wrap in a <mrow>. Otherwise Firefox stretchy parens will not stretch to include limits.\n node = new mathMLTree.MathNode(\"mrow\", [node]);\n }\n\n return node\n }\n});\n\n// Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js.\n\nconst short = [\"\\\\shortmid\", \"\\\\nshortmid\", \"\\\\shortparallel\",\n \"\\\\nshortparallel\", \"\\\\smallsetminus\"];\n\nconst arrows = [\"\\\\Rsh\", \"\\\\Lsh\", \"\\\\restriction\"];\n\nconst isArrow = str => {\n if (str.length === 1) {\n const codePoint = str.codePointAt(0);\n return (0x218f < codePoint && codePoint < 0x2200)\n }\n return str.indexOf(\"arrow\") > -1 || str.indexOf(\"harpoon\") > -1 || arrows.includes(str)\n};\n\ndefineFunctionBuilders({\n type: \"atom\",\n mathmlBuilder(group, style) {\n const node = new mathMLTree.MathNode(\"mo\", [makeText(group.text, group.mode)]);\n if (group.family === \"punct\") {\n node.setAttribute(\"separator\", \"true\");\n } else if (group.family === \"open\" || group.family === \"close\") {\n // Delims built here should not stretch vertically.\n // See delimsizing.js for stretchy delims.\n if (group.family === \"open\") {\n node.setAttribute(\"form\", \"prefix\");\n // Set an explicit attribute for stretch. Otherwise Firefox may do it wrong.\n node.setAttribute(\"stretchy\", \"false\");\n } else if (group.family === \"close\") {\n node.setAttribute(\"form\", \"postfix\");\n node.setAttribute(\"stretchy\", \"false\");\n }\n } else if (group.text === \"\\\\mid\") {\n // Firefox messes up this spacing if at the end of an <mrow>. See it explicitly.\n node.setAttribute(\"lspace\", \"0.22em\"); // medium space\n node.setAttribute(\"rspace\", \"0.22em\");\n node.setAttribute(\"stretchy\", \"false\");\n } else if (group.family === \"rel\" && isArrow(group.text)) {\n node.setAttribute(\"stretchy\", \"false\");\n } else if (short.includes(group.text)) {\n node.setAttribute(\"mathsize\", \"70%\");\n } else if (group.text === \":\") {\n // \":\" is not in the MathML operator dictionary. Give it BIN spacing.\n node.attributes.lspace = \"0.2222em\";\n node.attributes.rspace = \"0.2222em\";\n }\n return node;\n }\n});\n\n/**\n * Maps TeX font commands to \"mathvariant\" attribute in buildMathML.js\n */\nconst fontMap = {\n // styles\n mathbf: \"bold\",\n mathrm: \"normal\",\n textit: \"italic\",\n mathit: \"italic\",\n mathnormal: \"italic\",\n\n // families\n mathbb: \"double-struck\",\n mathcal: \"script\",\n mathfrak: \"fraktur\",\n mathscr: \"script\",\n mathsf: \"sans-serif\",\n mathtt: \"monospace\"\n};\n\n/**\n * Returns the math variant as a string or null if none is required.\n */\nconst getVariant = function(group, style) {\n // Handle font specifiers as best we can.\n // Chromium does not support the MathML mathvariant attribute.\n // So we'll use Unicode replacement characters instead.\n // But first, determine the math variant.\n\n // Deal with the \\textit, \\textbf, etc., functions.\n if (style.fontFamily === \"texttt\") {\n return \"monospace\"\n } else if (style.fontFamily === \"textsc\") {\n return \"normal\"; // handled via character substitution in symbolsOrd.js.\n } else if (style.fontFamily === \"textsf\") {\n if (style.fontShape === \"textit\" && style.fontWeight === \"textbf\") {\n return \"sans-serif-bold-italic\"\n } else if (style.fontShape === \"textit\") {\n return \"sans-serif-italic\"\n } else if (style.fontWeight === \"textbf\") {\n return \"sans-serif-bold\"\n } else {\n return \"sans-serif\"\n }\n } else if (style.fontShape === \"textit\" && style.fontWeight === \"textbf\") {\n return \"bold-italic\"\n } else if (style.fontShape === \"textit\") {\n return \"italic\"\n } else if (style.fontWeight === \"textbf\") {\n return \"bold\"\n }\n\n // Deal with the \\mathit, mathbf, etc, functions.\n const font = style.font;\n if (!font || font === \"mathnormal\") {\n return null\n }\n\n const mode = group.mode;\n switch (font) {\n case \"mathit\":\n return \"italic\"\n case \"mathrm\": {\n const codePoint = group.text.codePointAt(0);\n // LaTeX \\mathrm returns italic for Greek characters.\n return (0x03ab < codePoint && codePoint < 0x03cf) ? \"italic\" : \"normal\"\n }\n case \"greekItalic\":\n return \"italic\"\n case \"up@greek\":\n return \"normal\"\n case \"boldsymbol\":\n case \"mathboldsymbol\":\n return \"bold-italic\"\n case \"mathbf\":\n return \"bold\"\n case \"mathbb\":\n return \"double-struck\"\n case \"mathfrak\":\n return \"fraktur\"\n case \"mathscr\":\n case \"mathcal\":\n return \"script\"\n case \"mathsf\":\n return \"sans-serif\"\n case \"mathsfit\":\n return \"sans-serif-italic\"\n case \"mathtt\":\n return \"monospace\"\n }\n\n let text = group.text;\n if (symbols[mode][text] && symbols[mode][text].replace) {\n text = symbols[mode][text].replace;\n }\n\n return Object.prototype.hasOwnProperty.call(fontMap, font) ? fontMap[font] : null\n};\n\n// Chromium does not support the MathML `mathvariant` attribute.\n// Instead, we replace ASCII characters with Unicode characters that\n// are defined in the font as bold, italic, double-struck, etc.\n// This module identifies those Unicode code points.\n\n// First, a few helpers.\nconst script = Object.freeze({\n B: 0x20EA, // Offset from ASCII B to Unicode script B\n E: 0x20EB,\n F: 0x20EB,\n H: 0x20C3,\n I: 0x20C7,\n L: 0x20C6,\n M: 0x20E6,\n R: 0x20C9,\n e: 0x20CA,\n g: 0x20A3,\n o: 0x20C5\n});\n\nconst frak = Object.freeze({\n C: 0x20EA,\n H: 0x20C4,\n I: 0x20C8,\n R: 0x20CA,\n Z: 0x20CE\n});\n\nconst bbb = Object.freeze({\n C: 0x20BF, // blackboard bold\n H: 0x20C5,\n N: 0x20C7,\n P: 0x20C9,\n Q: 0x20C9,\n R: 0x20CB,\n Z: 0x20CA\n});\n\nconst bold = Object.freeze({\n \"\\u03f5\": 0x1D2E7, // lunate epsilon\n \"\\u03d1\": 0x1D30C, // vartheta\n \"\\u03f0\": 0x1D2EE, // varkappa\n \"\\u03c6\": 0x1D319, // varphi\n \"\\u03f1\": 0x1D2EF, // varrho\n \"\\u03d6\": 0x1D30B // varpi\n});\n\nconst boldItalic = Object.freeze({\n \"\\u03f5\": 0x1D35B, // lunate epsilon\n \"\\u03d1\": 0x1D380, // vartheta\n \"\\u03f0\": 0x1D362, // varkappa\n \"\\u03c6\": 0x1D38D, // varphi\n \"\\u03f1\": 0x1D363, // varrho\n \"\\u03d6\": 0x1D37F // varpi\n});\n\nconst boldsf = Object.freeze({\n \"\\u03f5\": 0x1D395, // lunate epsilon\n \"\\u03d1\": 0x1D3BA, // vartheta\n \"\\u03f0\": 0x1D39C, // varkappa\n \"\\u03c6\": 0x1D3C7, // varphi\n \"\\u03f1\": 0x1D39D, // varrho\n \"\\u03d6\": 0x1D3B9 // varpi\n});\n\nconst bisf = Object.freeze({\n \"\\u03f5\": 0x1D3CF, // lunate epsilon\n \"\\u03d1\": 0x1D3F4, // vartheta\n \"\\u03f0\": 0x1D3D6, // varkappa\n \"\\u03c6\": 0x1D401, // varphi\n \"\\u03f1\": 0x1D3D7, // varrho\n \"\\u03d6\": 0x1D3F3 // varpi\n});\n\n// Code point offsets below are derived from https://www.unicode.org/charts/PDF/U1D400.pdf\nconst offset = Object.freeze({\n upperCaseLatin: { // A-Z\n \"normal\": ch => { return 0 },\n \"bold\": ch => { return 0x1D3BF },\n \"italic\": ch => { return 0x1D3F3 },\n \"bold-italic\": ch => { return 0x1D427 },\n \"script\": ch => { return script[ch] || 0x1D45B },\n \"script-bold\": ch => { return 0x1D48F },\n \"fraktur\": ch => { return frak[ch] || 0x1D4C3 },\n \"fraktur-bold\": ch => { return 0x1D52B },\n \"double-struck\": ch => { return bbb[ch] || 0x1D4F7 },\n \"sans-serif\": ch => { return 0x1D55F },\n \"sans-serif-bold\": ch => { return 0x1D593 },\n \"sans-serif-italic\": ch => { return 0x1D5C7 },\n \"sans-serif-bold-italic\": ch => { return 0x1D63C },\n \"monospace\": ch => { return 0x1D62F }\n },\n lowerCaseLatin: { // a-z\n \"normal\": ch => { return 0 },\n \"bold\": ch => { return 0x1D3B9 },\n \"italic\": ch => { return ch === \"h\" ? 0x20A6 : 0x1D3ED },\n \"bold-italic\": ch => { return 0x1D421 },\n \"script\": ch => { return script[ch] || 0x1D455 },\n \"script-bold\": ch => { return 0x1D489 },\n \"fraktur\": ch => { return 0x1D4BD },\n \"fraktur-bold\": ch => { return 0x1D525 },\n \"double-struck\": ch => { return 0x1D4F1 },\n \"sans-serif\": ch => { return 0x1D559 },\n \"sans-serif-bold\": ch => { return 0x1D58D },\n \"sans-serif-italic\": ch => { return 0x1D5C1 },\n \"sans-serif-bold-italic\": ch => { return 0x1D5F5 },\n \"monospace\": ch => { return 0x1D629 }\n },\n upperCaseGreek: { // A-\u03A9\n \"normal\": ch => { return 0 },\n \"bold\": ch => { return 0x1D317 },\n \"italic\": ch => { return 0x1D351 },\n // \\boldsymbol actually returns upright bold for upperCaseGreek\n \"bold-italic\": ch => { return 0x1D317 },\n \"script\": ch => { return 0 },\n \"script-bold\": ch => { return 0 },\n \"fraktur\": ch => { return 0 },\n \"fraktur-bold\": ch => { return 0 },\n \"double-struck\": ch => { return 0 },\n // Unicode has no code points for regular-weight san-serif Greek. Use bold.\n \"sans-serif\": ch => { return 0x1D3C5 },\n \"sans-serif-bold\": ch => { return 0x1D3C5 },\n \"sans-serif-italic\": ch => { return 0 },\n \"sans-serif-bold-italic\": ch => { return 0x1D3FF },\n \"monospace\": ch => { return 0 }\n },\n lowerCaseGreek: { // \u03B1-\u03C9\n \"normal\": ch => { return 0 },\n \"bold\": ch => { return 0x1D311 },\n \"italic\": ch => { return 0x1D34B },\n \"bold-italic\": ch => { return ch === \"\\u03d5\" ? 0x1D37E : 0x1D385 },\n \"script\": ch => { return 0 },\n \"script-bold\": ch => { return 0 },\n \"fraktur\": ch => { return 0 },\n \"fraktur-bold\": ch => { return 0 },\n \"double-struck\": ch => { return 0 },\n // Unicode has no code points for regular-weight san-serif Greek. Use bold.\n \"sans-serif\": ch => { return 0x1D3BF },\n \"sans-serif-bold\": ch => { return 0x1D3BF },\n \"sans-serif-italic\": ch => { return 0 },\n \"sans-serif-bold-italic\": ch => { return 0x1D3F9 },\n \"monospace\": ch => { return 0 }\n },\n varGreek: { // \\varGamma, etc\n \"normal\": ch => { return 0 },\n \"bold\": ch => { return bold[ch] || -51 },\n \"italic\": ch => { return 0 },\n \"bold-italic\": ch => { return boldItalic[ch] || 0x3A },\n \"script\": ch => { return 0 },\n \"script-bold\": ch => { return 0 },\n \"fraktur\": ch => { return 0 },\n \"fraktur-bold\": ch => { return 0 },\n \"double-struck\": ch => { return 0 },\n \"sans-serif\": ch => { return boldsf[ch] || 0x74 },\n \"sans-serif-bold\": ch => { return boldsf[ch] || 0x74 },\n \"sans-serif-italic\": ch => { return 0 },\n \"sans-serif-bold-italic\": ch => { return bisf[ch] || 0xAE },\n \"monospace\": ch => { return 0 }\n },\n numeral: { // 0-9\n \"normal\": ch => { return 0 },\n \"bold\": ch => { return 0x1D79E },\n \"italic\": ch => { return 0 },\n \"bold-italic\": ch => { return 0 },\n \"script\": ch => { return 0 },\n \"script-bold\": ch => { return 0 },\n \"fraktur\": ch => { return 0 },\n \"fraktur-bold\": ch => { return 0 },\n \"double-struck\": ch => { return 0x1D7A8 },\n \"sans-serif\": ch => { return 0x1D7B2 },\n \"sans-serif-bold\": ch => { return 0x1D7BC },\n \"sans-serif-italic\": ch => { return 0 },\n \"sans-serif-bold-italic\": ch => { return 0 },\n \"monospace\": ch => { return 0x1D7C6 }\n }\n});\n\nconst variantChar = (ch, variant) => {\n const codePoint = ch.codePointAt(0);\n const block = 0x40 < codePoint && codePoint < 0x5b\n ? \"upperCaseLatin\"\n : 0x60 < codePoint && codePoint < 0x7b\n ? \"lowerCaseLatin\"\n : (0x390 < codePoint && codePoint < 0x3AA)\n ? \"upperCaseGreek\"\n : 0x3B0 < codePoint && codePoint < 0x3CA || ch === \"\\u03d5\"\n ? \"lowerCaseGreek\"\n : 0x1D6E1 < codePoint && codePoint < 0x1D6FC || bold[ch]\n ? \"varGreek\"\n : (0x2F < codePoint && codePoint < 0x3A)\n ? \"numeral\"\n : \"other\";\n return block === \"other\"\n ? ch\n : String.fromCodePoint(codePoint + offset[block][variant](ch))\n};\n\nconst smallCaps = Object.freeze({\n a: \"\u1D00\",\n b: \"\u0299\",\n c: \"\u1D04\",\n d: \"\u1D05\",\n e: \"\u1D07\",\n f: \"\uA730\",\n g: \"\u0262\",\n h: \"\u029C\",\n i: \"\u026A\",\n j: \"\u1D0A\",\n k: \"\u1D0B\",\n l: \"\u029F\",\n m: \"\u1D0D\",\n n: \"\u0274\",\n o: \"\u1D0F\",\n p: \"\u1D18\",\n q: \"\u01EB\",\n r: \"\u0280\",\n s: \"s\",\n t: \"\u1D1B\",\n u: \"\u1D1C\",\n v: \"\u1D20\",\n w: \"\u1D21\",\n x: \"x\",\n y: \"\u028F\",\n z: \"\u1D22\"\n});\n\n// \"mathord\" and \"textord\" ParseNodes created in Parser.js from symbol Groups in\n// src/symbols.js.\n\nconst numberRegEx = /^\\d(?:[\\d,.]*\\d)?$/;\nconst latinRegEx = /[A-Ba-z]/;\nconst primes = new Set([\"\\\\prime\", \"\\\\dprime\", \"\\\\trprime\", \"\\\\qprime\",\n \"\\\\backprime\", \"\\\\backdprime\", \"\\\\backtrprime\"]);\n\nconst italicNumber = (text, variant, tag) => {\n const mn = new mathMLTree.MathNode(tag, [text]);\n const wrapper = new mathMLTree.MathNode(\"mstyle\", [mn]);\n wrapper.style[\"font-style\"] = \"italic\";\n wrapper.style[\"font-family\"] = \"Cambria, 'Times New Roman', serif\";\n if (variant === \"bold-italic\") { wrapper.style[\"font-weight\"] = \"bold\"; }\n return wrapper\n};\n\ndefineFunctionBuilders({\n type: \"mathord\",\n mathmlBuilder(group, style) {\n const text = makeText(group.text, group.mode, style);\n const codePoint = text.text.codePointAt(0);\n // Test for upper-case Greek\n const defaultVariant = (0x0390 < codePoint && codePoint < 0x03aa) ? \"normal\" : \"italic\";\n const variant = getVariant(group, style) || defaultVariant;\n if (variant === \"script\") {\n text.text = variantChar(text.text, variant);\n return new mathMLTree.MathNode(\"mi\", [text], [style.font])\n } else if (variant !== \"italic\") {\n text.text = variantChar(text.text, variant);\n }\n let node = new mathMLTree.MathNode(\"mi\", [text]);\n // TODO: Handle U+1D49C - U+1D4CF per https://www.unicode.org/charts/PDF/U1D400.pdf\n if (variant === \"normal\") {\n node.setAttribute(\"mathvariant\", \"normal\");\n if (text.text.length === 1) {\n // A Firefox bug will apply spacing here, but there should be none. Fix it.\n node = new mathMLTree.MathNode(\"mrow\", [node]);\n }\n }\n return node\n }\n});\n\ndefineFunctionBuilders({\n type: \"textord\",\n mathmlBuilder(group, style) {\n let ch = group.text;\n const codePoint = ch.codePointAt(0);\n if (style.fontFamily === \"textsc\") {\n // Convert small latin letters to small caps.\n if (96 < codePoint && codePoint < 123) {\n ch = smallCaps[ch];\n }\n }\n const text = makeText(ch, group.mode, style);\n const variant = getVariant(group, style) || \"normal\";\n\n let node;\n if (numberRegEx.test(group.text)) {\n const tag = group.mode === \"text\" ? \"mtext\" : \"mn\";\n if (variant === \"italic\" || variant === \"bold-italic\") {\n return italicNumber(text, variant, tag)\n } else {\n if (variant !== \"normal\") {\n text.text = text.text.split(\"\").map(c => variantChar(c, variant)).join(\"\");\n }\n node = new mathMLTree.MathNode(tag, [text]);\n }\n } else if (group.mode === \"text\") {\n if (variant !== \"normal\") {\n text.text = variantChar(text.text, variant);\n }\n node = new mathMLTree.MathNode(\"mtext\", [text]);\n } else if (primes.has(group.text)) {\n node = new mathMLTree.MathNode(\"mo\", [text]);\n // TODO: If/when Chromium uses ssty variant for prime, remove the next line.\n node.classes.push(\"tml-prime\");\n } else {\n const origText = text.text;\n if (variant !== \"italic\") {\n text.text = variantChar(text.text, variant);\n }\n node = new mathMLTree.MathNode(\"mi\", [text]);\n if (text.text === origText && latinRegEx.test(origText)) {\n node.setAttribute(\"mathvariant\", \"italic\");\n }\n }\n return node\n }\n});\n\n// A map of CSS-based spacing functions to their CSS class.\nconst cssSpace = {\n \"\\\\nobreak\": \"nobreak\",\n \"\\\\allowbreak\": \"allowbreak\"\n};\n\n// A lookup table to determine whether a spacing function/symbol should be\n// treated like a regular space character. If a symbol or command is a key\n// in this table, then it should be a regular space character. Furthermore,\n// the associated value may have a `className` specifying an extra CSS class\n// to add to the created `span`.\nconst regularSpace = {\n \" \": {},\n \"\\\\ \": {},\n \"~\": {\n className: \"nobreak\"\n },\n \"\\\\space\": {},\n \"\\\\nobreakspace\": {\n className: \"nobreak\"\n }\n};\n\n// ParseNode<\"spacing\"> created in Parser.js from the \"spacing\" symbol Groups in\n// src/symbols.js.\ndefineFunctionBuilders({\n type: \"spacing\",\n mathmlBuilder(group, style) {\n let node;\n\n if (Object.prototype.hasOwnProperty.call(regularSpace, group.text)) {\n // Firefox does not render a space in a <mtext> </mtext>. So write a no-break space.\n // TODO: If Firefox fixes that bug, uncomment the next line and write ch into the node.\n //const ch = (regularSpace[group.text].className === \"nobreak\") ? \"\\u00a0\" : \" \"\n node = new mathMLTree.MathNode(\"mtext\", [new mathMLTree.TextNode(\"\\u00a0\")]);\n } else if (Object.prototype.hasOwnProperty.call(cssSpace, group.text)) {\n // MathML 3.0 calls for nobreak to occur in an <mo>, not an <mtext>\n // Ref: https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs\n node = new mathMLTree.MathNode(\"mo\");\n if (group.text === \"\\\\nobreak\") {\n node.setAttribute(\"linebreak\", \"nobreak\");\n }\n } else {\n throw new ParseError(`Unknown type of space \"$group.text}\"`)\n }\n\n return node\n }\n});\n\ndefineFunctionBuilders({\n type: \"tag\"\n});\n\n// For a \\tag, the work usually done in a mathmlBuilder is instead done in buildMathML.js.\n// That way, a \\tag can be pulled out of the parse tree and wrapped around the outer node.\n\n// Non-mathy text, possibly in a font\nconst textFontFamilies = {\n \"\\\\text\": undefined,\n \"\\\\textrm\": \"textrm\",\n \"\\\\textsf\": \"textsf\",\n \"\\\\texttt\": \"texttt\",\n \"\\\\textnormal\": \"textrm\",\n \"\\\\textsc\": \"textsc\" // small caps\n};\n\nconst textFontWeights = {\n \"\\\\textbf\": \"textbf\",\n \"\\\\textmd\": \"textmd\"\n};\n\nconst textFontShapes = {\n \"\\\\textit\": \"textit\",\n \"\\\\textup\": \"textup\"\n};\n\nconst styleWithFont = (group, style) => {\n const font = group.font;\n // Checks if the argument is a font family or a font style.\n if (!font) {\n return style;\n } else if (textFontFamilies[font]) {\n return style.withTextFontFamily(textFontFamilies[font]);\n } else if (textFontWeights[font]) {\n return style.withTextFontWeight(textFontWeights[font]);\n } else if (font === \"\\\\emph\") {\n return style.fontShape === \"textit\"\n ? style.withTextFontShape(\"textup\")\n : style.withTextFontShape(\"textit\")\n }\n return style.withTextFontShape(textFontShapes[font])\n};\n\ndefineFunction({\n type: \"text\",\n names: [\n // Font families\n \"\\\\text\",\n \"\\\\textrm\",\n \"\\\\textsf\",\n \"\\\\texttt\",\n \"\\\\textnormal\",\n \"\\\\textsc\",\n // Font weights\n \"\\\\textbf\",\n \"\\\\textmd\",\n // Font Shapes\n \"\\\\textit\",\n \"\\\\textup\",\n \"\\\\emph\"\n ],\n props: {\n numArgs: 1,\n argTypes: [\"text\"],\n allowedInArgument: true,\n allowedInText: true\n },\n handler({ parser, funcName }, args) {\n const body = args[0];\n return {\n type: \"text\",\n mode: parser.mode,\n body: ordargument(body),\n font: funcName\n };\n },\n mathmlBuilder(group, style) {\n const newStyle = styleWithFont(group, style);\n const mrow = buildExpressionRow(group.body, newStyle);\n return consolidateText(mrow)\n }\n});\n\n// \\vcenter: Vertically center the argument group on the math axis.\n\ndefineFunction({\n type: \"vcenter\",\n names: [\"\\\\vcenter\"],\n props: {\n numArgs: 1,\n argTypes: [\"original\"],\n allowedInText: false\n },\n handler({ parser }, args) {\n return {\n type: \"vcenter\",\n mode: parser.mode,\n body: args[0]\n };\n },\n mathmlBuilder(group, style) {\n // Use a math table to create vertically centered content.\n const mtd = new mathMLTree.MathNode(\"mtd\", [buildGroup$1(group.body, style)]);\n mtd.style.padding = \"0\";\n const mtr = new mathMLTree.MathNode(\"mtr\", [mtd]);\n return new mathMLTree.MathNode(\"mtable\", [mtr])\n }\n});\n\ndefineFunction({\n type: \"verb\",\n names: [\"\\\\verb\"],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler(context, args, optArgs) {\n // \\verb and \\verb* are dealt with directly in Parser.js.\n // If we end up here, it's because of a failure to match the two delimiters\n // in the regex in Lexer.js. LaTeX raises the following error when \\verb is\n // terminated by end of line (or file).\n throw new ParseError(\"\\\\verb ended by end of line instead of matching delimiter\");\n },\n mathmlBuilder(group, style) {\n const text = new mathMLTree.TextNode(makeVerb(group));\n const node = new mathMLTree.MathNode(\"mtext\", [text]);\n node.setAttribute(\"mathvariant\", \"monospace\");\n return node;\n }\n});\n\n/**\n * Converts verb group into body string.\n *\n * \\verb* replaces each space with an open box \\u2423\n * \\verb replaces each space with a no-break space \\xA0\n */\nconst makeVerb = (group) => group.body.replace(/ /g, group.star ? \"\\u2423\" : \"\\xA0\");\n\n/** Include this to ensure that all functions are defined. */\n\nconst functions = _functions;\n\n/**\n * The Lexer class handles tokenizing the input in various ways. Since our\n * parser expects us to be able to backtrack, the lexer allows lexing from any\n * given starting point.\n *\n * Its main exposed function is the `lex` function, which takes a position to\n * lex from and a type of token to lex. It defers to the appropriate `_innerLex`\n * function.\n *\n * The various `_innerLex` functions perform the actual lexing of different\n * kinds.\n */\n\n\n/* The following tokenRegex\n * - matches typical whitespace (but not NBSP etc.) using its first two groups\n * - does not match any control character \\x00-\\x1f except whitespace\n * - does not match a bare backslash\n * - matches any ASCII character except those just mentioned\n * - does not match the BMP private use area \\uE000-\\uF8FF\n * - does not match bare surrogate code units\n * - matches any BMP character except for those just described\n * - matches any valid Unicode surrogate pair\n * - mathches numerals\n * - matches a backslash followed by one or more whitespace characters\n * - matches a backslash followed by one or more letters then whitespace\n * - matches a backslash followed by any BMP character\n * Capturing groups:\n * [1] regular whitespace\n * [2] backslash followed by whitespace\n * [3] anything else, which may include:\n * [4] left character of \\verb*\n * [5] left character of \\verb\n * [6] backslash followed by word, excluding any trailing whitespace\n * Just because the Lexer matches something doesn't mean it's valid input:\n * If there is no matching function or symbol definition, the Parser will\n * still reject the input.\n */\nconst spaceRegexString = \"[ \\r\\n\\t]\";\nconst controlWordRegexString = \"\\\\\\\\[a-zA-Z@]+\";\nconst controlSymbolRegexString = \"\\\\\\\\[^\\uD800-\\uDFFF]\";\nconst controlWordWhitespaceRegexString = `($controlWordRegexString})$spaceRegexString}*`;\nconst controlSpaceRegexString = \"\\\\\\\\(\\n|[ \\r\\t]+\\n?)[ \\r\\t]*\";\nconst combiningDiacriticalMarkString = \"[\\u0300-\\u036f]\";\nconst combiningDiacriticalMarksEndRegex = new RegExp(`$combiningDiacriticalMarkString}+$`);\nconst tokenRegexString =\n `($spaceRegexString}+)|` + // whitespace\n `$controlSpaceRegexString}|` + // whitespace\n \"([!-\\\\[\\\\]-\\u2027\\u202A-\\uD7FF\\uF900-\\uFFFF]\" + // single codepoint\n `$combiningDiacriticalMarkString}*` + // ...plus accents\n \"|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\" + // surrogate pair\n `$combiningDiacriticalMarkString}*` + // ...plus accents\n \"|\\\\\\\\verb\\\\*([^]).*?\\\\4\" + // \\verb*\n \"|\\\\\\\\verb([^*a-zA-Z]).*?\\\\5\" + // \\verb unstarred\n `|$controlWordWhitespaceRegexString}` + // \\macroName + spaces\n `|$controlSymbolRegexString})`; // \\\\, \\', etc.\n\n/** Main Lexer class */\nclass Lexer {\n constructor(input, settings) {\n // Separate accents from characters\n this.input = input;\n this.settings = settings;\n this.tokenRegex = new RegExp(tokenRegexString, 'g');\n // Category codes. The lexer only supports comment characters (14) for now.\n // MacroExpander additionally distinguishes active (13).\n this.catcodes = {\n \"%\": 14, // comment character\n \"~\": 13 // active character\n };\n }\n\n setCatcode(char, code) {\n this.catcodes[char] = code;\n }\n\n /**\n * This function lexes a single token.\n */\n lex() {\n const input = this.input;\n const pos = this.tokenRegex.lastIndex;\n if (pos === input.length) {\n return new Token(\"EOF\", new SourceLocation(this, pos, pos));\n }\n const match = this.tokenRegex.exec(input);\n if (match === null || match.index !== pos) {\n throw new ParseError(\n `Unexpected character: '$input[pos]}'`,\n new Token(input[pos], new SourceLocation(this, pos, pos + 1))\n );\n }\n const text = match[6] || match[3] || (match[2] ? \"\\\\ \" : \" \");\n\n if (this.catcodes[text] === 14) {\n // comment character\n const nlIndex = input.indexOf(\"\\n\", this.tokenRegex.lastIndex);\n if (nlIndex === -1) {\n this.tokenRegex.lastIndex = input.length; // EOF\n if (this.settings.strict) {\n throw new ParseError(\"% comment has no terminating newline; LaTeX would \" +\n \"fail because of commenting the end of math mode\")\n }\n } else {\n this.tokenRegex.lastIndex = nlIndex + 1;\n }\n return this.lex();\n }\n\n return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex));\n }\n}\n\n/**\n * A `Namespace` refers to a space of nameable things like macros or lengths,\n * which can be `set` either globally or local to a nested group, using an\n * undo stack similar to how TeX implements this functionality.\n * Performance-wise, `get` and local `set` take constant time, while global\n * `set` takes time proportional to the depth of group nesting.\n */\n\n\nclass Namespace {\n /**\n * Both arguments are optional. The first argument is an object of\n * built-in mappings which never change. The second argument is an object\n * of initial (global-level) mappings, which will constantly change\n * according to any global/top-level `set`s done.\n */\n constructor(builtins = {}, globalMacros = {}) {\n this.current = globalMacros;\n this.builtins = builtins;\n this.undefStack = [];\n }\n\n /**\n * Start a new nested group, affecting future local `set`s.\n */\n beginGroup() {\n this.undefStack.push({});\n }\n\n /**\n * End current nested group, restoring values before the group began.\n */\n endGroup() {\n if (this.undefStack.length === 0) {\n throw new ParseError(\n \"Unbalanced namespace destruction: attempt \" +\n \"to pop global namespace; please report this as a bug\"\n );\n }\n const undefs = this.undefStack.pop();\n for (const undef in undefs) {\n if (Object.prototype.hasOwnProperty.call(undefs, undef )) {\n if (undefs[undef] === undefined) {\n delete this.current[undef];\n } else {\n this.current[undef] = undefs[undef];\n }\n }\n }\n }\n\n /**\n * Detect whether `name` has a definition. Equivalent to\n * `get(name) != null`.\n */\n has(name) {\n return Object.prototype.hasOwnProperty.call(this.current, name ) ||\n Object.prototype.hasOwnProperty.call(this.builtins, name );\n }\n\n /**\n * Get the current value of a name, or `undefined` if there is no value.\n *\n * Note: Do not use `if (namespace.get(...))` to detect whether a macro\n * is defined, as the definition may be the empty string which evaluates\n * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or\n * `if (namespace.has(...))`.\n */\n get(name) {\n if (Object.prototype.hasOwnProperty.call(this.current, name )) {\n return this.current[name];\n } else {\n return this.builtins[name];\n }\n }\n\n /**\n * Set the current value of a name, and optionally set it globally too.\n * Local set() sets the current value and (when appropriate) adds an undo\n * operation to the undo stack. Global set() may change the undo\n * operation at every level, so takes time linear in their number.\n */\n set(name, value, global = false) {\n if (global) {\n // Global set is equivalent to setting in all groups. Simulate this\n // by destroying any undos currently scheduled for this name,\n // and adding an undo with the *new* value (in case it later gets\n // locally reset within this environment).\n for (let i = 0; i < this.undefStack.length; i++) {\n delete this.undefStack[i][name];\n }\n if (this.undefStack.length > 0) {\n this.undefStack[this.undefStack.length - 1][name] = value;\n }\n } else {\n // Undo this set at end of this group (possibly to `undefined`),\n // unless an undo is already in place, in which case that older\n // value is the correct one.\n const top = this.undefStack[this.undefStack.length - 1];\n if (top && !Object.prototype.hasOwnProperty.call(top, name )) {\n top[name] = this.current[name];\n }\n }\n this.current[name] = value;\n }\n}\n\n/**\n * This file contains the \u201Cgullet\u201D where macros are expanded\n * until only non-macro tokens remain.\n */\n\n\n// List of commands that act like macros but aren't defined as a macro,\n// function, or symbol. Used in `isDefined`.\nconst implicitCommands = {\n \"^\": true, // Parser.js\n _: true, // Parser.js\n \"\\\\limits\": true, // Parser.js\n \"\\\\nolimits\": true // Parser.js\n};\n\nclass MacroExpander {\n constructor(input, settings, mode) {\n this.settings = settings;\n this.expansionCount = 0;\n this.feed(input);\n // Make new global namespace\n this.macros = new Namespace(macros, settings.macros);\n this.mode = mode;\n this.stack = []; // contains tokens in REVERSE order\n }\n\n /**\n * Feed a new input string to the same MacroExpander\n * (with existing macros etc.).\n */\n feed(input) {\n this.lexer = new Lexer(input, this.settings);\n }\n\n /**\n * Switches between \"text\" and \"math\" modes.\n */\n switchMode(newMode) {\n this.mode = newMode;\n }\n\n /**\n * Start a new group nesting within all namespaces.\n */\n beginGroup() {\n this.macros.beginGroup();\n }\n\n /**\n * End current group nesting within all namespaces.\n */\n endGroup() {\n this.macros.endGroup();\n }\n\n /**\n * Returns the topmost token on the stack, without expanding it.\n * Similar in behavior to TeX's `\\futurelet`.\n */\n future() {\n if (this.stack.length === 0) {\n this.pushToken(this.lexer.lex());\n }\n return this.stack[this.stack.length - 1]\n }\n\n /**\n * Remove and return the next unexpanded token.\n */\n popToken() {\n this.future(); // ensure non-empty stack\n return this.stack.pop();\n }\n\n /**\n * Add a given token to the token stack. In particular, this get be used\n * to put back a token returned from one of the other methods.\n */\n pushToken(token) {\n this.stack.push(token);\n }\n\n /**\n * Append an array of tokens to the token stack.\n */\n pushTokens(tokens) {\n this.stack.push(...tokens);\n }\n\n /**\n * Find an macro argument without expanding tokens and append the array of\n * tokens to the token stack. Uses Token as a container for the result.\n */\n scanArgument(isOptional) {\n let start;\n let end;\n let tokens;\n if (isOptional) {\n this.consumeSpaces(); // \\@ifnextchar gobbles any space following it\n if (this.future().text !== \"[\") {\n return null;\n }\n start = this.popToken(); // don't include [ in tokens\n ({ tokens, end } = this.consumeArg([\"]\"]));\n } else {\n ({ tokens, start, end } = this.consumeArg());\n }\n\n // indicate the end of an argument\n this.pushToken(new Token(\"EOF\", end.loc));\n\n this.pushTokens(tokens);\n return start.range(end, \"\");\n }\n\n /**\n * Consume all following space tokens, without expansion.\n */\n consumeSpaces() {\n for (;;) {\n const token = this.future();\n if (token.text === \" \") {\n this.stack.pop();\n } else {\n break;\n }\n }\n }\n\n /**\n * Consume an argument from the token stream, and return the resulting array\n * of tokens and start/end token.\n */\n consumeArg(delims) {\n // The argument for a delimited parameter is the shortest (possibly\n // empty) sequence of tokens with properly nested {...} groups that is\n // followed ... by this particular list of non-parameter tokens.\n // The argument for an undelimited parameter is the next nonblank\n // token, unless that token is \u2018{\u2019, when the argument will be the\n // entire {...} group that follows.\n const tokens = [];\n const isDelimited = delims && delims.length > 0;\n if (!isDelimited) {\n // Ignore spaces between arguments. As the TeXbook says:\n // \"After you have said \u2018\\def\\row#1#2{...}\u2019, you are allowed to\n // put spaces between the arguments (e.g., \u2018\\row x n\u2019), because\n // TeX doesn\u2019t use single spaces as undelimited arguments.\"\n this.consumeSpaces();\n }\n const start = this.future();\n let tok;\n let depth = 0;\n let match = 0;\n do {\n tok = this.popToken();\n tokens.push(tok);\n if (tok.text === \"{\") {\n ++depth;\n } else if (tok.text === \"}\") {\n --depth;\n if (depth === -1) {\n throw new ParseError(\"Extra }\", tok);\n }\n } else if (tok.text === \"EOF\") {\n throw new ParseError(\n \"Unexpected end of input in a macro argument\" +\n \", expected '\" +\n (delims && isDelimited ? delims[match] : \"}\") +\n \"'\",\n tok\n );\n }\n if (delims && isDelimited) {\n if ((depth === 0 || (depth === 1 && delims[match] === \"{\")) && tok.text === delims[match]) {\n ++match;\n if (match === delims.length) {\n // don't include delims in tokens\n tokens.splice(-match, match);\n break;\n }\n } else {\n match = 0;\n }\n }\n } while (depth !== 0 || isDelimited);\n // If the argument found ... has the form \u2018{<nested tokens>}\u2019,\n // ... the outermost braces enclosing the argument are removed\n if (start.text === \"{\" && tokens[tokens.length - 1].text === \"}\") {\n tokens.pop();\n tokens.shift();\n }\n tokens.reverse(); // to fit in with stack order\n return { tokens, start, end: tok };\n }\n\n /**\n * Consume the specified number of (delimited) arguments from the token\n * stream and return the resulting array of arguments.\n */\n consumeArgs(numArgs, delimiters) {\n if (delimiters) {\n if (delimiters.length !== numArgs + 1) {\n throw new ParseError(\"The length of delimiters doesn't match the number of args!\");\n }\n const delims = delimiters[0];\n for (let i = 0; i < delims.length; i++) {\n const tok = this.popToken();\n if (delims[i] !== tok.text) {\n throw new ParseError(\"Use of the macro doesn't match its definition\", tok);\n }\n }\n }\n\n const args = [];\n for (let i = 0; i < numArgs; i++) {\n args.push(this.consumeArg(delimiters && delimiters[i + 1]).tokens);\n }\n return args;\n }\n\n /**\n * Expand the next token only once if possible.\n *\n * If the token is expanded, the resulting tokens will be pushed onto\n * the stack in reverse order, and the number of such tokens will be\n * returned. This number might be zero or positive.\n *\n * If not, the return value is `false`, and the next token remains at the\n * top of the stack.\n *\n * In either case, the next token will be on the top of the stack,\n * or the stack will be empty (in case of empty expansion\n * and no other tokens).\n *\n * Used to implement `expandAfterFuture` and `expandNextToken`.\n *\n * If expandableOnly, only expandable tokens are expanded and\n * an undefined control sequence results in an error.\n */\n expandOnce(expandableOnly) {\n const topToken = this.popToken();\n const name = topToken.text;\n const expansion = !topToken.noexpand ? this._getExpansion(name) : null;\n if (expansion == null || (expandableOnly && expansion.unexpandable)) {\n if (expandableOnly && expansion == null && name[0] === \"\\\\\" && !this.isDefined(name)) {\n throw new ParseError(\"Undefined control sequence: \" + name);\n }\n this.pushToken(topToken);\n return false;\n }\n this.expansionCount++;\n if (this.expansionCount > this.settings.maxExpand) {\n throw new ParseError(\n \"Too many expansions: infinite loop or \" + \"need to increase maxExpand setting\"\n );\n }\n let tokens = expansion.tokens;\n const args = this.consumeArgs(expansion.numArgs, expansion.delimiters);\n if (expansion.numArgs) {\n // paste arguments in place of the placeholders\n tokens = tokens.slice(); // make a shallow copy\n for (let i = tokens.length - 1; i >= 0; --i) {\n let tok = tokens[i];\n if (tok.text === \"#\") {\n if (i === 0) {\n throw new ParseError(\"Incomplete placeholder at end of macro body\", tok);\n }\n tok = tokens[--i]; // next token on stack\n if (tok.text === \"#\") {\n // ## \u2192 #\n tokens.splice(i + 1, 1); // drop first #\n } else if (/^[1-9]$/.test(tok.text)) {\n // replace the placeholder with the indicated argument\n tokens.splice(i, 2, ...args[+tok.text - 1]);\n } else {\n throw new ParseError(\"Not a valid argument number\", tok);\n }\n }\n }\n }\n // Concatenate expansion onto top of stack.\n this.pushTokens(tokens);\n return tokens.length;\n }\n\n /**\n * Expand the next token only once (if possible), and return the resulting\n * top token on the stack (without removing anything from the stack).\n * Similar in behavior to TeX's `\\expandafter\\futurelet`.\n * Equivalent to expandOnce() followed by future().\n */\n expandAfterFuture() {\n this.expandOnce();\n return this.future();\n }\n\n /**\n * Recursively expand first token, then return first non-expandable token.\n */\n expandNextToken() {\n for (;;) {\n if (this.expandOnce() === false) { // fully expanded\n const token = this.stack.pop();\n // The token after \\noexpand is interpreted as if its meaning were \u2018\\relax\u2019\n if (token.treatAsRelax) {\n token.text = \"\\\\relax\";\n }\n return token\n }\n }\n\n // This pathway is impossible.\n throw new Error(); // eslint-disable-line no-unreachable\n }\n\n /**\n * Fully expand the given macro name and return the resulting list of\n * tokens, or return `undefined` if no such macro is defined.\n */\n expandMacro(name) {\n return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined;\n }\n\n /**\n * Fully expand the given token stream and return the resulting list of\n * tokens. Note that the input tokens are in reverse order, but the\n * output tokens are in forward order.\n */\n expandTokens(tokens) {\n const output = [];\n const oldStackLength = this.stack.length;\n this.pushTokens(tokens);\n while (this.stack.length > oldStackLength) {\n // Expand only expandable tokens\n if (this.expandOnce(true) === false) { // fully expanded\n const token = this.stack.pop();\n if (token.treatAsRelax) {\n // the expansion of \\noexpand is the token itself\n token.noexpand = false;\n token.treatAsRelax = false;\n }\n output.push(token);\n }\n }\n return output;\n }\n\n /**\n * Fully expand the given macro name and return the result as a string,\n * or return `undefined` if no such macro is defined.\n */\n expandMacroAsText(name) {\n const tokens = this.expandMacro(name);\n if (tokens) {\n return tokens.map((token) => token.text).join(\"\");\n } else {\n return tokens;\n }\n }\n\n /**\n * Returns the expanded macro as a reversed array of tokens and a macro\n * argument count. Or returns `null` if no such macro.\n */\n _getExpansion(name) {\n const definition = this.macros.get(name);\n if (definition == null) {\n // mainly checking for undefined here\n return definition;\n }\n // If a single character has an associated catcode other than 13\n // (active character), then don't expand it.\n if (name.length === 1) {\n const catcode = this.lexer.catcodes[name];\n if (catcode != null && catcode !== 13) {\n return\n }\n }\n const expansion = typeof definition === \"function\" ? definition(this) : definition;\n if (typeof expansion === \"string\") {\n let numArgs = 0;\n if (expansion.indexOf(\"#\") !== -1) {\n const stripped = expansion.replace(/##/g, \"\");\n while (stripped.indexOf(\"#\" + (numArgs + 1)) !== -1) {\n ++numArgs;\n }\n }\n const bodyLexer = new Lexer(expansion, this.settings);\n const tokens = [];\n let tok = bodyLexer.lex();\n while (tok.text !== \"EOF\") {\n tokens.push(tok);\n tok = bodyLexer.lex();\n }\n tokens.reverse(); // to fit in with stack using push and pop\n const expanded = { tokens, numArgs };\n return expanded;\n }\n\n return expansion;\n }\n\n /**\n * Determine whether a command is currently \"defined\" (has some\n * functionality), meaning that it's a macro (in the current group),\n * a function, a symbol, or one of the special commands listed in\n * `implicitCommands`.\n */\n isDefined(name) {\n return (\n this.macros.has(name) ||\n Object.prototype.hasOwnProperty.call(functions, name ) ||\n Object.prototype.hasOwnProperty.call(symbols.math, name ) ||\n Object.prototype.hasOwnProperty.call(symbols.text, name ) ||\n Object.prototype.hasOwnProperty.call(implicitCommands, name )\n );\n }\n\n /**\n * Determine whether a command is expandable.\n */\n isExpandable(name) {\n const macro = this.macros.get(name);\n return macro != null\n ? typeof macro === \"string\" || typeof macro === \"function\" || !macro.unexpandable\n : Object.prototype.hasOwnProperty.call(functions, name ) && !functions[name].primitive;\n }\n}\n\n// Helpers for Parser.js handling of Unicode (sub|super)script characters.\n\nconst unicodeSubRegEx = /^[\u208A\u208B\u208C\u208D\u208E\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2090\u2091\u2095\u1D62\u2C7C\u2096\u2097\u2098\u2099\u2092\u209A\u1D63\u209B\u209C\u1D64\u1D65\u2093\u1D66\u1D67\u1D68\u1D69\u1D6A]/;\n\nconst uSubsAndSups = Object.freeze({\n '\u208A': '+',\n '\u208B': '-',\n '\u208C': '=',\n '\u208D': '(',\n '\u208E': ')',\n '\u2080': '0',\n '\u2081': '1',\n '\u2082': '2',\n '\u2083': '3',\n '\u2084': '4',\n '\u2085': '5',\n '\u2086': '6',\n '\u2087': '7',\n '\u2088': '8',\n '\u2089': '9',\n '\\u2090': 'a',\n '\\u2091': 'e',\n '\\u2095': 'h',\n '\\u1D62': 'i',\n '\\u2C7C': 'j',\n '\\u2096': 'k',\n '\\u2097': 'l',\n '\\u2098': 'm',\n '\\u2099': 'n',\n '\\u2092': 'o',\n '\\u209A': 'p',\n '\\u1D63': 'r',\n '\\u209B': 's',\n '\\u209C': 't',\n '\\u1D64': 'u',\n '\\u1D65': 'v',\n '\\u2093': 'x',\n '\\u1D66': '\u03B2',\n '\\u1D67': '\u03B3',\n '\\u1D68': '\u03C1',\n '\\u1D69': '\\u03d5',\n '\\u1D6A': '\u03C7',\n '\u207A': '+',\n '\u207B': '-',\n '\u207C': '=',\n '\u207D': '(',\n '\u207E': ')',\n '\u2070': '0',\n '\u00B9': '1',\n '\u00B2': '2',\n '\u00B3': '3',\n '\u2074': '4',\n '\u2075': '5',\n '\u2076': '6',\n '\u2077': '7',\n '\u2078': '8',\n '\u2079': '9',\n '\\u1D2C': 'A',\n '\\u1D2E': 'B',\n '\\u1D30': 'D',\n '\\u1D31': 'E',\n '\\u1D33': 'G',\n '\\u1D34': 'H',\n '\\u1D35': 'I',\n '\\u1D36': 'J',\n '\\u1D37': 'K',\n '\\u1D38': 'L',\n '\\u1D39': 'M',\n '\\u1D3A': 'N',\n '\\u1D3C': 'O',\n '\\u1D3E': 'P',\n '\\u1D3F': 'R',\n '\\u1D40': 'T',\n '\\u1D41': 'U',\n '\\u2C7D': 'V',\n '\\u1D42': 'W',\n '\\u1D43': 'a',\n '\\u1D47': 'b',\n '\\u1D9C': 'c',\n '\\u1D48': 'd',\n '\\u1D49': 'e',\n '\\u1DA0': 'f',\n '\\u1D4D': 'g',\n '\\u02B0': 'h',\n '\\u2071': 'i',\n '\\u02B2': 'j',\n '\\u1D4F': 'k',\n '\\u02E1': 'l',\n '\\u1D50': 'm',\n '\\u207F': 'n',\n '\\u1D52': 'o',\n '\\u1D56': 'p',\n '\\u02B3': 'r',\n '\\u02E2': 's',\n '\\u1D57': 't',\n '\\u1D58': 'u',\n '\\u1D5B': 'v',\n '\\u02B7': 'w',\n '\\u02E3': 'x',\n '\\u02B8': 'y',\n '\\u1DBB': 'z',\n '\\u1D5D': '\u03B2',\n '\\u1D5E': '\u03B3',\n '\\u1D5F': '\u03B4',\n '\\u1D60': '\\u03d5',\n '\\u1D61': '\u03C7',\n '\\u1DBF': '\u03B8'\n});\n\n// Used for Unicode input of calligraphic and script letters\nconst asciiFromScript = Object.freeze({\n \"\\ud835\\udc9c\": \"A\",\n \"\\u212c\": \"B\",\n \"\\ud835\\udc9e\": \"C\",\n \"\\ud835\\udc9f\": \"D\",\n \"\\u2130\": \"E\",\n \"\\u2131\": \"F\",\n \"\\ud835\\udca2\": \"G\",\n \"\\u210B\": \"H\",\n \"\\u2110\": \"I\",\n \"\\ud835\\udca5\": \"J\",\n \"\\ud835\\udca6\": \"K\",\n \"\\u2112\": \"L\",\n \"\\u2133\": \"M\",\n \"\\ud835\\udca9\": \"N\",\n \"\\ud835\\udcaa\": \"O\",\n \"\\ud835\\udcab\": \"P\",\n \"\\ud835\\udcac\": \"Q\",\n \"\\u211B\": \"R\",\n \"\\ud835\\udcae\": \"S\",\n \"\\ud835\\udcaf\": \"T\",\n \"\\ud835\\udcb0\": \"U\",\n \"\\ud835\\udcb1\": \"V\",\n \"\\ud835\\udcb2\": \"W\",\n \"\\ud835\\udcb3\": \"X\",\n \"\\ud835\\udcb4\": \"Y\",\n \"\\ud835\\udcb5\": \"Z\"\n});\n\n// Mapping of Unicode accent characters to their LaTeX equivalent in text and\n// math mode (when they exist).\nvar unicodeAccents = {\n \"\\u0301\": { text: \"\\\\'\", math: \"\\\\acute\" },\n \"\\u0300\": { text: \"\\\\`\", math: \"\\\\grave\" },\n \"\\u0308\": { text: '\\\\\"', math: \"\\\\ddot\" },\n \"\\u0303\": { text: \"\\\\~\", math: \"\\\\tilde\" },\n \"\\u0304\": { text: \"\\\\=\", math: \"\\\\bar\" },\n \"\\u0306\": { text: \"\\\\u\", math: \"\\\\breve\" },\n \"\\u030c\": { text: \"\\\\v\", math: \"\\\\check\" },\n \"\\u0302\": { text: \"\\\\^\", math: \"\\\\hat\" },\n \"\\u0307\": { text: \"\\\\.\", math: \"\\\\dot\" },\n \"\\u030a\": { text: \"\\\\r\", math: \"\\\\mathring\" },\n \"\\u030b\": { text: \"\\\\H\" },\n '\\u0327': { text: '\\\\c' }\n};\n\nvar unicodeSymbols = {\n \"\u00E1\": \"a\u0301\",\n \"\u00E0\": \"a\u0300\",\n \"\u00E4\": \"a\u0308\",\n \"\u01DF\": \"a\u0308\u0304\",\n \"\u00E3\": \"a\u0303\",\n \"\u0101\": \"a\u0304\",\n \"\u0103\": \"a\u0306\",\n \"\u1EAF\": \"a\u0306\u0301\",\n \"\u1EB1\": \"a\u0306\u0300\",\n \"\u1EB5\": \"a\u0306\u0303\",\n \"\u01CE\": \"a\u030C\",\n \"\u00E2\": \"a\u0302\",\n \"\u1EA5\": \"a\u0302\u0301\",\n \"\u1EA7\": \"a\u0302\u0300\",\n \"\u1EAB\": \"a\u0302\u0303\",\n \"\u0227\": \"a\u0307\",\n \"\u01E1\": \"a\u0307\u0304\",\n \"\u00E5\": \"a\u030A\",\n \"\u01FB\": \"a\u030A\u0301\",\n \"\u1E03\": \"b\u0307\",\n \"\u0107\": \"c\u0301\",\n \"\u010D\": \"c\u030C\",\n \"\u0109\": \"c\u0302\",\n \"\u010B\": \"c\u0307\",\n \"\u010F\": \"d\u030C\",\n \"\u1E0B\": \"d\u0307\",\n \"\u00E9\": \"e\u0301\",\n \"\u00E8\": \"e\u0300\",\n \"\u00EB\": \"e\u0308\",\n \"\u1EBD\": \"e\u0303\",\n \"\u0113\": \"e\u0304\",\n \"\u1E17\": \"e\u0304\u0301\",\n \"\u1E15\": \"e\u0304\u0300\",\n \"\u0115\": \"e\u0306\",\n \"\u011B\": \"e\u030C\",\n \"\u00EA\": \"e\u0302\",\n \"\u1EBF\": \"e\u0302\u0301\",\n \"\u1EC1\": \"e\u0302\u0300\",\n \"\u1EC5\": \"e\u0302\u0303\",\n \"\u0117\": \"e\u0307\",\n \"\u1E1F\": \"f\u0307\",\n \"\u01F5\": \"g\u0301\",\n \"\u1E21\": \"g\u0304\",\n \"\u011F\": \"g\u0306\",\n \"\u01E7\": \"g\u030C\",\n \"\u011D\": \"g\u0302\",\n \"\u0121\": \"g\u0307\",\n \"\u1E27\": \"h\u0308\",\n \"\u021F\": \"h\u030C\",\n \"\u0125\": \"h\u0302\",\n \"\u1E23\": \"h\u0307\",\n \"\u00ED\": \"i\u0301\",\n \"\u00EC\": \"i\u0300\",\n \"\u00EF\": \"i\u0308\",\n \"\u1E2F\": \"i\u0308\u0301\",\n \"\u0129\": \"i\u0303\",\n \"\u012B\": \"i\u0304\",\n \"\u012D\": \"i\u0306\",\n \"\u01D0\": \"i\u030C\",\n \"\u00EE\": \"i\u0302\",\n \"\u01F0\": \"j\u030C\",\n \"\u0135\": \"j\u0302\",\n \"\u1E31\": \"k\u0301\",\n \"\u01E9\": \"k\u030C\",\n \"\u013A\": \"l\u0301\",\n \"\u013E\": \"l\u030C\",\n \"\u1E3F\": \"m\u0301\",\n \"\u1E41\": \"m\u0307\",\n \"\u0144\": \"n\u0301\",\n \"\u01F9\": \"n\u0300\",\n \"\u00F1\": \"n\u0303\",\n \"\u0148\": \"n\u030C\",\n \"\u1E45\": \"n\u0307\",\n \"\u00F3\": \"o\u0301\",\n \"\u00F2\": \"o\u0300\",\n \"\u00F6\": \"o\u0308\",\n \"\u022B\": \"o\u0308\u0304\",\n \"\u00F5\": \"o\u0303\",\n \"\u1E4D\": \"o\u0303\u0301\",\n \"\u1E4F\": \"o\u0303\u0308\",\n \"\u022D\": \"o\u0303\u0304\",\n \"\u014D\": \"o\u0304\",\n \"\u1E53\": \"o\u0304\u0301\",\n \"\u1E51\": \"o\u0304\u0300\",\n \"\u014F\": \"o\u0306\",\n \"\u01D2\": \"o\u030C\",\n \"\u00F4\": \"o\u0302\",\n \"\u1ED1\": \"o\u0302\u0301\",\n \"\u1ED3\": \"o\u0302\u0300\",\n \"\u1ED7\": \"o\u0302\u0303\",\n \"\u022F\": \"o\u0307\",\n \"\u0231\": \"o\u0307\u0304\",\n \"\u0151\": \"o\u030B\",\n \"\u1E55\": \"p\u0301\",\n \"\u1E57\": \"p\u0307\",\n \"\u0155\": \"r\u0301\",\n \"\u0159\": \"r\u030C\",\n \"\u1E59\": \"r\u0307\",\n \"\u015B\": \"s\u0301\",\n \"\u1E65\": \"s\u0301\u0307\",\n \"\u0161\": \"s\u030C\",\n \"\u1E67\": \"s\u030C\u0307\",\n \"\u015D\": \"s\u0302\",\n \"\u1E61\": \"s\u0307\",\n \"\u1E97\": \"t\u0308\",\n \"\u0165\": \"t\u030C\",\n \"\u1E6B\": \"t\u0307\",\n \"\u00FA\": \"u\u0301\",\n \"\u00F9\": \"u\u0300\",\n \"\u00FC\": \"u\u0308\",\n \"\u01D8\": \"u\u0308\u0301\",\n \"\u01DC\": \"u\u0308\u0300\",\n \"\u01D6\": \"u\u0308\u0304\",\n \"\u01DA\": \"u\u0308\u030C\",\n \"\u0169\": \"u\u0303\",\n \"\u1E79\": \"u\u0303\u0301\",\n \"\u016B\": \"u\u0304\",\n \"\u1E7B\": \"u\u0304\u0308\",\n \"\u016D\": \"u\u0306\",\n \"\u01D4\": \"u\u030C\",\n \"\u00FB\": \"u\u0302\",\n \"\u016F\": \"u\u030A\",\n \"\u0171\": \"u\u030B\",\n \"\u1E7D\": \"v\u0303\",\n \"\u1E83\": \"w\u0301\",\n \"\u1E81\": \"w\u0300\",\n \"\u1E85\": \"w\u0308\",\n \"\u0175\": \"w\u0302\",\n \"\u1E87\": \"w\u0307\",\n \"\u1E98\": \"w\u030A\",\n \"\u1E8D\": \"x\u0308\",\n \"\u1E8B\": \"x\u0307\",\n \"\u00FD\": \"y\u0301\",\n \"\u1EF3\": \"y\u0300\",\n \"\u00FF\": \"y\u0308\",\n \"\u1EF9\": \"y\u0303\",\n \"\u0233\": \"y\u0304\",\n \"\u0177\": \"y\u0302\",\n \"\u1E8F\": \"y\u0307\",\n \"\u1E99\": \"y\u030A\",\n \"\u017A\": \"z\u0301\",\n \"\u017E\": \"z\u030C\",\n \"\u1E91\": \"z\u0302\",\n \"\u017C\": \"z\u0307\",\n \"\u00C1\": \"A\u0301\",\n \"\u00C0\": \"A\u0300\",\n \"\u00C4\": \"A\u0308\",\n \"\u01DE\": \"A\u0308\u0304\",\n \"\u00C3\": \"A\u0303\",\n \"\u0100\": \"A\u0304\",\n \"\u0102\": \"A\u0306\",\n \"\u1EAE\": \"A\u0306\u0301\",\n \"\u1EB0\": \"A\u0306\u0300\",\n \"\u1EB4\": \"A\u0306\u0303\",\n \"\u01CD\": \"A\u030C\",\n \"\u00C2\": \"A\u0302\",\n \"\u1EA4\": \"A\u0302\u0301\",\n \"\u1EA6\": \"A\u0302\u0300\",\n \"\u1EAA\": \"A\u0302\u0303\",\n \"\u0226\": \"A\u0307\",\n \"\u01E0\": \"A\u0307\u0304\",\n \"\u00C5\": \"A\u030A\",\n \"\u01FA\": \"A\u030A\u0301\",\n \"\u1E02\": \"B\u0307\",\n \"\u0106\": \"C\u0301\",\n \"\u010C\": \"C\u030C\",\n \"\u0108\": \"C\u0302\",\n \"\u010A\": \"C\u0307\",\n \"\u010E\": \"D\u030C\",\n \"\u1E0A\": \"D\u0307\",\n \"\u00C9\": \"E\u0301\",\n \"\u00C8\": \"E\u0300\",\n \"\u00CB\": \"E\u0308\",\n \"\u1EBC\": \"E\u0303\",\n \"\u0112\": \"E\u0304\",\n \"\u1E16\": \"E\u0304\u0301\",\n \"\u1E14\": \"E\u0304\u0300\",\n \"\u0114\": \"E\u0306\",\n \"\u011A\": \"E\u030C\",\n \"\u00CA\": \"E\u0302\",\n \"\u1EBE\": \"E\u0302\u0301\",\n \"\u1EC0\": \"E\u0302\u0300\",\n \"\u1EC4\": \"E\u0302\u0303\",\n \"\u0116\": \"E\u0307\",\n \"\u1E1E\": \"F\u0307\",\n \"\u01F4\": \"G\u0301\",\n \"\u1E20\": \"G\u0304\",\n \"\u011E\": \"G\u0306\",\n \"\u01E6\": \"G\u030C\",\n \"\u011C\": \"G\u0302\",\n \"\u0120\": \"G\u0307\",\n \"\u1E26\": \"H\u0308\",\n \"\u021E\": \"H\u030C\",\n \"\u0124\": \"H\u0302\",\n \"\u1E22\": \"H\u0307\",\n \"\u00CD\": \"I\u0301\",\n \"\u00CC\": \"I\u0300\",\n \"\u00CF\": \"I\u0308\",\n \"\u1E2E\": \"I\u0308\u0301\",\n \"\u0128\": \"I\u0303\",\n \"\u012A\": \"I\u0304\",\n \"\u012C\": \"I\u0306\",\n \"\u01CF\": \"I\u030C\",\n \"\u00CE\": \"I\u0302\",\n \"\u0130\": \"I\u0307\",\n \"\u0134\": \"J\u0302\",\n \"\u1E30\": \"K\u0301\",\n \"\u01E8\": \"K\u030C\",\n \"\u0139\": \"L\u0301\",\n \"\u013D\": \"L\u030C\",\n \"\u1E3E\": \"M\u0301\",\n \"\u1E40\": \"M\u0307\",\n \"\u0143\": \"N\u0301\",\n \"\u01F8\": \"N\u0300\",\n \"\u00D1\": \"N\u0303\",\n \"\u0147\": \"N\u030C\",\n \"\u1E44\": \"N\u0307\",\n \"\u00D3\": \"O\u0301\",\n \"\u00D2\": \"O\u0300\",\n \"\u00D6\": \"O\u0308\",\n \"\u022A\": \"O\u0308\u0304\",\n \"\u00D5\": \"O\u0303\",\n \"\u1E4C\": \"O\u0303\u0301\",\n \"\u1E4E\": \"O\u0303\u0308\",\n \"\u022C\": \"O\u0303\u0304\",\n \"\u014C\": \"O\u0304\",\n \"\u1E52\": \"O\u0304\u0301\",\n \"\u1E50\": \"O\u0304\u0300\",\n \"\u014E\": \"O\u0306\",\n \"\u01D1\": \"O\u030C\",\n \"\u00D4\": \"O\u0302\",\n \"\u1ED0\": \"O\u0302\u0301\",\n \"\u1ED2\": \"O\u0302\u0300\",\n \"\u1ED6\": \"O\u0302\u0303\",\n \"\u022E\": \"O\u0307\",\n \"\u0230\": \"O\u0307\u0304\",\n \"\u0150\": \"O\u030B\",\n \"\u1E54\": \"P\u0301\",\n \"\u1E56\": \"P\u0307\",\n \"\u0154\": \"R\u0301\",\n \"\u0158\": \"R\u030C\",\n \"\u1E58\": \"R\u0307\",\n \"\u015A\": \"S\u0301\",\n \"\u1E64\": \"S\u0301\u0307\",\n \"\u0160\": \"S\u030C\",\n \"\u1E66\": \"S\u030C\u0307\",\n \"\u015C\": \"S\u0302\",\n \"\u1E60\": \"S\u0307\",\n \"\u0164\": \"T\u030C\",\n \"\u1E6A\": \"T\u0307\",\n \"\u00DA\": \"U\u0301\",\n \"\u00D9\": \"U\u0300\",\n \"\u00DC\": \"U\u0308\",\n \"\u01D7\": \"U\u0308\u0301\",\n \"\u01DB\": \"U\u0308\u0300\",\n \"\u01D5\": \"U\u0308\u0304\",\n \"\u01D9\": \"U\u0308\u030C\",\n \"\u0168\": \"U\u0303\",\n \"\u1E78\": \"U\u0303\u0301\",\n \"\u016A\": \"U\u0304\",\n \"\u1E7A\": \"U\u0304\u0308\",\n \"\u016C\": \"U\u0306\",\n \"\u01D3\": \"U\u030C\",\n \"\u00DB\": \"U\u0302\",\n \"\u016E\": \"U\u030A\",\n \"\u0170\": \"U\u030B\",\n \"\u1E7C\": \"V\u0303\",\n \"\u1E82\": \"W\u0301\",\n \"\u1E80\": \"W\u0300\",\n \"\u1E84\": \"W\u0308\",\n \"\u0174\": \"W\u0302\",\n \"\u1E86\": \"W\u0307\",\n \"\u1E8C\": \"X\u0308\",\n \"\u1E8A\": \"X\u0307\",\n \"\u00DD\": \"Y\u0301\",\n \"\u1EF2\": \"Y\u0300\",\n \"\u0178\": \"Y\u0308\",\n \"\u1EF8\": \"Y\u0303\",\n \"\u0232\": \"Y\u0304\",\n \"\u0176\": \"Y\u0302\",\n \"\u1E8E\": \"Y\u0307\",\n \"\u0179\": \"Z\u0301\",\n \"\u017D\": \"Z\u030C\",\n \"\u1E90\": \"Z\u0302\",\n \"\u017B\": \"Z\u0307\",\n \"\u03AC\": \"\u03B1\u0301\",\n \"\u1F70\": \"\u03B1\u0300\",\n \"\u1FB1\": \"\u03B1\u0304\",\n \"\u1FB0\": \"\u03B1\u0306\",\n \"\u03AD\": \"\u03B5\u0301\",\n \"\u1F72\": \"\u03B5\u0300\",\n \"\u03AE\": \"\u03B7\u0301\",\n \"\u1F74\": \"\u03B7\u0300\",\n \"\u03AF\": \"\u03B9\u0301\",\n \"\u1F76\": \"\u03B9\u0300\",\n \"\u03CA\": \"\u03B9\u0308\",\n \"\u0390\": \"\u03B9\u0308\u0301\",\n \"\u1FD2\": \"\u03B9\u0308\u0300\",\n \"\u1FD1\": \"\u03B9\u0304\",\n \"\u1FD0\": \"\u03B9\u0306\",\n \"\u03CC\": \"\u03BF\u0301\",\n \"\u1F78\": \"\u03BF\u0300\",\n \"\u03CD\": \"\u03C5\u0301\",\n \"\u1F7A\": \"\u03C5\u0300\",\n \"\u03CB\": \"\u03C5\u0308\",\n \"\u03B0\": \"\u03C5\u0308\u0301\",\n \"\u1FE2\": \"\u03C5\u0308\u0300\",\n \"\u1FE1\": \"\u03C5\u0304\",\n \"\u1FE0\": \"\u03C5\u0306\",\n \"\u03CE\": \"\u03C9\u0301\",\n \"\u1F7C\": \"\u03C9\u0300\",\n \"\u038E\": \"\u03A5\u0301\",\n \"\u1FEA\": \"\u03A5\u0300\",\n \"\u03AB\": \"\u03A5\u0308\",\n \"\u1FE9\": \"\u03A5\u0304\",\n \"\u1FE8\": \"\u03A5\u0306\",\n \"\u038F\": \"\u03A9\u0301\",\n \"\u1FFA\": \"\u03A9\u0300\"\n};\n\n/* eslint no-constant-condition:0 */\n\nconst binLeftCancellers = [\"bin\", \"op\", \"open\", \"punct\", \"rel\"];\nconst sizeRegEx = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/;\n\n/**\n * This file contains the parser used to parse out a TeX expression from the\n * input. Since TeX isn't context-free, standard parsers don't work particularly\n * well.\n *\n * The strategy of this parser is as such:\n *\n * The main functions (the `.parse...` ones) take a position in the current\n * parse string to parse tokens from. The lexer (found in Lexer.js, stored at\n * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When\n * individual tokens are needed at a position, the lexer is called to pull out a\n * token, which is then used.\n *\n * The parser has a property called \"mode\" indicating the mode that\n * the parser is currently in. Currently it has to be one of \"math\" or\n * \"text\", which denotes whether the current environment is a math-y\n * one or a text-y one (e.g. inside \\text). Currently, this serves to\n * limit the functions which can be used in text mode.\n *\n * The main functions then return an object which contains the useful data that\n * was parsed at its given point, and a new position at the end of the parsed\n * data. The main functions can call each other and continue the parsing by\n * using the returned position as a new starting point.\n *\n * There are also extra `.handle...` functions, which pull out some reused\n * functionality into self-contained functions.\n *\n * The functions return ParseNodes.\n */\n\nclass Parser {\n constructor(input, settings, isPreamble = false) {\n // Start in math mode\n this.mode = \"math\";\n // Create a new macro expander (gullet) and (indirectly via that) also a\n // new lexer (mouth) for this parser (stomach, in the language of TeX)\n this.gullet = new MacroExpander(input, settings, this.mode);\n // Store the settings for use in parsing\n this.settings = settings;\n // Are we defining a preamble?\n this.isPreamble = isPreamble;\n // Count leftright depth (for \\middle errors)\n this.leftrightDepth = 0;\n this.prevAtomType = \"\";\n }\n\n /**\n * Checks a result to make sure it has the right type, and throws an\n * appropriate error otherwise.\n */\n expect(text, consume = true) {\n if (this.fetch().text !== text) {\n throw new ParseError(`Expected '$text}', got '$this.fetch().text}'`, this.fetch());\n }\n if (consume) {\n this.consume();\n }\n }\n\n /**\n * Discards the current lookahead token, considering it consumed.\n */\n consume() {\n this.nextToken = null;\n }\n\n /**\n * Return the current lookahead token, or if there isn't one (at the\n * beginning, or if the previous lookahead token was consume()d),\n * fetch the next token as the new lookahead token and return it.\n */\n fetch() {\n if (this.nextToken == null) {\n this.nextToken = this.gullet.expandNextToken();\n }\n return this.nextToken;\n }\n\n /**\n * Switches between \"text\" and \"math\" modes.\n */\n switchMode(newMode) {\n this.mode = newMode;\n this.gullet.switchMode(newMode);\n }\n\n /**\n * Main parsing function, which parses an entire input.\n */\n parse() {\n // Create a group namespace for every $...$, $$...$$, \\[...\\].)\n // A \\def is then valid only within that pair of delimiters.\n this.gullet.beginGroup();\n\n if (this.settings.colorIsTextColor) {\n // Use old \\color behavior (same as LaTeX's \\textcolor) if requested.\n // We do this within the group for the math expression, so it doesn't\n // pollute settings.macros.\n this.gullet.macros.set(\"\\\\color\", \"\\\\textcolor\");\n }\n\n // Try to parse the input\n const parse = this.parseExpression(false);\n\n // If we succeeded, make sure there's an EOF at the end\n this.expect(\"EOF\");\n\n if (this.isPreamble) {\n const macros = Object.create(null);\n Object.entries(this.gullet.macros.current).forEach(([key, value]) => {\n macros[key] = value;\n });\n this.gullet.endGroup();\n return macros\n }\n\n // The only local macro that we want to save is from \\tag.\n const tag = this.gullet.macros.get(\"\\\\df@tag\");\n\n // End the group namespace for the expression\n this.gullet.endGroup();\n\n if (tag) { this.gullet.macros.current[\"\\\\df@tag\"] = tag; }\n\n return parse;\n }\n\n static get endOfExpression() {\n return [\"}\", \"\\\\endgroup\", \"\\\\end\", \"\\\\right\", \"\\\\endtoggle\", \"&\"];\n }\n\n /**\n * Fully parse a separate sequence of tokens as a separate job.\n * Tokens should be specified in reverse order, as in a MacroDefinition.\n */\n subparse(tokens) {\n // Save the next token from the current job.\n const oldToken = this.nextToken;\n this.consume();\n\n // Run the new job, terminating it with an excess '}'\n this.gullet.pushToken(new Token(\"}\"));\n this.gullet.pushTokens(tokens);\n const parse = this.parseExpression(false);\n this.expect(\"}\");\n\n // Restore the next token from the current job.\n this.nextToken = oldToken;\n\n return parse;\n }\n\n/**\n * Parses an \"expression\", which is a list of atoms.\n *\n * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This\n * happens when functions have higher precedence han infix\n * nodes in implicit parses.\n *\n * `breakOnTokenText`: The text of the token that the expression should end\n * with, or `null` if something else should end the\n * expression.\n *\n * `breakOnMiddle`: \\color, \\over, and old styling functions work on an implicit group.\n * These groups end just before the usual tokens, but they also\n * end just before `\\middle`.\n */\n parseExpression(breakOnInfix, breakOnTokenText, breakOnMiddle) {\n const body = [];\n this.prevAtomType = \"\";\n // Keep adding atoms to the body until we can't parse any more atoms (either\n // we reached the end, a }, or a \\right)\n while (true) {\n // Ignore spaces in math mode\n if (this.mode === \"math\") {\n this.consumeSpaces();\n }\n const lex = this.fetch();\n if (Parser.endOfExpression.indexOf(lex.text) !== -1) {\n break;\n }\n if (breakOnTokenText && lex.text === breakOnTokenText) {\n break;\n }\n if (breakOnMiddle && lex.text === \"\\\\middle\") {\n break\n }\n if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) {\n break;\n }\n const atom = this.parseAtom(breakOnTokenText);\n if (!atom) {\n break;\n } else if (atom.type === \"internal\") {\n continue;\n }\n body.push(atom);\n // Keep a record of the atom type, so that op.js can set correct spacing.\n this.prevAtomType = atom.type === \"atom\" ? atom.family : atom.type;\n }\n if (this.mode === \"text\") {\n this.formLigatures(body);\n }\n return this.handleInfixNodes(body);\n }\n\n /**\n * Rewrites infix operators such as \\over with corresponding commands such\n * as \\frac.\n *\n * There can only be one infix operator per group. If there's more than one\n * then the expression is ambiguous. This can be resolved by adding {}.\n */\n handleInfixNodes(body) {\n let overIndex = -1;\n let funcName;\n\n for (let i = 0; i < body.length; i++) {\n if (body[i].type === \"infix\") {\n if (overIndex !== -1) {\n throw new ParseError(\"only one infix operator per group\", body[i].token);\n }\n overIndex = i;\n funcName = body[i].replaceWith;\n }\n }\n\n if (overIndex !== -1 && funcName) {\n let numerNode;\n let denomNode;\n\n const numerBody = body.slice(0, overIndex);\n const denomBody = body.slice(overIndex + 1);\n\n if (numerBody.length === 1 && numerBody[0].type === \"ordgroup\") {\n numerNode = numerBody[0];\n } else {\n numerNode = { type: \"ordgroup\", mode: this.mode, body: numerBody };\n }\n\n if (denomBody.length === 1 && denomBody[0].type === \"ordgroup\") {\n denomNode = denomBody[0];\n } else {\n denomNode = { type: \"ordgroup\", mode: this.mode, body: denomBody };\n }\n\n let node;\n if (funcName === \"\\\\\\\\abovefrac\") {\n node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []);\n } else {\n node = this.callFunction(funcName, [numerNode, denomNode], []);\n }\n return [node];\n } else {\n return body;\n }\n }\n\n /**\n * Handle a subscript or superscript with nice errors.\n */\n handleSupSubscript(\n name // For error reporting.\n ) {\n const symbolToken = this.fetch();\n const symbol = symbolToken.text;\n this.consume();\n this.consumeSpaces(); // ignore spaces before sup/subscript argument\n const group = this.parseGroup(name);\n\n if (!group) {\n throw new ParseError(\"Expected group after '\" + symbol + \"'\", symbolToken);\n }\n\n return group;\n }\n\n /**\n * Converts the textual input of an unsupported command into a text node\n * contained within a color node whose color is determined by errorColor\n */\n formatUnsupportedCmd(text) {\n const textordArray = [];\n\n for (let i = 0; i < text.length; i++) {\n textordArray.push({ type: \"textord\", mode: \"text\", text: text[i] });\n }\n\n const textNode = {\n type: \"text\",\n mode: this.mode,\n body: textordArray\n };\n\n const colorNode = {\n type: \"color\",\n mode: this.mode,\n color: this.settings.errorColor,\n body: [textNode]\n };\n\n return colorNode;\n }\n\n /**\n * Parses a group with optional super/subscripts.\n */\n parseAtom(breakOnTokenText) {\n // The body of an atom is an implicit group, so that things like\n // \\left(x\\right)^2 work correctly.\n const base = this.parseGroup(\"atom\", breakOnTokenText);\n\n // In text mode, we don't have superscripts or subscripts\n if (this.mode === \"text\") {\n return base;\n }\n\n // Note that base may be empty (i.e. null) at this point.\n\n let superscript;\n let subscript;\n while (true) {\n // Guaranteed in math mode, so eat any spaces first.\n this.consumeSpaces();\n\n // Lex the first token\n const lex = this.fetch();\n\n if (lex.text === \"\\\\limits\" || lex.text === \"\\\\nolimits\") {\n // We got a limit control\n if (base && base.type === \"op\") {\n const limits = lex.text === \"\\\\limits\";\n base.limits = limits;\n base.alwaysHandleSupSub = true;\n } else if (base && base.type === \"operatorname\") {\n if (base.alwaysHandleSupSub) {\n base.limits = lex.text === \"\\\\limits\";\n }\n } else {\n throw new ParseError(\"Limit controls must follow a math operator\", lex);\n }\n this.consume();\n } else if (lex.text === \"^\") {\n // We got a superscript start\n if (superscript) {\n throw new ParseError(\"Double superscript\", lex);\n }\n superscript = this.handleSupSubscript(\"superscript\");\n } else if (lex.text === \"_\") {\n // We got a subscript start\n if (subscript) {\n throw new ParseError(\"Double subscript\", lex);\n }\n subscript = this.handleSupSubscript(\"subscript\");\n } else if (lex.text === \"'\") {\n // We got a prime\n if (superscript) {\n throw new ParseError(\"Double superscript\", lex);\n }\n const prime = { type: \"textord\", mode: this.mode, text: \"\\\\prime\" };\n\n // Many primes can be grouped together, so we handle this here\n const primes = [prime];\n this.consume();\n // Keep lexing tokens until we get something that's not a prime\n while (this.fetch().text === \"'\") {\n // For each one, add another prime to the list\n primes.push(prime);\n this.consume();\n }\n // If there's a superscript following the primes, combine that\n // superscript in with the primes.\n if (this.fetch().text === \"^\") {\n primes.push(this.handleSupSubscript(\"superscript\"));\n }\n // Put everything into an ordgroup as the superscript\n superscript = { type: \"ordgroup\", mode: this.mode, body: primes };\n } else if (uSubsAndSups[lex.text]) {\n // A Unicode subscript or superscript character.\n // We treat these similarly to the unicode-math package.\n // So we render a string of Unicode (sub|super)scripts the\n // same as a (sub|super)script of regular characters.\n const isSub = unicodeSubRegEx.test(lex.text);\n const subsupTokens = [];\n subsupTokens.push(new Token(uSubsAndSups[lex.text]));\n this.consume();\n // Continue fetching tokens to fill out the group.\n while (true) {\n const token = this.fetch().text;\n if (!(uSubsAndSups[token])) { break }\n if (unicodeSubRegEx.test(token) !== isSub) { break }\n subsupTokens.unshift(new Token(uSubsAndSups[token]));\n this.consume();\n }\n // Now create a (sub|super)script.\n const body = this.subparse(subsupTokens);\n if (isSub) {\n subscript = { type: \"ordgroup\", mode: \"math\", body };\n } else {\n superscript = { type: \"ordgroup\", mode: \"math\", body };\n }\n } else {\n // If it wasn't ^, _, a Unicode (sub|super)script, or ', stop parsing super/subscripts\n break;\n }\n }\n\n if (superscript || subscript) {\n if (base && base.type === \"multiscript\" && !base.postscripts) {\n // base is the result of a \\prescript function.\n // Write the sub- & superscripts into the multiscript element.\n base.postscripts = { sup: superscript, sub: subscript };\n return base\n } else {\n // We got either a superscript or subscript, create a supsub\n const isFollowedByDelimiter = (!base || base.type !== \"op\" && base.type !== \"operatorname\")\n ? undefined\n : isDelimiter(this.nextToken.text);\n return {\n type: \"supsub\",\n mode: this.mode,\n base: base,\n sup: superscript,\n sub: subscript,\n isFollowedByDelimiter\n }\n }\n } else {\n // Otherwise return the original body\n return base;\n }\n }\n\n /**\n * Parses an entire function, including its base and all of its arguments.\n */\n parseFunction(\n breakOnTokenText,\n name // For determining its context\n ) {\n const token = this.fetch();\n const func = token.text;\n const funcData = functions[func];\n if (!funcData) {\n return null;\n }\n this.consume(); // consume command token\n\n if (name && name !== \"atom\" && !funcData.allowedInArgument) {\n throw new ParseError(\n \"Got function '\" + func + \"' with no arguments\" + (name ? \" as \" + name : \"\"),\n token\n );\n } else if (this.mode === \"text\" && !funcData.allowedInText) {\n throw new ParseError(\"Can't use function '\" + func + \"' in text mode\", token);\n } else if (this.mode === \"math\" && funcData.allowedInMath === false) {\n throw new ParseError(\"Can't use function '\" + func + \"' in math mode\", token);\n }\n\n const prevAtomType = this.prevAtomType;\n const { args, optArgs } = this.parseArguments(func, funcData);\n this.prevAtomType = prevAtomType;\n return this.callFunction(func, args, optArgs, token, breakOnTokenText);\n }\n\n /**\n * Call a function handler with a suitable context and arguments.\n */\n callFunction(name, args, optArgs, token, breakOnTokenText) {\n const context = {\n funcName: name,\n parser: this,\n token,\n breakOnTokenText\n };\n const func = functions[name];\n if (func && func.handler) {\n return func.handler(context, args, optArgs);\n } else {\n throw new ParseError(`No function handler for $name}`);\n }\n }\n\n /**\n * Parses the arguments of a function or environment\n */\n parseArguments(\n func, // Should look like \"\\name\" or \"\\begin{name}\".\n funcData\n ) {\n const totalArgs = funcData.numArgs + funcData.numOptionalArgs;\n if (totalArgs === 0) {\n return { args: [], optArgs: [] };\n }\n\n const args = [];\n const optArgs = [];\n\n for (let i = 0; i < totalArgs; i++) {\n let argType = funcData.argTypes && funcData.argTypes[i];\n const isOptional = i < funcData.numOptionalArgs;\n\n if (\n (funcData.primitive && argType == null) ||\n // \\sqrt expands into primitive if optional argument doesn't exist\n (funcData.type === \"sqrt\" && i === 1 && optArgs[0] == null)\n ) {\n argType = \"primitive\";\n }\n\n const arg = this.parseGroupOfType(`argument to '$func}'`, argType, isOptional);\n if (isOptional) {\n optArgs.push(arg);\n } else if (arg != null) {\n args.push(arg);\n } else {\n // should be unreachable\n throw new ParseError(\"Null argument, please report this as a bug\");\n }\n }\n\n return { args, optArgs };\n }\n\n /**\n * Parses a group when the mode is changing.\n */\n parseGroupOfType(name, type, optional) {\n switch (type) {\n case \"size\":\n return this.parseSizeGroup(optional);\n case \"url\":\n return this.parseUrlGroup(optional);\n case \"math\":\n case \"text\":\n return this.parseArgumentGroup(optional, type);\n case \"hbox\": {\n // hbox argument type wraps the argument in the equivalent of\n // \\hbox, which is like \\text but switching to \\textstyle size.\n const group = this.parseArgumentGroup(optional, \"text\");\n return group != null\n ? {\n type: \"styling\",\n mode: group.mode,\n body: [group],\n scriptLevel: \"text\" // simulate \\textstyle\n }\n : null;\n }\n case \"raw\": {\n const token = this.parseStringGroup(\"raw\", optional);\n return token != null\n ? {\n type: \"raw\",\n mode: \"text\",\n string: token.text\n }\n : null;\n }\n case \"primitive\": {\n if (optional) {\n throw new ParseError(\"A primitive argument cannot be optional\");\n }\n const group = this.parseGroup(name);\n if (group == null) {\n throw new ParseError(\"Expected group as \" + name, this.fetch());\n }\n return group;\n }\n case \"original\":\n case null:\n case undefined:\n return this.parseArgumentGroup(optional);\n default:\n throw new ParseError(\"Unknown group type as \" + name, this.fetch());\n }\n }\n\n /**\n * Discard any space tokens, fetching the next non-space token.\n */\n consumeSpaces() {\n while (true) {\n const ch = this.fetch().text;\n // \\ufe0e is the Unicode variation selector to supress emoji. Ignore it.\n if (ch === \" \" || ch === \"\\u00a0\" || ch === \"\\ufe0e\") {\n this.consume();\n } else {\n break\n }\n }\n }\n\n /**\n * Parses a group, essentially returning the string formed by the\n * brace-enclosed tokens plus some position information.\n */\n parseStringGroup(\n modeName, // Used to describe the mode in error messages.\n optional\n ) {\n const argToken = this.gullet.scanArgument(optional);\n if (argToken == null) {\n return null;\n }\n let str = \"\";\n let nextToken;\n while ((nextToken = this.fetch()).text !== \"EOF\") {\n str += nextToken.text;\n this.consume();\n }\n this.consume(); // consume the end of the argument\n argToken.text = str;\n return argToken;\n }\n\n /**\n * Parses a regex-delimited group: the largest sequence of tokens\n * whose concatenated strings match `regex`. Returns the string\n * formed by the tokens plus some position information.\n */\n parseRegexGroup(\n regex,\n modeName // Used to describe the mode in error messages.\n ) {\n const firstToken = this.fetch();\n let lastToken = firstToken;\n let str = \"\";\n let nextToken;\n while ((nextToken = this.fetch()).text !== \"EOF\" && regex.test(str + nextToken.text)) {\n lastToken = nextToken;\n str += lastToken.text;\n this.consume();\n }\n if (str === \"\") {\n throw new ParseError(\"Invalid \" + modeName + \": '\" + firstToken.text + \"'\", firstToken);\n }\n return firstToken.range(lastToken, str);\n }\n\n /**\n * Parses a size specification, consisting of magnitude and unit.\n */\n parseSizeGroup(optional) {\n let res;\n let isBlank = false;\n // don't expand before parseStringGroup\n this.gullet.consumeSpaces();\n if (!optional && this.gullet.future().text !== \"{\") {\n res = this.parseRegexGroup(/^[-+]? *(?:$|\\d+|\\d+\\.\\d*|\\.\\d*) *[a-z]{0,2} *$/, \"size\");\n } else {\n res = this.parseStringGroup(\"size\", optional);\n }\n if (!res) {\n return null;\n }\n if (!optional && res.text.length === 0) {\n // Because we've tested for what is !optional, this block won't\n // affect \\kern, \\hspace, etc. It will capture the mandatory arguments\n // to \\genfrac and \\above.\n res.text = \"0pt\"; // Enable \\above{}\n isBlank = true; // This is here specifically for \\genfrac\n }\n const match = sizeRegEx.exec(res.text);\n if (!match) {\n throw new ParseError(\"Invalid size: '\" + res.text + \"'\", res);\n }\n const data = {\n number: +(match[1] + match[2]), // sign + magnitude, cast to number\n unit: match[3]\n };\n if (!validUnit(data)) {\n throw new ParseError(\"Invalid unit: '\" + data.unit + \"'\", res);\n }\n return {\n type: \"size\",\n mode: this.mode,\n value: data,\n isBlank\n };\n }\n\n /**\n * Parses an URL, checking escaped letters and allowed protocols,\n * and setting the catcode of % as an active character (as in \\hyperref).\n */\n parseUrlGroup(optional) {\n this.gullet.lexer.setCatcode(\"%\", 13); // active character\n this.gullet.lexer.setCatcode(\"~\", 12); // other character\n const res = this.parseStringGroup(\"url\", optional);\n this.gullet.lexer.setCatcode(\"%\", 14); // comment character\n this.gullet.lexer.setCatcode(\"~\", 13); // active character\n if (res == null) {\n return null;\n }\n // hyperref package allows backslashes alone in href, but doesn't\n // generate valid links in such cases; we interpret this as\n // \"undefined\" behaviour, and keep them as-is. Some browser will\n // replace backslashes with forward slashes.\n let url = res.text.replace(/\\\\([#$%&~_^{}])/g, \"$1\");\n url = res.text.replace(/{\\u2044}/g, \"/\");\n return {\n type: \"url\",\n mode: this.mode,\n url\n };\n }\n\n /**\n * Parses an argument with the mode specified.\n */\n parseArgumentGroup(optional, mode) {\n const argToken = this.gullet.scanArgument(optional);\n if (argToken == null) {\n return null;\n }\n const outerMode = this.mode;\n if (mode) {\n // Switch to specified mode\n this.switchMode(mode);\n }\n\n this.gullet.beginGroup();\n const expression = this.parseExpression(false, \"EOF\");\n // TODO: find an alternative way to denote the end\n this.expect(\"EOF\"); // expect the end of the argument\n this.gullet.endGroup();\n const result = {\n type: \"ordgroup\",\n mode: this.mode,\n loc: argToken.loc,\n body: expression\n };\n\n if (mode) {\n // Switch mode back\n this.switchMode(outerMode);\n }\n return result;\n }\n\n /**\n * Parses an ordinary group, which is either a single nucleus (like \"x\")\n * or an expression in braces (like \"{x+y}\") or an implicit group, a group\n * that starts at the current position, and ends right before a higher explicit\n * group ends, or at EOF.\n */\n parseGroup(\n name, // For error reporting.\n breakOnTokenText\n ) {\n const firstToken = this.fetch();\n const text = firstToken.text;\n\n let result;\n // Try to parse an open brace or \\begingroup\n if (text === \"{\" || text === \"\\\\begingroup\" || text === \"\\\\toggle\") {\n this.consume();\n const groupEnd = text === \"{\"\n ? \"}\"\n : text === \"\\\\begingroup\"\n ? \"\\\\endgroup\"\n : \"\\\\endtoggle\";\n\n this.gullet.beginGroup();\n // If we get a brace, parse an expression\n const expression = this.parseExpression(false, groupEnd);\n const lastToken = this.fetch();\n this.expect(groupEnd); // Check that we got a matching closing brace\n this.gullet.endGroup();\n result = {\n type: (lastToken.text === \"\\\\endtoggle\" ? \"toggle\" : \"ordgroup\"),\n mode: this.mode,\n loc: SourceLocation.range(firstToken, lastToken),\n body: expression,\n // A group formed by \\begingroup...\\endgroup is a semi-simple group\n // which doesn't affect spacing in math mode, i.e., is transparent.\n // https://tex.stackexchange.com/questions/1930/\n semisimple: text === \"\\\\begingroup\" || undefined\n };\n } else {\n // If there exists a function with this name, parse the function.\n // Otherwise, just return a nucleus\n result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol();\n if (result == null && text[0] === \"\\\\\" &&\n !Object.prototype.hasOwnProperty.call(implicitCommands, text )) {\n result = this.formatUnsupportedCmd(text);\n this.consume();\n }\n }\n return result;\n }\n\n /**\n * Form ligature-like combinations of characters for text mode.\n * This includes inputs like \"--\", \"---\", \"``\" and \"''\".\n * The result will simply replace multiple textord nodes with a single\n * character in each value by a single textord node having multiple\n * characters in its value. The representation is still ASCII source.\n * The group will be modified in place.\n */\n formLigatures(group) {\n let n = group.length - 1;\n for (let i = 0; i < n; ++i) {\n const a = group[i];\n const v = a.text;\n if (v === \"-\" && group[i + 1].text === \"-\") {\n if (i + 1 < n && group[i + 2].text === \"-\") {\n group.splice(i, 3, {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(a, group[i + 2]),\n text: \"---\"\n });\n n -= 2;\n } else {\n group.splice(i, 2, {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(a, group[i + 1]),\n text: \"--\"\n });\n n -= 1;\n }\n }\n if ((v === \"'\" || v === \"`\") && group[i + 1].text === v) {\n group.splice(i, 2, {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(a, group[i + 1]),\n text: v + v\n });\n n -= 1;\n }\n }\n }\n\n /**\n * Parse a single symbol out of the string. Here, we handle single character\n * symbols and special functions like \\verb.\n */\n parseSymbol() {\n const nucleus = this.fetch();\n let text = nucleus.text;\n\n if (/^\\\\verb[^a-zA-Z]/.test(text)) {\n this.consume();\n let arg = text.slice(5);\n const star = arg.charAt(0) === \"*\";\n if (star) {\n arg = arg.slice(1);\n }\n // Lexer's tokenRegex is constructed to always have matching\n // first/last characters.\n if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) {\n throw new ParseError(`\\\\verb assertion failed --\n please report what input caused this bug`);\n }\n arg = arg.slice(1, -1); // remove first and last char\n return {\n type: \"verb\",\n mode: \"text\",\n body: arg,\n star\n };\n }\n // At this point, we should have a symbol, possibly with accents.\n // First expand any accented base symbol according to unicodeSymbols.\n if (Object.prototype.hasOwnProperty.call(unicodeSymbols, text[0]) &&\n this.mode === \"math\" && !symbols[this.mode][text[0]]) {\n // This behavior is not strict (XeTeX-compatible) in math mode.\n if (this.settings.strict && this.mode === \"math\") {\n throw new ParseError(`Accented Unicode text character \"$text[0]}\" used in ` + `math mode`,\n nucleus\n );\n }\n text = unicodeSymbols[text[0]] + text.slice(1);\n }\n // Strip off any combining characters\n const match = this.mode === \"math\"\n ? combiningDiacriticalMarksEndRegex.exec(text)\n : null;\n if (match) {\n text = text.substring(0, match.index);\n if (text === \"i\") {\n text = \"\\u0131\"; // dotless i, in math and text mode\n } else if (text === \"j\") {\n text = \"\\u0237\"; // dotless j, in math and text mode\n }\n }\n // Recognize base symbol\n let symbol;\n if (symbols[this.mode][text]) {\n let group = symbols[this.mode][text].group;\n if (group === \"bin\" && binLeftCancellers.includes(this.prevAtomType)) {\n // Change from a binary operator to a unary (prefix) operator\n group = \"open\";\n }\n const loc = SourceLocation.range(nucleus);\n let s;\n if (Object.prototype.hasOwnProperty.call(ATOMS, group )) {\n const family = group;\n s = {\n type: \"atom\",\n mode: this.mode,\n family,\n loc,\n text\n };\n } else {\n if (asciiFromScript[text]) {\n // Unicode 14 disambiguates chancery from roundhand.\n // See https://www.unicode.org/charts/PDF/U1D400.pdf\n this.consume();\n const nextCode = this.fetch().text.charCodeAt(0);\n // mathcal is Temml default. Use mathscript if called for.\n const font = nextCode === 0xfe01 ? \"mathscr\" : \"mathcal\";\n if (nextCode === 0xfe00 || nextCode === 0xfe01) { this.consume(); }\n return {\n type: \"font\",\n mode: \"math\",\n font,\n body: { type: \"mathord\", mode: \"math\", loc, text: asciiFromScript[text] }\n }\n }\n // Default ord character. No disambiguation necessary.\n s = {\n type: group,\n mode: this.mode,\n loc,\n text\n };\n }\n symbol = s;\n } else if (text.charCodeAt(0) >= 0x80 || combiningDiacriticalMarksEndRegex.exec(text)) {\n // no symbol for e.g. ^\n if (this.settings.strict && this.mode === \"math\") {\n throw new ParseError(`Unicode text character \"$text[0]}\" used in math mode`, nucleus)\n }\n // All nonmathematical Unicode characters are rendered as if they\n // are in text mode (wrapped in \\text) because that's what it\n // takes to render them in LaTeX.\n symbol = {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(nucleus),\n text\n };\n } else {\n return null; // EOF, ^, _, {, }, etc.\n }\n this.consume();\n // Transform combining characters into accents\n if (match) {\n for (let i = 0; i < match[0].length; i++) {\n const accent = match[0][i];\n if (!unicodeAccents[accent]) {\n throw new ParseError(`Unknown accent ' $accent}'`, nucleus);\n }\n const command = unicodeAccents[accent][this.mode] ||\n unicodeAccents[accent].text;\n if (!command) {\n throw new ParseError(`Accent $accent} unsupported in $this.mode} mode`, nucleus);\n }\n symbol = {\n type: \"accent\",\n mode: this.mode,\n loc: SourceLocation.range(nucleus),\n label: command,\n isStretchy: false,\n base: symbol\n };\n }\n }\n return symbol;\n }\n}\n\n/**\n * Parses an expression using a Parser, then returns the parsed result.\n */\nconst parseTree = function(toParse, settings) {\n if (!(typeof toParse === \"string\" || toParse instanceof String)) {\n throw new TypeError(\"Temml can only parse string typed expression\")\n }\n const parser = new Parser(toParse, settings);\n // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n delete parser.gullet.macros.current[\"\\\\df@tag\"];\n\n let tree = parser.parse();\n\n // LaTeX ignores a \\tag placed outside an AMS environment.\n if (!(tree.length > 0 && tree[0].type && tree[0].type === \"array\" && tree[0].addEqnNum)) {\n // If the input used \\tag, it will set the \\df@tag macro to the tag.\n // In this case, we separately parse the tag and wrap the tree.\n if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n if (!settings.displayMode) {\n throw new ParseError(\"\\\\tag works only in display mode\")\n }\n parser.gullet.feed(\"\\\\df@tag\");\n tree = [\n {\n type: \"tag\",\n mode: \"text\",\n body: tree,\n tag: parser.parse()\n }\n ];\n }\n }\n\n return tree\n};\n\n/**\n * This file contains information about the style that the mathmlBuilder carries\n * around with it. Data is held in an `Style` object, and when\n * recursing, a new `Style` object can be created with the `.with*` functions.\n */\n\nconst subOrSupLevel = [2, 2, 3, 3];\n\n/**\n * This is the main Style class. It contains the current style.level, color, and font.\n *\n * Style objects should not be modified. To create a new Style with\n * different properties, call a `.with*` method.\n */\nclass Style {\n constructor(data) {\n // Style.level can be 0 | 1 | 2 | 3, which correspond to\n // displaystyle, textstyle, scriptstyle, and scriptscriptstyle.\n // style.level usually does not directly set MathML's script level. MathML does that itself.\n // However, Chromium does not stop shrinking after scriptscriptstyle, so we do explicitly\n // set a scriptlevel attribute in those conditions.\n // We also use style.level to track math style so that we can get the correct\n // scriptlevel when needed in supsub.js, mathchoice.js, or for dimensions in em.\n this.level = data.level;\n this.color = data.color; // string | void\n // A font family applies to a group of fonts (i.e. SansSerif), while a font\n // represents a specific font (i.e. SansSerif Bold).\n // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm\n this.font = data.font || \"\"; // string\n this.fontFamily = data.fontFamily || \"\"; // string\n this.fontSize = data.fontSize || 1.0; // number\n this.fontWeight = data.fontWeight || \"\";\n this.fontShape = data.fontShape || \"\";\n this.maxSize = data.maxSize; // [number, number]\n }\n\n /**\n * Returns a new style object with the same properties as \"this\". Properties\n * from \"extension\" will be copied to the new style object.\n */\n extend(extension) {\n const data = {\n level: this.level,\n color: this.color,\n font: this.font,\n fontFamily: this.fontFamily,\n fontSize: this.fontSize,\n fontWeight: this.fontWeight,\n fontShape: this.fontShape,\n maxSize: this.maxSize\n };\n\n for (const key in extension) {\n if (Object.prototype.hasOwnProperty.call(extension, key)) {\n data[key] = extension[key];\n }\n }\n\n return new Style(data);\n }\n\n withLevel(n) {\n return this.extend({\n level: n\n });\n }\n\n incrementLevel() {\n return this.extend({\n level: Math.min(this.level + 1, 3)\n });\n }\n\n inSubOrSup() {\n return this.extend({\n level: subOrSupLevel[this.level]\n })\n }\n\n /**\n * Create a new style object with the given color.\n */\n withColor(color) {\n return this.extend({\n color: color\n });\n }\n\n /**\n * Creates a new style object with the given math font or old text font.\n * @type {[type]}\n */\n withFont(font) {\n return this.extend({\n font\n });\n }\n\n /**\n * Create a new style objects with the given fontFamily.\n */\n withTextFontFamily(fontFamily) {\n return this.extend({\n fontFamily,\n font: \"\"\n });\n }\n\n /**\n * Creates a new style object with the given font size\n */\n withFontSize(num) {\n return this.extend({\n fontSize: num\n });\n }\n\n /**\n * Creates a new style object with the given font weight\n */\n withTextFontWeight(fontWeight) {\n return this.extend({\n fontWeight,\n font: \"\"\n });\n }\n\n /**\n * Creates a new style object with the given font weight\n */\n withTextFontShape(fontShape) {\n return this.extend({\n fontShape,\n font: \"\"\n });\n }\n\n /**\n * Gets the CSS color of the current style object\n */\n getColor() {\n return this.color;\n }\n}\n\n/* Temml Post Process\n * Populate the text contents of each \\ref & \\eqref\n *\n * As with other Temml code, this file is released under terms of the MIT license.\n * https://mit-license.org/\n */\n\nconst version = \"0.10.34\";\n\nfunction postProcess(block) {\n const labelMap = {};\n let i = 0;\n\n // Get a collection of the parents of each \\tag & auto-numbered equation\n const amsEqns = document.getElementsByClassName('tml-eqn');\n for (let parent of amsEqns) {\n // AMS automatically numbered equation.\n // Assign an id.\n i += 1;\n parent.setAttribute(\"id\", \"tml-eqn-\" + String(i));\n // No need to write a number into the text content of the element.\n // A CSS counter has done that even if this postProcess() function is not used.\n\n // Find any \\label that refers to an AMS automatic eqn number.\n while (true) {\n if (parent.tagName === \"mtable\") { break }\n const labels = parent.getElementsByClassName(\"tml-label\");\n if (labels.length > 0) {\n const id = parent.attributes.id.value;\n labelMap[id] = String(i);\n break\n } else {\n parent = parent.parentElement;\n }\n }\n }\n\n // Find \\labels associated with \\tag\n const taggedEqns = document.getElementsByClassName('tml-tageqn');\n for (const parent of taggedEqns) {\n const labels = parent.getElementsByClassName(\"tml-label\");\n if (labels.length > 0) {\n const tags = parent.getElementsByClassName(\"tml-tag\");\n if (tags.length > 0) {\n const id = parent.attributes.id.value;\n labelMap[id] = tags[0].textContent;\n }\n }\n }\n\n // Populate \\ref & \\eqref text content\n const refs = block.getElementsByClassName(\"tml-ref\");\n [...refs].forEach(ref => {\n const attr = ref.getAttribute(\"href\");\n let str = labelMap[attr.slice(1)];\n if (ref.className.indexOf(\"tml-eqref\") === -1) {\n // \\ref. Omit parens.\n str = str.replace(/^\\(/, \"\");\n str = str.replace(/\\)$/, \"\");\n } else {\n // \\eqref. Include parens\n if (str.charAt(0) !== \"(\") { str = \"(\" + str; }\n if (str.slice(-1) !== \")\") { str = str + \")\"; }\n }\n const mtext = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"mtext\");\n mtext.appendChild(document.createTextNode(str));\n const math = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"math\");\n math.appendChild(mtext);\n ref.appendChild(math);\n });\n}\n\n/* eslint no-console:0 */\n/**\n * This is the main entry point for Temml. Here, we expose functions for\n * rendering expressions either to DOM nodes or to markup strings.\n *\n * We also expose the ParseError class to check if errors thrown from Temml are\n * errors in the expression, or errors in javascript handling.\n */\n\n\n/**\n * @type {import('./temml').render}\n * Parse and build an expression, and place that expression in the DOM node\n * given.\n */\nlet render = function(expression, baseNode, options = {}) {\n baseNode.textContent = \"\";\n const alreadyInMathElement = baseNode.tagName.toLowerCase() === \"math\";\n if (alreadyInMathElement) { options.wrap = \"none\"; }\n const math = renderToMathMLTree(expression, options);\n if (alreadyInMathElement) {\n // The <math> element already exists. Populate it.\n baseNode.textContent = \"\";\n math.children.forEach(e => { baseNode.appendChild(e.toNode()); });\n } else if (math.children.length > 1) {\n baseNode.textContent = \"\";\n math.children.forEach(e => { baseNode.appendChild(e.toNode()); });\n } else {\n baseNode.appendChild(math.toNode());\n }\n};\n\n// Temml's styles don't work properly in quirks mode. Print out an error, and\n// disable rendering.\nif (typeof document !== \"undefined\") {\n if (document.compatMode !== \"CSS1Compat\") {\n typeof console !== \"undefined\" &&\n console.warn(\n \"Warning: Temml doesn't work in quirks mode. Make sure your \" +\n \"website has a suitable doctype.\"\n );\n\n render = function() {\n throw new ParseError(\"Temml doesn't work in quirks mode.\");\n };\n }\n}\n\n/**\n * @type {import('./temml').renderToString}\n * Parse and build an expression, and return the markup for that.\n */\nconst renderToString = function(expression, options) {\n const markup = renderToMathMLTree(expression, options).toMarkup();\n return markup;\n};\n\n/**\n * @type {import('./temml').generateParseTree}\n * Parse an expression and return the parse tree.\n */\nconst generateParseTree = function(expression, options) {\n const settings = new Settings(options);\n return parseTree(expression, settings);\n};\n\n/**\n * @type {import('./temml').definePreamble}\n * Take an expression which contains a preamble.\n * Parse it and return the macros.\n */\nconst definePreamble = function(expression, options) {\n const settings = new Settings(options);\n settings.macros = {};\n if (!(typeof expression === \"string\" || expression instanceof String)) {\n throw new TypeError(\"Temml can only parse string typed expression\")\n }\n const parser = new Parser(expression, settings, true);\n // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n delete parser.gullet.macros.current[\"\\\\df@tag\"];\n const macros = parser.parse();\n return macros\n};\n\n/**\n * If the given error is a Temml ParseError,\n * renders the invalid LaTeX as a span with hover title giving the Temml\n * error message. Otherwise, simply throws the error.\n */\nconst renderError = function(error, expression, options) {\n if (options.throwOnError || !(error instanceof ParseError)) {\n throw error;\n }\n const node = new Span([\"temml-error\"], [new TextNode$1(expression + \"\\n\" + error.toString())]);\n node.style.color = options.errorColor;\n node.style.whiteSpace = \"pre-line\";\n return node;\n};\n\n/**\n * @type {import('./temml').renderToMathMLTree}\n * Generates and returns the Temml build tree. This is used for advanced\n * use cases (like rendering to custom output).\n */\nconst renderToMathMLTree = function(expression, options) {\n const settings = new Settings(options);\n try {\n const tree = parseTree(expression, settings);\n const style = new Style({\n level: settings.displayMode ? StyleLevel.DISPLAY : StyleLevel.TEXT,\n maxSize: settings.maxSize\n });\n return buildMathML(tree, expression, style, settings);\n } catch (error) {\n return renderError(error, expression, settings);\n }\n};\n\n/** @type {import('./temml').default} */\nvar temml = {\n /**\n * Current Temml version\n */\n version: version,\n /**\n * Renders the given LaTeX into MathML, and adds\n * it as a child to the specified DOM node.\n */\n render,\n /**\n * Renders the given LaTeX into MathML string,\n * for sending to the client.\n */\n renderToString,\n /**\n * Post-process an entire HTML block.\n * Writes AMS auto-numbers and implements \\ref{}.\n * Typcally called once, after a loop has rendered many individual spans.\n */\n postProcess,\n /**\n * Temml error, usually during parsing.\n */\n ParseError,\n /**\n * Creates a set of macros with document-wide scope.\n */\n definePreamble,\n /**\n * Parses the given LaTeX into Temml's internal parse tree structure,\n * without rendering to HTML or MathML.\n *\n * NOTE: This method is not currently recommended for public use.\n * The internal tree representation is unstable and is very likely\n * to change. Use at your own risk.\n */\n __parse: generateParseTree,\n /**\n * Renders the given LaTeX into a MathML internal DOM tree\n * representation, without flattening that representation to a string.\n *\n * NOTE: This method is not currently recommended for public use.\n * The internal tree representation is unstable and is very likely\n * to change. Use at your own risk.\n */\n __renderToMathMLTree: renderToMathMLTree,\n /**\n * adds a new symbol to builtin symbols table\n */\n __defineSymbol: defineSymbol,\n /**\n * adds a new macro to builtin macro list\n */\n __defineMacro: defineMacro\n};\n\nexport { temml as default };\n", "/**\n * External dependencies\n */\nimport temml from 'temml';\n\n/**\n * Options for LaTeX to MathML conversion.\n */\nexport interface LatexToMathMLOptions {\n\t/**\n\t * Whether to render in display mode (block) or inline mode.\n\t * @default true\n\t */\n\tdisplayMode?: boolean;\n}\n\n/**\n * Converts LaTeX math syntax to MathML.\n *\n * @param latex - The LaTeX string to convert.\n * @param options - Conversion options.\n * @param options.displayMode\n * @return The MathML string.\n * @throws Will throw an error if the LaTeX is invalid.\n *\n * @example\n * ```js\n * import latexToMathML from '@wordpress/latex-to-mathml';\n *\n * const mathML = latexToMathML( 'x^2', { displayMode: false } );\n * ```\n */\nexport default function latexToMathML(\n\tlatex: string,\n\t{ displayMode = true }: LatexToMathMLOptions = {}\n): string {\n\tconst mathML = temml.renderToString( latex, {\n\t\tdisplayMode,\n\t\tannotate: true,\n\t\tthrowOnError: true,\n\t} );\n\tconst doc = document.implementation.createHTMLDocument( '' );\n\tdoc.body.innerHTML = mathML;\n\treturn doc.body.querySelector( 'math' )?.innerHTML ?? '';\n}\n"], 5 "mappings": "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K;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAA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", 6 "names": ["text", "mathmlBuilder", "TextNode", "math", "accentNode", "scriptLevel", "macros", "delimiters", "tok", "inner", "style", "input", "match", "align", "textord", "args", "mi", "offset", "close", "isCharacterBox", "primes", "accent"] 7 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated : Wed Apr 15 08:20:10 2026 | Cross-referenced by PHPXref |