diff --git a/examples/text_labels_and_annotations/dfrac_demo.py b/examples/text_labels_and_annotations/dfrac_demo.py new file mode 100644 index 000000000000..4ffd7767c5b0 --- /dev/null +++ b/examples/text_labels_and_annotations/dfrac_demo.py @@ -0,0 +1,28 @@ +r""" +========================================= +The difference between \\dfrac and \\frac +========================================= + +In this example, the differences between the \\dfrac and \\frac TeX macros are +illustrated; in particular, the difference between display style and text style +fractions when using Mathtex. + +.. versionadded:: 2.1 + +.. note:: + To use \\dfrac with the LaTeX engine (text.usetex : True), you need to + import the amsmath package with the text.latex.preamble rc, which is + an unsupported feature; therefore, it is probably a better idea to just + use the \\displaystyle option before the \\frac macro to get this behavior + with the LaTeX engine. + +""" + +import matplotlib.pyplot as plt + +fig = plt.figure(figsize=(5.25, 0.75)) +fig.text(0.5, 0.3, r'\dfrac: $\dfrac{a}{b}$', + horizontalalignment='center', verticalalignment='center') +fig.text(0.5, 0.7, r'\frac: $\frac{a}{b}$', + horizontalalignment='center', verticalalignment='center') +plt.show() diff --git a/lib/matplotlib/mathtext.py b/lib/matplotlib/mathtext.py index 70d2c86540b1..1ecb524eddb6 100644 --- a/lib/matplotlib/mathtext.py +++ b/lib/matplotlib/mathtext.py @@ -2216,6 +2216,10 @@ class Parser(object): The grammar is based directly on that in TeX, though it cuts a few corners. """ + + _math_style_dict = dict(displaystyle=0, textstyle=1, + scriptstyle=2, scriptscriptstyle=3) + _binary_operators = set(''' + * - \\pm \\sqcap \\rhd @@ -2301,6 +2305,7 @@ def __init__(self): p.float_literal = Forward() p.font = Forward() p.frac = Forward() + p.dfrac = Forward() p.function = Forward() p.genfrac = Forward() p.group = Forward() @@ -2389,6 +2394,11 @@ def __init__(self): - ((p.required_group + p.required_group) | Error(r"Expected \frac{num}{den}")) ) + p.dfrac <<= Group( + Suppress(Literal(r"\dfrac")) + - ((p.required_group + p.required_group) | Error(r"Expected \dfrac{num}{den}")) + ) + p.stackrel <<= Group( Suppress(Literal(r"\stackrel")) - ((p.required_group + p.required_group) | Error(r"Expected \stackrel{num}{den}")) @@ -2441,6 +2451,7 @@ def __init__(self): | p.function | p.group | p.frac + | p.dfrac | p.stackrel | p.binom | p.genfrac @@ -3035,8 +3046,11 @@ def _genfrac(self, ldelim, rdelim, rule, style, num, den): state.font, state.fontsize, state.dpi) rule = float(rule) - num.shrink() - den.shrink() + + # If style != displaystyle == 0, shrink the num and den + if style != self._math_style_dict['displaystyle']: + num.shrink() + den.shrink() cnum = HCentered([num]) cden = HCentered([den]) width = max(num.width, den.width) @@ -3069,35 +3083,50 @@ def _genfrac(self, ldelim, rdelim, rule, style, num, den): return result def genfrac(self, s, loc, toks): - assert(len(toks)==1) - assert(len(toks[0])==6) + assert(len(toks) == 1) + assert(len(toks[0]) == 6) return self._genfrac(*tuple(toks[0])) def frac(self, s, loc, toks): - assert(len(toks)==1) - assert(len(toks[0])==2) + assert(len(toks) == 1) + assert(len(toks[0]) == 2) + state = self.get_state() + + thickness = state.font_output.get_underline_thickness( + state.font, state.fontsize, state.dpi) + num, den = toks[0] + + return self._genfrac('', '', thickness, + self._math_style_dict['textstyle'], num, den) + + def dfrac(self, s, loc, toks): + assert(len(toks) == 1) + assert(len(toks[0]) == 2) state = self.get_state() thickness = state.font_output.get_underline_thickness( state.font, state.fontsize, state.dpi) num, den = toks[0] - return self._genfrac('', '', thickness, '', num, den) + return self._genfrac('', '', thickness, + self._math_style_dict['displaystyle'], num, den) def stackrel(self, s, loc, toks): - assert(len(toks)==1) - assert(len(toks[0])==2) + assert(len(toks) == 1) + assert(len(toks[0]) == 2) num, den = toks[0] - return self._genfrac('', '', 0.0, '', num, den) + return self._genfrac('', '', 0.0, + self._math_style_dict['textstyle'], num, den) def binom(self, s, loc, toks): - assert(len(toks)==1) - assert(len(toks[0])==2) + assert(len(toks) == 1) + assert(len(toks[0]) == 2) num, den = toks[0] - return self._genfrac('(', ')', 0.0, '', num, den) + return self._genfrac('(', ')', 0.0, + self._math_style_dict['textstyle'], num, den) def sqrt(self, s, loc, toks): #~ print "sqrt", toks diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_82.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_82.pdf new file mode 100644 index 000000000000..7fcd5d932ab1 Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_82.pdf differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_82.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_82.png new file mode 100644 index 000000000000..55c704c48547 Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_82.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_82.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_82.svg new file mode 100644 index 000000000000..19f8a85b606a --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_82.svg @@ -0,0 +1,231 @@ + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_82.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_82.pdf new file mode 100644 index 000000000000..4b1874debd8a Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_82.pdf differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_82.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_82.png new file mode 100644 index 000000000000..80bde0ec5b5c Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_82.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_82.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_82.svg new file mode 100644 index 000000000000..2c4c3a5baf67 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_82.svg @@ -0,0 +1,141 @@ + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_82.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_82.pdf new file mode 100644 index 000000000000..6170feca8d38 Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_82.pdf differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_82.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_82.png new file mode 100644 index 000000000000..a6aa19c18065 Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_82.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_82.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_82.svg new file mode 100644 index 000000000000..c797a241e0f6 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_82.svg @@ -0,0 +1,154 @@ + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_82.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_82.pdf new file mode 100644 index 000000000000..1657aaf5625a Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_82.pdf differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_82.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_82.png new file mode 100644 index 000000000000..0143688609e4 Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_82.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_82.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_82.svg new file mode 100644 index 000000000000..e7574f7f0427 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_82.svg @@ -0,0 +1,177 @@ + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_82.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_82.pdf new file mode 100644 index 000000000000..085487d51e59 Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_82.pdf differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_82.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_82.png new file mode 100644 index 000000000000..7921480555f3 Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_82.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_82.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_82.svg new file mode 100644 index 000000000000..5b7bab5501a8 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_82.svg @@ -0,0 +1,149 @@ + + + + diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py index 544d3ef89201..7ef77ce6a5a7 100644 --- a/lib/matplotlib/tests/test_mathtext.py +++ b/lib/matplotlib/tests/test_mathtext.py @@ -111,6 +111,7 @@ r'$\overline{\omega}^x \frac{1}{2}_0^x$', # github issue #5444 r'$,$ $.$ $1{,}234{, }567{ , }890$ and $1,234,567,890$', # github issue 5799 r'$\left(X\right)_{a}^{b}$', # github issue 7615 + r'$\dfrac{\$100.00}{y}$', # github issue #1888 ] digits = "0123456789" @@ -227,6 +228,8 @@ def test_fontinfo(): (r'$\rightF$', r'Unknown symbol: \rightF'), (r'$\left(\right$', r'Expected a delimiter'), (r'$\left($', r'Expected "\right"'), + (r'$\dfrac$', r'Expected \dfrac{num}{den}'), + (r'$\dfrac{}{}$', r'Expected \dfrac{num}{den}'), ], ids=[ 'hspace without value', @@ -247,6 +250,8 @@ def test_fontinfo(): 'right with invalid delimiter', 'unclosed parentheses with sizing', 'unclosed parentheses without sizing', + 'dfrac without parameters', + 'dfrac with empty parameters', ] ) def test_mathtext_exceptions(math, msg):
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: