comparison katex/katex.js @ 8:4a25b534c81c javascript-experiment

Add v8 engine and include katex
author Jonatan Werpers <jonatan@werpers.com>
date Wed, 17 Jun 2020 21:43:52 +0200
parents
children
comparison
equal deleted inserted replaced
7:a5aa39557726 8:4a25b534c81c
1 (function webpackUniversalModuleDefinition(root, factory) {
2 if(typeof exports === 'object' && typeof module === 'object')
3 module.exports = factory();
4 else if(typeof define === 'function' && define.amd)
5 define([], factory);
6 else if(typeof exports === 'object')
7 exports["katex"] = factory();
8 else
9 root["katex"] = factory();
10 })((typeof self !== 'undefined' ? self : this), function() {
11 return /******/ (function(modules) { // webpackBootstrap
12 /******/ // The module cache
13 /******/ var installedModules = {};
14 /******/
15 /******/ // The require function
16 /******/ function __webpack_require__(moduleId) {
17 /******/
18 /******/ // Check if module is in cache
19 /******/ if(installedModules[moduleId]) {
20 /******/ return installedModules[moduleId].exports;
21 /******/ }
22 /******/ // Create a new module (and put it into the cache)
23 /******/ var module = installedModules[moduleId] = {
24 /******/ i: moduleId,
25 /******/ l: false,
26 /******/ exports: {}
27 /******/ };
28 /******/
29 /******/ // Execute the module function
30 /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
31 /******/
32 /******/ // Flag the module as loaded
33 /******/ module.l = true;
34 /******/
35 /******/ // Return the exports of the module
36 /******/ return module.exports;
37 /******/ }
38 /******/
39 /******/
40 /******/ // expose the modules object (__webpack_modules__)
41 /******/ __webpack_require__.m = modules;
42 /******/
43 /******/ // expose the module cache
44 /******/ __webpack_require__.c = installedModules;
45 /******/
46 /******/ // define getter function for harmony exports
47 /******/ __webpack_require__.d = function(exports, name, getter) {
48 /******/ if(!__webpack_require__.o(exports, name)) {
49 /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
50 /******/ }
51 /******/ };
52 /******/
53 /******/ // define __esModule on exports
54 /******/ __webpack_require__.r = function(exports) {
55 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
56 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
57 /******/ }
58 /******/ Object.defineProperty(exports, '__esModule', { value: true });
59 /******/ };
60 /******/
61 /******/ // create a fake namespace object
62 /******/ // mode & 1: value is a module id, require it
63 /******/ // mode & 2: merge all properties of value into the ns
64 /******/ // mode & 4: return value when already ns object
65 /******/ // mode & 8|1: behave like require
66 /******/ __webpack_require__.t = function(value, mode) {
67 /******/ if(mode & 1) value = __webpack_require__(value);
68 /******/ if(mode & 8) return value;
69 /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
70 /******/ var ns = Object.create(null);
71 /******/ __webpack_require__.r(ns);
72 /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
73 /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
74 /******/ return ns;
75 /******/ };
76 /******/
77 /******/ // getDefaultExport function for compatibility with non-harmony modules
78 /******/ __webpack_require__.n = function(module) {
79 /******/ var getter = module && module.__esModule ?
80 /******/ function getDefault() { return module['default']; } :
81 /******/ function getModuleExports() { return module; };
82 /******/ __webpack_require__.d(getter, 'a', getter);
83 /******/ return getter;
84 /******/ };
85 /******/
86 /******/ // Object.prototype.hasOwnProperty.call
87 /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
88 /******/
89 /******/ // __webpack_public_path__
90 /******/ __webpack_require__.p = "";
91 /******/
92 /******/
93 /******/ // Load entry module and return exports
94 /******/ return __webpack_require__(__webpack_require__.s = 1);
95 /******/ })
96 /************************************************************************/
97 /******/ ([
98 /* 0 */
99 /***/ (function(module, exports, __webpack_require__) {
100
101 // extracted by mini-css-extract-plugin
102
103 /***/ }),
104 /* 1 */
105 /***/ (function(module, __webpack_exports__, __webpack_require__) {
106
107 "use strict";
108 __webpack_require__.r(__webpack_exports__);
109
110 // EXTERNAL MODULE: ./src/katex.less
111 var katex = __webpack_require__(0);
112
113 // CONCATENATED MODULE: ./src/SourceLocation.js
114 /**
115 * Lexing or parsing positional information for error reporting.
116 * This object is immutable.
117 */
118 var SourceLocation =
119 /*#__PURE__*/
120 function () {
121 // The + prefix indicates that these fields aren't writeable
122 // Lexer holding the input string.
123 // Start offset, zero-based inclusive.
124 // End offset, zero-based exclusive.
125 function SourceLocation(lexer, start, end) {
126 this.lexer = void 0;
127 this.start = void 0;
128 this.end = void 0;
129 this.lexer = lexer;
130 this.start = start;
131 this.end = end;
132 }
133 /**
134 * Merges two `SourceLocation`s from location providers, given they are
135 * provided in order of appearance.
136 * - Returns the first one's location if only the first is provided.
137 * - Returns a merged range of the first and the last if both are provided
138 * and their lexers match.
139 * - Otherwise, returns null.
140 */
141
142
143 SourceLocation.range = function range(first, second) {
144 if (!second) {
145 return first && first.loc;
146 } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) {
147 return null;
148 } else {
149 return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end);
150 }
151 };
152
153 return SourceLocation;
154 }();
155
156
157 // CONCATENATED MODULE: ./src/Token.js
158
159 /**
160 * Interface required to break circular dependency between Token, Lexer, and
161 * ParseError.
162 */
163
164 /**
165 * The resulting token returned from `lex`.
166 *
167 * It consists of the token text plus some position information.
168 * The position information is essentially a range in an input string,
169 * but instead of referencing the bare input string, we refer to the lexer.
170 * That way it is possible to attach extra metadata to the input string,
171 * like for example a file name or similar.
172 *
173 * The position information is optional, so it is OK to construct synthetic
174 * tokens if appropriate. Not providing available position information may
175 * lead to degraded error reporting, though.
176 */
177 var Token_Token =
178 /*#__PURE__*/
179 function () {
180 function Token(text, // the text of this token
181 loc) {
182 this.text = void 0;
183 this.loc = void 0;
184 this.text = text;
185 this.loc = loc;
186 }
187 /**
188 * Given a pair of tokens (this and endToken), compute a `Token` encompassing
189 * the whole input range enclosed by these two.
190 */
191
192
193 var _proto = Token.prototype;
194
195 _proto.range = function range(endToken, // last token of the range, inclusive
196 text) // the text of the newly constructed token
197 {
198 return new Token(text, SourceLocation.range(this, endToken));
199 };
200
201 return Token;
202 }();
203 // CONCATENATED MODULE: ./src/ParseError.js
204
205
206 /**
207 * This is the ParseError class, which is the main error thrown by KaTeX
208 * functions when something has gone wrong. This is used to distinguish internal
209 * errors from errors in the expression that the user provided.
210 *
211 * If possible, a caller should provide a Token or ParseNode with information
212 * about where in the source string the problem occurred.
213 */
214 var ParseError = // Error position based on passed-in Token or ParseNode.
215 function ParseError(message, // The error message
216 token) // An object providing position information
217 {
218 this.position = void 0;
219 var error = "KaTeX parse error: " + message;
220 var start;
221 var loc = token && token.loc;
222
223 if (loc && loc.start <= loc.end) {
224 // If we have the input and a position, make the error a bit fancier
225 // Get the input
226 var input = loc.lexer.input; // Prepend some information
227
228 start = loc.start;
229 var end = loc.end;
230
231 if (start === input.length) {
232 error += " at end of input: ";
233 } else {
234 error += " at position " + (start + 1) + ": ";
235 } // Underline token in question using combining underscores
236
237
238 var underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); // Extract some context from the input and add it to the error
239
240 var left;
241
242 if (start > 15) {
243 left = "…" + input.slice(start - 15, start);
244 } else {
245 left = input.slice(0, start);
246 }
247
248 var right;
249
250 if (end + 15 < input.length) {
251 right = input.slice(end, end + 15) + "…";
252 } else {
253 right = input.slice(end);
254 }
255
256 error += left + underlined + right;
257 } // Some hackery to make ParseError a prototype of Error
258 // See http://stackoverflow.com/a/8460753
259
260
261 var self = new Error(error);
262 self.name = "ParseError"; // $FlowFixMe
263
264 self.__proto__ = ParseError.prototype; // $FlowFixMe
265
266 self.position = start;
267 return self;
268 }; // $FlowFixMe More hackery
269
270
271 ParseError.prototype.__proto__ = Error.prototype;
272 /* harmony default export */ var src_ParseError = (ParseError);
273 // CONCATENATED MODULE: ./src/utils.js
274 /**
275 * This file contains a list of utility functions which are useful in other
276 * files.
277 */
278
279 /**
280 * Return whether an element is contained in a list
281 */
282 var contains = function contains(list, elem) {
283 return list.indexOf(elem) !== -1;
284 };
285 /**
286 * Provide a default value if a setting is undefined
287 * NOTE: Couldn't use `T` as the output type due to facebook/flow#5022.
288 */
289
290
291 var deflt = function deflt(setting, defaultIfUndefined) {
292 return setting === undefined ? defaultIfUndefined : setting;
293 }; // hyphenate and escape adapted from Facebook's React under Apache 2 license
294
295
296 var uppercase = /([A-Z])/g;
297
298 var hyphenate = function hyphenate(str) {
299 return str.replace(uppercase, "-$1").toLowerCase();
300 };
301
302 var ESCAPE_LOOKUP = {
303 "&": "&amp;",
304 ">": "&gt;",
305 "<": "&lt;",
306 "\"": "&quot;",
307 "'": "&#x27;"
308 };
309 var ESCAPE_REGEX = /[&><"']/g;
310 /**
311 * Escapes text to prevent scripting attacks.
312 */
313
314 function utils_escape(text) {
315 return String(text).replace(ESCAPE_REGEX, function (match) {
316 return ESCAPE_LOOKUP[match];
317 });
318 }
319 /**
320 * Sometimes we want to pull out the innermost element of a group. In most
321 * cases, this will just be the group itself, but when ordgroups and colors have
322 * a single element, we want to pull that out.
323 */
324
325
326 var getBaseElem = function getBaseElem(group) {
327 if (group.type === "ordgroup") {
328 if (group.body.length === 1) {
329 return getBaseElem(group.body[0]);
330 } else {
331 return group;
332 }
333 } else if (group.type === "color") {
334 if (group.body.length === 1) {
335 return getBaseElem(group.body[0]);
336 } else {
337 return group;
338 }
339 } else if (group.type === "font") {
340 return getBaseElem(group.body);
341 } else {
342 return group;
343 }
344 };
345 /**
346 * TeXbook algorithms often reference "character boxes", which are simply groups
347 * with a single character in them. To decide if something is a character box,
348 * we find its innermost group, and see if it is a single character.
349 */
350
351
352 var utils_isCharacterBox = function isCharacterBox(group) {
353 var baseElem = getBaseElem(group); // These are all they types of groups which hold single characters
354
355 return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "atom";
356 };
357
358 var assert = function assert(value) {
359 if (!value) {
360 throw new Error('Expected non-null, but got ' + String(value));
361 }
362
363 return value;
364 };
365 /**
366 * Return the protocol of a URL, or "_relative" if the URL does not specify a
367 * protocol (and thus is relative).
368 */
369
370 var protocolFromUrl = function protocolFromUrl(url) {
371 var protocol = /^\s*([^\\/#]*?)(?::|&#0*58|&#x0*3a)/i.exec(url);
372 return protocol != null ? protocol[1] : "_relative";
373 };
374 /* harmony default export */ var utils = ({
375 contains: contains,
376 deflt: deflt,
377 escape: utils_escape,
378 hyphenate: hyphenate,
379 getBaseElem: getBaseElem,
380 isCharacterBox: utils_isCharacterBox,
381 protocolFromUrl: protocolFromUrl
382 });
383 // CONCATENATED MODULE: ./src/Settings.js
384 /* eslint no-console:0 */
385
386 /**
387 * This is a module for storing settings passed into KaTeX. It correctly handles
388 * default settings.
389 */
390
391
392
393
394 /**
395 * The main Settings object
396 *
397 * The current options stored are:
398 * - displayMode: Whether the expression should be typeset as inline math
399 * (false, the default), meaning that the math starts in
400 * \textstyle and is placed in an inline-block); or as display
401 * math (true), meaning that the math starts in \displaystyle
402 * and is placed in a block with vertical margin.
403 */
404 var Settings_Settings =
405 /*#__PURE__*/
406 function () {
407 function Settings(options) {
408 this.displayMode = void 0;
409 this.output = void 0;
410 this.leqno = void 0;
411 this.fleqn = void 0;
412 this.throwOnError = void 0;
413 this.errorColor = void 0;
414 this.macros = void 0;
415 this.minRuleThickness = void 0;
416 this.colorIsTextColor = void 0;
417 this.strict = void 0;
418 this.trust = void 0;
419 this.maxSize = void 0;
420 this.maxExpand = void 0;
421 // allow null options
422 options = options || {};
423 this.displayMode = utils.deflt(options.displayMode, false);
424 this.output = utils.deflt(options.output, "htmlAndMathml");
425 this.leqno = utils.deflt(options.leqno, false);
426 this.fleqn = utils.deflt(options.fleqn, false);
427 this.throwOnError = utils.deflt(options.throwOnError, true);
428 this.errorColor = utils.deflt(options.errorColor, "#cc0000");
429 this.macros = options.macros || {};
430 this.minRuleThickness = Math.max(0, utils.deflt(options.minRuleThickness, 0));
431 this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false);
432 this.strict = utils.deflt(options.strict, "warn");
433 this.trust = utils.deflt(options.trust, false);
434 this.maxSize = Math.max(0, utils.deflt(options.maxSize, Infinity));
435 this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000));
436 }
437 /**
438 * Report nonstrict (non-LaTeX-compatible) input.
439 * Can safely not be called if `this.strict` is false in JavaScript.
440 */
441
442
443 var _proto = Settings.prototype;
444
445 _proto.reportNonstrict = function reportNonstrict(errorCode, errorMsg, token) {
446 var strict = this.strict;
447
448 if (typeof strict === "function") {
449 // Allow return value of strict function to be boolean or string
450 // (or null/undefined, meaning no further processing).
451 strict = strict(errorCode, errorMsg, token);
452 }
453
454 if (!strict || strict === "ignore") {
455 return;
456 } else if (strict === true || strict === "error") {
457 throw new src_ParseError("LaTeX-incompatible input and strict mode is set to 'error': " + (errorMsg + " [" + errorCode + "]"), token);
458 } else if (strict === "warn") {
459 typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (errorMsg + " [" + errorCode + "]"));
460 } else {
461 // won't happen in type-safe code
462 typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]"));
463 }
464 }
465 /**
466 * Check whether to apply strict (LaTeX-adhering) behavior for unusual
467 * input (like `\\`). Unlike `nonstrict`, will not throw an error;
468 * instead, "error" translates to a return value of `true`, while "ignore"
469 * translates to a return value of `false`. May still print a warning:
470 * "warn" prints a warning and returns `false`.
471 * This is for the second category of `errorCode`s listed in the README.
472 */
473 ;
474
475 _proto.useStrictBehavior = function useStrictBehavior(errorCode, errorMsg, token) {
476 var strict = this.strict;
477
478 if (typeof strict === "function") {
479 // Allow return value of strict function to be boolean or string
480 // (or null/undefined, meaning no further processing).
481 // But catch any exceptions thrown by function, treating them
482 // like "error".
483 try {
484 strict = strict(errorCode, errorMsg, token);
485 } catch (error) {
486 strict = "error";
487 }
488 }
489
490 if (!strict || strict === "ignore") {
491 return false;
492 } else if (strict === true || strict === "error") {
493 return true;
494 } else if (strict === "warn") {
495 typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (errorMsg + " [" + errorCode + "]"));
496 return false;
497 } else {
498 // won't happen in type-safe code
499 typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]"));
500 return false;
501 }
502 }
503 /**
504 * Check whether to test potentially dangerous input, and return
505 * `true` (trusted) or `false` (untrusted). The sole argument `context`
506 * should be an object with `command` field specifying the relevant LaTeX
507 * command (as a string starting with `\`), and any other arguments, etc.
508 * If `context` has a `url` field, a `protocol` field will automatically
509 * get added by this function (changing the specified object).
510 */
511 ;
512
513 _proto.isTrusted = function isTrusted(context) {
514 if (context.url && !context.protocol) {
515 context.protocol = utils.protocolFromUrl(context.url);
516 }
517
518 var trust = typeof this.trust === "function" ? this.trust(context) : this.trust;
519 return Boolean(trust);
520 };
521
522 return Settings;
523 }();
524
525
526 // CONCATENATED MODULE: ./src/Style.js
527 /**
528 * This file contains information and classes for the various kinds of styles
529 * used in TeX. It provides a generic `Style` class, which holds information
530 * about a specific style. It then provides instances of all the different kinds
531 * of styles possible, and provides functions to move between them and get
532 * information about them.
533 */
534
535 /**
536 * The main style class. Contains a unique id for the style, a size (which is
537 * the same for cramped and uncramped version of a style), and a cramped flag.
538 */
539 var Style =
540 /*#__PURE__*/
541 function () {
542 function Style(id, size, cramped) {
543 this.id = void 0;
544 this.size = void 0;
545 this.cramped = void 0;
546 this.id = id;
547 this.size = size;
548 this.cramped = cramped;
549 }
550 /**
551 * Get the style of a superscript given a base in the current style.
552 */
553
554
555 var _proto = Style.prototype;
556
557 _proto.sup = function sup() {
558 return Style_styles[_sup[this.id]];
559 }
560 /**
561 * Get the style of a subscript given a base in the current style.
562 */
563 ;
564
565 _proto.sub = function sub() {
566 return Style_styles[_sub[this.id]];
567 }
568 /**
569 * Get the style of a fraction numerator given the fraction in the current
570 * style.
571 */
572 ;
573
574 _proto.fracNum = function fracNum() {
575 return Style_styles[_fracNum[this.id]];
576 }
577 /**
578 * Get the style of a fraction denominator given the fraction in the current
579 * style.
580 */
581 ;
582
583 _proto.fracDen = function fracDen() {
584 return Style_styles[_fracDen[this.id]];
585 }
586 /**
587 * Get the cramped version of a style (in particular, cramping a cramped style
588 * doesn't change the style).
589 */
590 ;
591
592 _proto.cramp = function cramp() {
593 return Style_styles[_cramp[this.id]];
594 }
595 /**
596 * Get a text or display version of this style.
597 */
598 ;
599
600 _proto.text = function text() {
601 return Style_styles[_text[this.id]];
602 }
603 /**
604 * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle)
605 */
606 ;
607
608 _proto.isTight = function isTight() {
609 return this.size >= 2;
610 };
611
612 return Style;
613 }(); // Export an interface for type checking, but don't expose the implementation.
614 // This way, no more styles can be generated.
615
616
617 // IDs of the different styles
618 var D = 0;
619 var Dc = 1;
620 var T = 2;
621 var Tc = 3;
622 var S = 4;
623 var Sc = 5;
624 var SS = 6;
625 var SSc = 7; // Instances of the different styles
626
627 var Style_styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)]; // Lookup tables for switching from one style to another
628
629 var _sup = [S, Sc, S, Sc, SS, SSc, SS, SSc];
630 var _sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc];
631 var _fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc];
632 var _fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc];
633 var _cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc];
634 var _text = [D, Dc, T, Tc, T, Tc, T, Tc]; // We only export some of the styles.
635
636 /* harmony default export */ var src_Style = ({
637 DISPLAY: Style_styles[D],
638 TEXT: Style_styles[T],
639 SCRIPT: Style_styles[S],
640 SCRIPTSCRIPT: Style_styles[SS]
641 });
642 // CONCATENATED MODULE: ./src/unicodeScripts.js
643 /*
644 * This file defines the Unicode scripts and script families that we
645 * support. To add new scripts or families, just add a new entry to the
646 * scriptData array below. Adding scripts to the scriptData array allows
647 * characters from that script to appear in \text{} environments.
648 */
649
650 /**
651 * Each script or script family has a name and an array of blocks.
652 * Each block is an array of two numbers which specify the start and
653 * end points (inclusive) of a block of Unicode codepoints.
654 */
655
656 /**
657 * Unicode block data for the families of scripts we support in \text{}.
658 * Scripts only need to appear here if they do not have font metrics.
659 */
660 var scriptData = [{
661 // Latin characters beyond the Latin-1 characters we have metrics for.
662 // Needed for Czech, Hungarian and Turkish text, for example.
663 name: 'latin',
664 blocks: [[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B
665 [0x0300, 0x036f]]
666 }, {
667 // The Cyrillic script used by Russian and related languages.
668 // A Cyrillic subset used to be supported as explicitly defined
669 // symbols in symbols.js
670 name: 'cyrillic',
671 blocks: [[0x0400, 0x04ff]]
672 }, {
673 // The Brahmic scripts of South and Southeast Asia
674 // Devanagari (0900–097F)
675 // Bengali (0980–09FF)
676 // Gurmukhi (0A00–0A7F)
677 // Gujarati (0A80–0AFF)
678 // Oriya (0B00–0B7F)
679 // Tamil (0B80–0BFF)
680 // Telugu (0C00–0C7F)
681 // Kannada (0C80–0CFF)
682 // Malayalam (0D00–0D7F)
683 // Sinhala (0D80–0DFF)
684 // Thai (0E00–0E7F)
685 // Lao (0E80–0EFF)
686 // Tibetan (0F00–0FFF)
687 // Myanmar (1000–109F)
688 name: 'brahmic',
689 blocks: [[0x0900, 0x109F]]
690 }, {
691 name: 'georgian',
692 blocks: [[0x10A0, 0x10ff]]
693 }, {
694 // Chinese and Japanese.
695 // The "k" in cjk is for Korean, but we've separated Korean out
696 name: "cjk",
697 blocks: [[0x3000, 0x30FF], // CJK symbols and punctuation, Hiragana, Katakana
698 [0x4E00, 0x9FAF], // CJK ideograms
699 [0xFF00, 0xFF60]]
700 }, {
701 // Korean
702 name: 'hangul',
703 blocks: [[0xAC00, 0xD7AF]]
704 }];
705 /**
706 * Given a codepoint, return the name of the script or script family
707 * it is from, or null if it is not part of a known block
708 */
709
710 function scriptFromCodepoint(codepoint) {
711 for (var i = 0; i < scriptData.length; i++) {
712 var script = scriptData[i];
713
714 for (var _i = 0; _i < script.blocks.length; _i++) {
715 var block = script.blocks[_i];
716
717 if (codepoint >= block[0] && codepoint <= block[1]) {
718 return script.name;
719 }
720 }
721 }
722
723 return null;
724 }
725 /**
726 * A flattened version of all the supported blocks in a single array.
727 * This is an optimization to make supportedCodepoint() fast.
728 */
729
730 var allBlocks = [];
731 scriptData.forEach(function (s) {
732 return s.blocks.forEach(function (b) {
733 return allBlocks.push.apply(allBlocks, b);
734 });
735 });
736 /**
737 * Given a codepoint, return true if it falls within one of the
738 * scripts or script families defined above and false otherwise.
739 *
740 * Micro benchmarks shows that this is faster than
741 * /[\u3000-\u30FF\u4E00-\u9FAF\uFF00-\uFF60\uAC00-\uD7AF\u0900-\u109F]/.test()
742 * in Firefox, Chrome and Node.
743 */
744
745 function supportedCodepoint(codepoint) {
746 for (var i = 0; i < allBlocks.length; i += 2) {
747 if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) {
748 return true;
749 }
750 }
751
752 return false;
753 }
754 // CONCATENATED MODULE: ./src/svgGeometry.js
755 /**
756 * This file provides support to domTree.js and delimiter.js.
757 * It's a storehouse of path geometry for SVG images.
758 */
759 // In all paths below, the viewBox-to-em scale is 1000:1.
760 var hLinePad = 80; // padding above a sqrt viniculum. Prevents image cropping.
761 // The viniculum of a \sqrt can be made thicker by a KaTeX rendering option.
762 // Think of variable extraViniculum as two detours in the SVG path.
763 // The detour begins at the lower left of the area labeled extraViniculum below.
764 // The detour proceeds one extraViniculum distance up and slightly to the right,
765 // displacing the radiused corner between surd and viniculum. The radius is
766 // traversed as usual, then the detour resumes. It goes right, to the end of
767 // the very long viniculumn, then down one extraViniculum distance,
768 // after which it resumes regular path geometry for the radical.
769
770 /* viniculum
771 /
772 /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraViniculum
773 / █████████████████████←0.04em (40 unit) std viniculum thickness
774 / /
775 / /
776 / /\
777 / / surd
778 */
779
780 var sqrtMain = function sqrtMain(extraViniculum, hLinePad) {
781 // sqrtMain path geometry is from glyph U221A in the font KaTeX Main
782 return "M95," + (622 + extraViniculum + hLinePad) + "\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl" + extraViniculum / 2.075 + " -" + extraViniculum + "\nc5.3,-9.3,12,-14,20,-14\nH400000v" + (40 + extraViniculum) + "H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM" + (834 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z";
783 };
784
785 var sqrtSize1 = function sqrtSize1(extraViniculum, hLinePad) {
786 // size1 is from glyph U221A in the font KaTeX_Size1-Regular
787 return "M263," + (601 + extraViniculum + hLinePad) + "c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl" + extraViniculum / 2.084 + " -" + extraViniculum + "\nc4.7,-7.3,11,-11,19,-11\nH40000v" + (40 + extraViniculum) + "H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z";
788 };
789
790 var sqrtSize2 = function sqrtSize2(extraViniculum, hLinePad) {
791 // size2 is from glyph U221A in the font KaTeX_Size2-Regular
792 return "M983 " + (10 + extraViniculum + hLinePad) + "\nl" + extraViniculum / 3.13 + " -" + extraViniculum + "\nc4,-6.7,10,-10,18,-10 H400000v" + (40 + extraViniculum) + "\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z";
793 };
794
795 var sqrtSize3 = function sqrtSize3(extraViniculum, hLinePad) {
796 // size3 is from glyph U221A in the font KaTeX_Size3-Regular
797 return "M424," + (2398 + extraViniculum + hLinePad) + "\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl" + extraViniculum / 4.223 + " -" + extraViniculum + "c4,-6.7,10,-10,18,-10 H400000\nv" + (40 + extraViniculum) + "H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M" + (1001 + extraViniculum) + " " + hLinePad + "\nh400000v" + (40 + extraViniculum) + "h-400000z";
798 };
799
800 var sqrtSize4 = function sqrtSize4(extraViniculum, hLinePad) {
801 // size4 is from glyph U221A in the font KaTeX_Size4-Regular
802 return "M473," + (2713 + extraViniculum + hLinePad) + "\nc339.3,-1799.3,509.3,-2700,510,-2702 l" + extraViniculum / 5.298 + " -" + extraViniculum + "\nc3.3,-7.3,9.3,-11,18,-11 H400000v" + (40 + extraViniculum) + "H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "H1017.7z";
803 };
804
805 var sqrtTall = function sqrtTall(extraViniculum, hLinePad, viewBoxHeight) {
806 // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular
807 // One path edge has a variable length. It runs vertically from the viniculumn
808 // to a point near (14 units) the bottom of the surd. The viniculum
809 // is normally 40 units thick. So the length of the line in question is:
810 var vertSegment = viewBoxHeight - 54 - hLinePad - extraViniculum;
811 return "M702 " + (extraViniculum + hLinePad) + "H400000" + (40 + extraViniculum) + "\nH742v" + vertSegment + "l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 " + hLinePad + "H400000v" + (40 + extraViniculum) + "H742z";
812 };
813
814 var sqrtPath = function sqrtPath(size, extraViniculum, viewBoxHeight) {
815 extraViniculum = 1000 * extraViniculum; // Convert from document ems to viewBox.
816
817 var path = "";
818
819 switch (size) {
820 case "sqrtMain":
821 path = sqrtMain(extraViniculum, hLinePad);
822 break;
823
824 case "sqrtSize1":
825 path = sqrtSize1(extraViniculum, hLinePad);
826 break;
827
828 case "sqrtSize2":
829 path = sqrtSize2(extraViniculum, hLinePad);
830 break;
831
832 case "sqrtSize3":
833 path = sqrtSize3(extraViniculum, hLinePad);
834 break;
835
836 case "sqrtSize4":
837 path = sqrtSize4(extraViniculum, hLinePad);
838 break;
839
840 case "sqrtTall":
841 path = sqrtTall(extraViniculum, hLinePad, viewBoxHeight);
842 }
843
844 return path;
845 };
846 var svgGeometry_path = {
847 // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main
848 doubleleftarrow: "M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",
849 // doublerightarrow is from glyph U+21D2 in font KaTeX Main
850 doublerightarrow: "M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",
851 // leftarrow is from glyph U+2190 in font KaTeX Main
852 leftarrow: "M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",
853 // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular
854 leftbrace: "M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",
855 leftbraceunder: "M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",
856 // overgroup is from the MnSymbol package (public domain)
857 leftgroup: "M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",
858 leftgroupunder: "M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",
859 // Harpoons are from glyph U+21BD in font KaTeX Main
860 leftharpoon: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",
861 leftharpoonplus: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",
862 leftharpoondown: "M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",
863 leftharpoondownplus: "M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",
864 // hook is from glyph U+21A9 in font KaTeX Main
865 lefthook: "M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",
866 leftlinesegment: "M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",
867 leftmapsto: "M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",
868 // tofrom is from glyph U+21C4 in font KaTeX AMS Regular
869 leftToFrom: "M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",
870 longequal: "M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",
871 midbrace: "M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",
872 midbraceunder: "M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",
873 oiintSize1: "M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",
874 oiintSize2: "M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",
875 oiiintSize1: "M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",
876 oiiintSize2: "M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",
877 rightarrow: "M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",
878 rightbrace: "M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",
879 rightbraceunder: "M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",
880 rightgroup: "M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",
881 rightgroupunder: "M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",
882 rightharpoon: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",
883 rightharpoonplus: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",
884 rightharpoondown: "M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",
885 rightharpoondownplus: "M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",
886 righthook: "M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",
887 rightlinesegment: "M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",
888 rightToFrom: "M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",
889 // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular
890 twoheadleftarrow: "M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",
891 twoheadrightarrow: "M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",
892 // tilde1 is a modified version of a glyph from the MnSymbol package
893 tilde1: "M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",
894 // ditto tilde2, tilde3, & tilde4
895 tilde2: "M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",
896 tilde3: "M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",
897 tilde4: "M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",
898 // vec is from glyph U+20D7 in font KaTeX Main
899 vec: "M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",
900 // widehat1 is a modified version of a glyph from the MnSymbol package
901 widehat1: "M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",
902 // ditto widehat2, widehat3, & widehat4
903 widehat2: "M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",
904 widehat3: "M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",
905 widehat4: "M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",
906 // widecheck paths are all inverted versions of widehat
907 widecheck1: "M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",
908 widecheck2: "M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",
909 widecheck3: "M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",
910 widecheck4: "M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",
911 // The next ten paths support reaction arrows from the mhchem package.
912 // Arrows for \ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX
913 // baraboveleftarrow is mostly from from glyph U+2190 in font KaTeX Main
914 baraboveleftarrow: "M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",
915 // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main
916 rightarrowabovebar: "M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",
917 // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end.
918 // Ref from mhchem.sty: \rlap{\raisebox{-.22ex}{$\kern0.5em
919 baraboveshortleftharpoon: "M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",
920 rightharpoonaboveshortbar: "M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",
921 shortbaraboveleftharpoon: "M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",
922 shortrightharpoonabovebar: "M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"
923 };
924 // CONCATENATED MODULE: ./src/tree.js
925
926
927 /**
928 * This node represents a document fragment, which contains elements, but when
929 * placed into the DOM doesn't have any representation itself. It only contains
930 * children and doesn't have any DOM node properties.
931 */
932 var tree_DocumentFragment =
933 /*#__PURE__*/
934 function () {
935 // HtmlDomNode
936 // Never used; needed for satisfying interface.
937 function DocumentFragment(children) {
938 this.children = void 0;
939 this.classes = void 0;
940 this.height = void 0;
941 this.depth = void 0;
942 this.maxFontSize = void 0;
943 this.style = void 0;
944 this.children = children;
945 this.classes = [];
946 this.height = 0;
947 this.depth = 0;
948 this.maxFontSize = 0;
949 this.style = {};
950 }
951
952 var _proto = DocumentFragment.prototype;
953
954 _proto.hasClass = function hasClass(className) {
955 return utils.contains(this.classes, className);
956 }
957 /** Convert the fragment into a node. */
958 ;
959
960 _proto.toNode = function toNode() {
961 var frag = document.createDocumentFragment();
962
963 for (var i = 0; i < this.children.length; i++) {
964 frag.appendChild(this.children[i].toNode());
965 }
966
967 return frag;
968 }
969 /** Convert the fragment into HTML markup. */
970 ;
971
972 _proto.toMarkup = function toMarkup() {
973 var markup = ""; // Simply concatenate the markup for the children together.
974
975 for (var i = 0; i < this.children.length; i++) {
976 markup += this.children[i].toMarkup();
977 }
978
979 return markup;
980 }
981 /**
982 * Converts the math node into a string, similar to innerText. Applies to
983 * MathDomNode's only.
984 */
985 ;
986
987 _proto.toText = function toText() {
988 // To avoid this, we would subclass documentFragment separately for
989 // MathML, but polyfills for subclassing is expensive per PR 1469.
990 // $FlowFixMe: Only works for ChildType = MathDomNode.
991 var toText = function toText(child) {
992 return child.toText();
993 };
994
995 return this.children.map(toText).join("");
996 };
997
998 return DocumentFragment;
999 }();
1000 // CONCATENATED MODULE: ./src/domTree.js
1001 /**
1002 * These objects store the data about the DOM nodes we create, as well as some
1003 * extra data. They can then be transformed into real DOM nodes with the
1004 * `toNode` function or HTML markup using `toMarkup`. They are useful for both
1005 * storing extra properties on the nodes, as well as providing a way to easily
1006 * work with the DOM.
1007 *
1008 * Similar functions for working with MathML nodes exist in mathMLTree.js.
1009 *
1010 * TODO: refactor `span` and `anchor` into common superclass when
1011 * target environments support class inheritance
1012 */
1013
1014
1015
1016
1017
1018 /**
1019 * Create an HTML className based on a list of classes. In addition to joining
1020 * with spaces, we also remove empty classes.
1021 */
1022 var createClass = function createClass(classes) {
1023 return classes.filter(function (cls) {
1024 return cls;
1025 }).join(" ");
1026 };
1027
1028 var initNode = function initNode(classes, options, style) {
1029 this.classes = classes || [];
1030 this.attributes = {};
1031 this.height = 0;
1032 this.depth = 0;
1033 this.maxFontSize = 0;
1034 this.style = style || {};
1035
1036 if (options) {
1037 if (options.style.isTight()) {
1038 this.classes.push("mtight");
1039 }
1040
1041 var color = options.getColor();
1042
1043 if (color) {
1044 this.style.color = color;
1045 }
1046 }
1047 };
1048 /**
1049 * Convert into an HTML node
1050 */
1051
1052
1053 var _toNode = function toNode(tagName) {
1054 var node = document.createElement(tagName); // Apply the class
1055
1056 node.className = createClass(this.classes); // Apply inline styles
1057
1058 for (var style in this.style) {
1059 if (this.style.hasOwnProperty(style)) {
1060 // $FlowFixMe Flow doesn't seem to understand span.style's type.
1061 node.style[style] = this.style[style];
1062 }
1063 } // Apply attributes
1064
1065
1066 for (var attr in this.attributes) {
1067 if (this.attributes.hasOwnProperty(attr)) {
1068 node.setAttribute(attr, this.attributes[attr]);
1069 }
1070 } // Append the children, also as HTML nodes
1071
1072
1073 for (var i = 0; i < this.children.length; i++) {
1074 node.appendChild(this.children[i].toNode());
1075 }
1076
1077 return node;
1078 };
1079 /**
1080 * Convert into an HTML markup string
1081 */
1082
1083
1084 var _toMarkup = function toMarkup(tagName) {
1085 var markup = "<" + tagName; // Add the class
1086
1087 if (this.classes.length) {
1088 markup += " class=\"" + utils.escape(createClass(this.classes)) + "\"";
1089 }
1090
1091 var styles = ""; // Add the styles, after hyphenation
1092
1093 for (var style in this.style) {
1094 if (this.style.hasOwnProperty(style)) {
1095 styles += utils.hyphenate(style) + ":" + this.style[style] + ";";
1096 }
1097 }
1098
1099 if (styles) {
1100 markup += " style=\"" + utils.escape(styles) + "\"";
1101 } // Add the attributes
1102
1103
1104 for (var attr in this.attributes) {
1105 if (this.attributes.hasOwnProperty(attr)) {
1106 markup += " " + attr + "=\"" + utils.escape(this.attributes[attr]) + "\"";
1107 }
1108 }
1109
1110 markup += ">"; // Add the markup of the children, also as markup
1111
1112 for (var i = 0; i < this.children.length; i++) {
1113 markup += this.children[i].toMarkup();
1114 }
1115
1116 markup += "</" + tagName + ">";
1117 return markup;
1118 }; // Making the type below exact with all optional fields doesn't work due to
1119 // - https://github.com/facebook/flow/issues/4582
1120 // - https://github.com/facebook/flow/issues/5688
1121 // However, since *all* fields are optional, $Shape<> works as suggested in 5688
1122 // above.
1123 // This type does not include all CSS properties. Additional properties should
1124 // be added as needed.
1125
1126
1127 /**
1128 * This node represents a span node, with a className, a list of children, and
1129 * an inline style. It also contains information about its height, depth, and
1130 * maxFontSize.
1131 *
1132 * Represents two types with different uses: SvgSpan to wrap an SVG and DomSpan
1133 * otherwise. This typesafety is important when HTML builders access a span's
1134 * children.
1135 */
1136 var domTree_Span =
1137 /*#__PURE__*/
1138 function () {
1139 function Span(classes, children, options, style) {
1140 this.children = void 0;
1141 this.attributes = void 0;
1142 this.classes = void 0;
1143 this.height = void 0;
1144 this.depth = void 0;
1145 this.width = void 0;
1146 this.maxFontSize = void 0;
1147 this.style = void 0;
1148 initNode.call(this, classes, options, style);
1149 this.children = children || [];
1150 }
1151 /**
1152 * Sets an arbitrary attribute on the span. Warning: use this wisely. Not
1153 * all browsers support attributes the same, and having too many custom
1154 * attributes is probably bad.
1155 */
1156
1157
1158 var _proto = Span.prototype;
1159
1160 _proto.setAttribute = function setAttribute(attribute, value) {
1161 this.attributes[attribute] = value;
1162 };
1163
1164 _proto.hasClass = function hasClass(className) {
1165 return utils.contains(this.classes, className);
1166 };
1167
1168 _proto.toNode = function toNode() {
1169 return _toNode.call(this, "span");
1170 };
1171
1172 _proto.toMarkup = function toMarkup() {
1173 return _toMarkup.call(this, "span");
1174 };
1175
1176 return Span;
1177 }();
1178 /**
1179 * This node represents an anchor (<a>) element with a hyperlink. See `span`
1180 * for further details.
1181 */
1182
1183 var domTree_Anchor =
1184 /*#__PURE__*/
1185 function () {
1186 function Anchor(href, classes, children, options) {
1187 this.children = void 0;
1188 this.attributes = void 0;
1189 this.classes = void 0;
1190 this.height = void 0;
1191 this.depth = void 0;
1192 this.maxFontSize = void 0;
1193 this.style = void 0;
1194 initNode.call(this, classes, options);
1195 this.children = children || [];
1196 this.setAttribute('href', href);
1197 }
1198
1199 var _proto2 = Anchor.prototype;
1200
1201 _proto2.setAttribute = function setAttribute(attribute, value) {
1202 this.attributes[attribute] = value;
1203 };
1204
1205 _proto2.hasClass = function hasClass(className) {
1206 return utils.contains(this.classes, className);
1207 };
1208
1209 _proto2.toNode = function toNode() {
1210 return _toNode.call(this, "a");
1211 };
1212
1213 _proto2.toMarkup = function toMarkup() {
1214 return _toMarkup.call(this, "a");
1215 };
1216
1217 return Anchor;
1218 }();
1219 /**
1220 * This node represents an image embed (<img>) element.
1221 */
1222
1223 var domTree_Img =
1224 /*#__PURE__*/
1225 function () {
1226 function Img(src, alt, style) {
1227 this.src = void 0;
1228 this.alt = void 0;
1229 this.classes = void 0;
1230 this.height = void 0;
1231 this.depth = void 0;
1232 this.maxFontSize = void 0;
1233 this.style = void 0;
1234 this.alt = alt;
1235 this.src = src;
1236 this.classes = ["mord"];
1237 this.style = style;
1238 }
1239
1240 var _proto3 = Img.prototype;
1241
1242 _proto3.hasClass = function hasClass(className) {
1243 return utils.contains(this.classes, className);
1244 };
1245
1246 _proto3.toNode = function toNode() {
1247 var node = document.createElement("img");
1248 node.src = this.src;
1249 node.alt = this.alt;
1250 node.className = "mord"; // Apply inline styles
1251
1252 for (var style in this.style) {
1253 if (this.style.hasOwnProperty(style)) {
1254 // $FlowFixMe
1255 node.style[style] = this.style[style];
1256 }
1257 }
1258
1259 return node;
1260 };
1261
1262 _proto3.toMarkup = function toMarkup() {
1263 var markup = "<img src='" + this.src + " 'alt='" + this.alt + "' "; // Add the styles, after hyphenation
1264
1265 var styles = "";
1266
1267 for (var style in this.style) {
1268 if (this.style.hasOwnProperty(style)) {
1269 styles += utils.hyphenate(style) + ":" + this.style[style] + ";";
1270 }
1271 }
1272
1273 if (styles) {
1274 markup += " style=\"" + utils.escape(styles) + "\"";
1275 }
1276
1277 markup += "'/>";
1278 return markup;
1279 };
1280
1281 return Img;
1282 }();
1283 var iCombinations = {
1284 'î': "\u0131\u0302",
1285 'ï': "\u0131\u0308",
1286 'í': "\u0131\u0301",
1287 // 'ī': '\u0131\u0304', // enable when we add Extended Latin
1288 'ì': "\u0131\u0300"
1289 };
1290 /**
1291 * A symbol node contains information about a single symbol. It either renders
1292 * to a single text node, or a span with a single text node in it, depending on
1293 * whether it has CSS classes, styles, or needs italic correction.
1294 */
1295
1296 var domTree_SymbolNode =
1297 /*#__PURE__*/
1298 function () {
1299 function SymbolNode(text, height, depth, italic, skew, width, classes, style) {
1300 this.text = void 0;
1301 this.height = void 0;
1302 this.depth = void 0;
1303 this.italic = void 0;
1304 this.skew = void 0;
1305 this.width = void 0;
1306 this.maxFontSize = void 0;
1307 this.classes = void 0;
1308 this.style = void 0;
1309 this.text = text;
1310 this.height = height || 0;
1311 this.depth = depth || 0;
1312 this.italic = italic || 0;
1313 this.skew = skew || 0;
1314 this.width = width || 0;
1315 this.classes = classes || [];
1316 this.style = style || {};
1317 this.maxFontSize = 0; // Mark text from non-Latin scripts with specific classes so that we
1318 // can specify which fonts to use. This allows us to render these
1319 // characters with a serif font in situations where the browser would
1320 // either default to a sans serif or render a placeholder character.
1321 // We use CSS class names like cjk_fallback, hangul_fallback and
1322 // brahmic_fallback. See ./unicodeScripts.js for the set of possible
1323 // script names
1324
1325 var script = scriptFromCodepoint(this.text.charCodeAt(0));
1326
1327 if (script) {
1328 this.classes.push(script + "_fallback");
1329 }
1330
1331 if (/[îïíì]/.test(this.text)) {
1332 // add ī when we add Extended Latin
1333 this.text = iCombinations[this.text];
1334 }
1335 }
1336
1337 var _proto4 = SymbolNode.prototype;
1338
1339 _proto4.hasClass = function hasClass(className) {
1340 return utils.contains(this.classes, className);
1341 }
1342 /**
1343 * Creates a text node or span from a symbol node. Note that a span is only
1344 * created if it is needed.
1345 */
1346 ;
1347
1348 _proto4.toNode = function toNode() {
1349 var node = document.createTextNode(this.text);
1350 var span = null;
1351
1352 if (this.italic > 0) {
1353 span = document.createElement("span");
1354 span.style.marginRight = this.italic + "em";
1355 }
1356
1357 if (this.classes.length > 0) {
1358 span = span || document.createElement("span");
1359 span.className = createClass(this.classes);
1360 }
1361
1362 for (var style in this.style) {
1363 if (this.style.hasOwnProperty(style)) {
1364 span = span || document.createElement("span"); // $FlowFixMe Flow doesn't seem to understand span.style's type.
1365
1366 span.style[style] = this.style[style];
1367 }
1368 }
1369
1370 if (span) {
1371 span.appendChild(node);
1372 return span;
1373 } else {
1374 return node;
1375 }
1376 }
1377 /**
1378 * Creates markup for a symbol node.
1379 */
1380 ;
1381
1382 _proto4.toMarkup = function toMarkup() {
1383 // TODO(alpert): More duplication than I'd like from
1384 // span.prototype.toMarkup and symbolNode.prototype.toNode...
1385 var needsSpan = false;
1386 var markup = "<span";
1387
1388 if (this.classes.length) {
1389 needsSpan = true;
1390 markup += " class=\"";
1391 markup += utils.escape(createClass(this.classes));
1392 markup += "\"";
1393 }
1394
1395 var styles = "";
1396
1397 if (this.italic > 0) {
1398 styles += "margin-right:" + this.italic + "em;";
1399 }
1400
1401 for (var style in this.style) {
1402 if (this.style.hasOwnProperty(style)) {
1403 styles += utils.hyphenate(style) + ":" + this.style[style] + ";";
1404 }
1405 }
1406
1407 if (styles) {
1408 needsSpan = true;
1409 markup += " style=\"" + utils.escape(styles) + "\"";
1410 }
1411
1412 var escaped = utils.escape(this.text);
1413
1414 if (needsSpan) {
1415 markup += ">";
1416 markup += escaped;
1417 markup += "</span>";
1418 return markup;
1419 } else {
1420 return escaped;
1421 }
1422 };
1423
1424 return SymbolNode;
1425 }();
1426 /**
1427 * SVG nodes are used to render stretchy wide elements.
1428 */
1429
1430 var SvgNode =
1431 /*#__PURE__*/
1432 function () {
1433 function SvgNode(children, attributes) {
1434 this.children = void 0;
1435 this.attributes = void 0;
1436 this.children = children || [];
1437 this.attributes = attributes || {};
1438 }
1439
1440 var _proto5 = SvgNode.prototype;
1441
1442 _proto5.toNode = function toNode() {
1443 var svgNS = "http://www.w3.org/2000/svg";
1444 var node = document.createElementNS(svgNS, "svg"); // Apply attributes
1445
1446 for (var attr in this.attributes) {
1447 if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
1448 node.setAttribute(attr, this.attributes[attr]);
1449 }
1450 }
1451
1452 for (var i = 0; i < this.children.length; i++) {
1453 node.appendChild(this.children[i].toNode());
1454 }
1455
1456 return node;
1457 };
1458
1459 _proto5.toMarkup = function toMarkup() {
1460 var markup = "<svg"; // Apply attributes
1461
1462 for (var attr in this.attributes) {
1463 if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
1464 markup += " " + attr + "='" + this.attributes[attr] + "'";
1465 }
1466 }
1467
1468 markup += ">";
1469
1470 for (var i = 0; i < this.children.length; i++) {
1471 markup += this.children[i].toMarkup();
1472 }
1473
1474 markup += "</svg>";
1475 return markup;
1476 };
1477
1478 return SvgNode;
1479 }();
1480 var domTree_PathNode =
1481 /*#__PURE__*/
1482 function () {
1483 function PathNode(pathName, alternate) {
1484 this.pathName = void 0;
1485 this.alternate = void 0;
1486 this.pathName = pathName;
1487 this.alternate = alternate; // Used only for \sqrt
1488 }
1489
1490 var _proto6 = PathNode.prototype;
1491
1492 _proto6.toNode = function toNode() {
1493 var svgNS = "http://www.w3.org/2000/svg";
1494 var node = document.createElementNS(svgNS, "path");
1495
1496 if (this.alternate) {
1497 node.setAttribute("d", this.alternate);
1498 } else {
1499 node.setAttribute("d", svgGeometry_path[this.pathName]);
1500 }
1501
1502 return node;
1503 };
1504
1505 _proto6.toMarkup = function toMarkup() {
1506 if (this.alternate) {
1507 return "<path d='" + this.alternate + "'/>";
1508 } else {
1509 return "<path d='" + svgGeometry_path[this.pathName] + "'/>";
1510 }
1511 };
1512
1513 return PathNode;
1514 }();
1515 var LineNode =
1516 /*#__PURE__*/
1517 function () {
1518 function LineNode(attributes) {
1519 this.attributes = void 0;
1520 this.attributes = attributes || {};
1521 }
1522
1523 var _proto7 = LineNode.prototype;
1524
1525 _proto7.toNode = function toNode() {
1526 var svgNS = "http://www.w3.org/2000/svg";
1527 var node = document.createElementNS(svgNS, "line"); // Apply attributes
1528
1529 for (var attr in this.attributes) {
1530 if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
1531 node.setAttribute(attr, this.attributes[attr]);
1532 }
1533 }
1534
1535 return node;
1536 };
1537
1538 _proto7.toMarkup = function toMarkup() {
1539 var markup = "<line";
1540
1541 for (var attr in this.attributes) {
1542 if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
1543 markup += " " + attr + "='" + this.attributes[attr] + "'";
1544 }
1545 }
1546
1547 markup += "/>";
1548 return markup;
1549 };
1550
1551 return LineNode;
1552 }();
1553 function assertSymbolDomNode(group) {
1554 if (group instanceof domTree_SymbolNode) {
1555 return group;
1556 } else {
1557 throw new Error("Expected symbolNode but got " + String(group) + ".");
1558 }
1559 }
1560 function assertSpan(group) {
1561 if (group instanceof domTree_Span) {
1562 return group;
1563 } else {
1564 throw new Error("Expected span<HtmlDomNode> but got " + String(group) + ".");
1565 }
1566 }
1567 // CONCATENATED MODULE: ./submodules/katex-fonts/fontMetricsData.js
1568 // This file is GENERATED by buildMetrics.sh. DO NOT MODIFY.
1569 /* harmony default export */ var fontMetricsData = ({
1570 "AMS-Regular": {
1571 "65": [0, 0.68889, 0, 0, 0.72222],
1572 "66": [0, 0.68889, 0, 0, 0.66667],
1573 "67": [0, 0.68889, 0, 0, 0.72222],
1574 "68": [0, 0.68889, 0, 0, 0.72222],
1575 "69": [0, 0.68889, 0, 0, 0.66667],
1576 "70": [0, 0.68889, 0, 0, 0.61111],
1577 "71": [0, 0.68889, 0, 0, 0.77778],
1578 "72": [0, 0.68889, 0, 0, 0.77778],
1579 "73": [0, 0.68889, 0, 0, 0.38889],
1580 "74": [0.16667, 0.68889, 0, 0, 0.5],
1581 "75": [0, 0.68889, 0, 0, 0.77778],
1582 "76": [0, 0.68889, 0, 0, 0.66667],
1583 "77": [0, 0.68889, 0, 0, 0.94445],
1584 "78": [0, 0.68889, 0, 0, 0.72222],
1585 "79": [0.16667, 0.68889, 0, 0, 0.77778],
1586 "80": [0, 0.68889, 0, 0, 0.61111],
1587 "81": [0.16667, 0.68889, 0, 0, 0.77778],
1588 "82": [0, 0.68889, 0, 0, 0.72222],
1589 "83": [0, 0.68889, 0, 0, 0.55556],
1590 "84": [0, 0.68889, 0, 0, 0.66667],
1591 "85": [0, 0.68889, 0, 0, 0.72222],
1592 "86": [0, 0.68889, 0, 0, 0.72222],
1593 "87": [0, 0.68889, 0, 0, 1.0],
1594 "88": [0, 0.68889, 0, 0, 0.72222],
1595 "89": [0, 0.68889, 0, 0, 0.72222],
1596 "90": [0, 0.68889, 0, 0, 0.66667],
1597 "107": [0, 0.68889, 0, 0, 0.55556],
1598 "165": [0, 0.675, 0.025, 0, 0.75],
1599 "174": [0.15559, 0.69224, 0, 0, 0.94666],
1600 "240": [0, 0.68889, 0, 0, 0.55556],
1601 "295": [0, 0.68889, 0, 0, 0.54028],
1602 "710": [0, 0.825, 0, 0, 2.33334],
1603 "732": [0, 0.9, 0, 0, 2.33334],
1604 "770": [0, 0.825, 0, 0, 2.33334],
1605 "771": [0, 0.9, 0, 0, 2.33334],
1606 "989": [0.08167, 0.58167, 0, 0, 0.77778],
1607 "1008": [0, 0.43056, 0.04028, 0, 0.66667],
1608 "8245": [0, 0.54986, 0, 0, 0.275],
1609 "8463": [0, 0.68889, 0, 0, 0.54028],
1610 "8487": [0, 0.68889, 0, 0, 0.72222],
1611 "8498": [0, 0.68889, 0, 0, 0.55556],
1612 "8502": [0, 0.68889, 0, 0, 0.66667],
1613 "8503": [0, 0.68889, 0, 0, 0.44445],
1614 "8504": [0, 0.68889, 0, 0, 0.66667],
1615 "8513": [0, 0.68889, 0, 0, 0.63889],
1616 "8592": [-0.03598, 0.46402, 0, 0, 0.5],
1617 "8594": [-0.03598, 0.46402, 0, 0, 0.5],
1618 "8602": [-0.13313, 0.36687, 0, 0, 1.0],
1619 "8603": [-0.13313, 0.36687, 0, 0, 1.0],
1620 "8606": [0.01354, 0.52239, 0, 0, 1.0],
1621 "8608": [0.01354, 0.52239, 0, 0, 1.0],
1622 "8610": [0.01354, 0.52239, 0, 0, 1.11111],
1623 "8611": [0.01354, 0.52239, 0, 0, 1.11111],
1624 "8619": [0, 0.54986, 0, 0, 1.0],
1625 "8620": [0, 0.54986, 0, 0, 1.0],
1626 "8621": [-0.13313, 0.37788, 0, 0, 1.38889],
1627 "8622": [-0.13313, 0.36687, 0, 0, 1.0],
1628 "8624": [0, 0.69224, 0, 0, 0.5],
1629 "8625": [0, 0.69224, 0, 0, 0.5],
1630 "8630": [0, 0.43056, 0, 0, 1.0],
1631 "8631": [0, 0.43056, 0, 0, 1.0],
1632 "8634": [0.08198, 0.58198, 0, 0, 0.77778],
1633 "8635": [0.08198, 0.58198, 0, 0, 0.77778],
1634 "8638": [0.19444, 0.69224, 0, 0, 0.41667],
1635 "8639": [0.19444, 0.69224, 0, 0, 0.41667],
1636 "8642": [0.19444, 0.69224, 0, 0, 0.41667],
1637 "8643": [0.19444, 0.69224, 0, 0, 0.41667],
1638 "8644": [0.1808, 0.675, 0, 0, 1.0],
1639 "8646": [0.1808, 0.675, 0, 0, 1.0],
1640 "8647": [0.1808, 0.675, 0, 0, 1.0],
1641 "8648": [0.19444, 0.69224, 0, 0, 0.83334],
1642 "8649": [0.1808, 0.675, 0, 0, 1.0],
1643 "8650": [0.19444, 0.69224, 0, 0, 0.83334],
1644 "8651": [0.01354, 0.52239, 0, 0, 1.0],
1645 "8652": [0.01354, 0.52239, 0, 0, 1.0],
1646 "8653": [-0.13313, 0.36687, 0, 0, 1.0],
1647 "8654": [-0.13313, 0.36687, 0, 0, 1.0],
1648 "8655": [-0.13313, 0.36687, 0, 0, 1.0],
1649 "8666": [0.13667, 0.63667, 0, 0, 1.0],
1650 "8667": [0.13667, 0.63667, 0, 0, 1.0],
1651 "8669": [-0.13313, 0.37788, 0, 0, 1.0],
1652 "8672": [-0.064, 0.437, 0, 0, 1.334],
1653 "8674": [-0.064, 0.437, 0, 0, 1.334],
1654 "8705": [0, 0.825, 0, 0, 0.5],
1655 "8708": [0, 0.68889, 0, 0, 0.55556],
1656 "8709": [0.08167, 0.58167, 0, 0, 0.77778],
1657 "8717": [0, 0.43056, 0, 0, 0.42917],
1658 "8722": [-0.03598, 0.46402, 0, 0, 0.5],
1659 "8724": [0.08198, 0.69224, 0, 0, 0.77778],
1660 "8726": [0.08167, 0.58167, 0, 0, 0.77778],
1661 "8733": [0, 0.69224, 0, 0, 0.77778],
1662 "8736": [0, 0.69224, 0, 0, 0.72222],
1663 "8737": [0, 0.69224, 0, 0, 0.72222],
1664 "8738": [0.03517, 0.52239, 0, 0, 0.72222],
1665 "8739": [0.08167, 0.58167, 0, 0, 0.22222],
1666 "8740": [0.25142, 0.74111, 0, 0, 0.27778],
1667 "8741": [0.08167, 0.58167, 0, 0, 0.38889],
1668 "8742": [0.25142, 0.74111, 0, 0, 0.5],
1669 "8756": [0, 0.69224, 0, 0, 0.66667],
1670 "8757": [0, 0.69224, 0, 0, 0.66667],
1671 "8764": [-0.13313, 0.36687, 0, 0, 0.77778],
1672 "8765": [-0.13313, 0.37788, 0, 0, 0.77778],
1673 "8769": [-0.13313, 0.36687, 0, 0, 0.77778],
1674 "8770": [-0.03625, 0.46375, 0, 0, 0.77778],
1675 "8774": [0.30274, 0.79383, 0, 0, 0.77778],
1676 "8776": [-0.01688, 0.48312, 0, 0, 0.77778],
1677 "8778": [0.08167, 0.58167, 0, 0, 0.77778],
1678 "8782": [0.06062, 0.54986, 0, 0, 0.77778],
1679 "8783": [0.06062, 0.54986, 0, 0, 0.77778],
1680 "8785": [0.08198, 0.58198, 0, 0, 0.77778],
1681 "8786": [0.08198, 0.58198, 0, 0, 0.77778],
1682 "8787": [0.08198, 0.58198, 0, 0, 0.77778],
1683 "8790": [0, 0.69224, 0, 0, 0.77778],
1684 "8791": [0.22958, 0.72958, 0, 0, 0.77778],
1685 "8796": [0.08198, 0.91667, 0, 0, 0.77778],
1686 "8806": [0.25583, 0.75583, 0, 0, 0.77778],
1687 "8807": [0.25583, 0.75583, 0, 0, 0.77778],
1688 "8808": [0.25142, 0.75726, 0, 0, 0.77778],
1689 "8809": [0.25142, 0.75726, 0, 0, 0.77778],
1690 "8812": [0.25583, 0.75583, 0, 0, 0.5],
1691 "8814": [0.20576, 0.70576, 0, 0, 0.77778],
1692 "8815": [0.20576, 0.70576, 0, 0, 0.77778],
1693 "8816": [0.30274, 0.79383, 0, 0, 0.77778],
1694 "8817": [0.30274, 0.79383, 0, 0, 0.77778],
1695 "8818": [0.22958, 0.72958, 0, 0, 0.77778],
1696 "8819": [0.22958, 0.72958, 0, 0, 0.77778],
1697 "8822": [0.1808, 0.675, 0, 0, 0.77778],
1698 "8823": [0.1808, 0.675, 0, 0, 0.77778],
1699 "8828": [0.13667, 0.63667, 0, 0, 0.77778],
1700 "8829": [0.13667, 0.63667, 0, 0, 0.77778],
1701 "8830": [0.22958, 0.72958, 0, 0, 0.77778],
1702 "8831": [0.22958, 0.72958, 0, 0, 0.77778],
1703 "8832": [0.20576, 0.70576, 0, 0, 0.77778],
1704 "8833": [0.20576, 0.70576, 0, 0, 0.77778],
1705 "8840": [0.30274, 0.79383, 0, 0, 0.77778],
1706 "8841": [0.30274, 0.79383, 0, 0, 0.77778],
1707 "8842": [0.13597, 0.63597, 0, 0, 0.77778],
1708 "8843": [0.13597, 0.63597, 0, 0, 0.77778],
1709 "8847": [0.03517, 0.54986, 0, 0, 0.77778],
1710 "8848": [0.03517, 0.54986, 0, 0, 0.77778],
1711 "8858": [0.08198, 0.58198, 0, 0, 0.77778],
1712 "8859": [0.08198, 0.58198, 0, 0, 0.77778],
1713 "8861": [0.08198, 0.58198, 0, 0, 0.77778],
1714 "8862": [0, 0.675, 0, 0, 0.77778],
1715 "8863": [0, 0.675, 0, 0, 0.77778],
1716 "8864": [0, 0.675, 0, 0, 0.77778],
1717 "8865": [0, 0.675, 0, 0, 0.77778],
1718 "8872": [0, 0.69224, 0, 0, 0.61111],
1719 "8873": [0, 0.69224, 0, 0, 0.72222],
1720 "8874": [0, 0.69224, 0, 0, 0.88889],
1721 "8876": [0, 0.68889, 0, 0, 0.61111],
1722 "8877": [0, 0.68889, 0, 0, 0.61111],
1723 "8878": [0, 0.68889, 0, 0, 0.72222],
1724 "8879": [0, 0.68889, 0, 0, 0.72222],
1725 "8882": [0.03517, 0.54986, 0, 0, 0.77778],
1726 "8883": [0.03517, 0.54986, 0, 0, 0.77778],
1727 "8884": [0.13667, 0.63667, 0, 0, 0.77778],
1728 "8885": [0.13667, 0.63667, 0, 0, 0.77778],
1729 "8888": [0, 0.54986, 0, 0, 1.11111],
1730 "8890": [0.19444, 0.43056, 0, 0, 0.55556],
1731 "8891": [0.19444, 0.69224, 0, 0, 0.61111],
1732 "8892": [0.19444, 0.69224, 0, 0, 0.61111],
1733 "8901": [0, 0.54986, 0, 0, 0.27778],
1734 "8903": [0.08167, 0.58167, 0, 0, 0.77778],
1735 "8905": [0.08167, 0.58167, 0, 0, 0.77778],
1736 "8906": [0.08167, 0.58167, 0, 0, 0.77778],
1737 "8907": [0, 0.69224, 0, 0, 0.77778],
1738 "8908": [0, 0.69224, 0, 0, 0.77778],
1739 "8909": [-0.03598, 0.46402, 0, 0, 0.77778],
1740 "8910": [0, 0.54986, 0, 0, 0.76042],
1741 "8911": [0, 0.54986, 0, 0, 0.76042],
1742 "8912": [0.03517, 0.54986, 0, 0, 0.77778],
1743 "8913": [0.03517, 0.54986, 0, 0, 0.77778],
1744 "8914": [0, 0.54986, 0, 0, 0.66667],
1745 "8915": [0, 0.54986, 0, 0, 0.66667],
1746 "8916": [0, 0.69224, 0, 0, 0.66667],
1747 "8918": [0.0391, 0.5391, 0, 0, 0.77778],
1748 "8919": [0.0391, 0.5391, 0, 0, 0.77778],
1749 "8920": [0.03517, 0.54986, 0, 0, 1.33334],
1750 "8921": [0.03517, 0.54986, 0, 0, 1.33334],
1751 "8922": [0.38569, 0.88569, 0, 0, 0.77778],
1752 "8923": [0.38569, 0.88569, 0, 0, 0.77778],
1753 "8926": [0.13667, 0.63667, 0, 0, 0.77778],
1754 "8927": [0.13667, 0.63667, 0, 0, 0.77778],
1755 "8928": [0.30274, 0.79383, 0, 0, 0.77778],
1756 "8929": [0.30274, 0.79383, 0, 0, 0.77778],
1757 "8934": [0.23222, 0.74111, 0, 0, 0.77778],
1758 "8935": [0.23222, 0.74111, 0, 0, 0.77778],
1759 "8936": [0.23222, 0.74111, 0, 0, 0.77778],
1760 "8937": [0.23222, 0.74111, 0, 0, 0.77778],
1761 "8938": [0.20576, 0.70576, 0, 0, 0.77778],
1762 "8939": [0.20576, 0.70576, 0, 0, 0.77778],
1763 "8940": [0.30274, 0.79383, 0, 0, 0.77778],
1764 "8941": [0.30274, 0.79383, 0, 0, 0.77778],
1765 "8994": [0.19444, 0.69224, 0, 0, 0.77778],
1766 "8995": [0.19444, 0.69224, 0, 0, 0.77778],
1767 "9416": [0.15559, 0.69224, 0, 0, 0.90222],
1768 "9484": [0, 0.69224, 0, 0, 0.5],
1769 "9488": [0, 0.69224, 0, 0, 0.5],
1770 "9492": [0, 0.37788, 0, 0, 0.5],
1771 "9496": [0, 0.37788, 0, 0, 0.5],
1772 "9585": [0.19444, 0.68889, 0, 0, 0.88889],
1773 "9586": [0.19444, 0.74111, 0, 0, 0.88889],
1774 "9632": [0, 0.675, 0, 0, 0.77778],
1775 "9633": [0, 0.675, 0, 0, 0.77778],
1776 "9650": [0, 0.54986, 0, 0, 0.72222],
1777 "9651": [0, 0.54986, 0, 0, 0.72222],
1778 "9654": [0.03517, 0.54986, 0, 0, 0.77778],
1779 "9660": [0, 0.54986, 0, 0, 0.72222],
1780 "9661": [0, 0.54986, 0, 0, 0.72222],
1781 "9664": [0.03517, 0.54986, 0, 0, 0.77778],
1782 "9674": [0.11111, 0.69224, 0, 0, 0.66667],
1783 "9733": [0.19444, 0.69224, 0, 0, 0.94445],
1784 "10003": [0, 0.69224, 0, 0, 0.83334],
1785 "10016": [0, 0.69224, 0, 0, 0.83334],
1786 "10731": [0.11111, 0.69224, 0, 0, 0.66667],
1787 "10846": [0.19444, 0.75583, 0, 0, 0.61111],
1788 "10877": [0.13667, 0.63667, 0, 0, 0.77778],
1789 "10878": [0.13667, 0.63667, 0, 0, 0.77778],
1790 "10885": [0.25583, 0.75583, 0, 0, 0.77778],
1791 "10886": [0.25583, 0.75583, 0, 0, 0.77778],
1792 "10887": [0.13597, 0.63597, 0, 0, 0.77778],
1793 "10888": [0.13597, 0.63597, 0, 0, 0.77778],
1794 "10889": [0.26167, 0.75726, 0, 0, 0.77778],
1795 "10890": [0.26167, 0.75726, 0, 0, 0.77778],
1796 "10891": [0.48256, 0.98256, 0, 0, 0.77778],
1797 "10892": [0.48256, 0.98256, 0, 0, 0.77778],
1798 "10901": [0.13667, 0.63667, 0, 0, 0.77778],
1799 "10902": [0.13667, 0.63667, 0, 0, 0.77778],
1800 "10933": [0.25142, 0.75726, 0, 0, 0.77778],
1801 "10934": [0.25142, 0.75726, 0, 0, 0.77778],
1802 "10935": [0.26167, 0.75726, 0, 0, 0.77778],
1803 "10936": [0.26167, 0.75726, 0, 0, 0.77778],
1804 "10937": [0.26167, 0.75726, 0, 0, 0.77778],
1805 "10938": [0.26167, 0.75726, 0, 0, 0.77778],
1806 "10949": [0.25583, 0.75583, 0, 0, 0.77778],
1807 "10950": [0.25583, 0.75583, 0, 0, 0.77778],
1808 "10955": [0.28481, 0.79383, 0, 0, 0.77778],
1809 "10956": [0.28481, 0.79383, 0, 0, 0.77778],
1810 "57350": [0.08167, 0.58167, 0, 0, 0.22222],
1811 "57351": [0.08167, 0.58167, 0, 0, 0.38889],
1812 "57352": [0.08167, 0.58167, 0, 0, 0.77778],
1813 "57353": [0, 0.43056, 0.04028, 0, 0.66667],
1814 "57356": [0.25142, 0.75726, 0, 0, 0.77778],
1815 "57357": [0.25142, 0.75726, 0, 0, 0.77778],
1816 "57358": [0.41951, 0.91951, 0, 0, 0.77778],
1817 "57359": [0.30274, 0.79383, 0, 0, 0.77778],
1818 "57360": [0.30274, 0.79383, 0, 0, 0.77778],
1819 "57361": [0.41951, 0.91951, 0, 0, 0.77778],
1820 "57366": [0.25142, 0.75726, 0, 0, 0.77778],
1821 "57367": [0.25142, 0.75726, 0, 0, 0.77778],
1822 "57368": [0.25142, 0.75726, 0, 0, 0.77778],
1823 "57369": [0.25142, 0.75726, 0, 0, 0.77778],
1824 "57370": [0.13597, 0.63597, 0, 0, 0.77778],
1825 "57371": [0.13597, 0.63597, 0, 0, 0.77778]
1826 },
1827 "Caligraphic-Regular": {
1828 "48": [0, 0.43056, 0, 0, 0.5],
1829 "49": [0, 0.43056, 0, 0, 0.5],
1830 "50": [0, 0.43056, 0, 0, 0.5],
1831 "51": [0.19444, 0.43056, 0, 0, 0.5],
1832 "52": [0.19444, 0.43056, 0, 0, 0.5],
1833 "53": [0.19444, 0.43056, 0, 0, 0.5],
1834 "54": [0, 0.64444, 0, 0, 0.5],
1835 "55": [0.19444, 0.43056, 0, 0, 0.5],
1836 "56": [0, 0.64444, 0, 0, 0.5],
1837 "57": [0.19444, 0.43056, 0, 0, 0.5],
1838 "65": [0, 0.68333, 0, 0.19445, 0.79847],
1839 "66": [0, 0.68333, 0.03041, 0.13889, 0.65681],
1840 "67": [0, 0.68333, 0.05834, 0.13889, 0.52653],
1841 "68": [0, 0.68333, 0.02778, 0.08334, 0.77139],
1842 "69": [0, 0.68333, 0.08944, 0.11111, 0.52778],
1843 "70": [0, 0.68333, 0.09931, 0.11111, 0.71875],
1844 "71": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487],
1845 "72": [0, 0.68333, 0.00965, 0.11111, 0.84452],
1846 "73": [0, 0.68333, 0.07382, 0, 0.54452],
1847 "74": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778],
1848 "75": [0, 0.68333, 0.01445, 0.05556, 0.76195],
1849 "76": [0, 0.68333, 0, 0.13889, 0.68972],
1850 "77": [0, 0.68333, 0, 0.13889, 1.2009],
1851 "78": [0, 0.68333, 0.14736, 0.08334, 0.82049],
1852 "79": [0, 0.68333, 0.02778, 0.11111, 0.79611],
1853 "80": [0, 0.68333, 0.08222, 0.08334, 0.69556],
1854 "81": [0.09722, 0.68333, 0, 0.11111, 0.81667],
1855 "82": [0, 0.68333, 0, 0.08334, 0.8475],
1856 "83": [0, 0.68333, 0.075, 0.13889, 0.60556],
1857 "84": [0, 0.68333, 0.25417, 0, 0.54464],
1858 "85": [0, 0.68333, 0.09931, 0.08334, 0.62583],
1859 "86": [0, 0.68333, 0.08222, 0, 0.61278],
1860 "87": [0, 0.68333, 0.08222, 0.08334, 0.98778],
1861 "88": [0, 0.68333, 0.14643, 0.13889, 0.7133],
1862 "89": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834],
1863 "90": [0, 0.68333, 0.07944, 0.13889, 0.72473]
1864 },
1865 "Fraktur-Regular": {
1866 "33": [0, 0.69141, 0, 0, 0.29574],
1867 "34": [0, 0.69141, 0, 0, 0.21471],
1868 "38": [0, 0.69141, 0, 0, 0.73786],
1869 "39": [0, 0.69141, 0, 0, 0.21201],
1870 "40": [0.24982, 0.74947, 0, 0, 0.38865],
1871 "41": [0.24982, 0.74947, 0, 0, 0.38865],
1872 "42": [0, 0.62119, 0, 0, 0.27764],
1873 "43": [0.08319, 0.58283, 0, 0, 0.75623],
1874 "44": [0, 0.10803, 0, 0, 0.27764],
1875 "45": [0.08319, 0.58283, 0, 0, 0.75623],
1876 "46": [0, 0.10803, 0, 0, 0.27764],
1877 "47": [0.24982, 0.74947, 0, 0, 0.50181],
1878 "48": [0, 0.47534, 0, 0, 0.50181],
1879 "49": [0, 0.47534, 0, 0, 0.50181],
1880 "50": [0, 0.47534, 0, 0, 0.50181],
1881 "51": [0.18906, 0.47534, 0, 0, 0.50181],
1882 "52": [0.18906, 0.47534, 0, 0, 0.50181],
1883 "53": [0.18906, 0.47534, 0, 0, 0.50181],
1884 "54": [0, 0.69141, 0, 0, 0.50181],
1885 "55": [0.18906, 0.47534, 0, 0, 0.50181],
1886 "56": [0, 0.69141, 0, 0, 0.50181],
1887 "57": [0.18906, 0.47534, 0, 0, 0.50181],
1888 "58": [0, 0.47534, 0, 0, 0.21606],
1889 "59": [0.12604, 0.47534, 0, 0, 0.21606],
1890 "61": [-0.13099, 0.36866, 0, 0, 0.75623],
1891 "63": [0, 0.69141, 0, 0, 0.36245],
1892 "65": [0, 0.69141, 0, 0, 0.7176],
1893 "66": [0, 0.69141, 0, 0, 0.88397],
1894 "67": [0, 0.69141, 0, 0, 0.61254],
1895 "68": [0, 0.69141, 0, 0, 0.83158],
1896 "69": [0, 0.69141, 0, 0, 0.66278],
1897 "70": [0.12604, 0.69141, 0, 0, 0.61119],
1898 "71": [0, 0.69141, 0, 0, 0.78539],
1899 "72": [0.06302, 0.69141, 0, 0, 0.7203],
1900 "73": [0, 0.69141, 0, 0, 0.55448],
1901 "74": [0.12604, 0.69141, 0, 0, 0.55231],
1902 "75": [0, 0.69141, 0, 0, 0.66845],
1903 "76": [0, 0.69141, 0, 0, 0.66602],
1904 "77": [0, 0.69141, 0, 0, 1.04953],
1905 "78": [0, 0.69141, 0, 0, 0.83212],
1906 "79": [0, 0.69141, 0, 0, 0.82699],
1907 "80": [0.18906, 0.69141, 0, 0, 0.82753],
1908 "81": [0.03781, 0.69141, 0, 0, 0.82699],
1909 "82": [0, 0.69141, 0, 0, 0.82807],
1910 "83": [0, 0.69141, 0, 0, 0.82861],
1911 "84": [0, 0.69141, 0, 0, 0.66899],
1912 "85": [0, 0.69141, 0, 0, 0.64576],
1913 "86": [0, 0.69141, 0, 0, 0.83131],
1914 "87": [0, 0.69141, 0, 0, 1.04602],
1915 "88": [0, 0.69141, 0, 0, 0.71922],
1916 "89": [0.18906, 0.69141, 0, 0, 0.83293],
1917 "90": [0.12604, 0.69141, 0, 0, 0.60201],
1918 "91": [0.24982, 0.74947, 0, 0, 0.27764],
1919 "93": [0.24982, 0.74947, 0, 0, 0.27764],
1920 "94": [0, 0.69141, 0, 0, 0.49965],
1921 "97": [0, 0.47534, 0, 0, 0.50046],
1922 "98": [0, 0.69141, 0, 0, 0.51315],
1923 "99": [0, 0.47534, 0, 0, 0.38946],
1924 "100": [0, 0.62119, 0, 0, 0.49857],
1925 "101": [0, 0.47534, 0, 0, 0.40053],
1926 "102": [0.18906, 0.69141, 0, 0, 0.32626],
1927 "103": [0.18906, 0.47534, 0, 0, 0.5037],
1928 "104": [0.18906, 0.69141, 0, 0, 0.52126],
1929 "105": [0, 0.69141, 0, 0, 0.27899],
1930 "106": [0, 0.69141, 0, 0, 0.28088],
1931 "107": [0, 0.69141, 0, 0, 0.38946],
1932 "108": [0, 0.69141, 0, 0, 0.27953],
1933 "109": [0, 0.47534, 0, 0, 0.76676],
1934 "110": [0, 0.47534, 0, 0, 0.52666],
1935 "111": [0, 0.47534, 0, 0, 0.48885],
1936 "112": [0.18906, 0.52396, 0, 0, 0.50046],
1937 "113": [0.18906, 0.47534, 0, 0, 0.48912],
1938 "114": [0, 0.47534, 0, 0, 0.38919],
1939 "115": [0, 0.47534, 0, 0, 0.44266],
1940 "116": [0, 0.62119, 0, 0, 0.33301],
1941 "117": [0, 0.47534, 0, 0, 0.5172],
1942 "118": [0, 0.52396, 0, 0, 0.5118],
1943 "119": [0, 0.52396, 0, 0, 0.77351],
1944 "120": [0.18906, 0.47534, 0, 0, 0.38865],
1945 "121": [0.18906, 0.47534, 0, 0, 0.49884],
1946 "122": [0.18906, 0.47534, 0, 0, 0.39054],
1947 "8216": [0, 0.69141, 0, 0, 0.21471],
1948 "8217": [0, 0.69141, 0, 0, 0.21471],
1949 "58112": [0, 0.62119, 0, 0, 0.49749],
1950 "58113": [0, 0.62119, 0, 0, 0.4983],
1951 "58114": [0.18906, 0.69141, 0, 0, 0.33328],
1952 "58115": [0.18906, 0.69141, 0, 0, 0.32923],
1953 "58116": [0.18906, 0.47534, 0, 0, 0.50343],
1954 "58117": [0, 0.69141, 0, 0, 0.33301],
1955 "58118": [0, 0.62119, 0, 0, 0.33409],
1956 "58119": [0, 0.47534, 0, 0, 0.50073]
1957 },
1958 "Main-Bold": {
1959 "33": [0, 0.69444, 0, 0, 0.35],
1960 "34": [0, 0.69444, 0, 0, 0.60278],
1961 "35": [0.19444, 0.69444, 0, 0, 0.95833],
1962 "36": [0.05556, 0.75, 0, 0, 0.575],
1963 "37": [0.05556, 0.75, 0, 0, 0.95833],
1964 "38": [0, 0.69444, 0, 0, 0.89444],
1965 "39": [0, 0.69444, 0, 0, 0.31944],
1966 "40": [0.25, 0.75, 0, 0, 0.44722],
1967 "41": [0.25, 0.75, 0, 0, 0.44722],
1968 "42": [0, 0.75, 0, 0, 0.575],
1969 "43": [0.13333, 0.63333, 0, 0, 0.89444],
1970 "44": [0.19444, 0.15556, 0, 0, 0.31944],
1971 "45": [0, 0.44444, 0, 0, 0.38333],
1972 "46": [0, 0.15556, 0, 0, 0.31944],
1973 "47": [0.25, 0.75, 0, 0, 0.575],
1974 "48": [0, 0.64444, 0, 0, 0.575],
1975 "49": [0, 0.64444, 0, 0, 0.575],
1976 "50": [0, 0.64444, 0, 0, 0.575],
1977 "51": [0, 0.64444, 0, 0, 0.575],
1978 "52": [0, 0.64444, 0, 0, 0.575],
1979 "53": [0, 0.64444, 0, 0, 0.575],
1980 "54": [0, 0.64444, 0, 0, 0.575],
1981 "55": [0, 0.64444, 0, 0, 0.575],
1982 "56": [0, 0.64444, 0, 0, 0.575],
1983 "57": [0, 0.64444, 0, 0, 0.575],
1984 "58": [0, 0.44444, 0, 0, 0.31944],
1985 "59": [0.19444, 0.44444, 0, 0, 0.31944],
1986 "60": [0.08556, 0.58556, 0, 0, 0.89444],
1987 "61": [-0.10889, 0.39111, 0, 0, 0.89444],
1988 "62": [0.08556, 0.58556, 0, 0, 0.89444],
1989 "63": [0, 0.69444, 0, 0, 0.54305],
1990 "64": [0, 0.69444, 0, 0, 0.89444],
1991 "65": [0, 0.68611, 0, 0, 0.86944],
1992 "66": [0, 0.68611, 0, 0, 0.81805],
1993 "67": [0, 0.68611, 0, 0, 0.83055],
1994 "68": [0, 0.68611, 0, 0, 0.88194],
1995 "69": [0, 0.68611, 0, 0, 0.75555],
1996 "70": [0, 0.68611, 0, 0, 0.72361],
1997 "71": [0, 0.68611, 0, 0, 0.90416],
1998 "72": [0, 0.68611, 0, 0, 0.9],
1999 "73": [0, 0.68611, 0, 0, 0.43611],
2000 "74": [0, 0.68611, 0, 0, 0.59444],
2001 "75": [0, 0.68611, 0, 0, 0.90138],
2002 "76": [0, 0.68611, 0, 0, 0.69166],
2003 "77": [0, 0.68611, 0, 0, 1.09166],
2004 "78": [0, 0.68611, 0, 0, 0.9],
2005 "79": [0, 0.68611, 0, 0, 0.86388],
2006 "80": [0, 0.68611, 0, 0, 0.78611],
2007 "81": [0.19444, 0.68611, 0, 0, 0.86388],
2008 "82": [0, 0.68611, 0, 0, 0.8625],
2009 "83": [0, 0.68611, 0, 0, 0.63889],
2010 "84": [0, 0.68611, 0, 0, 0.8],
2011 "85": [0, 0.68611, 0, 0, 0.88472],
2012 "86": [0, 0.68611, 0.01597, 0, 0.86944],
2013 "87": [0, 0.68611, 0.01597, 0, 1.18888],
2014 "88": [0, 0.68611, 0, 0, 0.86944],
2015 "89": [0, 0.68611, 0.02875, 0, 0.86944],
2016 "90": [0, 0.68611, 0, 0, 0.70277],
2017 "91": [0.25, 0.75, 0, 0, 0.31944],
2018 "92": [0.25, 0.75, 0, 0, 0.575],
2019 "93": [0.25, 0.75, 0, 0, 0.31944],
2020 "94": [0, 0.69444, 0, 0, 0.575],
2021 "95": [0.31, 0.13444, 0.03194, 0, 0.575],
2022 "97": [0, 0.44444, 0, 0, 0.55902],
2023 "98": [0, 0.69444, 0, 0, 0.63889],
2024 "99": [0, 0.44444, 0, 0, 0.51111],
2025 "100": [0, 0.69444, 0, 0, 0.63889],
2026 "101": [0, 0.44444, 0, 0, 0.52708],
2027 "102": [0, 0.69444, 0.10903, 0, 0.35139],
2028 "103": [0.19444, 0.44444, 0.01597, 0, 0.575],
2029 "104": [0, 0.69444, 0, 0, 0.63889],
2030 "105": [0, 0.69444, 0, 0, 0.31944],
2031 "106": [0.19444, 0.69444, 0, 0, 0.35139],
2032 "107": [0, 0.69444, 0, 0, 0.60694],
2033 "108": [0, 0.69444, 0, 0, 0.31944],
2034 "109": [0, 0.44444, 0, 0, 0.95833],
2035 "110": [0, 0.44444, 0, 0, 0.63889],
2036 "111": [0, 0.44444, 0, 0, 0.575],
2037 "112": [0.19444, 0.44444, 0, 0, 0.63889],
2038 "113": [0.19444, 0.44444, 0, 0, 0.60694],
2039 "114": [0, 0.44444, 0, 0, 0.47361],
2040 "115": [0, 0.44444, 0, 0, 0.45361],
2041 "116": [0, 0.63492, 0, 0, 0.44722],
2042 "117": [0, 0.44444, 0, 0, 0.63889],
2043 "118": [0, 0.44444, 0.01597, 0, 0.60694],
2044 "119": [0, 0.44444, 0.01597, 0, 0.83055],
2045 "120": [0, 0.44444, 0, 0, 0.60694],
2046 "121": [0.19444, 0.44444, 0.01597, 0, 0.60694],
2047 "122": [0, 0.44444, 0, 0, 0.51111],
2048 "123": [0.25, 0.75, 0, 0, 0.575],
2049 "124": [0.25, 0.75, 0, 0, 0.31944],
2050 "125": [0.25, 0.75, 0, 0, 0.575],
2051 "126": [0.35, 0.34444, 0, 0, 0.575],
2052 "168": [0, 0.69444, 0, 0, 0.575],
2053 "172": [0, 0.44444, 0, 0, 0.76666],
2054 "176": [0, 0.69444, 0, 0, 0.86944],
2055 "177": [0.13333, 0.63333, 0, 0, 0.89444],
2056 "184": [0.17014, 0, 0, 0, 0.51111],
2057 "198": [0, 0.68611, 0, 0, 1.04166],
2058 "215": [0.13333, 0.63333, 0, 0, 0.89444],
2059 "216": [0.04861, 0.73472, 0, 0, 0.89444],
2060 "223": [0, 0.69444, 0, 0, 0.59722],
2061 "230": [0, 0.44444, 0, 0, 0.83055],
2062 "247": [0.13333, 0.63333, 0, 0, 0.89444],
2063 "248": [0.09722, 0.54167, 0, 0, 0.575],
2064 "305": [0, 0.44444, 0, 0, 0.31944],
2065 "338": [0, 0.68611, 0, 0, 1.16944],
2066 "339": [0, 0.44444, 0, 0, 0.89444],
2067 "567": [0.19444, 0.44444, 0, 0, 0.35139],
2068 "710": [0, 0.69444, 0, 0, 0.575],
2069 "711": [0, 0.63194, 0, 0, 0.575],
2070 "713": [0, 0.59611, 0, 0, 0.575],
2071 "714": [0, 0.69444, 0, 0, 0.575],
2072 "715": [0, 0.69444, 0, 0, 0.575],
2073 "728": [0, 0.69444, 0, 0, 0.575],
2074 "729": [0, 0.69444, 0, 0, 0.31944],
2075 "730": [0, 0.69444, 0, 0, 0.86944],
2076 "732": [0, 0.69444, 0, 0, 0.575],
2077 "733": [0, 0.69444, 0, 0, 0.575],
2078 "915": [0, 0.68611, 0, 0, 0.69166],
2079 "916": [0, 0.68611, 0, 0, 0.95833],
2080 "920": [0, 0.68611, 0, 0, 0.89444],
2081 "923": [0, 0.68611, 0, 0, 0.80555],
2082 "926": [0, 0.68611, 0, 0, 0.76666],
2083 "928": [0, 0.68611, 0, 0, 0.9],
2084 "931": [0, 0.68611, 0, 0, 0.83055],
2085 "933": [0, 0.68611, 0, 0, 0.89444],
2086 "934": [0, 0.68611, 0, 0, 0.83055],
2087 "936": [0, 0.68611, 0, 0, 0.89444],
2088 "937": [0, 0.68611, 0, 0, 0.83055],
2089 "8211": [0, 0.44444, 0.03194, 0, 0.575],
2090 "8212": [0, 0.44444, 0.03194, 0, 1.14999],
2091 "8216": [0, 0.69444, 0, 0, 0.31944],
2092 "8217": [0, 0.69444, 0, 0, 0.31944],
2093 "8220": [0, 0.69444, 0, 0, 0.60278],
2094 "8221": [0, 0.69444, 0, 0, 0.60278],
2095 "8224": [0.19444, 0.69444, 0, 0, 0.51111],
2096 "8225": [0.19444, 0.69444, 0, 0, 0.51111],
2097 "8242": [0, 0.55556, 0, 0, 0.34444],
2098 "8407": [0, 0.72444, 0.15486, 0, 0.575],
2099 "8463": [0, 0.69444, 0, 0, 0.66759],
2100 "8465": [0, 0.69444, 0, 0, 0.83055],
2101 "8467": [0, 0.69444, 0, 0, 0.47361],
2102 "8472": [0.19444, 0.44444, 0, 0, 0.74027],
2103 "8476": [0, 0.69444, 0, 0, 0.83055],
2104 "8501": [0, 0.69444, 0, 0, 0.70277],
2105 "8592": [-0.10889, 0.39111, 0, 0, 1.14999],
2106 "8593": [0.19444, 0.69444, 0, 0, 0.575],
2107 "8594": [-0.10889, 0.39111, 0, 0, 1.14999],
2108 "8595": [0.19444, 0.69444, 0, 0, 0.575],
2109 "8596": [-0.10889, 0.39111, 0, 0, 1.14999],
2110 "8597": [0.25, 0.75, 0, 0, 0.575],
2111 "8598": [0.19444, 0.69444, 0, 0, 1.14999],
2112 "8599": [0.19444, 0.69444, 0, 0, 1.14999],
2113 "8600": [0.19444, 0.69444, 0, 0, 1.14999],
2114 "8601": [0.19444, 0.69444, 0, 0, 1.14999],
2115 "8636": [-0.10889, 0.39111, 0, 0, 1.14999],
2116 "8637": [-0.10889, 0.39111, 0, 0, 1.14999],
2117 "8640": [-0.10889, 0.39111, 0, 0, 1.14999],
2118 "8641": [-0.10889, 0.39111, 0, 0, 1.14999],
2119 "8656": [-0.10889, 0.39111, 0, 0, 1.14999],
2120 "8657": [0.19444, 0.69444, 0, 0, 0.70277],
2121 "8658": [-0.10889, 0.39111, 0, 0, 1.14999],
2122 "8659": [0.19444, 0.69444, 0, 0, 0.70277],
2123 "8660": [-0.10889, 0.39111, 0, 0, 1.14999],
2124 "8661": [0.25, 0.75, 0, 0, 0.70277],
2125 "8704": [0, 0.69444, 0, 0, 0.63889],
2126 "8706": [0, 0.69444, 0.06389, 0, 0.62847],
2127 "8707": [0, 0.69444, 0, 0, 0.63889],
2128 "8709": [0.05556, 0.75, 0, 0, 0.575],
2129 "8711": [0, 0.68611, 0, 0, 0.95833],
2130 "8712": [0.08556, 0.58556, 0, 0, 0.76666],
2131 "8715": [0.08556, 0.58556, 0, 0, 0.76666],
2132 "8722": [0.13333, 0.63333, 0, 0, 0.89444],
2133 "8723": [0.13333, 0.63333, 0, 0, 0.89444],
2134 "8725": [0.25, 0.75, 0, 0, 0.575],
2135 "8726": [0.25, 0.75, 0, 0, 0.575],
2136 "8727": [-0.02778, 0.47222, 0, 0, 0.575],
2137 "8728": [-0.02639, 0.47361, 0, 0, 0.575],
2138 "8729": [-0.02639, 0.47361, 0, 0, 0.575],
2139 "8730": [0.18, 0.82, 0, 0, 0.95833],
2140 "8733": [0, 0.44444, 0, 0, 0.89444],
2141 "8734": [0, 0.44444, 0, 0, 1.14999],
2142 "8736": [0, 0.69224, 0, 0, 0.72222],
2143 "8739": [0.25, 0.75, 0, 0, 0.31944],
2144 "8741": [0.25, 0.75, 0, 0, 0.575],
2145 "8743": [0, 0.55556, 0, 0, 0.76666],
2146 "8744": [0, 0.55556, 0, 0, 0.76666],
2147 "8745": [0, 0.55556, 0, 0, 0.76666],
2148 "8746": [0, 0.55556, 0, 0, 0.76666],
2149 "8747": [0.19444, 0.69444, 0.12778, 0, 0.56875],
2150 "8764": [-0.10889, 0.39111, 0, 0, 0.89444],
2151 "8768": [0.19444, 0.69444, 0, 0, 0.31944],
2152 "8771": [0.00222, 0.50222, 0, 0, 0.89444],
2153 "8776": [0.02444, 0.52444, 0, 0, 0.89444],
2154 "8781": [0.00222, 0.50222, 0, 0, 0.89444],
2155 "8801": [0.00222, 0.50222, 0, 0, 0.89444],
2156 "8804": [0.19667, 0.69667, 0, 0, 0.89444],
2157 "8805": [0.19667, 0.69667, 0, 0, 0.89444],
2158 "8810": [0.08556, 0.58556, 0, 0, 1.14999],
2159 "8811": [0.08556, 0.58556, 0, 0, 1.14999],
2160 "8826": [0.08556, 0.58556, 0, 0, 0.89444],
2161 "8827": [0.08556, 0.58556, 0, 0, 0.89444],
2162 "8834": [0.08556, 0.58556, 0, 0, 0.89444],
2163 "8835": [0.08556, 0.58556, 0, 0, 0.89444],
2164 "8838": [0.19667, 0.69667, 0, 0, 0.89444],
2165 "8839": [0.19667, 0.69667, 0, 0, 0.89444],
2166 "8846": [0, 0.55556, 0, 0, 0.76666],
2167 "8849": [0.19667, 0.69667, 0, 0, 0.89444],
2168 "8850": [0.19667, 0.69667, 0, 0, 0.89444],
2169 "8851": [0, 0.55556, 0, 0, 0.76666],
2170 "8852": [0, 0.55556, 0, 0, 0.76666],
2171 "8853": [0.13333, 0.63333, 0, 0, 0.89444],
2172 "8854": [0.13333, 0.63333, 0, 0, 0.89444],
2173 "8855": [0.13333, 0.63333, 0, 0, 0.89444],
2174 "8856": [0.13333, 0.63333, 0, 0, 0.89444],
2175 "8857": [0.13333, 0.63333, 0, 0, 0.89444],
2176 "8866": [0, 0.69444, 0, 0, 0.70277],
2177 "8867": [0, 0.69444, 0, 0, 0.70277],
2178 "8868": [0, 0.69444, 0, 0, 0.89444],
2179 "8869": [0, 0.69444, 0, 0, 0.89444],
2180 "8900": [-0.02639, 0.47361, 0, 0, 0.575],
2181 "8901": [-0.02639, 0.47361, 0, 0, 0.31944],
2182 "8902": [-0.02778, 0.47222, 0, 0, 0.575],
2183 "8968": [0.25, 0.75, 0, 0, 0.51111],
2184 "8969": [0.25, 0.75, 0, 0, 0.51111],
2185 "8970": [0.25, 0.75, 0, 0, 0.51111],
2186 "8971": [0.25, 0.75, 0, 0, 0.51111],
2187 "8994": [-0.13889, 0.36111, 0, 0, 1.14999],
2188 "8995": [-0.13889, 0.36111, 0, 0, 1.14999],
2189 "9651": [0.19444, 0.69444, 0, 0, 1.02222],
2190 "9657": [-0.02778, 0.47222, 0, 0, 0.575],
2191 "9661": [0.19444, 0.69444, 0, 0, 1.02222],
2192 "9667": [-0.02778, 0.47222, 0, 0, 0.575],
2193 "9711": [0.19444, 0.69444, 0, 0, 1.14999],
2194 "9824": [0.12963, 0.69444, 0, 0, 0.89444],
2195 "9825": [0.12963, 0.69444, 0, 0, 0.89444],
2196 "9826": [0.12963, 0.69444, 0, 0, 0.89444],
2197 "9827": [0.12963, 0.69444, 0, 0, 0.89444],
2198 "9837": [0, 0.75, 0, 0, 0.44722],
2199 "9838": [0.19444, 0.69444, 0, 0, 0.44722],
2200 "9839": [0.19444, 0.69444, 0, 0, 0.44722],
2201 "10216": [0.25, 0.75, 0, 0, 0.44722],
2202 "10217": [0.25, 0.75, 0, 0, 0.44722],
2203 "10815": [0, 0.68611, 0, 0, 0.9],
2204 "10927": [0.19667, 0.69667, 0, 0, 0.89444],
2205 "10928": [0.19667, 0.69667, 0, 0, 0.89444],
2206 "57376": [0.19444, 0.69444, 0, 0, 0]
2207 },
2208 "Main-BoldItalic": {
2209 "33": [0, 0.69444, 0.11417, 0, 0.38611],
2210 "34": [0, 0.69444, 0.07939, 0, 0.62055],
2211 "35": [0.19444, 0.69444, 0.06833, 0, 0.94444],
2212 "37": [0.05556, 0.75, 0.12861, 0, 0.94444],
2213 "38": [0, 0.69444, 0.08528, 0, 0.88555],
2214 "39": [0, 0.69444, 0.12945, 0, 0.35555],
2215 "40": [0.25, 0.75, 0.15806, 0, 0.47333],
2216 "41": [0.25, 0.75, 0.03306, 0, 0.47333],
2217 "42": [0, 0.75, 0.14333, 0, 0.59111],
2218 "43": [0.10333, 0.60333, 0.03306, 0, 0.88555],
2219 "44": [0.19444, 0.14722, 0, 0, 0.35555],
2220 "45": [0, 0.44444, 0.02611, 0, 0.41444],
2221 "46": [0, 0.14722, 0, 0, 0.35555],
2222 "47": [0.25, 0.75, 0.15806, 0, 0.59111],
2223 "48": [0, 0.64444, 0.13167, 0, 0.59111],
2224 "49": [0, 0.64444, 0.13167, 0, 0.59111],
2225 "50": [0, 0.64444, 0.13167, 0, 0.59111],
2226 "51": [0, 0.64444, 0.13167, 0, 0.59111],
2227 "52": [0.19444, 0.64444, 0.13167, 0, 0.59111],
2228 "53": [0, 0.64444, 0.13167, 0, 0.59111],
2229 "54": [0, 0.64444, 0.13167, 0, 0.59111],
2230 "55": [0.19444, 0.64444, 0.13167, 0, 0.59111],
2231 "56": [0, 0.64444, 0.13167, 0, 0.59111],
2232 "57": [0, 0.64444, 0.13167, 0, 0.59111],
2233 "58": [0, 0.44444, 0.06695, 0, 0.35555],
2234 "59": [0.19444, 0.44444, 0.06695, 0, 0.35555],
2235 "61": [-0.10889, 0.39111, 0.06833, 0, 0.88555],
2236 "63": [0, 0.69444, 0.11472, 0, 0.59111],
2237 "64": [0, 0.69444, 0.09208, 0, 0.88555],
2238 "65": [0, 0.68611, 0, 0, 0.86555],
2239 "66": [0, 0.68611, 0.0992, 0, 0.81666],
2240 "67": [0, 0.68611, 0.14208, 0, 0.82666],
2241 "68": [0, 0.68611, 0.09062, 0, 0.87555],
2242 "69": [0, 0.68611, 0.11431, 0, 0.75666],
2243 "70": [0, 0.68611, 0.12903, 0, 0.72722],
2244 "71": [0, 0.68611, 0.07347, 0, 0.89527],
2245 "72": [0, 0.68611, 0.17208, 0, 0.8961],
2246 "73": [0, 0.68611, 0.15681, 0, 0.47166],
2247 "74": [0, 0.68611, 0.145, 0, 0.61055],
2248 "75": [0, 0.68611, 0.14208, 0, 0.89499],
2249 "76": [0, 0.68611, 0, 0, 0.69777],
2250 "77": [0, 0.68611, 0.17208, 0, 1.07277],
2251 "78": [0, 0.68611, 0.17208, 0, 0.8961],
2252 "79": [0, 0.68611, 0.09062, 0, 0.85499],
2253 "80": [0, 0.68611, 0.0992, 0, 0.78721],
2254 "81": [0.19444, 0.68611, 0.09062, 0, 0.85499],
2255 "82": [0, 0.68611, 0.02559, 0, 0.85944],
2256 "83": [0, 0.68611, 0.11264, 0, 0.64999],
2257 "84": [0, 0.68611, 0.12903, 0, 0.7961],
2258 "85": [0, 0.68611, 0.17208, 0, 0.88083],
2259 "86": [0, 0.68611, 0.18625, 0, 0.86555],
2260 "87": [0, 0.68611, 0.18625, 0, 1.15999],
2261 "88": [0, 0.68611, 0.15681, 0, 0.86555],
2262 "89": [0, 0.68611, 0.19803, 0, 0.86555],
2263 "90": [0, 0.68611, 0.14208, 0, 0.70888],
2264 "91": [0.25, 0.75, 0.1875, 0, 0.35611],
2265 "93": [0.25, 0.75, 0.09972, 0, 0.35611],
2266 "94": [0, 0.69444, 0.06709, 0, 0.59111],
2267 "95": [0.31, 0.13444, 0.09811, 0, 0.59111],
2268 "97": [0, 0.44444, 0.09426, 0, 0.59111],
2269 "98": [0, 0.69444, 0.07861, 0, 0.53222],
2270 "99": [0, 0.44444, 0.05222, 0, 0.53222],
2271 "100": [0, 0.69444, 0.10861, 0, 0.59111],
2272 "101": [0, 0.44444, 0.085, 0, 0.53222],
2273 "102": [0.19444, 0.69444, 0.21778, 0, 0.4],
2274 "103": [0.19444, 0.44444, 0.105, 0, 0.53222],
2275 "104": [0, 0.69444, 0.09426, 0, 0.59111],
2276 "105": [0, 0.69326, 0.11387, 0, 0.35555],
2277 "106": [0.19444, 0.69326, 0.1672, 0, 0.35555],
2278 "107": [0, 0.69444, 0.11111, 0, 0.53222],
2279 "108": [0, 0.69444, 0.10861, 0, 0.29666],
2280 "109": [0, 0.44444, 0.09426, 0, 0.94444],
2281 "110": [0, 0.44444, 0.09426, 0, 0.64999],
2282 "111": [0, 0.44444, 0.07861, 0, 0.59111],
2283 "112": [0.19444, 0.44444, 0.07861, 0, 0.59111],
2284 "113": [0.19444, 0.44444, 0.105, 0, 0.53222],
2285 "114": [0, 0.44444, 0.11111, 0, 0.50167],
2286 "115": [0, 0.44444, 0.08167, 0, 0.48694],
2287 "116": [0, 0.63492, 0.09639, 0, 0.385],
2288 "117": [0, 0.44444, 0.09426, 0, 0.62055],
2289 "118": [0, 0.44444, 0.11111, 0, 0.53222],
2290 "119": [0, 0.44444, 0.11111, 0, 0.76777],
2291 "120": [0, 0.44444, 0.12583, 0, 0.56055],
2292 "121": [0.19444, 0.44444, 0.105, 0, 0.56166],
2293 "122": [0, 0.44444, 0.13889, 0, 0.49055],
2294 "126": [0.35, 0.34444, 0.11472, 0, 0.59111],
2295 "163": [0, 0.69444, 0, 0, 0.86853],
2296 "168": [0, 0.69444, 0.11473, 0, 0.59111],
2297 "176": [0, 0.69444, 0, 0, 0.94888],
2298 "184": [0.17014, 0, 0, 0, 0.53222],
2299 "198": [0, 0.68611, 0.11431, 0, 1.02277],
2300 "216": [0.04861, 0.73472, 0.09062, 0, 0.88555],
2301 "223": [0.19444, 0.69444, 0.09736, 0, 0.665],
2302 "230": [0, 0.44444, 0.085, 0, 0.82666],
2303 "248": [0.09722, 0.54167, 0.09458, 0, 0.59111],
2304 "305": [0, 0.44444, 0.09426, 0, 0.35555],
2305 "338": [0, 0.68611, 0.11431, 0, 1.14054],
2306 "339": [0, 0.44444, 0.085, 0, 0.82666],
2307 "567": [0.19444, 0.44444, 0.04611, 0, 0.385],
2308 "710": [0, 0.69444, 0.06709, 0, 0.59111],
2309 "711": [0, 0.63194, 0.08271, 0, 0.59111],
2310 "713": [0, 0.59444, 0.10444, 0, 0.59111],
2311 "714": [0, 0.69444, 0.08528, 0, 0.59111],
2312 "715": [0, 0.69444, 0, 0, 0.59111],
2313 "728": [0, 0.69444, 0.10333, 0, 0.59111],
2314 "729": [0, 0.69444, 0.12945, 0, 0.35555],
2315 "730": [0, 0.69444, 0, 0, 0.94888],
2316 "732": [0, 0.69444, 0.11472, 0, 0.59111],
2317 "733": [0, 0.69444, 0.11472, 0, 0.59111],
2318 "915": [0, 0.68611, 0.12903, 0, 0.69777],
2319 "916": [0, 0.68611, 0, 0, 0.94444],
2320 "920": [0, 0.68611, 0.09062, 0, 0.88555],
2321 "923": [0, 0.68611, 0, 0, 0.80666],
2322 "926": [0, 0.68611, 0.15092, 0, 0.76777],
2323 "928": [0, 0.68611, 0.17208, 0, 0.8961],
2324 "931": [0, 0.68611, 0.11431, 0, 0.82666],
2325 "933": [0, 0.68611, 0.10778, 0, 0.88555],
2326 "934": [0, 0.68611, 0.05632, 0, 0.82666],
2327 "936": [0, 0.68611, 0.10778, 0, 0.88555],
2328 "937": [0, 0.68611, 0.0992, 0, 0.82666],
2329 "8211": [0, 0.44444, 0.09811, 0, 0.59111],
2330 "8212": [0, 0.44444, 0.09811, 0, 1.18221],
2331 "8216": [0, 0.69444, 0.12945, 0, 0.35555],
2332 "8217": [0, 0.69444, 0.12945, 0, 0.35555],
2333 "8220": [0, 0.69444, 0.16772, 0, 0.62055],
2334 "8221": [0, 0.69444, 0.07939, 0, 0.62055]
2335 },
2336 "Main-Italic": {
2337 "33": [0, 0.69444, 0.12417, 0, 0.30667],
2338 "34": [0, 0.69444, 0.06961, 0, 0.51444],
2339 "35": [0.19444, 0.69444, 0.06616, 0, 0.81777],
2340 "37": [0.05556, 0.75, 0.13639, 0, 0.81777],
2341 "38": [0, 0.69444, 0.09694, 0, 0.76666],
2342 "39": [0, 0.69444, 0.12417, 0, 0.30667],
2343 "40": [0.25, 0.75, 0.16194, 0, 0.40889],
2344 "41": [0.25, 0.75, 0.03694, 0, 0.40889],
2345 "42": [0, 0.75, 0.14917, 0, 0.51111],
2346 "43": [0.05667, 0.56167, 0.03694, 0, 0.76666],
2347 "44": [0.19444, 0.10556, 0, 0, 0.30667],
2348 "45": [0, 0.43056, 0.02826, 0, 0.35778],
2349 "46": [0, 0.10556, 0, 0, 0.30667],
2350 "47": [0.25, 0.75, 0.16194, 0, 0.51111],
2351 "48": [0, 0.64444, 0.13556, 0, 0.51111],
2352 "49": [0, 0.64444, 0.13556, 0, 0.51111],
2353 "50": [0, 0.64444, 0.13556, 0, 0.51111],
2354 "51": [0, 0.64444, 0.13556, 0, 0.51111],
2355 "52": [0.19444, 0.64444, 0.13556, 0, 0.51111],
2356 "53": [0, 0.64444, 0.13556, 0, 0.51111],
2357 "54": [0, 0.64444, 0.13556, 0, 0.51111],
2358 "55": [0.19444, 0.64444, 0.13556, 0, 0.51111],
2359 "56": [0, 0.64444, 0.13556, 0, 0.51111],
2360 "57": [0, 0.64444, 0.13556, 0, 0.51111],
2361 "58": [0, 0.43056, 0.0582, 0, 0.30667],
2362 "59": [0.19444, 0.43056, 0.0582, 0, 0.30667],
2363 "61": [-0.13313, 0.36687, 0.06616, 0, 0.76666],
2364 "63": [0, 0.69444, 0.1225, 0, 0.51111],
2365 "64": [0, 0.69444, 0.09597, 0, 0.76666],
2366 "65": [0, 0.68333, 0, 0, 0.74333],
2367 "66": [0, 0.68333, 0.10257, 0, 0.70389],
2368 "67": [0, 0.68333, 0.14528, 0, 0.71555],
2369 "68": [0, 0.68333, 0.09403, 0, 0.755],
2370 "69": [0, 0.68333, 0.12028, 0, 0.67833],
2371 "70": [0, 0.68333, 0.13305, 0, 0.65277],
2372 "71": [0, 0.68333, 0.08722, 0, 0.77361],
2373 "72": [0, 0.68333, 0.16389, 0, 0.74333],
2374 "73": [0, 0.68333, 0.15806, 0, 0.38555],
2375 "74": [0, 0.68333, 0.14028, 0, 0.525],
2376 "75": [0, 0.68333, 0.14528, 0, 0.76888],
2377 "76": [0, 0.68333, 0, 0, 0.62722],
2378 "77": [0, 0.68333, 0.16389, 0, 0.89666],
2379 "78": [0, 0.68333, 0.16389, 0, 0.74333],
2380 "79": [0, 0.68333, 0.09403, 0, 0.76666],
2381 "80": [0, 0.68333, 0.10257, 0, 0.67833],
2382 "81": [0.19444, 0.68333, 0.09403, 0, 0.76666],
2383 "82": [0, 0.68333, 0.03868, 0, 0.72944],
2384 "83": [0, 0.68333, 0.11972, 0, 0.56222],
2385 "84": [0, 0.68333, 0.13305, 0, 0.71555],
2386 "85": [0, 0.68333, 0.16389, 0, 0.74333],
2387 "86": [0, 0.68333, 0.18361, 0, 0.74333],
2388 "87": [0, 0.68333, 0.18361, 0, 0.99888],
2389 "88": [0, 0.68333, 0.15806, 0, 0.74333],
2390 "89": [0, 0.68333, 0.19383, 0, 0.74333],
2391 "90": [0, 0.68333, 0.14528, 0, 0.61333],
2392 "91": [0.25, 0.75, 0.1875, 0, 0.30667],
2393 "93": [0.25, 0.75, 0.10528, 0, 0.30667],
2394 "94": [0, 0.69444, 0.06646, 0, 0.51111],
2395 "95": [0.31, 0.12056, 0.09208, 0, 0.51111],
2396 "97": [0, 0.43056, 0.07671, 0, 0.51111],
2397 "98": [0, 0.69444, 0.06312, 0, 0.46],
2398 "99": [0, 0.43056, 0.05653, 0, 0.46],
2399 "100": [0, 0.69444, 0.10333, 0, 0.51111],
2400 "101": [0, 0.43056, 0.07514, 0, 0.46],
2401 "102": [0.19444, 0.69444, 0.21194, 0, 0.30667],
2402 "103": [0.19444, 0.43056, 0.08847, 0, 0.46],
2403 "104": [0, 0.69444, 0.07671, 0, 0.51111],
2404 "105": [0, 0.65536, 0.1019, 0, 0.30667],
2405 "106": [0.19444, 0.65536, 0.14467, 0, 0.30667],
2406 "107": [0, 0.69444, 0.10764, 0, 0.46],
2407 "108": [0, 0.69444, 0.10333, 0, 0.25555],
2408 "109": [0, 0.43056, 0.07671, 0, 0.81777],
2409 "110": [0, 0.43056, 0.07671, 0, 0.56222],
2410 "111": [0, 0.43056, 0.06312, 0, 0.51111],
2411 "112": [0.19444, 0.43056, 0.06312, 0, 0.51111],
2412 "113": [0.19444, 0.43056, 0.08847, 0, 0.46],
2413 "114": [0, 0.43056, 0.10764, 0, 0.42166],
2414 "115": [0, 0.43056, 0.08208, 0, 0.40889],
2415 "116": [0, 0.61508, 0.09486, 0, 0.33222],
2416 "117": [0, 0.43056, 0.07671, 0, 0.53666],
2417 "118": [0, 0.43056, 0.10764, 0, 0.46],
2418 "119": [0, 0.43056, 0.10764, 0, 0.66444],
2419 "120": [0, 0.43056, 0.12042, 0, 0.46389],
2420 "121": [0.19444, 0.43056, 0.08847, 0, 0.48555],
2421 "122": [0, 0.43056, 0.12292, 0, 0.40889],
2422 "126": [0.35, 0.31786, 0.11585, 0, 0.51111],
2423 "163": [0, 0.69444, 0, 0, 0.76909],
2424 "168": [0, 0.66786, 0.10474, 0, 0.51111],
2425 "176": [0, 0.69444, 0, 0, 0.83129],
2426 "184": [0.17014, 0, 0, 0, 0.46],
2427 "198": [0, 0.68333, 0.12028, 0, 0.88277],
2428 "216": [0.04861, 0.73194, 0.09403, 0, 0.76666],
2429 "223": [0.19444, 0.69444, 0.10514, 0, 0.53666],
2430 "230": [0, 0.43056, 0.07514, 0, 0.71555],
2431 "248": [0.09722, 0.52778, 0.09194, 0, 0.51111],
2432 "305": [0, 0.43056, 0, 0.02778, 0.32246],
2433 "338": [0, 0.68333, 0.12028, 0, 0.98499],
2434 "339": [0, 0.43056, 0.07514, 0, 0.71555],
2435 "567": [0.19444, 0.43056, 0, 0.08334, 0.38403],
2436 "710": [0, 0.69444, 0.06646, 0, 0.51111],
2437 "711": [0, 0.62847, 0.08295, 0, 0.51111],
2438 "713": [0, 0.56167, 0.10333, 0, 0.51111],
2439 "714": [0, 0.69444, 0.09694, 0, 0.51111],
2440 "715": [0, 0.69444, 0, 0, 0.51111],
2441 "728": [0, 0.69444, 0.10806, 0, 0.51111],
2442 "729": [0, 0.66786, 0.11752, 0, 0.30667],
2443 "730": [0, 0.69444, 0, 0, 0.83129],
2444 "732": [0, 0.66786, 0.11585, 0, 0.51111],
2445 "733": [0, 0.69444, 0.1225, 0, 0.51111],
2446 "915": [0, 0.68333, 0.13305, 0, 0.62722],
2447 "916": [0, 0.68333, 0, 0, 0.81777],
2448 "920": [0, 0.68333, 0.09403, 0, 0.76666],
2449 "923": [0, 0.68333, 0, 0, 0.69222],
2450 "926": [0, 0.68333, 0.15294, 0, 0.66444],
2451 "928": [0, 0.68333, 0.16389, 0, 0.74333],
2452 "931": [0, 0.68333, 0.12028, 0, 0.71555],
2453 "933": [0, 0.68333, 0.11111, 0, 0.76666],
2454 "934": [0, 0.68333, 0.05986, 0, 0.71555],
2455 "936": [0, 0.68333, 0.11111, 0, 0.76666],
2456 "937": [0, 0.68333, 0.10257, 0, 0.71555],
2457 "8211": [0, 0.43056, 0.09208, 0, 0.51111],
2458 "8212": [0, 0.43056, 0.09208, 0, 1.02222],
2459 "8216": [0, 0.69444, 0.12417, 0, 0.30667],
2460 "8217": [0, 0.69444, 0.12417, 0, 0.30667],
2461 "8220": [0, 0.69444, 0.1685, 0, 0.51444],
2462 "8221": [0, 0.69444, 0.06961, 0, 0.51444],
2463 "8463": [0, 0.68889, 0, 0, 0.54028]
2464 },
2465 "Main-Regular": {
2466 "32": [0, 0, 0, 0, 0.25],
2467 "33": [0, 0.69444, 0, 0, 0.27778],
2468 "34": [0, 0.69444, 0, 0, 0.5],
2469 "35": [0.19444, 0.69444, 0, 0, 0.83334],
2470 "36": [0.05556, 0.75, 0, 0, 0.5],
2471 "37": [0.05556, 0.75, 0, 0, 0.83334],
2472 "38": [0, 0.69444, 0, 0, 0.77778],
2473 "39": [0, 0.69444, 0, 0, 0.27778],
2474 "40": [0.25, 0.75, 0, 0, 0.38889],
2475 "41": [0.25, 0.75, 0, 0, 0.38889],
2476 "42": [0, 0.75, 0, 0, 0.5],
2477 "43": [0.08333, 0.58333, 0, 0, 0.77778],
2478 "44": [0.19444, 0.10556, 0, 0, 0.27778],
2479 "45": [0, 0.43056, 0, 0, 0.33333],
2480 "46": [0, 0.10556, 0, 0, 0.27778],
2481 "47": [0.25, 0.75, 0, 0, 0.5],
2482 "48": [0, 0.64444, 0, 0, 0.5],
2483 "49": [0, 0.64444, 0, 0, 0.5],
2484 "50": [0, 0.64444, 0, 0, 0.5],
2485 "51": [0, 0.64444, 0, 0, 0.5],
2486 "52": [0, 0.64444, 0, 0, 0.5],
2487 "53": [0, 0.64444, 0, 0, 0.5],
2488 "54": [0, 0.64444, 0, 0, 0.5],
2489 "55": [0, 0.64444, 0, 0, 0.5],
2490 "56": [0, 0.64444, 0, 0, 0.5],
2491 "57": [0, 0.64444, 0, 0, 0.5],
2492 "58": [0, 0.43056, 0, 0, 0.27778],
2493 "59": [0.19444, 0.43056, 0, 0, 0.27778],
2494 "60": [0.0391, 0.5391, 0, 0, 0.77778],
2495 "61": [-0.13313, 0.36687, 0, 0, 0.77778],
2496 "62": [0.0391, 0.5391, 0, 0, 0.77778],
2497 "63": [0, 0.69444, 0, 0, 0.47222],
2498 "64": [0, 0.69444, 0, 0, 0.77778],
2499 "65": [0, 0.68333, 0, 0, 0.75],
2500 "66": [0, 0.68333, 0, 0, 0.70834],
2501 "67": [0, 0.68333, 0, 0, 0.72222],
2502 "68": [0, 0.68333, 0, 0, 0.76389],
2503 "69": [0, 0.68333, 0, 0, 0.68056],
2504 "70": [0, 0.68333, 0, 0, 0.65278],
2505 "71": [0, 0.68333, 0, 0, 0.78472],
2506 "72": [0, 0.68333, 0, 0, 0.75],
2507 "73": [0, 0.68333, 0, 0, 0.36111],
2508 "74": [0, 0.68333, 0, 0, 0.51389],
2509 "75": [0, 0.68333, 0, 0, 0.77778],
2510 "76": [0, 0.68333, 0, 0, 0.625],
2511 "77": [0, 0.68333, 0, 0, 0.91667],
2512 "78": [0, 0.68333, 0, 0, 0.75],
2513 "79": [0, 0.68333, 0, 0, 0.77778],
2514 "80": [0, 0.68333, 0, 0, 0.68056],
2515 "81": [0.19444, 0.68333, 0, 0, 0.77778],
2516 "82": [0, 0.68333, 0, 0, 0.73611],
2517 "83": [0, 0.68333, 0, 0, 0.55556],
2518 "84": [0, 0.68333, 0, 0, 0.72222],
2519 "85": [0, 0.68333, 0, 0, 0.75],
2520 "86": [0, 0.68333, 0.01389, 0, 0.75],
2521 "87": [0, 0.68333, 0.01389, 0, 1.02778],
2522 "88": [0, 0.68333, 0, 0, 0.75],
2523 "89": [0, 0.68333, 0.025, 0, 0.75],
2524 "90": [0, 0.68333, 0, 0, 0.61111],
2525 "91": [0.25, 0.75, 0, 0, 0.27778],
2526 "92": [0.25, 0.75, 0, 0, 0.5],
2527 "93": [0.25, 0.75, 0, 0, 0.27778],
2528 "94": [0, 0.69444, 0, 0, 0.5],
2529 "95": [0.31, 0.12056, 0.02778, 0, 0.5],
2530 "97": [0, 0.43056, 0, 0, 0.5],
2531 "98": [0, 0.69444, 0, 0, 0.55556],
2532 "99": [0, 0.43056, 0, 0, 0.44445],
2533 "100": [0, 0.69444, 0, 0, 0.55556],
2534 "101": [0, 0.43056, 0, 0, 0.44445],
2535 "102": [0, 0.69444, 0.07778, 0, 0.30556],
2536 "103": [0.19444, 0.43056, 0.01389, 0, 0.5],
2537 "104": [0, 0.69444, 0, 0, 0.55556],
2538 "105": [0, 0.66786, 0, 0, 0.27778],
2539 "106": [0.19444, 0.66786, 0, 0, 0.30556],
2540 "107": [0, 0.69444, 0, 0, 0.52778],
2541 "108": [0, 0.69444, 0, 0, 0.27778],
2542 "109": [0, 0.43056, 0, 0, 0.83334],
2543 "110": [0, 0.43056, 0, 0, 0.55556],
2544 "111": [0, 0.43056, 0, 0, 0.5],
2545 "112": [0.19444, 0.43056, 0, 0, 0.55556],
2546 "113": [0.19444, 0.43056, 0, 0, 0.52778],
2547 "114": [0, 0.43056, 0, 0, 0.39167],
2548 "115": [0, 0.43056, 0, 0, 0.39445],
2549 "116": [0, 0.61508, 0, 0, 0.38889],
2550 "117": [0, 0.43056, 0, 0, 0.55556],
2551 "118": [0, 0.43056, 0.01389, 0, 0.52778],
2552 "119": [0, 0.43056, 0.01389, 0, 0.72222],
2553 "120": [0, 0.43056, 0, 0, 0.52778],
2554 "121": [0.19444, 0.43056, 0.01389, 0, 0.52778],
2555 "122": [0, 0.43056, 0, 0, 0.44445],
2556 "123": [0.25, 0.75, 0, 0, 0.5],
2557 "124": [0.25, 0.75, 0, 0, 0.27778],
2558 "125": [0.25, 0.75, 0, 0, 0.5],
2559 "126": [0.35, 0.31786, 0, 0, 0.5],
2560 "160": [0, 0, 0, 0, 0.25],
2561 "167": [0.19444, 0.69444, 0, 0, 0.44445],
2562 "168": [0, 0.66786, 0, 0, 0.5],
2563 "172": [0, 0.43056, 0, 0, 0.66667],
2564 "176": [0, 0.69444, 0, 0, 0.75],
2565 "177": [0.08333, 0.58333, 0, 0, 0.77778],
2566 "182": [0.19444, 0.69444, 0, 0, 0.61111],
2567 "184": [0.17014, 0, 0, 0, 0.44445],
2568 "198": [0, 0.68333, 0, 0, 0.90278],
2569 "215": [0.08333, 0.58333, 0, 0, 0.77778],
2570 "216": [0.04861, 0.73194, 0, 0, 0.77778],
2571 "223": [0, 0.69444, 0, 0, 0.5],
2572 "230": [0, 0.43056, 0, 0, 0.72222],
2573 "247": [0.08333, 0.58333, 0, 0, 0.77778],
2574 "248": [0.09722, 0.52778, 0, 0, 0.5],
2575 "305": [0, 0.43056, 0, 0, 0.27778],
2576 "338": [0, 0.68333, 0, 0, 1.01389],
2577 "339": [0, 0.43056, 0, 0, 0.77778],
2578 "567": [0.19444, 0.43056, 0, 0, 0.30556],
2579 "710": [0, 0.69444, 0, 0, 0.5],
2580 "711": [0, 0.62847, 0, 0, 0.5],
2581 "713": [0, 0.56778, 0, 0, 0.5],
2582 "714": [0, 0.69444, 0, 0, 0.5],
2583 "715": [0, 0.69444, 0, 0, 0.5],
2584 "728": [0, 0.69444, 0, 0, 0.5],
2585 "729": [0, 0.66786, 0, 0, 0.27778],
2586 "730": [0, 0.69444, 0, 0, 0.75],
2587 "732": [0, 0.66786, 0, 0, 0.5],
2588 "733": [0, 0.69444, 0, 0, 0.5],
2589 "915": [0, 0.68333, 0, 0, 0.625],
2590 "916": [0, 0.68333, 0, 0, 0.83334],
2591 "920": [0, 0.68333, 0, 0, 0.77778],
2592 "923": [0, 0.68333, 0, 0, 0.69445],
2593 "926": [0, 0.68333, 0, 0, 0.66667],
2594 "928": [0, 0.68333, 0, 0, 0.75],
2595 "931": [0, 0.68333, 0, 0, 0.72222],
2596 "933": [0, 0.68333, 0, 0, 0.77778],
2597 "934": [0, 0.68333, 0, 0, 0.72222],
2598 "936": [0, 0.68333, 0, 0, 0.77778],
2599 "937": [0, 0.68333, 0, 0, 0.72222],
2600 "8211": [0, 0.43056, 0.02778, 0, 0.5],
2601 "8212": [0, 0.43056, 0.02778, 0, 1.0],
2602 "8216": [0, 0.69444, 0, 0, 0.27778],
2603 "8217": [0, 0.69444, 0, 0, 0.27778],
2604 "8220": [0, 0.69444, 0, 0, 0.5],
2605 "8221": [0, 0.69444, 0, 0, 0.5],
2606 "8224": [0.19444, 0.69444, 0, 0, 0.44445],
2607 "8225": [0.19444, 0.69444, 0, 0, 0.44445],
2608 "8230": [0, 0.12, 0, 0, 1.172],
2609 "8242": [0, 0.55556, 0, 0, 0.275],
2610 "8407": [0, 0.71444, 0.15382, 0, 0.5],
2611 "8463": [0, 0.68889, 0, 0, 0.54028],
2612 "8465": [0, 0.69444, 0, 0, 0.72222],
2613 "8467": [0, 0.69444, 0, 0.11111, 0.41667],
2614 "8472": [0.19444, 0.43056, 0, 0.11111, 0.63646],
2615 "8476": [0, 0.69444, 0, 0, 0.72222],
2616 "8501": [0, 0.69444, 0, 0, 0.61111],
2617 "8592": [-0.13313, 0.36687, 0, 0, 1.0],
2618 "8593": [0.19444, 0.69444, 0, 0, 0.5],
2619 "8594": [-0.13313, 0.36687, 0, 0, 1.0],
2620 "8595": [0.19444, 0.69444, 0, 0, 0.5],
2621 "8596": [-0.13313, 0.36687, 0, 0, 1.0],
2622 "8597": [0.25, 0.75, 0, 0, 0.5],
2623 "8598": [0.19444, 0.69444, 0, 0, 1.0],
2624 "8599": [0.19444, 0.69444, 0, 0, 1.0],
2625 "8600": [0.19444, 0.69444, 0, 0, 1.0],
2626 "8601": [0.19444, 0.69444, 0, 0, 1.0],
2627 "8614": [0.011, 0.511, 0, 0, 1.0],
2628 "8617": [0.011, 0.511, 0, 0, 1.126],
2629 "8618": [0.011, 0.511, 0, 0, 1.126],
2630 "8636": [-0.13313, 0.36687, 0, 0, 1.0],
2631 "8637": [-0.13313, 0.36687, 0, 0, 1.0],
2632 "8640": [-0.13313, 0.36687, 0, 0, 1.0],
2633 "8641": [-0.13313, 0.36687, 0, 0, 1.0],
2634 "8652": [0.011, 0.671, 0, 0, 1.0],
2635 "8656": [-0.13313, 0.36687, 0, 0, 1.0],
2636 "8657": [0.19444, 0.69444, 0, 0, 0.61111],
2637 "8658": [-0.13313, 0.36687, 0, 0, 1.0],
2638 "8659": [0.19444, 0.69444, 0, 0, 0.61111],
2639 "8660": [-0.13313, 0.36687, 0, 0, 1.0],
2640 "8661": [0.25, 0.75, 0, 0, 0.61111],
2641 "8704": [0, 0.69444, 0, 0, 0.55556],
2642 "8706": [0, 0.69444, 0.05556, 0.08334, 0.5309],
2643 "8707": [0, 0.69444, 0, 0, 0.55556],
2644 "8709": [0.05556, 0.75, 0, 0, 0.5],
2645 "8711": [0, 0.68333, 0, 0, 0.83334],
2646 "8712": [0.0391, 0.5391, 0, 0, 0.66667],
2647 "8715": [0.0391, 0.5391, 0, 0, 0.66667],
2648 "8722": [0.08333, 0.58333, 0, 0, 0.77778],
2649 "8723": [0.08333, 0.58333, 0, 0, 0.77778],
2650 "8725": [0.25, 0.75, 0, 0, 0.5],
2651 "8726": [0.25, 0.75, 0, 0, 0.5],
2652 "8727": [-0.03472, 0.46528, 0, 0, 0.5],
2653 "8728": [-0.05555, 0.44445, 0, 0, 0.5],
2654 "8729": [-0.05555, 0.44445, 0, 0, 0.5],
2655 "8730": [0.2, 0.8, 0, 0, 0.83334],
2656 "8733": [0, 0.43056, 0, 0, 0.77778],
2657 "8734": [0, 0.43056, 0, 0, 1.0],
2658 "8736": [0, 0.69224, 0, 0, 0.72222],
2659 "8739": [0.25, 0.75, 0, 0, 0.27778],
2660 "8741": [0.25, 0.75, 0, 0, 0.5],
2661 "8743": [0, 0.55556, 0, 0, 0.66667],
2662 "8744": [0, 0.55556, 0, 0, 0.66667],
2663 "8745": [0, 0.55556, 0, 0, 0.66667],
2664 "8746": [0, 0.55556, 0, 0, 0.66667],
2665 "8747": [0.19444, 0.69444, 0.11111, 0, 0.41667],
2666 "8764": [-0.13313, 0.36687, 0, 0, 0.77778],
2667 "8768": [0.19444, 0.69444, 0, 0, 0.27778],
2668 "8771": [-0.03625, 0.46375, 0, 0, 0.77778],
2669 "8773": [-0.022, 0.589, 0, 0, 1.0],
2670 "8776": [-0.01688, 0.48312, 0, 0, 0.77778],
2671 "8781": [-0.03625, 0.46375, 0, 0, 0.77778],
2672 "8784": [-0.133, 0.67, 0, 0, 0.778],
2673 "8801": [-0.03625, 0.46375, 0, 0, 0.77778],
2674 "8804": [0.13597, 0.63597, 0, 0, 0.77778],
2675 "8805": [0.13597, 0.63597, 0, 0, 0.77778],
2676 "8810": [0.0391, 0.5391, 0, 0, 1.0],
2677 "8811": [0.0391, 0.5391, 0, 0, 1.0],
2678 "8826": [0.0391, 0.5391, 0, 0, 0.77778],
2679 "8827": [0.0391, 0.5391, 0, 0, 0.77778],
2680 "8834": [0.0391, 0.5391, 0, 0, 0.77778],
2681 "8835": [0.0391, 0.5391, 0, 0, 0.77778],
2682 "8838": [0.13597, 0.63597, 0, 0, 0.77778],
2683 "8839": [0.13597, 0.63597, 0, 0, 0.77778],
2684 "8846": [0, 0.55556, 0, 0, 0.66667],
2685 "8849": [0.13597, 0.63597, 0, 0, 0.77778],
2686 "8850": [0.13597, 0.63597, 0, 0, 0.77778],
2687 "8851": [0, 0.55556, 0, 0, 0.66667],
2688 "8852": [0, 0.55556, 0, 0, 0.66667],
2689 "8853": [0.08333, 0.58333, 0, 0, 0.77778],
2690 "8854": [0.08333, 0.58333, 0, 0, 0.77778],
2691 "8855": [0.08333, 0.58333, 0, 0, 0.77778],
2692 "8856": [0.08333, 0.58333, 0, 0, 0.77778],
2693 "8857": [0.08333, 0.58333, 0, 0, 0.77778],
2694 "8866": [0, 0.69444, 0, 0, 0.61111],
2695 "8867": [0, 0.69444, 0, 0, 0.61111],
2696 "8868": [0, 0.69444, 0, 0, 0.77778],
2697 "8869": [0, 0.69444, 0, 0, 0.77778],
2698 "8872": [0.249, 0.75, 0, 0, 0.867],
2699 "8900": [-0.05555, 0.44445, 0, 0, 0.5],
2700 "8901": [-0.05555, 0.44445, 0, 0, 0.27778],
2701 "8902": [-0.03472, 0.46528, 0, 0, 0.5],
2702 "8904": [0.005, 0.505, 0, 0, 0.9],
2703 "8942": [0.03, 0.9, 0, 0, 0.278],
2704 "8943": [-0.19, 0.31, 0, 0, 1.172],
2705 "8945": [-0.1, 0.82, 0, 0, 1.282],
2706 "8968": [0.25, 0.75, 0, 0, 0.44445],
2707 "8969": [0.25, 0.75, 0, 0, 0.44445],
2708 "8970": [0.25, 0.75, 0, 0, 0.44445],
2709 "8971": [0.25, 0.75, 0, 0, 0.44445],
2710 "8994": [-0.14236, 0.35764, 0, 0, 1.0],
2711 "8995": [-0.14236, 0.35764, 0, 0, 1.0],
2712 "9136": [0.244, 0.744, 0, 0, 0.412],
2713 "9137": [0.244, 0.744, 0, 0, 0.412],
2714 "9651": [0.19444, 0.69444, 0, 0, 0.88889],
2715 "9657": [-0.03472, 0.46528, 0, 0, 0.5],
2716 "9661": [0.19444, 0.69444, 0, 0, 0.88889],
2717 "9667": [-0.03472, 0.46528, 0, 0, 0.5],
2718 "9711": [0.19444, 0.69444, 0, 0, 1.0],
2719 "9824": [0.12963, 0.69444, 0, 0, 0.77778],
2720 "9825": [0.12963, 0.69444, 0, 0, 0.77778],
2721 "9826": [0.12963, 0.69444, 0, 0, 0.77778],
2722 "9827": [0.12963, 0.69444, 0, 0, 0.77778],
2723 "9837": [0, 0.75, 0, 0, 0.38889],
2724 "9838": [0.19444, 0.69444, 0, 0, 0.38889],
2725 "9839": [0.19444, 0.69444, 0, 0, 0.38889],
2726 "10216": [0.25, 0.75, 0, 0, 0.38889],
2727 "10217": [0.25, 0.75, 0, 0, 0.38889],
2728 "10222": [0.244, 0.744, 0, 0, 0.412],
2729 "10223": [0.244, 0.744, 0, 0, 0.412],
2730 "10229": [0.011, 0.511, 0, 0, 1.609],
2731 "10230": [0.011, 0.511, 0, 0, 1.638],
2732 "10231": [0.011, 0.511, 0, 0, 1.859],
2733 "10232": [0.024, 0.525, 0, 0, 1.609],
2734 "10233": [0.024, 0.525, 0, 0, 1.638],
2735 "10234": [0.024, 0.525, 0, 0, 1.858],
2736 "10236": [0.011, 0.511, 0, 0, 1.638],
2737 "10815": [0, 0.68333, 0, 0, 0.75],
2738 "10927": [0.13597, 0.63597, 0, 0, 0.77778],
2739 "10928": [0.13597, 0.63597, 0, 0, 0.77778],
2740 "57376": [0.19444, 0.69444, 0, 0, 0]
2741 },
2742 "Math-BoldItalic": {
2743 "65": [0, 0.68611, 0, 0, 0.86944],
2744 "66": [0, 0.68611, 0.04835, 0, 0.8664],
2745 "67": [0, 0.68611, 0.06979, 0, 0.81694],
2746 "68": [0, 0.68611, 0.03194, 0, 0.93812],
2747 "69": [0, 0.68611, 0.05451, 0, 0.81007],
2748 "70": [0, 0.68611, 0.15972, 0, 0.68889],
2749 "71": [0, 0.68611, 0, 0, 0.88673],
2750 "72": [0, 0.68611, 0.08229, 0, 0.98229],
2751 "73": [0, 0.68611, 0.07778, 0, 0.51111],
2752 "74": [0, 0.68611, 0.10069, 0, 0.63125],
2753 "75": [0, 0.68611, 0.06979, 0, 0.97118],
2754 "76": [0, 0.68611, 0, 0, 0.75555],
2755 "77": [0, 0.68611, 0.11424, 0, 1.14201],
2756 "78": [0, 0.68611, 0.11424, 0, 0.95034],
2757 "79": [0, 0.68611, 0.03194, 0, 0.83666],
2758 "80": [0, 0.68611, 0.15972, 0, 0.72309],
2759 "81": [0.19444, 0.68611, 0, 0, 0.86861],
2760 "82": [0, 0.68611, 0.00421, 0, 0.87235],
2761 "83": [0, 0.68611, 0.05382, 0, 0.69271],
2762 "84": [0, 0.68611, 0.15972, 0, 0.63663],
2763 "85": [0, 0.68611, 0.11424, 0, 0.80027],
2764 "86": [0, 0.68611, 0.25555, 0, 0.67778],
2765 "87": [0, 0.68611, 0.15972, 0, 1.09305],
2766 "88": [0, 0.68611, 0.07778, 0, 0.94722],
2767 "89": [0, 0.68611, 0.25555, 0, 0.67458],
2768 "90": [0, 0.68611, 0.06979, 0, 0.77257],
2769 "97": [0, 0.44444, 0, 0, 0.63287],
2770 "98": [0, 0.69444, 0, 0, 0.52083],
2771 "99": [0, 0.44444, 0, 0, 0.51342],
2772 "100": [0, 0.69444, 0, 0, 0.60972],
2773 "101": [0, 0.44444, 0, 0, 0.55361],
2774 "102": [0.19444, 0.69444, 0.11042, 0, 0.56806],
2775 "103": [0.19444, 0.44444, 0.03704, 0, 0.5449],
2776 "104": [0, 0.69444, 0, 0, 0.66759],
2777 "105": [0, 0.69326, 0, 0, 0.4048],
2778 "106": [0.19444, 0.69326, 0.0622, 0, 0.47083],
2779 "107": [0, 0.69444, 0.01852, 0, 0.6037],
2780 "108": [0, 0.69444, 0.0088, 0, 0.34815],
2781 "109": [0, 0.44444, 0, 0, 1.0324],
2782 "110": [0, 0.44444, 0, 0, 0.71296],
2783 "111": [0, 0.44444, 0, 0, 0.58472],
2784 "112": [0.19444, 0.44444, 0, 0, 0.60092],
2785 "113": [0.19444, 0.44444, 0.03704, 0, 0.54213],
2786 "114": [0, 0.44444, 0.03194, 0, 0.5287],
2787 "115": [0, 0.44444, 0, 0, 0.53125],
2788 "116": [0, 0.63492, 0, 0, 0.41528],
2789 "117": [0, 0.44444, 0, 0, 0.68102],
2790 "118": [0, 0.44444, 0.03704, 0, 0.56666],
2791 "119": [0, 0.44444, 0.02778, 0, 0.83148],
2792 "120": [0, 0.44444, 0, 0, 0.65903],
2793 "121": [0.19444, 0.44444, 0.03704, 0, 0.59028],
2794 "122": [0, 0.44444, 0.04213, 0, 0.55509],
2795 "915": [0, 0.68611, 0.15972, 0, 0.65694],
2796 "916": [0, 0.68611, 0, 0, 0.95833],
2797 "920": [0, 0.68611, 0.03194, 0, 0.86722],
2798 "923": [0, 0.68611, 0, 0, 0.80555],
2799 "926": [0, 0.68611, 0.07458, 0, 0.84125],
2800 "928": [0, 0.68611, 0.08229, 0, 0.98229],
2801 "931": [0, 0.68611, 0.05451, 0, 0.88507],
2802 "933": [0, 0.68611, 0.15972, 0, 0.67083],
2803 "934": [0, 0.68611, 0, 0, 0.76666],
2804 "936": [0, 0.68611, 0.11653, 0, 0.71402],
2805 "937": [0, 0.68611, 0.04835, 0, 0.8789],
2806 "945": [0, 0.44444, 0, 0, 0.76064],
2807 "946": [0.19444, 0.69444, 0.03403, 0, 0.65972],
2808 "947": [0.19444, 0.44444, 0.06389, 0, 0.59003],
2809 "948": [0, 0.69444, 0.03819, 0, 0.52222],
2810 "949": [0, 0.44444, 0, 0, 0.52882],
2811 "950": [0.19444, 0.69444, 0.06215, 0, 0.50833],
2812 "951": [0.19444, 0.44444, 0.03704, 0, 0.6],
2813 "952": [0, 0.69444, 0.03194, 0, 0.5618],
2814 "953": [0, 0.44444, 0, 0, 0.41204],
2815 "954": [0, 0.44444, 0, 0, 0.66759],
2816 "955": [0, 0.69444, 0, 0, 0.67083],
2817 "956": [0.19444, 0.44444, 0, 0, 0.70787],
2818 "957": [0, 0.44444, 0.06898, 0, 0.57685],
2819 "958": [0.19444, 0.69444, 0.03021, 0, 0.50833],
2820 "959": [0, 0.44444, 0, 0, 0.58472],
2821 "960": [0, 0.44444, 0.03704, 0, 0.68241],
2822 "961": [0.19444, 0.44444, 0, 0, 0.6118],
2823 "962": [0.09722, 0.44444, 0.07917, 0, 0.42361],
2824 "963": [0, 0.44444, 0.03704, 0, 0.68588],
2825 "964": [0, 0.44444, 0.13472, 0, 0.52083],
2826 "965": [0, 0.44444, 0.03704, 0, 0.63055],
2827 "966": [0.19444, 0.44444, 0, 0, 0.74722],
2828 "967": [0.19444, 0.44444, 0, 0, 0.71805],
2829 "968": [0.19444, 0.69444, 0.03704, 0, 0.75833],
2830 "969": [0, 0.44444, 0.03704, 0, 0.71782],
2831 "977": [0, 0.69444, 0, 0, 0.69155],
2832 "981": [0.19444, 0.69444, 0, 0, 0.7125],
2833 "982": [0, 0.44444, 0.03194, 0, 0.975],
2834 "1009": [0.19444, 0.44444, 0, 0, 0.6118],
2835 "1013": [0, 0.44444, 0, 0, 0.48333]
2836 },
2837 "Math-Italic": {
2838 "65": [0, 0.68333, 0, 0.13889, 0.75],
2839 "66": [0, 0.68333, 0.05017, 0.08334, 0.75851],
2840 "67": [0, 0.68333, 0.07153, 0.08334, 0.71472],
2841 "68": [0, 0.68333, 0.02778, 0.05556, 0.82792],
2842 "69": [0, 0.68333, 0.05764, 0.08334, 0.7382],
2843 "70": [0, 0.68333, 0.13889, 0.08334, 0.64306],
2844 "71": [0, 0.68333, 0, 0.08334, 0.78625],
2845 "72": [0, 0.68333, 0.08125, 0.05556, 0.83125],
2846 "73": [0, 0.68333, 0.07847, 0.11111, 0.43958],
2847 "74": [0, 0.68333, 0.09618, 0.16667, 0.55451],
2848 "75": [0, 0.68333, 0.07153, 0.05556, 0.84931],
2849 "76": [0, 0.68333, 0, 0.02778, 0.68056],
2850 "77": [0, 0.68333, 0.10903, 0.08334, 0.97014],
2851 "78": [0, 0.68333, 0.10903, 0.08334, 0.80347],
2852 "79": [0, 0.68333, 0.02778, 0.08334, 0.76278],
2853 "80": [0, 0.68333, 0.13889, 0.08334, 0.64201],
2854 "81": [0.19444, 0.68333, 0, 0.08334, 0.79056],
2855 "82": [0, 0.68333, 0.00773, 0.08334, 0.75929],
2856 "83": [0, 0.68333, 0.05764, 0.08334, 0.6132],
2857 "84": [0, 0.68333, 0.13889, 0.08334, 0.58438],
2858 "85": [0, 0.68333, 0.10903, 0.02778, 0.68278],
2859 "86": [0, 0.68333, 0.22222, 0, 0.58333],
2860 "87": [0, 0.68333, 0.13889, 0, 0.94445],
2861 "88": [0, 0.68333, 0.07847, 0.08334, 0.82847],
2862 "89": [0, 0.68333, 0.22222, 0, 0.58056],
2863 "90": [0, 0.68333, 0.07153, 0.08334, 0.68264],
2864 "97": [0, 0.43056, 0, 0, 0.52859],
2865 "98": [0, 0.69444, 0, 0, 0.42917],
2866 "99": [0, 0.43056, 0, 0.05556, 0.43276],
2867 "100": [0, 0.69444, 0, 0.16667, 0.52049],
2868 "101": [0, 0.43056, 0, 0.05556, 0.46563],
2869 "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959],
2870 "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697],
2871 "104": [0, 0.69444, 0, 0, 0.57616],
2872 "105": [0, 0.65952, 0, 0, 0.34451],
2873 "106": [0.19444, 0.65952, 0.05724, 0, 0.41181],
2874 "107": [0, 0.69444, 0.03148, 0, 0.5206],
2875 "108": [0, 0.69444, 0.01968, 0.08334, 0.29838],
2876 "109": [0, 0.43056, 0, 0, 0.87801],
2877 "110": [0, 0.43056, 0, 0, 0.60023],
2878 "111": [0, 0.43056, 0, 0.05556, 0.48472],
2879 "112": [0.19444, 0.43056, 0, 0.08334, 0.50313],
2880 "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641],
2881 "114": [0, 0.43056, 0.02778, 0.05556, 0.45116],
2882 "115": [0, 0.43056, 0, 0.05556, 0.46875],
2883 "116": [0, 0.61508, 0, 0.08334, 0.36111],
2884 "117": [0, 0.43056, 0, 0.02778, 0.57246],
2885 "118": [0, 0.43056, 0.03588, 0.02778, 0.48472],
2886 "119": [0, 0.43056, 0.02691, 0.08334, 0.71592],
2887 "120": [0, 0.43056, 0, 0.02778, 0.57153],
2888 "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028],
2889 "122": [0, 0.43056, 0.04398, 0.05556, 0.46505],
2890 "915": [0, 0.68333, 0.13889, 0.08334, 0.61528],
2891 "916": [0, 0.68333, 0, 0.16667, 0.83334],
2892 "920": [0, 0.68333, 0.02778, 0.08334, 0.76278],
2893 "923": [0, 0.68333, 0, 0.16667, 0.69445],
2894 "926": [0, 0.68333, 0.07569, 0.08334, 0.74236],
2895 "928": [0, 0.68333, 0.08125, 0.05556, 0.83125],
2896 "931": [0, 0.68333, 0.05764, 0.08334, 0.77986],
2897 "933": [0, 0.68333, 0.13889, 0.05556, 0.58333],
2898 "934": [0, 0.68333, 0, 0.08334, 0.66667],
2899 "936": [0, 0.68333, 0.11, 0.05556, 0.61222],
2900 "937": [0, 0.68333, 0.05017, 0.08334, 0.7724],
2901 "945": [0, 0.43056, 0.0037, 0.02778, 0.6397],
2902 "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563],
2903 "947": [0.19444, 0.43056, 0.05556, 0, 0.51773],
2904 "948": [0, 0.69444, 0.03785, 0.05556, 0.44444],
2905 "949": [0, 0.43056, 0, 0.08334, 0.46632],
2906 "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375],
2907 "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653],
2908 "952": [0, 0.69444, 0.02778, 0.08334, 0.46944],
2909 "953": [0, 0.43056, 0, 0.05556, 0.35394],
2910 "954": [0, 0.43056, 0, 0, 0.57616],
2911 "955": [0, 0.69444, 0, 0, 0.58334],
2912 "956": [0.19444, 0.43056, 0, 0.02778, 0.60255],
2913 "957": [0, 0.43056, 0.06366, 0.02778, 0.49398],
2914 "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375],
2915 "959": [0, 0.43056, 0, 0.05556, 0.48472],
2916 "960": [0, 0.43056, 0.03588, 0, 0.57003],
2917 "961": [0.19444, 0.43056, 0, 0.08334, 0.51702],
2918 "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285],
2919 "963": [0, 0.43056, 0.03588, 0, 0.57141],
2920 "964": [0, 0.43056, 0.1132, 0.02778, 0.43715],
2921 "965": [0, 0.43056, 0.03588, 0.02778, 0.54028],
2922 "966": [0.19444, 0.43056, 0, 0.08334, 0.65417],
2923 "967": [0.19444, 0.43056, 0, 0.05556, 0.62569],
2924 "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139],
2925 "969": [0, 0.43056, 0.03588, 0, 0.62245],
2926 "977": [0, 0.69444, 0, 0.08334, 0.59144],
2927 "981": [0.19444, 0.69444, 0, 0.08334, 0.59583],
2928 "982": [0, 0.43056, 0.02778, 0, 0.82813],
2929 "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702],
2930 "1013": [0, 0.43056, 0, 0.05556, 0.4059]
2931 },
2932 "Math-Regular": {
2933 "65": [0, 0.68333, 0, 0.13889, 0.75],
2934 "66": [0, 0.68333, 0.05017, 0.08334, 0.75851],
2935 "67": [0, 0.68333, 0.07153, 0.08334, 0.71472],
2936 "68": [0, 0.68333, 0.02778, 0.05556, 0.82792],
2937 "69": [0, 0.68333, 0.05764, 0.08334, 0.7382],
2938 "70": [0, 0.68333, 0.13889, 0.08334, 0.64306],
2939 "71": [0, 0.68333, 0, 0.08334, 0.78625],
2940 "72": [0, 0.68333, 0.08125, 0.05556, 0.83125],
2941 "73": [0, 0.68333, 0.07847, 0.11111, 0.43958],
2942 "74": [0, 0.68333, 0.09618, 0.16667, 0.55451],
2943 "75": [0, 0.68333, 0.07153, 0.05556, 0.84931],
2944 "76": [0, 0.68333, 0, 0.02778, 0.68056],
2945 "77": [0, 0.68333, 0.10903, 0.08334, 0.97014],
2946 "78": [0, 0.68333, 0.10903, 0.08334, 0.80347],
2947 "79": [0, 0.68333, 0.02778, 0.08334, 0.76278],
2948 "80": [0, 0.68333, 0.13889, 0.08334, 0.64201],
2949 "81": [0.19444, 0.68333, 0, 0.08334, 0.79056],
2950 "82": [0, 0.68333, 0.00773, 0.08334, 0.75929],
2951 "83": [0, 0.68333, 0.05764, 0.08334, 0.6132],
2952 "84": [0, 0.68333, 0.13889, 0.08334, 0.58438],
2953 "85": [0, 0.68333, 0.10903, 0.02778, 0.68278],
2954 "86": [0, 0.68333, 0.22222, 0, 0.58333],
2955 "87": [0, 0.68333, 0.13889, 0, 0.94445],
2956 "88": [0, 0.68333, 0.07847, 0.08334, 0.82847],
2957 "89": [0, 0.68333, 0.22222, 0, 0.58056],
2958 "90": [0, 0.68333, 0.07153, 0.08334, 0.68264],
2959 "97": [0, 0.43056, 0, 0, 0.52859],
2960 "98": [0, 0.69444, 0, 0, 0.42917],
2961 "99": [0, 0.43056, 0, 0.05556, 0.43276],
2962 "100": [0, 0.69444, 0, 0.16667, 0.52049],
2963 "101": [0, 0.43056, 0, 0.05556, 0.46563],
2964 "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959],
2965 "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697],
2966 "104": [0, 0.69444, 0, 0, 0.57616],
2967 "105": [0, 0.65952, 0, 0, 0.34451],
2968 "106": [0.19444, 0.65952, 0.05724, 0, 0.41181],
2969 "107": [0, 0.69444, 0.03148, 0, 0.5206],
2970 "108": [0, 0.69444, 0.01968, 0.08334, 0.29838],
2971 "109": [0, 0.43056, 0, 0, 0.87801],
2972 "110": [0, 0.43056, 0, 0, 0.60023],
2973 "111": [0, 0.43056, 0, 0.05556, 0.48472],
2974 "112": [0.19444, 0.43056, 0, 0.08334, 0.50313],
2975 "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641],
2976 "114": [0, 0.43056, 0.02778, 0.05556, 0.45116],
2977 "115": [0, 0.43056, 0, 0.05556, 0.46875],
2978 "116": [0, 0.61508, 0, 0.08334, 0.36111],
2979 "117": [0, 0.43056, 0, 0.02778, 0.57246],
2980 "118": [0, 0.43056, 0.03588, 0.02778, 0.48472],
2981 "119": [0, 0.43056, 0.02691, 0.08334, 0.71592],
2982 "120": [0, 0.43056, 0, 0.02778, 0.57153],
2983 "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028],
2984 "122": [0, 0.43056, 0.04398, 0.05556, 0.46505],
2985 "915": [0, 0.68333, 0.13889, 0.08334, 0.61528],
2986 "916": [0, 0.68333, 0, 0.16667, 0.83334],
2987 "920": [0, 0.68333, 0.02778, 0.08334, 0.76278],
2988 "923": [0, 0.68333, 0, 0.16667, 0.69445],
2989 "926": [0, 0.68333, 0.07569, 0.08334, 0.74236],
2990 "928": [0, 0.68333, 0.08125, 0.05556, 0.83125],
2991 "931": [0, 0.68333, 0.05764, 0.08334, 0.77986],
2992 "933": [0, 0.68333, 0.13889, 0.05556, 0.58333],
2993 "934": [0, 0.68333, 0, 0.08334, 0.66667],
2994 "936": [0, 0.68333, 0.11, 0.05556, 0.61222],
2995 "937": [0, 0.68333, 0.05017, 0.08334, 0.7724],
2996 "945": [0, 0.43056, 0.0037, 0.02778, 0.6397],
2997 "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563],
2998 "947": [0.19444, 0.43056, 0.05556, 0, 0.51773],
2999 "948": [0, 0.69444, 0.03785, 0.05556, 0.44444],
3000 "949": [0, 0.43056, 0, 0.08334, 0.46632],
3001 "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375],
3002 "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653],
3003 "952": [0, 0.69444, 0.02778, 0.08334, 0.46944],
3004 "953": [0, 0.43056, 0, 0.05556, 0.35394],
3005 "954": [0, 0.43056, 0, 0, 0.57616],
3006 "955": [0, 0.69444, 0, 0, 0.58334],
3007 "956": [0.19444, 0.43056, 0, 0.02778, 0.60255],
3008 "957": [0, 0.43056, 0.06366, 0.02778, 0.49398],
3009 "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375],
3010 "959": [0, 0.43056, 0, 0.05556, 0.48472],
3011 "960": [0, 0.43056, 0.03588, 0, 0.57003],
3012 "961": [0.19444, 0.43056, 0, 0.08334, 0.51702],
3013 "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285],
3014 "963": [0, 0.43056, 0.03588, 0, 0.57141],
3015 "964": [0, 0.43056, 0.1132, 0.02778, 0.43715],
3016 "965": [0, 0.43056, 0.03588, 0.02778, 0.54028],
3017 "966": [0.19444, 0.43056, 0, 0.08334, 0.65417],
3018 "967": [0.19444, 0.43056, 0, 0.05556, 0.62569],
3019 "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139],
3020 "969": [0, 0.43056, 0.03588, 0, 0.62245],
3021 "977": [0, 0.69444, 0, 0.08334, 0.59144],
3022 "981": [0.19444, 0.69444, 0, 0.08334, 0.59583],
3023 "982": [0, 0.43056, 0.02778, 0, 0.82813],
3024 "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702],
3025 "1013": [0, 0.43056, 0, 0.05556, 0.4059]
3026 },
3027 "SansSerif-Bold": {
3028 "33": [0, 0.69444, 0, 0, 0.36667],
3029 "34": [0, 0.69444, 0, 0, 0.55834],
3030 "35": [0.19444, 0.69444, 0, 0, 0.91667],
3031 "36": [0.05556, 0.75, 0, 0, 0.55],
3032 "37": [0.05556, 0.75, 0, 0, 1.02912],
3033 "38": [0, 0.69444, 0, 0, 0.83056],
3034 "39": [0, 0.69444, 0, 0, 0.30556],
3035 "40": [0.25, 0.75, 0, 0, 0.42778],
3036 "41": [0.25, 0.75, 0, 0, 0.42778],
3037 "42": [0, 0.75, 0, 0, 0.55],
3038 "43": [0.11667, 0.61667, 0, 0, 0.85556],
3039 "44": [0.10556, 0.13056, 0, 0, 0.30556],
3040 "45": [0, 0.45833, 0, 0, 0.36667],
3041 "46": [0, 0.13056, 0, 0, 0.30556],
3042 "47": [0.25, 0.75, 0, 0, 0.55],
3043 "48": [0, 0.69444, 0, 0, 0.55],
3044 "49": [0, 0.69444, 0, 0, 0.55],
3045 "50": [0, 0.69444, 0, 0, 0.55],
3046 "51": [0, 0.69444, 0, 0, 0.55],
3047 "52": [0, 0.69444, 0, 0, 0.55],
3048 "53": [0, 0.69444, 0, 0, 0.55],
3049 "54": [0, 0.69444, 0, 0, 0.55],
3050 "55": [0, 0.69444, 0, 0, 0.55],
3051 "56": [0, 0.69444, 0, 0, 0.55],
3052 "57": [0, 0.69444, 0, 0, 0.55],
3053 "58": [0, 0.45833, 0, 0, 0.30556],
3054 "59": [0.10556, 0.45833, 0, 0, 0.30556],
3055 "61": [-0.09375, 0.40625, 0, 0, 0.85556],
3056 "63": [0, 0.69444, 0, 0, 0.51945],
3057 "64": [0, 0.69444, 0, 0, 0.73334],
3058 "65": [0, 0.69444, 0, 0, 0.73334],
3059 "66": [0, 0.69444, 0, 0, 0.73334],
3060 "67": [0, 0.69444, 0, 0, 0.70278],
3061 "68": [0, 0.69444, 0, 0, 0.79445],
3062 "69": [0, 0.69444, 0, 0, 0.64167],
3063 "70": [0, 0.69444, 0, 0, 0.61111],
3064 "71": [0, 0.69444, 0, 0, 0.73334],
3065 "72": [0, 0.69444, 0, 0, 0.79445],
3066 "73": [0, 0.69444, 0, 0, 0.33056],
3067 "74": [0, 0.69444, 0, 0, 0.51945],
3068 "75": [0, 0.69444, 0, 0, 0.76389],
3069 "76": [0, 0.69444, 0, 0, 0.58056],
3070 "77": [0, 0.69444, 0, 0, 0.97778],
3071 "78": [0, 0.69444, 0, 0, 0.79445],
3072 "79": [0, 0.69444, 0, 0, 0.79445],
3073 "80": [0, 0.69444, 0, 0, 0.70278],
3074 "81": [0.10556, 0.69444, 0, 0, 0.79445],
3075 "82": [0, 0.69444, 0, 0, 0.70278],
3076 "83": [0, 0.69444, 0, 0, 0.61111],
3077 "84": [0, 0.69444, 0, 0, 0.73334],
3078 "85": [0, 0.69444, 0, 0, 0.76389],
3079 "86": [0, 0.69444, 0.01528, 0, 0.73334],
3080 "87": [0, 0.69444, 0.01528, 0, 1.03889],
3081 "88": [0, 0.69444, 0, 0, 0.73334],
3082 "89": [0, 0.69444, 0.0275, 0, 0.73334],
3083 "90": [0, 0.69444, 0, 0, 0.67223],
3084 "91": [0.25, 0.75, 0, 0, 0.34306],
3085 "93": [0.25, 0.75, 0, 0, 0.34306],
3086 "94": [0, 0.69444, 0, 0, 0.55],
3087 "95": [0.35, 0.10833, 0.03056, 0, 0.55],
3088 "97": [0, 0.45833, 0, 0, 0.525],
3089 "98": [0, 0.69444, 0, 0, 0.56111],
3090 "99": [0, 0.45833, 0, 0, 0.48889],
3091 "100": [0, 0.69444, 0, 0, 0.56111],
3092 "101": [0, 0.45833, 0, 0, 0.51111],
3093 "102": [0, 0.69444, 0.07639, 0, 0.33611],
3094 "103": [0.19444, 0.45833, 0.01528, 0, 0.55],
3095 "104": [0, 0.69444, 0, 0, 0.56111],
3096 "105": [0, 0.69444, 0, 0, 0.25556],
3097 "106": [0.19444, 0.69444, 0, 0, 0.28611],
3098 "107": [0, 0.69444, 0, 0, 0.53056],
3099 "108": [0, 0.69444, 0, 0, 0.25556],
3100 "109": [0, 0.45833, 0, 0, 0.86667],
3101 "110": [0, 0.45833, 0, 0, 0.56111],
3102 "111": [0, 0.45833, 0, 0, 0.55],
3103 "112": [0.19444, 0.45833, 0, 0, 0.56111],
3104 "113": [0.19444, 0.45833, 0, 0, 0.56111],
3105 "114": [0, 0.45833, 0.01528, 0, 0.37222],
3106 "115": [0, 0.45833, 0, 0, 0.42167],
3107 "116": [0, 0.58929, 0, 0, 0.40417],
3108 "117": [0, 0.45833, 0, 0, 0.56111],
3109 "118": [0, 0.45833, 0.01528, 0, 0.5],
3110 "119": [0, 0.45833, 0.01528, 0, 0.74445],
3111 "120": [0, 0.45833, 0, 0, 0.5],
3112 "121": [0.19444, 0.45833, 0.01528, 0, 0.5],
3113 "122": [0, 0.45833, 0, 0, 0.47639],
3114 "126": [0.35, 0.34444, 0, 0, 0.55],
3115 "168": [0, 0.69444, 0, 0, 0.55],
3116 "176": [0, 0.69444, 0, 0, 0.73334],
3117 "180": [0, 0.69444, 0, 0, 0.55],
3118 "184": [0.17014, 0, 0, 0, 0.48889],
3119 "305": [0, 0.45833, 0, 0, 0.25556],
3120 "567": [0.19444, 0.45833, 0, 0, 0.28611],
3121 "710": [0, 0.69444, 0, 0, 0.55],
3122 "711": [0, 0.63542, 0, 0, 0.55],
3123 "713": [0, 0.63778, 0, 0, 0.55],
3124 "728": [0, 0.69444, 0, 0, 0.55],
3125 "729": [0, 0.69444, 0, 0, 0.30556],
3126 "730": [0, 0.69444, 0, 0, 0.73334],
3127 "732": [0, 0.69444, 0, 0, 0.55],
3128 "733": [0, 0.69444, 0, 0, 0.55],
3129 "915": [0, 0.69444, 0, 0, 0.58056],
3130 "916": [0, 0.69444, 0, 0, 0.91667],
3131 "920": [0, 0.69444, 0, 0, 0.85556],
3132 "923": [0, 0.69444, 0, 0, 0.67223],
3133 "926": [0, 0.69444, 0, 0, 0.73334],
3134 "928": [0, 0.69444, 0, 0, 0.79445],
3135 "931": [0, 0.69444, 0, 0, 0.79445],
3136 "933": [0, 0.69444, 0, 0, 0.85556],
3137 "934": [0, 0.69444, 0, 0, 0.79445],
3138 "936": [0, 0.69444, 0, 0, 0.85556],
3139 "937": [0, 0.69444, 0, 0, 0.79445],
3140 "8211": [0, 0.45833, 0.03056, 0, 0.55],
3141 "8212": [0, 0.45833, 0.03056, 0, 1.10001],
3142 "8216": [0, 0.69444, 0, 0, 0.30556],
3143 "8217": [0, 0.69444, 0, 0, 0.30556],
3144 "8220": [0, 0.69444, 0, 0, 0.55834],
3145 "8221": [0, 0.69444, 0, 0, 0.55834]
3146 },
3147 "SansSerif-Italic": {
3148 "33": [0, 0.69444, 0.05733, 0, 0.31945],
3149 "34": [0, 0.69444, 0.00316, 0, 0.5],
3150 "35": [0.19444, 0.69444, 0.05087, 0, 0.83334],
3151 "36": [0.05556, 0.75, 0.11156, 0, 0.5],
3152 "37": [0.05556, 0.75, 0.03126, 0, 0.83334],
3153 "38": [0, 0.69444, 0.03058, 0, 0.75834],
3154 "39": [0, 0.69444, 0.07816, 0, 0.27778],
3155 "40": [0.25, 0.75, 0.13164, 0, 0.38889],
3156 "41": [0.25, 0.75, 0.02536, 0, 0.38889],
3157 "42": [0, 0.75, 0.11775, 0, 0.5],
3158 "43": [0.08333, 0.58333, 0.02536, 0, 0.77778],
3159 "44": [0.125, 0.08333, 0, 0, 0.27778],
3160 "45": [0, 0.44444, 0.01946, 0, 0.33333],
3161 "46": [0, 0.08333, 0, 0, 0.27778],
3162 "47": [0.25, 0.75, 0.13164, 0, 0.5],
3163 "48": [0, 0.65556, 0.11156, 0, 0.5],
3164 "49": [0, 0.65556, 0.11156, 0, 0.5],
3165 "50": [0, 0.65556, 0.11156, 0, 0.5],
3166 "51": [0, 0.65556, 0.11156, 0, 0.5],
3167 "52": [0, 0.65556, 0.11156, 0, 0.5],
3168 "53": [0, 0.65556, 0.11156, 0, 0.5],
3169 "54": [0, 0.65556, 0.11156, 0, 0.5],
3170 "55": [0, 0.65556, 0.11156, 0, 0.5],
3171 "56": [0, 0.65556, 0.11156, 0, 0.5],
3172 "57": [0, 0.65556, 0.11156, 0, 0.5],
3173 "58": [0, 0.44444, 0.02502, 0, 0.27778],
3174 "59": [0.125, 0.44444, 0.02502, 0, 0.27778],
3175 "61": [-0.13, 0.37, 0.05087, 0, 0.77778],
3176 "63": [0, 0.69444, 0.11809, 0, 0.47222],
3177 "64": [0, 0.69444, 0.07555, 0, 0.66667],
3178 "65": [0, 0.69444, 0, 0, 0.66667],
3179 "66": [0, 0.69444, 0.08293, 0, 0.66667],
3180 "67": [0, 0.69444, 0.11983, 0, 0.63889],
3181 "68": [0, 0.69444, 0.07555, 0, 0.72223],
3182 "69": [0, 0.69444, 0.11983, 0, 0.59722],
3183 "70": [0, 0.69444, 0.13372, 0, 0.56945],
3184 "71": [0, 0.69444, 0.11983, 0, 0.66667],
3185 "72": [0, 0.69444, 0.08094, 0, 0.70834],
3186 "73": [0, 0.69444, 0.13372, 0, 0.27778],
3187 "74": [0, 0.69444, 0.08094, 0, 0.47222],
3188 "75": [0, 0.69444, 0.11983, 0, 0.69445],
3189 "76": [0, 0.69444, 0, 0, 0.54167],
3190 "77": [0, 0.69444, 0.08094, 0, 0.875],
3191 "78": [0, 0.69444, 0.08094, 0, 0.70834],
3192 "79": [0, 0.69444, 0.07555, 0, 0.73611],
3193 "80": [0, 0.69444, 0.08293, 0, 0.63889],
3194 "81": [0.125, 0.69444, 0.07555, 0, 0.73611],
3195 "82": [0, 0.69444, 0.08293, 0, 0.64584],
3196 "83": [0, 0.69444, 0.09205, 0, 0.55556],
3197 "84": [0, 0.69444, 0.13372, 0, 0.68056],
3198 "85": [0, 0.69444, 0.08094, 0, 0.6875],
3199 "86": [0, 0.69444, 0.1615, 0, 0.66667],
3200 "87": [0, 0.69444, 0.1615, 0, 0.94445],
3201 "88": [0, 0.69444, 0.13372, 0, 0.66667],
3202 "89": [0, 0.69444, 0.17261, 0, 0.66667],
3203 "90": [0, 0.69444, 0.11983, 0, 0.61111],
3204 "91": [0.25, 0.75, 0.15942, 0, 0.28889],
3205 "93": [0.25, 0.75, 0.08719, 0, 0.28889],
3206 "94": [0, 0.69444, 0.0799, 0, 0.5],
3207 "95": [0.35, 0.09444, 0.08616, 0, 0.5],
3208 "97": [0, 0.44444, 0.00981, 0, 0.48056],
3209 "98": [0, 0.69444, 0.03057, 0, 0.51667],
3210 "99": [0, 0.44444, 0.08336, 0, 0.44445],
3211 "100": [0, 0.69444, 0.09483, 0, 0.51667],
3212 "101": [0, 0.44444, 0.06778, 0, 0.44445],
3213 "102": [0, 0.69444, 0.21705, 0, 0.30556],
3214 "103": [0.19444, 0.44444, 0.10836, 0, 0.5],
3215 "104": [0, 0.69444, 0.01778, 0, 0.51667],
3216 "105": [0, 0.67937, 0.09718, 0, 0.23889],
3217 "106": [0.19444, 0.67937, 0.09162, 0, 0.26667],
3218 "107": [0, 0.69444, 0.08336, 0, 0.48889],
3219 "108": [0, 0.69444, 0.09483, 0, 0.23889],
3220 "109": [0, 0.44444, 0.01778, 0, 0.79445],
3221 "110": [0, 0.44444, 0.01778, 0, 0.51667],
3222 "111": [0, 0.44444, 0.06613, 0, 0.5],
3223 "112": [0.19444, 0.44444, 0.0389, 0, 0.51667],
3224 "113": [0.19444, 0.44444, 0.04169, 0, 0.51667],
3225 "114": [0, 0.44444, 0.10836, 0, 0.34167],
3226 "115": [0, 0.44444, 0.0778, 0, 0.38333],
3227 "116": [0, 0.57143, 0.07225, 0, 0.36111],
3228 "117": [0, 0.44444, 0.04169, 0, 0.51667],
3229 "118": [0, 0.44444, 0.10836, 0, 0.46111],
3230 "119": [0, 0.44444, 0.10836, 0, 0.68334],
3231 "120": [0, 0.44444, 0.09169, 0, 0.46111],
3232 "121": [0.19444, 0.44444, 0.10836, 0, 0.46111],
3233 "122": [0, 0.44444, 0.08752, 0, 0.43472],
3234 "126": [0.35, 0.32659, 0.08826, 0, 0.5],
3235 "168": [0, 0.67937, 0.06385, 0, 0.5],
3236 "176": [0, 0.69444, 0, 0, 0.73752],
3237 "184": [0.17014, 0, 0, 0, 0.44445],
3238 "305": [0, 0.44444, 0.04169, 0, 0.23889],
3239 "567": [0.19444, 0.44444, 0.04169, 0, 0.26667],
3240 "710": [0, 0.69444, 0.0799, 0, 0.5],
3241 "711": [0, 0.63194, 0.08432, 0, 0.5],
3242 "713": [0, 0.60889, 0.08776, 0, 0.5],
3243 "714": [0, 0.69444, 0.09205, 0, 0.5],
3244 "715": [0, 0.69444, 0, 0, 0.5],
3245 "728": [0, 0.69444, 0.09483, 0, 0.5],
3246 "729": [0, 0.67937, 0.07774, 0, 0.27778],
3247 "730": [0, 0.69444, 0, 0, 0.73752],
3248 "732": [0, 0.67659, 0.08826, 0, 0.5],
3249 "733": [0, 0.69444, 0.09205, 0, 0.5],
3250 "915": [0, 0.69444, 0.13372, 0, 0.54167],
3251 "916": [0, 0.69444, 0, 0, 0.83334],
3252 "920": [0, 0.69444, 0.07555, 0, 0.77778],
3253 "923": [0, 0.69444, 0, 0, 0.61111],
3254 "926": [0, 0.69444, 0.12816, 0, 0.66667],
3255 "928": [0, 0.69444, 0.08094, 0, 0.70834],
3256 "931": [0, 0.69444, 0.11983, 0, 0.72222],
3257 "933": [0, 0.69444, 0.09031, 0, 0.77778],
3258 "934": [0, 0.69444, 0.04603, 0, 0.72222],
3259 "936": [0, 0.69444, 0.09031, 0, 0.77778],
3260 "937": [0, 0.69444, 0.08293, 0, 0.72222],
3261 "8211": [0, 0.44444, 0.08616, 0, 0.5],
3262 "8212": [0, 0.44444, 0.08616, 0, 1.0],
3263 "8216": [0, 0.69444, 0.07816, 0, 0.27778],
3264 "8217": [0, 0.69444, 0.07816, 0, 0.27778],
3265 "8220": [0, 0.69444, 0.14205, 0, 0.5],
3266 "8221": [0, 0.69444, 0.00316, 0, 0.5]
3267 },
3268 "SansSerif-Regular": {
3269 "33": [0, 0.69444, 0, 0, 0.31945],
3270 "34": [0, 0.69444, 0, 0, 0.5],
3271 "35": [0.19444, 0.69444, 0, 0, 0.83334],
3272 "36": [0.05556, 0.75, 0, 0, 0.5],
3273 "37": [0.05556, 0.75, 0, 0, 0.83334],
3274 "38": [0, 0.69444, 0, 0, 0.75834],
3275 "39": [0, 0.69444, 0, 0, 0.27778],
3276 "40": [0.25, 0.75, 0, 0, 0.38889],
3277 "41": [0.25, 0.75, 0, 0, 0.38889],
3278 "42": [0, 0.75, 0, 0, 0.5],
3279 "43": [0.08333, 0.58333, 0, 0, 0.77778],
3280 "44": [0.125, 0.08333, 0, 0, 0.27778],
3281 "45": [0, 0.44444, 0, 0, 0.33333],
3282 "46": [0, 0.08333, 0, 0, 0.27778],
3283 "47": [0.25, 0.75, 0, 0, 0.5],
3284 "48": [0, 0.65556, 0, 0, 0.5],
3285 "49": [0, 0.65556, 0, 0, 0.5],
3286 "50": [0, 0.65556, 0, 0, 0.5],
3287 "51": [0, 0.65556, 0, 0, 0.5],
3288 "52": [0, 0.65556, 0, 0, 0.5],
3289 "53": [0, 0.65556, 0, 0, 0.5],
3290 "54": [0, 0.65556, 0, 0, 0.5],
3291 "55": [0, 0.65556, 0, 0, 0.5],
3292 "56": [0, 0.65556, 0, 0, 0.5],
3293 "57": [0, 0.65556, 0, 0, 0.5],
3294 "58": [0, 0.44444, 0, 0, 0.27778],
3295 "59": [0.125, 0.44444, 0, 0, 0.27778],
3296 "61": [-0.13, 0.37, 0, 0, 0.77778],
3297 "63": [0, 0.69444, 0, 0, 0.47222],
3298 "64": [0, 0.69444, 0, 0, 0.66667],
3299 "65": [0, 0.69444, 0, 0, 0.66667],
3300 "66": [0, 0.69444, 0, 0, 0.66667],
3301 "67": [0, 0.69444, 0, 0, 0.63889],
3302 "68": [0, 0.69444, 0, 0, 0.72223],
3303 "69": [0, 0.69444, 0, 0, 0.59722],
3304 "70": [0, 0.69444, 0, 0, 0.56945],
3305 "71": [0, 0.69444, 0, 0, 0.66667],
3306 "72": [0, 0.69444, 0, 0, 0.70834],
3307 "73": [0, 0.69444, 0, 0, 0.27778],
3308 "74": [0, 0.69444, 0, 0, 0.47222],
3309 "75": [0, 0.69444, 0, 0, 0.69445],
3310 "76": [0, 0.69444, 0, 0, 0.54167],
3311 "77": [0, 0.69444, 0, 0, 0.875],
3312 "78": [0, 0.69444, 0, 0, 0.70834],
3313 "79": [0, 0.69444, 0, 0, 0.73611],
3314 "80": [0, 0.69444, 0, 0, 0.63889],
3315 "81": [0.125, 0.69444, 0, 0, 0.73611],
3316 "82": [0, 0.69444, 0, 0, 0.64584],
3317 "83": [0, 0.69444, 0, 0, 0.55556],
3318 "84": [0, 0.69444, 0, 0, 0.68056],
3319 "85": [0, 0.69444, 0, 0, 0.6875],
3320 "86": [0, 0.69444, 0.01389, 0, 0.66667],
3321 "87": [0, 0.69444, 0.01389, 0, 0.94445],
3322 "88": [0, 0.69444, 0, 0, 0.66667],
3323 "89": [0, 0.69444, 0.025, 0, 0.66667],
3324 "90": [0, 0.69444, 0, 0, 0.61111],
3325 "91": [0.25, 0.75, 0, 0, 0.28889],
3326 "93": [0.25, 0.75, 0, 0, 0.28889],
3327 "94": [0, 0.69444, 0, 0, 0.5],
3328 "95": [0.35, 0.09444, 0.02778, 0, 0.5],
3329 "97": [0, 0.44444, 0, 0, 0.48056],
3330 "98": [0, 0.69444, 0, 0, 0.51667],
3331 "99": [0, 0.44444, 0, 0, 0.44445],
3332 "100": [0, 0.69444, 0, 0, 0.51667],
3333 "101": [0, 0.44444, 0, 0, 0.44445],
3334 "102": [0, 0.69444, 0.06944, 0, 0.30556],
3335 "103": [0.19444, 0.44444, 0.01389, 0, 0.5],
3336 "104": [0, 0.69444, 0, 0, 0.51667],
3337 "105": [0, 0.67937, 0, 0, 0.23889],
3338 "106": [0.19444, 0.67937, 0, 0, 0.26667],
3339 "107": [0, 0.69444, 0, 0, 0.48889],
3340 "108": [0, 0.69444, 0, 0, 0.23889],
3341 "109": [0, 0.44444, 0, 0, 0.79445],
3342 "110": [0, 0.44444, 0, 0, 0.51667],
3343 "111": [0, 0.44444, 0, 0, 0.5],
3344 "112": [0.19444, 0.44444, 0, 0, 0.51667],
3345 "113": [0.19444, 0.44444, 0, 0, 0.51667],
3346 "114": [0, 0.44444, 0.01389, 0, 0.34167],
3347 "115": [0, 0.44444, 0, 0, 0.38333],
3348 "116": [0, 0.57143, 0, 0, 0.36111],
3349 "117": [0, 0.44444, 0, 0, 0.51667],
3350 "118": [0, 0.44444, 0.01389, 0, 0.46111],
3351 "119": [0, 0.44444, 0.01389, 0, 0.68334],
3352 "120": [0, 0.44444, 0, 0, 0.46111],
3353 "121": [0.19444, 0.44444, 0.01389, 0, 0.46111],
3354 "122": [0, 0.44444, 0, 0, 0.43472],
3355 "126": [0.35, 0.32659, 0, 0, 0.5],
3356 "168": [0, 0.67937, 0, 0, 0.5],
3357 "176": [0, 0.69444, 0, 0, 0.66667],
3358 "184": [0.17014, 0, 0, 0, 0.44445],
3359 "305": [0, 0.44444, 0, 0, 0.23889],
3360 "567": [0.19444, 0.44444, 0, 0, 0.26667],
3361 "710": [0, 0.69444, 0, 0, 0.5],
3362 "711": [0, 0.63194, 0, 0, 0.5],
3363 "713": [0, 0.60889, 0, 0, 0.5],
3364 "714": [0, 0.69444, 0, 0, 0.5],
3365 "715": [0, 0.69444, 0, 0, 0.5],
3366 "728": [0, 0.69444, 0, 0, 0.5],
3367 "729": [0, 0.67937, 0, 0, 0.27778],
3368 "730": [0, 0.69444, 0, 0, 0.66667],
3369 "732": [0, 0.67659, 0, 0, 0.5],
3370 "733": [0, 0.69444, 0, 0, 0.5],
3371 "915": [0, 0.69444, 0, 0, 0.54167],
3372 "916": [0, 0.69444, 0, 0, 0.83334],
3373 "920": [0, 0.69444, 0, 0, 0.77778],
3374 "923": [0, 0.69444, 0, 0, 0.61111],
3375 "926": [0, 0.69444, 0, 0, 0.66667],
3376 "928": [0, 0.69444, 0, 0, 0.70834],
3377 "931": [0, 0.69444, 0, 0, 0.72222],
3378 "933": [0, 0.69444, 0, 0, 0.77778],
3379 "934": [0, 0.69444, 0, 0, 0.72222],
3380 "936": [0, 0.69444, 0, 0, 0.77778],
3381 "937": [0, 0.69444, 0, 0, 0.72222],
3382 "8211": [0, 0.44444, 0.02778, 0, 0.5],
3383 "8212": [0, 0.44444, 0.02778, 0, 1.0],
3384 "8216": [0, 0.69444, 0, 0, 0.27778],
3385 "8217": [0, 0.69444, 0, 0, 0.27778],
3386 "8220": [0, 0.69444, 0, 0, 0.5],
3387 "8221": [0, 0.69444, 0, 0, 0.5]
3388 },
3389 "Script-Regular": {
3390 "65": [0, 0.7, 0.22925, 0, 0.80253],
3391 "66": [0, 0.7, 0.04087, 0, 0.90757],
3392 "67": [0, 0.7, 0.1689, 0, 0.66619],
3393 "68": [0, 0.7, 0.09371, 0, 0.77443],
3394 "69": [0, 0.7, 0.18583, 0, 0.56162],
3395 "70": [0, 0.7, 0.13634, 0, 0.89544],
3396 "71": [0, 0.7, 0.17322, 0, 0.60961],
3397 "72": [0, 0.7, 0.29694, 0, 0.96919],
3398 "73": [0, 0.7, 0.19189, 0, 0.80907],
3399 "74": [0.27778, 0.7, 0.19189, 0, 1.05159],
3400 "75": [0, 0.7, 0.31259, 0, 0.91364],
3401 "76": [0, 0.7, 0.19189, 0, 0.87373],
3402 "77": [0, 0.7, 0.15981, 0, 1.08031],
3403 "78": [0, 0.7, 0.3525, 0, 0.9015],
3404 "79": [0, 0.7, 0.08078, 0, 0.73787],
3405 "80": [0, 0.7, 0.08078, 0, 1.01262],
3406 "81": [0, 0.7, 0.03305, 0, 0.88282],
3407 "82": [0, 0.7, 0.06259, 0, 0.85],
3408 "83": [0, 0.7, 0.19189, 0, 0.86767],
3409 "84": [0, 0.7, 0.29087, 0, 0.74697],
3410 "85": [0, 0.7, 0.25815, 0, 0.79996],
3411 "86": [0, 0.7, 0.27523, 0, 0.62204],
3412 "87": [0, 0.7, 0.27523, 0, 0.80532],
3413 "88": [0, 0.7, 0.26006, 0, 0.94445],
3414 "89": [0, 0.7, 0.2939, 0, 0.70961],
3415 "90": [0, 0.7, 0.24037, 0, 0.8212]
3416 },
3417 "Size1-Regular": {
3418 "40": [0.35001, 0.85, 0, 0, 0.45834],
3419 "41": [0.35001, 0.85, 0, 0, 0.45834],
3420 "47": [0.35001, 0.85, 0, 0, 0.57778],
3421 "91": [0.35001, 0.85, 0, 0, 0.41667],
3422 "92": [0.35001, 0.85, 0, 0, 0.57778],
3423 "93": [0.35001, 0.85, 0, 0, 0.41667],
3424 "123": [0.35001, 0.85, 0, 0, 0.58334],
3425 "125": [0.35001, 0.85, 0, 0, 0.58334],
3426 "710": [0, 0.72222, 0, 0, 0.55556],
3427 "732": [0, 0.72222, 0, 0, 0.55556],
3428 "770": [0, 0.72222, 0, 0, 0.55556],
3429 "771": [0, 0.72222, 0, 0, 0.55556],
3430 "8214": [-0.00099, 0.601, 0, 0, 0.77778],
3431 "8593": [1e-05, 0.6, 0, 0, 0.66667],
3432 "8595": [1e-05, 0.6, 0, 0, 0.66667],
3433 "8657": [1e-05, 0.6, 0, 0, 0.77778],
3434 "8659": [1e-05, 0.6, 0, 0, 0.77778],
3435 "8719": [0.25001, 0.75, 0, 0, 0.94445],
3436 "8720": [0.25001, 0.75, 0, 0, 0.94445],
3437 "8721": [0.25001, 0.75, 0, 0, 1.05556],
3438 "8730": [0.35001, 0.85, 0, 0, 1.0],
3439 "8739": [-0.00599, 0.606, 0, 0, 0.33333],
3440 "8741": [-0.00599, 0.606, 0, 0, 0.55556],
3441 "8747": [0.30612, 0.805, 0.19445, 0, 0.47222],
3442 "8748": [0.306, 0.805, 0.19445, 0, 0.47222],
3443 "8749": [0.306, 0.805, 0.19445, 0, 0.47222],
3444 "8750": [0.30612, 0.805, 0.19445, 0, 0.47222],
3445 "8896": [0.25001, 0.75, 0, 0, 0.83334],
3446 "8897": [0.25001, 0.75, 0, 0, 0.83334],
3447 "8898": [0.25001, 0.75, 0, 0, 0.83334],
3448 "8899": [0.25001, 0.75, 0, 0, 0.83334],
3449 "8968": [0.35001, 0.85, 0, 0, 0.47222],
3450 "8969": [0.35001, 0.85, 0, 0, 0.47222],
3451 "8970": [0.35001, 0.85, 0, 0, 0.47222],
3452 "8971": [0.35001, 0.85, 0, 0, 0.47222],
3453 "9168": [-0.00099, 0.601, 0, 0, 0.66667],
3454 "10216": [0.35001, 0.85, 0, 0, 0.47222],
3455 "10217": [0.35001, 0.85, 0, 0, 0.47222],
3456 "10752": [0.25001, 0.75, 0, 0, 1.11111],
3457 "10753": [0.25001, 0.75, 0, 0, 1.11111],
3458 "10754": [0.25001, 0.75, 0, 0, 1.11111],
3459 "10756": [0.25001, 0.75, 0, 0, 0.83334],
3460 "10758": [0.25001, 0.75, 0, 0, 0.83334]
3461 },
3462 "Size2-Regular": {
3463 "40": [0.65002, 1.15, 0, 0, 0.59722],
3464 "41": [0.65002, 1.15, 0, 0, 0.59722],
3465 "47": [0.65002, 1.15, 0, 0, 0.81111],
3466 "91": [0.65002, 1.15, 0, 0, 0.47222],
3467 "92": [0.65002, 1.15, 0, 0, 0.81111],
3468 "93": [0.65002, 1.15, 0, 0, 0.47222],
3469 "123": [0.65002, 1.15, 0, 0, 0.66667],
3470 "125": [0.65002, 1.15, 0, 0, 0.66667],
3471 "710": [0, 0.75, 0, 0, 1.0],
3472 "732": [0, 0.75, 0, 0, 1.0],
3473 "770": [0, 0.75, 0, 0, 1.0],
3474 "771": [0, 0.75, 0, 0, 1.0],
3475 "8719": [0.55001, 1.05, 0, 0, 1.27778],
3476 "8720": [0.55001, 1.05, 0, 0, 1.27778],
3477 "8721": [0.55001, 1.05, 0, 0, 1.44445],
3478 "8730": [0.65002, 1.15, 0, 0, 1.0],
3479 "8747": [0.86225, 1.36, 0.44445, 0, 0.55556],
3480 "8748": [0.862, 1.36, 0.44445, 0, 0.55556],
3481 "8749": [0.862, 1.36, 0.44445, 0, 0.55556],
3482 "8750": [0.86225, 1.36, 0.44445, 0, 0.55556],
3483 "8896": [0.55001, 1.05, 0, 0, 1.11111],
3484 "8897": [0.55001, 1.05, 0, 0, 1.11111],
3485 "8898": [0.55001, 1.05, 0, 0, 1.11111],
3486 "8899": [0.55001, 1.05, 0, 0, 1.11111],
3487 "8968": [0.65002, 1.15, 0, 0, 0.52778],
3488 "8969": [0.65002, 1.15, 0, 0, 0.52778],
3489 "8970": [0.65002, 1.15, 0, 0, 0.52778],
3490 "8971": [0.65002, 1.15, 0, 0, 0.52778],
3491 "10216": [0.65002, 1.15, 0, 0, 0.61111],
3492 "10217": [0.65002, 1.15, 0, 0, 0.61111],
3493 "10752": [0.55001, 1.05, 0, 0, 1.51112],
3494 "10753": [0.55001, 1.05, 0, 0, 1.51112],
3495 "10754": [0.55001, 1.05, 0, 0, 1.51112],
3496 "10756": [0.55001, 1.05, 0, 0, 1.11111],
3497 "10758": [0.55001, 1.05, 0, 0, 1.11111]
3498 },
3499 "Size3-Regular": {
3500 "40": [0.95003, 1.45, 0, 0, 0.73611],
3501 "41": [0.95003, 1.45, 0, 0, 0.73611],
3502 "47": [0.95003, 1.45, 0, 0, 1.04445],
3503 "91": [0.95003, 1.45, 0, 0, 0.52778],
3504 "92": [0.95003, 1.45, 0, 0, 1.04445],
3505 "93": [0.95003, 1.45, 0, 0, 0.52778],
3506 "123": [0.95003, 1.45, 0, 0, 0.75],
3507 "125": [0.95003, 1.45, 0, 0, 0.75],
3508 "710": [0, 0.75, 0, 0, 1.44445],
3509 "732": [0, 0.75, 0, 0, 1.44445],
3510 "770": [0, 0.75, 0, 0, 1.44445],
3511 "771": [0, 0.75, 0, 0, 1.44445],
3512 "8730": [0.95003, 1.45, 0, 0, 1.0],
3513 "8968": [0.95003, 1.45, 0, 0, 0.58334],
3514 "8969": [0.95003, 1.45, 0, 0, 0.58334],
3515 "8970": [0.95003, 1.45, 0, 0, 0.58334],
3516 "8971": [0.95003, 1.45, 0, 0, 0.58334],
3517 "10216": [0.95003, 1.45, 0, 0, 0.75],
3518 "10217": [0.95003, 1.45, 0, 0, 0.75]
3519 },
3520 "Size4-Regular": {
3521 "40": [1.25003, 1.75, 0, 0, 0.79167],
3522 "41": [1.25003, 1.75, 0, 0, 0.79167],
3523 "47": [1.25003, 1.75, 0, 0, 1.27778],
3524 "91": [1.25003, 1.75, 0, 0, 0.58334],
3525 "92": [1.25003, 1.75, 0, 0, 1.27778],
3526 "93": [1.25003, 1.75, 0, 0, 0.58334],
3527 "123": [1.25003, 1.75, 0, 0, 0.80556],
3528 "125": [1.25003, 1.75, 0, 0, 0.80556],
3529 "710": [0, 0.825, 0, 0, 1.8889],
3530 "732": [0, 0.825, 0, 0, 1.8889],
3531 "770": [0, 0.825, 0, 0, 1.8889],
3532 "771": [0, 0.825, 0, 0, 1.8889],
3533 "8730": [1.25003, 1.75, 0, 0, 1.0],
3534 "8968": [1.25003, 1.75, 0, 0, 0.63889],
3535 "8969": [1.25003, 1.75, 0, 0, 0.63889],
3536 "8970": [1.25003, 1.75, 0, 0, 0.63889],
3537 "8971": [1.25003, 1.75, 0, 0, 0.63889],
3538 "9115": [0.64502, 1.155, 0, 0, 0.875],
3539 "9116": [1e-05, 0.6, 0, 0, 0.875],
3540 "9117": [0.64502, 1.155, 0, 0, 0.875],
3541 "9118": [0.64502, 1.155, 0, 0, 0.875],
3542 "9119": [1e-05, 0.6, 0, 0, 0.875],
3543 "9120": [0.64502, 1.155, 0, 0, 0.875],
3544 "9121": [0.64502, 1.155, 0, 0, 0.66667],
3545 "9122": [-0.00099, 0.601, 0, 0, 0.66667],
3546 "9123": [0.64502, 1.155, 0, 0, 0.66667],
3547 "9124": [0.64502, 1.155, 0, 0, 0.66667],
3548 "9125": [-0.00099, 0.601, 0, 0, 0.66667],
3549 "9126": [0.64502, 1.155, 0, 0, 0.66667],
3550 "9127": [1e-05, 0.9, 0, 0, 0.88889],
3551 "9128": [0.65002, 1.15, 0, 0, 0.88889],
3552 "9129": [0.90001, 0, 0, 0, 0.88889],
3553 "9130": [0, 0.3, 0, 0, 0.88889],
3554 "9131": [1e-05, 0.9, 0, 0, 0.88889],
3555 "9132": [0.65002, 1.15, 0, 0, 0.88889],
3556 "9133": [0.90001, 0, 0, 0, 0.88889],
3557 "9143": [0.88502, 0.915, 0, 0, 1.05556],
3558 "10216": [1.25003, 1.75, 0, 0, 0.80556],
3559 "10217": [1.25003, 1.75, 0, 0, 0.80556],
3560 "57344": [-0.00499, 0.605, 0, 0, 1.05556],
3561 "57345": [-0.00499, 0.605, 0, 0, 1.05556],
3562 "57680": [0, 0.12, 0, 0, 0.45],
3563 "57681": [0, 0.12, 0, 0, 0.45],
3564 "57682": [0, 0.12, 0, 0, 0.45],
3565 "57683": [0, 0.12, 0, 0, 0.45]
3566 },
3567 "Typewriter-Regular": {
3568 "32": [0, 0, 0, 0, 0.525],
3569 "33": [0, 0.61111, 0, 0, 0.525],
3570 "34": [0, 0.61111, 0, 0, 0.525],
3571 "35": [0, 0.61111, 0, 0, 0.525],
3572 "36": [0.08333, 0.69444, 0, 0, 0.525],
3573 "37": [0.08333, 0.69444, 0, 0, 0.525],
3574 "38": [0, 0.61111, 0, 0, 0.525],
3575 "39": [0, 0.61111, 0, 0, 0.525],
3576 "40": [0.08333, 0.69444, 0, 0, 0.525],
3577 "41": [0.08333, 0.69444, 0, 0, 0.525],
3578 "42": [0, 0.52083, 0, 0, 0.525],
3579 "43": [-0.08056, 0.53055, 0, 0, 0.525],
3580 "44": [0.13889, 0.125, 0, 0, 0.525],
3581 "45": [-0.08056, 0.53055, 0, 0, 0.525],
3582 "46": [0, 0.125, 0, 0, 0.525],
3583 "47": [0.08333, 0.69444, 0, 0, 0.525],
3584 "48": [0, 0.61111, 0, 0, 0.525],
3585 "49": [0, 0.61111, 0, 0, 0.525],
3586 "50": [0, 0.61111, 0, 0, 0.525],
3587 "51": [0, 0.61111, 0, 0, 0.525],
3588 "52": [0, 0.61111, 0, 0, 0.525],
3589 "53": [0, 0.61111, 0, 0, 0.525],
3590 "54": [0, 0.61111, 0, 0, 0.525],
3591 "55": [0, 0.61111, 0, 0, 0.525],
3592 "56": [0, 0.61111, 0, 0, 0.525],
3593 "57": [0, 0.61111, 0, 0, 0.525],
3594 "58": [0, 0.43056, 0, 0, 0.525],
3595 "59": [0.13889, 0.43056, 0, 0, 0.525],
3596 "60": [-0.05556, 0.55556, 0, 0, 0.525],
3597 "61": [-0.19549, 0.41562, 0, 0, 0.525],
3598 "62": [-0.05556, 0.55556, 0, 0, 0.525],
3599 "63": [0, 0.61111, 0, 0, 0.525],
3600 "64": [0, 0.61111, 0, 0, 0.525],
3601 "65": [0, 0.61111, 0, 0, 0.525],
3602 "66": [0, 0.61111, 0, 0, 0.525],
3603 "67": [0, 0.61111, 0, 0, 0.525],
3604 "68": [0, 0.61111, 0, 0, 0.525],
3605 "69": [0, 0.61111, 0, 0, 0.525],
3606 "70": [0, 0.61111, 0, 0, 0.525],
3607 "71": [0, 0.61111, 0, 0, 0.525],
3608 "72": [0, 0.61111, 0, 0, 0.525],
3609 "73": [0, 0.61111, 0, 0, 0.525],
3610 "74": [0, 0.61111, 0, 0, 0.525],
3611 "75": [0, 0.61111, 0, 0, 0.525],
3612 "76": [0, 0.61111, 0, 0, 0.525],
3613 "77": [0, 0.61111, 0, 0, 0.525],
3614 "78": [0, 0.61111, 0, 0, 0.525],
3615 "79": [0, 0.61111, 0, 0, 0.525],
3616 "80": [0, 0.61111, 0, 0, 0.525],
3617 "81": [0.13889, 0.61111, 0, 0, 0.525],
3618 "82": [0, 0.61111, 0, 0, 0.525],
3619 "83": [0, 0.61111, 0, 0, 0.525],
3620 "84": [0, 0.61111, 0, 0, 0.525],
3621 "85": [0, 0.61111, 0, 0, 0.525],
3622 "86": [0, 0.61111, 0, 0, 0.525],
3623 "87": [0, 0.61111, 0, 0, 0.525],
3624 "88": [0, 0.61111, 0, 0, 0.525],
3625 "89": [0, 0.61111, 0, 0, 0.525],
3626 "90": [0, 0.61111, 0, 0, 0.525],
3627 "91": [0.08333, 0.69444, 0, 0, 0.525],
3628 "92": [0.08333, 0.69444, 0, 0, 0.525],
3629 "93": [0.08333, 0.69444, 0, 0, 0.525],
3630 "94": [0, 0.61111, 0, 0, 0.525],
3631 "95": [0.09514, 0, 0, 0, 0.525],
3632 "96": [0, 0.61111, 0, 0, 0.525],
3633 "97": [0, 0.43056, 0, 0, 0.525],
3634 "98": [0, 0.61111, 0, 0, 0.525],
3635 "99": [0, 0.43056, 0, 0, 0.525],
3636 "100": [0, 0.61111, 0, 0, 0.525],
3637 "101": [0, 0.43056, 0, 0, 0.525],
3638 "102": [0, 0.61111, 0, 0, 0.525],
3639 "103": [0.22222, 0.43056, 0, 0, 0.525],
3640 "104": [0, 0.61111, 0, 0, 0.525],
3641 "105": [0, 0.61111, 0, 0, 0.525],
3642 "106": [0.22222, 0.61111, 0, 0, 0.525],
3643 "107": [0, 0.61111, 0, 0, 0.525],
3644 "108": [0, 0.61111, 0, 0, 0.525],
3645 "109": [0, 0.43056, 0, 0, 0.525],
3646 "110": [0, 0.43056, 0, 0, 0.525],
3647 "111": [0, 0.43056, 0, 0, 0.525],
3648 "112": [0.22222, 0.43056, 0, 0, 0.525],
3649 "113": [0.22222, 0.43056, 0, 0, 0.525],
3650 "114": [0, 0.43056, 0, 0, 0.525],
3651 "115": [0, 0.43056, 0, 0, 0.525],
3652 "116": [0, 0.55358, 0, 0, 0.525],
3653 "117": [0, 0.43056, 0, 0, 0.525],
3654 "118": [0, 0.43056, 0, 0, 0.525],
3655 "119": [0, 0.43056, 0, 0, 0.525],
3656 "120": [0, 0.43056, 0, 0, 0.525],
3657 "121": [0.22222, 0.43056, 0, 0, 0.525],
3658 "122": [0, 0.43056, 0, 0, 0.525],
3659 "123": [0.08333, 0.69444, 0, 0, 0.525],
3660 "124": [0.08333, 0.69444, 0, 0, 0.525],
3661 "125": [0.08333, 0.69444, 0, 0, 0.525],
3662 "126": [0, 0.61111, 0, 0, 0.525],
3663 "127": [0, 0.61111, 0, 0, 0.525],
3664 "160": [0, 0, 0, 0, 0.525],
3665 "176": [0, 0.61111, 0, 0, 0.525],
3666 "184": [0.19445, 0, 0, 0, 0.525],
3667 "305": [0, 0.43056, 0, 0, 0.525],
3668 "567": [0.22222, 0.43056, 0, 0, 0.525],
3669 "711": [0, 0.56597, 0, 0, 0.525],
3670 "713": [0, 0.56555, 0, 0, 0.525],
3671 "714": [0, 0.61111, 0, 0, 0.525],
3672 "715": [0, 0.61111, 0, 0, 0.525],
3673 "728": [0, 0.61111, 0, 0, 0.525],
3674 "730": [0, 0.61111, 0, 0, 0.525],
3675 "770": [0, 0.61111, 0, 0, 0.525],
3676 "771": [0, 0.61111, 0, 0, 0.525],
3677 "776": [0, 0.61111, 0, 0, 0.525],
3678 "915": [0, 0.61111, 0, 0, 0.525],
3679 "916": [0, 0.61111, 0, 0, 0.525],
3680 "920": [0, 0.61111, 0, 0, 0.525],
3681 "923": [0, 0.61111, 0, 0, 0.525],
3682 "926": [0, 0.61111, 0, 0, 0.525],
3683 "928": [0, 0.61111, 0, 0, 0.525],
3684 "931": [0, 0.61111, 0, 0, 0.525],
3685 "933": [0, 0.61111, 0, 0, 0.525],
3686 "934": [0, 0.61111, 0, 0, 0.525],
3687 "936": [0, 0.61111, 0, 0, 0.525],
3688 "937": [0, 0.61111, 0, 0, 0.525],
3689 "8216": [0, 0.61111, 0, 0, 0.525],
3690 "8217": [0, 0.61111, 0, 0, 0.525],
3691 "8242": [0, 0.61111, 0, 0, 0.525],
3692 "9251": [0.11111, 0.21944, 0, 0, 0.525]
3693 }
3694 });
3695 // CONCATENATED MODULE: ./src/fontMetrics.js
3696
3697
3698 /**
3699 * This file contains metrics regarding fonts and individual symbols. The sigma
3700 * and xi variables, as well as the metricMap map contain data extracted from
3701 * TeX, TeX font metrics, and the TTF files. These data are then exposed via the
3702 * `metrics` variable and the getCharacterMetrics function.
3703 */
3704 // In TeX, there are actually three sets of dimensions, one for each of
3705 // textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4:
3706 // 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt). These are
3707 // provided in the the arrays below, in that order.
3708 //
3709 // The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respsectively.
3710 // This was determined by running the following script:
3711 //
3712 // latex -interaction=nonstopmode \
3713 // '\documentclass{article}\usepackage{amsmath}\begin{document}' \
3714 // '$a$ \expandafter\show\the\textfont2' \
3715 // '\expandafter\show\the\scriptfont2' \
3716 // '\expandafter\show\the\scriptscriptfont2' \
3717 // '\stop'
3718 //
3719 // The metrics themselves were retreived using the following commands:
3720 //
3721 // tftopl cmsy10
3722 // tftopl cmsy7
3723 // tftopl cmsy5
3724 //
3725 // The output of each of these commands is quite lengthy. The only part we
3726 // care about is the FONTDIMEN section. Each value is measured in EMs.
3727 var sigmasAndXis = {
3728 slant: [0.250, 0.250, 0.250],
3729 // sigma1
3730 space: [0.000, 0.000, 0.000],
3731 // sigma2
3732 stretch: [0.000, 0.000, 0.000],
3733 // sigma3
3734 shrink: [0.000, 0.000, 0.000],
3735 // sigma4
3736 xHeight: [0.431, 0.431, 0.431],
3737 // sigma5
3738 quad: [1.000, 1.171, 1.472],
3739 // sigma6
3740 extraSpace: [0.000, 0.000, 0.000],
3741 // sigma7
3742 num1: [0.677, 0.732, 0.925],
3743 // sigma8
3744 num2: [0.394, 0.384, 0.387],
3745 // sigma9
3746 num3: [0.444, 0.471, 0.504],
3747 // sigma10
3748 denom1: [0.686, 0.752, 1.025],
3749 // sigma11
3750 denom2: [0.345, 0.344, 0.532],
3751 // sigma12
3752 sup1: [0.413, 0.503, 0.504],
3753 // sigma13
3754 sup2: [0.363, 0.431, 0.404],
3755 // sigma14
3756 sup3: [0.289, 0.286, 0.294],
3757 // sigma15
3758 sub1: [0.150, 0.143, 0.200],
3759 // sigma16
3760 sub2: [0.247, 0.286, 0.400],
3761 // sigma17
3762 supDrop: [0.386, 0.353, 0.494],
3763 // sigma18
3764 subDrop: [0.050, 0.071, 0.100],
3765 // sigma19
3766 delim1: [2.390, 1.700, 1.980],
3767 // sigma20
3768 delim2: [1.010, 1.157, 1.420],
3769 // sigma21
3770 axisHeight: [0.250, 0.250, 0.250],
3771 // sigma22
3772 // These font metrics are extracted from TeX by using tftopl on cmex10.tfm;
3773 // they correspond to the font parameters of the extension fonts (family 3).
3774 // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to
3775 // match cmex7, we'd use cmex7.tfm values for script and scriptscript
3776 // values.
3777 defaultRuleThickness: [0.04, 0.049, 0.049],
3778 // xi8; cmex7: 0.049
3779 bigOpSpacing1: [0.111, 0.111, 0.111],
3780 // xi9
3781 bigOpSpacing2: [0.166, 0.166, 0.166],
3782 // xi10
3783 bigOpSpacing3: [0.2, 0.2, 0.2],
3784 // xi11
3785 bigOpSpacing4: [0.6, 0.611, 0.611],
3786 // xi12; cmex7: 0.611
3787 bigOpSpacing5: [0.1, 0.143, 0.143],
3788 // xi13; cmex7: 0.143
3789 // The \sqrt rule width is taken from the height of the surd character.
3790 // Since we use the same font at all sizes, this thickness doesn't scale.
3791 sqrtRuleThickness: [0.04, 0.04, 0.04],
3792 // This value determines how large a pt is, for metrics which are defined
3793 // in terms of pts.
3794 // This value is also used in katex.less; if you change it make sure the
3795 // values match.
3796 ptPerEm: [10.0, 10.0, 10.0],
3797 // The space between adjacent `|` columns in an array definition. From
3798 // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm.
3799 doubleRuleSep: [0.2, 0.2, 0.2],
3800 // The width of separator lines in {array} environments. From
3801 // `\showthe\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm.
3802 arrayRuleWidth: [0.04, 0.04, 0.04],
3803 // Two values from LaTeX source2e:
3804 fboxsep: [0.3, 0.3, 0.3],
3805 // 3 pt / ptPerEm
3806 fboxrule: [0.04, 0.04, 0.04] // 0.4 pt / ptPerEm
3807
3808 }; // This map contains a mapping from font name and character code to character
3809 // metrics, including height, depth, italic correction, and skew (kern from the
3810 // character to the corresponding \skewchar)
3811 // This map is generated via `make metrics`. It should not be changed manually.
3812
3813 // These are very rough approximations. We default to Times New Roman which
3814 // should have Latin-1 and Cyrillic characters, but may not depending on the
3815 // operating system. The metrics do not account for extra height from the
3816 // accents. In the case of Cyrillic characters which have both ascenders and
3817 // descenders we prefer approximations with ascenders, primarily to prevent
3818 // the fraction bar or root line from intersecting the glyph.
3819 // TODO(kevinb) allow union of multiple glyph metrics for better accuracy.
3820
3821 var extraCharacterMap = {
3822 // Latin-1
3823 'Å': 'A',
3824 'Ç': 'C',
3825 'Ð': 'D',
3826 'Þ': 'o',
3827 'å': 'a',
3828 'ç': 'c',
3829 'ð': 'd',
3830 'þ': 'o',
3831 // Cyrillic
3832 'А': 'A',
3833 'Б': 'B',
3834 'В': 'B',
3835 'Г': 'F',
3836 'Д': 'A',
3837 'Е': 'E',
3838 'Ж': 'K',
3839 'З': '3',
3840 'И': 'N',
3841 'Й': 'N',
3842 'К': 'K',
3843 'Л': 'N',
3844 'М': 'M',
3845 'Н': 'H',
3846 'О': 'O',
3847 'П': 'N',
3848 'Р': 'P',
3849 'С': 'C',
3850 'Т': 'T',
3851 'У': 'y',
3852 'Ф': 'O',
3853 'Х': 'X',
3854 'Ц': 'U',
3855 'Ч': 'h',
3856 'Ш': 'W',
3857 'Щ': 'W',
3858 'Ъ': 'B',
3859 'Ы': 'X',
3860 'Ь': 'B',
3861 'Э': '3',
3862 'Ю': 'X',
3863 'Я': 'R',
3864 'а': 'a',
3865 'б': 'b',
3866 'в': 'a',
3867 'г': 'r',
3868 'д': 'y',
3869 'е': 'e',
3870 'ж': 'm',
3871 'з': 'e',
3872 'и': 'n',
3873 'й': 'n',
3874 'к': 'n',
3875 'л': 'n',
3876 'м': 'm',
3877 'н': 'n',
3878 'о': 'o',
3879 'п': 'n',
3880 'р': 'p',
3881 'с': 'c',
3882 'т': 'o',
3883 'у': 'y',
3884 'ф': 'b',
3885 'х': 'x',
3886 'ц': 'n',
3887 'ч': 'n',
3888 'ш': 'w',
3889 'щ': 'w',
3890 'ъ': 'a',
3891 'ы': 'm',
3892 'ь': 'a',
3893 'э': 'e',
3894 'ю': 'm',
3895 'я': 'r'
3896 };
3897
3898 /**
3899 * This function adds new font metrics to default metricMap
3900 * It can also override existing metrics
3901 */
3902 function setFontMetrics(fontName, metrics) {
3903 fontMetricsData[fontName] = metrics;
3904 }
3905 /**
3906 * This function is a convenience function for looking up information in the
3907 * metricMap table. It takes a character as a string, and a font.
3908 *
3909 * Note: the `width` property may be undefined if fontMetricsData.js wasn't
3910 * built using `Make extended_metrics`.
3911 */
3912
3913 function getCharacterMetrics(character, font, mode) {
3914 if (!fontMetricsData[font]) {
3915 throw new Error("Font metrics not found for font: " + font + ".");
3916 }
3917
3918 var ch = character.charCodeAt(0);
3919 var metrics = fontMetricsData[font][ch];
3920
3921 if (!metrics && character[0] in extraCharacterMap) {
3922 ch = extraCharacterMap[character[0]].charCodeAt(0);
3923 metrics = fontMetricsData[font][ch];
3924 }
3925
3926 if (!metrics && mode === 'text') {
3927 // We don't typically have font metrics for Asian scripts.
3928 // But since we support them in text mode, we need to return
3929 // some sort of metrics.
3930 // So if the character is in a script we support but we
3931 // don't have metrics for it, just use the metrics for
3932 // the Latin capital letter M. This is close enough because
3933 // we (currently) only care about the height of the glpyh
3934 // not its width.
3935 if (supportedCodepoint(ch)) {
3936 metrics = fontMetricsData[font][77]; // 77 is the charcode for 'M'
3937 }
3938 }
3939
3940 if (metrics) {
3941 return {
3942 depth: metrics[0],
3943 height: metrics[1],
3944 italic: metrics[2],
3945 skew: metrics[3],
3946 width: metrics[4]
3947 };
3948 }
3949 }
3950 var fontMetricsBySizeIndex = {};
3951 /**
3952 * Get the font metrics for a given size.
3953 */
3954
3955 function getGlobalMetrics(size) {
3956 var sizeIndex;
3957
3958 if (size >= 5) {
3959 sizeIndex = 0;
3960 } else if (size >= 3) {
3961 sizeIndex = 1;
3962 } else {
3963 sizeIndex = 2;
3964 }
3965
3966 if (!fontMetricsBySizeIndex[sizeIndex]) {
3967 var metrics = fontMetricsBySizeIndex[sizeIndex] = {
3968 cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18
3969 };
3970
3971 for (var key in sigmasAndXis) {
3972 if (sigmasAndXis.hasOwnProperty(key)) {
3973 metrics[key] = sigmasAndXis[key][sizeIndex];
3974 }
3975 }
3976 }
3977
3978 return fontMetricsBySizeIndex[sizeIndex];
3979 }
3980 // CONCATENATED MODULE: ./src/symbols.js
3981 /**
3982 * This file holds a list of all no-argument functions and single-character
3983 * symbols (like 'a' or ';').
3984 *
3985 * For each of the symbols, there are three properties they can have:
3986 * - font (required): the font to be used for this symbol. Either "main" (the
3987 normal font), or "ams" (the ams fonts).
3988 * - group (required): the ParseNode group type the symbol should have (i.e.
3989 "textord", "mathord", etc).
3990 See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types
3991 * - replace: the character that this symbol or function should be
3992 * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi
3993 * character in the main font).
3994 *
3995 * The outermost map in the table indicates what mode the symbols should be
3996 * accepted in (e.g. "math" or "text").
3997 */
3998 // Some of these have a "-token" suffix since these are also used as `ParseNode`
3999 // types for raw text tokens, and we want to avoid conflicts with higher-level
4000 // `ParseNode` types. These `ParseNode`s are constructed within `Parser` by
4001 // looking up the `symbols` map.
4002 var ATOMS = {
4003 "bin": 1,
4004 "close": 1,
4005 "inner": 1,
4006 "open": 1,
4007 "punct": 1,
4008 "rel": 1
4009 };
4010 var NON_ATOMS = {
4011 "accent-token": 1,
4012 "mathord": 1,
4013 "op-token": 1,
4014 "spacing": 1,
4015 "textord": 1
4016 };
4017 var symbols = {
4018 "math": {},
4019 "text": {}
4020 };
4021 /* harmony default export */ var src_symbols = (symbols);
4022 /** `acceptUnicodeChar = true` is only applicable if `replace` is set. */
4023
4024 function defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) {
4025 symbols[mode][name] = {
4026 font: font,
4027 group: group,
4028 replace: replace
4029 };
4030
4031 if (acceptUnicodeChar && replace) {
4032 symbols[mode][replace] = symbols[mode][name];
4033 }
4034 } // Some abbreviations for commonly used strings.
4035 // This helps minify the code, and also spotting typos using jshint.
4036 // modes:
4037
4038 var symbols_math = "math";
4039 var symbols_text = "text"; // fonts:
4040
4041 var main = "main";
4042 var ams = "ams"; // groups:
4043
4044 var symbols_accent = "accent-token";
4045 var bin = "bin";
4046 var symbols_close = "close";
4047 var symbols_inner = "inner";
4048 var mathord = "mathord";
4049 var op = "op-token";
4050 var symbols_open = "open";
4051 var punct = "punct";
4052 var rel = "rel";
4053 var symbols_spacing = "spacing";
4054 var symbols_textord = "textord"; // Now comes the symbol table
4055 // Relation Symbols
4056
4057 defineSymbol(symbols_math, main, rel, "\u2261", "\\equiv", true);
4058 defineSymbol(symbols_math, main, rel, "\u227A", "\\prec", true);
4059 defineSymbol(symbols_math, main, rel, "\u227B", "\\succ", true);
4060 defineSymbol(symbols_math, main, rel, "\u223C", "\\sim", true);
4061 defineSymbol(symbols_math, main, rel, "\u22A5", "\\perp");
4062 defineSymbol(symbols_math, main, rel, "\u2AAF", "\\preceq", true);
4063 defineSymbol(symbols_math, main, rel, "\u2AB0", "\\succeq", true);
4064 defineSymbol(symbols_math, main, rel, "\u2243", "\\simeq", true);
4065 defineSymbol(symbols_math, main, rel, "\u2223", "\\mid", true);
4066 defineSymbol(symbols_math, main, rel, "\u226A", "\\ll", true);
4067 defineSymbol(symbols_math, main, rel, "\u226B", "\\gg", true);
4068 defineSymbol(symbols_math, main, rel, "\u224D", "\\asymp", true);
4069 defineSymbol(symbols_math, main, rel, "\u2225", "\\parallel");
4070 defineSymbol(symbols_math, main, rel, "\u22C8", "\\bowtie", true);
4071 defineSymbol(symbols_math, main, rel, "\u2323", "\\smile", true);
4072 defineSymbol(symbols_math, main, rel, "\u2291", "\\sqsubseteq", true);
4073 defineSymbol(symbols_math, main, rel, "\u2292", "\\sqsupseteq", true);
4074 defineSymbol(symbols_math, main, rel, "\u2250", "\\doteq", true);
4075 defineSymbol(symbols_math, main, rel, "\u2322", "\\frown", true);
4076 defineSymbol(symbols_math, main, rel, "\u220B", "\\ni", true);
4077 defineSymbol(symbols_math, main, rel, "\u221D", "\\propto", true);
4078 defineSymbol(symbols_math, main, rel, "\u22A2", "\\vdash", true);
4079 defineSymbol(symbols_math, main, rel, "\u22A3", "\\dashv", true);
4080 defineSymbol(symbols_math, main, rel, "\u220B", "\\owns"); // Punctuation
4081
4082 defineSymbol(symbols_math, main, punct, ".", "\\ldotp");
4083 defineSymbol(symbols_math, main, punct, "\u22C5", "\\cdotp"); // Misc Symbols
4084
4085 defineSymbol(symbols_math, main, symbols_textord, "#", "\\#");
4086 defineSymbol(symbols_text, main, symbols_textord, "#", "\\#");
4087 defineSymbol(symbols_math, main, symbols_textord, "&", "\\&");
4088 defineSymbol(symbols_text, main, symbols_textord, "&", "\\&");
4089 defineSymbol(symbols_math, main, symbols_textord, "\u2135", "\\aleph", true);
4090 defineSymbol(symbols_math, main, symbols_textord, "\u2200", "\\forall", true);
4091 defineSymbol(symbols_math, main, symbols_textord, "\u210F", "\\hbar", true);
4092 defineSymbol(symbols_math, main, symbols_textord, "\u2203", "\\exists", true);
4093 defineSymbol(symbols_math, main, symbols_textord, "\u2207", "\\nabla", true);
4094 defineSymbol(symbols_math, main, symbols_textord, "\u266D", "\\flat", true);
4095 defineSymbol(symbols_math, main, symbols_textord, "\u2113", "\\ell", true);
4096 defineSymbol(symbols_math, main, symbols_textord, "\u266E", "\\natural", true);
4097 defineSymbol(symbols_math, main, symbols_textord, "\u2663", "\\clubsuit", true);
4098 defineSymbol(symbols_math, main, symbols_textord, "\u2118", "\\wp", true);
4099 defineSymbol(symbols_math, main, symbols_textord, "\u266F", "\\sharp", true);
4100 defineSymbol(symbols_math, main, symbols_textord, "\u2662", "\\diamondsuit", true);
4101 defineSymbol(symbols_math, main, symbols_textord, "\u211C", "\\Re", true);
4102 defineSymbol(symbols_math, main, symbols_textord, "\u2661", "\\heartsuit", true);
4103 defineSymbol(symbols_math, main, symbols_textord, "\u2111", "\\Im", true);
4104 defineSymbol(symbols_math, main, symbols_textord, "\u2660", "\\spadesuit", true);
4105 defineSymbol(symbols_text, main, symbols_textord, "\xA7", "\\S", true);
4106 defineSymbol(symbols_text, main, symbols_textord, "\xB6", "\\P", true); // Math and Text
4107
4108 defineSymbol(symbols_math, main, symbols_textord, "\u2020", "\\dag");
4109 defineSymbol(symbols_text, main, symbols_textord, "\u2020", "\\dag");
4110 defineSymbol(symbols_text, main, symbols_textord, "\u2020", "\\textdagger");
4111 defineSymbol(symbols_math, main, symbols_textord, "\u2021", "\\ddag");
4112 defineSymbol(symbols_text, main, symbols_textord, "\u2021", "\\ddag");
4113 defineSymbol(symbols_text, main, symbols_textord, "\u2021", "\\textdaggerdbl"); // Large Delimiters
4114
4115 defineSymbol(symbols_math, main, symbols_close, "\u23B1", "\\rmoustache", true);
4116 defineSymbol(symbols_math, main, symbols_open, "\u23B0", "\\lmoustache", true);
4117 defineSymbol(symbols_math, main, symbols_close, "\u27EF", "\\rgroup", true);
4118 defineSymbol(symbols_math, main, symbols_open, "\u27EE", "\\lgroup", true); // Binary Operators
4119
4120 defineSymbol(symbols_math, main, bin, "\u2213", "\\mp", true);
4121 defineSymbol(symbols_math, main, bin, "\u2296", "\\ominus", true);
4122 defineSymbol(symbols_math, main, bin, "\u228E", "\\uplus", true);
4123 defineSymbol(symbols_math, main, bin, "\u2293", "\\sqcap", true);
4124 defineSymbol(symbols_math, main, bin, "\u2217", "\\ast");
4125 defineSymbol(symbols_math, main, bin, "\u2294", "\\sqcup", true);
4126 defineSymbol(symbols_math, main, bin, "\u25EF", "\\bigcirc");
4127 defineSymbol(symbols_math, main, bin, "\u2219", "\\bullet");
4128 defineSymbol(symbols_math, main, bin, "\u2021", "\\ddagger");
4129 defineSymbol(symbols_math, main, bin, "\u2240", "\\wr", true);
4130 defineSymbol(symbols_math, main, bin, "\u2A3F", "\\amalg");
4131 defineSymbol(symbols_math, main, bin, "&", "\\And"); // from amsmath
4132 // Arrow Symbols
4133
4134 defineSymbol(symbols_math, main, rel, "\u27F5", "\\longleftarrow", true);
4135 defineSymbol(symbols_math, main, rel, "\u21D0", "\\Leftarrow", true);
4136 defineSymbol(symbols_math, main, rel, "\u27F8", "\\Longleftarrow", true);
4137 defineSymbol(symbols_math, main, rel, "\u27F6", "\\longrightarrow", true);
4138 defineSymbol(symbols_math, main, rel, "\u21D2", "\\Rightarrow", true);
4139 defineSymbol(symbols_math, main, rel, "\u27F9", "\\Longrightarrow", true);
4140 defineSymbol(symbols_math, main, rel, "\u2194", "\\leftrightarrow", true);
4141 defineSymbol(symbols_math, main, rel, "\u27F7", "\\longleftrightarrow", true);
4142 defineSymbol(symbols_math, main, rel, "\u21D4", "\\Leftrightarrow", true);
4143 defineSymbol(symbols_math, main, rel, "\u27FA", "\\Longleftrightarrow", true);
4144 defineSymbol(symbols_math, main, rel, "\u21A6", "\\mapsto", true);
4145 defineSymbol(symbols_math, main, rel, "\u27FC", "\\longmapsto", true);
4146 defineSymbol(symbols_math, main, rel, "\u2197", "\\nearrow", true);
4147 defineSymbol(symbols_math, main, rel, "\u21A9", "\\hookleftarrow", true);
4148 defineSymbol(symbols_math, main, rel, "\u21AA", "\\hookrightarrow", true);
4149 defineSymbol(symbols_math, main, rel, "\u2198", "\\searrow", true);
4150 defineSymbol(symbols_math, main, rel, "\u21BC", "\\leftharpoonup", true);
4151 defineSymbol(symbols_math, main, rel, "\u21C0", "\\rightharpoonup", true);
4152 defineSymbol(symbols_math, main, rel, "\u2199", "\\swarrow", true);
4153 defineSymbol(symbols_math, main, rel, "\u21BD", "\\leftharpoondown", true);
4154 defineSymbol(symbols_math, main, rel, "\u21C1", "\\rightharpoondown", true);
4155 defineSymbol(symbols_math, main, rel, "\u2196", "\\nwarrow", true);
4156 defineSymbol(symbols_math, main, rel, "\u21CC", "\\rightleftharpoons", true); // AMS Negated Binary Relations
4157
4158 defineSymbol(symbols_math, ams, rel, "\u226E", "\\nless", true); // Symbol names preceeded by "@" each have a corresponding macro.
4159
4160 defineSymbol(symbols_math, ams, rel, "\uE010", "\\@nleqslant");
4161 defineSymbol(symbols_math, ams, rel, "\uE011", "\\@nleqq");
4162 defineSymbol(symbols_math, ams, rel, "\u2A87", "\\lneq", true);
4163 defineSymbol(symbols_math, ams, rel, "\u2268", "\\lneqq", true);
4164 defineSymbol(symbols_math, ams, rel, "\uE00C", "\\@lvertneqq");
4165 defineSymbol(symbols_math, ams, rel, "\u22E6", "\\lnsim", true);
4166 defineSymbol(symbols_math, ams, rel, "\u2A89", "\\lnapprox", true);
4167 defineSymbol(symbols_math, ams, rel, "\u2280", "\\nprec", true); // unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym.
4168
4169 defineSymbol(symbols_math, ams, rel, "\u22E0", "\\npreceq", true);
4170 defineSymbol(symbols_math, ams, rel, "\u22E8", "\\precnsim", true);
4171 defineSymbol(symbols_math, ams, rel, "\u2AB9", "\\precnapprox", true);
4172 defineSymbol(symbols_math, ams, rel, "\u2241", "\\nsim", true);
4173 defineSymbol(symbols_math, ams, rel, "\uE006", "\\@nshortmid");
4174 defineSymbol(symbols_math, ams, rel, "\u2224", "\\nmid", true);
4175 defineSymbol(symbols_math, ams, rel, "\u22AC", "\\nvdash", true);
4176 defineSymbol(symbols_math, ams, rel, "\u22AD", "\\nvDash", true);
4177 defineSymbol(symbols_math, ams, rel, "\u22EA", "\\ntriangleleft");
4178 defineSymbol(symbols_math, ams, rel, "\u22EC", "\\ntrianglelefteq", true);
4179 defineSymbol(symbols_math, ams, rel, "\u228A", "\\subsetneq", true);
4180 defineSymbol(symbols_math, ams, rel, "\uE01A", "\\@varsubsetneq");
4181 defineSymbol(symbols_math, ams, rel, "\u2ACB", "\\subsetneqq", true);
4182 defineSymbol(symbols_math, ams, rel, "\uE017", "\\@varsubsetneqq");
4183 defineSymbol(symbols_math, ams, rel, "\u226F", "\\ngtr", true);
4184 defineSymbol(symbols_math, ams, rel, "\uE00F", "\\@ngeqslant");
4185 defineSymbol(symbols_math, ams, rel, "\uE00E", "\\@ngeqq");
4186 defineSymbol(symbols_math, ams, rel, "\u2A88", "\\gneq", true);
4187 defineSymbol(symbols_math, ams, rel, "\u2269", "\\gneqq", true);
4188 defineSymbol(symbols_math, ams, rel, "\uE00D", "\\@gvertneqq");
4189 defineSymbol(symbols_math, ams, rel, "\u22E7", "\\gnsim", true);
4190 defineSymbol(symbols_math, ams, rel, "\u2A8A", "\\gnapprox", true);
4191 defineSymbol(symbols_math, ams, rel, "\u2281", "\\nsucc", true); // unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym.
4192
4193 defineSymbol(symbols_math, ams, rel, "\u22E1", "\\nsucceq", true);
4194 defineSymbol(symbols_math, ams, rel, "\u22E9", "\\succnsim", true);
4195 defineSymbol(symbols_math, ams, rel, "\u2ABA", "\\succnapprox", true); // unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym.
4196
4197 defineSymbol(symbols_math, ams, rel, "\u2246", "\\ncong", true);
4198 defineSymbol(symbols_math, ams, rel, "\uE007", "\\@nshortparallel");
4199 defineSymbol(symbols_math, ams, rel, "\u2226", "\\nparallel", true);
4200 defineSymbol(symbols_math, ams, rel, "\u22AF", "\\nVDash", true);
4201 defineSymbol(symbols_math, ams, rel, "\u22EB", "\\ntriangleright");
4202 defineSymbol(symbols_math, ams, rel, "\u22ED", "\\ntrianglerighteq", true);
4203 defineSymbol(symbols_math, ams, rel, "\uE018", "\\@nsupseteqq");
4204 defineSymbol(symbols_math, ams, rel, "\u228B", "\\supsetneq", true);
4205 defineSymbol(symbols_math, ams, rel, "\uE01B", "\\@varsupsetneq");
4206 defineSymbol(symbols_math, ams, rel, "\u2ACC", "\\supsetneqq", true);
4207 defineSymbol(symbols_math, ams, rel, "\uE019", "\\@varsupsetneqq");
4208 defineSymbol(symbols_math, ams, rel, "\u22AE", "\\nVdash", true);
4209 defineSymbol(symbols_math, ams, rel, "\u2AB5", "\\precneqq", true);
4210 defineSymbol(symbols_math, ams, rel, "\u2AB6", "\\succneqq", true);
4211 defineSymbol(symbols_math, ams, rel, "\uE016", "\\@nsubseteqq");
4212 defineSymbol(symbols_math, ams, bin, "\u22B4", "\\unlhd");
4213 defineSymbol(symbols_math, ams, bin, "\u22B5", "\\unrhd"); // AMS Negated Arrows
4214
4215 defineSymbol(symbols_math, ams, rel, "\u219A", "\\nleftarrow", true);
4216 defineSymbol(symbols_math, ams, rel, "\u219B", "\\nrightarrow", true);
4217 defineSymbol(symbols_math, ams, rel, "\u21CD", "\\nLeftarrow", true);
4218 defineSymbol(symbols_math, ams, rel, "\u21CF", "\\nRightarrow", true);
4219 defineSymbol(symbols_math, ams, rel, "\u21AE", "\\nleftrightarrow", true);
4220 defineSymbol(symbols_math, ams, rel, "\u21CE", "\\nLeftrightarrow", true); // AMS Misc
4221
4222 defineSymbol(symbols_math, ams, rel, "\u25B3", "\\vartriangle");
4223 defineSymbol(symbols_math, ams, symbols_textord, "\u210F", "\\hslash");
4224 defineSymbol(symbols_math, ams, symbols_textord, "\u25BD", "\\triangledown");
4225 defineSymbol(symbols_math, ams, symbols_textord, "\u25CA", "\\lozenge");
4226 defineSymbol(symbols_math, ams, symbols_textord, "\u24C8", "\\circledS");
4227 defineSymbol(symbols_math, ams, symbols_textord, "\xAE", "\\circledR");
4228 defineSymbol(symbols_text, ams, symbols_textord, "\xAE", "\\circledR");
4229 defineSymbol(symbols_math, ams, symbols_textord, "\u2221", "\\measuredangle", true);
4230 defineSymbol(symbols_math, ams, symbols_textord, "\u2204", "\\nexists");
4231 defineSymbol(symbols_math, ams, symbols_textord, "\u2127", "\\mho");
4232 defineSymbol(symbols_math, ams, symbols_textord, "\u2132", "\\Finv", true);
4233 defineSymbol(symbols_math, ams, symbols_textord, "\u2141", "\\Game", true);
4234 defineSymbol(symbols_math, ams, symbols_textord, "\u2035", "\\backprime");
4235 defineSymbol(symbols_math, ams, symbols_textord, "\u25B2", "\\blacktriangle");
4236 defineSymbol(symbols_math, ams, symbols_textord, "\u25BC", "\\blacktriangledown");
4237 defineSymbol(symbols_math, ams, symbols_textord, "\u25A0", "\\blacksquare");
4238 defineSymbol(symbols_math, ams, symbols_textord, "\u29EB", "\\blacklozenge");
4239 defineSymbol(symbols_math, ams, symbols_textord, "\u2605", "\\bigstar");
4240 defineSymbol(symbols_math, ams, symbols_textord, "\u2222", "\\sphericalangle", true);
4241 defineSymbol(symbols_math, ams, symbols_textord, "\u2201", "\\complement", true); // unicode-math maps U+F0 (ð) to \matheth. We map to AMS function \eth
4242
4243 defineSymbol(symbols_math, ams, symbols_textord, "\xF0", "\\eth", true);
4244 defineSymbol(symbols_math, ams, symbols_textord, "\u2571", "\\diagup");
4245 defineSymbol(symbols_math, ams, symbols_textord, "\u2572", "\\diagdown");
4246 defineSymbol(symbols_math, ams, symbols_textord, "\u25A1", "\\square");
4247 defineSymbol(symbols_math, ams, symbols_textord, "\u25A1", "\\Box");
4248 defineSymbol(symbols_math, ams, symbols_textord, "\u25CA", "\\Diamond"); // unicode-math maps U+A5 to \mathyen. We map to AMS function \yen
4249
4250 defineSymbol(symbols_math, ams, symbols_textord, "\xA5", "\\yen", true);
4251 defineSymbol(symbols_text, ams, symbols_textord, "\xA5", "\\yen", true);
4252 defineSymbol(symbols_math, ams, symbols_textord, "\u2713", "\\checkmark", true);
4253 defineSymbol(symbols_text, ams, symbols_textord, "\u2713", "\\checkmark"); // AMS Hebrew
4254
4255 defineSymbol(symbols_math, ams, symbols_textord, "\u2136", "\\beth", true);
4256 defineSymbol(symbols_math, ams, symbols_textord, "\u2138", "\\daleth", true);
4257 defineSymbol(symbols_math, ams, symbols_textord, "\u2137", "\\gimel", true); // AMS Greek
4258
4259 defineSymbol(symbols_math, ams, symbols_textord, "\u03DD", "\\digamma", true);
4260 defineSymbol(symbols_math, ams, symbols_textord, "\u03F0", "\\varkappa"); // AMS Delimiters
4261
4262 defineSymbol(symbols_math, ams, symbols_open, "\u250C", "\\ulcorner", true);
4263 defineSymbol(symbols_math, ams, symbols_close, "\u2510", "\\urcorner", true);
4264 defineSymbol(symbols_math, ams, symbols_open, "\u2514", "\\llcorner", true);
4265 defineSymbol(symbols_math, ams, symbols_close, "\u2518", "\\lrcorner", true); // AMS Binary Relations
4266
4267 defineSymbol(symbols_math, ams, rel, "\u2266", "\\leqq", true);
4268 defineSymbol(symbols_math, ams, rel, "\u2A7D", "\\leqslant", true);
4269 defineSymbol(symbols_math, ams, rel, "\u2A95", "\\eqslantless", true);
4270 defineSymbol(symbols_math, ams, rel, "\u2272", "\\lesssim", true);
4271 defineSymbol(symbols_math, ams, rel, "\u2A85", "\\lessapprox", true);
4272 defineSymbol(symbols_math, ams, rel, "\u224A", "\\approxeq", true);
4273 defineSymbol(symbols_math, ams, bin, "\u22D6", "\\lessdot");
4274 defineSymbol(symbols_math, ams, rel, "\u22D8", "\\lll", true);
4275 defineSymbol(symbols_math, ams, rel, "\u2276", "\\lessgtr", true);
4276 defineSymbol(symbols_math, ams, rel, "\u22DA", "\\lesseqgtr", true);
4277 defineSymbol(symbols_math, ams, rel, "\u2A8B", "\\lesseqqgtr", true);
4278 defineSymbol(symbols_math, ams, rel, "\u2251", "\\doteqdot");
4279 defineSymbol(symbols_math, ams, rel, "\u2253", "\\risingdotseq", true);
4280 defineSymbol(symbols_math, ams, rel, "\u2252", "\\fallingdotseq", true);
4281 defineSymbol(symbols_math, ams, rel, "\u223D", "\\backsim", true);
4282 defineSymbol(symbols_math, ams, rel, "\u22CD", "\\backsimeq", true);
4283 defineSymbol(symbols_math, ams, rel, "\u2AC5", "\\subseteqq", true);
4284 defineSymbol(symbols_math, ams, rel, "\u22D0", "\\Subset", true);
4285 defineSymbol(symbols_math, ams, rel, "\u228F", "\\sqsubset", true);
4286 defineSymbol(symbols_math, ams, rel, "\u227C", "\\preccurlyeq", true);
4287 defineSymbol(symbols_math, ams, rel, "\u22DE", "\\curlyeqprec", true);
4288 defineSymbol(symbols_math, ams, rel, "\u227E", "\\precsim", true);
4289 defineSymbol(symbols_math, ams, rel, "\u2AB7", "\\precapprox", true);
4290 defineSymbol(symbols_math, ams, rel, "\u22B2", "\\vartriangleleft");
4291 defineSymbol(symbols_math, ams, rel, "\u22B4", "\\trianglelefteq");
4292 defineSymbol(symbols_math, ams, rel, "\u22A8", "\\vDash", true);
4293 defineSymbol(symbols_math, ams, rel, "\u22AA", "\\Vvdash", true);
4294 defineSymbol(symbols_math, ams, rel, "\u2323", "\\smallsmile");
4295 defineSymbol(symbols_math, ams, rel, "\u2322", "\\smallfrown");
4296 defineSymbol(symbols_math, ams, rel, "\u224F", "\\bumpeq", true);
4297 defineSymbol(symbols_math, ams, rel, "\u224E", "\\Bumpeq", true);
4298 defineSymbol(symbols_math, ams, rel, "\u2267", "\\geqq", true);
4299 defineSymbol(symbols_math, ams, rel, "\u2A7E", "\\geqslant", true);
4300 defineSymbol(symbols_math, ams, rel, "\u2A96", "\\eqslantgtr", true);
4301 defineSymbol(symbols_math, ams, rel, "\u2273", "\\gtrsim", true);
4302 defineSymbol(symbols_math, ams, rel, "\u2A86", "\\gtrapprox", true);
4303 defineSymbol(symbols_math, ams, bin, "\u22D7", "\\gtrdot");
4304 defineSymbol(symbols_math, ams, rel, "\u22D9", "\\ggg", true);
4305 defineSymbol(symbols_math, ams, rel, "\u2277", "\\gtrless", true);
4306 defineSymbol(symbols_math, ams, rel, "\u22DB", "\\gtreqless", true);
4307 defineSymbol(symbols_math, ams, rel, "\u2A8C", "\\gtreqqless", true);
4308 defineSymbol(symbols_math, ams, rel, "\u2256", "\\eqcirc", true);
4309 defineSymbol(symbols_math, ams, rel, "\u2257", "\\circeq", true);
4310 defineSymbol(symbols_math, ams, rel, "\u225C", "\\triangleq", true);
4311 defineSymbol(symbols_math, ams, rel, "\u223C", "\\thicksim");
4312 defineSymbol(symbols_math, ams, rel, "\u2248", "\\thickapprox");
4313 defineSymbol(symbols_math, ams, rel, "\u2AC6", "\\supseteqq", true);
4314 defineSymbol(symbols_math, ams, rel, "\u22D1", "\\Supset", true);
4315 defineSymbol(symbols_math, ams, rel, "\u2290", "\\sqsupset", true);
4316 defineSymbol(symbols_math, ams, rel, "\u227D", "\\succcurlyeq", true);
4317 defineSymbol(symbols_math, ams, rel, "\u22DF", "\\curlyeqsucc", true);
4318 defineSymbol(symbols_math, ams, rel, "\u227F", "\\succsim", true);
4319 defineSymbol(symbols_math, ams, rel, "\u2AB8", "\\succapprox", true);
4320 defineSymbol(symbols_math, ams, rel, "\u22B3", "\\vartriangleright");
4321 defineSymbol(symbols_math, ams, rel, "\u22B5", "\\trianglerighteq");
4322 defineSymbol(symbols_math, ams, rel, "\u22A9", "\\Vdash", true);
4323 defineSymbol(symbols_math, ams, rel, "\u2223", "\\shortmid");
4324 defineSymbol(symbols_math, ams, rel, "\u2225", "\\shortparallel");
4325 defineSymbol(symbols_math, ams, rel, "\u226C", "\\between", true);
4326 defineSymbol(symbols_math, ams, rel, "\u22D4", "\\pitchfork", true);
4327 defineSymbol(symbols_math, ams, rel, "\u221D", "\\varpropto");
4328 defineSymbol(symbols_math, ams, rel, "\u25C0", "\\blacktriangleleft"); // unicode-math says that \therefore is a mathord atom.
4329 // We kept the amssymb atom type, which is rel.
4330
4331 defineSymbol(symbols_math, ams, rel, "\u2234", "\\therefore", true);
4332 defineSymbol(symbols_math, ams, rel, "\u220D", "\\backepsilon");
4333 defineSymbol(symbols_math, ams, rel, "\u25B6", "\\blacktriangleright"); // unicode-math says that \because is a mathord atom.
4334 // We kept the amssymb atom type, which is rel.
4335
4336 defineSymbol(symbols_math, ams, rel, "\u2235", "\\because", true);
4337 defineSymbol(symbols_math, ams, rel, "\u22D8", "\\llless");
4338 defineSymbol(symbols_math, ams, rel, "\u22D9", "\\gggtr");
4339 defineSymbol(symbols_math, ams, bin, "\u22B2", "\\lhd");
4340 defineSymbol(symbols_math, ams, bin, "\u22B3", "\\rhd");
4341 defineSymbol(symbols_math, ams, rel, "\u2242", "\\eqsim", true);
4342 defineSymbol(symbols_math, main, rel, "\u22C8", "\\Join");
4343 defineSymbol(symbols_math, ams, rel, "\u2251", "\\Doteq", true); // AMS Binary Operators
4344
4345 defineSymbol(symbols_math, ams, bin, "\u2214", "\\dotplus", true);
4346 defineSymbol(symbols_math, ams, bin, "\u2216", "\\smallsetminus");
4347 defineSymbol(symbols_math, ams, bin, "\u22D2", "\\Cap", true);
4348 defineSymbol(symbols_math, ams, bin, "\u22D3", "\\Cup", true);
4349 defineSymbol(symbols_math, ams, bin, "\u2A5E", "\\doublebarwedge", true);
4350 defineSymbol(symbols_math, ams, bin, "\u229F", "\\boxminus", true);
4351 defineSymbol(symbols_math, ams, bin, "\u229E", "\\boxplus", true);
4352 defineSymbol(symbols_math, ams, bin, "\u22C7", "\\divideontimes", true);
4353 defineSymbol(symbols_math, ams, bin, "\u22C9", "\\ltimes", true);
4354 defineSymbol(symbols_math, ams, bin, "\u22CA", "\\rtimes", true);
4355 defineSymbol(symbols_math, ams, bin, "\u22CB", "\\leftthreetimes", true);
4356 defineSymbol(symbols_math, ams, bin, "\u22CC", "\\rightthreetimes", true);
4357 defineSymbol(symbols_math, ams, bin, "\u22CF", "\\curlywedge", true);
4358 defineSymbol(symbols_math, ams, bin, "\u22CE", "\\curlyvee", true);
4359 defineSymbol(symbols_math, ams, bin, "\u229D", "\\circleddash", true);
4360 defineSymbol(symbols_math, ams, bin, "\u229B", "\\circledast", true);
4361 defineSymbol(symbols_math, ams, bin, "\u22C5", "\\centerdot");
4362 defineSymbol(symbols_math, ams, bin, "\u22BA", "\\intercal", true);
4363 defineSymbol(symbols_math, ams, bin, "\u22D2", "\\doublecap");
4364 defineSymbol(symbols_math, ams, bin, "\u22D3", "\\doublecup");
4365 defineSymbol(symbols_math, ams, bin, "\u22A0", "\\boxtimes", true); // AMS Arrows
4366 // Note: unicode-math maps \u21e2 to their own function \rightdasharrow.
4367 // We'll map it to AMS function \dashrightarrow. It produces the same atom.
4368
4369 defineSymbol(symbols_math, ams, rel, "\u21E2", "\\dashrightarrow", true); // unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym.
4370
4371 defineSymbol(symbols_math, ams, rel, "\u21E0", "\\dashleftarrow", true);
4372 defineSymbol(symbols_math, ams, rel, "\u21C7", "\\leftleftarrows", true);
4373 defineSymbol(symbols_math, ams, rel, "\u21C6", "\\leftrightarrows", true);
4374 defineSymbol(symbols_math, ams, rel, "\u21DA", "\\Lleftarrow", true);
4375 defineSymbol(symbols_math, ams, rel, "\u219E", "\\twoheadleftarrow", true);
4376 defineSymbol(symbols_math, ams, rel, "\u21A2", "\\leftarrowtail", true);
4377 defineSymbol(symbols_math, ams, rel, "\u21AB", "\\looparrowleft", true);
4378 defineSymbol(symbols_math, ams, rel, "\u21CB", "\\leftrightharpoons", true);
4379 defineSymbol(symbols_math, ams, rel, "\u21B6", "\\curvearrowleft", true); // unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym.
4380
4381 defineSymbol(symbols_math, ams, rel, "\u21BA", "\\circlearrowleft", true);
4382 defineSymbol(symbols_math, ams, rel, "\u21B0", "\\Lsh", true);
4383 defineSymbol(symbols_math, ams, rel, "\u21C8", "\\upuparrows", true);
4384 defineSymbol(symbols_math, ams, rel, "\u21BF", "\\upharpoonleft", true);
4385 defineSymbol(symbols_math, ams, rel, "\u21C3", "\\downharpoonleft", true);
4386 defineSymbol(symbols_math, ams, rel, "\u22B8", "\\multimap", true);
4387 defineSymbol(symbols_math, ams, rel, "\u21AD", "\\leftrightsquigarrow", true);
4388 defineSymbol(symbols_math, ams, rel, "\u21C9", "\\rightrightarrows", true);
4389 defineSymbol(symbols_math, ams, rel, "\u21C4", "\\rightleftarrows", true);
4390 defineSymbol(symbols_math, ams, rel, "\u21A0", "\\twoheadrightarrow", true);
4391 defineSymbol(symbols_math, ams, rel, "\u21A3", "\\rightarrowtail", true);
4392 defineSymbol(symbols_math, ams, rel, "\u21AC", "\\looparrowright", true);
4393 defineSymbol(symbols_math, ams, rel, "\u21B7", "\\curvearrowright", true); // unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym.
4394
4395 defineSymbol(symbols_math, ams, rel, "\u21BB", "\\circlearrowright", true);
4396 defineSymbol(symbols_math, ams, rel, "\u21B1", "\\Rsh", true);
4397 defineSymbol(symbols_math, ams, rel, "\u21CA", "\\downdownarrows", true);
4398 defineSymbol(symbols_math, ams, rel, "\u21BE", "\\upharpoonright", true);
4399 defineSymbol(symbols_math, ams, rel, "\u21C2", "\\downharpoonright", true);
4400 defineSymbol(symbols_math, ams, rel, "\u21DD", "\\rightsquigarrow", true);
4401 defineSymbol(symbols_math, ams, rel, "\u21DD", "\\leadsto");
4402 defineSymbol(symbols_math, ams, rel, "\u21DB", "\\Rrightarrow", true);
4403 defineSymbol(symbols_math, ams, rel, "\u21BE", "\\restriction");
4404 defineSymbol(symbols_math, main, symbols_textord, "\u2018", "`");
4405 defineSymbol(symbols_math, main, symbols_textord, "$", "\\$");
4406 defineSymbol(symbols_text, main, symbols_textord, "$", "\\$");
4407 defineSymbol(symbols_text, main, symbols_textord, "$", "\\textdollar");
4408 defineSymbol(symbols_math, main, symbols_textord, "%", "\\%");
4409 defineSymbol(symbols_text, main, symbols_textord, "%", "\\%");
4410 defineSymbol(symbols_math, main, symbols_textord, "_", "\\_");
4411 defineSymbol(symbols_text, main, symbols_textord, "_", "\\_");
4412 defineSymbol(symbols_text, main, symbols_textord, "_", "\\textunderscore");
4413 defineSymbol(symbols_math, main, symbols_textord, "\u2220", "\\angle", true);
4414 defineSymbol(symbols_math, main, symbols_textord, "\u221E", "\\infty", true);
4415 defineSymbol(symbols_math, main, symbols_textord, "\u2032", "\\prime");
4416 defineSymbol(symbols_math, main, symbols_textord, "\u25B3", "\\triangle");
4417 defineSymbol(symbols_math, main, symbols_textord, "\u0393", "\\Gamma", true);
4418 defineSymbol(symbols_math, main, symbols_textord, "\u0394", "\\Delta", true);
4419 defineSymbol(symbols_math, main, symbols_textord, "\u0398", "\\Theta", true);
4420 defineSymbol(symbols_math, main, symbols_textord, "\u039B", "\\Lambda", true);
4421 defineSymbol(symbols_math, main, symbols_textord, "\u039E", "\\Xi", true);
4422 defineSymbol(symbols_math, main, symbols_textord, "\u03A0", "\\Pi", true);
4423 defineSymbol(symbols_math, main, symbols_textord, "\u03A3", "\\Sigma", true);
4424 defineSymbol(symbols_math, main, symbols_textord, "\u03A5", "\\Upsilon", true);
4425 defineSymbol(symbols_math, main, symbols_textord, "\u03A6", "\\Phi", true);
4426 defineSymbol(symbols_math, main, symbols_textord, "\u03A8", "\\Psi", true);
4427 defineSymbol(symbols_math, main, symbols_textord, "\u03A9", "\\Omega", true);
4428 defineSymbol(symbols_math, main, symbols_textord, "A", "\u0391");
4429 defineSymbol(symbols_math, main, symbols_textord, "B", "\u0392");
4430 defineSymbol(symbols_math, main, symbols_textord, "E", "\u0395");
4431 defineSymbol(symbols_math, main, symbols_textord, "Z", "\u0396");
4432 defineSymbol(symbols_math, main, symbols_textord, "H", "\u0397");
4433 defineSymbol(symbols_math, main, symbols_textord, "I", "\u0399");
4434 defineSymbol(symbols_math, main, symbols_textord, "K", "\u039A");
4435 defineSymbol(symbols_math, main, symbols_textord, "M", "\u039C");
4436 defineSymbol(symbols_math, main, symbols_textord, "N", "\u039D");
4437 defineSymbol(symbols_math, main, symbols_textord, "O", "\u039F");
4438 defineSymbol(symbols_math, main, symbols_textord, "P", "\u03A1");
4439 defineSymbol(symbols_math, main, symbols_textord, "T", "\u03A4");
4440 defineSymbol(symbols_math, main, symbols_textord, "X", "\u03A7");
4441 defineSymbol(symbols_math, main, symbols_textord, "\xAC", "\\neg", true);
4442 defineSymbol(symbols_math, main, symbols_textord, "\xAC", "\\lnot");
4443 defineSymbol(symbols_math, main, symbols_textord, "\u22A4", "\\top");
4444 defineSymbol(symbols_math, main, symbols_textord, "\u22A5", "\\bot");
4445 defineSymbol(symbols_math, main, symbols_textord, "\u2205", "\\emptyset");
4446 defineSymbol(symbols_math, ams, symbols_textord, "\u2205", "\\varnothing");
4447 defineSymbol(symbols_math, main, mathord, "\u03B1", "\\alpha", true);
4448 defineSymbol(symbols_math, main, mathord, "\u03B2", "\\beta", true);
4449 defineSymbol(symbols_math, main, mathord, "\u03B3", "\\gamma", true);
4450 defineSymbol(symbols_math, main, mathord, "\u03B4", "\\delta", true);
4451 defineSymbol(symbols_math, main, mathord, "\u03F5", "\\epsilon", true);
4452 defineSymbol(symbols_math, main, mathord, "\u03B6", "\\zeta", true);
4453 defineSymbol(symbols_math, main, mathord, "\u03B7", "\\eta", true);
4454 defineSymbol(symbols_math, main, mathord, "\u03B8", "\\theta", true);
4455 defineSymbol(symbols_math, main, mathord, "\u03B9", "\\iota", true);
4456 defineSymbol(symbols_math, main, mathord, "\u03BA", "\\kappa", true);
4457 defineSymbol(symbols_math, main, mathord, "\u03BB", "\\lambda", true);
4458 defineSymbol(symbols_math, main, mathord, "\u03BC", "\\mu", true);
4459 defineSymbol(symbols_math, main, mathord, "\u03BD", "\\nu", true);
4460 defineSymbol(symbols_math, main, mathord, "\u03BE", "\\xi", true);
4461 defineSymbol(symbols_math, main, mathord, "\u03BF", "\\omicron", true);
4462 defineSymbol(symbols_math, main, mathord, "\u03C0", "\\pi", true);
4463 defineSymbol(symbols_math, main, mathord, "\u03C1", "\\rho", true);
4464 defineSymbol(symbols_math, main, mathord, "\u03C3", "\\sigma", true);
4465 defineSymbol(symbols_math, main, mathord, "\u03C4", "\\tau", true);
4466 defineSymbol(symbols_math, main, mathord, "\u03C5", "\\upsilon", true);
4467 defineSymbol(symbols_math, main, mathord, "\u03D5", "\\phi", true);
4468 defineSymbol(symbols_math, main, mathord, "\u03C7", "\\chi", true);
4469 defineSymbol(symbols_math, main, mathord, "\u03C8", "\\psi", true);
4470 defineSymbol(symbols_math, main, mathord, "\u03C9", "\\omega", true);
4471 defineSymbol(symbols_math, main, mathord, "\u03B5", "\\varepsilon", true);
4472 defineSymbol(symbols_math, main, mathord, "\u03D1", "\\vartheta", true);
4473 defineSymbol(symbols_math, main, mathord, "\u03D6", "\\varpi", true);
4474 defineSymbol(symbols_math, main, mathord, "\u03F1", "\\varrho", true);
4475 defineSymbol(symbols_math, main, mathord, "\u03C2", "\\varsigma", true);
4476 defineSymbol(symbols_math, main, mathord, "\u03C6", "\\varphi", true);
4477 defineSymbol(symbols_math, main, bin, "\u2217", "*");
4478 defineSymbol(symbols_math, main, bin, "+", "+");
4479 defineSymbol(symbols_math, main, bin, "\u2212", "-");
4480 defineSymbol(symbols_math, main, bin, "\u22C5", "\\cdot", true);
4481 defineSymbol(symbols_math, main, bin, "\u2218", "\\circ");
4482 defineSymbol(symbols_math, main, bin, "\xF7", "\\div", true);
4483 defineSymbol(symbols_math, main, bin, "\xB1", "\\pm", true);
4484 defineSymbol(symbols_math, main, bin, "\xD7", "\\times", true);
4485 defineSymbol(symbols_math, main, bin, "\u2229", "\\cap", true);
4486 defineSymbol(symbols_math, main, bin, "\u222A", "\\cup", true);
4487 defineSymbol(symbols_math, main, bin, "\u2216", "\\setminus");
4488 defineSymbol(symbols_math, main, bin, "\u2227", "\\land");
4489 defineSymbol(symbols_math, main, bin, "\u2228", "\\lor");
4490 defineSymbol(symbols_math, main, bin, "\u2227", "\\wedge", true);
4491 defineSymbol(symbols_math, main, bin, "\u2228", "\\vee", true);
4492 defineSymbol(symbols_math, main, symbols_textord, "\u221A", "\\surd");
4493 defineSymbol(symbols_math, main, symbols_open, "(", "(");
4494 defineSymbol(symbols_math, main, symbols_open, "[", "[");
4495 defineSymbol(symbols_math, main, symbols_open, "\u27E8", "\\langle", true);
4496 defineSymbol(symbols_math, main, symbols_open, "\u2223", "\\lvert");
4497 defineSymbol(symbols_math, main, symbols_open, "\u2225", "\\lVert");
4498 defineSymbol(symbols_math, main, symbols_close, ")", ")");
4499 defineSymbol(symbols_math, main, symbols_close, "]", "]");
4500 defineSymbol(symbols_math, main, symbols_close, "?", "?");
4501 defineSymbol(symbols_math, main, symbols_close, "!", "!");
4502 defineSymbol(symbols_math, main, symbols_close, "\u27E9", "\\rangle", true);
4503 defineSymbol(symbols_math, main, symbols_close, "\u2223", "\\rvert");
4504 defineSymbol(symbols_math, main, symbols_close, "\u2225", "\\rVert");
4505 defineSymbol(symbols_math, main, rel, "=", "=");
4506 defineSymbol(symbols_math, main, rel, "<", "<");
4507 defineSymbol(symbols_math, main, rel, ">", ">");
4508 defineSymbol(symbols_math, main, rel, ":", ":");
4509 defineSymbol(symbols_math, main, rel, "\u2248", "\\approx", true);
4510 defineSymbol(symbols_math, main, rel, "\u2245", "\\cong", true);
4511 defineSymbol(symbols_math, main, rel, "\u2265", "\\ge");
4512 defineSymbol(symbols_math, main, rel, "\u2265", "\\geq", true);
4513 defineSymbol(symbols_math, main, rel, "\u2190", "\\gets");
4514 defineSymbol(symbols_math, main, rel, ">", "\\gt");
4515 defineSymbol(symbols_math, main, rel, "\u2208", "\\in", true);
4516 defineSymbol(symbols_math, main, rel, "\uE020", "\\@not");
4517 defineSymbol(symbols_math, main, rel, "\u2282", "\\subset", true);
4518 defineSymbol(symbols_math, main, rel, "\u2283", "\\supset", true);
4519 defineSymbol(symbols_math, main, rel, "\u2286", "\\subseteq", true);
4520 defineSymbol(symbols_math, main, rel, "\u2287", "\\supseteq", true);
4521 defineSymbol(symbols_math, ams, rel, "\u2288", "\\nsubseteq", true);
4522 defineSymbol(symbols_math, ams, rel, "\u2289", "\\nsupseteq", true);
4523 defineSymbol(symbols_math, main, rel, "\u22A8", "\\models");
4524 defineSymbol(symbols_math, main, rel, "\u2190", "\\leftarrow", true);
4525 defineSymbol(symbols_math, main, rel, "\u2264", "\\le");
4526 defineSymbol(symbols_math, main, rel, "\u2264", "\\leq", true);
4527 defineSymbol(symbols_math, main, rel, "<", "\\lt");
4528 defineSymbol(symbols_math, main, rel, "\u2192", "\\rightarrow", true);
4529 defineSymbol(symbols_math, main, rel, "\u2192", "\\to");
4530 defineSymbol(symbols_math, ams, rel, "\u2271", "\\ngeq", true);
4531 defineSymbol(symbols_math, ams, rel, "\u2270", "\\nleq", true);
4532 defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\ ");
4533 defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "~");
4534 defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\space"); // Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{%
4535
4536 defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\nobreakspace");
4537 defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\ ");
4538 defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "~");
4539 defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\space");
4540 defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\nobreakspace");
4541 defineSymbol(symbols_math, main, symbols_spacing, null, "\\nobreak");
4542 defineSymbol(symbols_math, main, symbols_spacing, null, "\\allowbreak");
4543 defineSymbol(symbols_math, main, punct, ",", ",");
4544 defineSymbol(symbols_math, main, punct, ";", ";");
4545 defineSymbol(symbols_math, ams, bin, "\u22BC", "\\barwedge", true);
4546 defineSymbol(symbols_math, ams, bin, "\u22BB", "\\veebar", true);
4547 defineSymbol(symbols_math, main, bin, "\u2299", "\\odot", true);
4548 defineSymbol(symbols_math, main, bin, "\u2295", "\\oplus", true);
4549 defineSymbol(symbols_math, main, bin, "\u2297", "\\otimes", true);
4550 defineSymbol(symbols_math, main, symbols_textord, "\u2202", "\\partial", true);
4551 defineSymbol(symbols_math, main, bin, "\u2298", "\\oslash", true);
4552 defineSymbol(symbols_math, ams, bin, "\u229A", "\\circledcirc", true);
4553 defineSymbol(symbols_math, ams, bin, "\u22A1", "\\boxdot", true);
4554 defineSymbol(symbols_math, main, bin, "\u25B3", "\\bigtriangleup");
4555 defineSymbol(symbols_math, main, bin, "\u25BD", "\\bigtriangledown");
4556 defineSymbol(symbols_math, main, bin, "\u2020", "\\dagger");
4557 defineSymbol(symbols_math, main, bin, "\u22C4", "\\diamond");
4558 defineSymbol(symbols_math, main, bin, "\u22C6", "\\star");
4559 defineSymbol(symbols_math, main, bin, "\u25C3", "\\triangleleft");
4560 defineSymbol(symbols_math, main, bin, "\u25B9", "\\triangleright");
4561 defineSymbol(symbols_math, main, symbols_open, "{", "\\{");
4562 defineSymbol(symbols_text, main, symbols_textord, "{", "\\{");
4563 defineSymbol(symbols_text, main, symbols_textord, "{", "\\textbraceleft");
4564 defineSymbol(symbols_math, main, symbols_close, "}", "\\}");
4565 defineSymbol(symbols_text, main, symbols_textord, "}", "\\}");
4566 defineSymbol(symbols_text, main, symbols_textord, "}", "\\textbraceright");
4567 defineSymbol(symbols_math, main, symbols_open, "{", "\\lbrace");
4568 defineSymbol(symbols_math, main, symbols_close, "}", "\\rbrace");
4569 defineSymbol(symbols_math, main, symbols_open, "[", "\\lbrack");
4570 defineSymbol(symbols_text, main, symbols_textord, "[", "\\lbrack");
4571 defineSymbol(symbols_math, main, symbols_close, "]", "\\rbrack");
4572 defineSymbol(symbols_text, main, symbols_textord, "]", "\\rbrack");
4573 defineSymbol(symbols_math, main, symbols_open, "(", "\\lparen");
4574 defineSymbol(symbols_math, main, symbols_close, ")", "\\rparen");
4575 defineSymbol(symbols_text, main, symbols_textord, "<", "\\textless"); // in T1 fontenc
4576
4577 defineSymbol(symbols_text, main, symbols_textord, ">", "\\textgreater"); // in T1 fontenc
4578
4579 defineSymbol(symbols_math, main, symbols_open, "\u230A", "\\lfloor", true);
4580 defineSymbol(symbols_math, main, symbols_close, "\u230B", "\\rfloor", true);
4581 defineSymbol(symbols_math, main, symbols_open, "\u2308", "\\lceil", true);
4582 defineSymbol(symbols_math, main, symbols_close, "\u2309", "\\rceil", true);
4583 defineSymbol(symbols_math, main, symbols_textord, "\\", "\\backslash");
4584 defineSymbol(symbols_math, main, symbols_textord, "\u2223", "|");
4585 defineSymbol(symbols_math, main, symbols_textord, "\u2223", "\\vert");
4586 defineSymbol(symbols_text, main, symbols_textord, "|", "\\textbar"); // in T1 fontenc
4587
4588 defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\|");
4589 defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\Vert");
4590 defineSymbol(symbols_text, main, symbols_textord, "\u2225", "\\textbardbl");
4591 defineSymbol(symbols_text, main, symbols_textord, "~", "\\textasciitilde");
4592 defineSymbol(symbols_text, main, symbols_textord, "\\", "\\textbackslash");
4593 defineSymbol(symbols_text, main, symbols_textord, "^", "\\textasciicircum");
4594 defineSymbol(symbols_math, main, rel, "\u2191", "\\uparrow", true);
4595 defineSymbol(symbols_math, main, rel, "\u21D1", "\\Uparrow", true);
4596 defineSymbol(symbols_math, main, rel, "\u2193", "\\downarrow", true);
4597 defineSymbol(symbols_math, main, rel, "\u21D3", "\\Downarrow", true);
4598 defineSymbol(symbols_math, main, rel, "\u2195", "\\updownarrow", true);
4599 defineSymbol(symbols_math, main, rel, "\u21D5", "\\Updownarrow", true);
4600 defineSymbol(symbols_math, main, op, "\u2210", "\\coprod");
4601 defineSymbol(symbols_math, main, op, "\u22C1", "\\bigvee");
4602 defineSymbol(symbols_math, main, op, "\u22C0", "\\bigwedge");
4603 defineSymbol(symbols_math, main, op, "\u2A04", "\\biguplus");
4604 defineSymbol(symbols_math, main, op, "\u22C2", "\\bigcap");
4605 defineSymbol(symbols_math, main, op, "\u22C3", "\\bigcup");
4606 defineSymbol(symbols_math, main, op, "\u222B", "\\int");
4607 defineSymbol(symbols_math, main, op, "\u222B", "\\intop");
4608 defineSymbol(symbols_math, main, op, "\u222C", "\\iint");
4609 defineSymbol(symbols_math, main, op, "\u222D", "\\iiint");
4610 defineSymbol(symbols_math, main, op, "\u220F", "\\prod");
4611 defineSymbol(symbols_math, main, op, "\u2211", "\\sum");
4612 defineSymbol(symbols_math, main, op, "\u2A02", "\\bigotimes");
4613 defineSymbol(symbols_math, main, op, "\u2A01", "\\bigoplus");
4614 defineSymbol(symbols_math, main, op, "\u2A00", "\\bigodot");
4615 defineSymbol(symbols_math, main, op, "\u222E", "\\oint");
4616 defineSymbol(symbols_math, main, op, "\u222F", "\\oiint");
4617 defineSymbol(symbols_math, main, op, "\u2230", "\\oiiint");
4618 defineSymbol(symbols_math, main, op, "\u2A06", "\\bigsqcup");
4619 defineSymbol(symbols_math, main, op, "\u222B", "\\smallint");
4620 defineSymbol(symbols_text, main, symbols_inner, "\u2026", "\\textellipsis");
4621 defineSymbol(symbols_math, main, symbols_inner, "\u2026", "\\mathellipsis");
4622 defineSymbol(symbols_text, main, symbols_inner, "\u2026", "\\ldots", true);
4623 defineSymbol(symbols_math, main, symbols_inner, "\u2026", "\\ldots", true);
4624 defineSymbol(symbols_math, main, symbols_inner, "\u22EF", "\\@cdots", true);
4625 defineSymbol(symbols_math, main, symbols_inner, "\u22F1", "\\ddots", true);
4626 defineSymbol(symbols_math, main, symbols_textord, "\u22EE", "\\varvdots"); // \vdots is a macro
4627
4628 defineSymbol(symbols_math, main, symbols_accent, "\u02CA", "\\acute");
4629 defineSymbol(symbols_math, main, symbols_accent, "\u02CB", "\\grave");
4630 defineSymbol(symbols_math, main, symbols_accent, "\xA8", "\\ddot");
4631 defineSymbol(symbols_math, main, symbols_accent, "~", "\\tilde");
4632 defineSymbol(symbols_math, main, symbols_accent, "\u02C9", "\\bar");
4633 defineSymbol(symbols_math, main, symbols_accent, "\u02D8", "\\breve");
4634 defineSymbol(symbols_math, main, symbols_accent, "\u02C7", "\\check");
4635 defineSymbol(symbols_math, main, symbols_accent, "^", "\\hat");
4636 defineSymbol(symbols_math, main, symbols_accent, "\u20D7", "\\vec");
4637 defineSymbol(symbols_math, main, symbols_accent, "\u02D9", "\\dot");
4638 defineSymbol(symbols_math, main, symbols_accent, "\u02DA", "\\mathring");
4639 defineSymbol(symbols_math, main, mathord, "\u0131", "\\imath", true);
4640 defineSymbol(symbols_math, main, mathord, "\u0237", "\\jmath", true);
4641 defineSymbol(symbols_text, main, symbols_textord, "\u0131", "\\i", true);
4642 defineSymbol(symbols_text, main, symbols_textord, "\u0237", "\\j", true);
4643 defineSymbol(symbols_text, main, symbols_textord, "\xDF", "\\ss", true);
4644 defineSymbol(symbols_text, main, symbols_textord, "\xE6", "\\ae", true);
4645 defineSymbol(symbols_text, main, symbols_textord, "\xE6", "\\ae", true);
4646 defineSymbol(symbols_text, main, symbols_textord, "\u0153", "\\oe", true);
4647 defineSymbol(symbols_text, main, symbols_textord, "\xF8", "\\o", true);
4648 defineSymbol(symbols_text, main, symbols_textord, "\xC6", "\\AE", true);
4649 defineSymbol(symbols_text, main, symbols_textord, "\u0152", "\\OE", true);
4650 defineSymbol(symbols_text, main, symbols_textord, "\xD8", "\\O", true);
4651 defineSymbol(symbols_text, main, symbols_accent, "\u02CA", "\\'"); // acute
4652
4653 defineSymbol(symbols_text, main, symbols_accent, "\u02CB", "\\`"); // grave
4654
4655 defineSymbol(symbols_text, main, symbols_accent, "\u02C6", "\\^"); // circumflex
4656
4657 defineSymbol(symbols_text, main, symbols_accent, "\u02DC", "\\~"); // tilde
4658
4659 defineSymbol(symbols_text, main, symbols_accent, "\u02C9", "\\="); // macron
4660
4661 defineSymbol(symbols_text, main, symbols_accent, "\u02D8", "\\u"); // breve
4662
4663 defineSymbol(symbols_text, main, symbols_accent, "\u02D9", "\\."); // dot above
4664
4665 defineSymbol(symbols_text, main, symbols_accent, "\u02DA", "\\r"); // ring above
4666
4667 defineSymbol(symbols_text, main, symbols_accent, "\u02C7", "\\v"); // caron
4668
4669 defineSymbol(symbols_text, main, symbols_accent, "\xA8", '\\"'); // diaresis
4670
4671 defineSymbol(symbols_text, main, symbols_accent, "\u02DD", "\\H"); // double acute
4672
4673 defineSymbol(symbols_text, main, symbols_accent, "\u25EF", "\\textcircled"); // \bigcirc glyph
4674 // These ligatures are detected and created in Parser.js's `formLigatures`.
4675
4676 var ligatures = {
4677 "--": true,
4678 "---": true,
4679 "``": true,
4680 "''": true
4681 };
4682 defineSymbol(symbols_text, main, symbols_textord, "\u2013", "--");
4683 defineSymbol(symbols_text, main, symbols_textord, "\u2013", "\\textendash");
4684 defineSymbol(symbols_text, main, symbols_textord, "\u2014", "---");
4685 defineSymbol(symbols_text, main, symbols_textord, "\u2014", "\\textemdash");
4686 defineSymbol(symbols_text, main, symbols_textord, "\u2018", "`");
4687 defineSymbol(symbols_text, main, symbols_textord, "\u2018", "\\textquoteleft");
4688 defineSymbol(symbols_text, main, symbols_textord, "\u2019", "'");
4689 defineSymbol(symbols_text, main, symbols_textord, "\u2019", "\\textquoteright");
4690 defineSymbol(symbols_text, main, symbols_textord, "\u201C", "``");
4691 defineSymbol(symbols_text, main, symbols_textord, "\u201C", "\\textquotedblleft");
4692 defineSymbol(symbols_text, main, symbols_textord, "\u201D", "''");
4693 defineSymbol(symbols_text, main, symbols_textord, "\u201D", "\\textquotedblright"); // \degree from gensymb package
4694
4695 defineSymbol(symbols_math, main, symbols_textord, "\xB0", "\\degree", true);
4696 defineSymbol(symbols_text, main, symbols_textord, "\xB0", "\\degree"); // \textdegree from inputenc package
4697
4698 defineSymbol(symbols_text, main, symbols_textord, "\xB0", "\\textdegree", true); // TODO: In LaTeX, \pounds can generate a different character in text and math
4699 // mode, but among our fonts, only Main-Italic defines this character "163".
4700
4701 defineSymbol(symbols_math, main, mathord, "\xA3", "\\pounds");
4702 defineSymbol(symbols_math, main, mathord, "\xA3", "\\mathsterling", true);
4703 defineSymbol(symbols_text, main, mathord, "\xA3", "\\pounds");
4704 defineSymbol(symbols_text, main, mathord, "\xA3", "\\textsterling", true);
4705 defineSymbol(symbols_math, ams, symbols_textord, "\u2720", "\\maltese");
4706 defineSymbol(symbols_text, ams, symbols_textord, "\u2720", "\\maltese");
4707 defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\ ");
4708 defineSymbol(symbols_text, main, symbols_spacing, "\xA0", " ");
4709 defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "~"); // There are lots of symbols which are the same, so we add them in afterwards.
4710 // All of these are textords in math mode
4711
4712 var mathTextSymbols = "0123456789/@.\"";
4713
4714 for (var symbols_i = 0; symbols_i < mathTextSymbols.length; symbols_i++) {
4715 var symbols_ch = mathTextSymbols.charAt(symbols_i);
4716 defineSymbol(symbols_math, main, symbols_textord, symbols_ch, symbols_ch);
4717 } // All of these are textords in text mode
4718
4719
4720 var textSymbols = "0123456789!@*()-=+[]<>|\";:?/.,";
4721
4722 for (var src_symbols_i = 0; src_symbols_i < textSymbols.length; src_symbols_i++) {
4723 var _ch = textSymbols.charAt(src_symbols_i);
4724
4725 defineSymbol(symbols_text, main, symbols_textord, _ch, _ch);
4726 } // All of these are textords in text mode, and mathords in math mode
4727
4728
4729 var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
4730
4731 for (var symbols_i2 = 0; symbols_i2 < letters.length; symbols_i2++) {
4732 var _ch2 = letters.charAt(symbols_i2);
4733
4734 defineSymbol(symbols_math, main, mathord, _ch2, _ch2);
4735 defineSymbol(symbols_text, main, symbols_textord, _ch2, _ch2);
4736 } // Blackboard bold and script letters in Unicode range
4737
4738
4739 defineSymbol(symbols_math, ams, symbols_textord, "C", "\u2102"); // blackboard bold
4740
4741 defineSymbol(symbols_text, ams, symbols_textord, "C", "\u2102");
4742 defineSymbol(symbols_math, ams, symbols_textord, "H", "\u210D");
4743 defineSymbol(symbols_text, ams, symbols_textord, "H", "\u210D");
4744 defineSymbol(symbols_math, ams, symbols_textord, "N", "\u2115");
4745 defineSymbol(symbols_text, ams, symbols_textord, "N", "\u2115");
4746 defineSymbol(symbols_math, ams, symbols_textord, "P", "\u2119");
4747 defineSymbol(symbols_text, ams, symbols_textord, "P", "\u2119");
4748 defineSymbol(symbols_math, ams, symbols_textord, "Q", "\u211A");
4749 defineSymbol(symbols_text, ams, symbols_textord, "Q", "\u211A");
4750 defineSymbol(symbols_math, ams, symbols_textord, "R", "\u211D");
4751 defineSymbol(symbols_text, ams, symbols_textord, "R", "\u211D");
4752 defineSymbol(symbols_math, ams, symbols_textord, "Z", "\u2124");
4753 defineSymbol(symbols_text, ams, symbols_textord, "Z", "\u2124");
4754 defineSymbol(symbols_math, main, mathord, "h", "\u210E"); // italic h, Planck constant
4755
4756 defineSymbol(symbols_text, main, mathord, "h", "\u210E"); // The next loop loads wide (surrogate pair) characters.
4757 // We support some letters in the Unicode range U+1D400 to U+1D7FF,
4758 // Mathematical Alphanumeric Symbols.
4759 // Some editors do not deal well with wide characters. So don't write the
4760 // string into this file. Instead, create the string from the surrogate pair.
4761
4762 var symbols_wideChar = "";
4763
4764 for (var symbols_i3 = 0; symbols_i3 < letters.length; symbols_i3++) {
4765 var _ch3 = letters.charAt(symbols_i3); // The hex numbers in the next line are a surrogate pair.
4766 // 0xD835 is the high surrogate for all letters in the range we support.
4767 // 0xDC00 is the low surrogate for bold A.
4768
4769
4770 symbols_wideChar = String.fromCharCode(0xD835, 0xDC00 + symbols_i3); // A-Z a-z bold
4771
4772 defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
4773 defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
4774 symbols_wideChar = String.fromCharCode(0xD835, 0xDC34 + symbols_i3); // A-Z a-z italic
4775
4776 defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
4777 defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
4778 symbols_wideChar = String.fromCharCode(0xD835, 0xDC68 + symbols_i3); // A-Z a-z bold italic
4779
4780 defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
4781 defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
4782 symbols_wideChar = String.fromCharCode(0xD835, 0xDD04 + symbols_i3); // A-Z a-z Fractur
4783
4784 defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
4785 defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
4786 symbols_wideChar = String.fromCharCode(0xD835, 0xDDA0 + symbols_i3); // A-Z a-z sans-serif
4787
4788 defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
4789 defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
4790 symbols_wideChar = String.fromCharCode(0xD835, 0xDDD4 + symbols_i3); // A-Z a-z sans bold
4791
4792 defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
4793 defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
4794 symbols_wideChar = String.fromCharCode(0xD835, 0xDE08 + symbols_i3); // A-Z a-z sans italic
4795
4796 defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
4797 defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
4798 symbols_wideChar = String.fromCharCode(0xD835, 0xDE70 + symbols_i3); // A-Z a-z monospace
4799
4800 defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
4801 defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
4802
4803 if (symbols_i3 < 26) {
4804 // KaTeX fonts have only capital letters for blackboard bold and script.
4805 // See exception for k below.
4806 symbols_wideChar = String.fromCharCode(0xD835, 0xDD38 + symbols_i3); // A-Z double struck
4807
4808 defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
4809 defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
4810 symbols_wideChar = String.fromCharCode(0xD835, 0xDC9C + symbols_i3); // A-Z script
4811
4812 defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
4813 defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
4814 } // TODO: Add bold script when it is supported by a KaTeX font.
4815
4816 } // "k" is the only double struck lower case letter in the KaTeX fonts.
4817
4818
4819 symbols_wideChar = String.fromCharCode(0xD835, 0xDD5C); // k double struck
4820
4821 defineSymbol(symbols_math, main, mathord, "k", symbols_wideChar);
4822 defineSymbol(symbols_text, main, symbols_textord, "k", symbols_wideChar); // Next, some wide character numerals
4823
4824 for (var symbols_i4 = 0; symbols_i4 < 10; symbols_i4++) {
4825 var _ch4 = symbols_i4.toString();
4826
4827 symbols_wideChar = String.fromCharCode(0xD835, 0xDFCE + symbols_i4); // 0-9 bold
4828
4829 defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar);
4830 defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar);
4831 symbols_wideChar = String.fromCharCode(0xD835, 0xDFE2 + symbols_i4); // 0-9 sans serif
4832
4833 defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar);
4834 defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar);
4835 symbols_wideChar = String.fromCharCode(0xD835, 0xDFEC + symbols_i4); // 0-9 bold sans
4836
4837 defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar);
4838 defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar);
4839 symbols_wideChar = String.fromCharCode(0xD835, 0xDFF6 + symbols_i4); // 0-9 monospace
4840
4841 defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar);
4842 defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar);
4843 } // We add these Latin-1 letters as symbols for backwards-compatibility,
4844 // but they are not actually in the font, nor are they supported by the
4845 // Unicode accent mechanism, so they fall back to Times font and look ugly.
4846 // TODO(edemaine): Fix this.
4847
4848
4849 var extraLatin = "ÇÐÞçþ";
4850
4851 for (var _i5 = 0; _i5 < extraLatin.length; _i5++) {
4852 var _ch5 = extraLatin.charAt(_i5);
4853
4854 defineSymbol(symbols_math, main, mathord, _ch5, _ch5);
4855 defineSymbol(symbols_text, main, symbols_textord, _ch5, _ch5);
4856 }
4857
4858 defineSymbol(symbols_text, main, symbols_textord, "ð", "ð"); // Unicode versions of existing characters
4859
4860 defineSymbol(symbols_text, main, symbols_textord, "\u2013", "–");
4861 defineSymbol(symbols_text, main, symbols_textord, "\u2014", "—");
4862 defineSymbol(symbols_text, main, symbols_textord, "\u2018", "‘");
4863 defineSymbol(symbols_text, main, symbols_textord, "\u2019", "’");
4864 defineSymbol(symbols_text, main, symbols_textord, "\u201C", "“");
4865 defineSymbol(symbols_text, main, symbols_textord, "\u201D", "”");
4866 // CONCATENATED MODULE: ./src/wide-character.js
4867 /**
4868 * This file provides support for Unicode range U+1D400 to U+1D7FF,
4869 * Mathematical Alphanumeric Symbols.
4870 *
4871 * Function wideCharacterFont takes a wide character as input and returns
4872 * the font information necessary to render it properly.
4873 */
4874
4875 /**
4876 * Data below is from https://www.unicode.org/charts/PDF/U1D400.pdf
4877 * That document sorts characters into groups by font type, say bold or italic.
4878 *
4879 * In the arrays below, each subarray consists three elements:
4880 * * The CSS class of that group when in math mode.
4881 * * The CSS class of that group when in text mode.
4882 * * The font name, so that KaTeX can get font metrics.
4883 */
4884
4885 var wideLatinLetterData = [["mathbf", "textbf", "Main-Bold"], // A-Z bold upright
4886 ["mathbf", "textbf", "Main-Bold"], // a-z bold upright
4887 ["mathdefault", "textit", "Math-Italic"], // A-Z italic
4888 ["mathdefault", "textit", "Math-Italic"], // a-z italic
4889 ["boldsymbol", "boldsymbol", "Main-BoldItalic"], // A-Z bold italic
4890 ["boldsymbol", "boldsymbol", "Main-BoldItalic"], // a-z bold italic
4891 // Map fancy A-Z letters to script, not calligraphic.
4892 // This aligns with unicode-math and math fonts (except Cambria Math).
4893 ["mathscr", "textscr", "Script-Regular"], // A-Z script
4894 ["", "", ""], // a-z script. No font
4895 ["", "", ""], // A-Z bold script. No font
4896 ["", "", ""], // a-z bold script. No font
4897 ["mathfrak", "textfrak", "Fraktur-Regular"], // A-Z Fraktur
4898 ["mathfrak", "textfrak", "Fraktur-Regular"], // a-z Fraktur
4899 ["mathbb", "textbb", "AMS-Regular"], // A-Z double-struck
4900 ["mathbb", "textbb", "AMS-Regular"], // k double-struck
4901 ["", "", ""], // A-Z bold Fraktur No font metrics
4902 ["", "", ""], // a-z bold Fraktur. No font.
4903 ["mathsf", "textsf", "SansSerif-Regular"], // A-Z sans-serif
4904 ["mathsf", "textsf", "SansSerif-Regular"], // a-z sans-serif
4905 ["mathboldsf", "textboldsf", "SansSerif-Bold"], // A-Z bold sans-serif
4906 ["mathboldsf", "textboldsf", "SansSerif-Bold"], // a-z bold sans-serif
4907 ["mathitsf", "textitsf", "SansSerif-Italic"], // A-Z italic sans-serif
4908 ["mathitsf", "textitsf", "SansSerif-Italic"], // a-z italic sans-serif
4909 ["", "", ""], // A-Z bold italic sans. No font
4910 ["", "", ""], // a-z bold italic sans. No font
4911 ["mathtt", "texttt", "Typewriter-Regular"], // A-Z monospace
4912 ["mathtt", "texttt", "Typewriter-Regular"]];
4913 var wideNumeralData = [["mathbf", "textbf", "Main-Bold"], // 0-9 bold
4914 ["", "", ""], // 0-9 double-struck. No KaTeX font.
4915 ["mathsf", "textsf", "SansSerif-Regular"], // 0-9 sans-serif
4916 ["mathboldsf", "textboldsf", "SansSerif-Bold"], // 0-9 bold sans-serif
4917 ["mathtt", "texttt", "Typewriter-Regular"]];
4918 var wide_character_wideCharacterFont = function wideCharacterFont(wideChar, mode) {
4919 // IE doesn't support codePointAt(). So work with the surrogate pair.
4920 var H = wideChar.charCodeAt(0); // high surrogate
4921
4922 var L = wideChar.charCodeAt(1); // low surrogate
4923
4924 var codePoint = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000;
4925 var j = mode === "math" ? 0 : 1; // column index for CSS class.
4926
4927 if (0x1D400 <= codePoint && codePoint < 0x1D6A4) {
4928 // wideLatinLetterData contains exactly 26 chars on each row.
4929 // So we can calculate the relevant row. No traverse necessary.
4930 var i = Math.floor((codePoint - 0x1D400) / 26);
4931 return [wideLatinLetterData[i][2], wideLatinLetterData[i][j]];
4932 } else if (0x1D7CE <= codePoint && codePoint <= 0x1D7FF) {
4933 // Numerals, ten per row.
4934 var _i = Math.floor((codePoint - 0x1D7CE) / 10);
4935
4936 return [wideNumeralData[_i][2], wideNumeralData[_i][j]];
4937 } else if (codePoint === 0x1D6A5 || codePoint === 0x1D6A6) {
4938 // dotless i or j
4939 return [wideLatinLetterData[0][2], wideLatinLetterData[0][j]];
4940 } else if (0x1D6A6 < codePoint && codePoint < 0x1D7CE) {
4941 // Greek letters. Not supported, yet.
4942 return ["", ""];
4943 } else {
4944 // We don't support any wide characters outside 1D400–1D7FF.
4945 throw new src_ParseError("Unsupported character: " + wideChar);
4946 }
4947 };
4948 // CONCATENATED MODULE: ./src/Options.js
4949 /**
4950 * This file contains information about the options that the Parser carries
4951 * around with it while parsing. Data is held in an `Options` object, and when
4952 * recursing, a new `Options` object can be created with the `.with*` and
4953 * `.reset` functions.
4954 */
4955
4956 var sizeStyleMap = [// Each element contains [textsize, scriptsize, scriptscriptsize].
4957 // The size mappings are taken from TeX with \normalsize=10pt.
4958 [1, 1, 1], // size1: [5, 5, 5] \tiny
4959 [2, 1, 1], // size2: [6, 5, 5]
4960 [3, 1, 1], // size3: [7, 5, 5] \scriptsize
4961 [4, 2, 1], // size4: [8, 6, 5] \footnotesize
4962 [5, 2, 1], // size5: [9, 6, 5] \small
4963 [6, 3, 1], // size6: [10, 7, 5] \normalsize
4964 [7, 4, 2], // size7: [12, 8, 6] \large
4965 [8, 6, 3], // size8: [14.4, 10, 7] \Large
4966 [9, 7, 6], // size9: [17.28, 12, 10] \LARGE
4967 [10, 8, 7], // size10: [20.74, 14.4, 12] \huge
4968 [11, 10, 9]];
4969 var sizeMultipliers = [// fontMetrics.js:getGlobalMetrics also uses size indexes, so if
4970 // you change size indexes, change that function.
4971 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488];
4972
4973 var sizeAtStyle = function sizeAtStyle(size, style) {
4974 return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1];
4975 }; // In these types, "" (empty string) means "no change".
4976
4977
4978 /**
4979 * This is the main options class. It contains the current style, size, color,
4980 * and font.
4981 *
4982 * Options objects should not be modified. To create a new Options with
4983 * different properties, call a `.having*` method.
4984 */
4985 var Options_Options =
4986 /*#__PURE__*/
4987 function () {
4988 // A font family applies to a group of fonts (i.e. SansSerif), while a font
4989 // represents a specific font (i.e. SansSerif Bold).
4990 // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm
4991
4992 /**
4993 * The base size index.
4994 */
4995 function Options(data) {
4996 this.style = void 0;
4997 this.color = void 0;
4998 this.size = void 0;
4999 this.textSize = void 0;
5000 this.phantom = void 0;
5001 this.font = void 0;
5002 this.fontFamily = void 0;
5003 this.fontWeight = void 0;
5004 this.fontShape = void 0;
5005 this.sizeMultiplier = void 0;
5006 this.maxSize = void 0;
5007 this.minRuleThickness = void 0;
5008 this._fontMetrics = void 0;
5009 this.style = data.style;
5010 this.color = data.color;
5011 this.size = data.size || Options.BASESIZE;
5012 this.textSize = data.textSize || this.size;
5013 this.phantom = !!data.phantom;
5014 this.font = data.font || "";
5015 this.fontFamily = data.fontFamily || "";
5016 this.fontWeight = data.fontWeight || '';
5017 this.fontShape = data.fontShape || '';
5018 this.sizeMultiplier = sizeMultipliers[this.size - 1];
5019 this.maxSize = data.maxSize;
5020 this.minRuleThickness = data.minRuleThickness;
5021 this._fontMetrics = undefined;
5022 }
5023 /**
5024 * Returns a new options object with the same properties as "this". Properties
5025 * from "extension" will be copied to the new options object.
5026 */
5027
5028
5029 var _proto = Options.prototype;
5030
5031 _proto.extend = function extend(extension) {
5032 var data = {
5033 style: this.style,
5034 size: this.size,
5035 textSize: this.textSize,
5036 color: this.color,
5037 phantom: this.phantom,
5038 font: this.font,
5039 fontFamily: this.fontFamily,
5040 fontWeight: this.fontWeight,
5041 fontShape: this.fontShape,
5042 maxSize: this.maxSize,
5043 minRuleThickness: this.minRuleThickness
5044 };
5045
5046 for (var key in extension) {
5047 if (extension.hasOwnProperty(key)) {
5048 data[key] = extension[key];
5049 }
5050 }
5051
5052 return new Options(data);
5053 }
5054 /**
5055 * Return an options object with the given style. If `this.style === style`,
5056 * returns `this`.
5057 */
5058 ;
5059
5060 _proto.havingStyle = function havingStyle(style) {
5061 if (this.style === style) {
5062 return this;
5063 } else {
5064 return this.extend({
5065 style: style,
5066 size: sizeAtStyle(this.textSize, style)
5067 });
5068 }
5069 }
5070 /**
5071 * Return an options object with a cramped version of the current style. If
5072 * the current style is cramped, returns `this`.
5073 */
5074 ;
5075
5076 _proto.havingCrampedStyle = function havingCrampedStyle() {
5077 return this.havingStyle(this.style.cramp());
5078 }
5079 /**
5080 * Return an options object with the given size and in at least `\textstyle`.
5081 * Returns `this` if appropriate.
5082 */
5083 ;
5084
5085 _proto.havingSize = function havingSize(size) {
5086 if (this.size === size && this.textSize === size) {
5087 return this;
5088 } else {
5089 return this.extend({
5090 style: this.style.text(),
5091 size: size,
5092 textSize: size,
5093 sizeMultiplier: sizeMultipliers[size - 1]
5094 });
5095 }
5096 }
5097 /**
5098 * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted,
5099 * changes to at least `\textstyle`.
5100 */
5101 ;
5102
5103 _proto.havingBaseStyle = function havingBaseStyle(style) {
5104 style = style || this.style.text();
5105 var wantSize = sizeAtStyle(Options.BASESIZE, style);
5106
5107 if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) {
5108 return this;
5109 } else {
5110 return this.extend({
5111 style: style,
5112 size: wantSize
5113 });
5114 }
5115 }
5116 /**
5117 * Remove the effect of sizing changes such as \Huge.
5118 * Keep the effect of the current style, such as \scriptstyle.
5119 */
5120 ;
5121
5122 _proto.havingBaseSizing = function havingBaseSizing() {
5123 var size;
5124
5125 switch (this.style.id) {
5126 case 4:
5127 case 5:
5128 size = 3; // normalsize in scriptstyle
5129
5130 break;
5131
5132 case 6:
5133 case 7:
5134 size = 1; // normalsize in scriptscriptstyle
5135
5136 break;
5137
5138 default:
5139 size = 6;
5140 // normalsize in textstyle or displaystyle
5141 }
5142
5143 return this.extend({
5144 style: this.style.text(),
5145 size: size
5146 });
5147 }
5148 /**
5149 * Create a new options object with the given color.
5150 */
5151 ;
5152
5153 _proto.withColor = function withColor(color) {
5154 return this.extend({
5155 color: color
5156 });
5157 }
5158 /**
5159 * Create a new options object with "phantom" set to true.
5160 */
5161 ;
5162
5163 _proto.withPhantom = function withPhantom() {
5164 return this.extend({
5165 phantom: true
5166 });
5167 }
5168 /**
5169 * Creates a new options object with the given math font or old text font.
5170 * @type {[type]}
5171 */
5172 ;
5173
5174 _proto.withFont = function withFont(font) {
5175 return this.extend({
5176 font: font
5177 });
5178 }
5179 /**
5180 * Create a new options objects with the given fontFamily.
5181 */
5182 ;
5183
5184 _proto.withTextFontFamily = function withTextFontFamily(fontFamily) {
5185 return this.extend({
5186 fontFamily: fontFamily,
5187 font: ""
5188 });
5189 }
5190 /**
5191 * Creates a new options object with the given font weight
5192 */
5193 ;
5194
5195 _proto.withTextFontWeight = function withTextFontWeight(fontWeight) {
5196 return this.extend({
5197 fontWeight: fontWeight,
5198 font: ""
5199 });
5200 }
5201 /**
5202 * Creates a new options object with the given font weight
5203 */
5204 ;
5205
5206 _proto.withTextFontShape = function withTextFontShape(fontShape) {
5207 return this.extend({
5208 fontShape: fontShape,
5209 font: ""
5210 });
5211 }
5212 /**
5213 * Return the CSS sizing classes required to switch from enclosing options
5214 * `oldOptions` to `this`. Returns an array of classes.
5215 */
5216 ;
5217
5218 _proto.sizingClasses = function sizingClasses(oldOptions) {
5219 if (oldOptions.size !== this.size) {
5220 return ["sizing", "reset-size" + oldOptions.size, "size" + this.size];
5221 } else {
5222 return [];
5223 }
5224 }
5225 /**
5226 * Return the CSS sizing classes required to switch to the base size. Like
5227 * `this.havingSize(BASESIZE).sizingClasses(this)`.
5228 */
5229 ;
5230
5231 _proto.baseSizingClasses = function baseSizingClasses() {
5232 if (this.size !== Options.BASESIZE) {
5233 return ["sizing", "reset-size" + this.size, "size" + Options.BASESIZE];
5234 } else {
5235 return [];
5236 }
5237 }
5238 /**
5239 * Return the font metrics for this size.
5240 */
5241 ;
5242
5243 _proto.fontMetrics = function fontMetrics() {
5244 if (!this._fontMetrics) {
5245 this._fontMetrics = getGlobalMetrics(this.size);
5246 }
5247
5248 return this._fontMetrics;
5249 }
5250 /**
5251 * Gets the CSS color of the current options object
5252 */
5253 ;
5254
5255 _proto.getColor = function getColor() {
5256 if (this.phantom) {
5257 return "transparent";
5258 } else {
5259 return this.color;
5260 }
5261 };
5262
5263 return Options;
5264 }();
5265
5266 Options_Options.BASESIZE = 6;
5267 /* harmony default export */ var src_Options = (Options_Options);
5268 // CONCATENATED MODULE: ./src/units.js
5269 /**
5270 * This file does conversion between units. In particular, it provides
5271 * calculateSize to convert other units into ems.
5272 */
5273
5274 // This table gives the number of TeX pts in one of each *absolute* TeX unit.
5275 // Thus, multiplying a length by this number converts the length from units
5276 // into pts. Dividing the result by ptPerEm gives the number of ems
5277 // *assuming* a font size of ptPerEm (normal size, normal style).
5278
5279 var ptPerUnit = {
5280 // https://en.wikibooks.org/wiki/LaTeX/Lengths and
5281 // https://tex.stackexchange.com/a/8263
5282 "pt": 1,
5283 // TeX point
5284 "mm": 7227 / 2540,
5285 // millimeter
5286 "cm": 7227 / 254,
5287 // centimeter
5288 "in": 72.27,
5289 // inch
5290 "bp": 803 / 800,
5291 // big (PostScript) points
5292 "pc": 12,
5293 // pica
5294 "dd": 1238 / 1157,
5295 // didot
5296 "cc": 14856 / 1157,
5297 // cicero (12 didot)
5298 "nd": 685 / 642,
5299 // new didot
5300 "nc": 1370 / 107,
5301 // new cicero (12 new didot)
5302 "sp": 1 / 65536,
5303 // scaled point (TeX's internal smallest unit)
5304 // https://tex.stackexchange.com/a/41371
5305 "px": 803 / 800 // \pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX
5306
5307 }; // Dictionary of relative units, for fast validity testing.
5308
5309 var relativeUnit = {
5310 "ex": true,
5311 "em": true,
5312 "mu": true
5313 };
5314
5315 /**
5316 * Determine whether the specified unit (either a string defining the unit
5317 * or a "size" parse node containing a unit field) is valid.
5318 */
5319 var validUnit = function validUnit(unit) {
5320 if (typeof unit !== "string") {
5321 unit = unit.unit;
5322 }
5323
5324 return unit in ptPerUnit || unit in relativeUnit || unit === "ex";
5325 };
5326 /*
5327 * Convert a "size" parse node (with numeric "number" and string "unit" fields,
5328 * as parsed by functions.js argType "size") into a CSS em value for the
5329 * current style/scale. `options` gives the current options.
5330 */
5331
5332 var units_calculateSize = function calculateSize(sizeValue, options) {
5333 var scale;
5334
5335 if (sizeValue.unit in ptPerUnit) {
5336 // Absolute units
5337 scale = ptPerUnit[sizeValue.unit] // Convert unit to pt
5338 / options.fontMetrics().ptPerEm // Convert pt to CSS em
5339 / options.sizeMultiplier; // Unscale to make absolute units
5340 } else if (sizeValue.unit === "mu") {
5341 // `mu` units scale with scriptstyle/scriptscriptstyle.
5342 scale = options.fontMetrics().cssEmPerMu;
5343 } else {
5344 // Other relative units always refer to the *textstyle* font
5345 // in the current size.
5346 var unitOptions;
5347
5348 if (options.style.isTight()) {
5349 // isTight() means current style is script/scriptscript.
5350 unitOptions = options.havingStyle(options.style.text());
5351 } else {
5352 unitOptions = options;
5353 } // TODO: In TeX these units are relative to the quad of the current
5354 // *text* font, e.g. cmr10. KaTeX instead uses values from the
5355 // comparably-sized *Computer Modern symbol* font. At 10pt, these
5356 // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641;
5357 // cmr5=1.361133, cmsy5=1.472241. Consider $\scriptsize a\kern1emb$.
5358 // TeX \showlists shows a kern of 1.13889 * fontsize;
5359 // KaTeX shows a kern of 1.171 * fontsize.
5360
5361
5362 if (sizeValue.unit === "ex") {
5363 scale = unitOptions.fontMetrics().xHeight;
5364 } else if (sizeValue.unit === "em") {
5365 scale = unitOptions.fontMetrics().quad;
5366 } else {
5367 throw new src_ParseError("Invalid unit: '" + sizeValue.unit + "'");
5368 }
5369
5370 if (unitOptions !== options) {
5371 scale *= unitOptions.sizeMultiplier / options.sizeMultiplier;
5372 }
5373 }
5374
5375 return Math.min(sizeValue.number * scale, options.maxSize);
5376 };
5377 // CONCATENATED MODULE: ./src/buildCommon.js
5378 /* eslint no-console:0 */
5379
5380 /**
5381 * This module contains general functions that can be used for building
5382 * different kinds of domTree nodes in a consistent manner.
5383 */
5384
5385
5386
5387
5388
5389
5390
5391 // The following have to be loaded from Main-Italic font, using class mathit
5392 var mathitLetters = ["\\imath", "ı", // dotless i
5393 "\\jmath", "ȷ", // dotless j
5394 "\\pounds", "\\mathsterling", "\\textsterling", "£"];
5395 /**
5396 * Looks up the given symbol in fontMetrics, after applying any symbol
5397 * replacements defined in symbol.js
5398 */
5399
5400 var buildCommon_lookupSymbol = function lookupSymbol(value, // TODO(#963): Use a union type for this.
5401 fontName, mode) {
5402 // Replace the value with its replaced value from symbol.js
5403 if (src_symbols[mode][value] && src_symbols[mode][value].replace) {
5404 value = src_symbols[mode][value].replace;
5405 }
5406
5407 return {
5408 value: value,
5409 metrics: getCharacterMetrics(value, fontName, mode)
5410 };
5411 };
5412 /**
5413 * Makes a symbolNode after translation via the list of symbols in symbols.js.
5414 * Correctly pulls out metrics for the character, and optionally takes a list of
5415 * classes to be attached to the node.
5416 *
5417 * TODO: make argument order closer to makeSpan
5418 * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which
5419 * should if present come first in `classes`.
5420 * TODO(#953): Make `options` mandatory and always pass it in.
5421 */
5422
5423
5424 var buildCommon_makeSymbol = function makeSymbol(value, fontName, mode, options, classes) {
5425 var lookup = buildCommon_lookupSymbol(value, fontName, mode);
5426 var metrics = lookup.metrics;
5427 value = lookup.value;
5428 var symbolNode;
5429
5430 if (metrics) {
5431 var italic = metrics.italic;
5432
5433 if (mode === "text" || options && options.font === "mathit") {
5434 italic = 0;
5435 }
5436
5437 symbolNode = new domTree_SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes);
5438 } else {
5439 // TODO(emily): Figure out a good way to only print this in development
5440 typeof console !== "undefined" && console.warn("No character metrics " + ("for '" + value + "' in style '" + fontName + "' and mode '" + mode + "'"));
5441 symbolNode = new domTree_SymbolNode(value, 0, 0, 0, 0, 0, classes);
5442 }
5443
5444 if (options) {
5445 symbolNode.maxFontSize = options.sizeMultiplier;
5446
5447 if (options.style.isTight()) {
5448 symbolNode.classes.push("mtight");
5449 }
5450
5451 var color = options.getColor();
5452
5453 if (color) {
5454 symbolNode.style.color = color;
5455 }
5456 }
5457
5458 return symbolNode;
5459 };
5460 /**
5461 * Makes a symbol in Main-Regular or AMS-Regular.
5462 * Used for rel, bin, open, close, inner, and punct.
5463 */
5464
5465
5466 var buildCommon_mathsym = function mathsym(value, mode, options, classes) {
5467 if (classes === void 0) {
5468 classes = [];
5469 }
5470
5471 // Decide what font to render the symbol in by its entry in the symbols
5472 // table.
5473 // Have a special case for when the value = \ because the \ is used as a
5474 // textord in unsupported command errors but cannot be parsed as a regular
5475 // text ordinal and is therefore not present as a symbol in the symbols
5476 // table for text, as well as a special case for boldsymbol because it
5477 // can be used for bold + and -
5478 if (options.font === "boldsymbol" && buildCommon_lookupSymbol(value, "Main-Bold", mode).metrics) {
5479 return buildCommon_makeSymbol(value, "Main-Bold", mode, options, classes.concat(["mathbf"]));
5480 } else if (value === "\\" || src_symbols[mode][value].font === "main") {
5481 return buildCommon_makeSymbol(value, "Main-Regular", mode, options, classes);
5482 } else {
5483 return buildCommon_makeSymbol(value, "AMS-Regular", mode, options, classes.concat(["amsrm"]));
5484 }
5485 };
5486 /**
5487 * Determines which of the two font names (Main-Italic and Math-Italic) and
5488 * corresponding style tags (maindefault or mathit) to use for default math font,
5489 * depending on the symbol.
5490 */
5491
5492
5493 var buildCommon_mathdefault = function mathdefault(value, mode, options, classes) {
5494 if (/[0-9]/.test(value.charAt(0)) || // glyphs for \imath and \jmath do not exist in Math-Italic so we
5495 // need to use Main-Italic instead
5496 utils.contains(mathitLetters, value)) {
5497 return {
5498 fontName: "Main-Italic",
5499 fontClass: "mathit"
5500 };
5501 } else {
5502 return {
5503 fontName: "Math-Italic",
5504 fontClass: "mathdefault"
5505 };
5506 }
5507 };
5508 /**
5509 * Determines which of the font names (Main-Italic, Math-Italic, and Caligraphic)
5510 * and corresponding style tags (mathit, mathdefault, or mathcal) to use for font
5511 * "mathnormal", depending on the symbol. Use this function instead of fontMap for
5512 * font "mathnormal".
5513 */
5514
5515
5516 var buildCommon_mathnormal = function mathnormal(value, mode, options, classes) {
5517 if (utils.contains(mathitLetters, value)) {
5518 return {
5519 fontName: "Main-Italic",
5520 fontClass: "mathit"
5521 };
5522 } else if (/[0-9]/.test(value.charAt(0))) {
5523 return {
5524 fontName: "Caligraphic-Regular",
5525 fontClass: "mathcal"
5526 };
5527 } else {
5528 return {
5529 fontName: "Math-Italic",
5530 fontClass: "mathdefault"
5531 };
5532 }
5533 };
5534 /**
5535 * Determines which of the two font names (Main-Bold and Math-BoldItalic) and
5536 * corresponding style tags (mathbf or boldsymbol) to use for font "boldsymbol",
5537 * depending on the symbol. Use this function instead of fontMap for font
5538 * "boldsymbol".
5539 */
5540
5541
5542 var boldsymbol = function boldsymbol(value, mode, options, classes) {
5543 if (buildCommon_lookupSymbol(value, "Math-BoldItalic", mode).metrics) {
5544 return {
5545 fontName: "Math-BoldItalic",
5546 fontClass: "boldsymbol"
5547 };
5548 } else {
5549 // Some glyphs do not exist in Math-BoldItalic so we need to use
5550 // Main-Bold instead.
5551 return {
5552 fontName: "Main-Bold",
5553 fontClass: "mathbf"
5554 };
5555 }
5556 };
5557 /**
5558 * Makes either a mathord or textord in the correct font and color.
5559 */
5560
5561
5562 var buildCommon_makeOrd = function makeOrd(group, options, type) {
5563 var mode = group.mode;
5564 var text = group.text;
5565 var classes = ["mord"]; // Math mode or Old font (i.e. \rm)
5566
5567 var isFont = mode === "math" || mode === "text" && options.font;
5568 var fontOrFamily = isFont ? options.font : options.fontFamily;
5569
5570 if (text.charCodeAt(0) === 0xD835) {
5571 // surrogate pairs get special treatment
5572 var _wideCharacterFont = wide_character_wideCharacterFont(text, mode),
5573 wideFontName = _wideCharacterFont[0],
5574 wideFontClass = _wideCharacterFont[1];
5575
5576 return buildCommon_makeSymbol(text, wideFontName, mode, options, classes.concat(wideFontClass));
5577 } else if (fontOrFamily) {
5578 var fontName;
5579 var fontClasses;
5580
5581 if (fontOrFamily === "boldsymbol" || fontOrFamily === "mathnormal") {
5582 var fontData = fontOrFamily === "boldsymbol" ? boldsymbol(text, mode, options, classes) : buildCommon_mathnormal(text, mode, options, classes);
5583 fontName = fontData.fontName;
5584 fontClasses = [fontData.fontClass];
5585 } else if (utils.contains(mathitLetters, text)) {
5586 fontName = "Main-Italic";
5587 fontClasses = ["mathit"];
5588 } else if (isFont) {
5589 fontName = fontMap[fontOrFamily].fontName;
5590 fontClasses = [fontOrFamily];
5591 } else {
5592 fontName = retrieveTextFontName(fontOrFamily, options.fontWeight, options.fontShape);
5593 fontClasses = [fontOrFamily, options.fontWeight, options.fontShape];
5594 }
5595
5596 if (buildCommon_lookupSymbol(text, fontName, mode).metrics) {
5597 return buildCommon_makeSymbol(text, fontName, mode, options, classes.concat(fontClasses));
5598 } else if (ligatures.hasOwnProperty(text) && fontName.substr(0, 10) === "Typewriter") {
5599 // Deconstruct ligatures in monospace fonts (\texttt, \tt).
5600 var parts = [];
5601
5602 for (var i = 0; i < text.length; i++) {
5603 parts.push(buildCommon_makeSymbol(text[i], fontName, mode, options, classes.concat(fontClasses)));
5604 }
5605
5606 return buildCommon_makeFragment(parts);
5607 }
5608 } // Makes a symbol in the default font for mathords and textords.
5609
5610
5611 if (type === "mathord") {
5612 var fontLookup = buildCommon_mathdefault(text, mode, options, classes);
5613 return buildCommon_makeSymbol(text, fontLookup.fontName, mode, options, classes.concat([fontLookup.fontClass]));
5614 } else if (type === "textord") {
5615 var font = src_symbols[mode][text] && src_symbols[mode][text].font;
5616
5617 if (font === "ams") {
5618 var _fontName = retrieveTextFontName("amsrm", options.fontWeight, options.fontShape);
5619
5620 return buildCommon_makeSymbol(text, _fontName, mode, options, classes.concat("amsrm", options.fontWeight, options.fontShape));
5621 } else if (font === "main" || !font) {
5622 var _fontName2 = retrieveTextFontName("textrm", options.fontWeight, options.fontShape);
5623
5624 return buildCommon_makeSymbol(text, _fontName2, mode, options, classes.concat(options.fontWeight, options.fontShape));
5625 } else {
5626 // fonts added by plugins
5627 var _fontName3 = retrieveTextFontName(font, options.fontWeight, options.fontShape); // We add font name as a css class
5628
5629
5630 return buildCommon_makeSymbol(text, _fontName3, mode, options, classes.concat(_fontName3, options.fontWeight, options.fontShape));
5631 }
5632 } else {
5633 throw new Error("unexpected type: " + type + " in makeOrd");
5634 }
5635 };
5636 /**
5637 * Returns true if subsequent symbolNodes have the same classes, skew, maxFont,
5638 * and styles.
5639 */
5640
5641
5642 var buildCommon_canCombine = function canCombine(prev, next) {
5643 if (createClass(prev.classes) !== createClass(next.classes) || prev.skew !== next.skew || prev.maxFontSize !== next.maxFontSize) {
5644 return false;
5645 }
5646
5647 for (var style in prev.style) {
5648 if (prev.style.hasOwnProperty(style) && prev.style[style] !== next.style[style]) {
5649 return false;
5650 }
5651 }
5652
5653 for (var _style in next.style) {
5654 if (next.style.hasOwnProperty(_style) && prev.style[_style] !== next.style[_style]) {
5655 return false;
5656 }
5657 }
5658
5659 return true;
5660 };
5661 /**
5662 * Combine consequetive domTree.symbolNodes into a single symbolNode.
5663 * Note: this function mutates the argument.
5664 */
5665
5666
5667 var buildCommon_tryCombineChars = function tryCombineChars(chars) {
5668 for (var i = 0; i < chars.length - 1; i++) {
5669 var prev = chars[i];
5670 var next = chars[i + 1];
5671
5672 if (prev instanceof domTree_SymbolNode && next instanceof domTree_SymbolNode && buildCommon_canCombine(prev, next)) {
5673 prev.text += next.text;
5674 prev.height = Math.max(prev.height, next.height);
5675 prev.depth = Math.max(prev.depth, next.depth); // Use the last character's italic correction since we use
5676 // it to add padding to the right of the span created from
5677 // the combined characters.
5678
5679 prev.italic = next.italic;
5680 chars.splice(i + 1, 1);
5681 i--;
5682 }
5683 }
5684
5685 return chars;
5686 };
5687 /**
5688 * Calculate the height, depth, and maxFontSize of an element based on its
5689 * children.
5690 */
5691
5692
5693 var sizeElementFromChildren = function sizeElementFromChildren(elem) {
5694 var height = 0;
5695 var depth = 0;
5696 var maxFontSize = 0;
5697
5698 for (var i = 0; i < elem.children.length; i++) {
5699 var child = elem.children[i];
5700
5701 if (child.height > height) {
5702 height = child.height;
5703 }
5704
5705 if (child.depth > depth) {
5706 depth = child.depth;
5707 }
5708
5709 if (child.maxFontSize > maxFontSize) {
5710 maxFontSize = child.maxFontSize;
5711 }
5712 }
5713
5714 elem.height = height;
5715 elem.depth = depth;
5716 elem.maxFontSize = maxFontSize;
5717 };
5718 /**
5719 * Makes a span with the given list of classes, list of children, and options.
5720 *
5721 * TODO(#953): Ensure that `options` is always provided (currently some call
5722 * sites don't pass it) and make the type below mandatory.
5723 * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which
5724 * should if present come first in `classes`.
5725 */
5726
5727
5728 var buildCommon_makeSpan = function makeSpan(classes, children, options, style) {
5729 var span = new domTree_Span(classes, children, options, style);
5730 sizeElementFromChildren(span);
5731 return span;
5732 }; // SVG one is simpler -- doesn't require height, depth, max-font setting.
5733 // This is also a separate method for typesafety.
5734
5735
5736 var buildCommon_makeSvgSpan = function makeSvgSpan(classes, children, options, style) {
5737 return new domTree_Span(classes, children, options, style);
5738 };
5739
5740 var makeLineSpan = function makeLineSpan(className, options, thickness) {
5741 var line = buildCommon_makeSpan([className], [], options);
5742 line.height = Math.max(thickness || options.fontMetrics().defaultRuleThickness, options.minRuleThickness);
5743 line.style.borderBottomWidth = line.height + "em";
5744 line.maxFontSize = 1.0;
5745 return line;
5746 };
5747 /**
5748 * Makes an anchor with the given href, list of classes, list of children,
5749 * and options.
5750 */
5751
5752
5753 var buildCommon_makeAnchor = function makeAnchor(href, classes, children, options) {
5754 var anchor = new domTree_Anchor(href, classes, children, options);
5755 sizeElementFromChildren(anchor);
5756 return anchor;
5757 };
5758 /**
5759 * Makes a document fragment with the given list of children.
5760 */
5761
5762
5763 var buildCommon_makeFragment = function makeFragment(children) {
5764 var fragment = new tree_DocumentFragment(children);
5765 sizeElementFromChildren(fragment);
5766 return fragment;
5767 };
5768 /**
5769 * Wraps group in a span if it's a document fragment, allowing to apply classes
5770 * and styles
5771 */
5772
5773
5774 var buildCommon_wrapFragment = function wrapFragment(group, options) {
5775 if (group instanceof tree_DocumentFragment) {
5776 return buildCommon_makeSpan([], [group], options);
5777 }
5778
5779 return group;
5780 }; // These are exact object types to catch typos in the names of the optional fields.
5781
5782
5783 // Computes the updated `children` list and the overall depth.
5784 //
5785 // This helper function for makeVList makes it easier to enforce type safety by
5786 // allowing early exits (returns) in the logic.
5787 var getVListChildrenAndDepth = function getVListChildrenAndDepth(params) {
5788 if (params.positionType === "individualShift") {
5789 var oldChildren = params.children;
5790 var children = [oldChildren[0]]; // Add in kerns to the list of params.children to get each element to be
5791 // shifted to the correct specified shift
5792
5793 var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth;
5794
5795 var currPos = _depth;
5796
5797 for (var i = 1; i < oldChildren.length; i++) {
5798 var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth;
5799 var size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth);
5800 currPos = currPos + diff;
5801 children.push({
5802 type: "kern",
5803 size: size
5804 });
5805 children.push(oldChildren[i]);
5806 }
5807
5808 return {
5809 children: children,
5810 depth: _depth
5811 };
5812 }
5813
5814 var depth;
5815
5816 if (params.positionType === "top") {
5817 // We always start at the bottom, so calculate the bottom by adding up
5818 // all the sizes
5819 var bottom = params.positionData;
5820
5821 for (var _i = 0; _i < params.children.length; _i++) {
5822 var child = params.children[_i];
5823 bottom -= child.type === "kern" ? child.size : child.elem.height + child.elem.depth;
5824 }
5825
5826 depth = bottom;
5827 } else if (params.positionType === "bottom") {
5828 depth = -params.positionData;
5829 } else {
5830 var firstChild = params.children[0];
5831
5832 if (firstChild.type !== "elem") {
5833 throw new Error('First child must have type "elem".');
5834 }
5835
5836 if (params.positionType === "shift") {
5837 depth = -firstChild.elem.depth - params.positionData;
5838 } else if (params.positionType === "firstBaseline") {
5839 depth = -firstChild.elem.depth;
5840 } else {
5841 throw new Error("Invalid positionType " + params.positionType + ".");
5842 }
5843 }
5844
5845 return {
5846 children: params.children,
5847 depth: depth
5848 };
5849 };
5850 /**
5851 * Makes a vertical list by stacking elements and kerns on top of each other.
5852 * Allows for many different ways of specifying the positioning method.
5853 *
5854 * See VListParam documentation above.
5855 */
5856
5857
5858 var buildCommon_makeVList = function makeVList(params, options) {
5859 var _getVListChildrenAndD = getVListChildrenAndDepth(params),
5860 children = _getVListChildrenAndD.children,
5861 depth = _getVListChildrenAndD.depth; // Create a strut that is taller than any list item. The strut is added to
5862 // each item, where it will determine the item's baseline. Since it has
5863 // `overflow:hidden`, the strut's top edge will sit on the item's line box's
5864 // top edge and the strut's bottom edge will sit on the item's baseline,
5865 // with no additional line-height spacing. This allows the item baseline to
5866 // be positioned precisely without worrying about font ascent and
5867 // line-height.
5868
5869
5870 var pstrutSize = 0;
5871
5872 for (var i = 0; i < children.length; i++) {
5873 var child = children[i];
5874
5875 if (child.type === "elem") {
5876 var elem = child.elem;
5877 pstrutSize = Math.max(pstrutSize, elem.maxFontSize, elem.height);
5878 }
5879 }
5880
5881 pstrutSize += 2;
5882 var pstrut = buildCommon_makeSpan(["pstrut"], []);
5883 pstrut.style.height = pstrutSize + "em"; // Create a new list of actual children at the correct offsets
5884
5885 var realChildren = [];
5886 var minPos = depth;
5887 var maxPos = depth;
5888 var currPos = depth;
5889
5890 for (var _i2 = 0; _i2 < children.length; _i2++) {
5891 var _child = children[_i2];
5892
5893 if (_child.type === "kern") {
5894 currPos += _child.size;
5895 } else {
5896 var _elem = _child.elem;
5897 var classes = _child.wrapperClasses || [];
5898 var style = _child.wrapperStyle || {};
5899 var childWrap = buildCommon_makeSpan(classes, [pstrut, _elem], undefined, style);
5900 childWrap.style.top = -pstrutSize - currPos - _elem.depth + "em";
5901
5902 if (_child.marginLeft) {
5903 childWrap.style.marginLeft = _child.marginLeft;
5904 }
5905
5906 if (_child.marginRight) {
5907 childWrap.style.marginRight = _child.marginRight;
5908 }
5909
5910 realChildren.push(childWrap);
5911 currPos += _elem.height + _elem.depth;
5912 }
5913
5914 minPos = Math.min(minPos, currPos);
5915 maxPos = Math.max(maxPos, currPos);
5916 } // The vlist contents go in a table-cell with `vertical-align:bottom`.
5917 // This cell's bottom edge will determine the containing table's baseline
5918 // without overly expanding the containing line-box.
5919
5920
5921 var vlist = buildCommon_makeSpan(["vlist"], realChildren);
5922 vlist.style.height = maxPos + "em"; // A second row is used if necessary to represent the vlist's depth.
5923
5924 var rows;
5925
5926 if (minPos < 0) {
5927 // We will define depth in an empty span with display: table-cell.
5928 // It should render with the height that we define. But Chrome, in
5929 // contenteditable mode only, treats that span as if it contains some
5930 // text content. And that min-height over-rides our desired height.
5931 // So we put another empty span inside the depth strut span.
5932 var emptySpan = buildCommon_makeSpan([], []);
5933 var depthStrut = buildCommon_makeSpan(["vlist"], [emptySpan]);
5934 depthStrut.style.height = -minPos + "em"; // Safari wants the first row to have inline content; otherwise it
5935 // puts the bottom of the *second* row on the baseline.
5936
5937 var topStrut = buildCommon_makeSpan(["vlist-s"], [new domTree_SymbolNode("\u200B")]);
5938 rows = [buildCommon_makeSpan(["vlist-r"], [vlist, topStrut]), buildCommon_makeSpan(["vlist-r"], [depthStrut])];
5939 } else {
5940 rows = [buildCommon_makeSpan(["vlist-r"], [vlist])];
5941 }
5942
5943 var vtable = buildCommon_makeSpan(["vlist-t"], rows);
5944
5945 if (rows.length === 2) {
5946 vtable.classes.push("vlist-t2");
5947 }
5948
5949 vtable.height = maxPos;
5950 vtable.depth = -minPos;
5951 return vtable;
5952 }; // Glue is a concept from TeX which is a flexible space between elements in
5953 // either a vertical or horizontal list. In KaTeX, at least for now, it's
5954 // static space between elements in a horizontal layout.
5955
5956
5957 var buildCommon_makeGlue = function makeGlue(measurement, options) {
5958 // Make an empty span for the space
5959 var rule = buildCommon_makeSpan(["mspace"], [], options);
5960 var size = units_calculateSize(measurement, options);
5961 rule.style.marginRight = size + "em";
5962 return rule;
5963 }; // Takes font options, and returns the appropriate fontLookup name
5964
5965
5966 var retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) {
5967 var baseFontName = "";
5968
5969 switch (fontFamily) {
5970 case "amsrm":
5971 baseFontName = "AMS";
5972 break;
5973
5974 case "textrm":
5975 baseFontName = "Main";
5976 break;
5977
5978 case "textsf":
5979 baseFontName = "SansSerif";
5980 break;
5981
5982 case "texttt":
5983 baseFontName = "Typewriter";
5984 break;
5985
5986 default:
5987 baseFontName = fontFamily;
5988 // use fonts added by a plugin
5989 }
5990
5991 var fontStylesName;
5992
5993 if (fontWeight === "textbf" && fontShape === "textit") {
5994 fontStylesName = "BoldItalic";
5995 } else if (fontWeight === "textbf") {
5996 fontStylesName = "Bold";
5997 } else if (fontWeight === "textit") {
5998 fontStylesName = "Italic";
5999 } else {
6000 fontStylesName = "Regular";
6001 }
6002
6003 return baseFontName + "-" + fontStylesName;
6004 };
6005 /**
6006 * Maps TeX font commands to objects containing:
6007 * - variant: string used for "mathvariant" attribute in buildMathML.js
6008 * - fontName: the "style" parameter to fontMetrics.getCharacterMetrics
6009 */
6010 // A map between tex font commands an MathML mathvariant attribute values
6011
6012
6013 var fontMap = {
6014 // styles
6015 "mathbf": {
6016 variant: "bold",
6017 fontName: "Main-Bold"
6018 },
6019 "mathrm": {
6020 variant: "normal",
6021 fontName: "Main-Regular"
6022 },
6023 "textit": {
6024 variant: "italic",
6025 fontName: "Main-Italic"
6026 },
6027 "mathit": {
6028 variant: "italic",
6029 fontName: "Main-Italic"
6030 },
6031 // Default math font, "mathnormal" and "boldsymbol" are missing because they
6032 // require the use of several fonts: Main-Italic and Math-Italic for default
6033 // math font, Main-Italic, Math-Italic, Caligraphic for "mathnormal", and
6034 // Math-BoldItalic and Main-Bold for "boldsymbol". This is handled by a
6035 // special case in makeOrd which ends up calling mathdefault, mathnormal,
6036 // and boldsymbol.
6037 // families
6038 "mathbb": {
6039 variant: "double-struck",
6040 fontName: "AMS-Regular"
6041 },
6042 "mathcal": {
6043 variant: "script",
6044 fontName: "Caligraphic-Regular"
6045 },
6046 "mathfrak": {
6047 variant: "fraktur",
6048 fontName: "Fraktur-Regular"
6049 },
6050 "mathscr": {
6051 variant: "script",
6052 fontName: "Script-Regular"
6053 },
6054 "mathsf": {
6055 variant: "sans-serif",
6056 fontName: "SansSerif-Regular"
6057 },
6058 "mathtt": {
6059 variant: "monospace",
6060 fontName: "Typewriter-Regular"
6061 }
6062 };
6063 var svgData = {
6064 // path, width, height
6065 vec: ["vec", 0.471, 0.714],
6066 // values from the font glyph
6067 oiintSize1: ["oiintSize1", 0.957, 0.499],
6068 // oval to overlay the integrand
6069 oiintSize2: ["oiintSize2", 1.472, 0.659],
6070 oiiintSize1: ["oiiintSize1", 1.304, 0.499],
6071 oiiintSize2: ["oiiintSize2", 1.98, 0.659]
6072 };
6073
6074 var buildCommon_staticSvg = function staticSvg(value, options) {
6075 // Create a span with inline SVG for the element.
6076 var _svgData$value = svgData[value],
6077 pathName = _svgData$value[0],
6078 width = _svgData$value[1],
6079 height = _svgData$value[2];
6080 var path = new domTree_PathNode(pathName);
6081 var svgNode = new SvgNode([path], {
6082 "width": width + "em",
6083 "height": height + "em",
6084 // Override CSS rule `.katex svg { width: 100% }`
6085 "style": "width:" + width + "em",
6086 "viewBox": "0 0 " + 1000 * width + " " + 1000 * height,
6087 "preserveAspectRatio": "xMinYMin"
6088 });
6089 var span = buildCommon_makeSvgSpan(["overlay"], [svgNode], options);
6090 span.height = height;
6091 span.style.height = height + "em";
6092 span.style.width = width + "em";
6093 return span;
6094 };
6095
6096 /* harmony default export */ var buildCommon = ({
6097 fontMap: fontMap,
6098 makeSymbol: buildCommon_makeSymbol,
6099 mathsym: buildCommon_mathsym,
6100 makeSpan: buildCommon_makeSpan,
6101 makeSvgSpan: buildCommon_makeSvgSpan,
6102 makeLineSpan: makeLineSpan,
6103 makeAnchor: buildCommon_makeAnchor,
6104 makeFragment: buildCommon_makeFragment,
6105 wrapFragment: buildCommon_wrapFragment,
6106 makeVList: buildCommon_makeVList,
6107 makeOrd: buildCommon_makeOrd,
6108 makeGlue: buildCommon_makeGlue,
6109 staticSvg: buildCommon_staticSvg,
6110 svgData: svgData,
6111 tryCombineChars: buildCommon_tryCombineChars
6112 });
6113 // CONCATENATED MODULE: ./src/parseNode.js
6114
6115
6116 /**
6117 * Asserts that the node is of the given type and returns it with stricter
6118 * typing. Throws if the node's type does not match.
6119 */
6120 function assertNodeType(node, type) {
6121 var typedNode = checkNodeType(node, type);
6122
6123 if (!typedNode) {
6124 throw new Error("Expected node of type " + type + ", but got " + (node ? "node of type " + node.type : String(node)));
6125 } // $FlowFixMe: Unsure why.
6126
6127
6128 return typedNode;
6129 }
6130 /**
6131 * Returns the node more strictly typed iff it is of the given type. Otherwise,
6132 * returns null.
6133 */
6134
6135 function checkNodeType(node, type) {
6136 if (node && node.type === type) {
6137 // The definition of ParseNode<TYPE> doesn't communicate to flow that
6138 // `type: TYPE` (as that's not explicitly mentioned anywhere), though that
6139 // happens to be true for all our value types.
6140 // $FlowFixMe
6141 return node;
6142 }
6143
6144 return null;
6145 }
6146 /**
6147 * Asserts that the node is of the given type and returns it with stricter
6148 * typing. Throws if the node's type does not match.
6149 */
6150
6151 function assertAtomFamily(node, family) {
6152 var typedNode = checkAtomFamily(node, family);
6153
6154 if (!typedNode) {
6155 throw new Error("Expected node of type \"atom\" and family \"" + family + "\", but got " + (node ? node.type === "atom" ? "atom of family " + node.family : "node of type " + node.type : String(node)));
6156 }
6157
6158 return typedNode;
6159 }
6160 /**
6161 * Returns the node more strictly typed iff it is of the given type. Otherwise,
6162 * returns null.
6163 */
6164
6165 function checkAtomFamily(node, family) {
6166 return node && node.type === "atom" && node.family === family ? node : null;
6167 }
6168 /**
6169 * Returns the node more strictly typed iff it is of the given type. Otherwise,
6170 * returns null.
6171 */
6172
6173 function assertSymbolNodeType(node) {
6174 var typedNode = checkSymbolNodeType(node);
6175
6176 if (!typedNode) {
6177 throw new Error("Expected node of symbol group type, but got " + (node ? "node of type " + node.type : String(node)));
6178 }
6179
6180 return typedNode;
6181 }
6182 /**
6183 * Returns the node more strictly typed iff it is of the given type. Otherwise,
6184 * returns null.
6185 */
6186
6187 function checkSymbolNodeType(node) {
6188 if (node && (node.type === "atom" || NON_ATOMS.hasOwnProperty(node.type))) {
6189 // $FlowFixMe
6190 return node;
6191 }
6192
6193 return null;
6194 }
6195 // CONCATENATED MODULE: ./src/spacingData.js
6196 /**
6197 * Describes spaces between different classes of atoms.
6198 */
6199 var thinspace = {
6200 number: 3,
6201 unit: "mu"
6202 };
6203 var mediumspace = {
6204 number: 4,
6205 unit: "mu"
6206 };
6207 var thickspace = {
6208 number: 5,
6209 unit: "mu"
6210 }; // Making the type below exact with all optional fields doesn't work due to
6211 // - https://github.com/facebook/flow/issues/4582
6212 // - https://github.com/facebook/flow/issues/5688
6213 // However, since *all* fields are optional, $Shape<> works as suggested in 5688
6214 // above.
6215
6216 // Spacing relationships for display and text styles
6217 var spacings = {
6218 mord: {
6219 mop: thinspace,
6220 mbin: mediumspace,
6221 mrel: thickspace,
6222 minner: thinspace
6223 },
6224 mop: {
6225 mord: thinspace,
6226 mop: thinspace,
6227 mrel: thickspace,
6228 minner: thinspace
6229 },
6230 mbin: {
6231 mord: mediumspace,
6232 mop: mediumspace,
6233 mopen: mediumspace,
6234 minner: mediumspace
6235 },
6236 mrel: {
6237 mord: thickspace,
6238 mop: thickspace,
6239 mopen: thickspace,
6240 minner: thickspace
6241 },
6242 mopen: {},
6243 mclose: {
6244 mop: thinspace,
6245 mbin: mediumspace,
6246 mrel: thickspace,
6247 minner: thinspace
6248 },
6249 mpunct: {
6250 mord: thinspace,
6251 mop: thinspace,
6252 mrel: thickspace,
6253 mopen: thinspace,
6254 mclose: thinspace,
6255 mpunct: thinspace,
6256 minner: thinspace
6257 },
6258 minner: {
6259 mord: thinspace,
6260 mop: thinspace,
6261 mbin: mediumspace,
6262 mrel: thickspace,
6263 mopen: thinspace,
6264 mpunct: thinspace,
6265 minner: thinspace
6266 }
6267 }; // Spacing relationships for script and scriptscript styles
6268
6269 var tightSpacings = {
6270 mord: {
6271 mop: thinspace
6272 },
6273 mop: {
6274 mord: thinspace,
6275 mop: thinspace
6276 },
6277 mbin: {},
6278 mrel: {},
6279 mopen: {},
6280 mclose: {
6281 mop: thinspace
6282 },
6283 mpunct: {},
6284 minner: {
6285 mop: thinspace
6286 }
6287 };
6288 // CONCATENATED MODULE: ./src/defineFunction.js
6289
6290
6291 /**
6292 * All registered functions.
6293 * `functions.js` just exports this same dictionary again and makes it public.
6294 * `Parser.js` requires this dictionary.
6295 */
6296 var _functions = {};
6297 /**
6298 * All HTML builders. Should be only used in the `define*` and the `build*ML`
6299 * functions.
6300 */
6301
6302 var _htmlGroupBuilders = {};
6303 /**
6304 * All MathML builders. Should be only used in the `define*` and the `build*ML`
6305 * functions.
6306 */
6307
6308 var _mathmlGroupBuilders = {};
6309 function defineFunction(_ref) {
6310 var type = _ref.type,
6311 names = _ref.names,
6312 props = _ref.props,
6313 handler = _ref.handler,
6314 htmlBuilder = _ref.htmlBuilder,
6315 mathmlBuilder = _ref.mathmlBuilder;
6316 // Set default values of functions
6317 var data = {
6318 type: type,
6319 numArgs: props.numArgs,
6320 argTypes: props.argTypes,
6321 greediness: props.greediness === undefined ? 1 : props.greediness,
6322 allowedInText: !!props.allowedInText,
6323 allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath,
6324 numOptionalArgs: props.numOptionalArgs || 0,
6325 infix: !!props.infix,
6326 handler: handler
6327 };
6328
6329 for (var i = 0; i < names.length; ++i) {
6330 _functions[names[i]] = data;
6331 }
6332
6333 if (type) {
6334 if (htmlBuilder) {
6335 _htmlGroupBuilders[type] = htmlBuilder;
6336 }
6337
6338 if (mathmlBuilder) {
6339 _mathmlGroupBuilders[type] = mathmlBuilder;
6340 }
6341 }
6342 }
6343 /**
6344 * Use this to register only the HTML and MathML builders for a function (e.g.
6345 * if the function's ParseNode is generated in Parser.js rather than via a
6346 * stand-alone handler provided to `defineFunction`).
6347 */
6348
6349 function defineFunctionBuilders(_ref2) {
6350 var type = _ref2.type,
6351 htmlBuilder = _ref2.htmlBuilder,
6352 mathmlBuilder = _ref2.mathmlBuilder;
6353 defineFunction({
6354 type: type,
6355 names: [],
6356 props: {
6357 numArgs: 0
6358 },
6359 handler: function handler() {
6360 throw new Error('Should never be called.');
6361 },
6362 htmlBuilder: htmlBuilder,
6363 mathmlBuilder: mathmlBuilder
6364 });
6365 } // Since the corresponding buildHTML/buildMathML function expects a
6366 // list of elements, we normalize for different kinds of arguments
6367
6368 var defineFunction_ordargument = function ordargument(arg) {
6369 var node = checkNodeType(arg, "ordgroup");
6370 return node ? node.body : [arg];
6371 };
6372 // CONCATENATED MODULE: ./src/buildHTML.js
6373 /**
6374 * This file does the main work of building a domTree structure from a parse
6375 * tree. The entry point is the `buildHTML` function, which takes a parse tree.
6376 * Then, the buildExpression, buildGroup, and various groupBuilders functions
6377 * are called, to produce a final HTML tree.
6378 */
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388 var buildHTML_makeSpan = buildCommon.makeSpan; // Binary atoms (first class `mbin`) change into ordinary atoms (`mord`)
6389 // depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6,
6390 // and the text before Rule 19.
6391
6392 var binLeftCanceller = ["leftmost", "mbin", "mopen", "mrel", "mop", "mpunct"];
6393 var binRightCanceller = ["rightmost", "mrel", "mclose", "mpunct"];
6394 var styleMap = {
6395 "display": src_Style.DISPLAY,
6396 "text": src_Style.TEXT,
6397 "script": src_Style.SCRIPT,
6398 "scriptscript": src_Style.SCRIPTSCRIPT
6399 };
6400 var DomEnum = {
6401 mord: "mord",
6402 mop: "mop",
6403 mbin: "mbin",
6404 mrel: "mrel",
6405 mopen: "mopen",
6406 mclose: "mclose",
6407 mpunct: "mpunct",
6408 minner: "minner"
6409 };
6410
6411 /**
6412 * Take a list of nodes, build them in order, and return a list of the built
6413 * nodes. documentFragments are flattened into their contents, so the
6414 * returned list contains no fragments. `isRealGroup` is true if `expression`
6415 * is a real group (no atoms will be added on either side), as opposed to
6416 * a partial group (e.g. one created by \color). `surrounding` is an array
6417 * consisting type of nodes that will be added to the left and right.
6418 */
6419 var buildHTML_buildExpression = function buildExpression(expression, options, isRealGroup, surrounding) {
6420 if (surrounding === void 0) {
6421 surrounding = [null, null];
6422 }
6423
6424 // Parse expressions into `groups`.
6425 var groups = [];
6426
6427 for (var i = 0; i < expression.length; i++) {
6428 var output = buildHTML_buildGroup(expression[i], options);
6429
6430 if (output instanceof tree_DocumentFragment) {
6431 var children = output.children;
6432 groups.push.apply(groups, children);
6433 } else {
6434 groups.push(output);
6435 }
6436 } // If `expression` is a partial group, let the parent handle spacings
6437 // to avoid processing groups multiple times.
6438
6439
6440 if (!isRealGroup) {
6441 return groups;
6442 }
6443
6444 var glueOptions = options;
6445
6446 if (expression.length === 1) {
6447 var node = checkNodeType(expression[0], "sizing") || checkNodeType(expression[0], "styling");
6448
6449 if (!node) {// No match.
6450 } else if (node.type === "sizing") {
6451 glueOptions = options.havingSize(node.size);
6452 } else if (node.type === "styling") {
6453 glueOptions = options.havingStyle(styleMap[node.style]);
6454 }
6455 } // Dummy spans for determining spacings between surrounding atoms.
6456 // If `expression` has no atoms on the left or right, class "leftmost"
6457 // or "rightmost", respectively, is used to indicate it.
6458
6459
6460 var dummyPrev = buildHTML_makeSpan([surrounding[0] || "leftmost"], [], options);
6461 var dummyNext = buildHTML_makeSpan([surrounding[1] || "rightmost"], [], options); // TODO: These code assumes that a node's math class is the first element
6462 // of its `classes` array. A later cleanup should ensure this, for
6463 // instance by changing the signature of `makeSpan`.
6464 // Before determining what spaces to insert, perform bin cancellation.
6465 // Binary operators change to ordinary symbols in some contexts.
6466
6467 traverseNonSpaceNodes(groups, function (node, prev) {
6468 var prevType = prev.classes[0];
6469 var type = node.classes[0];
6470
6471 if (prevType === "mbin" && utils.contains(binRightCanceller, type)) {
6472 prev.classes[0] = "mord";
6473 } else if (type === "mbin" && utils.contains(binLeftCanceller, prevType)) {
6474 node.classes[0] = "mord";
6475 }
6476 }, {
6477 node: dummyPrev
6478 }, dummyNext);
6479 traverseNonSpaceNodes(groups, function (node, prev) {
6480 var prevType = getTypeOfDomTree(prev);
6481 var type = getTypeOfDomTree(node); // 'mtight' indicates that the node is script or scriptscript style.
6482
6483 var space = prevType && type ? node.hasClass("mtight") ? tightSpacings[prevType][type] : spacings[prevType][type] : null;
6484
6485 if (space) {
6486 // Insert glue (spacing) after the `prev`.
6487 return buildCommon.makeGlue(space, glueOptions);
6488 }
6489 }, {
6490 node: dummyPrev
6491 }, dummyNext);
6492 return groups;
6493 }; // Depth-first traverse non-space `nodes`, calling `callback` with the current and
6494 // previous node as arguments, optionally returning a node to insert after the
6495 // previous node. `prev` is an object with the previous node and `insertAfter`
6496 // function to insert after it. `next` is a node that will be added to the right.
6497 // Used for bin cancellation and inserting spacings.
6498
6499 var traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next) {
6500 if (next) {
6501 // temporarily append the right node, if exists
6502 nodes.push(next);
6503 }
6504
6505 var i = 0;
6506
6507 for (; i < nodes.length; i++) {
6508 var node = nodes[i];
6509 var partialGroup = buildHTML_checkPartialGroup(node);
6510
6511 if (partialGroup) {
6512 // Recursive DFS
6513 // $FlowFixMe: make nodes a $ReadOnlyArray by returning a new array
6514 traverseNonSpaceNodes(partialGroup.children, callback, prev);
6515 continue;
6516 } // Ignore explicit spaces (e.g., \;, \,) when determining what implicit
6517 // spacing should go between atoms of different classes
6518
6519
6520 if (node.classes[0] === "mspace") {
6521 continue;
6522 }
6523
6524 var result = callback(node, prev.node);
6525
6526 if (result) {
6527 if (prev.insertAfter) {
6528 prev.insertAfter(result);
6529 } else {
6530 // insert at front
6531 nodes.unshift(result);
6532 i++;
6533 }
6534 }
6535
6536 prev.node = node;
6537
6538 prev.insertAfter = function (index) {
6539 return function (n) {
6540 nodes.splice(index + 1, 0, n);
6541 i++;
6542 };
6543 }(i);
6544 }
6545
6546 if (next) {
6547 nodes.pop();
6548 }
6549 }; // Check if given node is a partial group, i.e., does not affect spacing around.
6550
6551
6552 var buildHTML_checkPartialGroup = function checkPartialGroup(node) {
6553 if (node instanceof tree_DocumentFragment || node instanceof domTree_Anchor) {
6554 return node;
6555 }
6556
6557 return null;
6558 }; // Return the outermost node of a domTree.
6559
6560
6561 var getOutermostNode = function getOutermostNode(node, side) {
6562 var partialGroup = buildHTML_checkPartialGroup(node);
6563
6564 if (partialGroup) {
6565 var children = partialGroup.children;
6566
6567 if (children.length) {
6568 if (side === "right") {
6569 return getOutermostNode(children[children.length - 1], "right");
6570 } else if (side === "left") {
6571 return getOutermostNode(children[0], "left");
6572 }
6573 }
6574 }
6575
6576 return node;
6577 }; // Return math atom class (mclass) of a domTree.
6578 // If `side` is given, it will get the type of the outermost node at given side.
6579
6580
6581 var getTypeOfDomTree = function getTypeOfDomTree(node, side) {
6582 if (!node) {
6583 return null;
6584 }
6585
6586 if (side) {
6587 node = getOutermostNode(node, side);
6588 } // This makes a lot of assumptions as to where the type of atom
6589 // appears. We should do a better job of enforcing this.
6590
6591
6592 return DomEnum[node.classes[0]] || null;
6593 };
6594 var makeNullDelimiter = function makeNullDelimiter(options, classes) {
6595 var moreClasses = ["nulldelimiter"].concat(options.baseSizingClasses());
6596 return buildHTML_makeSpan(classes.concat(moreClasses));
6597 };
6598 /**
6599 * buildGroup is the function that takes a group and calls the correct groupType
6600 * function for it. It also handles the interaction of size and style changes
6601 * between parents and children.
6602 */
6603
6604 var buildHTML_buildGroup = function buildGroup(group, options, baseOptions) {
6605 if (!group) {
6606 return buildHTML_makeSpan();
6607 }
6608
6609 if (_htmlGroupBuilders[group.type]) {
6610 // Call the groupBuilders function
6611 var groupNode = _htmlGroupBuilders[group.type](group, options); // If the size changed between the parent and the current group, account
6612 // for that size difference.
6613
6614 if (baseOptions && options.size !== baseOptions.size) {
6615 groupNode = buildHTML_makeSpan(options.sizingClasses(baseOptions), [groupNode], options);
6616 var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier;
6617 groupNode.height *= multiplier;
6618 groupNode.depth *= multiplier;
6619 }
6620
6621 return groupNode;
6622 } else {
6623 throw new src_ParseError("Got group of unknown type: '" + group.type + "'");
6624 }
6625 };
6626 /**
6627 * Combine an array of HTML DOM nodes (e.g., the output of `buildExpression`)
6628 * into an unbreakable HTML node of class .base, with proper struts to
6629 * guarantee correct vertical extent. `buildHTML` calls this repeatedly to
6630 * make up the entire expression as a sequence of unbreakable units.
6631 */
6632
6633 function buildHTMLUnbreakable(children, options) {
6634 // Compute height and depth of this chunk.
6635 var body = buildHTML_makeSpan(["base"], children, options); // Add strut, which ensures that the top of the HTML element falls at
6636 // the height of the expression, and the bottom of the HTML element
6637 // falls at the depth of the expression.
6638 // We used to have separate top and bottom struts, where the bottom strut
6639 // would like to use `vertical-align: top`, but in IE 9 this lowers the
6640 // baseline of the box to the bottom of this strut (instead of staying in
6641 // the normal place) so we use an absolute value for vertical-align instead.
6642
6643 var strut = buildHTML_makeSpan(["strut"]);
6644 strut.style.height = body.height + body.depth + "em";
6645 strut.style.verticalAlign = -body.depth + "em";
6646 body.children.unshift(strut);
6647 return body;
6648 }
6649 /**
6650 * Take an entire parse tree, and build it into an appropriate set of HTML
6651 * nodes.
6652 */
6653
6654
6655 function buildHTML(tree, options) {
6656 // Strip off outer tag wrapper for processing below.
6657 var tag = null;
6658
6659 if (tree.length === 1 && tree[0].type === "tag") {
6660 tag = tree[0].tag;
6661 tree = tree[0].body;
6662 } // Build the expression contained in the tree
6663
6664
6665 var expression = buildHTML_buildExpression(tree, options, true);
6666 var children = []; // Create one base node for each chunk between potential line breaks.
6667 // The TeXBook [p.173] says "A formula will be broken only after a
6668 // relation symbol like $=$ or $<$ or $\rightarrow$, or after a binary
6669 // operation symbol like $+$ or $-$ or $\times$, where the relation or
6670 // binary operation is on the ``outer level'' of the formula (i.e., not
6671 // enclosed in {...} and not part of an \over construction)."
6672
6673 var parts = [];
6674
6675 for (var i = 0; i < expression.length; i++) {
6676 parts.push(expression[i]);
6677
6678 if (expression[i].hasClass("mbin") || expression[i].hasClass("mrel") || expression[i].hasClass("allowbreak")) {
6679 // Put any post-operator glue on same line as operator.
6680 // Watch for \nobreak along the way, and stop at \newline.
6681 var nobreak = false;
6682
6683 while (i < expression.length - 1 && expression[i + 1].hasClass("mspace") && !expression[i + 1].hasClass("newline")) {
6684 i++;
6685 parts.push(expression[i]);
6686
6687 if (expression[i].hasClass("nobreak")) {
6688 nobreak = true;
6689 }
6690 } // Don't allow break if \nobreak among the post-operator glue.
6691
6692
6693 if (!nobreak) {
6694 children.push(buildHTMLUnbreakable(parts, options));
6695 parts = [];
6696 }
6697 } else if (expression[i].hasClass("newline")) {
6698 // Write the line except the newline
6699 parts.pop();
6700
6701 if (parts.length > 0) {
6702 children.push(buildHTMLUnbreakable(parts, options));
6703 parts = [];
6704 } // Put the newline at the top level
6705
6706
6707 children.push(expression[i]);
6708 }
6709 }
6710
6711 if (parts.length > 0) {
6712 children.push(buildHTMLUnbreakable(parts, options));
6713 } // Now, if there was a tag, build it too and append it as a final child.
6714
6715
6716 var tagChild;
6717
6718 if (tag) {
6719 tagChild = buildHTMLUnbreakable(buildHTML_buildExpression(tag, options, true));
6720 tagChild.classes = ["tag"];
6721 children.push(tagChild);
6722 }
6723
6724 var htmlNode = buildHTML_makeSpan(["katex-html"], children);
6725 htmlNode.setAttribute("aria-hidden", "true"); // Adjust the strut of the tag to be the maximum height of all children
6726 // (the height of the enclosing htmlNode) for proper vertical alignment.
6727
6728 if (tagChild) {
6729 var strut = tagChild.children[0];
6730 strut.style.height = htmlNode.height + htmlNode.depth + "em";
6731 strut.style.verticalAlign = -htmlNode.depth + "em";
6732 }
6733
6734 return htmlNode;
6735 }
6736 // CONCATENATED MODULE: ./src/mathMLTree.js
6737 /**
6738 * These objects store data about MathML nodes. This is the MathML equivalent
6739 * of the types in domTree.js. Since MathML handles its own rendering, and
6740 * since we're mainly using MathML to improve accessibility, we don't manage
6741 * any of the styling state that the plain DOM nodes do.
6742 *
6743 * The `toNode` and `toMarkup` functions work simlarly to how they do in
6744 * domTree.js, creating namespaced DOM nodes and HTML text markup respectively.
6745 */
6746
6747
6748 function newDocumentFragment(children) {
6749 return new tree_DocumentFragment(children);
6750 }
6751 /**
6752 * This node represents a general purpose MathML node of any type. The
6753 * constructor requires the type of node to create (for example, `"mo"` or
6754 * `"mspace"`, corresponding to `<mo>` and `<mspace>` tags).
6755 */
6756
6757 var mathMLTree_MathNode =
6758 /*#__PURE__*/
6759 function () {
6760 function MathNode(type, children) {
6761 this.type = void 0;
6762 this.attributes = void 0;
6763 this.children = void 0;
6764 this.type = type;
6765 this.attributes = {};
6766 this.children = children || [];
6767 }
6768 /**
6769 * Sets an attribute on a MathML node. MathML depends on attributes to convey a
6770 * semantic content, so this is used heavily.
6771 */
6772
6773
6774 var _proto = MathNode.prototype;
6775
6776 _proto.setAttribute = function setAttribute(name, value) {
6777 this.attributes[name] = value;
6778 }
6779 /**
6780 * Gets an attribute on a MathML node.
6781 */
6782 ;
6783
6784 _proto.getAttribute = function getAttribute(name) {
6785 return this.attributes[name];
6786 }
6787 /**
6788 * Converts the math node into a MathML-namespaced DOM element.
6789 */
6790 ;
6791
6792 _proto.toNode = function toNode() {
6793 var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type);
6794
6795 for (var attr in this.attributes) {
6796 if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
6797 node.setAttribute(attr, this.attributes[attr]);
6798 }
6799 }
6800
6801 for (var i = 0; i < this.children.length; i++) {
6802 node.appendChild(this.children[i].toNode());
6803 }
6804
6805 return node;
6806 }
6807 /**
6808 * Converts the math node into an HTML markup string.
6809 */
6810 ;
6811
6812 _proto.toMarkup = function toMarkup() {
6813 var markup = "<" + this.type; // Add the attributes
6814
6815 for (var attr in this.attributes) {
6816 if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
6817 markup += " " + attr + "=\"";
6818 markup += utils.escape(this.attributes[attr]);
6819 markup += "\"";
6820 }
6821 }
6822
6823 markup += ">";
6824
6825 for (var i = 0; i < this.children.length; i++) {
6826 markup += this.children[i].toMarkup();
6827 }
6828
6829 markup += "</" + this.type + ">";
6830 return markup;
6831 }
6832 /**
6833 * Converts the math node into a string, similar to innerText, but escaped.
6834 */
6835 ;
6836
6837 _proto.toText = function toText() {
6838 return this.children.map(function (child) {
6839 return child.toText();
6840 }).join("");
6841 };
6842
6843 return MathNode;
6844 }();
6845 /**
6846 * This node represents a piece of text.
6847 */
6848
6849 var mathMLTree_TextNode =
6850 /*#__PURE__*/
6851 function () {
6852 function TextNode(text) {
6853 this.text = void 0;
6854 this.text = text;
6855 }
6856 /**
6857 * Converts the text node into a DOM text node.
6858 */
6859
6860
6861 var _proto2 = TextNode.prototype;
6862
6863 _proto2.toNode = function toNode() {
6864 return document.createTextNode(this.text);
6865 }
6866 /**
6867 * Converts the text node into escaped HTML markup
6868 * (representing the text itself).
6869 */
6870 ;
6871
6872 _proto2.toMarkup = function toMarkup() {
6873 return utils.escape(this.toText());
6874 }
6875 /**
6876 * Converts the text node into a string
6877 * (representing the text iteself).
6878 */
6879 ;
6880
6881 _proto2.toText = function toText() {
6882 return this.text;
6883 };
6884
6885 return TextNode;
6886 }();
6887 /**
6888 * This node represents a space, but may render as <mspace.../> or as text,
6889 * depending on the width.
6890 */
6891
6892 var SpaceNode =
6893 /*#__PURE__*/
6894 function () {
6895 /**
6896 * Create a Space node with width given in CSS ems.
6897 */
6898 function SpaceNode(width) {
6899 this.width = void 0;
6900 this.character = void 0;
6901 this.width = width; // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html
6902 // for a table of space-like characters. We use Unicode
6903 // representations instead of &LongNames; as it's not clear how to
6904 // make the latter via document.createTextNode.
6905
6906 if (width >= 0.05555 && width <= 0.05556) {
6907 this.character = "\u200A"; // &VeryThinSpace;
6908 } else if (width >= 0.1666 && width <= 0.1667) {
6909 this.character = "\u2009"; // &ThinSpace;
6910 } else if (width >= 0.2222 && width <= 0.2223) {
6911 this.character = "\u2005"; // &MediumSpace;
6912 } else if (width >= 0.2777 && width <= 0.2778) {
6913 this.character = "\u2005\u200A"; // &ThickSpace;
6914 } else if (width >= -0.05556 && width <= -0.05555) {
6915 this.character = "\u200A\u2063"; // &NegativeVeryThinSpace;
6916 } else if (width >= -0.1667 && width <= -0.1666) {
6917 this.character = "\u2009\u2063"; // &NegativeThinSpace;
6918 } else if (width >= -0.2223 && width <= -0.2222) {
6919 this.character = "\u205F\u2063"; // &NegativeMediumSpace;
6920 } else if (width >= -0.2778 && width <= -0.2777) {
6921 this.character = "\u2005\u2063"; // &NegativeThickSpace;
6922 } else {
6923 this.character = null;
6924 }
6925 }
6926 /**
6927 * Converts the math node into a MathML-namespaced DOM element.
6928 */
6929
6930
6931 var _proto3 = SpaceNode.prototype;
6932
6933 _proto3.toNode = function toNode() {
6934 if (this.character) {
6935 return document.createTextNode(this.character);
6936 } else {
6937 var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mspace");
6938 node.setAttribute("width", this.width + "em");
6939 return node;
6940 }
6941 }
6942 /**
6943 * Converts the math node into an HTML markup string.
6944 */
6945 ;
6946
6947 _proto3.toMarkup = function toMarkup() {
6948 if (this.character) {
6949 return "<mtext>" + this.character + "</mtext>";
6950 } else {
6951 return "<mspace width=\"" + this.width + "em\"/>";
6952 }
6953 }
6954 /**
6955 * Converts the math node into a string, similar to innerText.
6956 */
6957 ;
6958
6959 _proto3.toText = function toText() {
6960 if (this.character) {
6961 return this.character;
6962 } else {
6963 return " ";
6964 }
6965 };
6966
6967 return SpaceNode;
6968 }();
6969
6970 /* harmony default export */ var mathMLTree = ({
6971 MathNode: mathMLTree_MathNode,
6972 TextNode: mathMLTree_TextNode,
6973 SpaceNode: SpaceNode,
6974 newDocumentFragment: newDocumentFragment
6975 });
6976 // CONCATENATED MODULE: ./src/buildMathML.js
6977 /**
6978 * This file converts a parse tree into a cooresponding MathML tree. The main
6979 * entry point is the `buildMathML` function, which takes a parse tree from the
6980 * parser.
6981 */
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991 /**
6992 * Takes a symbol and converts it into a MathML text node after performing
6993 * optional replacement from symbols.js.
6994 */
6995 var buildMathML_makeText = function makeText(text, mode, options) {
6996 if (src_symbols[mode][text] && src_symbols[mode][text].replace && text.charCodeAt(0) !== 0xD835 && !(ligatures.hasOwnProperty(text) && options && (options.fontFamily && options.fontFamily.substr(4, 2) === "tt" || options.font && options.font.substr(4, 2) === "tt"))) {
6997 text = src_symbols[mode][text].replace;
6998 }
6999
7000 return new mathMLTree.TextNode(text);
7001 };
7002 /**
7003 * Wrap the given array of nodes in an <mrow> node if needed, i.e.,
7004 * unless the array has length 1. Always returns a single node.
7005 */
7006
7007 var buildMathML_makeRow = function makeRow(body) {
7008 if (body.length === 1) {
7009 return body[0];
7010 } else {
7011 return new mathMLTree.MathNode("mrow", body);
7012 }
7013 };
7014 /**
7015 * Returns the math variant as a string or null if none is required.
7016 */
7017
7018 var buildMathML_getVariant = function getVariant(group, options) {
7019 // Handle \text... font specifiers as best we can.
7020 // MathML has a limited list of allowable mathvariant specifiers; see
7021 // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt
7022 if (options.fontFamily === "texttt") {
7023 return "monospace";
7024 } else if (options.fontFamily === "textsf") {
7025 if (options.fontShape === "textit" && options.fontWeight === "textbf") {
7026 return "sans-serif-bold-italic";
7027 } else if (options.fontShape === "textit") {
7028 return "sans-serif-italic";
7029 } else if (options.fontWeight === "textbf") {
7030 return "bold-sans-serif";
7031 } else {
7032 return "sans-serif";
7033 }
7034 } else if (options.fontShape === "textit" && options.fontWeight === "textbf") {
7035 return "bold-italic";
7036 } else if (options.fontShape === "textit") {
7037 return "italic";
7038 } else if (options.fontWeight === "textbf") {
7039 return "bold";
7040 }
7041
7042 var font = options.font;
7043
7044 if (!font || font === "mathnormal") {
7045 return null;
7046 }
7047
7048 var mode = group.mode;
7049
7050 if (font === "mathit") {
7051 return "italic";
7052 } else if (font === "boldsymbol") {
7053 return "bold-italic";
7054 } else if (font === "mathbf") {
7055 return "bold";
7056 } else if (font === "mathbb") {
7057 return "double-struck";
7058 } else if (font === "mathfrak") {
7059 return "fraktur";
7060 } else if (font === "mathscr" || font === "mathcal") {
7061 // MathML makes no distinction between script and caligrahpic
7062 return "script";
7063 } else if (font === "mathsf") {
7064 return "sans-serif";
7065 } else if (font === "mathtt") {
7066 return "monospace";
7067 }
7068
7069 var text = group.text;
7070
7071 if (utils.contains(["\\imath", "\\jmath"], text)) {
7072 return null;
7073 }
7074
7075 if (src_symbols[mode][text] && src_symbols[mode][text].replace) {
7076 text = src_symbols[mode][text].replace;
7077 }
7078
7079 var fontName = buildCommon.fontMap[font].fontName;
7080
7081 if (getCharacterMetrics(text, fontName, mode)) {
7082 return buildCommon.fontMap[font].variant;
7083 }
7084
7085 return null;
7086 };
7087 /**
7088 * Takes a list of nodes, builds them, and returns a list of the generated
7089 * MathML nodes. Also combine consecutive <mtext> outputs into a single
7090 * <mtext> tag.
7091 */
7092
7093 var buildMathML_buildExpression = function buildExpression(expression, options, isOrdgroup) {
7094 if (expression.length === 1) {
7095 var group = buildMathML_buildGroup(expression[0], options);
7096
7097 if (isOrdgroup && group instanceof mathMLTree_MathNode && group.type === "mo") {
7098 // When TeX writers want to suppress spacing on an operator,
7099 // they often put the operator by itself inside braces.
7100 group.setAttribute("lspace", "0em");
7101 group.setAttribute("rspace", "0em");
7102 }
7103
7104 return [group];
7105 }
7106
7107 var groups = [];
7108 var lastGroup;
7109
7110 for (var i = 0; i < expression.length; i++) {
7111 var _group = buildMathML_buildGroup(expression[i], options);
7112
7113 if (_group instanceof mathMLTree_MathNode && lastGroup instanceof mathMLTree_MathNode) {
7114 // Concatenate adjacent <mtext>s
7115 if (_group.type === 'mtext' && lastGroup.type === 'mtext' && _group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) {
7116 var _lastGroup$children;
7117
7118 (_lastGroup$children = lastGroup.children).push.apply(_lastGroup$children, _group.children);
7119
7120 continue; // Concatenate adjacent <mn>s
7121 } else if (_group.type === 'mn' && lastGroup.type === 'mn') {
7122 var _lastGroup$children2;
7123
7124 (_lastGroup$children2 = lastGroup.children).push.apply(_lastGroup$children2, _group.children);
7125
7126 continue; // Concatenate <mn>...</mn> followed by <mi>.</mi>
7127 } else if (_group.type === 'mi' && _group.children.length === 1 && lastGroup.type === 'mn') {
7128 var child = _group.children[0];
7129
7130 if (child instanceof mathMLTree_TextNode && child.text === '.') {
7131 var _lastGroup$children3;
7132
7133 (_lastGroup$children3 = lastGroup.children).push.apply(_lastGroup$children3, _group.children);
7134
7135 continue;
7136 }
7137 } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) {
7138 var lastChild = lastGroup.children[0];
7139
7140 if (lastChild instanceof mathMLTree_TextNode && lastChild.text === "\u0338" && (_group.type === 'mo' || _group.type === 'mi' || _group.type === 'mn')) {
7141 var _child = _group.children[0];
7142
7143 if (_child instanceof mathMLTree_TextNode && _child.text.length > 0) {
7144 // Overlay with combining character long solidus
7145 _child.text = _child.text.slice(0, 1) + "\u0338" + _child.text.slice(1);
7146 groups.pop();
7147 }
7148 }
7149 }
7150 }
7151
7152 groups.push(_group);
7153 lastGroup = _group;
7154 }
7155
7156 return groups;
7157 };
7158 /**
7159 * Equivalent to buildExpression, but wraps the elements in an <mrow>
7160 * if there's more than one. Returns a single node instead of an array.
7161 */
7162
7163 var buildExpressionRow = function buildExpressionRow(expression, options, isOrdgroup) {
7164 return buildMathML_makeRow(buildMathML_buildExpression(expression, options, isOrdgroup));
7165 };
7166 /**
7167 * Takes a group from the parser and calls the appropriate groupBuilders function
7168 * on it to produce a MathML node.
7169 */
7170
7171 var buildMathML_buildGroup = function buildGroup(group, options) {
7172 if (!group) {
7173 return new mathMLTree.MathNode("mrow");
7174 }
7175
7176 if (_mathmlGroupBuilders[group.type]) {
7177 // Call the groupBuilders function
7178 var result = _mathmlGroupBuilders[group.type](group, options);
7179 return result;
7180 } else {
7181 throw new src_ParseError("Got group of unknown type: '" + group.type + "'");
7182 }
7183 };
7184 /**
7185 * Takes a full parse tree and settings and builds a MathML representation of
7186 * it. In particular, we put the elements from building the parse tree into a
7187 * <semantics> tag so we can also include that TeX source as an annotation.
7188 *
7189 * Note that we actually return a domTree element with a `<math>` inside it so
7190 * we can do appropriate styling.
7191 */
7192
7193 function buildMathML(tree, texExpression, options, forMathmlOnly) {
7194 var expression = buildMathML_buildExpression(tree, options); // Wrap up the expression in an mrow so it is presented in the semantics
7195 // tag correctly, unless it's a single <mrow> or <mtable>.
7196
7197 var wrapper;
7198
7199 if (expression.length === 1 && expression[0] instanceof mathMLTree_MathNode && utils.contains(["mrow", "mtable"], expression[0].type)) {
7200 wrapper = expression[0];
7201 } else {
7202 wrapper = new mathMLTree.MathNode("mrow", expression);
7203 } // Build a TeX annotation of the source
7204
7205
7206 var annotation = new mathMLTree.MathNode("annotation", [new mathMLTree.TextNode(texExpression)]);
7207 annotation.setAttribute("encoding", "application/x-tex");
7208 var semantics = new mathMLTree.MathNode("semantics", [wrapper, annotation]);
7209 var math = new mathMLTree.MathNode("math", [semantics]);
7210 math.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"); // You can't style <math> nodes, so we wrap the node in a span.
7211 // NOTE: The span class is not typed to have <math> nodes as children, and
7212 // we don't want to make the children type more generic since the children
7213 // of span are expected to have more fields in `buildHtml` contexts.
7214
7215 var wrapperClass = forMathmlOnly ? "katex" : "katex-mathml"; // $FlowFixMe
7216
7217 return buildCommon.makeSpan([wrapperClass], [math]);
7218 }
7219 // CONCATENATED MODULE: ./src/buildTree.js
7220
7221
7222
7223
7224
7225
7226
7227 var buildTree_optionsFromSettings = function optionsFromSettings(settings) {
7228 return new src_Options({
7229 style: settings.displayMode ? src_Style.DISPLAY : src_Style.TEXT,
7230 maxSize: settings.maxSize,
7231 minRuleThickness: settings.minRuleThickness
7232 });
7233 };
7234
7235 var buildTree_displayWrap = function displayWrap(node, settings) {
7236 if (settings.displayMode) {
7237 var classes = ["katex-display"];
7238
7239 if (settings.leqno) {
7240 classes.push("leqno");
7241 }
7242
7243 if (settings.fleqn) {
7244 classes.push("fleqn");
7245 }
7246
7247 node = buildCommon.makeSpan(classes, [node]);
7248 }
7249
7250 return node;
7251 };
7252
7253 var buildTree_buildTree = function buildTree(tree, expression, settings) {
7254 var options = buildTree_optionsFromSettings(settings);
7255 var katexNode;
7256
7257 if (settings.output === "mathml") {
7258 return buildMathML(tree, expression, options, true);
7259 } else if (settings.output === "html") {
7260 var htmlNode = buildHTML(tree, options);
7261 katexNode = buildCommon.makeSpan(["katex"], [htmlNode]);
7262 } else {
7263 var mathMLNode = buildMathML(tree, expression, options, false);
7264
7265 var _htmlNode = buildHTML(tree, options);
7266
7267 katexNode = buildCommon.makeSpan(["katex"], [mathMLNode, _htmlNode]);
7268 }
7269
7270 return buildTree_displayWrap(katexNode, settings);
7271 };
7272 var buildTree_buildHTMLTree = function buildHTMLTree(tree, expression, settings) {
7273 var options = buildTree_optionsFromSettings(settings);
7274 var htmlNode = buildHTML(tree, options);
7275 var katexNode = buildCommon.makeSpan(["katex"], [htmlNode]);
7276 return buildTree_displayWrap(katexNode, settings);
7277 };
7278 /* harmony default export */ var src_buildTree = (buildTree_buildTree);
7279 // CONCATENATED MODULE: ./src/stretchy.js
7280 /**
7281 * This file provides support to buildMathML.js and buildHTML.js
7282 * for stretchy wide elements rendered from SVG files
7283 * and other CSS trickery.
7284 */
7285
7286
7287
7288
7289 var stretchyCodePoint = {
7290 widehat: "^",
7291 widecheck: "ˇ",
7292 widetilde: "~",
7293 utilde: "~",
7294 overleftarrow: "\u2190",
7295 underleftarrow: "\u2190",
7296 xleftarrow: "\u2190",
7297 overrightarrow: "\u2192",
7298 underrightarrow: "\u2192",
7299 xrightarrow: "\u2192",
7300 underbrace: "\u23DF",
7301 overbrace: "\u23DE",
7302 overgroup: "\u23E0",
7303 undergroup: "\u23E1",
7304 overleftrightarrow: "\u2194",
7305 underleftrightarrow: "\u2194",
7306 xleftrightarrow: "\u2194",
7307 Overrightarrow: "\u21D2",
7308 xRightarrow: "\u21D2",
7309 overleftharpoon: "\u21BC",
7310 xleftharpoonup: "\u21BC",
7311 overrightharpoon: "\u21C0",
7312 xrightharpoonup: "\u21C0",
7313 xLeftarrow: "\u21D0",
7314 xLeftrightarrow: "\u21D4",
7315 xhookleftarrow: "\u21A9",
7316 xhookrightarrow: "\u21AA",
7317 xmapsto: "\u21A6",
7318 xrightharpoondown: "\u21C1",
7319 xleftharpoondown: "\u21BD",
7320 xrightleftharpoons: "\u21CC",
7321 xleftrightharpoons: "\u21CB",
7322 xtwoheadleftarrow: "\u219E",
7323 xtwoheadrightarrow: "\u21A0",
7324 xlongequal: "=",
7325 xtofrom: "\u21C4",
7326 xrightleftarrows: "\u21C4",
7327 xrightequilibrium: "\u21CC",
7328 // Not a perfect match.
7329 xleftequilibrium: "\u21CB" // None better available.
7330
7331 };
7332
7333 var stretchy_mathMLnode = function mathMLnode(label) {
7334 var node = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(stretchyCodePoint[label.substr(1)])]);
7335 node.setAttribute("stretchy", "true");
7336 return node;
7337 }; // Many of the KaTeX SVG images have been adapted from glyphs in KaTeX fonts.
7338 // Copyright (c) 2009-2010, Design Science, Inc. (<www.mathjax.org>)
7339 // Copyright (c) 2014-2017 Khan Academy (<www.khanacademy.org>)
7340 // Licensed under the SIL Open Font License, Version 1.1.
7341 // See \nhttp://scripts.sil.org/OFL
7342 // Very Long SVGs
7343 // Many of the KaTeX stretchy wide elements use a long SVG image and an
7344 // overflow: hidden tactic to achieve a stretchy image while avoiding
7345 // distortion of arrowheads or brace corners.
7346 // The SVG typically contains a very long (400 em) arrow.
7347 // The SVG is in a container span that has overflow: hidden, so the span
7348 // acts like a window that exposes only part of the SVG.
7349 // The SVG always has a longer, thinner aspect ratio than the container span.
7350 // After the SVG fills 100% of the height of the container span,
7351 // there is a long arrow shaft left over. That left-over shaft is not shown.
7352 // Instead, it is sliced off because the span's CSS has overflow: hidden.
7353 // Thus, the reader sees an arrow that matches the subject matter width
7354 // without distortion.
7355 // Some functions, such as \cancel, need to vary their aspect ratio. These
7356 // functions do not get the overflow SVG treatment.
7357 // Second Brush Stroke
7358 // Low resolution monitors struggle to display images in fine detail.
7359 // So browsers apply anti-aliasing. A long straight arrow shaft therefore
7360 // will sometimes appear as if it has a blurred edge.
7361 // To mitigate this, these SVG files contain a second "brush-stroke" on the
7362 // arrow shafts. That is, a second long thin rectangular SVG path has been
7363 // written directly on top of each arrow shaft. This reinforcement causes
7364 // some of the screen pixels to display as black instead of the anti-aliased
7365 // gray pixel that a single path would generate. So we get arrow shafts
7366 // whose edges appear to be sharper.
7367 // In the katexImagesData object just below, the dimensions all
7368 // correspond to path geometry inside the relevant SVG.
7369 // For example, \overrightarrow uses the same arrowhead as glyph U+2192
7370 // from the KaTeX Main font. The scaling factor is 1000.
7371 // That is, inside the font, that arrowhead is 522 units tall, which
7372 // corresponds to 0.522 em inside the document.
7373
7374
7375 var katexImagesData = {
7376 // path(s), minWidth, height, align
7377 overrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"],
7378 overleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"],
7379 underrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"],
7380 underleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"],
7381 xrightarrow: [["rightarrow"], 1.469, 522, "xMaxYMin"],
7382 xleftarrow: [["leftarrow"], 1.469, 522, "xMinYMin"],
7383 Overrightarrow: [["doublerightarrow"], 0.888, 560, "xMaxYMin"],
7384 xRightarrow: [["doublerightarrow"], 1.526, 560, "xMaxYMin"],
7385 xLeftarrow: [["doubleleftarrow"], 1.526, 560, "xMinYMin"],
7386 overleftharpoon: [["leftharpoon"], 0.888, 522, "xMinYMin"],
7387 xleftharpoonup: [["leftharpoon"], 0.888, 522, "xMinYMin"],
7388 xleftharpoondown: [["leftharpoondown"], 0.888, 522, "xMinYMin"],
7389 overrightharpoon: [["rightharpoon"], 0.888, 522, "xMaxYMin"],
7390 xrightharpoonup: [["rightharpoon"], 0.888, 522, "xMaxYMin"],
7391 xrightharpoondown: [["rightharpoondown"], 0.888, 522, "xMaxYMin"],
7392 xlongequal: [["longequal"], 0.888, 334, "xMinYMin"],
7393 xtwoheadleftarrow: [["twoheadleftarrow"], 0.888, 334, "xMinYMin"],
7394 xtwoheadrightarrow: [["twoheadrightarrow"], 0.888, 334, "xMaxYMin"],
7395 overleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522],
7396 overbrace: [["leftbrace", "midbrace", "rightbrace"], 1.6, 548],
7397 underbrace: [["leftbraceunder", "midbraceunder", "rightbraceunder"], 1.6, 548],
7398 underleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522],
7399 xleftrightarrow: [["leftarrow", "rightarrow"], 1.75, 522],
7400 xLeftrightarrow: [["doubleleftarrow", "doublerightarrow"], 1.75, 560],
7401 xrightleftharpoons: [["leftharpoondownplus", "rightharpoonplus"], 1.75, 716],
7402 xleftrightharpoons: [["leftharpoonplus", "rightharpoondownplus"], 1.75, 716],
7403 xhookleftarrow: [["leftarrow", "righthook"], 1.08, 522],
7404 xhookrightarrow: [["lefthook", "rightarrow"], 1.08, 522],
7405 overlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522],
7406 underlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522],
7407 overgroup: [["leftgroup", "rightgroup"], 0.888, 342],
7408 undergroup: [["leftgroupunder", "rightgroupunder"], 0.888, 342],
7409 xmapsto: [["leftmapsto", "rightarrow"], 1.5, 522],
7410 xtofrom: [["leftToFrom", "rightToFrom"], 1.75, 528],
7411 // The next three arrows are from the mhchem package.
7412 // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the
7413 // document as \xrightarrow or \xrightleftharpoons. Those have
7414 // min-length = 1.75em, so we set min-length on these next three to match.
7415 xrightleftarrows: [["baraboveleftarrow", "rightarrowabovebar"], 1.75, 901],
7416 xrightequilibrium: [["baraboveshortleftharpoon", "rightharpoonaboveshortbar"], 1.75, 716],
7417 xleftequilibrium: [["shortbaraboveleftharpoon", "shortrightharpoonabovebar"], 1.75, 716]
7418 };
7419
7420 var groupLength = function groupLength(arg) {
7421 if (arg.type === "ordgroup") {
7422 return arg.body.length;
7423 } else {
7424 return 1;
7425 }
7426 };
7427
7428 var stretchy_svgSpan = function svgSpan(group, options) {
7429 // Create a span with inline SVG for the element.
7430 function buildSvgSpan_() {
7431 var viewBoxWidth = 400000; // default
7432
7433 var label = group.label.substr(1);
7434
7435 if (utils.contains(["widehat", "widecheck", "widetilde", "utilde"], label)) {
7436 // Each type in the `if` statement corresponds to one of the ParseNode
7437 // types below. This narrowing is required to access `grp.base`.
7438 var grp = group; // There are four SVG images available for each function.
7439 // Choose a taller image when there are more characters.
7440
7441 var numChars = groupLength(grp.base);
7442 var viewBoxHeight;
7443 var pathName;
7444
7445 var _height;
7446
7447 if (numChars > 5) {
7448 if (label === "widehat" || label === "widecheck") {
7449 viewBoxHeight = 420;
7450 viewBoxWidth = 2364;
7451 _height = 0.42;
7452 pathName = label + "4";
7453 } else {
7454 viewBoxHeight = 312;
7455 viewBoxWidth = 2340;
7456 _height = 0.34;
7457 pathName = "tilde4";
7458 }
7459 } else {
7460 var imgIndex = [1, 1, 2, 2, 3, 3][numChars];
7461
7462 if (label === "widehat" || label === "widecheck") {
7463 viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex];
7464 viewBoxHeight = [0, 239, 300, 360, 420][imgIndex];
7465 _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex];
7466 pathName = label + imgIndex;
7467 } else {
7468 viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex];
7469 viewBoxHeight = [0, 260, 286, 306, 312][imgIndex];
7470 _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex];
7471 pathName = "tilde" + imgIndex;
7472 }
7473 }
7474
7475 var path = new domTree_PathNode(pathName);
7476 var svgNode = new SvgNode([path], {
7477 "width": "100%",
7478 "height": _height + "em",
7479 "viewBox": "0 0 " + viewBoxWidth + " " + viewBoxHeight,
7480 "preserveAspectRatio": "none"
7481 });
7482 return {
7483 span: buildCommon.makeSvgSpan([], [svgNode], options),
7484 minWidth: 0,
7485 height: _height
7486 };
7487 } else {
7488 var spans = [];
7489 var data = katexImagesData[label];
7490 var paths = data[0],
7491 _minWidth = data[1],
7492 _viewBoxHeight = data[2];
7493
7494 var _height2 = _viewBoxHeight / 1000;
7495
7496 var numSvgChildren = paths.length;
7497 var widthClasses;
7498 var aligns;
7499
7500 if (numSvgChildren === 1) {
7501 // $FlowFixMe: All these cases must be of the 4-tuple type.
7502 var align1 = data[3];
7503 widthClasses = ["hide-tail"];
7504 aligns = [align1];
7505 } else if (numSvgChildren === 2) {
7506 widthClasses = ["halfarrow-left", "halfarrow-right"];
7507 aligns = ["xMinYMin", "xMaxYMin"];
7508 } else if (numSvgChildren === 3) {
7509 widthClasses = ["brace-left", "brace-center", "brace-right"];
7510 aligns = ["xMinYMin", "xMidYMin", "xMaxYMin"];
7511 } else {
7512 throw new Error("Correct katexImagesData or update code here to support\n " + numSvgChildren + " children.");
7513 }
7514
7515 for (var i = 0; i < numSvgChildren; i++) {
7516 var _path = new domTree_PathNode(paths[i]);
7517
7518 var _svgNode = new SvgNode([_path], {
7519 "width": "400em",
7520 "height": _height2 + "em",
7521 "viewBox": "0 0 " + viewBoxWidth + " " + _viewBoxHeight,
7522 "preserveAspectRatio": aligns[i] + " slice"
7523 });
7524
7525 var _span = buildCommon.makeSvgSpan([widthClasses[i]], [_svgNode], options);
7526
7527 if (numSvgChildren === 1) {
7528 return {
7529 span: _span,
7530 minWidth: _minWidth,
7531 height: _height2
7532 };
7533 } else {
7534 _span.style.height = _height2 + "em";
7535 spans.push(_span);
7536 }
7537 }
7538
7539 return {
7540 span: buildCommon.makeSpan(["stretchy"], spans, options),
7541 minWidth: _minWidth,
7542 height: _height2
7543 };
7544 }
7545 } // buildSvgSpan_()
7546
7547
7548 var _buildSvgSpan_ = buildSvgSpan_(),
7549 span = _buildSvgSpan_.span,
7550 minWidth = _buildSvgSpan_.minWidth,
7551 height = _buildSvgSpan_.height; // Note that we are returning span.depth = 0.
7552 // Any adjustments relative to the baseline must be done in buildHTML.
7553
7554
7555 span.height = height;
7556 span.style.height = height + "em";
7557
7558 if (minWidth > 0) {
7559 span.style.minWidth = minWidth + "em";
7560 }
7561
7562 return span;
7563 };
7564
7565 var stretchy_encloseSpan = function encloseSpan(inner, label, pad, options) {
7566 // Return an image span for \cancel, \bcancel, \xcancel, or \fbox
7567 var img;
7568 var totalHeight = inner.height + inner.depth + 2 * pad;
7569
7570 if (/fbox|color/.test(label)) {
7571 img = buildCommon.makeSpan(["stretchy", label], [], options);
7572
7573 if (label === "fbox") {
7574 var color = options.color && options.getColor();
7575
7576 if (color) {
7577 img.style.borderColor = color;
7578 }
7579 }
7580 } else {
7581 // \cancel, \bcancel, or \xcancel
7582 // Since \cancel's SVG is inline and it omits the viewBox attribute,
7583 // its stroke-width will not vary with span area.
7584 var lines = [];
7585
7586 if (/^[bx]cancel$/.test(label)) {
7587 lines.push(new LineNode({
7588 "x1": "0",
7589 "y1": "0",
7590 "x2": "100%",
7591 "y2": "100%",
7592 "stroke-width": "0.046em"
7593 }));
7594 }
7595
7596 if (/^x?cancel$/.test(label)) {
7597 lines.push(new LineNode({
7598 "x1": "0",
7599 "y1": "100%",
7600 "x2": "100%",
7601 "y2": "0",
7602 "stroke-width": "0.046em"
7603 }));
7604 }
7605
7606 var svgNode = new SvgNode(lines, {
7607 "width": "100%",
7608 "height": totalHeight + "em"
7609 });
7610 img = buildCommon.makeSvgSpan([], [svgNode], options);
7611 }
7612
7613 img.height = totalHeight;
7614 img.style.height = totalHeight + "em";
7615 return img;
7616 };
7617
7618 /* harmony default export */ var stretchy = ({
7619 encloseSpan: stretchy_encloseSpan,
7620 mathMLnode: stretchy_mathMLnode,
7621 svgSpan: stretchy_svgSpan
7622 });
7623 // CONCATENATED MODULE: ./src/functions/accent.js
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633 // NOTE: Unlike most `htmlBuilder`s, this one handles not only "accent", but
7634 var accent_htmlBuilder = function htmlBuilder(grp, options) {
7635 // Accents are handled in the TeXbook pg. 443, rule 12.
7636 var base;
7637 var group;
7638 var supSub = checkNodeType(grp, "supsub");
7639 var supSubGroup;
7640
7641 if (supSub) {
7642 // If our base is a character box, and we have superscripts and
7643 // subscripts, the supsub will defer to us. In particular, we want
7644 // to attach the superscripts and subscripts to the inner body (so
7645 // that the position of the superscripts and subscripts won't be
7646 // affected by the height of the accent). We accomplish this by
7647 // sticking the base of the accent into the base of the supsub, and
7648 // rendering that, while keeping track of where the accent is.
7649 // The real accent group is the base of the supsub group
7650 group = assertNodeType(supSub.base, "accent"); // The character box is the base of the accent group
7651
7652 base = group.base; // Stick the character box into the base of the supsub group
7653
7654 supSub.base = base; // Rerender the supsub group with its new base, and store that
7655 // result.
7656
7657 supSubGroup = assertSpan(buildHTML_buildGroup(supSub, options)); // reset original base
7658
7659 supSub.base = group;
7660 } else {
7661 group = assertNodeType(grp, "accent");
7662 base = group.base;
7663 } // Build the base group
7664
7665
7666 var body = buildHTML_buildGroup(base, options.havingCrampedStyle()); // Does the accent need to shift for the skew of a character?
7667
7668 var mustShift = group.isShifty && utils.isCharacterBox(base); // Calculate the skew of the accent. This is based on the line "If the
7669 // nucleus is not a single character, let s = 0; otherwise set s to the
7670 // kern amount for the nucleus followed by the \skewchar of its font."
7671 // Note that our skew metrics are just the kern between each character
7672 // and the skewchar.
7673
7674 var skew = 0;
7675
7676 if (mustShift) {
7677 // If the base is a character box, then we want the skew of the
7678 // innermost character. To do that, we find the innermost character:
7679 var baseChar = utils.getBaseElem(base); // Then, we render its group to get the symbol inside it
7680
7681 var baseGroup = buildHTML_buildGroup(baseChar, options.havingCrampedStyle()); // Finally, we pull the skew off of the symbol.
7682
7683 skew = assertSymbolDomNode(baseGroup).skew; // Note that we now throw away baseGroup, because the layers we
7684 // removed with getBaseElem might contain things like \color which
7685 // we can't get rid of.
7686 // TODO(emily): Find a better way to get the skew
7687 } // calculate the amount of space between the body and the accent
7688
7689
7690 var clearance = Math.min(body.height, options.fontMetrics().xHeight); // Build the accent
7691
7692 var accentBody;
7693
7694 if (!group.isStretchy) {
7695 var accent;
7696 var width;
7697
7698 if (group.label === "\\vec") {
7699 // Before version 0.9, \vec used the combining font glyph U+20D7.
7700 // But browsers, especially Safari, are not consistent in how they
7701 // render combining characters when not preceded by a character.
7702 // So now we use an SVG.
7703 // If Safari reforms, we should consider reverting to the glyph.
7704 accent = buildCommon.staticSvg("vec", options);
7705 width = buildCommon.svgData.vec[1];
7706 } else {
7707 accent = buildCommon.makeOrd({
7708 mode: group.mode,
7709 text: group.label
7710 }, options, "textord");
7711 accent = assertSymbolDomNode(accent); // Remove the italic correction of the accent, because it only serves to
7712 // shift the accent over to a place we don't want.
7713
7714 accent.italic = 0;
7715 width = accent.width;
7716 }
7717
7718 accentBody = buildCommon.makeSpan(["accent-body"], [accent]); // "Full" accents expand the width of the resulting symbol to be
7719 // at least the width of the accent, and overlap directly onto the
7720 // character without any vertical offset.
7721
7722 var accentFull = group.label === "\\textcircled";
7723
7724 if (accentFull) {
7725 accentBody.classes.push('accent-full');
7726 clearance = body.height;
7727 } // Shift the accent over by the skew.
7728
7729
7730 var left = skew; // CSS defines `.katex .accent .accent-body:not(.accent-full) { width: 0 }`
7731 // so that the accent doesn't contribute to the bounding box.
7732 // We need to shift the character by its width (effectively half
7733 // its width) to compensate.
7734
7735 if (!accentFull) {
7736 left -= width / 2;
7737 }
7738
7739 accentBody.style.left = left + "em"; // \textcircled uses the \bigcirc glyph, so it needs some
7740 // vertical adjustment to match LaTeX.
7741
7742 if (group.label === "\\textcircled") {
7743 accentBody.style.top = ".2em";
7744 }
7745
7746 accentBody = buildCommon.makeVList({
7747 positionType: "firstBaseline",
7748 children: [{
7749 type: "elem",
7750 elem: body
7751 }, {
7752 type: "kern",
7753 size: -clearance
7754 }, {
7755 type: "elem",
7756 elem: accentBody
7757 }]
7758 }, options);
7759 } else {
7760 accentBody = stretchy.svgSpan(group, options);
7761 accentBody = buildCommon.makeVList({
7762 positionType: "firstBaseline",
7763 children: [{
7764 type: "elem",
7765 elem: body
7766 }, {
7767 type: "elem",
7768 elem: accentBody,
7769 wrapperClasses: ["svg-align"],
7770 wrapperStyle: skew > 0 ? {
7771 width: "calc(100% - " + 2 * skew + "em)",
7772 marginLeft: 2 * skew + "em"
7773 } : undefined
7774 }]
7775 }, options);
7776 }
7777
7778 var accentWrap = buildCommon.makeSpan(["mord", "accent"], [accentBody], options);
7779
7780 if (supSubGroup) {
7781 // Here, we replace the "base" child of the supsub with our newly
7782 // generated accent.
7783 supSubGroup.children[0] = accentWrap; // Since we don't rerun the height calculation after replacing the
7784 // accent, we manually recalculate height.
7785
7786 supSubGroup.height = Math.max(accentWrap.height, supSubGroup.height); // Accents should always be ords, even when their innards are not.
7787
7788 supSubGroup.classes[0] = "mord";
7789 return supSubGroup;
7790 } else {
7791 return accentWrap;
7792 }
7793 };
7794
7795 var accent_mathmlBuilder = function mathmlBuilder(group, options) {
7796 var accentNode = group.isStretchy ? stretchy.mathMLnode(group.label) : new mathMLTree.MathNode("mo", [buildMathML_makeText(group.label, group.mode)]);
7797 var node = new mathMLTree.MathNode("mover", [buildMathML_buildGroup(group.base, options), accentNode]);
7798 node.setAttribute("accent", "true");
7799 return node;
7800 };
7801
7802 var NON_STRETCHY_ACCENT_REGEX = new RegExp(["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring"].map(function (accent) {
7803 return "\\" + accent;
7804 }).join("|")); // Accents
7805
7806 defineFunction({
7807 type: "accent",
7808 names: ["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring", "\\widecheck", "\\widehat", "\\widetilde", "\\overrightarrow", "\\overleftarrow", "\\Overrightarrow", "\\overleftrightarrow", "\\overgroup", "\\overlinesegment", "\\overleftharpoon", "\\overrightharpoon"],
7809 props: {
7810 numArgs: 1
7811 },
7812 handler: function handler(context, args) {
7813 var base = args[0];
7814 var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName);
7815 var isShifty = !isStretchy || context.funcName === "\\widehat" || context.funcName === "\\widetilde" || context.funcName === "\\widecheck";
7816 return {
7817 type: "accent",
7818 mode: context.parser.mode,
7819 label: context.funcName,
7820 isStretchy: isStretchy,
7821 isShifty: isShifty,
7822 base: base
7823 };
7824 },
7825 htmlBuilder: accent_htmlBuilder,
7826 mathmlBuilder: accent_mathmlBuilder
7827 }); // Text-mode accents
7828
7829 defineFunction({
7830 type: "accent",
7831 names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v", "\\textcircled"],
7832 props: {
7833 numArgs: 1,
7834 allowedInText: true,
7835 allowedInMath: false
7836 },
7837 handler: function handler(context, args) {
7838 var base = args[0];
7839 return {
7840 type: "accent",
7841 mode: context.parser.mode,
7842 label: context.funcName,
7843 isStretchy: false,
7844 isShifty: true,
7845 base: base
7846 };
7847 },
7848 htmlBuilder: accent_htmlBuilder,
7849 mathmlBuilder: accent_mathmlBuilder
7850 });
7851 // CONCATENATED MODULE: ./src/functions/accentunder.js
7852 // Horizontal overlap functions
7853
7854
7855
7856
7857
7858
7859 defineFunction({
7860 type: "accentUnder",
7861 names: ["\\underleftarrow", "\\underrightarrow", "\\underleftrightarrow", "\\undergroup", "\\underlinesegment", "\\utilde"],
7862 props: {
7863 numArgs: 1
7864 },
7865 handler: function handler(_ref, args) {
7866 var parser = _ref.parser,
7867 funcName = _ref.funcName;
7868 var base = args[0];
7869 return {
7870 type: "accentUnder",
7871 mode: parser.mode,
7872 label: funcName,
7873 base: base
7874 };
7875 },
7876 htmlBuilder: function htmlBuilder(group, options) {
7877 // Treat under accents much like underlines.
7878 var innerGroup = buildHTML_buildGroup(group.base, options);
7879 var accentBody = stretchy.svgSpan(group, options);
7880 var kern = group.label === "\\utilde" ? 0.12 : 0; // Generate the vlist, with the appropriate kerns
7881
7882 var vlist = buildCommon.makeVList({
7883 positionType: "bottom",
7884 positionData: accentBody.height + kern,
7885 children: [{
7886 type: "elem",
7887 elem: accentBody,
7888 wrapperClasses: ["svg-align"]
7889 }, {
7890 type: "kern",
7891 size: kern
7892 }, {
7893 type: "elem",
7894 elem: innerGroup
7895 }]
7896 }, options);
7897 return buildCommon.makeSpan(["mord", "accentunder"], [vlist], options);
7898 },
7899 mathmlBuilder: function mathmlBuilder(group, options) {
7900 var accentNode = stretchy.mathMLnode(group.label);
7901 var node = new mathMLTree.MathNode("munder", [buildMathML_buildGroup(group.base, options), accentNode]);
7902 node.setAttribute("accentunder", "true");
7903 return node;
7904 }
7905 });
7906 // CONCATENATED MODULE: ./src/functions/arrow.js
7907
7908
7909
7910
7911
7912
7913
7914 // Helper function
7915 var arrow_paddedNode = function paddedNode(group) {
7916 var node = new mathMLTree.MathNode("mpadded", group ? [group] : []);
7917 node.setAttribute("width", "+0.6em");
7918 node.setAttribute("lspace", "0.3em");
7919 return node;
7920 }; // Stretchy arrows with an optional argument
7921
7922
7923 defineFunction({
7924 type: "xArrow",
7925 names: ["\\xleftarrow", "\\xrightarrow", "\\xLeftarrow", "\\xRightarrow", "\\xleftrightarrow", "\\xLeftrightarrow", "\\xhookleftarrow", "\\xhookrightarrow", "\\xmapsto", "\\xrightharpoondown", "\\xrightharpoonup", "\\xleftharpoondown", "\\xleftharpoonup", "\\xrightleftharpoons", "\\xleftrightharpoons", "\\xlongequal", "\\xtwoheadrightarrow", "\\xtwoheadleftarrow", "\\xtofrom", // The next 3 functions are here to support the mhchem extension.
7926 // Direct use of these functions is discouraged and may break someday.
7927 "\\xrightleftarrows", "\\xrightequilibrium", "\\xleftequilibrium"],
7928 props: {
7929 numArgs: 1,
7930 numOptionalArgs: 1
7931 },
7932 handler: function handler(_ref, args, optArgs) {
7933 var parser = _ref.parser,
7934 funcName = _ref.funcName;
7935 return {
7936 type: "xArrow",
7937 mode: parser.mode,
7938 label: funcName,
7939 body: args[0],
7940 below: optArgs[0]
7941 };
7942 },
7943 // Flow is unable to correctly infer the type of `group`, even though it's
7944 // unamibiguously determined from the passed-in `type` above.
7945 htmlBuilder: function htmlBuilder(group, options) {
7946 var style = options.style; // Build the argument groups in the appropriate style.
7947 // Ref: amsmath.dtx: \hbox{$\scriptstyle\mkern#3mu{#6}\mkern#4mu$}%
7948 // Some groups can return document fragments. Handle those by wrapping
7949 // them in a span.
7950
7951 var newOptions = options.havingStyle(style.sup());
7952 var upperGroup = buildCommon.wrapFragment(buildHTML_buildGroup(group.body, newOptions, options), options);
7953 upperGroup.classes.push("x-arrow-pad");
7954 var lowerGroup;
7955
7956 if (group.below) {
7957 // Build the lower group
7958 newOptions = options.havingStyle(style.sub());
7959 lowerGroup = buildCommon.wrapFragment(buildHTML_buildGroup(group.below, newOptions, options), options);
7960 lowerGroup.classes.push("x-arrow-pad");
7961 }
7962
7963 var arrowBody = stretchy.svgSpan(group, options); // Re shift: Note that stretchy.svgSpan returned arrowBody.depth = 0.
7964 // The point we want on the math axis is at 0.5 * arrowBody.height.
7965
7966 var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height; // 2 mu kern. Ref: amsmath.dtx: #7\if0#2\else\mkern#2mu\fi
7967
7968 var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; // 0.111 em = 2 mu
7969
7970 if (upperGroup.depth > 0.25 || group.label === "\\xleftequilibrium") {
7971 upperShift -= upperGroup.depth; // shift up if depth encroaches
7972 } // Generate the vlist
7973
7974
7975 var vlist;
7976
7977 if (lowerGroup) {
7978 var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111;
7979 vlist = buildCommon.makeVList({
7980 positionType: "individualShift",
7981 children: [{
7982 type: "elem",
7983 elem: upperGroup,
7984 shift: upperShift
7985 }, {
7986 type: "elem",
7987 elem: arrowBody,
7988 shift: arrowShift
7989 }, {
7990 type: "elem",
7991 elem: lowerGroup,
7992 shift: lowerShift
7993 }]
7994 }, options);
7995 } else {
7996 vlist = buildCommon.makeVList({
7997 positionType: "individualShift",
7998 children: [{
7999 type: "elem",
8000 elem: upperGroup,
8001 shift: upperShift
8002 }, {
8003 type: "elem",
8004 elem: arrowBody,
8005 shift: arrowShift
8006 }]
8007 }, options);
8008 } // $FlowFixMe: Replace this with passing "svg-align" into makeVList.
8009
8010
8011 vlist.children[0].children[0].children[1].classes.push("svg-align");
8012 return buildCommon.makeSpan(["mrel", "x-arrow"], [vlist], options);
8013 },
8014 mathmlBuilder: function mathmlBuilder(group, options) {
8015 var arrowNode = stretchy.mathMLnode(group.label);
8016 var node;
8017
8018 if (group.body) {
8019 var upperNode = arrow_paddedNode(buildMathML_buildGroup(group.body, options));
8020
8021 if (group.below) {
8022 var lowerNode = arrow_paddedNode(buildMathML_buildGroup(group.below, options));
8023 node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]);
8024 } else {
8025 node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]);
8026 }
8027 } else if (group.below) {
8028 var _lowerNode = arrow_paddedNode(buildMathML_buildGroup(group.below, options));
8029
8030 node = new mathMLTree.MathNode("munder", [arrowNode, _lowerNode]);
8031 } else {
8032 // This should never happen.
8033 // Parser.js throws an error if there is no argument.
8034 node = arrow_paddedNode();
8035 node = new mathMLTree.MathNode("mover", [arrowNode, node]);
8036 }
8037
8038 return node;
8039 }
8040 });
8041 // CONCATENATED MODULE: ./src/functions/char.js
8042
8043
8044 // \@char is an internal function that takes a grouped decimal argument like
8045 // {123} and converts into symbol with code 123. It is used by the *macro*
8046 // \char defined in macros.js.
8047
8048 defineFunction({
8049 type: "textord",
8050 names: ["\\@char"],
8051 props: {
8052 numArgs: 1,
8053 allowedInText: true
8054 },
8055 handler: function handler(_ref, args) {
8056 var parser = _ref.parser;
8057 var arg = assertNodeType(args[0], "ordgroup");
8058 var group = arg.body;
8059 var number = "";
8060
8061 for (var i = 0; i < group.length; i++) {
8062 var node = assertNodeType(group[i], "textord");
8063 number += node.text;
8064 }
8065
8066 var code = parseInt(number);
8067
8068 if (isNaN(code)) {
8069 throw new src_ParseError("\\@char has non-numeric argument " + number);
8070 }
8071
8072 return {
8073 type: "textord",
8074 mode: parser.mode,
8075 text: String.fromCharCode(code)
8076 };
8077 }
8078 });
8079 // CONCATENATED MODULE: ./src/functions/color.js
8080
8081
8082
8083
8084
8085
8086
8087 var color_htmlBuilder = function htmlBuilder(group, options) {
8088 var elements = buildHTML_buildExpression(group.body, options.withColor(group.color), false); // \color isn't supposed to affect the type of the elements it contains.
8089 // To accomplish this, we wrap the results in a fragment, so the inner
8090 // elements will be able to directly interact with their neighbors. For
8091 // example, `\color{red}{2 +} 3` has the same spacing as `2 + 3`
8092
8093 return buildCommon.makeFragment(elements);
8094 };
8095
8096 var color_mathmlBuilder = function mathmlBuilder(group, options) {
8097 var inner = buildMathML_buildExpression(group.body, options.withColor(group.color));
8098 var node = new mathMLTree.MathNode("mstyle", inner);
8099 node.setAttribute("mathcolor", group.color);
8100 return node;
8101 };
8102
8103 defineFunction({
8104 type: "color",
8105 names: ["\\textcolor"],
8106 props: {
8107 numArgs: 2,
8108 allowedInText: true,
8109 greediness: 3,
8110 argTypes: ["color", "original"]
8111 },
8112 handler: function handler(_ref, args) {
8113 var parser = _ref.parser;
8114 var color = assertNodeType(args[0], "color-token").color;
8115 var body = args[1];
8116 return {
8117 type: "color",
8118 mode: parser.mode,
8119 color: color,
8120 body: defineFunction_ordargument(body)
8121 };
8122 },
8123 htmlBuilder: color_htmlBuilder,
8124 mathmlBuilder: color_mathmlBuilder
8125 });
8126 defineFunction({
8127 type: "color",
8128 names: ["\\color"],
8129 props: {
8130 numArgs: 1,
8131 allowedInText: true,
8132 greediness: 3,
8133 argTypes: ["color"]
8134 },
8135 handler: function handler(_ref2, args) {
8136 var parser = _ref2.parser,
8137 breakOnTokenText = _ref2.breakOnTokenText;
8138 var color = assertNodeType(args[0], "color-token").color; // Set macro \current@color in current namespace to store the current
8139 // color, mimicking the behavior of color.sty.
8140 // This is currently used just to correctly color a \right
8141 // that follows a \color command.
8142
8143 parser.gullet.macros.set("\\current@color", color); // Parse out the implicit body that should be colored.
8144
8145 var body = parser.parseExpression(true, breakOnTokenText);
8146 return {
8147 type: "color",
8148 mode: parser.mode,
8149 color: color,
8150 body: body
8151 };
8152 },
8153 htmlBuilder: color_htmlBuilder,
8154 mathmlBuilder: color_mathmlBuilder
8155 });
8156 // CONCATENATED MODULE: ./src/functions/cr.js
8157 // Row breaks within tabular environments, and line breaks at top level
8158
8159
8160
8161
8162
8163 // \\ is a macro mapping to either \cr or \newline. Because they have the
8164 // same signature, we implement them as one megafunction, with newRow
8165 // indicating whether we're in the \cr case, and newLine indicating whether
8166 // to break the line in the \newline case.
8167
8168 defineFunction({
8169 type: "cr",
8170 names: ["\\cr", "\\newline"],
8171 props: {
8172 numArgs: 0,
8173 numOptionalArgs: 1,
8174 argTypes: ["size"],
8175 allowedInText: true
8176 },
8177 handler: function handler(_ref, args, optArgs) {
8178 var parser = _ref.parser,
8179 funcName = _ref.funcName;
8180 var size = optArgs[0];
8181 var newRow = funcName === "\\cr";
8182 var newLine = false;
8183
8184 if (!newRow) {
8185 if (parser.settings.displayMode && parser.settings.useStrictBehavior("newLineInDisplayMode", "In LaTeX, \\\\ or \\newline " + "does nothing in display mode")) {
8186 newLine = false;
8187 } else {
8188 newLine = true;
8189 }
8190 }
8191
8192 return {
8193 type: "cr",
8194 mode: parser.mode,
8195 newLine: newLine,
8196 newRow: newRow,
8197 size: size && assertNodeType(size, "size").value
8198 };
8199 },
8200 // The following builders are called only at the top level,
8201 // not within tabular/array environments.
8202 htmlBuilder: function htmlBuilder(group, options) {
8203 if (group.newRow) {
8204 throw new src_ParseError("\\cr valid only within a tabular/array environment");
8205 }
8206
8207 var span = buildCommon.makeSpan(["mspace"], [], options);
8208
8209 if (group.newLine) {
8210 span.classes.push("newline");
8211
8212 if (group.size) {
8213 span.style.marginTop = units_calculateSize(group.size, options) + "em";
8214 }
8215 }
8216
8217 return span;
8218 },
8219 mathmlBuilder: function mathmlBuilder(group, options) {
8220 var node = new mathMLTree.MathNode("mspace");
8221
8222 if (group.newLine) {
8223 node.setAttribute("linebreak", "newline");
8224
8225 if (group.size) {
8226 node.setAttribute("height", units_calculateSize(group.size, options) + "em");
8227 }
8228 }
8229
8230 return node;
8231 }
8232 });
8233 // CONCATENATED MODULE: ./src/delimiter.js
8234 /**
8235 * This file deals with creating delimiters of various sizes. The TeXbook
8236 * discusses these routines on page 441-442, in the "Another subroutine sets box
8237 * x to a specified variable delimiter" paragraph.
8238 *
8239 * There are three main routines here. `makeSmallDelim` makes a delimiter in the
8240 * normal font, but in either text, script, or scriptscript style.
8241 * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1,
8242 * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of
8243 * smaller pieces that are stacked on top of one another.
8244 *
8245 * The functions take a parameter `center`, which determines if the delimiter
8246 * should be centered around the axis.
8247 *
8248 * Then, there are three exposed functions. `sizedDelim` makes a delimiter in
8249 * one of the given sizes. This is used for things like `\bigl`.
8250 * `customSizedDelim` makes a delimiter with a given total height+depth. It is
8251 * called in places like `\sqrt`. `leftRightDelim` makes an appropriate
8252 * delimiter which surrounds an expression of a given height an depth. It is
8253 * used in `\left` and `\right`.
8254 */
8255
8256
8257
8258
8259
8260
8261
8262
8263
8264 /**
8265 * Get the metrics for a given symbol and font, after transformation (i.e.
8266 * after following replacement from symbols.js)
8267 */
8268 var delimiter_getMetrics = function getMetrics(symbol, font, mode) {
8269 var replace = src_symbols.math[symbol] && src_symbols.math[symbol].replace;
8270 var metrics = getCharacterMetrics(replace || symbol, font, mode);
8271
8272 if (!metrics) {
8273 throw new Error("Unsupported symbol " + symbol + " and font size " + font + ".");
8274 }
8275
8276 return metrics;
8277 };
8278 /**
8279 * Puts a delimiter span in a given style, and adds appropriate height, depth,
8280 * and maxFontSizes.
8281 */
8282
8283
8284 var delimiter_styleWrap = function styleWrap(delim, toStyle, options, classes) {
8285 var newOptions = options.havingBaseStyle(toStyle);
8286 var span = buildCommon.makeSpan(classes.concat(newOptions.sizingClasses(options)), [delim], options);
8287 var delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier;
8288 span.height *= delimSizeMultiplier;
8289 span.depth *= delimSizeMultiplier;
8290 span.maxFontSize = newOptions.sizeMultiplier;
8291 return span;
8292 };
8293
8294 var centerSpan = function centerSpan(span, options, style) {
8295 var newOptions = options.havingBaseStyle(style);
8296 var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight;
8297 span.classes.push("delimcenter");
8298 span.style.top = shift + "em";
8299 span.height -= shift;
8300 span.depth += shift;
8301 };
8302 /**
8303 * Makes a small delimiter. This is a delimiter that comes in the Main-Regular
8304 * font, but is restyled to either be in textstyle, scriptstyle, or
8305 * scriptscriptstyle.
8306 */
8307
8308
8309 var delimiter_makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) {
8310 var text = buildCommon.makeSymbol(delim, "Main-Regular", mode, options);
8311 var span = delimiter_styleWrap(text, style, options, classes);
8312
8313 if (center) {
8314 centerSpan(span, options, style);
8315 }
8316
8317 return span;
8318 };
8319 /**
8320 * Builds a symbol in the given font size (note size is an integer)
8321 */
8322
8323
8324 var delimiter_mathrmSize = function mathrmSize(value, size, mode, options) {
8325 return buildCommon.makeSymbol(value, "Size" + size + "-Regular", mode, options);
8326 };
8327 /**
8328 * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2,
8329 * Size3, or Size4 fonts. It is always rendered in textstyle.
8330 */
8331
8332
8333 var delimiter_makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) {
8334 var inner = delimiter_mathrmSize(delim, size, mode, options);
8335 var span = delimiter_styleWrap(buildCommon.makeSpan(["delimsizing", "size" + size], [inner], options), src_Style.TEXT, options, classes);
8336
8337 if (center) {
8338 centerSpan(span, options, src_Style.TEXT);
8339 }
8340
8341 return span;
8342 };
8343 /**
8344 * Make an inner span with the given offset and in the given font. This is used
8345 * in `makeStackedDelim` to make the stacking pieces for the delimiter.
8346 */
8347
8348
8349 var delimiter_makeInner = function makeInner(symbol, font, mode) {
8350 var sizeClass; // Apply the correct CSS class to choose the right font.
8351
8352 if (font === "Size1-Regular") {
8353 sizeClass = "delim-size1";
8354 } else
8355 /* if (font === "Size4-Regular") */
8356 {
8357 sizeClass = "delim-size4";
8358 }
8359
8360 var inner = buildCommon.makeSpan(["delimsizinginner", sizeClass], [buildCommon.makeSpan([], [buildCommon.makeSymbol(symbol, font, mode)])]); // Since this will be passed into `makeVList` in the end, wrap the element
8361 // in the appropriate tag that VList uses.
8362
8363 return {
8364 type: "elem",
8365 elem: inner
8366 };
8367 }; // Helper for makeStackedDelim
8368
8369
8370 var lap = {
8371 type: "kern",
8372 size: -0.005
8373 };
8374 /**
8375 * Make a stacked delimiter out of a given delimiter, with the total height at
8376 * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook.
8377 */
8378
8379 var delimiter_makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) {
8380 // There are four parts, the top, an optional middle, a repeated part, and a
8381 // bottom.
8382 var top;
8383 var middle;
8384 var repeat;
8385 var bottom;
8386 top = repeat = bottom = delim;
8387 middle = null; // Also keep track of what font the delimiters are in
8388
8389 var font = "Size1-Regular"; // We set the parts and font based on the symbol. Note that we use
8390 // '\u23d0' instead of '|' and '\u2016' instead of '\\|' for the
8391 // repeats of the arrows
8392
8393 if (delim === "\\uparrow") {
8394 repeat = bottom = "\u23D0";
8395 } else if (delim === "\\Uparrow") {
8396 repeat = bottom = "\u2016";
8397 } else if (delim === "\\downarrow") {
8398 top = repeat = "\u23D0";
8399 } else if (delim === "\\Downarrow") {
8400 top = repeat = "\u2016";
8401 } else if (delim === "\\updownarrow") {
8402 top = "\\uparrow";
8403 repeat = "\u23D0";
8404 bottom = "\\downarrow";
8405 } else if (delim === "\\Updownarrow") {
8406 top = "\\Uparrow";
8407 repeat = "\u2016";
8408 bottom = "\\Downarrow";
8409 } else if (delim === "[" || delim === "\\lbrack") {
8410 top = "\u23A1";
8411 repeat = "\u23A2";
8412 bottom = "\u23A3";
8413 font = "Size4-Regular";
8414 } else if (delim === "]" || delim === "\\rbrack") {
8415 top = "\u23A4";
8416 repeat = "\u23A5";
8417 bottom = "\u23A6";
8418 font = "Size4-Regular";
8419 } else if (delim === "\\lfloor" || delim === "\u230A") {
8420 repeat = top = "\u23A2";
8421 bottom = "\u23A3";
8422 font = "Size4-Regular";
8423 } else if (delim === "\\lceil" || delim === "\u2308") {
8424 top = "\u23A1";
8425 repeat = bottom = "\u23A2";
8426 font = "Size4-Regular";
8427 } else if (delim === "\\rfloor" || delim === "\u230B") {
8428 repeat = top = "\u23A5";
8429 bottom = "\u23A6";
8430 font = "Size4-Regular";
8431 } else if (delim === "\\rceil" || delim === "\u2309") {
8432 top = "\u23A4";
8433 repeat = bottom = "\u23A5";
8434 font = "Size4-Regular";
8435 } else if (delim === "(" || delim === "\\lparen") {
8436 top = "\u239B";
8437 repeat = "\u239C";
8438 bottom = "\u239D";
8439 font = "Size4-Regular";
8440 } else if (delim === ")" || delim === "\\rparen") {
8441 top = "\u239E";
8442 repeat = "\u239F";
8443 bottom = "\u23A0";
8444 font = "Size4-Regular";
8445 } else if (delim === "\\{" || delim === "\\lbrace") {
8446 top = "\u23A7";
8447 middle = "\u23A8";
8448 bottom = "\u23A9";
8449 repeat = "\u23AA";
8450 font = "Size4-Regular";
8451 } else if (delim === "\\}" || delim === "\\rbrace") {
8452 top = "\u23AB";
8453 middle = "\u23AC";
8454 bottom = "\u23AD";
8455 repeat = "\u23AA";
8456 font = "Size4-Regular";
8457 } else if (delim === "\\lgroup" || delim === "\u27EE") {
8458 top = "\u23A7";
8459 bottom = "\u23A9";
8460 repeat = "\u23AA";
8461 font = "Size4-Regular";
8462 } else if (delim === "\\rgroup" || delim === "\u27EF") {
8463 top = "\u23AB";
8464 bottom = "\u23AD";
8465 repeat = "\u23AA";
8466 font = "Size4-Regular";
8467 } else if (delim === "\\lmoustache" || delim === "\u23B0") {
8468 top = "\u23A7";
8469 bottom = "\u23AD";
8470 repeat = "\u23AA";
8471 font = "Size4-Regular";
8472 } else if (delim === "\\rmoustache" || delim === "\u23B1") {
8473 top = "\u23AB";
8474 bottom = "\u23A9";
8475 repeat = "\u23AA";
8476 font = "Size4-Regular";
8477 } // Get the metrics of the four sections
8478
8479
8480 var topMetrics = delimiter_getMetrics(top, font, mode);
8481 var topHeightTotal = topMetrics.height + topMetrics.depth;
8482 var repeatMetrics = delimiter_getMetrics(repeat, font, mode);
8483 var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth;
8484 var bottomMetrics = delimiter_getMetrics(bottom, font, mode);
8485 var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth;
8486 var middleHeightTotal = 0;
8487 var middleFactor = 1;
8488
8489 if (middle !== null) {
8490 var middleMetrics = delimiter_getMetrics(middle, font, mode);
8491 middleHeightTotal = middleMetrics.height + middleMetrics.depth;
8492 middleFactor = 2; // repeat symmetrically above and below middle
8493 } // Calcuate the minimal height that the delimiter can have.
8494 // It is at least the size of the top, bottom, and optional middle combined.
8495
8496
8497 var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal; // Compute the number of copies of the repeat symbol we will need
8498
8499 var repeatCount = Math.max(0, Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal))); // Compute the total height of the delimiter including all the symbols
8500
8501 var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal; // The center of the delimiter is placed at the center of the axis. Note
8502 // that in this context, "center" means that the delimiter should be
8503 // centered around the axis in the current style, while normally it is
8504 // centered around the axis in textstyle.
8505
8506 var axisHeight = options.fontMetrics().axisHeight;
8507
8508 if (center) {
8509 axisHeight *= options.sizeMultiplier;
8510 } // Calculate the depth
8511
8512
8513 var depth = realHeightTotal / 2 - axisHeight; // This function differs from the TeX procedure in one way.
8514 // We shift each repeat element downwards by 0.005em, to prevent a gap
8515 // due to browser floating point rounding error.
8516 // Then, at the last element-to element joint, we add one extra repeat
8517 // element to cover the gap created by the shifts.
8518 // Find the shift needed to align the upper end of the extra element at a point
8519 // 0.005em above the lower end of the top element.
8520
8521 var shiftOfExtraElement = (repeatCount + 1) * 0.005 - repeatHeightTotal; // Now, we start building the pieces that will go into the vlist
8522 // Keep a list of the inner pieces
8523
8524 var inners = []; // Add the bottom symbol
8525
8526 inners.push(delimiter_makeInner(bottom, font, mode));
8527
8528 if (middle === null) {
8529 // Add that many symbols
8530 for (var i = 0; i < repeatCount; i++) {
8531 inners.push(lap); // overlap
8532
8533 inners.push(delimiter_makeInner(repeat, font, mode));
8534 }
8535 } else {
8536 // When there is a middle bit, we need the middle part and two repeated
8537 // sections
8538 for (var _i = 0; _i < repeatCount; _i++) {
8539 inners.push(lap);
8540 inners.push(delimiter_makeInner(repeat, font, mode));
8541 } // Insert one extra repeat element.
8542
8543
8544 inners.push({
8545 type: "kern",
8546 size: shiftOfExtraElement
8547 });
8548 inners.push(delimiter_makeInner(repeat, font, mode));
8549 inners.push(lap); // Now insert the middle of the brace.
8550
8551 inners.push(delimiter_makeInner(middle, font, mode));
8552
8553 for (var _i2 = 0; _i2 < repeatCount; _i2++) {
8554 inners.push(lap);
8555 inners.push(delimiter_makeInner(repeat, font, mode));
8556 }
8557 } // To cover the gap create by the overlaps, insert one more repeat element,
8558 // at a position that juts 0.005 above the bottom of the top element.
8559
8560
8561 inners.push({
8562 type: "kern",
8563 size: shiftOfExtraElement
8564 });
8565 inners.push(delimiter_makeInner(repeat, font, mode));
8566 inners.push(lap); // Add the top symbol
8567
8568 inners.push(delimiter_makeInner(top, font, mode)); // Finally, build the vlist
8569
8570 var newOptions = options.havingBaseStyle(src_Style.TEXT);
8571 var inner = buildCommon.makeVList({
8572 positionType: "bottom",
8573 positionData: depth,
8574 children: inners
8575 }, newOptions);
8576 return delimiter_styleWrap(buildCommon.makeSpan(["delimsizing", "mult"], [inner], newOptions), src_Style.TEXT, options, classes);
8577 }; // All surds have 0.08em padding above the viniculum inside the SVG.
8578 // That keeps browser span height rounding error from pinching the line.
8579
8580
8581 var vbPad = 80; // padding above the surd, measured inside the viewBox.
8582
8583 var emPad = 0.08; // padding, in ems, measured in the document.
8584
8585 var delimiter_sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, extraViniculum, options) {
8586 var path = sqrtPath(sqrtName, extraViniculum, viewBoxHeight);
8587 var pathNode = new domTree_PathNode(sqrtName, path);
8588 var svg = new SvgNode([pathNode], {
8589 // Note: 1000:1 ratio of viewBox to document em width.
8590 "width": "400em",
8591 "height": height + "em",
8592 "viewBox": "0 0 400000 " + viewBoxHeight,
8593 "preserveAspectRatio": "xMinYMin slice"
8594 });
8595 return buildCommon.makeSvgSpan(["hide-tail"], [svg], options);
8596 };
8597 /**
8598 * Make a sqrt image of the given height,
8599 */
8600
8601
8602 var makeSqrtImage = function makeSqrtImage(height, options) {
8603 // Define a newOptions that removes the effect of size changes such as \Huge.
8604 // We don't pick different a height surd for \Huge. For it, we scale up.
8605 var newOptions = options.havingBaseSizing(); // Pick the desired surd glyph from a sequence of surds.
8606
8607 var delim = traverseSequence("\\surd", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions);
8608 var sizeMultiplier = newOptions.sizeMultiplier; // default
8609 // The standard sqrt SVGs each have a 0.04em thick viniculum.
8610 // If Settings.minRuleThickness is larger than that, we add extraViniculum.
8611
8612 var extraViniculum = Math.max(0, options.minRuleThickness - options.fontMetrics().sqrtRuleThickness); // Create a span containing an SVG image of a sqrt symbol.
8613
8614 var span;
8615 var spanHeight = 0;
8616 var texHeight = 0;
8617 var viewBoxHeight = 0;
8618 var advanceWidth; // We create viewBoxes with 80 units of "padding" above each surd.
8619 // Then browser rounding error on the parent span height will not
8620 // encroach on the ink of the viniculum. But that padding is not
8621 // included in the TeX-like `height` used for calculation of
8622 // vertical alignment. So texHeight = span.height < span.style.height.
8623
8624 if (delim.type === "small") {
8625 // Get an SVG that is derived from glyph U+221A in font KaTeX-Main.
8626 // 1000 unit normal glyph height.
8627 viewBoxHeight = 1000 + 1000 * extraViniculum + vbPad;
8628
8629 if (height < 1.0) {
8630 sizeMultiplier = 1.0; // mimic a \textfont radical
8631 } else if (height < 1.4) {
8632 sizeMultiplier = 0.7; // mimic a \scriptfont radical
8633 }
8634
8635 spanHeight = (1.0 + extraViniculum + emPad) / sizeMultiplier;
8636 texHeight = (1.00 + extraViniculum) / sizeMultiplier;
8637 span = delimiter_sqrtSvg("sqrtMain", spanHeight, viewBoxHeight, extraViniculum, options);
8638 span.style.minWidth = "0.853em";
8639 advanceWidth = 0.833 / sizeMultiplier; // from the font.
8640 } else if (delim.type === "large") {
8641 // These SVGs come from fonts: KaTeX_Size1, _Size2, etc.
8642 viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size];
8643 texHeight = (sizeToMaxHeight[delim.size] + extraViniculum) / sizeMultiplier;
8644 spanHeight = (sizeToMaxHeight[delim.size] + extraViniculum + emPad) / sizeMultiplier;
8645 span = delimiter_sqrtSvg("sqrtSize" + delim.size, spanHeight, viewBoxHeight, extraViniculum, options);
8646 span.style.minWidth = "1.02em";
8647 advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font.
8648 } else {
8649 // Tall sqrt. In TeX, this would be stacked using multiple glyphs.
8650 // We'll use a single SVG to accomplish the same thing.
8651 spanHeight = height + extraViniculum + emPad;
8652 texHeight = height + extraViniculum;
8653 viewBoxHeight = Math.floor(1000 * height + extraViniculum) + vbPad;
8654 span = delimiter_sqrtSvg("sqrtTall", spanHeight, viewBoxHeight, extraViniculum, options);
8655 span.style.minWidth = "0.742em";
8656 advanceWidth = 1.056;
8657 }
8658
8659 span.height = texHeight;
8660 span.style.height = spanHeight + "em";
8661 return {
8662 span: span,
8663 advanceWidth: advanceWidth,
8664 // Calculate the actual line width.
8665 // This actually should depend on the chosen font -- e.g. \boldmath
8666 // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and
8667 // have thicker rules.
8668 ruleWidth: (options.fontMetrics().sqrtRuleThickness + extraViniculum) * sizeMultiplier
8669 };
8670 }; // There are three kinds of delimiters, delimiters that stack when they become
8671 // too large
8672
8673
8674 var stackLargeDelimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230A", "\u230B", "\\lceil", "\\rceil", "\u2308", "\u2309", "\\surd"]; // delimiters that always stack
8675
8676 var stackAlwaysDelimiters = ["\\uparrow", "\\downarrow", "\\updownarrow", "\\Uparrow", "\\Downarrow", "\\Updownarrow", "|", "\\|", "\\vert", "\\Vert", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27EE", "\u27EF", "\\lmoustache", "\\rmoustache", "\u23B0", "\u23B1"]; // and delimiters that never stack
8677
8678 var stackNeverDelimiters = ["<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"]; // Metrics of the different sizes. Found by looking at TeX's output of
8679 // $\bigl| // \Bigl| \biggl| \Biggl| \showlists$
8680 // Used to create stacked delimiters of appropriate sizes in makeSizedDelim.
8681
8682 var sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];
8683 /**
8684 * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4.
8685 */
8686
8687 var delimiter_makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) {
8688 // < and > turn into \langle and \rangle in delimiters
8689 if (delim === "<" || delim === "\\lt" || delim === "\u27E8") {
8690 delim = "\\langle";
8691 } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") {
8692 delim = "\\rangle";
8693 } // Sized delimiters are never centered.
8694
8695
8696 if (utils.contains(stackLargeDelimiters, delim) || utils.contains(stackNeverDelimiters, delim)) {
8697 return delimiter_makeLargeDelim(delim, size, false, options, mode, classes);
8698 } else if (utils.contains(stackAlwaysDelimiters, delim)) {
8699 return delimiter_makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes);
8700 } else {
8701 throw new src_ParseError("Illegal delimiter: '" + delim + "'");
8702 }
8703 };
8704 /**
8705 * There are three different sequences of delimiter sizes that the delimiters
8706 * follow depending on the kind of delimiter. This is used when creating custom
8707 * sized delimiters to decide whether to create a small, large, or stacked
8708 * delimiter.
8709 *
8710 * In real TeX, these sequences aren't explicitly defined, but are instead
8711 * defined inside the font metrics. Since there are only three sequences that
8712 * are possible for the delimiters that TeX defines, it is easier to just encode
8713 * them explicitly here.
8714 */
8715
8716
8717 // Delimiters that never stack try small delimiters and large delimiters only
8718 var stackNeverDelimiterSequence = [{
8719 type: "small",
8720 style: src_Style.SCRIPTSCRIPT
8721 }, {
8722 type: "small",
8723 style: src_Style.SCRIPT
8724 }, {
8725 type: "small",
8726 style: src_Style.TEXT
8727 }, {
8728 type: "large",
8729 size: 1
8730 }, {
8731 type: "large",
8732 size: 2
8733 }, {
8734 type: "large",
8735 size: 3
8736 }, {
8737 type: "large",
8738 size: 4
8739 }]; // Delimiters that always stack try the small delimiters first, then stack
8740
8741 var stackAlwaysDelimiterSequence = [{
8742 type: "small",
8743 style: src_Style.SCRIPTSCRIPT
8744 }, {
8745 type: "small",
8746 style: src_Style.SCRIPT
8747 }, {
8748 type: "small",
8749 style: src_Style.TEXT
8750 }, {
8751 type: "stack"
8752 }]; // Delimiters that stack when large try the small and then large delimiters, and
8753 // stack afterwards
8754
8755 var stackLargeDelimiterSequence = [{
8756 type: "small",
8757 style: src_Style.SCRIPTSCRIPT
8758 }, {
8759 type: "small",
8760 style: src_Style.SCRIPT
8761 }, {
8762 type: "small",
8763 style: src_Style.TEXT
8764 }, {
8765 type: "large",
8766 size: 1
8767 }, {
8768 type: "large",
8769 size: 2
8770 }, {
8771 type: "large",
8772 size: 3
8773 }, {
8774 type: "large",
8775 size: 4
8776 }, {
8777 type: "stack"
8778 }];
8779 /**
8780 * Get the font used in a delimiter based on what kind of delimiter it is.
8781 * TODO(#963) Use more specific font family return type once that is introduced.
8782 */
8783
8784 var delimTypeToFont = function delimTypeToFont(type) {
8785 if (type.type === "small") {
8786 return "Main-Regular";
8787 } else if (type.type === "large") {
8788 return "Size" + type.size + "-Regular";
8789 } else if (type.type === "stack") {
8790 return "Size4-Regular";
8791 } else {
8792 throw new Error("Add support for delim type '" + type.type + "' here.");
8793 }
8794 };
8795 /**
8796 * Traverse a sequence of types of delimiters to decide what kind of delimiter
8797 * should be used to create a delimiter of the given height+depth.
8798 */
8799
8800
8801 var traverseSequence = function traverseSequence(delim, height, sequence, options) {
8802 // Here, we choose the index we should start at in the sequences. In smaller
8803 // sizes (which correspond to larger numbers in style.size) we start earlier
8804 // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts
8805 // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2
8806 var start = Math.min(2, 3 - options.style.size);
8807
8808 for (var i = start; i < sequence.length; i++) {
8809 if (sequence[i].type === "stack") {
8810 // This is always the last delimiter, so we just break the loop now.
8811 break;
8812 }
8813
8814 var metrics = delimiter_getMetrics(delim, delimTypeToFont(sequence[i]), "math");
8815 var heightDepth = metrics.height + metrics.depth; // Small delimiters are scaled down versions of the same font, so we
8816 // account for the style change size.
8817
8818 if (sequence[i].type === "small") {
8819 var newOptions = options.havingBaseStyle(sequence[i].style);
8820 heightDepth *= newOptions.sizeMultiplier;
8821 } // Check if the delimiter at this size works for the given height.
8822
8823
8824 if (heightDepth > height) {
8825 return sequence[i];
8826 }
8827 } // If we reached the end of the sequence, return the last sequence element.
8828
8829
8830 return sequence[sequence.length - 1];
8831 };
8832 /**
8833 * Make a delimiter of a given height+depth, with optional centering. Here, we
8834 * traverse the sequences, and create a delimiter that the sequence tells us to.
8835 */
8836
8837
8838 var delimiter_makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) {
8839 if (delim === "<" || delim === "\\lt" || delim === "\u27E8") {
8840 delim = "\\langle";
8841 } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") {
8842 delim = "\\rangle";
8843 } // Decide what sequence to use
8844
8845
8846 var sequence;
8847
8848 if (utils.contains(stackNeverDelimiters, delim)) {
8849 sequence = stackNeverDelimiterSequence;
8850 } else if (utils.contains(stackLargeDelimiters, delim)) {
8851 sequence = stackLargeDelimiterSequence;
8852 } else {
8853 sequence = stackAlwaysDelimiterSequence;
8854 } // Look through the sequence
8855
8856
8857 var delimType = traverseSequence(delim, height, sequence, options); // Get the delimiter from font glyphs.
8858 // Depending on the sequence element we decided on, call the
8859 // appropriate function.
8860
8861 if (delimType.type === "small") {
8862 return delimiter_makeSmallDelim(delim, delimType.style, center, options, mode, classes);
8863 } else if (delimType.type === "large") {
8864 return delimiter_makeLargeDelim(delim, delimType.size, center, options, mode, classes);
8865 } else
8866 /* if (delimType.type === "stack") */
8867 {
8868 return delimiter_makeStackedDelim(delim, height, center, options, mode, classes);
8869 }
8870 };
8871 /**
8872 * Make a delimiter for use with `\left` and `\right`, given a height and depth
8873 * of an expression that the delimiters surround.
8874 */
8875
8876
8877 var makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) {
8878 // We always center \left/\right delimiters, so the axis is always shifted
8879 var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier; // Taken from TeX source, tex.web, function make_left_right
8880
8881 var delimiterFactor = 901;
8882 var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm;
8883 var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight);
8884 var totalHeight = Math.max( // In real TeX, calculations are done using integral values which are
8885 // 65536 per pt, or 655360 per em. So, the division here truncates in
8886 // TeX but doesn't here, producing different results. If we wanted to
8887 // exactly match TeX's calculation, we could do
8888 // Math.floor(655360 * maxDistFromAxis / 500) *
8889 // delimiterFactor / 655360
8890 // (To see the difference, compare
8891 // x^{x^{\left(\rule{0.1em}{0.68em}\right)}}
8892 // in TeX and KaTeX)
8893 maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend); // Finally, we defer to `makeCustomSizedDelim` with our calculated total
8894 // height
8895
8896 return delimiter_makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes);
8897 };
8898
8899 /* harmony default export */ var delimiter = ({
8900 sqrtImage: makeSqrtImage,
8901 sizedDelim: delimiter_makeSizedDelim,
8902 customSizedDelim: delimiter_makeCustomSizedDelim,
8903 leftRightDelim: makeLeftRightDelim
8904 });
8905 // CONCATENATED MODULE: ./src/functions/delimsizing.js
8906
8907
8908
8909
8910
8911
8912
8913
8914
8915 // Extra data needed for the delimiter handler down below
8916 var delimiterSizes = {
8917 "\\bigl": {
8918 mclass: "mopen",
8919 size: 1
8920 },
8921 "\\Bigl": {
8922 mclass: "mopen",
8923 size: 2
8924 },
8925 "\\biggl": {
8926 mclass: "mopen",
8927 size: 3
8928 },
8929 "\\Biggl": {
8930 mclass: "mopen",
8931 size: 4
8932 },
8933 "\\bigr": {
8934 mclass: "mclose",
8935 size: 1
8936 },
8937 "\\Bigr": {
8938 mclass: "mclose",
8939 size: 2
8940 },
8941 "\\biggr": {
8942 mclass: "mclose",
8943 size: 3
8944 },
8945 "\\Biggr": {
8946 mclass: "mclose",
8947 size: 4
8948 },
8949 "\\bigm": {
8950 mclass: "mrel",
8951 size: 1
8952 },
8953 "\\Bigm": {
8954 mclass: "mrel",
8955 size: 2
8956 },
8957 "\\biggm": {
8958 mclass: "mrel",
8959 size: 3
8960 },
8961 "\\Biggm": {
8962 mclass: "mrel",
8963 size: 4
8964 },
8965 "\\big": {
8966 mclass: "mord",
8967 size: 1
8968 },
8969 "\\Big": {
8970 mclass: "mord",
8971 size: 2
8972 },
8973 "\\bigg": {
8974 mclass: "mord",
8975 size: 3
8976 },
8977 "\\Bigg": {
8978 mclass: "mord",
8979 size: 4
8980 }
8981 };
8982 var delimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230A", "\u230B", "\\lceil", "\\rceil", "\u2308", "\u2309", "<", ">", "\\langle", "\u27E8", "\\rangle", "\u27E9", "\\lt", "\\gt", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27EE", "\u27EF", "\\lmoustache", "\\rmoustache", "\u23B0", "\u23B1", "/", "\\backslash", "|", "\\vert", "\\|", "\\Vert", "\\uparrow", "\\Uparrow", "\\downarrow", "\\Downarrow", "\\updownarrow", "\\Updownarrow", "."];
8983
8984 // Delimiter functions
8985 function checkDelimiter(delim, context) {
8986 var symDelim = checkSymbolNodeType(delim);
8987
8988 if (symDelim && utils.contains(delimiters, symDelim.text)) {
8989 return symDelim;
8990 } else {
8991 throw new src_ParseError("Invalid delimiter: '" + (symDelim ? symDelim.text : JSON.stringify(delim)) + "' after '" + context.funcName + "'", delim);
8992 }
8993 }
8994
8995 defineFunction({
8996 type: "delimsizing",
8997 names: ["\\bigl", "\\Bigl", "\\biggl", "\\Biggl", "\\bigr", "\\Bigr", "\\biggr", "\\Biggr", "\\bigm", "\\Bigm", "\\biggm", "\\Biggm", "\\big", "\\Big", "\\bigg", "\\Bigg"],
8998 props: {
8999 numArgs: 1
9000 },
9001 handler: function handler(context, args) {
9002 var delim = checkDelimiter(args[0], context);
9003 return {
9004 type: "delimsizing",
9005 mode: context.parser.mode,
9006 size: delimiterSizes[context.funcName].size,
9007 mclass: delimiterSizes[context.funcName].mclass,
9008 delim: delim.text
9009 };
9010 },
9011 htmlBuilder: function htmlBuilder(group, options) {
9012 if (group.delim === ".") {
9013 // Empty delimiters still count as elements, even though they don't
9014 // show anything.
9015 return buildCommon.makeSpan([group.mclass]);
9016 } // Use delimiter.sizedDelim to generate the delimiter.
9017
9018
9019 return delimiter.sizedDelim(group.delim, group.size, options, group.mode, [group.mclass]);
9020 },
9021 mathmlBuilder: function mathmlBuilder(group) {
9022 var children = [];
9023
9024 if (group.delim !== ".") {
9025 children.push(buildMathML_makeText(group.delim, group.mode));
9026 }
9027
9028 var node = new mathMLTree.MathNode("mo", children);
9029
9030 if (group.mclass === "mopen" || group.mclass === "mclose") {
9031 // Only some of the delimsizing functions act as fences, and they
9032 // return "mopen" or "mclose" mclass.
9033 node.setAttribute("fence", "true");
9034 } else {
9035 // Explicitly disable fencing if it's not a fence, to override the
9036 // defaults.
9037 node.setAttribute("fence", "false");
9038 }
9039
9040 return node;
9041 }
9042 });
9043
9044 function assertParsed(group) {
9045 if (!group.body) {
9046 throw new Error("Bug: The leftright ParseNode wasn't fully parsed.");
9047 }
9048 }
9049
9050 defineFunction({
9051 type: "leftright-right",
9052 names: ["\\right"],
9053 props: {
9054 numArgs: 1
9055 },
9056 handler: function handler(context, args) {
9057 // \left case below triggers parsing of \right in
9058 // `const right = parser.parseFunction();`
9059 // uses this return value.
9060 var color = context.parser.gullet.macros.get("\\current@color");
9061
9062 if (color && typeof color !== "string") {
9063 throw new src_ParseError("\\current@color set to non-string in \\right");
9064 }
9065
9066 return {
9067 type: "leftright-right",
9068 mode: context.parser.mode,
9069 delim: checkDelimiter(args[0], context).text,
9070 color: color // undefined if not set via \color
9071
9072 };
9073 }
9074 });
9075 defineFunction({
9076 type: "leftright",
9077 names: ["\\left"],
9078 props: {
9079 numArgs: 1
9080 },
9081 handler: function handler(context, args) {
9082 var delim = checkDelimiter(args[0], context);
9083 var parser = context.parser; // Parse out the implicit body
9084
9085 ++parser.leftrightDepth; // parseExpression stops before '\\right'
9086
9087 var body = parser.parseExpression(false);
9088 --parser.leftrightDepth; // Check the next token
9089
9090 parser.expect("\\right", false);
9091 var right = assertNodeType(parser.parseFunction(), "leftright-right");
9092 return {
9093 type: "leftright",
9094 mode: parser.mode,
9095 body: body,
9096 left: delim.text,
9097 right: right.delim,
9098 rightColor: right.color
9099 };
9100 },
9101 htmlBuilder: function htmlBuilder(group, options) {
9102 assertParsed(group); // Build the inner expression
9103
9104 var inner = buildHTML_buildExpression(group.body, options, true, ["mopen", "mclose"]);
9105 var innerHeight = 0;
9106 var innerDepth = 0;
9107 var hadMiddle = false; // Calculate its height and depth
9108
9109 for (var i = 0; i < inner.length; i++) {
9110 // Property `isMiddle` not defined on `span`. See comment in
9111 // "middle"'s htmlBuilder.
9112 // $FlowFixMe
9113 if (inner[i].isMiddle) {
9114 hadMiddle = true;
9115 } else {
9116 innerHeight = Math.max(inner[i].height, innerHeight);
9117 innerDepth = Math.max(inner[i].depth, innerDepth);
9118 }
9119 } // The size of delimiters is the same, regardless of what style we are
9120 // in. Thus, to correctly calculate the size of delimiter we need around
9121 // a group, we scale down the inner size based on the size.
9122
9123
9124 innerHeight *= options.sizeMultiplier;
9125 innerDepth *= options.sizeMultiplier;
9126 var leftDelim;
9127
9128 if (group.left === ".") {
9129 // Empty delimiters in \left and \right make null delimiter spaces.
9130 leftDelim = makeNullDelimiter(options, ["mopen"]);
9131 } else {
9132 // Otherwise, use leftRightDelim to generate the correct sized
9133 // delimiter.
9134 leftDelim = delimiter.leftRightDelim(group.left, innerHeight, innerDepth, options, group.mode, ["mopen"]);
9135 } // Add it to the beginning of the expression
9136
9137
9138 inner.unshift(leftDelim); // Handle middle delimiters
9139
9140 if (hadMiddle) {
9141 for (var _i = 1; _i < inner.length; _i++) {
9142 var middleDelim = inner[_i]; // Property `isMiddle` not defined on `span`. See comment in
9143 // "middle"'s htmlBuilder.
9144 // $FlowFixMe
9145
9146 var isMiddle = middleDelim.isMiddle;
9147
9148 if (isMiddle) {
9149 // Apply the options that were active when \middle was called
9150 inner[_i] = delimiter.leftRightDelim(isMiddle.delim, innerHeight, innerDepth, isMiddle.options, group.mode, []);
9151 }
9152 }
9153 }
9154
9155 var rightDelim; // Same for the right delimiter, but using color specified by \color
9156
9157 if (group.right === ".") {
9158 rightDelim = makeNullDelimiter(options, ["mclose"]);
9159 } else {
9160 var colorOptions = group.rightColor ? options.withColor(group.rightColor) : options;
9161 rightDelim = delimiter.leftRightDelim(group.right, innerHeight, innerDepth, colorOptions, group.mode, ["mclose"]);
9162 } // Add it to the end of the expression.
9163
9164
9165 inner.push(rightDelim);
9166 return buildCommon.makeSpan(["minner"], inner, options);
9167 },
9168 mathmlBuilder: function mathmlBuilder(group, options) {
9169 assertParsed(group);
9170 var inner = buildMathML_buildExpression(group.body, options);
9171
9172 if (group.left !== ".") {
9173 var leftNode = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.left, group.mode)]);
9174 leftNode.setAttribute("fence", "true");
9175 inner.unshift(leftNode);
9176 }
9177
9178 if (group.right !== ".") {
9179 var rightNode = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.right, group.mode)]);
9180 rightNode.setAttribute("fence", "true");
9181
9182 if (group.rightColor) {
9183 rightNode.setAttribute("mathcolor", group.rightColor);
9184 }
9185
9186 inner.push(rightNode);
9187 }
9188
9189 return buildMathML_makeRow(inner);
9190 }
9191 });
9192 defineFunction({
9193 type: "middle",
9194 names: ["\\middle"],
9195 props: {
9196 numArgs: 1
9197 },
9198 handler: function handler(context, args) {
9199 var delim = checkDelimiter(args[0], context);
9200
9201 if (!context.parser.leftrightDepth) {
9202 throw new src_ParseError("\\middle without preceding \\left", delim);
9203 }
9204
9205 return {
9206 type: "middle",
9207 mode: context.parser.mode,
9208 delim: delim.text
9209 };
9210 },
9211 htmlBuilder: function htmlBuilder(group, options) {
9212 var middleDelim;
9213
9214 if (group.delim === ".") {
9215 middleDelim = makeNullDelimiter(options, []);
9216 } else {
9217 middleDelim = delimiter.sizedDelim(group.delim, 1, options, group.mode, []);
9218 var isMiddle = {
9219 delim: group.delim,
9220 options: options
9221 }; // Property `isMiddle` not defined on `span`. It is only used in
9222 // this file above.
9223 // TODO: Fix this violation of the `span` type and possibly rename
9224 // things since `isMiddle` sounds like a boolean, but is a struct.
9225 // $FlowFixMe
9226
9227 middleDelim.isMiddle = isMiddle;
9228 }
9229
9230 return middleDelim;
9231 },
9232 mathmlBuilder: function mathmlBuilder(group, options) {
9233 // A Firefox \middle will strech a character vertically only if it
9234 // is in the fence part of the operator dictionary at:
9235 // https://www.w3.org/TR/MathML3/appendixc.html.
9236 // So we need to avoid U+2223 and use plain "|" instead.
9237 var textNode = group.delim === "\\vert" || group.delim === "|" ? buildMathML_makeText("|", "text") : buildMathML_makeText(group.delim, group.mode);
9238 var middleNode = new mathMLTree.MathNode("mo", [textNode]);
9239 middleNode.setAttribute("fence", "true"); // MathML gives 5/18em spacing to each <mo> element.
9240 // \middle should get delimiter spacing instead.
9241
9242 middleNode.setAttribute("lspace", "0.05em");
9243 middleNode.setAttribute("rspace", "0.05em");
9244 return middleNode;
9245 }
9246 });
9247 // CONCATENATED MODULE: ./src/functions/enclose.js
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257 var enclose_htmlBuilder = function htmlBuilder(group, options) {
9258 // \cancel, \bcancel, \xcancel, \sout, \fbox, \colorbox, \fcolorbox
9259 // Some groups can return document fragments. Handle those by wrapping
9260 // them in a span.
9261 var inner = buildCommon.wrapFragment(buildHTML_buildGroup(group.body, options), options);
9262 var label = group.label.substr(1);
9263 var scale = options.sizeMultiplier;
9264 var img;
9265 var imgShift = 0; // In the LaTeX cancel package, line geometry is slightly different
9266 // depending on whether the subject is wider than it is tall, or vice versa.
9267 // We don't know the width of a group, so as a proxy, we test if
9268 // the subject is a single character. This captures most of the
9269 // subjects that should get the "tall" treatment.
9270
9271 var isSingleChar = utils.isCharacterBox(group.body);
9272
9273 if (label === "sout") {
9274 img = buildCommon.makeSpan(["stretchy", "sout"]);
9275 img.height = options.fontMetrics().defaultRuleThickness / scale;
9276 imgShift = -0.5 * options.fontMetrics().xHeight;
9277 } else {
9278 // Add horizontal padding
9279 if (/cancel/.test(label)) {
9280 if (!isSingleChar) {
9281 inner.classes.push("cancel-pad");
9282 }
9283 } else {
9284 inner.classes.push("boxpad");
9285 } // Add vertical padding
9286
9287
9288 var vertPad = 0;
9289 var ruleThickness = 0; // ref: cancel package: \advance\totalheight2\p@ % "+2"
9290
9291 if (/box/.test(label)) {
9292 ruleThickness = Math.max(options.fontMetrics().fboxrule, // default
9293 options.minRuleThickness // User override.
9294 );
9295 vertPad = options.fontMetrics().fboxsep + (label === "colorbox" ? 0 : ruleThickness);
9296 } else {
9297 vertPad = isSingleChar ? 0.2 : 0;
9298 }
9299
9300 img = stretchy.encloseSpan(inner, label, vertPad, options);
9301
9302 if (/fbox|boxed|fcolorbox/.test(label)) {
9303 img.style.borderStyle = "solid";
9304 img.style.borderWidth = ruleThickness + "em";
9305 }
9306
9307 imgShift = inner.depth + vertPad;
9308
9309 if (group.backgroundColor) {
9310 img.style.backgroundColor = group.backgroundColor;
9311
9312 if (group.borderColor) {
9313 img.style.borderColor = group.borderColor;
9314 }
9315 }
9316 }
9317
9318 var vlist;
9319
9320 if (group.backgroundColor) {
9321 vlist = buildCommon.makeVList({
9322 positionType: "individualShift",
9323 children: [// Put the color background behind inner;
9324 {
9325 type: "elem",
9326 elem: img,
9327 shift: imgShift
9328 }, {
9329 type: "elem",
9330 elem: inner,
9331 shift: 0
9332 }]
9333 }, options);
9334 } else {
9335 vlist = buildCommon.makeVList({
9336 positionType: "individualShift",
9337 children: [// Write the \cancel stroke on top of inner.
9338 {
9339 type: "elem",
9340 elem: inner,
9341 shift: 0
9342 }, {
9343 type: "elem",
9344 elem: img,
9345 shift: imgShift,
9346 wrapperClasses: /cancel/.test(label) ? ["svg-align"] : []
9347 }]
9348 }, options);
9349 }
9350
9351 if (/cancel/.test(label)) {
9352 // The cancel package documentation says that cancel lines add their height
9353 // to the expression, but tests show that isn't how it actually works.
9354 vlist.height = inner.height;
9355 vlist.depth = inner.depth;
9356 }
9357
9358 if (/cancel/.test(label) && !isSingleChar) {
9359 // cancel does not create horiz space for its line extension.
9360 return buildCommon.makeSpan(["mord", "cancel-lap"], [vlist], options);
9361 } else {
9362 return buildCommon.makeSpan(["mord"], [vlist], options);
9363 }
9364 };
9365
9366 var enclose_mathmlBuilder = function mathmlBuilder(group, options) {
9367 var fboxsep = 0;
9368 var node = new mathMLTree.MathNode(group.label.indexOf("colorbox") > -1 ? "mpadded" : "menclose", [buildMathML_buildGroup(group.body, options)]);
9369
9370 switch (group.label) {
9371 case "\\cancel":
9372 node.setAttribute("notation", "updiagonalstrike");
9373 break;
9374
9375 case "\\bcancel":
9376 node.setAttribute("notation", "downdiagonalstrike");
9377 break;
9378
9379 case "\\sout":
9380 node.setAttribute("notation", "horizontalstrike");
9381 break;
9382
9383 case "\\fbox":
9384 node.setAttribute("notation", "box");
9385 break;
9386
9387 case "\\fcolorbox":
9388 case "\\colorbox":
9389 // <menclose> doesn't have a good notation option. So use <mpadded>
9390 // instead. Set some attributes that come included with <menclose>.
9391 fboxsep = options.fontMetrics().fboxsep * options.fontMetrics().ptPerEm;
9392 node.setAttribute("width", "+" + 2 * fboxsep + "pt");
9393 node.setAttribute("height", "+" + 2 * fboxsep + "pt");
9394 node.setAttribute("lspace", fboxsep + "pt"); //
9395
9396 node.setAttribute("voffset", fboxsep + "pt");
9397
9398 if (group.label === "\\fcolorbox") {
9399 var thk = Math.max(options.fontMetrics().fboxrule, // default
9400 options.minRuleThickness // user override
9401 );
9402 node.setAttribute("style", "border: " + thk + "em solid " + String(group.borderColor));
9403 }
9404
9405 break;
9406
9407 case "\\xcancel":
9408 node.setAttribute("notation", "updiagonalstrike downdiagonalstrike");
9409 break;
9410 }
9411
9412 if (group.backgroundColor) {
9413 node.setAttribute("mathbackground", group.backgroundColor);
9414 }
9415
9416 return node;
9417 };
9418
9419 defineFunction({
9420 type: "enclose",
9421 names: ["\\colorbox"],
9422 props: {
9423 numArgs: 2,
9424 allowedInText: true,
9425 greediness: 3,
9426 argTypes: ["color", "text"]
9427 },
9428 handler: function handler(_ref, args, optArgs) {
9429 var parser = _ref.parser,
9430 funcName = _ref.funcName;
9431 var color = assertNodeType(args[0], "color-token").color;
9432 var body = args[1];
9433 return {
9434 type: "enclose",
9435 mode: parser.mode,
9436 label: funcName,
9437 backgroundColor: color,
9438 body: body
9439 };
9440 },
9441 htmlBuilder: enclose_htmlBuilder,
9442 mathmlBuilder: enclose_mathmlBuilder
9443 });
9444 defineFunction({
9445 type: "enclose",
9446 names: ["\\fcolorbox"],
9447 props: {
9448 numArgs: 3,
9449 allowedInText: true,
9450 greediness: 3,
9451 argTypes: ["color", "color", "text"]
9452 },
9453 handler: function handler(_ref2, args, optArgs) {
9454 var parser = _ref2.parser,
9455 funcName = _ref2.funcName;
9456 var borderColor = assertNodeType(args[0], "color-token").color;
9457 var backgroundColor = assertNodeType(args[1], "color-token").color;
9458 var body = args[2];
9459 return {
9460 type: "enclose",
9461 mode: parser.mode,
9462 label: funcName,
9463 backgroundColor: backgroundColor,
9464 borderColor: borderColor,
9465 body: body
9466 };
9467 },
9468 htmlBuilder: enclose_htmlBuilder,
9469 mathmlBuilder: enclose_mathmlBuilder
9470 });
9471 defineFunction({
9472 type: "enclose",
9473 names: ["\\fbox"],
9474 props: {
9475 numArgs: 1,
9476 argTypes: ["hbox"],
9477 allowedInText: true
9478 },
9479 handler: function handler(_ref3, args) {
9480 var parser = _ref3.parser;
9481 return {
9482 type: "enclose",
9483 mode: parser.mode,
9484 label: "\\fbox",
9485 body: args[0]
9486 };
9487 }
9488 });
9489 defineFunction({
9490 type: "enclose",
9491 names: ["\\cancel", "\\bcancel", "\\xcancel", "\\sout"],
9492 props: {
9493 numArgs: 1
9494 },
9495 handler: function handler(_ref4, args, optArgs) {
9496 var parser = _ref4.parser,
9497 funcName = _ref4.funcName;
9498 var body = args[0];
9499 return {
9500 type: "enclose",
9501 mode: parser.mode,
9502 label: funcName,
9503 body: body
9504 };
9505 },
9506 htmlBuilder: enclose_htmlBuilder,
9507 mathmlBuilder: enclose_mathmlBuilder
9508 });
9509 // CONCATENATED MODULE: ./src/defineEnvironment.js
9510
9511
9512 /**
9513 * All registered environments.
9514 * `environments.js` exports this same dictionary again and makes it public.
9515 * `Parser.js` requires this dictionary via `environments.js`.
9516 */
9517 var _environments = {};
9518 function defineEnvironment(_ref) {
9519 var type = _ref.type,
9520 names = _ref.names,
9521 props = _ref.props,
9522 handler = _ref.handler,
9523 htmlBuilder = _ref.htmlBuilder,
9524 mathmlBuilder = _ref.mathmlBuilder;
9525 // Set default values of environments.
9526 var data = {
9527 type: type,
9528 numArgs: props.numArgs || 0,
9529 greediness: 1,
9530 allowedInText: false,
9531 numOptionalArgs: 0,
9532 handler: handler
9533 };
9534
9535 for (var i = 0; i < names.length; ++i) {
9536 // TODO: The value type of _environments should be a type union of all
9537 // possible `EnvSpec<>` possibilities instead of `EnvSpec<*>`, which is
9538 // an existential type.
9539 // $FlowFixMe
9540 _environments[names[i]] = data;
9541 }
9542
9543 if (htmlBuilder) {
9544 _htmlGroupBuilders[type] = htmlBuilder;
9545 }
9546
9547 if (mathmlBuilder) {
9548 _mathmlGroupBuilders[type] = mathmlBuilder;
9549 }
9550 }
9551 // CONCATENATED MODULE: ./src/environments/array.js
9552
9553
9554
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565 function getHLines(parser) {
9566 // Return an array. The array length = number of hlines.
9567 // Each element in the array tells if the line is dashed.
9568 var hlineInfo = [];
9569 parser.consumeSpaces();
9570 var nxt = parser.fetch().text;
9571
9572 while (nxt === "\\hline" || nxt === "\\hdashline") {
9573 parser.consume();
9574 hlineInfo.push(nxt === "\\hdashline");
9575 parser.consumeSpaces();
9576 nxt = parser.fetch().text;
9577 }
9578
9579 return hlineInfo;
9580 }
9581 /**
9582 * Parse the body of the environment, with rows delimited by \\ and
9583 * columns delimited by &, and create a nested list in row-major order
9584 * with one group per cell. If given an optional argument style
9585 * ("text", "display", etc.), then each cell is cast into that style.
9586 */
9587
9588
9589 function parseArray(parser, _ref, style) {
9590 var hskipBeforeAndAfter = _ref.hskipBeforeAndAfter,
9591 addJot = _ref.addJot,
9592 cols = _ref.cols,
9593 arraystretch = _ref.arraystretch,
9594 colSeparationType = _ref.colSeparationType;
9595 // Parse body of array with \\ temporarily mapped to \cr
9596 parser.gullet.beginGroup();
9597 parser.gullet.macros.set("\\\\", "\\cr"); // Get current arraystretch if it's not set by the environment
9598
9599 if (!arraystretch) {
9600 var stretch = parser.gullet.expandMacroAsText("\\arraystretch");
9601
9602 if (stretch == null) {
9603 // Default \arraystretch from lttab.dtx
9604 arraystretch = 1;
9605 } else {
9606 arraystretch = parseFloat(stretch);
9607
9608 if (!arraystretch || arraystretch < 0) {
9609 throw new src_ParseError("Invalid \\arraystretch: " + stretch);
9610 }
9611 }
9612 } // Start group for first cell
9613
9614
9615 parser.gullet.beginGroup();
9616 var row = [];
9617 var body = [row];
9618 var rowGaps = [];
9619 var hLinesBeforeRow = []; // Test for \hline at the top of the array.
9620
9621 hLinesBeforeRow.push(getHLines(parser));
9622
9623 while (true) {
9624 // eslint-disable-line no-constant-condition
9625 // Parse each cell in its own group (namespace)
9626 var cell = parser.parseExpression(false, "\\cr");
9627 parser.gullet.endGroup();
9628 parser.gullet.beginGroup();
9629 cell = {
9630 type: "ordgroup",
9631 mode: parser.mode,
9632 body: cell
9633 };
9634
9635 if (style) {
9636 cell = {
9637 type: "styling",
9638 mode: parser.mode,
9639 style: style,
9640 body: [cell]
9641 };
9642 }
9643
9644 row.push(cell);
9645 var next = parser.fetch().text;
9646
9647 if (next === "&") {
9648 parser.consume();
9649 } else if (next === "\\end") {
9650 // Arrays terminate newlines with `\crcr` which consumes a `\cr` if
9651 // the last line is empty.
9652 // NOTE: Currently, `cell` is the last item added into `row`.
9653 if (row.length === 1 && cell.type === "styling" && cell.body[0].body.length === 0) {
9654 body.pop();
9655 }
9656
9657 if (hLinesBeforeRow.length < body.length + 1) {
9658 hLinesBeforeRow.push([]);
9659 }
9660
9661 break;
9662 } else if (next === "\\cr") {
9663 var cr = assertNodeType(parser.parseFunction(), "cr");
9664 rowGaps.push(cr.size); // check for \hline(s) following the row separator
9665
9666 hLinesBeforeRow.push(getHLines(parser));
9667 row = [];
9668 body.push(row);
9669 } else {
9670 throw new src_ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken);
9671 }
9672 } // End cell group
9673
9674
9675 parser.gullet.endGroup(); // End array group defining \\
9676
9677 parser.gullet.endGroup();
9678 return {
9679 type: "array",
9680 mode: parser.mode,
9681 addJot: addJot,
9682 arraystretch: arraystretch,
9683 body: body,
9684 cols: cols,
9685 rowGaps: rowGaps,
9686 hskipBeforeAndAfter: hskipBeforeAndAfter,
9687 hLinesBeforeRow: hLinesBeforeRow,
9688 colSeparationType: colSeparationType
9689 };
9690 } // Decides on a style for cells in an array according to whether the given
9691 // environment name starts with the letter 'd'.
9692
9693
9694 function dCellStyle(envName) {
9695 if (envName.substr(0, 1) === "d") {
9696 return "display";
9697 } else {
9698 return "text";
9699 }
9700 }
9701
9702 var array_htmlBuilder = function htmlBuilder(group, options) {
9703 var r;
9704 var c;
9705 var nr = group.body.length;
9706 var hLinesBeforeRow = group.hLinesBeforeRow;
9707 var nc = 0;
9708 var body = new Array(nr);
9709 var hlines = [];
9710 var ruleThickness = Math.max( // From LaTeX \showthe\arrayrulewidth. Equals 0.04 em.
9711 options.fontMetrics().arrayRuleWidth, options.minRuleThickness // User override.
9712 ); // Horizontal spacing
9713
9714 var pt = 1 / options.fontMetrics().ptPerEm;
9715 var arraycolsep = 5 * pt; // default value, i.e. \arraycolsep in article.cls
9716
9717 if (group.colSeparationType && group.colSeparationType === "small") {
9718 // We're in a {smallmatrix}. Default column space is \thickspace,
9719 // i.e. 5/18em = 0.2778em, per amsmath.dtx for {smallmatrix}.
9720 // But that needs adjustment because LaTeX applies \scriptstyle to the
9721 // entire array, including the colspace, but this function applies
9722 // \scriptstyle only inside each element.
9723 var localMultiplier = options.havingStyle(src_Style.SCRIPT).sizeMultiplier;
9724 arraycolsep = 0.2778 * (localMultiplier / options.sizeMultiplier);
9725 } // Vertical spacing
9726
9727
9728 var baselineskip = 12 * pt; // see size10.clo
9729 // Default \jot from ltmath.dtx
9730 // TODO(edemaine): allow overriding \jot via \setlength (#687)
9731
9732 var jot = 3 * pt;
9733 var arrayskip = group.arraystretch * baselineskip;
9734 var arstrutHeight = 0.7 * arrayskip; // \strutbox in ltfsstrc.dtx and
9735
9736 var arstrutDepth = 0.3 * arrayskip; // \@arstrutbox in lttab.dtx
9737
9738 var totalHeight = 0; // Set a position for \hline(s) at the top of the array, if any.
9739
9740 function setHLinePos(hlinesInGap) {
9741 for (var i = 0; i < hlinesInGap.length; ++i) {
9742 if (i > 0) {
9743 totalHeight += 0.25;
9744 }
9745
9746 hlines.push({
9747 pos: totalHeight,
9748 isDashed: hlinesInGap[i]
9749 });
9750 }
9751 }
9752
9753 setHLinePos(hLinesBeforeRow[0]);
9754
9755 for (r = 0; r < group.body.length; ++r) {
9756 var inrow = group.body[r];
9757 var height = arstrutHeight; // \@array adds an \@arstrut
9758
9759 var depth = arstrutDepth; // to each tow (via the template)
9760
9761 if (nc < inrow.length) {
9762 nc = inrow.length;
9763 }
9764
9765 var outrow = new Array(inrow.length);
9766
9767 for (c = 0; c < inrow.length; ++c) {
9768 var elt = buildHTML_buildGroup(inrow[c], options);
9769
9770 if (depth < elt.depth) {
9771 depth = elt.depth;
9772 }
9773
9774 if (height < elt.height) {
9775 height = elt.height;
9776 }
9777
9778 outrow[c] = elt;
9779 }
9780
9781 var rowGap = group.rowGaps[r];
9782 var gap = 0;
9783
9784 if (rowGap) {
9785 gap = units_calculateSize(rowGap, options);
9786
9787 if (gap > 0) {
9788 // \@argarraycr
9789 gap += arstrutDepth;
9790
9791 if (depth < gap) {
9792 depth = gap; // \@xargarraycr
9793 }
9794
9795 gap = 0;
9796 }
9797 } // In AMS multiline environments such as aligned and gathered, rows
9798 // correspond to lines that have additional \jot added to the
9799 // \baselineskip via \openup.
9800
9801
9802 if (group.addJot) {
9803 depth += jot;
9804 }
9805
9806 outrow.height = height;
9807 outrow.depth = depth;
9808 totalHeight += height;
9809 outrow.pos = totalHeight;
9810 totalHeight += depth + gap; // \@yargarraycr
9811
9812 body[r] = outrow; // Set a position for \hline(s), if any.
9813
9814 setHLinePos(hLinesBeforeRow[r + 1]);
9815 }
9816
9817 var offset = totalHeight / 2 + options.fontMetrics().axisHeight;
9818 var colDescriptions = group.cols || [];
9819 var cols = [];
9820 var colSep;
9821 var colDescrNum;
9822
9823 for (c = 0, colDescrNum = 0; // Continue while either there are more columns or more column
9824 // descriptions, so trailing separators don't get lost.
9825 c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) {
9826 var colDescr = colDescriptions[colDescrNum] || {};
9827 var firstSeparator = true;
9828
9829 while (colDescr.type === "separator") {
9830 // If there is more than one separator in a row, add a space
9831 // between them.
9832 if (!firstSeparator) {
9833 colSep = buildCommon.makeSpan(["arraycolsep"], []);
9834 colSep.style.width = options.fontMetrics().doubleRuleSep + "em";
9835 cols.push(colSep);
9836 }
9837
9838 if (colDescr.separator === "|" || colDescr.separator === ":") {
9839 var lineType = colDescr.separator === "|" ? "solid" : "dashed";
9840 var separator = buildCommon.makeSpan(["vertical-separator"], [], options);
9841 separator.style.height = totalHeight + "em";
9842 separator.style.borderRightWidth = ruleThickness + "em";
9843 separator.style.borderRightStyle = lineType;
9844 separator.style.margin = "0 -" + ruleThickness / 2 + "em";
9845 separator.style.verticalAlign = -(totalHeight - offset) + "em";
9846 cols.push(separator);
9847 } else {
9848 throw new src_ParseError("Invalid separator type: " + colDescr.separator);
9849 }
9850
9851 colDescrNum++;
9852 colDescr = colDescriptions[colDescrNum] || {};
9853 firstSeparator = false;
9854 }
9855
9856 if (c >= nc) {
9857 continue;
9858 }
9859
9860 var sepwidth = void 0;
9861
9862 if (c > 0 || group.hskipBeforeAndAfter) {
9863 sepwidth = utils.deflt(colDescr.pregap, arraycolsep);
9864
9865 if (sepwidth !== 0) {
9866 colSep = buildCommon.makeSpan(["arraycolsep"], []);
9867 colSep.style.width = sepwidth + "em";
9868 cols.push(colSep);
9869 }
9870 }
9871
9872 var col = [];
9873
9874 for (r = 0; r < nr; ++r) {
9875 var row = body[r];
9876 var elem = row[c];
9877
9878 if (!elem) {
9879 continue;
9880 }
9881
9882 var shift = row.pos - offset;
9883 elem.depth = row.depth;
9884 elem.height = row.height;
9885 col.push({
9886 type: "elem",
9887 elem: elem,
9888 shift: shift
9889 });
9890 }
9891
9892 col = buildCommon.makeVList({
9893 positionType: "individualShift",
9894 children: col
9895 }, options);
9896 col = buildCommon.makeSpan(["col-align-" + (colDescr.align || "c")], [col]);
9897 cols.push(col);
9898
9899 if (c < nc - 1 || group.hskipBeforeAndAfter) {
9900 sepwidth = utils.deflt(colDescr.postgap, arraycolsep);
9901
9902 if (sepwidth !== 0) {
9903 colSep = buildCommon.makeSpan(["arraycolsep"], []);
9904 colSep.style.width = sepwidth + "em";
9905 cols.push(colSep);
9906 }
9907 }
9908 }
9909
9910 body = buildCommon.makeSpan(["mtable"], cols); // Add \hline(s), if any.
9911
9912 if (hlines.length > 0) {
9913 var line = buildCommon.makeLineSpan("hline", options, ruleThickness);
9914 var dashes = buildCommon.makeLineSpan("hdashline", options, ruleThickness);
9915 var vListElems = [{
9916 type: "elem",
9917 elem: body,
9918 shift: 0
9919 }];
9920
9921 while (hlines.length > 0) {
9922 var hline = hlines.pop();
9923 var lineShift = hline.pos - offset;
9924
9925 if (hline.isDashed) {
9926 vListElems.push({
9927 type: "elem",
9928 elem: dashes,
9929 shift: lineShift
9930 });
9931 } else {
9932 vListElems.push({
9933 type: "elem",
9934 elem: line,
9935 shift: lineShift
9936 });
9937 }
9938 }
9939
9940 body = buildCommon.makeVList({
9941 positionType: "individualShift",
9942 children: vListElems
9943 }, options);
9944 }
9945
9946 return buildCommon.makeSpan(["mord"], [body], options);
9947 };
9948
9949 var alignMap = {
9950 c: "center ",
9951 l: "left ",
9952 r: "right "
9953 };
9954
9955 var array_mathmlBuilder = function mathmlBuilder(group, options) {
9956 var table = new mathMLTree.MathNode("mtable", group.body.map(function (row) {
9957 return new mathMLTree.MathNode("mtr", row.map(function (cell) {
9958 return new mathMLTree.MathNode("mtd", [buildMathML_buildGroup(cell, options)]);
9959 }));
9960 })); // Set column alignment, row spacing, column spacing, and
9961 // array lines by setting attributes on the table element.
9962 // Set the row spacing. In MathML, we specify a gap distance.
9963 // We do not use rowGap[] because MathML automatically increases
9964 // cell height with the height/depth of the element content.
9965 // LaTeX \arraystretch multiplies the row baseline-to-baseline distance.
9966 // We simulate this by adding (arraystretch - 1)em to the gap. This
9967 // does a reasonable job of adjusting arrays containing 1 em tall content.
9968 // The 0.16 and 0.09 values are found emprically. They produce an array
9969 // similar to LaTeX and in which content does not interfere with \hines.
9970
9971 var gap = group.arraystretch === 0.5 ? 0.1 // {smallmatrix}, {subarray}
9972 : 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0);
9973 table.setAttribute("rowspacing", gap + "em"); // MathML table lines go only between cells.
9974 // To place a line on an edge we'll use <menclose>, if necessary.
9975
9976 var menclose = "";
9977 var align = "";
9978
9979 if (group.cols) {
9980 // Find column alignment, column spacing, and vertical lines.
9981 var cols = group.cols;
9982 var columnLines = "";
9983 var prevTypeWasAlign = false;
9984 var iStart = 0;
9985 var iEnd = cols.length;
9986
9987 if (cols[0].type === "separator") {
9988 menclose += "top ";
9989 iStart = 1;
9990 }
9991
9992 if (cols[cols.length - 1].type === "separator") {
9993 menclose += "bottom ";
9994 iEnd -= 1;
9995 }
9996
9997 for (var i = iStart; i < iEnd; i++) {
9998 if (cols[i].type === "align") {
9999 align += alignMap[cols[i].align];
10000
10001 if (prevTypeWasAlign) {
10002 columnLines += "none ";
10003 }
10004
10005 prevTypeWasAlign = true;
10006 } else if (cols[i].type === "separator") {
10007 // MathML accepts only single lines between cells.
10008 // So we read only the first of consecutive separators.
10009 if (prevTypeWasAlign) {
10010 columnLines += cols[i].separator === "|" ? "solid " : "dashed ";
10011 prevTypeWasAlign = false;
10012 }
10013 }
10014 }
10015
10016 table.setAttribute("columnalign", align.trim());
10017
10018 if (/[sd]/.test(columnLines)) {
10019 table.setAttribute("columnlines", columnLines.trim());
10020 }
10021 } // Set column spacing.
10022
10023
10024 if (group.colSeparationType === "align") {
10025 var _cols = group.cols || [];
10026
10027 var spacing = "";
10028
10029 for (var _i = 1; _i < _cols.length; _i++) {
10030 spacing += _i % 2 ? "0em " : "1em ";
10031 }
10032
10033 table.setAttribute("columnspacing", spacing.trim());
10034 } else if (group.colSeparationType === "alignat") {
10035 table.setAttribute("columnspacing", "0em");
10036 } else if (group.colSeparationType === "small") {
10037 table.setAttribute("columnspacing", "0.2778em");
10038 } else {
10039 table.setAttribute("columnspacing", "1em");
10040 } // Address \hline and \hdashline
10041
10042
10043 var rowLines = "";
10044 var hlines = group.hLinesBeforeRow;
10045 menclose += hlines[0].length > 0 ? "left " : "";
10046 menclose += hlines[hlines.length - 1].length > 0 ? "right " : "";
10047
10048 for (var _i2 = 1; _i2 < hlines.length - 1; _i2++) {
10049 rowLines += hlines[_i2].length === 0 ? "none " // MathML accepts only a single line between rows. Read one element.
10050 : hlines[_i2][0] ? "dashed " : "solid ";
10051 }
10052
10053 if (/[sd]/.test(rowLines)) {
10054 table.setAttribute("rowlines", rowLines.trim());
10055 }
10056
10057 if (menclose !== "") {
10058 table = new mathMLTree.MathNode("menclose", [table]);
10059 table.setAttribute("notation", menclose.trim());
10060 }
10061
10062 if (group.arraystretch && group.arraystretch < 1) {
10063 // A small array. Wrap in scriptstyle so row gap is not too large.
10064 table = new mathMLTree.MathNode("mstyle", [table]);
10065 table.setAttribute("scriptlevel", "1");
10066 }
10067
10068 return table;
10069 }; // Convenience function for aligned and alignedat environments.
10070
10071
10072 var array_alignedHandler = function alignedHandler(context, args) {
10073 var cols = [];
10074 var res = parseArray(context.parser, {
10075 cols: cols,
10076 addJot: true
10077 }, "display"); // Determining number of columns.
10078 // 1. If the first argument is given, we use it as a number of columns,
10079 // and makes sure that each row doesn't exceed that number.
10080 // 2. Otherwise, just count number of columns = maximum number
10081 // of cells in each row ("aligned" mode -- isAligned will be true).
10082 //
10083 // At the same time, prepend empty group {} at beginning of every second
10084 // cell in each row (starting with second cell) so that operators become
10085 // binary. This behavior is implemented in amsmath's \start@aligned.
10086
10087 var numMaths;
10088 var numCols = 0;
10089 var emptyGroup = {
10090 type: "ordgroup",
10091 mode: context.mode,
10092 body: []
10093 };
10094 var ordgroup = checkNodeType(args[0], "ordgroup");
10095
10096 if (ordgroup) {
10097 var arg0 = "";
10098
10099 for (var i = 0; i < ordgroup.body.length; i++) {
10100 var textord = assertNodeType(ordgroup.body[i], "textord");
10101 arg0 += textord.text;
10102 }
10103
10104 numMaths = Number(arg0);
10105 numCols = numMaths * 2;
10106 }
10107
10108 var isAligned = !numCols;
10109 res.body.forEach(function (row) {
10110 for (var _i3 = 1; _i3 < row.length; _i3 += 2) {
10111 // Modify ordgroup node within styling node
10112 var styling = assertNodeType(row[_i3], "styling");
10113
10114 var _ordgroup = assertNodeType(styling.body[0], "ordgroup");
10115
10116 _ordgroup.body.unshift(emptyGroup);
10117 }
10118
10119 if (!isAligned) {
10120 // Case 1
10121 var curMaths = row.length / 2;
10122
10123 if (numMaths < curMaths) {
10124 throw new src_ParseError("Too many math in a row: " + ("expected " + numMaths + ", but got " + curMaths), row[0]);
10125 }
10126 } else if (numCols < row.length) {
10127 // Case 2
10128 numCols = row.length;
10129 }
10130 }); // Adjusting alignment.
10131 // In aligned mode, we add one \qquad between columns;
10132 // otherwise we add nothing.
10133
10134 for (var _i4 = 0; _i4 < numCols; ++_i4) {
10135 var align = "r";
10136 var pregap = 0;
10137
10138 if (_i4 % 2 === 1) {
10139 align = "l";
10140 } else if (_i4 > 0 && isAligned) {
10141 // "aligned" mode.
10142 pregap = 1; // add one \quad
10143 }
10144
10145 cols[_i4] = {
10146 type: "align",
10147 align: align,
10148 pregap: pregap,
10149 postgap: 0
10150 };
10151 }
10152
10153 res.colSeparationType = isAligned ? "align" : "alignat";
10154 return res;
10155 }; // Arrays are part of LaTeX, defined in lttab.dtx so its documentation
10156 // is part of the source2e.pdf file of LaTeX2e source documentation.
10157 // {darray} is an {array} environment where cells are set in \displaystyle,
10158 // as defined in nccmath.sty.
10159
10160
10161 defineEnvironment({
10162 type: "array",
10163 names: ["array", "darray"],
10164 props: {
10165 numArgs: 1
10166 },
10167 handler: function handler(context, args) {
10168 // Since no types are specified above, the two possibilities are
10169 // - The argument is wrapped in {} or [], in which case Parser's
10170 // parseGroup() returns an "ordgroup" wrapping some symbol node.
10171 // - The argument is a bare symbol node.
10172 var symNode = checkSymbolNodeType(args[0]);
10173 var colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body;
10174 var cols = colalign.map(function (nde) {
10175 var node = assertSymbolNodeType(nde);
10176 var ca = node.text;
10177
10178 if ("lcr".indexOf(ca) !== -1) {
10179 return {
10180 type: "align",
10181 align: ca
10182 };
10183 } else if (ca === "|") {
10184 return {
10185 type: "separator",
10186 separator: "|"
10187 };
10188 } else if (ca === ":") {
10189 return {
10190 type: "separator",
10191 separator: ":"
10192 };
10193 }
10194
10195 throw new src_ParseError("Unknown column alignment: " + ca, nde);
10196 });
10197 var res = {
10198 cols: cols,
10199 hskipBeforeAndAfter: true // \@preamble in lttab.dtx
10200
10201 };
10202 return parseArray(context.parser, res, dCellStyle(context.envName));
10203 },
10204 htmlBuilder: array_htmlBuilder,
10205 mathmlBuilder: array_mathmlBuilder
10206 }); // The matrix environments of amsmath builds on the array environment
10207 // of LaTeX, which is discussed above.
10208
10209 defineEnvironment({
10210 type: "array",
10211 names: ["matrix", "pmatrix", "bmatrix", "Bmatrix", "vmatrix", "Vmatrix"],
10212 props: {
10213 numArgs: 0
10214 },
10215 handler: function handler(context) {
10216 var delimiters = {
10217 "matrix": null,
10218 "pmatrix": ["(", ")"],
10219 "bmatrix": ["[", "]"],
10220 "Bmatrix": ["\\{", "\\}"],
10221 "vmatrix": ["|", "|"],
10222 "Vmatrix": ["\\Vert", "\\Vert"]
10223 }[context.envName]; // \hskip -\arraycolsep in amsmath
10224
10225 var payload = {
10226 hskipBeforeAndAfter: false
10227 };
10228 var res = parseArray(context.parser, payload, dCellStyle(context.envName));
10229 return delimiters ? {
10230 type: "leftright",
10231 mode: context.mode,
10232 body: [res],
10233 left: delimiters[0],
10234 right: delimiters[1],
10235 rightColor: undefined // \right uninfluenced by \color in array
10236
10237 } : res;
10238 },
10239 htmlBuilder: array_htmlBuilder,
10240 mathmlBuilder: array_mathmlBuilder
10241 });
10242 defineEnvironment({
10243 type: "array",
10244 names: ["smallmatrix"],
10245 props: {
10246 numArgs: 0
10247 },
10248 handler: function handler(context) {
10249 var payload = {
10250 arraystretch: 0.5
10251 };
10252 var res = parseArray(context.parser, payload, "script");
10253 res.colSeparationType = "small";
10254 return res;
10255 },
10256 htmlBuilder: array_htmlBuilder,
10257 mathmlBuilder: array_mathmlBuilder
10258 });
10259 defineEnvironment({
10260 type: "array",
10261 names: ["subarray"],
10262 props: {
10263 numArgs: 1
10264 },
10265 handler: function handler(context, args) {
10266 // Parsing of {subarray} is similar to {array}
10267 var symNode = checkSymbolNodeType(args[0]);
10268 var colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body;
10269 var cols = colalign.map(function (nde) {
10270 var node = assertSymbolNodeType(nde);
10271 var ca = node.text; // {subarray} only recognizes "l" & "c"
10272
10273 if ("lc".indexOf(ca) !== -1) {
10274 return {
10275 type: "align",
10276 align: ca
10277 };
10278 }
10279
10280 throw new src_ParseError("Unknown column alignment: " + ca, nde);
10281 });
10282
10283 if (cols.length > 1) {
10284 throw new src_ParseError("{subarray} can contain only one column");
10285 }
10286
10287 var res = {
10288 cols: cols,
10289 hskipBeforeAndAfter: false,
10290 arraystretch: 0.5
10291 };
10292 res = parseArray(context.parser, res, "script");
10293
10294 if (res.body[0].length > 1) {
10295 throw new src_ParseError("{subarray} can contain only one column");
10296 }
10297
10298 return res;
10299 },
10300 htmlBuilder: array_htmlBuilder,
10301 mathmlBuilder: array_mathmlBuilder
10302 }); // A cases environment (in amsmath.sty) is almost equivalent to
10303 // \def\arraystretch{1.2}%
10304 // \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right.
10305 // {dcases} is a {cases} environment where cells are set in \displaystyle,
10306 // as defined in mathtools.sty.
10307
10308 defineEnvironment({
10309 type: "array",
10310 names: ["cases", "dcases"],
10311 props: {
10312 numArgs: 0
10313 },
10314 handler: function handler(context) {
10315 var payload = {
10316 arraystretch: 1.2,
10317 cols: [{
10318 type: "align",
10319 align: "l",
10320 pregap: 0,
10321 // TODO(kevinb) get the current style.
10322 // For now we use the metrics for TEXT style which is what we were
10323 // doing before. Before attempting to get the current style we
10324 // should look at TeX's behavior especially for \over and matrices.
10325 postgap: 1.0
10326 /* 1em quad */
10327
10328 }, {
10329 type: "align",
10330 align: "l",
10331 pregap: 0,
10332 postgap: 0
10333 }]
10334 };
10335 var res = parseArray(context.parser, payload, dCellStyle(context.envName));
10336 return {
10337 type: "leftright",
10338 mode: context.mode,
10339 body: [res],
10340 left: "\\{",
10341 right: ".",
10342 rightColor: undefined
10343 };
10344 },
10345 htmlBuilder: array_htmlBuilder,
10346 mathmlBuilder: array_mathmlBuilder
10347 }); // An aligned environment is like the align* environment
10348 // except it operates within math mode.
10349 // Note that we assume \nomallineskiplimit to be zero,
10350 // so that \strut@ is the same as \strut.
10351
10352 defineEnvironment({
10353 type: "array",
10354 names: ["aligned"],
10355 props: {
10356 numArgs: 0
10357 },
10358 handler: array_alignedHandler,
10359 htmlBuilder: array_htmlBuilder,
10360 mathmlBuilder: array_mathmlBuilder
10361 }); // A gathered environment is like an array environment with one centered
10362 // column, but where rows are considered lines so get \jot line spacing
10363 // and contents are set in \displaystyle.
10364
10365 defineEnvironment({
10366 type: "array",
10367 names: ["gathered"],
10368 props: {
10369 numArgs: 0
10370 },
10371 handler: function handler(context) {
10372 var res = {
10373 cols: [{
10374 type: "align",
10375 align: "c"
10376 }],
10377 addJot: true
10378 };
10379 return parseArray(context.parser, res, "display");
10380 },
10381 htmlBuilder: array_htmlBuilder,
10382 mathmlBuilder: array_mathmlBuilder
10383 }); // alignat environment is like an align environment, but one must explicitly
10384 // specify maximum number of columns in each row, and can adjust spacing between
10385 // each columns.
10386
10387 defineEnvironment({
10388 type: "array",
10389 names: ["alignedat"],
10390 // One for numbered and for unnumbered;
10391 // but, KaTeX doesn't supports math numbering yet,
10392 // they make no difference for now.
10393 props: {
10394 numArgs: 1
10395 },
10396 handler: array_alignedHandler,
10397 htmlBuilder: array_htmlBuilder,
10398 mathmlBuilder: array_mathmlBuilder
10399 }); // Catch \hline outside array environment
10400
10401 defineFunction({
10402 type: "text",
10403 // Doesn't matter what this is.
10404 names: ["\\hline", "\\hdashline"],
10405 props: {
10406 numArgs: 0,
10407 allowedInText: true,
10408 allowedInMath: true
10409 },
10410 handler: function handler(context, args) {
10411 throw new src_ParseError(context.funcName + " valid only within array environment");
10412 }
10413 });
10414 // CONCATENATED MODULE: ./src/environments.js
10415
10416 var environments = _environments;
10417 /* harmony default export */ var src_environments = (environments); // All environment definitions should be imported below
10418
10419
10420 // CONCATENATED MODULE: ./src/functions/environment.js
10421
10422
10423
10424 // Environment delimiters. HTML/MathML rendering is defined in the corresponding
10425 // defineEnvironment definitions.
10426 // $FlowFixMe, "environment" handler returns an environment ParseNode
10427
10428 defineFunction({
10429 type: "environment",
10430 names: ["\\begin", "\\end"],
10431 props: {
10432 numArgs: 1,
10433 argTypes: ["text"]
10434 },
10435 handler: function handler(_ref, args) {
10436 var parser = _ref.parser,
10437 funcName = _ref.funcName;
10438 var nameGroup = args[0];
10439
10440 if (nameGroup.type !== "ordgroup") {
10441 throw new src_ParseError("Invalid environment name", nameGroup);
10442 }
10443
10444 var envName = "";
10445
10446 for (var i = 0; i < nameGroup.body.length; ++i) {
10447 envName += assertNodeType(nameGroup.body[i], "textord").text;
10448 }
10449
10450 if (funcName === "\\begin") {
10451 // begin...end is similar to left...right
10452 if (!src_environments.hasOwnProperty(envName)) {
10453 throw new src_ParseError("No such environment: " + envName, nameGroup);
10454 } // Build the environment object. Arguments and other information will
10455 // be made available to the begin and end methods using properties.
10456
10457
10458 var env = src_environments[envName];
10459
10460 var _parser$parseArgument = parser.parseArguments("\\begin{" + envName + "}", env),
10461 _args = _parser$parseArgument.args,
10462 optArgs = _parser$parseArgument.optArgs;
10463
10464 var context = {
10465 mode: parser.mode,
10466 envName: envName,
10467 parser: parser
10468 };
10469 var result = env.handler(context, _args, optArgs);
10470 parser.expect("\\end", false);
10471 var endNameToken = parser.nextToken;
10472 var end = assertNodeType(parser.parseFunction(), "environment");
10473
10474 if (end.name !== envName) {
10475 throw new src_ParseError("Mismatch: \\begin{" + envName + "} matched by \\end{" + end.name + "}", endNameToken);
10476 }
10477
10478 return result;
10479 }
10480
10481 return {
10482 type: "environment",
10483 mode: parser.mode,
10484 name: envName,
10485 nameGroup: nameGroup
10486 };
10487 }
10488 });
10489 // CONCATENATED MODULE: ./src/functions/mclass.js
10490
10491
10492
10493
10494
10495
10496 var mclass_makeSpan = buildCommon.makeSpan;
10497
10498 function mclass_htmlBuilder(group, options) {
10499 var elements = buildHTML_buildExpression(group.body, options, true);
10500 return mclass_makeSpan([group.mclass], elements, options);
10501 }
10502
10503 function mclass_mathmlBuilder(group, options) {
10504 var node;
10505 var inner = buildMathML_buildExpression(group.body, options);
10506
10507 if (group.mclass === "minner") {
10508 return mathMLTree.newDocumentFragment(inner);
10509 } else if (group.mclass === "mord") {
10510 if (group.isCharacterBox) {
10511 node = inner[0];
10512 node.type = "mi";
10513 } else {
10514 node = new mathMLTree.MathNode("mi", inner);
10515 }
10516 } else {
10517 if (group.isCharacterBox) {
10518 node = inner[0];
10519 node.type = "mo";
10520 } else {
10521 node = new mathMLTree.MathNode("mo", inner);
10522 } // Set spacing based on what is the most likely adjacent atom type.
10523 // See TeXbook p170.
10524
10525
10526 if (group.mclass === "mbin") {
10527 node.attributes.lspace = "0.22em"; // medium space
10528
10529 node.attributes.rspace = "0.22em";
10530 } else if (group.mclass === "mpunct") {
10531 node.attributes.lspace = "0em";
10532 node.attributes.rspace = "0.17em"; // thinspace
10533 } else if (group.mclass === "mopen" || group.mclass === "mclose") {
10534 node.attributes.lspace = "0em";
10535 node.attributes.rspace = "0em";
10536 } // MathML <mo> default space is 5/18 em, so <mrel> needs no action.
10537 // Ref: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo
10538
10539 }
10540
10541 return node;
10542 } // Math class commands except \mathop
10543
10544
10545 defineFunction({
10546 type: "mclass",
10547 names: ["\\mathord", "\\mathbin", "\\mathrel", "\\mathopen", "\\mathclose", "\\mathpunct", "\\mathinner"],
10548 props: {
10549 numArgs: 1
10550 },
10551 handler: function handler(_ref, args) {
10552 var parser = _ref.parser,
10553 funcName = _ref.funcName;
10554 var body = args[0];
10555 return {
10556 type: "mclass",
10557 mode: parser.mode,
10558 mclass: "m" + funcName.substr(5),
10559 // TODO(kevinb): don't prefix with 'm'
10560 body: defineFunction_ordargument(body),
10561 isCharacterBox: utils.isCharacterBox(body)
10562 };
10563 },
10564 htmlBuilder: mclass_htmlBuilder,
10565 mathmlBuilder: mclass_mathmlBuilder
10566 });
10567 var binrelClass = function binrelClass(arg) {
10568 // \binrel@ spacing varies with (bin|rel|ord) of the atom in the argument.
10569 // (by rendering separately and with {}s before and after, and measuring
10570 // the change in spacing). We'll do roughly the same by detecting the
10571 // atom type directly.
10572 var atom = arg.type === "ordgroup" && arg.body.length ? arg.body[0] : arg;
10573
10574 if (atom.type === "atom" && (atom.family === "bin" || atom.family === "rel")) {
10575 return "m" + atom.family;
10576 } else {
10577 return "mord";
10578 }
10579 }; // \@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord.
10580 // This is equivalent to \binrel@{x}\binrel@@{y} in AMSTeX.
10581
10582 defineFunction({
10583 type: "mclass",
10584 names: ["\\@binrel"],
10585 props: {
10586 numArgs: 2
10587 },
10588 handler: function handler(_ref2, args) {
10589 var parser = _ref2.parser;
10590 return {
10591 type: "mclass",
10592 mode: parser.mode,
10593 mclass: binrelClass(args[0]),
10594 body: [args[1]],
10595 isCharacterBox: utils.isCharacterBox(args[1])
10596 };
10597 }
10598 }); // Build a relation or stacked op by placing one symbol on top of another
10599
10600 defineFunction({
10601 type: "mclass",
10602 names: ["\\stackrel", "\\overset", "\\underset"],
10603 props: {
10604 numArgs: 2
10605 },
10606 handler: function handler(_ref3, args) {
10607 var parser = _ref3.parser,
10608 funcName = _ref3.funcName;
10609 var baseArg = args[1];
10610 var shiftedArg = args[0];
10611 var mclass;
10612
10613 if (funcName !== "\\stackrel") {
10614 // LaTeX applies \binrel spacing to \overset and \underset.
10615 mclass = binrelClass(baseArg);
10616 } else {
10617 mclass = "mrel"; // for \stackrel
10618 }
10619
10620 var baseOp = {
10621 type: "op",
10622 mode: baseArg.mode,
10623 limits: true,
10624 alwaysHandleSupSub: true,
10625 parentIsSupSub: false,
10626 symbol: false,
10627 suppressBaseShift: funcName !== "\\stackrel",
10628 body: defineFunction_ordargument(baseArg)
10629 };
10630 var supsub = {
10631 type: "supsub",
10632 mode: shiftedArg.mode,
10633 base: baseOp,
10634 sup: funcName === "\\underset" ? null : shiftedArg,
10635 sub: funcName === "\\underset" ? shiftedArg : null
10636 };
10637 return {
10638 type: "mclass",
10639 mode: parser.mode,
10640 mclass: mclass,
10641 body: [supsub],
10642 isCharacterBox: utils.isCharacterBox(supsub)
10643 };
10644 },
10645 htmlBuilder: mclass_htmlBuilder,
10646 mathmlBuilder: mclass_mathmlBuilder
10647 });
10648 // CONCATENATED MODULE: ./src/functions/font.js
10649 // TODO(kevinb): implement \\sl and \\sc
10650
10651
10652
10653
10654
10655
10656 var font_htmlBuilder = function htmlBuilder(group, options) {
10657 var font = group.font;
10658 var newOptions = options.withFont(font);
10659 return buildHTML_buildGroup(group.body, newOptions);
10660 };
10661
10662 var font_mathmlBuilder = function mathmlBuilder(group, options) {
10663 var font = group.font;
10664 var newOptions = options.withFont(font);
10665 return buildMathML_buildGroup(group.body, newOptions);
10666 };
10667
10668 var fontAliases = {
10669 "\\Bbb": "\\mathbb",
10670 "\\bold": "\\mathbf",
10671 "\\frak": "\\mathfrak",
10672 "\\bm": "\\boldsymbol"
10673 };
10674 defineFunction({
10675 type: "font",
10676 names: [// styles, except \boldsymbol defined below
10677 "\\mathrm", "\\mathit", "\\mathbf", "\\mathnormal", // families
10678 "\\mathbb", "\\mathcal", "\\mathfrak", "\\mathscr", "\\mathsf", "\\mathtt", // aliases, except \bm defined below
10679 "\\Bbb", "\\bold", "\\frak"],
10680 props: {
10681 numArgs: 1,
10682 greediness: 2
10683 },
10684 handler: function handler(_ref, args) {
10685 var parser = _ref.parser,
10686 funcName = _ref.funcName;
10687 var body = args[0];
10688 var func = funcName;
10689
10690 if (func in fontAliases) {
10691 func = fontAliases[func];
10692 }
10693
10694 return {
10695 type: "font",
10696 mode: parser.mode,
10697 font: func.slice(1),
10698 body: body
10699 };
10700 },
10701 htmlBuilder: font_htmlBuilder,
10702 mathmlBuilder: font_mathmlBuilder
10703 });
10704 defineFunction({
10705 type: "mclass",
10706 names: ["\\boldsymbol", "\\bm"],
10707 props: {
10708 numArgs: 1,
10709 greediness: 2
10710 },
10711 handler: function handler(_ref2, args) {
10712 var parser = _ref2.parser;
10713 var body = args[0];
10714 var isCharacterBox = utils.isCharacterBox(body); // amsbsy.sty's \boldsymbol uses \binrel spacing to inherit the
10715 // argument's bin|rel|ord status
10716
10717 return {
10718 type: "mclass",
10719 mode: parser.mode,
10720 mclass: binrelClass(body),
10721 body: [{
10722 type: "font",
10723 mode: parser.mode,
10724 font: "boldsymbol",
10725 body: body
10726 }],
10727 isCharacterBox: isCharacterBox
10728 };
10729 }
10730 }); // Old font changing functions
10731
10732 defineFunction({
10733 type: "font",
10734 names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it"],
10735 props: {
10736 numArgs: 0,
10737 allowedInText: true
10738 },
10739 handler: function handler(_ref3, args) {
10740 var parser = _ref3.parser,
10741 funcName = _ref3.funcName,
10742 breakOnTokenText = _ref3.breakOnTokenText;
10743 var mode = parser.mode;
10744 var body = parser.parseExpression(true, breakOnTokenText);
10745 var style = "math" + funcName.slice(1);
10746 return {
10747 type: "font",
10748 mode: mode,
10749 font: style,
10750 body: {
10751 type: "ordgroup",
10752 mode: parser.mode,
10753 body: body
10754 }
10755 };
10756 },
10757 htmlBuilder: font_htmlBuilder,
10758 mathmlBuilder: font_mathmlBuilder
10759 });
10760 // CONCATENATED MODULE: ./src/functions/genfrac.js
10761
10762
10763
10764
10765
10766
10767
10768
10769
10770
10771
10772 var genfrac_adjustStyle = function adjustStyle(size, originalStyle) {
10773 // Figure out what style this fraction should be in based on the
10774 // function used
10775 var style = originalStyle;
10776
10777 if (size === "display") {
10778 // Get display style as a default.
10779 // If incoming style is sub/sup, use style.text() to get correct size.
10780 style = style.id >= src_Style.SCRIPT.id ? style.text() : src_Style.DISPLAY;
10781 } else if (size === "text" && style.size === src_Style.DISPLAY.size) {
10782 // We're in a \tfrac but incoming style is displaystyle, so:
10783 style = src_Style.TEXT;
10784 } else if (size === "script") {
10785 style = src_Style.SCRIPT;
10786 } else if (size === "scriptscript") {
10787 style = src_Style.SCRIPTSCRIPT;
10788 }
10789
10790 return style;
10791 };
10792
10793 var genfrac_htmlBuilder = function htmlBuilder(group, options) {
10794 // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e).
10795 var style = genfrac_adjustStyle(group.size, options.style);
10796 var nstyle = style.fracNum();
10797 var dstyle = style.fracDen();
10798 var newOptions;
10799 newOptions = options.havingStyle(nstyle);
10800 var numerm = buildHTML_buildGroup(group.numer, newOptions, options);
10801
10802 if (group.continued) {
10803 // \cfrac inserts a \strut into the numerator.
10804 // Get \strut dimensions from TeXbook page 353.
10805 var hStrut = 8.5 / options.fontMetrics().ptPerEm;
10806 var dStrut = 3.5 / options.fontMetrics().ptPerEm;
10807 numerm.height = numerm.height < hStrut ? hStrut : numerm.height;
10808 numerm.depth = numerm.depth < dStrut ? dStrut : numerm.depth;
10809 }
10810
10811 newOptions = options.havingStyle(dstyle);
10812 var denomm = buildHTML_buildGroup(group.denom, newOptions, options);
10813 var rule;
10814 var ruleWidth;
10815 var ruleSpacing;
10816
10817 if (group.hasBarLine) {
10818 if (group.barSize) {
10819 ruleWidth = units_calculateSize(group.barSize, options);
10820 rule = buildCommon.makeLineSpan("frac-line", options, ruleWidth);
10821 } else {
10822 rule = buildCommon.makeLineSpan("frac-line", options);
10823 }
10824
10825 ruleWidth = rule.height;
10826 ruleSpacing = rule.height;
10827 } else {
10828 rule = null;
10829 ruleWidth = 0;
10830 ruleSpacing = options.fontMetrics().defaultRuleThickness;
10831 } // Rule 15b
10832
10833
10834 var numShift;
10835 var clearance;
10836 var denomShift;
10837
10838 if (style.size === src_Style.DISPLAY.size || group.size === "display") {
10839 numShift = options.fontMetrics().num1;
10840
10841 if (ruleWidth > 0) {
10842 clearance = 3 * ruleSpacing;
10843 } else {
10844 clearance = 7 * ruleSpacing;
10845 }
10846
10847 denomShift = options.fontMetrics().denom1;
10848 } else {
10849 if (ruleWidth > 0) {
10850 numShift = options.fontMetrics().num2;
10851 clearance = ruleSpacing;
10852 } else {
10853 numShift = options.fontMetrics().num3;
10854 clearance = 3 * ruleSpacing;
10855 }
10856
10857 denomShift = options.fontMetrics().denom2;
10858 }
10859
10860 var frac;
10861
10862 if (!rule) {
10863 // Rule 15c
10864 var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift);
10865
10866 if (candidateClearance < clearance) {
10867 numShift += 0.5 * (clearance - candidateClearance);
10868 denomShift += 0.5 * (clearance - candidateClearance);
10869 }
10870
10871 frac = buildCommon.makeVList({
10872 positionType: "individualShift",
10873 children: [{
10874 type: "elem",
10875 elem: denomm,
10876 shift: denomShift
10877 }, {
10878 type: "elem",
10879 elem: numerm,
10880 shift: -numShift
10881 }]
10882 }, options);
10883 } else {
10884 // Rule 15d
10885 var axisHeight = options.fontMetrics().axisHeight;
10886
10887 if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) {
10888 numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth));
10889 }
10890
10891 if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) {
10892 denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift));
10893 }
10894
10895 var midShift = -(axisHeight - 0.5 * ruleWidth);
10896 frac = buildCommon.makeVList({
10897 positionType: "individualShift",
10898 children: [{
10899 type: "elem",
10900 elem: denomm,
10901 shift: denomShift
10902 }, {
10903 type: "elem",
10904 elem: rule,
10905 shift: midShift
10906 }, {
10907 type: "elem",
10908 elem: numerm,
10909 shift: -numShift
10910 }]
10911 }, options);
10912 } // Since we manually change the style sometimes (with \dfrac or \tfrac),
10913 // account for the possible size change here.
10914
10915
10916 newOptions = options.havingStyle(style);
10917 frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier;
10918 frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier; // Rule 15e
10919
10920 var delimSize;
10921
10922 if (style.size === src_Style.DISPLAY.size) {
10923 delimSize = options.fontMetrics().delim1;
10924 } else {
10925 delimSize = options.fontMetrics().delim2;
10926 }
10927
10928 var leftDelim;
10929 var rightDelim;
10930
10931 if (group.leftDelim == null) {
10932 leftDelim = makeNullDelimiter(options, ["mopen"]);
10933 } else {
10934 leftDelim = delimiter.customSizedDelim(group.leftDelim, delimSize, true, options.havingStyle(style), group.mode, ["mopen"]);
10935 }
10936
10937 if (group.continued) {
10938 rightDelim = buildCommon.makeSpan([]); // zero width for \cfrac
10939 } else if (group.rightDelim == null) {
10940 rightDelim = makeNullDelimiter(options, ["mclose"]);
10941 } else {
10942 rightDelim = delimiter.customSizedDelim(group.rightDelim, delimSize, true, options.havingStyle(style), group.mode, ["mclose"]);
10943 }
10944
10945 return buildCommon.makeSpan(["mord"].concat(newOptions.sizingClasses(options)), [leftDelim, buildCommon.makeSpan(["mfrac"], [frac]), rightDelim], options);
10946 };
10947
10948 var genfrac_mathmlBuilder = function mathmlBuilder(group, options) {
10949 var node = new mathMLTree.MathNode("mfrac", [buildMathML_buildGroup(group.numer, options), buildMathML_buildGroup(group.denom, options)]);
10950
10951 if (!group.hasBarLine) {
10952 node.setAttribute("linethickness", "0px");
10953 } else if (group.barSize) {
10954 var ruleWidth = units_calculateSize(group.barSize, options);
10955 node.setAttribute("linethickness", ruleWidth + "em");
10956 }
10957
10958 var style = genfrac_adjustStyle(group.size, options.style);
10959
10960 if (style.size !== options.style.size) {
10961 node = new mathMLTree.MathNode("mstyle", [node]);
10962 var isDisplay = style.size === src_Style.DISPLAY.size ? "true" : "false";
10963 node.setAttribute("displaystyle", isDisplay);
10964 node.setAttribute("scriptlevel", "0");
10965 }
10966
10967 if (group.leftDelim != null || group.rightDelim != null) {
10968 var withDelims = [];
10969
10970 if (group.leftDelim != null) {
10971 var leftOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.leftDelim.replace("\\", ""))]);
10972 leftOp.setAttribute("fence", "true");
10973 withDelims.push(leftOp);
10974 }
10975
10976 withDelims.push(node);
10977
10978 if (group.rightDelim != null) {
10979 var rightOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.rightDelim.replace("\\", ""))]);
10980 rightOp.setAttribute("fence", "true");
10981 withDelims.push(rightOp);
10982 }
10983
10984 return buildMathML_makeRow(withDelims);
10985 }
10986
10987 return node;
10988 };
10989
10990 defineFunction({
10991 type: "genfrac",
10992 names: ["\\cfrac", "\\dfrac", "\\frac", "\\tfrac", "\\dbinom", "\\binom", "\\tbinom", "\\\\atopfrac", // can’t be entered directly
10993 "\\\\bracefrac", "\\\\brackfrac"],
10994 props: {
10995 numArgs: 2,
10996 greediness: 2
10997 },
10998 handler: function handler(_ref, args) {
10999 var parser = _ref.parser,
11000 funcName = _ref.funcName;
11001 var numer = args[0];
11002 var denom = args[1];
11003 var hasBarLine;
11004 var leftDelim = null;
11005 var rightDelim = null;
11006 var size = "auto";
11007
11008 switch (funcName) {
11009 case "\\cfrac":
11010 case "\\dfrac":
11011 case "\\frac":
11012 case "\\tfrac":
11013 hasBarLine = true;
11014 break;
11015
11016 case "\\\\atopfrac":
11017 hasBarLine = false;
11018 break;
11019
11020 case "\\dbinom":
11021 case "\\binom":
11022 case "\\tbinom":
11023 hasBarLine = false;
11024 leftDelim = "(";
11025 rightDelim = ")";
11026 break;
11027
11028 case "\\\\bracefrac":
11029 hasBarLine = false;
11030 leftDelim = "\\{";
11031 rightDelim = "\\}";
11032 break;
11033
11034 case "\\\\brackfrac":
11035 hasBarLine = false;
11036 leftDelim = "[";
11037 rightDelim = "]";
11038 break;
11039
11040 default:
11041 throw new Error("Unrecognized genfrac command");
11042 }
11043
11044 switch (funcName) {
11045 case "\\cfrac":
11046 case "\\dfrac":
11047 case "\\dbinom":
11048 size = "display";
11049 break;
11050
11051 case "\\tfrac":
11052 case "\\tbinom":
11053 size = "text";
11054 break;
11055 }
11056
11057 return {
11058 type: "genfrac",
11059 mode: parser.mode,
11060 continued: funcName === "\\cfrac",
11061 numer: numer,
11062 denom: denom,
11063 hasBarLine: hasBarLine,
11064 leftDelim: leftDelim,
11065 rightDelim: rightDelim,
11066 size: size,
11067 barSize: null
11068 };
11069 },
11070 htmlBuilder: genfrac_htmlBuilder,
11071 mathmlBuilder: genfrac_mathmlBuilder
11072 }); // Infix generalized fractions -- these are not rendered directly, but replaced
11073 // immediately by one of the variants above.
11074
11075 defineFunction({
11076 type: "infix",
11077 names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"],
11078 props: {
11079 numArgs: 0,
11080 infix: true
11081 },
11082 handler: function handler(_ref2) {
11083 var parser = _ref2.parser,
11084 funcName = _ref2.funcName,
11085 token = _ref2.token;
11086 var replaceWith;
11087
11088 switch (funcName) {
11089 case "\\over":
11090 replaceWith = "\\frac";
11091 break;
11092
11093 case "\\choose":
11094 replaceWith = "\\binom";
11095 break;
11096
11097 case "\\atop":
11098 replaceWith = "\\\\atopfrac";
11099 break;
11100
11101 case "\\brace":
11102 replaceWith = "\\\\bracefrac";
11103 break;
11104
11105 case "\\brack":
11106 replaceWith = "\\\\brackfrac";
11107 break;
11108
11109 default:
11110 throw new Error("Unrecognized infix genfrac command");
11111 }
11112
11113 return {
11114 type: "infix",
11115 mode: parser.mode,
11116 replaceWith: replaceWith,
11117 token: token
11118 };
11119 }
11120 });
11121 var stylArray = ["display", "text", "script", "scriptscript"];
11122
11123 var delimFromValue = function delimFromValue(delimString) {
11124 var delim = null;
11125
11126 if (delimString.length > 0) {
11127 delim = delimString;
11128 delim = delim === "." ? null : delim;
11129 }
11130
11131 return delim;
11132 };
11133
11134 defineFunction({
11135 type: "genfrac",
11136 names: ["\\genfrac"],
11137 props: {
11138 numArgs: 6,
11139 greediness: 6,
11140 argTypes: ["math", "math", "size", "text", "math", "math"]
11141 },
11142 handler: function handler(_ref3, args) {
11143 var parser = _ref3.parser;
11144 var numer = args[4];
11145 var denom = args[5]; // Look into the parse nodes to get the desired delimiters.
11146
11147 var leftNode = checkNodeType(args[0], "atom");
11148
11149 if (leftNode) {
11150 leftNode = assertAtomFamily(args[0], "open");
11151 }
11152
11153 var leftDelim = leftNode ? delimFromValue(leftNode.text) : null;
11154 var rightNode = checkNodeType(args[1], "atom");
11155
11156 if (rightNode) {
11157 rightNode = assertAtomFamily(args[1], "close");
11158 }
11159
11160 var rightDelim = rightNode ? delimFromValue(rightNode.text) : null;
11161 var barNode = assertNodeType(args[2], "size");
11162 var hasBarLine;
11163 var barSize = null;
11164
11165 if (barNode.isBlank) {
11166 // \genfrac acts differently than \above.
11167 // \genfrac treats an empty size group as a signal to use a
11168 // standard bar size. \above would see size = 0 and omit the bar.
11169 hasBarLine = true;
11170 } else {
11171 barSize = barNode.value;
11172 hasBarLine = barSize.number > 0;
11173 } // Find out if we want displaystyle, textstyle, etc.
11174
11175
11176 var size = "auto";
11177 var styl = checkNodeType(args[3], "ordgroup");
11178
11179 if (styl) {
11180 if (styl.body.length > 0) {
11181 var textOrd = assertNodeType(styl.body[0], "textord");
11182 size = stylArray[Number(textOrd.text)];
11183 }
11184 } else {
11185 styl = assertNodeType(args[3], "textord");
11186 size = stylArray[Number(styl.text)];
11187 }
11188
11189 return {
11190 type: "genfrac",
11191 mode: parser.mode,
11192 numer: numer,
11193 denom: denom,
11194 continued: false,
11195 hasBarLine: hasBarLine,
11196 barSize: barSize,
11197 leftDelim: leftDelim,
11198 rightDelim: rightDelim,
11199 size: size
11200 };
11201 },
11202 htmlBuilder: genfrac_htmlBuilder,
11203 mathmlBuilder: genfrac_mathmlBuilder
11204 }); // \above is an infix fraction that also defines a fraction bar size.
11205
11206 defineFunction({
11207 type: "infix",
11208 names: ["\\above"],
11209 props: {
11210 numArgs: 1,
11211 argTypes: ["size"],
11212 infix: true
11213 },
11214 handler: function handler(_ref4, args) {
11215 var parser = _ref4.parser,
11216 funcName = _ref4.funcName,
11217 token = _ref4.token;
11218 return {
11219 type: "infix",
11220 mode: parser.mode,
11221 replaceWith: "\\\\abovefrac",
11222 size: assertNodeType(args[0], "size").value,
11223 token: token
11224 };
11225 }
11226 });
11227 defineFunction({
11228 type: "genfrac",
11229 names: ["\\\\abovefrac"],
11230 props: {
11231 numArgs: 3,
11232 argTypes: ["math", "size", "math"]
11233 },
11234 handler: function handler(_ref5, args) {
11235 var parser = _ref5.parser,
11236 funcName = _ref5.funcName;
11237 var numer = args[0];
11238 var barSize = assert(assertNodeType(args[1], "infix").size);
11239 var denom = args[2];
11240 var hasBarLine = barSize.number > 0;
11241 return {
11242 type: "genfrac",
11243 mode: parser.mode,
11244 numer: numer,
11245 denom: denom,
11246 continued: false,
11247 hasBarLine: hasBarLine,
11248 barSize: barSize,
11249 leftDelim: null,
11250 rightDelim: null,
11251 size: "auto"
11252 };
11253 },
11254 htmlBuilder: genfrac_htmlBuilder,
11255 mathmlBuilder: genfrac_mathmlBuilder
11256 });
11257 // CONCATENATED MODULE: ./src/functions/horizBrace.js
11258
11259
11260
11261
11262
11263
11264
11265
11266 // NOTE: Unlike most `htmlBuilder`s, this one handles not only "horizBrace", but
11267 var horizBrace_htmlBuilder = function htmlBuilder(grp, options) {
11268 var style = options.style; // Pull out the `ParseNode<"horizBrace">` if `grp` is a "supsub" node.
11269
11270 var supSubGroup;
11271 var group;
11272 var supSub = checkNodeType(grp, "supsub");
11273
11274 if (supSub) {
11275 // Ref: LaTeX source2e: }}}}\limits}
11276 // i.e. LaTeX treats the brace similar to an op and passes it
11277 // with \limits, so we need to assign supsub style.
11278 supSubGroup = supSub.sup ? buildHTML_buildGroup(supSub.sup, options.havingStyle(style.sup()), options) : buildHTML_buildGroup(supSub.sub, options.havingStyle(style.sub()), options);
11279 group = assertNodeType(supSub.base, "horizBrace");
11280 } else {
11281 group = assertNodeType(grp, "horizBrace");
11282 } // Build the base group
11283
11284
11285 var body = buildHTML_buildGroup(group.base, options.havingBaseStyle(src_Style.DISPLAY)); // Create the stretchy element
11286
11287 var braceBody = stretchy.svgSpan(group, options); // Generate the vlist, with the appropriate kerns ┏━━━━━━━━┓
11288 // This first vlist contains the content and the brace: equation
11289
11290 var vlist;
11291
11292 if (group.isOver) {
11293 vlist = buildCommon.makeVList({
11294 positionType: "firstBaseline",
11295 children: [{
11296 type: "elem",
11297 elem: body
11298 }, {
11299 type: "kern",
11300 size: 0.1
11301 }, {
11302 type: "elem",
11303 elem: braceBody
11304 }]
11305 }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList.
11306
11307 vlist.children[0].children[0].children[1].classes.push("svg-align");
11308 } else {
11309 vlist = buildCommon.makeVList({
11310 positionType: "bottom",
11311 positionData: body.depth + 0.1 + braceBody.height,
11312 children: [{
11313 type: "elem",
11314 elem: braceBody
11315 }, {
11316 type: "kern",
11317 size: 0.1
11318 }, {
11319 type: "elem",
11320 elem: body
11321 }]
11322 }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList.
11323
11324 vlist.children[0].children[0].children[0].classes.push("svg-align");
11325 }
11326
11327 if (supSubGroup) {
11328 // To write the supsub, wrap the first vlist in another vlist:
11329 // They can't all go in the same vlist, because the note might be
11330 // wider than the equation. We want the equation to control the
11331 // brace width.
11332 // note long note long note
11333 // ┏━━━━━━━━┓ or ┏━━━┓ not ┏━━━━━━━━━┓
11334 // equation eqn eqn
11335 var vSpan = buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options);
11336
11337 if (group.isOver) {
11338 vlist = buildCommon.makeVList({
11339 positionType: "firstBaseline",
11340 children: [{
11341 type: "elem",
11342 elem: vSpan
11343 }, {
11344 type: "kern",
11345 size: 0.2
11346 }, {
11347 type: "elem",
11348 elem: supSubGroup
11349 }]
11350 }, options);
11351 } else {
11352 vlist = buildCommon.makeVList({
11353 positionType: "bottom",
11354 positionData: vSpan.depth + 0.2 + supSubGroup.height + supSubGroup.depth,
11355 children: [{
11356 type: "elem",
11357 elem: supSubGroup
11358 }, {
11359 type: "kern",
11360 size: 0.2
11361 }, {
11362 type: "elem",
11363 elem: vSpan
11364 }]
11365 }, options);
11366 }
11367 }
11368
11369 return buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options);
11370 };
11371
11372 var horizBrace_mathmlBuilder = function mathmlBuilder(group, options) {
11373 var accentNode = stretchy.mathMLnode(group.label);
11374 return new mathMLTree.MathNode(group.isOver ? "mover" : "munder", [buildMathML_buildGroup(group.base, options), accentNode]);
11375 }; // Horizontal stretchy braces
11376
11377
11378 defineFunction({
11379 type: "horizBrace",
11380 names: ["\\overbrace", "\\underbrace"],
11381 props: {
11382 numArgs: 1
11383 },
11384 handler: function handler(_ref, args) {
11385 var parser = _ref.parser,
11386 funcName = _ref.funcName;
11387 return {
11388 type: "horizBrace",
11389 mode: parser.mode,
11390 label: funcName,
11391 isOver: /^\\over/.test(funcName),
11392 base: args[0]
11393 };
11394 },
11395 htmlBuilder: horizBrace_htmlBuilder,
11396 mathmlBuilder: horizBrace_mathmlBuilder
11397 });
11398 // CONCATENATED MODULE: ./src/functions/href.js
11399
11400
11401
11402
11403
11404
11405 defineFunction({
11406 type: "href",
11407 names: ["\\href"],
11408 props: {
11409 numArgs: 2,
11410 argTypes: ["url", "original"],
11411 allowedInText: true
11412 },
11413 handler: function handler(_ref, args) {
11414 var parser = _ref.parser;
11415 var body = args[1];
11416 var href = assertNodeType(args[0], "url").url;
11417
11418 if (!parser.settings.isTrusted({
11419 command: "\\href",
11420 url: href
11421 })) {
11422 return parser.formatUnsupportedCmd("\\href");
11423 }
11424
11425 return {
11426 type: "href",
11427 mode: parser.mode,
11428 href: href,
11429 body: defineFunction_ordargument(body)
11430 };
11431 },
11432 htmlBuilder: function htmlBuilder(group, options) {
11433 var elements = buildHTML_buildExpression(group.body, options, false);
11434 return buildCommon.makeAnchor(group.href, [], elements, options);
11435 },
11436 mathmlBuilder: function mathmlBuilder(group, options) {
11437 var math = buildExpressionRow(group.body, options);
11438
11439 if (!(math instanceof mathMLTree_MathNode)) {
11440 math = new mathMLTree_MathNode("mrow", [math]);
11441 }
11442
11443 math.setAttribute("href", group.href);
11444 return math;
11445 }
11446 });
11447 defineFunction({
11448 type: "href",
11449 names: ["\\url"],
11450 props: {
11451 numArgs: 1,
11452 argTypes: ["url"],
11453 allowedInText: true
11454 },
11455 handler: function handler(_ref2, args) {
11456 var parser = _ref2.parser;
11457 var href = assertNodeType(args[0], "url").url;
11458
11459 if (!parser.settings.isTrusted({
11460 command: "\\url",
11461 url: href
11462 })) {
11463 return parser.formatUnsupportedCmd("\\url");
11464 }
11465
11466 var chars = [];
11467
11468 for (var i = 0; i < href.length; i++) {
11469 var c = href[i];
11470
11471 if (c === "~") {
11472 c = "\\textasciitilde";
11473 }
11474
11475 chars.push({
11476 type: "textord",
11477 mode: "text",
11478 text: c
11479 });
11480 }
11481
11482 var body = {
11483 type: "text",
11484 mode: parser.mode,
11485 font: "\\texttt",
11486 body: chars
11487 };
11488 return {
11489 type: "href",
11490 mode: parser.mode,
11491 href: href,
11492 body: defineFunction_ordargument(body)
11493 };
11494 }
11495 });
11496 // CONCATENATED MODULE: ./src/functions/htmlmathml.js
11497
11498
11499
11500
11501 defineFunction({
11502 type: "htmlmathml",
11503 names: ["\\html@mathml"],
11504 props: {
11505 numArgs: 2,
11506 allowedInText: true
11507 },
11508 handler: function handler(_ref, args) {
11509 var parser = _ref.parser;
11510 return {
11511 type: "htmlmathml",
11512 mode: parser.mode,
11513 html: defineFunction_ordargument(args[0]),
11514 mathml: defineFunction_ordargument(args[1])
11515 };
11516 },
11517 htmlBuilder: function htmlBuilder(group, options) {
11518 var elements = buildHTML_buildExpression(group.html, options, false);
11519 return buildCommon.makeFragment(elements);
11520 },
11521 mathmlBuilder: function mathmlBuilder(group, options) {
11522 return buildExpressionRow(group.mathml, options);
11523 }
11524 });
11525 // CONCATENATED MODULE: ./src/functions/includegraphics.js
11526
11527
11528
11529
11530
11531
11532
11533 var includegraphics_sizeData = function sizeData(str) {
11534 if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(str)) {
11535 // str is a number with no unit specified.
11536 // default unit is bp, per graphix package.
11537 return {
11538 number: +str,
11539 unit: "bp"
11540 };
11541 } else {
11542 var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(str);
11543
11544 if (!match) {
11545 throw new src_ParseError("Invalid size: '" + str + "' in \\includegraphics");
11546 }
11547
11548 var data = {
11549 number: +(match[1] + match[2]),
11550 // sign + magnitude, cast to number
11551 unit: match[3]
11552 };
11553
11554 if (!validUnit(data)) {
11555 throw new src_ParseError("Invalid unit: '" + data.unit + "' in \\includegraphics.");
11556 }
11557
11558 return data;
11559 }
11560 };
11561
11562 defineFunction({
11563 type: "includegraphics",
11564 names: ["\\includegraphics"],
11565 props: {
11566 numArgs: 1,
11567 numOptionalArgs: 1,
11568 argTypes: ["raw", "url"],
11569 allowedInText: false
11570 },
11571 handler: function handler(_ref, args, optArgs) {
11572 var parser = _ref.parser;
11573 var width = {
11574 number: 0,
11575 unit: "em"
11576 };
11577 var height = {
11578 number: 0.9,
11579 unit: "em"
11580 }; // sorta character sized.
11581
11582 var totalheight = {
11583 number: 0,
11584 unit: "em"
11585 };
11586 var alt = "";
11587
11588 if (optArgs[0]) {
11589 var attributeStr = assertNodeType(optArgs[0], "raw").string; // Parser.js does not parse key/value pairs. We get a string.
11590
11591 var attributes = attributeStr.split(",");
11592
11593 for (var i = 0; i < attributes.length; i++) {
11594 var keyVal = attributes[i].split("=");
11595
11596 if (keyVal.length === 2) {
11597 var str = keyVal[1].trim();
11598
11599 switch (keyVal[0].trim()) {
11600 case "alt":
11601 alt = str;
11602 break;
11603
11604 case "width":
11605 width = includegraphics_sizeData(str);
11606 break;
11607
11608 case "height":
11609 height = includegraphics_sizeData(str);
11610 break;
11611
11612 case "totalheight":
11613 totalheight = includegraphics_sizeData(str);
11614 break;
11615
11616 default:
11617 throw new src_ParseError("Invalid key: '" + keyVal[0] + "' in \\includegraphics.");
11618 }
11619 }
11620 }
11621 }
11622
11623 var src = assertNodeType(args[0], "url").url;
11624
11625 if (alt === "") {
11626 // No alt given. Use the file name. Strip away the path.
11627 alt = src;
11628 alt = alt.replace(/^.*[\\/]/, '');
11629 alt = alt.substring(0, alt.lastIndexOf('.'));
11630 }
11631
11632 if (!parser.settings.isTrusted({
11633 command: "\\includegraphics",
11634 url: src
11635 })) {
11636 return parser.formatUnsupportedCmd("\\includegraphics");
11637 }
11638
11639 return {
11640 type: "includegraphics",
11641 mode: parser.mode,
11642 alt: alt,
11643 width: width,
11644 height: height,
11645 totalheight: totalheight,
11646 src: src
11647 };
11648 },
11649 htmlBuilder: function htmlBuilder(group, options) {
11650 var height = units_calculateSize(group.height, options);
11651 var depth = 0;
11652
11653 if (group.totalheight.number > 0) {
11654 depth = units_calculateSize(group.totalheight, options) - height;
11655 depth = Number(depth.toFixed(2));
11656 }
11657
11658 var width = 0;
11659
11660 if (group.width.number > 0) {
11661 width = units_calculateSize(group.width, options);
11662 }
11663
11664 var style = {
11665 height: height + depth + "em"
11666 };
11667
11668 if (width > 0) {
11669 style.width = width + "em";
11670 }
11671
11672 if (depth > 0) {
11673 style.verticalAlign = -depth + "em";
11674 }
11675
11676 var node = new domTree_Img(group.src, group.alt, style);
11677 node.height = height;
11678 node.depth = depth;
11679 return node;
11680 },
11681 mathmlBuilder: function mathmlBuilder(group, options) {
11682 var node = new mathMLTree.MathNode("mglyph", []);
11683 node.setAttribute("alt", group.alt);
11684 var height = units_calculateSize(group.height, options);
11685 var depth = 0;
11686
11687 if (group.totalheight.number > 0) {
11688 depth = units_calculateSize(group.totalheight, options) - height;
11689 depth = depth.toFixed(2);
11690 node.setAttribute("valign", "-" + depth + "em");
11691 }
11692
11693 node.setAttribute("height", height + depth + "em");
11694
11695 if (group.width.number > 0) {
11696 var width = units_calculateSize(group.width, options);
11697 node.setAttribute("width", width + "em");
11698 }
11699
11700 node.setAttribute("src", group.src);
11701 return node;
11702 }
11703 });
11704 // CONCATENATED MODULE: ./src/functions/kern.js
11705 // Horizontal spacing commands
11706
11707
11708
11709
11710 // TODO: \hskip and \mskip should support plus and minus in lengths
11711
11712 defineFunction({
11713 type: "kern",
11714 names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"],
11715 props: {
11716 numArgs: 1,
11717 argTypes: ["size"],
11718 allowedInText: true
11719 },
11720 handler: function handler(_ref, args) {
11721 var parser = _ref.parser,
11722 funcName = _ref.funcName;
11723 var size = assertNodeType(args[0], "size");
11724
11725 if (parser.settings.strict) {
11726 var mathFunction = funcName[1] === 'm'; // \mkern, \mskip
11727
11728 var muUnit = size.value.unit === 'mu';
11729
11730 if (mathFunction) {
11731 if (!muUnit) {
11732 parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " supports only mu units, " + ("not " + size.value.unit + " units"));
11733 }
11734
11735 if (parser.mode !== "math") {
11736 parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " works only in math mode");
11737 }
11738 } else {
11739 // !mathFunction
11740 if (muUnit) {
11741 parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " doesn't support mu units");
11742 }
11743 }
11744 }
11745
11746 return {
11747 type: "kern",
11748 mode: parser.mode,
11749 dimension: size.value
11750 };
11751 },
11752 htmlBuilder: function htmlBuilder(group, options) {
11753 return buildCommon.makeGlue(group.dimension, options);
11754 },
11755 mathmlBuilder: function mathmlBuilder(group, options) {
11756 var dimension = units_calculateSize(group.dimension, options);
11757 return new mathMLTree.SpaceNode(dimension);
11758 }
11759 });
11760 // CONCATENATED MODULE: ./src/functions/lap.js
11761 // Horizontal overlap functions
11762
11763
11764
11765
11766
11767 defineFunction({
11768 type: "lap",
11769 names: ["\\mathllap", "\\mathrlap", "\\mathclap"],
11770 props: {
11771 numArgs: 1,
11772 allowedInText: true
11773 },
11774 handler: function handler(_ref, args) {
11775 var parser = _ref.parser,
11776 funcName = _ref.funcName;
11777 var body = args[0];
11778 return {
11779 type: "lap",
11780 mode: parser.mode,
11781 alignment: funcName.slice(5),
11782 body: body
11783 };
11784 },
11785 htmlBuilder: function htmlBuilder(group, options) {
11786 // mathllap, mathrlap, mathclap
11787 var inner;
11788
11789 if (group.alignment === "clap") {
11790 // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/
11791 inner = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options)]); // wrap, since CSS will center a .clap > .inner > span
11792
11793 inner = buildCommon.makeSpan(["inner"], [inner], options);
11794 } else {
11795 inner = buildCommon.makeSpan(["inner"], [buildHTML_buildGroup(group.body, options)]);
11796 }
11797
11798 var fix = buildCommon.makeSpan(["fix"], []);
11799 var node = buildCommon.makeSpan([group.alignment], [inner, fix], options); // At this point, we have correctly set horizontal alignment of the
11800 // two items involved in the lap.
11801 // Next, use a strut to set the height of the HTML bounding box.
11802 // Otherwise, a tall argument may be misplaced.
11803
11804 var strut = buildCommon.makeSpan(["strut"]);
11805 strut.style.height = node.height + node.depth + "em";
11806 strut.style.verticalAlign = -node.depth + "em";
11807 node.children.unshift(strut); // Next, prevent vertical misplacement when next to something tall.
11808
11809 node = buildCommon.makeVList({
11810 positionType: "firstBaseline",
11811 children: [{
11812 type: "elem",
11813 elem: node
11814 }]
11815 }, options); // Get the horizontal spacing correct relative to adjacent items.
11816
11817 return buildCommon.makeSpan(["mord"], [node], options);
11818 },
11819 mathmlBuilder: function mathmlBuilder(group, options) {
11820 // mathllap, mathrlap, mathclap
11821 var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]);
11822
11823 if (group.alignment !== "rlap") {
11824 var offset = group.alignment === "llap" ? "-1" : "-0.5";
11825 node.setAttribute("lspace", offset + "width");
11826 }
11827
11828 node.setAttribute("width", "0px");
11829 return node;
11830 }
11831 });
11832 // CONCATENATED MODULE: ./src/functions/math.js
11833
11834 // Switching from text mode back to math mode
11835
11836 defineFunction({
11837 type: "styling",
11838 names: ["\\(", "$"],
11839 props: {
11840 numArgs: 0,
11841 allowedInText: true,
11842 allowedInMath: false
11843 },
11844 handler: function handler(_ref, args) {
11845 var funcName = _ref.funcName,
11846 parser = _ref.parser;
11847 var outerMode = parser.mode;
11848 parser.switchMode("math");
11849 var close = funcName === "\\(" ? "\\)" : "$";
11850 var body = parser.parseExpression(false, close);
11851 parser.expect(close);
11852 parser.switchMode(outerMode);
11853 return {
11854 type: "styling",
11855 mode: parser.mode,
11856 style: "text",
11857 body: body
11858 };
11859 }
11860 }); // Check for extra closing math delimiters
11861
11862 defineFunction({
11863 type: "text",
11864 // Doesn't matter what this is.
11865 names: ["\\)", "\\]"],
11866 props: {
11867 numArgs: 0,
11868 allowedInText: true,
11869 allowedInMath: false
11870 },
11871 handler: function handler(context, args) {
11872 throw new src_ParseError("Mismatched " + context.funcName);
11873 }
11874 });
11875 // CONCATENATED MODULE: ./src/functions/mathchoice.js
11876
11877
11878
11879
11880
11881
11882 var mathchoice_chooseMathStyle = function chooseMathStyle(group, options) {
11883 switch (options.style.size) {
11884 case src_Style.DISPLAY.size:
11885 return group.display;
11886
11887 case src_Style.TEXT.size:
11888 return group.text;
11889
11890 case src_Style.SCRIPT.size:
11891 return group.script;
11892
11893 case src_Style.SCRIPTSCRIPT.size:
11894 return group.scriptscript;
11895
11896 default:
11897 return group.text;
11898 }
11899 };
11900
11901 defineFunction({
11902 type: "mathchoice",
11903 names: ["\\mathchoice"],
11904 props: {
11905 numArgs: 4
11906 },
11907 handler: function handler(_ref, args) {
11908 var parser = _ref.parser;
11909 return {
11910 type: "mathchoice",
11911 mode: parser.mode,
11912 display: defineFunction_ordargument(args[0]),
11913 text: defineFunction_ordargument(args[1]),
11914 script: defineFunction_ordargument(args[2]),
11915 scriptscript: defineFunction_ordargument(args[3])
11916 };
11917 },
11918 htmlBuilder: function htmlBuilder(group, options) {
11919 var body = mathchoice_chooseMathStyle(group, options);
11920 var elements = buildHTML_buildExpression(body, options, false);
11921 return buildCommon.makeFragment(elements);
11922 },
11923 mathmlBuilder: function mathmlBuilder(group, options) {
11924 var body = mathchoice_chooseMathStyle(group, options);
11925 return buildExpressionRow(body, options);
11926 }
11927 });
11928 // CONCATENATED MODULE: ./src/functions/utils/assembleSupSub.js
11929
11930
11931 // For an operator with limits, assemble the base, sup, and sub into a span.
11932 var assembleSupSub_assembleSupSub = function assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift) {
11933 // IE 8 clips \int if it is in a display: inline-block. We wrap it
11934 // in a new span so it is an inline, and works.
11935 base = buildCommon.makeSpan([], [base]);
11936 var sub;
11937 var sup; // We manually have to handle the superscripts and subscripts. This,
11938 // aside from the kern calculations, is copied from supsub.
11939
11940 if (supGroup) {
11941 var elem = buildHTML_buildGroup(supGroup, options.havingStyle(style.sup()), options);
11942 sup = {
11943 elem: elem,
11944 kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth)
11945 };
11946 }
11947
11948 if (subGroup) {
11949 var _elem = buildHTML_buildGroup(subGroup, options.havingStyle(style.sub()), options);
11950
11951 sub = {
11952 elem: _elem,
11953 kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height)
11954 };
11955 } // Build the final group as a vlist of the possible subscript, base,
11956 // and possible superscript.
11957
11958
11959 var finalGroup;
11960
11961 if (sup && sub) {
11962 var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift;
11963 finalGroup = buildCommon.makeVList({
11964 positionType: "bottom",
11965 positionData: bottom,
11966 children: [{
11967 type: "kern",
11968 size: options.fontMetrics().bigOpSpacing5
11969 }, {
11970 type: "elem",
11971 elem: sub.elem,
11972 marginLeft: -slant + "em"
11973 }, {
11974 type: "kern",
11975 size: sub.kern
11976 }, {
11977 type: "elem",
11978 elem: base
11979 }, {
11980 type: "kern",
11981 size: sup.kern
11982 }, {
11983 type: "elem",
11984 elem: sup.elem,
11985 marginLeft: slant + "em"
11986 }, {
11987 type: "kern",
11988 size: options.fontMetrics().bigOpSpacing5
11989 }]
11990 }, options);
11991 } else if (sub) {
11992 var top = base.height - baseShift; // Shift the limits by the slant of the symbol. Note
11993 // that we are supposed to shift the limits by 1/2 of the slant,
11994 // but since we are centering the limits adding a full slant of
11995 // margin will shift by 1/2 that.
11996
11997 finalGroup = buildCommon.makeVList({
11998 positionType: "top",
11999 positionData: top,
12000 children: [{
12001 type: "kern",
12002 size: options.fontMetrics().bigOpSpacing5
12003 }, {
12004 type: "elem",
12005 elem: sub.elem,
12006 marginLeft: -slant + "em"
12007 }, {
12008 type: "kern",
12009 size: sub.kern
12010 }, {
12011 type: "elem",
12012 elem: base
12013 }]
12014 }, options);
12015 } else if (sup) {
12016 var _bottom = base.depth + baseShift;
12017
12018 finalGroup = buildCommon.makeVList({
12019 positionType: "bottom",
12020 positionData: _bottom,
12021 children: [{
12022 type: "elem",
12023 elem: base
12024 }, {
12025 type: "kern",
12026 size: sup.kern
12027 }, {
12028 type: "elem",
12029 elem: sup.elem,
12030 marginLeft: slant + "em"
12031 }, {
12032 type: "kern",
12033 size: options.fontMetrics().bigOpSpacing5
12034 }]
12035 }, options);
12036 } else {
12037 // This case probably shouldn't occur (this would mean the
12038 // supsub was sending us a group with no superscript or
12039 // subscript) but be safe.
12040 return base;
12041 }
12042
12043 return buildCommon.makeSpan(["mop", "op-limits"], [finalGroup], options);
12044 };
12045 // CONCATENATED MODULE: ./src/functions/op.js
12046 // Limits, symbols
12047
12048
12049
12050
12051
12052
12053
12054
12055
12056
12057 // Most operators have a large successor symbol, but these don't.
12058 var noSuccessor = ["\\smallint"]; // NOTE: Unlike most `htmlBuilder`s, this one handles not only "op", but also
12059 // "supsub" since some of them (like \int) can affect super/subscripting.
12060
12061 var op_htmlBuilder = function htmlBuilder(grp, options) {
12062 // Operators are handled in the TeXbook pg. 443-444, rule 13(a).
12063 var supGroup;
12064 var subGroup;
12065 var hasLimits = false;
12066 var group;
12067 var supSub = checkNodeType(grp, "supsub");
12068
12069 if (supSub) {
12070 // If we have limits, supsub will pass us its group to handle. Pull
12071 // out the superscript and subscript and set the group to the op in
12072 // its base.
12073 supGroup = supSub.sup;
12074 subGroup = supSub.sub;
12075 group = assertNodeType(supSub.base, "op");
12076 hasLimits = true;
12077 } else {
12078 group = assertNodeType(grp, "op");
12079 }
12080
12081 var style = options.style;
12082 var large = false;
12083
12084 if (style.size === src_Style.DISPLAY.size && group.symbol && !utils.contains(noSuccessor, group.name)) {
12085 // Most symbol operators get larger in displaystyle (rule 13)
12086 large = true;
12087 }
12088
12089 var base;
12090
12091 if (group.symbol) {
12092 // If this is a symbol, create the symbol.
12093 var fontName = large ? "Size2-Regular" : "Size1-Regular";
12094 var stash = "";
12095
12096 if (group.name === "\\oiint" || group.name === "\\oiiint") {
12097 // No font glyphs yet, so use a glyph w/o the oval.
12098 // TODO: When font glyphs are available, delete this code.
12099 stash = group.name.substr(1); // $FlowFixMe
12100
12101 group.name = stash === "oiint" ? "\\iint" : "\\iiint";
12102 }
12103
12104 base = buildCommon.makeSymbol(group.name, fontName, "math", options, ["mop", "op-symbol", large ? "large-op" : "small-op"]);
12105
12106 if (stash.length > 0) {
12107 // We're in \oiint or \oiiint. Overlay the oval.
12108 // TODO: When font glyphs are available, delete this code.
12109 var italic = base.italic;
12110 var oval = buildCommon.staticSvg(stash + "Size" + (large ? "2" : "1"), options);
12111 base = buildCommon.makeVList({
12112 positionType: "individualShift",
12113 children: [{
12114 type: "elem",
12115 elem: base,
12116 shift: 0
12117 }, {
12118 type: "elem",
12119 elem: oval,
12120 shift: large ? 0.08 : 0
12121 }]
12122 }, options); // $FlowFixMe
12123
12124 group.name = "\\" + stash;
12125 base.classes.unshift("mop"); // $FlowFixMe
12126
12127 base.italic = italic;
12128 }
12129 } else if (group.body) {
12130 // If this is a list, compose that list.
12131 var inner = buildHTML_buildExpression(group.body, options, true);
12132
12133 if (inner.length === 1 && inner[0] instanceof domTree_SymbolNode) {
12134 base = inner[0];
12135 base.classes[0] = "mop"; // replace old mclass
12136 } else {
12137 base = buildCommon.makeSpan(["mop"], buildCommon.tryCombineChars(inner), options);
12138 }
12139 } else {
12140 // Otherwise, this is a text operator. Build the text from the
12141 // operator's name.
12142 // TODO(emily): Add a space in the middle of some of these
12143 // operators, like \limsup
12144 var output = [];
12145
12146 for (var i = 1; i < group.name.length; i++) {
12147 output.push(buildCommon.mathsym(group.name[i], group.mode, options));
12148 }
12149
12150 base = buildCommon.makeSpan(["mop"], output, options);
12151 } // If content of op is a single symbol, shift it vertically.
12152
12153
12154 var baseShift = 0;
12155 var slant = 0;
12156
12157 if ((base instanceof domTree_SymbolNode || group.name === "\\oiint" || group.name === "\\oiiint") && !group.suppressBaseShift) {
12158 // We suppress the shift of the base of \overset and \underset. Otherwise,
12159 // shift the symbol so its center lies on the axis (rule 13). It
12160 // appears that our fonts have the centers of the symbols already
12161 // almost on the axis, so these numbers are very small. Note we
12162 // don't actually apply this here, but instead it is used either in
12163 // the vlist creation or separately when there are no limits.
12164 baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight; // The slant of the symbol is just its italic correction.
12165 // $FlowFixMe
12166
12167 slant = base.italic;
12168 }
12169
12170 if (hasLimits) {
12171 return assembleSupSub_assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift);
12172 } else {
12173 if (baseShift) {
12174 base.style.position = "relative";
12175 base.style.top = baseShift + "em";
12176 }
12177
12178 return base;
12179 }
12180 };
12181
12182 var op_mathmlBuilder = function mathmlBuilder(group, options) {
12183 var node;
12184
12185 if (group.symbol) {
12186 // This is a symbol. Just add the symbol.
12187 node = new mathMLTree_MathNode("mo", [buildMathML_makeText(group.name, group.mode)]);
12188
12189 if (utils.contains(noSuccessor, group.name)) {
12190 node.setAttribute("largeop", "false");
12191 }
12192 } else if (group.body) {
12193 // This is an operator with children. Add them.
12194 node = new mathMLTree_MathNode("mo", buildMathML_buildExpression(group.body, options));
12195 } else {
12196 // This is a text operator. Add all of the characters from the
12197 // operator's name.
12198 node = new mathMLTree_MathNode("mi", [new mathMLTree_TextNode(group.name.slice(1))]); // Append an <mo>&ApplyFunction;</mo>.
12199 // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4
12200
12201 var operator = new mathMLTree_MathNode("mo", [buildMathML_makeText("\u2061", "text")]);
12202
12203 if (group.parentIsSupSub) {
12204 node = new mathMLTree_MathNode("mo", [node, operator]);
12205 } else {
12206 node = newDocumentFragment([node, operator]);
12207 }
12208 }
12209
12210 return node;
12211 };
12212
12213 var singleCharBigOps = {
12214 "\u220F": "\\prod",
12215 "\u2210": "\\coprod",
12216 "\u2211": "\\sum",
12217 "\u22C0": "\\bigwedge",
12218 "\u22C1": "\\bigvee",
12219 "\u22C2": "\\bigcap",
12220 "\u22C3": "\\bigcup",
12221 "\u2A00": "\\bigodot",
12222 "\u2A01": "\\bigoplus",
12223 "\u2A02": "\\bigotimes",
12224 "\u2A04": "\\biguplus",
12225 "\u2A06": "\\bigsqcup"
12226 };
12227 defineFunction({
12228 type: "op",
12229 names: ["\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap", "\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes", "\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint", "\u220F", "\u2210", "\u2211", "\u22C0", "\u22C1", "\u22C2", "\u22C3", "\u2A00", "\u2A01", "\u2A02", "\u2A04", "\u2A06"],
12230 props: {
12231 numArgs: 0
12232 },
12233 handler: function handler(_ref, args) {
12234 var parser = _ref.parser,
12235 funcName = _ref.funcName;
12236 var fName = funcName;
12237
12238 if (fName.length === 1) {
12239 fName = singleCharBigOps[fName];
12240 }
12241
12242 return {
12243 type: "op",
12244 mode: parser.mode,
12245 limits: true,
12246 parentIsSupSub: false,
12247 symbol: true,
12248 name: fName
12249 };
12250 },
12251 htmlBuilder: op_htmlBuilder,
12252 mathmlBuilder: op_mathmlBuilder
12253 }); // Note: calling defineFunction with a type that's already been defined only
12254 // works because the same htmlBuilder and mathmlBuilder are being used.
12255
12256 defineFunction({
12257 type: "op",
12258 names: ["\\mathop"],
12259 props: {
12260 numArgs: 1
12261 },
12262 handler: function handler(_ref2, args) {
12263 var parser = _ref2.parser;
12264 var body = args[0];
12265 return {
12266 type: "op",
12267 mode: parser.mode,
12268 limits: false,
12269 parentIsSupSub: false,
12270 symbol: false,
12271 body: defineFunction_ordargument(body)
12272 };
12273 },
12274 htmlBuilder: op_htmlBuilder,
12275 mathmlBuilder: op_mathmlBuilder
12276 }); // There are 2 flags for operators; whether they produce limits in
12277 // displaystyle, and whether they are symbols and should grow in
12278 // displaystyle. These four groups cover the four possible choices.
12279
12280 var singleCharIntegrals = {
12281 "\u222B": "\\int",
12282 "\u222C": "\\iint",
12283 "\u222D": "\\iiint",
12284 "\u222E": "\\oint",
12285 "\u222F": "\\oiint",
12286 "\u2230": "\\oiiint"
12287 }; // No limits, not symbols
12288
12289 defineFunction({
12290 type: "op",
12291 names: ["\\arcsin", "\\arccos", "\\arctan", "\\arctg", "\\arcctg", "\\arg", "\\ch", "\\cos", "\\cosec", "\\cosh", "\\cot", "\\cotg", "\\coth", "\\csc", "\\ctg", "\\cth", "\\deg", "\\dim", "\\exp", "\\hom", "\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh", "\\sh", "\\tan", "\\tanh", "\\tg", "\\th"],
12292 props: {
12293 numArgs: 0
12294 },
12295 handler: function handler(_ref3) {
12296 var parser = _ref3.parser,
12297 funcName = _ref3.funcName;
12298 return {
12299 type: "op",
12300 mode: parser.mode,
12301 limits: false,
12302 parentIsSupSub: false,
12303 symbol: false,
12304 name: funcName
12305 };
12306 },
12307 htmlBuilder: op_htmlBuilder,
12308 mathmlBuilder: op_mathmlBuilder
12309 }); // Limits, not symbols
12310
12311 defineFunction({
12312 type: "op",
12313 names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"],
12314 props: {
12315 numArgs: 0
12316 },
12317 handler: function handler(_ref4) {
12318 var parser = _ref4.parser,
12319 funcName = _ref4.funcName;
12320 return {
12321 type: "op",
12322 mode: parser.mode,
12323 limits: true,
12324 parentIsSupSub: false,
12325 symbol: false,
12326 name: funcName
12327 };
12328 },
12329 htmlBuilder: op_htmlBuilder,
12330 mathmlBuilder: op_mathmlBuilder
12331 }); // No limits, symbols
12332
12333 defineFunction({
12334 type: "op",
12335 names: ["\\int", "\\iint", "\\iiint", "\\oint", "\\oiint", "\\oiiint", "\u222B", "\u222C", "\u222D", "\u222E", "\u222F", "\u2230"],
12336 props: {
12337 numArgs: 0
12338 },
12339 handler: function handler(_ref5) {
12340 var parser = _ref5.parser,
12341 funcName = _ref5.funcName;
12342 var fName = funcName;
12343
12344 if (fName.length === 1) {
12345 fName = singleCharIntegrals[fName];
12346 }
12347
12348 return {
12349 type: "op",
12350 mode: parser.mode,
12351 limits: false,
12352 parentIsSupSub: false,
12353 symbol: true,
12354 name: fName
12355 };
12356 },
12357 htmlBuilder: op_htmlBuilder,
12358 mathmlBuilder: op_mathmlBuilder
12359 });
12360 // CONCATENATED MODULE: ./src/functions/operatorname.js
12361
12362
12363
12364
12365
12366
12367
12368
12369 // NOTE: Unlike most `htmlBuilder`s, this one handles not only
12370 // "operatorname", but also "supsub" since \operatorname* can
12371 var operatorname_htmlBuilder = function htmlBuilder(grp, options) {
12372 // Operators are handled in the TeXbook pg. 443-444, rule 13(a).
12373 var supGroup;
12374 var subGroup;
12375 var hasLimits = false;
12376 var group;
12377 var supSub = checkNodeType(grp, "supsub");
12378
12379 if (supSub) {
12380 // If we have limits, supsub will pass us its group to handle. Pull
12381 // out the superscript and subscript and set the group to the op in
12382 // its base.
12383 supGroup = supSub.sup;
12384 subGroup = supSub.sub;
12385 group = assertNodeType(supSub.base, "operatorname");
12386 hasLimits = true;
12387 } else {
12388 group = assertNodeType(grp, "operatorname");
12389 }
12390
12391 var base;
12392
12393 if (group.body.length > 0) {
12394 var body = group.body.map(function (child) {
12395 // $FlowFixMe: Check if the node has a string `text` property.
12396 var childText = child.text;
12397
12398 if (typeof childText === "string") {
12399 return {
12400 type: "textord",
12401 mode: child.mode,
12402 text: childText
12403 };
12404 } else {
12405 return child;
12406 }
12407 }); // Consolidate function names into symbol characters.
12408
12409 var expression = buildHTML_buildExpression(body, options.withFont("mathrm"), true);
12410
12411 for (var i = 0; i < expression.length; i++) {
12412 var child = expression[i];
12413
12414 if (child instanceof domTree_SymbolNode) {
12415 // Per amsopn package,
12416 // change minus to hyphen and \ast to asterisk
12417 child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*");
12418 }
12419 }
12420
12421 base = buildCommon.makeSpan(["mop"], expression, options);
12422 } else {
12423 base = buildCommon.makeSpan(["mop"], [], options);
12424 }
12425
12426 if (hasLimits) {
12427 return assembleSupSub_assembleSupSub(base, supGroup, subGroup, options, options.style, 0, 0);
12428 } else {
12429 return base;
12430 }
12431 };
12432
12433 var operatorname_mathmlBuilder = function mathmlBuilder(group, options) {
12434 // The steps taken here are similar to the html version.
12435 var expression = buildMathML_buildExpression(group.body, options.withFont("mathrm")); // Is expression a string or has it something like a fraction?
12436
12437 var isAllString = true; // default
12438
12439 for (var i = 0; i < expression.length; i++) {
12440 var node = expression[i];
12441
12442 if (node instanceof mathMLTree.SpaceNode) {// Do nothing
12443 } else if (node instanceof mathMLTree.MathNode) {
12444 switch (node.type) {
12445 case "mi":
12446 case "mn":
12447 case "ms":
12448 case "mspace":
12449 case "mtext":
12450 break;
12451 // Do nothing yet.
12452
12453 case "mo":
12454 {
12455 var child = node.children[0];
12456
12457 if (node.children.length === 1 && child instanceof mathMLTree.TextNode) {
12458 child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*");
12459 } else {
12460 isAllString = false;
12461 }
12462
12463 break;
12464 }
12465
12466 default:
12467 isAllString = false;
12468 }
12469 } else {
12470 isAllString = false;
12471 }
12472 }
12473
12474 if (isAllString) {
12475 // Write a single TextNode instead of multiple nested tags.
12476 var word = expression.map(function (node) {
12477 return node.toText();
12478 }).join("");
12479 expression = [new mathMLTree.TextNode(word)];
12480 }
12481
12482 var identifier = new mathMLTree.MathNode("mi", expression);
12483 identifier.setAttribute("mathvariant", "normal"); // \u2061 is the same as &ApplyFunction;
12484 // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp
12485
12486 var operator = new mathMLTree.MathNode("mo", [buildMathML_makeText("\u2061", "text")]);
12487
12488 if (group.parentIsSupSub) {
12489 return new mathMLTree.MathNode("mo", [identifier, operator]);
12490 } else {
12491 return mathMLTree.newDocumentFragment([identifier, operator]);
12492 }
12493 }; // \operatorname
12494 // amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@
12495
12496
12497 defineFunction({
12498 type: "operatorname",
12499 names: ["\\operatorname", "\\operatorname*"],
12500 props: {
12501 numArgs: 1
12502 },
12503 handler: function handler(_ref, args) {
12504 var parser = _ref.parser,
12505 funcName = _ref.funcName;
12506 var body = args[0];
12507 return {
12508 type: "operatorname",
12509 mode: parser.mode,
12510 body: defineFunction_ordargument(body),
12511 alwaysHandleSupSub: funcName === "\\operatorname*",
12512 limits: false,
12513 parentIsSupSub: false
12514 };
12515 },
12516 htmlBuilder: operatorname_htmlBuilder,
12517 mathmlBuilder: operatorname_mathmlBuilder
12518 });
12519 // CONCATENATED MODULE: ./src/functions/ordgroup.js
12520
12521
12522
12523
12524 defineFunctionBuilders({
12525 type: "ordgroup",
12526 htmlBuilder: function htmlBuilder(group, options) {
12527 if (group.semisimple) {
12528 return buildCommon.makeFragment(buildHTML_buildExpression(group.body, options, false));
12529 }
12530
12531 return buildCommon.makeSpan(["mord"], buildHTML_buildExpression(group.body, options, true), options);
12532 },
12533 mathmlBuilder: function mathmlBuilder(group, options) {
12534 return buildExpressionRow(group.body, options, true);
12535 }
12536 });
12537 // CONCATENATED MODULE: ./src/functions/overline.js
12538
12539
12540
12541
12542
12543 defineFunction({
12544 type: "overline",
12545 names: ["\\overline"],
12546 props: {
12547 numArgs: 1
12548 },
12549 handler: function handler(_ref, args) {
12550 var parser = _ref.parser;
12551 var body = args[0];
12552 return {
12553 type: "overline",
12554 mode: parser.mode,
12555 body: body
12556 };
12557 },
12558 htmlBuilder: function htmlBuilder(group, options) {
12559 // Overlines are handled in the TeXbook pg 443, Rule 9.
12560 // Build the inner group in the cramped style.
12561 var innerGroup = buildHTML_buildGroup(group.body, options.havingCrampedStyle()); // Create the line above the body
12562
12563 var line = buildCommon.makeLineSpan("overline-line", options); // Generate the vlist, with the appropriate kerns
12564
12565 var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;
12566 var vlist = buildCommon.makeVList({
12567 positionType: "firstBaseline",
12568 children: [{
12569 type: "elem",
12570 elem: innerGroup
12571 }, {
12572 type: "kern",
12573 size: 3 * defaultRuleThickness
12574 }, {
12575 type: "elem",
12576 elem: line
12577 }, {
12578 type: "kern",
12579 size: defaultRuleThickness
12580 }]
12581 }, options);
12582 return buildCommon.makeSpan(["mord", "overline"], [vlist], options);
12583 },
12584 mathmlBuilder: function mathmlBuilder(group, options) {
12585 var operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203E")]);
12586 operator.setAttribute("stretchy", "true");
12587 var node = new mathMLTree.MathNode("mover", [buildMathML_buildGroup(group.body, options), operator]);
12588 node.setAttribute("accent", "true");
12589 return node;
12590 }
12591 });
12592 // CONCATENATED MODULE: ./src/functions/phantom.js
12593
12594
12595
12596
12597
12598 defineFunction({
12599 type: "phantom",
12600 names: ["\\phantom"],
12601 props: {
12602 numArgs: 1,
12603 allowedInText: true
12604 },
12605 handler: function handler(_ref, args) {
12606 var parser = _ref.parser;
12607 var body = args[0];
12608 return {
12609 type: "phantom",
12610 mode: parser.mode,
12611 body: defineFunction_ordargument(body)
12612 };
12613 },
12614 htmlBuilder: function htmlBuilder(group, options) {
12615 var elements = buildHTML_buildExpression(group.body, options.withPhantom(), false); // \phantom isn't supposed to affect the elements it contains.
12616 // See "color" for more details.
12617
12618 return buildCommon.makeFragment(elements);
12619 },
12620 mathmlBuilder: function mathmlBuilder(group, options) {
12621 var inner = buildMathML_buildExpression(group.body, options);
12622 return new mathMLTree.MathNode("mphantom", inner);
12623 }
12624 });
12625 defineFunction({
12626 type: "hphantom",
12627 names: ["\\hphantom"],
12628 props: {
12629 numArgs: 1,
12630 allowedInText: true
12631 },
12632 handler: function handler(_ref2, args) {
12633 var parser = _ref2.parser;
12634 var body = args[0];
12635 return {
12636 type: "hphantom",
12637 mode: parser.mode,
12638 body: body
12639 };
12640 },
12641 htmlBuilder: function htmlBuilder(group, options) {
12642 var node = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options.withPhantom())]);
12643 node.height = 0;
12644 node.depth = 0;
12645
12646 if (node.children) {
12647 for (var i = 0; i < node.children.length; i++) {
12648 node.children[i].height = 0;
12649 node.children[i].depth = 0;
12650 }
12651 } // See smash for comment re: use of makeVList
12652
12653
12654 node = buildCommon.makeVList({
12655 positionType: "firstBaseline",
12656 children: [{
12657 type: "elem",
12658 elem: node
12659 }]
12660 }, options); // For spacing, TeX treats \smash as a math group (same spacing as ord).
12661
12662 return buildCommon.makeSpan(["mord"], [node], options);
12663 },
12664 mathmlBuilder: function mathmlBuilder(group, options) {
12665 var inner = buildMathML_buildExpression(defineFunction_ordargument(group.body), options);
12666 var phantom = new mathMLTree.MathNode("mphantom", inner);
12667 var node = new mathMLTree.MathNode("mpadded", [phantom]);
12668 node.setAttribute("height", "0px");
12669 node.setAttribute("depth", "0px");
12670 return node;
12671 }
12672 });
12673 defineFunction({
12674 type: "vphantom",
12675 names: ["\\vphantom"],
12676 props: {
12677 numArgs: 1,
12678 allowedInText: true
12679 },
12680 handler: function handler(_ref3, args) {
12681 var parser = _ref3.parser;
12682 var body = args[0];
12683 return {
12684 type: "vphantom",
12685 mode: parser.mode,
12686 body: body
12687 };
12688 },
12689 htmlBuilder: function htmlBuilder(group, options) {
12690 var inner = buildCommon.makeSpan(["inner"], [buildHTML_buildGroup(group.body, options.withPhantom())]);
12691 var fix = buildCommon.makeSpan(["fix"], []);
12692 return buildCommon.makeSpan(["mord", "rlap"], [inner, fix], options);
12693 },
12694 mathmlBuilder: function mathmlBuilder(group, options) {
12695 var inner = buildMathML_buildExpression(defineFunction_ordargument(group.body), options);
12696 var phantom = new mathMLTree.MathNode("mphantom", inner);
12697 var node = new mathMLTree.MathNode("mpadded", [phantom]);
12698 node.setAttribute("width", "0px");
12699 return node;
12700 }
12701 });
12702 // CONCATENATED MODULE: ./src/functions/raisebox.js
12703
12704
12705
12706
12707
12708
12709 // Box manipulation
12710
12711 defineFunction({
12712 type: "raisebox",
12713 names: ["\\raisebox"],
12714 props: {
12715 numArgs: 2,
12716 argTypes: ["size", "hbox"],
12717 allowedInText: true
12718 },
12719 handler: function handler(_ref, args) {
12720 var parser = _ref.parser;
12721 var amount = assertNodeType(args[0], "size").value;
12722 var body = args[1];
12723 return {
12724 type: "raisebox",
12725 mode: parser.mode,
12726 dy: amount,
12727 body: body
12728 };
12729 },
12730 htmlBuilder: function htmlBuilder(group, options) {
12731 var body = buildHTML_buildGroup(group.body, options);
12732 var dy = units_calculateSize(group.dy, options);
12733 return buildCommon.makeVList({
12734 positionType: "shift",
12735 positionData: -dy,
12736 children: [{
12737 type: "elem",
12738 elem: body
12739 }]
12740 }, options);
12741 },
12742 mathmlBuilder: function mathmlBuilder(group, options) {
12743 var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]);
12744 var dy = group.dy.number + group.dy.unit;
12745 node.setAttribute("voffset", dy);
12746 return node;
12747 }
12748 });
12749 // CONCATENATED MODULE: ./src/functions/rule.js
12750
12751
12752
12753
12754
12755 defineFunction({
12756 type: "rule",
12757 names: ["\\rule"],
12758 props: {
12759 numArgs: 2,
12760 numOptionalArgs: 1,
12761 argTypes: ["size", "size", "size"]
12762 },
12763 handler: function handler(_ref, args, optArgs) {
12764 var parser = _ref.parser;
12765 var shift = optArgs[0];
12766 var width = assertNodeType(args[0], "size");
12767 var height = assertNodeType(args[1], "size");
12768 return {
12769 type: "rule",
12770 mode: parser.mode,
12771 shift: shift && assertNodeType(shift, "size").value,
12772 width: width.value,
12773 height: height.value
12774 };
12775 },
12776 htmlBuilder: function htmlBuilder(group, options) {
12777 // Make an empty span for the rule
12778 var rule = buildCommon.makeSpan(["mord", "rule"], [], options); // Calculate the shift, width, and height of the rule, and account for units
12779
12780 var width = units_calculateSize(group.width, options);
12781 var height = units_calculateSize(group.height, options);
12782 var shift = group.shift ? units_calculateSize(group.shift, options) : 0; // Style the rule to the right size
12783
12784 rule.style.borderRightWidth = width + "em";
12785 rule.style.borderTopWidth = height + "em";
12786 rule.style.bottom = shift + "em"; // Record the height and width
12787
12788 rule.width = width;
12789 rule.height = height + shift;
12790 rule.depth = -shift; // Font size is the number large enough that the browser will
12791 // reserve at least `absHeight` space above the baseline.
12792 // The 1.125 factor was empirically determined
12793
12794 rule.maxFontSize = height * 1.125 * options.sizeMultiplier;
12795 return rule;
12796 },
12797 mathmlBuilder: function mathmlBuilder(group, options) {
12798 var width = units_calculateSize(group.width, options);
12799 var height = units_calculateSize(group.height, options);
12800 var shift = group.shift ? units_calculateSize(group.shift, options) : 0;
12801 var color = options.color && options.getColor() || "black";
12802 var rule = new mathMLTree.MathNode("mspace");
12803 rule.setAttribute("mathbackground", color);
12804 rule.setAttribute("width", width + "em");
12805 rule.setAttribute("height", height + "em");
12806 var wrapper = new mathMLTree.MathNode("mpadded", [rule]);
12807
12808 if (shift >= 0) {
12809 wrapper.setAttribute("height", "+" + shift + "em");
12810 } else {
12811 wrapper.setAttribute("height", shift + "em");
12812 wrapper.setAttribute("depth", "+" + -shift + "em");
12813 }
12814
12815 wrapper.setAttribute("voffset", shift + "em");
12816 return wrapper;
12817 }
12818 });
12819 // CONCATENATED MODULE: ./src/functions/sizing.js
12820
12821
12822
12823
12824
12825 function sizingGroup(value, options, baseOptions) {
12826 var inner = buildHTML_buildExpression(value, options, false);
12827 var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; // Add size-resetting classes to the inner list and set maxFontSize
12828 // manually. Handle nested size changes.
12829
12830 for (var i = 0; i < inner.length; i++) {
12831 var pos = inner[i].classes.indexOf("sizing");
12832
12833 if (pos < 0) {
12834 Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions));
12835 } else if (inner[i].classes[pos + 1] === "reset-size" + options.size) {
12836 // This is a nested size change: e.g., inner[i] is the "b" in
12837 // `\Huge a \small b`. Override the old size (the `reset-` class)
12838 // but not the new size.
12839 inner[i].classes[pos + 1] = "reset-size" + baseOptions.size;
12840 }
12841
12842 inner[i].height *= multiplier;
12843 inner[i].depth *= multiplier;
12844 }
12845
12846 return buildCommon.makeFragment(inner);
12847 }
12848 var sizeFuncs = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"];
12849 var sizing_htmlBuilder = function htmlBuilder(group, options) {
12850 // Handle sizing operators like \Huge. Real TeX doesn't actually allow
12851 // these functions inside of math expressions, so we do some special
12852 // handling.
12853 var newOptions = options.havingSize(group.size);
12854 return sizingGroup(group.body, newOptions, options);
12855 };
12856 defineFunction({
12857 type: "sizing",
12858 names: sizeFuncs,
12859 props: {
12860 numArgs: 0,
12861 allowedInText: true
12862 },
12863 handler: function handler(_ref, args) {
12864 var breakOnTokenText = _ref.breakOnTokenText,
12865 funcName = _ref.funcName,
12866 parser = _ref.parser;
12867 var body = parser.parseExpression(false, breakOnTokenText);
12868 return {
12869 type: "sizing",
12870 mode: parser.mode,
12871 // Figure out what size to use based on the list of functions above
12872 size: sizeFuncs.indexOf(funcName) + 1,
12873 body: body
12874 };
12875 },
12876 htmlBuilder: sizing_htmlBuilder,
12877 mathmlBuilder: function mathmlBuilder(group, options) {
12878 var newOptions = options.havingSize(group.size);
12879 var inner = buildMathML_buildExpression(group.body, newOptions);
12880 var node = new mathMLTree.MathNode("mstyle", inner); // TODO(emily): This doesn't produce the correct size for nested size
12881 // changes, because we don't keep state of what style we're currently
12882 // in, so we can't reset the size to normal before changing it. Now
12883 // that we're passing an options parameter we should be able to fix
12884 // this.
12885
12886 node.setAttribute("mathsize", newOptions.sizeMultiplier + "em");
12887 return node;
12888 }
12889 });
12890 // CONCATENATED MODULE: ./src/functions/smash.js
12891 // smash, with optional [tb], as in AMS
12892
12893
12894
12895
12896
12897
12898 defineFunction({
12899 type: "smash",
12900 names: ["\\smash"],
12901 props: {
12902 numArgs: 1,
12903 numOptionalArgs: 1,
12904 allowedInText: true
12905 },
12906 handler: function handler(_ref, args, optArgs) {
12907 var parser = _ref.parser;
12908 var smashHeight = false;
12909 var smashDepth = false;
12910 var tbArg = optArgs[0] && assertNodeType(optArgs[0], "ordgroup");
12911
12912 if (tbArg) {
12913 // Optional [tb] argument is engaged.
12914 // ref: amsmath: \renewcommand{\smash}[1][tb]{%
12915 // def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}%
12916 var letter = "";
12917
12918 for (var i = 0; i < tbArg.body.length; ++i) {
12919 var node = tbArg.body[i]; // $FlowFixMe: Not every node type has a `text` property.
12920
12921 letter = node.text;
12922
12923 if (letter === "t") {
12924 smashHeight = true;
12925 } else if (letter === "b") {
12926 smashDepth = true;
12927 } else {
12928 smashHeight = false;
12929 smashDepth = false;
12930 break;
12931 }
12932 }
12933 } else {
12934 smashHeight = true;
12935 smashDepth = true;
12936 }
12937
12938 var body = args[0];
12939 return {
12940 type: "smash",
12941 mode: parser.mode,
12942 body: body,
12943 smashHeight: smashHeight,
12944 smashDepth: smashDepth
12945 };
12946 },
12947 htmlBuilder: function htmlBuilder(group, options) {
12948 var node = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options)]);
12949
12950 if (!group.smashHeight && !group.smashDepth) {
12951 return node;
12952 }
12953
12954 if (group.smashHeight) {
12955 node.height = 0; // In order to influence makeVList, we have to reset the children.
12956
12957 if (node.children) {
12958 for (var i = 0; i < node.children.length; i++) {
12959 node.children[i].height = 0;
12960 }
12961 }
12962 }
12963
12964 if (group.smashDepth) {
12965 node.depth = 0;
12966
12967 if (node.children) {
12968 for (var _i = 0; _i < node.children.length; _i++) {
12969 node.children[_i].depth = 0;
12970 }
12971 }
12972 } // At this point, we've reset the TeX-like height and depth values.
12973 // But the span still has an HTML line height.
12974 // makeVList applies "display: table-cell", which prevents the browser
12975 // from acting on that line height. So we'll call makeVList now.
12976
12977
12978 var smashedNode = buildCommon.makeVList({
12979 positionType: "firstBaseline",
12980 children: [{
12981 type: "elem",
12982 elem: node
12983 }]
12984 }, options); // For spacing, TeX treats \hphantom as a math group (same spacing as ord).
12985
12986 return buildCommon.makeSpan(["mord"], [smashedNode], options);
12987 },
12988 mathmlBuilder: function mathmlBuilder(group, options) {
12989 var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]);
12990
12991 if (group.smashHeight) {
12992 node.setAttribute("height", "0px");
12993 }
12994
12995 if (group.smashDepth) {
12996 node.setAttribute("depth", "0px");
12997 }
12998
12999 return node;
13000 }
13001 });
13002 // CONCATENATED MODULE: ./src/functions/sqrt.js
13003
13004
13005
13006
13007
13008
13009
13010 defineFunction({
13011 type: "sqrt",
13012 names: ["\\sqrt"],
13013 props: {
13014 numArgs: 1,
13015 numOptionalArgs: 1
13016 },
13017 handler: function handler(_ref, args, optArgs) {
13018 var parser = _ref.parser;
13019 var index = optArgs[0];
13020 var body = args[0];
13021 return {
13022 type: "sqrt",
13023 mode: parser.mode,
13024 body: body,
13025 index: index
13026 };
13027 },
13028 htmlBuilder: function htmlBuilder(group, options) {
13029 // Square roots are handled in the TeXbook pg. 443, Rule 11.
13030 // First, we do the same steps as in overline to build the inner group
13031 // and line
13032 var inner = buildHTML_buildGroup(group.body, options.havingCrampedStyle());
13033
13034 if (inner.height === 0) {
13035 // Render a small surd.
13036 inner.height = options.fontMetrics().xHeight;
13037 } // Some groups can return document fragments. Handle those by wrapping
13038 // them in a span.
13039
13040
13041 inner = buildCommon.wrapFragment(inner, options); // Calculate the minimum size for the \surd delimiter
13042
13043 var metrics = options.fontMetrics();
13044 var theta = metrics.defaultRuleThickness;
13045 var phi = theta;
13046
13047 if (options.style.id < src_Style.TEXT.id) {
13048 phi = options.fontMetrics().xHeight;
13049 } // Calculate the clearance between the body and line
13050
13051
13052 var lineClearance = theta + phi / 4;
13053 var minDelimiterHeight = inner.height + inner.depth + lineClearance + theta; // Create a sqrt SVG of the required minimum size
13054
13055 var _delimiter$sqrtImage = delimiter.sqrtImage(minDelimiterHeight, options),
13056 img = _delimiter$sqrtImage.span,
13057 ruleWidth = _delimiter$sqrtImage.ruleWidth,
13058 advanceWidth = _delimiter$sqrtImage.advanceWidth;
13059
13060 var delimDepth = img.height - ruleWidth; // Adjust the clearance based on the delimiter size
13061
13062 if (delimDepth > inner.height + inner.depth + lineClearance) {
13063 lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2;
13064 } // Shift the sqrt image
13065
13066
13067 var imgShift = img.height - inner.height - lineClearance - ruleWidth;
13068 inner.style.paddingLeft = advanceWidth + "em"; // Overlay the image and the argument.
13069
13070 var body = buildCommon.makeVList({
13071 positionType: "firstBaseline",
13072 children: [{
13073 type: "elem",
13074 elem: inner,
13075 wrapperClasses: ["svg-align"]
13076 }, {
13077 type: "kern",
13078 size: -(inner.height + imgShift)
13079 }, {
13080 type: "elem",
13081 elem: img
13082 }, {
13083 type: "kern",
13084 size: ruleWidth
13085 }]
13086 }, options);
13087
13088 if (!group.index) {
13089 return buildCommon.makeSpan(["mord", "sqrt"], [body], options);
13090 } else {
13091 // Handle the optional root index
13092 // The index is always in scriptscript style
13093 var newOptions = options.havingStyle(src_Style.SCRIPTSCRIPT);
13094 var rootm = buildHTML_buildGroup(group.index, newOptions, options); // The amount the index is shifted by. This is taken from the TeX
13095 // source, in the definition of `\r@@t`.
13096
13097 var toShift = 0.6 * (body.height - body.depth); // Build a VList with the superscript shifted up correctly
13098
13099 var rootVList = buildCommon.makeVList({
13100 positionType: "shift",
13101 positionData: -toShift,
13102 children: [{
13103 type: "elem",
13104 elem: rootm
13105 }]
13106 }, options); // Add a class surrounding it so we can add on the appropriate
13107 // kerning
13108
13109 var rootVListWrap = buildCommon.makeSpan(["root"], [rootVList]);
13110 return buildCommon.makeSpan(["mord", "sqrt"], [rootVListWrap, body], options);
13111 }
13112 },
13113 mathmlBuilder: function mathmlBuilder(group, options) {
13114 var body = group.body,
13115 index = group.index;
13116 return index ? new mathMLTree.MathNode("mroot", [buildMathML_buildGroup(body, options), buildMathML_buildGroup(index, options)]) : new mathMLTree.MathNode("msqrt", [buildMathML_buildGroup(body, options)]);
13117 }
13118 });
13119 // CONCATENATED MODULE: ./src/functions/styling.js
13120
13121
13122
13123
13124
13125 var styling_styleMap = {
13126 "display": src_Style.DISPLAY,
13127 "text": src_Style.TEXT,
13128 "script": src_Style.SCRIPT,
13129 "scriptscript": src_Style.SCRIPTSCRIPT
13130 };
13131 defineFunction({
13132 type: "styling",
13133 names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"],
13134 props: {
13135 numArgs: 0,
13136 allowedInText: true
13137 },
13138 handler: function handler(_ref, args) {
13139 var breakOnTokenText = _ref.breakOnTokenText,
13140 funcName = _ref.funcName,
13141 parser = _ref.parser;
13142 // parse out the implicit body
13143 var body = parser.parseExpression(true, breakOnTokenText); // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g.
13144 // here and in buildHTML and de-dupe the enumeration of all the styles).
13145 // $FlowFixMe: The names above exactly match the styles.
13146
13147 var style = funcName.slice(1, funcName.length - 5);
13148 return {
13149 type: "styling",
13150 mode: parser.mode,
13151 // Figure out what style to use by pulling out the style from
13152 // the function name
13153 style: style,
13154 body: body
13155 };
13156 },
13157 htmlBuilder: function htmlBuilder(group, options) {
13158 // Style changes are handled in the TeXbook on pg. 442, Rule 3.
13159 var newStyle = styling_styleMap[group.style];
13160 var newOptions = options.havingStyle(newStyle).withFont('');
13161 return sizingGroup(group.body, newOptions, options);
13162 },
13163 mathmlBuilder: function mathmlBuilder(group, options) {
13164 // Figure out what style we're changing to.
13165 var newStyle = styling_styleMap[group.style];
13166 var newOptions = options.havingStyle(newStyle);
13167 var inner = buildMathML_buildExpression(group.body, newOptions);
13168 var node = new mathMLTree.MathNode("mstyle", inner);
13169 var styleAttributes = {
13170 "display": ["0", "true"],
13171 "text": ["0", "false"],
13172 "script": ["1", "false"],
13173 "scriptscript": ["2", "false"]
13174 };
13175 var attr = styleAttributes[group.style];
13176 node.setAttribute("scriptlevel", attr[0]);
13177 node.setAttribute("displaystyle", attr[1]);
13178 return node;
13179 }
13180 });
13181 // CONCATENATED MODULE: ./src/functions/supsub.js
13182
13183
13184
13185
13186
13187
13188
13189
13190
13191
13192
13193
13194
13195
13196 /**
13197 * Sometimes, groups perform special rules when they have superscripts or
13198 * subscripts attached to them. This function lets the `supsub` group know that
13199 * Sometimes, groups perform special rules when they have superscripts or
13200 * its inner element should handle the superscripts and subscripts instead of
13201 * handling them itself.
13202 */
13203 var supsub_htmlBuilderDelegate = function htmlBuilderDelegate(group, options) {
13204 var base = group.base;
13205
13206 if (!base) {
13207 return null;
13208 } else if (base.type === "op") {
13209 // Operators handle supsubs differently when they have limits
13210 // (e.g. `\displaystyle\sum_2^3`)
13211 var delegate = base.limits && (options.style.size === src_Style.DISPLAY.size || base.alwaysHandleSupSub);
13212 return delegate ? op_htmlBuilder : null;
13213 } else if (base.type === "operatorname") {
13214 var _delegate = base.alwaysHandleSupSub && (options.style.size === src_Style.DISPLAY.size || base.limits);
13215
13216 return _delegate ? operatorname_htmlBuilder : null;
13217 } else if (base.type === "accent") {
13218 return utils.isCharacterBox(base.base) ? accent_htmlBuilder : null;
13219 } else if (base.type === "horizBrace") {
13220 var isSup = !group.sub;
13221 return isSup === base.isOver ? horizBrace_htmlBuilder : null;
13222 } else {
13223 return null;
13224 }
13225 }; // Super scripts and subscripts, whose precise placement can depend on other
13226 // functions that precede them.
13227
13228
13229 defineFunctionBuilders({
13230 type: "supsub",
13231 htmlBuilder: function htmlBuilder(group, options) {
13232 // Superscript and subscripts are handled in the TeXbook on page
13233 // 445-446, rules 18(a-f).
13234 // Here is where we defer to the inner group if it should handle
13235 // superscripts and subscripts itself.
13236 var builderDelegate = supsub_htmlBuilderDelegate(group, options);
13237
13238 if (builderDelegate) {
13239 return builderDelegate(group, options);
13240 }
13241
13242 var valueBase = group.base,
13243 valueSup = group.sup,
13244 valueSub = group.sub;
13245 var base = buildHTML_buildGroup(valueBase, options);
13246 var supm;
13247 var subm;
13248 var metrics = options.fontMetrics(); // Rule 18a
13249
13250 var supShift = 0;
13251 var subShift = 0;
13252 var isCharacterBox = valueBase && utils.isCharacterBox(valueBase);
13253
13254 if (valueSup) {
13255 var newOptions = options.havingStyle(options.style.sup());
13256 supm = buildHTML_buildGroup(valueSup, newOptions, options);
13257
13258 if (!isCharacterBox) {
13259 supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier;
13260 }
13261 }
13262
13263 if (valueSub) {
13264 var _newOptions = options.havingStyle(options.style.sub());
13265
13266 subm = buildHTML_buildGroup(valueSub, _newOptions, options);
13267
13268 if (!isCharacterBox) {
13269 subShift = base.depth + _newOptions.fontMetrics().subDrop * _newOptions.sizeMultiplier / options.sizeMultiplier;
13270 }
13271 } // Rule 18c
13272
13273
13274 var minSupShift;
13275
13276 if (options.style === src_Style.DISPLAY) {
13277 minSupShift = metrics.sup1;
13278 } else if (options.style.cramped) {
13279 minSupShift = metrics.sup3;
13280 } else {
13281 minSupShift = metrics.sup2;
13282 } // scriptspace is a font-size-independent size, so scale it
13283 // appropriately for use as the marginRight.
13284
13285
13286 var multiplier = options.sizeMultiplier;
13287 var marginRight = 0.5 / metrics.ptPerEm / multiplier + "em";
13288 var marginLeft = null;
13289
13290 if (subm) {
13291 // Subscripts shouldn't be shifted by the base's italic correction.
13292 // Account for that by shifting the subscript back the appropriate
13293 // amount. Note we only do this when the base is a single symbol.
13294 var isOiint = group.base && group.base.type === "op" && group.base.name && (group.base.name === "\\oiint" || group.base.name === "\\oiiint");
13295
13296 if (base instanceof domTree_SymbolNode || isOiint) {
13297 // $FlowFixMe
13298 marginLeft = -base.italic + "em";
13299 }
13300 }
13301
13302 var supsub;
13303
13304 if (supm && subm) {
13305 supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);
13306 subShift = Math.max(subShift, metrics.sub2);
13307 var ruleWidth = metrics.defaultRuleThickness; // Rule 18e
13308
13309 var maxWidth = 4 * ruleWidth;
13310
13311 if (supShift - supm.depth - (subm.height - subShift) < maxWidth) {
13312 subShift = maxWidth - (supShift - supm.depth) + subm.height;
13313 var psi = 0.8 * metrics.xHeight - (supShift - supm.depth);
13314
13315 if (psi > 0) {
13316 supShift += psi;
13317 subShift -= psi;
13318 }
13319 }
13320
13321 var vlistElem = [{
13322 type: "elem",
13323 elem: subm,
13324 shift: subShift,
13325 marginRight: marginRight,
13326 marginLeft: marginLeft
13327 }, {
13328 type: "elem",
13329 elem: supm,
13330 shift: -supShift,
13331 marginRight: marginRight
13332 }];
13333 supsub = buildCommon.makeVList({
13334 positionType: "individualShift",
13335 children: vlistElem
13336 }, options);
13337 } else if (subm) {
13338 // Rule 18b
13339 subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight);
13340 var _vlistElem = [{
13341 type: "elem",
13342 elem: subm,
13343 marginLeft: marginLeft,
13344 marginRight: marginRight
13345 }];
13346 supsub = buildCommon.makeVList({
13347 positionType: "shift",
13348 positionData: subShift,
13349 children: _vlistElem
13350 }, options);
13351 } else if (supm) {
13352 // Rule 18c, d
13353 supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);
13354 supsub = buildCommon.makeVList({
13355 positionType: "shift",
13356 positionData: -supShift,
13357 children: [{
13358 type: "elem",
13359 elem: supm,
13360 marginRight: marginRight
13361 }]
13362 }, options);
13363 } else {
13364 throw new Error("supsub must have either sup or sub.");
13365 } // Wrap the supsub vlist in a span.msupsub to reset text-align.
13366
13367
13368 var mclass = getTypeOfDomTree(base, "right") || "mord";
13369 return buildCommon.makeSpan([mclass], [base, buildCommon.makeSpan(["msupsub"], [supsub])], options);
13370 },
13371 mathmlBuilder: function mathmlBuilder(group, options) {
13372 // Is the inner group a relevant horizonal brace?
13373 var isBrace = false;
13374 var isOver;
13375 var isSup;
13376 var horizBrace = checkNodeType(group.base, "horizBrace");
13377
13378 if (horizBrace) {
13379 isSup = !!group.sup;
13380
13381 if (isSup === horizBrace.isOver) {
13382 isBrace = true;
13383 isOver = horizBrace.isOver;
13384 }
13385 }
13386
13387 if (group.base && (group.base.type === "op" || group.base.type === "operatorname")) {
13388 group.base.parentIsSupSub = true;
13389 }
13390
13391 var children = [buildMathML_buildGroup(group.base, options)];
13392
13393 if (group.sub) {
13394 children.push(buildMathML_buildGroup(group.sub, options));
13395 }
13396
13397 if (group.sup) {
13398 children.push(buildMathML_buildGroup(group.sup, options));
13399 }
13400
13401 var nodeType;
13402
13403 if (isBrace) {
13404 nodeType = isOver ? "mover" : "munder";
13405 } else if (!group.sub) {
13406 var base = group.base;
13407
13408 if (base && base.type === "op" && base.limits && (options.style === src_Style.DISPLAY || base.alwaysHandleSupSub)) {
13409 nodeType = "mover";
13410 } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub && (base.limits || options.style === src_Style.DISPLAY)) {
13411 nodeType = "mover";
13412 } else {
13413 nodeType = "msup";
13414 }
13415 } else if (!group.sup) {
13416 var _base = group.base;
13417
13418 if (_base && _base.type === "op" && _base.limits && (options.style === src_Style.DISPLAY || _base.alwaysHandleSupSub)) {
13419 nodeType = "munder";
13420 } else if (_base && _base.type === "operatorname" && _base.alwaysHandleSupSub && (_base.limits || options.style === src_Style.DISPLAY)) {
13421 nodeType = "munder";
13422 } else {
13423 nodeType = "msub";
13424 }
13425 } else {
13426 var _base2 = group.base;
13427
13428 if (_base2 && _base2.type === "op" && _base2.limits && options.style === src_Style.DISPLAY) {
13429 nodeType = "munderover";
13430 } else if (_base2 && _base2.type === "operatorname" && _base2.alwaysHandleSupSub && (options.style === src_Style.DISPLAY || _base2.limits)) {
13431 nodeType = "munderover";
13432 } else {
13433 nodeType = "msubsup";
13434 }
13435 }
13436
13437 var node = new mathMLTree.MathNode(nodeType, children);
13438 return node;
13439 }
13440 });
13441 // CONCATENATED MODULE: ./src/functions/symbolsOp.js
13442
13443
13444
13445 // Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js.
13446
13447 defineFunctionBuilders({
13448 type: "atom",
13449 htmlBuilder: function htmlBuilder(group, options) {
13450 return buildCommon.mathsym(group.text, group.mode, options, ["m" + group.family]);
13451 },
13452 mathmlBuilder: function mathmlBuilder(group, options) {
13453 var node = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.text, group.mode)]);
13454
13455 if (group.family === "bin") {
13456 var variant = buildMathML_getVariant(group, options);
13457
13458 if (variant === "bold-italic") {
13459 node.setAttribute("mathvariant", variant);
13460 }
13461 } else if (group.family === "punct") {
13462 node.setAttribute("separator", "true");
13463 } else if (group.family === "open" || group.family === "close") {
13464 // Delims built here should not stretch vertically.
13465 // See delimsizing.js for stretchy delims.
13466 node.setAttribute("stretchy", "false");
13467 }
13468
13469 return node;
13470 }
13471 });
13472 // CONCATENATED MODULE: ./src/functions/symbolsOrd.js
13473
13474
13475
13476
13477 // "mathord" and "textord" ParseNodes created in Parser.js from symbol Groups in
13478 var defaultVariant = {
13479 "mi": "italic",
13480 "mn": "normal",
13481 "mtext": "normal"
13482 };
13483 defineFunctionBuilders({
13484 type: "mathord",
13485 htmlBuilder: function htmlBuilder(group, options) {
13486 return buildCommon.makeOrd(group, options, "mathord");
13487 },
13488 mathmlBuilder: function mathmlBuilder(group, options) {
13489 var node = new mathMLTree.MathNode("mi", [buildMathML_makeText(group.text, group.mode, options)]);
13490 var variant = buildMathML_getVariant(group, options) || "italic";
13491
13492 if (variant !== defaultVariant[node.type]) {
13493 node.setAttribute("mathvariant", variant);
13494 }
13495
13496 return node;
13497 }
13498 });
13499 defineFunctionBuilders({
13500 type: "textord",
13501 htmlBuilder: function htmlBuilder(group, options) {
13502 return buildCommon.makeOrd(group, options, "textord");
13503 },
13504 mathmlBuilder: function mathmlBuilder(group, options) {
13505 var text = buildMathML_makeText(group.text, group.mode, options);
13506 var variant = buildMathML_getVariant(group, options) || "normal";
13507 var node;
13508
13509 if (group.mode === 'text') {
13510 node = new mathMLTree.MathNode("mtext", [text]);
13511 } else if (/[0-9]/.test(group.text)) {
13512 // TODO(kevinb) merge adjacent <mn> nodes
13513 // do it as a post processing step
13514 node = new mathMLTree.MathNode("mn", [text]);
13515 } else if (group.text === "\\prime") {
13516 node = new mathMLTree.MathNode("mo", [text]);
13517 } else {
13518 node = new mathMLTree.MathNode("mi", [text]);
13519 }
13520
13521 if (variant !== defaultVariant[node.type]) {
13522 node.setAttribute("mathvariant", variant);
13523 }
13524
13525 return node;
13526 }
13527 });
13528 // CONCATENATED MODULE: ./src/functions/symbolsSpacing.js
13529
13530
13531
13532 // A map of CSS-based spacing functions to their CSS class.
13533
13534 var cssSpace = {
13535 "\\nobreak": "nobreak",
13536 "\\allowbreak": "allowbreak"
13537 }; // A lookup table to determine whether a spacing function/symbol should be
13538 // treated like a regular space character. If a symbol or command is a key
13539 // in this table, then it should be a regular space character. Furthermore,
13540 // the associated value may have a `className` specifying an extra CSS class
13541 // to add to the created `span`.
13542
13543 var regularSpace = {
13544 " ": {},
13545 "\\ ": {},
13546 "~": {
13547 className: "nobreak"
13548 },
13549 "\\space": {},
13550 "\\nobreakspace": {
13551 className: "nobreak"
13552 }
13553 }; // ParseNode<"spacing"> created in Parser.js from the "spacing" symbol Groups in
13554 // src/symbols.js.
13555
13556 defineFunctionBuilders({
13557 type: "spacing",
13558 htmlBuilder: function htmlBuilder(group, options) {
13559 if (regularSpace.hasOwnProperty(group.text)) {
13560 var className = regularSpace[group.text].className || ""; // Spaces are generated by adding an actual space. Each of these
13561 // things has an entry in the symbols table, so these will be turned
13562 // into appropriate outputs.
13563
13564 if (group.mode === "text") {
13565 var ord = buildCommon.makeOrd(group, options, "textord");
13566 ord.classes.push(className);
13567 return ord;
13568 } else {
13569 return buildCommon.makeSpan(["mspace", className], [buildCommon.mathsym(group.text, group.mode, options)], options);
13570 }
13571 } else if (cssSpace.hasOwnProperty(group.text)) {
13572 // Spaces based on just a CSS class.
13573 return buildCommon.makeSpan(["mspace", cssSpace[group.text]], [], options);
13574 } else {
13575 throw new src_ParseError("Unknown type of space \"" + group.text + "\"");
13576 }
13577 },
13578 mathmlBuilder: function mathmlBuilder(group, options) {
13579 var node;
13580
13581 if (regularSpace.hasOwnProperty(group.text)) {
13582 node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("\xA0")]);
13583 } else if (cssSpace.hasOwnProperty(group.text)) {
13584 // CSS-based MathML spaces (\nobreak, \allowbreak) are ignored
13585 return new mathMLTree.MathNode("mspace");
13586 } else {
13587 throw new src_ParseError("Unknown type of space \"" + group.text + "\"");
13588 }
13589
13590 return node;
13591 }
13592 });
13593 // CONCATENATED MODULE: ./src/functions/tag.js
13594
13595
13596
13597
13598 var tag_pad = function pad() {
13599 var padNode = new mathMLTree.MathNode("mtd", []);
13600 padNode.setAttribute("width", "50%");
13601 return padNode;
13602 };
13603
13604 defineFunctionBuilders({
13605 type: "tag",
13606 mathmlBuilder: function mathmlBuilder(group, options) {
13607 var table = new mathMLTree.MathNode("mtable", [new mathMLTree.MathNode("mtr", [tag_pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.body, options)]), tag_pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.tag, options)])])]);
13608 table.setAttribute("width", "100%");
13609 return table; // TODO: Left-aligned tags.
13610 // Currently, the group and options passed here do not contain
13611 // enough info to set tag alignment. `leqno` is in Settings but it is
13612 // not passed to Options. On the HTML side, leqno is
13613 // set by a CSS class applied in buildTree.js. That would have worked
13614 // in MathML if browsers supported <mlabeledtr>. Since they don't, we
13615 // need to rewrite the way this function is called.
13616 }
13617 });
13618 // CONCATENATED MODULE: ./src/functions/text.js
13619
13620
13621
13622 // Non-mathy text, possibly in a font
13623
13624 var textFontFamilies = {
13625 "\\text": undefined,
13626 "\\textrm": "textrm",
13627 "\\textsf": "textsf",
13628 "\\texttt": "texttt",
13629 "\\textnormal": "textrm"
13630 };
13631 var textFontWeights = {
13632 "\\textbf": "textbf",
13633 "\\textmd": "textmd"
13634 };
13635 var textFontShapes = {
13636 "\\textit": "textit",
13637 "\\textup": "textup"
13638 };
13639
13640 var optionsWithFont = function optionsWithFont(group, options) {
13641 var font = group.font; // Checks if the argument is a font family or a font style.
13642
13643 if (!font) {
13644 return options;
13645 } else if (textFontFamilies[font]) {
13646 return options.withTextFontFamily(textFontFamilies[font]);
13647 } else if (textFontWeights[font]) {
13648 return options.withTextFontWeight(textFontWeights[font]);
13649 } else {
13650 return options.withTextFontShape(textFontShapes[font]);
13651 }
13652 };
13653
13654 defineFunction({
13655 type: "text",
13656 names: [// Font families
13657 "\\text", "\\textrm", "\\textsf", "\\texttt", "\\textnormal", // Font weights
13658 "\\textbf", "\\textmd", // Font Shapes
13659 "\\textit", "\\textup"],
13660 props: {
13661 numArgs: 1,
13662 argTypes: ["text"],
13663 greediness: 2,
13664 allowedInText: true
13665 },
13666 handler: function handler(_ref, args) {
13667 var parser = _ref.parser,
13668 funcName = _ref.funcName;
13669 var body = args[0];
13670 return {
13671 type: "text",
13672 mode: parser.mode,
13673 body: defineFunction_ordargument(body),
13674 font: funcName
13675 };
13676 },
13677 htmlBuilder: function htmlBuilder(group, options) {
13678 var newOptions = optionsWithFont(group, options);
13679 var inner = buildHTML_buildExpression(group.body, newOptions, true);
13680 return buildCommon.makeSpan(["mord", "text"], buildCommon.tryCombineChars(inner), newOptions);
13681 },
13682 mathmlBuilder: function mathmlBuilder(group, options) {
13683 var newOptions = optionsWithFont(group, options);
13684 return buildExpressionRow(group.body, newOptions);
13685 }
13686 });
13687 // CONCATENATED MODULE: ./src/functions/underline.js
13688
13689
13690
13691
13692
13693 defineFunction({
13694 type: "underline",
13695 names: ["\\underline"],
13696 props: {
13697 numArgs: 1,
13698 allowedInText: true
13699 },
13700 handler: function handler(_ref, args) {
13701 var parser = _ref.parser;
13702 return {
13703 type: "underline",
13704 mode: parser.mode,
13705 body: args[0]
13706 };
13707 },
13708 htmlBuilder: function htmlBuilder(group, options) {
13709 // Underlines are handled in the TeXbook pg 443, Rule 10.
13710 // Build the inner group.
13711 var innerGroup = buildHTML_buildGroup(group.body, options); // Create the line to go below the body
13712
13713 var line = buildCommon.makeLineSpan("underline-line", options); // Generate the vlist, with the appropriate kerns
13714
13715 var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;
13716 var vlist = buildCommon.makeVList({
13717 positionType: "top",
13718 positionData: innerGroup.height,
13719 children: [{
13720 type: "kern",
13721 size: defaultRuleThickness
13722 }, {
13723 type: "elem",
13724 elem: line
13725 }, {
13726 type: "kern",
13727 size: 3 * defaultRuleThickness
13728 }, {
13729 type: "elem",
13730 elem: innerGroup
13731 }]
13732 }, options);
13733 return buildCommon.makeSpan(["mord", "underline"], [vlist], options);
13734 },
13735 mathmlBuilder: function mathmlBuilder(group, options) {
13736 var operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203E")]);
13737 operator.setAttribute("stretchy", "true");
13738 var node = new mathMLTree.MathNode("munder", [buildMathML_buildGroup(group.body, options), operator]);
13739 node.setAttribute("accentunder", "true");
13740 return node;
13741 }
13742 });
13743 // CONCATENATED MODULE: ./src/functions/verb.js
13744
13745
13746
13747
13748 defineFunction({
13749 type: "verb",
13750 names: ["\\verb"],
13751 props: {
13752 numArgs: 0,
13753 allowedInText: true
13754 },
13755 handler: function handler(context, args, optArgs) {
13756 // \verb and \verb* are dealt with directly in Parser.js.
13757 // If we end up here, it's because of a failure to match the two delimiters
13758 // in the regex in Lexer.js. LaTeX raises the following error when \verb is
13759 // terminated by end of line (or file).
13760 throw new src_ParseError("\\verb ended by end of line instead of matching delimiter");
13761 },
13762 htmlBuilder: function htmlBuilder(group, options) {
13763 var text = makeVerb(group);
13764 var body = []; // \verb enters text mode and therefore is sized like \textstyle
13765
13766 var newOptions = options.havingStyle(options.style.text());
13767
13768 for (var i = 0; i < text.length; i++) {
13769 var c = text[i];
13770
13771 if (c === '~') {
13772 c = '\\textasciitilde';
13773 }
13774
13775 body.push(buildCommon.makeSymbol(c, "Typewriter-Regular", group.mode, newOptions, ["mord", "texttt"]));
13776 }
13777
13778 return buildCommon.makeSpan(["mord", "text"].concat(newOptions.sizingClasses(options)), buildCommon.tryCombineChars(body), newOptions);
13779 },
13780 mathmlBuilder: function mathmlBuilder(group, options) {
13781 var text = new mathMLTree.TextNode(makeVerb(group));
13782 var node = new mathMLTree.MathNode("mtext", [text]);
13783 node.setAttribute("mathvariant", "monospace");
13784 return node;
13785 }
13786 });
13787 /**
13788 * Converts verb group into body string.
13789 *
13790 * \verb* replaces each space with an open box \u2423
13791 * \verb replaces each space with a no-break space \xA0
13792 */
13793
13794 var makeVerb = function makeVerb(group) {
13795 return group.body.replace(/ /g, group.star ? "\u2423" : '\xA0');
13796 };
13797 // CONCATENATED MODULE: ./src/functions.js
13798 /** Include this to ensure that all functions are defined. */
13799
13800 var functions = _functions;
13801 /* harmony default export */ var src_functions = (functions); // TODO(kevinb): have functions return an object and call defineFunction with
13802 // that object in this file instead of relying on side-effects.
13803
13804
13805
13806
13807
13808
13809
13810
13811
13812
13813
13814
13815
13816
13817
13818
13819
13820
13821
13822
13823
13824
13825
13826
13827
13828
13829
13830
13831
13832
13833
13834
13835
13836
13837
13838
13839
13840
13841
13842
13843 // CONCATENATED MODULE: ./src/Lexer.js
13844 /**
13845 * The Lexer class handles tokenizing the input in various ways. Since our
13846 * parser expects us to be able to backtrack, the lexer allows lexing from any
13847 * given starting point.
13848 *
13849 * Its main exposed function is the `lex` function, which takes a position to
13850 * lex from and a type of token to lex. It defers to the appropriate `_innerLex`
13851 * function.
13852 *
13853 * The various `_innerLex` functions perform the actual lexing of different
13854 * kinds.
13855 */
13856
13857
13858
13859
13860 /* The following tokenRegex
13861 * - matches typical whitespace (but not NBSP etc.) using its first group
13862 * - does not match any control character \x00-\x1f except whitespace
13863 * - does not match a bare backslash
13864 * - matches any ASCII character except those just mentioned
13865 * - does not match the BMP private use area \uE000-\uF8FF
13866 * - does not match bare surrogate code units
13867 * - matches any BMP character except for those just described
13868 * - matches any valid Unicode surrogate pair
13869 * - matches a backslash followed by one or more letters
13870 * - matches a backslash followed by any BMP character, including newline
13871 * Just because the Lexer matches something doesn't mean it's valid input:
13872 * If there is no matching function or symbol definition, the Parser will
13873 * still reject the input.
13874 */
13875 var spaceRegexString = "[ \r\n\t]";
13876 var controlWordRegexString = "\\\\[a-zA-Z@]+";
13877 var controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]";
13878 var controlWordWhitespaceRegexString = "" + controlWordRegexString + spaceRegexString + "*";
13879 var controlWordWhitespaceRegex = new RegExp("^(" + controlWordRegexString + ")" + spaceRegexString + "*$");
13880 var combiningDiacriticalMarkString = "[\u0300-\u036F]";
13881 var combiningDiacriticalMarksEndRegex = new RegExp(combiningDiacriticalMarkString + "+$");
13882 var tokenRegexString = "(" + spaceRegexString + "+)|" + // whitespace
13883 "([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + ( // single codepoint
13884 combiningDiacriticalMarkString + "*") + // ...plus accents
13885 "|[\uD800-\uDBFF][\uDC00-\uDFFF]" + ( // surrogate pair
13886 combiningDiacriticalMarkString + "*") + // ...plus accents
13887 "|\\\\verb\\*([^]).*?\\3" + // \verb*
13888 "|\\\\verb([^*a-zA-Z]).*?\\4" + // \verb unstarred
13889 "|\\\\operatorname\\*" + ( // \operatorname*
13890 "|" + controlWordWhitespaceRegexString) + ( // \macroName + spaces
13891 "|" + controlSymbolRegexString + ")"); // \\, \', etc.
13892
13893 /** Main Lexer class */
13894
13895 var Lexer_Lexer =
13896 /*#__PURE__*/
13897 function () {
13898 // category codes, only supports comment characters (14) for now
13899 function Lexer(input, settings) {
13900 this.input = void 0;
13901 this.settings = void 0;
13902 this.tokenRegex = void 0;
13903 this.catcodes = void 0;
13904 // Separate accents from characters
13905 this.input = input;
13906 this.settings = settings;
13907 this.tokenRegex = new RegExp(tokenRegexString, 'g');
13908 this.catcodes = {
13909 "%": 14 // comment character
13910
13911 };
13912 }
13913
13914 var _proto = Lexer.prototype;
13915
13916 _proto.setCatcode = function setCatcode(char, code) {
13917 this.catcodes[char] = code;
13918 }
13919 /**
13920 * This function lexes a single token.
13921 */
13922 ;
13923
13924 _proto.lex = function lex() {
13925 var input = this.input;
13926 var pos = this.tokenRegex.lastIndex;
13927
13928 if (pos === input.length) {
13929 return new Token_Token("EOF", new SourceLocation(this, pos, pos));
13930 }
13931
13932 var match = this.tokenRegex.exec(input);
13933
13934 if (match === null || match.index !== pos) {
13935 throw new src_ParseError("Unexpected character: '" + input[pos] + "'", new Token_Token(input[pos], new SourceLocation(this, pos, pos + 1)));
13936 }
13937
13938 var text = match[2] || " ";
13939
13940 if (this.catcodes[text] === 14) {
13941 // comment character
13942 var nlIndex = input.indexOf('\n', this.tokenRegex.lastIndex);
13943
13944 if (nlIndex === -1) {
13945 this.tokenRegex.lastIndex = input.length; // EOF
13946
13947 this.settings.reportNonstrict("commentAtEnd", "% comment has no terminating newline; LaTeX would " + "fail because of commenting the end of math mode (e.g. $)");
13948 } else {
13949 this.tokenRegex.lastIndex = nlIndex + 1;
13950 }
13951
13952 return this.lex();
13953 } // Trim any trailing whitespace from control word match
13954
13955
13956 var controlMatch = text.match(controlWordWhitespaceRegex);
13957
13958 if (controlMatch) {
13959 text = controlMatch[1];
13960 }
13961
13962 return new Token_Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex));
13963 };
13964
13965 return Lexer;
13966 }();
13967
13968
13969 // CONCATENATED MODULE: ./src/Namespace.js
13970 /**
13971 * A `Namespace` refers to a space of nameable things like macros or lengths,
13972 * which can be `set` either globally or local to a nested group, using an
13973 * undo stack similar to how TeX implements this functionality.
13974 * Performance-wise, `get` and local `set` take constant time, while global
13975 * `set` takes time proportional to the depth of group nesting.
13976 */
13977
13978
13979 var Namespace_Namespace =
13980 /*#__PURE__*/
13981 function () {
13982 /**
13983 * Both arguments are optional. The first argument is an object of
13984 * built-in mappings which never change. The second argument is an object
13985 * of initial (global-level) mappings, which will constantly change
13986 * according to any global/top-level `set`s done.
13987 */
13988 function Namespace(builtins, globalMacros) {
13989 if (builtins === void 0) {
13990 builtins = {};
13991 }
13992
13993 if (globalMacros === void 0) {
13994 globalMacros = {};
13995 }
13996
13997 this.current = void 0;
13998 this.builtins = void 0;
13999 this.undefStack = void 0;
14000 this.current = globalMacros;
14001 this.builtins = builtins;
14002 this.undefStack = [];
14003 }
14004 /**
14005 * Start a new nested group, affecting future local `set`s.
14006 */
14007
14008
14009 var _proto = Namespace.prototype;
14010
14011 _proto.beginGroup = function beginGroup() {
14012 this.undefStack.push({});
14013 }
14014 /**
14015 * End current nested group, restoring values before the group began.
14016 */
14017 ;
14018
14019 _proto.endGroup = function endGroup() {
14020 if (this.undefStack.length === 0) {
14021 throw new src_ParseError("Unbalanced namespace destruction: attempt " + "to pop global namespace; please report this as a bug");
14022 }
14023
14024 var undefs = this.undefStack.pop();
14025
14026 for (var undef in undefs) {
14027 if (undefs.hasOwnProperty(undef)) {
14028 if (undefs[undef] === undefined) {
14029 delete this.current[undef];
14030 } else {
14031 this.current[undef] = undefs[undef];
14032 }
14033 }
14034 }
14035 }
14036 /**
14037 * Detect whether `name` has a definition. Equivalent to
14038 * `get(name) != null`.
14039 */
14040 ;
14041
14042 _proto.has = function has(name) {
14043 return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name);
14044 }
14045 /**
14046 * Get the current value of a name, or `undefined` if there is no value.
14047 *
14048 * Note: Do not use `if (namespace.get(...))` to detect whether a macro
14049 * is defined, as the definition may be the empty string which evaluates
14050 * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or
14051 * `if (namespace.has(...))`.
14052 */
14053 ;
14054
14055 _proto.get = function get(name) {
14056 if (this.current.hasOwnProperty(name)) {
14057 return this.current[name];
14058 } else {
14059 return this.builtins[name];
14060 }
14061 }
14062 /**
14063 * Set the current value of a name, and optionally set it globally too.
14064 * Local set() sets the current value and (when appropriate) adds an undo
14065 * operation to the undo stack. Global set() may change the undo
14066 * operation at every level, so takes time linear in their number.
14067 */
14068 ;
14069
14070 _proto.set = function set(name, value, global) {
14071 if (global === void 0) {
14072 global = false;
14073 }
14074
14075 if (global) {
14076 // Global set is equivalent to setting in all groups. Simulate this
14077 // by destroying any undos currently scheduled for this name,
14078 // and adding an undo with the *new* value (in case it later gets
14079 // locally reset within this environment).
14080 for (var i = 0; i < this.undefStack.length; i++) {
14081 delete this.undefStack[i][name];
14082 }
14083
14084 if (this.undefStack.length > 0) {
14085 this.undefStack[this.undefStack.length - 1][name] = value;
14086 }
14087 } else {
14088 // Undo this set at end of this group (possibly to `undefined`),
14089 // unless an undo is already in place, in which case that older
14090 // value is the correct one.
14091 var top = this.undefStack[this.undefStack.length - 1];
14092
14093 if (top && !top.hasOwnProperty(name)) {
14094 top[name] = this.current[name];
14095 }
14096 }
14097
14098 this.current[name] = value;
14099 };
14100
14101 return Namespace;
14102 }();
14103
14104
14105 // CONCATENATED MODULE: ./src/macros.js
14106 /**
14107 * Predefined macros for KaTeX.
14108 * This can be used to define some commands in terms of others.
14109 */
14110
14111
14112
14113
14114
14115 var builtinMacros = {};
14116 /* harmony default export */ var macros = (builtinMacros); // This function might one day accept an additional argument and do more things.
14117
14118 function defineMacro(name, body) {
14119 builtinMacros[name] = body;
14120 } //////////////////////////////////////////////////////////////////////
14121 // macro tools
14122 // LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2
14123 // TeX source: \long\def\@firstoftwo#1#2{#1}
14124
14125 defineMacro("\\@firstoftwo", function (context) {
14126 var args = context.consumeArgs(2);
14127 return {
14128 tokens: args[0],
14129 numArgs: 0
14130 };
14131 }); // LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1
14132 // TeX source: \long\def\@secondoftwo#1#2{#2}
14133
14134 defineMacro("\\@secondoftwo", function (context) {
14135 var args = context.consumeArgs(2);
14136 return {
14137 tokens: args[1],
14138 numArgs: 0
14139 };
14140 }); // LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)
14141 // symbol. If it matches #1, then the macro expands to #2; otherwise, #3.
14142 // Note, however, that it does not consume the next symbol in either case.
14143
14144 defineMacro("\\@ifnextchar", function (context) {
14145 var args = context.consumeArgs(3); // symbol, if, else
14146
14147 var nextToken = context.future();
14148
14149 if (args[0].length === 1 && args[0][0].text === nextToken.text) {
14150 return {
14151 tokens: args[1],
14152 numArgs: 0
14153 };
14154 } else {
14155 return {
14156 tokens: args[2],
14157 numArgs: 0
14158 };
14159 }
14160 }); // LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.
14161 // If it is `*`, then it consumes the symbol, and the macro expands to #1;
14162 // otherwise, the macro expands to #2 (without consuming the symbol).
14163 // TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}
14164
14165 defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); // LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode
14166
14167 defineMacro("\\TextOrMath", function (context) {
14168 var args = context.consumeArgs(2);
14169
14170 if (context.mode === 'text') {
14171 return {
14172 tokens: args[0],
14173 numArgs: 0
14174 };
14175 } else {
14176 return {
14177 tokens: args[1],
14178 numArgs: 0
14179 };
14180 }
14181 }); // Lookup table for parsing numbers in base 8 through 16
14182
14183 var digitToNumber = {
14184 "0": 0,
14185 "1": 1,
14186 "2": 2,
14187 "3": 3,
14188 "4": 4,
14189 "5": 5,
14190 "6": 6,
14191 "7": 7,
14192 "8": 8,
14193 "9": 9,
14194 "a": 10,
14195 "A": 10,
14196 "b": 11,
14197 "B": 11,
14198 "c": 12,
14199 "C": 12,
14200 "d": 13,
14201 "D": 13,
14202 "e": 14,
14203 "E": 14,
14204 "f": 15,
14205 "F": 15
14206 }; // TeX \char makes a literal character (catcode 12) using the following forms:
14207 // (see The TeXBook, p. 43)
14208 // \char123 -- decimal
14209 // \char'123 -- octal
14210 // \char"123 -- hex
14211 // \char`x -- character that can be written (i.e. isn't active)
14212 // \char`\x -- character that cannot be written (e.g. %)
14213 // These all refer to characters from the font, so we turn them into special
14214 // calls to a function \@char dealt with in the Parser.
14215
14216 defineMacro("\\char", function (context) {
14217 var token = context.popToken();
14218 var base;
14219 var number = '';
14220
14221 if (token.text === "'") {
14222 base = 8;
14223 token = context.popToken();
14224 } else if (token.text === '"') {
14225 base = 16;
14226 token = context.popToken();
14227 } else if (token.text === "`") {
14228 token = context.popToken();
14229
14230 if (token.text[0] === "\\") {
14231 number = token.text.charCodeAt(1);
14232 } else if (token.text === "EOF") {
14233 throw new src_ParseError("\\char` missing argument");
14234 } else {
14235 number = token.text.charCodeAt(0);
14236 }
14237 } else {
14238 base = 10;
14239 }
14240
14241 if (base) {
14242 // Parse a number in the given base, starting with first `token`.
14243 number = digitToNumber[token.text];
14244
14245 if (number == null || number >= base) {
14246 throw new src_ParseError("Invalid base-" + base + " digit " + token.text);
14247 }
14248
14249 var digit;
14250
14251 while ((digit = digitToNumber[context.future().text]) != null && digit < base) {
14252 number *= base;
14253 number += digit;
14254 context.popToken();
14255 }
14256 }
14257
14258 return "\\@char{" + number + "}";
14259 }); // Basic support for macro definitions:
14260 // \def\macro{expansion}
14261 // \def\macro#1{expansion}
14262 // \def\macro#1#2{expansion}
14263 // \def\macro#1#2#3#4#5#6#7#8#9{expansion}
14264 // Also the \gdef and \global\def equivalents
14265
14266 var macros_def = function def(context, global) {
14267 var arg = context.consumeArgs(1)[0];
14268
14269 if (arg.length !== 1) {
14270 throw new src_ParseError("\\gdef's first argument must be a macro name");
14271 }
14272
14273 var name = arg[0].text; // Count argument specifiers, and check they are in the order #1 #2 ...
14274
14275 var numArgs = 0;
14276 arg = context.consumeArgs(1)[0];
14277
14278 while (arg.length === 1 && arg[0].text === "#") {
14279 arg = context.consumeArgs(1)[0];
14280
14281 if (arg.length !== 1) {
14282 throw new src_ParseError("Invalid argument number length \"" + arg.length + "\"");
14283 }
14284
14285 if (!/^[1-9]$/.test(arg[0].text)) {
14286 throw new src_ParseError("Invalid argument number \"" + arg[0].text + "\"");
14287 }
14288
14289 numArgs++;
14290
14291 if (parseInt(arg[0].text) !== numArgs) {
14292 throw new src_ParseError("Argument number \"" + arg[0].text + "\" out of order");
14293 }
14294
14295 arg = context.consumeArgs(1)[0];
14296 } // Final arg is the expansion of the macro
14297
14298
14299 context.macros.set(name, {
14300 tokens: arg,
14301 numArgs: numArgs
14302 }, global);
14303 return '';
14304 };
14305
14306 defineMacro("\\gdef", function (context) {
14307 return macros_def(context, true);
14308 });
14309 defineMacro("\\def", function (context) {
14310 return macros_def(context, false);
14311 });
14312 defineMacro("\\global", function (context) {
14313 var next = context.consumeArgs(1)[0];
14314
14315 if (next.length !== 1) {
14316 throw new src_ParseError("Invalid command after \\global");
14317 }
14318
14319 var command = next[0].text; // TODO: Should expand command
14320
14321 if (command === "\\def") {
14322 // \global\def is equivalent to \gdef
14323 return macros_def(context, true);
14324 } else {
14325 throw new src_ParseError("Invalid command '" + command + "' after \\global");
14326 }
14327 }); // \newcommand{\macro}[args]{definition}
14328 // \renewcommand{\macro}[args]{definition}
14329 // TODO: Optional arguments: \newcommand{\macro}[args][default]{definition}
14330
14331 var macros_newcommand = function newcommand(context, existsOK, nonexistsOK) {
14332 var arg = context.consumeArgs(1)[0];
14333
14334 if (arg.length !== 1) {
14335 throw new src_ParseError("\\newcommand's first argument must be a macro name");
14336 }
14337
14338 var name = arg[0].text;
14339 var exists = context.isDefined(name);
14340
14341 if (exists && !existsOK) {
14342 throw new src_ParseError("\\newcommand{" + name + "} attempting to redefine " + (name + "; use \\renewcommand"));
14343 }
14344
14345 if (!exists && !nonexistsOK) {
14346 throw new src_ParseError("\\renewcommand{" + name + "} when command " + name + " " + "does not yet exist; use \\newcommand");
14347 }
14348
14349 var numArgs = 0;
14350 arg = context.consumeArgs(1)[0];
14351
14352 if (arg.length === 1 && arg[0].text === "[") {
14353 var argText = '';
14354 var token = context.expandNextToken();
14355
14356 while (token.text !== "]" && token.text !== "EOF") {
14357 // TODO: Should properly expand arg, e.g., ignore {}s
14358 argText += token.text;
14359 token = context.expandNextToken();
14360 }
14361
14362 if (!argText.match(/^\s*[0-9]+\s*$/)) {
14363 throw new src_ParseError("Invalid number of arguments: " + argText);
14364 }
14365
14366 numArgs = parseInt(argText);
14367 arg = context.consumeArgs(1)[0];
14368 } // Final arg is the expansion of the macro
14369
14370
14371 context.macros.set(name, {
14372 tokens: arg,
14373 numArgs: numArgs
14374 });
14375 return '';
14376 };
14377
14378 defineMacro("\\newcommand", function (context) {
14379 return macros_newcommand(context, false, true);
14380 });
14381 defineMacro("\\renewcommand", function (context) {
14382 return macros_newcommand(context, true, false);
14383 });
14384 defineMacro("\\providecommand", function (context) {
14385 return macros_newcommand(context, true, true);
14386 }); //////////////////////////////////////////////////////////////////////
14387 // Grouping
14388 // \let\bgroup={ \let\egroup=}
14389
14390 defineMacro("\\bgroup", "{");
14391 defineMacro("\\egroup", "}"); // Symbols from latex.ltx:
14392 // \def\lq{`}
14393 // \def\rq{'}
14394 // \def \aa {\r a}
14395 // \def \AA {\r A}
14396
14397 defineMacro("\\lq", "`");
14398 defineMacro("\\rq", "'");
14399 defineMacro("\\aa", "\\r a");
14400 defineMacro("\\AA", "\\r A"); // Copyright (C) and registered (R) symbols. Use raw symbol in MathML.
14401 // \DeclareTextCommandDefault{\textcopyright}{\textcircled{c}}
14402 // \DeclareTextCommandDefault{\textregistered}{\textcircled{%
14403 // \check@mathfonts\fontsize\sf@size\z@\math@fontsfalse\selectfont R}}
14404 // \DeclareRobustCommand{\copyright}{%
14405 // \ifmmode{\nfss@text{\textcopyright}}\else\textcopyright\fi}
14406
14407 defineMacro("\\textcopyright", "\\html@mathml{\\textcircled{c}}{\\char`©}");
14408 defineMacro("\\copyright", "\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");
14409 defineMacro("\\textregistered", "\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"); // Characters omitted from Unicode range 1D400–1D7FF
14410
14411 defineMacro("\u212C", "\\mathscr{B}"); // script
14412
14413 defineMacro("\u2130", "\\mathscr{E}");
14414 defineMacro("\u2131", "\\mathscr{F}");
14415 defineMacro("\u210B", "\\mathscr{H}");
14416 defineMacro("\u2110", "\\mathscr{I}");
14417 defineMacro("\u2112", "\\mathscr{L}");
14418 defineMacro("\u2133", "\\mathscr{M}");
14419 defineMacro("\u211B", "\\mathscr{R}");
14420 defineMacro("\u212D", "\\mathfrak{C}"); // Fraktur
14421
14422 defineMacro("\u210C", "\\mathfrak{H}");
14423 defineMacro("\u2128", "\\mathfrak{Z}"); // Define \Bbbk with a macro that works in both HTML and MathML.
14424
14425 defineMacro("\\Bbbk", "\\Bbb{k}"); // Unicode middle dot
14426 // The KaTeX fonts do not contain U+00B7. Instead, \cdotp displays
14427 // the dot at U+22C5 and gives it punct spacing.
14428
14429 defineMacro("\xB7", "\\cdotp"); // \llap and \rlap render their contents in text mode
14430
14431 defineMacro("\\llap", "\\mathllap{\\textrm{#1}}");
14432 defineMacro("\\rlap", "\\mathrlap{\\textrm{#1}}");
14433 defineMacro("\\clap", "\\mathclap{\\textrm{#1}}"); // \not is defined by base/fontmath.ltx via
14434 // \DeclareMathSymbol{\not}{\mathrel}{symbols}{"36}
14435 // It's thus treated like a \mathrel, but defined by a symbol that has zero
14436 // width but extends to the right. We use \rlap to get that spacing.
14437 // For MathML we write U+0338 here. buildMathML.js will then do the overlay.
14438
14439 defineMacro("\\not", '\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'); // Negated symbols from base/fontmath.ltx:
14440 // \def\neq{\not=} \let\ne=\neq
14441 // \DeclareRobustCommand
14442 // \notin{\mathrel{\m@th\mathpalette\c@ncel\in}}
14443 // \def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
14444
14445 defineMacro("\\neq", "\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}");
14446 defineMacro("\\ne", "\\neq");
14447 defineMacro("\u2260", "\\neq");
14448 defineMacro("\\notin", "\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}" + "{\\mathrel{\\char`∉}}");
14449 defineMacro("\u2209", "\\notin"); // Unicode stacked relations
14450
14451 defineMacro("\u2258", "\\html@mathml{" + "\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}" + "}{\\mathrel{\\char`\u2258}}");
14452 defineMacro("\u2259", "\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");
14453 defineMacro("\u225A", "\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");
14454 defineMacro("\u225B", "\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}" + "{\\mathrel{\\char`\u225B}}");
14455 defineMacro("\u225D", "\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}" + "{\\mathrel{\\char`\u225D}}");
14456 defineMacro("\u225E", "\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}" + "{\\mathrel{\\char`\u225E}}");
14457 defineMacro("\u225F", "\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}"); // Misc Unicode
14458
14459 defineMacro("\u27C2", "\\perp");
14460 defineMacro("\u203C", "\\mathclose{!\\mkern-0.8mu!}");
14461 defineMacro("\u220C", "\\notni");
14462 defineMacro("\u231C", "\\ulcorner");
14463 defineMacro("\u231D", "\\urcorner");
14464 defineMacro("\u231E", "\\llcorner");
14465 defineMacro("\u231F", "\\lrcorner");
14466 defineMacro("\xA9", "\\copyright");
14467 defineMacro("\xAE", "\\textregistered");
14468 defineMacro("\uFE0F", "\\textregistered"); //////////////////////////////////////////////////////////////////////
14469 // LaTeX_2ε
14470 // \vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@
14471 // \kern6\p@\hbox{.}\hbox{.}\hbox{.}}}
14472 // We'll call \varvdots, which gets a glyph from symbols.js.
14473 // The zero-width rule gets us an equivalent to the vertical 6pt kern.
14474
14475 defineMacro("\\vdots", "\\mathord{\\varvdots\\rule{0pt}{15pt}}");
14476 defineMacro("\u22EE", "\\vdots"); //////////////////////////////////////////////////////////////////////
14477 // amsmath.sty
14478 // http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf
14479 // Italic Greek capital letters. AMS defines these with \DeclareMathSymbol,
14480 // but they are equivalent to \mathit{\Letter}.
14481
14482 defineMacro("\\varGamma", "\\mathit{\\Gamma}");
14483 defineMacro("\\varDelta", "\\mathit{\\Delta}");
14484 defineMacro("\\varTheta", "\\mathit{\\Theta}");
14485 defineMacro("\\varLambda", "\\mathit{\\Lambda}");
14486 defineMacro("\\varXi", "\\mathit{\\Xi}");
14487 defineMacro("\\varPi", "\\mathit{\\Pi}");
14488 defineMacro("\\varSigma", "\\mathit{\\Sigma}");
14489 defineMacro("\\varUpsilon", "\\mathit{\\Upsilon}");
14490 defineMacro("\\varPhi", "\\mathit{\\Phi}");
14491 defineMacro("\\varPsi", "\\mathit{\\Psi}");
14492 defineMacro("\\varOmega", "\\mathit{\\Omega}"); //\newcommand{\substack}[1]{\subarray{c}#1\endsubarray}
14493
14494 defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"); // \renewcommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript
14495 // \mkern-\thinmuskip{:}\mskip6muplus1mu\relax}
14496
14497 defineMacro("\\colon", "\\nobreak\\mskip2mu\\mathpunct{}" + "\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"); // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}}
14498
14499 defineMacro("\\boxed", "\\fbox{$\\displaystyle{#1}$}"); // \def\iff{\DOTSB\;\Longleftrightarrow\;}
14500 // \def\implies{\DOTSB\;\Longrightarrow\;}
14501 // \def\impliedby{\DOTSB\;\Longleftarrow\;}
14502
14503 defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;");
14504 defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;");
14505 defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); // AMSMath's automatic \dots, based on \mdots@@ macro.
14506
14507 var dotsByToken = {
14508 ',': '\\dotsc',
14509 '\\not': '\\dotsb',
14510 // \keybin@ checks for the following:
14511 '+': '\\dotsb',
14512 '=': '\\dotsb',
14513 '<': '\\dotsb',
14514 '>': '\\dotsb',
14515 '-': '\\dotsb',
14516 '*': '\\dotsb',
14517 ':': '\\dotsb',
14518 // Symbols whose definition starts with \DOTSB:
14519 '\\DOTSB': '\\dotsb',
14520 '\\coprod': '\\dotsb',
14521 '\\bigvee': '\\dotsb',
14522 '\\bigwedge': '\\dotsb',
14523 '\\biguplus': '\\dotsb',
14524 '\\bigcap': '\\dotsb',
14525 '\\bigcup': '\\dotsb',
14526 '\\prod': '\\dotsb',
14527 '\\sum': '\\dotsb',
14528 '\\bigotimes': '\\dotsb',
14529 '\\bigoplus': '\\dotsb',
14530 '\\bigodot': '\\dotsb',
14531 '\\bigsqcup': '\\dotsb',
14532 '\\And': '\\dotsb',
14533 '\\longrightarrow': '\\dotsb',
14534 '\\Longrightarrow': '\\dotsb',
14535 '\\longleftarrow': '\\dotsb',
14536 '\\Longleftarrow': '\\dotsb',
14537 '\\longleftrightarrow': '\\dotsb',
14538 '\\Longleftrightarrow': '\\dotsb',
14539 '\\mapsto': '\\dotsb',
14540 '\\longmapsto': '\\dotsb',
14541 '\\hookrightarrow': '\\dotsb',
14542 '\\doteq': '\\dotsb',
14543 // Symbols whose definition starts with \mathbin:
14544 '\\mathbin': '\\dotsb',
14545 // Symbols whose definition starts with \mathrel:
14546 '\\mathrel': '\\dotsb',
14547 '\\relbar': '\\dotsb',
14548 '\\Relbar': '\\dotsb',
14549 '\\xrightarrow': '\\dotsb',
14550 '\\xleftarrow': '\\dotsb',
14551 // Symbols whose definition starts with \DOTSI:
14552 '\\DOTSI': '\\dotsi',
14553 '\\int': '\\dotsi',
14554 '\\oint': '\\dotsi',
14555 '\\iint': '\\dotsi',
14556 '\\iiint': '\\dotsi',
14557 '\\iiiint': '\\dotsi',
14558 '\\idotsint': '\\dotsi',
14559 // Symbols whose definition starts with \DOTSX:
14560 '\\DOTSX': '\\dotsx'
14561 };
14562 defineMacro("\\dots", function (context) {
14563 // TODO: If used in text mode, should expand to \textellipsis.
14564 // However, in KaTeX, \textellipsis and \ldots behave the same
14565 // (in text mode), and it's unlikely we'd see any of the math commands
14566 // that affect the behavior of \dots when in text mode. So fine for now
14567 // (until we support \ifmmode ... \else ... \fi).
14568 var thedots = '\\dotso';
14569 var next = context.expandAfterFuture().text;
14570
14571 if (next in dotsByToken) {
14572 thedots = dotsByToken[next];
14573 } else if (next.substr(0, 4) === '\\not') {
14574 thedots = '\\dotsb';
14575 } else if (next in src_symbols.math) {
14576 if (utils.contains(['bin', 'rel'], src_symbols.math[next].group)) {
14577 thedots = '\\dotsb';
14578 }
14579 }
14580
14581 return thedots;
14582 });
14583 var spaceAfterDots = {
14584 // \rightdelim@ checks for the following:
14585 ')': true,
14586 ']': true,
14587 '\\rbrack': true,
14588 '\\}': true,
14589 '\\rbrace': true,
14590 '\\rangle': true,
14591 '\\rceil': true,
14592 '\\rfloor': true,
14593 '\\rgroup': true,
14594 '\\rmoustache': true,
14595 '\\right': true,
14596 '\\bigr': true,
14597 '\\biggr': true,
14598 '\\Bigr': true,
14599 '\\Biggr': true,
14600 // \extra@ also tests for the following:
14601 '$': true,
14602 // \extrap@ checks for the following:
14603 ';': true,
14604 '.': true,
14605 ',': true
14606 };
14607 defineMacro("\\dotso", function (context) {
14608 var next = context.future().text;
14609
14610 if (next in spaceAfterDots) {
14611 return "\\ldots\\,";
14612 } else {
14613 return "\\ldots";
14614 }
14615 });
14616 defineMacro("\\dotsc", function (context) {
14617 var next = context.future().text; // \dotsc uses \extra@ but not \extrap@, instead specially checking for
14618 // ';' and '.', but doesn't check for ','.
14619
14620 if (next in spaceAfterDots && next !== ',') {
14621 return "\\ldots\\,";
14622 } else {
14623 return "\\ldots";
14624 }
14625 });
14626 defineMacro("\\cdots", function (context) {
14627 var next = context.future().text;
14628
14629 if (next in spaceAfterDots) {
14630 return "\\@cdots\\,";
14631 } else {
14632 return "\\@cdots";
14633 }
14634 });
14635 defineMacro("\\dotsb", "\\cdots");
14636 defineMacro("\\dotsm", "\\cdots");
14637 defineMacro("\\dotsi", "\\!\\cdots"); // amsmath doesn't actually define \dotsx, but \dots followed by a macro
14638 // starting with \DOTSX implies \dotso, and then \extra@ detects this case
14639 // and forces the added `\,`.
14640
14641 defineMacro("\\dotsx", "\\ldots\\,"); // \let\DOTSI\relax
14642 // \let\DOTSB\relax
14643 // \let\DOTSX\relax
14644
14645 defineMacro("\\DOTSI", "\\relax");
14646 defineMacro("\\DOTSB", "\\relax");
14647 defineMacro("\\DOTSX", "\\relax"); // Spacing, based on amsmath.sty's override of LaTeX defaults
14648 // \DeclareRobustCommand{\tmspace}[3]{%
14649 // \ifmmode\mskip#1#2\else\kern#1#3\fi\relax}
14650
14651 defineMacro("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"); // \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}}
14652 // TODO: math mode should use \thinmuskip
14653
14654 defineMacro("\\,", "\\tmspace+{3mu}{.1667em}"); // \let\thinspace\,
14655
14656 defineMacro("\\thinspace", "\\,"); // \def\>{\mskip\medmuskip}
14657 // \renewcommand{\:}{\tmspace+\medmuskip{.2222em}}
14658 // TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu
14659
14660 defineMacro("\\>", "\\mskip{4mu}");
14661 defineMacro("\\:", "\\tmspace+{4mu}{.2222em}"); // \let\medspace\:
14662
14663 defineMacro("\\medspace", "\\:"); // \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}}
14664 // TODO: math mode should use \thickmuskip = 5mu plus 5mu
14665
14666 defineMacro("\\;", "\\tmspace+{5mu}{.2777em}"); // \let\thickspace\;
14667
14668 defineMacro("\\thickspace", "\\;"); // \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}}
14669 // TODO: math mode should use \thinmuskip
14670
14671 defineMacro("\\!", "\\tmspace-{3mu}{.1667em}"); // \let\negthinspace\!
14672
14673 defineMacro("\\negthinspace", "\\!"); // \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}}
14674 // TODO: math mode should use \medmuskip
14675
14676 defineMacro("\\negmedspace", "\\tmspace-{4mu}{.2222em}"); // \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}}
14677 // TODO: math mode should use \thickmuskip
14678
14679 defineMacro("\\negthickspace", "\\tmspace-{5mu}{.277em}"); // \def\enspace{\kern.5em }
14680
14681 defineMacro("\\enspace", "\\kern.5em "); // \def\enskip{\hskip.5em\relax}
14682
14683 defineMacro("\\enskip", "\\hskip.5em\\relax"); // \def\quad{\hskip1em\relax}
14684
14685 defineMacro("\\quad", "\\hskip1em\\relax"); // \def\qquad{\hskip2em\relax}
14686
14687 defineMacro("\\qquad", "\\hskip2em\\relax"); // \tag@in@display form of \tag
14688
14689 defineMacro("\\tag", "\\@ifstar\\tag@literal\\tag@paren");
14690 defineMacro("\\tag@paren", "\\tag@literal{({#1})}");
14691 defineMacro("\\tag@literal", function (context) {
14692 if (context.macros.get("\\df@tag")) {
14693 throw new src_ParseError("Multiple \\tag");
14694 }
14695
14696 return "\\gdef\\df@tag{\\text{#1}}";
14697 }); // \renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin
14698 // {\operator@font mod}\penalty900
14699 // \mkern5mu\nonscript\mskip-\medmuskip}
14700 // \newcommand{\pod}[1]{\allowbreak
14701 // \if@display\mkern18mu\else\mkern8mu\fi(#1)}
14702 // \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}}
14703 // \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu
14704 // \else\mkern12mu\fi{\operator@font mod}\,\,#1}
14705 // TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu
14706
14707 defineMacro("\\bmod", "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}" + "\\mathbin{\\rm mod}" + "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");
14708 defineMacro("\\pod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");
14709 defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}");
14710 defineMacro("\\mod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + "{\\rm mod}\\,\\,#1"); // \pmb -- A simulation of bold.
14711 // The version in ambsy.sty works by typesetting three copies of the argument
14712 // with small offsets. We use two copies. We omit the vertical offset because
14713 // of rendering problems that makeVList encounters in Safari.
14714
14715 defineMacro("\\pmb", "\\html@mathml{" + "\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}" + "{\\mathbf{#1}}"); //////////////////////////////////////////////////////////////////////
14716 // LaTeX source2e
14717 // \\ defaults to \newline, but changes to \cr within array environment
14718
14719 defineMacro("\\\\", "\\newline"); // \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@}
14720 // TODO: Doesn't normally work in math mode because \@ fails. KaTeX doesn't
14721 // support \@ yet, so that's omitted, and we add \text so that the result
14722 // doesn't look funny in math mode.
14723
14724 defineMacro("\\TeX", "\\textrm{\\html@mathml{" + "T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX" + "}{TeX}}"); // \DeclareRobustCommand{\LaTeX}{L\kern-.36em%
14725 // {\sbox\z@ T%
14726 // \vbox to\ht\z@{\hbox{\check@mathfonts
14727 // \fontsize\sf@size\z@
14728 // \math@fontsfalse\selectfont
14729 // A}%
14730 // \vss}%
14731 // }%
14732 // \kern-.15em%
14733 // \TeX}
14734 // This code aligns the top of the A with the T (from the perspective of TeX's
14735 // boxes, though visually the A appears to extend above slightly).
14736 // We compute the corresponding \raisebox when A is rendered in \normalsize
14737 // \scriptstyle, which has a scale factor of 0.7 (see Options.js).
14738
14739 var latexRaiseA = fontMetricsData['Main-Regular']["T".charCodeAt(0)][1] - 0.7 * fontMetricsData['Main-Regular']["A".charCodeAt(0)][1] + "em";
14740 defineMacro("\\LaTeX", "\\textrm{\\html@mathml{" + ("L\\kern-.36em\\raisebox{" + latexRaiseA + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{LaTeX}}"); // New KaTeX logo based on tweaking LaTeX logo
14741
14742 defineMacro("\\KaTeX", "\\textrm{\\html@mathml{" + ("K\\kern-.17em\\raisebox{" + latexRaiseA + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{KaTeX}}"); // \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace}
14743 // \def\@hspace#1{\hskip #1\relax}
14744 // \def\@hspacer#1{\vrule \@width\z@\nobreak
14745 // \hskip #1\hskip \z@skip}
14746
14747 defineMacro("\\hspace", "\\@ifstar\\@hspacer\\@hspace");
14748 defineMacro("\\@hspace", "\\hskip #1\\relax");
14749 defineMacro("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"); //////////////////////////////////////////////////////////////////////
14750 // mathtools.sty
14751 //\providecommand\ordinarycolon{:}
14752
14753 defineMacro("\\ordinarycolon", ":"); //\def\vcentcolon{\mathrel{\mathop\ordinarycolon}}
14754 //TODO(edemaine): Not yet centered. Fix via \raisebox or #726
14755
14756 defineMacro("\\vcentcolon", "\\mathrel{\\mathop\\ordinarycolon}"); // \providecommand*\dblcolon{\vcentcolon\mathrel{\mkern-.9mu}\vcentcolon}
14757
14758 defineMacro("\\dblcolon", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}" + "{\\mathop{\\char\"2237}}"); // \providecommand*\coloneqq{\vcentcolon\mathrel{\mkern-1.2mu}=}
14759
14760 defineMacro("\\coloneqq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2254}}"); // ≔
14761 // \providecommand*\Coloneqq{\dblcolon\mathrel{\mkern-1.2mu}=}
14762
14763 defineMacro("\\Coloneqq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2237\\char\"3d}}"); // \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}}
14764
14765 defineMacro("\\coloneq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"3a\\char\"2212}}"); // \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}}
14766
14767 defineMacro("\\Coloneq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"2237\\char\"2212}}"); // \providecommand*\eqqcolon{=\mathrel{\mkern-1.2mu}\vcentcolon}
14768
14769 defineMacro("\\eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2255}}"); // ≕
14770 // \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon}
14771
14772 defineMacro("\\Eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"3d\\char\"2237}}"); // \providecommand*\eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\vcentcolon}
14773
14774 defineMacro("\\eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2239}}"); // \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon}
14775
14776 defineMacro("\\Eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"2212\\char\"2237}}"); // \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx}
14777
14778 defineMacro("\\colonapprox", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"3a\\char\"2248}}"); // \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx}
14779
14780 defineMacro("\\Colonapprox", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"2237\\char\"2248}}"); // \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim}
14781
14782 defineMacro("\\colonsim", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"3a\\char\"223c}}"); // \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim}
14783
14784 defineMacro("\\Colonsim", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"2237\\char\"223c}}"); // Some Unicode characters are implemented with macros to mathtools functions.
14785
14786 defineMacro("\u2237", "\\dblcolon"); // ::
14787
14788 defineMacro("\u2239", "\\eqcolon"); // -:
14789
14790 defineMacro("\u2254", "\\coloneqq"); // :=
14791
14792 defineMacro("\u2255", "\\eqqcolon"); // =:
14793
14794 defineMacro("\u2A74", "\\Coloneqq"); // ::=
14795 //////////////////////////////////////////////////////////////////////
14796 // colonequals.sty
14797 // Alternate names for mathtools's macros:
14798
14799 defineMacro("\\ratio", "\\vcentcolon");
14800 defineMacro("\\coloncolon", "\\dblcolon");
14801 defineMacro("\\colonequals", "\\coloneqq");
14802 defineMacro("\\coloncolonequals", "\\Coloneqq");
14803 defineMacro("\\equalscolon", "\\eqqcolon");
14804 defineMacro("\\equalscoloncolon", "\\Eqqcolon");
14805 defineMacro("\\colonminus", "\\coloneq");
14806 defineMacro("\\coloncolonminus", "\\Coloneq");
14807 defineMacro("\\minuscolon", "\\eqcolon");
14808 defineMacro("\\minuscoloncolon", "\\Eqcolon"); // \colonapprox name is same in mathtools and colonequals.
14809
14810 defineMacro("\\coloncolonapprox", "\\Colonapprox"); // \colonsim name is same in mathtools and colonequals.
14811
14812 defineMacro("\\coloncolonsim", "\\Colonsim"); // Additional macros, implemented by analogy with mathtools definitions:
14813
14814 defineMacro("\\simcolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");
14815 defineMacro("\\simcoloncolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");
14816 defineMacro("\\approxcolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");
14817 defineMacro("\\approxcoloncolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"); // Present in newtxmath, pxfonts and txfonts
14818
14819 defineMacro("\\notni", "\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");
14820 defineMacro("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}");
14821 defineMacro("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"); //////////////////////////////////////////////////////////////////////
14822 // MathML alternates for KaTeX glyphs in the Unicode private area
14823
14824 defineMacro("\\gvertneqq", "\\html@mathml{\\@gvertneqq}{\u2269}");
14825 defineMacro("\\lvertneqq", "\\html@mathml{\\@lvertneqq}{\u2268}");
14826 defineMacro("\\ngeqq", "\\html@mathml{\\@ngeqq}{\u2271}");
14827 defineMacro("\\ngeqslant", "\\html@mathml{\\@ngeqslant}{\u2271}");
14828 defineMacro("\\nleqq", "\\html@mathml{\\@nleqq}{\u2270}");
14829 defineMacro("\\nleqslant", "\\html@mathml{\\@nleqslant}{\u2270}");
14830 defineMacro("\\nshortmid", "\\html@mathml{\\@nshortmid}{∤}");
14831 defineMacro("\\nshortparallel", "\\html@mathml{\\@nshortparallel}{∦}");
14832 defineMacro("\\nsubseteqq", "\\html@mathml{\\@nsubseteqq}{\u2288}");
14833 defineMacro("\\nsupseteqq", "\\html@mathml{\\@nsupseteqq}{\u2289}");
14834 defineMacro("\\varsubsetneq", "\\html@mathml{\\@varsubsetneq}{⊊}");
14835 defineMacro("\\varsubsetneqq", "\\html@mathml{\\@varsubsetneqq}{⫋}");
14836 defineMacro("\\varsupsetneq", "\\html@mathml{\\@varsupsetneq}{⊋}");
14837 defineMacro("\\varsupsetneqq", "\\html@mathml{\\@varsupsetneqq}{⫌}"); //////////////////////////////////////////////////////////////////////
14838 // stmaryrd and semantic
14839 // The stmaryrd and semantic packages render the next four items by calling a
14840 // glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros.
14841
14842 defineMacro("\\llbracket", "\\html@mathml{" + "\\mathopen{[\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u27E6}}");
14843 defineMacro("\\rrbracket", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu]}}" + "{\\mathclose{\\char`\u27E7}}");
14844 defineMacro("\u27E6", "\\llbracket"); // blackboard bold [
14845
14846 defineMacro("\u27E7", "\\rrbracket"); // blackboard bold ]
14847
14848 defineMacro("\\lBrace", "\\html@mathml{" + "\\mathopen{\\{\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u2983}}");
14849 defineMacro("\\rBrace", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu\\}}}" + "{\\mathclose{\\char`\u2984}}");
14850 defineMacro("\u2983", "\\lBrace"); // blackboard bold {
14851
14852 defineMacro("\u2984", "\\rBrace"); // blackboard bold }
14853 // TODO: Create variable sized versions of the last two items. I believe that
14854 // will require new font glyphs.
14855 //////////////////////////////////////////////////////////////////////
14856 // texvc.sty
14857 // The texvc package contains macros available in mediawiki pages.
14858 // We omit the functions deprecated at
14859 // https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax
14860 // We also omit texvc's \O, which conflicts with \text{\O}
14861
14862 defineMacro("\\darr", "\\downarrow");
14863 defineMacro("\\dArr", "\\Downarrow");
14864 defineMacro("\\Darr", "\\Downarrow");
14865 defineMacro("\\lang", "\\langle");
14866 defineMacro("\\rang", "\\rangle");
14867 defineMacro("\\uarr", "\\uparrow");
14868 defineMacro("\\uArr", "\\Uparrow");
14869 defineMacro("\\Uarr", "\\Uparrow");
14870 defineMacro("\\N", "\\mathbb{N}");
14871 defineMacro("\\R", "\\mathbb{R}");
14872 defineMacro("\\Z", "\\mathbb{Z}");
14873 defineMacro("\\alef", "\\aleph");
14874 defineMacro("\\alefsym", "\\aleph");
14875 defineMacro("\\Alpha", "\\mathrm{A}");
14876 defineMacro("\\Beta", "\\mathrm{B}");
14877 defineMacro("\\bull", "\\bullet");
14878 defineMacro("\\Chi", "\\mathrm{X}");
14879 defineMacro("\\clubs", "\\clubsuit");
14880 defineMacro("\\cnums", "\\mathbb{C}");
14881 defineMacro("\\Complex", "\\mathbb{C}");
14882 defineMacro("\\Dagger", "\\ddagger");
14883 defineMacro("\\diamonds", "\\diamondsuit");
14884 defineMacro("\\empty", "\\emptyset");
14885 defineMacro("\\Epsilon", "\\mathrm{E}");
14886 defineMacro("\\Eta", "\\mathrm{H}");
14887 defineMacro("\\exist", "\\exists");
14888 defineMacro("\\harr", "\\leftrightarrow");
14889 defineMacro("\\hArr", "\\Leftrightarrow");
14890 defineMacro("\\Harr", "\\Leftrightarrow");
14891 defineMacro("\\hearts", "\\heartsuit");
14892 defineMacro("\\image", "\\Im");
14893 defineMacro("\\infin", "\\infty");
14894 defineMacro("\\Iota", "\\mathrm{I}");
14895 defineMacro("\\isin", "\\in");
14896 defineMacro("\\Kappa", "\\mathrm{K}");
14897 defineMacro("\\larr", "\\leftarrow");
14898 defineMacro("\\lArr", "\\Leftarrow");
14899 defineMacro("\\Larr", "\\Leftarrow");
14900 defineMacro("\\lrarr", "\\leftrightarrow");
14901 defineMacro("\\lrArr", "\\Leftrightarrow");
14902 defineMacro("\\Lrarr", "\\Leftrightarrow");
14903 defineMacro("\\Mu", "\\mathrm{M}");
14904 defineMacro("\\natnums", "\\mathbb{N}");
14905 defineMacro("\\Nu", "\\mathrm{N}");
14906 defineMacro("\\Omicron", "\\mathrm{O}");
14907 defineMacro("\\plusmn", "\\pm");
14908 defineMacro("\\rarr", "\\rightarrow");
14909 defineMacro("\\rArr", "\\Rightarrow");
14910 defineMacro("\\Rarr", "\\Rightarrow");
14911 defineMacro("\\real", "\\Re");
14912 defineMacro("\\reals", "\\mathbb{R}");
14913 defineMacro("\\Reals", "\\mathbb{R}");
14914 defineMacro("\\Rho", "\\mathrm{P}");
14915 defineMacro("\\sdot", "\\cdot");
14916 defineMacro("\\sect", "\\S");
14917 defineMacro("\\spades", "\\spadesuit");
14918 defineMacro("\\sub", "\\subset");
14919 defineMacro("\\sube", "\\subseteq");
14920 defineMacro("\\supe", "\\supseteq");
14921 defineMacro("\\Tau", "\\mathrm{T}");
14922 defineMacro("\\thetasym", "\\vartheta"); // TODO: defineMacro("\\varcoppa", "\\\mbox{\\coppa}");
14923
14924 defineMacro("\\weierp", "\\wp");
14925 defineMacro("\\Zeta", "\\mathrm{Z}"); //////////////////////////////////////////////////////////////////////
14926 // statmath.sty
14927 // https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf
14928
14929 defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}");
14930 defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}");
14931 defineMacro("\\plim", "\\DOTSB\\mathop{\\operatorname{plim}}\\limits"); // Custom Khan Academy colors, should be moved to an optional package
14932
14933 defineMacro("\\blue", "\\textcolor{##6495ed}{#1}");
14934 defineMacro("\\orange", "\\textcolor{##ffa500}{#1}");
14935 defineMacro("\\pink", "\\textcolor{##ff00af}{#1}");
14936 defineMacro("\\red", "\\textcolor{##df0030}{#1}");
14937 defineMacro("\\green", "\\textcolor{##28ae7b}{#1}");
14938 defineMacro("\\gray", "\\textcolor{gray}{#1}");
14939 defineMacro("\\purple", "\\textcolor{##9d38bd}{#1}");
14940 defineMacro("\\blueA", "\\textcolor{##ccfaff}{#1}");
14941 defineMacro("\\blueB", "\\textcolor{##80f6ff}{#1}");
14942 defineMacro("\\blueC", "\\textcolor{##63d9ea}{#1}");
14943 defineMacro("\\blueD", "\\textcolor{##11accd}{#1}");
14944 defineMacro("\\blueE", "\\textcolor{##0c7f99}{#1}");
14945 defineMacro("\\tealA", "\\textcolor{##94fff5}{#1}");
14946 defineMacro("\\tealB", "\\textcolor{##26edd5}{#1}");
14947 defineMacro("\\tealC", "\\textcolor{##01d1c1}{#1}");
14948 defineMacro("\\tealD", "\\textcolor{##01a995}{#1}");
14949 defineMacro("\\tealE", "\\textcolor{##208170}{#1}");
14950 defineMacro("\\greenA", "\\textcolor{##b6ffb0}{#1}");
14951 defineMacro("\\greenB", "\\textcolor{##8af281}{#1}");
14952 defineMacro("\\greenC", "\\textcolor{##74cf70}{#1}");
14953 defineMacro("\\greenD", "\\textcolor{##1fab54}{#1}");
14954 defineMacro("\\greenE", "\\textcolor{##0d923f}{#1}");
14955 defineMacro("\\goldA", "\\textcolor{##ffd0a9}{#1}");
14956 defineMacro("\\goldB", "\\textcolor{##ffbb71}{#1}");
14957 defineMacro("\\goldC", "\\textcolor{##ff9c39}{#1}");
14958 defineMacro("\\goldD", "\\textcolor{##e07d10}{#1}");
14959 defineMacro("\\goldE", "\\textcolor{##a75a05}{#1}");
14960 defineMacro("\\redA", "\\textcolor{##fca9a9}{#1}");
14961 defineMacro("\\redB", "\\textcolor{##ff8482}{#1}");
14962 defineMacro("\\redC", "\\textcolor{##f9685d}{#1}");
14963 defineMacro("\\redD", "\\textcolor{##e84d39}{#1}");
14964 defineMacro("\\redE", "\\textcolor{##bc2612}{#1}");
14965 defineMacro("\\maroonA", "\\textcolor{##ffbde0}{#1}");
14966 defineMacro("\\maroonB", "\\textcolor{##ff92c6}{#1}");
14967 defineMacro("\\maroonC", "\\textcolor{##ed5fa6}{#1}");
14968 defineMacro("\\maroonD", "\\textcolor{##ca337c}{#1}");
14969 defineMacro("\\maroonE", "\\textcolor{##9e034e}{#1}");
14970 defineMacro("\\purpleA", "\\textcolor{##ddd7ff}{#1}");
14971 defineMacro("\\purpleB", "\\textcolor{##c6b9fc}{#1}");
14972 defineMacro("\\purpleC", "\\textcolor{##aa87ff}{#1}");
14973 defineMacro("\\purpleD", "\\textcolor{##7854ab}{#1}");
14974 defineMacro("\\purpleE", "\\textcolor{##543b78}{#1}");
14975 defineMacro("\\mintA", "\\textcolor{##f5f9e8}{#1}");
14976 defineMacro("\\mintB", "\\textcolor{##edf2df}{#1}");
14977 defineMacro("\\mintC", "\\textcolor{##e0e5cc}{#1}");
14978 defineMacro("\\grayA", "\\textcolor{##f6f7f7}{#1}");
14979 defineMacro("\\grayB", "\\textcolor{##f0f1f2}{#1}");
14980 defineMacro("\\grayC", "\\textcolor{##e3e5e6}{#1}");
14981 defineMacro("\\grayD", "\\textcolor{##d6d8da}{#1}");
14982 defineMacro("\\grayE", "\\textcolor{##babec2}{#1}");
14983 defineMacro("\\grayF", "\\textcolor{##888d93}{#1}");
14984 defineMacro("\\grayG", "\\textcolor{##626569}{#1}");
14985 defineMacro("\\grayH", "\\textcolor{##3b3e40}{#1}");
14986 defineMacro("\\grayI", "\\textcolor{##21242c}{#1}");
14987 defineMacro("\\kaBlue", "\\textcolor{##314453}{#1}");
14988 defineMacro("\\kaGreen", "\\textcolor{##71B307}{#1}");
14989 // CONCATENATED MODULE: ./src/MacroExpander.js
14990 /**
14991 * This file contains the “gullet” where macros are expanded
14992 * until only non-macro tokens remain.
14993 */
14994
14995
14996
14997
14998
14999
15000
15001 // List of commands that act like macros but aren't defined as a macro,
15002 // function, or symbol. Used in `isDefined`.
15003 var implicitCommands = {
15004 "\\relax": true,
15005 // MacroExpander.js
15006 "^": true,
15007 // Parser.js
15008 "_": true,
15009 // Parser.js
15010 "\\limits": true,
15011 // Parser.js
15012 "\\nolimits": true // Parser.js
15013
15014 };
15015
15016 var MacroExpander_MacroExpander =
15017 /*#__PURE__*/
15018 function () {
15019 function MacroExpander(input, settings, mode) {
15020 this.settings = void 0;
15021 this.expansionCount = void 0;
15022 this.lexer = void 0;
15023 this.macros = void 0;
15024 this.stack = void 0;
15025 this.mode = void 0;
15026 this.settings = settings;
15027 this.expansionCount = 0;
15028 this.feed(input); // Make new global namespace
15029
15030 this.macros = new Namespace_Namespace(macros, settings.macros);
15031 this.mode = mode;
15032 this.stack = []; // contains tokens in REVERSE order
15033 }
15034 /**
15035 * Feed a new input string to the same MacroExpander
15036 * (with existing macros etc.).
15037 */
15038
15039
15040 var _proto = MacroExpander.prototype;
15041
15042 _proto.feed = function feed(input) {
15043 this.lexer = new Lexer_Lexer(input, this.settings);
15044 }
15045 /**
15046 * Switches between "text" and "math" modes.
15047 */
15048 ;
15049
15050 _proto.switchMode = function switchMode(newMode) {
15051 this.mode = newMode;
15052 }
15053 /**
15054 * Start a new group nesting within all namespaces.
15055 */
15056 ;
15057
15058 _proto.beginGroup = function beginGroup() {
15059 this.macros.beginGroup();
15060 }
15061 /**
15062 * End current group nesting within all namespaces.
15063 */
15064 ;
15065
15066 _proto.endGroup = function endGroup() {
15067 this.macros.endGroup();
15068 }
15069 /**
15070 * Returns the topmost token on the stack, without expanding it.
15071 * Similar in behavior to TeX's `\futurelet`.
15072 */
15073 ;
15074
15075 _proto.future = function future() {
15076 if (this.stack.length === 0) {
15077 this.pushToken(this.lexer.lex());
15078 }
15079
15080 return this.stack[this.stack.length - 1];
15081 }
15082 /**
15083 * Remove and return the next unexpanded token.
15084 */
15085 ;
15086
15087 _proto.popToken = function popToken() {
15088 this.future(); // ensure non-empty stack
15089
15090 return this.stack.pop();
15091 }
15092 /**
15093 * Add a given token to the token stack. In particular, this get be used
15094 * to put back a token returned from one of the other methods.
15095 */
15096 ;
15097
15098 _proto.pushToken = function pushToken(token) {
15099 this.stack.push(token);
15100 }
15101 /**
15102 * Append an array of tokens to the token stack.
15103 */
15104 ;
15105
15106 _proto.pushTokens = function pushTokens(tokens) {
15107 var _this$stack;
15108
15109 (_this$stack = this.stack).push.apply(_this$stack, tokens);
15110 }
15111 /**
15112 * Consume all following space tokens, without expansion.
15113 */
15114 ;
15115
15116 _proto.consumeSpaces = function consumeSpaces() {
15117 for (;;) {
15118 var token = this.future();
15119
15120 if (token.text === " ") {
15121 this.stack.pop();
15122 } else {
15123 break;
15124 }
15125 }
15126 }
15127 /**
15128 * Consume the specified number of arguments from the token stream,
15129 * and return the resulting array of arguments.
15130 */
15131 ;
15132
15133 _proto.consumeArgs = function consumeArgs(numArgs) {
15134 var args = []; // obtain arguments, either single token or balanced {…} group
15135
15136 for (var i = 0; i < numArgs; ++i) {
15137 this.consumeSpaces(); // ignore spaces before each argument
15138
15139 var startOfArg = this.popToken();
15140
15141 if (startOfArg.text === "{") {
15142 var arg = [];
15143 var depth = 1;
15144
15145 while (depth !== 0) {
15146 var tok = this.popToken();
15147 arg.push(tok);
15148
15149 if (tok.text === "{") {
15150 ++depth;
15151 } else if (tok.text === "}") {
15152 --depth;
15153 } else if (tok.text === "EOF") {
15154 throw new src_ParseError("End of input in macro argument", startOfArg);
15155 }
15156 }
15157
15158 arg.pop(); // remove last }
15159
15160 arg.reverse(); // like above, to fit in with stack order
15161
15162 args[i] = arg;
15163 } else if (startOfArg.text === "EOF") {
15164 throw new src_ParseError("End of input expecting macro argument");
15165 } else {
15166 args[i] = [startOfArg];
15167 }
15168 }
15169
15170 return args;
15171 }
15172 /**
15173 * Expand the next token only once if possible.
15174 *
15175 * If the token is expanded, the resulting tokens will be pushed onto
15176 * the stack in reverse order and will be returned as an array,
15177 * also in reverse order.
15178 *
15179 * If not, the next token will be returned without removing it
15180 * from the stack. This case can be detected by a `Token` return value
15181 * instead of an `Array` return value.
15182 *
15183 * In either case, the next token will be on the top of the stack,
15184 * or the stack will be empty.
15185 *
15186 * Used to implement `expandAfterFuture` and `expandNextToken`.
15187 *
15188 * At the moment, macro expansion doesn't handle delimited macros,
15189 * i.e. things like those defined by \def\foo#1\end{…}.
15190 * See the TeX book page 202ff. for details on how those should behave.
15191 */
15192 ;
15193
15194 _proto.expandOnce = function expandOnce() {
15195 var topToken = this.popToken();
15196 var name = topToken.text;
15197
15198 var expansion = this._getExpansion(name);
15199
15200 if (expansion == null) {
15201 // mainly checking for undefined here
15202 // Fully expanded
15203 this.pushToken(topToken);
15204 return topToken;
15205 }
15206
15207 this.expansionCount++;
15208
15209 if (this.expansionCount > this.settings.maxExpand) {
15210 throw new src_ParseError("Too many expansions: infinite loop or " + "need to increase maxExpand setting");
15211 }
15212
15213 var tokens = expansion.tokens;
15214
15215 if (expansion.numArgs) {
15216 var args = this.consumeArgs(expansion.numArgs); // paste arguments in place of the placeholders
15217
15218 tokens = tokens.slice(); // make a shallow copy
15219
15220 for (var i = tokens.length - 1; i >= 0; --i) {
15221 var tok = tokens[i];
15222
15223 if (tok.text === "#") {
15224 if (i === 0) {
15225 throw new src_ParseError("Incomplete placeholder at end of macro body", tok);
15226 }
15227
15228 tok = tokens[--i]; // next token on stack
15229
15230 if (tok.text === "#") {
15231 // ## → #
15232 tokens.splice(i + 1, 1); // drop first #
15233 } else if (/^[1-9]$/.test(tok.text)) {
15234 var _tokens;
15235
15236 // replace the placeholder with the indicated argument
15237 (_tokens = tokens).splice.apply(_tokens, [i, 2].concat(args[+tok.text - 1]));
15238 } else {
15239 throw new src_ParseError("Not a valid argument number", tok);
15240 }
15241 }
15242 }
15243 } // Concatenate expansion onto top of stack.
15244
15245
15246 this.pushTokens(tokens);
15247 return tokens;
15248 }
15249 /**
15250 * Expand the next token only once (if possible), and return the resulting
15251 * top token on the stack (without removing anything from the stack).
15252 * Similar in behavior to TeX's `\expandafter\futurelet`.
15253 * Equivalent to expandOnce() followed by future().
15254 */
15255 ;
15256
15257 _proto.expandAfterFuture = function expandAfterFuture() {
15258 this.expandOnce();
15259 return this.future();
15260 }
15261 /**
15262 * Recursively expand first token, then return first non-expandable token.
15263 */
15264 ;
15265
15266 _proto.expandNextToken = function expandNextToken() {
15267 for (;;) {
15268 var expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded.
15269
15270 if (expanded instanceof Token_Token) {
15271 // \relax stops the expansion, but shouldn't get returned (a
15272 // null return value couldn't get implemented as a function).
15273 if (expanded.text === "\\relax") {
15274 this.stack.pop();
15275 } else {
15276 return this.stack.pop(); // === expanded
15277 }
15278 }
15279 } // Flow unable to figure out that this pathway is impossible.
15280 // https://github.com/facebook/flow/issues/4808
15281
15282
15283 throw new Error(); // eslint-disable-line no-unreachable
15284 }
15285 /**
15286 * Fully expand the given macro name and return the resulting list of
15287 * tokens, or return `undefined` if no such macro is defined.
15288 */
15289 ;
15290
15291 _proto.expandMacro = function expandMacro(name) {
15292 if (!this.macros.get(name)) {
15293 return undefined;
15294 }
15295
15296 var output = [];
15297 var oldStackLength = this.stack.length;
15298 this.pushToken(new Token_Token(name));
15299
15300 while (this.stack.length > oldStackLength) {
15301 var expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded.
15302
15303 if (expanded instanceof Token_Token) {
15304 output.push(this.stack.pop());
15305 }
15306 }
15307
15308 return output;
15309 }
15310 /**
15311 * Fully expand the given macro name and return the result as a string,
15312 * or return `undefined` if no such macro is defined.
15313 */
15314 ;
15315
15316 _proto.expandMacroAsText = function expandMacroAsText(name) {
15317 var tokens = this.expandMacro(name);
15318
15319 if (tokens) {
15320 return tokens.map(function (token) {
15321 return token.text;
15322 }).join("");
15323 } else {
15324 return tokens;
15325 }
15326 }
15327 /**
15328 * Returns the expanded macro as a reversed array of tokens and a macro
15329 * argument count. Or returns `null` if no such macro.
15330 */
15331 ;
15332
15333 _proto._getExpansion = function _getExpansion(name) {
15334 var definition = this.macros.get(name);
15335
15336 if (definition == null) {
15337 // mainly checking for undefined here
15338 return definition;
15339 }
15340
15341 var expansion = typeof definition === "function" ? definition(this) : definition;
15342
15343 if (typeof expansion === "string") {
15344 var numArgs = 0;
15345
15346 if (expansion.indexOf("#") !== -1) {
15347 var stripped = expansion.replace(/##/g, "");
15348
15349 while (stripped.indexOf("#" + (numArgs + 1)) !== -1) {
15350 ++numArgs;
15351 }
15352 }
15353
15354 var bodyLexer = new Lexer_Lexer(expansion, this.settings);
15355 var tokens = [];
15356 var tok = bodyLexer.lex();
15357
15358 while (tok.text !== "EOF") {
15359 tokens.push(tok);
15360 tok = bodyLexer.lex();
15361 }
15362
15363 tokens.reverse(); // to fit in with stack using push and pop
15364
15365 var expanded = {
15366 tokens: tokens,
15367 numArgs: numArgs
15368 };
15369 return expanded;
15370 }
15371
15372 return expansion;
15373 }
15374 /**
15375 * Determine whether a command is currently "defined" (has some
15376 * functionality), meaning that it's a macro (in the current group),
15377 * a function, a symbol, or one of the special commands listed in
15378 * `implicitCommands`.
15379 */
15380 ;
15381
15382 _proto.isDefined = function isDefined(name) {
15383 return this.macros.has(name) || src_functions.hasOwnProperty(name) || src_symbols.math.hasOwnProperty(name) || src_symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name);
15384 };
15385
15386 return MacroExpander;
15387 }();
15388
15389
15390 // CONCATENATED MODULE: ./src/unicodeAccents.js
15391 // Mapping of Unicode accent characters to their LaTeX equivalent in text and
15392 // math mode (when they exist).
15393 /* harmony default export */ var unicodeAccents = ({
15394 "\u0301": {
15395 text: "\\'",
15396 math: '\\acute'
15397 },
15398 "\u0300": {
15399 text: '\\`',
15400 math: '\\grave'
15401 },
15402 "\u0308": {
15403 text: '\\"',
15404 math: '\\ddot'
15405 },
15406 "\u0303": {
15407 text: '\\~',
15408 math: '\\tilde'
15409 },
15410 "\u0304": {
15411 text: '\\=',
15412 math: '\\bar'
15413 },
15414 "\u0306": {
15415 text: "\\u",
15416 math: '\\breve'
15417 },
15418 "\u030C": {
15419 text: '\\v',
15420 math: '\\check'
15421 },
15422 "\u0302": {
15423 text: '\\^',
15424 math: '\\hat'
15425 },
15426 "\u0307": {
15427 text: '\\.',
15428 math: '\\dot'
15429 },
15430 "\u030A": {
15431 text: '\\r',
15432 math: '\\mathring'
15433 },
15434 "\u030B": {
15435 text: '\\H'
15436 }
15437 });
15438 // CONCATENATED MODULE: ./src/unicodeSymbols.js
15439 // This file is GENERATED by unicodeMake.js. DO NOT MODIFY.
15440 /* harmony default export */ var unicodeSymbols = ({
15441 "\xE1": "a\u0301",
15442 // á = \'{a}
15443 "\xE0": "a\u0300",
15444 // à = \`{a}
15445 "\xE4": "a\u0308",
15446 // ä = \"{a}
15447 "\u01DF": "a\u0308\u0304",
15448 // ǟ = \"\={a}
15449 "\xE3": "a\u0303",
15450 // ã = \~{a}
15451 "\u0101": "a\u0304",
15452 // ā = \={a}
15453 "\u0103": "a\u0306",
15454 // ă = \u{a}
15455 "\u1EAF": "a\u0306\u0301",
15456 // ắ = \u\'{a}
15457 "\u1EB1": "a\u0306\u0300",
15458 // ằ = \u\`{a}
15459 "\u1EB5": "a\u0306\u0303",
15460 // ẵ = \u\~{a}
15461 "\u01CE": "a\u030C",
15462 // ǎ = \v{a}
15463 "\xE2": "a\u0302",
15464 // â = \^{a}
15465 "\u1EA5": "a\u0302\u0301",
15466 // ấ = \^\'{a}
15467 "\u1EA7": "a\u0302\u0300",
15468 // ầ = \^\`{a}
15469 "\u1EAB": "a\u0302\u0303",
15470 // ẫ = \^\~{a}
15471 "\u0227": "a\u0307",
15472 // ȧ = \.{a}
15473 "\u01E1": "a\u0307\u0304",
15474 // ǡ = \.\={a}
15475 "\xE5": "a\u030A",
15476 // å = \r{a}
15477 "\u01FB": "a\u030A\u0301",
15478 // ǻ = \r\'{a}
15479 "\u1E03": "b\u0307",
15480 // ḃ = \.{b}
15481 "\u0107": "c\u0301",
15482 // ć = \'{c}
15483 "\u010D": "c\u030C",
15484 // č = \v{c}
15485 "\u0109": "c\u0302",
15486 // ĉ = \^{c}
15487 "\u010B": "c\u0307",
15488 // ċ = \.{c}
15489 "\u010F": "d\u030C",
15490 // ď = \v{d}
15491 "\u1E0B": "d\u0307",
15492 // ḋ = \.{d}
15493 "\xE9": "e\u0301",
15494 // é = \'{e}
15495 "\xE8": "e\u0300",
15496 // è = \`{e}
15497 "\xEB": "e\u0308",
15498 // ë = \"{e}
15499 "\u1EBD": "e\u0303",
15500 // ẽ = \~{e}
15501 "\u0113": "e\u0304",
15502 // ē = \={e}
15503 "\u1E17": "e\u0304\u0301",
15504 // ḗ = \=\'{e}
15505 "\u1E15": "e\u0304\u0300",
15506 // ḕ = \=\`{e}
15507 "\u0115": "e\u0306",
15508 // ĕ = \u{e}
15509 "\u011B": "e\u030C",
15510 // ě = \v{e}
15511 "\xEA": "e\u0302",
15512 // ê = \^{e}
15513 "\u1EBF": "e\u0302\u0301",
15514 // ế = \^\'{e}
15515 "\u1EC1": "e\u0302\u0300",
15516 // ề = \^\`{e}
15517 "\u1EC5": "e\u0302\u0303",
15518 // ễ = \^\~{e}
15519 "\u0117": "e\u0307",
15520 // ė = \.{e}
15521 "\u1E1F": "f\u0307",
15522 // ḟ = \.{f}
15523 "\u01F5": "g\u0301",
15524 // ǵ = \'{g}
15525 "\u1E21": "g\u0304",
15526 // ḡ = \={g}
15527 "\u011F": "g\u0306",
15528 // ğ = \u{g}
15529 "\u01E7": "g\u030C",
15530 // ǧ = \v{g}
15531 "\u011D": "g\u0302",
15532 // ĝ = \^{g}
15533 "\u0121": "g\u0307",
15534 // ġ = \.{g}
15535 "\u1E27": "h\u0308",
15536 // ḧ = \"{h}
15537 "\u021F": "h\u030C",
15538 // ȟ = \v{h}
15539 "\u0125": "h\u0302",
15540 // ĥ = \^{h}
15541 "\u1E23": "h\u0307",
15542 // ḣ = \.{h}
15543 "\xED": "i\u0301",
15544 // í = \'{i}
15545 "\xEC": "i\u0300",
15546 // ì = \`{i}
15547 "\xEF": "i\u0308",
15548 // ï = \"{i}
15549 "\u1E2F": "i\u0308\u0301",
15550 // ḯ = \"\'{i}
15551 "\u0129": "i\u0303",
15552 // ĩ = \~{i}
15553 "\u012B": "i\u0304",
15554 // ī = \={i}
15555 "\u012D": "i\u0306",
15556 // ĭ = \u{i}
15557 "\u01D0": "i\u030C",
15558 // ǐ = \v{i}
15559 "\xEE": "i\u0302",
15560 // î = \^{i}
15561 "\u01F0": "j\u030C",
15562 // ǰ = \v{j}
15563 "\u0135": "j\u0302",
15564 // ĵ = \^{j}
15565 "\u1E31": "k\u0301",
15566 // ḱ = \'{k}
15567 "\u01E9": "k\u030C",
15568 // ǩ = \v{k}
15569 "\u013A": "l\u0301",
15570 // ĺ = \'{l}
15571 "\u013E": "l\u030C",
15572 // ľ = \v{l}
15573 "\u1E3F": "m\u0301",
15574 // ḿ = \'{m}
15575 "\u1E41": "m\u0307",
15576 // ṁ = \.{m}
15577 "\u0144": "n\u0301",
15578 // ń = \'{n}
15579 "\u01F9": "n\u0300",
15580 // ǹ = \`{n}
15581 "\xF1": "n\u0303",
15582 // ñ = \~{n}
15583 "\u0148": "n\u030C",
15584 // ň = \v{n}
15585 "\u1E45": "n\u0307",
15586 // ṅ = \.{n}
15587 "\xF3": "o\u0301",
15588 // ó = \'{o}
15589 "\xF2": "o\u0300",
15590 // ò = \`{o}
15591 "\xF6": "o\u0308",
15592 // ö = \"{o}
15593 "\u022B": "o\u0308\u0304",
15594 // ȫ = \"\={o}
15595 "\xF5": "o\u0303",
15596 // õ = \~{o}
15597 "\u1E4D": "o\u0303\u0301",
15598 // ṍ = \~\'{o}
15599 "\u1E4F": "o\u0303\u0308",
15600 // ṏ = \~\"{o}
15601 "\u022D": "o\u0303\u0304",
15602 // ȭ = \~\={o}
15603 "\u014D": "o\u0304",
15604 // ō = \={o}
15605 "\u1E53": "o\u0304\u0301",
15606 // ṓ = \=\'{o}
15607 "\u1E51": "o\u0304\u0300",
15608 // ṑ = \=\`{o}
15609 "\u014F": "o\u0306",
15610 // ŏ = \u{o}
15611 "\u01D2": "o\u030C",
15612 // ǒ = \v{o}
15613 "\xF4": "o\u0302",
15614 // ô = \^{o}
15615 "\u1ED1": "o\u0302\u0301",
15616 // ố = \^\'{o}
15617 "\u1ED3": "o\u0302\u0300",
15618 // ồ = \^\`{o}
15619 "\u1ED7": "o\u0302\u0303",
15620 // ỗ = \^\~{o}
15621 "\u022F": "o\u0307",
15622 // ȯ = \.{o}
15623 "\u0231": "o\u0307\u0304",
15624 // ȱ = \.\={o}
15625 "\u0151": "o\u030B",
15626 // ő = \H{o}
15627 "\u1E55": "p\u0301",
15628 // ṕ = \'{p}
15629 "\u1E57": "p\u0307",
15630 // ṗ = \.{p}
15631 "\u0155": "r\u0301",
15632 // ŕ = \'{r}
15633 "\u0159": "r\u030C",
15634 // ř = \v{r}
15635 "\u1E59": "r\u0307",
15636 // ṙ = \.{r}
15637 "\u015B": "s\u0301",
15638 // ś = \'{s}
15639 "\u1E65": "s\u0301\u0307",
15640 // ṥ = \'\.{s}
15641 "\u0161": "s\u030C",
15642 // š = \v{s}
15643 "\u1E67": "s\u030C\u0307",
15644 // ṧ = \v\.{s}
15645 "\u015D": "s\u0302",
15646 // ŝ = \^{s}
15647 "\u1E61": "s\u0307",
15648 // ṡ = \.{s}
15649 "\u1E97": "t\u0308",
15650 // ẗ = \"{t}
15651 "\u0165": "t\u030C",
15652 // ť = \v{t}
15653 "\u1E6B": "t\u0307",
15654 // ṫ = \.{t}
15655 "\xFA": "u\u0301",
15656 // ú = \'{u}
15657 "\xF9": "u\u0300",
15658 // ù = \`{u}
15659 "\xFC": "u\u0308",
15660 // ü = \"{u}
15661 "\u01D8": "u\u0308\u0301",
15662 // ǘ = \"\'{u}
15663 "\u01DC": "u\u0308\u0300",
15664 // ǜ = \"\`{u}
15665 "\u01D6": "u\u0308\u0304",
15666 // ǖ = \"\={u}
15667 "\u01DA": "u\u0308\u030C",
15668 // ǚ = \"\v{u}
15669 "\u0169": "u\u0303",
15670 // ũ = \~{u}
15671 "\u1E79": "u\u0303\u0301",
15672 // ṹ = \~\'{u}
15673 "\u016B": "u\u0304",
15674 // ū = \={u}
15675 "\u1E7B": "u\u0304\u0308",
15676 // ṻ = \=\"{u}
15677 "\u016D": "u\u0306",
15678 // ŭ = \u{u}
15679 "\u01D4": "u\u030C",
15680 // ǔ = \v{u}
15681 "\xFB": "u\u0302",
15682 // û = \^{u}
15683 "\u016F": "u\u030A",
15684 // ů = \r{u}
15685 "\u0171": "u\u030B",
15686 // ű = \H{u}
15687 "\u1E7D": "v\u0303",
15688 // ṽ = \~{v}
15689 "\u1E83": "w\u0301",
15690 // ẃ = \'{w}
15691 "\u1E81": "w\u0300",
15692 // ẁ = \`{w}
15693 "\u1E85": "w\u0308",
15694 // ẅ = \"{w}
15695 "\u0175": "w\u0302",
15696 // ŵ = \^{w}
15697 "\u1E87": "w\u0307",
15698 // ẇ = \.{w}
15699 "\u1E98": "w\u030A",
15700 // ẘ = \r{w}
15701 "\u1E8D": "x\u0308",
15702 // ẍ = \"{x}
15703 "\u1E8B": "x\u0307",
15704 // ẋ = \.{x}
15705 "\xFD": "y\u0301",
15706 // ý = \'{y}
15707 "\u1EF3": "y\u0300",
15708 // ỳ = \`{y}
15709 "\xFF": "y\u0308",
15710 // ÿ = \"{y}
15711 "\u1EF9": "y\u0303",
15712 // ỹ = \~{y}
15713 "\u0233": "y\u0304",
15714 // ȳ = \={y}
15715 "\u0177": "y\u0302",
15716 // ŷ = \^{y}
15717 "\u1E8F": "y\u0307",
15718 // ẏ = \.{y}
15719 "\u1E99": "y\u030A",
15720 // ẙ = \r{y}
15721 "\u017A": "z\u0301",
15722 // ź = \'{z}
15723 "\u017E": "z\u030C",
15724 // ž = \v{z}
15725 "\u1E91": "z\u0302",
15726 // ẑ = \^{z}
15727 "\u017C": "z\u0307",
15728 // ż = \.{z}
15729 "\xC1": "A\u0301",
15730 // Á = \'{A}
15731 "\xC0": "A\u0300",
15732 // À = \`{A}
15733 "\xC4": "A\u0308",
15734 // Ä = \"{A}
15735 "\u01DE": "A\u0308\u0304",
15736 // Ǟ = \"\={A}
15737 "\xC3": "A\u0303",
15738 // Ã = \~{A}
15739 "\u0100": "A\u0304",
15740 // Ā = \={A}
15741 "\u0102": "A\u0306",
15742 // Ă = \u{A}
15743 "\u1EAE": "A\u0306\u0301",
15744 // Ắ = \u\'{A}
15745 "\u1EB0": "A\u0306\u0300",
15746 // Ằ = \u\`{A}
15747 "\u1EB4": "A\u0306\u0303",
15748 // Ẵ = \u\~{A}
15749 "\u01CD": "A\u030C",
15750 // Ǎ = \v{A}
15751 "\xC2": "A\u0302",
15752 // Â = \^{A}
15753 "\u1EA4": "A\u0302\u0301",
15754 // Ấ = \^\'{A}
15755 "\u1EA6": "A\u0302\u0300",
15756 // Ầ = \^\`{A}
15757 "\u1EAA": "A\u0302\u0303",
15758 // Ẫ = \^\~{A}
15759 "\u0226": "A\u0307",
15760 // Ȧ = \.{A}
15761 "\u01E0": "A\u0307\u0304",
15762 // Ǡ = \.\={A}
15763 "\xC5": "A\u030A",
15764 // Å = \r{A}
15765 "\u01FA": "A\u030A\u0301",
15766 // Ǻ = \r\'{A}
15767 "\u1E02": "B\u0307",
15768 // Ḃ = \.{B}
15769 "\u0106": "C\u0301",
15770 // Ć = \'{C}
15771 "\u010C": "C\u030C",
15772 // Č = \v{C}
15773 "\u0108": "C\u0302",
15774 // Ĉ = \^{C}
15775 "\u010A": "C\u0307",
15776 // Ċ = \.{C}
15777 "\u010E": "D\u030C",
15778 // Ď = \v{D}
15779 "\u1E0A": "D\u0307",
15780 // Ḋ = \.{D}
15781 "\xC9": "E\u0301",
15782 // É = \'{E}
15783 "\xC8": "E\u0300",
15784 // È = \`{E}
15785 "\xCB": "E\u0308",
15786 // Ë = \"{E}
15787 "\u1EBC": "E\u0303",
15788 // Ẽ = \~{E}
15789 "\u0112": "E\u0304",
15790 // Ē = \={E}
15791 "\u1E16": "E\u0304\u0301",
15792 // Ḗ = \=\'{E}
15793 "\u1E14": "E\u0304\u0300",
15794 // Ḕ = \=\`{E}
15795 "\u0114": "E\u0306",
15796 // Ĕ = \u{E}
15797 "\u011A": "E\u030C",
15798 // Ě = \v{E}
15799 "\xCA": "E\u0302",
15800 // Ê = \^{E}
15801 "\u1EBE": "E\u0302\u0301",
15802 // Ế = \^\'{E}
15803 "\u1EC0": "E\u0302\u0300",
15804 // Ề = \^\`{E}
15805 "\u1EC4": "E\u0302\u0303",
15806 // Ễ = \^\~{E}
15807 "\u0116": "E\u0307",
15808 // Ė = \.{E}
15809 "\u1E1E": "F\u0307",
15810 // Ḟ = \.{F}
15811 "\u01F4": "G\u0301",
15812 // Ǵ = \'{G}
15813 "\u1E20": "G\u0304",
15814 // Ḡ = \={G}
15815 "\u011E": "G\u0306",
15816 // Ğ = \u{G}
15817 "\u01E6": "G\u030C",
15818 // Ǧ = \v{G}
15819 "\u011C": "G\u0302",
15820 // Ĝ = \^{G}
15821 "\u0120": "G\u0307",
15822 // Ġ = \.{G}
15823 "\u1E26": "H\u0308",
15824 // Ḧ = \"{H}
15825 "\u021E": "H\u030C",
15826 // Ȟ = \v{H}
15827 "\u0124": "H\u0302",
15828 // Ĥ = \^{H}
15829 "\u1E22": "H\u0307",
15830 // Ḣ = \.{H}
15831 "\xCD": "I\u0301",
15832 // Í = \'{I}
15833 "\xCC": "I\u0300",
15834 // Ì = \`{I}
15835 "\xCF": "I\u0308",
15836 // Ï = \"{I}
15837 "\u1E2E": "I\u0308\u0301",
15838 // Ḯ = \"\'{I}
15839 "\u0128": "I\u0303",
15840 // Ĩ = \~{I}
15841 "\u012A": "I\u0304",
15842 // Ī = \={I}
15843 "\u012C": "I\u0306",
15844 // Ĭ = \u{I}
15845 "\u01CF": "I\u030C",
15846 // Ǐ = \v{I}
15847 "\xCE": "I\u0302",
15848 // Î = \^{I}
15849 "\u0130": "I\u0307",
15850 // İ = \.{I}
15851 "\u0134": "J\u0302",
15852 // Ĵ = \^{J}
15853 "\u1E30": "K\u0301",
15854 // Ḱ = \'{K}
15855 "\u01E8": "K\u030C",
15856 // Ǩ = \v{K}
15857 "\u0139": "L\u0301",
15858 // Ĺ = \'{L}
15859 "\u013D": "L\u030C",
15860 // Ľ = \v{L}
15861 "\u1E3E": "M\u0301",
15862 // Ḿ = \'{M}
15863 "\u1E40": "M\u0307",
15864 // Ṁ = \.{M}
15865 "\u0143": "N\u0301",
15866 // Ń = \'{N}
15867 "\u01F8": "N\u0300",
15868 // Ǹ = \`{N}
15869 "\xD1": "N\u0303",
15870 // Ñ = \~{N}
15871 "\u0147": "N\u030C",
15872 // Ň = \v{N}
15873 "\u1E44": "N\u0307",
15874 // Ṅ = \.{N}
15875 "\xD3": "O\u0301",
15876 // Ó = \'{O}
15877 "\xD2": "O\u0300",
15878 // Ò = \`{O}
15879 "\xD6": "O\u0308",
15880 // Ö = \"{O}
15881 "\u022A": "O\u0308\u0304",
15882 // Ȫ = \"\={O}
15883 "\xD5": "O\u0303",
15884 // Õ = \~{O}
15885 "\u1E4C": "O\u0303\u0301",
15886 // Ṍ = \~\'{O}
15887 "\u1E4E": "O\u0303\u0308",
15888 // Ṏ = \~\"{O}
15889 "\u022C": "O\u0303\u0304",
15890 // Ȭ = \~\={O}
15891 "\u014C": "O\u0304",
15892 // Ō = \={O}
15893 "\u1E52": "O\u0304\u0301",
15894 // Ṓ = \=\'{O}
15895 "\u1E50": "O\u0304\u0300",
15896 // Ṑ = \=\`{O}
15897 "\u014E": "O\u0306",
15898 // Ŏ = \u{O}
15899 "\u01D1": "O\u030C",
15900 // Ǒ = \v{O}
15901 "\xD4": "O\u0302",
15902 // Ô = \^{O}
15903 "\u1ED0": "O\u0302\u0301",
15904 // Ố = \^\'{O}
15905 "\u1ED2": "O\u0302\u0300",
15906 // Ồ = \^\`{O}
15907 "\u1ED6": "O\u0302\u0303",
15908 // Ỗ = \^\~{O}
15909 "\u022E": "O\u0307",
15910 // Ȯ = \.{O}
15911 "\u0230": "O\u0307\u0304",
15912 // Ȱ = \.\={O}
15913 "\u0150": "O\u030B",
15914 // Ő = \H{O}
15915 "\u1E54": "P\u0301",
15916 // Ṕ = \'{P}
15917 "\u1E56": "P\u0307",
15918 // Ṗ = \.{P}
15919 "\u0154": "R\u0301",
15920 // Ŕ = \'{R}
15921 "\u0158": "R\u030C",
15922 // Ř = \v{R}
15923 "\u1E58": "R\u0307",
15924 // Ṙ = \.{R}
15925 "\u015A": "S\u0301",
15926 // Ś = \'{S}
15927 "\u1E64": "S\u0301\u0307",
15928 // Ṥ = \'\.{S}
15929 "\u0160": "S\u030C",
15930 // Š = \v{S}
15931 "\u1E66": "S\u030C\u0307",
15932 // Ṧ = \v\.{S}
15933 "\u015C": "S\u0302",
15934 // Ŝ = \^{S}
15935 "\u1E60": "S\u0307",
15936 // Ṡ = \.{S}
15937 "\u0164": "T\u030C",
15938 // Ť = \v{T}
15939 "\u1E6A": "T\u0307",
15940 // Ṫ = \.{T}
15941 "\xDA": "U\u0301",
15942 // Ú = \'{U}
15943 "\xD9": "U\u0300",
15944 // Ù = \`{U}
15945 "\xDC": "U\u0308",
15946 // Ü = \"{U}
15947 "\u01D7": "U\u0308\u0301",
15948 // Ǘ = \"\'{U}
15949 "\u01DB": "U\u0308\u0300",
15950 // Ǜ = \"\`{U}
15951 "\u01D5": "U\u0308\u0304",
15952 // Ǖ = \"\={U}
15953 "\u01D9": "U\u0308\u030C",
15954 // Ǚ = \"\v{U}
15955 "\u0168": "U\u0303",
15956 // Ũ = \~{U}
15957 "\u1E78": "U\u0303\u0301",
15958 // Ṹ = \~\'{U}
15959 "\u016A": "U\u0304",
15960 // Ū = \={U}
15961 "\u1E7A": "U\u0304\u0308",
15962 // Ṻ = \=\"{U}
15963 "\u016C": "U\u0306",
15964 // Ŭ = \u{U}
15965 "\u01D3": "U\u030C",
15966 // Ǔ = \v{U}
15967 "\xDB": "U\u0302",
15968 // Û = \^{U}
15969 "\u016E": "U\u030A",
15970 // Ů = \r{U}
15971 "\u0170": "U\u030B",
15972 // Ű = \H{U}
15973 "\u1E7C": "V\u0303",
15974 // Ṽ = \~{V}
15975 "\u1E82": "W\u0301",
15976 // Ẃ = \'{W}
15977 "\u1E80": "W\u0300",
15978 // Ẁ = \`{W}
15979 "\u1E84": "W\u0308",
15980 // Ẅ = \"{W}
15981 "\u0174": "W\u0302",
15982 // Ŵ = \^{W}
15983 "\u1E86": "W\u0307",
15984 // Ẇ = \.{W}
15985 "\u1E8C": "X\u0308",
15986 // Ẍ = \"{X}
15987 "\u1E8A": "X\u0307",
15988 // Ẋ = \.{X}
15989 "\xDD": "Y\u0301",
15990 // Ý = \'{Y}
15991 "\u1EF2": "Y\u0300",
15992 // Ỳ = \`{Y}
15993 "\u0178": "Y\u0308",
15994 // Ÿ = \"{Y}
15995 "\u1EF8": "Y\u0303",
15996 // Ỹ = \~{Y}
15997 "\u0232": "Y\u0304",
15998 // Ȳ = \={Y}
15999 "\u0176": "Y\u0302",
16000 // Ŷ = \^{Y}
16001 "\u1E8E": "Y\u0307",
16002 // Ẏ = \.{Y}
16003 "\u0179": "Z\u0301",
16004 // Ź = \'{Z}
16005 "\u017D": "Z\u030C",
16006 // Ž = \v{Z}
16007 "\u1E90": "Z\u0302",
16008 // Ẑ = \^{Z}
16009 "\u017B": "Z\u0307",
16010 // Ż = \.{Z}
16011 "\u03AC": "\u03B1\u0301",
16012 // ά = \'{α}
16013 "\u1F70": "\u03B1\u0300",
16014 // ὰ = \`{α}
16015 "\u1FB1": "\u03B1\u0304",
16016 // ᾱ = \={α}
16017 "\u1FB0": "\u03B1\u0306",
16018 // ᾰ = \u{α}
16019 "\u03AD": "\u03B5\u0301",
16020 // έ = \'{ε}
16021 "\u1F72": "\u03B5\u0300",
16022 // ὲ = \`{ε}
16023 "\u03AE": "\u03B7\u0301",
16024 // ή = \'{η}
16025 "\u1F74": "\u03B7\u0300",
16026 // ὴ = \`{η}
16027 "\u03AF": "\u03B9\u0301",
16028 // ί = \'{ι}
16029 "\u1F76": "\u03B9\u0300",
16030 // ὶ = \`{ι}
16031 "\u03CA": "\u03B9\u0308",
16032 // ϊ = \"{ι}
16033 "\u0390": "\u03B9\u0308\u0301",
16034 // ΐ = \"\'{ι}
16035 "\u1FD2": "\u03B9\u0308\u0300",
16036 // ῒ = \"\`{ι}
16037 "\u1FD1": "\u03B9\u0304",
16038 // ῑ = \={ι}
16039 "\u1FD0": "\u03B9\u0306",
16040 // ῐ = \u{ι}
16041 "\u03CC": "\u03BF\u0301",
16042 // ό = \'{ο}
16043 "\u1F78": "\u03BF\u0300",
16044 // ὸ = \`{ο}
16045 "\u03CD": "\u03C5\u0301",
16046 // ύ = \'{υ}
16047 "\u1F7A": "\u03C5\u0300",
16048 // ὺ = \`{υ}
16049 "\u03CB": "\u03C5\u0308",
16050 // ϋ = \"{υ}
16051 "\u03B0": "\u03C5\u0308\u0301",
16052 // ΰ = \"\'{υ}
16053 "\u1FE2": "\u03C5\u0308\u0300",
16054 // ῢ = \"\`{υ}
16055 "\u1FE1": "\u03C5\u0304",
16056 // ῡ = \={υ}
16057 "\u1FE0": "\u03C5\u0306",
16058 // ῠ = \u{υ}
16059 "\u03CE": "\u03C9\u0301",
16060 // ώ = \'{ω}
16061 "\u1F7C": "\u03C9\u0300",
16062 // ὼ = \`{ω}
16063 "\u038E": "\u03A5\u0301",
16064 // Ύ = \'{Υ}
16065 "\u1FEA": "\u03A5\u0300",
16066 // Ὺ = \`{Υ}
16067 "\u03AB": "\u03A5\u0308",
16068 // Ϋ = \"{Υ}
16069 "\u1FE9": "\u03A5\u0304",
16070 // Ῡ = \={Υ}
16071 "\u1FE8": "\u03A5\u0306",
16072 // Ῠ = \u{Υ}
16073 "\u038F": "\u03A9\u0301",
16074 // Ώ = \'{Ω}
16075 "\u1FFA": "\u03A9\u0300" // Ὼ = \`{Ω}
16076
16077 });
16078 // CONCATENATED MODULE: ./src/Parser.js
16079 /* eslint no-constant-condition:0 */
16080
16081
16082
16083
16084
16085
16086
16087
16088
16089
16090
16091
16092
16093
16094 /**
16095 * This file contains the parser used to parse out a TeX expression from the
16096 * input. Since TeX isn't context-free, standard parsers don't work particularly
16097 * well.
16098 *
16099 * The strategy of this parser is as such:
16100 *
16101 * The main functions (the `.parse...` ones) take a position in the current
16102 * parse string to parse tokens from. The lexer (found in Lexer.js, stored at
16103 * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When
16104 * individual tokens are needed at a position, the lexer is called to pull out a
16105 * token, which is then used.
16106 *
16107 * The parser has a property called "mode" indicating the mode that
16108 * the parser is currently in. Currently it has to be one of "math" or
16109 * "text", which denotes whether the current environment is a math-y
16110 * one or a text-y one (e.g. inside \text). Currently, this serves to
16111 * limit the functions which can be used in text mode.
16112 *
16113 * The main functions then return an object which contains the useful data that
16114 * was parsed at its given point, and a new position at the end of the parsed
16115 * data. The main functions can call each other and continue the parsing by
16116 * using the returned position as a new starting point.
16117 *
16118 * There are also extra `.handle...` functions, which pull out some reused
16119 * functionality into self-contained functions.
16120 *
16121 * The functions return ParseNodes.
16122 */
16123 var Parser_Parser =
16124 /*#__PURE__*/
16125 function () {
16126 function Parser(input, settings) {
16127 this.mode = void 0;
16128 this.gullet = void 0;
16129 this.settings = void 0;
16130 this.leftrightDepth = void 0;
16131 this.nextToken = void 0;
16132 // Start in math mode
16133 this.mode = "math"; // Create a new macro expander (gullet) and (indirectly via that) also a
16134 // new lexer (mouth) for this parser (stomach, in the language of TeX)
16135
16136 this.gullet = new MacroExpander_MacroExpander(input, settings, this.mode); // Store the settings for use in parsing
16137
16138 this.settings = settings; // Count leftright depth (for \middle errors)
16139
16140 this.leftrightDepth = 0;
16141 }
16142 /**
16143 * Checks a result to make sure it has the right type, and throws an
16144 * appropriate error otherwise.
16145 */
16146
16147
16148 var _proto = Parser.prototype;
16149
16150 _proto.expect = function expect(text, consume) {
16151 if (consume === void 0) {
16152 consume = true;
16153 }
16154
16155 if (this.fetch().text !== text) {
16156 throw new src_ParseError("Expected '" + text + "', got '" + this.fetch().text + "'", this.fetch());
16157 }
16158
16159 if (consume) {
16160 this.consume();
16161 }
16162 }
16163 /**
16164 * Discards the current lookahead token, considering it consumed.
16165 */
16166 ;
16167
16168 _proto.consume = function consume() {
16169 this.nextToken = null;
16170 }
16171 /**
16172 * Return the current lookahead token, or if there isn't one (at the
16173 * beginning, or if the previous lookahead token was consume()d),
16174 * fetch the next token as the new lookahead token and return it.
16175 */
16176 ;
16177
16178 _proto.fetch = function fetch() {
16179 if (this.nextToken == null) {
16180 this.nextToken = this.gullet.expandNextToken();
16181 }
16182
16183 return this.nextToken;
16184 }
16185 /**
16186 * Switches between "text" and "math" modes.
16187 */
16188 ;
16189
16190 _proto.switchMode = function switchMode(newMode) {
16191 this.mode = newMode;
16192 this.gullet.switchMode(newMode);
16193 }
16194 /**
16195 * Main parsing function, which parses an entire input.
16196 */
16197 ;
16198
16199 _proto.parse = function parse() {
16200 // Create a group namespace for the math expression.
16201 // (LaTeX creates a new group for every $...$, $$...$$, \[...\].)
16202 this.gullet.beginGroup(); // Use old \color behavior (same as LaTeX's \textcolor) if requested.
16203 // We do this within the group for the math expression, so it doesn't
16204 // pollute settings.macros.
16205
16206 if (this.settings.colorIsTextColor) {
16207 this.gullet.macros.set("\\color", "\\textcolor");
16208 } // Try to parse the input
16209
16210
16211 var parse = this.parseExpression(false); // If we succeeded, make sure there's an EOF at the end
16212
16213 this.expect("EOF"); // End the group namespace for the expression
16214
16215 this.gullet.endGroup();
16216 return parse;
16217 };
16218
16219 _proto.parseExpression = function parseExpression(breakOnInfix, breakOnTokenText) {
16220 var body = []; // Keep adding atoms to the body until we can't parse any more atoms (either
16221 // we reached the end, a }, or a \right)
16222
16223 while (true) {
16224 // Ignore spaces in math mode
16225 if (this.mode === "math") {
16226 this.consumeSpaces();
16227 }
16228
16229 var lex = this.fetch();
16230
16231 if (Parser.endOfExpression.indexOf(lex.text) !== -1) {
16232 break;
16233 }
16234
16235 if (breakOnTokenText && lex.text === breakOnTokenText) {
16236 break;
16237 }
16238
16239 if (breakOnInfix && src_functions[lex.text] && src_functions[lex.text].infix) {
16240 break;
16241 }
16242
16243 var atom = this.parseAtom(breakOnTokenText);
16244
16245 if (!atom) {
16246 break;
16247 }
16248
16249 body.push(atom);
16250 }
16251
16252 if (this.mode === "text") {
16253 this.formLigatures(body);
16254 }
16255
16256 return this.handleInfixNodes(body);
16257 }
16258 /**
16259 * Rewrites infix operators such as \over with corresponding commands such
16260 * as \frac.
16261 *
16262 * There can only be one infix operator per group. If there's more than one
16263 * then the expression is ambiguous. This can be resolved by adding {}.
16264 */
16265 ;
16266
16267 _proto.handleInfixNodes = function handleInfixNodes(body) {
16268 var overIndex = -1;
16269 var funcName;
16270
16271 for (var i = 0; i < body.length; i++) {
16272 var node = checkNodeType(body[i], "infix");
16273
16274 if (node) {
16275 if (overIndex !== -1) {
16276 throw new src_ParseError("only one infix operator per group", node.token);
16277 }
16278
16279 overIndex = i;
16280 funcName = node.replaceWith;
16281 }
16282 }
16283
16284 if (overIndex !== -1 && funcName) {
16285 var numerNode;
16286 var denomNode;
16287 var numerBody = body.slice(0, overIndex);
16288 var denomBody = body.slice(overIndex + 1);
16289
16290 if (numerBody.length === 1 && numerBody[0].type === "ordgroup") {
16291 numerNode = numerBody[0];
16292 } else {
16293 numerNode = {
16294 type: "ordgroup",
16295 mode: this.mode,
16296 body: numerBody
16297 };
16298 }
16299
16300 if (denomBody.length === 1 && denomBody[0].type === "ordgroup") {
16301 denomNode = denomBody[0];
16302 } else {
16303 denomNode = {
16304 type: "ordgroup",
16305 mode: this.mode,
16306 body: denomBody
16307 };
16308 }
16309
16310 var _node;
16311
16312 if (funcName === "\\\\abovefrac") {
16313 _node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []);
16314 } else {
16315 _node = this.callFunction(funcName, [numerNode, denomNode], []);
16316 }
16317
16318 return [_node];
16319 } else {
16320 return body;
16321 }
16322 } // The greediness of a superscript or subscript
16323 ;
16324
16325 /**
16326 * Handle a subscript or superscript with nice errors.
16327 */
16328 _proto.handleSupSubscript = function handleSupSubscript(name) {
16329 var symbolToken = this.fetch();
16330 var symbol = symbolToken.text;
16331 this.consume();
16332 var group = this.parseGroup(name, false, Parser.SUPSUB_GREEDINESS, undefined, undefined, true); // ignore spaces before sup/subscript argument
16333
16334 if (!group) {
16335 throw new src_ParseError("Expected group after '" + symbol + "'", symbolToken);
16336 }
16337
16338 return group;
16339 }
16340 /**
16341 * Converts the textual input of an unsupported command into a text node
16342 * contained within a color node whose color is determined by errorColor
16343 */
16344 ;
16345
16346 _proto.formatUnsupportedCmd = function formatUnsupportedCmd(text) {
16347 var textordArray = [];
16348
16349 for (var i = 0; i < text.length; i++) {
16350 textordArray.push({
16351 type: "textord",
16352 mode: "text",
16353 text: text[i]
16354 });
16355 }
16356
16357 var textNode = {
16358 type: "text",
16359 mode: this.mode,
16360 body: textordArray
16361 };
16362 var colorNode = {
16363 type: "color",
16364 mode: this.mode,
16365 color: this.settings.errorColor,
16366 body: [textNode]
16367 };
16368 return colorNode;
16369 }
16370 /**
16371 * Parses a group with optional super/subscripts.
16372 */
16373 ;
16374
16375 _proto.parseAtom = function parseAtom(breakOnTokenText) {
16376 // The body of an atom is an implicit group, so that things like
16377 // \left(x\right)^2 work correctly.
16378 var base = this.parseGroup("atom", false, null, breakOnTokenText); // In text mode, we don't have superscripts or subscripts
16379
16380 if (this.mode === "text") {
16381 return base;
16382 } // Note that base may be empty (i.e. null) at this point.
16383
16384
16385 var superscript;
16386 var subscript;
16387
16388 while (true) {
16389 // Guaranteed in math mode, so eat any spaces first.
16390 this.consumeSpaces(); // Lex the first token
16391
16392 var lex = this.fetch();
16393
16394 if (lex.text === "\\limits" || lex.text === "\\nolimits") {
16395 // We got a limit control
16396 var opNode = checkNodeType(base, "op");
16397
16398 if (opNode) {
16399 var limits = lex.text === "\\limits";
16400 opNode.limits = limits;
16401 opNode.alwaysHandleSupSub = true;
16402 } else {
16403 opNode = checkNodeType(base, "operatorname");
16404
16405 if (opNode && opNode.alwaysHandleSupSub) {
16406 var _limits = lex.text === "\\limits";
16407
16408 opNode.limits = _limits;
16409 } else {
16410 throw new src_ParseError("Limit controls must follow a math operator", lex);
16411 }
16412 }
16413
16414 this.consume();
16415 } else if (lex.text === "^") {
16416 // We got a superscript start
16417 if (superscript) {
16418 throw new src_ParseError("Double superscript", lex);
16419 }
16420
16421 superscript = this.handleSupSubscript("superscript");
16422 } else if (lex.text === "_") {
16423 // We got a subscript start
16424 if (subscript) {
16425 throw new src_ParseError("Double subscript", lex);
16426 }
16427
16428 subscript = this.handleSupSubscript("subscript");
16429 } else if (lex.text === "'") {
16430 // We got a prime
16431 if (superscript) {
16432 throw new src_ParseError("Double superscript", lex);
16433 }
16434
16435 var prime = {
16436 type: "textord",
16437 mode: this.mode,
16438 text: "\\prime"
16439 }; // Many primes can be grouped together, so we handle this here
16440
16441 var primes = [prime];
16442 this.consume(); // Keep lexing tokens until we get something that's not a prime
16443
16444 while (this.fetch().text === "'") {
16445 // For each one, add another prime to the list
16446 primes.push(prime);
16447 this.consume();
16448 } // If there's a superscript following the primes, combine that
16449 // superscript in with the primes.
16450
16451
16452 if (this.fetch().text === "^") {
16453 primes.push(this.handleSupSubscript("superscript"));
16454 } // Put everything into an ordgroup as the superscript
16455
16456
16457 superscript = {
16458 type: "ordgroup",
16459 mode: this.mode,
16460 body: primes
16461 };
16462 } else {
16463 // If it wasn't ^, _, or ', stop parsing super/subscripts
16464 break;
16465 }
16466 } // Base must be set if superscript or subscript are set per logic above,
16467 // but need to check here for type check to pass.
16468
16469
16470 if (superscript || subscript) {
16471 // If we got either a superscript or subscript, create a supsub
16472 return {
16473 type: "supsub",
16474 mode: this.mode,
16475 base: base,
16476 sup: superscript,
16477 sub: subscript
16478 };
16479 } else {
16480 // Otherwise return the original body
16481 return base;
16482 }
16483 }
16484 /**
16485 * Parses an entire function, including its base and all of its arguments.
16486 */
16487 ;
16488
16489 _proto.parseFunction = function parseFunction(breakOnTokenText, name, // For error reporting.
16490 greediness) {
16491 var token = this.fetch();
16492 var func = token.text;
16493 var funcData = src_functions[func];
16494
16495 if (!funcData) {
16496 return null;
16497 }
16498
16499 this.consume(); // consume command token
16500
16501 if (greediness != null && funcData.greediness <= greediness) {
16502 throw new src_ParseError("Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), token);
16503 } else if (this.mode === "text" && !funcData.allowedInText) {
16504 throw new src_ParseError("Can't use function '" + func + "' in text mode", token);
16505 } else if (this.mode === "math" && funcData.allowedInMath === false) {
16506 throw new src_ParseError("Can't use function '" + func + "' in math mode", token);
16507 }
16508
16509 var _this$parseArguments = this.parseArguments(func, funcData),
16510 args = _this$parseArguments.args,
16511 optArgs = _this$parseArguments.optArgs;
16512
16513 return this.callFunction(func, args, optArgs, token, breakOnTokenText);
16514 }
16515 /**
16516 * Call a function handler with a suitable context and arguments.
16517 */
16518 ;
16519
16520 _proto.callFunction = function callFunction(name, args, optArgs, token, breakOnTokenText) {
16521 var context = {
16522 funcName: name,
16523 parser: this,
16524 token: token,
16525 breakOnTokenText: breakOnTokenText
16526 };
16527 var func = src_functions[name];
16528
16529 if (func && func.handler) {
16530 return func.handler(context, args, optArgs);
16531 } else {
16532 throw new src_ParseError("No function handler for " + name);
16533 }
16534 }
16535 /**
16536 * Parses the arguments of a function or environment
16537 */
16538 ;
16539
16540 _proto.parseArguments = function parseArguments(func, // Should look like "\name" or "\begin{name}".
16541 funcData) {
16542 var totalArgs = funcData.numArgs + funcData.numOptionalArgs;
16543
16544 if (totalArgs === 0) {
16545 return {
16546 args: [],
16547 optArgs: []
16548 };
16549 }
16550
16551 var baseGreediness = funcData.greediness;
16552 var args = [];
16553 var optArgs = [];
16554
16555 for (var i = 0; i < totalArgs; i++) {
16556 var argType = funcData.argTypes && funcData.argTypes[i];
16557 var isOptional = i < funcData.numOptionalArgs; // Ignore spaces between arguments. As the TeXbook says:
16558 // "After you have said ‘\def\row#1#2{...}’, you are allowed to
16559 // put spaces between the arguments (e.g., ‘\row x n’), because
16560 // TeX doesn’t use single spaces as undelimited arguments."
16561
16562 var consumeSpaces = i > 0 && !isOptional || // Also consume leading spaces in math mode, as parseSymbol
16563 // won't know what to do with them. This can only happen with
16564 // macros, e.g. \frac\foo\foo where \foo expands to a space symbol.
16565 // In LaTeX, the \foo's get treated as (blank) arguments.
16566 // In KaTeX, for now, both spaces will get consumed.
16567 // TODO(edemaine)
16568 i === 0 && !isOptional && this.mode === "math";
16569 var arg = this.parseGroupOfType("argument to '" + func + "'", argType, isOptional, baseGreediness, consumeSpaces);
16570
16571 if (!arg) {
16572 if (isOptional) {
16573 optArgs.push(null);
16574 continue;
16575 }
16576
16577 throw new src_ParseError("Expected group after '" + func + "'", this.fetch());
16578 }
16579
16580 (isOptional ? optArgs : args).push(arg);
16581 }
16582
16583 return {
16584 args: args,
16585 optArgs: optArgs
16586 };
16587 }
16588 /**
16589 * Parses a group when the mode is changing.
16590 */
16591 ;
16592
16593 _proto.parseGroupOfType = function parseGroupOfType(name, type, optional, greediness, consumeSpaces) {
16594 switch (type) {
16595 case "color":
16596 if (consumeSpaces) {
16597 this.consumeSpaces();
16598 }
16599
16600 return this.parseColorGroup(optional);
16601
16602 case "size":
16603 if (consumeSpaces) {
16604 this.consumeSpaces();
16605 }
16606
16607 return this.parseSizeGroup(optional);
16608
16609 case "url":
16610 return this.parseUrlGroup(optional, consumeSpaces);
16611
16612 case "math":
16613 case "text":
16614 return this.parseGroup(name, optional, greediness, undefined, type, consumeSpaces);
16615
16616 case "hbox":
16617 {
16618 // hbox argument type wraps the argument in the equivalent of
16619 // \hbox, which is like \text but switching to \textstyle size.
16620 var group = this.parseGroup(name, optional, greediness, undefined, "text", consumeSpaces);
16621
16622 if (!group) {
16623 return group;
16624 }
16625
16626 var styledGroup = {
16627 type: "styling",
16628 mode: group.mode,
16629 body: [group],
16630 style: "text" // simulate \textstyle
16631
16632 };
16633 return styledGroup;
16634 }
16635
16636 case "raw":
16637 {
16638 if (consumeSpaces) {
16639 this.consumeSpaces();
16640 }
16641
16642 if (optional && this.fetch().text === "{") {
16643 return null;
16644 }
16645
16646 var token = this.parseStringGroup("raw", optional, true);
16647
16648 if (token) {
16649 return {
16650 type: "raw",
16651 mode: "text",
16652 string: token.text
16653 };
16654 } else {
16655 throw new src_ParseError("Expected raw group", this.fetch());
16656 }
16657 }
16658
16659 case "original":
16660 case null:
16661 case undefined:
16662 return this.parseGroup(name, optional, greediness, undefined, undefined, consumeSpaces);
16663
16664 default:
16665 throw new src_ParseError("Unknown group type as " + name, this.fetch());
16666 }
16667 }
16668 /**
16669 * Discard any space tokens, fetching the next non-space token.
16670 */
16671 ;
16672
16673 _proto.consumeSpaces = function consumeSpaces() {
16674 while (this.fetch().text === " ") {
16675 this.consume();
16676 }
16677 }
16678 /**
16679 * Parses a group, essentially returning the string formed by the
16680 * brace-enclosed tokens plus some position information.
16681 */
16682 ;
16683
16684 _proto.parseStringGroup = function parseStringGroup(modeName, // Used to describe the mode in error messages.
16685 optional, raw) {
16686 var groupBegin = optional ? "[" : "{";
16687 var groupEnd = optional ? "]" : "}";
16688 var beginToken = this.fetch();
16689
16690 if (beginToken.text !== groupBegin) {
16691 if (optional) {
16692 return null;
16693 } else if (raw && beginToken.text !== "EOF" && /[^{}[\]]/.test(beginToken.text)) {
16694 this.consume();
16695 return beginToken;
16696 }
16697 }
16698
16699 var outerMode = this.mode;
16700 this.mode = "text";
16701 this.expect(groupBegin);
16702 var str = "";
16703 var firstToken = this.fetch();
16704 var nested = 0; // allow nested braces in raw string group
16705
16706 var lastToken = firstToken;
16707 var nextToken;
16708
16709 while ((nextToken = this.fetch()).text !== groupEnd || raw && nested > 0) {
16710 switch (nextToken.text) {
16711 case "EOF":
16712 throw new src_ParseError("Unexpected end of input in " + modeName, firstToken.range(lastToken, str));
16713
16714 case groupBegin:
16715 nested++;
16716 break;
16717
16718 case groupEnd:
16719 nested--;
16720 break;
16721 }
16722
16723 lastToken = nextToken;
16724 str += lastToken.text;
16725 this.consume();
16726 }
16727
16728 this.expect(groupEnd);
16729 this.mode = outerMode;
16730 return firstToken.range(lastToken, str);
16731 }
16732 /**
16733 * Parses a regex-delimited group: the largest sequence of tokens
16734 * whose concatenated strings match `regex`. Returns the string
16735 * formed by the tokens plus some position information.
16736 */
16737 ;
16738
16739 _proto.parseRegexGroup = function parseRegexGroup(regex, modeName) {
16740 var outerMode = this.mode;
16741 this.mode = "text";
16742 var firstToken = this.fetch();
16743 var lastToken = firstToken;
16744 var str = "";
16745 var nextToken;
16746
16747 while ((nextToken = this.fetch()).text !== "EOF" && regex.test(str + nextToken.text)) {
16748 lastToken = nextToken;
16749 str += lastToken.text;
16750 this.consume();
16751 }
16752
16753 if (str === "") {
16754 throw new src_ParseError("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken);
16755 }
16756
16757 this.mode = outerMode;
16758 return firstToken.range(lastToken, str);
16759 }
16760 /**
16761 * Parses a color description.
16762 */
16763 ;
16764
16765 _proto.parseColorGroup = function parseColorGroup(optional) {
16766 var res = this.parseStringGroup("color", optional);
16767
16768 if (!res) {
16769 return null;
16770 }
16771
16772 var match = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(res.text);
16773
16774 if (!match) {
16775 throw new src_ParseError("Invalid color: '" + res.text + "'", res);
16776 }
16777
16778 var color = match[0];
16779
16780 if (/^[0-9a-f]{6}$/i.test(color)) {
16781 // We allow a 6-digit HTML color spec without a leading "#".
16782 // This follows the xcolor package's HTML color model.
16783 // Predefined color names are all missed by this RegEx pattern.
16784 color = "#" + color;
16785 }
16786
16787 return {
16788 type: "color-token",
16789 mode: this.mode,
16790 color: color
16791 };
16792 }
16793 /**
16794 * Parses a size specification, consisting of magnitude and unit.
16795 */
16796 ;
16797
16798 _proto.parseSizeGroup = function parseSizeGroup(optional) {
16799 var res;
16800 var isBlank = false;
16801
16802 if (!optional && this.fetch().text !== "{") {
16803 res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size");
16804 } else {
16805 res = this.parseStringGroup("size", optional);
16806 }
16807
16808 if (!res) {
16809 return null;
16810 }
16811
16812 if (!optional && res.text.length === 0) {
16813 // Because we've tested for what is !optional, this block won't
16814 // affect \kern, \hspace, etc. It will capture the mandatory arguments
16815 // to \genfrac and \above.
16816 res.text = "0pt"; // Enable \above{}
16817
16818 isBlank = true; // This is here specifically for \genfrac
16819 }
16820
16821 var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text);
16822
16823 if (!match) {
16824 throw new src_ParseError("Invalid size: '" + res.text + "'", res);
16825 }
16826
16827 var data = {
16828 number: +(match[1] + match[2]),
16829 // sign + magnitude, cast to number
16830 unit: match[3]
16831 };
16832
16833 if (!validUnit(data)) {
16834 throw new src_ParseError("Invalid unit: '" + data.unit + "'", res);
16835 }
16836
16837 return {
16838 type: "size",
16839 mode: this.mode,
16840 value: data,
16841 isBlank: isBlank
16842 };
16843 }
16844 /**
16845 * Parses an URL, checking escaped letters and allowed protocols,
16846 * and setting the catcode of % as an active character (as in \hyperref).
16847 */
16848 ;
16849
16850 _proto.parseUrlGroup = function parseUrlGroup(optional, consumeSpaces) {
16851 this.gullet.lexer.setCatcode("%", 13); // active character
16852
16853 var res = this.parseStringGroup("url", optional, true); // get raw string
16854
16855 this.gullet.lexer.setCatcode("%", 14); // comment character
16856
16857 if (!res) {
16858 return null;
16859 } // hyperref package allows backslashes alone in href, but doesn't
16860 // generate valid links in such cases; we interpret this as
16861 // "undefined" behaviour, and keep them as-is. Some browser will
16862 // replace backslashes with forward slashes.
16863
16864
16865 var url = res.text.replace(/\\([#$%&~_^{}])/g, '$1');
16866 return {
16867 type: "url",
16868 mode: this.mode,
16869 url: url
16870 };
16871 }
16872 /**
16873 * If `optional` is false or absent, this parses an ordinary group,
16874 * which is either a single nucleus (like "x") or an expression
16875 * in braces (like "{x+y}") or an implicit group, a group that starts
16876 * at the current position, and ends right before a higher explicit
16877 * group ends, or at EOF.
16878 * If `optional` is true, it parses either a bracket-delimited expression
16879 * (like "[x+y]") or returns null to indicate the absence of a
16880 * bracket-enclosed group.
16881 * If `mode` is present, switches to that mode while parsing the group,
16882 * and switches back after.
16883 */
16884 ;
16885
16886 _proto.parseGroup = function parseGroup(name, // For error reporting.
16887 optional, greediness, breakOnTokenText, mode, consumeSpaces) {
16888 // Switch to specified mode
16889 var outerMode = this.mode;
16890
16891 if (mode) {
16892 this.switchMode(mode);
16893 } // Consume spaces if requested, crucially *after* we switch modes,
16894 // so that the next non-space token is parsed in the correct mode.
16895
16896
16897 if (consumeSpaces) {
16898 this.consumeSpaces();
16899 } // Get first token
16900
16901
16902 var firstToken = this.fetch();
16903 var text = firstToken.text;
16904 var result; // Try to parse an open brace or \begingroup
16905
16906 if (optional ? text === "[" : text === "{" || text === "\\begingroup") {
16907 this.consume();
16908 var groupEnd = Parser.endOfGroup[text]; // Start a new group namespace
16909
16910 this.gullet.beginGroup(); // If we get a brace, parse an expression
16911
16912 var expression = this.parseExpression(false, groupEnd);
16913 var lastToken = this.fetch(); // Check that we got a matching closing brace
16914
16915 this.expect(groupEnd); // End group namespace
16916
16917 this.gullet.endGroup();
16918 result = {
16919 type: "ordgroup",
16920 mode: this.mode,
16921 loc: SourceLocation.range(firstToken, lastToken),
16922 body: expression,
16923 // A group formed by \begingroup...\endgroup is a semi-simple group
16924 // which doesn't affect spacing in math mode, i.e., is transparent.
16925 // https://tex.stackexchange.com/questions/1930/when-should-one-
16926 // use-begingroup-instead-of-bgroup
16927 semisimple: text === "\\begingroup" || undefined
16928 };
16929 } else if (optional) {
16930 // Return nothing for an optional group
16931 result = null;
16932 } else {
16933 // If there exists a function with this name, parse the function.
16934 // Otherwise, just return a nucleus
16935 result = this.parseFunction(breakOnTokenText, name, greediness) || this.parseSymbol();
16936
16937 if (result == null && text[0] === "\\" && !implicitCommands.hasOwnProperty(text)) {
16938 if (this.settings.throwOnError) {
16939 throw new src_ParseError("Undefined control sequence: " + text, firstToken);
16940 }
16941
16942 result = this.formatUnsupportedCmd(text);
16943 this.consume();
16944 }
16945 } // Switch mode back
16946
16947
16948 if (mode) {
16949 this.switchMode(outerMode);
16950 }
16951
16952 return result;
16953 }
16954 /**
16955 * Form ligature-like combinations of characters for text mode.
16956 * This includes inputs like "--", "---", "``" and "''".
16957 * The result will simply replace multiple textord nodes with a single
16958 * character in each value by a single textord node having multiple
16959 * characters in its value. The representation is still ASCII source.
16960 * The group will be modified in place.
16961 */
16962 ;
16963
16964 _proto.formLigatures = function formLigatures(group) {
16965 var n = group.length - 1;
16966
16967 for (var i = 0; i < n; ++i) {
16968 var a = group[i]; // $FlowFixMe: Not every node type has a `text` property.
16969
16970 var v = a.text;
16971
16972 if (v === "-" && group[i + 1].text === "-") {
16973 if (i + 1 < n && group[i + 2].text === "-") {
16974 group.splice(i, 3, {
16975 type: "textord",
16976 mode: "text",
16977 loc: SourceLocation.range(a, group[i + 2]),
16978 text: "---"
16979 });
16980 n -= 2;
16981 } else {
16982 group.splice(i, 2, {
16983 type: "textord",
16984 mode: "text",
16985 loc: SourceLocation.range(a, group[i + 1]),
16986 text: "--"
16987 });
16988 n -= 1;
16989 }
16990 }
16991
16992 if ((v === "'" || v === "`") && group[i + 1].text === v) {
16993 group.splice(i, 2, {
16994 type: "textord",
16995 mode: "text",
16996 loc: SourceLocation.range(a, group[i + 1]),
16997 text: v + v
16998 });
16999 n -= 1;
17000 }
17001 }
17002 }
17003 /**
17004 * Parse a single symbol out of the string. Here, we handle single character
17005 * symbols and special functions like \verb.
17006 */
17007 ;
17008
17009 _proto.parseSymbol = function parseSymbol() {
17010 var nucleus = this.fetch();
17011 var text = nucleus.text;
17012
17013 if (/^\\verb[^a-zA-Z]/.test(text)) {
17014 this.consume();
17015 var arg = text.slice(5);
17016 var star = arg.charAt(0) === "*";
17017
17018 if (star) {
17019 arg = arg.slice(1);
17020 } // Lexer's tokenRegex is constructed to always have matching
17021 // first/last characters.
17022
17023
17024 if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) {
17025 throw new src_ParseError("\\verb assertion failed --\n please report what input caused this bug");
17026 }
17027
17028 arg = arg.slice(1, -1); // remove first and last char
17029
17030 return {
17031 type: "verb",
17032 mode: "text",
17033 body: arg,
17034 star: star
17035 };
17036 } // At this point, we should have a symbol, possibly with accents.
17037 // First expand any accented base symbol according to unicodeSymbols.
17038
17039
17040 if (unicodeSymbols.hasOwnProperty(text[0]) && !src_symbols[this.mode][text[0]]) {
17041 // This behavior is not strict (XeTeX-compatible) in math mode.
17042 if (this.settings.strict && this.mode === "math") {
17043 this.settings.reportNonstrict("unicodeTextInMathMode", "Accented Unicode text character \"" + text[0] + "\" used in " + "math mode", nucleus);
17044 }
17045
17046 text = unicodeSymbols[text[0]] + text.substr(1);
17047 } // Strip off any combining characters
17048
17049
17050 var match = combiningDiacriticalMarksEndRegex.exec(text);
17051
17052 if (match) {
17053 text = text.substring(0, match.index);
17054
17055 if (text === 'i') {
17056 text = "\u0131"; // dotless i, in math and text mode
17057 } else if (text === 'j') {
17058 text = "\u0237"; // dotless j, in math and text mode
17059 }
17060 } // Recognize base symbol
17061
17062
17063 var symbol;
17064
17065 if (src_symbols[this.mode][text]) {
17066 if (this.settings.strict && this.mode === 'math' && extraLatin.indexOf(text) >= 0) {
17067 this.settings.reportNonstrict("unicodeTextInMathMode", "Latin-1/Unicode text character \"" + text[0] + "\" used in " + "math mode", nucleus);
17068 }
17069
17070 var group = src_symbols[this.mode][text].group;
17071 var loc = SourceLocation.range(nucleus);
17072 var s;
17073
17074 if (ATOMS.hasOwnProperty(group)) {
17075 // $FlowFixMe
17076 var family = group;
17077 s = {
17078 type: "atom",
17079 mode: this.mode,
17080 family: family,
17081 loc: loc,
17082 text: text
17083 };
17084 } else {
17085 // $FlowFixMe
17086 s = {
17087 type: group,
17088 mode: this.mode,
17089 loc: loc,
17090 text: text
17091 };
17092 }
17093
17094 symbol = s;
17095 } else if (text.charCodeAt(0) >= 0x80) {
17096 // no symbol for e.g. ^
17097 if (this.settings.strict) {
17098 if (!supportedCodepoint(text.charCodeAt(0))) {
17099 this.settings.reportNonstrict("unknownSymbol", "Unrecognized Unicode character \"" + text[0] + "\"" + (" (" + text.charCodeAt(0) + ")"), nucleus);
17100 } else if (this.mode === "math") {
17101 this.settings.reportNonstrict("unicodeTextInMathMode", "Unicode text character \"" + text[0] + "\" used in math mode", nucleus);
17102 }
17103 } // All nonmathematical Unicode characters are rendered as if they
17104 // are in text mode (wrapped in \text) because that's what it
17105 // takes to render them in LaTeX. Setting `mode: this.mode` is
17106 // another natural choice (the user requested math mode), but
17107 // this makes it more difficult for getCharacterMetrics() to
17108 // distinguish Unicode characters without metrics and those for
17109 // which we want to simulate the letter M.
17110
17111
17112 symbol = {
17113 type: "textord",
17114 mode: "text",
17115 loc: SourceLocation.range(nucleus),
17116 text: text
17117 };
17118 } else {
17119 return null; // EOF, ^, _, {, }, etc.
17120 }
17121
17122 this.consume(); // Transform combining characters into accents
17123
17124 if (match) {
17125 for (var i = 0; i < match[0].length; i++) {
17126 var accent = match[0][i];
17127
17128 if (!unicodeAccents[accent]) {
17129 throw new src_ParseError("Unknown accent ' " + accent + "'", nucleus);
17130 }
17131
17132 var command = unicodeAccents[accent][this.mode];
17133
17134 if (!command) {
17135 throw new src_ParseError("Accent " + accent + " unsupported in " + this.mode + " mode", nucleus);
17136 }
17137
17138 symbol = {
17139 type: "accent",
17140 mode: this.mode,
17141 loc: SourceLocation.range(nucleus),
17142 label: command,
17143 isStretchy: false,
17144 isShifty: true,
17145 base: symbol
17146 };
17147 }
17148 }
17149
17150 return symbol;
17151 };
17152
17153 return Parser;
17154 }();
17155
17156 Parser_Parser.endOfExpression = ["}", "\\endgroup", "\\end", "\\right", "&"];
17157 Parser_Parser.endOfGroup = {
17158 "[": "]",
17159 "{": "}",
17160 "\\begingroup": "\\endgroup"
17161 /**
17162 * Parses an "expression", which is a list of atoms.
17163 *
17164 * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This
17165 * happens when functions have higher precendence han infix
17166 * nodes in implicit parses.
17167 *
17168 * `breakOnTokenText`: The text of the token that the expression should end
17169 * with, or `null` if something else should end the
17170 * expression.
17171 */
17172
17173 };
17174 Parser_Parser.SUPSUB_GREEDINESS = 1;
17175
17176 // CONCATENATED MODULE: ./src/parseTree.js
17177 /**
17178 * Provides a single function for parsing an expression using a Parser
17179 * TODO(emily): Remove this
17180 */
17181
17182
17183
17184 /**
17185 * Parses an expression using a Parser, then returns the parsed result.
17186 */
17187 var parseTree_parseTree = function parseTree(toParse, settings) {
17188 if (!(typeof toParse === 'string' || toParse instanceof String)) {
17189 throw new TypeError('KaTeX can only parse string typed expression');
17190 }
17191
17192 var parser = new Parser_Parser(toParse, settings); // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors
17193
17194 delete parser.gullet.macros.current["\\df@tag"];
17195 var tree = parser.parse(); // If the input used \tag, it will set the \df@tag macro to the tag.
17196 // In this case, we separately parse the tag and wrap the tree.
17197
17198 if (parser.gullet.macros.get("\\df@tag")) {
17199 if (!settings.displayMode) {
17200 throw new src_ParseError("\\tag works only in display equations");
17201 }
17202
17203 parser.gullet.feed("\\df@tag");
17204 tree = [{
17205 type: "tag",
17206 mode: "text",
17207 body: tree,
17208 tag: parser.parse()
17209 }];
17210 }
17211
17212 return tree;
17213 };
17214
17215 /* harmony default export */ var src_parseTree = (parseTree_parseTree);
17216 // CONCATENATED MODULE: ./katex.js
17217 /* eslint no-console:0 */
17218
17219 /**
17220 * This is the main entry point for KaTeX. Here, we expose functions for
17221 * rendering expressions either to DOM nodes or to markup strings.
17222 *
17223 * We also expose the ParseError class to check if errors thrown from KaTeX are
17224 * errors in the expression, or errors in javascript handling.
17225 */
17226
17227
17228
17229
17230
17231
17232
17233
17234
17235
17236 /**
17237 * Parse and build an expression, and place that expression in the DOM node
17238 * given.
17239 */
17240 var katex_render = function render(expression, baseNode, options) {
17241 baseNode.textContent = "";
17242 var node = katex_renderToDomTree(expression, options).toNode();
17243 baseNode.appendChild(node);
17244 }; // KaTeX's styles don't work properly in quirks mode. Print out an error, and
17245 // disable rendering.
17246
17247
17248 if (typeof document !== "undefined") {
17249 if (document.compatMode !== "CSS1Compat") {
17250 typeof console !== "undefined" && console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your " + "website has a suitable doctype.");
17251
17252 katex_render = function render() {
17253 throw new src_ParseError("KaTeX doesn't work in quirks mode.");
17254 };
17255 }
17256 }
17257 /**
17258 * Parse and build an expression, and return the markup for that.
17259 */
17260
17261
17262 var renderToString = function renderToString(expression, options) {
17263 var markup = katex_renderToDomTree(expression, options).toMarkup();
17264 return markup;
17265 };
17266 /**
17267 * Parse an expression and return the parse tree.
17268 */
17269
17270
17271 var katex_generateParseTree = function generateParseTree(expression, options) {
17272 var settings = new Settings_Settings(options);
17273 return src_parseTree(expression, settings);
17274 };
17275 /**
17276 * If the given error is a KaTeX ParseError and options.throwOnError is false,
17277 * renders the invalid LaTeX as a span with hover title giving the KaTeX
17278 * error message. Otherwise, simply throws the error.
17279 */
17280
17281
17282 var katex_renderError = function renderError(error, expression, options) {
17283 if (options.throwOnError || !(error instanceof src_ParseError)) {
17284 throw error;
17285 }
17286
17287 var node = buildCommon.makeSpan(["katex-error"], [new domTree_SymbolNode(expression)]);
17288 node.setAttribute("title", error.toString());
17289 node.setAttribute("style", "color:" + options.errorColor);
17290 return node;
17291 };
17292 /**
17293 * Generates and returns the katex build tree. This is used for advanced
17294 * use cases (like rendering to custom output).
17295 */
17296
17297
17298 var katex_renderToDomTree = function renderToDomTree(expression, options) {
17299 var settings = new Settings_Settings(options);
17300
17301 try {
17302 var tree = src_parseTree(expression, settings);
17303 return buildTree_buildTree(tree, expression, settings);
17304 } catch (error) {
17305 return katex_renderError(error, expression, settings);
17306 }
17307 };
17308 /**
17309 * Generates and returns the katex build tree, with just HTML (no MathML).
17310 * This is used for advanced use cases (like rendering to custom output).
17311 */
17312
17313
17314 var katex_renderToHTMLTree = function renderToHTMLTree(expression, options) {
17315 var settings = new Settings_Settings(options);
17316
17317 try {
17318 var tree = src_parseTree(expression, settings);
17319 return buildTree_buildHTMLTree(tree, expression, settings);
17320 } catch (error) {
17321 return katex_renderError(error, expression, settings);
17322 }
17323 };
17324
17325 /* harmony default export */ var katex_0 = ({
17326 /**
17327 * Current KaTeX version
17328 */
17329 version: "0.11.1",
17330
17331 /**
17332 * Renders the given LaTeX into an HTML+MathML combination, and adds
17333 * it as a child to the specified DOM node.
17334 */
17335 render: katex_render,
17336
17337 /**
17338 * Renders the given LaTeX into an HTML+MathML combination string,
17339 * for sending to the client.
17340 */
17341 renderToString: renderToString,
17342
17343 /**
17344 * KaTeX error, usually during parsing.
17345 */
17346 ParseError: src_ParseError,
17347
17348 /**
17349 * Parses the given LaTeX into KaTeX's internal parse tree structure,
17350 * without rendering to HTML or MathML.
17351 *
17352 * NOTE: This method is not currently recommended for public use.
17353 * The internal tree representation is unstable and is very likely
17354 * to change. Use at your own risk.
17355 */
17356 __parse: katex_generateParseTree,
17357
17358 /**
17359 * Renders the given LaTeX into an HTML+MathML internal DOM tree
17360 * representation, without flattening that representation to a string.
17361 *
17362 * NOTE: This method is not currently recommended for public use.
17363 * The internal tree representation is unstable and is very likely
17364 * to change. Use at your own risk.
17365 */
17366 __renderToDomTree: katex_renderToDomTree,
17367
17368 /**
17369 * Renders the given LaTeX into an HTML internal DOM tree representation,
17370 * without MathML and without flattening that representation to a string.
17371 *
17372 * NOTE: This method is not currently recommended for public use.
17373 * The internal tree representation is unstable and is very likely
17374 * to change. Use at your own risk.
17375 */
17376 __renderToHTMLTree: katex_renderToHTMLTree,
17377
17378 /**
17379 * extends internal font metrics object with a new object
17380 * each key in the new object represents a font name
17381 */
17382 __setFontMetrics: setFontMetrics,
17383
17384 /**
17385 * adds a new symbol to builtin symbols table
17386 */
17387 __defineSymbol: defineSymbol,
17388
17389 /**
17390 * adds a new macro to builtin macro list
17391 */
17392 __defineMacro: defineMacro,
17393
17394 /**
17395 * Expose the dom tree node types, which can be useful for type checking nodes.
17396 *
17397 * NOTE: This method is not currently recommended for public use.
17398 * The internal tree representation is unstable and is very likely
17399 * to change. Use at your own risk.
17400 */
17401 __domTree: {
17402 Span: domTree_Span,
17403 Anchor: domTree_Anchor,
17404 SymbolNode: domTree_SymbolNode,
17405 SvgNode: SvgNode,
17406 PathNode: domTree_PathNode,
17407 LineNode: LineNode
17408 }
17409 });
17410 // CONCATENATED MODULE: ./katex.webpack.js
17411 /**
17412 * This is the webpack entry point for KaTeX. As ECMAScript, flow[1] and jest[2]
17413 * doesn't support CSS modules natively, a separate entry point is used and
17414 * it is not flowtyped.
17415 *
17416 * [1] https://gist.github.com/lambdahands/d19e0da96285b749f0ef
17417 * [2] https://facebook.github.io/jest/docs/en/webpack.html
17418 */
17419
17420
17421 /* harmony default export */ var katex_webpack = __webpack_exports__["default"] = (katex_0);
17422
17423 /***/ })
17424 /******/ ])["default"];
17425 });