8000 Merge pull request #26173 from oscargus/symboldocs · matplotlib/matplotlib@ac95c22 · GitHub
[go: up one dir, main page]

Skip to content

Commit ac95c22

Browse files
authored
Merge pull request #26173 from oscargus/symboldocs
Synchronize mathtext docs and handling
2 parents 0a6beed + ee02182 commit ac95c22

File tree

6 files changed

+120
-82
lines changed

6 files changed

+120
-82
lines changed

doc/sphinxext/math_symbol_table.py

Lines changed: 42 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
import re
12
from docutils.parsers.rst import Directive
23

34
from matplotlib import _mathtext, _mathtext_data
45

6+
bb_pattern = re.compile("Bbb[A-Z]")
7+
scr_pattern = re.compile("scr[a-zA-Z]")
8+
frak_pattern = re.compile("frak[A-Z]")
59

610
symbols = [
711
["Lower-case Greek",
@@ -18,6 +22,9 @@
1822
["Hebrew",
1923
6,
2024
(r"\aleph", r"\beth", r"\gimel", r"\daleth")],
25+
["Latin named characters",
26+
6,
27+
r"""\aa \AA \ae \AE \oe \OE \O \o \thorn \Thorn \ss \eth \dh \DH""".split()],
2128
["Delimiters",
2229
5,
2330
_mathtext.Parser._delims],
@@ -27,85 +34,56 @@
2734
["Standard function names",
2835
5,
2936
{fr"\{fn}" for fn in _mathtext.Parser._function_names}],
30-
["Binary operation and relation symbols",
37+
["Binary operation symbols",
38+
4,
39+
_mathtext.Parser._binary_operators],
40+
["Relation symbols",
3141
4,
32-
r"""\ast \pm \slash \cap \star \mp \cup \cdot \uplus
33-
\triangleleft \circ \odot \sqcap \triangleright \bullet \ominus
34-
\sqcup \bigcirc \oplus \wedge \diamond \oslash \vee
35-
\bigtriangledown \times \otimes \dag \bigtriangleup \div \wr
36-
\ddag \barwedge \veebar \boxplus \curlywedge \curlyvee \boxminus
37-
\Cap \Cup \boxtimes \bot \top \dotplus \boxdot \intercal
38-
\rightthreetimes \divideontimes \leftthreetimes \equiv \leq \geq
39-
\perp \cong \prec \succ \mid \neq \preceq \succeq \parallel \sim
40-
\ll \gg \bowtie \simeq \subset \supset \Join \approx \subseteq
41-
\supseteq \ltimes \asymp \sqsubset \sqsupset \rtimes \doteq
42-
\sqsubseteq \sqsupseteq \smile \propto \dashv \vdash \frown
43-
\models \in \ni \notin \approxeq \leqq \geqq \lessgtr \leqslant
44-
\geqslant \lesseqgtr \backsim \lessapprox \gtrapprox \lesseqqgtr
45-
\backsimeq \lll \ggg \gtreqqless \triangleq \lessdot \gtrdot
46-
\gtreqless \circeq \lesssim \gtrsim \gtrless \bumpeq \eqslantless
47-
\eqslantgtr \backepsilon \Bumpeq \precsim \succsim \between
48-
\doteqdot \precapprox \succapprox \pitchfork \Subset \Supset
49-
\fallingdotseq \subseteqq \supseteqq \risingdotseq \sqsubset
50-
\sqsupset \varpropto \preccurlyeq \succcurlyeq \Vdash \therefore
51-
\curlyeqprec \curlyeqsucc \vDash \because \blacktriangleleft
52-
\blacktriangleright \Vvdash \eqcirc \trianglelefteq
53-
\trianglerighteq \neq \vartriangleleft \vartriangleright \ncong
54-
\nleq \ngeq \nsubseteq \nmid \nsupseteq \nparallel \nless \ngtr
55-
\nprec \nsucc \subsetneq \nsim \supsetneq \nVDash \precnapprox
56-
\succnapprox \subsetneqq \nvDash \precnsim \succnsim \supsetneqq
57-
\nvdash \lnapprox \gnapprox \ntriangleleft \ntrianglelefteq
58-
\lneqq \gneqq \ntriangleright \lnsim \gnsim \ntrianglerighteq
59-
\coloneq \eqsim \nequiv \napprox \nsupset \doublebarwedge \nVdash
60-
\Doteq \nsubset \eqcolon \ne
61-
""".split()],
42+
_mathtext.Parser._relation_symbols],
6243
["Arrow symbols",
6344
4,
64-
r"""\leftarrow \longleftarrow \uparrow \Leftarrow \Longleftarrow
65-
\Uparrow \rightarrow \longrightarrow \downarrow \Rightarrow
66-
\Longrightarrow \Downarrow \leftrightarrow \updownarrow
67-
\longleftrightarrow \updownarrow \Leftrightarrow
68-
\Longleftrightarrow \Updownarrow \mapsto \longmapsto \nearrow
69-
\hookleftarrow \hookrightarrow \searrow \leftharpoonup
70-
\rightharpoonup \swarrow \leftharpoondown \rightharpoondown
71-
\nwarrow \rightleftharpoons \leadsto \dashrightarrow
72-
\dashleftarrow \leftleftarrows \leftrightarrows \Lleftarrow
73-
\Rrightarrow \twoheadleftarrow \leftarrowtail \looparrowleft
74-
\leftrightharpoons \curvearrowleft \circlearrowleft \Lsh
75-
\upuparrows \upharpoonleft \downharpoonleft \multimap
76-
\leftrightsquigarrow \rightrightarrows \rightleftarrows
77-
\rightrightarrows \rightleftarrows \twoheadrightarrow
78-
\rightarrowtail \looparrowright \rightleftharpoons
79-
\curvearrowright \circlearrowright \Rsh \downdownarrows
80-
\upharpoonright \downharpoonright \rightsquigarrow \nleftarrow
81-
\nrightarrow \nLeftarrow \nRightarrow \nleftrightarrow
82-
\nLeftrightarrow \to \Swarrow \Searrow \Nwarrow \Nearrow
83-
\leftsquigarrow
84-
""".split()],
45+
_mathtext.Parser._arrow_symbols],
46+
["Dot symbols",
47+
4,
48+
r"""\cdots \vdots \ldots \ddots \adots \Colon \therefore \because""".split()],
49+
["Black-board characters",
50+
6,
51+
[fr"\{symbol}" for symbol in _mathtext_data.tex2uni
52+
if re.match(bb_pattern, symbol)]],
53+
["Script characters",
54+
6,
55+
[fr"\{symbol}" for symbol in _mathtext_data.tex2uni
56+
if re.match(scr_pattern, symbol)]],
57+
["Fraktur characters",
58+
6,
59+
[fr"\{symbol}" for symbol in _mathtext_data.tex2uni
60+
if re.match(frak_pattern, symbol)]],
8561
["Miscellaneous symbols",
8662
4,
8763
r"""\neg \infty \forall \wp \exists \bigstar \angle \partial
88-
\nexists \measuredangle \eth \emptyset \sphericalangle \clubsuit
64+
\nexists \measuredangle \emptyset \sphericalangle \clubsuit
8965
\varnothing \complement \diamondsuit \imath \Finv \triangledown
90-
\heartsuit \jmath \Game \spadesuit \ell \hbar \vartriangle \cdots
91-
\hslash \vdots \blacksquare \ldots \blacktriangle \ddots \sharp
66+
\heartsuit \jmath \Game \spadesuit \ell \hbar \vartriangle
67+
\hslash \blacksquare \blacktriangle \sharp \increment
9268
\prime \blacktriangledown \Im \flat \backprime \Re \natural
93-
\circledS \P \copyright \ss \circledR \S \yen \AA \checkmark \$
94-
\cent \triangle \QED \sinewave \nabla \mho""".split()]
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()],
9573
]
9674

