katex 0.12.0 → 0.13.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/LICENSE +1 -1
  3. package/README.md +8 -7
  4. package/contrib/auto-render/auto-render.js +12 -19
  5. package/contrib/auto-render/index.html +9 -3
  6. package/contrib/auto-render/splitAtDelimiters.js +44 -61
  7. package/contrib/auto-render/test/auto-render-spec.js +88 -52
  8. package/contrib/copy-tex/README.md +5 -9
  9. package/contrib/copy-tex/copy-tex.css +0 -3
  10. package/contrib/mathtex-script-type/README.md +5 -5
  11. package/contrib/mhchem/README.md +4 -2
  12. package/contrib/render-a11y-string/render-a11y-string.js +31 -2
  13. package/contrib/render-a11y-string/test/render-a11y-string-spec.js +23 -0
  14. package/dist/README.md +8 -7
  15. package/dist/contrib/auto-render.js +148 -171
  16. package/dist/contrib/auto-render.min.js +1 -1
  17. package/dist/contrib/auto-render.mjs +91 -95
  18. package/dist/contrib/copy-tex.css +3 -3
  19. package/dist/contrib/copy-tex.js +11 -108
  20. package/dist/contrib/copy-tex.min.css +1 -1
  21. package/dist/contrib/copy-tex.min.js +1 -1
  22. package/dist/contrib/copy-tex.mjs +21 -20
  23. package/dist/contrib/mathtex-script-type.js +66 -91
  24. package/dist/contrib/mathtex-script-type.min.js +1 -1
  25. package/dist/contrib/mathtex-script-type.mjs +3 -3
  26. package/dist/contrib/mhchem.js +70 -95
  27. package/dist/contrib/mhchem.min.js +1 -1
  28. package/dist/contrib/mhchem.mjs +2 -2
  29. package/dist/contrib/render-a11y-string.js +97 -92
  30. package/dist/contrib/render-a11y-string.min.js +1 -1
  31. package/dist/contrib/render-a11y-string.mjs +86 -45
  32. package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
  33. package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
  34. package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  35. package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  36. package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  37. package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  38. package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  39. package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  40. package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  41. package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  42. package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  43. package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  44. package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  45. package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  46. package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  47. package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
  48. package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
  49. package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
  50. package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  51. package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  52. package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  53. package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
  54. package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
  55. package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
  56. package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
  57. package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
  58. package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
  59. package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  60. package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  61. package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  62. package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
  63. package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
  64. package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
  65. package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  66. package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  67. package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  68. package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  69. package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  70. package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  71. package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  72. package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  73. package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  74. package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
  75. package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
  76. package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
  77. package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
  78. package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
  79. package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  80. package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
  81. package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
  82. package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  83. package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
  84. package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
  85. package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  86. package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
  87. package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
  88. package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  89. package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  90. package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  91. package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  92. package/dist/katex.css +66 -10
  93. package/dist/katex.js +2714 -1950
  94. package/dist/katex.min.css +1 -1
  95. package/dist/katex.min.js +1 -1
  96. package/dist/katex.mjs +3162 -2372
  97. package/katex.js +4 -3
  98. package/package.json +69 -59
  99. package/src/Lexer.js +4 -2
  100. package/src/MacroExpander.js +117 -37
  101. package/src/Options.js +2 -2
  102. package/src/ParseError.js +1 -1
  103. package/src/Parser.js +100 -159
  104. package/src/Settings.js +2 -2
  105. package/src/Style.js +4 -4
  106. package/src/Token.js +1 -1
  107. package/src/buildCommon.js +12 -5
  108. package/src/buildHTML.js +11 -0
  109. package/src/buildMathML.js +6 -0
  110. package/src/defineEnvironment.js +0 -3
  111. package/src/defineFunction.js +15 -22
  112. package/src/delimiter.js +61 -57
  113. package/src/domTree.js +1 -1
  114. package/src/environments/array.js +223 -35
  115. package/src/environments/cd.js +312 -0
  116. package/src/fontMetrics.js +1 -1
  117. package/src/fontMetricsData.js +2076 -0
  118. package/src/fonts/.gitignore +9 -0
  119. package/src/fonts/Makefile +139 -0
  120. package/src/fonts/default.cfg +20 -0
  121. package/src/fonts/generate_fonts.py +61 -0
  122. package/src/fonts/lib/Extra.otf +0 -0
  123. package/src/fonts/lib/Space.ttx +234 -0
  124. package/src/fonts/makeBlacker +49 -0
  125. package/src/fonts/makeFF +2003 -0
  126. package/src/fonts/xbbold.mf +182 -0
  127. package/src/fonts.less +64 -0
  128. package/src/functions/accent.js +3 -2
  129. package/src/functions/arrow.js +8 -2
  130. package/src/functions/color.js +4 -4
  131. package/src/functions/cr.js +7 -25
  132. package/src/functions/def.js +50 -24
  133. package/src/functions/delimsizing.js +8 -0
  134. package/src/functions/enclose.js +80 -12
  135. package/src/functions/environment.js +1 -1
  136. package/src/functions/font.js +3 -4
  137. package/src/functions/genfrac.js +36 -11
  138. package/src/functions/hbox.js +39 -0
  139. package/src/functions/kern.js +1 -0
  140. package/src/functions/mathchoice.js +1 -0
  141. package/src/functions/mclass.js +2 -1
  142. package/src/functions/op.js +3 -7
  143. package/src/functions/operatorname.js +1 -1
  144. package/src/functions/raisebox.js +0 -1
  145. package/src/functions/styling.js +1 -0
  146. package/src/functions/supsub.js +1 -3
  147. package/src/functions/symbolsOrd.js +0 -2
  148. package/src/functions/text.js +2 -3
  149. package/src/functions/vcenter.js +44 -0
  150. package/src/functions.js +3 -0
  151. package/src/katex.less +69 -16
  152. package/src/macros.js +42 -6
  153. package/src/mathMLTree.js +16 -1
  154. package/src/metrics/.gitignore +1 -0
  155. package/src/metrics/README.md +23 -0
  156. package/src/metrics/extract_tfms.py +114 -0
  157. package/src/metrics/extract_ttfs.py +119 -0
  158. package/src/metrics/format_json.py +28 -0
  159. package/src/metrics/mapping.pl +1224 -0
  160. package/src/metrics/parse_tfm.py +211 -0
  161. package/src/parseNode.js +29 -1
  162. package/src/parseTree.js +6 -0
  163. package/src/stretchy.js +12 -5
  164. package/src/svgGeometry.js +33 -4
  165. package/src/symbols.js +5 -3
  166. package/src/types.js +3 -2
  167. package/src/unicodeScripts.js +5 -0
