jekyll-theme-hydejack 8.3.2 → 8.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +26 -27
  3. data/_includes/body/footer.html +1 -1
  4. data/_includes/head/links.html +1 -1
  5. data/_includes/head/meta.html +5 -1
  6. data/_includes/head/styles.html +1 -1
  7. data/_includes/header.txt +1 -1
  8. data/_includes/scripts.html +33 -0
  9. data/_layouts/compress.html +1 -1
  10. data/assets/bower_components/katex/.bower.json +6 -6
  11. data/assets/bower_components/katex/bower.json +1 -1
  12. data/assets/bower_components/katex/dist/contrib/auto-render.js +4 -0
  13. data/assets/bower_components/katex/dist/contrib/auto-render.min.js +1 -1
  14. data/assets/bower_components/katex/dist/contrib/auto-render.mjs +215 -0
  15. data/assets/bower_components/katex/dist/contrib/copy-tex.js +9 -4
  16. data/assets/bower_components/katex/dist/contrib/copy-tex.min.css +1 -1
  17. data/assets/bower_components/katex/dist/contrib/copy-tex.min.js +1 -1
  18. data/assets/bower_components/katex/dist/contrib/copy-tex.mjs +85 -0
  19. data/assets/bower_components/katex/dist/contrib/mathtex-script-type.min.js +1 -1
  20. data/assets/bower_components/katex/dist/contrib/mathtex-script-type.mjs +24 -0
  21. data/assets/bower_components/katex/dist/contrib/mhchem.js +3241 -0
  22. data/assets/bower_components/katex/dist/contrib/mhchem.min.js +1 -0
  23. data/assets/bower_components/katex/dist/contrib/mhchem.mjs +3109 -0
  24. data/assets/bower_components/katex/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
  25. data/assets/bower_components/katex/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
  26. data/assets/bower_components/katex/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  27. data/assets/bower_components/katex/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  28. data/assets/bower_components/katex/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  29. data/assets/bower_components/katex/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  30. data/assets/bower_components/katex/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  31. data/assets/bower_components/katex/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  32. data/assets/bower_components/katex/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  33. data/assets/bower_components/katex/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  34. data/assets/bower_components/katex/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  35. data/assets/bower_components/katex/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  36. data/assets/bower_components/katex/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  37. data/assets/bower_components/katex/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  38. data/assets/bower_components/katex/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  39. data/assets/bower_components/katex/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
  40. data/assets/bower_components/katex/dist/fonts/KaTeX_Main-Bold.woff +0 -0
  41. data/assets/bower_components/katex/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
  42. data/assets/bower_components/katex/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  43. data/assets/bower_components/katex/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  44. data/assets/bower_components/katex/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  45. data/assets/bower_components/katex/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
  46. data/assets/bower_components/katex/dist/fonts/KaTeX_Main-Italic.woff +0 -0
  47. data/assets/bower_components/katex/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
  48. data/assets/bower_components/katex/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
  49. data/assets/bower_components/katex/dist/fonts/KaTeX_Main-Regular.woff +0 -0
  50. data/assets/bower_components/katex/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
  51. data/assets/bower_components/katex/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  52. data/assets/bower_components/katex/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  53. data/assets/bower_components/katex/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  54. data/assets/bower_components/katex/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
  55. data/assets/bower_components/katex/dist/fonts/KaTeX_Math-Italic.woff +0 -0
  56. data/assets/bower_components/katex/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
  57. data/assets/bower_components/katex/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  58. data/assets/bower_components/katex/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  59. data/assets/bower_components/katex/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  60. data/assets/bower_components/katex/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  61. data/assets/bower_components/katex/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  62. data/assets/bower_components/katex/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  63. data/assets/bower_components/katex/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  64. data/assets/bower_components/katex/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  65. data/assets/bower_components/katex/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  66. data/assets/bower_components/katex/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
  67. data/assets/bower_components/katex/dist/fonts/KaTeX_Script-Regular.woff +0 -0
  68. data/assets/bower_components/katex/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
  69. data/assets/bower_components/katex/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
  70. data/assets/bower_components/katex/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
  71. data/assets/bower_components/katex/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  72. data/assets/bower_components/katex/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
  73. data/assets/bower_components/katex/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
  74. data/assets/bower_components/katex/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  75. data/assets/bower_components/katex/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
  76. data/assets/bower_components/katex/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
  77. data/assets/bower_components/katex/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  78. data/assets/bower_components/katex/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
  79. data/assets/bower_components/katex/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
  80. data/assets/bower_components/katex/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  81. data/assets/bower_components/katex/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  82. data/assets/bower_components/katex/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  83. data/assets/bower_components/katex/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  84. data/assets/bower_components/katex/dist/katex.css +8 -4
  85. data/assets/bower_components/katex/dist/katex.js +470 -414
  86. data/assets/bower_components/katex/dist/katex.min.css +1 -1
  87. data/assets/bower_components/katex/dist/katex.min.js +1 -1
  88. data/assets/bower_components/katex/dist/katex.mjs +495 -456
  89. data/assets/bower_components/katex/yarn.lock +3091 -2622
  90. data/assets/css/{hydejack-8.3.2.css → hydejack-7.5.2.css} +0 -0
  91. data/assets/css/hydejack-8.4.0.css +3 -0
  92. data/assets/js/hydejack-8.4.0.js +47 -0
  93. data/assets/version.json +1 -1
  94. metadata +12 -5
  95. data/assets/bower_components/katex/dist/README.md +0 -90
  96. data/assets/bower_components/katex/lint_blacklist.txt +0 -5
@@ -967,10 +967,7 @@
967
967
  .katex .boxpad {
968
968
  padding: 0 0.3em 0 0.3em;
969
969
  }
970
- .katex .fbox {
971
- box-sizing: border-box;
972
- border: 0.04em solid black;
973
- }
970
+ .katex .fbox,
974
971
  .katex .fcolorbox {
975
972
  box-sizing: border-box;
976
973
  border: 0.04em solid;
@@ -1004,4 +1001,11 @@
1004
1001
  position: absolute;
1005
1002
  right: 0;
1006
1003
  }
1004
+ .katex-display.leqno > .katex > .katex-html > .tag {
1005
+ left: 0;
1006
+ right: auto;
1007
+ }
1008
+ .katex-display.fleqn > .katex {
1009
+ text-align: left;
1010
+ }
1007
1011
 
@@ -91,7 +91,7 @@ return /******/ (function(modules) { // webpackBootstrap
91
91
  /******/
92
92
  /******/
93
93
  /******/ // Load entry module and return exports
94
- /******/ return __webpack_require__(__webpack_require__.s = 2);
94
+ /******/ return __webpack_require__(__webpack_require__.s = 1);
95
95
  /******/ })
96
96
  /************************************************************************/
97
97
  /******/ ([
@@ -101,8 +101,7 @@ return /******/ (function(modules) { // webpackBootstrap
101
101
  // extracted by mini-css-extract-plugin
102
102
 
103
103
  /***/ }),
104
- /* 1 */,
105
- /* 2 */
104
+ /* 1 */
106
105
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
107
106
 
108
107
  "use strict";
@@ -131,12 +130,6 @@ function () {
131
130
  this.start = start;
132
131
  this.end = end;
133
132
  }
134
-
135
- var _proto = SourceLocation.prototype;
136
-
137
- _proto.getSource = function getSource() {
138
- return this.lexer.input.slice(this.start, this.end);
139
- };
140
133
  /**
141
134
  * Merges two `SourceLocation`s from location providers, given they are
142
135
  * provided in order of appearance.
@@ -403,6 +396,8 @@ var Settings_Settings =
403
396
  function () {
404
397
  function Settings(options) {
405
398
  this.displayMode = void 0;
399
+ this.leqno = void 0;
400
+ this.fleqn = void 0;
406
401
  this.throwOnError = void 0;
407
402
  this.errorColor = void 0;
408
403
  this.macros = void 0;
@@ -414,6 +409,8 @@ function () {
414
409
  // allow null options
415
410
  options = options || {};
416
411
  this.displayMode = utils.deflt(options.displayMode, false);
412
+ this.leqno = utils.deflt(options.leqno, false);
413
+ this.fleqn = utils.deflt(options.fleqn, false);
417
414
  this.throwOnError = utils.deflt(options.throwOnError, true);
418
415
  this.errorColor = utils.deflt(options.errorColor, "#cc0000");
419
416
  this.macros = options.macros || {};
@@ -450,7 +447,7 @@ function () {
450
447
  // won't happen in type-safe code
451
448
  typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]"));
452
449
  }
453
- };
450
+ }
454
451
  /**
455
452
  * Check whether to apply strict (LaTeX-adhering) behavior for unusual
456
453
  * input (like `\\`). Unlike `nonstrict`, will not throw an error;
@@ -459,7 +456,7 @@ function () {
459
456
  * "warn" prints a warning and returns `false`.
460
457
  * This is for the second category of `errorCode`s listed in the README.
461
458
  */
462
-
459
+ ;
463
460
 
464
461
  _proto.useStrictBehavior = function useStrictBehavior(errorCode, errorMsg, token) {
465
462
  var strict = this.strict;
@@ -527,54 +524,54 @@ function () {
527
524
 
528
525
  _proto.sup = function sup() {
529
526
  return Style_styles[_sup[this.id]];
530
- };
527
+ }
531
528
  /**
532
529
  * Get the style of a subscript given a base in the current style.
533
530
  */
534
-
531
+ ;
535
532
 
536
533
  _proto.sub = function sub() {
537
534
  return Style_styles[_sub[this.id]];
538
- };
535
+ }
539
536
  /**
540
537
  * Get the style of a fraction numerator given the fraction in the current
541
538
  * style.
542
539
  */
543
-
540
+ ;
544
541
 
545
542
  _proto.fracNum = function fracNum() {
546
543
  return Style_styles[_fracNum[this.id]];
547
- };
544
+ }
548
545
  /**
549
546
  * Get the style of a fraction denominator given the fraction in the current
550
547
  * style.
551
548
  */
552
-
549
+ ;
553
550
 
554
551
  _proto.fracDen = function fracDen() {
555
552
  return Style_styles[_fracDen[this.id]];
556
- };
553
+ }
557
554
  /**
558
555
  * Get the cramped version of a style (in particular, cramping a cramped style
559
556
  * doesn't change the style).
560
557
  */
561
-
558
+ ;
562
559
 
563
560
  _proto.cramp = function cramp() {
564
561
  return Style_styles[_cramp[this.id]];
565
- };
562
+ }
566
563
  /**
567
564
  * Get a text or display version of this style.
568
565
  */
569
-
566
+ ;
570
567
 
571
568
  _proto.text = function text() {
572
569
  return Style_styles[_text[this.id]];
573
- };
570
+ }
574
571
  /**
575
572
  * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle)
576
573
  */
577
-
574
+ ;
578
575
 
579
576
  _proto.isTight = function isTight() {
580
577
  return this.size >= 2;
@@ -810,7 +807,7 @@ var svgGeometry_path = {
810
807
  // The next ten paths support reaction arrows from the mhchem package.
811
808
  // Arrows for \ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX
812
809
  // baraboveleftarrow is mostly from from glyph U+2190 in font KaTeX Main
813
- 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 241v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",
810
+ 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",
814
811
  // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main
815
812
  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",
816
813
  // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end.
@@ -855,9 +852,9 @@ function () {
855
852
 
856
853
  _proto.hasClass = function hasClass(className) {
857
854
  return utils.contains(this.classes, className);
858
- };
855
+ }
859
856
  /** Convert the fragment into a node. */
860
-
857
+ ;
861
858
 
862
859
  _proto.toNode = function toNode() {
863
860
  var frag = document.createDocumentFragment();
@@ -867,9 +864,9 @@ function () {
867
864
  }
868
865
 
869
866
  return frag;
870
- };
867
+ }
871
868
  /** Convert the fragment into HTML markup. */
872
-
869
+ ;
873
870
 
874
871
  _proto.toMarkup = function toMarkup() {
875
872
  var markup = ""; // Simply concatenate the markup for the children together.
@@ -879,12 +876,12 @@ function () {
879
876
  }
880
877
 
881
878
  return markup;
882
- };
879
+ }
883
880
  /**
884
881
  * Converts the math node into a string, similar to innerText. Applies to
885
882
  * MathDomNode's only.
886
883
  */
