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

Skip to content

Commit 367fc3c

Browse files
committed
Add substack command for mathtext
Co-Authored By: Kyle Sunden <git@ksunden.space>
1 parent c0d9c98 commit 367fc3c

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
8000
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
p.auto_delim <<= (
@@ -2637,3 +2648,25 @@ def boldsymbol(self, s, loc, toks):
26372648
self.pop_state()
26382649

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

lib/matplotlib/tests/test_mathtext.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@
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}$',
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$',
139+
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)$',
139140
]
140141

141142
digits = "0123456789"

0 commit comments

Comments
 (0)
0