Revision: 3659 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3659&view=rev Author: mdboom Date: 2007-08-01 08:35:54 -0700 (Wed, 01 Aug 2007)
Log Message: ----------- Use numpy.inf Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/mathtext.py Modified: trunk/matplotlib/lib/matplotlib/mathtext.py =================================================================== --- trunk/matplotlib/lib/matplotlib/mathtext.py 2007-08-01 15:07:29 UTC (rev 3658) +++ trunk/matplotlib/lib/matplotlib/mathtext.py 2007-08-01 15:35:54 UTC (rev 3659) @@ -135,6 +135,7 @@ from sets import Set from unicodedata import category from warnings import warn +import numpy from matplotlib import verbose from matplotlib.pyparsing import Literal, Word, OneOrMore, ZeroOrMore, \ @@ -607,7 +608,11 @@ r'\backslash': [('cal', '\x6e'), ('ex', '\xb2'), ('ex', '\x2f'), ('ex', '\xc2'), ('ex', '\x2d')], r'/' : [('rm', '/'), ('ex', '\xb1'), ('ex', '\x2e'), - ('ex', '\xcb'), ('ex', '\x2c')] + ('ex', '\xcb'), ('ex', '\x2c')], + r'\widehat' : [('rm', '\x5e'), ('ex', '\x62'), ('ex', '\x63'), + ('ex', '\x64')], + r'\widetilde': [('rm', '\x7e'), ('ex', '\x65'), ('ex', '\x66'), + ('ex', '\x67')] } for alias, target in [('\leftparen', '('), @@ -1162,7 +1167,7 @@ List.__init__(self, elements) self.vpack() - def vpack(self, h=0., m='additional', l=float('inf')): + def vpack(self, h=0., m='additional', l=float(numpy.inf)): """The main duty of vpack is to compute the dimensions of the resulting boxes, and to adjust the glue if one of those dimensions is pre-specified. @@ -1395,7 +1400,7 @@ self.super = None Hlist.__init__(self, []) -class AutoSizedDelim(Hlist): +class AutoHeightChar(Hlist): """A class that will create a character as close to the given height and depth as possible. When using a font with multiple height versions of some characters (such as the BaKoMa fonts), the correct glyph will @@ -1425,6 +1430,34 @@ shift = (depth - char.depth) Hlist.__init__(self, [char]) self.shift_amount = shift + +class AutoWidthChar(Hlist): + """A class that will create a character as close to the given width + as possible. When using a font with multiple width versions + of some characters (such as the BaKoMa fonts), the correct glyph will + be selected, otherwise this will always just return a scaled version + of the glyph.""" + def __init__(self, c, width, state, always=False): + alternatives = state.font_output.get_sized_alternatives_for_symbol( + state.font, c) + + state = state.copy() + big_enough = False + for fontname, sym in alternatives: + state.font = fontname + char = Char(sym, state) + if char.width > width: + big_enough = True + break + + # If the largest option is still not big enough, just do + # simple scale on it. + if not big_enough: + factor = width / char.width + state.fontsize *= factor + char = Char(sym, state) + + Hlist.__init__(self, [char]) class Ship(object): """Once the boxes have been set up, this sends them to output. @@ -1653,7 +1686,7 @@ bslash = Literal('\\') accent = oneOf("hat check dot breve acute ddot grave tilde bar " - "vec \" ` ' ~ . ^") + "vec \" ` ' ~ . ^ widehat widetilde") function = oneOf("arccos csc ker min arcsin deg lg Pr arctan det " "lim sec arg dim liminf sin cos exp limsup sinh " @@ -1920,8 +1953,10 @@ r"\'" : r'\combiningacuteaccent', r'\~' : r'\combiningtilde', r'\.' : r'\combiningdotabove', - r'\^' : r'\circumflexaccent', + r'\^' : r'\circumflexaccent' } + + _wide_accents = Set(r"\widehat \widetilde".split()) def accent(self, s, loc, toks): assert(len(toks)==1) @@ -1931,7 +1966,10 @@ if len(toks[0]) != 2: raise ParseFatalException("Error parsing accent") accent, sym = toks[0] - accent = Accent(self._accent_map[accent], self.get_state()) + if accent in self._wide_accents: + accent = AutoWidthChar(accent, sym.width, state) + else: + accent = Accent(self._accent_map[accent], state) centered = HCentered([accent]) centered.hpack(sym.width, 'exactly') centered.shift_amount = accent._metrics.xmin @@ -2154,7 +2192,7 @@ # the height so it doesn't seem cramped height = body.height - body.shift_amount + thickness * 5.0 depth = body.depth + body.shift_amount - check = AutoSizedDelim(r'\sqrt', height, depth, state, always=True) + check = AutoHeightChar(r'\sqrt', height, depth, state, always=True) height = check.height - check.shift_amount depth = check.depth + check.shift_amount @@ -2190,10 +2228,10 @@ parts = [] # \left. and \right. aren't supposed to produce any symbols if front != '.': - parts.append(AutoSizedDelim(front, height, depth, state)) + parts.append(AutoHeightChar(front, height, depth, state)) parts.extend(middle.asList()) if back != '.': - parts.append(AutoSizedDelim(back, height, depth, state)) + parts.append(AutoHeightChar(back, height, depth, state)) hlist = Hlist(parts) return hlist This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ Matplotlib-checkins mailing list Matplotlib-checkins@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins