matplotlib
152 строки · 5.3 Кб
1import re
2from docutils.parsers.rst import Directive
3
4from matplotlib import _mathtext, _mathtext_data
5
6bb_pattern = re.compile("Bbb[A-Z]")
7scr_pattern = re.compile("scr[a-zA-Z]")
8frak_pattern = re.compile("frak[A-Z]")
9
10symbols = [
11["Lower-case Greek",
124,
13(r"\alpha", r"\beta", r"\gamma", r"\chi", r"\delta", r"\epsilon",
14r"\eta", r"\iota", r"\kappa", r"\lambda", r"\mu", r"\nu", r"\omega",
15r"\phi", r"\pi", r"\psi", r"\rho", r"\sigma", r"\tau", r"\theta",
16r"\upsilon", r"\xi", r"\zeta", r"\digamma", r"\varepsilon", r"\varkappa",
17r"\varphi", r"\varpi", r"\varrho", r"\varsigma", r"\vartheta")],
18["Upper-case Greek",
194,
20(r"\Delta", r"\Gamma", r"\Lambda", r"\Omega", r"\Phi", r"\Pi", r"\Psi",
21r"\Sigma", r"\Theta", r"\Upsilon", r"\Xi")],
22["Hebrew",
236,
24(r"\aleph", r"\beth", r"\gimel", r"\daleth")],
25["Latin named characters",
266,
27r"""\aa \AA \ae \AE \oe \OE \O \o \thorn \Thorn \ss \eth \dh \DH""".split()],
28["Delimiters",
295,
30_mathtext.Parser._delims],
31["Big symbols",
325,
33_mathtext.Parser._overunder_symbols | _mathtext.Parser._dropsub_symbols],
34["Standard function names",
355,
36{fr"\{fn}" for fn in _mathtext.Parser._function_names}],
37["Binary operation symbols",
384,
39_mathtext.Parser._binary_operators],
40["Relation symbols",
414,
42_mathtext.Parser._relation_symbols],
43["Arrow symbols",
444,
45_mathtext.Parser._arrow_symbols],
46["Dot symbols",
474,
48r"""\cdots \vdots \ldots \ddots \adots \Colon \therefore \because""".split()],
49["Black-board characters",
506,
51[fr"\{symbol}" for symbol in _mathtext_data.tex2uni
52if re.match(bb_pattern, symbol)]],
53["Script characters",
546,
55[fr"\{symbol}" for symbol in _mathtext_data.tex2uni
56if re.match(scr_pattern, symbol)]],
57["Fraktur characters",
586,
59[fr"\{symbol}" for symbol in _mathtext_data.tex2uni
60if re.match(frak_pattern, symbol)]],
61["Miscellaneous symbols",
624,
63r"""\neg \infty \forall \wp \exists \bigstar \angle \partial
64\nexists \measuredangle \emptyset \sphericalangle \clubsuit
65\varnothing \complement \diamondsuit \imath \Finv \triangledown
66\heartsuit \jmath \Game \spadesuit \ell \hbar \vartriangle
67\hslash \blacksquare \blacktriangle \sharp \increment
68\prime \blacktriangledown \Im \flat \backprime \Re \natural
69\circledS \P \copyright \circledR \S \yen \checkmark \$
70\cent \triangle \QED \sinewave \dag \ddag \perthousand \ac
71\lambdabar \L \l \degree \danger \maltese \clubsuitopen
72\i \hermitmatrix \sterling \nabla \mho""".split()],
73]
74
75
76def run(state_machine):
77
78def render_symbol(sym, ignore_variant=False):
79if ignore_variant and sym not in (r"\varnothing", r"\varlrtriangle"):
80sym = sym.replace(r"\var", "\\")
81if sym.startswith("\\"):
82sym = sym.lstrip("\\")
83if sym not in (_mathtext.Parser._overunder_functions |
84_mathtext.Parser._function_names):
85sym = chr(_mathtext_data.tex2uni[sym])
86return f'\\{sym}' if sym in ('\\', '|', '+', '-', '*') else sym
87
88lines = []
89for category, columns, syms in symbols:
90syms = sorted(syms,
91# Sort by Unicode and place variants immediately
92# after standard versions.
93key=lambda sym: (render_symbol(sym, ignore_variant=True),
94sym.startswith(r"\var")),
95reverse=(category == "Hebrew")) # Hebrew is rtl
96rendered_syms = [f"{render_symbol(sym)} ``{sym}``" for sym in syms]
97columns = min(columns, len(syms))
98lines.append("**%s**" % category)
99lines.append('')
100max_width = max(map(len, rendered_syms))
101header = (('=' * max_width) + ' ') * columns
102lines.append(header.rstrip())
103for part in range(0, len(rendered_syms), columns):
104row = " ".join(
105sym.rjust(max_width) for sym in rendered_syms[part:part + columns])
106lines.append(row)
107lines.append(header.rstrip())
108lines.append('')
109
110state_machine.insert_input(lines, "Symbol table")
111return []
112
113
114class MathSymbolTableDirective(Directive):
115has_content = False
116required_arguments = 0
117optional_arguments = 0
118final_argument_whitespace = False
119option_spec = {}
120
121def run(self):
122return run(self.state_machine)
123
124
125def setup(app):
126app.add_directive("math_symbol_table", MathSymbolTableDirective)
127
128metadata = {'parallel_read_safe': True, 'parallel_write_safe': True}
129return metadata
130
131
132if __name__ == "__main__":
133# Do some verification of the tables
134
135print("SYMBOLS NOT IN STIX:")
136all_symbols = {}
137for category, columns, syms in symbols:
138if category == "Standard Function Names":
139continue
140for sym in syms:
141if len(sym) > 1:
142all_symbols[sym[1:]] = None
143if sym[1:] not in _mathtext_data.tex2uni:
144print(sym)
145
146# Add accents
147all_symbols.update({v[1:]: k for k, v in _mathtext.Parser._accent_map.items()})
148all_symbols.update({v: v for v in _mathtext.Parser._wide_accents})
149print("SYMBOLS NOT IN TABLE:")
150for sym, val in _mathtext_data.tex2uni.items():
151if sym not in all_symbols:
152print(f"{sym} = {chr(val)}")
153