tex2typst 0.4.1 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +185 -120
- package/dist/tex2typst.min.js +10 -10
- package/package.json +1 -1
- package/src/convert.ts +4 -19
- package/src/map.ts +138 -79
- package/src/tex-parser.ts +42 -22
- package/src/tex-tokenizer.ts +2 -1
- package/src/typst-shorthands.ts +6 -3
- package/src/typst-types.ts +2 -2
package/src/map.ts
CHANGED
|
@@ -8,6 +8,23 @@ const symbolMap = new Map<string, string>([
|
|
|
8
8
|
[':', 'med'],
|
|
9
9
|
[' ', 'med'],
|
|
10
10
|
[';', 'thick'],
|
|
11
|
+
['>', 'med'],
|
|
12
|
+
['~', 'space.nobreak'],
|
|
13
|
+
|
|
14
|
+
['blacktriangleleft', 'triangle.filled.l'],
|
|
15
|
+
['blacktriangleright', 'triangle.filled.r'],
|
|
16
|
+
['clubsuit', 'suit.club.filled'],
|
|
17
|
+
['hookleftarrow', 'arrow.l.hook'],
|
|
18
|
+
['hookrightarrow', 'arrow.r.hook'],
|
|
19
|
+
['leftrightarrow', 'arrow.l.r'],
|
|
20
|
+
['lgblksquare', 'square.filled.big'],
|
|
21
|
+
['lgwhtsquare', 'square.stroked.big'],
|
|
22
|
+
['nearrow', 'arrow.tr'],
|
|
23
|
+
['nwarrow', 'arrow.tl'],
|
|
24
|
+
['searrow', 'arrow.br'],
|
|
25
|
+
['swarrow', 'arrow.bl'],
|
|
26
|
+
['spadesuit', 'suit.spade.filled'],
|
|
27
|
+
['updownarrow', 'arrow.t.b'],
|
|
11
28
|
|
|
12
29
|
/* textual operators */
|
|
13
30
|
['ln', 'ln'],
|
|
@@ -41,10 +58,10 @@ const symbolMap = new Map<string, string>([
|
|
|
41
58
|
['widetilde', 'tilde'], // Ideally, the result of \widetilde should be longer than \tilde. But it is not implemented now.
|
|
42
59
|
['quad', 'quad'],
|
|
43
60
|
['qquad', 'wide'],
|
|
44
|
-
['overbrace', 'overbrace'],
|
|
45
|
-
['underbrace', 'underbrace'],
|
|
46
|
-
['overline', 'overline'],
|
|
47
|
-
['underline', 'underline'],
|
|
61
|
+
['overbrace', 'overbrace'],
|
|
62
|
+
['underbrace', 'underbrace'],
|
|
63
|
+
['overline', 'overline'],
|
|
64
|
+
['underline', 'underline'],
|
|
48
65
|
['bar', 'macron'],
|
|
49
66
|
['dbinom', 'binom'],
|
|
50
67
|
['tbinom', 'binom'],
|
|
@@ -127,7 +144,7 @@ const symbolMap = new Map<string, string>([
|
|
|
127
144
|
['geq', 'gt.eq'],
|
|
128
145
|
['geqslant', 'gt.eq.slant'],
|
|
129
146
|
['gg', 'gt.double'],
|
|
130
|
-
['hbar', 'planck
|
|
147
|
+
['hbar', 'planck'],
|
|
131
148
|
['imath', 'dotless.i'],
|
|
132
149
|
['iiiint', 'integral.quad'],
|
|
133
150
|
['iiint', 'integral.triple'],
|
|
@@ -141,7 +158,7 @@ const symbolMap = new Map<string, string>([
|
|
|
141
158
|
['kappa', 'kappa'],
|
|
142
159
|
['lambda', 'lambda'],
|
|
143
160
|
['land', 'and'],
|
|
144
|
-
['langle', '
|
|
161
|
+
['langle', 'chevron.l'],
|
|
145
162
|
['lbrace', 'brace.l'],
|
|
146
163
|
['lbrack', 'bracket.l'],
|
|
147
164
|
['ldots', 'dots.h'],
|
|
@@ -203,7 +220,7 @@ const symbolMap = new Map<string, string>([
|
|
|
203
220
|
['prod', 'product'],
|
|
204
221
|
['propto', 'prop'],
|
|
205
222
|
['psi', 'psi'],
|
|
206
|
-
['rangle', '
|
|
223
|
+
['rangle', 'chevron.r'],
|
|
207
224
|
['rbrace', 'brace.r'],
|
|
208
225
|
['rbrack', 'bracket.r'],
|
|
209
226
|
['rhd', 'triangle'],
|
|
@@ -278,6 +295,7 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
278
295
|
['approxident', 'tilde.triple'],
|
|
279
296
|
['assert', 'tack.r.short'],
|
|
280
297
|
['ast', 'ast.op'],
|
|
298
|
+
['astrosun', 'sun'],
|
|
281
299
|
['asymp', 'asymp'],
|
|
282
300
|
['awint', 'integral.ccw'],
|
|
283
301
|
['backcong', 'tilde.rev.equiv'],
|
|
@@ -333,9 +351,9 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
333
351
|
['bigcup', 'union.big'],
|
|
334
352
|
['bigcupdot', 'union.dot.big'],
|
|
335
353
|
['biginterleave', 'interleave.big'],
|
|
336
|
-
['bigodot', 'dot.
|
|
337
|
-
['bigoplus', 'plus.
|
|
338
|
-
['bigotimes', 'times.
|
|
354
|
+
['bigodot', 'dot.o.big'],
|
|
355
|
+
['bigoplus', 'plus.o.big'],
|
|
356
|
+
['bigotimes', 'times.o.big'],
|
|
339
357
|
['bigsqcap', 'inter.sq.big'],
|
|
340
358
|
['bigsqcup', 'union.sq.big'],
|
|
341
359
|
['bigstar', 'star.filled'],
|
|
@@ -350,8 +368,6 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
350
368
|
['blackhourglass', 'hourglass.filled'],
|
|
351
369
|
['blacktriangle', 'triangle.filled.small.t'],
|
|
352
370
|
['blacktriangledown', 'triangle.filled.small.b'],
|
|
353
|
-
['blacktriangleleft', 'triangle.filled.l'],
|
|
354
|
-
['blacktriangleright', 'triangle.filled.r'],
|
|
355
371
|
['blkhorzoval', 'ellipse.filled.h'],
|
|
356
372
|
['blkvertoval', 'ellipse.filled.v'],
|
|
357
373
|
['bot', 'bot'],
|
|
@@ -368,13 +384,14 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
368
384
|
['cdot', 'dot.op'],
|
|
369
385
|
['cdotp', 'dot.c'],
|
|
370
386
|
['checkmark', 'checkmark'],
|
|
371
|
-
['circledast', 'ast.
|
|
372
|
-
['
|
|
373
|
-
['
|
|
374
|
-
['
|
|
375
|
-
['
|
|
376
|
-
['
|
|
377
|
-
['
|
|
387
|
+
['circledast', 'ast.op.o'],
|
|
388
|
+
['circledbullet', 'bullet.o'],
|
|
389
|
+
['circledcirc', 'compose.o'],
|
|
390
|
+
['circleddash', 'dash.o'],
|
|
391
|
+
['circledequal', 'cc.nd'],
|
|
392
|
+
['circledparallel', 'parallel.o'],
|
|
393
|
+
['circledvert', 'bar.v.o'],
|
|
394
|
+
['circledwhitebullet', 'bullet.stroked.o'],
|
|
378
395
|
['Colon', 'colon.double'],
|
|
379
396
|
['coloneq', 'colon.eq'],
|
|
380
397
|
['Coloneq', 'colon.double.eq'],
|
|
@@ -425,6 +442,7 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
425
442
|
['downarrow', 'arrow.b'],
|
|
426
443
|
['Downarrow', 'arrow.b.double'],
|
|
427
444
|
['downarrowbar', 'arrow.b.stop'],
|
|
445
|
+
['downarrowbarred', 'arrow.b.struck'],
|
|
428
446
|
['downdasharrow', 'arrow.b.dashed'],
|
|
429
447
|
['downdownarrows', 'arrows.bb'],
|
|
430
448
|
['downharpoonleft', 'harpoon.bl'],
|
|
@@ -432,7 +450,6 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
432
450
|
['downharpoonright', 'harpoon.br'],
|
|
433
451
|
['downharpoonrightbar', 'harpoon.br.stop'],
|
|
434
452
|
['downharpoonsleftright', 'harpoons.blbr'],
|
|
435
|
-
['downrightcurvedarrow', 'arrow.b.curve'],
|
|
436
453
|
['downuparrows', 'arrows.bt'],
|
|
437
454
|
['downupharpoonsleftright', 'harpoons.bltr'],
|
|
438
455
|
['downwhitearrow', 'arrow.b.stroked'],
|
|
@@ -464,13 +481,13 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
464
481
|
['errbardiamond', 'errorbar.diamond.stroked'],
|
|
465
482
|
['errbarsquare', 'errorbar.square.stroked'],
|
|
466
483
|
['euro', 'euro'],
|
|
467
|
-
['Exclam', 'excl.double'],
|
|
468
484
|
['exists', 'exists'],
|
|
469
485
|
['fallingdotseq', 'eq.dots.down'],
|
|
470
486
|
['fint', 'integral.slash'],
|
|
471
487
|
['flat', 'flat'],
|
|
472
488
|
['forall', 'forall'],
|
|
473
489
|
['fourvdots', 'fence.dotted'],
|
|
490
|
+
['frown', 'frown'],
|
|
474
491
|
['fullouterjoin', 'join.l.r'],
|
|
475
492
|
['geq', 'gt.eq'],
|
|
476
493
|
['geqq', 'gt.equiv'],
|
|
@@ -494,14 +511,11 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
494
511
|
['hknwarrow', 'arrow.tl.hook'],
|
|
495
512
|
['hksearrow', 'arrow.br.hook'],
|
|
496
513
|
['hkswarrow', 'arrow.bl.hook'],
|
|
497
|
-
['hookleftarrow', 'arrow.l.hook'],
|
|
498
|
-
['hookrightarrow', 'arrow.r.hook'],
|
|
499
514
|
['horizbar', 'bar.h'],
|
|
500
515
|
['hourglass', 'hourglass.stroked'],
|
|
501
516
|
['hrectangle', 'rect.stroked.h'],
|
|
502
517
|
['hrectangleblack', 'rect.filled.h'],
|
|
503
|
-
['
|
|
504
|
-
['hzigzag', 'dash.wave.double'],
|
|
518
|
+
['hyphenbullet', 'bullet.hyph'],
|
|
505
519
|
['iiiint', 'integral.quad'],
|
|
506
520
|
['iiint', 'integral.triple'],
|
|
507
521
|
['iinfin', 'infinity.incomplete'],
|
|
@@ -520,23 +534,29 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
520
534
|
['interleave', 'interleave'],
|
|
521
535
|
['intlarhk', 'integral.arrow.hook'],
|
|
522
536
|
['intx', 'integral.times'],
|
|
537
|
+
['inversebullet', 'bullet.hole'],
|
|
523
538
|
['Join', 'join'],
|
|
524
|
-
['langle', '
|
|
525
|
-
['lAngle', '
|
|
526
|
-
['langledot', '
|
|
539
|
+
['langle', 'chevron.l'],
|
|
540
|
+
['lAngle', 'chevron.l.double'],
|
|
541
|
+
['langledot', 'chevron.l.dot'],
|
|
527
542
|
['lat', 'lat'],
|
|
528
543
|
['late', 'lat.eq'],
|
|
544
|
+
['lbag', 'bag.l'],
|
|
545
|
+
['lblkbrbrak', 'shell.l.filled'],
|
|
529
546
|
['lbrace', 'brace.l'],
|
|
530
|
-
['lBrace', 'brace.l.
|
|
547
|
+
['lBrace', 'brace.l.stroked'],
|
|
531
548
|
['lbrack', 'bracket.l'],
|
|
532
|
-
['lBrack', 'bracket.l.
|
|
549
|
+
['lBrack', 'bracket.l.stroked'],
|
|
550
|
+
['lbracklltick', 'bracket.l.tick.b'],
|
|
551
|
+
['lbrackultick', 'bracket.l.tick.t'],
|
|
533
552
|
['lbrbrak', 'shell.l'],
|
|
534
|
-
['Lbrbrak', 'shell.l.
|
|
553
|
+
['Lbrbrak', 'shell.l.stroked'],
|
|
535
554
|
['lceil', 'ceil.l'],
|
|
536
|
-
['lcurvyangle', '
|
|
555
|
+
['lcurvyangle', 'chevron.l.curly'],
|
|
537
556
|
['leftarrow', 'arrow.l'],
|
|
538
557
|
['Leftarrow', 'arrow.l.double'],
|
|
539
558
|
['leftarrowtail', 'arrow.l.tail'],
|
|
559
|
+
['leftarrowtriangle', 'arrow.l.open'],
|
|
540
560
|
['leftdasharrow', 'arrow.l.dashed'],
|
|
541
561
|
['leftdotarrow', 'arrow.l.dotted'],
|
|
542
562
|
['leftdowncurvedarrow', 'arrow.l.curve'],
|
|
@@ -547,9 +567,9 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
547
567
|
['leftharpoonupbar', 'harpoon.lt.bar'],
|
|
548
568
|
['leftleftarrows', 'arrows.ll'],
|
|
549
569
|
['leftouterjoin', 'join.l'],
|
|
550
|
-
['leftrightarrow', 'arrow.l.r'],
|
|
551
570
|
['Leftrightarrow', 'arrow.l.r.double'],
|
|
552
571
|
['leftrightarrows', 'arrows.lr'],
|
|
572
|
+
['leftrightarrowtriangle', 'arrow.l.r.open'],
|
|
553
573
|
['leftrightharpoondowndown', 'harpoon.lb.rb'],
|
|
554
574
|
['leftrightharpoondownup', 'harpoon.lb.rt'],
|
|
555
575
|
['leftrightharpoons', 'harpoons.ltrb'],
|
|
@@ -574,16 +594,19 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
574
594
|
['lesssim', 'lt.tilde'],
|
|
575
595
|
['lfloor', 'floor.l'],
|
|
576
596
|
['lgblkcircle', 'circle.filled.big'],
|
|
577
|
-
['
|
|
597
|
+
['lgroup', 'paren.l.flat'],
|
|
578
598
|
['lgwhtcircle', 'circle.stroked.big'],
|
|
579
|
-
['lgwhtsquare', 'square.stroked.big'],
|
|
580
599
|
['ll', 'lt.double'],
|
|
600
|
+
['llangle', 'chevron.l.closed'],
|
|
581
601
|
['llblacktriangle', 'triangle.filled.bl'],
|
|
602
|
+
['llcorner', 'corner.l.b'],
|
|
582
603
|
['LLeftarrow', 'arrow.l.quad'],
|
|
583
604
|
['Lleftarrow', 'arrow.l.triple'],
|
|
584
605
|
['lll', 'lt.triple'],
|
|
585
606
|
['lllnest', 'lt.triple.nested'],
|
|
607
|
+
['llparenthesis', 'paren.l.closed'],
|
|
586
608
|
['lltriangle', 'triangle.stroked.bl'],
|
|
609
|
+
['lmoustache', 'mustache.l'],
|
|
587
610
|
['lnapprox', 'lt.napprox'],
|
|
588
611
|
['lneq', 'lt.neq'],
|
|
589
612
|
['lneqq', 'lt.nequiv'],
|
|
@@ -604,8 +627,9 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
604
627
|
['looparrowleft', 'arrow.l.loop'],
|
|
605
628
|
['looparrowright', 'arrow.r.loop'],
|
|
606
629
|
['lparen', 'paren.l'],
|
|
607
|
-
['lParen', 'paren.l.
|
|
630
|
+
['lParen', 'paren.l.stroked'],
|
|
608
631
|
['lrblacktriangle', 'triangle.filled.br'],
|
|
632
|
+
['lrcorner', 'corner.r.b'],
|
|
609
633
|
['lrtriangle', 'triangle.stroked.br'],
|
|
610
634
|
['ltimes', 'times.l'],
|
|
611
635
|
['lvzigzag', 'fence.l'],
|
|
@@ -623,8 +647,7 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
623
647
|
['mathcomma', 'comma'],
|
|
624
648
|
['mathdollar', 'dollar'],
|
|
625
649
|
['mathexclam', 'excl'],
|
|
626
|
-
|
|
627
|
-
['mathoctothorpe', 'hash'],
|
|
650
|
+
['mathhyphen', 'hyph'], // \mathhyphen is not defined in standard amsmath package
|
|
628
651
|
['mathparagraph', 'pilcrow'],
|
|
629
652
|
['mathpercent', 'percent'],
|
|
630
653
|
['mathperiod', 'dot.basic'],
|
|
@@ -638,7 +661,6 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
638
661
|
['mathyen', 'yen'],
|
|
639
662
|
['mdblkdiamond', 'diamond.filled.medium'],
|
|
640
663
|
['mdblklozenge', 'lozenge.filled.medium'],
|
|
641
|
-
['mdblksquare', 'square.filled.medium'],
|
|
642
664
|
['mdlgblkcircle', 'circle.filled'],
|
|
643
665
|
['mdlgblkdiamond', 'diamond.filled'],
|
|
644
666
|
['mdlgblklozenge', 'lozenge.filled'],
|
|
@@ -648,12 +670,9 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
648
670
|
['mdlgwhtlozenge', 'lozenge.stroked'],
|
|
649
671
|
['mdlgwhtsquare', 'square.stroked'],
|
|
650
672
|
['mdsmblkcircle', 'circle.filled.tiny'],
|
|
651
|
-
['mdsmblksquare', 'square.filled.small'],
|
|
652
673
|
['mdsmwhtcircle', 'circle.stroked.small'],
|
|
653
|
-
['mdsmwhtsquare', 'square.stroked.small'],
|
|
654
674
|
['mdwhtdiamond', 'diamond.stroked.medium'],
|
|
655
675
|
['mdwhtlozenge', 'lozenge.stroked.medium'],
|
|
656
|
-
['mdwhtsquare', 'square.stroked.medium'],
|
|
657
676
|
['measeq', 'eq.m'],
|
|
658
677
|
['measuredangle', 'angle.arc'],
|
|
659
678
|
['measuredangleleft', 'angle.arc.rev'],
|
|
@@ -714,6 +733,7 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
714
733
|
['mupvarpi', 'pi.alt'],
|
|
715
734
|
['mupvarrho', 'rho.alt'],
|
|
716
735
|
['mupvarsigma', 'sigma.alt'],
|
|
736
|
+
['mupvarTheta', 'Theta.alt'],
|
|
717
737
|
['mupvartheta', 'theta.alt'],
|
|
718
738
|
['mupXi', 'Xi'],
|
|
719
739
|
['mupxi', 'xi'],
|
|
@@ -725,7 +745,6 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
725
745
|
['natural', 'natural'],
|
|
726
746
|
['ncong', 'tilde.equiv.not'],
|
|
727
747
|
['ne', 'eq.not'],
|
|
728
|
-
['nearrow', 'arrow.tr'],
|
|
729
748
|
['Nearrow', 'arrow.tr.double'],
|
|
730
749
|
['neg', 'not'],
|
|
731
750
|
['nequiv', 'equiv.not'], // or eq.triple.not
|
|
@@ -735,7 +754,9 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
735
754
|
['ngtr', 'gt.not'],
|
|
736
755
|
['ngtrless', 'gt.lt.not'],
|
|
737
756
|
['ngtrsim', 'gt.tilde.not'],
|
|
757
|
+
['nHdownarrow', 'arrow.b.dstruck'],
|
|
738
758
|
['nhpar', 'parallel.struck'],
|
|
759
|
+
['nHuparrow', 'arrow.t.dstruck'],
|
|
739
760
|
['nhVvert', 'interleave.struck'],
|
|
740
761
|
['ni', 'in.rev'],
|
|
741
762
|
['nLeftarrow', 'arrow.l.double.not'],
|
|
@@ -772,36 +793,62 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
772
793
|
['nvdash', 'tack.r.not'],
|
|
773
794
|
['nvDash', 'tack.r.double.not'],
|
|
774
795
|
['nvinfty', 'infinity.bar'],
|
|
775
|
-
['
|
|
796
|
+
['nvLeftarrow', 'arrow.l.double.struck'],
|
|
797
|
+
['nvleftarrow', 'arrow.l.struck'],
|
|
798
|
+
['nVleftarrow', 'arrow.l.dstruck'],
|
|
799
|
+
['nvleftarrowtail', 'arrow.l.tail.struck'],
|
|
800
|
+
['nVleftarrowtail', 'arrow.l.tail.dstruck'],
|
|
801
|
+
['nvLeftrightarrow', 'arrow.l.r.double.struck'],
|
|
802
|
+
['nvleftrightarrow', 'arrow.l.r.struck'],
|
|
803
|
+
['nVleftrightarrow', 'arrow.l.r.dstruck'],
|
|
804
|
+
['nvRightarrow', 'arrow.r.double.struck'],
|
|
805
|
+
['nvrightarrow', 'arrow.r.struck'],
|
|
806
|
+
['nVrightarrow', 'arrow.r.dstruck'],
|
|
807
|
+
['nvrightarrowtail', 'arrow.r.tail.struck'],
|
|
808
|
+
['nVrightarrowtail', 'arrow.r.tail.dstruck'],
|
|
809
|
+
['nvtwoheadleftarrow', 'arrow.l.twohead.struck'],
|
|
810
|
+
['nVtwoheadleftarrow', 'arrow.l.twohead.dstruck'],
|
|
811
|
+
['nvtwoheadleftarrowtail', 'arrow.l.twohead.tail.struck'],
|
|
812
|
+
['nVtwoheadleftarrowtail', 'arrow.l.twohead.tail.dstruck'],
|
|
813
|
+
['nvtwoheadrightarrow', 'arrow.r.twohead.struck'],
|
|
814
|
+
['nVtwoheadrightarrow', 'arrow.r.twohead.dstruck'],
|
|
815
|
+
['nvtwoheadrightarrowtail', 'arrow.r.twohead.tail.struck'],
|
|
816
|
+
['nVtwoheadrightarrowtail', 'arrow.r.twohead.tail.dstruck'],
|
|
776
817
|
['Nwarrow', 'arrow.tl.double'],
|
|
777
818
|
['nwsearrow', 'arrow.tl.br'],
|
|
778
819
|
['obrbrak', 'shell.t'],
|
|
779
|
-
['obslash', 'backslash.
|
|
780
|
-
['odiv', 'div.
|
|
781
|
-
['odot', 'dot.
|
|
782
|
-
['
|
|
820
|
+
['obslash', 'backslash.o'],
|
|
821
|
+
['odiv', 'div.o'],
|
|
822
|
+
['odot', 'dot.o'],
|
|
823
|
+
['odotslashdot', 'div.slanted.o'],
|
|
824
|
+
['ogreaterthan', 'gt.o'],
|
|
783
825
|
['oiiint', 'integral.vol'],
|
|
784
826
|
['oiint', 'integral.surf'],
|
|
785
827
|
['oint', 'integral.cont'],
|
|
786
828
|
['ointctrclockwise', 'integral.cont.ccw'],
|
|
787
|
-
['olessthan', 'lt.
|
|
788
|
-
['ominus', 'minus.
|
|
789
|
-
['operp', 'perp.
|
|
790
|
-
['oplus', 'plus.
|
|
829
|
+
['olessthan', 'lt.o'],
|
|
830
|
+
['ominus', 'minus.o'],
|
|
831
|
+
['operp', 'perp.o'],
|
|
832
|
+
['oplus', 'plus.o'],
|
|
833
|
+
['opluslhrim', 'plus.o.l'],
|
|
834
|
+
['oplusrhrim', 'plus.o.r'],
|
|
791
835
|
['origof', 'original'],
|
|
792
|
-
['
|
|
836
|
+
['oslash', 'slash.o'],
|
|
837
|
+
['otimes', 'times.o'],
|
|
838
|
+
['otimeshat', 'times.o.hat'],
|
|
839
|
+
['otimeslhrim', 'times.o.l'],
|
|
840
|
+
['otimesrhrim', 'times.o.r'],
|
|
793
841
|
// ['overbrace', 'brace.t'],
|
|
794
|
-
['overbracket', 'bracket.t'],
|
|
795
|
-
['overparen', 'paren.t'],
|
|
842
|
+
// ['overbracket', 'bracket.t'],
|
|
843
|
+
// ['overparen', 'paren.t'],
|
|
796
844
|
['parallel', 'parallel'],
|
|
797
845
|
['parallelogram', 'parallelogram.stroked'],
|
|
798
846
|
['parallelogramblack', 'parallelogram.filled'],
|
|
799
847
|
['parsim', 'parallel.tilde'],
|
|
800
|
-
['partial', '
|
|
848
|
+
['partial', 'partial'],
|
|
801
849
|
['pentagon', 'penta.stroked'],
|
|
802
850
|
['pentagonblack', 'penta.filled'],
|
|
803
851
|
['perp', 'perp'],
|
|
804
|
-
['Planckconst', 'planck'],
|
|
805
852
|
['pm', 'plus.minus'],
|
|
806
853
|
['prec', 'prec'],
|
|
807
854
|
['Prec', 'prec.double'],
|
|
@@ -822,30 +869,37 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
822
869
|
['quarternote', 'note.quarter.alt'],
|
|
823
870
|
['questeq', 'eq.quest'],
|
|
824
871
|
['Question', 'quest.double'],
|
|
825
|
-
['rangle', '
|
|
826
|
-
['rAngle', '
|
|
827
|
-
['rangledot', '
|
|
872
|
+
['rangle', 'chevron.r'],
|
|
873
|
+
['rAngle', 'chevron.r.double'],
|
|
874
|
+
['rangledot', 'chevron.r.dot'],
|
|
875
|
+
['rangledownzigzagarrow', 'angle.azimuth'],
|
|
876
|
+
['rbag', 'bag.r'],
|
|
877
|
+
['rblkbrbrak', 'shell.r.filled'],
|
|
828
878
|
['rbrace', 'brace.r'],
|
|
829
|
-
['rBrace', 'brace.r.
|
|
879
|
+
['rBrace', 'brace.r.stroked'],
|
|
830
880
|
['rbrack', 'bracket.r'],
|
|
831
|
-
['rBrack', 'bracket.r.
|
|
881
|
+
['rBrack', 'bracket.r.stroked'],
|
|
882
|
+
['rbracklrtick', 'bracket.r.tick.b'],
|
|
883
|
+
['rbrackurtick', 'bracket.r.tick.t'],
|
|
832
884
|
['rbrbrak', 'shell.r'],
|
|
833
|
-
['Rbrbrak', 'shell.r.
|
|
885
|
+
['Rbrbrak', 'shell.r.stroked'],
|
|
834
886
|
['rceil', 'ceil.r'],
|
|
835
|
-
['rcurvyangle', '
|
|
887
|
+
['rcurvyangle', 'chevron.r.curly'],
|
|
836
888
|
['Re', 'Re'],
|
|
837
889
|
['revangle', 'angle.rev'],
|
|
838
890
|
['revemptyset', 'emptyset.rev'],
|
|
839
891
|
['revnmid', 'divides.not.rev'],
|
|
840
892
|
['rfloor', 'floor.r'],
|
|
893
|
+
['rgroup', 'paren.r.flat'],
|
|
841
894
|
['rightangle', 'angle.right'],
|
|
842
895
|
['rightanglemdot', 'angle.right.dot'],
|
|
843
|
-
['rightanglesqr', 'angle.right.
|
|
896
|
+
['rightanglesqr', 'angle.right.square'],
|
|
844
897
|
['rightarrow', 'arrow.r'],
|
|
845
898
|
['Rightarrow', 'arrow.r.double'],
|
|
846
899
|
['rightarrowbar', 'arrow.r.stop'],
|
|
847
|
-
['rightarrowonoplus', 'plus.
|
|
900
|
+
['rightarrowonoplus', 'plus.o.arrow'],
|
|
848
901
|
['rightarrowtail', 'arrow.r.tail'],
|
|
902
|
+
['rightarrowtriangle', 'arrow.r.open'],
|
|
849
903
|
['rightdasharrow', 'arrow.r.dashed'],
|
|
850
904
|
['rightdotarrow', 'arrow.r.dotted'],
|
|
851
905
|
['rightdowncurvedarrow', 'arrow.r.curve'],
|
|
@@ -866,15 +920,17 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
866
920
|
['rightwavearrow', 'arrow.r.wave'],
|
|
867
921
|
['rightwhitearrow', 'arrow.r.stroked'],
|
|
868
922
|
['risingdotseq', 'eq.dots.up'],
|
|
923
|
+
['rmoustache', 'mustache.r'],
|
|
869
924
|
['rparen', 'paren.r'],
|
|
870
|
-
['rParen', 'paren.r.
|
|
925
|
+
['rParen', 'paren.r.stroked'],
|
|
926
|
+
['rrangle', 'chevron.r.closed'],
|
|
871
927
|
['RRightarrow', 'arrow.r.quad'],
|
|
872
928
|
['Rrightarrow', 'arrow.r.triple'],
|
|
929
|
+
['rrparenthesis', 'paren.r.closed'],
|
|
873
930
|
['rsolbar', 'backslash.not'],
|
|
874
931
|
['rtimes', 'times.r'],
|
|
875
932
|
['rvzigzag', 'fence.r'],
|
|
876
933
|
['Rvzigzag', 'fence.r.double'],
|
|
877
|
-
['searrow', 'arrow.br'],
|
|
878
934
|
['Searrow', 'arrow.br.double'],
|
|
879
935
|
['setminus', 'without'],
|
|
880
936
|
['sharp', 'sharp'],
|
|
@@ -896,16 +952,15 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
896
952
|
['smblkcircle', 'bullet'],
|
|
897
953
|
['smblkdiamond', 'diamond.filled.small'],
|
|
898
954
|
['smblklozenge', 'lozenge.filled.small'],
|
|
899
|
-
['smblksquare', 'square.filled.tiny'],
|
|
900
955
|
['smeparsl', 'parallel.slanted.eq.tilde'],
|
|
956
|
+
['smile', 'smile'],
|
|
901
957
|
['smt', 'smt'],
|
|
902
958
|
['smte', 'smt.eq'],
|
|
959
|
+
['smwhtcircle', 'bullet.stroked'],
|
|
903
960
|
['smwhtdiamond', 'diamond.stroked.small'],
|
|
904
961
|
['smwhtlozenge', 'lozenge.stroked.small'],
|
|
905
|
-
['smwhtsquare', 'square.stroked.tiny'],
|
|
906
|
-
['spadesuit', 'suit.spade.filled'],
|
|
907
962
|
['sphericalangle', 'angle.spheric'],
|
|
908
|
-
['sphericalangleup', 'angle.spheric.
|
|
963
|
+
['sphericalangleup', 'angle.spheric.t'],
|
|
909
964
|
['sqcap', 'inter.sq'],
|
|
910
965
|
['Sqcap', 'inter.sq.double'],
|
|
911
966
|
['sqcup', 'union.sq'],
|
|
@@ -944,7 +999,6 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
944
999
|
['supsetdot', 'supset.dot'],
|
|
945
1000
|
['supseteq', 'supset.eq'],
|
|
946
1001
|
['supsetneq', 'supset.neq'],
|
|
947
|
-
['swarrow', 'arrow.bl'],
|
|
948
1002
|
['Swarrow', 'arrow.bl.double'],
|
|
949
1003
|
['therefore', 'therefore'],
|
|
950
1004
|
['threedangle', 'angle.spatial'],
|
|
@@ -967,15 +1021,19 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
967
1021
|
['tripleplus', 'plus.triple'],
|
|
968
1022
|
['trprime', 'prime.triple'],
|
|
969
1023
|
['trslash', 'slash.triple'],
|
|
1024
|
+
['turnediota', 'iota.inv'],
|
|
970
1025
|
['twoheaddownarrow', 'arrow.b.twohead'],
|
|
971
1026
|
['twoheadleftarrow', 'arrow.l.twohead'],
|
|
1027
|
+
['twoheadleftarrowtail', 'arrow.l.twohead.tail'],
|
|
972
1028
|
['twoheadmapsfrom', 'arrow.l.twohead.bar'],
|
|
973
1029
|
['twoheadmapsto', 'arrow.r.twohead.bar'],
|
|
974
1030
|
['twoheadrightarrow', 'arrow.r.twohead'],
|
|
1031
|
+
['twoheadrightarrowtail', 'arrow.r.twohead.tail'],
|
|
975
1032
|
['twoheaduparrow', 'arrow.t.twohead'],
|
|
976
1033
|
['twonotes', 'note.eighth.beamed'],
|
|
977
1034
|
['ubrbrak', 'shell.b'],
|
|
978
1035
|
['ulblacktriangle', 'triangle.filled.tl'],
|
|
1036
|
+
['ulcorner', 'corner.l.t'],
|
|
979
1037
|
['ultriangle', 'triangle.stroked.tl'],
|
|
980
1038
|
['uminus', 'union.minus'],
|
|
981
1039
|
['underbrace', 'brace.b'],
|
|
@@ -986,8 +1044,11 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
986
1044
|
['upand', 'amp.inv'],
|
|
987
1045
|
['uparrow', 'arrow.t'],
|
|
988
1046
|
['Uparrow', 'arrow.t.double'],
|
|
1047
|
+
['uparrowbarred', 'arrow.t.struck'],
|
|
1048
|
+
['upbackepsilon', 'epsilon.alt.rev'],
|
|
989
1049
|
['updasharrow', 'arrow.t.dashed'],
|
|
990
|
-
['
|
|
1050
|
+
['upDigamma', 'Digamma'],
|
|
1051
|
+
['updigamma', 'digamma'],
|
|
991
1052
|
['Updownarrow', 'arrow.t.b.double'],
|
|
992
1053
|
['updownarrows', 'arrows.tb'],
|
|
993
1054
|
['updownharpoonleftleft', 'harpoon.tl.bl'],
|
|
@@ -1001,16 +1062,14 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
1001
1062
|
['upharpoonrightbar', 'harpoon.tr.bar'],
|
|
1002
1063
|
['upharpoonsleftright', 'harpoons.tltr'],
|
|
1003
1064
|
['uplus', 'union.plus'],
|
|
1004
|
-
['uprightcurvearrow', 'arrow.t.curve'],
|
|
1005
1065
|
['upuparrows', 'arrows.tt'],
|
|
1006
1066
|
['upwhitearrow', 'arrow.t.stroked'],
|
|
1007
1067
|
['urblacktriangle', 'triangle.filled.tr'],
|
|
1068
|
+
['urcorner', 'corner.r.t'],
|
|
1008
1069
|
['urtriangle', 'triangle.stroked.tr'],
|
|
1009
1070
|
['UUparrow', 'arrow.t.quad'],
|
|
1010
1071
|
['Uuparrow', 'arrow.t.triple'],
|
|
1011
1072
|
['varclubsuit', 'suit.club.stroked'],
|
|
1012
|
-
['vardiamondsuit', 'suit.diamond.filled'],
|
|
1013
|
-
['varheartsuit', 'suit.heart.filled'],
|
|
1014
1073
|
['varhexagon', 'hexa.stroked'],
|
|
1015
1074
|
['varhexagonblack', 'hexa.filled'],
|
|
1016
1075
|
['varnothing', 'emptyset'],
|
|
@@ -1034,7 +1093,7 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
1034
1093
|
['vrectangle', 'rect.stroked.v'],
|
|
1035
1094
|
['vrectangleblack', 'rect.filled.v'],
|
|
1036
1095
|
['Vvert', 'bar.v.triple'],
|
|
1037
|
-
['vysmblkcircle', 'circle.filled.small'],
|
|
1096
|
+
['vysmblkcircle', 'circle.filled.small'], // or bullet.op
|
|
1038
1097
|
['vysmwhtcircle', 'circle.stroked.tiny'], // or compose
|
|
1039
1098
|
['wedge', 'and'],
|
|
1040
1099
|
['Wedge', 'and.double'],
|
|
@@ -1043,7 +1102,7 @@ const map_from_official_docs: Map<string, string> = new Map([
|
|
|
1043
1102
|
['whiteinwhitetriangle', 'triangle.stroked.nested'],
|
|
1044
1103
|
['whthorzoval', 'ellipse.stroked.h'],
|
|
1045
1104
|
['whtvertoval', 'ellipse.stroked.v'],
|
|
1046
|
-
['wideangledown', 'angle.
|
|
1105
|
+
['wideangledown', 'angle.obtuse'],
|
|
1047
1106
|
['wr', 'wreath'],
|
|
1048
1107
|
['xsol', 'slash.big'],
|
|
1049
1108
|
]);
|
package/src/tex-parser.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TexBeginEnd, TexFuncCall, TexLeftRight, TexNode, TexGroup, TexSupSub, TexSupsubData, TexText, TexToken, TexTokenType } from "./tex-types";
|
|
2
2
|
import { assert } from "./utils";
|
|
3
|
-
import {
|
|
3
|
+
import { array_join, array_split } from "./generic";
|
|
4
4
|
import { TEX_BINARY_COMMANDS, TEX_UNARY_COMMANDS, tokenize_tex } from "./tex-tokenizer";
|
|
5
5
|
|
|
6
6
|
const IGNORED_COMMANDS = [
|
|
@@ -103,22 +103,7 @@ export class LatexParser {
|
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
parse(tokens: TexToken[]): TexNode {
|
|
106
|
-
|
|
107
|
-
const idx = array_find(tokens, token_displaystyle);
|
|
108
|
-
if (idx === -1) {
|
|
109
|
-
// no \displaystyle, normal execution path
|
|
110
|
-
return this.parseGroup(tokens.slice(0));
|
|
111
|
-
} else if (idx === 0) {
|
|
112
|
-
// \displaystyle at the beginning. Wrap the whole thing in \displaystyle
|
|
113
|
-
const tree = this.parseGroup(tokens.slice(1));
|
|
114
|
-
return new TexFuncCall(token_displaystyle, [tree]);
|
|
115
|
-
} else {
|
|
116
|
-
// \displaystyle somewhere in the middle. Split the expression to two parts
|
|
117
|
-
const tree1 = this.parseGroup(tokens.slice(0, idx));
|
|
118
|
-
const tree2 = this.parseGroup(tokens.slice(idx + 1, tokens.length));
|
|
119
|
-
const display = new TexFuncCall(token_displaystyle, [tree2]);
|
|
120
|
-
return new TexGroup([tree1, display]);
|
|
121
|
-
}
|
|
106
|
+
return this.parseGroup(tokens.slice(0));
|
|
122
107
|
}
|
|
123
108
|
|
|
124
109
|
parseGroup(tokens: TexToken[]): TexNode {
|
|
@@ -152,11 +137,13 @@ export class LatexParser {
|
|
|
152
137
|
return [EMPTY_NODE, -1];
|
|
153
138
|
}
|
|
154
139
|
|
|
140
|
+
const styledResults = this.applyStyleCommands(results);
|
|
141
|
+
|
|
155
142
|
let node: TexNode;
|
|
156
|
-
if (
|
|
157
|
-
node =
|
|
143
|
+
if (styledResults.length === 1) {
|
|
144
|
+
node = styledResults[0];
|
|
158
145
|
} else {
|
|
159
|
-
node = new TexGroup(
|
|
146
|
+
node = new TexGroup(styledResults);
|
|
160
147
|
}
|
|
161
148
|
return [node, pos + 1];
|
|
162
149
|
}
|
|
@@ -173,8 +160,9 @@ export class LatexParser {
|
|
|
173
160
|
const next_token = tokens[pos];
|
|
174
161
|
if (next_token.eq(SUB_SYMBOL)) {
|
|
175
162
|
[sub, pos] = this.parseNextExprWithoutSupSub(tokens, pos + 1);
|
|
176
|
-
|
|
177
|
-
|
|
163
|
+
const new_primes = eat_primes(tokens, pos);
|
|
164
|
+
num_prime += new_primes;
|
|
165
|
+
pos += new_primes;
|
|
178
166
|
if (pos < tokens.length && tokens[pos].eq(SUP_SYMBOL)) {
|
|
179
167
|
[sup, pos] = this.parseNextExprWithoutSupSub(tokens, pos + 1);
|
|
180
168
|
if (eat_primes(tokens, pos) > 0) {
|
|
@@ -262,8 +250,10 @@ export class LatexParser {
|
|
|
262
250
|
case '\\,':
|
|
263
251
|
case '\\:':
|
|
264
252
|
case '\\;':
|
|
253
|
+
case '\\>':
|
|
265
254
|
return [firstToken.toNode(), start + 1];
|
|
266
255
|
case '\\ ':
|
|
256
|
+
case '~':
|
|
267
257
|
return [firstToken.toNode(), start + 1];
|
|
268
258
|
case '_':
|
|
269
259
|
case '^':
|
|
@@ -472,6 +462,36 @@ export class LatexParser {
|
|
|
472
462
|
this.alignmentDepth--;
|
|
473
463
|
return [allRows, pos];
|
|
474
464
|
}
|
|
465
|
+
|
|
466
|
+
private applyStyleCommands(nodes: TexNode[]): TexNode[] {
|
|
467
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
468
|
+
const styleToken = this.getStyleToken(nodes[i]);
|
|
469
|
+
if (styleToken) {
|
|
470
|
+
const before = this.applyStyleCommands(nodes.slice(0, i));
|
|
471
|
+
const after = this.applyStyleCommands(nodes.slice(i + 1));
|
|
472
|
+
let body: TexNode;
|
|
473
|
+
if (after.length === 0) {
|
|
474
|
+
body = EMPTY_NODE;
|
|
475
|
+
} else if (after.length === 1) {
|
|
476
|
+
body = after[0];
|
|
477
|
+
} else {
|
|
478
|
+
body = new TexGroup(after);
|
|
479
|
+
}
|
|
480
|
+
const funcCall = new TexFuncCall(styleToken, [body]);
|
|
481
|
+
return before.concat(funcCall);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
return nodes;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
private getStyleToken(node: TexNode): TexToken | null {
|
|
488
|
+
if (node.type === 'terminal') {
|
|
489
|
+
if (node.head.eq(TexToken.COMMAND_DISPLAYSTYLE) || node.head.eq(TexToken.COMMAND_TEXTSTYLE)) {
|
|
490
|
+
return node.head;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
return null;
|
|
494
|
+
}
|
|
475
495
|
}
|
|
476
496
|
|
|
477
497
|
// Remove all whitespace before or after _ or ^
|
package/src/tex-tokenizer.ts
CHANGED
|
@@ -94,7 +94,8 @@ const rules_map = new Map<string, (a: Scanner<TexToken>) => TexToken | TexToken[
|
|
|
94
94
|
],
|
|
95
95
|
[String.raw`%[^\n]*`, (s) => new TexToken(TexTokenType.COMMENT, s.text()!.substring(1))],
|
|
96
96
|
[String.raw`[{}_^&]`, (s) => new TexToken(TexTokenType.CONTROL, s.text()!)],
|
|
97
|
-
[String.raw`\\[
|
|
97
|
+
[String.raw`\\[\\,:;!> ]`, (s) => new TexToken(TexTokenType.CONTROL, s.text()!)],
|
|
98
|
+
[String.raw`~`, (s) => new TexToken(TexTokenType.CONTROL, s.text()!)],
|
|
98
99
|
[String.raw`\r?\n`, (_s) => new TexToken(TexTokenType.NEWLINE, "\n")],
|
|
99
100
|
[String.raw`\s+`, (s) => new TexToken(TexTokenType.SPACE, s.text()!)],
|
|
100
101
|
[String.raw`\\[{}%$&#_|]`, (s) => new TexToken(TexTokenType.ELEMENT, s.text()!)],
|