@@ -238,6 +238,9 @@ def __init__(self, useSVG=False):
238238 [ (name , FT2Font (os .path .join (self .basepath , name ) + '.ttf' ))
239239 for name in self .fnames ])
240240
241+ self .charmaps = dict (
242+ [ (name , self .fonts [name ].get_charmap ()) for name in self .fnames ])
243+
241244 for font in self .fonts .values ():
242245 font .clear ()
243246 if useSVG :
@@ -261,7 +264,7 @@ def _get_info (self, font, sym, fontsize, dpi):
261264
262265 if latex_to_bakoma .has_key (sym ):
263266 basename , num = latex_to_bakoma [sym ]
264- num = self .fonts [basename ]. get_charmap () [num ]
267+ num = self .charmaps [basename ][num ]
265268 elif len (sym ) == 1 :
266269 num = ord (sym )
267270 else :
@@ -311,7 +314,7 @@ def render(self, ox, oy, font, sym, fontsize, dpi):
311314 basename = self .fontmap [font ]
312315 if latex_to_bakoma .has_key (sym ):
313316 basename , num = latex_to_bakoma [sym ]
314- num = self .fonts [basename ]. get_charmap () [num ]
317+ num = self .charmaps [basename ][num ]
315318 elif len (sym ) == 1 :
316319 num = ord (sym )
317320 else :
@@ -342,6 +345,8 @@ def __init__(self):
342345 [ (name , FT2Font (os .path .join (self .basepath , name ) + '.ttf' ))
343346 for name in self .fnames ])
344347
348+ self .charmaps = dict (
349+ [ (name , self .fonts [name ].get_charmap ()) for name in self .fnames ])
345350 for font in self .fonts .values ():
346351 font .clear ()
347352
@@ -358,7 +363,7 @@ def _get_info (self, font, sym, fontsize, dpi):
358363 if latex_to_bakoma .has_key (sym ):
359364 basename , num = latex_to_bakoma [sym ]
360365 sym = self .fonts [basename ].get_glyph_name (num )
361- num = self .fonts [basename ]. get_charmap () [num ]
366+ num = self .charmaps [basename ][num ]
362367 elif len (sym ) == 1 :
363368 num = ord (sym )
364369 else :
@@ -480,6 +485,7 @@ def set_origin(self, ox, oy):
480485 if loc == 'above' :
481486 nx = self .centerx () - element .width ()/ 2.0
482487 ny = self .ymax () + self .pady ()
488+ #print element, self.ymax(), element.height(), element.ymax(), element.ymin(), ny
483489 elif loc == 'below' :
484490 nx = self .centerx () - element .width ()/ 2.0
485491 ny = self .ymin () - self .pady () - element .height ()
@@ -529,7 +535,7 @@ def set_scale(self, scale):
529535 self ._scale = scale
530536
531537 def centerx (self ):
532- return self .ox + self .advance () / 2.0
538+ return 0.5 * ( self .xmax () + self .xmin () )
533539
534540 def centery (self ):
535541 return 0.5 * (self .ymax () + self .ymin () )
@@ -539,18 +545,22 @@ def __repr__(self):
539545
540546class SpaceElement (Element ):
541547 'blank horizontal space'
542- def __init__ (self , space ):
543- 'space is the amount of blank space in fraction of fontsize'
548+ def __init__ (self , space , height = 0 ):
549+ """
550+ space is the amount of blank space in fraction of fontsize
551+ height is the height of the space in fraction of fontsize
552+ """
544553 Element .__init__ (self )
545554 self .space = space
555+ self ._height = height
546556
547557 def advance (self ):
548558 'get the horiz advance'
549559 return self .dpi / 72.0 * self .space * self .fontsize
550560
551561 def height (self ):
552562 'get the element height: ymax-ymin'
553- return 0
563+ return self . _height * self . dpi / 72.0 * self . fontsize
554564
555565 def width (self ):
556566 'get the element width: xmax-xmin'
@@ -570,7 +580,7 @@ def ymin(self):
570580
571581 def ymax (self ):
572582 'get the max ink in y'
573- return self .oy
583+ return self .oy + self . height ()
574584
575585 def set_font (self , f ):
576586 # space doesn't care about font, only size
@@ -772,7 +782,23 @@ def composite(self, s, loc, toks):
772782 self .symbols .append (sym1 )
773783
774784 return loc , [sym0 ]
775-
785+
786+ def accent (self , s , loc , toks ):
787+
788+ assert (len (toks )== 1 )
789+ accent , sym = toks [0 ]
790+
791+ d = {
792+ r'\hat' : r'\circumflexaccent' ,
793+ r'\breve' : r'\combiningbreve' ,
794+ r'\bar' : r'\combiningoverline' ,
795+ }
796+ above = SymbolElement (d [accent ])
797+ sym .neighbors ['above' ] = above
798+ sym .set_pady (1 )
799+ self .symbols .append (above )
800+ return loc , [sym ]
801+
776802 def group (self , s , loc , toks ):
777803 assert (len (toks )== 1 )
778804 #print 'grp', toks
@@ -790,7 +816,11 @@ def font(self, s, loc, toks):
790816 def subscript (self , s , loc , toks ):
791817 assert (len (toks )== 1 )
792818 #print 'subsup', toks
793- prev , under , next = toks [0 ]
819+ if len (toks [0 ])== 2 :
820+ under , next = toks [0 ]
821+ prev = SpaceElement (0 )
822+ else :
823+ prev , under , next = toks [0 ]
794824
795825 if self .is_overunder (prev ):
796826 prev .neighbors ['below' ] = next
@@ -805,8 +835,11 @@ def is_overunder(self, prev):
805835 def superscript (self , s , loc , toks ):
806836 assert (len (toks )== 1 )
807837 #print 'subsup', toks
808- prev , under , next = toks [0 ]
809-
838+ if len (toks [0 ])== 2 :
839+ under , next = toks [0 ]
840+ prev = SpaceElement (0 ,0.6 )
841+ else :
842+ prev , under , next = toks [0 ]
810843 if self .is_overunder (prev ):
811844 prev .neighbors ['above' ] = next
812845 else :
@@ -866,6 +899,10 @@ def subsuperscript(self, s, loc, toks):
866899#~ composite = over | under
867900overUnder = over | under
868901
902+ accent = Literal ('hat' ) | Literal ('check' ) | Literal ('dot' ) | \
903+ Literal ('breve' ) | Literal ('acute' ) | Literal ('ddot' ) | \
904+ Literal ('grave' ) | Literal ('tilde' ) | Literal ('bar' ) | Literal ('vec' )
905+
869906
870907
871908number = Combine (Word (nums ) + Optional (Literal ('.' )) + Optional ( Word (nums ) ))
@@ -904,20 +941,20 @@ def subsuperscript(self, s, loc, toks):
904941#~ composite = Group( Combine(bslash + composite) + group + group).setParseAction(handler.composite).setName("composite")
905942composite = Group ( Combine (bslash + overUnder ) + group + group ).setParseAction (handler .composite ).setName ("composite" )
906943
907-
944+ accent = Group ( Combine ( bslash + accent ) + group ). setParseAction ( handler . accent ). setName ( "accent" )
908945
909946#~ symgroup = symbol ^ group
910947symgroup = symbol | group
911948
912- subscript << Group ( symgroup + Literal ('_' ) + symgroup )
913- superscript << Group ( symgroup + Literal ('^' ) + symgroup )
949+ subscript << Group ( Optional ( symgroup ) + Literal ('_' ) + symgroup )
950+ superscript << Group ( Optional ( symgroup ) + Literal ('^' ) + symgroup )
914951subsuperscript << Group ( symgroup + Literal ('_' ) + symgroup + Literal ('^' ) + symgroup )
915952
916953
917954font = Group ( Combine (bslash + fontname ) + group ).setParseAction (handler .font ).setName ("font" )
918955
919956expression = OneOrMore (
920- space ^ font ^ symbol ^ subscript ^ superscript ^ subsuperscript ^ group ^ composite ).setParseAction (handler .expression ).setName ("expression" )
957+ space ^ font ^ accent ^ symbol ^ subscript ^ superscript ^ subsuperscript ^ group ^ composite ).setParseAction (handler .expression ).setName ("expression" )
921958#~ expression = OneOrMore(
922959 #~ group | composite | space | font | subsuperscript | subscript | superscript | symbol ).setParseAction(handler.expression).setName("expression")
923960
0 commit comments