Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9b301a4

Browse files
committed
Add substack command for mathtext
Co-Authored By: Kyle Sunden <[email protected]>
1 parent 4dbba98 commit 9b301a4

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

lib/matplotlib/_mathtext.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
Empty, Forward, Literal, NotAny, oneOf, OneOrMore, Optional,
1919
ParseBaseException, ParseException, ParseExpression, ParseFatalException,
2020
ParserElement, ParseResults, QuotedString, Regex, StringEnd, ZeroOrMore,
21-
pyparsing_common)
21+
pyparsing_common, Group)
2222

2323
import matplotlib as mpl
2424
from . import cbook
@@ -27,6 +27,11 @@
2727
from .font_manager import FontProperties, findfont, get_font
2828
from .ft2font import FT2Image, KERNING_DEFAULT
2929

30+
from pyparsing import __version_info__ as pyparsing_version
31+
if pyparsing_version < (3, 0):
32+
from pyparsing import nestedExpr as nested_expr
33+
else:
34+
from pyparsing import nested_expr
3035

3136
ParserElement.enablePackrat()
3237
_log = logging.getLogger("matplotlib.mathtext")
@@ -1865,7 +1870,7 @@ def csnames(group, names):
18651870
+ r"|\\(?:{})(?![A-Za-z])".format(
18661871
"|".join(map(re.escape, tex2uni)))
18671872
)("sym").leaveWhitespace()
1868-
p.unknown_symbol = Regex(r"\\[A-Za-z]*")("name")
1873+
p.unknown_symbol = Regex(r"\\[A-Za-z]+")("name")
18691874

18701875
p.font = csnames("font", self._fontnames)
18711876
p.start_group = Optional(r"\math" + oneOf(self._fontnames)("font")) + "{"
@@ -1925,6 +1930,11 @@ def csnames(group, names):
19251930

19261931
p.text = cmd(r"\text", QuotedString('{', '\\', endQuoteChar="}"))
19271932

1933+
p.substack = cmd(r"\substack",
1934+
nested_expr(opener="{", closer="}",
1935+
content=Group(OneOrMore(p.token)) +
1936+
ZeroOrMore(Literal("\\\\").suppress()))("parts"))
1937+
19281938
p.subsuper = (
19291939
(Optional(p.placeable)("nucleus")
19301940
+ OneOrMore(oneOf(["_", "^"]) - p.placeable)("subsuper")
@@ -1963,6 +1973,7 @@ def csnames(group, names):
19631973
| p.overline
19641974
| p.text
19651975
| p.boldsymbol
1976+
| p.substack
19661977
)
19671978

19681979
mdelim = r"\middle" - (p.delim("mdelim") | Error("Expected a delimiter"))
@@ -2648,3 +2659,25 @@ def boldsymbol(self, s, loc, toks):
26482659
self.pop_state()
26492660

26502661
return Hlist(hlist)
2662+
2663+
def substack(self, s, loc, toks):
2664+
parts = toks["parts"]
2665+
state = self.get_state()
2666+
thickness = state.get_current_underline_thickness()
2667+
vlist = []
2668+
2669+
hlist = [Hlist(k) for k in parts[0]]
2670+
max_width = max(map(lambda c: c.width, hlist))
2671+
2672+
for sub in hlist:
2673+
cp = HCentered([sub])
2674+
cp.hpack(max_width, 'exactly')
2675+
vlist.append(cp)
2676+
2677+
vlist = [val for pair in zip(vlist,
2678+
[Vbox(0, thickness * 2)] *
2679+
len(vlist)) for val in pair]
2680+
del vlist[-1]
2681+
vlt = Vlist(vlist)
2682+
result = [Hlist([vlt])]
2683+
return result

lib/matplotlib/tests/test_mathtext.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@
137137
r'$\boldsymbol{abcde} \boldsymbol{+} \boldsymbol{\Gamma + \Omega} \boldsymbol{01234} \boldsymbol{\alpha * \beta}$',
138138
r'$\left\lbrace\frac{\left\lbrack A^b_c\right\rbrace}{\left\leftbrace D^e_f \right\rbrack}\right\rightbrace\ \left\leftparen\max_{x} \left\lgroup \frac{A}{B}\right\rgroup \right\rightparen$',
139139
r'$\left( a\middle. b \right)$ $\left( \frac{a}{b} \middle\vert x_i \in P^S \right)$ $\left[ 1 - \middle| a\middle| + \left( x - \left\lfloor \dfrac{a}{b}\right\rfloor \right) \right]$',
140+
r'$\sum_{\substack{k = 1\\ k \neq \lfloor n/2\rfloor}}^{n}P(i,j) \sum_{\substack{i \neq 0\\ -1 \leq i \leq 3\\ 1 \leq j \leq 5}} F^i(x,y) \sum_{\substack{\left \lfloor \frac{n}{2} \right\rfloor}} F(n)$',
140141
]
141142

142143
digits = "0123456789"

0 commit comments

Comments
 (0)