887
-
884
+ ;
888
885
 
889
886
  _proto.toText = function toText() {
890
887
  // To avoid this, we would subclass documentFragment separately for
@@ -1176,12 +1173,12 @@ function () {
1176
1173
 
1177
1174
  _proto3.hasClass = function hasClass(className) {
1178
1175
  return utils.contains(this.classes, className);
1179
- };
1176
+ }
1180
1177
  /**
1181
1178
  * Creates a text node or span from a symbol node. Note that a span is only
1182
1179
  * created if it is needed.
1183
1180
  */
1184
-
1181
+ ;
1185
1182
 
1186
1183
  _proto3.toNode = function toNode() {
1187
1184
  var node = document.createTextNode(this.text);
@@ -1211,11 +1208,11 @@ function () {
1211
1208
  } else {
1212
1209
  return node;
1213
1210
  }
1214
- };
1211
+ }
1215
1212
  /**
1216
1213
  * Creates markup for a symbol node.
1217
1214
  */
1218
-
1215
+ ;
1219
1216
 
1220
1217
  _proto3.toMarkup = function toMarkup() {
1221
1218
  // TODO(alpert): More duplication than I'd like from
@@ -1913,7 +1910,6 @@ function assertSpan(group) {
1913
1910
  "730": [0, 0.69444, 0, 0, 0.86944],
1914
1911
  "732": [0, 0.69444, 0, 0, 0.575],
1915
1912
  "733": [0, 0.69444, 0, 0, 0.575],
1916
- "824": [0.19444, 0.69444, 0, 0, 0],
1917
1913
  "915": [0, 0.68611, 0, 0, 0.69166],
1918
1914
  "916": [0, 0.68611, 0, 0, 0.95833],
1919
1915
  "920": [0, 0.68611, 0, 0, 0.89444],
@@ -2041,7 +2037,8 @@ function assertSpan(group) {
2041
2037
  "10217": [0.25, 0.75, 0, 0, 0.44722],
2042
2038
  "10815": [0, 0.68611, 0, 0, 0.9],
2043
2039
  "10927": [0.19667, 0.69667, 0, 0, 0.89444],
2044
- "10928": [0.19667, 0.69667, 0, 0, 0.89444]
2040
+ "10928": [0.19667, 0.69667, 0, 0, 0.89444],
2041
+ "57376": [0.19444, 0.69444, 0, 0, 0]
2045
2042
  },
2046
2043
  "Main-BoldItalic": {
2047
2044
  "33": [0, 0.69444, 0.11417, 0, 0.38611],
@@ -2424,7 +2421,6 @@ function assertSpan(group) {
2424
2421
  "730": [0, 0.69444, 0, 0, 0.75],
2425
2422
  "732": [0, 0.66786, 0, 0, 0.5],
2426
2423
  "733": [0, 0.69444, 0, 0, 0.5],
2427
- "824": [0.19444, 0.69444, 0, 0, 0],
2428
2424
  "915": [0, 0.68333, 0, 0, 0.625],
2429
2425
  "916": [0, 0.68333, 0, 0, 0.83334],
2430
2426
  "920": [0, 0.68333, 0, 0, 0.77778],
@@ -2509,7 +2505,6 @@ function assertSpan(group) {
2509
2505
  "8776": [-0.01688, 0.48312, 0, 0, 0.77778],
2510
2506
  "8781": [-0.03625, 0.46375, 0, 0, 0.77778],
2511
2507
  "8784": [-0.133, 0.67, 0, 0, 0.778],
2512
- "8800": [0.215, 0.716, 0, 0, 0.778],
2513
2508
  "8801": [-0.03625, 0.46375, 0, 0, 0.77778],
2514
2509
  "8804": [0.13597, 0.63597, 0, 0, 0.77778],
2515
2510
  "8805": [0.13597, 0.63597, 0, 0, 0.77778],
@@ -2576,10 +2571,10 @@ function assertSpan(group) {
2576
2571
  "10236": [0.011, 0.511, 0, 0, 1.638],
2577
2572
  "10815": [0, 0.68333, 0, 0, 0.75],
2578
2573
  "10927": [0.13597, 0.63597, 0, 0, 0.77778],
2579
- "10928": [0.13597, 0.63597, 0, 0, 0.77778]
2574
+ "10928": [0.13597, 0.63597, 0, 0, 0.77778],
2575
+ "57376": [0.19444, 0.69444, 0, 0, 0]
2580
2576
  },
2581
2577
  "Math-BoldItalic": {
2582
- "47": [0.19444, 0.69444, 0, 0, 0],
2583
2578
  "65": [0, 0.68611, 0, 0, 0.86944],
2584
2579
  "66": [0, 0.68611, 0.04835, 0, 0.8664],
2585
2580
  "67": [0, 0.68611, 0.06979, 0, 0.81694],
@@ -2675,7 +2670,6 @@ function assertSpan(group) {
2675
2670
  "1013": [0, 0.44444, 0, 0, 0.48333]
2676
2671
  },
2677
2672
  "Math-Italic": {
2678
- "47": [0.19444, 0.69444, 0, 0, 0],
2679
2673
  "65": [0, 0.68333, 0, 0.13889, 0.75],
2680
2674
  "66": [0, 0.68333, 0.05017, 0.08334, 0.75851],
2681
2675
  "67": [0, 0.68333, 0.07153, 0.08334, 0.71472],
@@ -3820,7 +3814,7 @@ function getGlobalMetrics(size) {
3820
3814
  normal font), or "ams" (the ams fonts).
3821
3815
  * - group (required): the ParseNode group type the symbol should have (i.e.
3822
3816
  "textord", "mathord", etc).
3823
- See https://github.com/Khan/KaTeX/wiki/Examining-TeX#group-types
3817
+ See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types
3824
3818
  * - replace: the character that this symbol or function should be
3825
3819
  * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi
3826
3820
  * character in the main font).
@@ -4346,7 +4340,7 @@ defineSymbol(symbols_math, main, rel, "\u2265", "\\geq", true);
4346
4340
  defineSymbol(symbols_math, main, rel, "\u2190", "\\gets");
4347
4341
  defineSymbol(symbols_math, main, rel, ">", "\\gt");
4348
4342
  defineSymbol(symbols_math, main, rel, "\u2208", "\\in", true);
4349
- defineSymbol(symbols_math, main, rel, "\u0338", "\\@not");
4343
+ defineSymbol(symbols_math, main, rel, "\uE020", "\\@not");
4350
4344
  defineSymbol(symbols_math, main, rel, "\u2282", "\\subset", true);
4351
4345
  defineSymbol(symbols_math, main, rel, "\u2283", "\\supset", true);
4352
4346
  defineSymbol(symbols_math, main, rel, "\u2286", "\\subseteq", true);
@@ -4422,6 +4416,8 @@ defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\|");
4422
4416
  defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\Vert");
4423
4417
  defineSymbol(symbols_text, main, symbols_textord, "\u2225", "\\textbardbl");
4424
4418
  defineSymbol(symbols_text, main, symbols_textord, "~", "\\textasciitilde");
4419
+ defineSymbol(symbols_text, main, symbols_textord, "\\", "\\textbackslash");
4420
+ defineSymbol(symbols_text, main, symbols_textord, "^", "\\textasciicircum");
4425
4421
  defineSymbol(symbols_math, main, rel, "\u2191", "\\uparrow", true);
4426
4422
  defineSymbol(symbols_math, main, rel, "\u21D1", "\\Uparrow", true);
4427
4423
  defineSymbol(symbols_math, main, rel, "\u2193", "\\downarrow", true);
@@ -4564,13 +4560,32 @@ for (var symbols_i2 = 0; symbols_i2 < letters.length; symbols_i2++) {
4564
4560
 
4565
4561
  defineSymbol(symbols_math, main, mathord, _ch2, _ch2);
4566
4562
  defineSymbol(symbols_text, main, symbols_textord, _ch2, _ch2);
4567
- } // The next loop loads wide (surrogate pair) characters.
4563
+ } // Blackboard bold and script letters in Unicode range
4564
+
4565
+
4566
+ defineSymbol(symbols_math, ams, symbols_textord, "C", "\u2102"); // blackboard bold
4567
+
4568
+ defineSymbol(symbols_text, ams, symbols_textord, "C", "\u2102");
4569
+ defineSymbol(symbols_math, ams, symbols_textord, "H", "\u210D");
4570
+ defineSymbol(symbols_text, ams, symbols_textord, "H", "\u210D");
4571
+ defineSymbol(symbols_math, ams, symbols_textord, "N", "\u2115");
4572
+ defineSymbol(symbols_text, ams, symbols_textord, "N", "\u2115");
4573
+ defineSymbol(symbols_math, ams, symbols_textord, "P", "\u2119");
4574
+ defineSymbol(symbols_text, ams, symbols_textord, "P", "\u2119");
4575
+ defineSymbol(symbols_math, ams, symbols_textord, "Q", "\u211A");
4576
+ defineSymbol(symbols_text, ams, symbols_textord, "Q", "\u211A");
4577
+ defineSymbol(symbols_math, ams, symbols_textord, "R", "\u211D");
4578
+ defineSymbol(symbols_text, ams, symbols_textord, "R", "\u211D");
4579
+ defineSymbol(symbols_math, ams, symbols_textord, "Z", "\u2124");
4580
+ defineSymbol(symbols_text, ams, symbols_textord, "Z", "\u2124");
4581
+ defineSymbol(symbols_math, main, mathord, "h", "\u210E"); // italic h, Planck constant
4582
+
4583
+ defineSymbol(symbols_text, main, mathord, "h", "\u210E"); // The next loop loads wide (surrogate pair) characters.
4568
4584
  // We support some letters in the Unicode range U+1D400 to U+1D7FF,
4569
4585
  // Mathematical Alphanumeric Symbols.
4570
4586
  // Some editors do not deal well with wide characters. So don't write the
4571
4587
  // string into this file. Instead, create the string from the surrogate pair.
4572
4588
 
4573
-
4574
4589
  var symbols_wideChar = "";
4575
4590
 
4576
4591
  for (var _i3 = 0; _i3 < letters.length; _i3++) {
@@ -4858,12 +4873,12 @@ function () {
4858
4873
  }
4859
4874
 
4860
4875
  return new Options(data);
4861
- };
4876
+ }
4862
4877
  /**
4863
4878
  * Return an options object with the given style. If `this.style === style`,
4864
4879
  * returns `this`.
4865
4880
  */
4866
-
4881
+ ;
4867
4882
 
4868
4883
  _proto.havingStyle = function havingStyle(style) {
4869
4884
  if (this.style === style) {
@@ -4874,21 +4889,21 @@ function () {
4874
4889
  size: sizeAtStyle(this.textSize, style)
4875
4890
  });
4876
4891
  }
4877
- };
4892
+ }
4878
4893
  /**
4879
4894
  * Return an options object with a cramped version of the current style. If
4880
4895
  * the current style is cramped, returns `this`.
4881
4896
  */
4882
-
4897
+ ;
4883
4898
 
4884
4899
  _proto.havingCrampedStyle = function havingCrampedStyle() {
4885
4900
  return this.havingStyle(this.style.cramp());
4886
- };
4901
+ }
4887
4902
  /**
4888
4903
  * Return an options object with the given size and in at least `\textstyle`.
4889
4904
  * Returns `this` if appropriate.
4890
4905
  */
4891
-
4906
+ ;
4892
4907
 
4893
4908
  _proto.havingSize = function havingSize(size) {
4894
4909
  if (this.size === size && this.textSize === size) {
@@ -4901,12 +4916,12 @@ function () {
4901
4916
  sizeMultiplier: sizeMultipliers[size - 1]
4902
4917
  });
4903
4918
  }
4904
- };
4919
+ }
4905
4920
  /**
4906
4921
  * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted,
4907
4922
  * changes to at least `\textstyle`.
4908
4923
  */