9775

9876
def run(state_machine):
9977

10078
def render_symbol(sym, ignore_variant=False):
101-
if ignore_variant and sym != r"\varnothing":
79+
if ignore_variant and sym not in (r"\varnothing", r"\varlrtriangle"):
10280
sym = sym.replace(r"\var", "\\")
10381
if sym.startswith("\\"):
10482
sym = sym.lstrip("\\")
10583
if sym not in (_mathtext.Parser._overunder_functions |
10684
_mathtext.Parser._function_names):
10785
sym = chr(_mathtext_data.tex2uni[sym])
108-
return f'\\{sym}' if sym in ('\\', '|') else sym
86+
return f'\\{sym}' if sym in ('\\', '|', '+', '-', '*') else sym
10987

11088
lines = []
11189
for category, columns, syms in symbols:
@@ -165,7 +143,10 @@ def setup(app):
165143
if sym[1:] not in _mathtext_data.tex2uni:
166144
print(sym)
167145

146+
# Add accents
147+
all_symbols.update({v[1:]: k for k, v in _mathtext.Parser._accent_map.items()})
148+
all_symbols.update({v: v for v in _mathtext.Parser._wide_accents})
168149
print("SYMBOLS NOT IN TABLE:")
169-
for sym in _mathtext_data.tex2uni:
150+
for sym, val in _mathtext_data.tex2uni.items():
170151
if sym not in all_symbols:
171-
print(sym)
152+
print(f"{sym} = {chr(val)}")
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
``mathtext`` documentation improvements
2+
---------------------------------------
3+
4+
The documentation is updated to take information directly from the parser. This
5+
means that (almost) all supported symbols, operators etc are shown at :ref:`mathtext`.

