8000 Add substack command for mathtext · matplotlib/matplotlib@ad02967 · GitHub
[go: up one dir, main page]

Skip to content

Commit ad02967

Browse files
committed
Add substack command for mathtext
1 parent fa68f46 commit ad02967

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")
@@ -1861,7 +1866,7 @@ def csnames(group, names):
18611866
+ r"|\\(?:{})(?![A-Za-z])".format(
18621867
"|".join(map(re.escape, tex2uni)))
18631868
)("sym").leaveWhitespace()
1864-
p.unknown_symbol = Regex(r"\\[A-Za-z]*")("name")
1869+
p.unknown_symbol = Regex(r"\\[A-Za-z]+")("name")
18651870

18661871
p.font = csnames("font", self._fontnames)
18671872
p.start_group = Optional(r"\math" + oneOf(self._fontnames)("font")) + "{"
@@ -1921,6 +1926,11 @@ def csnames(group, names):
19211926

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

1929+
p.substack = cmd(r"\substack",
1930+
nested_expr(opener="{", closer="}",
1931+
content=Group(OneOrMore(p.token)) +
1932+
ZeroOrMore(Literal("\\\\").suppress()))("parts"))
1933+
19241934
p.subsuper = (
19251935
(Optional(p.placeable)("nucleus")
19261936
+ OneOrMore(oneOf(["_", "^"]) - p.placeable)("subsuper")
@@ -1959,6 +1969,7 @@ def csnames(group, names):
19591969
| p.overline
19601970
| p.text
19611971
| p.boldsymbol
1972+
| p.substack
19621973
)
19631974

19641975
p.auto_delim <<= (
@@ -2633,3 +2644,25 @@ def boldsymbol(self, s, loc, toks):
26332644
self.pop_state()
26342645

26352646
return Hlist(hlist)
2647+
2648+
def substack(self, s, loc, toks):
2649+
parts = toks["parts"]
2650+
state = self.get_state()
2651+
thickness = state.get_current_underline_thickness()
2652+
vlist = []
2653+
2654+
hlist = [Hlist(k) for k in parts[0]]
2655+
max_width = max(map(lambda c: c.width, hlist))
2656+
2657+
for sub in hlist:
2658+
cp = HCentered([sub])
2659+
cp.hpack(max_width, 'exactly')
2660+
vlist.append(cp)
2661+
2662+
vlist = [val for pair in zip(vlist,
2663+
[Vbox(0, thickness * 2)] *
2664+
len(vlist)) for val in pair]
2665+
del vlist[-1]
2666+
vlt = Vlist(vlist)
2667+
result = [Hlist([vlt])]
2668+
return result
Loading

lib/matplotlib/tests/test_mathtext.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
r'$1.$ $2.$ $19680801.$ $a.$ $b.$ $mpl.$',
136136
r'$\text{text}_{\text{sub}}^{\text{sup}} + \text{\$foo\$} + \frac{\text{num}}{\mathbf{\text{den}}}\text{with space, curly brackets \{\}, and dash -}$',
137137
r'$\boldsymbol{abcde} \boldsymbol{+} \boldsymbol{\Gamma + \Omega} \boldsymbol{01234} \boldsymbol{\alpha * \beta}$',
138+
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)$',
138139
]
139140

140141
digits = "0123456789"

0 commit comments

Comments
 (0)
0