6868##############################################################################
6969# FONTS
7070
71- def get_unicode_index (symbol ):
72- """get_unicode_index(symbol) -> integer
71+ def get_unicode_index (symbol , math = True ):
72+ """get_unicode_index(symbol, [bool] ) -> integer
7373
7474Return the integer index (from the Unicode table) of symbol. *symbol*
7575can be a single unicode character, a TeX command (i.e. r'\pi'), or a
7676Type1 symbol name (i.e. 'phi').
77+ If math is False, the current symbol should be treated as a non-math symbol.
7778"""
79+ # for a non-math symbol, simply return its unicode index
80+ if not math :
81+ return ord (symbol )
7882 # From UTF #25: U+2212 minus sign is the preferred
7983 # representation of the unary and binary minus sign rather than
8084 # the ASCII-derived U+002D hyphen-minus, because minus sign is
@@ -438,7 +442,7 @@ def get_kern(self, font1, fontclass1, sym1, fontsize1,
438442 """
439443 return 0.
440444
441- def get_metrics (self , font , font_class , sym , fontsize , dpi ):
445+ def get_metrics (self , font , font_class , sym , fontsize , dpi , math = True ):
442446 """
443447 *font*: one of the TeX font names::
444448
@@ -452,6 +456,8 @@ def get_metrics(self, font, font_class, sym, fontsize, dpi):
452456
453457 *dpi*: current dots-per-inch
454458
459+ *math*: whether sym is a math character
460+
455461 Returns an object with the following attributes:
456462
457463 - *advance*: The advance distance (in points) of the glyph.
@@ -466,7 +472,7 @@ def get_metrics(self, font, font_class, sym, fontsize, dpi):
466472 the glyph. This corresponds to TeX's definition of
467473 "height".
468474 """
469- info = self ._get_info (font , font_class , sym , fontsize , dpi )
475+ info = self ._get_info (font , font_class , sym , fontsize , dpi , math )
470476 return info .metrics
471477
472478 def set_canvas_size (self , w , h , d ):
@@ -582,14 +588,14 @@ def _get_offset(self, font, glyph, fontsize, dpi):
582588 return ((glyph .height / 64.0 / 2.0 ) + (fontsize / 3.0 * dpi / 72.0 ))
583589 return 0.
584590
585- def _get_info (self , fontname , font_class , sym , fontsize , dpi ):
591+ def _get_info (self , fontname , font_class , sym , fontsize , dpi , math = True ):
586592 key = fontname , font_class , sym , fontsize , dpi
587593 bunch = self .glyphd .get (key )
588594 if bunch is not None :
589595 return bunch
590596
591597 font , num , symbol_name , fontsize , slanted = \
592- self ._get_glyph (fontname , font_class , sym , fontsize )
598+ self ._get_glyph (fontname , font_class , sym , fontsize , math )
593599
594600 font .set_size (fontsize , dpi )
595601 glyph = font .load_char (
@@ -679,7 +685,7 @@ def __init__(self, *args, **kwargs):
679685
680686 _slanted_symbols = set (r"\int \oint" .split ())
681687
682- def _get_glyph (self , fontname , font_class , sym , fontsize ):
688+ def _get_glyph (self , fontname , font_class , sym , fontsize , math = True ):
683689 symbol_name = None
684690 font = None
685691 if fontname in self .fontmap and sym in latex_to_bakoma :
@@ -699,7 +705,7 @@ def _get_glyph(self, fontname, font_class, sym, fontsize):
699705
700706 if symbol_name is None :
701707 return self ._stix_fallback ._get_glyph (
702- fontname , font_class , sym , fontsize )
708+ fontname , font_class , sym , fontsize , math )
703709
704710 return font , num , symbol_name , fontsize , slanted
705711
@@ -796,7 +802,7 @@ def __init__(self, *args, **kwargs):
796802 def _map_virtual_font (self , fontname , font_class , uniindex ):
797803 return fontname , uniindex
798804
799- def _get_glyph (self , fontname , font_class , sym , fontsize ):
805+ def _get_glyph (self , fontname , font_class , sym , fontsize , math = True ):
800806 found_symbol = False
801807
802808 if self .use_cmex :
@@ -807,7 +813,7 @@ def _get_glyph(self, fontname, font_class, sym, fontsize):
807813
808814 if not found_symbol :
809815 try :
810- uniindex = get_unicode_index (sym )
816+ uniindex = get_unicode_index (sym , math )
811817 found_symbol = True
812818 except ValueError :
813819 uniindex = ord ('?' )
@@ -901,11 +907,11 @@ def __init__(self, *args, **kwargs):
901907 self .fontmap [key ] = fullpath
902908 self .fontmap [name ] = fullpath
903909
904- def _get_glyph (self , fontname , font_class , sym , fontsize ):
910+ def _get_glyph (self , fontname , font_class , sym , fontsize , math = True ):
905911 """ Override prime symbol to use Bakoma """
906912 if sym == r'\prime' :
907913 return self .bakoma ._get_glyph (fontname ,
908- font_class , sym , fontsize )
914+ font_class , sym , fontsize , math )
909915 else :
910916 # check whether the glyph is available in the display font
911917 uniindex = get_unicode_index (sym )
@@ -914,10 +920,10 @@ def _get_glyph(self, fontname, font_class, sym, fontsize):
914920 glyphindex = font .get_char_index (uniindex )
915921 if glyphindex != 0 :
916922 return super (DejaVuFonts , self )._get_glyph ('ex' ,
917- font_class , sym , fontsize )
923+ font_class , sym , fontsize , math )
918924 # otherwise return regular glyph
919925 return super (DejaVuFonts , self )._get_glyph (fontname ,
920- font_class , sym , fontsize )
926+ font_class , sym , fontsize , math )
921927
922928
923929class DejaVuSerifFonts (DejaVuFonts ):
@@ -1123,7 +1129,7 @@ def _get_font(self, font):
11231129 self .fonts [cached_font .get_fontname ()] = cached_font
11241130 return cached_font
11251131
1126- def _get_info (self , fontname , font_class , sym , fontsize , dpi ):
1132+ def _get_info (self , fontname , font_class , sym , fontsize , dpi , math = True ):
11271133 'load the cmfont, metrics and glyph with caching'
11281134 key = fontname , sym , fontsize , dpi
11291135 tup = self .glyphd .get (key )
@@ -1449,14 +1455,15 @@ class Char(Node):
14491455 from width) must be converted into a :class:`Kern` node when the
14501456 :class:`Char` is added to its parent :class:`Hlist`.
14511457 """
1452- def __init__ (self , c , state ):
1458+ def __init__ (self , c , state , math = True ):
14531459 Node .__init__ (self )
14541460 self .c = c
14551461 self .font_output = state .font_output
14561462 self .font = state .font
14571463 self .font_class = state .font_class
14581464 self .fontsize = state .fontsize
14591465 self .dpi = state .dpi
1466+ self .math = math
14601467 # The real width, height and depth will be set during the
14611468 # pack phase, after we know the real fontsize
14621469 self ._update_metrics ()
@@ -1466,7 +1473,7 @@ def __internal_repr__(self):
14661473
14671474 def _update_metrics (self ):
14681475 metrics = self ._metrics = self .font_output .get_metrics (
1469- self .font , self .font_class , self .c , self .fontsize , self .dpi )
1476+ self .font , self .font_class , self .c , self .fontsize , self .dpi , self . math )
14701477 if self .c == ' ' :
14711478 self .width = metrics .advance
14721479 else :
@@ -2580,7 +2587,7 @@ def math(self, s, loc, toks):
25802587 def non_math (self , s , loc , toks ):
25812588 #~ print "non_math", toks
25822589 s = toks [0 ].replace (r'\$' , '$' )
2583- symbols = [Char (c , self .get_state ()) for c in s ]
2590+ symbols = [Char (c , self .get_state (), math = False ) for c in s ]
25842591 hlist = Hlist (symbols )
25852592 # We're going into math now, so set font to 'it'
25862593 self .push_state ()
0 commit comments