katex 0.15.3 → 0.15.6

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.
package/dist/katex.mjs CHANGED
@@ -15789,7 +15789,67 @@ defineMacro("\\bra", "\\mathinner{\\langle{#1}|}");
15789
15789
  defineMacro("\\ket", "\\mathinner{|{#1}\\rangle}");
15790
15790
  defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}");
15791
15791
  defineMacro("\\Bra", "\\left\\langle#1\\right|");
15792
- defineMacro("\\Ket", "\\left|#1\\right\\rangle"); //////////////////////////////////////////////////////////////////////
15792
+ defineMacro("\\Ket", "\\left|#1\\right\\rangle");
15793
+
15794
+ var braketHelper = one => context => {
15795
+ var left = context.consumeArg().tokens;
15796
+ var middle = context.consumeArg().tokens;
15797
+ var middleDouble = context.consumeArg().tokens;
15798
+ var right = context.consumeArg().tokens;
15799
+ var oldMiddle = context.macros.get("|");
15800
+ var oldMiddleDouble = context.macros.get("\\|");
15801
+ context.macros.beginGroup();
15802
+
15803
+ var midMacro = double => context => {
15804
+ if (one) {
15805
+ // Only modify the first instance of | or \|
15806
+ context.macros.set("|", oldMiddle);
15807
+
15808
+ if (middleDouble.length) {
15809
+ context.macros.set("\\|", oldMiddleDouble);
15810
+ }
15811
+ }
15812
+
15813
+ var doubled = double;
15814
+
15815
+ if (!double && middleDouble.length) {
15816
+ // Mimic \@ifnextchar
15817
+ var nextToken = context.future();
15818
+
15819
+ if (nextToken.text === "|") {
15820
+ context.popToken();
15821
+ doubled = true;
15822
+ }
15823
+ }
15824
+
15825
+ return {
15826
+ tokens: doubled ? middleDouble : middle,
15827
+ numArgs: 0
15828
+ };
15829
+ };
15830
+
15831
+ context.macros.set("|", midMacro(false));
15832
+
15833
+ if (middleDouble.length) {
15834
+ context.macros.set("\\|", midMacro(true));
15835
+ }
15836
+
15837
+ var arg = context.consumeArg().tokens;
15838
+ var expanded = context.expandTokens([...right, ...arg, ...left // reversed
15839
+ ]);
15840
+ context.macros.endGroup();
15841
+ return {
15842
+ tokens: expanded.reverse(),
15843
+ numArgs: 0
15844
+ };
15845
+ };
15846
+
15847
+ defineMacro("\\bra@ket", braketHelper(false));
15848
+ defineMacro("\\bra@set", braketHelper(true));
15849
+ defineMacro("\\Braket", "\\bra@ket{\\left\\langle}" + "{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");
15850
+ defineMacro("\\Set", "\\bra@set{\\left\\{\\:}" + "{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");
15851
+ defineMacro("\\set", "\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}"); // has no support for special || or \|
15852
+ //////////////////////////////////////////////////////////////////////
15793
15853
  // actuarialangle.dtx
15794
15854
 
15795
15855
  defineMacro("\\angln", "{\\angl n}"); // Custom Khan Academy colors, should be moved to an optional package
@@ -16245,7 +16305,9 @@ class MacroExpander {
16245
16305
  return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined;
16246
16306
  }
16247
16307
  /**
16248
- * Fully expand the given token stream and return the resulting list of tokens
16308
+ * Fully expand the given token stream and return the resulting list of
16309
+ * tokens. Note that the input tokens are in reverse order, but the
16310
+ * output tokens are in forward order.
16249
16311
  */
16250
16312
 
16251
16313
 
@@ -16366,6 +16428,113 @@ class MacroExpander {
16366
16428
 
16367
16429
  }
16368
16430
 