doc/users/next_whats_new/mathtext_relation_operators.rst

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,3 @@ There has been a number of operators added and corrected when a Unicode font is
55
In addition, correct spacing has been added to a number of the previous operators.
66
Especially, the characters used for ``\gnapprox``, ``\lnapprox``, ``\leftangle``, and
77
``\rightangle`` have been corrected.
8-
9-
All supported operators can be seen at :ref:`mathtext`.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
``mathtext`` spacing corrections
2+
--------------------------------
3+
4+
As consequence of the updated documentation, the spacing on a number of relational and
5+
operator symbols were classified like that and therefore will be spaced properly.

lib/matplotlib/_mathtext.py

Lines changed: 63 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1733,7 +1733,17 @@ class _MathStyle(enum.Enum):
17331733
\cap \triangleleft \dagger
17341734
\cup \triangleright \ddagger
17351735
\uplus \lhd \amalg
1736-
\dotplus \dotminus'''.split())
1736+
\dotplus \dotminus \Cap
1737+
\Cup \barwedge \boxdot
1738+
\boxminus \boxplus \boxtimes
1739+
\curlyvee \curlywedge \divideontimes
1740+
\doublebarwedge \leftthreetimes \rightthreetimes
1741+
\slash \veebar \barvee
1742+
\cupdot \intercal \amalg
1743+
\circledcirc \circleddash \circledast
1744+
\boxbar \obar \merge
1745+
\minuscolon \dotsminusdots
1746+
'''.split())
17371747

