diff --git a/doc/users/next_whats_new/mathtext_middle.rst b/doc/users/next_whats_new/mathtext_middle.rst new file mode 100644 index 000000000000..7a7121b8920b --- /dev/null +++ b/doc/users/next_whats_new/mathtext_middle.rst @@ -0,0 +1,17 @@ +``mathtext`` supports ``\middle`` +--------------------------------- + +The ``\middle`` latex command is now supported by `.mathtext`. It is a +complement to ``\left`` and ``\right`` and used to add a middle sized +separator. Currently, only a single ``\middle`` between ``\left`` and +``\right`` is supported. + +.. plot:: + :include-source: true + + import matplotlib.pyplot as plt + plt.figure(figsize=(2, 1)) + plt.figtext( + 0.05, 0.55, + r"$\left\{\sum_{i=0}^x a_i \middle | x \in \mathbb{N}\right\}$", + size=20, math_fontfamily='cm') diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index 44bb5a9e8fd8..068baa75b20b 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -1782,7 +1782,7 @@ class _MathStyle(enum.Enum): _ambi_delims = set(r""" | \| / \backslash \uparrow \downarrow \updownarrow \Uparrow - \Downarrow \Updownarrow . \vert \Vert""".split()) + \Downarrow \Updownarrow . \vert \Vert \mid""".split()) _left_delims = set(r"( [ \{ < \lfloor \langle \lceil".split()) _right_delims = set(r") ] \} > \rfloor \rangle \rceil".split()) _delims = _left_delims | _right_delims | _ambi_delims @@ -1950,7 +1950,10 @@ def csnames(group, names): p.auto_delim <<= ( r"\left" - (p.delim("left") | Error("Expected a delimiter")) - + ZeroOrMore(p.simple | p.auto_delim)("mid") + + ZeroOrMore(p.simple | p.auto_delim)("mid1") + + Optional(r"\middle" - (p.delim("mid") | + Error("Expected a delimiter")))("middle") + + ZeroOrMore(p.simple | p.auto_delim)("mid2") + r"\right" - (p.delim("right") | Error("Expected a delimiter")) ) @@ -2560,11 +2563,14 @@ def overline(self, s, loc, toks): hlist = Hlist([rightside]) return [hlist] - def _auto_sized_delimiter(self, front, middle, back): + def _auto_sized_delimiter(self, front, mid1, back, middle=".", mid2=None): + if mid2 is None: + mid2 = [] state = self.get_state() - if len(middle): - height = max(x.height for x in middle) - depth = max(x.depth for x in middle) + content = mid1 + mid2 + if len(content): + height = max(x.height for x in content) + depth = max(x.depth for x in content) factor = None else: height = 0 @@ -2575,7 +2581,11 @@ def _auto_sized_delimiter(self, front, middle, back): if front != '.': parts.append( AutoHeightChar(front, height, depth, state, factor=factor)) - parts.extend(middle) + parts.extend(mid1) + if middle != ".": + parts.append( + AutoHeightChar(middle, height, depth, state, factor=factor)) + parts.extend(mid2) if back != '.': parts.append( AutoHeightChar(back, height, depth, state, factor=factor)) @@ -2585,6 +2595,9 @@ def _auto_sized_delimiter(self, front, middle, back): def auto_delim(self, s, loc, toks): return self._auto_sized_delimiter( toks["left"], - # if "mid" in toks ... can be removed when requiring pyparsing 3. - toks["mid"].asList() if "mid" in toks else [], - toks["right"]) + # if "mid*" in toks ... can be removed when requiring pyparsing 3. + toks["mid1"].asList() if "mid1" in toks else [], + toks["right"], + toks["mid"] if "mid" in toks else ".", + toks["mid2"].asList() if "mid2" in toks else [] + ) diff --git a/lib/matplotlib/_mathtext_data.py b/lib/matplotlib/_mathtext_data.py index 8dac9301ed81..ef571b90712e 100644 --- a/lib/matplotlib/_mathtext_data.py +++ b/lib/matplotlib/_mathtext_data.py @@ -526,7 +526,7 @@ 'succnsim' : 8937, 'gimel' : 8503, 'vert' : 124, - '|' : 124, + '|' : 8214, 'varrho' : 1009, 'P' : 182, 'approxident' : 8779, diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext1_dejavusans_04.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext1_dejavusans_04.png new file mode 100644 index 000000000000..29b3ede96908 Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext1_dejavusans_04.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_68.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_68.pdf index 3a95452967ac..b1d60b3d1333 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_68.pdf and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_68.pdf differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_68.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_68.png index d655592d81c5..17fd645bd55c 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_68.png and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_68.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_68.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_68.svg index bdb560153175..316822561119 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_68.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_68.svg @@ -1,12 +1,23 @@ - - + + + + + + 2022-08-20T20:04:37.898366 + image/svg+xml + + + Matplotlib v3.6.0.dev3418+g45e1a1f37c, https://matplotlib.org/ + + + + + - + @@ -15,113 +26,120 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - + - - + - - - - - - - - - - - - - - - - - - - - +" transform="scale(0.015625)"/> + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_68.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_68.pdf index dc4c1802c743..8563c8b4c9a9 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_68.pdf and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_68.pdf differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_68.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_68.png index 35caf2d2b6ad..a00b39fd1cf2 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_68.png and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_68.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_68.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_68.svg index 0284835785a3..4f357d86d978 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_68.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_68.svg @@ -1,12 +1,23 @@ - - + + + + + + 2022-08-20T20:04:40.365971 + image/svg+xml + + + Matplotlib v3.6.0.dev3418+g45e1a1f37c, https://matplotlib.org/ + + + + + - + @@ -15,102 +26,109 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - +M 1141 1497 +Q 1091 1250 1091 1053 +Q 1091 769 1191 581 +Q 1359 269 1797 269 +Q 2238 269 2533 622 +Q 2828 975 2963 1663 +Q 3025 1978 3025 2225 +Q 3025 2513 2938 2703 +Q 2781 3053 2338 3053 +Q 1900 3053 1609 2737 +Q 1319 2422 1203 1825 +L 1141 1497 +z +" transform="scale(0.015625)"/> + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_68.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_68.pdf index 2aca1bfd4a52..bce5a3a24b37 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_68.pdf and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_68.pdf differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_68.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_68.png index f51fc6032d83..80cc384388fb 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_68.png and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_68.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_68.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_68.svg index be7cdc9f2da8..7a7a880bc68d 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_68.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_68.svg @@ -1,12 +1,23 @@ - - + + + + + + 2022-08-20T20:04:32.902669 + image/svg+xml + + + Matplotlib v3.6.0.dev3418+g45e1a1f37c, https://matplotlib.org/ + + + + + - + @@ -15,112 +26,119 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - + - - + - - +" transform="scale(0.015625)"/> + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_68.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_68.pdf index 323afa6acf0d..069b2b95e34e 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_68.pdf and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_68.pdf differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_68.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_68.png index a8ea567f675e..2c46de0cbca0 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_68.png and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_68.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_68.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_68.svg index 7fdb080a70a9..5add68453c8e 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_68.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_68.svg @@ -1,12 +1,23 @@ - - + + + + + + 2022-08-20T20:04:35.452372 + image/svg+xml + + + Matplotlib v3.6.0.dev3418+g45e1a1f37c, https://matplotlib.org/ + + + + + - + @@ -15,96 +26,103 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - + - - + - - +" transform="scale(0.015625)"/> + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py index 7f8b06fa0e9b..9e04abf14b01 100644 --- a/lib/matplotlib/tests/test_mathtext.py +++ b/lib/matplotlib/tests/test_mathtext.py @@ -129,6 +129,7 @@ r'$x \overset{f}{\rightarrow} \overset{f}{x} \underset{xx}{ff} \overset{xx}{ff} \underset{f}{x} \underset{f}{\leftarrow} x$', # github issue #18241 r'$\sum x\quad\sum^nx\quad\sum_nx\quad\sum_n^nx\quad\prod x\quad\prod^nx\quad\prod_nx\quad\prod_n^nx$', # GitHub issue 18085 r'$1.$ $2.$ $19680801.$ $a.$ $b.$ $mpl.$', + r'$\left(\frac{x_i}{\sum x_i}\middle \mid x_i \in \mathcal{S}\right)$' ] digits = "0123456789" diff --git a/tutorials/text/mathtext.py b/tutorials/text/mathtext.py index 72a2cebb2b2c..5b0416095175 100644 --- a/tutorials/text/mathtext.py +++ b/tutorials/text/mathtext.py @@ -124,6 +124,14 @@ \left(\frac{5 - \frac{1}{x}}{4}\right) +There is also a ``\middle`` version for using with a middle delimiter.:: + + r'$\left\{x \middle \mid \frac{x^2} < \frac{3}{4} \right\}$' + +.. math:: + + \left\{x \middle \mid \frac{x^2} < \frac{3}{4} \right\} + Radicals -------- Radicals can be produced with the ``\sqrt[]{}`` command. For example::