@@ -0,0 +1,211 @@
1
+ class CharInfoWord(object):
2
+ def __init__(self, word):
3
+ b1, b2, b3, b4 = (word >> 24,
4
+ (word & 0xff0000) >> 16,
5
+ (word & 0xff00) >> 8,
6
+ word & 0xff)
7
+
8
+ self.width_index = b1
9
+ self.height_index = b2 >> 4
10
+ self.depth_index = b2 & 0x0f
11
+ self.italic_index = (b3 & 0b11111100) >> 2
12
+ self.tag = b3 & 0b11
13
+ self.remainder = b4
14
+
15
+ def has_ligkern(self):
16
+ return self.tag == 1
17
+
18
+ def ligkern_start(self):
19
+ return self.remainder
20
+
21
+
22
+ class LigKernProgram(object):
23
+ def __init__(self, program):
24
+ self.program = program
25
+
26
+ def execute(self, start, next_char):
27
+ curr_instruction = start
28
+ while True:
29
+ instruction = self.program[curr_instruction]
30
+ (skip, inst_next_char, op, remainder) = instruction
31
+
32
+ if inst_next_char == next_char:
33
+ if op < 128:
34
+ # Don't worry about ligatures for now, we only need kerns
35
+ return None
36
+ else:
37
+ return 256 * (op - 128) + remainder
38
+ elif skip >= 128:
39
+ return None
40
+ else:
41
+ curr_instruction += 1 + skip
42
+
43
+
44
+ class TfmCharMetrics(object):
45
+ def __init__(self, width, height, depth, italic, kern_table):
46
+ self.width = width
47
+ self.height = height
48
+ self.depth = depth
49
+ self.italic_correction = italic
50
+ self.kern_table = kern_table
51
+
52
+
53
+ class TfmFile(object):
54
+ def __init__(self, start_char, end_char, char_info, width_table,
55
+ height_table, depth_table, italic_table, ligkern_table,
56
+ kern_table):
57
+ self.start_char = start_char
58
+ self.end_char = end_char
59
+ self.char_info = char_info
60
+ self.width_table = width_table
61
+ self.height_table = height_table
62
+ self.depth_table = depth_table
63
+ self.italic_table = italic_table
64
+ self.ligkern_program = LigKernProgram(ligkern_table)
65
+ self.kern_table = kern_table
66
+
67
+ def get_char_metrics(self, char_num, fix_rsfs=False):
68
+ """Return glyph metrics for a unicode code point.
69
+
70
+ Arguments:
71
+ char_num: a unicode code point
72
+ fix_rsfs: adjust for rsfs10.tfm's different indexing system
73
+ """
74
+ if char_num < self.start_char or char_num > self.end_char:
75
+ raise RuntimeError("Invalid character number")
76
+
77
+ if fix_rsfs:
78
+ # all of the char_nums contained start from zero in rsfs10.tfm
79
+ info = self.char_info[char_num - self.start_char]
80
+ else:
81
+ info = self.char_info[char_num + self.start_char]
82
+
83
+ char_kern_table = {}
84
+ if info.has_ligkern():
85
+ for char in range(self.start_char, self.end_char + 1):
86
+ kern = self.ligkern_program.execute(info.ligkern_start(), char)
87
+ if kern:
88
+ char_kern_table[char] = self.kern_table[kern]
89
+
90
+ return TfmCharMetrics(
91
+ self.width_table[info.width_index],
92
+ self.height_table[info.height_index],
93
+ self.depth_table[info.depth_index],
94
+ self.italic_table[info.italic_index],
95
+ char_kern_table)
96
+
97
+
98
+ class TfmReader(object):
99
+ def __init__(self, f):
100
+ self.f = f
101
+
102
+ def read_byte(self):
103
+ return ord(self.f.read(1))
104
+
105
+ def read_halfword(self):
106
+ b1 = self.read_byte()
107
+ b2 = self.read_byte()
108
+ return (b1 << 8) | b2
109
+
110
+ def read_word(self):
111
+ b1 = self.read_byte()
112
+ b2 = self.read_byte()
113
+ b3 = self.read_byte()
114
+ b4 = self.read_byte()
115
+ return (b1 << 24) | (b2 << 16) | (b3 << 8) | b4
116
+
117
+ def read_fixword(self):
118
+ word = self.read_word()
119
+
120
+ neg = False
121
+ if word & 0x80000000:
122
+ neg = True
123
+ word = (-word & 0xffffffff)
124
+
125
+ return (-1 if neg else 1) * word / float(1 << 20)
126
+
127
+ def read_bcpl(self, length):
128
+ str_length = self.read_byte()
129
+ data = self.f.read(length - 1)
130
+ return data[:str_length]
131
+
132
+
133
+ def read_tfm_file(file_name):
134
+ with open(file_name, 'rb') as f:
135
+ reader = TfmReader(f)
136
+
137
+ # file_size
138
+ reader.read_halfword()
139
+ header_size = reader.read_halfword()
140
+
141
+ start_char = reader.read_halfword()
142
+ end_char = reader.read_halfword()
143
+
144
+ width_table_size = reader.read_halfword()
145
+ height_table_size = reader.read_halfword()
146
+ depth_table_size = reader.read_halfword()
147
+ italic_table_size = reader.read_halfword()
148
+
149
+ ligkern_table_size = reader.read_halfword()
150
+ kern_table_size = reader.read_halfword()
151
+
152
+ # extensible_table_size
153
+ reader.read_halfword()
154
+ # parameter_table_size
155
+ reader.read_halfword()
156
+
157
+ # checksum
158
+ reader.read_word()
159
+ # design_size
160
+ reader.read_fixword()
161
+
162
+ if header_size > 2:
163
+ # coding_scheme
164
+ reader.read_bcpl(40)
165
+
166
+ if header_size > 12:
167
+ # font_family
168
+ reader.read_bcpl(20)
169
+
170
+ for i in range(header_size - 17):
171
+ reader.read_word()
172
+
173
+ char_info = []
174
+ for i in range(start_char, end_char + 1):
175
+ char_info.append(CharInfoWord(reader.read_word()))
176
+
177
+ width_table = []
178
+ for i in range(width_table_size):
179
+ width_table.append(reader.read_fixword())
180
+
181
+ height_table = []
182
+ for i in range(height_table_size):
183
+ height_table.append(reader.read_fixword())
184
+
185
+ depth_table = []
186
+ for i in range(depth_table_size):
187
+ depth_table.append(reader.read_fixword())
188
+
189
+ italic_table = []
190
+ for i in range(italic_table_size):
191
+ italic_table.append(reader.read_fixword())
192
+
193
+ ligkern_table = []
194
+ for i in range(ligkern_table_size):
195
+ skip = reader.read_byte()
196
+ next_char = reader.read_byte()
197
+ op = reader.read_byte()
198
+ remainder = reader.read_byte()
199
+
200
+ ligkern_table.append((skip, next_char, op, remainder))
201
+
202
+ kern_table = []
203
+ for i in range(kern_table_size):
204
+ kern_table.append(reader.read_fixword())
205
+
206
+ # There is more information, like the ligkern, kern, extensible, and
207
+ # param table, but we don't need these for now
208
+
209
+ return TfmFile(start_char, end_char, char_info, width_table,
210
+ height_table, depth_table, italic_table,
211
+ ligkern_table, kern_table)
package/src/parseNode.js CHANGED
@@ -39,6 +39,22 @@ type ParseNodeTypes = {
39
39
  body: AnyParseNode[][], // List of rows in the (2D) array.
40
40
  rowGaps: (?Measurement)[],
41
41
  hLinesBeforeRow: Array<boolean[]>,
42
+ addEqnNum?: boolean,
43
+ leqno?: boolean,
44
+ isCD?: boolean,
45
+ |},
46
+ "cdlabel": {|
47
+ type: "cdlabel",
48
+ mode: Mode,
49
+ loc?: ?SourceLocation,
50
+ side: string,
51
+ label: AnyParseNode,
52
+ |},
53
+ "cdlabelparent": {|
54
+ type: "cdlabelparent",
55
+ mode: Mode,
56
+ loc?: ?SourceLocation,
57
+ fragment: AnyParseNode,
42
58
  |},
43
59
  "color": {|
44
60
  type: "color",
@@ -207,7 +223,6 @@ type ParseNodeTypes = {
207
223
  type: "cr",
208
224
  mode: Mode,
209
225
  loc?: ?SourceLocation,
210
- newRow: boolean,
211
226
  newLine: boolean,
212
227
  size: ?Measurement,
213
228
  |},
@@ -255,6 +270,12 @@ type ParseNodeTypes = {
255
270
  size: StyleStr | "auto",
256
271
  barSize: Measurement | null,
257
272
  |},
273
+ "hbox": {|
274
+ type: "hbox",
275
+ mode: Mode,
276
+ loc?: ?SourceLocation,
277
+ body: AnyParseNode[],
278
+ |},
258
279
  "horizBrace": {|
259
280
  type: "horizBrace",
260
281
  mode: Mode,
@@ -435,6 +456,12 @@ type ParseNodeTypes = {
435
456
  loc?: ?SourceLocation,
436
457
  body: AnyParseNode,
437
458
  |},
459
+ "vcenter": {|
460
+ type: "vcenter",
461
+ mode: Mode,
462
+ loc?: ?SourceLocation,
463
+ body: AnyParseNode,
464
+ |},
438
465
  "xArrow": {|
439
466
  type: "xArrow",
440
467
  mode: Mode,
@@ -458,6 +485,7 @@ export function assertNodeType<NODETYPE: NodeType>(
458
485
  `Expected node of type ${type}, but got ` +
459
486
  (node ? `node of type ${node.type}` : String(node)));
460
487
  }
488
+ // $FlowFixMe, >=0.125
461
489
  return node;
462
490
  }
463
491
 
package/src/parseTree.js CHANGED
@@ -18,10 +18,16 @@ const parseTree = function(toParse: string, settings: Settings): AnyParseNode[]
18
18
  throw new TypeError('KaTeX can only parse string typed expression');
19
19
  }
