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,1224 @@
1
+ #! /usr/bin/perl
2
+
3
+ # Adapted from the MathJax-dev repository file /fonts/OTF/TeX/makeFF under the
4
+ # Apache 2 license
5
+
6
+ # We use this file to recover the mapping from TeX fonts to KaTeX fonts, to
7
+ # accurately extract the metrics from the corresponding .tfm (TeX font metric)
8
+ # files
9
+
10
+ use JSON;
11
+
12
+ $map{cmr10} = {
13
+ "Main-Regular" => [
14
+ [0,1] => 0x393, # \Gamma, \Delta
15
+ 2 => 0x398, # \Theta
16
+ 3 => 0x39B, # \Lambda
17
+ 4 => 0x39E, # \Xi
18
+ 5 => 0x3A0, # \Pi
19
+ 6 => 0x3A3, # \Sigma
20
+ [7,8] => 0x3A5, # \Upsilon, \Phi
21
+ [9,0xA] => 0x3A8, # \Psi, \Omega
22
+
23
+ 0x10 => 0x131, # \i
24
+ 0x11 => 0x237, # \j
25
+ 0x12 => 0x2CB, # \grave
26
+ 0x13 => 0x2CA, # \acute
27
+ 0x14 => 0x2C7, # \check
28
+ 0x15 => 0x2D8, # \breve
29
+ 0x16 => 0x2C9, # \bar
30
+ 0x17 => [0xB0,-125,0], # \degree
31
+ 0x17 => 0x02DA, # \r, ring above
32
+ 0x18 => 0xB8, # \c, cedilla
33
+
34
+ [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., /
35
+ 0x22 => 0x201D, # "
36
+ 0x27 => 0x2019, # '
37
+ [0x30,0x39] => 0x30, # 0-9
38
+ [0x3A,0x3B] => 0x3A, # :, ;
39
+ 0x3D => 0x3D, # =
40
+ [0x3F,0x40] => 0x3F, # ?, @
41
+ [0x41,0x5A] => 0x41, # A-Z
42
+ 0x5B => 0x5B, # [
43
+ 0x5C => 0x201C, # ``
44
+ [0x5D,0x5E] => 0x5D, # ], ^
45
+ 0x5E => 0x2C6, # \hat
46
+ 0x5F => 0x2D9, # \dot
47
+ 0x60 => 0x2018, # `
48
+ [0x61,0x7A] => 0x61, # a-z
49
+ [0x7B,0x7C] => 0x2013, # \endash, \emdash
50
+ 0x7B => [0x5F,0,-310], # underline
51
+ 0x7D => 0x2DD, # double acute
52
+ 0x7E => [0x7E,0,-350], # ~
53
+ 0x7E => 0x2DC, # \tilde
54
+ 0x7F => 0xA8, # \ddot
55
+ 0x19 => 0xDF, # sharp S
56
+ 0x1A => 0xE6, # ae ligature
57
+ 0x1B => 0x153, # oe ligature
58
+ 0x1C => 0xF8, # o with slash
59
+ 0x1D => 0xC6, # AE ligature
60
+ 0x1E => 0x152, # OE ligature
61
+ 0x1F => 0xD8, # O with slash
62
+ ],
63
+ };
64
+
65
+ $map{cmmi10} = {
66
+ "Math-Italic" => [
67
+ [0,1] => 0x393, # \Gamma, \Delta
68
+ 2 => 0x398, # \Theta
69
+ 3 => 0x39B, # \Lambda
70
+ 4 => 0x39E, # \Xi
71
+ 5 => 0x3A0, # \Pi
72
+ 6 => 0x3A3, # \Sigma
73
+ [7,8] => 0x3A5, # \Upsilon, \Phi
74
+ [9,0xA] => 0x3A8, # \Psi, \Omega
75
+
76
+ [0xB,0xE] => 0x3B1, # \alpha, \beta, \gamma, \delta
77
+ 0xF => 0x3F5, # \elpsilon
78
+ [0x10,0x18] => 0x3B6, # \zeta, \eta, \theta, \iota, \kappa, \lambda, \mu, \nu, \xi
79
+ [0x19,0x1A] => 0x3C0, # \pi, \rho
80
+ [0x1B,0x1D] => 0x3C3, # \sigma, \tau, \upsilon
81
+ 0x1E => 0x3D5, # \phi
82
+ [0x1F,0x21] => 0x3C7, # \chi, \psi, \omega
83
+ 0x22 => 0x3B5, # \varepsilon
84
+ 0x23 => 0x3D1, # \vartheta
85
+ 0x24 => 0x3D6, # \varpi
86
+ 0x25 => 0x3F1, # \varrho
87
+ 0x26 => 0x3C2, # \varsigma
88
+ 0x27 => 0x3C6, # \varphi
89
+
90
+ [0x30,0x39] => 0x30, # Oldstyle 0-9
91
+ [0x41,0x5A] => 0x41, # A-Z
92
+ [0x61,0x7A] => 0x61, # a - z
93
+
94
+ 0x6F => 0x3BF, # omicron
95
+ 0x7B => 0xE131, # \imath (PUA)
96
+ 0x7C => 0xE237, # \jmath (PUA)
97
+ ],
98
+
99
+ "Main-Regular" => [
100
+ 0x28 => 0x21BC, # \leftharpoonup
101
+ 0x29 => 0x21BD, # \leftharpoondown
102
+ 0x2A => 0x21C0, # \rightharpoonup
103
+ 0x2B => 0x21C1, # \rightharpoondown
104
+
105
+ 0x2E => 0x25B9, # \triangleright
106
+ 0x2F => 0x25C3, # \triangleleft
107
+
108
+ 0x3C => 0x3C, # <
109
+ 0x3D => 0x2215, # /
110
+ 0x3E => 0x3E, # >
111
+ 0x3F => 0x22C6, # \star
112
+ 0x40 => 0x2202, # \partial
113
+
114
+ [0x5B,0x5D] => 0x266D, # \flat, \natural, \sharp
115
+ 0x5E => 0x2323, # \smile
116
+ 0x5F => 0x2322, # \frown
117
+ 0x60 => 0x2113, # \ell
118
+
119
+ 0x7D => 0x2118, # \wp
120
+ 0x7E => [0x20D7,-653,0],# \vec
121
+ ],
122
+ };
123
+
124
+ $map{cmsy10} = {
125
+ "Main-Regular" => [
126
+ 0 => 0x2212, # -
127
+ 1 => 0x22C5, # \cdot
128
+ 2 => 0xD7, # \times
129
+ 3 => 0x2217, # \ast
130
+ 4 => 0xF7, # \div
131
+ 5 => 0x22C4, # \diamond
132
+ 6 => 0xB1, # \pm
133
+ 7 => 0x2213, # \mp
134
+ [8,0xC] => 0x2295, # \oplus, \ominus, \otimes, \oslash, \odot
135
+ 0xD => 0x25EF, # \bigcirc
136
+ [0xE,0xF] => 0x2218, # \circ, \bullet
137
+
138
+ 0x10 => 0x224D, # \asymp
139
+ 0x11 => 0x2261, # \equiv
140
+ [0x12,0x13] => 0x2286, # \subseteq, \supseteq
141
+ [0x14,0x15] => 0x2264, # \leq, \geq
142
+ [0x16,0x17] => 0x2AAF, # \preceq, \succeq
143
+ 0x18 => 0x223C, # \sim
144
+ 0x19 => 0x2248, # \approx
145
+ [0x1A,0x1B] => 0x2282, # \subset, \supset
146
+ [0x1C,0x1D] => 0x226A, # \ll, \gg
147
+ [0x1E,0x1F] => 0x227A, # \prec, \succ
148
+
149
+ 0x20 => 0x2190, # \leftarrow
150
+ 0x21 => 0x2192, # \rightarrow
151
+ 0x22 => 0x2191, # \uparrow
152
+ 0x23 => 0x2193, # \downarrow
153
+ 0x24 => 0x2194, # \leftrightarrow
154
+ 0x25 => 0x2197, # \nearrow
155
+ 0x26 => 0x2198, # \searrow
156
+ 0x27 => 0x2243, # \simeq
157
+
158
+ 0x28 => 0x21D0, # \Leftarrow
159
+ 0x29 => 0x21D2, # \Rightarrow
160
+ 0x2A => 0x21D1, # \Uparrow
161
+ 0x2B => 0x21D3, # \Downarrow
162
+ 0x2C => 0x21D4, # \Leftrightarrow
163
+ 0x2D => 0x2196, # \nwarrow
164
+ 0x2E => 0x2199, # \swarrow
165
+ 0x2F => 0x221D, # \propto
166
+
167
+ 0x30 => 0x2032, # \prime
168
+ 0x31 => 0x221E, # \infty
169
+ 0x32 => 0x2208, # \in
170
+ 0x33 => 0x220B, # \ni
171
+ 0x34 => 0x25B3, # \bigtriangleup and \triangle
172
+ 0x35 => 0x25BD, # \bigtriangledown
173
+ 0x36 => 0xE020, # \not
174
+
175
+ 0x38 => 0x2200, # \forall
176
+ 0x39 => 0x2203, # \exists
177
+ 0x3A => 0xAC, # \neg
178
+ 0x3B => 0x2205, # \emptyset
179
+ 0x3C => 0x211C, # \Re
180
+ 0x3D => 0x2111, # \Im
181
+ 0x3E => 0x22A4, # \top
182
+ 0x3F => 0x22A5, # \bot
183
+
184
+ 0x40 => 0x2135, # \aleph
185
+
186
+ 0x5B => 0x222A, # \cup
187
+ 0x5C => 0x2229, # \cap
188
+ 0x5D => 0x228E, # \uplus
189
+ [0x5E,0x5F] => 0x2227, # \wedge, \vee
190
+
191
+ [0x60,0x61] => 0x22A2, # \vdash, \dashv
192
+ [0x62,0x63] => 0x230A, # \lfloor, \rfloor
193
+ [0x64,0x65] => 0x2308, # \lceil, \rceil
194
+ 0x66 => 0x7B, # {
195
+ 0x67 => 0x7D, # }
196
+ [0x68,0x69] => 0x27E8, # \langle, \rangle
197
+ 0x6A => 0x7C, # |
198
+ 0x6A => 0x2223, # \vert
199
+ 0x6B => 0x2225, # \Vert
200
+ 0x6C => 0x2195, # \updownarrow
201
+ 0x6D => 0x21D5, # \Updownarrow
202
+ 0x6E => 0x5C, # \backslash
203
+ 0x6E => 0x2216, # \setminus
204
+ 0x6F => 0x2240, # \wr
205
+
206
+ 0x70 => [0x221A,0,760], # \surd ### adjust position so font doesn't have a large depth
207
+ 0x71 => 0x2A3F, # \amalg
208
+ 0x72 => 0x2207, # \nabla
209
+ 0x73 => 0x222B, # \int
210
+ 0x74 => 0x2294, # \sqcup
211
+ 0x75 => 0x2293, # \sqcap
212
+ [0x76,0x77] => 0x2291, # \sqsubseteq, \sqsupseteq
213
+ 0x78 => 0xA7, # \S
214
+ [0x79,0x7A] => 0x2020, # \dagger, \ddagger
215
+ 0x7B => 0xB6, # \P
216
+ 0x7C => 0x2663, # \clubsuit
217
+ 0x7D => 0x2662, # \diamondsuit
218
+ 0x7E => 0x2661, # \heartsuit
219
+ 0x7F => 0x2660, # \spadesuit
220
+ ],
221
+
222
+ "Caligraphic-Regular" => [
223
+ [0x41,0x5A] => 0x41, # A-Z
224
+ ],
225
+ };
226
+
227
+ $map{cmex10} = {
228
+ "Size1" => [
229
+ 0 => [0x28,0,810], # (
230
+ 1 => [0x29,0,810], # )
231
+ 2 => [0x5B,0,810], # [
232
+ 3 => [0x5D,0,810], # ]
233
+ 4 => [0x230A,0,810], # \lfloor
234
+ 5 => [0x230B,0,810], # \rfloor
235
+ 6 => [0x2308,0,810], # \lceil
236
+ 7 => [0x2309,0,810], # \rceil
237
+ 8 => [0x7B,0,810], # {
238
+ 9 => [0x7D,0,810], # }
239
+ 0xA => [0x27E8,0,810], # \langle
240
+ 0xB => [0x27E9,0,810], # \rangle
241
+ 0xC => [0x2223,0,606], # \vert
242
+ 0xD => [0x2225,0,606], # \Vert
243
+ 0xE => [0x2F,0,810], # /
244
+ 0xF => [0x5C,0,810], # \
245
+
246
+ 0x46 => [0x2A06,0,750], # \bigsqcup
247
+ 0x48 => [0x222E,0,805], # \oint
248
+ 0x4A => [0x2A00,0,750], # \bigodot
249
+ 0x4C => [0x2A01,0,750], # \bigoplus
250
+ 0x4E => [0x2A02,0,750], # \bigotimes
251
+
252
+ 0x50 => [0x2211,0,750], # \sum
253
+ 0x51 => [0x220F,0,750], # \prod
254
+ 0x52 => [0x222B,0,805], # \int
255
+ 0x53 => [0x22C3,0,750], # \bigcup
256
+ 0x54 => [0x22C2,0,750], # \bigcap
257
+ 0x55 => [0x2A04,0,750], # \biguplus
258
+ 0x56 => [0x22C0,0,750], # \bigwedge
259
+ 0x57 => [0x22C1,0,750], # \bigvee
260
+
261
+ 0x60 => [0x2210,0,750], # \coprod
262
+ 0x62 => 0x2C6, # \widehat
263
+ 0x62 => [0x302,-556,0], # \widehat (combining)
264
+ 0x65 => 0x2DC, # \widetilde
265
+ 0x65 => [0x303,-556,0], # \widetilde (combining)
266
+
267
+ 0x70 => [0x221A,0,810], # surd
268
+ 0x3F => [0x23D0,0,601], # arrow extension
269
+ 0x77 => [0x2016,0,601], # Arrow extension (non-standard)
270
+ 0x78 => [0x2191,0,600], # uparrow top
271
+ 0x79 => [0x2193,0,600], # downarrow bottom
272
+ 0x7E => [0x21D1,0,600], # Uparrow top
273
+ 0x7F => [0x21D3,0,600], # Downarrow bottom
274
+ ],
275
+
276
+ "Size2" => [
277
+ 0x10 => [0x28,0,1110], # (
278
+ 0x11 => [0x29,0,1110], # )
279
+ 0x2E => [0x2F,0,1110], # /
280
+ 0x2F => [0x5C,0,1110], # \
281
+ 0x44 => [0x27E8,0,1110],# \langle
282
+ 0x45 => [0x27E9,0,1110],# \rangle
283
+
284
+ 0x47 => [0x2A06,0,950], # \bigsqcup
285
+ 0x49 => [0x222E,0,1360],# \oint
286
+ 0x4B => [0x2A00,0,950], # \bigodot
287
+ 0x4D => [0x2A01,0,950], # \bigoplus
288
+ 0x4F => [0x2A02,0,950], # \bigotimes
289
+
290
+ 0x58 => [0x2211,0,950], # \sum
291
+ 0x59 => [0x220F,0,950], # \prod
292
+ 0x5A => [0x222B,0,1360],# \int
293
+ 0x5B => [0x22C3,0,950], # \bigcup
294
+ 0x5C => [0x22C2,0,950], # \bigcap
295
+ 0x5D => [0x2A04,0,950], # \biguplus
296
+ 0x5E => [0x22C0,0,950], # \bigwedge
297
+ 0x5F => [0x22C1,0,950], # \bigvee
298
+ 0x61 => [0x2210,0,950], # \coprod
299
+
300
+ 0x63 => 0x2C6, # \widehat
301
+ 0x63 => [0x302,-1000,0],# \widehat (combining)
302
+ 0x66 => 0x2DC, # \widetilde
303
+ 0x66 => [0x303,-1000,0],# \widetilde (combining)
304
+
305
+ 0x68 => [0x5B,0,1110], # [
306
+ 0x69 => [0x5D,0,1110], # ]
307
+ 0x6A => [0x230A,0,1110],# \lfloor
308
+ 0x6B => [0x230B,0,1110],# \rfloor
309
+ 0x6C => [0x2308,0,1110],# \lceil
310
+ 0x6D => [0x2309,0,1110],# \rceil
311
+ 0x6E => [0x7B,0,1110], # {
312
+ 0x6F => [0x7D,0,1110], # }
313
+ 0x71 => [0x221A,0,1110],# surd
314
+ ],
315
+
316
+ "Size3" => [
317
+ 0x12 => [0x28,0,1410], # (
318
+ 0x13 => [0x29,0,1410], # )
319
+ 0x14 => [0x5B,0,1410], # [
320
+ 0x15 => [0x5D,0,1410], # ]
321
+ 0x16 => [0x230A,0,1410],# \lfloor
322
+ 0x17 => [0x230B,0,1410],# \rfloor
323
+ 0x18 => [0x2308,0,1410],# \lceil
324
+ 0x19 => [0x2309,0,1410],# \rceil
325
+ 0x1A => [0x7B,0,1410], # {
326
+ 0x1B => [0x7D,0,1410], # }
327
+ 0x1C => [0x27E8,0,1410],# \langle
328
+ 0x1D => [0x27E9,0,1410],# \rangle
329
+ 0x1E => [0x2F,0,1410], # /
330
+ 0x1F => [0x5C,0,1410], # \
331
+ 0x64 => 0x2C6, # \widehat
332
+ 0x64 => [0x302,-1444,0],# \widehat (combining)
333
+ 0x67 => 0x2DC, # \widetilde
334
+ 0x67 => [0x303,-1444,0],# \widetilde (combining)
335
+ 0x72 => [0x221A,0,1410],# surd
336
+ ],
337
+
338
+ "Size4" => [
339
+ 0x20 => [0x28,0,1710], # (
340
+ 0x21 => [0x29,0,1710], # )
341
+ 0x22 => [0x5B,0,1710], # [
342
+ 0x23 => [0x5D,0,1710], # ]
343
+ 0x24 => [0x230A,0,1710],# \lfloor
344
+ 0x25 => [0x230B,0,1710],# \rfloor
345
+ 0x26 => [0x2308,0,1710],# \lceil
346
+ 0x27 => [0x2309,0,1710],# \rceil
347
+ 0x28 => [0x7B,0,1710], # {
348
+ 0x29 => [0x7D,0,1710], # }
349
+ 0x2A => [0x27E8,0,1710],# \langle
350
+ 0x2B => [0x27E9,0,1710],# \rangle
351
+ 0x2C => [0x2F,0,1710], # /
352
+ 0x2D => [0x5C,0,1710], # \
353
+ 0x73 => [0x221A,0,1710],# surd
354
+
355
+ 0x30 => [0x239B,0,1115],# left paren upper hook
356
+ 0x31 => [0x239E,0,1115],# right paren upper hook
357
+ 0x32 => [0x23A1,0,1115],# left square bracket upper corner
358
+ 0x33 => [0x23A4,0,1115],# right square bracket upper corner
359
+ 0x34 => [0x23A3,0,1115],# left square bracket lower corner
360
+ 0x35 => [0x23A6,0,1115],# right square bracket lower hook
361
+ 0x36 => [0x23A2,0,601], # left square bracket extension
362
+ 0x37 => [0x23A5,0,601], # right square bracket extension
363
+ 0x38 => [0x23A7,0,900], # left curly brace upper hook
364
+ 0x39 => [0x23AB,0,900], # right curly brace upper hook
365
+ 0x3A => 0x23A9, # left curly brace lower hook
366
+ 0x3B => 0x23AD, # right curly brace lower hook
367
+ 0x3C => [0x23A8,0,1150],# left curly brace middle
368
+ 0x3D => [0x23AC,0,1150],# right curly brace middle
369
+ 0x3E => [0x23AA,0,300], # curly brace extension
370
+
371
+ 0x40 => [0x239D,0,1115],# left paren lower hook
372
+ 0x41 => [0x23A0,0,1115],# right paren lower hook
373
+ 0x42 => [0x239C,0,600], # left paren extension
374
+ 0x43 => [0x239F,0,600], # right paren extension
375
+
376
+ 0x74 => [0x23B7,0,915], # radical bottom
377
+ 0x75 => [0xE000,0,605], # radical extension (PUA)
378
+ 0x76 => [0xE001,0,565], # radical top (PUA)
379
+ [0x7A,0x7D] => 0xE150, # \braceld, \bracerd, \bracelu, \braceru (PUA)
380
+ ],
381
+ };
382
+
383
+ $map{cmti10} = {
384
+ "Main-Italic" => [
385
+ [0,1] => 0x393, # \Gamma, \Delta
386
+ 2 => 0x398, # \Theta
387
+ 3 => 0x39B, # \Lambda
388
+ 4 => 0x39E, # \Xi
389
+ 5 => 0x3A0, # \Pi
390
+ 6 => 0x3A3, # \Sigma
391
+ [7,8] => 0x3A5, # \Upsilon, \Phi
392
+ [9,0xA] => 0x3A8, # \Psi, \Omega
393
+
394
+ 0x12 => 0x2CB, # \grave
395
+ 0x13 => 0x2CA, # \acute
396
+ 0x14 => 0x2C7, # \check
397
+ 0x15 => 0x2D8, # \breve
398
+ 0x16 => 0x2C9, # \bar
399
+ 0x17 => [0xB0,-160,0], # \degree
400
+ 0x17 => 0x02DA, # \r, ring above
401
+ 0x18 => 0xB8, # \c, cedilla
402
+
403
+ [0x21,0x23] => 0x21, # !, ", #,
404
+ 0x22 => 0x201D, # "
405
+ [0x25,0x2F] => 0x25, # %, &, ', (, ), *, +, comma, -, ., /
406
+ 0x27 => 0x2019, # '
407
+ [0x30,0x39] => 0x30, # 0-9
408
+ [0x3A,0x3B] => 0x3A, # :, ;
409
+ 0x3D => 0x3D, # =
410
+ [0x3F,0x40] => 0x3F, # ?, @
411
+ [0x41,0x5A] => 0x41, # A-Z
412
+ 0x5B => 0x5B, # [
413
+ 0x5C => 0x201C, # ``
414
+ [0x5D,0x5E] => 0x5D, # ], ^
415
+ 0x5E => 0x2C6, # \hat
416
+ 0x5F => 0x2D9, # \dot
417
+ 0x60 => 0x2018, # `
418
+ [0x61,0x7A] => 0x61, # a-z
419
+ [0x7B,0x7C] => 0x2013, # \endash, \emdash
420
+ 0x7B => [0x5F,0,-310], # underline
421
+ 0x7D => 0x2DD, # double acute
422
+ 0x7E => [0x7E,0,-350], # ~
423
+ 0x7E => 0x2DC, # \tilde
424
+ 0x7F => 0xA8, # \ddot
425
+ 0x19 => 0xDF, # sharp S
426
+ 0x1A => 0xE6, # ae ligature
427
+ 0x1B => 0x153, # oe ligature
428
+ 0x1C => 0xF8, # o with slash
429
+ 0x1D => 0xC6, # AE ligature
430
+ 0x1E => 0x152, # OE ligature
431
+ 0x1F => 0xD8, # O with slash
432
+ ],
433
+
434
+ "Main-Regular" => [
435
+ 0x24 => 0xA3, # pound sign
436
+ ],
437
+ };
438
+
439
+ $map{cmbx10} = {
440
+ "Main-Bold" => [
441
+ [0,1] => 0x393, # \Gamma, \Delta
442
+ 2 => 0x398, # \Theta
443
+ 3 => 0x39B, # \Lambda
444
+ 4 => 0x39E, # \Xi
445
+ 5 => 0x3A0, # \Pi
446
+ 6 => 0x3A3, # \Sigma
447
+ [7,8] => 0x3A5, # \Upsilon, \Phi
448
+ [9,0xA] => 0x3A8, # \Psi, \Omega
449
+
450
+ 0x10 => 0x131, # \i
451
+ 0x11 => 0x237, # \j
452
+ 0x12 => 0x2CB, # \grave
453
+ 0x13 => 0x2CA, # \acute
454
+ 0x14 => 0x2C7, # \check
455
+ 0x15 => 0x2D8, # \breve
456
+ 0x16 => 0x2C9, # \bar
457
+ 0x17 => [0xB0,-147,0], # \degree
458
+ 0x17 => 0x02DA, # \r, ring above
459
+ 0x18 => 0xB8, # \c, cedilla
460
+
461
+ [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., /
462
+ 0x22 => 0x201D, # "
463
+ 0x27 => 0x2019, # '
464
+ [0x30,0x39] => 0x30, # 0-9
465
+ [0x3A,0x3B] => 0x3A, # :, ;
466
+ 0x3D => 0x3D, # =
467
+ [0x3F,0x40] => 0x3F, # ?, @
468
+ [0x41,0x5A] => 0x41, # A-Z
469
+ 0x5B => 0x5B, # [
470
+ 0x5C => 0x201C, # ``
471
+ [0x5D,0x5E] => 0x5D, # ], ^
472
+ 0x5E => 0x2C6, # \hat
473
+ 0x5F => 0x2D9, # \dot
474
+ 0x60 => 0x2018, # `
475
+ [0x61,0x7A] => 0x61, # a-z
476
+ [0x7B,0x7C] => 0x2013, # \endash, \emdash
477
+ 0x7B => [0x5F,0,-310], # underline
478
+ 0x7D => 0x2DD, # double acute
479
+ 0x7E => [0x7E,0,-350], # ~
480
+ 0x7E => 0x2DC, # \tilde
481
+ 0x7F => 0xA8, # \ddot
482
+ 0x19 => 0xDF, # sharp S
483
+ 0x1A => 0xE6, # ae ligature
484
+ 0x1B => 0x153, # oe ligature
485
+ 0x1C => 0xF8, # o with slash
486
+ 0x1D => 0xC6, # AE ligature
487
+ 0x1E => 0x152, # OE ligature
488
+ 0x1F => 0xD8, # O with slash
489
+ ],
490
+ };
491
+
492
+ $map{cmbxti10} = {
493
+ "Main-BoldItalic" => [
494
+ [0,1] => 0x393, # \Gamma, \Delta
495
+ 2 => 0x398, # \Theta
496
+ 3 => 0x39B, # \Lambda
497
+ 4 => 0x39E, # \Xi
498
+ 5 => 0x3A0, # \Pi
499
+ 6 => 0x3A3, # \Sigma
500
+ [7,8] => 0x3A5, # \Upsilon, \Phi
501
+ [9,0xA] => 0x3A8, # \Psi, \Omega
502
+
503
+ 0x10 => 0x131, # \i
504
+ 0x11 => 0x237, # \j
505
+ 0x12 => 0x2CB, # \grave
506
+ 0x13 => 0x2CA, # \acute
507
+ 0x14 => 0x2C7, # \check
508
+ 0x15 => 0x2D8, # \breve
509
+ 0x16 => 0x2C9, # \bar
510
+ 0x17 => [0xB0,-160,0], # \degree
511
+ 0x17 => 0x02DA, # \r, ring above
512
+ 0x18 => 0xB8, # \c, cedilla
513
+
514
+ [0x21,0x23] => 0x21, # !, ", #,
515
+ 0x22 => 0x201D, # "
516
+ [0x25,0x2F] => 0x25, # %, &, ', (, ), *, +, comma, -, ., /
517
+ 0x27 => 0x2019, # '
518
+ [0x30,0x39] => 0x30, # 0-9
519
+ [0x3A,0x3B] => 0x3A, # :, ;
520
+ 0x3D => 0x3D, # =
521
+ [0x3F,0x40] => 0x3F, # ?, @
522
+ [0x41,0x5A] => 0x41, # A-Z
523
+ 0x5B => 0x5B, # [
524
+ 0x5C => 0x201C, # ``
525
+ [0x5D,0x5E] => 0x5D, # ], ^
526
+ 0x5E => 0x2C6, # \hat
527
+ 0x5F => 0x2D9, # \dot
528
+ 0x60 => 0x2018, # `
529
+ [0x61,0x7A] => 0x61, # a-z
530
+ [0x7B,0x7C] => 0x2013, # \endash, \emdash
531
+ 0x7B => [0x5F,0,-310], # underline
532
+ 0x7D => 0x2DD, # double acute
533
+ 0x7E => [0x7E,0,-350], # ~
534
+ 0x7E => 0x2DC, # \tilde
535
+ 0x7F => 0xA8, # \ddot
536
+ 0x19 => 0xDF, # sharp S
537
+ 0x1A => 0xE6, # ae ligature
538
+ 0x1B => 0x153, # oe ligature
539
+ 0x1C => 0xF8, # o with slash
540
+ 0x1D => 0xC6, # AE ligature
541
+ 0x1E => 0x152, # OE ligature
542
+ 0x1F => 0xD8, # O with slash
543
+ ],
544
+
545
+ "Main-Bold" => [
546
+ 0x24 => 0xA3, # pound sign
547
+ ],
548
+ };
549
+
550
+ $map{cmmib10} = {
551
+ "Math-BoldItalic" => [
552
+ [0,1] => 0x393, # \Gamma, \Delta
553
+ 2 => 0x398, # \Theta
554
+ 3 => 0x39B, # \Lambda
555
+ 4 => 0x39E, # \Xi
556
+ 5 => 0x3A0, # \Pi
557
+ 6 => 0x3A3, # \Sigma
558
+ [7,8] => 0x3A5, # \Upsilon, \Phi
559
+ [9,0xA] => 0x3A8, # \Psi, \Omega
560
+
561
+ [0xB,0xE] => 0x3B1, # \alpha, \beta, \gamma, \delta
562
+ 0xF => 0x3F5, # \elpsilon
563
+ [0x10,0x18] => 0x3B6, # \zeta, \eta, \theta, \iota, \kappa, \lambda, \mu, \nu, \xi
564
+ [0x19,0x1A] => 0x3C0, # \pi, \rho
565
+ [0x1B,0x1D] => 0x3C3, # \sigma, \tau, \upsilon
566
+ 0x1E => 0x3D5, # \phi
567
+ [0x1F,0x21] => 0x3C7, # \chi, \psi, \omega
568
+ 0x22 => 0x3B5, # \varepsilon
569
+ 0x23 => 0x3D1, # \vartheta
570
+ 0x24 => 0x3D6, # \varpi
571
+ 0x25 => 0x3F1, # \varrho
572
+ 0x26 => 0x3C2, # \varsigma
573
+ 0x27 => 0x3C6, # \varphi
574
+
575
+ [0x41,0x5A] => 0x41, # A-Z
576
+ [0x61,0x7A] => 0x61, # a - z
577
+ [0x30,0x39] => 0x30, # Oldstyle 0-9
578
+
579
+ 0x6F => 0x3BF, # omicron
580
+ 0x7B => 0xE131, # \imath (PUA)
581
+ 0x7C => 0xE237, # \jmath (PUA)
582
+ ],
583
+
584
+ "Main-Bold" => [
585
+ 0x28 => 0x21BC, # \leftharpoonup
586
+ 0x29 => 0x21BD, # \leftharpoondown
587
+ 0x2A => 0x21C0, # \rightharpoonup
588
+ 0x2B => 0x21C1, # \rightharpoondown
589
+
590
+ 0x2E => 0x25B9, # \triangleright
591
+ 0x2F => 0x25C3, # \triangleleft
592
+
593
+ 0x3C => 0x3C, # <
594
+ 0x3D => 0x2215, # /
595
+ 0x3E => 0x3E, # >
596
+ 0x3F => 0x22C6, # \star
597
+ 0x40 => 0x2202, # \partial
598
+
599
+ [0x5B,0x5D] => 0x266D, # \flat, \natural, \sharp
600
+ 0x5E => 0x2323, # \smile
601
+ 0x5F => 0x2322, # \frown
602
+ 0x60 => 0x2113, # \ell
603
+ 0x68 => 0x210F, # \hbar (bar added below)
604
+
605
+ 0x7D => 0x2118, # \wp
606
+ 0x7E => [0x20D7,-729,0],# \vec
607
+ ],
608
+ };
609
+
610
+ $map{cmbsy10} = {
611
+ "Main-Bold" => [
612
+ 0 => 0x2212, # -
613
+ 1 => 0x22C5, # \cdot
614
+ 2 => 0xD7, # \times
615
+ 3 => 0x2217, # \ast
616
+ 4 => 0xF7, # \div
617
+ 5 => 0x22C4, # \diamond
618
+ 6 => 0xB1, # \pm
619
+ 7 => 0x2213, # \mp
620
+ [8,0xC] => 0x2295, # \oplus, \ominus, \otimes, \oslash, \odot
621
+ 0xD => 0x25EF, # \bigcirc
622
+ [0xE,0xF] => 0x2218, # \circ, \bullet
623
+
624
+ 0x10 => 0x224D, # \asymp
625
+ 0x11 => 0x2261, # \equiv
626
+ [0x12,0x13] => 0x2286, # \subseteq, \supseteq
627
+ [0x14,0x15] => 0x2264, # \leq, \geq
628
+ [0x16,0x17] => 0x2AAF, # \preceq, \succeq
629
+ 0x18 => 0x223C, # \sim
630
+ 0x19 => 0x2248, # \approx
631
+ [0x1A,0x1B] => 0x2282, # \subset, \supset
632
+ [0x1C,0x1D] => 0x226A, # \ll, \gg
633
+ [0x1E,0x1F] => 0x227A, # \prec, \succ
634
+
635
+ 0x20 => 0x2190, # \leftarrow
636
+ 0x21 => 0x2192, # \rightarrow
637
+ 0x22 => 0x2191, # \uparrow
638
+ 0x23 => 0x2193, # \downarrow
639
+ 0x24 => 0x2194, # \leftrightarrow
640
+ 0x25 => 0x2197, # \nearrow
641
+ 0x26 => 0x2198, # \searrow
642
+ 0x27 => 0x2243, # \simeq
643
+
644
+ 0x28 => 0x21D0, # \Leftarrow
645
+ 0x29 => 0x21D2, # \Rightarrow
646
+ 0x2A => 0x21D1, # \Uparrow
647
+ 0x2B => 0x21D3, # \Downarrow
648
+ 0x2C => 0x21D4, # \Leftrightarrow
649
+ 0x2D => 0x2196, # \nwarrow
650
+ 0x2E => 0x2199, # \swarrow
651
+ 0x2F => 0x221D, # \propto
652
+
653
+ 0x30 => 0x2032, # \prime
654
+ 0x31 => 0x221E, # \infty
655
+ 0x32 => 0x2208, # \in
656
+ 0x33 => 0x220B, # \ni
657
+ 0x34 => 0x25B3, # \bigtriangleup and \triangle
658
+ 0x35 => 0x25BD, # \bigtriangledown
659
+ 0x36 => 0xE020, # \not
660
+
661
+ 0x38 => 0x2200, # \forall
662
+ 0x39 => 0x2203, # \exists
663
+ 0x3A => 0xAC, # \neg
664
+ 0x3B => 0x2205, # \emptyset
665
+ 0x3C => 0x211C, # \Re
666
+ 0x3D => 0x2111, # \Im
667
+ 0x3E => 0x22A4, # \top
668
+ 0x3F => 0x22A5, # \bot
669
+
670
+ 0x40 => 0x2135, # \aleph
671
+
672
+ 0x5B => 0x222A, # \cup
673
+ 0x5C => 0x2229, # \cap
674
+ 0x5D => 0x228E, # \uplus
675
+ [0x5E,0x5F] => 0x2227, # \wedge, \vee
676
+
677
+ [0x60,0x61] => 0x22A2, # \vdash, \dashv
678
+ [0x62,0x63] => 0x230A, # \lfloor, \rfloor
679
+ [0x64,0x65] => 0x2308, # \lceil, \rceil
680
+ 0x66 => 0x7B, # {
681
+ 0x67 => 0x7D, # }
682
+ [0x68,0x69] => 0x27E8, # \langle, \rangle
683
+ 0x6A => 0x7C, # |
684
+ 0x6A => 0x2223, # \vert
685
+ 0x6B => 0x2225, # \Vert
686
+ 0x6C => 0x2195, # \updownarrow
687
+ 0x6D => 0x21D5, # \Updownarrow
688
+ 0x6E => 0x5C, # \backslash
689
+ 0x6E => 0x2216, # \setminus
690
+ 0x6F => 0x2240, # \wr
691
+
692
+ 0x70 => [0x221A,0,760], # \surd ### adjust position so font doesn't have a large depth
693
+ 0x71 => 0x2A3F, # \amalg
694
+ 0x72 => 0x2207, # \nabla
695
+ 0x73 => 0x222B, # \int
696
+ 0x74 => 0x2294, # \sqcup
697
+ 0x75 => 0x2293, # \sqcap
698
+ [0x76,0x77] => 0x2291, # \sqsubseteq, \sqsupseteq
699
+
700
+ [0x79,0x7A] => 0x2020, # \dagger, \ddagger
701
+
702
+ 0x7C => 0x2663, # \clubsuit
703
+ 0x7D => 0x2662, # \diamondsuit
704
+ 0x7E => 0x2661, # \heartsuit
705
+ 0x7F => 0x2660, # \spadesuit
706
+ ],
707
+ };
708
+
709
+ $map{msam10} = {
710
+ "Main-Regular" => [
711
+ 0x5C => 0x2220, # \angle
712
+ ],
713
+
714
+ "Main-Bold" => [
715
+ 0x5C => 0x2220, # \angle (emboldened below)
716
+ ],
717
+
718
+ "AMS" => [
719
+ 0x00 => 0x22A1, # \boxdot
720
+ 0x01 => 0x229E, # \boxplus
721
+ 0x02 => 0x22A0, # \boxtimes
722
+ 0x03 => 0x25A1, # \square
723
+ 0x04 => 0x25A0, # \blacksquare
724
+ 0x05 => 0x22C5, # \centerdot
725
+ 0x06 => 0x25CA, # \lozenge
726
+ 0x07 => 0x29EB, # \blacklozenge
727
+ 0x08 => 0x21BB, # \circlearrowright
728
+ 0x09 => 0x21BA, # \circlearrowleft
729
+ 0x0A => 0x21CC, # \rightleftharpoons
730
+ 0x0B => 0x21CB, # \leftrightharpoons
731
+ 0x0C => 0x229F, # \boxminus
732
+ 0x0D => 0x22A9, # \Vdash
733
+ 0x0E => 0x22AA, # \Vvdash
734
+ 0x0F => 0x22A8, # \vDash
735
+ 0x10 => 0x21A0, # \twoheadrightarrow
736
+ 0x11 => 0x219E, # \twoheadleftarrow
737
+ 0x12 => 0x21C7, # \leftleftarrows
738
+ 0x13 => 0x21C9, # \rightrightarrows
739
+ 0x14 => 0x21C8, # \upuparrows
740
+ 0x15 => 0x21CA, # \downdownarrows
741
+ 0x16 => 0x21BE, # \upharpoonright
742
+ 0x17 => 0x21C2, # \downharpoonright
743
+ 0x18 => 0x21BF, # \upharpoonleft
744
+ 0x19 => 0x21C3, # \downharpoonleft
745
+ 0x1A => 0x21A3, # \rightarrowtail
746
+ 0x1B => 0x21A2, # \leftarrowtail
747
+ 0x1C => 0x21C6, # \leftrightarrows
748
+ 0x1D => 0x21C4, # \rightleftarrows
749
+ 0x1E => 0x21B0, # \Lsh
750
+ 0x1F => 0x21B1, # \Rsh
751
+ 0x20 => 0x21DD, # \rightsquigarrow
752
+ 0x21 => 0x21AD, # \leftrightsquigarrow
753
+ 0x22 => 0x21AB, # \looparrowleft
754
+ 0x23 => 0x21AC, # \looparrowright
755
+ 0x24 => 0x2257, # \circeq
756
+ 0x25 => 0x227F, # \succsim
757
+ 0x26 => 0x2273, # \gtrsim
758
+ 0x27 => 0x2A86, # \gtrapprox
759
+ 0x28 => 0x22B8, # \multimap
760
+ 0x29 => 0x2234, # \therefore
761
+ 0x2A => 0x2235, # \because
762
+ 0x2B => 0x2251, # \doteqdot
763
+ 0x2C => 0x225C, # \triangleq
764
+ 0x2D => 0x227E, # \precsim
765
+ 0x2E => 0x2272, # \lesssim
766
+ 0x2F => 0x2A85, # \lessapprox
767
+ 0x30 => 0x2A95, # \eqslantless
768
+ 0x31 => 0x2A96, # \eqslantgtr
769
+ 0x32 => 0x22DE, # \curlyeqprec
770
+ 0x33 => 0x22DF, # \curlyeqsucc
771
+ 0x34 => 0x227C, # \preccurlyeq
772
+ 0x35 => 0x2266, # \leqq
773
+ 0x36 => 0x2A7D, # \leqslant
774
+ 0x37 => 0x2276, # \lessgtr
775
+ 0x38 => 0x2035, # \backprime
776
+ 0x39 => 0x2212, # dahsed arrow extension
777
+ 0x3A => 0x2253, # \risingdotseq
778
+ 0x3B => 0x2252, # \fallingdotseq
779
+ 0x3C => 0x227D, # \succcurlyeq
780
+ 0x3D => 0x2267, # \geqq
781
+ 0x3E => 0x2A7E, # \geqslant
782
+ 0x3F => 0x2277, # \gtrless
783
+ 0x40 => 0x228F, # \sqsubset
784
+ 0x41 => 0x2290, # \sqsupset
785
+ 0x42 => 0x22B3, # \vartriangleright
786
+ 0x43 => 0x22B2, # \vartriangleleft
787
+ 0x44 => 0x22B5, # \trianglerighteq
788
+ 0x45 => 0x22B4, # \trianglelefteq
789
+ 0x46 => 0x2605, # \bigstar
790
+ 0x47 => 0x226C, # \between
791
+ 0x48 => 0x25BC, # \blacktriangledown
792
+ 0x49 => 0x25B6, # \blacktriangleright
793
+ 0x4A => 0x25C0, # \blacktriangleleft
794
+ 0x4B => 0x2192, # rightarrow
795
+ 0x4C => 0x2190, # leftarrow
796
+ 0x4D => 0x25B3, # \vartriangle
797
+ 0x4E => 0x25B2, # \blacktriangle
798
+ 0x4F => 0x25BD, # \triangledown
799
+ 0x50 => 0x2256, # \eqcirc
800
+ 0x51 => 0x22DA, # \lesseqgtr
801
+ 0x52 => 0x22DB, # \gtreqless
802
+ 0x53 => 0x2A8B, # \lesseqqgtr
803
+ 0x54 => 0x2A8C, # \gtreqqless
804
+ 0x55 => 0x00A5, # yen
805
+ 0x56 => 0x21DB, # \Rrightarrow
806
+ 0x57 => 0x21DA, # \Lleftarrow
807
+ 0x58 => 0x2713, # checkmark
808
+ 0x59 => 0x22BB, # \veebar
809
+ 0x5A => 0x22BC, # \barwedge
810
+ 0x5B => 0x2A5E, # \doublebarwedge
811
+ 0x5C => 0x2220, # \angle
812
+ 0x5D => 0x2221, # \measuredangle
813
+ 0x5E => 0x2222, # \sphericalangle
814
+ 0x5F => 0x221D, # \varpropto
815
+ 0x60 => 0x2323, # \smallsmile
816
+ 0x61 => 0x2322, # \smallfrown
817
+ 0x62 => 0x22D0, # \Subset
818
+ 0x63 => 0x22D1, # \Supset
819
+ 0x64 => 0x22D3, # \Cup
820
+ 0x65 => 0x22D2, # \Cap
821
+ 0x66 => 0x22CF, # \curlywedge
822
+ 0x67 => 0x22CE, # \curlyvee
823
+ 0x68 => 0x22CB, # \leftthreetimes
824
+ 0x69 => 0x22CC, # \rightthreetimes
825
+ 0x6A => 0x2AC5, # \subseteqq
826
+ 0x6B => 0x2AC6, # \supseteqq
827
+ 0x6C => 0x224F, # \bumpeq
828
+ 0x6D => 0x224E, # \Bumpeq
829
+ 0x6E => 0x22D8, # \lll
830
+ 0x6F => 0x22D9, # \ggg
831
+ 0x70 => 0x250C, # \ulcorner
832
+ 0x71 => 0x2510, # \urcorner
833
+ 0x72 => 0x00AE, # registered sign
834
+ 0x73 => 0x24C8, # \circledS
835
+ 0x74 => 0x22D4, # \pitchfork
836
+ 0x75 => 0x2214, # \dotplus
837
+ 0x76 => 0x223D, # \backsim
838
+ 0x77 => 0x22CD, # \backsimeq
839
+ 0x78 => 0x2514, # \llcorner
840
+ 0x79 => 0x2518, # \lrcorner
841
+ 0x7A => 0x2720, # maltese cross
842
+ 0x7B => 0x2201, # \complement
843
+ 0x7C => 0x22BA, # \intercal
844
+ 0x7D => 0x229A, # \circledcirc
845
+ 0x7E => 0x229B, # \circledast
846
+ 0x7F => 0x229D, # \circleddash
847
+ ],
848
+ };
849
+
850
+ $map{msbm10} = {
851
+ "Size4" => [
852
+ 0x5B => 0x2C6, # \widehat
853
+ 0x5B => [0x302,-1889,0],# \widehat (combining)
854
+ 0x5D => 0x2DC, # \widetilde
855
+ 0x5D => [0x303,-1889,0],# \widetilde (combining)
856
+ ],
857
+
858
+ "Main-Regular" => [
859
+ 0x7E => 0x210F, # \hbar
860
+ ],
861
+
862
+ "Main-Italic" => [
863
+ 0x7D => 0x210F, # \hbar (with slant)
864
+ ],
865
+
866
+ "AMS" => [
867
+ 0x00 => 0xE00C, # \lvertneqq
868
+ 0x01 => 0xE00D, # \gvertneqq
869
+ 0x02 => 0x2270, # \nleq
870
+ 0x03 => 0x2271, # \ngeq
871
+ 0x04 => 0x226E, # \nless
872
+ 0x05 => 0x226F, # \ngtr
873
+ 0x06 => 0x2280, # \nprec
874
+ 0x07 => 0x2281, # \nsucc
875
+ 0x08 => 0x2268, # \lneqq
876
+ 0x09 => 0x2269, # \gneqq
877
+ 0x0A => 0xE010, # \nleqslant
878
+ 0x0B => 0xE00F, # \ngeqslant
879
+ 0x0C => 0x2A87, # \lneq
880
+ 0x0D => 0x2A88, # \gneq
881
+ 0x0E => 0x22E0, # \npreceq
882
+ 0x0F => 0x22E1, # \nsucceq
883
+ 0x10 => 0x22E8, # \precnsim
884
+ 0x11 => 0x22E9, # \succnsim
885
+ 0x12 => 0x22E6, # \lnsim
886
+ 0x13 => 0x22E7, # \gnsim
887
+ 0x14 => 0xE011, # \nleqq
888
+ 0x15 => 0xE00E, # \ngeqq
889
+ 0x16 => 0x2AB5, # \precneqq
890
+ 0x17 => 0x2AB6, # \succneqq
891
+ 0x18 => 0x2AB9, # \precnapprox
892
+ 0x19 => 0x2ABA, # \succnapprox
893
+ 0x1A => 0x2A89, # \lnapprox
894
+ 0x1B => 0x2A8A, # \gnapprox
895
+ 0x1C => 0x2241, # \nsim
896
+ 0x1D => 0x2246, # \ncong
897
+ 0x1E => 0x2571, # \diagup
898
+ 0x1F => 0x2572, # \diagdown
899
+ 0x20 => 0xE01A, # \varsubsetneq
900
+ 0x21 => 0xE01B, # \varsupsetneq
901
+ 0x22 => 0xE016, # \nsubseteqq
902
+ 0x23 => 0xE018, # \nsupseteqq
903
+ 0x24 => 0x2ACB, # \subsetneqq
904
+ 0x25 => 0x2ACC, # \supsetneqq
905
+ 0x26 => 0xE017, # \varsubsetneqq
906
+ 0x27 => 0xE019, # \varsupsetneqq
907
+ 0x28 => 0x228A, # \subsetneq
908
+ 0x29 => 0x228B, # \supsetneq
909
+ 0x2A => 0x2288, # \nsubseteq
910
+ 0x2B => 0x2289, # \nsupseteq
911
+ 0x2C => 0x2226, # \nparallel
912
+ 0x2D => 0x2224, # \nmid
913
+ 0x2E => 0xE006, # \nshortmid
914
+ 0x2F => 0xE007, # \nshortparallel
915
+ 0x30 => 0x22AC, # \nvdash
916
+ 0x31 => 0x22AE, # \nVdash
917
+ 0x32 => 0x22AD, # \nvDash
918
+ 0x33 => 0x22AF, # \nVDash
919
+ 0x34 => 0x22ED, # \ntrianglerighteq
920
+ 0x35 => 0x22EC, # \ntrianglelefteq
921
+ 0x36 => 0x22EA, # \ntriangleleft
922
+ 0x37 => 0x22EB, # \ntriangleright
923
+ 0x38 => 0x219A, # \nleftarrow
924
+ 0x39 => 0x219B, # \nrightarrow
925
+ 0x3A => 0x21CD, # \nLeftarrow
926
+ 0x3B => 0x21CF, # \nRightarrow
927
+ 0x3C => 0x21CE, # \nLeftrightarrow
928
+ 0x3D => 0x21AE, # \nleftrightarrow
929
+ 0x3E => 0x22C7, # \divideontimes
930
+ 0x3F => 0x2205, # \varnothing
931
+ 0x40 => 0x2204, # \nexists
932
+
933
+ [0x41,0x5A] => 0x41, # A-Z
934
+ 0x5C => 0x2C6, # \widehat
935
+ 0x5C => [0x302,-2333,0],# \widehat (combining)
936
+ 0x5E => 0x2DC, # \widetilde
937
+ 0x5E => [0x303,-2333,0],# \widetilde (combining)
938
+
939
+ 0x60 => 0x2132, # \Finv
940
+ 0x61 => 0x2141, # \Game
941
+ 0x66 => 0x2127, # \mho
942
+ 0x67 => 0x00F0, # \eth
943
+ 0x68 => 0x2242, # minus-tilde
944
+ 0x69 => 0x2136, # \beth
945
+ 0x6A => 0x2137, # \gimel
946
+ 0x6B => 0x2138, # \daleth
947
+ 0x6C => 0x22D6, # \lessdot
948
+ 0x6D => 0x22D7, # \gtrdot
949
+ 0x6E => 0x22C9, # \ltimes
950
+ 0x6F => 0x22CA, # \rtimes
951
+ 0x70 => 0x2223, # \shortmid
952
+ 0x71 => 0x2225, # \shortparallel
953
+ 0x72 => 0x2216, # \smallsetminus
954
+ 0x73 => 0x223C, # \thicksim
955
+ 0x74 => 0x2248, # \thickapprox
956
+ 0x75 => 0x224A, # \approxeq
957
+ 0x76 => 0x2AB8, # \succapprox
958
+ 0x77 => 0x2AB7, # \precapprox
959
+ 0x78 => 0x21B6, # \curvearrowleft
960
+ 0x79 => 0x21B7, # \curvearrowright
961
+ 0x7A => 0x03DD, # \digamma
962
+ 0x7B => 0x03F0, # \varkappa
963
+ 0x7A => 0xE008, # \digamma (non-standard, for IE)
964
+ 0x7B => 0xE009, # \varkappa (non-standard, for IE)
965
+ 0x7C => 0x006B, # \Bbbk
966
+ 0x7D => 0x210F, # \hslash
967
+ 0x7E => 0x0127, # \hbar
968
+ 0x7F => 0x220D, # \backepsilon
969
+ ],
970
+ };
971
+
972
+ $map{eufm10} = {
973
+ "Fraktur-Regular" => [
974
+ [0,7] => 0xE300, # variants
975
+ 0x12 => 0x2018, # left quote
976
+ 0x13 => 0x2019, # right quote
977
+ 0x21 => 0x21, # !
978
+ [0x26,0x2F] => 0x26, # &, ', (, ), *, +, comma, -, ., /
979
+ [0x30,0x39] => 0x30, # 0-9
980
+ [0x3A,0x3B] => 0x3A, # :, ;
981
+ 0x3D => 0x3D, # =
982
+ 0x3F => 0x3F, # ?
983
+ [0x41,0x5A] => 0x41, # A-Z
984
+ 0x5B => 0x5B, # [
985
+ [0x5D,0x5E] => 0x5D, # ], ^
986
+ [0x61,0x7A] => 0x61, # a-z
987
+ 0x7D => 0x22, # "
988
+ ],
989
+ };
990
+
991
+ $map{cmtt10} = {
992
+ "Typewriter-Regular" => [
993
+ [0,1] => 0x393, # \Gamma, \Delta
994
+ 2 => 0x398, # \Theta
995
+ 3 => 0x39B, # \Lambda
996
+ 4 => 0x39E, # \Xi
997
+ 5 => 0x3A0, # \Pi
998
+ 6 => 0x3A3, # \Sigma
999
+ [7,8] => 0x3A5, # \Upsilon, \Phi
1000
+ [9,0xA] => 0x3A8, # \Psi, \Omega
1001
+ 0xD => 0x2032, # '
1002
+
1003
+ 0x10 => 0x131, # \i
1004
+ 0x11 => 0x237, # \j
1005
+ 0x12 => 0x2CB, # \grave
1006
+ 0x13 => 0x2CA, # \acute
1007
+ 0x14 => 0x2C7, # \check
1008
+ 0x15 => 0x2D8, # \breve
1009
+ 0x16 => 0x2C9, # \bar
1010
+ 0x17 => 0xB0, # \degree
1011
+ 0x17 => 0x02DA, # \r, ring above
1012
+ 0x18 => 0xB8, # \c, cedilla
1013
+ 0x20 => 0x2423, # graphic representation of space
1014
+
1015
+ [0x21,0x7F] => 0x21,
1016
+
1017
+ 0x27 => 0x2018, # left quote
1018
+ 0x60 => 0x2019, # right quote
1019
+ 0x5E => [0x302,-525,0], # \hat (combining)
1020
+ 0x7E => [0x303,-525,0], # \tilde (combining)
1021
+ 0x7F => [0x308,-525,0], # \ddot (combining)
1022
+ ],
1023
+ };
1024
+
1025
+ $map{rsfs10} = {
1026
+ "Script-Regular" => [
1027
+ [0x41,0x5A] => 0x41, # A-Z
1028
+ ],
1029
+ };
1030
+
1031
+ $map{cmssbx10} = {
1032
+ "SansSerif-Bold" => [
1033
+ [0,1] => 0x393, # \Gamma, \Delta
1034
+ 2 => 0x398, # \Theta
1035
+ 3 => 0x39B, # \Lambda
1036
+ 4 => 0x39E, # \Xi
1037
+ 5 => 0x3A0, # \Pi
1038
+ 6 => 0x3A3, # \Sigma
1039
+ [7,8] => 0x3A5, # \Upsilon, \Phi
1040
+ [9,0xA] => 0x3A8, # \Psi, \Omega
1041
+
1042
+ 0x10 => 0x131, # \i
1043
+ 0x11 => 0x237, # \j
1044
+ 0x13 => 0xB4, # \acute
1045
+ 0x14 => 0x2C7, # \check
1046
+ 0x15 => 0x2D8, # \breve
1047
+ 0x16 => 0x2C9, # \bar
1048
+ 0x17 => [0xB0,-58,0], # \degree
1049
+ 0x17 => 0x02DA, # \r, ring above
1050
+ 0x18 => 0xB8, # \c, cedilla
1051
+
1052
+ [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., /
1053
+ 0x22 => 0x201D, # "
1054
+ 0x27 => 0x2019, # '
1055
+ [0x30,0x39] => 0x30, # 0-9
1056
+ [0x3A,0x3B] => 0x3A, # :, ;
1057
+ 0x3D => 0x3D, # =
1058
+ [0x3F,0x40] => 0x3F, # ?, @
1059
+ [0x41,0x5A] => 0x41, # A-Z
1060
+ 0x5B => 0x5B, # [
1061
+ 0x5C => 0x201C, # ``
1062
+ [0x5D,0x5E] => 0x5D, # ], ^
1063
+ 0x5E => 0x2C6, # \hat
1064
+ 0x5F => 0x2D9, # \dot
1065
+ 0x60 => 0x2018, # `
1066
+ [0x61,0x7A] => 0x61, # a-z
1067
+ [0x7B,0x7C] => 0x2013, # \endash, \emdash
1068
+ 0x7B => [0x5F,0,-350], # underline
1069
+ 0x7D => 0x2DD, # double acute
1070
+ 0x7E => [0x7E,0,-350], # ~
1071
+ 0x7E => 0x2DC, # \tilde
1072
+ 0x7F => 0xA8, # \ddot
1073
+ ],
1074
+ };
1075
+
1076
+ $map{cmss10} = {
1077
+ "SansSerif-Regular" => [
1078
+ [0,1] => 0x393, # \Gamma, \Delta
1079
+ 2 => 0x398, # \Theta
1080
+ 3 => 0x39B, # \Lambda
1081
+ 4 => 0x39E, # \Xi
1082
+ 5 => 0x3A0, # \Pi
1083
+ 6 => 0x3A3, # \Sigma
1084
+ [7,8] => 0x3A5, # \Upsilon, \Phi
1085
+ [9,0xA] => 0x3A8, # \Psi, \Omega
1086
+
1087
+ 0x10 => 0x131, # \i
1088
+ 0x11 => 0x237, # \j
1089
+ 0x12 => 0x2CB, # \grave
1090
+ 0x13 => 0x2CA, # \acute
1091
+ 0x14 => 0x2C7, # \check
1092
+ 0x15 => 0x2D8, # \breve
1093
+ 0x16 => 0x2C9, # \bar
1094
+ 0x17 => [0xB0,-142,0], # \degree
1095
+ 0x17 => 0x02DA, # \r, ring above
1096
+ 0x18 => 0xB8, # \c, cedilla
1097
+
1098
+ [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., /
1099
+ 0x22 => 0x201D, # "
1100
+ 0x27 => 0x2019, # '
1101
+ [0x30,0x39] => 0x30, # 0-9
1102
+ [0x3A,0x3B] => 0x3A, # :, ;
1103
+ 0x3D => 0x3D, # =
1104
+ [0x3F,0x40] => 0x3F, # ?, @
1105
+ [0x41,0x5A] => 0x41, # A-Z
1106
+ 0x5B => 0x5B, # [
1107
+ 0x5C => 0x201C, # ``
1108
+ [0x5D,0x5E] => 0x5D, # ], ^
1109
+ 0x5E => 0x2C6, # \hat
1110
+ 0x5F => 0x2D9, # \dot
1111
+ 0x60 => 0x2018, # `
1112
+ [0x61,0x7A] => 0x61, # a-z
1113
+ [0x7B,0x7C] => 0x2013, # \endash, \emdash
1114
+ 0x7B => [0x5F,0,-350], # underline
1115
+ 0x7D => 0x2DD, # double acute
1116
+ 0x7E => [0x7E,0,-350], # ~
1117
+ 0x7E => 0x2DC, # \tilde
1118
+ 0x7F => 0xA8, # \ddot
1119
+ ],
1120
+ };
1121
+
1122
+ $map{cmssi10} = {
1123
+ "SansSerif-Italic" => [
1124
+ [0,1] => 0x393, # \Gamma, \Delta
1125
+ 2 => 0x398, # \Theta
1126
+ 3 => 0x39B, # \Lambda
1127
+ 4 => 0x39E, # \Xi
1128
+ 5 => 0x3A0, # \Pi
1129
+ 6 => 0x3A3, # \Sigma
1130
+ [7,8] => 0x3A5, # \Upsilon, \Phi
1131
+ [9,0xA] => 0x3A8, # \Psi, \Omega
1132
+
1133
+ 0x10 => 0x131, # \i
1134
+ 0x11 => 0x237, # \j
1135
+ 0x12 => 0x2CB, # \grave
1136
+ 0x13 => 0x2CA, # \acute
1137
+ 0x14 => 0x2C7, # \check
1138
+ 0x15 => 0x2D8, # \breve
1139
+ 0x16 => 0x2C9, # \bar
1140
+ 0x17 => [0xB0,-113,0], # \degree
1141
+ 0x17 => 0x02DA, # \r, ring above
1142
+ 0x18 => 0xB8, # \c, cedilla
1143
+
1144
+ [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., /
1145
+ 0x22 => 0x201D, # "
1146
+ 0x27 => 0x2019, # '
1147
+ [0x30,0x39] => 0x30, # 0-9
1148
+ [0x3A,0x3B] => 0x3A, # :, ;
1149
+ 0x3D => 0x3D, # =
1150
+ [0x3F,0x40] => 0x3F, # ?, @
1151
+ [0x41,0x5A] => 0x41, # A-Z
1152
+ 0x5B => 0x5B, # [
1153
+ 0x5C => 0x201C, # ``
1154
+ [0x5D,0x5E] => 0x5D, # ], ^
1155
+ 0x5E => 0x2C6, # \hat
1156
+ 0x5F => 0x2D9, # \dot
1157
+ 0x60 => 0x2018, # `
1158
+ [0x61,0x7A] => 0x61, # a-z
1159
+ [0x7B,0x7C] => 0x2013, # \endash, \emdash
1160
+ 0x7B => [0x5F,0,-350], # underline
1161
+ 0x7D => 0x2DD, # double acute
1162
+ 0x7E => [0x7E,0,-350], # ~
1163
+ 0x7E => 0x2DC, # \tilde
1164
+ 0x7F => 0xA8, # \ddot
1165
+ ],
1166
+ };
1167
+
1168
+ foreach $cmfont (keys %map) {
1169
+ foreach $mjfont (keys %{$map{$cmfont}}) {
1170
+ $style = $mjfont; $style =~ s/.*?(-|$)//; $style = "Regular" unless $style;
1171
+ $family = $mjfont; $family =~ s/-.*//;
1172
+ $fontname = "$family-$style";
1173
+ @{$reverse{$fontname}{$cmfont}} = @{$map{$cmfont}{$mjfont}};
1174
+ }
1175
+ }
1176
+
1177
+ my %output;
1178
+
1179
+ sub add_to_output {
1180
+ my ($mjfont,$cmfont,$from,$to) = @_;
1181
+
1182
+ my $xshift = 0, $yshift = 0;
1183
+
1184
+ if (ref($to) eq "ARRAY") {
1185
+ $xshift = $to->[1];
1186
+ $yshift = $to->[2];
1187
+ $to = $to->[0];
1188
+ }
1189
+
1190
+ $data = {
1191
+ "font" => $cmfont,
1192
+ "char" => $from,
1193
+ "xshift" => $xshift,
1194
+ "yshift" => $yshift
1195
+ };
1196
+
1197
+ if (defined($output{$mjfont}{$to})) {
1198
+ print STDERR "Duplicate mapping $to for $mjfont: " .
1199
+ $output{$mjfont}{$to}{font} . ":" .
1200
+ $output{$mjfont}{$to}{char} . " vs. $cmfont:$from\n";
1201
+ die "Duplicate mapping!"; # disable this line to see all of them
1202
+ }
1203
+ $output{$mjfont}{$to} = $data;
1204
+ }
1205
+
1206
+ foreach $mjfont (keys %reverse) {
1207
+ foreach $cmfont (keys %{$reverse{$mjfont}}) {
1208
+ @remap = @{$reverse{$mjfont}{$cmfont}};
1209
+ while (defined($item = shift(@remap))) {
1210
+ $remap = shift(@remap);
1211
+
1212
+ if (ref($item) eq "ARRAY") {
1213
+ foreach $from ($item->[0]...$item->[1]) {
1214
+ $to = $from - $item->[0] + $remap;
1215
+ add_to_output($mjfont, $cmfont, $from, $to);
1216
+ }
1217
+ } else {
1218
+ add_to_output($mjfont, $cmfont, $item, $remap);
1219
+ }
1220
+ }
1221
+ }
1222
+ }
1223
+
1224
+ print(encode_json(\%output));