{"version":3,"sources":["webpack:///./node_modules/katex/src/buildTree.js","webpack:///./node_modules/katex/src/delimiter.js"],"names":["buildHTML","buildMathML","buildCommon","Options","Settings","Style","makeSpan","buildTree","tree","expression","settings","startStyle","TEXT","displayMode","DISPLAY","options","style","size","mathMLNode","htmlNode","katexNode","module","exports","ParseError","fontMetrics","symbols","utils","getMetrics","symbol","font","math","replace","getCharacterMetrics","mathrmSize","value","mode","makeSymbol","styleWrap","delim","toStyle","span","reset","cls","multiplier","sizeMultiplier","height","depth","maxFontSize","makeSmallDelim","center","text","shift","metrics","axisHeight","top","makeLargeDelim","inner","getColor","makeInner","sizeClass","type","elem","makeStackedDelim","heightTotal","middle","repeat","bottom","topMetrics","topHeightTotal","repeatMetrics","repeatHeightTotal","bottomMetrics","bottomHeightTotal","middleHeightTotal","middleFactor","middleMetrics","minHeight","repeatCount","Math","ceil","realHeightTotal","i","inners","push","makeVList","stackLargeDelimiters","stackAlwaysDelimiters","stackNeverDelimiters","sizeToMaxHeight","makeSizedDelim","contains","stackNeverDelimiterSequence","SCRIPTSCRIPT","SCRIPT","stackAlwaysDelimiterSequence","stackLargeDelimiterSequence","delimTypeToFont","traverseSequence","sequence","start","min","length","heightDepth","makeCustomSizedDelim","delimType","makeLeftRightDelim","delimiterFactor","delimiterExtend","ptPerEm","maxDistFromAxis","max","totalHeight","sizedDelim","customSizedDelim","leftRightDelim"],"mappings":"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","file":"js/chunk-31df9667.fd4353dc.js","sourcesContent":["var buildHTML = require(\"./buildHTML\");\nvar buildMathML = require(\"./buildMathML\");\nvar buildCommon = require(\"./buildCommon\");\nvar Options = require(\"./Options\");\nvar Settings = require(\"./Settings\");\nvar Style = require(\"./Style\");\n\nvar makeSpan = buildCommon.makeSpan;\n\nvar buildTree = function(tree, expression, settings) {\n settings = settings || new Settings({});\n\n var startStyle = Style.TEXT;\n if (settings.displayMode) {\n startStyle = Style.DISPLAY;\n }\n\n // Setup the default options\n var options = new Options({\n style: startStyle,\n size: \"size5\",\n });\n\n // `buildHTML` sometimes messes with the parse tree (like turning bins ->\n // ords), so we build the MathML version first.\n var mathMLNode = buildMathML(tree, expression, options);\n var htmlNode = buildHTML(tree, options);\n\n var katexNode = makeSpan([\"katex\"], [\n mathMLNode, htmlNode,\n ]);\n\n if (settings.displayMode) {\n return makeSpan([\"katex-display\"], [katexNode]);\n } else {\n return katexNode;\n }\n};\n\nmodule.exports = buildTree;\n","/**\n * This file deals with creating delimiters of various sizes. The TeXbook\n * discusses these routines on page 441-442, in the \"Another subroutine sets box\n * x to a specified variable delimiter\" paragraph.\n *\n * There are three main routines here. `makeSmallDelim` makes a delimiter in the\n * normal font, but in either text, script, or scriptscript style.\n * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1,\n * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of\n * smaller pieces that are stacked on top of one another.\n *\n * The functions take a parameter `center`, which determines if the delimiter\n * should be centered around the axis.\n *\n * Then, there are three exposed functions. `sizedDelim` makes a delimiter in\n * one of the given sizes. This is used for things like `\\bigl`.\n * `customSizedDelim` makes a delimiter with a given total height+depth. It is\n * called in places like `\\sqrt`. `leftRightDelim` makes an appropriate\n * delimiter which surrounds an expression of a given height an depth. It is\n * used in `\\left` and `\\right`.\n */\n\nvar ParseError = require(\"./ParseError\");\nvar Style = require(\"./Style\");\n\nvar buildCommon = require(\"./buildCommon\");\nvar fontMetrics = require(\"./fontMetrics\");\nvar symbols = require(\"./symbols\");\nvar utils = require(\"./utils\");\n\nvar makeSpan = buildCommon.makeSpan;\n\n/**\n * Get the metrics for a given symbol and font, after transformation (i.e.\n * after following replacement from symbols.js)\n */\nvar getMetrics = function(symbol, font) {\n if (symbols.math[symbol] && symbols.math[symbol].replace) {\n return fontMetrics.getCharacterMetrics(\n symbols.math[symbol].replace, font);\n } else {\n return fontMetrics.getCharacterMetrics(\n symbol, font);\n }\n};\n\n/**\n * Builds a symbol in the given font size (note size is an integer)\n */\nvar mathrmSize = function(value, size, mode) {\n return buildCommon.makeSymbol(value, \"Size\" + size + \"-Regular\", mode);\n};\n\n/**\n * Puts a delimiter span in a given style, and adds appropriate height, depth,\n * and maxFontSizes.\n */\nvar styleWrap = function(delim, toStyle, options) {\n var span = makeSpan(\n [\"style-wrap\", options.style.reset(), toStyle.cls()], [delim]);\n\n var multiplier = toStyle.sizeMultiplier / options.style.sizeMultiplier;\n\n span.height *= multiplier;\n span.depth *= multiplier;\n span.maxFontSize = toStyle.sizeMultiplier;\n\n return span;\n};\n\n/**\n * Makes a small delimiter. This is a delimiter that comes in the Main-Regular\n * font, but is restyled to either be in textstyle, scriptstyle, or\n * scriptscriptstyle.\n */\nvar makeSmallDelim = function(delim, style, center, options, mode) {\n var text = buildCommon.makeSymbol(delim, \"Main-Regular\", mode);\n\n var span = styleWrap(text, style, options);\n\n if (center) {\n var shift =\n (1 - options.style.sizeMultiplier / style.sizeMultiplier) *\n fontMetrics.metrics.axisHeight;\n\n span.style.top = shift + \"em\";\n span.height -= shift;\n span.depth += shift;\n }\n\n return span;\n};\n\n/**\n * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2,\n * Size3, or Size4 fonts. It is always rendered in textstyle.\n */\nvar makeLargeDelim = function(delim, size, center, options, mode) {\n var inner = mathrmSize(delim, size, mode);\n\n var span = styleWrap(\n makeSpan([\"delimsizing\", \"size\" + size],\n [inner], options.getColor()),\n Style.TEXT, options);\n\n if (center) {\n var shift = (1 - options.style.sizeMultiplier) *\n fontMetrics.metrics.axisHeight;\n\n span.style.top = shift + \"em\";\n span.height -= shift;\n span.depth += shift;\n }\n\n return span;\n};\n\n/**\n * Make an inner span with the given offset and in the given font. This is used\n * in `makeStackedDelim` to make the stacking pieces for the delimiter.\n */\nvar makeInner = function(symbol, font, mode) {\n var sizeClass;\n // Apply the correct CSS class to choose the right font.\n if (font === \"Size1-Regular\") {\n sizeClass = \"delim-size1\";\n } else if (font === \"Size4-Regular\") {\n sizeClass = \"delim-size4\";\n }\n\n var inner = makeSpan(\n [\"delimsizinginner\", sizeClass],\n [makeSpan([], [buildCommon.makeSymbol(symbol, font, mode)])]);\n\n // Since this will be passed into `makeVList` in the end, wrap the element\n // in the appropriate tag that VList uses.\n return {type: \"elem\", elem: inner};\n};\n\n/**\n * Make a stacked delimiter out of a given delimiter, with the total height at\n * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook.\n */\nvar makeStackedDelim = function(delim, heightTotal, center, options, mode) {\n // There are four parts, the top, an optional middle, a repeated part, and a\n // bottom.\n var top;\n var middle;\n var repeat;\n var bottom;\n top = repeat = bottom = delim;\n middle = null;\n // Also keep track of what font the delimiters are in\n var font = \"Size1-Regular\";\n\n // We set the parts and font based on the symbol. Note that we use\n // '\\u23d0' instead of '|' and '\\u2016' instead of '\\\\|' for the\n // repeats of the arrows\n if (delim === \"\\\\uparrow\") {\n repeat = bottom = \"\\u23d0\";\n } else if (delim === \"\\\\Uparrow\") {\n repeat = bottom = \"\\u2016\";\n } else if (delim === \"\\\\downarrow\") {\n top = repeat = \"\\u23d0\";\n } else if (delim === \"\\\\Downarrow\") {\n top = repeat = \"\\u2016\";\n } else if (delim === \"\\\\updownarrow\") {\n top = \"\\\\uparrow\";\n repeat = \"\\u23d0\";\n bottom = \"\\\\downarrow\";\n } else if (delim === \"\\\\Updownarrow\") {\n top = \"\\\\Uparrow\";\n repeat = \"\\u2016\";\n bottom = \"\\\\Downarrow\";\n } else if (delim === \"[\" || delim === \"\\\\lbrack\") {\n top = \"\\u23a1\";\n repeat = \"\\u23a2\";\n bottom = \"\\u23a3\";\n font = \"Size4-Regular\";\n } else if (delim === \"]\" || delim === \"\\\\rbrack\") {\n top = \"\\u23a4\";\n repeat = \"\\u23a5\";\n bottom = \"\\u23a6\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\lfloor\") {\n repeat = top = \"\\u23a2\";\n bottom = \"\\u23a3\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\lceil\") {\n top = \"\\u23a1\";\n repeat = bottom = \"\\u23a2\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\rfloor\") {\n repeat = top = \"\\u23a5\";\n bottom = \"\\u23a6\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\rceil\") {\n top = \"\\u23a4\";\n repeat = bottom = \"\\u23a5\";\n font = \"Size4-Regular\";\n } else if (delim === \"(\") {\n top = \"\\u239b\";\n repeat = \"\\u239c\";\n bottom = \"\\u239d\";\n font = \"Size4-Regular\";\n } else if (delim === \")\") {\n top = \"\\u239e\";\n repeat = \"\\u239f\";\n bottom = \"\\u23a0\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\{\" || delim === \"\\\\lbrace\") {\n top = \"\\u23a7\";\n middle = \"\\u23a8\";\n bottom = \"\\u23a9\";\n repeat = \"\\u23aa\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\}\" || delim === \"\\\\rbrace\") {\n top = \"\\u23ab\";\n middle = \"\\u23ac\";\n bottom = \"\\u23ad\";\n repeat = \"\\u23aa\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\lgroup\") {\n top = \"\\u23a7\";\n bottom = \"\\u23a9\";\n repeat = \"\\u23aa\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\rgroup\") {\n top = \"\\u23ab\";\n bottom = \"\\u23ad\";\n repeat = \"\\u23aa\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\lmoustache\") {\n top = \"\\u23a7\";\n bottom = \"\\u23ad\";\n repeat = \"\\u23aa\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\rmoustache\") {\n top = \"\\u23ab\";\n bottom = \"\\u23a9\";\n repeat = \"\\u23aa\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\surd\") {\n top = \"\\ue001\";\n bottom = \"\\u23b7\";\n repeat = \"\\ue000\";\n font = \"Size4-Regular\";\n }\n\n // Get the metrics of the four sections\n var topMetrics = getMetrics(top, font);\n var topHeightTotal = topMetrics.height + topMetrics.depth;\n var repeatMetrics = getMetrics(repeat, font);\n var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth;\n var bottomMetrics = getMetrics(bottom, font);\n var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth;\n var middleHeightTotal = 0;\n var middleFactor = 1;\n if (middle !== null) {\n var middleMetrics = getMetrics(middle, font);\n middleHeightTotal = middleMetrics.height + middleMetrics.depth;\n middleFactor = 2; // repeat symmetrically above and below middle\n }\n\n // Calcuate the minimal height that the delimiter can have.\n // It is at least the size of the top, bottom, and optional middle combined.\n var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal;\n\n // Compute the number of copies of the repeat symbol we will need\n var repeatCount = Math.ceil(\n (heightTotal - minHeight) / (middleFactor * repeatHeightTotal));\n\n // Compute the total height of the delimiter including all the symbols\n var realHeightTotal =\n minHeight + repeatCount * middleFactor * repeatHeightTotal;\n\n // The center of the delimiter is placed at the center of the axis. Note\n // that in this context, \"center\" means that the delimiter should be\n // centered around the axis in the current style, while normally it is\n // centered around the axis in textstyle.\n var axisHeight = fontMetrics.metrics.axisHeight;\n if (center) {\n axisHeight *= options.style.sizeMultiplier;\n }\n // Calculate the depth\n var depth = realHeightTotal / 2 - axisHeight;\n\n // Now, we start building the pieces that will go into the vlist\n\n // Keep a list of the inner pieces\n var inners = [];\n\n // Add the bottom symbol\n inners.push(makeInner(bottom, font, mode));\n\n var i;\n if (middle === null) {\n // Add that many symbols\n for (i = 0; i < repeatCount; i++) {\n inners.push(makeInner(repeat, font, mode));\n }\n } else {\n // When there is a middle bit, we need the middle part and two repeated\n // sections\n for (i = 0; i < repeatCount; i++) {\n inners.push(makeInner(repeat, font, mode));\n }\n inners.push(makeInner(middle, font, mode));\n for (i = 0; i < repeatCount; i++) {\n inners.push(makeInner(repeat, font, mode));\n }\n }\n\n // Add the top symbol\n inners.push(makeInner(top, font, mode));\n\n // Finally, build the vlist\n var inner = buildCommon.makeVList(inners, \"bottom\", depth, options);\n\n return styleWrap(\n makeSpan([\"delimsizing\", \"mult\"], [inner], options.getColor()),\n Style.TEXT, options);\n};\n\n// There are three kinds of delimiters, delimiters that stack when they become\n// too large\nvar stackLargeDelimiters = [\n \"(\", \")\", \"[\", \"\\\\lbrack\", \"]\", \"\\\\rbrack\",\n \"\\\\{\", \"\\\\lbrace\", \"\\\\}\", \"\\\\rbrace\",\n \"\\\\lfloor\", \"\\\\rfloor\", \"\\\\lceil\", \"\\\\rceil\",\n \"\\\\surd\",\n];\n\n// delimiters that always stack\nvar stackAlwaysDelimiters = [\n \"\\\\uparrow\", \"\\\\downarrow\", \"\\\\updownarrow\",\n \"\\\\Uparrow\", \"\\\\Downarrow\", \"\\\\Updownarrow\",\n \"|\", \"\\\\|\", \"\\\\vert\", \"\\\\Vert\",\n \"\\\\lvert\", \"\\\\rvert\", \"\\\\lVert\", \"\\\\rVert\",\n \"\\\\lgroup\", \"\\\\rgroup\", \"\\\\lmoustache\", \"\\\\rmoustache\",\n];\n\n// and delimiters that never stack\nvar stackNeverDelimiters = [\n \"<\", \">\", \"\\\\langle\", \"\\\\rangle\", \"/\", \"\\\\backslash\", \"\\\\lt\", \"\\\\gt\",\n];\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.\nvar sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];\n\n/**\n * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4.\n */\nvar makeSizedDelim = function(delim, size, options, mode) {\n // < and > turn into \\langle and \\rangle in delimiters\n if (delim === \"<\" || delim === \"\\\\lt\") {\n delim = \"\\\\langle\";\n } else if (delim === \">\" || delim === \"\\\\gt\") {\n delim = \"\\\\rangle\";\n }\n\n // Sized delimiters are never centered.\n if (utils.contains(stackLargeDelimiters, delim) ||\n utils.contains(stackNeverDelimiters, delim)) {\n return makeLargeDelim(delim, size, false, options, mode);\n } else if (utils.contains(stackAlwaysDelimiters, delim)) {\n return makeStackedDelim(\n delim, sizeToMaxHeight[size], false, options, mode);\n } else {\n throw new ParseError(\"Illegal delimiter: '\" + delim + \"'\");\n }\n};\n\n/**\n * There are three different sequences of delimiter sizes that the delimiters\n * follow depending on the kind of delimiter. This is used when creating custom\n * sized delimiters to decide whether to create a small, large, or stacked\n * delimiter.\n *\n * In real TeX, these sequences aren't explicitly defined, but are instead\n * defined inside the font metrics. Since there are only three sequences that\n * are possible for the delimiters that TeX defines, it is easier to just encode\n * them explicitly here.\n */\n\n// Delimiters that never stack try small delimiters and large delimiters only\nvar stackNeverDelimiterSequence = [\n {type: \"small\", style: Style.SCRIPTSCRIPT},\n {type: \"small\", style: Style.SCRIPT},\n {type: \"small\", style: Style.TEXT},\n {type: \"large\", size: 1},\n {type: \"large\", size: 2},\n {type: \"large\", size: 3},\n {type: \"large\", size: 4},\n];\n\n// Delimiters that always stack try the small delimiters first, then stack\nvar stackAlwaysDelimiterSequence = [\n {type: \"small\", style: Style.SCRIPTSCRIPT},\n {type: \"small\", style: Style.SCRIPT},\n {type: \"small\", style: Style.TEXT},\n {type: \"stack\"},\n];\n\n// Delimiters that stack when large try the small and then large delimiters, and\n// stack afterwards\nvar stackLargeDelimiterSequence = [\n {type: \"small\", style: Style.SCRIPTSCRIPT},\n {type: \"small\", style: Style.SCRIPT},\n {type: \"small\", style: Style.TEXT},\n {type: \"large\", size: 1},\n {type: \"large\", size: 2},\n {type: \"large\", size: 3},\n {type: \"large\", size: 4},\n {type: \"stack\"},\n];\n\n/**\n * Get the font used in a delimiter based on what kind of delimiter it is.\n */\nvar delimTypeToFont = function(type) {\n if (type.type === \"small\") {\n return \"Main-Regular\";\n } else if (type.type === \"large\") {\n return \"Size\" + type.size + \"-Regular\";\n } else if (type.type === \"stack\") {\n return \"Size4-Regular\";\n }\n};\n\n/**\n * Traverse a sequence of types of delimiters to decide what kind of delimiter\n * should be used to create a delimiter of the given height+depth.\n */\nvar traverseSequence = function(delim, height, sequence, options) {\n // Here, we choose the index we should start at in the sequences. In smaller\n // sizes (which correspond to larger numbers in style.size) we start earlier\n // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts\n // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2\n var start = Math.min(2, 3 - options.style.size);\n for (var i = start; i < sequence.length; i++) {\n if (sequence[i].type === \"stack\") {\n // This is always the last delimiter, so we just break the loop now.\n break;\n }\n\n var metrics = getMetrics(delim, delimTypeToFont(sequence[i]));\n var heightDepth = metrics.height + metrics.depth;\n\n // Small delimiters are scaled down versions of the same font, so we\n // account for the style change size.\n\n if (sequence[i].type === \"small\") {\n heightDepth *= sequence[i].style.sizeMultiplier;\n }\n\n // Check if the delimiter at this size works for the given height.\n if (heightDepth > height) {\n return sequence[i];\n }\n }\n\n // If we reached the end of the sequence, return the last sequence element.\n return sequence[sequence.length - 1];\n};\n\n/**\n * Make a delimiter of a given height+depth, with optional centering. Here, we\n * traverse the sequences, and create a delimiter that the sequence tells us to.\n */\nvar makeCustomSizedDelim = function(delim, height, center, options, mode) {\n if (delim === \"<\" || delim === \"\\\\lt\") {\n delim = \"\\\\langle\";\n } else if (delim === \">\" || delim === \"\\\\gt\") {\n delim = \"\\\\rangle\";\n }\n\n // Decide what sequence to use\n var sequence;\n if (utils.contains(stackNeverDelimiters, delim)) {\n sequence = stackNeverDelimiterSequence;\n } else if (utils.contains(stackLargeDelimiters, delim)) {\n sequence = stackLargeDelimiterSequence;\n } else {\n sequence = stackAlwaysDelimiterSequence;\n }\n\n // Look through the sequence\n var delimType = traverseSequence(delim, height, sequence, options);\n\n // Depending on the sequence element we decided on, call the appropriate\n // function.\n if (delimType.type === \"small\") {\n return makeSmallDelim(delim, delimType.style, center, options, mode);\n } else if (delimType.type === \"large\") {\n return makeLargeDelim(delim, delimType.size, center, options, mode);\n } else if (delimType.type === \"stack\") {\n return makeStackedDelim(delim, height, center, options, mode);\n }\n};\n\n/**\n * Make a delimiter for use with `\\left` and `\\right`, given a height and depth\n * of an expression that the delimiters surround.\n */\nvar makeLeftRightDelim = function(delim, height, depth, options, mode) {\n // We always center \\left/\\right delimiters, so the axis is always shifted\n var axisHeight =\n fontMetrics.metrics.axisHeight * options.style.sizeMultiplier;\n\n // Taken from TeX source, tex.web, function make_left_right\n var delimiterFactor = 901;\n var delimiterExtend = 5.0 / fontMetrics.metrics.ptPerEm;\n\n var maxDistFromAxis = Math.max(\n height - axisHeight, depth + axisHeight);\n\n var totalHeight = Math.max(\n // In real TeX, calculations are done using integral values which are\n // 65536 per pt, or 655360 per em. So, the division here truncates in\n // TeX but doesn't here, producing different results. If we wanted to\n // exactly match TeX's calculation, we could do\n // Math.floor(655360 * maxDistFromAxis / 500) *\n // delimiterFactor / 655360\n // (To see the difference, compare\n // x^{x^{\\left(\\rule{0.1em}{0.68em}\\right)}}\n // in TeX and KaTeX)\n maxDistFromAxis / 500 * delimiterFactor,\n 2 * maxDistFromAxis - delimiterExtend);\n\n // Finally, we defer to `makeCustomSizedDelim` with our calculated total\n // height\n return makeCustomSizedDelim(delim, totalHeight, true, options, mode);\n};\n\nmodule.exports = {\n sizedDelim: makeSizedDelim,\n customSizedDelim: makeCustomSizedDelim,\n leftRightDelim: makeLeftRightDelim,\n};\n"],"sourceRoot":""}