1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
use super::attribute::{Variant, Accent};

#[derive(Debug, Clone, PartialEq)]
pub enum Token {
    Illegal(char),
    EOF,
    Begin,
    End,
    Ampersand,
    NewLine,
    Left,
    Right,
    Paren(&'static str),
    LBrace,
    RBrace,
    Frac,
    Underscore,
    Circumflex,
    Overset,
    Underset,
    Overbrace(char),
    Underbrace(char),
    Sqrt,
    Integral(char),
    Lim(&'static str),
    Space(f32),
    Style(Variant),
    Over(char, Accent),
    Under(char, Accent),
    Operator(char),
    BigOp(char),
    Letter(char, Variant),
    Number(String),
    Function(&'static str),
    Slashed,
    Text,
    Command(String),
}

impl Token {
    pub fn from_command(command: &str) -> Token {
        match command {
            "mathrm"  => Token::Style(Variant::Normal),
            "textit"  => Token::Style(Variant::Italic),
            "mathit"  => Token::Style(Variant::Italic),
            "textbf"  => Token::Style(Variant::Bold),
            "mathbf"  => Token::Style(Variant::Bold),
            "bm"      => Token::Style(Variant::BoldItalic),
            "symbf"   => Token::Style(Variant::BoldItalic),
            "mathbb"  => Token::Style(Variant::DoubleStruck),
            "mathfrak" => Token::Style(Variant::Fraktur),
            "mathscr" => Token::Style(Variant::Script),
            "mathsf"  => Token::Style(Variant::SansSerif),
            "texttt"  => Token::Style(Variant::Monospace),
            "boldsymbol" => Token::Style(Variant::BoldItalic),
            "text"   => Token::Text,
            "sqrt"   => Token::Sqrt,
            "frac"   => Token::Frac,
            "left"   => Token::Left,
            "right"  => Token::Right,
            "begin"  => Token::Begin,
            "end"    => Token::End,
            "\\"     => Token::NewLine,
            "overset"  => Token::Overset,
            "underset" => Token::Underset,
            "overbrace"  => Token::Overbrace('\u{23de}'),
            "underbrace" => Token::Underbrace('\u{23df}'),
            "overparen"  => Token::Overbrace('\u{23dc}'),
            "underparen" => Token::Underbrace('\u{23dd}'),
            "overbracket"  => Token::Overbrace('\u{23b4}'),
            "underbracket" => Token::Underbrace('\u{23b5}'),
            "!"     => Token::Space(-3./18.),
            ","     => Token::Space(3./18.),
            ":"     => Token::Space(4./18.),
            ";"     => Token::Space(5./18.),
            " "     => Token::Space(1.),
            "quad"  => Token::Space(1.),
            "qquad" => Token::Space(2.),
            "langle" => Token::Paren("⟨"),
            "rangle" => Token::Paren("⟩"),
            "{"      => Token::Paren("{"),
            "}"      => Token::Paren("}"),
            "lceil"  => Token::Paren("⌈"),
            "rceil"  => Token::Paren("⌉"),
            "lfloor" => Token::Paren("⌊"),
            "rfloor" => Token::Paren("⌋"),
            "lgroup" => Token::Paren("⦗"),
            "rgroup" => Token::Paren("⦘"),
            "llbracket" => Token::Paren("⟦"),
            "rrbracket" => Token::Paren("⟧"),
            "lim"    => Token::Lim("lim"),
            "liminf" => Token::Lim("lim inf"),
            "limsup" => Token::Lim("lim sup"),
            "min"    => Token::Lim("min"),
            "max"    => Token::Lim("max"),
            "inf"    => Token::Lim("inf"),
            "sup"    => Token::Lim("sup"),
            "int"    => Token::Integral('∫'),
            "iint"   => Token::Integral('∬'),
            "iiint"  => Token::Integral('∭'),
            "oint"   => Token::Integral('∮'),
            "dot"       => Token::Over('\u{02d9}', Accent::True),
            "ddot"      => Token::Over('¨', Accent::True),
            "bar"       => Token::Over('¯', Accent::True),
            "hat"       => Token::Over('^', Accent::True),
            "check"     => Token::Over('ˇ', Accent::True),
            "breve"     => Token::Over('˘', Accent::True),
            "acute"     => Token::Over('´', Accent::True),
            "grave"     => Token::Over('`', Accent::True),
            "tilde"     => Token::Over('~', Accent::True),
            "vec"       => Token::Over('→', Accent::True),
            "overline"  => Token::Over('_', Accent::True),
            "underline" => Token::Under('_', Accent::True),
            "widehat"        => Token::Over('^', Accent::True),
            "widetilde"      => Token::Over('~', Accent::True),
            "overrightarrow" => Token::Over('→', Accent::True),
            "overleftarrow"  => Token::Over('←', Accent::True),
            "sum"       => Token::BigOp('∑'),
            "prod"      => Token::BigOp('∏'),
            "coprod"    => Token::BigOp('∐'),
            "bigcap"    => Token::BigOp('⋂'),
            "bigcup"    => Token::BigOp('⋃'),
            "bigsqcup"  => Token::BigOp('⨆'),
            "bigvee"    => Token::BigOp('⋁'),
            "bigwedge"  => Token::BigOp('⋀'),
            "bigodot"   => Token::BigOp('⨀'),
            "bitotimes" => Token::BigOp('⨂'),
            "bigoplus"  => Token::BigOp('⨁'),
            "biguplus"  => Token::BigOp('⨄'),
            "sin"    => Token::Function("sin"),
            "cos"    => Token::Function("cos"),
            "tan"    => Token::Function("tan"),
            "csc"    => Token::Function("csc"),
            "sec"    => Token::Function("sec"),
            "cot"    => Token::Function("cot"),
            "arcsin" => Token::Function("arcsin"),
            "arccos" => Token::Function("arccos"),
            "arctan" => Token::Function("arctan"),
            "sinh"   => Token::Function("sinh"),
            "cosh"   => Token::Function("cosh"),
            "tanh"   => Token::Function("tanh"),
            "coth"   => Token::Function("coth"),
            "exp"    => Token::Function("exp"),
            "ln"     => Token::Function("ln"),
            "log"    => Token::Function("log"),
            "erf"    => Token::Function("erf"),
            "erfc"   => Token::Function("erfc"),
            "arg"    => Token::Function("arg"),
            "ker"    => Token::Function("ker"),
            "dim"    => Token::Function("dim"),
            "det"    => Token::Function("det"),
            "wp"     => Token::Function("℘"),
            "Alpha"      => Token::Letter('Α', Variant::Normal),
            "alpha"      => Token::Letter('α', Variant::Italic),
            "Beta"       => Token::Letter('Β', Variant::Normal),
            "beta"       => Token::Letter('β', Variant::Italic),
            "Gamma"      => Token::Letter('Γ', Variant::Normal),
            "gamma"      => Token::Letter('γ', Variant::Italic),
            "digamma"    => Token::Letter('ϝ', Variant::Italic),
            "Delta"      => Token::Letter('Δ', Variant::Normal),
            "delta"      => Token::Letter('δ', Variant::Italic),
            "Epsilon"    => Token::Letter('Ε', Variant::Normal),
            "epsilon"    => Token::Letter('ϵ', Variant::Italic),
            "varepsilon" => Token::Letter('ε', Variant::Italic),
            "Zeta"       => Token::Letter('Ζ', Variant::Normal),
            "zeta"       => Token::Letter('ζ', Variant::Italic),
            "Eta"        => Token::Letter('Η', Variant::Normal),
            "eta"        => Token::Letter('η', Variant::Italic),
            "Theta"      => Token::Letter('Θ', Variant::Normal),
            "theta"      => Token::Letter('θ', Variant::Italic),
            "vartheta"   => Token::Letter('ϑ', Variant::Italic),
            "Iota"       => Token::Letter('Ι', Variant::Normal),
            "iota"       => Token::Letter('ι', Variant::Italic),
            "Kappa"      => Token::Letter('Κ', Variant::Normal),
            "kappa"      => Token::Letter('κ', Variant::Italic),
            "Lambda"     => Token::Letter('Λ', Variant::Normal),
            "lambda"     => Token::Letter('λ', Variant::Italic),
            "Mu"         => Token::Letter('Μ', Variant::Normal),
            "mu"         => Token::Letter('μ', Variant::Italic),
            "Nu"         => Token::Letter('Ν', Variant::Normal),
            "nu"         => Token::Letter('ν', Variant::Italic),
            "Xi"         => Token::Letter('Ξ', Variant::Normal),
            "xi"         => Token::Letter('ξ', Variant::Italic),
            "Omicron"    => Token::Letter('Ο', Variant::Normal),
            "omicron"    => Token::Letter('ο', Variant::Italic),
            "Pi"         => Token::Letter('Π', Variant::Normal),
            "pi"         => Token::Letter('π', Variant::Italic),
            "varpi"      => Token::Letter('ϖ', Variant::Italic),
            "Rho"        => Token::Letter('Ρ', Variant::Normal),
            "rho"        => Token::Letter('ρ', Variant::Italic),
            "varrho"     => Token::Letter('ϱ', Variant::Italic),
            "Sigma"      => Token::Letter('Σ', Variant::Normal),
            "sigma"      => Token::Letter('σ', Variant::Italic),
            "varsigma"   => Token::Letter('ς', Variant::Italic),
            "Tau"        => Token::Letter('Τ', Variant::Normal),
            "tau"        => Token::Letter('τ', Variant::Italic),
            "Upsilon"    => Token::Letter('Υ', Variant::Normal),
            "upsilon"    => Token::Letter('υ', Variant::Italic),
            "Phi"        => Token::Letter('Φ', Variant::Normal),
            "phi"        => Token::Letter('ϕ', Variant::Italic),
            "varphi"     => Token::Letter('φ', Variant::Italic),
            "Chi"        => Token::Letter('Χ', Variant::Normal),
            "chi"        => Token::Letter('χ', Variant::Italic),
            "Psi"        => Token::Letter('Ψ', Variant::Normal),
            "psi"        => Token::Letter('ψ', Variant::Italic),
            "Omega"      => Token::Letter('Ω', Variant::Normal),
            "omega"      => Token::Letter('ω', Variant::Italic),
            "aleph"      => Token::Letter('ℵ', Variant::Normal),
            "beth"       => Token::Letter('ℶ', Variant::Normal),
            "gimel"      => Token::Letter('ℷ', Variant::Normal),
            "daleth"     => Token::Letter('ℸ', Variant::Normal),
            "A"          => Token::Letter('Å', Variant::Normal),
            "a"          => Token::Letter('å', Variant::Normal),
            "AE"         => Token::Letter('Æ', Variant::Normal),
            "ae"         => Token::Letter('æ', Variant::Normal),
            "DH"         => Token::Letter('Ð', Variant::Normal),
            "dh"         => Token::Letter('ð', Variant::Normal),
            "dj"         => Token::Letter('đ', Variant::Normal),
            "L"          => Token::Letter('Ł', Variant::Normal),
            "l"          => Token::Letter('ł', Variant::Normal),
            "NG"         => Token::Letter('Ŋ', Variant::Normal),
            "ng"         => Token::Letter('ŋ', Variant::Normal),
            "O"          => Token::Letter('Ø', Variant::Normal),
            "o"          => Token::Letter('ø', Variant::Normal),
            "OE"         => Token::Letter('Œ', Variant::Normal),
            "oe"         => Token::Letter('œ', Variant::Normal),
            "ss"         => Token::Letter('ß', Variant::Normal),
            "TH"         => Token::Letter('Þ', Variant::Normal),
            "th"         => Token::Letter('þ', Variant::Normal),
            "imath"      => Token::Letter('ı', Variant::Italic),
            "jmath"      => Token::Letter('ȷ', Variant::Italic),
            "ell"        => Token::Letter('ℓ', Variant::Italic),
            "hbar"       => Token::Letter('ℏ', Variant::Italic),
            "hslash"     => Token::Letter('ℏ', Variant::Italic),
            "infty"      => Token::Letter('∞', Variant::Normal),
            "mho"        => Token::Letter('℧', Variant::Normal),
            "Finv"       => Token::Letter('Ⅎ', Variant::Normal),
            "Re"         => Token::Letter('ℜ', Variant::Normal),
            "Im"         => Token::Letter('ℑ', Variant::Normal),
            "complement" => Token::Letter('∁', Variant::Normal),
            "emptyset"   => Token::Letter('∅', Variant::Normal),
            "therefore"  => Token::Letter('∴', Variant::Normal),
            "because"    => Token::Letter('∵', Variant::Normal),
            "Diamond"    => Token::Letter('◊', Variant::Normal),
            "Box"        => Token::Letter('◻', Variant::Normal),
            "triangle"   => Token::Letter('△', Variant::Normal),
            "angle"      => Token::Letter('∠', Variant::Normal),
            "dagger"     => Token::Letter('†', Variant::Normal),
            "dag"        => Token::Letter('†', Variant::Normal),
            "Dagger"     => Token::Letter('‡', Variant::Normal),
            "ddag"       => Token::Letter('‡', Variant::Normal),
            "And"        => Token::Letter('&', Variant::Normal),
            "eth"        => Token::Letter('ð', Variant::Normal),
            "S"          => Token::Letter('§', Variant::Normal),
            "P"          => Token::Letter('¶', Variant::Normal),
            "%"          => Token::Letter('%', Variant::Normal),
            "_"          => Token::Letter('_', Variant::Normal),
            "&"          => Token::Letter('&', Variant::Normal),
            "#"          => Token::Letter('#', Variant::Normal),
            "$"          => Token::Letter('$', Variant::Normal),
            "copyright"  => Token::Letter('©', Variant::Normal),
            "checkmark"  => Token::Letter('✓', Variant::Normal),
            "circledR"   => Token::Letter('Ⓡ', Variant::Normal),
            "maltese"    => Token::Letter('✠', Variant::Normal),
            "colon"      => Token::Letter(':', Variant::Normal),
            "bigtriangleup"  => Token::Letter('△', Variant::Normal),
            "sphericalangle" => Token::Letter('∢', Variant::Normal),
            "square"     => Token::Letter('□', Variant::Normal),
            "lozenge"    => Token::Letter('◊', Variant::Normal),
            "diamondsuit" => Token::Letter('♢', Variant::Normal),
            "heartsuit"   => Token::Letter('♡', Variant::Normal),
            "clubsuit"    => Token::Letter('♣', Variant::Normal),
            "spadesuit"   => Token::Letter('♠', Variant::Normal),
            "Game"        => Token::Letter('⅁', Variant::Normal),
            "flat"        => Token::Letter('♭', Variant::Normal),
            "natural"     => Token::Letter('♮', Variant::Normal),
            "sharp"       => Token::Letter('♯', Variant::Normal),
            "pounds"     => Token::Letter('£', Variant::Normal),
            "textyen"    => Token::Letter('¥', Variant::Normal),
            "euro"       => Token::Letter('€', Variant::Normal),
            "rupee"      => Token::Letter('₹', Variant::Normal),
            "sun"        => Token::Letter('☼', Variant::Normal),
            "mercury"    => Token::Letter('☿', Variant::Normal),
            "venus"      => Token::Letter('♀', Variant::Normal),
            "earth"      => Token::Letter('♁', Variant::Normal),
            "mars"       => Token::Letter('♂', Variant::Normal),
            "jupiter"    => Token::Letter('♃', Variant::Normal),
            "saturn"     => Token::Letter('♄', Variant::Normal),
            "uranus"     => Token::Letter('♅', Variant::Normal),
            "neptune"    => Token::Letter('♆', Variant::Normal),
            "astrosun"   => Token::Letter('☉', Variant::Normal),
            "ascnode"    => Token::Letter('☊', Variant::Normal),
            "times"  => Token::Operator('×'),
            "oplus"  => Token::Operator('⊕'),
            "ominus" => Token::Operator('⊖'),
            "otimes" => Token::Operator('⊗'),
            "oslash"  => Token::Operator('⊘'),
            "odot"    => Token::Operator('⊙'),
            "bigcirc" => Token::Operator('◯'),
            "amalg"  => Token::Operator('⨿'),
            "pm"     => Token::Operator('±'),
            "mp"     => Token::Operator('∓'),
            "cdot"   => Token::Operator('·'),
            "cdots"  => Token::Operator('⋯'),
            "vdots"  => Token::Operator('⋮'),
            "ldots"  => Token::Operator('…'),
            "ddots"  => Token::Operator('⋱'),
            "circ"   => Token::Operator('∘'),
            "bullet" => Token::Operator('∙'),
            "star"   => Token::Operator('⋆'),
            "div"    => Token::Operator('÷'),
            "lnot"   => Token::Operator('¬'),
            "land"   => Token::Operator('∧'),
            "lor"    => Token::Operator('∨'),
            "sim"    => Token::Operator('∼'),
            "simeq"  => Token::Operator('≃'),
            "cong"   => Token::Operator('≅'),
            "approx" => Token::Operator('≈'),
            "ne"     => Token::Operator('≠'),
            "neq"    => Token::Operator('≠'),
            "equiv"  => Token::Operator('≡'),
            "nequiv" => Token::Operator('≢'),
            "prec"   => Token::Operator('≺'),
            "succ"   => Token::Operator('≻'),
            "preceq" => Token::Operator('⪯'),
            "succeq" => Token::Operator('⪰'),
            "dashv"  => Token::Operator('⊣'),
            "asymp"  => Token::Operator('≍'),
            "doteq"  => Token::Operator('≐'),
            "propto" => Token::Operator('∝'),
            "barwedge" => Token::Operator('⊼'),
            "ltimes" => Token::Operator('⋉'),
            "rtimes" => Token::Operator('⋊'),
            "Join"   => Token::Operator('⋈'),
            "lhd"    => Token::Operator('⊲'),
            "rhd"    => Token::Operator('⊳'),
            "unlhd"  => Token::Operator('⊴'),
            "unrhd"  => Token::Operator('⊵'),
            "vee"    => Token::Operator('∨'),
            "uplus"  => Token::Operator('⊎'),
            "wedge"  => Token::Operator('∧'),
            "boxdot"      => Token::Operator('⊡'),
            "boxplus"     => Token::Operator('⊞'),
            "boxminus"    => Token::Operator('⊟'),
            "boxtimes"    => Token::Operator('⊠'),
            "boxbox"      => Token::Operator('⧈'),
            "boxslash"    => Token::Operator('⧄'),
            "boxbslash"   => Token::Operator('⧅'),
            "Cap"         => Token::Operator('⋒'),
            "Cup"         => Token::Operator('⋓'),
            "centerdot"   => Token::Operator('∙'),
            "circledast"  => Token::Operator('⊛'),
            "circledcirc" => Token::Operator('⊚'),
            "circleddash" => Token::Operator('⊝'),
            "curlyvee"    => Token::Operator('⋎'),
            "curlywedge"  => Token::Operator('⋏'),
            "dotplus"     => Token::Operator('∔'),
            "intercal"    => Token::Operator('⊺'),
            "divideontimes"   => Token::Operator('⋇'),
            "leftthreetimes"  => Token::Operator('⋋'),
            "rightthreetimes" => Token::Operator('⋌'),
            "smallsetminus"   => Token::Operator('﹨'),
            "triangledown"    => Token::Operator('▽'),
            "triangleleft"    => Token::Operator('◁'),
            "triangleright"   => Token::Operator('▷'),
            "vartriangle"     => Token::Operator('△'),
            "veebar" => Token::Operator('⊻'),
            "cap"    => Token::Operator('∩'),
            "cup"    => Token::Operator('∪'),
            "mid"    => Token::Operator('\u{2223}'),
            "nmid"   => Token::Operator('\u{2224}'),
            "|"      => Token::Paren("\u{2225}"),
            "parallel" => Token::Operator('∥'),
            "perp"   => Token::Operator('⊥'),
            "forall" => Token::Operator('∀'),
            "exists" => Token::Operator('∃'),
            "nexists" => Token::Operator('∄'),
            "lt"          => Token::Operator('<'),
            "gt"          => Token::Operator('>'),
            "leq"         => Token::Operator('≤'),
            "geq"         => Token::Operator('≥'),
            "ll"          => Token::Operator('≪'),
            "gg"          => Token::Operator('≫'),
            "lessapprox"  => Token::Operator('⪅'),
            "lesssim"     => Token::Operator('≲'),
            "eqslantless" => Token::Operator('⪕'),
            "leqslant"    => Token::Operator('⩽'),
            "leqq"        => Token::Operator('≦'),
            "geqq"        => Token::Operator('≧'),
            "geqslant"    => Token::Operator('⩾'),
            "eqslantgtr"  => Token::Operator('⪖'),
            "gtrsim"      => Token::Operator('≳'),
            "gtrapprox"   => Token::Operator('⪆'),
            "approxeq"    => Token::Operator('≊'),
            "lessdot"     => Token::Operator('⋖'),
            "lll"         => Token::Operator('⋘'),
            "lessgtr"     => Token::Operator('≶'),
            "lesseqgtr"   => Token::Operator('⋚'),
            "lesseqqgtr"  => Token::Operator('⪋'),
            "doteqdot"    => Token::Operator('≑'),
            "risingdotseq" => Token::Operator('≓'),
            "leftarrow"          => Token::Operator('←'),
            "gets"               => Token::Operator('←'),
            "rightarrow"         => Token::Operator('→'),
            "to"                 => Token::Operator('→'),
            "nleftarrow"         => Token::Operator('↚'),
            "nrightarrow"        => Token::Operator('↛'),
            "leftrightarrow"     => Token::Operator('↔'),
            "nleftrightarrow"    => Token::Operator('↮'),
            "longleftarrow"      => Token::Operator('⟵'),
            "longrightarrow"     => Token::Operator('⟶'),
            "longleftrightarrow" => Token::Operator('⟷'),
            "Leftarrow"          => Token::Operator('⇐'),
            "Rightarrow"         => Token::Operator('⇒'),
            "nLeftarrow"         => Token::Operator('⇍'),
            "nRightarrow"        => Token::Operator('⇏'),
            "Leftrightarrow"     => Token::Operator('⇔'),
            "nLeftrightarrow"    => Token::Operator('⇎'),
            "Longleftarrow"      => Token::Operator('⟸'),
            "impliedby"          => Token::Operator('⟸'),
            "Longrightarrow"      => Token::Operator('⟹'),
            "implies"            => Token::Operator('⟹'),
            "Longleftrightarrow" => Token::Operator('⟺'),
            "iff"                => Token::Operator('⟺'),
            "uparrow"            => Token::Operator('↑'),
            "downarrow"          => Token::Operator('↓'),
            "updownarrow"        => Token::Operator('↕'),
            "Uparrow"            => Token::Operator('⇑'),
            "Downarrow"          => Token::Operator('⇓'),
            "Updownarrow"        => Token::Operator('⇕'),
            "nearrow"            => Token::Operator('↗'),
            "searrow"            => Token::Operator('↘'),
            "swarrow"            => Token::Operator('↙'),
            "nwarrow"            => Token::Operator('↖'),
            "rightharpoonup"     => Token::Operator('⇀'),
            "rightharpoondown"   => Token::Operator('⇁'),
            "leftharpoonup"      => Token::Operator('↼'),
            "leftharpoondown"    => Token::Operator('↽'),
            "upharpoonleft"      => Token::Operator('↿'),
            "upharpoonright"     => Token::Operator('↾'),
            "downharpoonleft"    => Token::Operator('⇃'),
            "downharpoonright"   => Token::Operator('⇂'),
            "rightleftharpoons"  => Token::Operator('⇌'),
            "leftrightharpoons"  => Token::Operator('⇋'),
            "curvearrowleft"     => Token::Operator('↶'),
            "circlearrowleft"    => Token::Operator('↺'),
            "Lsh"                => Token::Operator('↰'),
            "upuparrows"         => Token::Operator('⇈'),
            "rightrightarrows"   => Token::Operator('⇉'),
            "rightleftarrows"    => Token::Operator('⇄'),
            "Rrightarrow"        => Token::Operator('⇛'),
            "rightarrowtail"     => Token::Operator('↣'),
            "looparrowright"     => Token::Operator('↬'),
            "curvearrowright"    => Token::Operator('↷'),
            "circlearrowright"   => Token::Operator('↻'),
            "Rsh"                => Token::Operator('↱'),
            "downdownarrows"     => Token::Operator('⇊'),
            "leftleftarrows"     => Token::Operator('⇇'),
            "leftrightarrows"    => Token::Operator('⇆'),
            "Lleftarrow"         => Token::Operator('⇚'),
            "leftarrowtail"      => Token::Operator('↢'),
            "looparrowleft"      => Token::Operator('↫'),
            "mapsto"             => Token::Operator('↦'),
            "longmapsto"         => Token::Operator('⟼'),
            "hookrightarrow"     => Token::Operator('↪'),
            "hookleftarrow"      => Token::Operator('↩'),
            "multimap"           => Token::Operator('⊸'),
            "leftrightsquigarrow" => Token::Operator('↭'),
            "rightsquigarrow"     => Token::Operator('⇝'),
            "lightning"           => Token::Operator('↯'),
            "Yleft"               => Token::Operator('⤙'),
            "Yright"              => Token::Operator('⤚'),
            "in"     => Token::Operator('\u{2208}'),
            "ni"     => Token::Operator('\u{2209}'),
            "notin"  => Token::Operator('\u{2209}'),
            "subset" => Token::Operator('\u{2282}'),
            "supset" => Token::Operator('\u{2283}'),
            "subseteq"  => Token::Operator('\u{2286}'),
            "supseteq"  => Token::Operator('\u{2287}'),
            "nsubseteq" => Token::Operator('\u{2288}'),
            "nsupseteq" => Token::Operator('\u{2289}'),
            "subsetneq" => Token::Operator('\u{228a}'),
            "supsetneq" => Token::Operator('\u{228b}'),
            "sqsubset"  => Token::Operator('⊏'),
            "sqsubseteq" => Token::Operator('⊑'),
            "sqsupset"   => Token::Operator('⊐'),
            "sqsupseteq" => Token::Operator('⊒'),
            "sqcap"      => Token::Operator('⊓'),
            "sqcup"      => Token::Operator('⊔'),
            "setminus"   => Token::Operator('∖'),
            "partial"   => Token::Operator('∂'),
            "nabla"     => Token::Operator('∇'),
            "smile"     => Token::Operator('⌣'),
            "from"      => Token::Operator('⌢'),
            "wr"        => Token::Operator('≀'),
            "bot"       => Token::Operator('⊥'),
            "top"       => Token::Operator('⊤'),
            "vdash"     => Token::Operator('⊢'),
            "vDash"     => Token::Operator('⊨'),
            "Vdash"     => Token::Operator('⊩'),
            "models"    => Token::Operator('⊨'),
            "slashed"   => Token::Slashed,
            command  => Token::Command(command.to_owned()),
        }
    }
}