From 56a51535b0804b5acf0211c049e95030a49fa0f0 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Thu, 21 Apr 2022 23:26:33 +0200 Subject: [PATCH 1/3] Simplify definition of mathtext symbols. Use a single regex that handles both single_symbol (a single character) and symbol_name (`\knowntexsymbolname`), and also slightly simplify the "end-of-symbol-name" regex. This parsing element comes up extremely often, and removing one indirection layers shaves off ~3-4% off drawing all the current mathtext tests, i.e. ``` MPLBACKEND=agg python -c 'import time; from pylab import *; from matplotlib.tests.test_mathtext import math_tests; fig = figure(figsize=(3, 10)); fig.text(0, 0, "\n".join(filter(None, math_tests)), size=6); start = time.perf_counter(); [fig.canvas.draw() for _ in range(10)]; print((time.perf_counter() - start) / 10)' ``` --- lib/matplotlib/_mathtext.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index 5e6ef958d452..5cd11e675f99 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -8,6 +8,7 @@ import functools import logging import os +import re import types import unicodedata @@ -1723,15 +1724,13 @@ def set_names_and_parse_actions(): p.style_literal = oneOf( [str(e.value) for e in self._MathStyle])("style_literal") - p.single_symbol = Regex( - r"([a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|%s])|(\\[%%${}\[\]_|])" % - "\U00000080-\U0001ffff" # unicode range - )("sym") p.accentprefixed = "\\" + oneOf(self._accentprefixed)("sym") - p.symbol_name = ( - oneOf([rf"\{sym}" for sym in tex2uni])("sym") - + Regex("(?=[^A-Za-z]|$)").leaveWhitespace()) - p.symbol = (p.single_symbol | p.symbol_name).leaveWhitespace() + p.symbol = Regex( + r"[a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|\U00000080-\U0001ffff]" + r"|\\[%${}\[\]_|]" + + r"|\\(?:{})(?![A-Za-z])".format( + "|".join(map(re.escape, tex2uni))) + )("sym").leaveWhitespace() p.unknown_symbol = Regex(r"\\[A-Za-z]*")("name") p.font = "\\" + oneOf(self._fontnames)("font") From 3efad3b38a83bf56a07f4684338a41a2da338726 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Thu, 21 Apr 2022 23:56:13 +0200 Subject: [PATCH 2/3] Correctly end tokens in mathtext parsing. This avoids parsing `\sinx` as `\sin x` (it now raises an error instead), and removes the need for `accentprefixed` (because `\doteq` is treated as a single token now, instead of `\dot{eq}`). This also means that `\doteq` (and friends) are now correctly treated as relations (per `_relation_symbols`, thus changing the spacing around them); hence then change in baseline images. Adjust test strings accordingly to undo the spacing, to avoid regen'ing baselines. Also shaves ~2% off drawing all the current mathtext tests, i.e. ``` MPLBACKEND=agg python -c 'import time; from pylab import *; from matplotlib.tests.test_mathtext import math_tests; fig = figure(figsize=(3, 10)); fig.text(0, 0, "\n".join(filter(None, math_tests)), size=6); start = time.perf_counter(); [fig.canvas.draw() for _ in range(10)]; print((time.perf_counter() - start) / 10)' ``` (including adjustment for the removed test case), probably because accentprefixed was previously extremely commonly checked, being at the top of the placeable list; however, performance wasn't really the main goal here. --- lib/matplotlib/_mathtext.py | 37 +-- .../test_mathtext/mathtext_cm_77.pdf | Bin 7918 -> 0 bytes .../test_mathtext/mathtext_cm_77.png | Bin 1660 -> 0 bytes .../test_mathtext/mathtext_cm_77.svg | 222 ------------------ .../test_mathtext/mathtext_dejavusans_77.pdf | Bin 5359 -> 0 bytes .../test_mathtext/mathtext_dejavusans_77.png | Bin 1658 -> 0 bytes .../test_mathtext/mathtext_dejavusans_77.svg | 173 -------------- .../test_mathtext/mathtext_dejavuserif_77.pdf | Bin 9457 -> 0 bytes .../test_mathtext/mathtext_dejavuserif_77.png | Bin 1705 -> 0 bytes .../test_mathtext/mathtext_dejavuserif_77.svg | 217 ----------------- .../test_mathtext/mathtext_stix_77.pdf | Bin 7918 -> 0 bytes .../test_mathtext/mathtext_stix_77.png | Bin 1660 -> 0 bytes .../test_mathtext/mathtext_stix_77.svg | 222 ------------------ .../test_mathtext/mathtext_stixsans_77.pdf | Bin 7918 -> 0 bytes .../test_mathtext/mathtext_stixsans_77.png | Bin 1660 -> 0 bytes .../test_mathtext/mathtext_stixsans_77.svg | 222 ------------------ lib/matplotlib/tests/test_mathtext.py | 23 +- 17 files changed, 40 insertions(+), 1076 deletions(-) delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_77.pdf delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_77.png delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_77.svg delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_77.pdf delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_77.png delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_77.svg delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_77.pdf delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_77.png delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_77.svg delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_77.pdf delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_77.png delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_77.svg delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_77.pdf delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_77.png delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_77.svg diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index 5cd11e675f99..f9f1c64fb19a 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -1718,13 +1718,27 @@ def set_names_and_parse_actions(): # Root definitions. + # In TeX parlance, a csname is a control sequence name (a "\foo"). + def csnames(group, names): + ends_with_alpha = [] + ends_with_nonalpha = [] + for name in names: + if name[-1].isalpha(): + ends_with_alpha.append(name) + else: + ends_with_nonalpha.append(name) + return Regex(r"\\(?P<{}>(?:{})(?![A-Za-z]){})".format( + group, + "|".join(map(re.escape, ends_with_alpha)), + "".join(f"|{s}" for s in map(re.escape, ends_with_nonalpha)), + )) + p.float_literal = Regex(r"[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)") p.space = oneOf(self._space_widths)("space") p.style_literal = oneOf( [str(e.value) for e in self._MathStyle])("style_literal") - p.accentprefixed = "\\" + oneOf(self._accentprefixed)("sym") p.symbol = Regex( r"[a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|\U00000080-\U0001ffff]" r"|\\[%${}\[\]_|]" @@ -1733,7 +1747,7 @@ def set_names_and_parse_actions(): )("sym").leaveWhitespace() p.unknown_symbol = Regex(r"\\[A-Za-z]*")("name") - p.font = "\\" + oneOf(self._fontnames)("font") + p.font = csnames("font", self._fontnames) p.start_group = ( Optional(r"\math" + oneOf(self._fontnames)("font")) + "{") p.end_group = Literal("}") @@ -1770,11 +1784,10 @@ def set_names_and_parse_actions(): p.customspace <<= cmd(r"\hspace", "{" + p.float_literal("space") + "}") p.accent <<= ( - "\\" - + oneOf([*self._accent_map, *self._wide_accents])("accent") + csnames("accent", [*self._accent_map, *self._wide_accents]) - p.placeable("sym")) - p.function <<= "\\" + oneOf(self._function_names)("name") + p.function <<= csnames("name", self._function_names) p.operatorname <<= cmd( r"\operatorname", "{" + ZeroOrMore(p.simple | p.unknown_symbol)("name") + "}") @@ -1815,10 +1828,8 @@ def set_names_and_parse_actions(): p.optional_group("annotation") + p.optional_group("body")) p.placeable <<= ( - p.accentprefixed # Must be before accent so named symbols that are - # prefixed with an accent name work - | p.accent # Must be before symbol as all accents are symbols - | p.symbol # Must be third to catch all named symbols and single + p.accent # Must be before symbol as all accents are symbols + | p.symbol # Must be second to catch all named symbols and single # chars not in a group | p.function | p.operatorname @@ -2014,8 +2025,6 @@ def symbol(self, s, loc, toks): return [Hlist([char, self._make_space(0.2)], do_kern=True)] return [char] - accentprefixed = symbol - def unknown_symbol(self, s, loc, toks): raise ParseFatalException(s, loc, f"Unknown symbol: {toks['name']}") @@ -2044,12 +2053,6 @@ def unknown_symbol(self, s, loc, toks): _wide_accents = set(r"widehat widetilde widebar".split()) - # make a lambda and call it to get the namespace right - _accentprefixed = (lambda am: [ - p for p in tex2uni - if any(p.startswith(a) and a != p for a in am) - ])(set(_accent_map)) - def accent(self, s, loc, toks): state = self.get_state() thickness = state.get_current_underline_thickness() diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_77.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_77.pdf deleted file mode 100644 index 8b8bc68dfd5be25b9f39ad2530d48faa12cd9c0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7918 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 diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_77.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_77.png deleted file mode 100644 index 9ed5a18bf57b18558b0d523a7432df5d1701793d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1660 zcmd5+i&N5B82$Okv`ur()<>zEk2TFi6JOXSlBQTmDdHP)GapMSn~xmw+0K%$(KR&` zGD;B?1h&E`6}54c62tYCm9m(OZ!xtk5(nL1v;RbQ=HC0=nKR!#_k8Dm#pgo;_4kd`4FXTtAZdgW#r}jzFSy!I7hzPz0X!2tiTl0I)Cq>(prWWu^dt zjwRCH51oBiA&m(dO*a3%7OW)w^XdkUi{WvG<@5@~{mlsLhvI&Uv z-&CrX*z}S%0Js#EWk5hSjNJ_y01$cD8~_Rqd~;zB-`L<*=G>s!&-vRYq-?-VXBeQr zDK&vq*VKFxiQYa=8Wqm*mDA6)+&w&44K}Dnlxbdb$&`vm@1NwQG`%jm>~W zVz~vgw-5C8_6`$LY*R8a(0Sdsm?u|;A6*uYc-TbIeDg73VO3M9g4aA8?T$r39Vx=R zz?kZmR37U*@y6zm0lTTmZf?-SltQJ3M@O^HAE|z%UX^w*g*TK-U)JR*^{!rCM`%OL zzzR#djGddizC(kka5l!SQ>);Mp?(3KL?YGl)Op%^u;OVKf)Uk z3WZ{6bv5Lr^KE{7ua4qf+nFup2h?&I6GdY+H3g6%xRC7rN}Is3@$s59H89gVxxawk z&|tkwQv*4om=ugpPO?=h6@9)dPaRG5Ov50N#U-Vs@@=PHQH9mGRLbGR2!0ZZWr?6J z91iE*ldIHN=Lm#btTQ<}CT8blx7Bo-KNL`z>64w~Myl*l8S|3*>cLM$;Wb!2EPL(# zz`%gLZzec`dOt#)VbM9L;)G9H7$(BmC-aHtf?>-c6>g~Y{2i}#tg%PAmLs6)TyCF<4``FY}>wfzXTfSVq zr3}Ynxg{lg;)F!^2WE@Ly4w7tp?i8fAHsBjq~6DK*FlXU6COzSLk$UhEsMnpF8$${ zYSzs_?%?D!R&wBI-d4`ltDNI*Zkg*d0m#s#B<6rv{8c5;HzMIB9FCTAlGcgkIXXJd zbook8=BnuB<>h)ju~;1D=l2{kFAorbnX9Q(_OtZ)^7?QLX2XWlV+(#3blKC6?>_wU0C;czh-V&!waLwc=4y0Mwl5;+-cYjnZI^zK@FU#SUx zaipmV^qV{&Fg(1*+}s?EMnkinT$>H%L_JOn%>oinX!W$lb!4p!4JVI*#jZ<+Qr0?0 znJ6lSLcvLVV6efZarP@gn#|~)`c!VN@a?m7X0g9@e&_0}nB4!KaP~_xhf_ahR(06d zSH>3zM43Y`UKDv}t<K@cHbt;G$F^z*mfqvTqx;vgw zXaZP|#pUIL%1sNOtXlj8*G`?g@$uui#6*VP9|+_Sg=~S6N$uriFIYsZ(fJ`QXq_)*3=DyX;5tZe6&e?DOG_*I zDdEA~D=PVRec@tRGGOT0E#rY$v3z|&^=Ua}QobaAi`d;g#{ajyJSEr=|3W~)c6iiZ>)Q)AEE?Ldr)}q7ody{K$bb-kF5=?N F{{WHs%o_jz diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_77.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_77.svg deleted file mode 100644 index f423ee824f38..000000000000 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_77.svg +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_77.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_77.pdf deleted file mode 100644 index 94ca3d3c6d94e3d8ef13df4f300d8510ecc355c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5359 zcmb^#3s_WT78TO2x|=UlwEB%u6q&j2JJ&^1o+6?MY9z9G87{*p&Wtk`Lm{OS+>%@< zZL2k{G#_iZVti_fg{38?u50!(jn%D9H&!!Sv$E)%duNzwm`}F-gztR+z32Y_dB5h5 z$x2R*XG}a5^YUr3bq~c5nm7yQQV9vfoTb=Q4`Bh5P0Z65xm03KQZ%K+X(QvtQL3X5 zH(CM?q?BoCIhvxWgf|YQIvpC}@R>4axt-P=RU>&oI5`yvs%086r_To_iQYBIyQY(T zV$La63hfRX5sl-yQw!#*R*gsoxoL(4DK8H+YJmB0r%&9;s>7xg69#<%Y*Otdpdzd# zV9{jN>MYa`dNjAH%%{rMyfSU9vn$i<%#U#iJG%{=a<1a#{)cO#O4H(pJ}{>E@3&t5 z_RDUw9(~G{(f!?(SFV43J@KP3r7CL3qtShj#f&=cKJ{?#Y3}mFts9Pi(avYz{?T@>%~Uk_>b|+tPUT(6$-i0~@y>fQUac70IQoGz z=eKX|eRSxQd*&>#Ui^MFTlGxB>e!llkNr@)?Q~wv!RLn!*?evA$jwb>*Y?@E^Obw{?)e=zI_&kZwVQU; zVnlk4N+&>2aOvbk8SduLC5Om=g{E#xpd_ka%9?2qVcn zVOWksPaE;#jY+CgS7km{-@A$K5njIWs~!nmBh0HFYi${BaW=od?x!iIJxvt}eU%k+ z>y~`txa8ax{^gN>e7Hed%*Tx1E>2#OIcZZ`j{A+QK2b+PD2Ul`V`VIso32dFUQ{Nc zd}CR3*iW@Jb%XDEX~&AzmT=eE9v3cb=$B>=Zyj;`VqVXS>2Fpa9x;52>%_zp>*cC5 z4XsH7|1-U$Xw0N}YwKT3k513L@>*N*$A>EJykn>sLb<@w;>!)G^St21hAg`Bt^P@- zu&7mCTSE{IOuEn^z%YC#X7lBSIrqsnvx4io9!oM~@ zeYZXH(bl=!az9#rB_mp>KQvZ}>i5l>KSy2ow&2+J6Q5{Xx;w0QB4622Z#J+thSuA1 z^F#k=eV-=Mqw4J1k%PJ%th_IF#*U?N=DU{O!a$*t0^b1zCKv-I;lG z!f(Kx;Z5cD*H10(8S!AXlfE3@y=`e-WOVhi$vavTrSOE6<9j9@bS><=?NHE?IQs5b7cCE|m(=j0u zp2co_9+Ao7<8ie;m8Ys6u77B-(2EtB@G*y1RjdyiJS%Qy2>;=LaATb;on_;% z)+yzfQIVSPO?&2JZ{~>kUVEWd3_SJu6(+K6AeloJ>-`@z@Y(p_=-** z5o!8n0QLXU;TQ|yAtrc{CKk>@L{Lf=Xd+o?!b$?+WSGYR1dtQI<9<$LjFppc|BZn1 zedk~=0@Cn-z%hiO(Ew16L<^%{03r$^5d@837G>fC3;RDoMqy_LH$cix#0%Vxr^tgapD+YisCVVRz1^iCw zD?SH+?rY;a?r8^%3-l_k`Pdz>x9K(A*W`>63FgBeu>JxPSO-(V3C8V!|9e1N@guQU zc#{>BrpmXz3C9y_!E{R$zlDaDsM>?{j%=p!*)P6Qm&KS5?e?CC$l zgFk@+`VFWQmSzNop&`#0iI(DMW&}--7^z>} z6qZ`yCL(seqPa?(T8X`YxC)C%fnuEpQ2<+XQZNJr?qE!Ui8i^M9*v`UQ=z($jhTNYEVnVif{~n6sTu40mts@o0)$)5D0DM4F0;Ntv2T F{S0v!7heDX diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_77.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_77.png deleted file mode 100644 index 82e0821cd3eade299e1d9a0b165f2ebf20133476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1658 zcmd5+`8V5H6#t@@rc7tlGNYE(v}#w{+DSzyrKL&iOLfsxMb%bI2(8*`WLj!k(O6;+ z($3LJTSbi-nc8AYf=V!mB?v-@2=ndy0rTUWx#zrhKlhw>&i&l?KJSz5e))nNL zfSj`v90360av*k*kpg#K#+x269f*cGqh!EHlDU}$)(7u7`9uT2;cH))SPir~1OTK| zo#A$<_?OG$6E4UURmvIz_s-x))m&e;Y;%?!R7uhf{u(2nCvWE!ctU|C2}?PTTKZ6Q zO#Igz$RhER$BYAqQ1ek{5K|VA^-iWkdpzv75Du&r^Fu)k6Wce&ixiBG3X_6Lsd#)Z zQdFIAmdMuZi840E&%|ikE;Mc>cIi9cFh9E2!fpj;Squu0KE7Q zk2+tfGy`@UilHf_PzI?tq33~wbj-&5z=SOrB)OxeHRa{@&kX~j&^aCp?P=2Mf~3ck z=>isHm3mwyRX%xl`^wMiHaOl3Hk)msL7n4u-D>QbjWS$WV%%REIZlb(SfA}ad9FKL z*(eaDt)QurDmkg607<_XAztG-(U!tkU46aC;V6ESsl4Goa2ti4o)-zXT<-kxWk)FV z@bjw+|I*}WhojnIB@i3w(gbYikFH8Pnz$ ztA}vK#q|048vY8iZfwlg0*mA?wYJ)}B=8*bV&?kP!Y5i=mI`O%MLTc%URvC+iIf-dBuU6`z-mD6TJqhv?5~$t=k;oDK_juY zs;X)O>`i#_(c9vVN=*BVtw3O zU#o;#y|;&PKI3I_m-VqWJNuwOgdsOUjX;%lKR2qnk=9=NF_25>@s&-o7SmTHoh`ld zsN-5CqIQ(aC6mda`+K6`WM*Vc3`#;m!oke8si}!rU47xOhAqm)#bs1z=y2&$F08Eo zVJ{>dHug63c_JDeU_n7Vq0Vhibx6}_G@b8d`$#FG9gqC{d`M;ou~x9}#vU1Y0ZPcT z!Pg^uSzNK53%1=BVZa$^3_&O1a_ifP-M z6rw<-4IDlKvI?1KP5yx1B5~&Yboc9}rKA*O4(PVX0XaXRRZ`pj?C*a9^3#0kR7n;u mg?#sq@uB}0cK0uSJ0rbIY!f#L`s)Jd!+^8HWjF~I^zd)ND(aj7 diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_77.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_77.svg deleted file mode 100644 index 98902d769804..000000000000 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_77.svg +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_77.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_77.pdf deleted file mode 100644 index d6fc89ad9f25f331f43e47f6b2410319cd17a1e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9457 zcmcIK2Urx>x(YGs#u805VhoN?tORyur|hnv5h;qG5L%4N3kwXe3cI+wD2UNqh{oOp zHNg@kCTfgc@v2}&)YxJyT*Vr@UJDY9CVq0c|9@r&h6VL~R~~%lJ2R*K_55wNTc}@v z2jj`9x~;!Jtt(V96iu09N2$EMDRrnJQM6JT7zv})5gDl>rS>)049Vt1s$V~qXo|;$ zI>iS6blbpio53bhoU|#xY_d@-KC9HB7IR#)PX4gWPrW*wfBKk zG^GwtGQ=BAiIgC19~KfjN{q8nTIu9agUu#dOcYOEYtUh67?24VXfdayQbMN0|f3szNU$Ya_V#>Ix=`-*5-^}M1*;B(y+bt@( zo7ZZ1|Eaq_b54m|?Hc^ShhCc=UElJK#$)aeEtf{!kNG*cbX5Q7ANTBEy~``3qT_F6 zI~zxIJTv^<+7Akn)<*3MFeJVC{nyt^Hg4|X&-~=xppB5K3cqn-+J!H1o3I$-%uxMo(mJ?mu;;U}Wxj|8cPoZ?BxQH+EW{ zTi>Hs`uKfy!MWn#CqApMH@h)P`{CK9Z4y~={=&QqS&w@+KXG88F0uL6h1*Uy4UEtB ztL(eb)NAFXgNI@#XSWifzYZ)*J9cnGSzaπ#OAcc!Dd+Bs)eT*78#JxjB)GBc=b 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 XC^>fHYi;30P_qG)ix;xpDKz^p7L)$r diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_77.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_77.svg deleted file mode 100644 index 3c9961669b69..000000000000 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_77.svg +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_77.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_77.pdf deleted file mode 100644 index 3966ee6ddd594d8ecd3019527f83b9b384344664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7918 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 diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_77.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_77.png deleted file mode 100644 index 9ed5a18bf57b18558b0d523a7432df5d1701793d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1660 zcmd5+i&N5B82$Okv`ur()<>zEk2TFi6JOXSlBQTmDdHP)GapMSn~xmw+0K%$(KR&` zGD;B?1h&E`6}54c62tYCm9m(OZ!xtk5(nL1v;RbQ=HC0=nKR!#_k8Dm#pgo;_4kd`4FXTtAZdgW#r}jzFSy!I7hzPz0X!2tiTl0I)Cq>(prWWu^dt zjwRCH51oBiA&m(dO*a3%7OW)w^XdkUi{WvG<@5@~{mlsLhvI&Uv z-&CrX*z}S%0Js#EWk5hSjNJ_y01$cD8~_Rqd~;zB-`L<*=G>s!&-vRYq-?-VXBeQr zDK&vq*VKFxiQYa=8Wqm*mDA6)+&w&44K}Dnlxbdb$&`vm@1NwQG`%jm>~W zVz~vgw-5C8_6`$LY*R8a(0Sdsm?u|;A6*uYc-TbIeDg73VO3M9g4aA8?T$r39Vx=R zz?kZmR37U*@y6zm0lTTmZf?-SltQJ3M@O^HAE|z%UX^w*g*TK-U)JR*^{!rCM`%OL zzzR#djGddizC(kka5l!SQ>);Mp?(3KL?YGl)Op%^u;OVKf)Uk z3WZ{6bv5Lr^KE{7ua4qf+nFup2h?&I6GdY+H3g6%xRC7rN}Is3@$s59H89gVxxawk z&|tkwQv*4om=ugpPO?=h6@9)dPaRG5Ov50N#U-Vs@@=PHQH9mGRLbGR2!0ZZWr?6J z91iE*ldIHN=Lm#btTQ<}CT8blx7Bo-KNL`z>64w~Myl*l8S|3*>cLM$;Wb!2EPL(# zz`%gLZzec`dOt#)VbM9L;)G9H7$(BmC-aHtf?>-c6>g~Y{2i}#tg%PAmLs6)TyCF<4``FY}>wfzXTfSVq zr3}Ynxg{lg;)F!^2WE@Ly4w7tp?i8fAHsBjq~6DK*FlXU6COzSLk$UhEsMnpF8$${ zYSzs_?%?D!R&wBI-d4`ltDNI*Zkg*d0m#s#B<6rv{8c5;HzMIB9FCTAlGcgkIXXJd zbook8=BnuB<>h)ju~;1D=l2{kFAorbnX9Q(_OtZ)^7?QLX2XWlV+(#3blKC6?>_wU0C;czh-V&!waLwc=4y0Mwl5;+-cYjnZI^zK@FU#SUx zaipmV^qV{&Fg(1*+}s?EMnkinT$>H%L_JOn%>oinX!W$lb!4p!4JVI*#jZ<+Qr0?0 znJ6lSLcvLVV6efZarP@gn#|~)`c!VN@a?m7X0g9@e&_0}nB4!KaP~_xhf_ahR(06d zSH>3zM43Y`UKDv}t<K@cHbt;G$F^z*mfqvTqx;vgw zXaZP|#pUIL%1sNOtXlj8*G`?g@$uui#6*VP9|+_Sg=~S6N$uriFIYsZ(fJ`QXq_)*3=DyX;5tZe6&e?DOG_*I zDdEA~D=PVRec@tRGGOT0E#rY$v3z|&^=Ua}QobaAi`d;g#{ajyJSEr=|3W~)c6iiZ>)Q)AEE?Ldr)}q7ody{K$bb-kF5=?N F{{WHs%o_jz diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_77.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_77.svg deleted file mode 100644 index f423ee824f38..000000000000 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_77.svg +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_77.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_77.pdf deleted file mode 100644 index 98512f54330d3df9f008cae8841b1e59bc8706f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7918 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 diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_77.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_77.png deleted file mode 100644 index 9ed5a18bf57b18558b0d523a7432df5d1701793d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1660 zcmd5+i&N5B82$Okv`ur()<>zEk2TFi6JOXSlBQTmDdHP)GapMSn~xmw+0K%$(KR&` zGD;B?1h&E`6}54c62tYCm9m(OZ!xtk5(nL1v;RbQ=HC0=nKR!#_k8Dm#pgo;_4kd`4FXTtAZdgW#r}jzFSy!I7hzPz0X!2tiTl0I)Cq>(prWWu^dt zjwRCH51oBiA&m(dO*a3%7OW)w^XdkUi{WvG<@5@~{mlsLhvI&Uv z-&CrX*z}S%0Js#EWk5hSjNJ_y01$cD8~_Rqd~;zB-`L<*=G>s!&-vRYq-?-VXBeQr zDK&vq*VKFxiQYa=8Wqm*mDA6)+&w&44K}Dnlxbdb$&`vm@1NwQG`%jm>~W zVz~vgw-5C8_6`$LY*R8a(0Sdsm?u|;A6*uYc-TbIeDg73VO3M9g4aA8?T$r39Vx=R zz?kZmR37U*@y6zm0lTTmZf?-SltQJ3M@O^HAE|z%UX^w*g*TK-U)JR*^{!rCM`%OL zzzR#djGddizC(kka5l!SQ>);Mp?(3KL?YGl)Op%^u;OVKf)Uk z3WZ{6bv5Lr^KE{7ua4qf+nFup2h?&I6GdY+H3g6%xRC7rN}Is3@$s59H89gVxxawk z&|tkwQv*4om=ugpPO?=h6@9)dPaRG5Ov50N#U-Vs@@=PHQH9mGRLbGR2!0ZZWr?6J z91iE*ldIHN=Lm#btTQ<}CT8blx7Bo-KNL`z>64w~Myl*l8S|3*>cLM$;Wb!2EPL(# zz`%gLZzec`dOt#)VbM9L;)G9H7$(BmC-aHtf?>-c6>g~Y{2i}#tg%PAmLs6)TyCF<4``FY}>wfzXTfSVq zr3}Ynxg{lg;)F!^2WE@Ly4w7tp?i8fAHsBjq~6DK*FlXU6COzSLk$UhEsMnpF8$${ zYSzs_?%?D!R&wBI-d4`ltDNI*Zkg*d0m#s#B<6rv{8c5;HzMIB9FCTAlGcgkIXXJd zbook8=BnuB<>h)ju~;1D=l2{kFAorbnX9Q(_OtZ)^7?QLX2XWlV+(#3blKC6?>_wU0C;czh-V&!waLwc=4y0Mwl5;+-cYjnZI^zK@FU#SUx zaipmV^qV{&Fg(1*+}s?EMnkinT$>H%L_JOn%>oinX!W$lb!4p!4JVI*#jZ<+Qr0?0 znJ6lSLcvLVV6efZarP@gn#|~)`c!VN@a?m7X0g9@e&_0}nB4!KaP~_xhf_ahR(06d zSH>3zM43Y`UKDv}t<K@cHbt;G$F^z*mfqvTqx;vgw zXaZP|#pUIL%1sNOtXlj8*G`?g@$uui#6*VP9|+_Sg=~S6N$uriFIYsZ(fJ`QXq_)*3=DyX;5tZe6&e?DOG_*I zDdEA~D=PVRec@tRGGOT0E#rY$v3z|&^=Ua}QobaAi`d;g#{ajyJSEr=|3W~)c6iiZ>)Q)AEE?Ldr)}q7ody{K$bb-kF5=?N F{{WHs%o_jz diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_77.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_77.svg deleted file mode 100644 index f423ee824f38..000000000000 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_77.svg +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py index d6e16d247f1b..f733c6c18806 100644 --- a/lib/matplotlib/tests/test_mathtext.py +++ b/lib/matplotlib/tests/test_mathtext.py @@ -16,7 +16,7 @@ # If test is removed, use None as placeholder math_tests = [ r'$a+b+\dot s+\dot{s}+\ldots$', - r'$x \doteq y$', + r'$x\hspace{-0.2}\doteq\hspace{-0.2}y$', r'\$100.00 $\alpha \_$', r'$\frac{\$100.00}{y}$', r'$x y$', @@ -104,12 +104,12 @@ r'$\mathring{A} \AA$', r'$M \, M \thinspace M \/ M \> M \: M \; M \ M \enspace M \quad M \qquad M \! M$', r'$\Cap$ $\Cup$ $\leftharpoonup$ $\barwedge$ $\rightharpoonup$', - r'$\dotplus$ $\doteq$ $\doteqdot$ $\ddots$', + r'$\hspace{-0.2}\dotplus\hspace{-0.2}$ $\hspace{-0.2}\doteq\hspace{-0.2}$ $\hspace{-0.2}\doteqdot\hspace{-0.2}$ $\ddots$', r'$xyz^kx_kx^py^{p-2} d_i^jb_jc_kd x^j_i E^0 E^0_u$', # github issue #4873 r'${xyz}^k{x}_{k}{x}^{p}{y}^{p-2} {d}_{i}^{j}{b}_{j}{c}_{k}{d} {x}^{j}_{i}{E}^{0}{E}^0_u$', r'${\int}_x^x x\oint_x^x x\int_{X}^{X}x\int_x x \int^x x \int_{x} x\int^{x}{\int}_{x} x{\int}^{x}_{x}x$', r'testing$^{123}$', - ' '.join('$\\' + p + '$' for p in sorted(_mathtext.Parser._accentprefixed)), + None, r'$6-2$; $-2$; $ -2$; ${-2}$; ${ -2}$; $20^{+3}_{-2}$', 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 @@ -246,6 +246,19 @@ def test_mathfont_rendering(baseline_images, fontset, index, text): horizontalalignment='center', verticalalignment='center') +@check_figures_equal(extensions=["png"]) +def test_short_long_accents(fig_test, fig_ref): + acc_map = _mathtext.Parser._accent_map + short_accs = [s for s in acc_map if len(s) == 1] + corresponding_long_accs = [] + for s in short_accs: + l, = [l for l in acc_map if len(l) > 1 and acc_map[l] == acc_map[s]] + corresponding_long_accs.append(l) + fig_test.text(0, .5, "$" + "".join(rf"\{s}a" for s in short_accs) + "$") + fig_ref.text( + 0, .5, "$" + "".join(fr"\{l} a" for l in corresponding_long_accs) + "$") + + def test_fontinfo(): fontpath = mpl.font_manager.findfont("DejaVu Sans") font = mpl.ft2font.FT2Font(fontpath) @@ -258,6 +271,8 @@ def test_fontinfo(): [ (r'$\hspace{}$', r'Expected \hspace{space}'), (r'$\hspace{foo}$', r'Expected \hspace{space}'), + (r'$\sinx$', r'Unknown symbol: \sinx'), + (r'$\dotx$', r'Unknown symbol: \dotx'), (r'$\frac$', r'Expected \frac{num}{den}'), (r'$\frac{}{}$', r'Expected \frac{num}{den}'), (r'$\binom$', r'Expected \binom{num}{den}'), @@ -288,6 +303,8 @@ def test_fontinfo(): ids=[ 'hspace without value', 'hspace with invalid value', + 'function without space', + 'accent without space', 'frac without parameters', 'frac with empty parameters', 'binom without parameters', From b94addd4d6361b39f8192d7dd9b61aff3b2f9c45 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Mon, 4 Jul 2022 11:51:54 +0200 Subject: [PATCH 3/3] Make dotplus, dotminus binary operators. --- doc/api/next_api_changes/behavior/22950-AL.rst | 3 +++ lib/matplotlib/_mathtext.py | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 doc/api/next_api_changes/behavior/22950-AL.rst diff --git a/doc/api/next_api_changes/behavior/22950-AL.rst b/doc/api/next_api_changes/behavior/22950-AL.rst new file mode 100644 index 000000000000..bd4484936e93 --- /dev/null +++ b/doc/api/next_api_changes/behavior/22950-AL.rst @@ -0,0 +1,3 @@ +``$\doteq \doteqdot \dotminus \dotplus \dots$`` are now surrounded by extra space +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +... because they are correctly treated as relational or binary operators. diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index f9f1c64fb19a..ac7d4d813793 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -1649,7 +1649,8 @@ class _MathStyle(enum.Enum): \cdot \bigtriangledown \bigcirc \cap \triangleleft \dagger \cup \triangleright \ddagger - \uplus \lhd \amalg'''.split()) + \uplus \lhd \amalg + \dotplus \dotminus'''.split()) _relation_symbols = set(r''' = < > : @@ -1662,7 +1663,7 @@ class _MathStyle(enum.Enum): \sqsubset \sqsupset \neq \smile \sqsubseteq \sqsupseteq \doteq \frown \in \ni \propto \vdash - \dashv \dots \dotplus \doteqdot'''.split()) + \dashv \dots \doteqdot'''.split()) _arrow_symbols = set(r''' \leftarrow \longleftarrow \uparrow