16431
+ // Helpers for Parser.js handling of Unicode (sub|super)script characters.
16432
+ var unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/;
16433
+ var uSubsAndSups = Object.freeze({
16434
+ '₊': '+',
16435
+ '₋': '-',
16436
+ '₌': '=',
16437
+ '₍': '(',
16438
+ '₎': ')',
16439
+ '₀': '0',
16440
+ '₁': '1',
16441
+ '₂': '2',
16442
+ '₃': '3',
16443
+ '₄': '4',
16444
+ '₅': '5',
16445
+ '₆': '6',
16446
+ '₇': '7',
16447
+ '₈': '8',
16448
+ '₉': '9',
16449
+ '\u2090': 'a',
16450
+ '\u2091': 'e',
16451
+ '\u2095': 'h',
16452
+ '\u1D62': 'i',
16453
+ '\u2C7C': 'j',
16454
+ '\u2096': 'k',
16455
+ '\u2097': 'l',
16456
+ '\u2098': 'm',
16457
+ '\u2099': 'n',
16458
+ '\u2092': 'o',
16459
+ '\u209A': 'p',
16460
+ '\u1D63': 'r',
16461
+ '\u209B': 's',
16462
+ '\u209C': 't',
16463
+ '\u1D64': 'u',
16464
+ '\u1D65': 'v',
16465
+ '\u2093': 'x',
16466
+ '\u1D66': 'β',
16467
+ '\u1D67': 'γ',
16468
+ '\u1D68': 'ρ',
16469
+ '\u1D69': '\u03d5',
16470
+ '\u1D6A': 'χ',
16471
+ '⁺': '+',
16472
+ '⁻': '-',
16473
+ '⁼': '=',
16474
+ '⁽': '(',
16475
+ '⁾': ')',
16476
+ '⁰': '0',
16477
+ '¹': '1',
16478
+ '²': '2',
16479
+ '³': '3',
16480
+ '⁴': '4',
16481
+ '⁵': '5',
16482
+ '⁶': '6',
16483
+ '⁷': '7',
16484
+ '⁸': '8',
16485
+ '⁹': '9',
16486
+ '\u1D2C': 'A',
16487
+ '\u1D2E': 'B',
16488
+ '\u1D30': 'D',
16489
+ '\u1D31': 'E',
16490
+ '\u1D33': 'G',
16491
+ '\u1D34': 'H',
16492
+ '\u1D35': 'I',
16493
+ '\u1D36': 'J',
16494
+ '\u1D37': 'K',
16495
+ '\u1D38': 'L',
16496
+ '\u1D39': 'M',
16497
+ '\u1D3A': 'N',
16498
+ '\u1D3C': 'O',
16499
+ '\u1D3E': 'P',
16500
+ '\u1D3F': 'R',
16501
+ '\u1D40': 'T',
16502
+ '\u1D41': 'U',
16503
+ '\u2C7D': 'V',
16504
+ '\u1D42': 'W',
16505
+ '\u1D43': 'a',
16506
+ '\u1D47': 'b',
16507
+ '\u1D9C': 'c',
16508
+ '\u1D48': 'd',
16509
+ '\u1D49': 'e',
16510
+ '\u1DA0': 'f',
16511
+ '\u1D4D': 'g',
16512
+ '\u02B0': 'h',
16513
+ '\u2071': 'i',
16514
+ '\u02B2': 'j',
16515
+ '\u1D4F': 'k',
16516
+ '\u02E1': 'l',
16517
+ '\u1D50': 'm',
16518
+ '\u207F': 'n',
16519
+ '\u1D52': 'o',
16520
+ '\u1D56': 'p',
16521
+ '\u02B3': 'r',
16522
+ '\u02E2': 's',
16523
+ '\u1D57': 't',
16524
+ '\u1D58': 'u',
16525
+ '\u1D5B': 'v',
16526
+ '\u02B7': 'w',
16527
+ '\u02E3': 'x',
16528
+ '\u02B8': 'y',
16529
+ '\u1DBB': 'z',
16530
+ '\u1D5D': 'β',
16531
+ '\u1D5E': 'γ',
16532
+ '\u1D5F': 'δ',
16533
+ '\u1D60': '\u03d5',
16534
+ '\u1D61': 'χ',
16535
+ '\u1DBF': 'θ'
16536
+ });
16537
+
16369
16538
  /* eslint no-constant-condition:0 */
16370
16539
 
16371
16540
  var unicodeAccents = {
@@ -17164,6 +17333,46 @@ class Parser {
17164
17333
  mode: this.mode,
17165
17334
  body: primes
17166
17335
  };
17336
+ } else if (uSubsAndSups[lex.text]) {
17337
+ // A Unicode subscript or superscript character.
17338
+ // We treat these similarly to the unicode-math package.
17339
+ // So we render a string of Unicode (sub|super)scripts the
17340
+ // same as a (sub|super)script of regular characters.
17341
+ var str = uSubsAndSups[lex.text];
17342
+ var isSub = unicodeSubRegEx.test(lex.text);
17343
+ this.consume(); // Continue fetching tokens to fill out the string.
17344
+
17345
+ while (true) {
17346
+ var token = this.fetch().text;
17347
+
17348
+ if (!uSubsAndSups[token]) {
17349
+ break;
17350
+ }
17351
+
17352
+ if (unicodeSubRegEx.test(token) !== isSub) {
17353
+ break;
17354
+ }
17355
+
17356
+ this.consume();
17357
+ str += uSubsAndSups[token];
17358
+ } // Now create a (sub|super)script.
17359
+
17360
+
17361
+ var body = new Parser(str, this.settings).parse();
17362
+
17363
+ if (isSub) {
17364
+ subscript = {
17365
+ type: "ordgroup",
17366
+ mode: "math",
17367
+ body
17368
+ };
17369
+ } else {
17370
+ superscript = {
17371
+ type: "ordgroup",
17372
+ mode: "math",
17373
+ body
17374
+ };
17375
+ }
17167
17376
  } else {
17168
17377
  // If it wasn't ^, _, or ', stop parsing super/subscripts
17169
17378
  break;
@@ -17959,7 +18168,7 @@ var katex = {
17959
18168
  /**
17960
18169
  * Current KaTeX version
17961
18170
  */
17962
- version: "0.15.3",
18171
+ version: "0.15.6",
17963
18172
 
17964
18173
  /**
17965
18174
  * Renders the given LaTeX into an HTML+MathML combination, and adds
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "katex",
3
- "version": "0.15.3",
3
+ "version": "0.15.6",
4
4
  "description": "Fast math typesetting for the web.",
5
5
  "main": "dist/katex.js",
6
6
  "exports": {
@@ -356,7 +356,9 @@ export default class MacroExpander implements MacroContextInterface {
356
356
  }
357
357
 
358
358
  /**
359
- * Fully expand the given token stream and return the resulting list of tokens
359
+ * Fully expand the given token stream and return the resulting list of
360
+ * tokens. Note that the input tokens are in reverse order, but the
361
+ * output tokens are in forward order.
360
362
  */
361
363
  expandTokens(tokens: Token[]): Token[] {
362
364
  const output = [];
package/src/Parser.js CHANGED
@@ -9,6 +9,7 @@ import ParseError from "./ParseError";
9
9
  import {combiningDiacriticalMarksEndRegex} from "./Lexer";
10
10
  import Settings from "./Settings";
11
11
  import SourceLocation from "./SourceLocation";
12
+ import {uSubsAndSups, unicodeSubRegEx} from "./unicodeSupOrSub";
12
13
  import {Token} from "./Token";
13
14
 
14
15
  // Pre-evaluate both modules as unicodeSymbols require String.normalize()
@@ -399,6 +400,29 @@ export default class Parser {
399
400
  }
400
401
  // Put everything into an ordgroup as the superscript
401
402
  superscript = {type: "ordgroup", mode: this.mode, body: primes};
403
+ } else if (uSubsAndSups[lex.text]) {
404
+ // A Unicode subscript or superscript character.
405
+ // We treat these similarly to the unicode-math package.
406
+ // So we render a string of Unicode (sub|super)scripts the
407
+ // same as a (sub|super)script of regular characters.
408
+ let str = uSubsAndSups[lex.text];
409
+ const isSub = unicodeSubRegEx.test(lex.text);
410
+ this.consume();
411
+ // Continue fetching tokens to fill out the string.
412
+ while (true) {
413
+ const token = this.fetch().text;
414
+ if (!(uSubsAndSups[token])) { break; }
415
+ if (unicodeSubRegEx.test(token) !== isSub) { break; }
416
+ this.consume();
417
+ str += uSubsAndSups[token];
418
+ }
419
+ // Now create a (sub|super)script.
420
+ const body = (new Parser(str, this.settings)).parse();
421
+ if (isSub) {
422
+ subscript = {type: "ordgroup", mode: "math", body};
423
+ } else {
424
+ superscript = {type: "ordgroup", mode: "math", body};
425
+ }
402
426
  } else {
403
427
  // If it wasn't ^, _, or ', stop parsing super/subscripts
404
428
  break;
@@ -61,6 +61,13 @@ export interface MacroContextInterface {
61
61
  */
62
62
  expandMacroAsText(name: string): string | void;
63
63
 
64
+ /**
65
+ * Fully expand the given token stream and return the resulting list of
66
+ * tokens. Note that the input tokens are in reverse order, but the
67
+ * output tokens are in forward order.
68
+ */
69
+ expandTokens(tokens: Token[]): Token[];
70
+
64
71
  /**
65
72
  * Consume an argument from the token stream, and return the resulting array
66
73
  * of tokens and start/end token.
package/src/macros.js CHANGED
@@ -912,6 +912,58 @@ defineMacro("\\ket", "\\mathinner{|{#1}\\rangle}");
912
912
  defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}");
913
913
  defineMacro("\\Bra", "\\left\\langle#1\\right|");
914
914
  defineMacro("\\Ket", "\\left|#1\\right\\rangle");
915
+ const braketHelper = (one) => (context) => {
916
+ const left = context.consumeArg().tokens;
917
+ const middle = context.consumeArg().tokens;
918
+ const middleDouble = context.consumeArg().tokens;
919
+ const right = context.consumeArg().tokens;
920
+ const oldMiddle = context.macros.get("|");
921
+ const oldMiddleDouble = context.macros.get("\\|");
922
+ context.macros.beginGroup();
923
+ const midMacro = (double) => (context) => {
924
+ if (one) {
925
+ // Only modify the first instance of | or \|
926
+ context.macros.set("|", oldMiddle);
927
+ if (middleDouble.length) {
928
+ context.macros.set("\\|", oldMiddleDouble);
929
+ }
930
+ }
931
+ let doubled = double;
932
+ if (!double && middleDouble.length) {
933
+ // Mimic \@ifnextchar
934
+ const nextToken = context.future();
935
+ if (nextToken.text === "|") {
936
+ context.popToken();
937
+ doubled = true;
938
+ }
939
+ }
940
+ return {
941
+ tokens: doubled ? middleDouble : middle,
942
+ numArgs: 0,
943
+ };
944
+ };
945
+ context.macros.set("|", midMacro(false));
946
+ if (middleDouble.length) {
947
+ context.macros.set("\\|", midMacro(true));
948
+ }
949
+ const arg = context.consumeArg().tokens;
950
+ const expanded = context.expandTokens([
951
+ ...right, ...arg, ...left, // reversed
952
+ ]);
953
+ context.macros.endGroup();
954
+ return {
955
+ tokens: expanded.reverse(),
956
+ numArgs: 0,
957
+ };
958
+ };
959
+ defineMacro("\\bra@ket", braketHelper(false));
960
+ defineMacro("\\bra@set", braketHelper(true));
961
+ defineMacro("\\Braket", "\\bra@ket{\\left\\langle}" +
962
+ "{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");
963
+ defineMacro("\\Set", "\\bra@set{\\left\\{\\:}" +
964
+ "{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");
965
+ defineMacro("\\set", "\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");
966
+ // has no support for special || or \|
915
967
 
916
968
  //////////////////////////////////////////////////////////////////////
917
969
  // actuarialangle.dtx
@@ -0,0 +1,108 @@
1
+ // Helpers for Parser.js handling of Unicode (sub|super)script characters.
2
+
3
+ export const unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/;
4
+
5
+ export const uSubsAndSups = Object.freeze({
6
+ '₊': '+',
7
+ '₋': '-',
8
+ '₌': '=',
9
+ '₍': '(',
10
+ '₎': ')',
11
+ '₀': '0',
12
+ '₁': '1',
13
+ '₂': '2',
14
+ '₃': '3',
15
+ '₄': '4',
16
+ '₅': '5',
17
+ '₆': '6',
18
+ '₇': '7',
19
+ '₈': '8',
20
+ '₉': '9',
21
+ '\u2090': 'a',
22
+ '\u2091': 'e',
23
+ '\u2095': 'h',
24
+ '\u1D62': 'i',
25
+ '\u2C7C': 'j',
26
+ '\u2096': 'k',
27
+ '\u2097': 'l',
28
+ '\u2098': 'm',
29
+ '\u2099': 'n',
30
+ '\u2092': 'o',
31
+ '\u209A': 'p',
32
+ '\u1D63': 'r',
33
+ '\u209B': 's',
34
+ '\u209C': 't',
35
+ '\u1D64': 'u',
36
+ '\u1D65': 'v',
37
+ '\u2093': 'x',
38
+ '\u1D66': 'β',
39
+ '\u1D67': 'γ',
40
+ '\u1D68': 'ρ',
41
+ '\u1D69': '\u03d5',
42
+ '\u1D6A': 'χ',
43
+ '⁺': '+',
44
+ '⁻': '-',
45
+ '⁼': '=',
46
+ '⁽': '(',
47
+ '⁾': ')',
48
+ '⁰': '0',
49
+ '¹': '1',
50
+ '²': '2',
51
+ '³': '3',
52
+ '⁴': '4',
53
+ '⁵': '5',
54
+ '⁶': '6',
55
+ '⁷': '7',
56
+ '⁸': '8',
57
+ '⁹': '9',
58
+ '\u1D2C': 'A',
59
+ '\u1D2E': 'B',
60
+ '\u1D30': 'D',
61
+ '\u1D31': 'E',
62
+ '\u1D33': 'G',
63
+ '\u1D34': 'H',
64
+ '\u1D35': 'I',
65
+ '\u1D36': 'J',
66
+ '\u1D37': 'K',
67
+ '\u1D38': 'L',
68
+ '\u1D39': 'M',
69
+ '\u1D3A': 'N',
70
+ '\u1D3C': 'O',
71
+ '\u1D3E': 'P',
72
+ '\u1D3F': 'R',
73
+ '\u1D40': 'T',
74
+ '\u1D41': 'U',
75
+ '\u2C7D': 'V',
76
+ '\u1D42': 'W',
77
+ '\u1D43': 'a',
78
+ '\u1D47': 'b',
79
+ '\u1D9C': 'c',
80
+ '\u1D48': 'd',
81
+ '\u1D49': 'e',
82
+ '\u1DA0': 'f',
83
+ '\u1D4D': 'g',
84
+ '\u02B0': 'h',
85
+ '\u2071': 'i',
86
+ '\u02B2': 'j',
87
+ '\u1D4F': 'k',
88
+ '\u02E1': 'l',
89
+ '\u1D50': 'm',
90
+ '\u207F': 'n',
91
+ '\u1D52': 'o',
92
+ '\u1D56': 'p',
93
+ '\u02B3': 'r',
94
+ '\u02E2': 's',
95
+ '\u1D57': 't',
96
+ '\u1D58': 'u',
97
+ '\u1D5B': 'v',
98
+ '\u02B7': 'w',
99
+ '\u02E3': 'x',
100
+ '\u02B8': 'y',
101
+ '\u1DBB': 'z',
102
+ '\u1D5D': 'β',
103
+ '\u1D5E': 'γ',
104
+ '\u1D5F': 'δ',
105
+ '\u1D60': '\u03d5',
106
+ '\u1D61': 'χ',
107
+ '\u1DBF': 'θ',
108
+ });