返回 ppt-master
formula_profile.py
根目录 / skills / ppt-master / scripts / svg_to_pptx / native_objects / formula_profile.py
1 #!/usr/bin/env python3
2 """
3 PPT Master - Microsoft 365 LaTeX Formula Profile
4
5 Keep the documented Microsoft 365 LaTeX command vocabulary and normalization
6 tables separate from the native formula parser.
7
8 See references/native-formula.md for the owning input-profile contract.
9
10 Usage:
11 Imported by the SVG-to-PPTX native formula compiler.
12
13 Examples:
14 from svg_to_pptx.native_objects.formula_profile import SYMBOL_COMMANDS
15
16 Dependencies:
17 None (only uses standard library)
18 """
19
20 from __future__ import annotations
21
22
23 OFFICE_LATEX_PROFILE = "Microsoft 365 Windows 2606 / Mac 16.110"
24 OFFICE_LATEX_SOURCE_COMMIT = "24753a186bd9e2e4614fb57680a253c33cf0df23"
25 OFFICE_MHCHEM_SOURCE_COMMIT = "9459d37ab954aabec13966ecbf4968d92f086a29"
26
27 GREEK_SYMBOLS = {
28 "alpha": "α",
29 "beta": "β",
30 "gamma": "γ",
31 "delta": "δ",
32 "epsilon": "ϵ",
33 "varepsilon": "ε",
34 "zeta": "ζ",
35 "eta": "η",
36 "theta": "θ",
37 "vartheta": "ϑ",
38 "iota": "ι",
39 "kappa": "κ",
40 "varkappa": "ϰ",
41 "lambda": "λ",
42 "mu": "μ",
43 "nu": "ν",
44 "xi": "ξ",
45 "omicron": "ο",
46 "pi": "π",
47 "varpi": "ϖ",
48 "rho": "ρ",
49 "varrho": "ϱ",
50 "sigma": "σ",
51 "varsigma": "ς",
52 "tau": "τ",
53 "upsilon": "υ",
54 "phi": "ϕ",
55 "varphi": "φ",
56 "chi": "χ",
57 "psi": "ψ",
58 "omega": "ω",
59 "Gamma": "Γ",
60 "varGamma": "Γ",
61 "Delta": "Δ",
62 "varDelta": "Δ",
63 "Theta": "Θ",
64 "varTheta": "Θ",
65 "Lambda": "Λ",
66 "varLambda": "Λ",
67 "Xi": "Ξ",
68 "varXi": "Ξ",
69 "Pi": "Π",
70 "varPi": "Π",
71 "Sigma": "Σ",
72 "varSigma": "Σ",
73 "Upsilon": "Υ",
74 "varUpsilon": "Υ",
75 "Phi": "Φ",
76 "varPhi": "Φ",
77 "Psi": "Ψ",
78 "varPsi": "Ψ",
79 "Omega": "Ω",
80 "varOmega": "Ω",
81 }
82
83 VARIANT_UPPERCASE_GREEK = frozenset({
84 "varGamma",
85 "varDelta",
86 "varTheta",
87 "varLambda",
88 "varXi",
89 "varPi",
90 "varSigma",
91 "varUpsilon",
92 "varPhi",
93 "varPsi",
94 "varOmega",
95 })
96
97 BINARY_SYMBOLS = {
98 "pm": "±",
99 "mp": "∓",
100 "times": "×",
101 "div": "÷",
102 "cdot": "⋅",
103 "ast": "∗",
104 "star": "⋆",
105 "circ": "∘",
106 "bullet": "∙",
107 "diamond": "⋄",
108 "oplus": "⊕",
109 "ominus": "⊖",
110 "otimes": "⊗",
111 "oslash": "⊘",
112 "odot": "⊙",
113 "cap": "∩",
114 "cup": "∪",
115 "uplus": "⊎",
116 "sqcap": "⊓",
117 "sqcup": "⊔",
118 "vee": "∨",
119 "wedge": "∧",
120 "setminus": "∖",
121 "wr": "≀",
122 "dagger": "†",
123 "ddagger": "‡",
124 "amalg": "⨿",
125 "barwedge": "⊼",
126 "veebar": "⊻",
127 "dotplus": "∔",
128 "ltimes": "⋉",
129 "rtimes": "⋊",
130 "leftthreetimes": "⋋",
131 "rightthreetimes": "⋌",
132 "curlyvee": "⋎",
133 "curlywedge": "⋏",
134 "circledast": "⊛",
135 "circledcirc": "⊚",
136 "circleddash": "⊝",
137 "boxplus": "⊞",
138 "boxminus": "⊟",
139 "boxtimes": "⊠",
140 "boxdot": "⊡",
141 "intercal": "⊺",
142 "divideontimes": "⋇",
143 "doublebarwedge": "⩞",
144 "triangleleft": "◁",
145 "triangleright": "▷",
146 }
147
148 RELATION_SYMBOLS = {
149 "leq": "≤",
150 "le": "≤",
151 "geq": "≥",
152 "ge": "≥",
153 "neq": "≠",
154 "ne": "≠",
155 "equiv": "≡",
156 "sim": "∼",
157 "simeq": "≃",
158 "approx": "≈",
159 "cong": "≅",
160 "ll": "≪",
161 "gg": "≫",
162 "subset": "⊂",
163 "supset": "⊃",
164 "subseteq": "⊆",
165 "supseteq": "⊇",
166 "in": "∈",
167 "ni": "∋",
168 "notin": "∉",
169 "mid": "∣",
170 "parallel": "∥",
171 "perp": "⊥",
172 "vdash": "⊢",
173 "dashv": "⊣",
174 "prec": "≺",
175 "succ": "≻",
176 "preceq": "⪯",
177 "succeq": "⪰",
178 "propto": "∝",
179 "therefore": "∴",
180 "because": "∵",
181 "bowtie": "⋈",
182 "smile": "⌣",
183 "frown": "⌢",
184 "models": "⊨",
185 "doteq": "≐",
186 "leqq": "≦",
187 "leqslant": "⩽",
188 "eqslantless": "⪕",
189 "lesssim": "≲",
190 "lessapprox": "⪅",
191 "lll": "⋘",
192 "lessdot": "⋖",
193 "lessgtr": "≶",
194 "lesseqgtr": "⋚",
195 "geqq": "≧",
196 "geqslant": "⩾",
197 "eqslantgtr": "⪖",
198 "gtrsim": "≳",
199 "ggg": "⋙",
200 "gtrdot": "⋗",
201 "gtrless": "≷",
202 "gtreqless": "⋛",
203 "sqsubset": "⊏",
204 "sqsupset": "⊐",
205 "sqsubseteq": "⊑",
206 "sqsupseteq": "⊒",
207 "subsetneq": "⊊",
208 "supsetneq": "⊋",
209 "subsetneqq": "⫋",
210 "supsetneqq": "⫌",
211 "Subset": "⋐",
212 "Supset": "⋑",
213 "Vdash": "⊩",
214 "Vvdash": "⊪",
215 "precapprox": "⪷",
216 "succapprox": "⪸",
217 "precnapprox": "⪹",
218 "succnapprox": "⪺",
219 "precneqq": "⪵",
220 "succneqq": "⪶",
221 "precnsim": "⋨",
222 "succnsim": "⋩",
223 "precsim": "≾",
224 "succsim": "≿",
225 "trianglelefteq": "⊴",
226 "trianglerighteq": "⊵",
227 "vartriangleleft": "⊲",
228 "vartriangleright": "⊳",
229 "circeq": "≗",
230 "eqcirc": "≖",
231 "triangleq": "≜",
232 "bumpeq": "≏",
233 "Bumpeq": "≎",
234 "doteqdot": "≑",
235 "risingdotseq": "≓",
236 "fallingdotseq": "≒",
237 "backsim": "∽",
238 "backsimeq": "⋍",
239 "between": "≬",
240 "pitchfork": "⋔",
241 "ncong": "≇",
242 "nsim": "≁",
243 "nleq": "≰",
244 "ngeq": "≱",
245 "nprec": "⊀",
246 "nsucc": "⊁",
247 "nvdash": "⊬",
248 "nvDash": "⊭",
249 "nVdash": "⊮",
250 "nVDash": "⊯",
251 "ntriangleleft": "⋪",
252 "ntriangleright": "⋫",
253 "ntrianglelefteq": "⋬",
254 "ntrianglerighteq": "⋭",
255 }
256
257 ARROW_SYMBOLS = {
258 "leftarrow": "←",
259 "rightarrow": "→",
260 "to": "→",
261 "Leftarrow": "⇐",
262 "Rightarrow": "⇒",
263 "leftrightarrow": "↔",
264 "Leftrightarrow": "⇔",
265 "uparrow": "↑",
266 "downarrow": "↓",
267 "Uparrow": "⇑",
268 "Downarrow": "⇓",
269 "updownarrow": "↕",
270 "Updownarrow": "⇕",
271 "mapsto": "↦",
272 "longmapsto": "⟼",
273 "longleftarrow": "⟵",
274 "longrightarrow": "⟶",
275 "longleftrightarrow": "⟷",
276 "Longleftarrow": "⟸",
277 "implies": "⟹",
278 "iff": "⟺",
279 "hookrightarrow": "↪",
280 "hookleftarrow": "↩",
281 "nearrow": "↗",
282 "searrow": "↘",
283 "nwarrow": "↖",
284 "swarrow": "↙",
285 "rightharpoonup": "⇀",
286 "rightharpoondown": "⇁",
287 "leftharpoonup": "↼",
288 "leftharpoondown": "↽",
289 "rightleftharpoons": "⇌",
290 "leftrightharpoons": "⇋",
291 "rightrightarrows": "⇉",
292 "leftleftarrows": "⇇",
293 "rightleftarrows": "⇄",
294 "leftrightarrows": "⇆",
295 "Lsh": "↰",
296 "Rsh": "↱",
297 "twoheadleftarrow": "↞",
298 "twoheadrightarrow": "↠",
299 "rightsquigarrow": "⇝",
300 "leftrightsquigarrow": "↭",
301 "circlearrowleft": "↺",
302 "circlearrowright": "↻",
303 "curvearrowleft": "↶",
304 "curvearrowright": "↷",
305 "dashleftarrow": "⇠",
306 "dashrightarrow": "⇢",
307 "upuparrows": "⇈",
308 "downdownarrows": "⇊",
309 "upharpoonleft": "↿",
310 "upharpoonright": "↾",
311 "downharpoonleft": "⇃",
312 "downharpoonright": "⇂",
313 "nleftarrow": "↚",
314 "nrightarrow": "↛",
315 "nleftrightarrow": "↮",
316 "nLeftarrow": "⇍",
317 "nRightarrow": "⇏",
318 "nLeftrightarrow": "⇎",
319 }
320
321 DOT_SYMBOLS = {
322 "ldots": "…",
323 "dots": "…",
324 "cdots": "⋯",
325 "vdots": "⋮",
326 "ddots": "⋱",
327 "iddots": "⋰",
328 "dotsb": "⋯",
329 "dotsc": "…",
330 "dotsi": "⋯",
331 "dotsm": "⋯",
332 "dotso": "…",
333 }
334
335 MISC_SYMBOLS = {
336 "infty": "∞",
337 "partial": "∂",
338 "nabla": "∇",
339 "forall": "∀",
340 "exists": "∃",
341 "nexists": "∄",
342 "emptyset": "∅",
343 "aleph": "ℵ",
344 "beth": "ℶ",
345 "gimel": "ℷ",
346 "daleth": "ℸ",
347 "ell": "ℓ",
348 "wp": "℘",
349 "Re": "ℜ",
350 "Im": "ℑ",
351 "hbar": "ℏ",
352 "imath": "ı",
353 "jmath": "ȷ",
354 "prime": "′",
355 "angle": "∠",
356 "measuredangle": "∡",
357 "sphericalangle": "∢",
358 "top": "⊤",
359 "bot": "⊥",
360 "neg": "¬",
361 "complement": "∁",
362 "square": "□",
363 "blacksquare": "■",
364 "triangle": "△",
365 "triangledown": "▽",
366 "blacktriangle": "▴",
367 "blacktriangledown": "▾",
368 "lozenge": "◊",
369 "blacklozenge": "⧫",
370 "bigstar": "★",
371 "Diamond": "◇",
372 "clubsuit": "♣",
373 "diamondsuit": "♢",
374 "heartsuit": "♡",
375 "spadesuit": "♠",
376 "flat": "♭",
377 "natural": "♮",
378 "sharp": "♯",
379 "checkmark": "✓",
380 "maltese": "✠",
381 "mho": "℧",
382 "Finv": "Ⅎ",
383 "Game": "⅁",
384 "backslash": "\\",
385 "Vert": "‖",
386 "bigcirc": "◯",
387 "degree": "°",
388 "land": "∧",
389 "lor": "∨",
390 }
391
392 SYMBOL_COMMANDS = {
393 **GREEK_SYMBOLS,
394 **BINARY_SYMBOLS,
395 **RELATION_SYMBOLS,
396 **ARROW_SYMBOLS,
397 **DOT_SYMBOLS,
398 **MISC_SYMBOLS,
399 }
400
401 OPERATOR_BOUNDARY_COMMANDS = frozenset({
402 *BINARY_SYMBOLS,
403 *RELATION_SYMBOLS,
404 *ARROW_SYMBOLS,
405 "bmod",
406 "land",
407 "lor",
408 "mathrel",
409 "mod",
410 "not",
411 "pmod",
412 })
413
414 NARY_COMMANDS = {
415 "sum": ("∑", "operator"),
416 "prod": ("∏", "operator"),
417 "coprod": ("∐", "operator"),
418 "int": ("∫", "integral"),
419 "iint": ("∬", "integral"),
420 "iiint": ("∭", "integral"),
421 "iiiint": ("⨌", "integral"),
422 "oint": ("∮", "integral"),
423 "oiint": ("∯", "integral"),
424 "oiiint": ("∰", "integral"),
425 "pvint": ("⨍", "integral"),
426 "bigcap": ("⋂", "operator"),
427 "bigcup": ("⋃", "operator"),
428 "bigvee": ("⋁", "operator"),
429 "bigwedge": ("⋀", "operator"),
430 "bigoplus": ("⨁", "operator"),
431 "bigotimes": ("⨂", "operator"),
432 "bigodot": ("⨀", "operator"),
433 "biguplus": ("⨄", "operator"),
434 "bigsqcup": ("⨆", "operator"),
435 "bigsqcap": ("⨅", "operator"),
436 }
437
438 ACCENT_COMMANDS = {
439 "hat": "ˆ",
440 "widehat": "̂",
441 "check": "̌",
442 "tilde": "˜",
443 "widetilde": "̃",
444 "acute": "́",
445 "grave": "̀",
446 "dot": "̇",
447 "ddot": "̈",
448 "dddot": "⃛",
449 "ddddot": "⃜",
450 "breve": "̆",
451 "bar": "̅",
452 "vec": "⃗",
453 "mathring": "̊",
454 }
455
456 DELIMITER_COMMANDS = {
457 "lbrace": "{",
458 "rbrace": "}",
459 "langle": "⟨",
460 "rangle": "⟩",
461 "lfloor": "⌊",
462 "rfloor": "⌋",
463 "lceil": "⌈",
464 "rceil": "⌉",
465 "lvert": "|",
466 "rvert": "|",
467 "vert": "|",
468 "lVert": "‖",
469 "rVert": "‖",
470 "Vert": "‖",
471 "lbrack": "[",
472 "rbrack": "]",
473 }
474
475 BARE_DELIMITER_COMMAND_PAIRS = {
476 "langle": ("rangle", "⟨", "⟩"),
477 "lceil": ("rceil", "⌈", "⌉"),
478 "lfloor": ("rfloor", "⌊", "⌋"),
479 "lvert": ("rvert", "|", "|"),
480 "lVert": ("rVert", "‖", "‖"),
481 "lbrace": ("rbrace", "{", "}"),
482 "lbrack": ("rbrack", "[", "]"),
483 }
484
485 STANDARD_FUNCTIONS = frozenset({
486 "arccos",
487 "arcsin",
488 "arctan",
489 "arg",
490 "cos",
491 "cosh",
492 "cot",
493 "coth",
494 "csc",
495 "deg",
496 "det",
497 "dim",
498 "exp",
499 "gcd",
500 "hom",
501 "ker",
502 "lg",
503 "ln",
504 "log",
505 "Pr",
506 "sec",
507 "sin",
508 "sinh",
509 "tan",
510 "tanh",
511 })
512
513 LIMIT_FUNCTIONS = frozenset({
514 "lim",
515 "liminf",
516 "limsup",
517 "sup",
518 "inf",
519 "min",
520 "max",
521 "injlim",
522 "projlim",
523 "varinjlim",
524 "varprojlim",
525 "varliminf",
526 "varlimsup",
527 })
528
529 COLOR_NAMES = {
530 "black": "000000",
531 "blue": "0000FF",
532 "brown": "A52A2A",
533 "cyan": "00FFFF",
534 "darkgray": "A9A9A9",
535 "gray": "808080",
536 "green": "008000",
537 "grey": "808080",
538 "lightgray": "D3D3D3",
539 "lime": "00FF00",
540 "magenta": "FF00FF",
541 "maroon": "800000",
542 "navy": "000080",
543 "olive": "808000",
544 "orange": "FFA500",
545 "pink": "FFC0CB",
546 "purple": "800080",
547 "red": "FF0000",
548 "teal": "008080",
549 "violet": "EE82EE",
550 "white": "FFFFFF",
551 "yellow": "FFFF00",
552 }
553
554 MATRIX_ENVIRONMENTS = {
555 "matrix": None,
556 "pmatrix": ("(", ")"),
557 "bmatrix": ("[", "]"),
558 "Bmatrix": ("{", "}"),
559 "vmatrix": ("|", "|"),
560 "Vmatrix": ("‖", "‖"),
561 "smallmatrix": None,
562 "array": None,
563 "CD": None,
564 }
565
566 EQUATION_ARRAY_ENVIRONMENTS = frozenset({
567 "cases",
568 "rcases",
569 "align",
570 "align*",
571 "aligned",
572 "gathered",
573 "eqnarray",
574 "eqnarray*",
575 "equation",
576 "equation*",
577 "gather",
578 "gather*",
579 "multline",
580 "multline*",
581 "split",
582 "alignat",
583 "alignat*",
584 "alignedat",
585 "subarray",
586 })
587
588 NO_OUTPUT_COMMANDS = frozenset({
589 "displaystyle",
590 "textstyle",
591 "scriptstyle",
592 "scriptscriptstyle",
593 "footnotesize",
594 "tiny",
595 "scriptsize",
596 "small",
597 "normalsize",
598 "large",
599 "Large",
600 "LARGE",
601 "huge",
602 "Huge",
603 "notag",
604 "nonumber",
605 })
606
607 DISCARDED_ARGUMENT_COMMANDS = frozenset({"tag", "label", "ref", "eqref"})
608
609 NEGATED_SYMBOLS = {
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 SPACING_COMMANDS = {
646 "!": "\u200b",
647 ",": "\u2009",
648 ":": "\u205f",
649 ";": "\u2004",
650 " ": " ",
651 "medspace": "\u205f",
652 "thickspace": "\u2004",
653 "enspace": "\u2002",
654 "quad": "\u2003",
655 "qquad": "\u2003\u2003",
656 "space": " ",
657 }
658
659 UNSUPPORTED_COMMANDS = frozenset({
660 "smash",
661 "ensuremath",
662 "mathnormal",
663 "mathord",
664 "mathbin",
665 "mathopen",
666 "mathclose",
667 "mathpunct",
668 "mathinner",
669 "strut",
670 "mathstrut",
671 "rule",
672 "raisebox",
673 "above",
674 "overwithdelims",
675 "atopwithdelims",
676 "abovewithdelims",
677 "let",
678 "providecommand",
679 "edef",
680 "DeclareMathOperator",
681 "sideset",
682 "intertext",
683 "shortintertext",
684 "shoveleft",
685 "shoveright",
686 "hdotsfor",
687 "xleftrightarrow",
688 "xhookleftarrow",
689 "xhookrightarrow",
690 "xmapsto",
691 "nobreakdash",
692 "allowdisplaybreaks",
693 "displaybreak",
694 "numberwithin",
695 "raisetag",
696 "sout",
697 "uline",
698 "uuline",
699 "underbracket",
700 "overbracket",
701 "prescript",
702 "coloneqq",
703 "eqqcolon",
704 "dv",
705 "pdv",
706 "braket",
707 "SI",
708 "tensor",
709 "bond",
710 "pu",
711 })
712
713
714 __all__ = [
715 "ACCENT_COMMANDS",
716 "ARROW_SYMBOLS",
717 "BARE_DELIMITER_COMMAND_PAIRS",
718 "BINARY_SYMBOLS",
719 "COLOR_NAMES",
720 "DELIMITER_COMMANDS",
721 "DISCARDED_ARGUMENT_COMMANDS",
722 "EQUATION_ARRAY_ENVIRONMENTS",
723 "GREEK_SYMBOLS",
724 "LIMIT_FUNCTIONS",
725 "MATRIX_ENVIRONMENTS",
726 "NARY_COMMANDS",
727 "NEGATED_SYMBOLS",
728 "NO_OUTPUT_COMMANDS",
729 "OFFICE_LATEX_PROFILE",
730 "OFFICE_LATEX_SOURCE_COMMIT",
731 "OFFICE_MHCHEM_SOURCE_COMMIT",
732 "OPERATOR_BOUNDARY_COMMANDS",
733 "RELATION_SYMBOLS",
734 "SPACING_COMMANDS",
735 "STANDARD_FUNCTIONS",
736 "SYMBOL_COMMANDS",
737 "UNSUPPORTED_COMMANDS",
738 "VARIANT_UPPERCASE_GREEK",
739 ]
740
740 lines PYTHON