4909
-
4924
+ ;
4910
4925
 
4911
4926
  _proto.havingBaseStyle = function havingBaseStyle(style) {
4912
4927
  style = style || this.style.text();
@@ -4920,12 +4935,12 @@ function () {
4920
4935
  size: wantSize
4921
4936
  });
4922
4937
  }
4923
- };
4938
+ }
4924
4939
  /**
4925
4940
  * Remove the effect of sizing changes such as \Huge.
4926
4941
  * Keep the effect of the current style, such as \scriptstyle.
4927
4942
  */
4928
-
4943
+ ;
4929
4944
 
4930
4945
  _proto.havingBaseSizing = function havingBaseSizing() {
4931
4946
  var size;
@@ -4952,76 +4967,76 @@ function () {
4952
4967
  style: this.style.text(),
4953
4968
  size: size
4954
4969
  });
4955
- };
4970
+ }
4956
4971
  /**
4957
4972
  * Create a new options object with the given color.
4958
4973
  */
4959
-
4974
+ ;
4960
4975
 
4961
4976
  _proto.withColor = function withColor(color) {
4962
4977
  return this.extend({
4963
4978
  color: color
4964
4979
  });
4965
- };
4980
+ }
4966
4981
  /**
4967
4982
  * Create a new options object with "phantom" set to true.
4968
4983
  */
4969
-
4984
+ ;
4970
4985
 
4971
4986
  _proto.withPhantom = function withPhantom() {
4972
4987
  return this.extend({
4973
4988
  phantom: true
4974
4989
  });
4975
- };
4990
+ }
4976
4991
  /**
4977
4992
  * Creates a new options object with the given math font or old text font.
4978
4993
  * @type {[type]}
4979
4994
  */
4980
-
4995
+ ;
4981
4996
 
4982
4997
  _proto.withFont = function withFont(font) {
4983
4998
  return this.extend({
4984
4999
  font: font
4985
5000
  });
4986
- };
5001
+ }
4987
5002
  /**
4988
5003
  * Create a new options objects with the given fontFamily.
4989
5004
  */
4990
-
5005
+ ;
4991
5006
 
4992
5007
  _proto.withTextFontFamily = function withTextFontFamily(fontFamily) {
4993
5008
  return this.extend({
4994
5009
  fontFamily: fontFamily,
4995
5010
  font: ""
4996
5011
  });
4997
- };
5012
+ }
4998
5013
  /**
4999
5014
  * Creates a new options object with the given font weight
5000
5015
  */
5001
-
5016
+ ;
5002
5017
 
5003
5018
  _proto.withTextFontWeight = function withTextFontWeight(fontWeight) {
5004
5019
  return this.extend({
5005
5020
  fontWeight: fontWeight,
5006
5021
  font: ""
5007
5022
  });
5008
- };
5023
+ }
5009
5024
  /**
5010
5025
  * Creates a new options object with the given font weight
5011
5026
  */
5012
-
5027
+ ;
5013
5028
 
5014
5029
  _proto.withTextFontShape = function withTextFontShape(fontShape) {
5015
5030
  return this.extend({
5016
5031
  fontShape: fontShape,
5017
5032
  font: ""
5018
5033
  });
5019
- };
5034
+ }
5020
5035
  /**
5021
5036
  * Return the CSS sizing classes required to switch from enclosing options
5022
5037
  * `oldOptions` to `this`. Returns an array of classes.
5023
5038
  */
5024
-
5039
+ ;
5025
5040
 
5026
5041
  _proto.sizingClasses = function sizingClasses(oldOptions) {
5027
5042
  if (oldOptions.size !== this.size) {
@@ -5029,12 +5044,12 @@ function () {
5029
5044
  } else {
5030
5045
  return [];
5031
5046
  }
5032
- };
5047
+ }
5033
5048
  /**
5034
5049
  * Return the CSS sizing classes required to switch to the base size. Like
5035
5050
  * `this.havingSize(BASESIZE).sizingClasses(this)`.
5036
5051
  */
5037
-
5052
+ ;
5038
5053
 
5039
5054
  _proto.baseSizingClasses = function baseSizingClasses() {
5040
5055
  if (this.size !== Options.BASESIZE) {
@@ -5042,11 +5057,11 @@ function () {
5042
5057
  } else {
5043
5058
  return [];
5044
5059
  }
5045
- };
5060
+ }
5046
5061
  /**
5047
5062
  * Return the font metrics for this size.
5048
5063
  */
5049
-
5064
+ ;
5050
5065
 
5051
5066
  _proto.fontMetrics = function fontMetrics() {
5052
5067
  if (!this._fontMetrics) {
@@ -5054,12 +5069,12 @@ function () {
5054
5069
  }
5055
5070
 
5056
5071
  return this._fontMetrics;
5057
- };
5072
+ }
5058
5073
  /**
5059
5074
  * A map of color names to CSS colors.
5060
5075
  * TODO(emily): Remove this when we have real macros
5061
5076
  */
5062
-
5077
+ ;
5063
5078
 
