accent = Group( Combine(bslash + accent) + Optional(lbrace) + symbol + Optional(rbrace)).setParseAction(handler.accent).setName("accent") symgroup = font ^ group ^ symbol subscript << Group( Optional(symgroup) + Literal('_') + symgroup ) superscript << Group( Optional(symgroup) + Literal('^') + symgroup ) subsuperscript << Group( symgroup + Literal('_') + symgroup + Literal('^') + symgroup ) font << Group( Combine(bslash + fontname) + group) expression = OneOrMore( space ^ font ^ accent ^ symbol ^ subscript ^ superscript ^ subsuperscript ^ group ^ composite ).setParseAction(handler.expression).setName("expression") #~ expression = OneOrMore( #~ group | composite | space | font | subsuperscript | subscript | superscript | symbol ).setParseAction(handler.expression).setName("expression") #### def math_parse_s_ft2font(s, dpi, fontsize, angle=0): """ Parse the math expression s, return the (bbox, fonts) tuple needed to render it. fontsize must be in points
#~ symbol = (texsym ^ char ^ binop ^ relation ^ punctuation ^ misc ^ grouping ).setParseAction(handler.symbol).leaveWhitespace() _symbol = (texsym | char | binop | relation | punctuation | misc | grouping).setParseAction(handler.symbol).leaveWhitespace() subscript = Forward().setParseAction(handler.subscript).setName("subscript") superscript = Forward().setParseAction( handler.superscript).setName("superscript") subsuperscript = Forward().setParseAction( handler.subsuperscript).setName("subsuperscript") font = Forward().setParseAction(handler.font).setName("font") accent = Group( Combine(bslash + accent) + Optional(lbrace) + symbol + Optional(rbrace)).setParseAction(handler.accent).setName("accent") group = Group(lbrace + OneOrMore(symbol ^ subscript ^ superscript ^ subsuperscript ^ space ^ font ^ accent) + rbrace).setParseAction(handler.group).setName("group") #~ group = Group( lbrace + OneOrMore(subsuperscript | subscript | superscript | symbol | space ) + rbrace).setParseAction(handler.group).setName("group") #composite = Group( Combine(bslash + composite) + lbrace + symbol + rbrace + lbrace + symbol + rbrace).setParseAction(handler.composite).setName("composite") #~ composite = Group( Combine(bslash + composite) + group + group).setParseAction(handler.composite).setName("composite") composite = Group(Combine(bslash + overUnder) + group + group).setParseAction( handler.composite).setName("composite") symgroup = font | group | symbol subscript << Group(Optional(symgroup) + Literal('_') + symgroup) superscript << Group(Optional(symgroup) + Literal('^') + symgroup) subsuperscript << Group(symgroup + Literal('_') + symgroup + Literal('^') + symgroup)