|
From: <md...@us...> - 2007-07-30 20:48:09
|
Revision: 3638
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3638&view=rev
Author: mdboom
Date: 2007-07-30 13:48:06 -0700 (Mon, 30 Jul 2007)
Log Message:
-----------
Improve vertical alignment of large delimiters and n-ary operators.
Modified Paths:
--------------
trunk/matplotlib/lib/matplotlib/_mathtext_data.py
trunk/matplotlib/lib/matplotlib/mathtext.py
Modified: trunk/matplotlib/lib/matplotlib/_mathtext_data.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/_mathtext_data.py 2007-07-30 20:45:09 UTC (rev 3637)
+++ trunk/matplotlib/lib/matplotlib/_mathtext_data.py 2007-07-30 20:48:06 UTC (rev 3638)
@@ -2235,7 +2235,7 @@
'biguplus': 10756,
'epsilon': 949,
'vartheta': 977,
-'bigotimes': 10754
+'bigotimes': 10754
}
uni2tex = dict([(v,k) for k,v in tex2uni.items()])
Modified: trunk/matplotlib/lib/matplotlib/mathtext.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/mathtext.py 2007-07-30 20:45:09 UTC (rev 3637)
+++ trunk/matplotlib/lib/matplotlib/mathtext.py 2007-07-30 20:48:06 UTC (rev 3638)
@@ -174,6 +174,13 @@
or a Type1 symbol name (i.e. 'phi').
"""
+ # From UTF #25: U+2212 − minus sign is the preferred
+ # representation of the unary and binary minus sign rather than
+ # the ASCII-derived U+002D - hyphen-minus, because minus sign is
+ # unambiguous and because it is rendered with a more desirable
+ # length, usually longer than a hyphen.
+ if symbol == '-':
+ return 0x2212
try:# This will succeed if symbol is a single unicode char
return ord(symbol)
except TypeError:
@@ -484,7 +491,7 @@
offset = self._get_offset(cached_font, glyph, fontsize, dpi)
metrics = Bunch(
advance = glyph.linearHoriAdvance/65536.0,
- height = glyph.height/64.0 + offset,
+ height = glyph.height/64.0,
width = glyph.width/64.0,
xmin = xmin,
xmax = xmax,
@@ -545,7 +552,7 @@
}
def _get_offset(self, cached_font, glyph, fontsize, dpi):
- if cached_font.font.postscript_name == 'cmex10':
+ if cached_font.font.postscript_name == 'Cmex10':
return glyph.height/64.0/2 + 256.0/64.0 * dpi/72.0
return 0.
@@ -577,8 +584,8 @@
('ex', '\xbd'), ('ex', '\x28')],
'}' : [('cal', '}'), ('ex', '\xaa'), ('ex', '\x6f'),
('ex', '\xbe'), ('ex', '\x29')],
- # The fourth size of '[' is mysteriously missing from the BaKoMa font,
- # so I've ommitted it for both
+ # The fourth size of '[' is mysteriously missing from the BaKoMa
+ # font, so I've ommitted it for both '[' and ']'
'[' : [('rm', '['), ('ex', '\xa3'), ('ex', '\x68'),
('ex', '\x22')],
']' : [('rm', ']'), ('ex', '\xa4'), ('ex', '\x69'),
@@ -839,7 +846,7 @@
INV_SHRINK_FACTOR = 1.0 / SHRINK_FACTOR
# The number of different sizes of chars to use, beyond which they will not
# get any smaller
-NUM_SIZE_LEVELS = 3
+NUM_SIZE_LEVELS = 4
# Percentage of x-height of additional horiz. space after sub/superscripts
SCRIPT_SPACE = 0.3
# Percentage of x-height that sub/superscripts drop below the baseline
@@ -1650,7 +1657,7 @@
_punctuation_symbols = Set(r', ; . ! \ldotp \cdotp'.split())
_overunder_symbols = Set(r'''
- \sum \int \prod \coprod \oint \bigcap \bigcup \bigsqcup \bigvee
+ \sum \prod \int \coprod \oint \bigcap \bigcup \bigsqcup \bigvee
\bigwedge \bigodot \bigotimes \bigoplus \biguplus
'''.split()
)
@@ -1758,9 +1765,11 @@
)
+ Optional(
Suppress(Literal("["))
- + OneOrMore(
- symbol
- ^ font
+ + Group(
+ OneOrMore(
+ symbol
+ ^ font
+ )
)
+ Suppress(Literal("]")),
default = None
@@ -1881,12 +1890,13 @@
#~ print "non_math", toks
symbols = [Char(c, self.get_state()) for c in toks[0]]
hlist = Hlist(symbols)
+ # We're going into math now, so set font to 'it'
self.push_state()
- # We're going into math now, so set font to 'it'
self.get_state().font = 'it'
return [hlist]
def _make_space(self, percentage):
+ # All spaces are relative to em width
state = self.get_state()
metrics = state.font_output.get_metrics(
state.font, 'm', state.fontsize, state.dpi)
@@ -1910,12 +1920,12 @@
# print "symbol", toks
c = toks[0]
if c in self._spaced_symbols:
- return [Hlist([self._make_space(0.3),
- Char(c, self.get_state()),
- self._make_space(0.3)])]
+ return [Hlist( [self._make_space(0.2),
+ Char(c, self.get_state()),
+ self._make_space(0.2)] )]
elif c in self._punctuation_symbols:
- return [Hlist([Char(c, self.get_state()),
- self._make_space(0.3)])]
+ return [Hlist( [Char(c, self.get_state()),
+ self._make_space(0.2)] )]
try:
return [Char(toks[0], self.get_state())]
except ValueError:
@@ -1944,6 +1954,8 @@
state = self.get_state()
thickness = state.font_output.get_underline_thickness(
state.font, state.fontsize, state.dpi)
+ if len(toks[0]) != 2:
+ raise ParseFatalException("Error parsing accent")
accent, sym = toks[0]
accent = Accent(self._accent_map[accent], self.get_state())
centered = HCentered([accent])
@@ -2030,7 +2042,7 @@
super = next1
sub = next2
else:
- raise ParseFatalException("Subscript/superscript string is too long.")
+ raise ParseFatalException("Subscript/superscript sequence is too long.")
state = self.get_state()
rule_thickness = state.font_output.get_underline_thickness(
@@ -2052,17 +2064,17 @@
if super is not None:
hlist = HCentered([super])
hlist.hpack(width, 'exactly')
- vlist.extend([hlist, Vbox(0., rule_thickness * 2.0)])
+ vlist.extend([hlist, Kern(rule_thickness * 2.0)])
hlist = HCentered([nucleus])
hlist.hpack(width, 'exactly')
vlist.append(hlist)
if sub is not None:
hlist = HCentered([sub])
hlist.hpack(width, 'exactly')
- vlist.extend([Vbox(0., rule_thickness), hlist])
+ vlist.extend([Kern(rule_thickness * 2.0), hlist])
shift = hlist.height + hlist.depth + rule_thickness * 2.0
vlist = Vlist(vlist)
- vlist.shift_amount = shift
+ vlist.shift_amount = shift + nucleus.depth * 0.5
result = Hlist([vlist])
return [result]
@@ -2120,11 +2132,11 @@
width = max(num.width, den.width) + thickness * 10.
cnum.hpack(width, 'exactly')
cden.hpack(width, 'exactly')
- vlist = Vlist([cnum,
- Vbox(0, thickness * 2.0),
- Hrule(state),
- Vbox(0, thickness * 4.0),
- cden
+ vlist = Vlist([cnum, # numerator
+ Vbox(0, thickness * 2.0), # space
+ Hrule(state), # rule
+ Vbox(0, thickness * 4.0), # space
+ cden # denominator
])
# Shift so the fraction line sits in the middle of the
@@ -2149,35 +2161,42 @@
if root is None:
root = Box()
else:
+ if not isinstance(root, ParseResults):
+ raise ParseFatalException(
+ "Can not parse root of radical. Only simple symbols are allowed.")
+ root = Hlist(root.asList())
root.shrink()
root.shrink()
- # Add a little extra to the height so the body
- # doesn't seem cramped
+ # Determine the height of the body, and add a little extra to
+ # 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)
-
height = check.height - check.shift_amount
depth = check.depth + check.shift_amount
+
+ # Put a little extra space to the left and right of the body
+ padded_body = Hlist([Hbox(thickness * 2.0),
+ body,
+ Hbox(thickness * 2.0)])
rightside = Vlist([Hrule(state),
Fill(),
- # Pack a little extra to the left and right
- # of the body
- Hlist([Hbox(thickness * 2.0),
- body,
- Hbox(thickness * 2.0)])])
+ padded_body])
# Stretch the glue between the hrule and the body
rightside.vpack(height + 1.0, depth, 'exactly')
+ # Add the root and shift it upward so it is above the tick.
+ # The value of 0.6 is a hard-coded hack ;)
root_vlist = Vlist([Hlist([root])])
root_vlist.shift_amount = -height * 0.6
- hlist = Hlist([root_vlist,
- Kern(-check.width * 0.5),
- check,
- Kern(-thickness * 0.3),
- rightside])
+ hlist = Hlist([root_vlist, # Root
+ # Negative kerning to put root over tick
+ Kern(-check.width * 0.5),
+ check, # Check
+ Kern(-thickness * 0.3), # Push check into rule slightly
+ rightside]) # Body
return [hlist]
def auto_sized_delimiter(self, s, loc, toks):
@@ -2187,6 +2206,7 @@
height = max([x.height for x in middle])
depth = max([x.depth for x in middle])
parts = []
+ # \left. and \right. aren't supposed to produce any symbols
if front != '.':
parts.append(AutoSizedDelim(front, height, depth, state))
parts.extend(middle.asList())
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|