20
20
  const parser = new Parser(toParse, settings);
21
+
21
22
  // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors
22
23
  delete parser.gullet.macros.current["\\df@tag"];
24
+
23
25
  let tree = parser.parse();
24
26
 
27
+ // Prevent a color definition from persisting between calls to katex.render().
28
+ delete parser.gullet.macros.current["\\current@color"];
29
+ delete parser.gullet.macros.current["\\color"];
30
+
25
31
  // If the input used \tag, it will set the \df@tag macro to the tag.
26
32
  // In this case, we separately parse the tag and wrap the tree.
27
33
  if (parser.gullet.macros.get("\\df@tag")) {
package/src/stretchy.js CHANGED
@@ -54,11 +54,14 @@ const stretchyCodePoint: {[string]: string} = {
54
54
  xrightleftarrows: "\u21c4",
55
55
  xrightequilibrium: "\u21cc", // Not a perfect match.
56
56
  xleftequilibrium: "\u21cb", // None better available.
57
+ "\\\\cdrightarrow": "\u2192",
58
+ "\\\\cdleftarrow": "\u2190",
59
+ "\\\\cdlongequal": "=",
57
60
  };
58
61
 
59
62
  const mathMLnode = function(label: string): mathMLTree.MathNode {
60
63
  const node = new mathMLTree.MathNode(
61
- "mo", [new mathMLTree.TextNode(stretchyCodePoint[label.substr(1)])]);
64
+ "mo", [new mathMLTree.TextNode(stretchyCodePoint[label])]);
62
65
  node.setAttribute("stretchy", "true");
63
66
  return node;
64
67
  };
