From f55733ed4537c8c6e36a9bf5f1e77fb3860761b0 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Sun, 9 Jan 2022 16:31:06 +0100 Subject: [PATCH] mathtext now supports \text --- .../next_whats_new/mathtext_supports_text.rst | 12 ++++++++++++ galleries/users_explain/text/mathtext.py | 4 ++++ lib/matplotlib/_mathtext.py | 12 ++++++++++++ .../test_mathtext/mathtext1_dejavusans_04.png | Bin 0 -> 7302 bytes lib/matplotlib/tests/test_mathtext.py | 2 ++ 5 files changed, 30 insertions(+) create mode 100644 doc/users/next_whats_new/mathtext_supports_text.rst create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext1_dejavusans_04.png diff --git a/doc/users/next_whats_new/mathtext_supports_text.rst b/doc/users/next_whats_new/mathtext_supports_text.rst new file mode 100644 index 000000000000..6dbbc31108fc --- /dev/null +++ b/doc/users/next_whats_new/mathtext_supports_text.rst @@ -0,0 +1,12 @@ +``mathtext`` now supports ``\text`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``\text`` can be used to obtain upright text within an equation. + +.. plot:: + :include-source: true + :alt: Illustration of the newly added \text command, showing that it renders as normal text, including spaces, despite being part of an equation. Also show that a dash is not rendered as a minus when part of a \text command. + +import matplotlib.pyplot as plt +plt.text(0.1, 0.5, r"$a = \sin(\phi) \text{ such that } \phi = \frac{x}{y}$") +plt.text(0.1, 0.3, r"$\text{dashes (-) are retained}$") diff --git a/galleries/users_explain/text/mathtext.py b/galleries/users_explain/text/mathtext.py index 692de482917a..07ab298d0f31 100644 --- a/galleries/users_explain/text/mathtext.py +++ b/galleries/users_explain/text/mathtext.py @@ -272,6 +272,10 @@ that far fewer symbols will be available, but it can be useful to make math expressions blend well with other text in the plot. +For compatibility with popular packages, ``\text{...}`` is available and uses the +``\mathrm{...}`` font, but otherwise retains spaces and renders - as a dash +(not minus). + Custom fonts ~~~~~~~~~~~~ mathtext also provides a way to use custom fonts for math. This method is diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index 1c4a37cef9b3..76bad22592e7 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -1857,6 +1857,7 @@ def csnames(group, names): p.optional_group = Forward() p.sqrt = Forward() p.subsuper = Forward() + p.text = Forward() p.token = Forward() p.underset = Forward() @@ -1907,6 +1908,8 @@ def csnames(group, names): r"\underset", p.optional_group("annotation") + p.optional_group("body")) + p.text <<= cmd(r"\text", QuotedString('{', '\\', endQuoteChar="}")) + p.placeable <<= ( p.accent # Must be before symbol as all accents are symbols | p.symbol # Must be second to catch all named symbols and single @@ -1922,6 +1925,7 @@ def csnames(group, names): | p.underset | p.sqrt | p.overline + | p.text ) p.simple <<= ( @@ -2022,6 +2026,14 @@ def non_math(self, s, loc, toks): float_literal = staticmethod(pyparsing_common.convertToFloat) + def text(self, s, loc, toks): + self.push_state() + state = self.get_state() + state.font = 'rm' + hlist = Hlist([Char(c, state) for c in toks[1]]) + self.pop_state() + return [hlist] + def _make_space(self, percentage): # In TeX, an em (the unit usually used to measure horizontal lengths) # is not the width of the character 'm'; it is the same in different 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 0000000000000000000000000000000000000000..a6861a8f1f0819386eab5bc72239019f897e921d GIT binary patch literal 7302 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py index 2ee3e914d5f6..301906d611b4 100644 --- a/lib/matplotlib/tests/test_mathtext.py +++ b/lib/matplotlib/tests/test_mathtext.py @@ -130,6 +130,8 @@ 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'$\text{text}_{\text{sub}}^{\text{sup}} + \text{\$foo\$} + \frac{\text{num}}{\mathbf{\text{den}}}\text{with space, curly brackets \{\}, and dash -}$', + ] digits = "0123456789"