5064
5079
  /**
5065
5080
  * Gets the CSS color of the current options object, accounting for the
@@ -6270,25 +6285,8 @@ var buildHTML_makeSpan = buildCommon.makeSpan; // Binary atoms (first class `mbi
6270
6285
  // depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6,
6271
6286
  // and the text before Rule 19.
6272
6287
 
6273
- var buildHTML_isBinLeftCanceller = function isBinLeftCanceller(node, isRealGroup) {
6274
- // TODO: This code assumes that a node's math class is the first element
6275
- // of its `classes` array. A later cleanup should ensure this, for
6276
- // instance by changing the signature of `makeSpan`.
6277
- if (node) {
6278
- return utils.contains(["mbin", "mopen", "mrel", "mop", "mpunct"], getTypeOfDomTree(node, "right"));
6279
- } else {
6280
- return isRealGroup;
6281
- }
6282
- };
6283
-
6284
- var buildHTML_isBinRightCanceller = function isBinRightCanceller(node, isRealGroup) {
6285
- if (node) {
6286
- return utils.contains(["mrel", "mclose", "mpunct"], getTypeOfDomTree(node, "left"));
6287
- } else {
6288
- return isRealGroup;
6289
- }
6290
- };
6291
-
6288
+ var binLeftCanceller = ["leftmost", "mbin", "mopen", "mrel", "mop", "mpunct"];
6289
+ var binRightCanceller = ["rightmost", "mrel", "mclose", "mpunct"];
6292
6290
  var buildHTML_styleMap = {
6293
6291
  "display": src_Style.DISPLAY,
6294
6292
  "text": src_Style.TEXT,
@@ -6320,114 +6318,159 @@ var buildHTML_buildExpression = function buildExpression(expression, options, is
6320
6318
  }
6321
6319
 
6322
6320
  // Parse expressions into `groups`.
6323
- var rawGroups = [];
6321
+ var groups = [];
6324
6322
 
6325
6323
  for (var i = 0; i < expression.length; i++) {
6326
6324
  var output = buildHTML_buildGroup(expression[i], options);
6327
6325
 
6328
6326
  if (output instanceof tree_DocumentFragment) {
6329
6327
  var children = output.children;
6330
- rawGroups.push.apply(rawGroups, children);
6328
+ groups.push.apply(groups, children);
6331
6329
  } else {
6332
- rawGroups.push(output);
6330
+ groups.push(output);
6333
6331
  }
6334
- } // At this point `rawGroups` consists entirely of `symbolNode`s and `span`s.
6335
- // Ignore explicit spaces (e.g., \;, \,) when determining what implicit
6336
- // spacing should go between atoms of different classes, and add dummy
6337
- // spans for determining spacings between surrounding atoms.
6332
+ } // If `expression` is a partial group, let the parent handle spacings
6333
+ // to avoid processing groups multiple times.
6338
6334
 
6339
6335
 
6340
- var nonSpaces = [surrounding[0] ? buildHTML_makeSpan([surrounding[0]], [], options) : null].concat(rawGroups.filter(function (group) {
6341
- return group && group.classes[0] !== "mspace";
6342
- }), [surrounding[1] ? buildHTML_makeSpan([surrounding[1]], [], options) : null]); // Before determining what spaces to insert, perform bin cancellation.
6343
- // Binary operators change to ordinary symbols in some contexts.
6336
+ if (!isRealGroup) {
6337
+ return groups;
6338
+ }
6339
+
6340
+ var glueOptions = options;
6344
6341
 
6345
- for (var _i = 1; _i < nonSpaces.length - 1; _i++) {
6346
- var nonSpacesI = assert(nonSpaces[_i]);
6347
- var left = buildHTML_getOutermostNode(nonSpacesI, "left");
6342
+ if (expression.length === 1) {
6343
+ var node = checkNodeType(expression[0], "sizing") || checkNodeType(expression[0], "styling");
6348
6344
 
6349
- if (left.classes[0] === "mbin" && buildHTML_isBinLeftCanceller(nonSpaces[_i - 1], isRealGroup)) {
6350
- left.classes[0] = "mord";
6345
+ if (!node) {// No match.
6346
+ } else if (node.type === "sizing") {
6347
+ glueOptions = options.havingSize(node.size);
6348
+ } else if (node.type === "styling") {
6349
+ glueOptions = options.havingStyle(buildHTML_styleMap[node.style]);
6351
6350
  }
6351
+ } // Dummy spans for determining spacings between surrounding atoms.
6352
+ // If `expression` has no atoms on the left or right, class "leftmost"
6353
+ // or "rightmost", respectively, is used to indicate it.
6354
+
6355
+
6356
+ var dummyPrev = buildHTML_makeSpan([surrounding[0] || "leftmost"], [], options);
6357
+ var dummyNext = buildHTML_makeSpan([surrounding[1] || "rightmost"], [], options); // TODO: These code assumes that a node's math class is the first element
6358
+ // of its `classes` array. A later cleanup should ensure this, for
6359
+ // instance by changing the signature of `makeSpan`.
6360
+ // Before determining what spaces to insert, perform bin cancellation.
6361
+ // Binary operators change to ordinary symbols in some contexts.
6352
6362
 
6353
- var right = buildHTML_getOutermostNode(nonSpacesI, "right");
6363
+ traverseNonSpaceNodes(groups, function (node, prev) {
6364
+ var prevType = prev.classes[0];
6365
+ var type = node.classes[0];
6354
6366
 
6355
- if (right.classes[0] === "mbin" && buildHTML_isBinRightCanceller(nonSpaces[_i + 1], isRealGroup)) {
6356
- right.classes[0] = "mord";
6367
+ if (prevType === "mbin" && utils.contains(binRightCanceller, type)) {
6368
+ prev.classes[0] = "mord";
6369
+ } else if (type === "mbin" && utils.contains(binLeftCanceller, prevType)) {
6370
+ node.classes[0] = "mord";
6357
6371
  }
6358
- }
6372
+ }, {
6373
+ node: dummyPrev
6374
+ }, dummyNext);
6375
+ traverseNonSpaceNodes(groups, function (node, prev) {
6376
+ var prevType = getTypeOfDomTree(prev);
6377
+ var type = getTypeOfDomTree(node); // 'mtight' indicates that the node is script or scriptscript style.
6359
6378
 
6360
- var groups = [];
6361
- var j = 0;
6379
+ var space = prevType && type ? node.hasClass("mtight") ? tightSpacings[prevType][type] : spacings[prevType][type] : null;
6362
6380
 
6363
- for (var _i2 = 0; _i2 < rawGroups.length; _i2++) {
6364
- groups.push(rawGroups[_i2]); // For any group that is not a space, get the next non-space. Then
6365
- // lookup what implicit space should be placed between those atoms and
6366
- // add it to groups.
6381
+ if (space) {
6382
+ // Insert glue (spacing) after the `prev`.
6383
+ return buildCommon.makeGlue(space, glueOptions);
6384
+ }
6385
+ }, {
6386
+ node: dummyPrev
6387
+ }, dummyNext);
6388
+ return groups;
6389
+ }; // Depth-first traverse non-space `nodes`, calling `callback` with the current and
6390
+ // previous node as arguments, optionally returning a node to insert after the
6391
+ // previous node. `prev` is an object with the previous node and `insertAfter`
6392
+ // function to insert after it. `next` is a node that will be added to the right.
6393
+ // Used for bin cancellation and inserting spacings.
6394
+
6395
+ var traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next) {
6396
+ if (next) {
6397
+ // temporarily append the right node, if exists
6398
+ nodes.push(next);
6399
+ }
6367
6400
 
6368
- if (rawGroups[_i2].classes[0] !== "mspace" && j < nonSpaces.length - 1) {
6369
- // if current non-space node is left dummy span, add a glue before
6370
- // first real non-space node
6371
- if (j === 0) {
6372
- groups.pop();
6373
- _i2--;
6374
- } // Get the type of the current non-space node. If it's a document
6375
- // fragment, get the type of the rightmost node in the fragment.
6401
+ var i = 0;
6376
6402
 
6403
+ for (; i < nodes.length; i++) {
6404
+ var node = nodes[i];
6405
+ var partialGroup = buildHTML_checkPartialGroup(node);
6377
6406
 
6378
- var _left = getTypeOfDomTree(nonSpaces[j], "right"); // Get the type of the next non-space node. If it's a document
6379
- // fragment, get the type of the leftmost node in the fragment.
6407
+ if (partialGroup) {
6408
+ // Recursive DFS
6409
+ traverseNonSpaceNodes(partialGroup.children, callback, prev);
6410
+ continue;
6411
+ } // Ignore explicit spaces (e.g., \;, \,) when determining what implicit
6412
+ // spacing should go between atoms of different classes
6380
6413
 
6381
6414
 
6382
- var _right = getTypeOfDomTree(nonSpaces[j + 1], "left"); // We use buildExpression inside of sizingGroup, but it returns a
6383
- // document fragment of elements. sizingGroup sets `isRealGroup`
6384
- // to false to avoid processing spans multiple times.
6415
+ if (node.classes[0] === "mspace") {
6416
+ continue;
6417
+ }
6385
6418
 
6419
+ var result = callback(node, prev.node);
6386
6420
 
6387
- if (_left && _right && isRealGroup) {
6388
- var nonSpacesJp1 = assert(nonSpaces[j + 1]);
6389
- var space = isLeftTight(nonSpacesJp1) ? tightSpacings[_left][_right] : spacings[_left][_right];
6421
+ if (result) {
6422
+ if (prev.insertAfter) {
6423
+ prev.insertAfter(result);
6424
+ } else {
6425
+ // insert at front
6426
+ nodes.unshift(result);
6427
+ i++;
6428
+ }
6429
+ }
6390
6430
 
6391
- if (space) {
6392
- var glueOptions = options;
6431
+ prev.node = node;
6393
6432
 
6394
- if (expression.length === 1) {
6395
- var node = checkNodeType(expression[0], "sizing") || checkNodeType(expression[0], "styling");
6433
+ prev.insertAfter = function (index) {
6434
+ return function (n) {
6435
+ nodes.splice(index + 1, 0, n);
6436
+ i++;
6437
+ };
6438
+ }(i);
6439
+ }
6396
6440
 
6397
- if (!node) {// No match.
6398
- } else if (node.type === "sizing") {
6399
- glueOptions = options.havingSize(node.size);
6400
- } else if (node.type === "styling") {
6401
- glueOptions = options.havingStyle(buildHTML_styleMap[node.style]);
6402
- }
6403
- }
6441
+ if (next) {
6442
+ nodes.pop();
6443
+ }
6444
+ }; // Check if given node is a partial group, i.e., does not affect spacing around.
6404
6445
 
6405
- groups.push(buildCommon.makeGlue(space, glueOptions));
6406
- }
6407
- }
6408
6446
 
6409
- j++;
6410
- }
6447
+ var buildHTML_checkPartialGroup = function checkPartialGroup(node) {
6448
+ if (node instanceof tree_DocumentFragment || node instanceof domTree_Anchor) {
6449
+ return node;
6411
6450
  }
6412
6451
 
6413
- return groups;
6452
+ return null;
6414
6453
  }; // Return the outermost node of a domTree.
6415
6454
 
6416
- var buildHTML_getOutermostNode = function getOutermostNode(node, side) {
6417
- if (node instanceof tree_DocumentFragment || node instanceof domTree_Anchor) {
6418
- var children = node.children;
6455
+
6456
+ var getOutermostNode = function getOutermostNode(node, side) {
6457
+ var partialGroup = buildHTML_checkPartialGroup(node);
6458
+
6459
+ if (partialGroup) {
6460
+ var children = partialGroup.children;
6419
6461
 
6420
6462
  if (children.length) {
6421
6463
  if (side === "right") {
6422
6464
  return getOutermostNode(children[children.length - 1], "right");
6423
6465
  } else if (side === "left") {
6424
- return getOutermostNode(children[0], "right");
6466
+ return getOutermostNode(children[0], "left");
6425
6467
  }
6426
6468
  }
6427
6469
  }
6428
6470
 
6429
6471
  return node;
6430
6472
  }; // Return math atom class (mclass) of a domTree.
6473
+ // If `side` is given, it will get the type of the outermost node at given side.
6431
6474
 
6432
6475
 
6433
6476
  var getTypeOfDomTree = function getTypeOfDomTree(node, side) {
@@ -6435,18 +6478,13 @@ var getTypeOfDomTree = function getTypeOfDomTree(node, side) {
6435
6478
  return null;
6436
6479
  }
6437
6480
 
6438
- node = buildHTML_getOutermostNode(node, side); // This makes a lot of assumptions as to where the type of atom
6481
+ if (side) {
6482
+ node = getOutermostNode(node, side);
6483
+ } // This makes a lot of assumptions as to where the type of atom
6439
6484
  // appears. We should do a better job of enforcing this.
6440
6485
 
6486
+
6441
6487
  return DomEnum[node.classes[0]] || null;
6442
- }; // If `node` is an atom return whether it's been assigned the mtight class.
6443
- // If `node` is a document fragment, return the value of isLeftTight() for the
6444
- // leftmost node in the fragment.
6445
- // 'mtight' indicates that the node is script or scriptscript style.
6446
-
6447
- var isLeftTight = function isLeftTight(node) {
6448
- node = buildHTML_getOutermostNode(node, "left");
6449
- return node.hasClass("mtight");
6450
6488
  };
6451
6489
  var makeNullDelimiter = function makeNullDelimiter(options, classes) {
6452
6490
  var moreClasses = ["nulldelimiter"].concat(options.baseSizingClasses());
@@ -6534,10 +6572,10 @@ function buildHTML(tree, options) {
6534
6572
 
6535
6573
  if (expression[i].hasClass("mbin") || expression[i].hasClass("mrel") || expression[i].hasClass("allowbreak")) {
6536
6574
  // Put any post-operator glue on same line as operator.
6537
- // Watch for \nobreak along the way.
6575
+ // Watch for \nobreak along the way, and stop at \newline.
6538
6576
  var nobreak = false;
6539
6577
 
6540
- while (i < expression.length - 1 && expression[i + 1].hasClass("mspace")) {
6578
+ while (i < expression.length - 1 && expression[i + 1].hasClass("mspace") && !expression[i + 1].hasClass("newline")) {
6541
6579
  i++;
6542
6580
  parts.push(expression[i]);
6543
6581
 
@@ -6632,19 +6670,19 @@ function () {
6632
6670
 
6633
6671
  _proto.setAttribute = function setAttribute(name, value) {
6634
6672
  this.attributes[name] = value;
6635
- };
6673
+ }
6636
6674
  /**
6637
6675
  * Gets an attribute on a MathML node.
6638
6676
  */
6639
-
6677
+ ;
6640
6678
 
6641
6679
  _proto.getAttribute = function getAttribute(name) {
6642
6680
  return this.attributes[name];
6643
- };
6681
+ }
6644
6682
  /**
6645
6683
  * Converts the math node into a MathML-namespaced DOM element.
6646
6684
  */
6647
-
6685
+ ;
6648
6686
 
6649
6687
  _proto.toNode = function toNode() {
6650
6688
  var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type);
@@ -6660,11 +6698,11 @@ function () {
6660
6698
  }
6661
6699
 
6662
6700
  return node;
6663
- };
6701
+ }
6664
6702
  /**
6665
6703
  * Converts the math node into an HTML markup string.
6666
6704
  */
6667
-
6705
+ ;
6668
6706
 
6669
6707
  _proto.toMarkup = function toMarkup() {
6670
6708
  var markup = "<" + this.type; // Add the attributes
@@ -6685,11 +6723,11 @@ function () {
6685
6723
 
6686
6724
  markup += "</" + this.type + ">";
6687
6725
  return markup;
6688
- };
6726
+ }
6689
6727
  /**
6690
6728
  * Converts the math node into a string, similar to innerText, but escaped.
6691
6729
  */
6692
-
6730
+ ;
6693
6731
 