@@ -118,7 +121,9 @@ const katexImagesData: {
118
121
  underrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"],
119
122
  underleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"],
120
123
  xrightarrow: [["rightarrow"], 1.469, 522, "xMaxYMin"],
124
+ "\\cdrightarrow": [["rightarrow"], 3.0, 522, "xMaxYMin"], // CD minwwidth2.5pc
121
125
  xleftarrow: [["leftarrow"], 1.469, 522, "xMinYMin"],
126
+ "\\cdleftarrow": [["leftarrow"], 3.0, 522, "xMinYMin"],
122
127
  Overrightarrow: [["doublerightarrow"], 0.888, 560, "xMaxYMin"],
123
128
  xRightarrow: [["doublerightarrow"], 1.526, 560, "xMaxYMin"],
124
129
  xLeftarrow: [["doubleleftarrow"], 1.526, 560, "xMinYMin"],
@@ -129,6 +134,7 @@ const katexImagesData: {
129
134
  xrightharpoonup: [["rightharpoon"], 0.888, 522, "xMaxYMin"],
130
135
  xrightharpoondown: [["rightharpoondown"], 0.888, 522, "xMaxYMin"],
131
136
  xlongequal: [["longequal"], 0.888, 334, "xMinYMin"],
137
+ "\\cdlongequal": [["longequal"], 3.0, 334, "xMinYMin"],
132
138
  xtwoheadleftarrow: [["twoheadleftarrow"], 0.888, 334, "xMinYMin"],
133
139
  xtwoheadrightarrow: [["twoheadrightarrow"], 0.888, 334, "xMaxYMin"],
134
140
 
@@ -304,14 +310,15 @@ const svgSpan = function(
304
310
  const encloseSpan = function(
305
311
  inner: HtmlDomNode,
306
312
  label: string,
307
- pad: number,
313
+ topPad: number,
314
+ bottomPad: number,
308
315
  options: Options,
309
316
  ): DomSpan | SvgSpan {
310
- // Return an image span for \cancel, \bcancel, \xcancel, or \fbox
317
+ // Return an image span for \cancel, \bcancel, \xcancel, \fbox, or \angl
311
318
  let img;
312
- const totalHeight = inner.height + inner.depth + 2 * pad;
319
+ const totalHeight = inner.height + inner.depth + topPad + bottomPad;
313
320
 
314
- if (/fbox|color/.test(label)) {
321
+ if (/fbox|color|angl/.test(label)) {
315
322
  img = buildCommon.makeSpan(["stretchy", label], [], options);
316
323
 
317
324
  if (label === "fbox") {
@@ -98,6 +98,11 @@ s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,1
98
98
  606zM${1001 + extraViniculum} ${hLinePad}h400000v${40 + extraViniculum}H1017.7z`;
99
99
  };
100
100
 
101
+ export const phasePath = function(y: number): string {
102
+ const x = y / 2; // x coordinate at top of angle
103
+ return `M400000 ${y} H0 L${x} 0 l65 45 L145 ${y - 80} H400000z`;
104
+ };
105
+
101
106
  const sqrtTall = function(
102
107
  extraViniculum: number,
103
108
  hLinePad: number,
@@ -146,11 +151,35 @@ export const sqrtPath = function(
146
151
  return path;
147
152
  };
148
153
 
149
- export const path: {[string]: string} = {
150
- // Two paths that cover gaps in built-up parentheses.
151
- leftParenInner: `M291 0 H417 V300 H291 z`,
152
- rightParenInner: `M457 0 H583 V300 H457 z`,
154
+ export const innerPath = function(name: string, height: number): string {
155
+ // The inner part of stretchy tall delimiters
156
+ switch (name) {
157
+ case "\u239c":
158
+ return `M291 0 H417 V${height} H291z M291 0 H417 V${height} H291z`;
159
+ case "\u2223":
160
+ return `M145 0 H188 V${height} H145z M145 0 H188 V${height} H145z`;
161
+ case "\u2225":
162
+ return `M145 0 H188 V${height} H145z M145 0 H188 V${height} H145z` +
163
+ `M367 0 H410 V${height} H367z M367 0 H410 V${height} H367z`;
164
+ case "\u239f":
165
+ return `M457 0 H583 V${height} H457z M457 0 H583 V${height} H457z`;
166
+ case "\u23a2":
167
+ return `M319 0 H403 V${height} H319z M319 0 H403 V${height} H319z`;
168
+ case "\u23a5":
169
+ return `M263 0 H347 V${height} H263z M263 0 H347 V${height} H263z`;
170
+ case "\u23aa":
171
+ return `M384 0 H504 V${height} H384z M384 0 H504 V${height} H384z`;
172
+ case "\u23d0":
173
+ return `M312 0 H355 V${height} H312z M312 0 H355 V${height} H312z`;
174
+ case "\u2016":
175
+ return `M257 0 H300 V${height} H257z M257 0 H300 V${height} H257z` +
176
+ `M478 0 H521 V${height} H478z M478 0 H521 V${height} H478z`;
177
+ default:
178
+ return "";
179
+ }
180
+ };
153
181
 
182
+ export const path: {[string]: string} = {
154
183
  // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main
155
184
  doubleleftarrow: `M262 157
156
185
  l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3
package/src/symbols.js CHANGED
@@ -168,7 +168,7 @@ defineSymbol(math, main, bin, "\u228e", "\\uplus", true);
168
168
  defineSymbol(math, main, bin, "\u2293", "\\sqcap", true);
169
169
  defineSymbol(math, main, bin, "\u2217", "\\ast");
170
170
  defineSymbol(math, main, bin, "\u2294", "\\sqcup", true);
171
- defineSymbol(math, main, bin, "\u25ef", "\\bigcirc");
171
+ defineSymbol(math, main, bin, "\u25ef", "\\bigcirc", true);
172
172
  defineSymbol(math, main, bin, "\u2219", "\\bullet");
173
173
  defineSymbol(math, main, bin, "\u2021", "\\ddagger");
174
174
  defineSymbol(math, main, bin, "\u2240", "\\wr", true);
@@ -438,6 +438,8 @@ defineSymbol(math, ams, rel, "\u21b0", "\\Lsh", true);
438
438
  defineSymbol(math, ams, rel, "\u21c8", "\\upuparrows", true);
439
439
  defineSymbol(math, ams, rel, "\u21bf", "\\upharpoonleft", true);
440
440
  defineSymbol(math, ams, rel, "\u21c3", "\\downharpoonleft", true);
441
+ defineSymbol(math, main, rel, "\u22b6", "\\origof", true); // not in font
442
+ defineSymbol(math, main, rel, "\u22b7", "\\imageof", true); // not in font
441
443
  defineSymbol(math, ams, rel, "\u22b8", "\\multimap", true);
442
444
  defineSymbol(math, ams, rel, "\u21ad", "\\leftrightsquigarrow", true);
443
445
  defineSymbol(math, ams, rel, "\u21c9", "\\rightrightarrows", true);
@@ -580,13 +582,11 @@ defineSymbol(math, main, rel, "\u2192", "\\to");
580
582
  defineSymbol(math, ams, rel, "\u2271", "\\ngeq", true);
581
583
  defineSymbol(math, ams, rel, "\u2270", "\\nleq", true);
582
584
  defineSymbol(math, main, spacing, "\u00a0", "\\ ");
583
- defineSymbol(math, main, spacing, "\u00a0", "~");
584
585
  defineSymbol(math, main, spacing, "\u00a0", "\\space");
585
586
  // Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{%
586
587
  defineSymbol(math, main, spacing, "\u00a0", "\\nobreakspace");
587
588
  defineSymbol(text, main, spacing, "\u00a0", "\\ ");
588
589
  defineSymbol(text, main, spacing, "\u00a0", " ");
589
- defineSymbol(text, main, spacing, "\u00a0", "~");
590
590
  defineSymbol(text, main, spacing, "\u00a0", "\\space");
591
591
  defineSymbol(text, main, spacing, "\u00a0", "\\nobreakspace");
592
592
  defineSymbol(math, main, spacing, null, "\\nobreak");
@@ -661,6 +661,8 @@ defineSymbol(math, main, op, "\u2a02", "\\bigotimes");
661
661
  defineSymbol(math, main, op, "\u2a01", "\\bigoplus");
662
662
  defineSymbol(math, main, op, "\u2a00", "\\bigodot");
663
663
  defineSymbol(math, main, op, "\u222e", "\\oint");
664
+ defineSymbol(math, main, op, "\u222f", "\\oiint");
665
+ defineSymbol(math, main, op, "\u2230", "\\oiiint");
664
666
  defineSymbol(math, main, op, "\u2a06", "\\bigsqcup");
665
667
  defineSymbol(math, main, op, "\u222b", "\\smallint");
666
668
  defineSymbol(text, main, inner, "\u2026", "\\textellipsis");
package/src/types.js CHANGED
@@ -21,13 +21,14 @@ export type Mode = "math" | "text";
21
21
  // argument is parsed normally)
22
22
  // - Mode: Node group parsed in given mode.
23
23
  export type ArgType = "color" | "size" | "url" | "raw" | "original" | "hbox" |
24
- Mode;
24
+ "primitive" | Mode;
25
25
 
26
26
  // LaTeX display style.
27
27
  export type StyleStr = "text" | "display" | "script" | "scriptscript";
28
28
 
29
29
  // Allowable token text for "break" arguments in parser.
30
- export type BreakToken = "]" | "}" | "\\endgroup" | "$" | "\\)" | "\\cr";
30
+ export type BreakToken = "]" | "}" | "\\endgroup" | "$" | "\\)" | "\\\\" | "\\end" |
31
+ "EOF";
31
32
 
32
33
  // Math font variants.
33
34
  export type FontVariant = "bold" | "bold-italic" | "bold-sans-serif" |
@@ -38,6 +38,11 @@ const scriptData: Array<Script> = [
38
38
  name: 'cyrillic',
39
39
  blocks: [[0x0400, 0x04ff]],
40
40
  },
41
+ {
42
+ // Armenian
43
+ name: 'armenian',
44
+ blocks: [[0x0530, 0x058F]],
45
+ },
41
46
  {
42
47
  // The Brahmic scripts of South and Southeast Asia
43
48
  // Devanagari (0900–097F)