@@ -2107,8 +2107,8 @@ class Parser(object):
2107
2107
\\ subseteq \\ supseteq \\ cong \\ Join
2108
2108
\\ sqsubset \\ sqsupset \\ neq \\ smile
2109
2109
\\ sqsubseteq \\ sqsupseteq \\ doteq \\ frown
2110
- \\ in \\ ni \\ propto
2111
- \\ vdash \\ dashv \\ dots ''' .split ())
2110
+ \\ in \\ ni \\ propto \\ vdash
2111
+ \\ dashv \\ dots \\ dotplus \\ doteqdot ''' .split ())
2112
2112
2113
2113
_arrow_symbols = set ('''
2114
2114
\\ leftarrow \\ longleftarrow \\ uparrow
@@ -2190,6 +2190,7 @@ def __init__(self):
2190
2190
p .simple = Forward ()
2191
2191
p .simple_group = Forward ()
2192
2192
p .single_symbol = Forward ()
2193
+ p .snowflake = Forward ()
2193
2194
p .space = Forward ()
2194
2195
p .sqrt = Forward ()
2195
2196
p .stackrel = Forward ()
@@ -2223,6 +2224,7 @@ def __init__(self):
2223
2224
unicode_range = "\U00000080 -\U0001ffff "
2224
2225
p .single_symbol <<= Regex (r"([a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|%s])|(\\[%%${}\[\]_|])" %
2225
2226
unicode_range )
2227
+ p .snowflake <<= Suppress (p .bslash ) + oneOf (self ._snowflake )
2226
2228
p .symbol_name <<= (Combine (p .bslash + oneOf (list (six .iterkeys (tex2uni )))) +
2227
2229
FollowedBy (Regex ("[^A-Za-z]" ).leaveWhitespace () | StringEnd ()))
2228
2230
p .symbol <<= (p .single_symbol | p .symbol_name ).leaveWhitespace ()
@@ -2297,8 +2299,10 @@ def __init__(self):
2297
2299
| Error ("Expected \operatorname{value}" ))
2298
2300
)
2299
2301
2300
- p .placeable <<= ( p .symbol # Must be first
2301
- | p .accent # Must be second
2302
+ p .placeable <<= ( p .snowflake # this needs to be before accent so named symbols
2303
+ # that are prefixed with an accent name work
2304
+ | p .accent # Must be before symbol as all accents are symbols
2305
+ | p .symbol # Must be third to catch all named symbols and single chars not in a group
2302
2306
| p .c_over_c
2303
2307
| p .function
2304
2308
| p .group
@@ -2498,13 +2502,15 @@ def symbol(self, s, loc, toks):
2498
2502
return [Hlist ( [self ._make_space (0.2 ),
2499
2503
char ,
2500
2504
self ._make_space (0.2 )] ,
2501
- do_kern = False )]
2505
+ do_kern = True )]
2502
2506
elif c in self ._punctuation_symbols :
2503
2507
return [Hlist ( [char ,
2504
2508
self ._make_space (0.2 )] ,
2505
- do_kern = False )]
2509
+ do_kern = True )]
2506
2510
return [char ]
2507
2511
2512
+ snowflake = symbol
2513
+
2508
2514
def unknown_symbol (self , s , loc , toks ):
2509
2515
# print "symbol", toks
2510
2516
c = toks [0 ]
@@ -2560,9 +2566,9 @@ def c_over_c(self, s, loc, toks):
2560
2566
r'bar' : r'\combiningoverline' ,
2561
2567
r'grave' : r'\combininggraveaccent' ,
2562
2568
r'acute' : r'\combiningacuteaccent' ,
2563
- r'ddot' : r'\combiningdiaeresis' ,
2564
2569
r'tilde' : r'\combiningtilde' ,
2565
2570
r'dot' : r'\combiningdotabove' ,
2571
+ r'ddot' : r'\combiningdiaeresis' ,
2566
2572
r'vec' : r'\combiningrightarrowabove' ,
2567
2573
r'"' : r'\combiningdiaeresis' ,
2568
2574
r"`" : r'\combininggraveaccent' ,
@@ -2577,6 +2583,11 @@ def c_over_c(self, s, loc, toks):
2577
2583
2578
2584
_wide_accents = set (r"widehat widetilde widebar" .split ())
2579
2585
2586
+ # make a lambda and call it to get the namespace right
2587
+ _snowflake = (lambda am : [p for p in tex2uni if
2588
+ any (p .startswith (a ) and a != p for a in am )]
2589
+ ) (set (_accent_map ))
2590
+
2580
2591
def accent (self , s , loc , toks ):
2581
2592
assert (len (toks )== 1 )
2582
2593
state = self .get_state ()
0 commit comments