math-core 0.6.4

Convert LaTeX equations to MathML Core
Documentation
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
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
use mathml_renderer::{
    attribute::{
        FracAttr, HtmlTextSize, HtmlTextStyle, Notation, OpAttrs, Size, Style, TextTransform,
    },
    super_char::{OverlayChar, SuperChar},
    symbol::{self, MathMLOperator},
};

use crate::predefined;
use crate::specifications::LatexUnit;
use crate::token::{
    ForceStretchy, InfixDelim, MathClassKind, Mode, PhantomKind, TextToken,
    Token::{self, *},
    UnitKind,
};
use crate::{
    character_class::{MathVariant, ParenType},
    token::LimitsKind,
};

// These function names are essentially just passed-through, wrapped in a token.
static FUNCTIONS: phf::Set<&'static str> = phf::phf_set!(
    "arccos", "arcctg", "arcsin", "arctan", "arctg", "arg", "ch", "cos", "cosec", "cosh", "cot",
    "cotg", "coth", "csc", "ctg", "cth", "deg", "det", "dim", "erf", "erfc", "exp", "hom", "ker",
    "lg", "ln", "log", "sec", "sh", "sin", "sinh", "tan", "tanh", "tg", "th"
);

static COMMANDS: phf::Map<&'static str, Token> = phf::phf_map! {
    " " => MathOrTextMode(&NonBreakingSpace, symbol::NO_BREAK_SPACE),
    "#" => Letter(SuperChar::from_char(symbol::NUMBER_SIGN), Mode::MathOrText),
    "$" => Letter(SuperChar::from_char(symbol::DOLLAR_SIGN), Mode::MathOrText),
    "%" => Letter(SuperChar::from_char(symbol::PERCENT_SIGN), Mode::MathOrText),
    "&" => MathOrTextMode(&Ord(symbol::AMPERSAND), '&'),
    "'" => TextMode(TextToken::Accent(symbol::COMBINING_ACUTE_ACCENT)),
    "," => MathOrTextMode(&Space(LatexUnit::Mu.length_with_unit(3.0)), symbol::THIN_SPACE),
    "." => TextMode(TextToken::Accent(symbol::COMBINING_DOT_ABOVE)),
    ":" => MathOrTextMode(&Space(LatexUnit::Mu.length_with_unit(4.0)), symbol::MEDIUM_MATHEMATICAL_SPACE),
    ";" => MathOrTextMode(&Space(LatexUnit::Mu.length_with_unit(5.0)), symbol::THREE_PER_EM_SPACE),
    "=" => TextMode(TextToken::Accent(symbol::COMBINING_MACRON)),
    ">" => MathOrTextMode(&Space(LatexUnit::Mu.length_with_unit(4.0)), symbol::MEDIUM_MATHEMATICAL_SPACE),
    "AA" => TextMode(TextToken::Letter('Å')),
    "AE" => TextMode(TextToken::Letter('Æ')),
    "Alpha" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_ALPHA)),
    "And" => CustomCmd(0, &predefined::AND),
    "Bbb" => Transform(MathVariant::Transform(TextTransform::DoubleStruck)),
    "Bbbk" => Letter(TextTransform::DoubleStruck.transform_char('k', false), Mode::Math),
    "Beta" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_BETA)),
    "Big" => Big(Size::Scale2, None),
    "Bigg" => Big(Size::Scale4, None),
    "Biggl" => Big(Size::Scale4, Some(ParenType::Left)),
    "Biggm" => Big(Size::Scale4, Some(ParenType::Middle)),
    "Biggr" => Big(Size::Scale4, Some(ParenType::Right)),
    "Bigl" => Big(Size::Scale2, Some(ParenType::Left)),
    "Bigm" => Big(Size::Scale2, Some(ParenType::Middle)),
    "Bigr" => Big(Size::Scale2, Some(ParenType::Right)),
    "Box" => Letter(SuperChar::from_char(symbol::WHITE_MEDIUM_SQUARE), Mode::Math),
    "Bra" => CustomCmd(1, &predefined::BIG_BRA),
    "Bumpeq" => Relation(symbol::GEOMETRICALLY_EQUIVALENT_TO),
    "Cap" => BinaryOp(symbol::DOUBLE_INTERSECTION),
    "Chi" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_CHI)),
    "Colon" => Relation(symbol::PROPORTION),
    "Coloneq" => Relation(symbol::DOUBLE_COLON_EQUAL),
    "Coloneqq" => Relation(symbol::DOUBLE_COLON_EQUAL),
    "Complex" => Letter(SuperChar::from_char(symbol::DOUBLE_STRUCK_CAPITAL_C), Mode::Math),
    "Cup" => BinaryOp(symbol::DOUBLE_UNION),
    "Dagger" => ForceBinaryOp(MathMLOperator::from_char(symbol::DOUBLE_DAGGER)),
    "Darr" => Relation(symbol::DOWNWARDS_DOUBLE_ARROW),
    "Delta" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_DELTA)),
    "Diamond" => Letter(SuperChar::from_char(symbol::LOZENGE), Mode::Math),
    "Doteq" => Relation(symbol::GEOMETRICALLY_EQUAL_TO),
    "Downarrow" => Relation(symbol::DOWNWARDS_DOUBLE_ARROW),
    "Epsilon" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_EPSILON)),
    "Eta" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_ETA)),
    "Finv" => Letter(SuperChar::from_char(symbol::TURNED_CAPITAL_F), Mode::Math),
    "Game" => Letter(SuperChar::from_char(symbol::TURNED_SANS_SERIF_CAPITAL_G), Mode::Math),
    "Gamma" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_GAMMA)),
    "H" => TextMode(TextToken::Accent(symbol::COMBINING_DOUBLE_ACUTE_ACCENT)),
    "Harr" => Relation(symbol::LEFT_RIGHT_DOUBLE_ARROW),
    "Huge" => TextMode(TextToken::Size(HtmlTextSize::Size250)),
    "Im" => Letter(SuperChar::from_char(symbol::BLACK_LETTER_CAPITAL_I), Mode::Math),
    "Iota" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_IOTA)),
    "Join" => Relation(symbol::BOWTIE),
    "Kappa" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_KAPPA)),
    "Ket" => CustomCmd(1, &predefined::BIG_KET),
    "L" => TextMode(TextToken::Letter('Ł')),
    "LARGE" => TextMode(TextToken::Size(HtmlTextSize::Size170)),
    "Lambda" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_LAMBDA)),
    "Large" => TextMode(TextToken::Size(HtmlTextSize::Size140)),
    "Larr" => Relation(symbol::LEFTWARDS_DOUBLE_ARROW),
    "Leftarrow" => Relation(symbol::LEFTWARDS_DOUBLE_ARROW),
    "Leftrightarrow" => Relation(symbol::LEFT_RIGHT_DOUBLE_ARROW),
    "Lleftarrow" => Relation(symbol::LEFTWARDS_TRIPLE_ARROW),
    "Longleftarrow" => Relation(symbol::LONG_LEFTWARDS_DOUBLE_ARROW),
    "Longleftrightarrow" => Relation(symbol::LONG_LEFT_RIGHT_DOUBLE_ARROW),
    "Longrightarrow" => Relation(symbol::LONG_RIGHTWARDS_DOUBLE_ARROW),
    "Lrarr" => Relation(symbol::LEFT_RIGHT_DOUBLE_ARROW),
    "Lsh" => Relation(symbol::UPWARDS_ARROW_WITH_TIP_LEFTWARDS),
    "Mu" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_MU)),
    "N" => Letter(SuperChar::from_char(symbol::DOUBLE_STRUCK_CAPITAL_N), Mode::Math),
    "Nu" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_NU)),
    "O" => TextMode(TextToken::Letter('Ø')),
    "OE" => TextMode(TextToken::Letter('Œ')),
    "Omega" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_OMEGA)),
    "Omicron" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_OMICRON)),
    "P" => Letter(SuperChar::from_char(symbol::PILCROW_SIGN), Mode::MathOrText),
    "Phi" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_PHI)),
    "Pi" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_PI)),
    "Pr" => PseudoOperatorLimits("Pr"),
    "Psi" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_PSI)),
    "R" => Letter(SuperChar::from_char(symbol::DOUBLE_STRUCK_CAPITAL_R), Mode::Math),
    "Rarr" => Relation(symbol::RIGHTWARDS_DOUBLE_ARROW),
    "Re" => Letter(SuperChar::from_char(symbol::BLACK_LETTER_CAPITAL_R), Mode::Math),
    "Reals" => Letter(SuperChar::from_char(symbol::DOUBLE_STRUCK_CAPITAL_R), Mode::Math),
    "Rho" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_RHO)),
    "Rightarrow" => Relation(symbol::RIGHTWARDS_DOUBLE_ARROW),
    "Rrightarrow" => Relation(symbol::RIGHTWARDS_TRIPLE_ARROW),
    "Rsh" => Relation(symbol::UPWARDS_ARROW_WITH_TIP_RIGHTWARDS),
    "S" => Letter(SuperChar::from_char(symbol::SECTION_SIGN), Mode::MathOrText),
    "Sigma" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_SIGMA)),
    "Subset" => Relation(symbol::DOUBLE_SUBSET),
    "Supset" => Relation(symbol::DOUBLE_SUPERSET),
    "Tau" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_TAU)),
    "Theta" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_THETA)),
    "Uarr" => Relation(symbol::UPWARDS_DOUBLE_ARROW),
    "Uparrow" => Relation(symbol::UPWARDS_DOUBLE_ARROW),
    "Updownarrow" => Relation(symbol::UP_DOWN_DOUBLE_ARROW),
    "Upsilon" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_UPSILON)),
    "VDash" => Relation(symbol::DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE),
    "Vdash" => Relation(symbol::FORCES),
    "Vert" => Ord(symbol::DOUBLE_VERTICAL_LINE),
    "Vvdash" => Relation(symbol::TRIPLE_VERTICAL_BAR_RIGHT_TURNSTILE),
    "Xi" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_XI)),
    "Yleft" => Relation(symbol::LEFTWARDS_ARROW_TAIL),
    "Yright" => Relation(symbol::RIGHTWARDS_ARROW_TAIL),
    "Z" => Letter(SuperChar::from_char(symbol::DOUBLE_STRUCK_CAPITAL_Z), Mode::Math),
    "Zeta" => UprightLetter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_ZETA)),
    "\"" => TextMode(TextToken::Accent(symbol::COMBINING_DIAERESIS)),
    "\\" => NewLine,
    "^" => TextMode(TextToken::Accent(symbol::COMBINING_CIRCUMFLEX_ACCENT.try_as_char().unwrap())),
    "_" => Letter(symbol::LOW_LINE.as_op().as_superchar(), Mode::MathOrText),
    "`" => TextMode(TextToken::Accent(symbol::COMBINING_GRAVE_ACCENT)),
    "aa" => TextMode(TextToken::Letter('å')),
    "acute" => Accent(symbol::ACUTE_ACCENT, true, OpAttrs::empty()),
    "ae" => TextMode(TextToken::Letter('æ')),
    "alef" => Letter(SuperChar::from_char(symbol::ALEF_SYMBOL), Mode::Math),
    "alefsym" => Letter(SuperChar::from_char(symbol::ALEF_SYMBOL), Mode::Math),
    "aleph" => Letter(SuperChar::from_char(symbol::ALEF_SYMBOL), Mode::Math),
    "alpha" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_ALPHA), Mode::Math),
    "amalg" => ForceBinaryOp(symbol::AMALGAMATION_OR_COPRODUCT.as_op()),
    "angle" => Letter(SuperChar::from_char(symbol::ANGLE), Mode::Math),
    "approx" => Relation(symbol::ALMOST_EQUAL_TO),
    "approxeq" => Relation(symbol::ALMOST_EQUAL_OR_EQUAL_TO),
    "arceq" => Relation(symbol::CORRESPONDS_TO), // from "stix"
    "argmax" => PseudoOperatorLimits("arg\u{2009}max"),
    "argmin" => PseudoOperatorLimits("arg\u{2009}min"),
    "ascnode" => Letter(SuperChar::from_char(symbol::ASCENDING_NODE), Mode::Math),
    "ast" => ForceBinaryOp(symbol::ASTERISK_OPERATOR.as_op()),
    "asymp" => Relation(symbol::EQUIVALENT_TO),
    "atop" => InfixGenFrac { with_line: false, delim: None },
    "awint" => Op(symbol::ANTICLOCKWISE_INTEGRATION),
    "backepsilon" => Letter(SuperChar::from_char(symbol::GREEK_REVERSED_LUNATE_EPSILON_SYMBOL), Mode::Math),
    "backprime" => Ord(symbol::REVERSED_PRIME),
    "backsim" => Relation(symbol::REVERSED_TILDE),
    "backsimeq" => Relation(symbol::REVERSED_TILDE_EQUALS),
    "backslash" => Ord(symbol::REVERSE_SOLIDUS),
    "bar" => Accent(symbol::MACRON, true, OpAttrs::STRETCHY_FALSE),
    "barwedge" => BinaryOp(symbol::NAND),
    "bcancel" => Enclose(Notation::DOWN_DIAGONAL),
    "because" => ForceRelation(symbol::BECAUSE.as_op()),
    "beta" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_BETA), Mode::Math),
    "beth" => Letter(SuperChar::from_char(symbol::BET_SYMBOL), Mode::Math),
    "between" => Relation(symbol::BETWEEN),
    "bf" => TransformSwitch(MathVariant::Transform(TextTransform::Bold)),
    "big" => Big(Size::Scale1, None),
    "bigcap" => Op(symbol::N_ARY_INTERSECTION),
    "bigcirc" => Letter(SuperChar::from_char(symbol::LARGE_CIRCLE), Mode::Math),
    "bigcup" => Op(symbol::N_ARY_UNION),
    "bigcupdot" => Op(symbol::N_ARY_UNION_OPERATOR_WITH_DOT),
    "bigdoublevee" => Op(symbol::TWO_LOGICAL_OR_OPERATOR),
    "bigdoublewedge" => Op(symbol::TWO_LOGICAL_AND_OPERATOR),
    "bigg" => Big(Size::Scale3, None),
    "biggl" => Big(Size::Scale3, Some(ParenType::Left)),
    "biggm" => Big(Size::Scale3, Some(ParenType::Middle)),
    "biggr" => Big(Size::Scale3, Some(ParenType::Right)),
    "bigl" => Big(Size::Scale1, Some(ParenType::Left)),
    "bigm" => Big(Size::Scale1, Some(ParenType::Middle)),
    "bigodot" => Op(symbol::N_ARY_CIRCLED_DOT_OPERATOR),
    "bigoplus" => Op(symbol::N_ARY_CIRCLED_PLUS_OPERATOR),
    "bigotimes" => Op(symbol::N_ARY_CIRCLED_TIMES_OPERATOR),
    "bigr" => Big(Size::Scale1, Some(ParenType::Right)),
    "bigsqcap" => Op(symbol::N_ARY_SQUARE_INTERSECTION_OPERATOR),
    "bigsqcup" => Op(symbol::N_ARY_SQUARE_UNION_OPERATOR),
    "bigstar" => Letter(SuperChar::from_char(symbol::BLACK_STAR), Mode::Math),
    "bigtimes" => Op(symbol::N_ARY_TIMES_OPERATOR),
    "bigtriangledown" => ForceBinaryOp(symbol::WHITE_DOWN_POINTING_TRIANGLE),
    "bigtriangleup" => ForceBinaryOp(symbol::WHITE_UP_POINTING_TRIANGLE),
    "biguplus" => Op(symbol::N_ARY_UNION_OPERATOR_WITH_PLUS),
    "bigvee" => Op(symbol::N_ARY_LOGICAL_OR),
    "bigwedge" => Op(symbol::N_ARY_LOGICAL_AND),
    "binom" => Binom(None),
    "blacklozenge" => Letter(SuperChar::from_char(symbol::BLACK_LOZENGE), Mode::Math),
    "blacksquare" => Letter(SuperChar::from_char(symbol::BLACK_SQUARE), Mode::Math),
    "blacktriangle" => Letter(SuperChar::from_char(symbol::BLACK_UP_POINTING_TRIANGLE), Mode::Math),
    "blacktriangledown" => Letter(SuperChar::from_char(symbol::BLACK_DOWN_POINTING_TRIANGLE), Mode::Math),
    "blacktriangleleft" => ForceRelation(symbol::BLACK_LEFT_POINTING_TRIANGLE),
    "blacktriangleright" => ForceRelation(symbol::BLACK_RIGHT_POINTING_TRIANGLE),
    "bm" => Transform(MathVariant::Transform(TextTransform::BoldItalic)),
    "bmod" => CustomCmd(0, &predefined::BMOD),
    "bold" => Transform(MathVariant::Transform(TextTransform::Bold)),
    "boldsymbol" => Transform(MathVariant::Transform(TextTransform::BoldItalic)),
    "bot" => Letter(SuperChar::from_char(symbol::UP_TACK), Mode::Math),
    "botdoteq" => Relation(symbol::EQUALS_SIGN_WITH_DOT_BELOW),
    "bowtie" => Relation(symbol::BOWTIE),
    "boxdot" => ForceBinaryOp(symbol::SQUARED_DOT_OPERATOR.as_op()),
    "boxminus" => BinaryOp(symbol::SQUARED_MINUS),
    "boxplus" => BinaryOp(symbol::SQUARED_PLUS),
    "boxtimes" => ForceBinaryOp(symbol::SQUARED_TIMES.as_op()),
    "bra" => CustomCmd(1, &predefined::BRA),
    "brace" => InfixGenFrac { with_line: false, delim: Some(InfixDelim::Brace) },
    "brack" => InfixGenFrac { with_line: false, delim: Some(InfixDelim::Brack) },
    "braket" => CustomCmd(1, &predefined::BRAKET),
    "breve" => Accent(symbol::BREVE, true, OpAttrs::empty()),
    "bull" => ForceBinaryOp(symbol::BULLET_OPERATOR.as_op()),
    "bullet" => ForceBinaryOp(symbol::BULLET_OPERATOR.as_op()),
    "bumpeq" => Relation(symbol::DIFFERENCE_BETWEEN),
    "c" => TextMode(TextToken::Accent(symbol::COMBINING_CEDILLA)),
    "cal" => TransformSwitch(MathVariant::Transform(TextTransform::ScriptChancery)),
    "cancel" => Enclose(Notation::UP_DIAGONAL),
    "cap" => BinaryOp(symbol::INTERSECTION),
    "cdot" => ForceBinaryOp(symbol::DOT_OPERATOR.as_op()),
    "cdotp" => ForcePunctuation(symbol::MIDDLE_DOT.as_op()),
    "cdots" => CustomCmd(0, &predefined::CDOTS),
    "cfrac" => Frac(Some(FracAttr::CFracStyle)),
    "check" => Accent(symbol::CARON, true, OpAttrs::STRETCHY_FALSE),
    "checkmark" => Letter(SuperChar::from_char(symbol::CHECK_MARK), Mode::MathOrText),
    "chi" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_CHI), Mode::Math),
    "choose" => InfixGenFrac { with_line: false, delim: Some(InfixDelim::Paren) },
    "circ" => ForceBinaryOp(symbol::RING_OPERATOR.as_op()),
    "circeq" => Relation(symbol::RING_EQUAL_TO),
    "circlearrowleft" => Relation(symbol::ANTICLOCKWISE_OPEN_CIRCLE_ARROW),
    "circlearrowright" => Relation(symbol::CLOCKWISE_OPEN_CIRCLE_ARROW),
    "circledR" => Letter(SuperChar::from_char(symbol::CIRCLED_LATIN_CAPITAL_LETTER_R), Mode::MathOrText),
    "circledS" => Letter(SuperChar::from_char(symbol::CIRCLED_LATIN_CAPITAL_LETTER_S), Mode::Math),
    "circledast" => ForceBinaryOp(symbol::CIRCLED_ASTERISK_OPERATOR.as_op()),
    "circledcirc" => ForceBinaryOp(symbol::CIRCLED_RING_OPERATOR.as_op()),
    "circleddash" => ForceBinaryOp(symbol::CIRCLED_DASH.as_op()),
    "cirfnint" => Op(symbol::CIRCULATION_FUNCTION),
    "clubs" => Letter(SuperChar::from_char(symbol::BLACK_CLUB_SUIT), Mode::Math),
    "clubsuit" => Letter(SuperChar::from_char(symbol::BLACK_CLUB_SUIT), Mode::Math),
    "cnums" => Letter(SuperChar::from_char(symbol::DOUBLE_STRUCK_CAPITAL_C), Mode::Math),
    "colon" => Letter(symbol::COLON.as_op().as_superchar(), Mode::Math),
    "coloncolon" => Relation(symbol::PROPORTION),
    "coloncolonequals" => Relation(symbol::DOUBLE_COLON_EQUAL),
    "coloneq" => Relation(symbol::COLON_EQUALS),
    "colonequals" => Relation(symbol::COLON_EQUALS),
    "coloneqq" => Relation(symbol::COLON_EQUALS),
    "color" => Color,
    "complement" => Letter(symbol::COMPLEMENT.as_op().as_superchar(), Mode::Math), // should be Ord, but FF has a bug
    "cong" => Relation(symbol::APPROXIMATELY_EQUAL_TO),
    "coprod" => Op(symbol::N_ARY_COPRODUCT),
    "copyright" => Letter(SuperChar::from_char(symbol::COPYRIGHT_SIGN), Mode::Math),
    "cramped" => Cramped,
    "cup" => BinaryOp(symbol::UNION),
    "curlyeqprec" => Relation(symbol::EQUAL_TO_OR_PRECEDES),
    "curlyeqsucc" => Relation(symbol::EQUAL_TO_OR_SUCCEEDS),
    "curlyvee" => BinaryOp(symbol::CURLY_LOGICAL_OR),
    "curlywedge" => BinaryOp(symbol::CURLY_LOGICAL_AND),
    "curvearrowleft" => Relation(symbol::ANTICLOCKWISE_TOP_SEMICIRCLE_ARROW),
    "curvearrowright" => Relation(symbol::CLOCKWISE_TOP_SEMICIRCLE_ARROW),
    "dArr" => Relation(symbol::DOWNWARDS_DOUBLE_ARROW),
    "dag" => Letter(SuperChar::from_char(symbol::DAGGER), Mode::MathOrText),
    "dagger" => ForceBinaryOp(MathMLOperator::from_char(symbol::DAGGER)),
    "daleth" => Letter(SuperChar::from_char(symbol::DALET_SYMBOL), Mode::Math),
    "darr" => Relation(symbol::DOWNWARDS_ARROW),
    "dashcolon" => Relation(symbol::EXCESS),
    "dashleftarrow" => Relation(symbol::LEFTWARDS_DASHED_ARROW),
    "dashrightarrow" => Relation(symbol::RIGHTWARDS_DASHED_ARROW),
    "dashv" => Relation(symbol::LEFT_TACK),
    "dbinom" => Binom(Some(FracAttr::DisplayStyleTrue)),
    "dblcolon" => Relation(symbol::PROPORTION),
    "ddag" => Letter(SuperChar::from_char(symbol::DOUBLE_DAGGER), Mode::MathOrText),
    "ddagger" => ForceBinaryOp(MathMLOperator::from_char(symbol::DOUBLE_DAGGER)),
    "ddddot" => Accent(symbol::COMBINING_FOUR_DOTS_ABOVE, true, OpAttrs::empty()),
    "dddot" => Accent(symbol::COMBINING_THREE_DOTS_ABOVE, true, OpAttrs::empty()),
    "ddot" => Accent(symbol::DIAERESIS, true, OpAttrs::empty()),
    "ddots" => Relation(symbol::DOWN_RIGHT_DIAGONAL_ELLIPSIS),
    "degree" => Letter(SuperChar::from_char(symbol::DEGREE_SIGN), Mode::MathOrText),
    "delta" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_DELTA), Mode::Math),
    "dfrac" => Frac(Some(FracAttr::DisplayStyleTrue)),
    "diamond" => ForceBinaryOp(symbol::DIAMOND_OPERATOR.as_op()),
    "diamonds" => Letter(SuperChar::from_char(symbol::WHITE_DIAMOND_SUIT), Mode::Math),
    "diamondsuit" => Letter(SuperChar::from_char(symbol::WHITE_DIAMOND_SUIT), Mode::Math),
    "digamma" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_DIGAMMA), Mode::Math),
    "displaylimits" => Limits(LimitsKind::Display),
    "displaystyle" => Style(Style::Display),
    "div" => BinaryOp(symbol::DIVISION_SIGN),
    "divideontimes" => ForceBinaryOp(symbol::DIVISION_TIMES.as_op()),
    "dot" => Accent(symbol::DOT_ABOVE, true, OpAttrs::empty()),
    "doteq" => Relation(symbol::APPROACHES_THE_LIMIT),
    "doteqdot" => Relation(symbol::GEOMETRICALLY_EQUAL_TO),
    "dotplus" => BinaryOp(symbol::DOT_PLUS),
    "dots" => MathOrTextMode(&CustomCmd(0, &predefined::DOTS), symbol::HORIZONTAL_ELLIPSIS),
    "dotsminusdots" => Relation(symbol::GEOMETRIC_PROPORTION),
    "doublebarwedge" => BinaryOp(symbol::LOGICAL_AND_WITH_DOUBLE_OVERBAR),
    "doublecap" => BinaryOp(symbol::DOUBLE_INTERSECTION),
    "doublecup" => BinaryOp(symbol::DOUBLE_UNION),
    "downarrow" => Relation(symbol::DOWNWARDS_ARROW),
    "downdownarrows" => Relation(symbol::DOWNWARDS_PAIRED_ARROWS),
    "downharpoonleft" => Relation(symbol::DOWNWARDS_HARPOON_WITH_BARB_LEFTWARDS),
    "downharpoonright" => Relation(symbol::DOWNWARDS_HARPOON_WITH_BARB_RIGHTWARDS),
    "ell" => Letter(SuperChar::from_char(symbol::SCRIPT_SMALL_L), Mode::Math),
    "emph" => Text(Some(HtmlTextStyle::Emphasis)),
    "empty" => Letter(symbol::EMPTY_SET_ZERO_WITH_LONG_DIAGONAL_STROKE_OVERLAY_FORM, Mode::Math),
    "emptyset" => Letter(symbol::EMPTY_SET_ZERO_WITH_LONG_DIAGONAL_STROKE_OVERLAY_FORM, Mode::Math),
    "epsilon" => Letter(SuperChar::from_char(symbol::GREEK_LUNATE_EPSILON_SYMBOL), Mode::Math),
    "eqcirc" => Relation(symbol::RING_IN_EQUAL_TO),
    "eqcolon" => Relation(symbol::EQUALS_COLON),
    "eqdef" => Relation(symbol::EQUAL_TO_BY_DEFINITION), // from "stix"
    "eqqcolon" => Relation(symbol::EQUALS_COLON),
    "eqref" => EqRef,
    "eqsim" => Relation(symbol::MINUS_TILDE),
    "eqslantgtr" => Relation(symbol::SLANTED_EQUAL_TO_OR_GREATER_THAN),
    "eqslantless" => Relation(symbol::SLANTED_EQUAL_TO_OR_LESS_THAN),
    "equalscolon" => Relation(symbol::EQUALS_COLON),
    "equiv" => Relation(symbol::IDENTICAL_TO),
    "eta" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_ETA), Mode::Math),
    "eth" => Letter(SuperChar::from_char(symbol::LATIN_SMALL_LETTER_ETH), Mode::Math),
    "exist" => Ord(symbol::THERE_EXISTS),
    "exists" => Ord(symbol::THERE_EXISTS),
    "fallingdotseq" => Relation(symbol::APPROXIMATELY_EQUAL_TO_OR_THE_IMAGE_OF),
    "fcmp" => BinaryOp(symbol::Z_NOTATION_RELATIONAL_COMPOSITION),
    "fint" => Op(symbol::INTEGRAL_AVERAGE_WITH_SLASH),
    "flat" => Letter(SuperChar::from_char(symbol::MUSIC_FLAT_SIGN), Mode::Math),
    "footnotesize" => TextMode(TextToken::Size(HtmlTextSize::Size80)),
    "forall" => Ord(symbol::FOR_ALL),
    "frac" => Frac(None),
    "frak" => Transform(MathVariant::Transform(TextTransform::Fraktur)),
    "frown" => ForceRelation(symbol::FROWN.as_op()),
    "gamma" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_GAMMA), Mode::Math),
    "gcd" => PseudoOperatorLimits("gcd"),
    "ge" => Relation(symbol::GREATER_THAN_OR_EQUAL_TO),
    "genfrac" => Genfrac,
    "geq" => Relation(symbol::GREATER_THAN_OR_EQUAL_TO),
    "geqq" => Relation(symbol::GREATER_THAN_OVER_EQUAL_TO),
    "geqslant" => Relation(symbol::GREATER_THAN_OR_SLANTED_EQUAL_TO),
    "gets" => Relation(symbol::LEFTWARDS_ARROW),
    "gg" => Relation(symbol::MUCH_GREATER_THAN),
    "ggg" => Relation(symbol::VERY_MUCH_GREATER_THAN),
    "gggtr" => Relation(symbol::VERY_MUCH_GREATER_THAN),
    "gimel" => Letter(SuperChar::from_char(symbol::GIMEL_SYMBOL), Mode::Math),
    "gnapprox" => Relation(symbol::GREATER_THAN_AND_NOT_APPROXIMATE),
    "gneq" => Relation(symbol::GREATER_THAN_AND_SINGLE_LINE_NOT_EQUAL_TO),
    "gneqq" => Relation(symbol::GREATER_THAN_BUT_NOT_EQUAL_TO),
    "gnsim" => Relation(symbol::GREATER_THAN_BUT_NOT_EQUIVALENT_TO),
    "grave" => Accent(symbol::GRAVE_ACCENT, true, OpAttrs::empty()),
    "gt" => Relation(symbol::GREATER_THAN_SIGN),
    "gtrapprox" => Relation(symbol::GREATER_THAN_OR_APPROXIMATE),
    "gtreqless" => Relation(symbol::GREATER_THAN_EQUAL_TO_OR_LESS_THAN),
    "gtreqqless" => Relation(symbol::GREATER_THAN_ABOVE_DOUBLE_LINE_EQUAL_ABOVE_LESS_THAN),
    "gtrdot" => Relation(symbol::GREATER_THAN_WITH_DOT),
    "gtrless" => Relation(symbol::GREATER_THAN_OR_LESS_THAN),
    "gtrsim" => Relation(symbol::GREATER_THAN_OR_EQUIVALENT_TO),
    "gvertneqq" => Relation(symbol::GREATER_THAN_BUT_NOT_EQUAL_TO_WITH_VERTICAL_STROKE),
    "hArr" => Relation(symbol::LEFT_RIGHT_DOUBLE_ARROW),
    "harr" => Relation(symbol::LEFT_RIGHT_ARROW),
    "hat" => Accent(symbol::MODIFIER_LETTER_CIRCUMFLEX_ACCENT, true, OpAttrs::STRETCHY_FALSE),
    "hbar" => Letter(SuperChar::from_char(symbol::PLANCK_CONSTANT_OVER_TWO_PI), Mode::Math),
    "hearts" => Letter(SuperChar::from_char(symbol::WHITE_HEART_SUIT), Mode::Math),
    "heartsuit" => Letter(SuperChar::from_char(symbol::WHITE_HEART_SUIT), Mode::Math),
    "hookleftarrow" => Relation(symbol::LEFTWARDS_ARROW_WITH_HOOK),
    "hookrightarrow" => Relation(symbol::RIGHTWARDS_ARROW_WITH_HOOK),
    "hphantom" => Phantom(PhantomKind::H),
    "hskip" => KernOrSkip(UnitKind::TextUnits),
    "hslash" => Letter(SuperChar::from_char(symbol::PLANCK_CONSTANT_OVER_TWO_PI), Mode::Math),
    "hspace" => CustomSpace(UnitKind::TextUnits),
    "huge" => TextMode(TextToken::Size(HtmlTextSize::Size200)),
    "i" => TextMode(TextToken::Letter('ı')),
    "idotsint" => CustomCmd(0, &predefined::IDOTSINT),
    "iff" => CustomCmd(0, &predefined::IFF),
    "iiiint" => Op(symbol::QUADRUPLE_INTEGRAL_OPERATOR),
    "iiint" => Op(symbol::TRIPLE_INTEGRAL),
    "iint" => Op(symbol::DOUBLE_INTEGRAL),
    "image" => Letter(SuperChar::from_char(symbol::BLACK_LETTER_CAPITAL_I), Mode::Math),
    "imageof" => Relation(symbol::IMAGE_OF),
    "imath" => Letter(SuperChar::from_char(symbol::LATIN_SMALL_LETTER_DOTLESS_I), Mode::Math),
    "impliedby" => CustomCmd(0, &predefined::IMPLIEDBY),
    "implies" => CustomCmd(0, &predefined::IMPLIES),
    "in" => Relation(symbol::ELEMENT_OF),
    "inf" => PseudoOperatorLimits("inf"),
    "infin" => Letter(SuperChar::from_char(symbol::INFINITY), Mode::Math),
    "infty" => Letter(SuperChar::from_char(symbol::INFINITY), Mode::Math),
    "injlim" => PseudoOperatorLimits("inj\u{2009}lim"),
    "int" => Op(symbol::INTEGRAL),
    "intBar" => Op(symbol::INTEGRAL_WITH_DOUBLE_STROKE),
    "intbar" => Op(symbol::FINITE_PART_INTEGRAL),
    "intclockwise" => Op(symbol::CLOCKWISE_INTEGRAL),
    "intercal" => ForceBinaryOp(symbol::INTERCALATE.as_op()),
    "iota" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_IOTA), Mode::Math),
    "isin" => Relation(symbol::ELEMENT_OF),
    "it" => TransformSwitch(MathVariant::Transform(TextTransform::Italic)),
    "j" => TextMode(TextToken::Letter('ȷ')),
    "jmath" => Letter(SuperChar::from_char(symbol::LATIN_SMALL_LETTER_DOTLESS_J), Mode::Math),
    "kappa" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_KAPPA), Mode::Math),
    "kern" => KernOrSkip(UnitKind::TextUnits),
    "kernelcontraction" => Relation(symbol::HOMOTHETIC),
    "ket" => CustomCmd(1, &predefined::KET),
    "l" => TextMode(TextToken::Letter('ł')),
    "lAngle" => Open(symbol::MATHEMATICAL_LEFT_DOUBLE_ANGLE_BRACKET),
    "lArr" => Relation(symbol::LEFTWARDS_DOUBLE_ARROW),
    "lBrace" => Open(symbol::LEFT_WHITE_CURLY_BRACKET),
    "lVert" => Open(symbol::DOUBLE_VERTICAL_LINE),
    "label" => Label,
    "lambda" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_LAMBDA), Mode::Math),
    "land" => BinaryOp(symbol::LOGICAL_AND),
    "lang" => Open(symbol::MATHEMATICAL_LEFT_ANGLE_BRACKET),
    "langle" => Open(symbol::MATHEMATICAL_LEFT_ANGLE_BRACKET),
    "large" => TextMode(TextToken::Size(HtmlTextSize::Size120)),
    "larr" => Relation(symbol::LEFTWARDS_ARROW),
    "lbrace" => Open(symbol::LEFT_CURLY_BRACKET),
    "lbrack" => Open(symbol::LEFT_SQUARE_BRACKET),
    "lceil" => Open(symbol::LEFT_CEILING),
    "ldotp" => ForcePunctuation(symbol::FULL_STOP.as_op()),
    "ldots" => MathOrTextMode(&CustomCmd(0, &predefined::DOTS), symbol::HORIZONTAL_ELLIPSIS),
    "le" => Relation(symbol::LESS_THAN_OR_EQUAL_TO),
    "leadsto" => Relation(symbol::RIGHTWARDS_SQUIGGLE_ARROW),
    "left" => Left,
    "leftarrow" => Relation(symbol::LEFTWARDS_ARROW),
    "leftarrowtail" => Relation(symbol::LEFTWARDS_ARROW_WITH_TAIL),
    "leftharpoondown" => Relation(symbol::LEFTWARDS_HARPOON_WITH_BARB_DOWNWARDS),
    "leftharpoonup" => Relation(symbol::LEFTWARDS_HARPOON_WITH_BARB_UPWARDS),
    "leftleftarrows" => Relation(symbol::LEFTWARDS_PAIRED_ARROWS),
    "leftrightarrow" => Relation(symbol::LEFT_RIGHT_ARROW),
    "leftrightarrows" => Relation(symbol::LEFTWARDS_ARROW_OVER_RIGHTWARDS_ARROW),
    "leftrightharpoons" => Relation(symbol::LEFTWARDS_HARPOON_OVER_RIGHTWARDS_HARPOON),
    "leftrightsquigarrow" => Relation(symbol::LEFT_RIGHT_WAVE_ARROW),
    "leftthreetimes" => ForceBinaryOp(symbol::LEFT_SEMIDIRECT_PRODUCT.as_op()),
    "leq" => Relation(symbol::LESS_THAN_OR_EQUAL_TO),
    "leqq" => Relation(symbol::LESS_THAN_OVER_EQUAL_TO),
    "leqslant" => Relation(symbol::LESS_THAN_OR_SLANTED_EQUAL_TO),
    "lessapprox" => Relation(symbol::LESS_THAN_OR_APPROXIMATE),
    "lessdot" => Relation(symbol::LESS_THAN_WITH_DOT),
    "lesseqgtr" => Relation(symbol::LESS_THAN_EQUAL_TO_OR_GREATER_THAN),
    "lesseqqgtr" => Relation(symbol::LESS_THAN_ABOVE_DOUBLE_LINE_EQUAL_ABOVE_GREATER_THAN),
    "lessgtr" => Relation(symbol::LESS_THAN_OR_GREATER_THAN),
    "lesssim" => Relation(symbol::LESS_THAN_OR_EQUIVALENT_TO),
    "lfloor" => Open(symbol::LEFT_FLOOR),
    "lgroup" => Open(symbol::MATHEMATICAL_LEFT_FLATTENED_PARENTHESIS),
    "lhd" => Relation(symbol::NORMAL_SUBGROUP_OF),
    "lightning" => Relation(symbol::DOWNWARDS_ZIGZAG_ARROW),
    "lim" => PseudoOperatorLimits("lim"),
    "liminf" => PseudoOperatorLimits("lim\u{2009}inf"),
    "limits" => Limits(LimitsKind::Always),
    "limsup" => PseudoOperatorLimits("lim\u{2009}sup"),
    "ll" => Relation(symbol::MUCH_LESS_THAN),
    "llangle" => Open(symbol::Z_NOTATION_LEFT_BINDING_BRACKET), // from "stix"
    "llbracket" => Open(symbol::MATHEMATICAL_LEFT_WHITE_SQUARE_BRACKET),
    "llcorner" => ForceOpen(symbol::BOTTOM_LEFT_CORNER, ForceStretchy::Pretend),
    "lll" => Relation(symbol::VERY_MUCH_LESS_THAN),
    "llless" => Relation(symbol::VERY_MUCH_LESS_THAN),
    "lmoustache" => ForceOpen(symbol::UPPER_LEFT_OR_LOWER_RIGHT_CURLY_BRACKET_SECTION, ForceStretchy::Yes),
    "llparenthesis" => Open(symbol::Z_NOTATION_LEFT_IMAGE_BRACKET),
    "lnapprox" => Relation(symbol::LESS_THAN_AND_NOT_APPROXIMATE),
    "lneq" => Relation(symbol::LESS_THAN_AND_SINGLE_LINE_NOT_EQUAL_TO),
    "lneqq" => Relation(symbol::LESS_THAN_BUT_NOT_EQUAL_TO),
    "lnot" => Ord(symbol::NOT_SIGN),
    "lnsim" => Relation(symbol::LESS_THAN_BUT_NOT_EQUIVALENT_TO),
    "longleftarrow" => Relation(symbol::LONG_LEFTWARDS_ARROW),
    "longleftrightarrow" => Relation(symbol::LONG_LEFT_RIGHT_ARROW),
    "longmapsto" => Relation(symbol::LONG_RIGHTWARDS_ARROW_FROM_BAR),
    "longrightarrow" => Relation(symbol::LONG_RIGHTWARDS_ARROW),
    "looparrowleft" => Relation(symbol::LEFTWARDS_ARROW_WITH_LOOP),
    "looparrowright" => Relation(symbol::RIGHTWARDS_ARROW_WITH_LOOP),
    "lor" => BinaryOp(symbol::LOGICAL_OR),
    "lozenge" => Letter(SuperChar::from_char(symbol::LOZENGE), Mode::Math),
    "lq" => Letter(SuperChar::from_char(symbol::LEFT_SINGLE_QUOTATION_MARK), Mode::MathOrText),
    "lrArr" => Relation(symbol::LEFT_RIGHT_DOUBLE_ARROW),
    "lrarr" => Relation(symbol::LEFT_RIGHT_ARROW),
    "lrcorner" => ForceClose(symbol::BOTTOM_RIGHT_CORNER, ForceStretchy::Pretend),
    "lt" => Relation(symbol::LESS_THAN_SIGN),
    "ltimes" => ForceBinaryOp(symbol::LEFT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT.as_op()),
    "lvert" => Open(symbol::VERTICAL_LINE),
    "lvertneqq" => Relation(symbol::LESS_THAN_BUT_NOT_EQUAL_TO_WITH_VERTICAL_STROKE),
    "maltese" => Letter(SuperChar::from_char(symbol::MALTESE_CROSS), Mode::MathOrText),
    "mapsto" => Relation(symbol::RIGHTWARDS_ARROW_FROM_BAR),
    "mathbb" => Transform(MathVariant::Transform(TextTransform::DoubleStruck)),
    "mathbf" => Transform(MathVariant::Transform(TextTransform::Bold)),
    "mathbin" => MathClass(MathClassKind::Bin),
    "mathcal" => Transform(MathVariant::Transform(TextTransform::ScriptChancery)),
    "mathclose" => MathClass(MathClassKind::Close),
    "mathfrak" => Transform(MathVariant::Transform(TextTransform::Fraktur)),
    "mathit" => Transform(MathVariant::Transform(TextTransform::Italic)),
    "mathop" => MathClass(MathClassKind::Op),
    "mathopen" => MathClass(MathClassKind::Open),
    "mathord" => MathClass(MathClassKind::Ord),
    "mathpunct" => MathClass(MathClassKind::Punct),
    "mathrel" => MathClass(MathClassKind::Rel),
    "mathring" => Accent(symbol::RING_ABOVE, true, OpAttrs::empty()),
    "mathrm" => Transform(MathVariant::Normal),
    "mathscr" => Transform(MathVariant::Transform(TextTransform::ScriptRoundhand)),
    "mathsf" => Transform(MathVariant::Transform(TextTransform::SansSerif)),
    "mathsterling" => Letter(SuperChar::from_char(symbol::POUND_SIGN), Mode::Math),
    "mathstrut" => CustomCmd(0, &predefined::MATHSTRUT),
    "mathtt" => Transform(MathVariant::Transform(TextTransform::Monospace)),
    "max" => PseudoOperatorLimits("max"),
    "measeq" => Relation(symbol::MEASURED_BY), // from "stix"
    "measuredangle" => Letter(SuperChar::from_char(symbol::MEASURED_ANGLE), Mode::Math),
    "medspace" => Space(LatexUnit::Mu.length_with_unit(4.0)),
    "mho" => Letter(SuperChar::from_char(symbol::INVERTED_OHM_SIGN), Mode::Math),
    "mid" => Relation(symbol::DIVIDES),
    "middle" => Middle,
    "min" => PseudoOperatorLimits("min"),
    "minuscolon" => Relation(symbol::EXCESS),
    "minuso" => ForceBinaryOp(symbol::CIRCLE_WITH_HORIZONTAL_BAR),
    "mkern" => KernOrSkip(UnitKind::MathUnits),
    "mod" => CustomCmd(0, &predefined::MOD),
    "models" => Relation(symbol::TRUE),
    "mp" => BinaryOp(symbol::MINUS_OR_PLUS_SIGN),
    "mskip" => KernOrSkip(UnitKind::MathUnits),
    "mspace" => CustomSpace(UnitKind::MathUnits),
    "mu" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_MU), Mode::Math),
    "multimap" => Relation(symbol::MULTIMAP),
    "nLeftarrow" => Relation(symbol::LEFTWARDS_DOUBLE_ARROW_WITH_STROKE),
    "nLeftrightarrow" => Relation(symbol::LEFT_RIGHT_DOUBLE_ARROW_WITH_STROKE),
    "nRightarrow" => Relation(symbol::RIGHTWARDS_DOUBLE_ARROW_WITH_STROKE),
    "nVDash" => Relation(symbol::NEGATED_DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE),
    "nVdash" => Relation(symbol::DOES_NOT_FORCE),
    "nabla" => UprightLetter(SuperChar::from_char(symbol::NABLA)),
    "natnums" => Letter(SuperChar::from_char(symbol::DOUBLE_STRUCK_CAPITAL_N), Mode::Math),
    "natural" => Letter(SuperChar::from_char(symbol::MUSIC_NATURAL_SIGN), Mode::Math),
    "ncong" => Relation(symbol::NEITHER_APPROXIMATELY_NOR_ACTUALLY_EQUAL_TO),
    "ne" => Relation(symbol::NOT_EQUAL_TO),
    "nearrow" => Relation(symbol::NORTH_EAST_ARROW),
    "neg" => Ord(symbol::NOT_SIGN),
    "neq" => Relation(symbol::NOT_EQUAL_TO),
    "nequiv" => Relation(symbol::NOT_IDENTICAL_TO),
    "newline" => NewLine,
    "nexists" => Ord(symbol::THERE_DOES_NOT_EXIST),
    "ngeq" => Relation(symbol::NEITHER_GREATER_THAN_NOR_EQUAL_TO),
    "ngeqq" => CustomCmd(0, &[Overlay(OverlayChar::Solidus), Relation(symbol::GREATER_THAN_OVER_EQUAL_TO)]),
    "ngeqslant" =>  CustomCmd(0, &[Overlay(OverlayChar::Solidus), Relation(symbol::GREATER_THAN_OR_SLANTED_EQUAL_TO)]),
    "ngtr" => Relation(symbol::NOT_GREATER_THAN),
    "ngtrless" => Relation(symbol::NEITHER_GREATER_THAN_NOR_LESS_THAN),
    "ngtrsim" => Relation(symbol::NEITHER_GREATER_THAN_NOR_EQUIVALENT_TO),
    "ni" => Relation(symbol::CONTAINS_AS_MEMBER),
    "nleftarrow" => Relation(symbol::LEFTWARDS_ARROW_WITH_STROKE),
    "nleftrightarrow" => Relation(symbol::LEFT_RIGHT_ARROW_WITH_STROKE),
    "nleqq" => CustomCmd(0, &[Overlay(OverlayChar::Solidus), Relation(symbol::LESS_THAN_OVER_EQUAL_TO)]),
    "nleqslant" =>  CustomCmd(0, &[Overlay(OverlayChar::Solidus), Relation(symbol::LESS_THAN_OR_SLANTED_EQUAL_TO)]),
    "nleq" => Relation(symbol::NEITHER_LESS_THAN_NOR_EQUAL_TO),
    "nless" => Relation(symbol::NOT_LESS_THAN),
    "nlessgt" => Relation(symbol::NEITHER_LESS_THAN_NOR_GREATER_THAN),
    "nlesssim" => Relation(symbol::NEITHER_LESS_THAN_NOR_EQUIVALENT_TO),
    "nmid" => Relation(symbol::DOES_NOT_DIVIDE),
    "nolimits" => Limits(LimitsKind::Never),
    "nonumber" => NoNumber,
    "normalsize" => TextMode(TextToken::Size(HtmlTextSize::Size100)),
    "not" => Overlay(OverlayChar::Solidus),
    "notag" => NoNumber,
    "notin" => Relation(symbol::NOT_AN_ELEMENT_OF),
    "notni" => Relation(symbol::DOES_NOT_CONTAIN_AS_MEMBER),
    "nparallel" => Relation(symbol::NOT_PARALLEL_TO),
    "nprec" => Relation(symbol::DOES_NOT_PRECEDE),
    "npreceq" => Relation(symbol::DOES_NOT_PRECEDE_OR_EQUAL),
    "nrightarrow" => Relation(symbol::RIGHTWARDS_ARROW_WITH_STROKE),
    "nsim" => Relation(symbol::NOT_TILDE),
    "nsubset" => Relation(symbol::NOT_A_SUBSET_OF),
    "nsubseteq" => Relation(symbol::NEITHER_A_SUBSET_OF_NOR_EQUAL_TO),
    "nsubseteqq" => CustomCmd(0, &[Overlay(OverlayChar::Solidus), Relation(symbol::SUBSET_OF_ABOVE_EQUALS_SIGN)]),
    "nsucc" => Relation(symbol::DOES_NOT_SUCCEED),
    "nsucceq" => Relation(symbol::DOES_NOT_SUCCEED_OR_EQUAL),
    "nsupset" => Relation(symbol::NOT_A_SUPERSET_OF),
    "nsupseteq" => Relation(symbol::NEITHER_A_SUPERSET_OF_NOR_EQUAL_TO),
    "nsupseteqq" => CustomCmd(0, &[Overlay(OverlayChar::Solidus), Relation(symbol::SUPERSET_OF_ABOVE_EQUALS_SIGN)]),
    "ntriangleleft" => Relation(symbol::NOT_NORMAL_SUBGROUP_OF),
    "ntrianglelefteq" => Relation(symbol::NOT_NORMAL_SUBGROUP_OF_OR_EQUAL_TO),
    "ntriangleright" => Relation(symbol::DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP),
    "ntrianglerighteq" => Relation(symbol::DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP_OR_EQUAL),
    "nu" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_NU), Mode::Math),
    "nvDash" => Relation(symbol::NOT_TRUE),
    "nvdash" => Relation(symbol::DOES_NOT_PROVE),
    "nwarrow" => Relation(symbol::NORTH_WEST_ARROW),
    "o" => TextMode(TextToken::Letter('ø')),
    "odot" => ForceBinaryOp(symbol::CIRCLED_DOT_OPERATOR.as_op()),
    "oe" => TextMode(TextToken::Letter('œ')),
    "oiiint" => Op(symbol::VOLUME_INTEGRAL),
    "oiint" => Op(symbol::SURFACE_INTEGRAL),
    "oint" => Op(symbol::CONTOUR_INTEGRAL),
    "ointctrclockwise" => Op(symbol::ANTICLOCKWISE_CONTOUR_INTEGRAL),
    "omega" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_OMEGA), Mode::Math),
    "omicron" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_OMICRON), Mode::Math),
    "ominus" => BinaryOp(symbol::CIRCLED_MINUS),
    "operatorname" => OperatorName { with_limits: false },
    "operatorname*" => OperatorName { with_limits: true },
    "operatornamewithlimits" => OperatorName { with_limits: true },
    "oplus" => BinaryOp(symbol::CIRCLED_PLUS),
    "origof" => Relation(symbol::ORIGINAL_OF),
    "oslash" => BinaryOp(symbol::CIRCLED_DIVISION_SLASH),
    "otimes" => ForceBinaryOp(symbol::CIRCLED_TIMES.as_op()),
    "over" => InfixGenFrac { with_line: true, delim: None },
    "overbrace" => OverUnderBrace(symbol::TOP_CURLY_BRACKET, true),
    "overbracket" => OverUnderBrace(symbol::TOP_SQUARE_BRACKET, true),
    "overleftarrow" => Accent(symbol::LEFTWARDS_ARROW.as_op(), true, OpAttrs::empty()),
    "overline" => Accent(symbol::COMBINING_LOW_LINE, true, OpAttrs::STRETCHY_TRUE),
    "overparen" => OverUnderBrace(symbol::TOP_PARENTHESIS, true),
    "overrightarrow" => Accent(symbol::RIGHTWARDS_ARROW.as_op(), true, OpAttrs::empty()),
    "overset" => Overset,
    "owns" => Relation(symbol::CONTAINS_AS_MEMBER),
    "parallel" => Relation(symbol::PARALLEL_TO),
    "partial" => Letter(SuperChar::from_char(symbol::PARTIAL_DIFFERENTIAL), Mode::Math),
    "perp" => Relation(symbol::PERPENDICULAR),
    "phantom" => Phantom(PhantomKind::Full),
    "phi" => Letter(SuperChar::from_char(symbol::GREEK_PHI_SYMBOL), Mode::Math),
    "pi" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_PI), Mode::Math),
    "pitchfork" => Relation(symbol::PITCHFORK),
    "plim" => PseudoOperatorLimits("plim"),
    "plusmn" => BinaryOp(symbol::PLUS_MINUS_SIGN),
    "pm" => BinaryOp(symbol::PLUS_MINUS_SIGN),
    "pmod" => CustomCmd(1, &predefined::PMOD),
    "pounds" => Letter(SuperChar::from_char(symbol::POUND_SIGN), Mode::Math),
    "prec" => Relation(symbol::PRECEDES),
    "precapprox" => Relation(symbol::PRECEDES_ABOVE_ALMOST_EQUAL_TO),
    "preccurlyeq" => Relation(symbol::PRECEDES_OR_EQUAL_TO),
    "preceq" => Relation(symbol::PRECEDES_ABOVE_SINGLE_LINE_EQUALS_SIGN),
    "precnapprox" => Relation(symbol::PRECEDES_ABOVE_NOT_ALMOST_EQUAL_TO),
    "precneqq" => Relation(symbol::PRECEDES_ABOVE_NOT_EQUAL_TO),
    "precnsim" => Relation(symbol::PRECEDES_BUT_NOT_EQUIVALENT_TO),
    "precsim" => Relation(symbol::PRECEDES_OR_EQUIVALENT_TO),
    "prescript" => Prescript,
    "prime" => Ord(symbol::PRIME),
    "prod" => Op(symbol::N_ARY_PRODUCT),
    "propto" => Relation(symbol::PROPORTIONAL_TO),
    "psi" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_PSI), Mode::Math),
    "qquad" => Space(LatexUnit::Em.length_with_unit(2.0)),
    "quad" => Space(LatexUnit::Em.length_with_unit(1.0)),
    "questeq" => Relation(symbol::QUESTIONED_EQUAL_TO), // from "stix"
    "r" => TextMode(TextToken::Accent(symbol::COMBINING_RING_ABOVE)),
    "rAngle" => Close(symbol::MATHEMATICAL_RIGHT_DOUBLE_ANGLE_BRACKET),
    "rArr" => Relation(symbol::RIGHTWARDS_DOUBLE_ARROW),
    "rBrace" => Close(symbol::RIGHT_WHITE_CURLY_BRACKET),
    "rVert" => Close(symbol::DOUBLE_VERTICAL_LINE),
    "rang" => Close(symbol::MATHEMATICAL_RIGHT_ANGLE_BRACKET),
    "rangle" => Close(symbol::MATHEMATICAL_RIGHT_ANGLE_BRACKET),
    "rarr" => Relation(symbol::RIGHTWARDS_ARROW),
    "ratio" => ForceRelation(symbol::RATIO.as_op()),
    "rbrace" => Close(symbol::RIGHT_CURLY_BRACKET),
    "rbrack" => Close(symbol::RIGHT_SQUARE_BRACKET),
    "rceil" => Close(symbol::RIGHT_CEILING),
    "real" => Letter(SuperChar::from_char(symbol::BLACK_LETTER_CAPITAL_R), Mode::Math),
    "reals" => Letter(SuperChar::from_char(symbol::DOUBLE_STRUCK_CAPITAL_R), Mode::Math),
    "restriction" => Relation(symbol::UPWARDS_HARPOON_WITH_BARB_RIGHTWARDS),
    "rfloor" => Close(symbol::RIGHT_FLOOR),
    "rgroup" => Close(symbol::MATHEMATICAL_RIGHT_FLATTENED_PARENTHESIS),
    "rhd" => Relation(symbol::CONTAINS_AS_NORMAL_SUBGROUP),
    "rho" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_RHO), Mode::Math),
    "right" => Right,
    "rightarrow" => Relation(symbol::RIGHTWARDS_ARROW),
    "rightarrowtail" => Relation(symbol::RIGHTWARDS_ARROW_WITH_TAIL),
    "rightharpoondown" => Relation(symbol::RIGHTWARDS_HARPOON_WITH_BARB_DOWNWARDS),
    "rightharpoonup" => Relation(symbol::RIGHTWARDS_HARPOON_WITH_BARB_UPWARDS),
    "rightleftarrows" => Relation(symbol::RIGHTWARDS_ARROW_OVER_LEFTWARDS_ARROW),
    "rightleftharpoons" => Relation(symbol::RIGHTWARDS_HARPOON_OVER_LEFTWARDS_HARPOON),
    "rightrightarrows" => Relation(symbol::RIGHTWARDS_PAIRED_ARROWS),
    "rightsquigarrow" => Relation(symbol::RIGHTWARDS_SQUIGGLE_ARROW),
    "rightthreetimes" => ForceBinaryOp(symbol::RIGHT_SEMIDIRECT_PRODUCT.as_op()),
    "risingdotseq" => Relation(symbol::IMAGE_OF_OR_APPROXIMATELY_EQUAL_TO),
    "rm" => TransformSwitch(MathVariant::Normal),
    "rmoustache" => ForceClose(symbol::UPPER_RIGHT_OR_LOWER_LEFT_CURLY_BRACKET_SECTION, ForceStretchy::Yes),
    "rq" => Letter(SuperChar::from_char(symbol::RIGHT_SINGLE_QUOTATION_MARK), Mode::MathOrText),
    "rrangle" => Close(symbol::Z_NOTATION_RIGHT_BINDING_BRACKET), // from "stix"
    "rrbracket" => Close(symbol::MATHEMATICAL_RIGHT_WHITE_SQUARE_BRACKET),
    "rrparenthesis" => Close(symbol::Z_NOTATION_RIGHT_IMAGE_BRACKET),
    "rtimes" => ForceBinaryOp(symbol::RIGHT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT.as_op()),
    "rupee" => Letter(SuperChar::from_char(''), Mode::Math),
    "rvert" => Close(symbol::VERTICAL_LINE),
    "scriptscriptstyle" => Style(Style::ScriptScript),
    "scriptsize" => TextMode(TextToken::Size(HtmlTextSize::Size70)),
    "scriptstyle" => Style(Style::Script),
    "searrow" => Relation(symbol::SOUTH_EAST_ARROW),
    "sect" => Letter(SuperChar::from_char(symbol::SECTION_SIGN), Mode::MathOrText),
    "setminus" => BinaryOp(symbol::SET_MINUS),
    "sf" => TransformSwitch(MathVariant::Transform(TextTransform::SansSerif)),
    "sideset" => Sideset,
    "sixptsize" => TextMode(TextToken::Size(HtmlTextSize::Size60)),
    "sharp" => Letter(SuperChar::from_char(symbol::MUSIC_SHARP_SIGN), Mode::Math),
    "sigma" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_SIGMA), Mode::Math),
    "sim" => Relation(symbol::TILDE_OPERATOR),
    "simeq" => Relation(symbol::ASYMPTOTICALLY_EQUAL_TO),
    "slashed" => Overlay(OverlayChar::Solidus),
    "small" => TextMode(TextToken::Size(HtmlTextSize::Size90)),
    "smile" => ForceRelation(symbol::SMILE.as_op()),
    "sout" => TextMode(TextToken::Style(HtmlTextStyle::Strikethrough)),
    "space" => NonBreakingSpace,
    "spades" => Letter(SuperChar::from_char(symbol::BLACK_SPADE_SUIT), Mode::Math),
    "spadesuit" => Letter(SuperChar::from_char(symbol::BLACK_SPADE_SUIT), Mode::Math),
    "sphericalangle" => Letter(SuperChar::from_char(symbol::SPHERICAL_ANGLE), Mode::Math),
    "sqcap" => BinaryOp(symbol::SQUARE_CAP),
    "sqcup" => BinaryOp(symbol::SQUARE_CUP),
    "sqrt" => Sqrt,
    "sqsubset" => Relation(symbol::SQUARE_IMAGE_OF),
    "sqsubseteq" => Relation(symbol::SQUARE_IMAGE_OF_OR_EQUAL_TO),
    "sqsupset" => Relation(symbol::SQUARE_ORIGINAL_OF),
    "sqsupseteq" => Relation(symbol::SQUARE_ORIGINAL_OF_OR_EQUAL_TO),
    "square" => Letter(SuperChar::from_char(symbol::WHITE_SQUARE), Mode::Math),
    "ss" => TextMode(TextToken::Letter('ß')),
    "stackrel" => Overset,
    "star" => ForceBinaryOp(symbol::STAR_OPERATOR.as_op()),
    "stareq" => Relation(symbol::STAR_EQUALS), // from "stix"
    "sub" => Relation(symbol::SUBSET_OF),
    "sube" => Relation(symbol::SUBSET_OF_OR_EQUAL_TO),
    "subset" => Relation(symbol::SUBSET_OF),
    "subseteq" => Relation(symbol::SUBSET_OF_OR_EQUAL_TO),
    "subseteqq" => Relation(symbol::SUBSET_OF_ABOVE_EQUALS_SIGN),
    "subsetneq" => Relation(symbol::SUBSET_OF_WITH_NOT_EQUAL_TO),
    "subsetneqq" => Relation(symbol::SUBSET_OF_ABOVE_NOT_EQUAL_TO),
    "succ" => Relation(symbol::SUCCEEDS),
    "succapprox" => Relation(symbol::SUCCEEDS_ABOVE_ALMOST_EQUAL_TO),
    "succcurlyeq" => Relation(symbol::SUCCEEDS_OR_EQUAL_TO),
    "succeq" => Relation(symbol::SUCCEEDS_ABOVE_SINGLE_LINE_EQUALS_SIGN),
    "succnapprox" => Relation(symbol::SUCCEEDS_ABOVE_NOT_ALMOST_EQUAL_TO),
    "succneqq" => Relation(symbol::SUCCEEDS_ABOVE_NOT_EQUAL_TO),
    "succnsim" => Relation(symbol::SUCCEEDS_BUT_NOT_EQUIVALENT_TO),
    "succsim" => Relation(symbol::SUCCEEDS_OR_EQUIVALENT_TO),
    "sum" => Op(symbol::N_ARY_SUMMATION),
    "sumint" => Op(symbol::SUMMATION_WITH_INTEGRAL),
    "sup" => PseudoOperatorLimits("sup"),
    "supe" => Relation(symbol::SUPERSET_OF_OR_EQUAL_TO),
    "supset" => Relation(symbol::SUPERSET_OF),
    "supseteq" => Relation(symbol::SUPERSET_OF_OR_EQUAL_TO),
    "supseteqq" => Relation(symbol::SUPERSET_OF_ABOVE_EQUALS_SIGN),
    "supsetneq" => Relation(symbol::SUPERSET_OF_WITH_NOT_EQUAL_TO),
    "supsetneqq" => Relation(symbol::SUPERSET_OF_ABOVE_NOT_EQUAL_TO),
    "surd" => CustomCmd(0, &predefined::SURD),
    "swarrow" => Relation(symbol::SOUTH_WEST_ARROW),
    "symbf" => Transform(MathVariant::Transform(TextTransform::BoldItalic)),
    "tag" => Tag,
    "tau" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_TAU), Mode::Math),
    "tbinom" => Binom(Some(FracAttr::DisplayStyleFalse)),
    "text" => Text(None),
    "textasciicircum" => TextMode(TextToken::Letter('ˆ')),
    "textbackslash" => TextMode(TextToken::Letter('\\')),
    "textbar" => TextMode(TextToken::Letter('|')),
    "textbardbl" => TextMode(TextToken::Letter('')),
    "textbf" => Text(Some(HtmlTextStyle::Bold)),
    "textbraceleft" => TextMode(TextToken::Letter('{')),
    "textbraceright" => TextMode(TextToken::Letter('}')),
    "textdagger" => TextMode(TextToken::Letter(symbol::DAGGER)),
    "textdaggerdbl" => TextMode(TextToken::Letter(symbol::DOUBLE_DAGGER)),
    "textdegree" => TextMode(TextToken::Letter(symbol::DEGREE_SIGN)),
    "textdollar" => TextMode(TextToken::Letter(symbol::DOLLAR_SIGN)),
    "textellipsis" => TextMode(TextToken::Letter(symbol::HORIZONTAL_ELLIPSIS)),
    "textemdash" => TextMode(TextToken::Letter('')),
    "textendash" => TextMode(TextToken::Letter('')),
    "textgreater" => TextMode(TextToken::Letter('>')),
    "textit" => Text(Some(HtmlTextStyle::Italic)),
    "textless" => TextMode(TextToken::Letter('<')),
    "textquotedblleft" => TextMode(TextToken::Letter('')),
    "textquotedblright" => TextMode(TextToken::Letter(symbol::RIGHT_DOUBLE_QUOTATION_MARK)),
    "textquoteleft" => TextMode(TextToken::Letter(symbol::LEFT_SINGLE_QUOTATION_MARK)),
    "textquoteright" => TextMode(TextToken::Letter(symbol::RIGHT_SINGLE_QUOTATION_MARK)),
    "textregistered" => TextMode(TextToken::Letter('®')),
    "textrm" => Text(Some(HtmlTextStyle::Serif)),
    "textsc" => Text(Some(HtmlTextStyle::SmallCaps)),
    "textsf" => Text(Some(HtmlTextStyle::SansSerif)),
    "textsterling" => TextMode(TextToken::Letter(symbol::POUND_SIGN)),
    "textstyle" => Style(Style::Text),
    "texttt" => Text(Some(HtmlTextStyle::Typewriter)),
    "textunderscore" => TextMode(TextToken::Letter('_')),
    "textyen" => TextMode(TextToken::Letter(symbol::YEN_SIGN)),
    "tfrac" => Frac(Some(FracAttr::DisplayStyleFalse)),
    "therefore" => ForceRelation(symbol::THEREFORE.as_op()),
    "theta" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_THETA), Mode::Math),
    "thetasym" => Letter(SuperChar::from_char(symbol::GREEK_THETA_SYMBOL), Mode::Math),
    "thickspace" => Space(LatexUnit::Mu.length_with_unit(5.0)),
    "thinspace" => Space(LatexUnit::Mu.length_with_unit(3.0)),
    "tilde" => Accent(symbol::SMALL_TILDE, true, OpAttrs::STRETCHY_FALSE),
    "times" => ForceBinaryOp(symbol::MULTIPLICATION_SIGN.as_op()),
    "tiny" => TextMode(TextToken::Size(HtmlTextSize::Size50)),
    "to" => Relation(symbol::RIGHTWARDS_ARROW),
    "top" => Letter(SuperChar::from_char(symbol::DOWN_TACK), Mode::Math),
    "triangle" => Letter(symbol::WHITE_UP_POINTING_TRIANGLE.as_superchar(), Mode::Math),
    "triangledown" => Letter(symbol::WHITE_DOWN_POINTING_TRIANGLE.as_superchar(), Mode::Math),
    "triangleleft" => ForceBinaryOp(symbol::WHITE_LEFT_POINTING_TRIANGLE),
    "trianglelefteq" => Relation(symbol::NORMAL_SUBGROUP_OF_OR_EQUAL_TO),
    "triangleq" => Relation(symbol::DELTA_EQUAL_TO),
    "triangleright" => ForceBinaryOp(symbol::WHITE_RIGHT_POINTING_TRIANGLE),
    "trianglerighteq" => Relation(symbol::CONTAINS_AS_NORMAL_SUBGROUP_OR_EQUAL_TO),
    "tt" => TransformSwitch(MathVariant::Transform(TextTransform::Monospace)),
    "twoheadleftarrow" => Relation(symbol::LEFTWARDS_TWO_HEADED_ARROW),
    "twoheadrightarrow" => Relation(symbol::RIGHTWARDS_TWO_HEADED_ARROW),
    "u" => TextMode(TextToken::Accent(symbol::COMBINING_BREVE)),
    "uArr" => Relation(symbol::UPWARDS_DOUBLE_ARROW),
    "uarr" => Relation(symbol::UPWARDS_ARROW),
    "ulcorner" => ForceOpen(symbol::TOP_LEFT_CORNER, ForceStretchy::Pretend),
    "underbrace" => OverUnderBrace(symbol::BOTTOM_CURLY_BRACKET, false),
    "underbracket" => OverUnderBrace(symbol::BOTTOM_SQUARE_BRACKET, false),
    "underline" => Accent(symbol::COMBINING_LOW_LINE, false, OpAttrs::STRETCHY_TRUE),
    "underparen" => OverUnderBrace(symbol::BOTTOM_PARENTHESIS, false),
    "underset" => Underset,
    "unlhd" => Relation(symbol::NORMAL_SUBGROUP_OF_OR_EQUAL_TO),
    "unrhd" => Relation(symbol::CONTAINS_AS_NORMAL_SUBGROUP_OR_EQUAL_TO),
    "uparrow" => Relation(symbol::UPWARDS_ARROW),
    "updownarrow" => Relation(symbol::UP_DOWN_ARROW),
    "upharpoonleft" => Relation(symbol::UPWARDS_HARPOON_WITH_BARB_LEFTWARDS),
    "upharpoonright" => Relation(symbol::UPWARDS_HARPOON_WITH_BARB_RIGHTWARDS),
    "uplus" => BinaryOp(symbol::MULTISET_UNION),
    "upsilon" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_UPSILON), Mode::Math),
    "upuparrows" => Relation(symbol::UPWARDS_PAIRED_ARROWS),
    "urcorner" => ForceClose(symbol::TOP_RIGHT_CORNER, ForceStretchy::Pretend),
    "v" => TextMode(TextToken::Accent(symbol::COMBINING_CARON)),
    "vDash" => Relation(symbol::TRUE),
    "varDelta" => Letter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_DELTA), Mode::Math), // italicized
    "varGamma" => Letter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_GAMMA), Mode::Math), // italicized
    "varLambda" => Letter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_LAMBDA), Mode::Math), // italicized
    "varOmega" => Letter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_OMEGA), Mode::Math), // italicized
    "varPhi" => Letter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_PHI), Mode::Math), // italicized
    "varPi" => Letter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_PI), Mode::Math), // italicized
    "varPsi" => Letter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_PSI), Mode::Math), // italicized
    "varSigma" => Letter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_SIGMA), Mode::Math), // italicized
    "varTheta" => Letter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_THETA), Mode::Math), // italicized
    "varUpsilon" => Letter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_UPSILON), Mode::Math), // italicized
    "varXi" => Letter(SuperChar::from_char(symbol::GREEK_CAPITAL_LETTER_XI), Mode::Math), // italicized
    "varepsilon" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_EPSILON), Mode::Math),
    "varkappa" => Letter(SuperChar::from_char(symbol::GREEK_KAPPA_SYMBOL), Mode::Math),
    "varnothing" => Letter(SuperChar::from_char(symbol::EMPTY_SET), Mode::Math),
    "varointclockwise" => Op(symbol::CLOCKWISE_CONTOUR_INTEGRAL),
    "varphi" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_PHI), Mode::Math),
    "varpi" => Letter(SuperChar::from_char(symbol::GREEK_PI_SYMBOL), Mode::Math),
    "varrho" => Letter(SuperChar::from_char(symbol::GREEK_RHO_SYMBOL), Mode::Math),
    "varsigma" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_FINAL_SIGMA), Mode::Math),
    "varsubsetneq" => Relation(symbol::SUBSET_OF_WITH_NOT_EQUAL_TO_WITH_STROKE_THROUGH_BOTTOM_MEMBERS),
    "varsubsetneqq" => Relation(symbol::SUBSET_OF_ABOVE_NOT_EQUAL_TO_WITH_STROKE_THROUGH_BOTTOM_MEMBERS),
    "varsupsetneq" => Relation(symbol::SUPERSET_OF_WITH_NOT_EQUAL_TO_WITH_STROKE_THROUGH_BOTTOM_MEMBERS),
    "varsupsetneqq" => Relation(symbol::SUPERSET_OF_ABOVE_NOT_EQUAL_TO_WITH_STROKE_THROUGH_BOTTOM_MEMBERS),
    "vartheta" => Letter(SuperChar::from_char(symbol::GREEK_THETA_SYMBOL), Mode::Math),
    "vartriangle" => ForceRelation(symbol::WHITE_UP_POINTING_TRIANGLE),
    "vartriangleleft" => Relation(symbol::NORMAL_SUBGROUP_OF),
    "vartriangleright" => Relation(symbol::CONTAINS_AS_NORMAL_SUBGROUP),
    "vcentcolon" => ForceRelation(symbol::RATIO.as_op()),
    "vdash" => Relation(symbol::RIGHT_TACK),
    "vdots" => Relation(symbol::VERTICAL_ELLIPSIS),
    "vec" => Accent(symbol::COMBINING_RIGHT_ARROW_ABOVE, true, OpAttrs::STRETCHY_FALSE),
    "vee" => BinaryOp(symbol::LOGICAL_OR),
    "veebar" => BinaryOp(symbol::XOR),
    "veeeq" => Relation(symbol::EQUIANGULAR_TO), // from "stix"
    "vert" => Ord(symbol::VERTICAL_LINE),
    "vertoverlay" => Overlay(OverlayChar::VerticalLine),
    "vphantom" => Phantom(PhantomKind::V),
    "wedge" => BinaryOp(symbol::LOGICAL_AND),
    "wedgeq" => Relation(symbol::ESTIMATES), // from "stix"
    "weierp" => Letter(SuperChar::from_char(symbol::SCRIPT_CAPITAL_P), Mode::Math),
    "widehat" => Accent(symbol::COMBINING_CIRCUMFLEX_ACCENT, true, OpAttrs::STRETCHY_TRUE),
    "wp" => Letter(SuperChar::from_char(symbol::SCRIPT_CAPITAL_P), Mode::Math),
    "wr" => ForceBinaryOp(symbol::WREATH_PRODUCT.as_op()),
    "xLeftarrow" => XArrow(symbol::LEFTWARDS_DOUBLE_ARROW),
    "xLeftrightarrow" => XArrow(symbol::LEFT_RIGHT_DOUBLE_ARROW),
    "xRightarrow" => XArrow(symbol::RIGHTWARDS_DOUBLE_ARROW),
    "xcancel" => Enclose(Notation::UP_DIAGONAL.union(Notation::DOWN_DIAGONAL)),
    "xhookleftarrow" => XArrow(symbol::LEFTWARDS_ARROW_WITH_HOOK),
    "xhookrightarrow" => XArrow(symbol::RIGHTWARDS_ARROW_WITH_HOOK),
    "xi" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_XI), Mode::Math),
    "xleftarrow" => XArrow(symbol::LEFTWARDS_ARROW),
    "xleftharpoondown" => XArrow(symbol::LEFTWARDS_HARPOON_WITH_BARB_DOWNWARDS),
    "xleftharpoonup" => XArrow(symbol::LEFTWARDS_HARPOON_WITH_BARB_UPWARDS),
    "xleftrightarrow" => XArrow(symbol::LEFT_RIGHT_ARROW),
    "xleftrightharpoons" => XArrow(symbol::LEFTWARDS_HARPOON_OVER_RIGHTWARDS_HARPOON),
    "xlongequal" => XArrow(symbol::EQUALS_SIGN),
    "xmapsto" => XArrow(symbol::RIGHTWARDS_ARROW_FROM_BAR),
    "xrightarrow" => XArrow(symbol::RIGHTWARDS_ARROW),
    "xrightharpoondown" => XArrow(symbol::RIGHTWARDS_HARPOON_WITH_BARB_DOWNWARDS),
    "xrightharpoonup" => XArrow(symbol::RIGHTWARDS_HARPOON_WITH_BARB_UPWARDS),
    "xrightleftharpoons" => XArrow(symbol::RIGHTWARDS_HARPOON_OVER_LEFTWARDS_HARPOON),
    "xtofrom" => XArrow(symbol::RIGHTWARDS_ARROW_OVER_LEFTWARDS_ARROW),
    "xtwoheadleftarrow" => XArrow(symbol::LEFTWARDS_TWO_HEADED_ARROW),
    "xtwoheadrightarrow" => XArrow(symbol::RIGHTWARDS_TWO_HEADED_ARROW),
    "yen" => Letter(SuperChar::from_char(symbol::YEN_SIGN), Mode::MathOrText),
    "zeta" => Letter(SuperChar::from_char(symbol::GREEK_SMALL_LETTER_ZETA), Mode::Math),
    "{" => MathOrTextMode(&Open(symbol::LEFT_CURLY_BRACKET), '{'),
    "|" => Ord(symbol::DOUBLE_VERTICAL_LINE),
    "}" => MathOrTextMode(&Close(symbol::RIGHT_CURLY_BRACKET), '}'),
    "~" => TextMode(TextToken::Accent(symbol::COMBINING_TILDE)),
};