17381748
_relation_symbols = set(r'''
17391749
= < > :
@@ -1768,20 +1778,53 @@ class _MathStyle(enum.Enum):
17681778
\trianglelefteq \ntrianglelefteq \trianglerighteq
17691779
\ntrianglerighteq \blacktriangleleft \blacktriangleright
17701780
\equalparallel \measuredrightangle \varlrtriangle
1771-
'''.split())
1772-
1773-
_arrow_symbols = set(r'''
1774-
\leftarrow \longleftarrow \uparrow
1775-
\Leftarrow \Longleftarrow \Uparrow
1776-
\rightarrow \longrightarrow \downarrow
1777-
\Rightarrow \Longrightarrow \Downarrow
1778-
\leftrightarrow \longleftrightarrow \updownarrow
1779-
\Leftrightarrow \Longleftrightarrow \Updownarrow
1780-
\mapsto \longmapsto \nearrow
1781-
\hookleftarrow \hookrightarrow \searrow
1782-
\leftharpoonup \rightharpoonup \swarrow
1783-
\leftharpoondown \rightharpoondown \nwarrow
1784-
\rightleftharpoons \leadsto'''.split())
1781+
\Doteq \Bumpeq \Subset \Supset
1782+
\backepsilon \because \therefore \bot
1783+
\top \bumpeq \circeq \coloneq
1784+
\curlyeqprec \curlyeqsucc \eqcirc \eqcolon
1785+
\eqsim \fallingdotseq \gtrdot \gtrless
1786+
\ltimes \rtimes \lessdot \ne
1787+
\ncong \nequiv \ngeq \ngtr
1788+
\nleq \nless \nmid \notin
1789+
\nprec \nsubset \nsubseteq \nsucc
1790+
\nsupset \nsupseteq \pitchfork \preccurlyeq
1791+
\risingdotseq \subsetneq \succcurlyeq \supsetneq
1792+
\varpropto \vartriangleleft \scurel
1793+
\vartriangleright \rightangle \equal \backcong
1794+
\eqdef \wedgeq \questeq \between
1795+
\veeeq \disin \varisins \isins
1796+
\isindot \varisinobar \isinobar \isinvb
1797+
\isinE \nisd \varnis \nis
1798+
\varniobar \niobar \bagmember \ratio
1799+
\Equiv \stareq \measeq \arceq
1800+
\rightassert \rightModels \smallin \smallowns
1801+
\notsmallowns \nsimeq'''.split())
1802+
1803+
_arrow_symbols = set(r"""
1804+
\leftarrow \longleftarrow \uparrow \Leftarrow \Longleftarrow
1805+
\Uparrow \rightarrow \longrightarrow \downarrow \Rightarrow
1806+
\Longrightarrow \Downarrow \leftrightarrow \updownarrow
1807+
\longleftrightarrow \updownarrow \Leftrightarrow
1808+
\Longleftrightarrow \Updownarrow \mapsto \longmapsto \nearrow
1809+
\hookleftarrow \hookrightarrow \searrow \leftharpoonup
1810+
\rightharpoonup \swarrow \leftharpoondown \rightharpoondown
1811+
\nwarrow \rightleftharpoons \leadsto \dashrightarrow
1812+
\dashleftarrow \leftleftarrows \leftrightarrows \Lleftarrow
1813+
\Rrightarrow \twoheadleftarrow \leftarrowtail \looparrowleft
1814+
\leftrightharpoons \curvearrowleft \circlearrowleft \Lsh
1815+
\upuparrows \upharpoonleft \downharpoonleft \multimap
1816+
\leftrightsquigarrow \rightrightarrows \rightleftarrows
1817+
\rightrightarrows \rightleftarrows \twoheadrightarrow
1818+
\rightarrowtail \looparrowright \rightleftharpoons
1819+
\curvearrowright \circlearrowright \Rsh \downdownarrows
1820+
\upharpoonright \downharpoonright \rightsquigarrow \nleftarrow
1821+
\nrightarrow \nLeftarrow \nRightarrow \nleftrightarrow
1822+
\nLeftrightarrow \to \Swarrow \Searrow \Nwarrow \Nearrow
1823+
\leftsquigarrow \overleftarrow \overleftrightarrow \cwopencirclearrow
1824+
\downzigzagarrow \cupleftarrow \rightzigzagarrow \twoheaddownarrow
1825+
\updownarrowbar \twoheaduparrow \rightarrowbar \updownarrows
1826+
\barleftarrow \mapsfrom \mapsdown \mapsup \Ldsh \Rdsh
1827+
""".split())
17851828

17861829
_spaced_symbols = _binary_operators | _relation_symbols | _arrow_symbols
17871830

@@ -2116,9 +2159,11 @@ def symbol(self, s, loc, toks):
21162159
# such as ${ -2}$, $ -2$, or $ -2$.
21172160
prev_char = next((c for c in s[:loc][::-1] if c != ' '), '')
21182161
# Binary operators at start of string should not be spaced
2119-
if (c in self._binary_operators and
2120-
(len(s[:loc].split()) == 0 or prev_char == '{' or
2121-
prev_char in self._left_delims)):
2162+
# Also, operators in sub- or superscripts should not be spaced
2163+
if (self._in_subscript_or_superscript or (
2164+
c in self._binary_operators and (
2165+
len(s[:loc].split()) == 0 or prev_char == '{' or
2166+
prev_char in self._left_delims))):
21222167
return [char]
21232168
else:
21242169
return [Hlist([self._make_space(0.2),

lib/matplotlib/_mathtext_data.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,8 @@
800800
'eta' : 951,
801801
'forall' : 8704,
802802
'eth' : 240,
803+
'dh' : 240,
804+
'DH' : 208,
803805
'colon' : 58,
804806
'sqcup' : 8852,
805807
'bigsqcup' : 10758,
@@ -908,7 +910,7 @@
908910
'O' : 216,
909911
'hookleftarrow' : 8617,
910912
'trianglerighteq' : 8885,
911-
'nsime' : 8772,
913+
'nsimeq' : 8772,
912914
'oe' : 339,
913915
'nwarrow' : 8598,
914916
'o' : 248,
@@ -1090,6 +1092,8 @@
10901092
'bagmember' : 8959,
10911093
'triangle' : 9651,
10921094
'iiiint' : 10764,
1095+
'amalg' : 10815,
1096+
'merge' : 10837,
10931097
}
10941098

10951099
# Each element is a 4-tuple of the form:

0 commit comments

Comments
 (0)
0