ritex 0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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>&quot;</mo>",
21
+ "|" => "<mo>&#x2225;</mo>",
22
+ "Vert" => "<mo>&#x2225;</mo>",
23
+ "|" => "<mo>&#x2223;</mo>",
24
+ "vert" => "<mo>&#x2223;</mo>",
25
+ "(" => "<mo>(</mo>",
26
+ "[" => "<mo>[</mo>",
27
+ "lbrack" => "<mo>[</mo>",
28
+ "{" => "<mo>{</mo>",
29
+ "lbrace" => "<mo>{</mo>",
30
+ "<" => "<mo>&lt;</mo>",
31
+ "/" => "<mo>/</mo>",
32
+ "lfloor" => "<mo>&#x230A;</mo>",
33
+ "lceil" => "<mo>&#x2308;</mo>",
34
+ "langle" => "<mo>&#x2329;</mo>",
35
+ "lgroup" => "<mo>(</mo>",
36
+ ")" => "<mo>)</mo>",
37
+ "]" => "<mo>]</mo>",
38
+ "rbrack" => "<mo>]</mo>",
39
+ "}" => "<mo>}</mo>",
40
+ "rbrace" => "<mo>}</mo>",
41
+ ">" => "<mo>&gt;</mo>",
42
+ "backslash" => "<mo>\\</mo>",
43
+ "rfloor" => "<mo>&#x230B;</mo>",
44
+ "rceil" => "<mo>&#x2309;</mo>",
45
+ "rangle" => "<mo>&#x232A;</mo>",
46
+ "rgroup" => "<mo>)</mo>",
47
+ "uparrow" => "<mo>&#x2191;</mo>",
48
+ "Uparrow" => "<mo>&#x21D1;</mo>",
49
+ "downarrow" => "<mo>&#x2193;</mo>",
50
+ "Downarrow" => "<mo>&#x21D3;</mo>",
51
+ "updownarrow" => "<mo>&#x21C5;</mo>",
52
+ "Updownarrow" => "<mo>&#x21D5;</mo>",
53
+ "leftarrow" => "<mo>&#x2190;</mo>",
54
+ "gets" => "<mo>&#x2190;</mo>",
55
+ "Leftarrow" => "<mo>&#x21D0;</mo>",
56
+ "rightarrow" => "<mo>&#x2192;</mo>",
57
+ "to" => "<mo>&#x2192;</mo>",
58
+ "Rightarrow" => "<mo>&#x21D2;</mo>",
59
+ "leftrightarrow" => "<mo>&#x21C6;</mo>",
60
+ "Leftrightarrow" => "<mo>&#x21D4;</mo>",
61
+ "mapsto" => "<mo>&#x21A6;</mo>",
62
+ "hookleftarrow" => "<mo>&#x21A9;</mo>",
63
+ "leftharpoonup" => "<mo>&#x21BC;</mo>",
64
+ "leftharpoondown" => "<mo>&#x21BD;</mo>",
65
+ "rightleftharpoons" => "<mo>&#x21CC;</mo>",
66
+ "longleftarrow" => "<mo>&#x2190;</mo>",
67
+ "Longleftarrow" => "<mo>&#x21D0;</mo>",
68
+ "longrightarrow" => "<mo>&#x2192;</mo>",
69
+ "Longrightarrow" => "<mo>&#x21D2;</mo>",
70
+ "longleftrightarrow" => "<mo>&#x2194;</mo>",
71
+ "Longleftrightarrow" => "<mo>&#x21D4;</mo>",
72
+ "longmapsto" => "<mo>&#x21A6;</mo>",
73
+ "leadsto" => "<mo>&#x21DD;</mo>",
74
+ "hookrightarrow" => "<mo>&#x21AA;</mo>",
75
+ "rightharpoonup" => "<mo>&#x21C0;</mo>",
76
+ "rightharpoondown" => "<mo>&#x21C1;</mo>",
77
+ "nearrow" => "<mo>&#x2197;</mo>",
78
+ "searrow" => "<mo>&#x2198;</mo>",
79
+ "swarrow" => "<mo>&#x2199;</mo>",
80
+ "nwarrow" => "<mo>&#x2196;</mo>",
81
+ "arrowvert" => "<mo>&#x2223;</mo>",
82
+ "Arrowvert" => "<mo>&#x2225;</mo>",
83
+ "bracevert" => "<mo mathvariant='bold'>&#x2223;</mo>",
84
+ "lmoustache" => "<mo>&#x23B0;</mo>",
85
+ "rmoustache" => "<mo>&#x23B1;</mo>",
86
+ "leftarrowfill" => "<mo stretchy='true'>&#x2190;</mo>",
87
+ "rightarrowfill" => "<mo stretchy='true'>&#x2192;</mo>",
88
+ "iff" => "<mo>&#x21D4;</mo>",
89
+ "dashrightarrow" => "<mo>&#x21E2;</mo>",
90
+ "dashleftarrow" => "<mo>&#x21E0;</mo>",
91
+ "leftleftarrows" => "<mo>&#x21C7;</mo>",
92
+ "leftrightarrows" => "<mo>&#x21C6;</mo>",
93
+ "Lleftarrow" => "<mo>&#x21DA;</mo>",
94
+ "twoheadleftarrow" => "<mo>&#x219E;</mo>",
95
+ "leftarrowtail" => "<mo>&#x21A2;</mo>",
96
+ "looparrowleft" => "<mo>&#x21AB;</mo>",
97
+ "leftrightharpoons" => "<mo>&#x21CB;</mo>",
98
+ "curvearrowleft" => "<mo>&#x21B6;</mo>",
99
+ "circlearrowleft" => "<mo>&#x21BA;</mo>",
100
+ "Lsh" => "<mo>&#x21B0;</mo>",
101
+ "upuparrows" => "<mo>&#x21C8;</mo>",
102
+ "upharpoonleft" => "<mo>&#x21BF;</mo>",
103
+ "downharpoonleft" => "<mo>&#x21C3;</mo>",
104
+ "multimap" => "<mo>&#x22B8;</mo>",
105
+ "leftrightsquigarrow" => "<mo>&#x21AD;</mo>",
106
+ "rightrightarrows" => "<mo>&#x21C9;</mo>",
107
+ "rightleftarrows" => "<mo>&#x21C4;</mo>",
108
+ "twoheadrightarrow" => "<mo>&#x21A0;</mo>",
109
+ "rightarrowtail" => "<mo>&#x21A3;</mo>",
110
+ "looparrowright" => "<mo>&#x21AC;</mo>",
111
+ "rightleftharpoons" => "<mo>&#x21CC;</mo>",
112
+ "curvearrowright" => "<mo>&#x21B7;</mo>",
113
+ "circlearrowright" => "<mo>&#x21BB;</mo>",
114
+ "Rsh" => "<mo>&#x21B1;</mo>",
115
+ "downdownarrows" => "<mo>&#x21CA;</mo>",
116
+ "upharpoonright" => "<mo>&#x21BE;</mo>",
117
+ "rightsquigarrow" => "<mo>&#x21DD;</mo>",
118
+ "nleftarrow" => "<mo>&#x219A;</mo>",
119
+ "nrightarrow" => "<mo>&#x219B;</mo>",
120
+ "nLeftarrow" => "<mo>&#x21CD;</mo>",
121
+ "nRightarrow" => "<mo>&#x21CF;</mo>",
122
+ "nleftrightarrow" => "<mo>&#x21AE;</mo>",
123
+ "nLeftrightarrow" => "<mo>&#x21CE;</mo>",
124
+ "dotplus" => "<mo>&#x2214;</mo>",
125
+ "smallsetminus" => "<mo>&#x2216;</mo>",
126
+ "Cap" => "<mo>&#x22D2;</mo>",
127
+ "Cup" => "<mo>&#x22D3;</mo>",
128
+ "barwedge" => "<mo>&#x22BC;</mo>",
129
+ "doublebarwedge" => "<mo>&#x2306;</mo>",
130
+ "veebar" => "<mo>&#x22BB;</mo>",
131
+ "boxminus" => "<mo>&#x229F;</mo>",
132
+ "boxtimes" => "<mo>&#x22A0;</mo>",
133
+ "boxdot" => "<mo>&#x22A1;</mo>",
134
+ "boxplus" => "<mo>&#x229E;</mo>",
135
+ "divideontimes" => "<mo>&#x22C7;</mo>",
136
+ "ltimes" => "<mo>&#x22C9;</mo>",
137
+ "rtimes" => "<mo>&#x22CA;</mo>",
138
+ "leftthreetimes" => "<mo>&#x22CB;</mo>",
139
+ "rightthreetimes" => "<mo>&#x22CC;</mo>",
140
+ "curlywedge" => "<mo>&#x22CF;</mo>",
141
+ "curlyvee" => "<mo>&#x22CF;</mo>",
142
+ "circleddash" => "<mo>&#x229D;</mo>",
143
+ "circledast" => "<mo>&#x229B;</mo>",
144
+ "circledcirc" => "<mo>&#x229A;</mo>",
145
+ "centerdot" => "<mo>&#x22C5;</mo>",
146
+ "intercal" => "<mo>&#x22BA;</mo>",
147
+ "digamma" => "<mo>&#x03DC;</mo>",
148
+ "varkappa" => "<mo>&#x03F0;</mo>",
149
+ "beth" => "<mo>&#x2136;</mo>",
150
+ "daleth" => "<mo>&#x2138;</mo>",
151
+ "gimel" => "<mo>&#x2137;</mo>",
152
+ "ulcorner" => "<mo>&#x231C;</mo>",
153
+ "urcorner" => "<mo>&#x231D;</mo>",
154
+ "llcorner" => "<mo>&#x231E;</mo>",
155
+ "lrcorner" => "<mo>&#x231F;</mo>",
156
+ "leqq" => "<mo>&#x2266;</mo>",
157
+ "leqslant" => "<mo>&#x2A7D;</mo>",
158
+ "eqslantless" => "<mo>&#x2A95;</mo>",
159
+ "lessapprox" => "<mo>&#x2A85;</mo>",
160
+ "lesssim" => "<mo>&#x2272;</mo>",
161
+ "approxeq" => "<mo>&#x224A;</mo>",
162
+ "lessdot" => "<mo>&#x22D6;</mo>",
163
+ "lll" => "<mo>&#x22D8;</mo>",
164
+ "lessgtr" => "<mo>&#x2276;</mo>",
165
+ "lesseqgtr" => "<mo>&#x22DA;</mo>",
166
+ "lesseqqgtr" => "<mo>&#x2A8B;</mo>",
167
+ "doteqdot" => "<mo>&#x2251;</mo>",
168
+ "risingdotseq" => "<mo>&#x2253;</mo>",
169
+ "fallingdotseq" => "<mo>&#x2252;</mo>",
170
+ "backsim" => "<mo>&#x223D;</mo>",
171
+ "backsimeq" => "<mo>&#x22CD;</mo>",
172
+ "subseteqq" => "<mo>&#x2AC5;</mo>",
173
+ "Subset" => "<mo>&#x22D0;</mo>",
174
+ "sqsubset" => "<mo>&#x228F;</mo>",
175
+ "preccurlyeq" => "<mo>&#x227C;</mo>",
176
+ "curlyeqprec" => "<mo>&#x22DE;</mo>",
177
+ "precsim" => "<mo>&#x227E;</mo>",
178
+ "precapprox" => "<mo>&#x2AB7;</mo>",
179
+ "vartriangleleft" => "<mo>&#x22B2;</mo>",
180
+ "trianglelefteq" => "<mo>&#x22B4;</mo>",
181
+ "Vvdash" => "<mo>&#x22AA;</mo>",
182
+ "smallsmile" => "<mo>&#x2323;</mo>",
183
+ "smallfrown" => "<mo>&#x2322;</mo>",
184
+ "bumpeq" => "<mo>&#x224F;</mo>",
185
+ "Bumpeq" => "<mo>&#x224E;</mo>",
186
+ "geqq" => "<mo>&#x2267;</mo>",
187
+ "geqslant" => "<mo>&#x2A7E;</mo>",
188
+ "eqslantgtr" => "<mo>&#x2A96;</mo>",
189
+ "eqslantgtr" => "<mo>&#x22DD;</mo>",
190
+ "gtrsim" => "<mo>&#x2273;</mo>",
191
+ "gtrapprox" => "<mo>&#x2A86;</mo>",
192
+ "gtrdot" => "<mo>&#x22D7;</mo>",
193
+ "ggg" => "<mo>&#x22D9;</mo>",
194
+ "gtrless" => "<mo>&#x2277;</mo>",
195
+ "gtreqless" => "<mo>&#x22DB;</mo>",
196
+ "gtreqqless" => "<mo>&#x2A8C;</mo>",
197
+ "eqcirc" => "<mo>&#x2256;</mo>",
198
+ "circeq" => "<mo>&#x2257;</mo>",
199
+ "triangleq" => "<mo>&#x225C;</mo>",
200
+ "thicksim" => "<mo>&#x223C;</mo>",
201
+ "supseteqq" => "<mo>&#x2AC6;</mo>",
202
+ "thickapprox" => "<mo>&#x2248;</mo>",
203
+ "Supset" => "<mo>&#x22D1;</mo>",
204
+ "sqsupset" => "<mo>&#x2290;</mo>",
205
+ "succcurlyeq" => "<mo>&#x227D;</mo>",
206
+ "curlyeqsucc" => "<mo>&#x22DF;</mo>",
207
+ "succsim" => "<mo>&#x227F;</mo>",
208
+ "succapprox" => "<mo>&#x2AB8;</mo>",
209
+ "vartriangleright" => "<mo>&#x22B3;</mo>",
210
+ "trianglerighteq" => "<mo>&#x22B5;</mo>",
211
+ "Vdash" => "<mo>&#x22A9;</mo>",
212
+ "shortmid" => "<mo>&#x2223;</mo>",
213
+ "shortparallel" => "<mo>&#x2225;</mo>",
214
+ "between" => "<mo>&#x226C;</mo>",
215
+ "pitchfork" => "<mo>&#x23D4;</mo>",
216
+ "varpropto" => "<mo>&#x221D;</mo>",
217
+ "blacktriangleleft" => "<mo>&#x25C0;</mo>",
218
+ "therefore" => "<mo>&#x2234;</mo>",
219
+ "backepsilon" => "<mo>&#x220B;</mo>",
220
+ "blacktriangleright" => "<mo>&#x25B6;</mo>",
221
+ "because" => "<mo>&#x2235;</mo>",
222
+ "nless" => "<mo>&#x226E;</mo>",
223
+ "nleq" => "<mo>&#x2270;</mo>",
224
+ "lneq" => "<mo>&#x2A87;</mo>",
225
+ "lneqq" => "<mo>&#x2268;</mo>",
226
+ "lnsim" => "<mo>&#x22E6;</mo>",
227
+ "lnapprox" => "<mo>&#x2A89;</mo>",
228
+ "precnsim" => "<mo>&#x22E8;</mo>",
229
+ "precnapprox" => "<mo>&#x2AB9;</mo>",
230
+ "nsim" => "<mo>&#x2241;</mo>",
231
+ "nmid" => "<mo>&#x2224;</mo>",
232
+ "nvdash" => "<mo>&#x22AC;</mo>",
233
+ "nvDash" => "<mo>&#x22AD;</mo>",
234
+ "ntriangleleft" => "<mo>&#x22EA;</mo>",
235
+ "ntrianglelefteq" => "<mo>&#x22EC;</mo>",
236
+ "nsubseteq" => "<mo>&#x2288;</mo>",
237
+ "subsetneq" => "<mo>&#x228A;</mo>",
238
+ "subsetneqq" => "<mo>&#x2ACB;</mo>",
239
+ "ntrianglelefteq" => "<mo>&#x22EC;</mo>",
240
+ "ngtr" => "<mo>&#x226F;</mo>",
241
+ "ngeq" => "<mo>&#x2271;</mo>",
242
+ "gneq" => "<mo>&#x2A88;</mo>",
243
+ "gneqq" => "<mo>&#x2269;</mo>",
244
+ "gnsim" => "<mo>&#x22E7;</mo>",
245
+ "gnapprox" => "<mo>&#x2A8A;</mo>",
246
+ "succnsim" => "<mo>&#x22E9;</mo>",
247
+ "succnapprox" => "<mo>&#x2ABA;</mo>",
248
+ "ncong" => "<mo>&#x2247;</mo>",
249
+ "nshortparallel" => "<mo>&#x2226;</mo>",
250
+ "nparallel" => "<mo>&#x2226;</mo>",
251
+ "nVDash" => "<mo>&#x22AF;</mo>",
252
+ "ntriangleright" => "<mo>&#x22EB;</mo>",
253
+ "ntrianglerighteq" => "<mo>&#x22ED;</mo>",
254
+ "nsupseteq" => "<mo>&#x2289;</mo>",
255
+ "nsupseteq" => "<mo>&#x2289;</mo>",
256
+ "supsetneq" => "<mo>&#x228B;</mo>",
257
+ "supsetneqq" => "<mo>&#x2ACC;</mo>",
258
+ "hbar" => "<mo>&#x0127;</mo>",
259
+ "hslash" => "<mo>&#x210F;</mo>",
260
+ "vartriangle" => "<mo>&#x25B3;</mo>",
261
+ "triangledown" => "<mo>&#x25BD;</mo>",
262
+ "square" => "<mo>&#x25A1;</mo>",
263
+ "lozenge" => "<mo>&#x25CA;</mo>",
264
+ "circledS" => "<mo>&#x24C8;</mo>",
265
+ "measuredangle" => "<mo>&#x2221;</mo>",
266
+ "nexists" => "<mo>&#x2204;</mo>",
267
+ "mho" => "<mo>&#x2127;</mo>",
268
+ "Finv" => "<mo>&#x2132;</mo>",
269
+ "backprime" => "<mo>&#x2035;</mo>",
270
+ "varnothing" => "<mo>&#x00D8;</mo>",
271
+ "blacktriangle" => "<mo>&#x25B2;</mo>",
272
+ "blacktriangledown" => "<mo>&#x25BC;</mo>",
273
+ "blacksquare" => "<mo>&#x25A0;</mo>",
274
+ "blacklozenge" => "<mo>&#x25CA;</mo>",
275
+ "bigstar" => "<mo>&#x2605;</mo>",
276
+ "sphericalangle" => "<mo>&#x2222;</mo>",
277
+ "complement" => "<mo>&#x2201;</mo>",
278
+ "eth" => "<mo>&#x00F0;</mo>",
279
+ "qed" => "<mo>&#x25A1;</mo>",
280
+ "i" => "<mo>&#x0131;</mo>",
281
+ "j" => "<mo>&#x006A;</mo>",
282
+ "alpha" => "<mi>&#x03B1;</mi>",
283
+ "beta" => "<mi>&#x03B2;</mi>",
284
+ "gamma" => "<mi>&#x03B3;</mi>",
285
+ "delta" => "<mi>&#x03B4;</mi>",
286
+ "epsilon" => "<mi>&#x03B5;</mi>",
287
+ "varepsilon" => "<mi>&#x03B5;</mi>",
288
+ "zeta" => "<mi>&#x03B6;</mi>",
289
+ "eta" => "<mi>&#x03B7;</mi>",
290
+ "theta" => "<mi>&#x03B8;</mi>",
291
+ "vartheta" => "<mi>&#x03D1;</mi>",
292
+ "iota" => "<mi>&#x03B9;</mi>",
293
+ "kappa" => "<mi>&#x03BA;</mi>",
294
+ "lambda" => "<mi>&#x03BB;</mi>",
295
+ "mu" => "<mi>&#x03BC;</mi>",
296
+ "nu" => "<mi>&#x03BD;</mi>",
297
+ "xi" => "<mi>&#x03BE;</mi>",
298
+ "pi" => "<mi>&#x03C0;</mi>",
299
+ "varpi" => "<mi>&#x03D6;</mi>",
300
+ "rho" => "<mi>&#x03C1;</mi>",
301
+ "varrho" => "<mi>&#x03F1;</mi>",
302
+ "varsigma" => "<mi>&#x03C2;</mi>",
303
+ "sigma" => "<mi>&#x03C3;</mi>",
304
+ "tau" => "<mi>&#x03C4;</mi>",
305
+ "upsilon" => "<mi>&#x03C5;</mi>",
306
+ "phi" => "<mi>&#x03C6;</mi>",
307
+ "varphi" => "<mi>&#x03D5;</mi>",
308
+ "chi" => "<mi>&#x03C7;</mi>",
309
+ "psi" => "<mi>&#x03C8;</mi>",
310
+ "omega" => "<mi>&#x03C9;</mi>",
311
+ "Gamma" => "<mi>&#x0393;</mi>",
312
+ "Delta" => "<mi>&#x0394;</mi>",
313
+ "Theta" => "<mi>&#x0398;</mi>",
314
+ "Lambda" => "<mi>&#x039B;</mi>",
315
+ "Xi" => "<mi>&#x039E;</mi>",
316
+ "Pi" => "<mi>&#x03A0;</mi>",
317
+ "Sigma" => "<mi>&#x03A3;</mi>",
318
+ "Upsilon" => "<mi>&#x03A5;</mi>",
319
+ "Phi" => "<mi>&#x03A6;</mi>",
320
+ "Psi" => "<mi>&#x03A8;</mi>",
321
+ "Omega" => "<mi>&#x03A9;</mi>",
322
+ "varGamma" => "<mi>&#x0393;</mi>",
323
+ "varDelta" => "<mi>&#x0394;</mi>",
324
+ "varTheta" => "<mi>&#x0398;</mi>",
325
+ "varLambda" => "<mi>&#x039B;</mi>",
326
+ "varXi" => "<mi>&#x039E;</mi>",
327
+ "varPi" => "<mi>&#x03A0;</mi>",
328
+ "varSigma" => "<mi>&#x03A3;</mi>",
329
+ "varUpsilon" => "<mi>&#x03A5;</mi>",
330
+ "varPhi" => "<mi>&#x03A6;</mi>",
331
+ "varPsi" => "<mi>&#x03A8;</mi>",
332
+ "varOmega" => "<mi>&#x03A9;</mi>",
333
+ "colon" => "<mo>:</mo>",
334
+ "*" => "<mo>*</mo>",
335
+ "#" => "<mo>#</mo>",
336
+ "$" => "<mo>$</mo>",
337
+ "%" => "<mo>%</mo>",
338
+ "&" => "<mo>&amp;</mo>",
339
+ "_" => "<mo>_</mo>",
340
+ "!" => "<mo>!</mo>",
341
+ "aleph" => "<mo>&#x2135;</mo>",
342
+ "imath" => "<mo>&#x2373;</mo>",
343
+ "jmath" => "<mo>&#x006A;</mo>",
344
+ "ell" => "<mo>&#x2113;</mo>",
345
+ "wp" => "<mo>&#x2118;</mo>",
346
+ "Re" => "<mo>&#x211C;</mo>",
347
+ "Im" => "<mo>&#x2111;</mo>",
348
+ "prime" => "<mo>&#x2032;</mo>",
349
+ "emptyset" => "<mo>&#x2205;</mo>",
350
+ "nabla" => "<mo>&#x2207;</mo>",
351
+ "surd" => "<mo>&#x221A;</mo>",
352
+ "partial" => "<mo>&#x2202;</mo>",
353
+ "top" => "<mo>&#x03A4;</mo>",
354
+ "bot" => "<mo>&#x03A5;</mo>",
355
+ "vdash" => "<mo>&#x22A2;</mo>",
356
+ "dashv" => "<mo>&#x22A3;</mo>",
357
+ "forall" => "<mo>&#x2200;</mo>",
358
+ "exists" => "<mo>&#x2203;</mo>",
359
+ "neg" => "<mo>&#x00AC;</mo>",
360
+ "flat" => "<mo>&#x266D;</mo>",
361
+ "natural" => "<mo>&#x266E;</mo>",
362
+ "sharp" => "<mo>&#x266F;</mo>",
363
+ "angle" => "<mo>&#x2220;</mo>",
364
+ "Box" => "<mo>&#x25AB;</mo>",
365
+ "Diamond" => "<mo>&#x25CA;</mo>",
366
+ "triangle" => "<mo>&#x25B3;</mo>",
367
+ "clubsuit" => "<mo>&#x2663;</mo>",
368
+ "diamondsuit" => "<mo>&#x2666;</mo>",
369
+ "heartsuit" => "<mo>&#x2665;</mo>",
370
+ "spadesuit" => "<mo>&#x2660;</mo>",
371
+ "Join" => "<mo>&#x22C8;</mo>",
372
+ "infty" => "<mo>&#x221E;</mo>",
373
+ "lnot" => "<mo>&#x2310;</mo>",
374
+ "bull" => "<mo>&#x25AA;</mo>",
375
+ "cents" => "<mo>&#x00A2;</mo>",
376
+ "sum" => "<mo>&#x02211;</mo>",
377
+ "prod" => "<mo>&#x220F;</mo>",
378
+ "coprod" => "<mo>&#x2210;</mo>",
379
+ "int" => "<mo>&#x222B;</mo>",
380
+ "iint" => "<mo>&#x222C;</mo>",
381
+ "iiint" => "<mo>&#x222D;</mo>",
382
+ "iiiint" => "<mo>&#x2A0C;</mo>",
383
+ "idotsint" => "<mo>&#x222B;</mo>",
384
+ "oint" => "<mo>&#x222E;</mo>",
385
+ "bigcap" => "<mo>&#x2229;</mo>",
386
+ "bigcup" => "<mo>&#x222A;</mo>",
387
+ "bigsqcup" => "<mo>&#x2294;</mo>",
388
+ "bigvee" => "<mo>&#x22C1;</mo>",
389
+ "bigwedge" => "<mo>&#x22C0;</mo>",
390
+ "bigodot" => "<mo>&#x2299;</mo>",
391
+ "bigotimes" => "<mo>&#x2297;</mo>",
392
+ "bigoplus" => "<mo>&#x2295;</mo>",
393
+ "biguplus" => "<mo>&#x228E;</mo>",
394
+ "oe" => "<mo>&#x0153;</mo>",
395
+ "OE" => "<mo>&#x0152;</mo>",
396
+ "ae" => "<mo>&#x00E6;</mo>",
397
+ "AE" => "<mo>&#x00C6;</mo>",
398
+ "aa" => "<mo>&#x00E5;</mo>",
399
+ "AA" => "<mo>&#x00C5;</mo>",
400
+ "o" => "<mo>&#x00F8;</mo>",
401
+ "O" => "<mo>&#x00D8;</mo>",
402
+ "l" => "<mo>&#x0142;</mo>",
403
+ "L" => "<mo>&#x0141;</mo>",
404
+ "SS" => "<mo>&#x00DF;</mo>",
405
+ "S" => "<mo>&#x00A7;</mo>",
406
+ "copyright" => "<mo>&#x00A9;</mo>",
407
+ "P" => "<mo>&#x00B6;</mo>",
408
+ "pounds" => "<mo>&#x00A3;</mo>",
409
+ "+" => "<mo>+</mo>",
410
+ "-" => "<mo>-</mo>",
411
+ "pm" => "<mo>&#x00B1;</mo>",
412
+ "mp" => "<mo>&#x00B1;</mo>",
413
+ "times" => "<mo>&#x00D7;</mo>",
414
+ "div" => "<mo>&#x00F7;</mo>",
415
+ "cdot" => "<mo>&#x22C5;</mo>",
416
+ "ast" => "<mo>*</mo>",
417
+ "star" => "<mo>&#x22C6;</mo>",
418
+ "dagger" => "<mo>&#x2020;</mo>",
419
+ "dag" => "<mo>&#x2020;</mo>",
420
+ "ddagger" => "<mo>&#x2021;</mo>",
421
+ "ddag" => "<mo>&#x2021;</mo>",
422
+ "amalg" => "<mo>&#x2210;</mo>",
423
+ "cap" => "<mo>&#x2229;</mo>",
424
+ "cup" => "<mo>&#x222A;</mo>",
425
+ "uplus" => "<mo>&#x228E;</mo>",
426
+ "sqcap" => "<mo>&#x2293;</mo>",
427
+ "sqcup" => "<mo>&#x2294;</mo>",
428
+ "vee" => "<mo>&#x2228;</mo>",
429
+ "wedge" => "<mo>&#x2227;</mo>",
430
+ "oplus" => "<mo>&#x2295;</mo>",
431
+ "ominus" => "<mo>&#x2296;</mo>",
432
+ "otimes" => "<mo>&#x2297;</mo>",
433
+ "oslash" => "<mo>&#x2298;</mo>",
434
+ "odot" => "<mo>&#x2299;</mo>",
435
+ "circ" => "<mo>&#x2218;</mo>",
436
+ "bullet" => "<mo>&#x2219;</mo>",
437
+ "diamond" => "<mo>&#x22C4;</mo>",
438
+ "lhd" => "<mo>&#x22B2;</mo>",
439
+ "rhd" => "<mo>&#x22B3;</mo>",
440
+ "unlhd" => "<mo>&#x22B4;</mo>",
441
+ "unrhd" => "<mo>&#x22B5;</mo>",
442
+ "bigcirc" => "<mo>&#x25EF;</mo>",
443
+ "bigtriangleup" => "<mo>&#x25B3;</mo>",
444
+ "bigtriangledown" => "<mo>&#x25BD;</mo>",
445
+ "triangleleft" => "<mo>&#x25C5;</mo>",
446
+ "triangleright" => "<mo>&#x25BB;</mo>",
447
+ "setminus" => "<mo>&#x2216;</mo>",
448
+ "wr" => "<mo>&#x2240;</mo>",
449
+ "lor" => "<mo>&#x2228;</mo>",
450
+ "land" => "<mo>&#x2227;</mo>",
451
+ "cdots" => "<mo>&#x22EF;</mo>",
452
+ "ddots" => "<mo>&#x22F1;</mo>",
453
+ "vdots" => "<mo>&#x22EE;</mo>",
454
+ "ldots" => "<mo>&#x2026;</mo>",
455
+ "dots" => "<mo>&#x22EF;</mo>",
456
+ "dotsb" => "<mo>&#x22EF;</mo>",
457
+ "dotsc" => "<mo>&#x2026;</mo>",
458
+ "dotsi" => "<mo>&#x22EF;</mo>",
459
+ "dotsm" => "<mo>&#x22EF;</mo>",
460
+ "dotso" => "<mo>&#x22EF;</mo>",
461
+ "=" => "<mo>=</mo>",
462
+ "leq" => "<mo>&#x2264;</mo>",
463
+ "le" => "<mo>&#x2264;</mo>",
464
+ "ll" => "<mo>&#x226A;</mo>",
465
+ "geq" => "<mo>&#x2265;</mo>",
466
+ "ge" => "<mo>&#x2265;</mo>",
467
+ "gg" => "<mo>&#x226B;</mo>",
468
+ "ne" => "<mo>&#x2260;</mo>",
469
+ "neq" => "<mo>&#x2260;</mo>",
470
+ "doteq" => "<mo>&#x2250;</mo>",
471
+ "subset" => "<mo>&#x2282;</mo>",
472
+ "subseteq" => "<mo>&#x2286;</mo>",
473
+ "sqsubseteq" => "<mo>&#x2291;</mo>",
474
+ "supset" => "<mo>&#x2283;</mo>",
475
+ "supseteq" => "<mo>&#x2287;</mo>",
476
+ "sqsupseteq" => "<mo>&#x2292;</mo>",
477
+ "in" => "<mo>&#x2208;</mo>",
478
+ "ni" => "<mo>&#x220B;</mo>",
479
+ "models" => "<mo>&#x22A7;</mo>",
480
+ "perp" => "<mo>&#x22A5;</mo>",
481
+ "approx" => "<mo>&#x2248;</mo>",
482
+ "cong" => "<mo>&#x2245;</mo>",
483
+ "equiv" => "<mo>&#x224D;</mo>",
484
+ "propto" => "<mo>&#x221D;</mo>",
485
+ "prec" => "<mo>&#x227A;</mo>",
486
+ "preceq" => "<mo>&#x227C;</mo>",
487
+ "parallel" => "<mo>&#x2225;</mo>",
488
+ "sim" => "<mo>&#x223C;</mo>",
489
+ "simeq" => "<mo>&#x2243;</mo>",
490
+ "asymp" => "<mo>&#x224D;</mo>",
491
+ "smile" => "<mo>&#x2323;</mo>",
492
+ "frown" => "<mo>&#x2322;</mo>",
493
+ "bowtie" => "<mo>&#x22C8;</mo>",
494
+ "succ" => "<mo>&#x227B;</mo>",
495
+ "succeq" => "<mo>&#x227D;</mo>",
496
+ "mid" => "<mo>&#x2223;</mo>",
497
+ "owns" => "<mo>&#x220B;</mo>",
498
+ "notin" => "<mo>&#x2209;</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>&#x2009;</mo>",
534
+ "thinspace" => "<mo>&#x2009;</mo>",
535
+ "implies" => "<mo>&#x21D2;</mo>",
536
+ "injlim" => "<mo>inj lim</mo>",
537
+ "projlim" => "<mo>proj lim</mo>",
538
+ "nobreakdash" => "<mo>&#x2011;</mo>",
539
+ "lvert" => "<mo form='prefix'>|</mo>",
540
+ "rvert" => "<mo form='postfix'>|</mo>",
541
+ "lVert" => "<mo form='prefix'>&#x2016;</mo>",
542
+ "rVert" => "<mo form='postfix'>&#x2016;</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>&sdot; &sdot; &sdot;</mo>"
653
+ NOTATION["pmod"] = "&nbsp; 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