pub fn get_command(command: &str) -> Option<Token<'static>> {
    if let Some(token) = COMMANDS.get(command) {
        Some(*token)
    } else {
        if let Some(function) = FUNCTIONS.get_key(command) {
            return Some(PseudoOperator(function));
        }
        None
    }
}

// ASCII operators are inlined into `fn next_token_internal`
// <https://mirrors.ctan.org/macros/unicodetex/latex/unicode-math/unimath-symbols.pdf>
// See also <https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp?a=\p{Math_Class≠None}&g=Math_Class>
static UNICODE_OPERATORS: phf::Map<char, Token> = phf::phf_map! {
    // `\mathopen`
    // '√'
    // '∛'
    // '∜'
    '' => Open(symbol::LEFT_CEILING),
    '' => Open(symbol::LEFT_FLOOR),
    '' => ForceOpen(symbol::TOP_LEFT_CORNER, ForceStretchy::Pretend),
    '' => ForceOpen(symbol::BOTTOM_LEFT_CORNER, ForceStretchy::Pretend),
    '' => ForceOpen(symbol::UPPER_LEFT_OR_LOWER_RIGHT_CURLY_BRACKET_SECTION, ForceStretchy::Yes),
    '' => Open(symbol::LIGHT_LEFT_TORTOISE_SHELL_BRACKET_ORNAMENT),
    '' => ForceOpen(symbol::LEFT_S_SHAPED_BAG_DELIMITER, ForceStretchy::Yes),
    // '⟌'
    '' => Open(symbol::MATHEMATICAL_LEFT_WHITE_SQUARE_BRACKET),
    '' => Open(symbol::MATHEMATICAL_LEFT_ANGLE_BRACKET),
    '' => Open(symbol::MATHEMATICAL_LEFT_DOUBLE_ANGLE_BRACKET),
    '' => Open(symbol::MATHEMATICAL_LEFT_WHITE_TORTOISE_SHELL_BRACKET),
    '' => Open(symbol::MATHEMATICAL_LEFT_FLATTENED_PARENTHESIS),
    '' => Open(symbol::LEFT_WHITE_CURLY_BRACKET),
    '' => Open(symbol::LEFT_WHITE_PARENTHESIS),
    '' => Open(symbol::Z_NOTATION_LEFT_IMAGE_BRACKET),
    '' => Open(symbol::Z_NOTATION_LEFT_BINDING_BRACKET),
    '' => Open(symbol::LEFT_SQUARE_BRACKET_WITH_UNDERBAR),
    '' => Open(symbol::LEFT_SQUARE_BRACKET_WITH_TICK_IN_TOP_CORNER),
    '' => Open(symbol::LEFT_SQUARE_BRACKET_WITH_TICK_IN_BOTTOM_CORNER),
    '' => Open(symbol::LEFT_ANGLE_BRACKET_WITH_DOT),
    '' => Open(symbol::LEFT_ARC_LESS_THAN_BRACKET),
    '' => Open(symbol::DOUBLE_LEFT_ARC_GREATER_THAN_BRACKET),
    '' => Open(symbol::LEFT_BLACK_TORTOISE_SHELL_BRACKET),
    '' => Open(symbol::LEFT_WIGGLY_FENCE),
    '' => Open(symbol::LEFT_DOUBLE_WIGGLY_FENCE),
    '' => Open(symbol::LEFT_POINTING_CURVED_ANGLE_BRACKET),

    // `\mathclose`
    '' => Close(symbol::RIGHT_CEILING),
    '' => Close(symbol::RIGHT_FLOOR),
    '' => ForceClose(symbol::TOP_RIGHT_CORNER, ForceStretchy::Pretend),
    '' => ForceClose(symbol::BOTTOM_RIGHT_CORNER, ForceStretchy::Pretend),
    '' => ForceClose(symbol::UPPER_RIGHT_OR_LOWER_LEFT_CURLY_BRACKET_SECTION, ForceStretchy::Yes),
    '' => Close(symbol::LIGHT_RIGHT_TORTOISE_SHELL_BRACKET_ORNAMENT),
    '' => ForceClose(symbol::RIGHT_S_SHAPED_BAG_DELIMITER, ForceStretchy::Yes),
    '' => Close(symbol::MATHEMATICAL_RIGHT_WHITE_SQUARE_BRACKET),
    '' => Close(symbol::MATHEMATICAL_RIGHT_ANGLE_BRACKET),
    '' => Close(symbol::MATHEMATICAL_RIGHT_DOUBLE_ANGLE_BRACKET),
    '' => Close(symbol::MATHEMATICAL_RIGHT_WHITE_TORTOISE_SHELL_BRACKET),
    '' => Close(symbol::MATHEMATICAL_RIGHT_FLATTENED_PARENTHESIS),
    '' => Close(symbol::RIGHT_WHITE_CURLY_BRACKET),
    '' => Close(symbol::RIGHT_WHITE_PARENTHESIS),
    '' => Close(symbol::Z_NOTATION_RIGHT_IMAGE_BRACKET),
    '' => Close(symbol::Z_NOTATION_RIGHT_BINDING_BRACKET),
    '' => Close(symbol::RIGHT_SQUARE_BRACKET_WITH_UNDERBAR),
    '' => Close(symbol::RIGHT_SQUARE_BRACKET_WITH_TICK_IN_BOTTOM_CORNER),
    '' => Close(symbol::RIGHT_SQUARE_BRACKET_WITH_TICK_IN_TOP_CORNER),
    '' => Close(symbol::RIGHT_ANGLE_BRACKET_WITH_DOT),
    '' => Close(symbol::RIGHT_ARC_GREATER_THAN_BRACKET),
    '' => Close(symbol::DOUBLE_RIGHT_ARC_LESS_THAN_BRACKET),
    '' => Close(symbol::RIGHT_BLACK_TORTOISE_SHELL_BRACKET),
    '' => Close(symbol::RIGHT_WIGGLY_FENCE),
    '' => Close(symbol::RIGHT_DOUBLE_WIGGLY_FENCE),
    '' => Close(symbol::RIGHT_POINTING_CURVED_ANGLE_BRACKET),

    // `\mathfence`
    '|' => Ord(symbol::VERTICAL_LINE),
    '' => Ord(symbol::DOUBLE_VERTICAL_LINE),
    '' => Ord(symbol::TRIPLE_VERTICAL_BAR_DELIMITER),

    // `\mathop`
    '' => ForceLargeOp(symbol::DOUBLE_STRUCK_N_ARY_SUMMATION),
    '' => Op(symbol::N_ARY_PRODUCT),
    '' => Op(symbol::N_ARY_COPRODUCT),
    '' => Op(symbol::N_ARY_SUMMATION),
    '' => Op(symbol::INTEGRAL),
    '' => Op(symbol::DOUBLE_INTEGRAL),
    '' => Op(symbol::TRIPLE_INTEGRAL),
    '' => Op(symbol::CONTOUR_INTEGRAL),
    '' => Op(symbol::SURFACE_INTEGRAL),
    '' => Op(symbol::VOLUME_INTEGRAL),
    '' => Op(symbol::CLOCKWISE_INTEGRAL),
    '' => Op(symbol::CLOCKWISE_CONTOUR_INTEGRAL),
    '' => Op(symbol::ANTICLOCKWISE_CONTOUR_INTEGRAL),
    '' => Op(symbol::N_ARY_LOGICAL_AND),
    '' => Op(symbol::N_ARY_LOGICAL_OR),
    '' => Op(symbol::N_ARY_INTERSECTION),
    '' => Op(symbol::N_ARY_UNION),
    '' => ForceLargeOp(symbol::LEFT_OUTER_JOIN),
    '' => ForceLargeOp(symbol::RIGHT_OUTER_JOIN),
    '' => ForceLargeOp(symbol::FULL_OUTER_JOIN),
    '' => ForceLargeOp(symbol::LARGE_UP_TACK),
    '' => ForceLargeOp(symbol::LARGE_DOWN_TACK),
    '' => ForceLargeOp(symbol::BIG_SOLIDUS.as_op()),
    '' => ForceLargeOp(symbol::BIG_REVERSE_SOLIDUS.as_op()),
    '' => Op(symbol::N_ARY_CIRCLED_DOT_OPERATOR),
    '' => Op(symbol::N_ARY_CIRCLED_PLUS_OPERATOR),
    '' => Op(symbol::N_ARY_CIRCLED_TIMES_OPERATOR),
    '' => Op(symbol::N_ARY_UNION_OPERATOR_WITH_DOT),
    '' => Op(symbol::N_ARY_UNION_OPERATOR_WITH_PLUS),
    '' => Op(symbol::N_ARY_SQUARE_INTERSECTION_OPERATOR),
    '' => Op(symbol::N_ARY_SQUARE_UNION_OPERATOR),
    '' => Op(symbol::TWO_LOGICAL_AND_OPERATOR),
    '' => Op(symbol::TWO_LOGICAL_OR_OPERATOR),
    '' => Op(symbol::N_ARY_TIMES_OPERATOR),
    '' => Op(symbol::MODULO_TWO_SUM),
    '' => Op(symbol::SUMMATION_WITH_INTEGRAL),
    '' => Op(symbol::QUADRUPLE_INTEGRAL_OPERATOR),
    '' => Op(symbol::FINITE_PART_INTEGRAL),
    '' => Op(symbol::INTEGRAL_WITH_DOUBLE_STROKE),
    '' => Op(symbol::INTEGRAL_AVERAGE_WITH_SLASH),
    '' => Op(symbol::CIRCULATION_FUNCTION),
    '' => Op(symbol::ANTICLOCKWISE_INTEGRATION),
    '' => Op(symbol::LINE_INTEGRATION_WITH_RECTANGULAR_PATH_AROUND_POLE),
    '' => Op(symbol::LINE_INTEGRATION_WITH_SEMICIRCULAR_PATH_AROUND_POLE),
    '' => Op(symbol::LINE_INTEGRATION_NOT_INCLUDING_THE_POLE),
    '' => Op(symbol::INTEGRAL_AROUND_A_POINT_OPERATOR),
    '' => Op(symbol::QUATERNION_INTEGRAL_OPERATOR),
    '' => Op(symbol::INTEGRAL_WITH_LEFTWARDS_ARROW_WITH_HOOK),
    '' => Op(symbol::INTEGRAL_WITH_TIMES_SIGN),
    '' => Op(symbol::INTEGRAL_WITH_INTERSECTION),
    '' => Op(symbol::INTEGRAL_WITH_UNION),
    '' => Op(symbol::INTEGRAL_WITH_OVERBAR),
    '' => Op(symbol::INTEGRAL_WITH_UNDERBAR),
    '' => ForceLargeOp(symbol::JOIN),
    '' => ForceLargeOp(symbol::LARGE_LEFT_TRIANGLE_OPERATOR),
    // '⨟' => ForceLargeOp(symbol::Z_NOTATION_SCHEMA_COMPOSITION.as_op()),
    // '⨠' => ForceLargeOp(symbol::Z_NOTATION_SCHEMA_PIPING.as_op()),
    // '⨡' => ForceLargeOp(symbol::Z_NOTATION_SCHEMA_PROJECTION.as_op()),
    '' => Op(symbol::LARGE_TRIPLE_VERTICAL_BAR_OPERATOR),
    '⫿' => Op(symbol::N_ARY_WHITE_VERTICAL_BAR),
    // '\u{1EEF0}' => ForceLargeOp(symbol::ARABIC_MATHEMATICAL_OPERATOR_MEEM_WITH_HAH_WITH_TATWEEL),
    // '\u{1EEF1}' => ForceLargeOp(symbol::ARABIC_MATHEMATICAL_OPERATOR_HAH_WITH_DAL),

    // `\mathbin`
    '±' => BinaryOp(symbol::PLUS_MINUS_SIGN),
    '·' => ForcePunctuation(symbol::MIDDLE_DOT.as_op()),
    '×' => ForceBinaryOp(symbol::MULTIPLICATION_SIGN.as_op()),
    '÷' => BinaryOp(symbol::DIVISION_SIGN),
    '' => ForceBinaryOp(MathMLOperator::from_char(symbol::DAGGER)),
    '' => ForceBinaryOp(MathMLOperator::from_char(symbol::DOUBLE_DAGGER)),
    '' => ForceBinaryOp(MathMLOperator::from_char(symbol::BULLET)),
    '' => ForceBinaryOp(symbol::CHARACTER_TIE),
    '' => BinaryOp(symbol::FRACTION_SLASH),
    '' => ForceBinaryOp(symbol::TURNED_AMPERSAND),
    '' => BinaryOp(symbol::MINUS_SIGN),
    '' => BinaryOp(symbol::MINUS_OR_PLUS_SIGN),
    '' => BinaryOp(symbol::DOT_PLUS),
    '' => BinaryOp(symbol::DIVISION_SLASH),
    '' => BinaryOp(symbol::SET_MINUS),
    '' => ForceBinaryOp(symbol::ASTERISK_OPERATOR.as_op()),
    '' => ForceBinaryOp(symbol::RING_OPERATOR.as_op()),
    '' => ForceBinaryOp(symbol::BULLET_OPERATOR.as_op()),
    '' => BinaryOp(symbol::LOGICAL_AND),
    '' => BinaryOp(symbol::LOGICAL_OR),
    '' => BinaryOp(symbol::INTERSECTION),
    '' => BinaryOp(symbol::UNION),
    '' => BinaryOp(symbol::DOT_MINUS),
    '' => ForceBinaryOp(symbol::INVERTED_LAZY_S),
    '' => ForceBinaryOp(symbol::WREATH_PRODUCT.as_op()),
    '' => BinaryOp(symbol::MULTISET),
    '' => BinaryOp(symbol::MULTISET_MULTIPLICATION),
    '' => BinaryOp(symbol::MULTISET_UNION),
    '' => BinaryOp(symbol::SQUARE_CAP),
    '' => BinaryOp(symbol::SQUARE_CUP),
    '' => BinaryOp(symbol::CIRCLED_PLUS),
    '' => BinaryOp(symbol::CIRCLED_MINUS),
    '' => ForceBinaryOp(symbol::CIRCLED_TIMES.as_op()),
    '' => BinaryOp(symbol::CIRCLED_DIVISION_SLASH),
    '' => ForceBinaryOp(symbol::CIRCLED_DOT_OPERATOR.as_op()),
    '' => ForceBinaryOp(symbol::CIRCLED_RING_OPERATOR.as_op()),
    '' => ForceBinaryOp(symbol::CIRCLED_ASTERISK_OPERATOR.as_op()),
    '' => ForceBinaryOp(symbol::CIRCLED_EQUALS.as_op()),
    '' => BinaryOp(symbol::CIRCLED_DASH),
    '' => BinaryOp(symbol::SQUARED_PLUS),
    '' => BinaryOp(symbol::SQUARED_MINUS),
    '' => ForceBinaryOp(symbol::SQUARED_TIMES.as_op()),
    '' => ForceBinaryOp(symbol::SQUARED_DOT_OPERATOR.as_op()),
    '' => ForceBinaryOp(symbol::INTERCALATE.as_op()),
    '' => BinaryOp(symbol::XOR),
    '' => BinaryOp(symbol::NAND),
    '' => BinaryOp(symbol::NOR),
    '' => ForceBinaryOp(symbol::DIAMOND_OPERATOR.as_op()),
    '' => ForceBinaryOp(symbol::DOT_OPERATOR.as_op()),
    '' => ForceBinaryOp(symbol::STAR_OPERATOR.as_op()),
    '' => ForceBinaryOp(symbol::DIVISION_TIMES.as_op()),
    '' => ForceBinaryOp(symbol::LEFT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT.as_op()),
    '' => ForceBinaryOp(symbol::RIGHT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT.as_op()),
    '' => ForceBinaryOp(symbol::LEFT_SEMIDIRECT_PRODUCT.as_op()),
    '' => ForceBinaryOp(symbol::RIGHT_SEMIDIRECT_PRODUCT.as_op()),
    '' => BinaryOp(symbol::CURLY_LOGICAL_OR),
    '' => BinaryOp(symbol::CURLY_LOGICAL_AND),
    '' => BinaryOp(symbol::DOUBLE_INTERSECTION),
    '' => BinaryOp(symbol::DOUBLE_UNION),
    // '⌅' => ForceBinaryOp(symbol::PROJECTIVE.as_op()),
    // '⌆' => ForceBinaryOp(symbol::PERSPECTIVE.as_op()),
    // '⌽' => ForceBinaryOp(symbol::APL_FUNCTIONAL_SYMBOL_CIRCLE_STILE),
    '' => ForceBinaryOp(symbol::WHITE_UP_POINTING_TRIANGLE),
    '' => ForceBinaryOp(symbol::WHITE_RIGHT_POINTING_TRIANGLE),
    '' => ForceBinaryOp(symbol::WHITE_LEFT_POINTING_TRIANGLE),
    '' => ForceBinaryOp(symbol::WHITE_CIRCLE),
    '' => ForceBinaryOp(symbol::WHITE_SQUARE_WITH_VERTICAL_BISECTING_LINE),
    '' => ForceBinaryOp(symbol::OR_WITH_DOT_INSIDE),
    '' => ForceBinaryOp(symbol::AND_WITH_DOT),
    // '⟠'
    // '⟡'
    // '⟢'
    // '⟣'
    // '⟤'
    // '⟥'
    '' => ForceBinaryOp(symbol::CIRCLE_WITH_HORIZONTAL_BAR),
    '' => ForceBinaryOp(symbol::CIRCLED_VERTICAL_BAR.as_op()),
    '' => ForceBinaryOp(symbol::CIRCLED_PARALLEL.as_op()),
    '' => ForceBinaryOp(symbol::CIRCLED_REVERSE_SOLIDUS.as_op()),
    '' => ForceBinaryOp(symbol::CIRCLED_PERPENDICULAR.as_op()),
    '' => ForceBinaryOp(symbol::CIRCLED_LESS_THAN.as_op()),
    '' => ForceBinaryOp(symbol::CIRCLED_GREATER_THAN.as_op()),
    '' => BinaryOp(symbol::SQUARED_RISING_DIAGONAL_SLASH),
    '' => BinaryOp(symbol::SQUARED_FALLING_DIAGONAL_SLASH),
    '' => ForceBinaryOp(symbol::SQUARED_ASTERISK.as_op()),
    '' => ForceBinaryOp(symbol::SQUARED_SMALL_CIRCLE.as_op()),
    '' => ForceBinaryOp(symbol::SQUARED_SQUARE.as_op()),
    // '⧍'
    // '⧖'
    // '⧗'
    '' => ForceBinaryOp(symbol::SHUFFLE_PRODUCT.as_op()),
    // '⧫'
    '' => BinaryOp(symbol::REVERSE_SOLIDUS_OPERATOR),
    '' => BinaryOp(symbol::SOLIDUS_WITH_OVERBAR),
    '' => BinaryOp(symbol::REVERSE_SOLIDUS_WITH_HORIZONTAL_STROKE),
    '' => BinaryOp(symbol::DOUBLE_PLUS),
    '' => BinaryOp(symbol::TRIPLE_PLUS),
    // '⧾'
    // '⧿'
    '' => BinaryOp(symbol::PLUS_SIGN_WITH_SMALL_CIRCLE_ABOVE),
    '' => BinaryOp(symbol::PLUS_SIGN_WITH_CIRCUMFLEX_ACCENT_ABOVE),
    '' => BinaryOp(symbol::PLUS_SIGN_WITH_TILDE_ABOVE),
    '' => BinaryOp(symbol::PLUS_SIGN_WITH_DOT_BELOW),
    '' => BinaryOp(symbol::PLUS_SIGN_WITH_TILDE_BELOW),
    '' => BinaryOp(symbol::PLUS_SIGN_WITH_SUBSCRIPT_TWO),
    '' => BinaryOp(symbol::PLUS_SIGN_WITH_BLACK_TRIANGLE),
    '' => BinaryOp(symbol::MINUS_SIGN_WITH_COMMA_ABOVE),
    '' => BinaryOp(symbol::MINUS_SIGN_WITH_DOT_BELOW),
    '' => BinaryOp(symbol::MINUS_SIGN_WITH_FALLING_DOTS),
    '' => BinaryOp(symbol::MINUS_SIGN_WITH_RISING_DOTS),
    '' => BinaryOp(symbol::PLUS_SIGN_IN_LEFT_HALF_CIRCLE),
    '' => BinaryOp(symbol::PLUS_SIGN_IN_RIGHT_HALF_CIRCLE),
    '' => ForceBinaryOp(symbol::VECTOR_OR_CROSS_PRODUCT.as_op()),
    '' => ForceBinaryOp(symbol::MULTIPLICATION_SIGN_WITH_DOT_ABOVE.as_op()),
    '' => ForceBinaryOp(symbol::MULTIPLICATION_SIGN_WITH_UNDERBAR.as_op()),
    '' => ForceBinaryOp(symbol::SEMIDIRECT_PRODUCT_WITH_BOTTOM_CLOSED.as_op()),
    '' => ForceBinaryOp(symbol::SMASH_PRODUCT.as_op()),
    '' => ForceBinaryOp(symbol::MULTIPLICATION_SIGN_IN_LEFT_HALF_CIRCLE.as_op()),
    '' => ForceBinaryOp(symbol::MULTIPLICATION_SIGN_IN_RIGHT_HALF_CIRCLE.as_op()),
    '' => ForceBinaryOp(symbol::CIRCLED_MULTIPLICATION_SIGN_WITH_CIRCUMFLEX_ACCENT.as_op()),
    '' => ForceBinaryOp(symbol::MULTIPLICATION_SIGN_IN_DOUBLE_CIRCLE.as_op()),
    '' => BinaryOp(symbol::CIRCLED_DIVISION_SIGN),
    '' => BinaryOp(symbol::PLUS_SIGN_IN_TRIANGLE),
    '' => BinaryOp(symbol::MINUS_SIGN_IN_TRIANGLE),
    '' => ForceBinaryOp(symbol::MULTIPLICATION_SIGN_IN_TRIANGLE.as_op()),
    '' => ForceBinaryOp(symbol::INTERIOR_PRODUCT.as_op()),
    '' => ForceBinaryOp(symbol::RIGHTHAND_INTERIOR_PRODUCT.as_op()),
    '' => BinaryOp(symbol::Z_NOTATION_RELATIONAL_COMPOSITION),
    '⨿' => ForceBinaryOp(symbol::AMALGAMATION_OR_COPRODUCT.as_op()),
    '' => BinaryOp(symbol::INTERSECTION_WITH_DOT),
    '' => BinaryOp(symbol::UNION_WITH_MINUS_SIGN),
    '' => BinaryOp(symbol::UNION_WITH_OVERBAR),
    '' => BinaryOp(symbol::INTERSECTION_WITH_OVERBAR),
    '' => BinaryOp(symbol::INTERSECTION_WITH_LOGICAL_AND),
    '' => BinaryOp(symbol::UNION_WITH_LOGICAL_OR),
    '' => BinaryOp(symbol::UNION_ABOVE_INTERSECTION),
    '' => BinaryOp(symbol::INTERSECTION_ABOVE_UNION),
    '' => BinaryOp(symbol::UNION_ABOVE_BAR_ABOVE_INTERSECTION),
    '' => BinaryOp(symbol::INTERSECTION_ABOVE_BAR_ABOVE_UNION),
    '' => BinaryOp(symbol::UNION_BESIDE_AND_JOINED_WITH_UNION),
    '' => BinaryOp(symbol::INTERSECTION_BESIDE_AND_JOINED_WITH_INTERSECTION),
    '' => BinaryOp(symbol::CLOSED_UNION_WITH_SERIFS),
    '' => BinaryOp(symbol::CLOSED_INTERSECTION_WITH_SERIFS),
    '' => BinaryOp(symbol::DOUBLE_SQUARE_INTERSECTION),
    '' => BinaryOp(symbol::DOUBLE_SQUARE_UNION),
    '' => ForceBinaryOp(symbol::CLOSED_UNION_WITH_SERIFS_AND_SMASH_PRODUCT.as_op()),
    '' => BinaryOp(symbol::LOGICAL_AND_WITH_DOT_ABOVE),
    '' => BinaryOp(symbol::LOGICAL_OR_WITH_DOT_ABOVE),
    '' => BinaryOp(symbol::DOUBLE_LOGICAL_AND),
    '' => BinaryOp(symbol::DOUBLE_LOGICAL_OR),
    '' => BinaryOp(symbol::TWO_INTERSECTING_LOGICAL_AND),
    '' => BinaryOp(symbol::TWO_INTERSECTING_LOGICAL_OR),
    '' => BinaryOp(symbol::SLOPING_LARGE_OR),
    '' => BinaryOp(symbol::SLOPING_LARGE_AND),
    '' => BinaryOp(symbol::LOGICAL_OR_OVERLAPPING_LOGICAL_AND), // `unicode-math` makes this `\mathrel`, but that seems dubious
    '' => BinaryOp(symbol::LOGICAL_AND_WITH_MIDDLE_STEM),
    '' => BinaryOp(symbol::LOGICAL_OR_WITH_MIDDLE_STEM),
    '' => BinaryOp(symbol::LOGICAL_AND_WITH_HORIZONTAL_DASH),
    '' => BinaryOp(symbol::LOGICAL_OR_WITH_HORIZONTAL_DASH),
    '' => BinaryOp(symbol::LOGICAL_AND_WITH_DOUBLE_OVERBAR),
    '' => BinaryOp(symbol::LOGICAL_AND_WITH_UNDERBAR),
    '' => BinaryOp(symbol::LOGICAL_AND_WITH_DOUBLE_UNDERBAR),
    // '⩡' => BinaryOp(symbol::SMALL_VEE_WITH_UNDERBAR),
    '' => BinaryOp(symbol::LOGICAL_OR_WITH_DOUBLE_OVERBAR),
    '' => BinaryOp(symbol::LOGICAL_OR_WITH_DOUBLE_UNDERBAR),
    '' => ForceBinaryOp(symbol::Z_NOTATION_DOMAIN_ANTIRESTRICTION.as_op()),
    '' => ForceBinaryOp(symbol::Z_NOTATION_RANGE_ANTIRESTRICTION.as_op()),
    // '⩱'
    // '⩲'
    // '⫴'
    // '⫵'
    '' => BinaryOp(symbol::TRIPLE_COLON_OPERATOR),
    // '⫻'
    '' => BinaryOp(symbol::DOUBLE_SOLIDUS_OPERATOR),
    '' => ForceBinaryOp(symbol::WHITE_VERTICAL_BAR.as_op()),

    // `\mathord`
    //    '¬' => Ord(symbol::NOT_SIGN),
    //    '' => Ord(symbol::DOUBLE_PRIME),
    '' => Ord(symbol::TRIPLE_PRIME),
    '' => Ord(symbol::REVERSED_PRIME),
    '' => Ord(symbol::REVERSED_DOUBLE_PRIME),
    '' => Ord(symbol::REVERSED_TRIPLE_PRIME),
    //    '' => Ord(symbol::QUADRUPLE_PRIME),
    //    '' => Ord(symbol::FOR_ALL),
    '' => Ord(symbol::COMPLEMENT),
    '' => Ord(symbol::THERE_EXISTS),
    '' => Ord(symbol::THERE_DOES_NOT_EXIST),
    //
    // `\mathrel`
    // '⁐'
    '' => Relation(symbol::LEFTWARDS_ARROW),
    '' => Relation(symbol::UPWARDS_ARROW),
    '' => Relation(symbol::RIGHTWARDS_ARROW),
    '' => Relation(symbol::DOWNWARDS_ARROW),
    '' => Relation(symbol::LEFT_RIGHT_ARROW),
    '' => Relation(symbol::UP_DOWN_ARROW),
    '' => Relation(symbol::NORTH_WEST_ARROW),
    '' => Relation(symbol::NORTH_EAST_ARROW),
    '' => Relation(symbol::SOUTH_EAST_ARROW),
    '' => Relation(symbol::SOUTH_WEST_ARROW),
    '' => Relation(symbol::LEFTWARDS_ARROW_WITH_STROKE),
    '' => Relation(symbol::RIGHTWARDS_ARROW_WITH_STROKE),
    '' => Relation(symbol::LEFTWARDS_WAVE_ARROW),
    '' => Relation(symbol::RIGHTWARDS_WAVE_ARROW),
    '' => Relation(symbol::LEFTWARDS_TWO_HEADED_ARROW),
    '' => Relation(symbol::UPWARDS_TWO_HEADED_ARROW),
    '' => Relation(symbol::RIGHTWARDS_TWO_HEADED_ARROW),
    '' => Relation(symbol::DOWNWARDS_TWO_HEADED_ARROW),
    '' => Relation(symbol::LEFTWARDS_ARROW_WITH_TAIL),
    '' => Relation(symbol::RIGHTWARDS_ARROW_WITH_TAIL),
    '' => Relation(symbol::LEFTWARDS_ARROW_FROM_BAR),
    '' => Relation(symbol::UPWARDS_ARROW_FROM_BAR),
    '' => Relation(symbol::RIGHTWARDS_ARROW_FROM_BAR),
    '' => Relation(symbol::DOWNWARDS_ARROW_FROM_BAR),
    '' => Relation(symbol::LEFTWARDS_ARROW_WITH_HOOK),
    '' => Relation(symbol::RIGHTWARDS_ARROW_WITH_HOOK),
    '' => Relation(symbol::LEFTWARDS_ARROW_WITH_LOOP),
    '' => Relation(symbol::RIGHTWARDS_ARROW_WITH_LOOP),
    '' => Relation(symbol::LEFT_RIGHT_WAVE_ARROW),
    '' => Relation(symbol::LEFT_RIGHT_ARROW_WITH_STROKE),
    '' => Relation(symbol::DOWNWARDS_ZIGZAG_ARROW),
    '' => Relation(symbol::UPWARDS_ARROW_WITH_TIP_LEFTWARDS),
    '' => Relation(symbol::UPWARDS_ARROW_WITH_TIP_RIGHTWARDS),
    '' => Relation(symbol::DOWNWARDS_ARROW_WITH_TIP_LEFTWARDS),
    '' => Relation(symbol::DOWNWARDS_ARROW_WITH_TIP_RIGHTWARDS),
    '' => Relation(symbol::ANTICLOCKWISE_TOP_SEMICIRCLE_ARROW),
    '' => Relation(symbol::CLOCKWISE_TOP_SEMICIRCLE_ARROW),
    '' => Relation(symbol::LEFTWARDS_HARPOON_WITH_BARB_UPWARDS),
    '' => Relation(symbol::LEFTWARDS_HARPOON_WITH_BARB_DOWNWARDS),
    '' => Relation(symbol::UPWARDS_HARPOON_WITH_BARB_RIGHTWARDS),
    '' => Relation(symbol::UPWARDS_HARPOON_WITH_BARB_LEFTWARDS),
    '' => Relation(symbol::RIGHTWARDS_HARPOON_WITH_BARB_UPWARDS),
    '' => Relation(symbol::RIGHTWARDS_HARPOON_WITH_BARB_DOWNWARDS),
    '' => Relation(symbol::DOWNWARDS_HARPOON_WITH_BARB_RIGHTWARDS),
    '' => Relation(symbol::DOWNWARDS_HARPOON_WITH_BARB_LEFTWARDS),
    '' => Relation(symbol::RIGHTWARDS_ARROW_OVER_LEFTWARDS_ARROW),
    '' => Relation(symbol::UPWARDS_ARROW_LEFTWARDS_OF_DOWNWARDS_ARROW),
    '' => Relation(symbol::LEFTWARDS_ARROW_OVER_RIGHTWARDS_ARROW),
    '' => Relation(symbol::LEFTWARDS_PAIRED_ARROWS),
    '' => Relation(symbol::UPWARDS_PAIRED_ARROWS),
    '' => Relation(symbol::RIGHTWARDS_PAIRED_ARROWS),
    '' => Relation(symbol::DOWNWARDS_PAIRED_ARROWS),
    '' => Relation(symbol::LEFTWARDS_HARPOON_OVER_RIGHTWARDS_HARPOON),
    '' => Relation(symbol::RIGHTWARDS_HARPOON_OVER_LEFTWARDS_HARPOON),
    '' => Relation(symbol::LEFTWARDS_DOUBLE_ARROW_WITH_STROKE),
    '' => Relation(symbol::LEFT_RIGHT_DOUBLE_ARROW_WITH_STROKE),
    '' => Relation(symbol::RIGHTWARDS_DOUBLE_ARROW_WITH_STROKE),
    '' => Relation(symbol::LEFTWARDS_DOUBLE_ARROW),
    '' => Relation(symbol::UPWARDS_DOUBLE_ARROW),
    '' => Relation(symbol::RIGHTWARDS_DOUBLE_ARROW),
    '' => Relation(symbol::DOWNWARDS_DOUBLE_ARROW),
    '' => Relation(symbol::LEFT_RIGHT_DOUBLE_ARROW),
    '' => Relation(symbol::UP_DOWN_DOUBLE_ARROW),
    '' => Relation(symbol::NORTH_WEST_DOUBLE_ARROW),
    '' => Relation(symbol::NORTH_EAST_DOUBLE_ARROW),
    '' => Relation(symbol::SOUTH_EAST_DOUBLE_ARROW),
    '' => Relation(symbol::SOUTH_WEST_DOUBLE_ARROW),
    '' => Relation(symbol::LEFTWARDS_TRIPLE_ARROW),
    '' => Relation(symbol::RIGHTWARDS_TRIPLE_ARROW),
    '' => Relation(symbol::LEFTWARDS_SQUIGGLE_ARROW),
    '' => Relation(symbol::RIGHTWARDS_SQUIGGLE_ARROW),
    '' => Relation(symbol::LEFTWARDS_ARROW_TO_BAR),
    '' => Relation(symbol::RIGHTWARDS_ARROW_TO_BAR),
    '' => Relation(symbol::RIGHT_ARROW_WITH_SMALL_CIRCLE),
    '' => Relation(symbol::DOWNWARDS_ARROW_LEFTWARDS_OF_UPWARDS_ARROW),
    '' => Relation(symbol::THREE_RIGHTWARDS_ARROWS),
    '' => Relation(symbol::LEFTWARDS_ARROW_WITH_VERTICAL_STROKE),
    '' => Relation(symbol::RIGHTWARDS_ARROW_WITH_VERTICAL_STROKE),
    '' => Relation(symbol::LEFT_RIGHT_ARROW_WITH_VERTICAL_STROKE),
    '' => Relation(symbol::LEFTWARDS_ARROW_WITH_DOUBLE_VERTICAL_STROKE),
    '' => Relation(symbol::RIGHTWARDS_ARROW_WITH_DOUBLE_VERTICAL_STROKE),
    '' => Relation(symbol::LEFT_RIGHT_ARROW_WITH_DOUBLE_VERTICAL_STROKE),
    '' => Relation(symbol::LEFTWARDS_OPEN_HEADED_ARROW),
    '' => Relation(symbol::RIGHTWARDS_OPEN_HEADED_ARROW),
    '' => Relation(symbol::LEFT_RIGHT_OPEN_HEADED_ARROW),
    '' => Relation(symbol::ELEMENT_OF),
    '' => Relation(symbol::NOT_AN_ELEMENT_OF),
    '' => Relation(symbol::SMALL_ELEMENT_OF),
    '' => Relation(symbol::CONTAINS_AS_MEMBER),
    '' => Relation(symbol::DOES_NOT_CONTAIN_AS_MEMBER),
    '' => Relation(symbol::SMALL_CONTAINS_AS_MEMBER),
    '' => Relation(symbol::PROPORTIONAL_TO),
    '' => Relation(symbol::DIVIDES),
    '' => Relation(symbol::DOES_NOT_DIVIDE),
    '' => Relation(symbol::PARALLEL_TO),
    '' => Relation(symbol::NOT_PARALLEL_TO),
    '' => ForceRelation(symbol::RATIO.as_op()),
    '' => Relation(symbol::PROPORTION),
    '' => Relation(symbol::EXCESS),
    '' => Relation(symbol::GEOMETRIC_PROPORTION),
    '' => Relation(symbol::HOMOTHETIC),
    '' => Relation(symbol::TILDE_OPERATOR),
    '' => Relation(symbol::REVERSED_TILDE),
    '' => Relation(symbol::NOT_TILDE),
    '' => Relation(symbol::MINUS_TILDE),
    '' => Relation(symbol::ASYMPTOTICALLY_EQUAL_TO),
    '' => Relation(symbol::NOT_ASYMPTOTICALLY_EQUAL_TO),
    '' => Relation(symbol::APPROXIMATELY_EQUAL_TO),
    '' => Relation(symbol::APPROXIMATELY_BUT_NOT_ACTUALLY_EQUAL_TO),
    '' => Relation(symbol::NEITHER_APPROXIMATELY_NOR_ACTUALLY_EQUAL_TO),
    '' => Relation(symbol::ALMOST_EQUAL_TO),
    '' => Relation(symbol::NOT_ALMOST_EQUAL_TO),
    '' => Relation(symbol::ALMOST_EQUAL_OR_EQUAL_TO),
    '' => Relation(symbol::TRIPLE_TILDE),
    '' => Relation(symbol::ALL_EQUAL_TO),
    '' => Relation(symbol::EQUIVALENT_TO),
    '' => Relation(symbol::GEOMETRICALLY_EQUIVALENT_TO),
    '' => Relation(symbol::DIFFERENCE_BETWEEN),
    '' => Relation(symbol::APPROACHES_THE_LIMIT),
    '' => Relation(symbol::GEOMETRICALLY_EQUAL_TO),
    '' => Relation(symbol::APPROXIMATELY_EQUAL_TO_OR_THE_IMAGE_OF),
    '' => Relation(symbol::IMAGE_OF_OR_APPROXIMATELY_EQUAL_TO),
    '' => Relation(symbol::COLON_EQUALS),
    '' => Relation(symbol::EQUALS_COLON),
    '' => Relation(symbol::RING_IN_EQUAL_TO),
    '' => Relation(symbol::RING_EQUAL_TO),
    '' => Relation(symbol::CORRESPONDS_TO),
    '' => Relation(symbol::ESTIMATES),
    '' => Relation(symbol::EQUIANGULAR_TO),
    '' => Relation(symbol::STAR_EQUALS),
    '' => Relation(symbol::DELTA_EQUAL_TO),
    '' => Relation(symbol::EQUAL_TO_BY_DEFINITION),
    '' => Relation(symbol::MEASURED_BY),
    '' => Relation(symbol::QUESTIONED_EQUAL_TO),
    '' => Relation(symbol::NOT_EQUAL_TO),
    '' => Relation(symbol::IDENTICAL_TO),
    '' => Relation(symbol::NOT_IDENTICAL_TO),
    '' => Relation(symbol::STRICTLY_EQUIVALENT_TO),
    '' => Relation(symbol::LESS_THAN_OR_EQUAL_TO),
    '' => Relation(symbol::GREATER_THAN_OR_EQUAL_TO),
    '' => Relation(symbol::LESS_THAN_OVER_EQUAL_TO),
    '' => Relation(symbol::GREATER_THAN_OVER_EQUAL_TO),
    '' => Relation(symbol::LESS_THAN_BUT_NOT_EQUAL_TO),
    '' => Relation(symbol::GREATER_THAN_BUT_NOT_EQUAL_TO),
    '' => Relation(symbol::MUCH_LESS_THAN),
    '' => Relation(symbol::MUCH_GREATER_THAN),
    '' => Relation(symbol::BETWEEN),
    '' => Relation(symbol::NOT_EQUIVALENT_TO),
    '' => Relation(symbol::NOT_LESS_THAN),
    '' => Relation(symbol::NOT_GREATER_THAN),
    '' => Relation(symbol::NEITHER_LESS_THAN_NOR_EQUAL_TO),
    '' => Relation(symbol::NEITHER_GREATER_THAN_NOR_EQUAL_TO),
    '' => Relation(symbol::LESS_THAN_OR_EQUIVALENT_TO),
    '' => Relation(symbol::GREATER_THAN_OR_EQUIVALENT_TO),
    '' => Relation(symbol::NEITHER_LESS_THAN_NOR_EQUIVALENT_TO),
    '' => Relation(symbol::NEITHER_GREATER_THAN_NOR_EQUIVALENT_TO),
    '' => Relation(symbol::LESS_THAN_OR_GREATER_THAN),
    '' => Relation(symbol::GREATER_THAN_OR_LESS_THAN),
    '' => Relation(symbol::NEITHER_LESS_THAN_NOR_GREATER_THAN),
    '' => Relation(symbol::NEITHER_GREATER_THAN_NOR_LESS_THAN),
    '' => Relation(symbol::PRECEDES),
    '' => Relation(symbol::SUCCEEDS),
    '' => Relation(symbol::PRECEDES_OR_EQUAL_TO),
    '' => Relation(symbol::SUCCEEDS_OR_EQUAL_TO),
    '' => Relation(symbol::PRECEDES_OR_EQUIVALENT_TO),
    '' => Relation(symbol::SUCCEEDS_OR_EQUIVALENT_TO),
    '' => Relation(symbol::DOES_NOT_PRECEDE),
    '' => Relation(symbol::DOES_NOT_SUCCEED),
    '' => Relation(symbol::SUBSET_OF),
    '' => Relation(symbol::SUPERSET_OF),
    '' => Relation(symbol::NOT_A_SUBSET_OF),
    '' => Relation(symbol::NOT_A_SUPERSET_OF),
    '' => Relation(symbol::SUBSET_OF_OR_EQUAL_TO),
    '' => Relation(symbol::SUPERSET_OF_OR_EQUAL_TO),
    '' => Relation(symbol::NEITHER_A_SUBSET_OF_NOR_EQUAL_TO),
    '' => Relation(symbol::NEITHER_A_SUPERSET_OF_NOR_EQUAL_TO),
    '' => Relation(symbol::SUBSET_OF_WITH_NOT_EQUAL_TO),
    '' => Relation(symbol::SUPERSET_OF_WITH_NOT_EQUAL_TO),
    '' => Relation(symbol::SQUARE_IMAGE_OF),
    '' => Relation(symbol::SQUARE_ORIGINAL_OF),
    '' => Relation(symbol::SQUARE_IMAGE_OF_OR_EQUAL_TO),
    '' => Relation(symbol::SQUARE_ORIGINAL_OF_OR_EQUAL_TO),
    '' => Relation(symbol::RIGHT_TACK),
    '' => Relation(symbol::LEFT_TACK),
    '' => Relation(symbol::ASSERTION),
    '' => Relation(symbol::MODELS),
    '' => Relation(symbol::TRUE),
    '' => Relation(symbol::FORCES),
    '' => Relation(symbol::TRIPLE_VERTICAL_BAR_RIGHT_TURNSTILE),
    '' => Relation(symbol::DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE),
    '' => Relation(symbol::DOES_NOT_PROVE),
    '' => Relation(symbol::NOT_TRUE),
    '' => Relation(symbol::DOES_NOT_FORCE),
    '' => Relation(symbol::NEGATED_DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE),
    '' => Relation(symbol::PRECEDES_UNDER_RELATION),
    '' => Relation(symbol::SUCCEEDS_UNDER_RELATION),
    '' => Relation(symbol::NORMAL_SUBGROUP_OF),
    '' => Relation(symbol::CONTAINS_AS_NORMAL_SUBGROUP),
    '' => Relation(symbol::NORMAL_SUBGROUP_OF_OR_EQUAL_TO),
    '' => Relation(symbol::CONTAINS_AS_NORMAL_SUBGROUP_OR_EQUAL_TO),
    '' => Relation(symbol::ORIGINAL_OF),
    '' => Relation(symbol::IMAGE_OF),
    '' => Relation(symbol::MULTIMAP),
    '' => Relation(symbol::BOWTIE),
    '' => Relation(symbol::REVERSED_TILDE_EQUALS),
    '' => Relation(symbol::DOUBLE_SUBSET),
    '' => Relation(symbol::DOUBLE_SUPERSET),
    '' => Relation(symbol::PITCHFORK),
    '' => Relation(symbol::EQUAL_AND_PARALLEL_TO),
    '' => Relation(symbol::LESS_THAN_WITH_DOT),
    '' => Relation(symbol::GREATER_THAN_WITH_DOT),
    '' => Relation(symbol::VERY_MUCH_LESS_THAN),
    '' => Relation(symbol::VERY_MUCH_GREATER_THAN),
    '' => Relation(symbol::LESS_THAN_EQUAL_TO_OR_GREATER_THAN),
    '' => Relation(symbol::GREATER_THAN_EQUAL_TO_OR_LESS_THAN),
    '' => Relation(symbol::EQUAL_TO_OR_LESS_THAN),
    '' => Relation(symbol::EQUAL_TO_OR_GREATER_THAN),
    '' => Relation(symbol::EQUAL_TO_OR_PRECEDES),
    '' => Relation(symbol::EQUAL_TO_OR_SUCCEEDS),
    '' => Relation(symbol::DOES_NOT_PRECEDE_OR_EQUAL),
    '' => Relation(symbol::DOES_NOT_SUCCEED_OR_EQUAL),
    '' => Relation(symbol::NOT_SQUARE_IMAGE_OF_OR_EQUAL_TO),
    '' => Relation(symbol::NOT_SQUARE_ORIGINAL_OF_OR_EQUAL_TO),
    '' => Relation(symbol::SQUARE_IMAGE_OF_OR_NOT_EQUAL_TO),
    '' => Relation(symbol::SQUARE_ORIGINAL_OF_OR_NOT_EQUAL_TO),
    '' => Relation(symbol::LESS_THAN_BUT_NOT_EQUIVALENT_TO),
    '' => Relation(symbol::GREATER_THAN_BUT_NOT_EQUIVALENT_TO),
    '' => Relation(symbol::PRECEDES_BUT_NOT_EQUIVALENT_TO),
    '' => Relation(symbol::SUCCEEDS_BUT_NOT_EQUIVALENT_TO),
    '' => Relation(symbol::NOT_NORMAL_SUBGROUP_OF),
    '' => Relation(symbol::DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP),
    '' => Relation(symbol::NOT_NORMAL_SUBGROUP_OF_OR_EQUAL_TO),
    '' => Relation(symbol::DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP_OR_EQUAL),
    '' => Relation(symbol::VERTICAL_ELLIPSIS),
    '' => Relation(symbol::UP_RIGHT_DIAGONAL_ELLIPSIS),
    '' => Relation(symbol::DOWN_RIGHT_DIAGONAL_ELLIPSIS),
    '' => Relation(symbol::ELEMENT_OF_WITH_LONG_HORIZONTAL_STROKE),
    '' => Relation(symbol::ELEMENT_OF_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE),
    '' => Relation(symbol::SMALL_ELEMENT_OF_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE),
    '' => Relation(symbol::ELEMENT_OF_WITH_DOT_ABOVE),
    '' => Relation(symbol::ELEMENT_OF_WITH_OVERBAR),
    '' => Relation(symbol::SMALL_ELEMENT_OF_WITH_OVERBAR),
    '' => Relation(symbol::ELEMENT_OF_WITH_UNDERBAR),
    '' => Relation(symbol::ELEMENT_OF_WITH_TWO_HORIZONTAL_STROKES),
    '' => Relation(symbol::CONTAINS_WITH_LONG_HORIZONTAL_STROKE),
    '' => Relation(symbol::CONTAINS_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE),
    '' => Relation(symbol::SMALL_CONTAINS_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE),
    '' => Relation(symbol::CONTAINS_WITH_OVERBAR),
    '' => Relation(symbol::SMALL_CONTAINS_WITH_OVERBAR),
    '' => Relation(symbol::Z_NOTATION_BAG_MEMBERSHIP),
    '' => ForceRelation(symbol::FROWN.as_op()),
    '' => ForceRelation(symbol::SMILE.as_op()),
    // '⌿'
    // '△'
    '' => Relation(symbol::PERPENDICULAR),
    '' => Relation(symbol::REVERSE_SOLIDUS_PRECEDING_SUPERSET),
    '' => Relation(symbol::SUPERSET_PRECEDING_SOLIDUS),
    '' => Relation(symbol::ELEMENT_OF_OPENING_UPWARDS),
    // '⟓'
    // '⟔'
    '' => Relation(symbol::LEFT_AND_RIGHT_DOUBLE_TURNSTILE),
    '' => Relation(symbol::LEFT_AND_RIGHT_TACK),
    '' => Relation(symbol::LEFT_MULTIMAP),
    '' => Relation(symbol::LONG_RIGHT_TACK),
    '' => Relation(symbol::LONG_LEFT_TACK),
    '' => Relation(symbol::UP_TACK_WITH_CIRCLE_ABOVE),
    '' => Relation(symbol::UPWARDS_QUADRUPLE_ARROW),
    '' => Relation(symbol::DOWNWARDS_QUADRUPLE_ARROW),
    '' => Relation(symbol::ANTICLOCKWISE_GAPPED_CIRCLE_ARROW),
    '' =>  Relation(symbol::CLOCKWISE_GAPPED_CIRCLE_ARROW),
    '' => Relation(symbol::RIGHT_ARROW_WITH_CIRCLED_PLUS),
    '' => Relation(symbol::LONG_LEFTWARDS_ARROW),
    '' => Relation(symbol::LONG_RIGHTWARDS_ARROW),
    '' => Relation(symbol::LONG_LEFT_RIGHT_ARROW),
    '' => Relation(symbol::LONG_LEFTWARDS_DOUBLE_ARROW),
    '' => Relation(symbol::LONG_RIGHTWARDS_DOUBLE_ARROW),
    '' => Relation(symbol::LONG_LEFT_RIGHT_DOUBLE_ARROW),
    '' => Relation(symbol::LONG_LEFTWARDS_ARROW_FROM_BAR),
    '' => Relation(symbol::LONG_RIGHTWARDS_ARROW_FROM_BAR),
    '' => Relation(symbol::LONG_LEFTWARDS_DOUBLE_ARROW_FROM_BAR),
    '' => Relation(symbol::LONG_RIGHTWARDS_DOUBLE_ARROW_FROM_BAR),
    '' => Relation(symbol::LONG_RIGHTWARDS_SQUIGGLE_ARROW),
};

pub fn get_operator_from_unicode(c: char) -> Option<Token<'static>> {
    UNICODE_OPERATORS
        .get(&c)
        .map(|tok| Token::MathOrTextMode(tok, c))
}