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.
- package/CHANGELOG.md +112 -0
- package/LICENSE +1 -1
- package/README.md +8 -7
- package/contrib/auto-render/auto-render.js +12 -19
- package/contrib/auto-render/index.html +9 -3
- package/contrib/auto-render/splitAtDelimiters.js +44 -61
- package/contrib/auto-render/test/auto-render-spec.js +88 -52
- package/contrib/copy-tex/README.md +5 -9
- package/contrib/copy-tex/copy-tex.css +0 -3
- package/contrib/mathtex-script-type/README.md +5 -5
- package/contrib/mhchem/README.md +4 -2
- package/contrib/render-a11y-string/render-a11y-string.js +31 -2
- package/contrib/render-a11y-string/test/render-a11y-string-spec.js +23 -0
- package/dist/README.md +8 -7
- package/dist/contrib/auto-render.js +148 -171
- package/dist/contrib/auto-render.min.js +1 -1
- package/dist/contrib/auto-render.mjs +91 -95
- package/dist/contrib/copy-tex.css +3 -3
- package/dist/contrib/copy-tex.js +11 -108
- package/dist/contrib/copy-tex.min.css +1 -1
- package/dist/contrib/copy-tex.min.js +1 -1
- package/dist/contrib/copy-tex.mjs +21 -20
- package/dist/contrib/mathtex-script-type.js +66 -91
- package/dist/contrib/mathtex-script-type.min.js +1 -1
- package/dist/contrib/mathtex-script-type.mjs +3 -3
- package/dist/contrib/mhchem.js +70 -95
- package/dist/contrib/mhchem.min.js +1 -1
- package/dist/contrib/mhchem.mjs +2 -2
- package/dist/contrib/render-a11y-string.js +97 -92
- package/dist/contrib/render-a11y-string.min.js +1 -1
- package/dist/contrib/render-a11y-string.mjs +86 -45
- package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/dist/katex.css +66 -10
- package/dist/katex.js +2714 -1950
- package/dist/katex.min.css +1 -1
- package/dist/katex.min.js +1 -1
- package/dist/katex.mjs +3162 -2372
- package/katex.js +4 -3
- package/package.json +69 -59
- package/src/Lexer.js +4 -2
- package/src/MacroExpander.js +117 -37
- package/src/Options.js +2 -2
- package/src/ParseError.js +1 -1
- package/src/Parser.js +100 -159
- package/src/Settings.js +2 -2
- package/src/Style.js +4 -4
- package/src/Token.js +1 -1
- package/src/buildCommon.js +12 -5
- package/src/buildHTML.js +11 -0
- package/src/buildMathML.js +6 -0
- package/src/defineEnvironment.js +0 -3
- package/src/defineFunction.js +15 -22
- package/src/delimiter.js +61 -57
- package/src/domTree.js +1 -1
- package/src/environments/array.js +223 -35
- package/src/environments/cd.js +312 -0
- package/src/fontMetrics.js +1 -1
- package/src/fontMetricsData.js +2076 -0
- package/src/fonts/.gitignore +9 -0
- package/src/fonts/Makefile +139 -0
- package/src/fonts/default.cfg +20 -0
- package/src/fonts/generate_fonts.py +61 -0
- package/src/fonts/lib/Extra.otf +0 -0
- package/src/fonts/lib/Space.ttx +234 -0
- package/src/fonts/makeBlacker +49 -0
- package/src/fonts/makeFF +2003 -0
- package/src/fonts/xbbold.mf +182 -0
- package/src/fonts.less +64 -0
- package/src/functions/accent.js +3 -2
- package/src/functions/arrow.js +8 -2
- package/src/functions/color.js +4 -4
- package/src/functions/cr.js +7 -25
- package/src/functions/def.js +50 -24
- package/src/functions/delimsizing.js +8 -0
- package/src/functions/enclose.js +80 -12
- package/src/functions/environment.js +1 -1
- package/src/functions/font.js +3 -4
- package/src/functions/genfrac.js +36 -11
- package/src/functions/hbox.js +39 -0
- package/src/functions/kern.js +1 -0
- package/src/functions/mathchoice.js +1 -0
- package/src/functions/mclass.js +2 -1
- package/src/functions/op.js +3 -7
- package/src/functions/operatorname.js +1 -1
- package/src/functions/raisebox.js +0 -1
- package/src/functions/styling.js +1 -0
- package/src/functions/supsub.js +1 -3
- package/src/functions/symbolsOrd.js +0 -2
- package/src/functions/text.js +2 -3
- package/src/functions/vcenter.js +44 -0
- package/src/functions.js +3 -0
- package/src/katex.less +69 -16
- package/src/macros.js +42 -6
- package/src/mathMLTree.js +16 -1
- package/src/metrics/.gitignore +1 -0
- package/src/metrics/README.md +23 -0
- package/src/metrics/extract_tfms.py +114 -0
- package/src/metrics/extract_ttfs.py +119 -0
- package/src/metrics/format_json.py +28 -0
- package/src/metrics/mapping.pl +1224 -0
- package/src/metrics/parse_tfm.py +211 -0
- package/src/parseNode.js +29 -1
- package/src/parseTree.js +6 -0
- package/src/stretchy.js +12 -5
- package/src/svgGeometry.js +33 -4
- package/src/symbols.js +5 -3
- package/src/types.js +3 -2
- 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
|
|
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
|
-
|
|
313
|
+
topPad: number,
|
|
314
|
+
bottomPad: number,
|
|
308
315
|
options: Options,
|
|
309
316
|
): DomSpan | SvgSpan {
|
|
310
|
-
// Return an image span for \cancel, \bcancel, \xcancel, or \
|
|
317
|
+
// Return an image span for \cancel, \bcancel, \xcancel, \fbox, or \angl
|
|
311
318
|
let img;
|
|
312
|
-
const totalHeight = inner.height + inner.depth +
|
|
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") {
|
package/src/svgGeometry.js
CHANGED
|
@@ -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
|
|
150
|
-
//
|
|
151
|
-
|
|
152
|
-
|
|
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" | "$" | "\\)" | "\\
|
|
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" |
|
package/src/unicodeScripts.js
CHANGED
|
@@ -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)
|