From fcf75ddbe535fe6a562efbe88f928437b2cd43a6 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Fri, 23 Jun 2023 12:23:49 +0200 Subject: [PATCH 1/2] Synchronize mathtext docs and handling --- doc/sphinxext/math_symbol_table.py | 98 ++++++++----------- .../next_whats_new/mathtext_documentation.rst | 5 + .../mathtext_relation_operators.rst | 2 - lib/matplotlib/_mathtext.py | 75 +++++++++++--- lib/matplotlib/_mathtext_data.py | 6 +- lib/matplotlib/tests/test_mathtext.py | 2 +- 6 files changed, 109 insertions(+), 79 deletions(-) create mode 100644 doc/users/next_whats_new/mathtext_documentation.rst diff --git a/doc/sphinxext/math_symbol_table.py b/doc/sphinxext/math_symbol_table.py index 74b1ac638d73..a195e073831f 100644 --- a/doc/sphinxext/math_symbol_table.py +++ b/doc/sphinxext/math_symbol_table.py @@ -1,7 +1,11 @@ +import re from docutils.parsers.rst import Directive from matplotlib import _mathtext, _mathtext_data +bb_pattern = re.compile("Bbb[A-Z]") +scr_pattern = re.compile("scr[a-zA-Z]") +frak_pattern = re.compile("frak[A-Z]") symbols = [ ["Lower-case Greek", @@ -18,6 +22,9 @@ ["Hebrew", 6, (r"\aleph", r"\beth", r"\gimel", r"\daleth")], + ["Latin named characters", + 6, + r"""\aa \AA \ae \AE \oe \OE \O \o \thorn \Thorn \ss \eth \dh \DH""".split()], ["Delimiters", 5, _mathtext.Parser._delims], @@ -27,71 +34,42 @@ ["Standard function names", 5, {fr"\{fn}" for fn in _mathtext.Parser._function_names}], - ["Binary operation and relation symbols", + ["Binary operation symbols", + 4, + _mathtext.Parser._binary_operators], + ["Relation symbols", 4, - r"""\ast \pm \slash \cap \star \mp \cup \cdot \uplus - \triangleleft \circ \odot \sqcap \triangleright \bullet \ominus - \sqcup \bigcirc \oplus \wedge \diamond \oslash \vee - \bigtriangledown \times \otimes \dag \bigtriangleup \div \wr - \ddag \barwedge \veebar \boxplus \curlywedge \curlyvee \boxminus - \Cap \Cup \boxtimes \bot \top \dotplus \boxdot \intercal - \rightthreetimes \divideontimes \leftthreetimes \equiv \leq \geq - \perp \cong \prec \succ \mid \neq \preceq \succeq \parallel \sim - \ll \gg \bowtie \simeq \subset \supset \Join \approx \subseteq - \supseteq \ltimes \asymp \sqsubset \sqsupset \rtimes \doteq - \sqsubseteq \sqsupseteq \smile \propto \dashv \vdash \frown - \models \in \ni \notin \approxeq \leqq \geqq \lessgtr \leqslant - \geqslant \lesseqgtr \backsim \lessapprox \gtrapprox \lesseqqgtr - \backsimeq \lll \ggg \gtreqqless \triangleq \lessdot \gtrdot - \gtreqless \circeq \lesssim \gtrsim \gtrless \bumpeq \eqslantless - \eqslantgtr \backepsilon \Bumpeq \precsim \succsim \between - \doteqdot \precapprox \succapprox \pitchfork \Subset \Supset - \fallingdotseq \subseteqq \supseteqq \risingdotseq \sqsubset - \sqsupset \varpropto \preccurlyeq \succcurlyeq \Vdash \therefore - \curlyeqprec \curlyeqsucc \vDash \because \blacktriangleleft - \blacktriangleright \Vvdash \eqcirc \trianglelefteq - \trianglerighteq \neq \vartriangleleft \vartriangleright \ncong - \nleq \ngeq \nsubseteq \nmid \nsupseteq \nparallel \nless \ngtr - \nprec \nsucc \subsetneq \nsim \supsetneq \nVDash \precnapprox - \succnapprox \subsetneqq \nvDash \precnsim \succnsim \supsetneqq - \nvdash \lnapprox \gnapprox \ntriangleleft \ntrianglelefteq - \lneqq \gneqq \ntriangleright \lnsim \gnsim \ntrianglerighteq - \coloneq \eqsim \nequiv \napprox \nsupset \doublebarwedge \nVdash - \Doteq \nsubset \eqcolon \ne - """.split()], + _mathtext.Parser._relation_symbols], ["Arrow symbols", 4, - r"""\leftarrow \longleftarrow \uparrow \Leftarrow \Longleftarrow - \Uparrow \rightarrow \longrightarrow \downarrow \Rightarrow - \Longrightarrow \Downarrow \leftrightarrow \updownarrow - \longleftrightarrow \updownarrow \Leftrightarrow - \Longleftrightarrow \Updownarrow \mapsto \longmapsto \nearrow - \hookleftarrow \hookrightarrow \searrow \leftharpoonup - \rightharpoonup \swarrow \leftharpoondown \rightharpoondown - \nwarrow \rightleftharpoons \leadsto \dashrightarrow - \dashleftarrow \leftleftarrows \leftrightarrows \Lleftarrow - \Rrightarrow \twoheadleftarrow \leftarrowtail \looparrowleft - \leftrightharpoons \curvearrowleft \circlearrowleft \Lsh - \upuparrows \upharpoonleft \downharpoonleft \multimap - \leftrightsquigarrow \rightrightarrows \rightleftarrows - \rightrightarrows \rightleftarrows \twoheadrightarrow - \rightarrowtail \looparrowright \rightleftharpoons - \curvearrowright \circlearrowright \Rsh \downdownarrows - \upharpoonright \downharpoonright \rightsquigarrow \nleftarrow - \nrightarrow \nLeftarrow \nRightarrow \nleftrightarrow - \nLeftrightarrow \to \Swarrow \Searrow \Nwarrow \Nearrow - \leftsquigarrow - """.split()], + _mathtext.Parser._arrow_symbols], + ["Dot symbols", + 4, + r"""\cdots \vdots \ldots \ddots \adots \Colon \therefore \because""".split()], + ["Black-board characters", + 6, + [fr"\{symbol}" for symbol in _mathtext_data.tex2uni + if re.match(bb_pattern, symbol)]], + ["Script characters", + 6, + [fr"\{symbol}" for symbol in _mathtext_data.tex2uni + if re.match(scr_pattern, symbol)]], + ["Fraktur characters", + 6, + [fr"\{symbol}" for symbol in _mathtext_data.tex2uni + if re.match(frak_pattern, symbol)]], ["Miscellaneous symbols", 4, r"""\neg \infty \forall \wp \exists \bigstar \angle \partial - \nexists \measuredangle \eth \emptyset \sphericalangle \clubsuit + \nexists \measuredangle \emptyset \sphericalangle \clubsuit \varnothing \complement \diamondsuit \imath \Finv \triangledown - \heartsuit \jmath \Game \spadesuit \ell \hbar \vartriangle \cdots - \hslash \vdots \blacksquare \ldots \blacktriangle \ddots \sharp + \heartsuit \jmath \Game \spadesuit \ell \hbar \vartriangle + \hslash \blacksquare \blacktriangle \sharp \increment \prime \blacktriangledown \Im \flat \backprime \Re \natural - \circledS \P \copyright \ss \circledR \S \yen \AA \checkmark \$ - \cent \triangle \QED \sinewave \nabla \mho""".split()] + \circledS \P \copyright \circledR \S \yen \checkmark \$ + \cent \triangle \QED \sinewave \dag \ddag \perthousand + \lambdabar \L \l \degree \danger \maltese + \i \hermitmatrix \sterling \nabla \mho""".split()], ] @@ -165,7 +143,9 @@ def setup(app): if sym[1:] not in _mathtext_data.tex2uni: print(sym) + # Add accents + all_symbols.update({v[1:]: k for k, v in _mathtext.Parser._accent_map.items()}) print("SYMBOLS NOT IN TABLE:") - for sym in _mathtext_data.tex2uni: + for sym, val in _mathtext_data.tex2uni.items(): if sym not in all_symbols: - print(sym) + print(f"{sym} = {chr(val)}") diff --git a/doc/users/next_whats_new/mathtext_documentation.rst b/doc/users/next_whats_new/mathtext_documentation.rst new file mode 100644 index 000000000000..2b7cd51b702c --- /dev/null +++ b/doc/users/next_whats_new/mathtext_documentation.rst @@ -0,0 +1,5 @@ +``mathtext`` documentation improvements +--------------------------------------- + +The documentation is updated to take information directly from the parser. This +means that (almost) all supported symbols, operators etc are shown at :ref:`mathtext`. diff --git a/doc/users/next_whats_new/mathtext_relation_operators.rst b/doc/users/next_whats_new/mathtext_relation_operators.rst index 7bc7f47bdddc..1f9773a845df 100644 --- a/doc/users/next_whats_new/mathtext_relation_operators.rst +++ b/doc/users/next_whats_new/mathtext_relation_operators.rst @@ -5,5 +5,3 @@ There has been a number of operators added and corrected when a Unicode font is In addition, correct spacing has been added to a number of the previous operators. Especially, the characters used for ``\gnapprox``, ``\lnapprox``, ``\leftangle``, and ``\rightangle`` have been corrected. - -All supported operators can be seen at :ref:`mathtext`. diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index d86385e94589..7a8cd0ae96fa 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -1734,7 +1734,17 @@ class _MathStyle(enum.Enum): \cap \triangleleft \dagger \cup \triangleright \ddagger \uplus \lhd \amalg - \dotplus \dotminus'''.split()) + \dotplus \dotminus \Cap + \Cup \barwedge \boxdot + \boxminus \boxplus \boxtimes + \curlyvee \curlywedge \divideontimes + \doublebarwedge \leftthreetimes \rightthreetimes + \slash \veebar \barvee + \cupdot \intercal \amalg + \circledcirc \circleddash \circledast + \boxbar \obar \merge + \minuscolon \dotsminusdots + '''.split()) _relation_symbols = set(r''' = < > : @@ -1768,21 +1778,54 @@ class _MathStyle(enum.Enum): \triangleright \ntriangleleft \ntriangleright \trianglelefteq \ntrianglelefteq \trianglerighteq \ntrianglerighteq \blacktriangleleft \blacktriangleright - \equalparallel \measuredrightangle \varlrtriangle - '''.split()) - - _arrow_symbols = set(r''' - \leftarrow \longleftarrow \uparrow - \Leftarrow \Longleftarrow \Uparrow - \rightarrow \longrightarrow \downarrow - \Rightarrow \Longrightarrow \Downarrow - \leftrightarrow \longleftrightarrow \updownarrow - \Leftrightarrow \Longleftrightarrow \Updownarrow - \mapsto \longmapsto \nearrow - \hookleftarrow \hookrightarrow \searrow - \leftharpoonup \rightharpoonup \swarrow - \leftharpoondown \rightharpoondown \nwarrow - \rightleftharpoons \leadsto'''.split()) + \equalparallel \measuredrightangle \lrtriangle + \Doteq \Bumpeq \Subset \Supset + \backepsilon \because \therefore \bot + \top \bumpeq \circeq \coloneq + \curlyeqprec \curlyeqsucc \eqcirc \eqcolon + \eqsim \fallingdotseq \gtrdot \gtrless + \ltimes \rtimes \lessdot \ne + \ncong \nequiv \ngeq \ngtr + \nleq \nless \nmid \notin + \nprec \nsubset \nsubseteq \nsucc + \nsupset \nsupseteq \pitchfork \preccurlyeq + \risingdotseq \subsetneq \succcurlyeq \supsetneq + \varpropto \vartriangleleft \scurel + \vartriangleright \rightangle \equal \backcong + \eqdef \wedgeq \questeq \between + \veeeq \disin \varisins \isins + \isindot \varisinobar \isinobar \isinvb + \isinE \nisd \varnis \nis + \varniobar \niobar \bagmember \ratio + \Equiv \stareq \measeq \arceq + \rightassert \rightModels \smallin \smallowns + \notsmallowns'''.split()) + + _arrow_symbols = set(r""" + \leftarrow \longleftarrow \uparrow \Leftarrow \Longleftarrow + \Uparrow \rightarrow \longrightarrow \downarrow \Rightarrow + \Longrightarrow \Downarrow \leftrightarrow \updownarrow + \longleftrightarrow \updownarrow \Leftrightarrow + \Longleftrightarrow \Updownarrow \mapsto \longmapsto \nearrow + \hookleftarrow \hookrightarrow \searrow \leftharpoonup + \rightharpoonup \swarrow \leftharpoondown \rightharpoondown + \nwarrow \rightleftharpoons \leadsto \dashrightarrow + \dashleftarrow \leftleftarrows \leftrightarrows \Lleftarrow + \Rrightarrow \twoheadleftarrow \leftarrowtail \looparrowleft + \leftrightharpoons \curvearrowleft \circlearrowleft \Lsh + \upuparrows \upharpoonleft \downharpoonleft \multimap + \leftrightsquigarrow \rightrightarrows \rightleftarrows + \rightrightarrows \rightleftarrows \twoheadrightarrow + \rightarrowtail \looparrowright \rightleftharpoons + \curvearrowright \circlearrowright \Rsh \downdownarrows + \upharpoonright \downharpoonright \rightsquigarrow \nleftarrow + \nrightarrow \nLeftarrow \nRightarrow \nleftrightarrow + \nLeftrightarrow \to \Swarrow \Searrow \Nwarrow \Nearrow + \leftsquigarrow \overleftarrow \overleftrightarrow \cwopencirclearrow + \downzigzagarrow \cupleftarrow \rightzigzagarrow \twoheaddownarrow + \updownarrowbar \twoheaduparrow \rightarrowbar \updownarrows + \barleftarrow \mapsfrom \mapsdown \mapsup \Ldsh \Rdsh + """.split()) _spaced_symbols = _binary_operators | _relation_symbols | _arrow_symbols diff --git a/lib/matplotlib/_mathtext_data.py b/lib/matplotlib/_mathtext_data.py index 40ba4f96f103..8d1bffc57570 100644 --- a/lib/matplotlib/_mathtext_data.py +++ b/lib/matplotlib/_mathtext_data.py @@ -800,6 +800,8 @@ 'eta' : 951, 'forall' : 8704, 'eth' : 240, + 'dh' : 240, + 'DH' : 208, 'colon' : 58, 'sqcup' : 8852, 'bigsqcup' : 10758, @@ -1066,7 +1068,7 @@ 'hermitmatrix' : 8889, 'barvee' : 8893, 'measuredrightangle' : 8894, - 'varlrtriangle' : 8895, + 'lrtriangle' : 8895, 'equalparallel' : 8917, 'npreccurlyeq' : 8928, 'nsucccurlyeq' : 8929, @@ -1090,6 +1092,8 @@ 'bagmember' : 8959, 'triangle' : 9651, 'iiiint' : 10764, + 'amalg' : 10815, + 'merge' : 10837, } # Each element is a 4-tuple of the form: diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py index dab981f29a23..bae09c7dbe95 100644 --- a/lib/matplotlib/tests/test_mathtext.py +++ b/lib/matplotlib/tests/test_mathtext.py @@ -525,7 +525,7 @@ def test_mathtext_operators(): \ngtrsim \nlessgtr \ngtrless \cupleftarrow \oequal \rightassert \rightModels \hermitmatrix \barvee - \measuredrightangle \varlrtriangle + \measuredrightangle \lrtriangle \equalparallel \npreccurlyeq \nsucccurlyeq \nsqsubseteq \nsqsupseteq \sqsubsetneq \sqsupsetneq \disin \varisins From ee02182c54628301f7e2359d597d121299600c17 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Sat, 24 Jun 2023 15:04:41 +0200 Subject: [PATCH 2/2] Do not space symbols in limits --- doc/sphinxext/math_symbol_table.py | 9 +++++---- doc/users/next_whats_new/mathtext_spacing.rst | 5 +++++ lib/matplotlib/_mathtext.py | 12 +++++++----- lib/matplotlib/_mathtext_data.py | 4 ++-- lib/matplotlib/tests/test_mathtext.py | 2 +- 5 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 doc/users/next_whats_new/mathtext_spacing.rst diff --git a/doc/sphinxext/math_symbol_table.py b/doc/sphinxext/math_symbol_table.py index a195e073831f..ee1022e75fef 100644 --- a/doc/sphinxext/math_symbol_table.py +++ b/doc/sphinxext/math_symbol_table.py @@ -67,8 +67,8 @@ \hslash \blacksquare \blacktriangle \sharp \increment \prime \blacktriangledown \Im \flat \backprime \Re \natural \circledS \P \copyright \circledR \S \yen \checkmark \$ - \cent \triangle \QED \sinewave \dag \ddag \perthousand - \lambdabar \L \l \degree \danger \maltese + \cent \triangle \QED \sinewave \dag \ddag \perthousand \ac + \lambdabar \L \l \degree \danger \maltese \clubsuitopen \i \hermitmatrix \sterling \nabla \mho""".split()], ] @@ -76,14 +76,14 @@ def run(state_machine): def render_symbol(sym, ignore_variant=False): - if ignore_variant and sym != r"\varnothing": + if ignore_variant and sym not in (r"\varnothing", r"\varlrtriangle"): sym = sym.replace(r"\var", "\\") if sym.startswith("\\"): sym = sym.lstrip("\\") if sym not in (_mathtext.Parser._overunder_functions | _mathtext.Parser._function_names): sym = chr(_mathtext_data.tex2uni[sym]) - return f'\\{sym}' if sym in ('\\', '|') else sym + return f'\\{sym}' if sym in ('\\', '|', '+', '-', '*') else sym lines = [] for category, columns, syms in symbols: @@ -145,6 +145,7 @@ def setup(app): # Add accents all_symbols.update({v[1:]: k for k, v in _mathtext.Parser._accent_map.items()}) + all_symbols.update({v: v for v in _mathtext.Parser._wide_accents}) print("SYMBOLS NOT IN TABLE:") for sym, val in _mathtext_data.tex2uni.items(): if sym not in all_symbols: diff --git a/doc/users/next_whats_new/mathtext_spacing.rst b/doc/users/next_whats_new/mathtext_spacing.rst new file mode 100644 index 000000000000..42da810c3a39 --- /dev/null +++ b/doc/users/next_whats_new/mathtext_spacing.rst @@ -0,0 +1,5 @@ +``mathtext`` spacing corrections +-------------------------------- + +As consequence of the updated documentation, the spacing on a number of relational and +operator symbols were classified like that and therefore will be spaced properly. diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index 7a8cd0ae96fa..395c011f11b7 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -1778,7 +1778,7 @@ class _MathStyle(enum.Enum): \triangleright \ntriangleleft \ntriangleright \trianglelefteq \ntrianglelefteq \trianglerighteq \ntrianglerighteq \blacktriangleleft \blacktriangleright - \equalparallel \measuredrightangle \lrtriangle + \equalparallel \measuredrightangle \varlrtriangle \Doteq \Bumpeq \Subset \Supset \backepsilon \because \therefore \bot \top \bumpeq \circeq \coloneq @@ -1799,7 +1799,7 @@ class _MathStyle(enum.Enum): \varniobar \niobar \bagmember \ratio \Equiv \stareq \measeq \arceq \rightassert \rightModels \smallin \smallowns - \notsmallowns'''.split()) + \notsmallowns \nsimeq'''.split()) _arrow_symbols = set(r""" \leftarrow \longleftarrow \uparrow \Leftarrow \Longleftarrow @@ -2154,9 +2154,11 @@ def symbol(self, s, loc, toks): # such as ${ -2}$, $ -2$, or $ -2$. prev_char = next((c for c in s[:loc][::-1] if c != ' '), '') # Binary operators at start of string should not be spaced - if (c in self._binary_operators and - (len(s[:loc].split()) == 0 or prev_char == '{' or - prev_char in self._left_delims)): + # Also, operators in sub- or superscripts should not be spaced + if (self._in_subscript_or_superscript or ( + c in self._binary_operators and ( + len(s[:loc].split()) == 0 or prev_char == '{' or + prev_char in self._left_delims))): return [char] else: return [Hlist([self._make_space(0.2), diff --git a/lib/matplotlib/_mathtext_data.py b/lib/matplotlib/_mathtext_data.py index 8d1bffc57570..d37cdff22e57 100644 --- a/lib/matplotlib/_mathtext_data.py +++ b/lib/matplotlib/_mathtext_data.py @@ -910,7 +910,7 @@ 'O' : 216, 'hookleftarrow' : 8617, 'trianglerighteq' : 8885, - 'nsime' : 8772, + 'nsimeq' : 8772, 'oe' : 339, 'nwarrow' : 8598, 'o' : 248, @@ -1068,7 +1068,7 @@ 'hermitmatrix' : 8889, 'barvee' : 8893, 'measuredrightangle' : 8894, - 'lrtriangle' : 8895, + 'varlrtriangle' : 8895, 'equalparallel' : 8917, 'npreccurlyeq' : 8928, 'nsucccurlyeq' : 8929, diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py index bae09c7dbe95..dab981f29a23 100644 --- a/lib/matplotlib/tests/test_mathtext.py +++ b/lib/matplotlib/tests/test_mathtext.py @@ -525,7 +525,7 @@ def test_mathtext_operators(): \ngtrsim \nlessgtr \ngtrless \cupleftarrow \oequal \rightassert \rightModels \hermitmatrix \barvee - \measuredrightangle \lrtriangle + \measuredrightangle \varlrtriangle \equalparallel \npreccurlyeq \nsucccurlyeq \nsqsubseteq \nsqsupseteq \sqsubsetneq \sqsupsetneq \disin \varisins pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy