jekyll-theme-hydejack 8.3.2 → 8.4.0

Sign up to get free protection for your applications and to get access to all the features.
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