1414
1515import numpy as np
1616from pyparsing import (
17- Empty , Forward , Literal , NotAny , oneOf , OneOrMore , Optional , delimited_list ,
17+ Empty , Forward , Literal , NotAny , oneOf , OneOrMore , Optional ,
1818 ParseBaseException , ParseException , ParseExpression , ParseFatalException ,
1919 ParserElement , ParseResults , QuotedString , Regex , StringEnd , ZeroOrMore ,
20- pyparsing_common )
20+ pyparsing_common , nested_expr , Group )
2121
2222import matplotlib as mpl
2323from . import cbook
@@ -1700,7 +1700,6 @@ def names(elt):
17001700 csname = expr .split ("{" , 1 )[0 ]
17011701 err = (csname + "" .join ("{%s}" % name for name in names (args ))
17021702 if expr == csname else expr )
1703- print (csname , args , err )
17041703 return csname - (args | Error (f"Expected { err } " ))
17051704
17061705
@@ -1871,7 +1870,6 @@ def csnames(group, names):
18711870 p .required_group = Forward ()
18721871 p .optional_group = Forward ()
18731872 p .token = Forward ()
1874- p .substack = Forward ()
18751873
18761874 set_names_and_parse_actions () # for mutually recursive definitions.
18771875
@@ -1917,6 +1915,11 @@ def csnames(group, names):
19171915
19181916 p .text = cmd (r"\text" , QuotedString ('{' , '\\ ' , endQuoteChar = "}" ))
19191917
1918+ p .substack = cmd (r"\substack" ,
1919+ nested_expr (opener = "{" , closer = "}" ,
1920+ content = Group (OneOrMore (p .token )) +
1921+ ZeroOrMore (Literal ("\\ \\ " ).suppress ()))("parts" ))
1922+
19201923 p .subsuper = (
19211924 (Optional (p .placeable )("nucleus" )
19221925 + OneOrMore (oneOf (["_" , "^" ]) - p .placeable )("subsuper" )
@@ -1935,9 +1938,6 @@ def csnames(group, names):
19351938
19361939 p .operatorname = cmd (r"\operatorname" , "{" + ZeroOrMore (p .simple )("name" ) + "}" )
19371940
1938- p .substack <<= cmd (
1939- r"\substack" , "{" + delimited_list (OneOrMore (p .token ), delim = "\\ \\ " , combine = True )("parts" )+ "}" )
1940-
19411941 p .placeable <<= (
19421942 p .accent # Must be before symbol as all accents are symbols
19431943 | p .symbol # Must be second to catch all named symbols and single
@@ -1953,8 +1953,8 @@ def csnames(group, names):
19531953 | p .underset
19541954 | p .sqrt
19551955 | p .overline
1956- | p .substack
19571956 | p .text
1957+ | p .substack
19581958 )
19591959
19601960 p .auto_delim <<= (
@@ -1977,7 +1977,6 @@ def csnames(group, names):
19771977
19781978 # To add space to nucleus operators after sub/superscripts
19791979 self ._in_subscript_or_superscript = False
1980- self .p = p
19811980
19821981 def parse (self , s , fonts_object , fontsize , dpi ):
19831982 """
@@ -2606,17 +2605,15 @@ def auto_delim(self, s, loc, toks):
26062605 toks ["right" ])
26072606
26082607 def substack (self , s , loc , toks ):
2609- print (list (toks .keys ()))
2610- print (toks ["parts" ])
2611- parts = toks ["parts" ].split ("\\ \\ " )
2612- print (parts )
2608+ parts = toks ["parts" ]
26132609 state = self .get_state ()
26142610 thickness = state .get_current_underline_thickness ()
26152611 vlist = []
26162612
2617- max_width = max (map (lambda c : c .width , parts ))
2613+ hlist = [Hlist (k ) for k in parts [0 ]]
2614+ max_width = max (map (lambda c : c .width , hlist ))
26182615
2619- for sub in parts :
2616+ for sub in hlist :
26202617 cp = HCentered ([sub ])
26212618 cp .hpack (max_width , 'exactly' )
26222619 vlist .append (cp )
@@ -2625,7 +2622,6 @@ def substack(self, s, loc, toks):
26252622 [Vbox (0 , thickness * 2 )] *
26262623 len (vlist )) for val in pair ]
26272624 del vlist [- 1 ]
2628-
26292625 vlt = Vlist (vlist )
26302626 result = [Hlist ([vlt ])]
26312627 return result
0 commit comments