From 91a8d982b6ed5e25f0565916916bad991338ac1f Mon Sep 17 00:00:00 2001 From: tfpf <19171016+tfpf@users.noreply.github.com> Date: Sun, 14 Aug 2022 13:40:48 +0530 Subject: [PATCH 1/3] Support `\underline` in Mathtext. --- lib/matplotlib/_mathtext.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index 0aa7bec57418..aae766263307 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -1770,6 +1770,7 @@ def csnames(group, names): p.group = Forward() p.operatorname = Forward() p.overline = Forward() + p.underline = Forward() p.overset = Forward() p.placeable = Forward() p.required_group = Forward() @@ -1820,6 +1821,7 @@ def csnames(group, names): + p.required_group("value")) p.overline <<= cmd(r"\overline", p.required_group("body")) + p.underline <<= cmd(r"\underline", p.required_group("body")) p.overset <<= cmd( r"\overset", @@ -1843,6 +1845,7 @@ def csnames(group, names): | p.underset | p.sqrt | p.overline + | p.underline ) p.simple <<= ( @@ -2478,6 +2481,20 @@ def overline(self, s, loc, toks): hlist = Hlist([rightside]) return [hlist] + def underline(self, s, loc, toks): + body = toks["body"] + + state = self.get_state() + thickness = state.get_current_underline_thickness() + + # Place underline below body (loosely based on node735). + kern = 3 * thickness + vlist = Vlist([Hlist([body]), Kern(kern), Hrule(state, thickness)]) + vlist.shift_amount = kern + thickness / 2 + body.depth + + hlist = Hlist([vlist]) + return [hlist] + def _auto_sized_delimiter(self, front, middle, back): state = self.get_state() if len(middle): From 4bb528426adf12593637f74e0f8a542cfa0faada Mon Sep 17 00:00:00 2001 From: tfpf <19171016+tfpf@users.noreply.github.com> Date: Mon, 15 Aug 2022 10:11:04 +0530 Subject: [PATCH 2/3] Test for `\underline` in Mathtext. --- .../test_mathtext/mathtext1_dejavusans_04.png | Bin 0 -> 4857 bytes lib/matplotlib/tests/test_mathtext.py | 1 + 2 files changed, 1 insertion(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext1_dejavusans_04.png 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..cc0a7c0a8cb20884324778b1744ba932ca9bed98 GIT binary patch literal 4857 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 H7k>W*gQGR_ literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py index 0c0057c9ea85..dde741d3af30 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'Matplotlib: $\underline{Plotting}$ $\underline{\mathrm{with}}$ Python', # GitHub issue 14235 ] digits = "0123456789" From b87c1b461e48fba4380336f59609acb991e1d9b3 Mon Sep 17 00:00:00 2001 From: tfpf <19171016+tfpf@users.noreply.github.com> Date: Mon, 15 Aug 2022 10:35:21 +0530 Subject: [PATCH 3/3] "What's New" entry for Mathtext `\underline`. --- doc/users/next_whats_new/mathtext_underline.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/users/next_whats_new/mathtext_underline.rst diff --git a/doc/users/next_whats_new/mathtext_underline.rst b/doc/users/next_whats_new/mathtext_underline.rst new file mode 100644 index 000000000000..118e5cd8f9e7 --- /dev/null +++ b/doc/users/next_whats_new/mathtext_underline.rst @@ -0,0 +1,11 @@ +Underlining text while using Mathtext +------------------------------------- + +Mathtext now supports the ``\underline`` command. + +.. code-block:: python + + import matplotlib.pyplot as plt + plt.text(0.4, 0.7, r'This is $\underline{underlined}$ text.') + plt.text(0.4, 0.3, r'So is $\underline{\mathrm{this}}$.') + plt.show()