1 line
745 KiB
Plaintext
1 line
745 KiB
Plaintext
{"version":3,"file":"temml-D21kwrgi.js","sources":["../../node_modules/temml/dist/temml.mjs"],"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\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 = \"…\" + 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) + \"…\";\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=\"…\"> 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 && Array.isArray(node.body)) {\n for (const item of node.body) {\n width += estimatedWidth(item);\n }\n } else if (node.body) {\n width += estimatedWidth(node.body);\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: \"ˇ\",\n widetilde: \"~\",\n wideparen: \"⏜\", // \\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: \"⏜\",\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 xtofrom: \"\\u21c4\",\n xleftrightharpoons: \"\\u21cb\",\n xrightleftharpoons: \"\\u21cc\",\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 yieldsLeftRight: \"\\u21c4\",\n chemequilibrium: \"\\u21cc\"\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// ∇ 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, \"Å\", \"\\\\Angstrom\", true);\ndefineSymbol(text, textord, \"Å\", \"\\\\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);\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, \"¢\", \"\\\\cent\");\ndefineSymbol(text, textord, \"¢\", \"\\\\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\");\n\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\");\n// Extended ASCII and non-ASCII Letters\ndefineSymbol(math, textord, \"\\u00C5\", \"\\\\AA\"); // Å\ndefineSymbol(text, textord, \"\\u00C5\", \"\\\\AA\", true);\ndefineSymbol(math, textord, \"\\u00C6\", \"\\\\AE\", true); // Æ\ndefineSymbol(text, textord, \"\\u00C6\", \"\\\\AE\", true);\ndefineSymbol(math, textord, \"\\u00D0\", \"\\\\DH\", true); // Ð\ndefineSymbol(text, textord, \"\\u00D0\", \"\\\\DH\", true);\ndefineSymbol(math, textord, \"\\u00DE\", \"\\\\TH\", true); // Þ\ndefineSymbol(text, textord, \"\\u00DE\", \"\\\\TH\", true);\ndefineSymbol(math, textord, \"\\u00DF\", \"\\\\ss\", true); // ß\ndefineSymbol(text, textord, \"\\u00DF\", \"\\\\ss\", true);\ndefineSymbol(math, textord, \"\\u00E5\", \"\\\\aa\"); // å\ndefineSymbol(text, textord, \"\\u00E5\", \"\\\\aa\", true);\ndefineSymbol(math, textord, \"\\u00E6\", \"\\\\ae\", true); // æ\ndefineSymbol(text, textord, \"\\u00E6\", \"\\\\ae\", true);\ndefineSymbol(math, textord, \"\\u00F0\", \"\\\\dh\"); // ð\ndefineSymbol(text, textord, \"\\u00F0\", \"\\\\dh\", true);\ndefineSymbol(math, textord, \"\\u00FE\", \"\\\\th\", true); // þ\ndefineSymbol(text, textord, \"\\u00FE\", \"\\\\th\", true);\ndefineSymbol(math, textord, \"\\u0110\", \"\\\\DJ\", true); // Đ\ndefineSymbol(text, textord, \"\\u0110\", \"\\\\DJ\", true);\ndefineSymbol(math, textord, \"\\u0111\", \"\\\\dj\", true); // đ\ndefineSymbol(text, textord, \"\\u0111\", \"\\\\dj\", true);\ndefineSymbol(math, textord, \"\\u0141\", \"\\\\L\", true); // Ł\ndefineSymbol(text, textord, \"\\u0141\", \"\\\\L\", true);\ndefineSymbol(math, textord, \"\\u0141\", \"\\\\l\", true); // ł\ndefineSymbol(text, textord, \"\\u0141\", \"\\\\l\", true);\ndefineSymbol(math, textord, \"\\u014A\", \"\\\\NG\", true); // Ŋ\ndefineSymbol(text, textord, \"\\u014A\", \"\\\\NG\", true);\ndefineSymbol(math, textord, \"\\u014B\", \"\\\\ng\", true); // ŋ\ndefineSymbol(text, textord, \"\\u014B\", \"\\\\ng\", true);\ndefineSymbol(math, textord, \"\\u0152\", \"\\\\OE\", true); // Œ\ndefineSymbol(text, textord, \"\\u0152\", \"\\\\OE\", true);\ndefineSymbol(math, textord, \"\\u0153\", \"\\\\oe\", true); // œ\ndefineSymbol(text, textord, \"\\u0153\", \"\\\\oe\", true);\n\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, \"‼\", \"‼\");\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 ⊕ 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, \"⦇\", \"\\\\llparenthesis\", true);\ndefineSymbol(math, close, \"⦈\", \"\\\\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, \"\\u00b4\", \"\\\\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, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(math, mathord, \"\\u00f8\", \"\\\\o\", 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, \"\\u007e\", \"\\\\~\"); // 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\", '\\\\\"'); // diaeresis\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, \"\\u007e\", \"\\\\~\"); // 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\", '\\\\\"'); // diaeresis\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, \"𝛤\", \"\\\\varGamma\");\ndefineSymbol(math, textord, \"𝛥\", \"\\\\varDelta\");\ndefineSymbol(math, textord, \"𝛩\", \"\\\\varTheta\");\ndefineSymbol(math, textord, \"𝛬\", \"\\\\varLambda\");\ndefineSymbol(math, textord, \"𝛯\", \"\\\\varXi\");\ndefineSymbol(math, textord, \"𝛱\", \"\\\\varPi\");\ndefineSymbol(math, textord, \"𝛴\", \"\\\\varSigma\");\ndefineSymbol(math, textord, \"𝛶\", \"\\\\varUpsilon\");\ndefineSymbol(math, textord, \"𝛷\", \"\\\\varPhi\");\ndefineSymbol(math, textord, \"𝛹\", \"\\\\varPsi\");\ndefineSymbol(math, textord, \"𝛺\", \"\\\\varOmega\");\ndefineSymbol(text, textord, \"𝛤\", \"\\\\varGamma\");\ndefineSymbol(text, textord, \"𝛥\", \"\\\\varDelta\");\ndefineSymbol(text, textord, \"𝛩\", \"\\\\varTheta\");\ndefineSymbol(text, textord, \"𝛬\", \"\\\\varLambda\");\ndefineSymbol(text, textord, \"𝛯\", \"\\\\varXi\");\ndefineSymbol(text, textord, \"𝛱\", \"\\\\varPi\");\ndefineSymbol(text, textord, \"𝛴\", \"\\\\varSigma\");\ndefineSymbol(text, textord, \"𝛶\", \"\\\\varUpsilon\");\ndefineSymbol(text, textord, \"𝛷\", \"\\\\varPhi\");\ndefineSymbol(text, textord, \"𝛹\", \"\\\\varPsi\");\ndefineSymbol(text, textord, \"𝛺\", \"\\\\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 = \"ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ\";\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 = \"([{⌊⌈⟨⟮⎰⟦⦃\";\nconst closeDelims = \")]}⌋⌉⟩⟯⎱⟦⦄\";\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.prototype.hasOwnProperty.call(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 !== \"∇\") {\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); // tag is now an <mtext> element\n tag.classes.push(\"tml-tag\"); // to be available for \\ref\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].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 (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\n// Identify letters to which we'll attach a combining accent character\nconst smalls = \"acegıȷmnopqrsuvwxyzαγεηικμνοπρςστυχωϕ𝐚𝐜𝐞𝐠𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐮𝐯𝐰𝐱𝐲𝐳\";\n\n// From the KaTeX font metrics, identify letters whose accents need a italic correction.\nconst smallNudge = \"DHKLUcegorsuvxyzΠΥΨαδηιμνοτυχϵ\";\nconst mediumNudge = \"BCEGIMNOPQRSTXZlpqtwΓΘΞΣΦΩβεζθξρςφψϑϕϱ\";\nconst largeNudge = \"AFJdfΔΛ\";\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 if (!group.isStretchy) {\n accentNode.setAttribute(\"stretchy\", \"false\"); // Keep Firefox from stretching \\check\n }\n if (group.label !== \"\\\\vec\") {\n accentNode.style.mathDepth = \"0\"; // not scriptstyle\n // Don't use attribute accent=\"true\" because MathML Core eliminates a needed space.\n }\n const tag = group.label === \"\\\\c\" ? \"munder\" : \"mover\";\n const needsWbkVertShift = needsWebkitVerticalShift.has(group.label);\n if (tag === \"mover\" && group.mode === \"math\" && (!group.isStretchy) && group.base.text\n && group.base.text.length === 1) {\n const text = group.base.text;\n const isVec = group.label === \"\\\\vec\";\n const vecPostfix = isVec === \"\\\\vec\" ? \"-vec\" : \"\";\n if (isVec) {\n accentNode.classes.push(\"tml-vec\"); // Firefox sizing of \\vec arrow\n }\n const wbkPostfix = isVec ? \"-vec\" : needsWbkVertShift ? \"-acc\" : \"\";\n if (smallNudge.indexOf(text) > -1) {\n accentNode.classes.push(`chr-sml${vecPostfix}`);\n accentNode.classes.push(`wbk-sml${wbkPostfix}`);\n } else if (mediumNudge.indexOf(text) > -1) {\n accentNode.classes.push(`chr-med${vecPostfix}`);\n accentNode.classes.push(`wbk-med${wbkPostfix}`);\n } else if (largeNudge.indexOf(text) > -1) {\n accentNode.classes.push(`chr-lrg${vecPostfix}`);\n accentNode.classes.push(`wbk-lrg${wbkPostfix}`);\n } else if (isVec) {\n accentNode.classes.push(`wbk-vec`);\n } else if (needsWbkVertShift) {\n accentNode.classes.push(`wbk-acc`);\n }\n } else if (needsWbkVertShift) {\n // text-mode accents\n accentNode.classes.push(\"wbk-acc\");\n }\n const node = new mathMLTree.MathNode(tag, [buildGroup$1(group.base, style), accentNode]);\n return node;\n};\n\nconst nonStretchyAccents = new Set([\n \"\\\\acute\",\n \"\\\\check\",\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 needsWebkitVerticalShift = 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 \"\\\\c\": \"\\u0327\"\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,\n 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 if (context.funcName === \"\\\\c\" && mode === \"text\" && base.text\n && base.text.length === 1) {\n // combining cedilla\n return { type: \"textord\", mode: \"text\", text: base.text + \"\\u0327\" }\n } else {\n // Build up the accent\n return {\n type: \"accent\",\n mode,\n label: context.funcName,\n isStretchy: false,\n 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$1 = 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$1(lspace) }\n const row = group ? [group] : [];\n if (lspace !== 0) { row.unshift(padding$1(lspace)); }\n if (rspace > 0) { row.push(padding$1(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.1px\"); // Don't use 0. WebKit would hide it.\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 ≥ 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 \"\\\\xtofrom\", // expfeil\n \"\\\\xleftrightharpoons\", // mathtools\n \"\\\\xrightleftharpoons\", // mathtools\n // The next 7 functions are here only to support mhchem\n \"\\\\yields\",\n \"\\\\yieldsLeft\",\n \"\\\\mesomerism\",\n \"\\\\longrightharpoonup\",\n \"\\\\longleftharpoondown\",\n \"\\\\yieldsLeftRight\",\n \"\\\\chemequilibrium\",\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$1(0.2778));\n row.push(padding$1(0.2778));\n return new mathMLTree.MathNode(\"mrow\", row)\n }\n});\n\nconst arrowComponent = {\n \"\\\\equilibriumRight\": [\"\\\\longrightharpoonup\", \"\\\\eqleftharpoondown\"],\n \"\\\\equilibriumLeft\": [\"\\\\eqrightharpoonup\", \"\\\\longleftharpoondown\"]\n};\n\n// Math fonts do not have a single glyph for these two mhchem functions.\n// So we stack a pair of single harpoons.\ndefineFunction({\n type: \"stackedArrow\",\n names: [\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$1(0.2778), botNode, raiseNode, padding$1(0.2778)]\n );\n } else {\n raiseNode.setAttribute(\"width\", (group.name === \"\\\\equilibriumRight\" ? \"0.5em\" : \"0\"));\n wrapper = new mathMLTree.MathNode(\n \"mpadded\",\n [padding$1(0.2778), raiseNode, botArrow, padding$1(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 * 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 * 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 mrow = buildGroup$1(group.label, style);\n if (group.side === \"left\") {\n mrow.classes.push(\"tml-shift-left\");\n }\n const mtd = new mathMLTree.MathNode(\"mtd\", [mrow]);\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.1px\"); // Don't use 0. WebKit would hide it.\n label.setAttribute(\"displaystyle\", \"false\");\n label.setAttribute(\"scriptlevel\", \"1\");\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\nconst ordGroup = (body) => {\n return {\n \"type\": \"ordgroup\",\n \"mode\": \"math\",\n \"body\": body,\n \"semisimple\": true\n }\n};\n\nconst phantom = (body, type) => {\n return {\n \"type\": type,\n \"mode\": \"math\",\n \"body\": ordGroup(body)\n }\n};\n\n/*\n * A helper for \\bordermatrix.\n * parseArray() has parsed the tokens as if the environment\n * was \\begin{matrix}. That parse tree is this function’s input.\n * Here, we rearrange the parse tree to get one that will\n * result in TeX \\bordermatrix.\n * The final result includes a {pmatrix}, which is the bottom\n * half of a <mover> element. The top of the <mover> contains\n * the \\bordermatrix headings. The top section also contains the\n * contents of the bottom {pmatrix}. Those elements are hidden via\n * \\hphantom, but they ensure that column widths are the same top and\n * bottom.\n *\n * We also create a left {matrix} with a single column that contains\n * elements shifted out of the matrix. The left {matrix} also\n * contains \\vphantom copies of the other {pmatrix} elements.\n * As before, this ensures consistent row heights of left and main.\n */\n\nconst bordermatrixParseTree = (matrix, delimiters) => {\n const body = matrix.body;\n body[0].shift(); // dispose of top left cell\n\n // Create an array for the left column\n const leftColumnBody = new Array(body.length - 1).fill().map(() => []);\n for (let i = 1; i < body.length; i++) {\n // The visible part of the cell\n leftColumnBody[i - 1].push(body[i].shift());\n // A vphantom with contents from the pmatrix, to set minimum cell height\n const phantomBody = [];\n for (let j = 0; j < body[i].length; j++) {\n phantomBody.push(body[i][j]);\n }\n leftColumnBody[i - 1].push(phantom(phantomBody, \"vphantom\"));\n }\n\n // Create an array for the top row\n const topRowBody = new Array(body.length).fill().map(() => []);\n for (let j = 0; j < body[0].length; j++) {\n topRowBody[0].push(body[0][j]);\n }\n // Copy the rest of the pmatrix, but squashed via \\hphantom\n for (let i = 1; i < body.length; i++) {\n for (let j = 0; j < body[0].length; j++) {\n topRowBody[i].push(phantom(body[i][j].body, \"hphantom\"));\n }\n }\n\n // Squash the top row of the main {pmatrix}\n for (let j = 0; j < body[0].length; j++) {\n body[0][j] = phantom(body[0][j].body, \"hphantom\");\n }\n\n // Now wrap the arrays in the proper parse nodes.\n\n const leftColumn = {\n type: \"array\",\n mode: \"math\",\n body: leftColumnBody,\n cols: [{ type: \"align\", align: \"c\" }],\n rowGaps: new Array(leftColumnBody.length - 1).fill(null),\n hLinesBeforeRow: new Array(leftColumnBody.length + 1).fill().map(() => []),\n envClasses: [],\n scriptLevel: \"text\",\n arraystretch: 1,\n labels: new Array(leftColumnBody.length).fill(\"\"),\n arraycolsep: { \"number\": 0.04, unit: \"em\" }\n };\n\n const topRow = {\n type: \"array\",\n mode: \"math\",\n body: topRowBody,\n cols: new Array(topRowBody.length).fill({ type: \"align\", align: \"c\" }),\n rowGaps: new Array(topRowBody.length - 1).fill(null),\n hLinesBeforeRow: new Array(topRowBody.length + 1).fill().map(() => []),\n envClasses: [],\n scriptLevel: \"text\",\n arraystretch: 1,\n labels: new Array(topRowBody.length).fill(\"\"),\n arraycolsep: null\n };\n\n const topWrapper = {\n type: \"styling\",\n mode: \"math\",\n scriptLevel: \"text\", // Must set this explicitly.\n body: [topRow] // Default level is \"script\".\n };\n\n const container = {\n type: \"leftright\",\n mode: \"math\",\n body: [matrix],\n left: delimiters ? delimiters[0] : \"(\",\n right: delimiters ? delimiters[1] : \")\",\n rightColor: undefined\n };\n\n const base = {\n type: \"op\", // The base of a TeX \\overset\n mode: \"math\",\n limits: true,\n alwaysHandleSupSub: true,\n parentIsSupSub: true,\n symbol: false,\n suppressBaseShift: true,\n body: [container]\n };\n\n const mover = {\n type: \"supsub\", // We're using the MathML equivalent\n mode: \"math\", // of TeX \\overset.\n stack: true,\n base: base, // That keeps the {pmatrix} aligned with\n sup: topWrapper, // the math centerline.\n sub: null\n };\n\n return ordGroup([leftColumn, mover])\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 ‘\\relax’ if it is a control sequence that\n // would ordinarily be expanded by TeX’s 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’s 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>√</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ε\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`⦵}\");\n\n/* 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{…})\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 \"\\\\chemequilibrium\";\n case \"\\u21CC\": return \"\\\\chemequilibrium\";\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 const endToken = envClasses && envClasses.includes(\"bordermatrix\") ? \"}\" : \"\\\\end\";\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 === endToken) {\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 \" + endToken, 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$9 = 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 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 } else {\n row[row.length - 1].children.push(tagElement);\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\n // Check for \\hphantom \\from \\bordermatrix\n let mustSquashRow = true;\n for (let j = 0; j < mtr.children.length; j++) {\n const child = mtr.children[j].children[0];\n if (!(child && child.type === \"mpadded\" && child.attributes.height === \"0px\")) {\n mustSquashRow = false;\n break\n }\n }\n if (mustSquashRow) {\n // All the cell contents are \\hphantom. Squash the cell.\n for (let j = 0; j < mtr.children.length; j++) {\n mtr.children[j].style.display = \"block\"; // necessary in Firefox only\n mtr.children[j].style.height = \"0\"; // necessary in Firefox only\n mtr.children[j].style.paddingTop = \"0\";\n mtr.children[j].style.paddingBottom = \"0\";\n }\n }\n\n tbl.push(mtr);\n }\n\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\n let sidePadding;\n let sidePadUnit;\n if (group.envClasses.length > 0) {\n 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 sidePadUnit = \"em\";\n }\n if (group.arraycolsep) {\n const arraySidePad = calculateSize(group.arraycolsep, style);\n sidePadding = arraySidePad.number.toFixed(4);\n sidePadUnit = arraySidePad.unit;\n }\n if (sidePadding) {\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 if (group.envClasses.length === 0) {\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 if (group.envClasses.length > 0) {\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 = []; // Default is center.\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 }\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\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 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\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$9\n});\n\n// The matrix environments of amsmath build 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 = res.body.length > 0\n ? new Array(res.body[0].length).fill({ type: \"align\", align: colAlign })\n : [];\n const [arraystretch, arraycolsep] = arrayGaps(context.parser.gullet.macros);\n res.arraystretch = arraystretch;\n if (arraycolsep && !(arraycolsep === 6 && arraycolsep === \"pt\")) {\n res.arraycolsep = arraycolsep;\n }\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 }\n : res;\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n type: \"array\",\n names: [\"bordermatrix\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n const payload = { cols: [], envClasses: [\"bordermatrix\"] };\n const res = parseArray(context.parser, payload, \"text\");\n res.cols = res.body.length > 0\n ? new Array(res.body[0].length).fill({ type: \"align\", align: \"c\" })\n : [];\n res.envClasses = [];\n res.arraystretch = 1;\n if (context.envName === \"matrix\") { return res}\n return bordermatrixParseTree(res, context.delimiters)\n },\n mathmlBuilder: mathmlBuilder$9\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$9\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$9\n});\n\n// A cases environment (in amsmath.sty) is almost equivalent to\n// \\def\n// \\left\\{\\begin{array}{@{}l@{\\quad}l@{}} … \\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$9\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$9\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$9\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$9\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$9\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$9\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$9\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// \\bordermatrix from TeXbook pp 177 & 361\n// Optional argument from Herbert Voß, Math mode, p 20\n// Ref: https://tug.ctan.org/obsolete/info/math/voss/mathmode/Mathmode.pdf\n\ndefineFunction({\n type: \"bordermatrix\",\n names: [\"\\\\bordermatrix\", \"\\\\matrix\"],\n props: {\n numArgs: 0,\n numOptionalArgs: 1\n },\n handler: ({ parser, funcName }, args, optArgs) => {\n // Find out if the author has defined custom delimiters\n let delimiters = [\"(\", \")\"];\n if (funcName === \"\\\\bordermatrix\" && optArgs[0] && optArgs[0].body) {\n const body = optArgs[0].body;\n if (body.length === 2 && body[0].type === \"atom\" && body[1].type === \"atom\") {\n if (body[0].family === \"open\" && body[1].family === \"close\") {\n delimiters = [body[0].text, body[1].text];\n }\n }\n }\n // consume the opening brace\n parser.consumeSpaces();\n parser.consume();\n\n // Pass control to the environment handler in array.js.\n const env = environments[\"bordermatrix\"];\n const context = {\n mode: parser.mode,\n envName: funcName.slice(1),\n delimiters,\n parser\n };\n const result = env.handler(context);\n parser.expect(\"}\", true);\n return result\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$8 = (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 if (expr.length === 0) {\n expr.push(new mathMLTree.MathNode(\"mrow\"));\n }\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$8\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$8\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’t 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 #’s 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’t 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’t 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 \"⦇\",\n \"\\\\llparenthesis\",\n \"⦈\",\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 \"⦉\",\n \"\\\\rrangle\",\n \"⦊\",\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 = \"⟨\"; }\n if ([\">\", \"\\\\gt\"].includes(symDelim.text)) { symDelim.text = \"⟩\"; }\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 const delimNode = {\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 const nextToken = context.parser.fetch().text;\n if (nextToken !== \"^\" && nextToken !== \"_\") {\n return delimNode\n } else {\n // Chromium mis-renders a sized delim if it is the base of a supsub.\n // So wrap it in a ordgroup.\n return {\n type: \"ordgroup\",\n mode: \"math\",\n body: [delimNode, { type: \"ordgroup\", mode: \"math\", body: [] }]\n }\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 ε-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 = _ => {\n const node = new mathMLTree.MathNode(\"mspace\");\n node.setAttribute(\"width\", \"3pt\");\n return node\n};\n\nconst mathmlBuilder$7 = (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(),\n buildGroup$1(group.body, style),\n padding()\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.style.padding = \"padding: 3pt 0 3pt 0\";\n node.style.border = \"1px solid\";\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$7\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$7\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$7\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$7\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$7\n});\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{…} group. It gets special treatment because symbolsOrd.js\n // wraps <mi> elements with <mpadded>s to work around a Firefox bug.\n const mi = mathGroup.children[0].children[0].children\n ? mathGroup.children[0].children[0]\n : mathGroup.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].children[0].children\n ? mathGroup.children[i].children[0].children[0].text\n : mathGroup.children[i].children[0].text;\n }\n // Wrap in a <mpadded> to prevent the same Firefox bug.\n const mpadded = new mathMLTree.MathNode(\"mpadded\", [mi]);\n mpadded.setAttribute(\"lspace\", \"0\");\n return mpadded\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’t 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: \"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.number > 0 && dimension.unit === \"em\"\n ? spaceCharacter(dimension.number)\n : \"\";\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 if (dimension.number >= 0) {\n const node = new mathMLTree.MathNode(\"mspace\");\n node.setAttribute(\"width\", dimension.number + dimension.unit);\n return node\n } else {\n // Don't use <mspace> or <mpadded> because\n // WebKit recognizes negative left margin only on a <mrow> element\n const node = new mathMLTree.MathNode(\"mrow\");\n node.style.marginLeft = dimension.number + dimension.unit;\n return node\n }\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\", \"0.1px\"); // Don't use 0. WebKit would hide it.\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\", \"0.1px\"); // Don't use 0. WebKit would hide it.\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\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 === \"∇\") {\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$1(0.2222));\n node.children.push(padding$1(0.2222));\n } else if (group.mclass === \"mrel\") {\n // thickspace\n node.children.unshift(padding$1(0.2778));\n node.children.push(padding$1(0.2778));\n } else if (group.mclass === \"mpunct\") {\n node.children.push(padding$1(0.1667));\n } else if (group.mclass === \"minner\") {\n node.children.unshift(padding$1(0.0556)); // 1 mu is the most likely option\n node.children.push(padding$1(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 if (mustPromote && funcName === \"\\\\mathord\" && mord.type === \"mathord\"\n && mord.text.length > 1) {\n return mord\n } else {\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 },\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.length === 1\n ? arg.body[0]\n : 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 let mclass;\n if (funcName !== \"\\\\stackrel\") {\n // LaTeX applies \\binrel spacing to \\overset and \\underset.\n mclass = binrelClass(baseArg);\n } else {\n mclass = \"mrel\"; // for \\stackrel\n }\n\n const baseType = mclass === \"mrel\" || mclass === \"mbin\"\n ? \"op\"\n : \"ordgroup\";\n\n const baseOp = {\n type: baseType,\n mode: baseArg.mode,\n limits: true,\n alwaysHandleSupSub: true,\n parentIsSupSub: false,\n symbol: false,\n suppressBaseShift: funcName !== \"\\\\stackrel\",\n body: ordargument(baseArg)\n };\n\n return {\n type: \"supsub\",\n mode: shiftedArg.mode,\n stack: true,\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{…} 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 \"\\u2a03\",\n \"\\u2a04\",\n \"\\u2a05\",\n \"\\u2a06\",\n \"\\u2a07\",\n \"\\u2a08\",\n \"\\u2a09\"\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.type === \"mpadded\") && 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 allowedInArgument: 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\nconst numRegEx = /^[0-9]$/;\nconst unicodeNumSubs = {\n '0': '₀',\n '1': '₁',\n '2': '₂',\n '3': '₃',\n '4': '₄',\n '5': '₅',\n '6': '₆',\n '7': '₇',\n '8': '₈',\n '9': '₉'\n};\nconst unicodeNumSups = {\n '0': '⁰',\n '1': '¹',\n '2': '²',\n '3': '³',\n '4': '⁴',\n '5': '⁵',\n '6': '⁶',\n '7': '⁷',\n '8': '⁸',\n '9': '⁹'\n};\n\ndefineFunction({\n type: \"sfrac\",\n names: [\"\\\\sfrac\"],\n props: {\n numArgs: 2,\n allowedInText: true,\n allowedInMath: true\n },\n handler({ parser }, args) {\n let numerator = \"\";\n for (const node of args[0].body) {\n if (node.type !== \"textord\" || !numRegEx.test(node.text)) {\n throw new ParseError(\"Numerator must be an integer.\", node)\n }\n numerator += node.text;\n }\n let denominator = \"\";\n for (const node of args[1].body) {\n if (node.type !== \"textord\" || !numRegEx.test(node.text)) {\n throw new ParseError(\"Denominator must be an integer.\", node)\n }\n denominator += node.text;\n }\n return {\n type: \"sfrac\",\n mode: parser.mode,\n numerator,\n denominator\n };\n },\n mathmlBuilder(group, style) {\n const numerator = group.numerator.split('').map(c => unicodeNumSups[c]).join('');\n const denominator = group.denominator.split('').map(c => unicodeNumSubs[c]).join('');\n // Use a fraction slash.\n const text = new mathMLTree.TextNode(numerator + \"\\u2044\" + denominator, group.mode, style);\n return new mathMLTree.MathNode(\"mn\", [text], [\"special-fraction\"])\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\n// Letters that are x-height w/o a descender.\nconst xHeights = ['a', 'c', 'e', 'ı', 'm', 'n', 'o', 'r', 's', 'u', 'v', 'w', 'x', 'z', 'α',\n 'ε', 'ι', 'κ', 'ν', 'ο', 'π', 'σ', 'τ', 'υ', 'ω', '\\\\alpha', '\\\\epsilon', \"\\\\iota\",\n '\\\\kappa', '\\\\nu', '\\\\omega', '\\\\pi', '\\\\tau', '\\\\omega'];\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 // Check if the body consists entirely of an x-height letter.\n // TODO: Remove this check after Chromium is fixed.\n if (body.body && body.body.length === 1 && body.body[0].text &&\n xHeights.includes(body.body[0].text)) {\n // Chromium does not put enough space above an x-height letter.\n // Insert a strut.\n body.body.push({\n \"type\": \"rule\",\n \"mode\": \"math\",\n \"shift\": null,\n \"width\": { \"number\": 0, \"unit\": \"pt\" },\n \"height\": { \"number\": 0.5, \"unit\": \"em\" }\n });\n }\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// From the KaTeX font metrics, identify letters that encroach on a superscript.\nconst smallPad = \"DHKLUcegorsuvxyzΠΥΨαδηιμνοτυχϵ\";\nconst mediumPad = \"BCEFGIMNOPQRSTXZlpqtwΓΘΞΣΦΩβεζθξρςφψϑϕϱ\";\nconst largePad = \"AJdfΔΛ\";\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 horizontal 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.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.stack && group.base.body.length === 1\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 if (group.base && group.base.text && group.base.text.length === 1) {\n // Make an italic correction on the superscript.\n const text = group.base.text;\n if (smallPad.indexOf(text) > -1) {\n sup.classes.push(\"tml-sml-pad\");\n } else if (mediumPad.indexOf(text) > -1) {\n sup.classes.push(\"tml-med-pad\");\n } else if (largePad.indexOf(text) > -1) {\n sup.classes.push(\"tml-lrg-pad\");\n }\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 (group.stack) {\n nodeType = \"munder\";\n } else 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 } else if (group.needsSpacing) {\n // Fix a MathML bug that occurs when a <mo> is between two <mtext> elements.\n if (group.family === \"bin\") {\n return new mathMLTree.MathNode(\"mrow\", [padding$1(0.222), node, padding$1(0.222)])\n } else {\n // REL spacing\n return new mathMLTree.MathNode(\"mrow\", [padding$1(0.2778), node, padding$1(0.2778)])\n }\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-Ω\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: { // α-ω\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: \"ᴀ\",\n b: \"ʙ\",\n c: \"ᴄ\",\n d: \"ᴅ\",\n e: \"ᴇ\",\n f: \"ꜰ\",\n g: \"ɢ\",\n h: \"ʜ\",\n i: \"ɪ\",\n j: \"ᴊ\",\n k: \"ᴋ\",\n l: \"ʟ\",\n m: \"ᴍ\",\n n: \"ɴ\",\n o: \"ᴏ\",\n p: \"ᴘ\",\n q: \"ǫ\",\n r: \"ʀ\",\n s: \"s\",\n t: \"ᴛ\",\n u: \"ᴜ\",\n v: \"ᴠ\",\n w: \"ᴡ\",\n x: \"x\",\n y: \"ʏ\",\n z: \"ᴢ\"\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(\"mpadded\", [node]);\n node.setAttribute(\"lspace\", \"0\");\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 “gullet” 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 ‘{’, 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 ‘\\def\\row#1#2{...}’, you are allowed to\n // put spaces between the arguments (e.g., ‘\\row x n’), because\n // TeX doesn’t 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 ‘{<nested tokens>}’,\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 // ## → #\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 ‘\\relax’\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 = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/;\n\nconst uSubsAndSups = Object.freeze({\n '₊': '+',\n '₋': '-',\n '₌': '=',\n '₍': '(',\n '₎': ')',\n '₀': '0',\n '₁': '1',\n '₂': '2',\n '₃': '3',\n '₄': '4',\n '₅': '5',\n '₆': '6',\n '₇': '7',\n '₈': '8',\n '₉': '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': 'β',\n '\\u1D67': 'γ',\n '\\u1D68': 'ρ',\n '\\u1D69': '\\u03d5',\n '\\u1D6A': 'χ',\n '⁺': '+',\n '⁻': '-',\n '⁼': '=',\n '⁽': '(',\n '⁾': ')',\n '⁰': '0',\n '¹': '1',\n '²': '2',\n '³': '3',\n '⁴': '4',\n '⁵': '5',\n '⁶': '6',\n '⁷': '7',\n '⁸': '8',\n '⁹': '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': 'β',\n '\\u1D5E': 'γ',\n '\\u1D5F': 'δ',\n '\\u1D60': '\\u03d5',\n '\\u1D61': 'χ',\n '\\u1DBF': 'θ'\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 \"á\": \"á\",\n \"à\": \"à\",\n \"ä\": \"ä\",\n \"ǟ\": \"ǟ\",\n \"ã\": \"ã\",\n \"ā\": \"ā\",\n \"ă\": \"ă\",\n \"ắ\": \"ắ\",\n \"ằ\": \"ằ\",\n \"ẵ\": \"ẵ\",\n \"ǎ\": \"ǎ\",\n \"â\": \"â\",\n \"ấ\": \"ấ\",\n \"ầ\": \"ầ\",\n \"ẫ\": \"ẫ\",\n \"ȧ\": \"ȧ\",\n \"ǡ\": \"ǡ\",\n \"å\": \"å\",\n \"ǻ\": \"ǻ\",\n \"ḃ\": \"ḃ\",\n \"ć\": \"ć\",\n \"č\": \"č\",\n \"ĉ\": \"ĉ\",\n \"ċ\": \"ċ\",\n \"ď\": \"ď\",\n \"ḋ\": \"ḋ\",\n \"é\": \"é\",\n \"è\": \"è\",\n \"ë\": \"ë\",\n \"ẽ\": \"ẽ\",\n \"ē\": \"ē\",\n \"ḗ\": \"ḗ\",\n \"ḕ\": \"ḕ\",\n \"ĕ\": \"ĕ\",\n \"ě\": \"ě\",\n \"ê\": \"ê\",\n \"ế\": \"ế\",\n \"ề\": \"ề\",\n \"ễ\": \"ễ\",\n \"ė\": \"ė\",\n \"ḟ\": \"ḟ\",\n \"ǵ\": \"ǵ\",\n \"ḡ\": \"ḡ\",\n \"ğ\": \"ğ\",\n \"ǧ\": \"ǧ\",\n \"ĝ\": \"ĝ\",\n \"ġ\": \"ġ\",\n \"ḧ\": \"ḧ\",\n \"ȟ\": \"ȟ\",\n \"ĥ\": \"ĥ\",\n \"ḣ\": \"ḣ\",\n \"í\": \"í\",\n \"ì\": \"ì\",\n \"ï\": \"ï\",\n \"ḯ\": \"ḯ\",\n \"ĩ\": \"ĩ\",\n \"ī\": \"ī\",\n \"ĭ\": \"ĭ\",\n \"ǐ\": \"ǐ\",\n \"î\": \"î\",\n \"ǰ\": \"ǰ\",\n \"ĵ\": \"ĵ\",\n \"ḱ\": \"ḱ\",\n \"ǩ\": \"ǩ\",\n \"ĺ\": \"ĺ\",\n \"ľ\": \"ľ\",\n \"ḿ\": \"ḿ\",\n \"ṁ\": \"ṁ\",\n \"ń\": \"ń\",\n \"ǹ\": \"ǹ\",\n \"ñ\": \"ñ\",\n \"ň\": \"ň\",\n \"ṅ\": \"ṅ\",\n \"ó\": \"ó\",\n \"ò\": \"ò\",\n \"ö\": \"ö\",\n \"ȫ\": \"ȫ\",\n \"õ\": \"õ\",\n \"ṍ\": \"ṍ\",\n \"ṏ\": \"ṏ\",\n \"ȭ\": \"ȭ\",\n \"ō\": \"ō\",\n \"ṓ\": \"ṓ\",\n \"ṑ\": \"ṑ\",\n \"ŏ\": \"ŏ\",\n \"ǒ\": \"ǒ\",\n \"ô\": \"ô\",\n \"ố\": \"ố\",\n \"ồ\": \"ồ\",\n \"ỗ\": \"ỗ\",\n \"ȯ\": \"ȯ\",\n \"ȱ\": \"ȱ\",\n \"ő\": \"ő\",\n \"ṕ\": \"ṕ\",\n \"ṗ\": \"ṗ\",\n \"ŕ\": \"ŕ\",\n \"ř\": \"ř\",\n \"ṙ\": \"ṙ\",\n \"ś\": \"ś\",\n \"ṥ\": \"ṥ\",\n \"š\": \"š\",\n \"ṧ\": \"ṧ\",\n \"ŝ\": \"ŝ\",\n \"ṡ\": \"ṡ\",\n \"ẗ\": \"ẗ\",\n \"ť\": \"ť\",\n \"ṫ\": \"ṫ\",\n \"ú\": \"ú\",\n \"ù\": \"ù\",\n \"ü\": \"ü\",\n \"ǘ\": \"ǘ\",\n \"ǜ\": \"ǜ\",\n \"ǖ\": \"ǖ\",\n \"ǚ\": \"ǚ\",\n \"ũ\": \"ũ\",\n \"ṹ\": \"ṹ\",\n \"ū\": \"ū\",\n \"ṻ\": \"ṻ\",\n \"ŭ\": \"ŭ\",\n \"ǔ\": \"ǔ\",\n \"û\": \"û\",\n \"ů\": \"ů\",\n \"ű\": \"ű\",\n \"ṽ\": \"ṽ\",\n \"ẃ\": \"ẃ\",\n \"ẁ\": \"ẁ\",\n \"ẅ\": \"ẅ\",\n \"ŵ\": \"ŵ\",\n \"ẇ\": \"ẇ\",\n \"ẘ\": \"ẘ\",\n \"ẍ\": \"ẍ\",\n \"ẋ\": \"ẋ\",\n \"ý\": \"ý\",\n \"ỳ\": \"ỳ\",\n \"ÿ\": \"ÿ\",\n \"ỹ\": \"ỹ\",\n \"ȳ\": \"ȳ\",\n \"ŷ\": \"ŷ\",\n \"ẏ\": \"ẏ\",\n \"ẙ\": \"ẙ\",\n \"ź\": \"ź\",\n \"ž\": \"ž\",\n \"ẑ\": \"ẑ\",\n \"ż\": \"ż\",\n \"Á\": \"Á\",\n \"À\": \"À\",\n \"Ä\": \"Ä\",\n \"Ǟ\": \"Ǟ\",\n \"Ã\": \"Ã\",\n \"Ā\": \"Ā\",\n \"Ă\": \"Ă\",\n \"Ắ\": \"Ắ\",\n \"Ằ\": \"Ằ\",\n \"Ẵ\": \"Ẵ\",\n \"Ǎ\": \"Ǎ\",\n \"Â\": \"Â\",\n \"Ấ\": \"Ấ\",\n \"Ầ\": \"Ầ\",\n \"Ẫ\": \"Ẫ\",\n \"Ȧ\": \"Ȧ\",\n \"Ǡ\": \"Ǡ\",\n \"Å\": \"Å\",\n \"Ǻ\": \"Ǻ\",\n \"Ḃ\": \"Ḃ\",\n \"Ć\": \"Ć\",\n \"Č\": \"Č\",\n \"Ĉ\": \"Ĉ\",\n \"Ċ\": \"Ċ\",\n \"Ď\": \"Ď\",\n \"Ḋ\": \"Ḋ\",\n \"É\": \"É\",\n \"È\": \"È\",\n \"Ë\": \"Ë\",\n \"Ẽ\": \"Ẽ\",\n \"Ē\": \"Ē\",\n \"Ḗ\": \"Ḗ\",\n \"Ḕ\": \"Ḕ\",\n \"Ĕ\": \"Ĕ\",\n \"Ě\": \"Ě\",\n \"Ê\": \"Ê\",\n \"Ế\": \"Ế\",\n \"Ề\": \"Ề\",\n \"Ễ\": \"Ễ\",\n \"Ė\": \"Ė\",\n \"Ḟ\": \"Ḟ\",\n \"Ǵ\": \"Ǵ\",\n \"Ḡ\": \"Ḡ\",\n \"Ğ\": \"Ğ\",\n \"Ǧ\": \"Ǧ\",\n \"Ĝ\": \"Ĝ\",\n \"Ġ\": \"Ġ\",\n \"Ḧ\": \"Ḧ\",\n \"Ȟ\": \"Ȟ\",\n \"Ĥ\": \"Ĥ\",\n \"Ḣ\": \"Ḣ\",\n \"Í\": \"Í\",\n \"Ì\": \"Ì\",\n \"Ï\": \"Ï\",\n \"Ḯ\": \"Ḯ\",\n \"Ĩ\": \"Ĩ\",\n \"Ī\": \"Ī\",\n \"Ĭ\": \"Ĭ\",\n \"Ǐ\": \"Ǐ\",\n \"Î\": \"Î\",\n \"İ\": \"İ\",\n \"Ĵ\": \"Ĵ\",\n \"Ḱ\": \"Ḱ\",\n \"Ǩ\": \"Ǩ\",\n \"Ĺ\": \"Ĺ\",\n \"Ľ\": \"Ľ\",\n \"Ḿ\": \"Ḿ\",\n \"Ṁ\": \"Ṁ\",\n \"Ń\": \"Ń\",\n \"Ǹ\": \"Ǹ\",\n \"Ñ\": \"Ñ\",\n \"Ň\": \"Ň\",\n \"Ṅ\": \"Ṅ\",\n \"Ó\": \"Ó\",\n \"Ò\": \"Ò\",\n \"Ö\": \"Ö\",\n \"Ȫ\": \"Ȫ\",\n \"Õ\": \"Õ\",\n \"Ṍ\": \"Ṍ\",\n \"Ṏ\": \"Ṏ\",\n \"Ȭ\": \"Ȭ\",\n \"Ō\": \"Ō\",\n \"Ṓ\": \"Ṓ\",\n \"Ṑ\": \"Ṑ\",\n \"Ŏ\": \"Ŏ\",\n \"Ǒ\": \"Ǒ\",\n \"Ô\": \"Ô\",\n \"Ố\": \"Ố\",\n \"Ồ\": \"Ồ\",\n \"Ỗ\": \"Ỗ\",\n \"Ȯ\": \"Ȯ\",\n \"Ȱ\": \"Ȱ\",\n \"Ő\": \"Ő\",\n \"Ṕ\": \"Ṕ\",\n \"Ṗ\": \"Ṗ\",\n \"Ŕ\": \"Ŕ\",\n \"Ř\": \"Ř\",\n \"Ṙ\": \"Ṙ\",\n \"Ś\": \"Ś\",\n \"Ṥ\": \"Ṥ\",\n \"Š\": \"Š\",\n \"Ṧ\": \"Ṧ\",\n \"Ŝ\": \"Ŝ\",\n \"Ṡ\": \"Ṡ\",\n \"Ť\": \"Ť\",\n \"Ṫ\": \"Ṫ\",\n \"Ú\": \"Ú\",\n \"Ù\": \"Ù\",\n \"Ü\": \"Ü\",\n \"Ǘ\": \"Ǘ\",\n \"Ǜ\": \"Ǜ\",\n \"Ǖ\": \"Ǖ\",\n \"Ǚ\": \"Ǚ\",\n \"Ũ\": \"Ũ\",\n \"Ṹ\": \"Ṹ\",\n \"Ū\": \"Ū\",\n \"Ṻ\": \"Ṻ\",\n \"Ŭ\": \"Ŭ\",\n \"Ǔ\": \"Ǔ\",\n \"Û\": \"Û\",\n \"Ů\": \"Ů\",\n \"Ű\": \"Ű\",\n \"Ṽ\": \"Ṽ\",\n \"Ẃ\": \"Ẃ\",\n \"Ẁ\": \"Ẁ\",\n \"Ẅ\": \"Ẅ\",\n \"Ŵ\": \"Ŵ\",\n \"Ẇ\": \"Ẇ\",\n \"Ẍ\": \"Ẍ\",\n \"Ẋ\": \"Ẋ\",\n \"Ý\": \"Ý\",\n \"Ỳ\": \"Ỳ\",\n \"Ÿ\": \"Ÿ\",\n \"Ỹ\": \"Ỹ\",\n \"Ȳ\": \"Ȳ\",\n \"Ŷ\": \"Ŷ\",\n \"Ẏ\": \"Ẏ\",\n \"Ź\": \"Ź\",\n \"Ž\": \"Ž\",\n \"Ẑ\": \"Ẑ\",\n \"Ż\": \"Ż\",\n \"ά\": \"ά\",\n \"ὰ\": \"ὰ\",\n \"ᾱ\": \"ᾱ\",\n \"ᾰ\": \"ᾰ\",\n \"έ\": \"έ\",\n \"ὲ\": \"ὲ\",\n \"ή\": \"ή\",\n \"ὴ\": \"ὴ\",\n \"ί\": \"ί\",\n \"ὶ\": \"ὶ\",\n \"ϊ\": \"ϊ\",\n \"ΐ\": \"ΐ\",\n \"ῒ\": \"ῒ\",\n \"ῑ\": \"ῑ\",\n \"ῐ\": \"ῐ\",\n \"ό\": \"ό\",\n \"ὸ\": \"ὸ\",\n \"ύ\": \"ύ\",\n \"ὺ\": \"ὺ\",\n \"ϋ\": \"ϋ\",\n \"ΰ\": \"ΰ\",\n \"ῢ\": \"ῢ\",\n \"ῡ\": \"ῡ\",\n \"ῠ\": \"ῠ\",\n \"ώ\": \"ώ\",\n \"ὼ\": \"ὼ\",\n \"Ύ\": \"Ύ\",\n \"Ὺ\": \"Ὺ\",\n \"Ϋ\": \"Ϋ\",\n \"Ῡ\": \"Ῡ\",\n \"Ῠ\": \"Ῠ\",\n \"Ώ\": \"Ώ\",\n \"Ὼ\": \"Ὼ\"\n};\n\n/* eslint no-constant-condition:0 */\n\nconst binLeftCancellers = [\"bin\", \"op\", \"open\", \"punct\", \"rel\"];\nconst sizeRegEx = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/;\nconst textRegEx = /^ *\\\\text/;\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 // Internal nodes do not appear in parse tree\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 // Skip over allowed internal nodes such as \\relax\n let group;\n do {\n group = this.parseGroup(name);\n } while (group.type && group.type === \"internal\")\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 // Internal nodes (e.g. \\relax) cannot support super/subscripts.\n // Instead we will pick up super/subscripts with blank base next round.\n if (base && base.type === \"internal\") {\n return base\n }\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 if ((family === \"rel\" || family === \"bin\") && this.prevAtomType === \"text\") {\n if (textRegEx.test(loc.lexer.input.slice(loc.end))) {\n s.needsSpacing = true; // Fix a MathML bug.\n }\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.11.10\";\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.textContent = '';\n ref.appendChild(math);\n });\n}\n\nconst findEndOfMath = function(delimiter, text, startIndex) {\n // Adapted from\n // https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx\n let index = startIndex;\n let braceLevel = 0;\n\n const delimLength = delimiter.length;\n\n while (index < text.length) {\n const character = text[index];\n\n if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) {\n return index;\n } else if (character === \"\\\\\") {\n index++;\n } else if (character === \"{\") {\n braceLevel++;\n } else if (character === \"}\") {\n braceLevel--;\n }\n\n index++;\n }\n\n return -1;\n};\n\nconst escapeRegex = function(string) {\n return string.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n};\n\nconst amsRegex = /^\\\\(?:begin|(?:eq)?ref){/;\n\nconst splitAtDelimiters = function(text, delimiters) {\n let index;\n const data = [];\n\n const regexLeft = new RegExp(\n \"(\" + delimiters.map((x) => escapeRegex(x.left)).join(\"|\") + \")\"\n );\n\n while (true) {\n index = text.search(regexLeft);\n if (index === -1) {\n break;\n }\n if (index > 0) {\n data.push({\n type: \"text\",\n data: text.slice(0, index)\n });\n text = text.slice(index); // now text starts with delimiter\n }\n // ... so this always succeeds:\n const i = delimiters.findIndex((delim) => text.startsWith(delim.left));\n index = findEndOfMath(delimiters[i].right, text, delimiters[i].left.length);\n if (index === -1) {\n break;\n }\n const rawData = text.slice(0, index + delimiters[i].right.length);\n const math = amsRegex.test(rawData)\n ? rawData\n : text.slice(delimiters[i].left.length, index);\n data.push({\n type: \"math\",\n data: math,\n rawData,\n display: delimiters[i].display\n });\n text = text.slice(index + delimiters[i].right.length);\n }\n\n if (text !== \"\") {\n data.push({\n type: \"text\",\n data: text\n });\n }\n\n return data;\n};\n\nconst defaultDelimiters = [\n { left: \"$$\", right: \"$$\", display: true },\n { left: \"\\\\(\", right: \"\\\\)\", display: false },\n // LaTeX uses $…$, but it ruins the display of normal `$` in text:\n // {left: \"$\", right: \"$\", display: false},\n // $ must come after $$\n\n // Render AMS environments even if outside $$…$$ delimiters.\n { left: \"\\\\begin{equation}\", right: \"\\\\end{equation}\", display: true },\n { left: \"\\\\begin{equation*}\", right: \"\\\\end{equation*}\", display: true },\n { left: \"\\\\begin{align}\", right: \"\\\\end{align}\", display: true },\n { left: \"\\\\begin{align*}\", right: \"\\\\end{align*}\", display: true },\n { left: \"\\\\begin{alignat}\", right: \"\\\\end{alignat}\", display: true },\n { left: \"\\\\begin{alignat*}\", right: \"\\\\end{alignat*}\", display: true },\n { left: \"\\\\begin{gather}\", right: \"\\\\end{gather}\", display: true },\n { left: \"\\\\begin{gather*}\", right: \"\\\\end{gather*}\", display: true },\n { left: \"\\\\begin{CD}\", right: \"\\\\end{CD}\", display: true },\n // Ditto \\ref & \\eqref\n { left: \"\\\\ref{\", right: \"}\", display: false },\n { left: \"\\\\eqref{\", right: \"}\", display: false },\n\n { left: \"\\\\[\", right: \"\\\\]\", display: true }\n];\n\nconst firstDraftDelimiters = {\n \"$\": [\n { left: \"$$\", right: \"$$\", display: true },\n { left: \"$`\", right: \"`$\", display: false },\n { left: \"$\", right: \"$\", display: false }\n ],\n \"(\": [\n { left: \"\\\\[\", right: \"\\\\]\", display: true },\n { left: \"\\\\(\", right: \"\\\\)\", display: false }\n ]\n};\n\nconst amsDelimiters = [\n { left: \"\\\\begin{equation}\", right: \"\\\\end{equation}\", display: true },\n { left: \"\\\\begin{equation*}\", right: \"\\\\end{equation*}\", display: true },\n { left: \"\\\\begin{align}\", right: \"\\\\end{align}\", display: true },\n { left: \"\\\\begin{align*}\", right: \"\\\\end{align*}\", display: true },\n { left: \"\\\\begin{alignat}\", right: \"\\\\end{alignat}\", display: true },\n { left: \"\\\\begin{alignat*}\", right: \"\\\\end{alignat*}\", display: true },\n { left: \"\\\\begin{gather}\", right: \"\\\\end{gather}\", display: true },\n { left: \"\\\\begin{gather*}\", right: \"\\\\end{gather*}\", display: true },\n { left: \"\\\\begin{CD}\", right: \"\\\\end{CD}\", display: true },\n { left: \"\\\\ref{\", right: \"}\", display: false },\n { left: \"\\\\eqref{\", right: \"}\", display: false }\n];\n\nconst delimitersFromKey = key => {\n if (key === \"$\" || key === \"(\") {\n return firstDraftDelimiters[key];\n } else if (key === \"$+\" || key === \"(+\") {\n const firstDraft = firstDraftDelimiters[key.slice(0, 1)];\n return firstDraft.concat(amsDelimiters)\n } else if (key === \"ams\") {\n return amsDelimiters\n } else if (key === \"all\") {\n return (firstDraftDelimiters[\"(\"]).concat(firstDraftDelimiters[\"$\"]).concat(amsDelimiters)\n } else {\n return defaultDelimiters\n }\n};\n\n/* Note: optionsCopy is mutated by this method. If it is ever exposed in the\n * API, we should copy it before mutating.\n */\nconst renderMathInText = function(text, optionsCopy) {\n const data = splitAtDelimiters(text, optionsCopy.delimiters);\n if (data.length === 1 && data[0].type === \"text\") {\n // There is no formula in the text.\n // Let's return null which means there is no need to replace\n // the current text node with a new one.\n return null;\n }\n\n const fragment = document.createDocumentFragment();\n\n for (let i = 0; i < data.length; i++) {\n if (data[i].type === \"text\") {\n fragment.appendChild(document.createTextNode(data[i].data));\n } else {\n const span = document.createElement(\"span\");\n let math = data[i].data;\n // Override any display mode defined in the settings with that\n // defined by the text itself\n optionsCopy.displayMode = data[i].display;\n try {\n if (optionsCopy.preProcess) {\n math = optionsCopy.preProcess(math);\n }\n // Importing render() from temml.js would be a circular dependency.\n // So call the global version.\n // eslint-disable-next-line no-undef\n temml.render(math, span, optionsCopy);\n } catch (e) {\n if (!(e instanceof ParseError)) {\n throw e;\n }\n optionsCopy.errorCallback(\n \"Temml auto-render: Failed to parse `\" + data[i].data + \"` with \",\n e\n );\n fragment.appendChild(document.createTextNode(data[i].rawData));\n continue;\n }\n fragment.appendChild(span);\n }\n }\n\n return fragment;\n};\n\nconst renderElem = function(elem, optionsCopy) {\n for (let i = 0; i < elem.childNodes.length; i++) {\n const childNode = elem.childNodes[i];\n if (childNode.nodeType === 3) {\n // Text node\n const frag = renderMathInText(childNode.textContent, optionsCopy);\n if (frag) {\n i += frag.childNodes.length - 1;\n elem.replaceChild(frag, childNode);\n }\n } else if (childNode.nodeType === 1) {\n // Element node\n const className = \" \" + childNode.className + \" \";\n const shouldRender =\n optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 &&\n optionsCopy.ignoredClasses.every((x) => className.indexOf(\" \" + x + \" \") === -1);\n\n if (shouldRender) {\n renderElem(childNode, optionsCopy);\n }\n }\n // Otherwise, it's something else, and ignore it.\n }\n};\n\nconst renderMathInElement = function(elem, options) {\n if (!elem) {\n throw new Error(\"No element provided to render\");\n }\n\n const optionsCopy = {};\n\n // Object.assign(optionsCopy, option)\n for (const option in options) {\n if (Object.prototype.hasOwnProperty.call(options, option)) {\n optionsCopy[option] = options[option];\n }\n }\n\n if (optionsCopy.fences) {\n optionsCopy.delimiters = delimitersFromKey(optionsCopy.fences);\n } else {\n optionsCopy.delimiters = optionsCopy.delimiters || defaultDelimiters;\n }\n optionsCopy.ignoredTags = optionsCopy.ignoredTags || [\n \"script\",\n \"noscript\",\n \"style\",\n \"textarea\",\n \"pre\",\n \"code\",\n \"option\"\n ];\n optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || [];\n // eslint-disable-next-line no-console\n optionsCopy.errorCallback = optionsCopy.errorCallback || console.error;\n\n // Enable sharing of global macros defined via `\\gdef` between different\n // math elements within a single call to `renderMathInElement`.\n optionsCopy.macros = optionsCopy.macros || {};\n\n renderElem(elem, optionsCopy);\n postProcess(elem);\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\\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$1 = {\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 * Finds all the math delimiters in a given element of a running HTML document\n * and converts the contents of each instance into a <math> element.\n */\n renderMathInElement,\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$1 as default };\n"],"names":["ParseError","message","token","error","start","loc","input","end","underlined","left","right","self","deflt","setting","defaultIfUndefined","uppercase","hyphenate","str","ESCAPE_LOOKUP","ESCAPE_REGEX","escape","text","match","getBaseElem","group","isCharacterBox","baseElem","assert","value","protocolFromUrl","url","protocol","round","n","utils","Settings","options","context","_functions","_mathmlGroupBuilders","defineFunction","type","names","props","handler","mathmlBuilder","data","i","defineFunctionBuilders","normalizeArgument","arg","ordargument","DocumentFragment","children","className","frag","markup","toText","child","createClass","classes","cls","initNode","style","toNode","tagName","node","attr","toMarkup","styles","Span","attribute","TextNode$1","AnchorNode","href","Img","src","alt","newDocumentFragment","MathNode","name","TextNode","wrapWithMstyle","expression","mathMLTree","estimatedWidth","width","item","ch","codePoint","stretchyCodePoint","mathMLnode","label","crookedWides","accentNode","mo","stretchy","ATOMS","NON_ATOMS","symbols","defineSymbol","mode","replace","acceptUnicodeChar","math","accent","bin","close","inner","mathord","op","open","punct","rel","spacing","textord","ligatures","mathTextSymbols","textSymbols","letters","narrow","wideChar","openDelims","closeDelims","setLineBreaks","wrapMode","isDisplayMode","mtrs","mrows","block","numTopLevelEquals","level","mtd","element","next","glueIsFreeOfNobreak","j","nd","mtr","mtable","makeText","copyChar","newRow","mtext","consolidateText","mrow","canConsolidate","grandChild","L","key","makeRow","body","semisimple","isNumberPunctuation","isComma","followingNode","isRel","buildExpression","buildGroup$1","groups","groupArray","lastGroup","base","buildExpressionRow","glue$1","_","labelContainers","getLabel","parent","taggedExpression","tag","leqno","rowArray","table","buildMathML","tree","texExpression","settings","wrap","n1","wrapper","annotation","smalls","smallNudge","mediumNudge","largeNudge","mathmlBuilder$a","needsWbkVertShift","needsWebkitVerticalShift","isVec","vecPostfix","wbkPostfix","nonStretchyAccents","combiningChar","args","isStretchy","parser","funcName","ptPerUnit","validUnits","validUnit","unit","emScale","styleLevel","scriptLevel","calculateSize","sizeValue","number","padding$1","paddedNode","lspace","rspace","mustSmash","row","mpadded","labelSize","size","munderoverNode","fName","below","arrowNode","isEq","minWidth","labelStyle","minArrowWidth","dummyWidth","emptyLabel","dummyNode","space","upperNode","lowerNode","gotUpper","gotLower","optArgs","arrowComponent","lowerArrowBody","upperArrowBelow","topLabel","botLabel","topArrow","botArrow","raiseNode","botNode","_environments","defineEnvironment","assertNodeType","assertSymbolNodeType","typedNode","checkSymbolNodeType","cdArrowFunctionName","newCell","isStartOfArrow","isLabelEnd","endChar","cdArrow","arrowChar","labels","leftLabel","bareArrow","sizedArrow","rightLabel","arrowGroup","arrow","parseCD","parsedRows","rowNodes","cell","labelNum","inLabel","k","ordGroup","phantom","bordermatrixParseTree","matrix","delimiters","leftColumnBody","phantomBody","topRowBody","leftColumn","topWrapper","mover","SourceLocation","lexer","first","second","Token","endToken","StyleLevel","_macros","defineMacro","macros","nextToken","stringFromArg","digitToNumber","nextCharNumber","numStr","appendCharNumbers","digit","recreateArgStr","tokens","expectedLoc","actualLoc","dotsByToken","thedots","spaceAfterDots","replaceVert","argStr","replaceStr","regEx","pdvHelper","numerator","denoms","power","numOp","denominator","e","chemParse","stateMachine","tex","texify","mhchemParser","state","buffer","lastInput","watchdog","output","machine","t","iterateTransitions","matches","task","iA","o","a","b","iB","m","begExcl","begIncl","endIncl","endExcl","beg2Excl","beg2Incl","end2Incl","end2Excl","combine","_match","pattern","_findObserveGroups","endChars","braces","match1","group2","matchRet","mm","ret","stateArray","transitions","p","patternArray","tmp","isAfterD","c1","c2","c3","c4","hyphenFollows","withSpace","entityFollows","rd","rq","p1","md","mq","b5","mrm","isInner","res","cee","inputi","buf","c","d","b6","getHLines","hlineInfo","nxt","validateAmsEnvironmentContext","sizeRegEx$1","arrayGaps","arraystretch","arraycolsepStr","arraycolsep","checkCellForLabels","rowLabel","getAutoTag","parseArray","cols","envClasses","autoTag","singleRow","emptySingleRow","maxNumCols","rowGaps","hLinesBeforeRow","tags","beginRow","endRow","dCellStyle","envName","alignMap","glue","glueNode","mathmlBuilder$9","tbl","numRows","hlines","rw","cellLevel","align","numColumns","tagElement","mustSquashRow","pad","sidePadding","sidePadUnit","arraySidePad","numCols","sidePad","hand","prevTypeWasAlign","iStart","iEnd","sep","iCol","colAlign","alignedHandler","isSplit","numMaths","isAlignedAt","arg0","curMaths","nde","ca","payload","environments","env","result","code","htmlRegEx","htmlOrNameRegEx","RGBregEx","rgbRegEx","xcolorHtmlRegEx","toHex","num","xcolors","colorFromSpec","model","spec","color","validateColor","macroName","mathmlBuilder$8","expr","breakOnTokenText","newLine","globalMap","checkControlSequence","tok","getRHS","letCommand","global","macro","numArgs","insert","middle","exists","delimiterSizes","dels","isDelimiter","sizeToMaxHeight","checkDelimiter","delim","symDelim","needExplicitStretch","delimNode","assertParsed","leftNode","rightNode","lastElement","textNode","middleNode","padding","mathmlBuilder$7","borderColor","backgroundColor","borderSpec","backgroundSpec","nameGroup","endNameToken","isLongVariableName","font","parseNodeType","mathmlBuilder$6","newStyle","mathGroup","mi","bogus","fontAliases","func","fontStyle","stylArray","mathmlBuilder$5","childOptions","numer","denom","ruleWidth","withDelims","leftOp","rightOp","hasBarLine","leftDelim","rightDelim","replaceWith","delimFromValue","delimString","barNode","barSize","styl","textOrd","mathmlBuilder$4","trustContext","attributes","keyVal","sizeData","height","totalheight","depth","graphicStyle","mathFunction","muUnit","dimension","spaceCharacter","character","invalidIdRegEx","textModeLap","strut","phantomInner","offset","outerMode","chooseStyle","textAtomTypes","mathmlBuilder$3","doSpacing","mustPromote","mord","arr","binrelClass","atom","baseArg","shiftedArg","mclass","baseOp","buildGroup","el","noneNode","prescripts","postscripts","prescriptsNode","preSub","preSup","postSub","postSup","ordAtomTypes","noSuccessor","ordTypes","setSpacing","mathmlBuilder$2","operator","lead","trail","singleCharBigOps","isSymbol","singleCharIntegrals","prevAtomType","mathmlBuilder$1","isAllString","word","fragment","dy","amount","shift","rule","numRegEx","unicodeNumSubs","unicodeNumSups","sizeMap","factor","smashHeight","smashDepth","tbArg","letter","xHeights","index","styleMap","styleAttributes","symbolRegEx","smallPad","mediumPad","largePad","isBrace","isOver","isSup","appendApplyFunction","appendSpace","needsLeadingSpace","childStyle","sub","sup","nodeType","short","arrows","isArrow","fontMap","getVariant","script","frak","bbb","bold","boldItalic","boldsf","bisf","variantChar","variant","smallCaps","numberRegEx","latinRegEx","primes","italicNumber","mn","defaultVariant","origText","cssSpace","regularSpace","textFontFamilies","textFontWeights","textFontShapes","styleWithFont","makeVerb","functions","spaceRegexString","controlWordRegexString","controlSymbolRegexString","controlWordWhitespaceRegexString","controlSpaceRegexString","combiningDiacriticalMarkString","combiningDiacriticalMarksEndRegex","tokenRegexString","Lexer","char","pos","nlIndex","Namespace","builtins","globalMacros","undefs","undef","top","implicitCommands","MacroExpander","newMode","isOptional","delims","isDelimited","expandableOnly","topToken","expansion","oldStackLength","definition","catcode","stripped","bodyLexer","unicodeSubRegEx","uSubsAndSups","asciiFromScript","unicodeAccents","unicodeSymbols","binLeftCancellers","sizeRegEx","textRegEx","Parser","isPreamble","consume","parse","oldToken","breakOnInfix","breakOnMiddle","lex","overIndex","numerNode","denomNode","numerBody","denomBody","symbolToken","symbol","textordArray","superscript","subscript","limits","prime","isSub","subsupTokens","isFollowedByDelimiter","funcData","totalArgs","argType","optional","modeName","argToken","regex","firstToken","lastToken","isBlank","groupEnd","v","nucleus","star","s","family","nextCode","command","parseTree","toParse","subOrSupLevel","Style","extension","fontFamily","fontWeight","fontShape","version","postProcess","labelMap","amsEqns","id","taggedEqns","ref","findEndOfMath","delimiter","startIndex","braceLevel","delimLength","escapeRegex","string","amsRegex","splitAtDelimiters","regexLeft","x","rawData","defaultDelimiters","firstDraftDelimiters","amsDelimiters","delimitersFromKey","renderMathInText","optionsCopy","span","renderElem","elem","childNode","renderMathInElement","option","render","baseNode","alreadyInMathElement","renderToMathMLTree","renderToString","generateParseTree","definePreamble","renderError","temml$1"],"mappings":"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IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,EAAU,IACV,IAAU,IACV,EAAU,IACV,IAAU,IACV,EAAU,IACV,IAAU,IACV,EAAU,IACV,IAAU,IACV,IAAU,IACV,EAAU,IACV,EAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,EAAU,IACV,EAAU,IACV,EAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,IACV,IAAU,GACZ,CAAC,EAGKC,GAAkB,OAAO,OAAO,CACpC,KAAgB,IAChB,EAAU,IACV,KAAgB,IAChB,KAAgB,IAChB,EAAU,IACV,EAAU,IACV,KAAgB,IAChB,EAAU,IACV,EAAU,IACV,KAAgB,IAChB,KAAgB,IAChB,EAAU,IACV,EAAU,IACV,KAAgB,IAChB,KAAgB,IAChB,KAAgB,IAChB,KAAgB,IAChB,EAAU,IACV,KAAgB,IAChB,KAAgB,IAChB,KAAgB,IAChB,KAAgB,IAChB,KAAgB,IAChB,KAAgB,IAChB,KAAgB,IAChB,KAAgB,GAClB,CAAC,EAID,IAAIC,GAAiB,CACnB,IAAU,CAAE,KAAM,MAAO,KAAM,SAAW,EAC1C,IAAU,CAAE,KAAM,MAAO,KAAM,SAAW,EAC1C,IAAU,CAAE,KAAM,MAAO,KAAM,QAAU,EACzC,IAAU,CAAE,KAAM,MAAO,KAAM,SAAW,EAC1C,IAAU,CAAE,KAAM,MAAO,KAAM,OAAS,EACxC,IAAU,CAAE,KAAM,MAAO,KAAM,SAAW,EAC1C,IAAU,CAAE,KAAM,MAAO,KAAM,SAAW,EAC1C,IAAU,CAAE,KAAM,MAAO,KAAM,OAAS,EACxC,IAAU,CAAE,KAAM,MAAO,KAAM,OAAS,EACxC,IAAU,CAAE,KAAM,MAAO,KAAM,YAAc,EAC7C,IAAU,CAAE,KAAM,KAAO,EACzB,IAAU,CAAE,KAAM,KAAK,CACzB,EAEIC,GAAiB,CACnB,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAA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","x_google_ignoreList":[0]} |