6694
6732
  _proto.toText = function toText() {
6695
6733
  return this.children.map(function (child) {
@@ -6706,15 +6744,9 @@ function () {
6706
6744
  var mathMLTree_TextNode =
6707
6745
  /*#__PURE__*/
6708
6746
  function () {
6709
- function TextNode(text, needsEscape) {
6710
- if (needsEscape === void 0) {
6711
- needsEscape = true;
6712
- }
6713
-
6747
+ function TextNode(text) {
6714
6748
  this.text = void 0;
6715
- this.needsEscape = void 0;
6716
6749
  this.text = text;
6717
- this.needsEscape = needsEscape;
6718
6750
  }
6719
6751
  /**
6720
6752
  * Converts the text node into a DOM text node.
@@ -6724,25 +6756,25 @@ function () {
6724
6756
  var _proto2 = TextNode.prototype;
6725
6757
 
6726
6758
  _proto2.toNode = function toNode() {
6727
- return document.createTextNode(this.toText());
6728
- };
6759
+ return document.createTextNode(this.text);
6760
+ }
6729
6761
  /**
6730
6762
  * Converts the text node into escaped HTML markup
6731
6763
  * (representing the text itself).
6732
6764
  */
6733
-
6765
+ ;
6734
6766
 
6735
6767
  _proto2.toMarkup = function toMarkup() {
6736
- return this.toText();
6737
- };
6768
+ return utils.escape(this.toText());
6769
+ }
6738
6770
  /**
6739
- * Converts the text node into an escaped string
6771
+ * Converts the text node into a string
6740
6772
  * (representing the text iteself).
6741
6773
  */
6742
-
6774
+ ;
6743
6775
 
6744
6776
  _proto2.toText = function toText() {
6745
- return this.needsEscape ? utils.escape(this.text) : this.text;
6777
+ return this.text;
6746
6778
  };
6747
6779
 
6748
6780
  return TextNode;
@@ -6762,26 +6794,26 @@ function () {
6762
6794
  this.width = void 0;
6763
6795
  this.character = void 0;
6764
6796
  this.width = width; // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html
6765
- // for a table of space-like characters. We consistently use the
6766
- // &LongNames; because Unicode does not have single characters for
6767
- // &ThickSpace; (\u2005\u200a) and all negative spaces.
6797
+ // for a table of space-like characters. We use Unicode
6798
+ // representations instead of &LongNames; as it's not clear how to
6799
+ // make the latter via document.createTextNode.
6768
6800
 
6769
6801
  if (width >= 0.05555 && width <= 0.05556) {
6770
- this.character = "&VeryThinSpace;"; // \u200a
6802
+ this.character = "\u200A"; // &VeryThinSpace;
6771
6803
  } else if (width >= 0.1666 && width <= 0.1667) {
6772
- this.character = "&ThinSpace;"; // \u2009
6804
+ this.character = "\u2009"; // &ThinSpace;
6773
6805
  } else if (width >= 0.2222 && width <= 0.2223) {
6774
- this.character = "&MediumSpace;"; // \u2005
6806
+ this.character = "\u2005"; // &MediumSpace;
6775
6807
  } else if (width >= 0.2777 && width <= 0.2778) {
6776
- this.character = "&ThickSpace;"; // \u2005\u200a
6808
+ this.character = "\u2005\u200A"; // &ThickSpace;
6777
6809
  } else if (width >= -0.05556 && width <= -0.05555) {
6778
- this.character = "&NegativeVeryThinSpace;";
6810
+ this.character = "\u200A\u2063"; // &NegativeVeryThinSpace;
6779
6811
  } else if (width >= -0.1667 && width <= -0.1666) {
6780
- this.character = "&NegativeThinSpace;";
6812
+ this.character = "\u2009\u2063"; // &NegativeThinSpace;
6781
6813
  } else if (width >= -0.2223 && width <= -0.2222) {
6782
- this.character = "&NegativeMediumSpace;";
6814
+ this.character = "\u205F\u2063"; // &NegativeMediumSpace;
6783
6815
  } else if (width >= -0.2778 && width <= -0.2777) {
6784
- this.character = "&NegativeThickSpace;";
6816
+ this.character = "\u2005\u2063"; // &NegativeThickSpace;
6785
6817
  } else {
6786
6818
  this.character = null;
6787
6819
  }
@@ -6801,11 +6833,11 @@ function () {
6801
6833
  node.setAttribute("width", this.width + "em");
6802
6834
  return node;
6803
6835
  }
6804
- };
6836
+ }
6805
6837
  /**
6806
6838
  * Converts the math node into an HTML markup string.
6807
6839
  */
6808
-
6840
+ ;
6809
6841
 
6810
6842
  _proto3.toMarkup = function toMarkup() {
6811
6843
  if (this.character) {
@@ -6813,11 +6845,11 @@ function () {
6813
6845
  } else {
6814
6846
  return "<mspace width=\"" + this.width + "em\"/>";
6815
6847
  }
6816
- };
6848
+ }
6817
6849
  /**
6818
6850
  * Converts the math node into a string, similar to innerText.
6819
6851
  */
6820
-
6852
+ ;
6821
6853
 
6822
6854
  _proto3.toText = function toText() {
6823
6855
  if (this.character) {
@@ -7055,28 +7087,36 @@ var buildTree_optionsFromSettings = function optionsFromSettings(settings) {
7055
7087
  });
7056
7088
  };
7057
7089
 
7090
+ var buildTree_displayWrap = function displayWrap(node, settings) {
7091
+ if (settings.displayMode) {
7092
+ var classes = ["katex-display"];
7093
+
7094
+ if (settings.leqno) {
7095
+ classes.push("leqno");
7096
+ }
7097
+
7098
+ if (settings.fleqn) {
7099
+ classes.push("fleqn");
7100
+ }
7101
+
7102
+ node = buildCommon.makeSpan(classes, [node]);
7103
+ }
7104
+
7105
+ return node;
7106
+ };
7107
+
7058
7108
  var buildTree_buildTree = function buildTree(tree, expression, settings) {
7059
7109
  var options = buildTree_optionsFromSettings(settings);
7060
7110
  var mathMLNode = buildMathML(tree, expression, options);
7061
7111
  var htmlNode = buildHTML(tree, options);
7062
7112
  var katexNode = buildCommon.makeSpan(["katex"], [mathMLNode, htmlNode]);
7063
-
7064
- if (settings.displayMode) {
7065
- return buildCommon.makeSpan(["katex-display"], [katexNode]);
7066
- } else {
7067
- return katexNode;
7068
- }
7113
+ return buildTree_displayWrap(katexNode, settings);
7069
7114
  };
7070
7115
  var buildTree_buildHTMLTree = function buildHTMLTree(tree, expression, settings) {
7071
7116
  var options = buildTree_optionsFromSettings(settings);
7072
7117
  var htmlNode = buildHTML(tree, options);
7073
7118
  var katexNode = buildCommon.makeSpan(["katex"], [htmlNode]);
7074
-
7075
- if (settings.displayMode) {
7076
- return buildCommon.makeSpan(["katex-display"], [katexNode]);
7077
- } else {
7078
- return katexNode;
7079
- }
7119
+ return buildTree_displayWrap(katexNode, settings);
7080
7120
  };
7081
7121
  /* harmony default export */ var src_buildTree = (buildTree_buildTree);
7082
7122
  // CONCATENATED MODULE: ./src/stretchy.js
@@ -8867,7 +8907,7 @@ defineFunction({
8867
8907
  htmlBuilder: function htmlBuilder(group, options) {
8868
8908
  assertParsed(group); // Build the inner expression
8869
8909
 
8870
- var inner = buildHTML_buildExpression(group.body, options, true, [null, "mclose"]);
8910
+ var inner = buildHTML_buildExpression(group.body, options, true, ["mopen", "mclose"]);
8871
8911
  var innerHeight = 0;
8872
8912
  var innerDepth = 0;
8873
8913
  var hadMiddle = false; // Calculate its height and depth
@@ -10221,7 +10261,6 @@ defineFunction({
10221
10261
  funcName = _ref3.funcName,
10222
10262
  breakOnTokenText = _ref3.breakOnTokenText;
10223
10263
  var mode = parser.mode;
10224
- parser.consumeSpaces();
10225
10264
  var body = parser.parseExpression(true, breakOnTokenText);
10226
10265
  var style = "math" + funcName.slice(1);
10227
10266
  return {
@@ -10609,24 +10648,20 @@ defineFunction({
10609
10648
  var numer = args[4];
10610
10649
  var denom = args[5]; // Look into the parse nodes to get the desired delimiters.
10611
10650
 
10612
- var leftNode = checkNodeType(args[0], "ordgroup");
10651
+ var leftNode = checkNodeType(args[0], "atom");
10613
10652
 
10614
10653
  if (leftNode) {
10615
- leftNode = assertAtomFamily(leftNode.body[0], "open");
10616
- } else {
10617
10654
  leftNode = assertAtomFamily(args[0], "open");
10618
10655
  }
10619
10656
 
10620
- var leftDelim = delimFromValue(leftNode.text);
10621
- var rightNode = checkNodeType(args[1], "ordgroup");
10657
+ var leftDelim = leftNode ? delimFromValue(leftNode.text) : null;
10658
+ var rightNode = checkNodeType(args[1], "atom");
10622
10659
 
10623
10660
  if (rightNode) {
10624
- rightNode = assertAtomFamily(rightNode.body[0], "close");
10625
- } else {
10626
10661
  rightNode = assertAtomFamily(args[1], "close");
10627
10662
  }
10628
10663
 
10629
- var rightDelim = delimFromValue(rightNode.text);
10664
+ var rightDelim = rightNode ? delimFromValue(rightNode.text) : null;
10630
10665
  var barNode = assertNodeType(args[2], "size");
10631
10666
  var hasBarLine;
10632
10667
  var barSize = null;
@@ -11479,7 +11514,7 @@ var singleCharBigOps = {
11479
11514
  "\u22C0": "\\bigwedge",
11480
11515
  "\u22C1": "\\bigvee",
11481
11516
  "\u22C2": "\\bigcap",
11482
- "\u22C3": "\\bigcap",
11517
+ "\u22C3": "\\bigcup",
11483
11518
  "\u2A00": "\\bigodot",
11484
11519
  "\u2A01": "\\bigoplus",
11485
11520
  "\u2A02": "\\bigotimes",
@@ -11717,9 +11752,8 @@ defineFunction({
11717
11752
  // Write a single TextNode instead of multiple nested tags.
11718
11753
  var word = expression.map(function (node) {
11719
11754
  return node.toText();
11720
- }).join(""); // word has already been escaped by `node.toText()`
11721
-
11722
- expression = [new mathMLTree.TextNode(word, false)];
11755
+ }).join("");
11756
+ expression = [new mathMLTree.TextNode(word)];
11723
11757
  }
11724
11758
 
11725
11759
  var identifier = new mathMLTree.MathNode("mi", expression);
@@ -11738,6 +11772,10 @@ defineFunction({
11738
11772
  defineFunctionBuilders({
11739
11773
  type: "ordgroup",
11740
11774
  htmlBuilder: function htmlBuilder(group, options) {
11775
+ if (group.semisimple) {
11776
+ return buildCommon.makeFragment(buildHTML_buildExpression(group.body, options, false));
11777
+ }
11778
+
11741
11779
  return buildCommon.makeSpan(["mord"], buildHTML_buildExpression(group.body, options, true), options);
11742
11780
  },
11743
11781
  mathmlBuilder: function mathmlBuilder(group, options) {
@@ -11866,8 +11904,9 @@ defineFunction({
11866
11904
  type: "elem",
11867
11905
  elem: node
11868
11906
  }]
11869
- }, options);
11870
- return node;
11907
+ }, options); // For spacing, TeX treats \smash as a math group (same spacing as ord).
11908
+
11909
+ return buildCommon.makeSpan(["mord"], [node], options);
11871
11910
  },
11872
11911
  mathmlBuilder: function mathmlBuilder(group, options) {
11873
11912
  var inner = buildMathML_buildExpression(defineFunction_ordargument(group.body), options);
@@ -11952,7 +11991,6 @@ defineFunction({
11952
11991
  var breakOnTokenText = _ref.breakOnTokenText,
11953
11992
  funcName = _ref.funcName,
11954
11993
  parser = _ref.parser;
11955
- parser.consumeSpaces();
11956
11994
  var body = parser.parseExpression(false, breakOnTokenText);
11957
11995
  return {
11958
11996
  type: "sizing",
@@ -12155,7 +12193,7 @@ defineFunction({
12155
12193
  };
12156
12194
  },
12157
12195
  htmlBuilder: function htmlBuilder(group, options) {
12158
- var node = buildCommon.makeSpan(["mord"], [buildHTML_buildGroup(group.body, options)]);
12196
+ var node = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options)]);
12159
12197
 
12160
12198
  if (!group.smashHeight && !group.smashDepth) {
12161
12199
  return node;
@@ -12185,13 +12223,15 @@ defineFunction({
12185
12223
  // from acting on that line height. So we'll call makeVList now.
12186
12224
 
12187
12225
 
12188
- return buildCommon.makeVList({
12226
+ var smashedNode = buildCommon.makeVList({
12189
12227
  positionType: "firstBaseline",
12190
12228
  children: [{
12191
12229
  type: "elem",
12192
12230
  elem: node
12193
12231
  }]
12194
- }, options);
12232
+ }, options); // For spacing, TeX treats \hphantom as a math group (same spacing as ord).
12233
+
12234
+ return buildCommon.makeSpan(["mord"], [smashedNode], options);
12195
12235
  },
12196
12236
  mathmlBuilder: function mathmlBuilder(group, options) {
12197
12237
  var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]);
@@ -12348,7 +12388,6 @@ defineFunction({
12348
12388
  funcName = _ref.funcName,
12349
12389
  parser = _ref.parser;
12350
12390
  // parse out the implicit body
12351
- parser.consumeSpaces();
12352
12391
  var body = parser.parseExpression(true, breakOnTokenText); // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g.
12353
12392
  // here and in buildHTML and de-dupe the enumeration of all the styles).
12354
12393
  // $FlowFixMe: The names above exactly match the styles.
@@ -13070,28 +13109,37 @@ combiningDiacriticalMarkString + "*") + // ...plus accents
13070
13109
  "|\\\\verb([^*a-zA-Z]).*?\\4" + ( // \verb unstarred
13071
13110
  "|" + controlWordWhitespaceRegexString) + ( // \macroName + spaces
13072
13111
  "|" + controlSymbolRegexString + ")"); // \\, \', etc.
13073
- // These regexs are for matching results from tokenRegex,
13074
- // so they do have ^ markers.
13075
13112
 
13076
- var controlWordRegex = new RegExp("^" + controlWordRegexString);
13077
13113
  /** Main Lexer class */
13078
13114
 
13079
13115
  var Lexer_Lexer =
13080
13116
  /*#__PURE__*/
13081
13117
  function () {
13082
- function Lexer(input) {
13118
+ // category codes, only supports comment characters (14) for now
13119
+ function Lexer(input, settings) {
13083
13120
  this.input = void 0;
13121
+ this.settings = void 0;
13084
13122
  this.tokenRegex = void 0;
13123
+ this.catcodes = void 0;
13085
13124
  // Separate accents from characters
13086
13125
  this.input = input;
13126
+ this.settings = settings;
13087
13127
  this.tokenRegex = new RegExp(tokenRegexString, 'g');
13128
+ this.catcodes = {
13129
+ "%": 14 // comment character
13130
+
13131
+ };
13132
+ }
13133
+
13134
+ var _proto = Lexer.prototype;
13135
+
13136
+ _proto.setCatcode = function setCatcode(char, code) {
13137
+ this.catcodes[char] = code;
13088
13138
  }
13089
13139
  /**
13090
13140
  * This function lexes a single token.
13091
13141
  */
13092
-
13093
-
13094
- var _proto = Lexer.prototype;
13142
+ ;
13095
13143
 
13096
13144
  _proto.lex = function lex() {
13097
13145
  var input = this.input;
@@ -13107,7 +13155,23 @@ function () {
13107
13155
  throw new src_ParseError("Unexpected character: '" + input[pos] + "'", new Token_Token(input[pos], new SourceLocation(this, pos, pos + 1)));
13108
13156
  }
13109
13157
 
13110
- var text = match[2] || " "; // Trim any trailing whitespace from control word match
13158
+ var text = match[2] || " ";
13159
+
13160
+ if (this.catcodes[text] === 14) {
13161
+ // comment character
13162
+ var nlIndex = input.indexOf('\n', this.tokenRegex.lastIndex);
13163
+
13164
+ if (nlIndex === -1) {
13165
+ this.tokenRegex.lastIndex = input.length; // EOF
13166
+
13167
+ this.settings.reportNonstrict("commentAtEnd", "% comment has no terminating newline; LaTeX would " + "fail because of commenting the end of math mode (e.g. $)");
13168
+ } else {
13169
+ this.tokenRegex.lastIndex = nlIndex + 1;
13170
+ }
13171
+
13172
+ return this.lex();
13173
+ } // Trim any trailing whitespace from control word match
13174
+
13111
13175
 
13112
13176
  var controlMatch = text.match(controlWordWhitespaceRegex);
13113
13177
 
@@ -13166,11 +13230,11 @@ function () {
13166
13230
 
13167
13231
  _proto.beginGroup = function beginGroup() {
13168
13232
  this.undefStack.push({});
13169
- };
13233
+ }
13170
13234
  /**
13171
13235
  * End current nested group, restoring values before the group began.
13172
13236
  */
13173
-
13237
+ ;
13174
13238
 
13175
13239
  _proto.endGroup = function endGroup() {
13176
13240
  if (this.undefStack.length === 0) {
@@ -13188,16 +13252,16 @@ function () {
13188
13252
  }
13189
13253
  }
13190
13254
  }
13191
- };
13255
+ }
13192
13256
  /**
13193
13257
  * Detect whether `name` has a definition. Equivalent to
13194
13258
  * `get(name) != null`.
13195
13259
  */
13196
-
13260
+ ;
13197
13261
 
13198
13262
  _proto.has = function has(name) {
13199
13263
  return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name);
13200
- };
13264
+ }
13201
13265
  /**
13202
13266
  * Get the current value of a name, or `undefined` if there is no value.
13203
13267
  *
@@ -13206,7 +13270,7 @@ function () {
13206
13270
  * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or
13207
13271
  * `if (namespace.has(...))`.
13208
13272
  */
13209
-
13273
+ ;
13210
13274
 
13211
13275
  _proto.get = function get(name) {
13212
13276
  if (this.current.hasOwnProperty(name)) {
@@ -13214,14 +13278,14 @@ function () {
13214
13278
  } else {
13215
13279
  return this.builtins[name];
13216
13280
  }
13217
- };
13281
+ }
13218
13282
  /**
13219
13283
  * Set the current value of a name, and optionally set it globally too.
13220
13284
  * Local set() sets the current value and (when appropriate) adds an undo
13221
13285
  * operation to the undo stack. Global set() may change the undo
13222
13286
  * operation at every level, so takes time linear in their number.
13223
13287
  */
13224
-
13288
+ ;
13225
13289
 
13226
13290
  _proto.set = function set(name, value, global) {
13227
13291
  if (global === void 0) {
@@ -13544,9 +13608,7 @@ defineMacro("\\providecommand", function (context) {
13544
13608
  // \let\bgroup={ \let\egroup=}
13545
13609
 
13546
13610
  defineMacro("\\bgroup", "{");
13547
- defineMacro("\\egroup", "}");
13548
- defineMacro("\\begingroup", "{");
13549
- defineMacro("\\endgroup", "}"); // Symbols from latex.ltx:
13611
+ defineMacro("\\egroup", "}"); // Symbols from latex.ltx:
13550
13612
  // \def\lq{`}
13551
13613
  // \def\rq{'}
13552
13614
  // \def \aa {\r a}
@@ -13564,17 +13626,7 @@ defineMacro("\\AA", "\\r A"); // Copyright (C) and registered (R) symbols. Use r
13564
13626
 
13565
13627
  defineMacro("\\textcopyright", "\\html@mathml{\\textcircled{c}}{\\char`©}");
13566
13628
  defineMacro("\\copyright", "\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");
13567
- defineMacro("\\textregistered", "\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"); // Unicode double-struck letters
13568
-
13569
- defineMacro("\u2102", "\\mathbb{C}");
13570
- defineMacro("\u210D", "\\mathbb{H}");
13571
- defineMacro("\u2115", "\\mathbb{N}");
13572
- defineMacro("\u2119", "\\mathbb{P}");
13573
- defineMacro("\u211A", "\\mathbb{Q}");
13574
- defineMacro("\u211D", "\\mathbb{R}");
13575
- defineMacro("\u2124", "\\mathbb{Z}");
13576
- defineMacro("\u210E", "\\mathit{h}"); // Planck constant
13577
- // Characters omitted from Unicode range 1D400–1D7FF
13629
+ defineMacro("\\textregistered", "\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"); // Characters omitted from Unicode range 1D400–1D7FF
13578
13630
 
13579
13631
  defineMacro("\u212C", "\\mathscr{B}"); // script
13580
13632
 
@@ -14054,7 +14106,12 @@ defineMacro("\\Tau", "\\mathrm{T}");
14054
14106
  defineMacro("\\thetasym", "\\vartheta"); // TODO: defineMacro("\\varcoppa", "\\\mbox{\\coppa}");
14055
14107
 
14056
14108
  defineMacro("\\weierp", "\\wp");
14057
- defineMacro("\\Zeta", "\\mathrm{Z}");
14109
+ defineMacro("\\Zeta", "\\mathrm{Z}"); //////////////////////////////////////////////////////////////////////
14110
+ // statmath.sty
14111
+ // https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf
14112
+
14113
+ defineMacro("\\argmin", "\\DOTSB\\mathop{\\operatorname{arg\\,min}}\\limits");
14114
+ defineMacro("\\argmax", "\\DOTSB\\mathop{\\operatorname{arg\\,max}}\\limits");
14058
14115
  // CONCATENATED MODULE: ./src/MacroExpander.js
14059
14116
  /**
14060
14117
  * This file contains the “gullet” where macros are expanded
@@ -14109,37 +14166,37 @@ function () {
14109
14166
  var _proto = MacroExpander.prototype;
14110
14167
 
14111
14168
  _proto.feed = function feed(input) {
14112
- this.lexer = new Lexer_Lexer(input);
14113
- };
14169
+ this.lexer = new Lexer_Lexer(input, this.settings);
14170
+ }
14114
14171
  /**
14115
14172
  * Switches between "text" and "math" modes.
14116
14173
  */
14117
-
14174
+ ;
14118
14175
 
14119
14176
  _proto.switchMode = function switchMode(newMode) {
14120
14177
  this.mode = newMode;
14121
- };
14178
+ }
14122
14179
  /**
14123
14180
  * Start a new group nesting within all namespaces.
14124
14181
  */
14125
-
14182
+ ;
14126
14183
 
14127
14184
  _proto.beginGroup = function beginGroup() {
14128
14185
  this.macros.beginGroup();
14129
- };
14186
+ }
14130
14187
  /**
14131
14188
  * End current group nesting within all namespaces.
14132
14189
  */
14133
-
14190
+ ;
14134
14191
 
14135
14192
  _proto.endGroup = function endGroup() {
14136
14193
  this.macros.endGroup();
14137
- };
14194
+ }
14138
14195
  /**
14139
14196
  * Returns the topmost token on the stack, without expanding it.
14140
14197
  * Similar in behavior to TeX's `\futurelet`.
14141
14198
  */
14142
-
14199
+ ;
14143
14200
 
14144
14201
  _proto.future = function future() {
14145
14202
  if (this.stack.length === 0) {
@@ -14147,40 +14204,40 @@ function () {
14147
14204
  }
14148
14205
 
14149
14206
  return this.stack[this.stack.length - 1];
14150
- };
14207
+ }
14151
14208
  /**
14152
14209
  * Remove and return the next unexpanded token.
14153
14210
  */
14154
-
14211
+ ;
14155
14212
 
14156
14213
  _proto.popToken = function popToken() {
14157
14214
  this.future(); // ensure non-empty stack
14158
14215
 
14159
14216
  return this.stack.pop();
14160
- };
14217
+ }
14161
14218
  /**
14162
14219
  * Add a given token to the token stack. In particular, this get be used
14163
14220
  * to put back a token returned from one of the other methods.
14164
14221
  */
14165
-
14222
+ ;
14166
14223
 
14167
14224
  _proto.pushToken = function pushToken(token) {
14168
14225
  this.stack.push(token);
14169
- };
14226
+ }
14170
14227
  /**
14171
14228
  * Append an array of tokens to the token stack.
14172
14229
  */
14173
-
14230
+ ;
14174
14231
 
14175
14232
  _proto.pushTokens = function pushTokens(tokens) {
14176
14233
  var _this$stack;
14177
14234
 
14178
14235
  (_this$stack = this.stack).push.apply(_this$stack, tokens);
14179
- };
14236
+ }
14180
14237
  /**
14181
14238
  * Consume all following space tokens, without expansion.
14182
14239
  */
14183
-
14240
+ ;
14184
14241
 
14185
14242
  _proto.consumeSpaces = function consumeSpaces() {
14186
14243
  for (;;) {
@@ -14192,12 +14249,12 @@ function () {
14192
14249
  break;
14193
14250
  }
14194
14251
  }
14195
- };
14252
+ }
14196
14253
  /**
14197
14254
  * Consume the specified number of arguments from the token stream,
14198
14255
  * and return the resulting array of arguments.
14199
14256
  */
14200
-
14257
+ ;
14201
14258
 
14202
14259
  _proto.consumeArgs = function consumeArgs(numArgs) {
14203
14260
  var args = []; // obtain arguments, either single token or balanced {…} group
@@ -14237,7 +14294,7 @@ function () {
14237
14294
  }
14238
14295
 
14239
14296
  return args;
14240
- };
14297
+ }
14241
14298
  /**
14242
14299
  * Expand the next token only once if possible.
14243
14300
  *
@@ -14258,7 +14315,7 @@ function () {
14258
14315
  * i.e. things like those defined by \def\foo#1\end{…}.
14259
14316
  * See the TeX book page 202ff. for details on how those should behave.
14260
14317
  */
14261
-
14318
+ ;
14262
14319
 
14263
14320
  _proto.expandOnce = function expandOnce() {
14264
14321
  var topToken = this.popToken();
@@ -14314,23 +14371,23 @@ function () {
14314
14371
 
14315
14372
  this.pushTokens(tokens);
14316
14373
  return tokens;
14317
- };
14374
+ }
14318
14375
  /**
14319
14376
  * Expand the next token only once (if possible), and return the resulting
14320
14377
  * top token on the stack (without removing anything from the stack).
14321
14378
  * Similar in behavior to TeX's `\expandafter\futurelet`.
14322
14379
  * Equivalent to expandOnce() followed by future().
14323
14380
  */
14324
-
14381
+ ;
14325
14382
 
14326
14383
  _proto.expandAfterFuture = function expandAfterFuture() {
14327
14384
  this.expandOnce();
14328
14385
  return this.future();
14329
- };
14386
+ }
14330
14387
  /**
14331
14388
  * Recursively expand first token, then return first non-expandable token.
14332
14389
  */
14333
-
14390
+ ;
14334
14391
 
14335
14392
  _proto.expandNextToken = function expandNextToken() {
14336
14393
  for (;;) {
@@ -14350,12 +14407,12 @@ function () {
14350
14407
 
14351
14408
 
14352
14409
  throw new Error(); // eslint-disable-line no-unreachable
14353
- };
14410
+ }
14354
14411
  /**
14355
14412
  * Fully expand the given macro name and return the resulting list of
14356
14413
  * tokens, or return `undefined` if no such macro is defined.
14357
14414
  */
14358
-
14415
+ ;
14359
14416
 
14360
14417
  _proto.expandMacro = function expandMacro(name) {
14361
14418
  if (!this.macros.get(name)) {
@@ -14375,12 +14432,12 @@ function () {
14375
14432
  }
14376
14433
 
14377
14434
  return output;
14378
- };
14435
+ }
14379
14436
  /**
14380
14437
  * Fully expand the given macro name and return the result as a string,
14381
14438
  * or return `undefined` if no such macro is defined.
14382
14439
  */
14383
-
14440
+ ;
14384
14441
 
14385
14442
  _proto.expandMacroAsText = function expandMacroAsText(name) {
14386
14443
  var tokens = this.expandMacro(name);
@@ -14392,12 +14449,12 @@ function () {
14392
14449
  } else {
14393
14450
  return tokens;
14394
14451
  }
14395
- };
14452
+ }
14396
14453
  /**
14397
14454
  * Returns the expanded macro as a reversed array of tokens and a macro
14398
14455
  * argument count. Or returns `null` if no such macro.
14399
14456
  */
14400
-
14457
+ ;
14401
14458
 
14402
14459
  _proto._getExpansion = function _getExpansion(name) {
14403
14460
  var definition = this.macros.get(name);
@@ -14420,7 +14477,7 @@ function () {
14420
14477
  }
14421
14478
  }
14422
14479
 
14423
- var bodyLexer = new Lexer_Lexer(expansion);
14480
+ var bodyLexer = new Lexer_Lexer(expansion, this.settings);
14424
14481
  var tokens = [];
14425
14482
  var tok = bodyLexer.lex();
14426
14483
 
@@ -14439,14 +14496,14 @@ function () {
14439
14496
  }
14440
14497
 
14441
14498
  return expansion;
14442
- };
14499
+ }
14443
14500
  /**
14444
14501
  * Determine whether a command is currently "defined" (has some
14445
14502
  * functionality), meaning that it's a macro (in the current group),
14446
14503
  * a function, a symbol, or one of the special commands listed in
14447
14504
  * `implicitCommands`.
14448
14505
  */
14449
-
14506
+ ;
14450
14507
 
14451
14508
  _proto.isDefined = function isDefined(name) {
14452
14509
  return this.macros.has(name) || src_functions.hasOwnProperty(name) || src_symbols.math.hasOwnProperty(name) || src_symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name);
@@ -15229,29 +15286,29 @@ function () {
15229
15286
  if (consume) {
15230
15287
  this.consume();
15231
15288
  }
15232
- };
15289
+ }
15233
15290
  /**
15234
15291
  * Considers the current look ahead token as consumed,
15235
15292
  * and fetches the one after that as the new look ahead.
15236
15293
  */
15237
-
15294
+ ;
15238
15295
 
15239
15296
  _proto.consume = function consume() {
15240
15297
  this.nextToken = this.gullet.expandNextToken();
15241
- };
15298
+ }
15242
15299
  /**
15243
15300
  * Switches between "text" and "math" modes.
15244
15301
  */
15245
-
15302
+ ;
15246
15303
 
15247
15304
  _proto.switchMode = function switchMode(newMode) {
15248
15305
  this.mode = newMode;
15249
15306
  this.gullet.switchMode(newMode);
15250
- };
15307
+ }
15251
15308
  /**
15252
15309
  * Main parsing function, which parses an entire input.
15253
15310
  */
15254
-
15311
+ ;
15255
15312
 
15256
15313
  _proto.parse = function parse() {
15257
15314
  // Create a group namespace for the math expression.
@@ -15274,17 +15331,6 @@ function () {
15274
15331
  return parse;
15275
15332
  };
15276
15333
 
15277
- /**
15278
- * Parses an "expression", which is a list of atoms.
15279
- *
15280
- * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This
15281
- * happens when functions have higher precendence han infix
15282
- * nodes in implicit parses.
15283
- *
15284
- * `breakOnTokenText`: The text of the token that the expression should end
15285
- * with, or `null` if something else should end the
15286
- * expression.
15287
- */
15288
15334
  _proto.parseExpression = function parseExpression(breakOnInfix, breakOnTokenText) {
15289
15335
  var body = []; // Keep adding atoms to the body until we can't parse any more atoms (either
15290
15336
  // we reached the end, a }, or a \right)
@@ -15323,7 +15369,7 @@ function () {
15323
15369
  }
15324
15370
 
15325
15371
  return this.handleInfixNodes(body);
15326
- };
15372
+ }
15327
15373
  /**
15328
15374
  * Rewrites infix operators such as \over with corresponding commands such
15329
15375
  * as \frac.
@@ -15331,7 +15377,7 @@ function () {
15331
15377
  * There can only be one infix operator per group. If there's more than one
15332
15378
  * then the expression is ambiguous. This can be resolved by adding {}.
15333
15379
  */
15334
-
15380
+ ;
15335
15381
 
15336
15382
  _proto.handleInfixNodes = function handleInfixNodes(body) {
15337
15383
  var overIndex = -1;
@@ -15388,8 +15434,8 @@ function () {
15388
15434
  } else {
15389
15435
  return body;
15390
15436
  }
15391
- }; // The greediness of a superscript or subscript
15392
-
15437
+ } // The greediness of a superscript or subscript
15438
+ ;
15393
15439
 
15394
15440
  /**
15395
15441
  * Handle a subscript or superscript with nice errors.
@@ -15407,12 +15453,12 @@ function () {
15407
15453
  }
15408
15454
 
15409
15455
  return group;
15410
- };
15456
+ }
15411
15457
  /**
15412
15458
  * Converts the textual input of an unsupported command into a text node
15413
15459
  * contained within a color node whose color is determined by errorColor
15414
15460
  */
15415
-
15461
+ ;
15416
15462
 
15417
15463
  _proto.handleUnsupportedCmd = function handleUnsupportedCmd() {
15418
15464
  var text = this.nextToken.text;
@@ -15439,11 +15485,11 @@ function () {
15439
15485
  };
15440
15486
  this.consume();
15441
15487
  return colorNode;
15442
- };
15488
+ }
15443
15489
  /**
15444
15490
  * Parses a group with optional super/subscripts.
15445
15491
  */
15446
-
15492
+ ;
15447
15493
 
15448
15494
  _proto.parseAtom = function parseAtom(breakOnTokenText) {
15449
15495
  // The body of an atom is an implicit group, so that things like
@@ -15524,8 +15570,6 @@ function () {
15524
15570
  mode: this.mode,
15525
15571
  body: primes
15526
15572
  };
15527
- } else if (lex.text === "%") {
15528
- this.consumeComment();
15529
15573
  } else {
15530
15574
  // If it wasn't ^, _, or ', stop parsing super/subscripts
15531
15575
  break;
@@ -15547,11 +15591,11 @@ function () {
15547
15591
  // Otherwise return the original body
15548
15592
  return base;
15549
15593
  }
15550
- };
15594
+ }
15551
15595
  /**
15552
15596
  * Parses an entire function, including its base and all of its arguments.
15553
15597
  */
15554
-
15598
+ ;
15555
15599
 
15556
15600
  _proto.parseFunction = function parseFunction(breakOnTokenText, name, // For error reporting.
15557
15601
  greediness) {
@@ -15569,6 +15613,11 @@ function () {
15569
15613
  throw new src_ParseError("Can't use function '" + func + "' in text mode", token);
15570
15614
  } else if (this.mode === "math" && funcData.allowedInMath === false) {
15571
15615
  throw new src_ParseError("Can't use function '" + func + "' in math mode", token);
15616
+ } // hyperref package sets the catcode of % as an active character
15617
+
15618
+
15619
+ if (funcData.argTypes && funcData.argTypes[0] === "url") {
15620
+ this.gullet.lexer.setCatcode("%", 13);
15572
15621
  } // Consume the command token after possibly switching to the
15573
15622
  // mode specified by the function (for instant mode switching),
15574
15623
  // and then immediately switch back.
@@ -15588,11 +15637,11 @@ function () {
15588
15637
  optArgs = _this$parseArguments.optArgs;
15589
15638
 
15590
15639
  return this.callFunction(func, args, optArgs, token, breakOnTokenText);
15591
- };
15640
+ }
15592
15641
  /**
15593
15642
  * Call a function handler with a suitable context and arguments.
15594
15643
  */
15595
-
15644
+ ;
15596
15645
 
15597
15646
  _proto.callFunction = function callFunction(name, args, optArgs, token, breakOnTokenText) {
15598
15647
  var context = {
@@ -15608,11 +15657,11 @@ function () {
15608
15657
  } else {
15609
15658
  throw new src_ParseError("No function handler for " + name);
15610
15659
  }
15611
- };
15660
+ }
15612
15661
  /**
15613
15662
  * Parses the arguments of a function or environment
15614
15663
  */
15615
-
15664
+ ;
15616
15665
 
15617
15666
  _proto.parseArguments = function parseArguments(func, // Should look like "\name" or "\begin{name}".
15618
15667
  funcData) {
@@ -15669,11 +15718,11 @@ function () {
15669
15718
  args: args,
15670
15719
  optArgs: optArgs
15671
15720
  };
15672
- };
15721
+ }
15673
15722
  /**
15674
15723
  * Parses a group when the mode is changing.
15675
15724
  */
15676
-
15725
+ ;
15677
15726
 
15678
15727
  _proto.parseGroupOfType = function parseGroupOfType(name, type, optional, greediness) {
15679
15728
  switch (type) {
@@ -15690,6 +15739,25 @@ function () {
15690
15739
  case "text":
15691
15740
  return this.parseGroup(name, optional, greediness, undefined, type);
15692
15741
 
15742
+ case "raw":
15743
+ {
15744
+ if (optional && this.nextToken.text === "{") {
15745
+ return null;
15746
+ }
15747
+
15748
+ var token = this.parseStringGroup("raw", optional, true);
15749
+
15750
+ if (token) {
15751
+ return {
15752
+ type: "raw",
15753
+ mode: "text",
15754
+ string: token.text
15755
+ };
15756
+ } else {
15757
+ throw new src_ParseError("Expected raw group", this.nextToken);
15758
+ }
15759
+ }
15760
+
15693
15761
  case "original":
15694
15762
  case null:
15695
15763
  case undefined:
@@ -15704,34 +15772,12 @@ function () {
15704
15772
  while (this.nextToken.text === " ") {
15705
15773
  this.consume();
15706
15774
  }
15707
- };
15708
-
15709
- _proto.consumeComment = function consumeComment() {
15710
- // the newline character is normalized in Lexer, check original source
15711
- while (this.nextToken.text !== "EOF" && this.nextToken.loc && this.nextToken.loc.getSource().indexOf("\n") === -1) {
15712
- this.consume();
15713
- }
15714
-
15715
- if (this.nextToken.text === "EOF") {
15716
- this.settings.reportNonstrict("commentAtEnd", "% comment has no terminating newline; LaTeX would " + "fail because of commenting the end of math mode (e.g. $)");
15717
- }
15718
-
15719
- if (this.mode === "math") {
15720
- this.consumeSpaces(); // ignore spaces in math mode
15721
- } else if (this.nextToken.loc) {
15722
- // text mode
15723
- var source = this.nextToken.loc.getSource();
15724
-
15725
- if (source.indexOf("\n") === source.length - 1) {
15726
- this.consumeSpaces(); // if no space after the first newline
15727
- }
15728
- }
15729
- };
15775
+ }
15730
15776
  /**
15731
15777
  * Parses a group, essentially returning the string formed by the
15732
15778
  * brace-enclosed tokens plus some position information.
15733
15779
  */
15734
-
15780
+ ;
15735
15781
 
15736
15782
  _proto.parseStringGroup = function parseStringGroup(modeName, // Used to describe the mode in error messages.
15737
15783
  optional, raw) {
@@ -15744,6 +15790,8 @@ function () {
15744
15790
  return null;
15745
15791
  } else if (raw && nextToken.text !== "EOF" && /[^{}[\]]/.test(nextToken.text)) {
15746
15792
  // allow a single character in raw string group
15793
+ this.gullet.lexer.setCatcode("%", 14); // reset the catcode of %
15794
+
15747
15795
  this.consume();
15748
15796
  return nextToken;
15749
15797
  }
@@ -15763,15 +15811,6 @@ function () {
15763
15811
  case "EOF":
15764
15812
  throw new src_ParseError("Unexpected end of input in " + modeName, firstToken.range(lastToken, str));
15765
15813
 
15766
- case "%":
15767
- if (!raw) {
15768
- // allow % in raw string group
15769
- this.consumeComment();
15770
- continue;
15771
- }
15772
-
15773
- break;
15774
-
15775
15814
  case groupBegin:
15776
15815
  nested++;
15777
15816
  break;
@@ -15787,15 +15826,17 @@ function () {
15787
15826
  }
15788
15827
 
15789
15828
  this.mode = outerMode;
15829
+ this.gullet.lexer.setCatcode("%", 14); // reset the catcode of %
15830
+
15790
15831
  this.expect(groupEnd);
15791
15832
  return firstToken.range(lastToken, str);
15792
- };
15833
+ }
15793
15834
  /**
15794
15835
  * Parses a regex-delimited group: the largest sequence of tokens
15795
15836
  * whose concatenated strings match `regex`. Returns the string
15796
15837
  * formed by the tokens plus some position information.
15797
15838
  */
15798
-
15839
+ ;
15799
15840
 
15800
15841
  _proto.parseRegexGroup = function parseRegexGroup(regex, modeName) {
15801
15842
  var outerMode = this.mode;
@@ -15804,12 +15845,7 @@ function () {
15804
15845
  var lastToken = firstToken;
15805
15846
  var str = "";
15806
15847
 
15807
- while (this.nextToken.text !== "EOF" && (regex.test(str + this.nextToken.text) || this.nextToken.text === "%")) {
15808
- if (this.nextToken.text === "%") {
15809
- this.consumeComment();
15810
- continue;
15811
- }
15812
-
15848
+ while (this.nextToken.text !== "EOF" && regex.test(str + this.nextToken.text)) {
15813
15849
  lastToken = this.nextToken;
15814
15850
  str += lastToken.text;
15815
15851
  this.consume();
@@ -15821,11 +15857,11 @@ function () {
15821
15857
 
15822
15858
  this.mode = outerMode;
15823
15859
  return firstToken.range(lastToken, str);
15824
- };
15860
+ }
15825
15861
  /**
15826
15862
  * Parses a color description.
15827
15863
  */
15828
-
15864
+ ;
15829
15865
 
15830
15866
  _proto.parseColorGroup = function parseColorGroup(optional) {
15831
15867
  var res = this.parseStringGroup("color", optional);
@@ -15854,11 +15890,11 @@ function () {
15854
15890
  mode: this.mode,
15855
15891
  color: color
15856
15892
  };
15857
- };
15893
+ }
15858
15894
  /**
15859
15895
  * Parses a size specification, consisting of magnitude and unit.
15860
15896
  */
15861
-
15897
+ ;
15862
15898
 
15863
15899
  _proto.parseSizeGroup = function parseSizeGroup(optional) {
15864
15900
  var res;
@@ -15905,11 +15941,11 @@ function () {
15905
15941
  value: data,
15906
15942
  isBlank: isBlank
15907
15943
  };
15908
- };
15944
+ }
15909
15945
  /**
15910
15946
  * Parses an URL, checking escaped letters and allowed protocols.
15911
15947
  */
15912
-
15948
+ ;
15913
15949
 
15914
15950
  _proto.parseUrlGroup = function parseUrlGroup(optional) {
15915
15951
  var res = this.parseStringGroup("url", optional, true); // get raw string
@@ -15936,7 +15972,7 @@ function () {
15936
15972
  mode: this.mode,
15937
15973
  url: url
15938
15974
  };
15939
- };
15975
+ }
15940
15976
  /**
15941
15977
  * If `optional` is false or absent, this parses an ordinary group,
15942
15978
  * which is either a single nucleus (like "x") or an expression
@@ -15949,7 +15985,7 @@ function () {
15949
15985
  * If `mode` is present, switches to that mode while parsing the group,
15950
15986
  * and switches back after.
15951
15987
  */
15952
-
15988
+ ;
15953
15989
 
15954
15990
  _proto.parseGroup = function parseGroup(name, // For error reporting.
15955
15991
  optional, greediness, breakOnTokenText, mode) {
@@ -15961,29 +15997,29 @@ function () {
15961
15997
  this.switchMode(mode);
15962
15998
  }
15963
15999
 
15964
- var result; // Try to parse an open brace
16000
+ var groupEnd;
16001
+ var result; // Try to parse an open brace or \begingroup
16002
+
16003
+ if (optional ? text === "[" : text === "{" || text === "\\begingroup") {
16004
+ groupEnd = Parser.endOfGroup[text]; // Start a new group namespace
15965
16005
 
15966
- if (text === (optional ? "[" : "{")) {
15967
- // Start a new group namespace
15968
16006
  this.gullet.beginGroup(); // If we get a brace, parse an expression
15969
16007
 
15970
16008
  this.consume();
15971
- var expression = this.parseExpression(false, optional ? "]" : "}");
15972
- var lastToken = this.nextToken; // Switch mode back before consuming symbol after close brace
15973
-
15974
- if (mode) {
15975
- this.switchMode(outerMode);
15976
- } // End group namespace before consuming symbol after close brace
16009
+ var expression = this.parseExpression(false, groupEnd);
16010
+ var lastToken = this.nextToken; // End group namespace before consuming symbol after close brace
15977
16011
 
15978
-
15979
- this.gullet.endGroup(); // Make sure we get a close brace
15980
-
15981
- this.expect(optional ? "]" : "}");
15982
- return {
16012
+ this.gullet.endGroup();
16013
+ result = {
15983
16014
  type: "ordgroup",
15984
16015
  mode: this.mode,
15985
16016
  loc: SourceLocation.range(firstToken, lastToken),
15986
- body: expression
16017
+ body: expression,
16018
+ // A group formed by \begingroup...\endgroup is a semi-simple group
16019
+ // which doesn't affect spacing in math mode, i.e., is transparent.
16020
+ // https://tex.stackexchange.com/questions/1930/when-should-one-
16021
+ // use-begingroup-instead-of-bgroup
16022
+ semisimple: text === "\\begingroup" || undefined
15987
16023
  };
15988
16024
  } else if (optional) {
15989
16025
  // Return nothing for an optional group
@@ -16005,10 +16041,15 @@ function () {
16005
16041
 
16006
16042
  if (mode) {
16007
16043
  this.switchMode(outerMode);
16044
+ } // Make sure we got a close brace
16045
+
16046
+
16047
+ if (groupEnd) {
16048
+ this.expect(groupEnd);
16008
16049
  }
16009
16050
 
16010
16051
  return result;
16011
- };
16052
+ }
16012
16053
  /**
16013
16054
  * Form ligature-like combinations of characters for text mode.
16014
16055
  * This includes inputs like "--", "---", "``" and "''".
@@ -16017,7 +16058,7 @@ function () {
16017
16058
  * characters in its value. The representation is still ASCII source.
16018
16059
  * The group will be modified in place.
16019
16060
  */
16020
-
16061
+ ;
16021
16062
 
16022
16063
  _proto.formLigatures = function formLigatures(group) {
16023
16064
  var n = group.length - 1;
@@ -16057,12 +16098,12 @@ function () {
16057
16098
  n -= 1;
16058
16099
  }
16059
16100
  }
16060
- };
16101
+ }
16061
16102
  /**
16062
16103
  * Parse a single symbol out of the string. Here, we handle single character
16063
16104
  * symbols and special functions like verbatim
16064
16105
  */
16065
-
16106
+ ;
16066
16107
 
16067
16108
  _proto.parseSymbol = function parseSymbol() {
16068
16109
  var nucleus = this.nextToken;
@@ -16091,9 +16132,6 @@ function () {
16091
16132
  body: arg,
16092
16133
  star: star
16093
16134
  };
16094
- } else if (text === "%") {
16095
- this.consumeComment();
16096
- return this.parseSymbol();
16097
16135
  } // At this point, we should have a symbol, possibly with accents.
16098
16136
  // First expand any accented base symbol according to unicodeSymbols.
16099
16137
 
@@ -16207,7 +16245,24 @@ function () {
16207
16245
  return Parser;
16208
16246
  }();
16209
16247
 
16210
- Parser_Parser.endOfExpression = ["}", "\\end", "\\right", "&"];
16248
+ Parser_Parser.endOfExpression = ["}", "\\endgroup", "\\end", "\\right", "&"];
16249
+ Parser_Parser.endOfGroup = {
16250
+ "[": "]",
16251
+ "{": "}",
16252
+ "\\begingroup": "\\endgroup"
16253
+ /**
16254
+ * Parses an "expression", which is a list of atoms.
16255
+ *
16256
+ * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This
16257
+ * happens when functions have higher precendence han infix
16258
+ * nodes in implicit parses.
16259
+ *
16260
+ * `breakOnTokenText`: The text of the token that the expression should end
16261
+ * with, or `null` if something else should end the
16262
+ * expression.
16263
+ */
16264
+
16265
+ };
16211
16266
  Parser_Parser.SUPSUB_GREEDINESS = 1;
16212
16267
 
16213
16268
  // CONCATENATED MODULE: ./src/parseTree.js
@@ -16363,7 +16418,7 @@ var katex_renderToHTMLTree = function renderToHTMLTree(expression, options) {
16363
16418
  /**
16364
16419
  * Current KaTeX version
16365
16420
  */
16366
- version: "0.10.0",
16421
+ version: "0.10.1",
16367
16422
 
16368
16423
  /**
16369
16424
  * Renders the given LaTeX into an HTML+MathML combination, and adds
@@ -16446,8 +16501,9 @@ var katex_renderToHTMLTree = function renderToHTMLTree(expression, options) {
16446
16501
  });
16447
16502
  // CONCATENATED MODULE: ./katex.webpack.js
16448
16503
  /**
16449
- * This is the webpack entry point for KaTeX. As flow[1] and jest[2] doesn't support
16450
- * CSS modules natively, a separate entry point is used and it is not flowtyped.
16504
+ * This is the webpack entry point for KaTeX. As ECMAScript, flow[1] and jest[2]
16505
+ * doesn't support CSS modules natively, a separate entry point is used and
16506
+ * it is not flowtyped.
16451
16507
  *
16452
16508
  * [1] https://gist.github.com/lambdahands/d19e0da96285b749f0ef
16453
16509
  * [2] https://facebook.github.io/jest/docs/en/webpack.html