ritex 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +96 -0
- data/ReleaseNotes +11 -0
- data/lib/ritex.rb +200 -0
- data/lib/ritex/lexer.rb +140 -0
- data/lib/ritex/mathml/entities.rb +688 -0
- data/lib/ritex/mathml/functions.rb +88 -0
- data/lib/ritex/mathml/markup.rb +30 -0
- data/lib/ritex/parser.rb +845 -0
- data/lib/ritex/parser.y +140 -0
- data/test/all.rb +7 -0
- data/test/itex2mml-key.yaml +292 -0
- data/test/mathml.rb +265 -0
- data/test/parser.rb +36 -0
- metadata +55 -0
@@ -0,0 +1,688 @@
|
|
1
|
+
## lib/ritex/mathml/entities.rb -- MathML conversions of TeX
|
2
|
+
## entities. See Ritex::MathML.
|
3
|
+
##
|
4
|
+
## Author:: William Morgan (mailto: wmorgan-ritex@masanjin.net)
|
5
|
+
## Copyright:: Copyright 2005 William Morgan
|
6
|
+
## License:: GNU GPL version 2
|
7
|
+
|
8
|
+
## The main module for everything Ritex-related. See Ritex::Parser.
|
9
|
+
module Ritex
|
10
|
+
|
11
|
+
## As many MathML-specific aspected of Ritex are stored in this module
|
12
|
+
## as possible. Note that the rdoc documentation for this module is woefully
|
13
|
+
## incorrect because we programmatically modify the globals in this package.
|
14
|
+
module MathML
|
15
|
+
|
16
|
+
## Default entities, stolen from
|
17
|
+
## http://www.orcca.on.ca/mathml/texmml/texmml.xml. We overwrite many
|
18
|
+
## of these below.
|
19
|
+
DEFAULTS = {
|
20
|
+
"\"" => "<mo>"</mo>",
|
21
|
+
"|" => "<mo>∥</mo>",
|
22
|
+
"Vert" => "<mo>∥</mo>",
|
23
|
+
"|" => "<mo>∣</mo>",
|
24
|
+
"vert" => "<mo>∣</mo>",
|
25
|
+
"(" => "<mo>(</mo>",
|
26
|
+
"[" => "<mo>[</mo>",
|
27
|
+
"lbrack" => "<mo>[</mo>",
|
28
|
+
"{" => "<mo>{</mo>",
|
29
|
+
"lbrace" => "<mo>{</mo>",
|
30
|
+
"<" => "<mo><</mo>",
|
31
|
+
"/" => "<mo>/</mo>",
|
32
|
+
"lfloor" => "<mo>⌊</mo>",
|
33
|
+
"lceil" => "<mo>⌈</mo>",
|
34
|
+
"langle" => "<mo>〈</mo>",
|
35
|
+
"lgroup" => "<mo>(</mo>",
|
36
|
+
")" => "<mo>)</mo>",
|
37
|
+
"]" => "<mo>]</mo>",
|
38
|
+
"rbrack" => "<mo>]</mo>",
|
39
|
+
"}" => "<mo>}</mo>",
|
40
|
+
"rbrace" => "<mo>}</mo>",
|
41
|
+
">" => "<mo>></mo>",
|
42
|
+
"backslash" => "<mo>\\</mo>",
|
43
|
+
"rfloor" => "<mo>⌋</mo>",
|
44
|
+
"rceil" => "<mo>⌉</mo>",
|
45
|
+
"rangle" => "<mo>〉</mo>",
|
46
|
+
"rgroup" => "<mo>)</mo>",
|
47
|
+
"uparrow" => "<mo>↑</mo>",
|
48
|
+
"Uparrow" => "<mo>⇑</mo>",
|
49
|
+
"downarrow" => "<mo>↓</mo>",
|
50
|
+
"Downarrow" => "<mo>⇓</mo>",
|
51
|
+
"updownarrow" => "<mo>⇅</mo>",
|
52
|
+
"Updownarrow" => "<mo>⇕</mo>",
|
53
|
+
"leftarrow" => "<mo>←</mo>",
|
54
|
+
"gets" => "<mo>←</mo>",
|
55
|
+
"Leftarrow" => "<mo>⇐</mo>",
|
56
|
+
"rightarrow" => "<mo>→</mo>",
|
57
|
+
"to" => "<mo>→</mo>",
|
58
|
+
"Rightarrow" => "<mo>⇒</mo>",
|
59
|
+
"leftrightarrow" => "<mo>⇆</mo>",
|
60
|
+
"Leftrightarrow" => "<mo>⇔</mo>",
|
61
|
+
"mapsto" => "<mo>↦</mo>",
|
62
|
+
"hookleftarrow" => "<mo>↩</mo>",
|
63
|
+
"leftharpoonup" => "<mo>↼</mo>",
|
64
|
+
"leftharpoondown" => "<mo>↽</mo>",
|
65
|
+
"rightleftharpoons" => "<mo>⇌</mo>",
|
66
|
+
"longleftarrow" => "<mo>←</mo>",
|
67
|
+
"Longleftarrow" => "<mo>⇐</mo>",
|
68
|
+
"longrightarrow" => "<mo>→</mo>",
|
69
|
+
"Longrightarrow" => "<mo>⇒</mo>",
|
70
|
+
"longleftrightarrow" => "<mo>↔</mo>",
|
71
|
+
"Longleftrightarrow" => "<mo>⇔</mo>",
|
72
|
+
"longmapsto" => "<mo>↦</mo>",
|
73
|
+
"leadsto" => "<mo>⇝</mo>",
|
74
|
+
"hookrightarrow" => "<mo>↪</mo>",
|
75
|
+
"rightharpoonup" => "<mo>⇀</mo>",
|
76
|
+
"rightharpoondown" => "<mo>⇁</mo>",
|
77
|
+
"nearrow" => "<mo>↗</mo>",
|
78
|
+
"searrow" => "<mo>↘</mo>",
|
79
|
+
"swarrow" => "<mo>↙</mo>",
|
80
|
+
"nwarrow" => "<mo>↖</mo>",
|
81
|
+
"arrowvert" => "<mo>∣</mo>",
|
82
|
+
"Arrowvert" => "<mo>∥</mo>",
|
83
|
+
"bracevert" => "<mo mathvariant='bold'>∣</mo>",
|
84
|
+
"lmoustache" => "<mo>⎰</mo>",
|
85
|
+
"rmoustache" => "<mo>⎱</mo>",
|
86
|
+
"leftarrowfill" => "<mo stretchy='true'>←</mo>",
|
87
|
+
"rightarrowfill" => "<mo stretchy='true'>→</mo>",
|
88
|
+
"iff" => "<mo>⇔</mo>",
|
89
|
+
"dashrightarrow" => "<mo>⇢</mo>",
|
90
|
+
"dashleftarrow" => "<mo>⇠</mo>",
|
91
|
+
"leftleftarrows" => "<mo>⇇</mo>",
|
92
|
+
"leftrightarrows" => "<mo>⇆</mo>",
|
93
|
+
"Lleftarrow" => "<mo>⇚</mo>",
|
94
|
+
"twoheadleftarrow" => "<mo>↞</mo>",
|
95
|
+
"leftarrowtail" => "<mo>↢</mo>",
|
96
|
+
"looparrowleft" => "<mo>↫</mo>",
|
97
|
+
"leftrightharpoons" => "<mo>⇋</mo>",
|
98
|
+
"curvearrowleft" => "<mo>↶</mo>",
|
99
|
+
"circlearrowleft" => "<mo>↺</mo>",
|
100
|
+
"Lsh" => "<mo>↰</mo>",
|
101
|
+
"upuparrows" => "<mo>⇈</mo>",
|
102
|
+
"upharpoonleft" => "<mo>↿</mo>",
|
103
|
+
"downharpoonleft" => "<mo>⇃</mo>",
|
104
|
+
"multimap" => "<mo>⊸</mo>",
|
105
|
+
"leftrightsquigarrow" => "<mo>↭</mo>",
|
106
|
+
"rightrightarrows" => "<mo>⇉</mo>",
|
107
|
+
"rightleftarrows" => "<mo>⇄</mo>",
|
108
|
+
"twoheadrightarrow" => "<mo>↠</mo>",
|
109
|
+
"rightarrowtail" => "<mo>↣</mo>",
|
110
|
+
"looparrowright" => "<mo>↬</mo>",
|
111
|
+
"rightleftharpoons" => "<mo>⇌</mo>",
|
112
|
+
"curvearrowright" => "<mo>↷</mo>",
|
113
|
+
"circlearrowright" => "<mo>↻</mo>",
|
114
|
+
"Rsh" => "<mo>↱</mo>",
|
115
|
+
"downdownarrows" => "<mo>⇊</mo>",
|
116
|
+
"upharpoonright" => "<mo>↾</mo>",
|
117
|
+
"rightsquigarrow" => "<mo>⇝</mo>",
|
118
|
+
"nleftarrow" => "<mo>↚</mo>",
|
119
|
+
"nrightarrow" => "<mo>↛</mo>",
|
120
|
+
"nLeftarrow" => "<mo>⇍</mo>",
|
121
|
+
"nRightarrow" => "<mo>⇏</mo>",
|
122
|
+
"nleftrightarrow" => "<mo>↮</mo>",
|
123
|
+
"nLeftrightarrow" => "<mo>⇎</mo>",
|
124
|
+
"dotplus" => "<mo>∔</mo>",
|
125
|
+
"smallsetminus" => "<mo>∖</mo>",
|
126
|
+
"Cap" => "<mo>⋒</mo>",
|
127
|
+
"Cup" => "<mo>⋓</mo>",
|
128
|
+
"barwedge" => "<mo>⊼</mo>",
|
129
|
+
"doublebarwedge" => "<mo>⌆</mo>",
|
130
|
+
"veebar" => "<mo>⊻</mo>",
|
131
|
+
"boxminus" => "<mo>⊟</mo>",
|
132
|
+
"boxtimes" => "<mo>⊠</mo>",
|
133
|
+
"boxdot" => "<mo>⊡</mo>",
|
134
|
+
"boxplus" => "<mo>⊞</mo>",
|
135
|
+
"divideontimes" => "<mo>⋇</mo>",
|
136
|
+
"ltimes" => "<mo>⋉</mo>",
|
137
|
+
"rtimes" => "<mo>⋊</mo>",
|
138
|
+
"leftthreetimes" => "<mo>⋋</mo>",
|
139
|
+
"rightthreetimes" => "<mo>⋌</mo>",
|
140
|
+
"curlywedge" => "<mo>⋏</mo>",
|
141
|
+
"curlyvee" => "<mo>⋏</mo>",
|
142
|
+
"circleddash" => "<mo>⊝</mo>",
|
143
|
+
"circledast" => "<mo>⊛</mo>",
|
144
|
+
"circledcirc" => "<mo>⊚</mo>",
|
145
|
+
"centerdot" => "<mo>⋅</mo>",
|
146
|
+
"intercal" => "<mo>⊺</mo>",
|
147
|
+
"digamma" => "<mo>Ϝ</mo>",
|
148
|
+
"varkappa" => "<mo>ϰ</mo>",
|
149
|
+
"beth" => "<mo>ℶ</mo>",
|
150
|
+
"daleth" => "<mo>ℸ</mo>",
|
151
|
+
"gimel" => "<mo>ℷ</mo>",
|
152
|
+
"ulcorner" => "<mo>⌜</mo>",
|
153
|
+
"urcorner" => "<mo>⌝</mo>",
|
154
|
+
"llcorner" => "<mo>⌞</mo>",
|
155
|
+
"lrcorner" => "<mo>⌟</mo>",
|
156
|
+
"leqq" => "<mo>≦</mo>",
|
157
|
+
"leqslant" => "<mo>⩽</mo>",
|
158
|
+
"eqslantless" => "<mo>⪕</mo>",
|
159
|
+
"lessapprox" => "<mo>⪅</mo>",
|
160
|
+
"lesssim" => "<mo>≲</mo>",
|
161
|
+
"approxeq" => "<mo>≊</mo>",
|
162
|
+
"lessdot" => "<mo>⋖</mo>",
|
163
|
+
"lll" => "<mo>⋘</mo>",
|
164
|
+
"lessgtr" => "<mo>≶</mo>",
|
165
|
+
"lesseqgtr" => "<mo>⋚</mo>",
|
166
|
+
"lesseqqgtr" => "<mo>⪋</mo>",
|
167
|
+
"doteqdot" => "<mo>≑</mo>",
|
168
|
+
"risingdotseq" => "<mo>≓</mo>",
|
169
|
+
"fallingdotseq" => "<mo>≒</mo>",
|
170
|
+
"backsim" => "<mo>∽</mo>",
|
171
|
+
"backsimeq" => "<mo>⋍</mo>",
|
172
|
+
"subseteqq" => "<mo>⫅</mo>",
|
173
|
+
"Subset" => "<mo>⋐</mo>",
|
174
|
+
"sqsubset" => "<mo>⊏</mo>",
|
175
|
+
"preccurlyeq" => "<mo>≼</mo>",
|
176
|
+
"curlyeqprec" => "<mo>⋞</mo>",
|
177
|
+
"precsim" => "<mo>≾</mo>",
|
178
|
+
"precapprox" => "<mo>⪷</mo>",
|
179
|
+
"vartriangleleft" => "<mo>⊲</mo>",
|
180
|
+
"trianglelefteq" => "<mo>⊴</mo>",
|
181
|
+
"Vvdash" => "<mo>⊪</mo>",
|
182
|
+
"smallsmile" => "<mo>⌣</mo>",
|
183
|
+
"smallfrown" => "<mo>⌢</mo>",
|
184
|
+
"bumpeq" => "<mo>≏</mo>",
|
185
|
+
"Bumpeq" => "<mo>≎</mo>",
|
186
|
+
"geqq" => "<mo>≧</mo>",
|
187
|
+
"geqslant" => "<mo>⩾</mo>",
|
188
|
+
"eqslantgtr" => "<mo>⪖</mo>",
|
189
|
+
"eqslantgtr" => "<mo>⋝</mo>",
|
190
|
+
"gtrsim" => "<mo>≳</mo>",
|
191
|
+
"gtrapprox" => "<mo>⪆</mo>",
|
192
|
+
"gtrdot" => "<mo>⋗</mo>",
|
193
|
+
"ggg" => "<mo>⋙</mo>",
|
194
|
+
"gtrless" => "<mo>≷</mo>",
|
195
|
+
"gtreqless" => "<mo>⋛</mo>",
|
196
|
+
"gtreqqless" => "<mo>⪌</mo>",
|
197
|
+
"eqcirc" => "<mo>≖</mo>",
|
198
|
+
"circeq" => "<mo>≗</mo>",
|
199
|
+
"triangleq" => "<mo>≜</mo>",
|
200
|
+
"thicksim" => "<mo>∼</mo>",
|
201
|
+
"supseteqq" => "<mo>⫆</mo>",
|
202
|
+
"thickapprox" => "<mo>≈</mo>",
|
203
|
+
"Supset" => "<mo>⋑</mo>",
|
204
|
+
"sqsupset" => "<mo>⊐</mo>",
|
205
|
+
"succcurlyeq" => "<mo>≽</mo>",
|
206
|
+
"curlyeqsucc" => "<mo>⋟</mo>",
|
207
|
+
"succsim" => "<mo>≿</mo>",
|
208
|
+
"succapprox" => "<mo>⪸</mo>",
|
209
|
+
"vartriangleright" => "<mo>⊳</mo>",
|
210
|
+
"trianglerighteq" => "<mo>⊵</mo>",
|
211
|
+
"Vdash" => "<mo>⊩</mo>",
|
212
|
+
"shortmid" => "<mo>∣</mo>",
|
213
|
+
"shortparallel" => "<mo>∥</mo>",
|
214
|
+
"between" => "<mo>≬</mo>",
|
215
|
+
"pitchfork" => "<mo>⏔</mo>",
|
216
|
+
"varpropto" => "<mo>∝</mo>",
|
217
|
+
"blacktriangleleft" => "<mo>◀</mo>",
|
218
|
+
"therefore" => "<mo>∴</mo>",
|
219
|
+
"backepsilon" => "<mo>∋</mo>",
|
220
|
+
"blacktriangleright" => "<mo>▶</mo>",
|
221
|
+
"because" => "<mo>∵</mo>",
|
222
|
+
"nless" => "<mo>≮</mo>",
|
223
|
+
"nleq" => "<mo>≰</mo>",
|
224
|
+
"lneq" => "<mo>⪇</mo>",
|
225
|
+
"lneqq" => "<mo>≨</mo>",
|
226
|
+
"lnsim" => "<mo>⋦</mo>",
|
227
|
+
"lnapprox" => "<mo>⪉</mo>",
|
228
|
+
"precnsim" => "<mo>⋨</mo>",
|
229
|
+
"precnapprox" => "<mo>⪹</mo>",
|
230
|
+
"nsim" => "<mo>≁</mo>",
|
231
|
+
"nmid" => "<mo>∤</mo>",
|
232
|
+
"nvdash" => "<mo>⊬</mo>",
|
233
|
+
"nvDash" => "<mo>⊭</mo>",
|
234
|
+
"ntriangleleft" => "<mo>⋪</mo>",
|
235
|
+
"ntrianglelefteq" => "<mo>⋬</mo>",
|
236
|
+
"nsubseteq" => "<mo>⊈</mo>",
|
237
|
+
"subsetneq" => "<mo>⊊</mo>",
|
238
|
+
"subsetneqq" => "<mo>⫋</mo>",
|
239
|
+
"ntrianglelefteq" => "<mo>⋬</mo>",
|
240
|
+
"ngtr" => "<mo>≯</mo>",
|
241
|
+
"ngeq" => "<mo>≱</mo>",
|
242
|
+
"gneq" => "<mo>⪈</mo>",
|
243
|
+
"gneqq" => "<mo>≩</mo>",
|
244
|
+
"gnsim" => "<mo>⋧</mo>",
|
245
|
+
"gnapprox" => "<mo>⪊</mo>",
|
246
|
+
"succnsim" => "<mo>⋩</mo>",
|
247
|
+
"succnapprox" => "<mo>⪺</mo>",
|
248
|
+
"ncong" => "<mo>≇</mo>",
|
249
|
+
"nshortparallel" => "<mo>∦</mo>",
|
250
|
+
"nparallel" => "<mo>∦</mo>",
|
251
|
+
"nVDash" => "<mo>⊯</mo>",
|
252
|
+
"ntriangleright" => "<mo>⋫</mo>",
|
253
|
+
"ntrianglerighteq" => "<mo>⋭</mo>",
|
254
|
+
"nsupseteq" => "<mo>⊉</mo>",
|
255
|
+
"nsupseteq" => "<mo>⊉</mo>",
|
256
|
+
"supsetneq" => "<mo>⊋</mo>",
|
257
|
+
"supsetneqq" => "<mo>⫌</mo>",
|
258
|
+
"hbar" => "<mo>ħ</mo>",
|
259
|
+
"hslash" => "<mo>ℏ</mo>",
|
260
|
+
"vartriangle" => "<mo>△</mo>",
|
261
|
+
"triangledown" => "<mo>▽</mo>",
|
262
|
+
"square" => "<mo>□</mo>",
|
263
|
+
"lozenge" => "<mo>◊</mo>",
|
264
|
+
"circledS" => "<mo>Ⓢ</mo>",
|
265
|
+
"measuredangle" => "<mo>∡</mo>",
|
266
|
+
"nexists" => "<mo>∄</mo>",
|
267
|
+
"mho" => "<mo>℧</mo>",
|
268
|
+
"Finv" => "<mo>Ⅎ</mo>",
|
269
|
+
"backprime" => "<mo>‵</mo>",
|
270
|
+
"varnothing" => "<mo>Ø</mo>",
|
271
|
+
"blacktriangle" => "<mo>▲</mo>",
|
272
|
+
"blacktriangledown" => "<mo>▼</mo>",
|
273
|
+
"blacksquare" => "<mo>■</mo>",
|
274
|
+
"blacklozenge" => "<mo>◊</mo>",
|
275
|
+
"bigstar" => "<mo>★</mo>",
|
276
|
+
"sphericalangle" => "<mo>∢</mo>",
|
277
|
+
"complement" => "<mo>∁</mo>",
|
278
|
+
"eth" => "<mo>ð</mo>",
|
279
|
+
"qed" => "<mo>□</mo>",
|
280
|
+
"i" => "<mo>ı</mo>",
|
281
|
+
"j" => "<mo>j</mo>",
|
282
|
+
"alpha" => "<mi>α</mi>",
|
283
|
+
"beta" => "<mi>β</mi>",
|
284
|
+
"gamma" => "<mi>γ</mi>",
|
285
|
+
"delta" => "<mi>δ</mi>",
|
286
|
+
"epsilon" => "<mi>ε</mi>",
|
287
|
+
"varepsilon" => "<mi>ε</mi>",
|
288
|
+
"zeta" => "<mi>ζ</mi>",
|
289
|
+
"eta" => "<mi>η</mi>",
|
290
|
+
"theta" => "<mi>θ</mi>",
|
291
|
+
"vartheta" => "<mi>ϑ</mi>",
|
292
|
+
"iota" => "<mi>ι</mi>",
|
293
|
+
"kappa" => "<mi>κ</mi>",
|
294
|
+
"lambda" => "<mi>λ</mi>",
|
295
|
+
"mu" => "<mi>μ</mi>",
|
296
|
+
"nu" => "<mi>ν</mi>",
|
297
|
+
"xi" => "<mi>ξ</mi>",
|
298
|
+
"pi" => "<mi>π</mi>",
|
299
|
+
"varpi" => "<mi>ϖ</mi>",
|
300
|
+
"rho" => "<mi>ρ</mi>",
|
301
|
+
"varrho" => "<mi>ϱ</mi>",
|
302
|
+
"varsigma" => "<mi>ς</mi>",
|
303
|
+
"sigma" => "<mi>σ</mi>",
|
304
|
+
"tau" => "<mi>τ</mi>",
|
305
|
+
"upsilon" => "<mi>υ</mi>",
|
306
|
+
"phi" => "<mi>φ</mi>",
|
307
|
+
"varphi" => "<mi>ϕ</mi>",
|
308
|
+
"chi" => "<mi>χ</mi>",
|
309
|
+
"psi" => "<mi>ψ</mi>",
|
310
|
+
"omega" => "<mi>ω</mi>",
|
311
|
+
"Gamma" => "<mi>Γ</mi>",
|
312
|
+
"Delta" => "<mi>Δ</mi>",
|
313
|
+
"Theta" => "<mi>Θ</mi>",
|
314
|
+
"Lambda" => "<mi>Λ</mi>",
|
315
|
+
"Xi" => "<mi>Ξ</mi>",
|
316
|
+
"Pi" => "<mi>Π</mi>",
|
317
|
+
"Sigma" => "<mi>Σ</mi>",
|
318
|
+
"Upsilon" => "<mi>Υ</mi>",
|
319
|
+
"Phi" => "<mi>Φ</mi>",
|
320
|
+
"Psi" => "<mi>Ψ</mi>",
|
321
|
+
"Omega" => "<mi>Ω</mi>",
|
322
|
+
"varGamma" => "<mi>Γ</mi>",
|
323
|
+
"varDelta" => "<mi>Δ</mi>",
|
324
|
+
"varTheta" => "<mi>Θ</mi>",
|
325
|
+
"varLambda" => "<mi>Λ</mi>",
|
326
|
+
"varXi" => "<mi>Ξ</mi>",
|
327
|
+
"varPi" => "<mi>Π</mi>",
|
328
|
+
"varSigma" => "<mi>Σ</mi>",
|
329
|
+
"varUpsilon" => "<mi>Υ</mi>",
|
330
|
+
"varPhi" => "<mi>Φ</mi>",
|
331
|
+
"varPsi" => "<mi>Ψ</mi>",
|
332
|
+
"varOmega" => "<mi>Ω</mi>",
|
333
|
+
"colon" => "<mo>:</mo>",
|
334
|
+
"*" => "<mo>*</mo>",
|
335
|
+
"#" => "<mo>#</mo>",
|
336
|
+
"$" => "<mo>$</mo>",
|
337
|
+
"%" => "<mo>%</mo>",
|
338
|
+
"&" => "<mo>&</mo>",
|
339
|
+
"_" => "<mo>_</mo>",
|
340
|
+
"!" => "<mo>!</mo>",
|
341
|
+
"aleph" => "<mo>ℵ</mo>",
|
342
|
+
"imath" => "<mo>⍳</mo>",
|
343
|
+
"jmath" => "<mo>j</mo>",
|
344
|
+
"ell" => "<mo>ℓ</mo>",
|
345
|
+
"wp" => "<mo>℘</mo>",
|
346
|
+
"Re" => "<mo>ℜ</mo>",
|
347
|
+
"Im" => "<mo>ℑ</mo>",
|
348
|
+
"prime" => "<mo>′</mo>",
|
349
|
+
"emptyset" => "<mo>∅</mo>",
|
350
|
+
"nabla" => "<mo>∇</mo>",
|
351
|
+
"surd" => "<mo>√</mo>",
|
352
|
+
"partial" => "<mo>∂</mo>",
|
353
|
+
"top" => "<mo>Τ</mo>",
|
354
|
+
"bot" => "<mo>Υ</mo>",
|
355
|
+
"vdash" => "<mo>⊢</mo>",
|
356
|
+
"dashv" => "<mo>⊣</mo>",
|
357
|
+
"forall" => "<mo>∀</mo>",
|
358
|
+
"exists" => "<mo>∃</mo>",
|
359
|
+
"neg" => "<mo>¬</mo>",
|
360
|
+
"flat" => "<mo>♭</mo>",
|
361
|
+
"natural" => "<mo>♮</mo>",
|
362
|
+
"sharp" => "<mo>♯</mo>",
|
363
|
+
"angle" => "<mo>∠</mo>",
|
364
|
+
"Box" => "<mo>▫</mo>",
|
365
|
+
"Diamond" => "<mo>◊</mo>",
|
366
|
+
"triangle" => "<mo>△</mo>",
|
367
|
+
"clubsuit" => "<mo>♣</mo>",
|
368
|
+
"diamondsuit" => "<mo>♦</mo>",
|
369
|
+
"heartsuit" => "<mo>♥</mo>",
|
370
|
+
"spadesuit" => "<mo>♠</mo>",
|
371
|
+
"Join" => "<mo>⋈</mo>",
|
372
|
+
"infty" => "<mo>∞</mo>",
|
373
|
+
"lnot" => "<mo>⌐</mo>",
|
374
|
+
"bull" => "<mo>▪</mo>",
|
375
|
+
"cents" => "<mo>¢</mo>",
|
376
|
+
"sum" => "<mo>∑</mo>",
|
377
|
+
"prod" => "<mo>∏</mo>",
|
378
|
+
"coprod" => "<mo>∐</mo>",
|
379
|
+
"int" => "<mo>∫</mo>",
|
380
|
+
"iint" => "<mo>∬</mo>",
|
381
|
+
"iiint" => "<mo>∭</mo>",
|
382
|
+
"iiiint" => "<mo>⨌</mo>",
|
383
|
+
"idotsint" => "<mo>∫</mo>",
|
384
|
+
"oint" => "<mo>∮</mo>",
|
385
|
+
"bigcap" => "<mo>∩</mo>",
|
386
|
+
"bigcup" => "<mo>∪</mo>",
|
387
|
+
"bigsqcup" => "<mo>⊔</mo>",
|
388
|
+
"bigvee" => "<mo>⋁</mo>",
|
389
|
+
"bigwedge" => "<mo>⋀</mo>",
|
390
|
+
"bigodot" => "<mo>⊙</mo>",
|
391
|
+
"bigotimes" => "<mo>⊗</mo>",
|
392
|
+
"bigoplus" => "<mo>⊕</mo>",
|
393
|
+
"biguplus" => "<mo>⊎</mo>",
|
394
|
+
"oe" => "<mo>œ</mo>",
|
395
|
+
"OE" => "<mo>Œ</mo>",
|
396
|
+
"ae" => "<mo>æ</mo>",
|
397
|
+
"AE" => "<mo>Æ</mo>",
|
398
|
+
"aa" => "<mo>å</mo>",
|
399
|
+
"AA" => "<mo>Å</mo>",
|
400
|
+
"o" => "<mo>ø</mo>",
|
401
|
+
"O" => "<mo>Ø</mo>",
|
402
|
+
"l" => "<mo>ł</mo>",
|
403
|
+
"L" => "<mo>Ł</mo>",
|
404
|
+
"SS" => "<mo>ß</mo>",
|
405
|
+
"S" => "<mo>§</mo>",
|
406
|
+
"copyright" => "<mo>©</mo>",
|
407
|
+
"P" => "<mo>¶</mo>",
|
408
|
+
"pounds" => "<mo>£</mo>",
|
409
|
+
"+" => "<mo>+</mo>",
|
410
|
+
"-" => "<mo>-</mo>",
|
411
|
+
"pm" => "<mo>±</mo>",
|
412
|
+
"mp" => "<mo>±</mo>",
|
413
|
+
"times" => "<mo>×</mo>",
|
414
|
+
"div" => "<mo>÷</mo>",
|
415
|
+
"cdot" => "<mo>⋅</mo>",
|
416
|
+
"ast" => "<mo>*</mo>",
|
417
|
+
"star" => "<mo>⋆</mo>",
|
418
|
+
"dagger" => "<mo>†</mo>",
|
419
|
+
"dag" => "<mo>†</mo>",
|
420
|
+
"ddagger" => "<mo>‡</mo>",
|
421
|
+
"ddag" => "<mo>‡</mo>",
|
422
|
+
"amalg" => "<mo>∐</mo>",
|
423
|
+
"cap" => "<mo>∩</mo>",
|
424
|
+
"cup" => "<mo>∪</mo>",
|
425
|
+
"uplus" => "<mo>⊎</mo>",
|
426
|
+
"sqcap" => "<mo>⊓</mo>",
|
427
|
+
"sqcup" => "<mo>⊔</mo>",
|
428
|
+
"vee" => "<mo>∨</mo>",
|
429
|
+
"wedge" => "<mo>∧</mo>",
|
430
|
+
"oplus" => "<mo>⊕</mo>",
|
431
|
+
"ominus" => "<mo>⊖</mo>",
|
432
|
+
"otimes" => "<mo>⊗</mo>",
|
433
|
+
"oslash" => "<mo>⊘</mo>",
|
434
|
+
"odot" => "<mo>⊙</mo>",
|
435
|
+
"circ" => "<mo>∘</mo>",
|
436
|
+
"bullet" => "<mo>∙</mo>",
|
437
|
+
"diamond" => "<mo>⋄</mo>",
|
438
|
+
"lhd" => "<mo>⊲</mo>",
|
439
|
+
"rhd" => "<mo>⊳</mo>",
|
440
|
+
"unlhd" => "<mo>⊴</mo>",
|
441
|
+
"unrhd" => "<mo>⊵</mo>",
|
442
|
+
"bigcirc" => "<mo>◯</mo>",
|
443
|
+
"bigtriangleup" => "<mo>△</mo>",
|
444
|
+
"bigtriangledown" => "<mo>▽</mo>",
|
445
|
+
"triangleleft" => "<mo>◅</mo>",
|
446
|
+
"triangleright" => "<mo>▻</mo>",
|
447
|
+
"setminus" => "<mo>∖</mo>",
|
448
|
+
"wr" => "<mo>≀</mo>",
|
449
|
+
"lor" => "<mo>∨</mo>",
|
450
|
+
"land" => "<mo>∧</mo>",
|
451
|
+
"cdots" => "<mo>⋯</mo>",
|
452
|
+
"ddots" => "<mo>⋱</mo>",
|
453
|
+
"vdots" => "<mo>⋮</mo>",
|
454
|
+
"ldots" => "<mo>…</mo>",
|
455
|
+
"dots" => "<mo>⋯</mo>",
|
456
|
+
"dotsb" => "<mo>⋯</mo>",
|
457
|
+
"dotsc" => "<mo>…</mo>",
|
458
|
+
"dotsi" => "<mo>⋯</mo>",
|
459
|
+
"dotsm" => "<mo>⋯</mo>",
|
460
|
+
"dotso" => "<mo>⋯</mo>",
|
461
|
+
"=" => "<mo>=</mo>",
|
462
|
+
"leq" => "<mo>≤</mo>",
|
463
|
+
"le" => "<mo>≤</mo>",
|
464
|
+
"ll" => "<mo>≪</mo>",
|
465
|
+
"geq" => "<mo>≥</mo>",
|
466
|
+
"ge" => "<mo>≥</mo>",
|
467
|
+
"gg" => "<mo>≫</mo>",
|
468
|
+
"ne" => "<mo>≠</mo>",
|
469
|
+
"neq" => "<mo>≠</mo>",
|
470
|
+
"doteq" => "<mo>≐</mo>",
|
471
|
+
"subset" => "<mo>⊂</mo>",
|
472
|
+
"subseteq" => "<mo>⊆</mo>",
|
473
|
+
"sqsubseteq" => "<mo>⊑</mo>",
|
474
|
+
"supset" => "<mo>⊃</mo>",
|
475
|
+
"supseteq" => "<mo>⊇</mo>",
|
476
|
+
"sqsupseteq" => "<mo>⊒</mo>",
|
477
|
+
"in" => "<mo>∈</mo>",
|
478
|
+
"ni" => "<mo>∋</mo>",
|
479
|
+
"models" => "<mo>⊧</mo>",
|
480
|
+
"perp" => "<mo>⊥</mo>",
|
481
|
+
"approx" => "<mo>≈</mo>",
|
482
|
+
"cong" => "<mo>≅</mo>",
|
483
|
+
"equiv" => "<mo>≍</mo>",
|
484
|
+
"propto" => "<mo>∝</mo>",
|
485
|
+
"prec" => "<mo>≺</mo>",
|
486
|
+
"preceq" => "<mo>≼</mo>",
|
487
|
+
"parallel" => "<mo>∥</mo>",
|
488
|
+
"sim" => "<mo>∼</mo>",
|
489
|
+
"simeq" => "<mo>≃</mo>",
|
490
|
+
"asymp" => "<mo>≍</mo>",
|
491
|
+
"smile" => "<mo>⌣</mo>",
|
492
|
+
"frown" => "<mo>⌢</mo>",
|
493
|
+
"bowtie" => "<mo>⋈</mo>",
|
494
|
+
"succ" => "<mo>≻</mo>",
|
495
|
+
"succeq" => "<mo>≽</mo>",
|
496
|
+
"mid" => "<mo>∣</mo>",
|
497
|
+
"owns" => "<mo>∋</mo>",
|
498
|
+
"notin" => "<mo>∉</mo>",
|
499
|
+
"arccos" => "<mi>arccos</mi>",
|
500
|
+
"arcsin" => "<mi>arcsin</mi>",
|
501
|
+
"arctan" => "<mi>arctan</mi>",
|
502
|
+
"arg" => "<mi>arg</mi>",
|
503
|
+
"cos" => "<mi>cos</mi>",
|
504
|
+
"cosh" => "<mi>cosh</mi>",
|
505
|
+
"cot" => "<mi>cot</mi>",
|
506
|
+
"coth" => "<mi>coth</mi>",
|
507
|
+
"csc" => "<mi>csc</mi>",
|
508
|
+
"deg" => "<mi>deg</mi>",
|
509
|
+
"det" => "<mi>det</mi>",
|
510
|
+
"dim" => "<mi>dim</mi>",
|
511
|
+
"exp" => "<mi>exp</mi>",
|
512
|
+
"gcd" => "<mi>gcd</mi>",
|
513
|
+
"hom" => "<mi>hom</mi>",
|
514
|
+
"inf" => "<mi>inf</mi>",
|
515
|
+
"ker" => "<mi>ker</mi>",
|
516
|
+
"lg" => "<mi>lg</mi>",
|
517
|
+
"lim" => "<mi>lim</mi>",
|
518
|
+
"liminf" => "<mi>lim inf</mi>",
|
519
|
+
"limsup" => "<mi>lim sum</mi>",
|
520
|
+
"ln" => "<mi>ln</mi>",
|
521
|
+
"log" => "<mi>log</mi>",
|
522
|
+
"bmod" => "<mi>mod</mi>",
|
523
|
+
"mod" => "<mi lspace='1em'>mod</mi>",
|
524
|
+
"max" => "<mi>max</mi>",
|
525
|
+
"min" => "<mi>min</mi>",
|
526
|
+
"Pr" => "<mi>Pr</mi>",
|
527
|
+
"sec" => "<mi>sec</mi>",
|
528
|
+
"sin" => "<mi>sin</mi>",
|
529
|
+
"sinh" => "<mi>sin</mi>",
|
530
|
+
"sup" => "<mi>sup</mi>",
|
531
|
+
"tan" => "<mi>tan</mi>",
|
532
|
+
"tanh" => "<mi>tanh</mi>",
|
533
|
+
"," => "<mo> </mo>",
|
534
|
+
"thinspace" => "<mo> </mo>",
|
535
|
+
"implies" => "<mo>⇒</mo>",
|
536
|
+
"injlim" => "<mo>inj lim</mo>",
|
537
|
+
"projlim" => "<mo>proj lim</mo>",
|
538
|
+
"nobreakdash" => "<mo>‑</mo>",
|
539
|
+
"lvert" => "<mo form='prefix'>|</mo>",
|
540
|
+
"rvert" => "<mo form='postfix'>|</mo>",
|
541
|
+
"lVert" => "<mo form='prefix'>‖</mo>",
|
542
|
+
"rVert" => "<mo form='postfix'>‖</mo>",
|
543
|
+
}
|
544
|
+
|
545
|
+
## Generate a hash table of entities from a shorthand version
|
546
|
+
## involving a hash table and an array.
|
547
|
+
##
|
548
|
+
## _element_:: the HTML element to wrap the entities with
|
549
|
+
## _opts_:: arguments to the opening HTML element
|
550
|
+
def generate(element, opts, hash={}, array=[])
|
551
|
+
ret = {}
|
552
|
+
|
553
|
+
endt = "</#{element}>"
|
554
|
+
startt =
|
555
|
+
unless opts.nil? || opts.empty?
|
556
|
+
"<#{element} #{opts}>"
|
557
|
+
else
|
558
|
+
"<#{element}>"
|
559
|
+
end
|
560
|
+
|
561
|
+
array.each do |e|
|
562
|
+
if Array === e
|
563
|
+
e.each { |i| ret[i] = "#{startt}&#{e.last};#{endt}" }
|
564
|
+
else
|
565
|
+
ret[e] = "#{startt}&#{e};#{endt}"
|
566
|
+
end
|
567
|
+
end
|
568
|
+
|
569
|
+
hash.each do |e, v|
|
570
|
+
if Array === e
|
571
|
+
e.each { |i| ret[i] = "#{startt}&#{v};#{endt}" }
|
572
|
+
else
|
573
|
+
ret[e] = "#{startt}&#{v};#{endt}"
|
574
|
+
end
|
575
|
+
end
|
576
|
+
|
577
|
+
ret
|
578
|
+
end
|
579
|
+
module_function :generate
|
580
|
+
|
581
|
+
## numbers
|
582
|
+
NUMS = generate "mn", "", {
|
583
|
+
["infty", "infinity"] => "infin",
|
584
|
+
}
|
585
|
+
|
586
|
+
## greek letters
|
587
|
+
GREEK = generate "mi", "", {
|
588
|
+
"omicron" => "oscr",
|
589
|
+
"epsilon" => "epsi",
|
590
|
+
},
|
591
|
+
%w(alpha beta gamma delta epsilon varepsilon zeta eta theta vartheta iota kappa lambda mu nu xi pi varpi rho varrho sigma varsigma tau upsilon phi varphi chi psi omega Gamma Delta Theta Lambda Xi Pi Sigma Upsilon Phi Psi Omega)
|
592
|
+
|
593
|
+
%w(Alpha Beta Zeta Eta Iota Kappa Mu Nu Rho Tau).each do |x|
|
594
|
+
GREEK[x] = "<mi>&#{x[0].chr};</mi>"
|
595
|
+
end
|
596
|
+
|
597
|
+
## regular operators ("MOL" in itex2MML parlance)
|
598
|
+
OPERATORS = generate "mo", "", {
|
599
|
+
"in" => "Element",
|
600
|
+
"bottom" => "perp",
|
601
|
+
"neg" => "not",
|
602
|
+
"mid" => "VerticalBar",
|
603
|
+
"|" => "DoubleVerticalBar",
|
604
|
+
["int", "integral"] => "Integral",
|
605
|
+
["iint", "doubleintegral"] => "Int",
|
606
|
+
["iiint", "tripleintegral"] => "tint",
|
607
|
+
["iiiint", "quadtrupleintegral"] => "qint",
|
608
|
+
|
609
|
+
}, [
|
610
|
+
["Longleftrightarrow", "iff"],
|
611
|
+
"Leftrightarrow",
|
612
|
+
["impliedby", "Leftarrow"],
|
613
|
+
["implies", "Rightarrow"],
|
614
|
+
"hookleftarrow",
|
615
|
+
["embedsin", "hookrightarrow"],
|
616
|
+
"longleftarrow",
|
617
|
+
"longrightarrow",
|
618
|
+
"leftarrow",
|
619
|
+
["to", "rightarrow"],
|
620
|
+
"leftrightarrow",
|
621
|
+
["mapsto", "map"],
|
622
|
+
["nearrow", "nearr"],
|
623
|
+
["nwarrow", "nwarr"],
|
624
|
+
["searrow", "searr"],
|
625
|
+
["swarrow", "swarr"],
|
626
|
+
["neArrow", "neArr"],
|
627
|
+
["nwArrow", "nwArr"],
|
628
|
+
["seArrow", "seArr"],
|
629
|
+
["swArrow", "swArr"],
|
630
|
+
["downarrow", "darr"],
|
631
|
+
["uparrow", "uparr"],
|
632
|
+
["downuparrow", "updownarrow", "duparr", "updarr"],
|
633
|
+
["union", "cup"],
|
634
|
+
["neq", "ne"],
|
635
|
+
["oint", "contourintegral", "conint"],
|
636
|
+
"times",
|
637
|
+
"otimes",
|
638
|
+
"oplus",
|
639
|
+
"wedge",
|
640
|
+
] + %w(lfloor lceil lang langle gt lt subset subseteq prec parallel nparallel perp gg geq ge le leq nsubset nsubseteq notin ni nmid preceq npreceq ll ngeq nleq supset supseteq approx sim triangleleft cong succ nsucc ngtr nsupset nsupseteq propto equiv triangleright ncong succeq nsucceq amalg setminus smallsetminus pm circ ltimes div rtimes Im bot emptyset prime therefore flat vee Re exists hbar because sharp bullet aleph nexists imath not top wp natural square angle forall jmath partial ell bigtriangleup bigtriangledown beth nprec Subset)
|
641
|
+
|
642
|
+
## notation ("MO")
|
643
|
+
NOTATION = generate "mo", "", {
|
644
|
+
"cdot" => "sdot",
|
645
|
+
"ddots" => "dtdot",
|
646
|
+
"ldots" => "ltdot",
|
647
|
+
"vdots" => "vellip",
|
648
|
+
"qed" => "squf",
|
649
|
+
},
|
650
|
+
%w(rfloor rceil rang rangle)
|
651
|
+
|
652
|
+
NOTATION["cdots"] = "<mo>⋅ ⋅ ⋅</mo>"
|
653
|
+
NOTATION["pmod"] = " mod"
|
654
|
+
|
655
|
+
## unary operators ("MOB")
|
656
|
+
UNARY_OPERATORS = generate "mo", 'lspace="thinmathspace" rspace="thinmathspace"', {
|
657
|
+
"sum" => "Sum",
|
658
|
+
["bigwedge", "Wedge"] => "xwedge",
|
659
|
+
},
|
660
|
+
[
|
661
|
+
["bigcup", "Union"],
|
662
|
+
["product", "prod"],
|
663
|
+
["coproduct", "coprod"],
|
664
|
+
["bigotimes", "Otimes"],
|
665
|
+
["bigoplus", "Oplus"],
|
666
|
+
]
|
667
|
+
UNARY_OPERATORS["lim"] = "<mo lspace=\"thinmathspace\" rspace=\"thinmathspace\">lim</mo>"
|
668
|
+
|
669
|
+
## spaces
|
670
|
+
SPACES = {
|
671
|
+
"," => '<mspace width="thinmathspace"/>',
|
672
|
+
"thinspace" => '<mspace width="thinmathspace"/>',
|
673
|
+
"medspace" => '<mspace width="mediummathspace"/>',
|
674
|
+
" " => '<mspace width="mediummathspace"/>',
|
675
|
+
"thickspace" => '<mspace width="thickmathspace"/>',
|
676
|
+
"quad" => '<mspace width="verythickmathspace"/>',
|
677
|
+
"!" => '<mspace width="-0.1667 em"/>',
|
678
|
+
"negspace" => '<mspace width="-0.1667 em"/>',
|
679
|
+
}
|
680
|
+
|
681
|
+
## functions
|
682
|
+
MATH_FUNCTIONS = {}
|
683
|
+
%w(arccos arcsin arctan arg cos cosh cot coth csc deg det dim exp gcd hom inf ker lg liminf linmsup ln log bmod mod max min Pr sec sin sinh sup tan tanh).each { |x| MATH_FUNCTIONS[x] = "<mo lspace=\"0em\" rspace=\"thinmathspace\">#{x}</mo>" }
|
684
|
+
|
685
|
+
ENTITIES = DEFAULTS.merge(NUMS).merge(GREEK).merge(OPERATORS).merge(NOTATION).merge(UNARY_OPERATORS).merge(SPACES).merge(MATH_FUNCTIONS)
|
686
|
+
|
687
|
+
end
|
688
|
+
end
|