div = Literal('/') binop = plus | minus | times | div roman = Literal('rm') cal = Literal('cal') italics = Literal('it') typewriter = Literal('tt') fontname = roman | cal | italics | typewriter texsym = Combine(bslash + Word(alphanums) + NotAny("{")) char = Word(alphanums + ' ', exact=1).leaveWhitespace() space = FollowedBy(bslash) + ( Literal(r'\ ') | Literal(r'\/') | Group(Literal(r'\hspace{') + number + Literal('}'))).setParseAction( handler.space).setName('space') symbol = Regex("(" + ")|(".join([ r"\\[a-zA-Z0-9]+(?!{)", r"[a-zA-Z0-9 ]", r"[+\-*/]", r"[<>=]", r"[:,.;!]", r"[!@%&]", r"[[\]()]", ]) + ")").setParseAction(handler.symbol).leaveWhitespace() #~ symbol = (texsym ^ char ^ binop ^ relation ^ punctuation ^ misc ^ grouping ).setParseAction(handler.symbol).leaveWhitespace() _symbol = (texsym | char | binop | relation | punctuation | misc | grouping).setParseAction(handler.symbol).leaveWhitespace()
times = Literal('*') div = Literal('/') binop = plus | minus | times | div roman = Literal('rm') cal = Literal('cal') italics = Literal('it') typewriter = Literal('tt') fontname = roman | cal | italics | typewriter texsym = Combine(bslash + Word(alphanums) + NotAny(lbrace)) char = Word(alphanums + ' ', exact=1).leaveWhitespace() space = (Literal(r'\ ') | Literal(r'\/') | Group(Literal(r'\hspace{') + number + Literal('}'))).setParseAction(handler.space).setName('space') #~ 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") group = Group( lbrace + OneOrMore(symbol^subscript^superscript^subsuperscript^space) + 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")