Revision: 3614
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3614&view=rev
Author:   mdboom
Date:     2007-07-25 13:19:25 -0700 (Wed, 25 Jul 2007)

Log Message:
-----------
Support auto-sized delimiters (e.g. \left(\frac{3}{2}\right)).
Commit mathtext_examples.py

Modified Paths:
--------------
    branches/mathtext_mgd/lib/matplotlib/mathtext.py

Added Paths:
-----------
    branches/mathtext_mgd/examples/mathtext_examples.py

Added: branches/mathtext_mgd/examples/mathtext_examples.py
===================================================================
--- branches/mathtext_mgd/examples/mathtext_examples.py                         
(rev 0)
+++ branches/mathtext_mgd/examples/mathtext_examples.py 2007-07-25 20:19:25 UTC 
(rev 3614)
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+
+import os, sys
+
+stests = [
+    r'Kerning: AVA $AVA$',
+    r'$x   y$',
+    r'$x+y\ x=y\ x<y\ x:y\ x,y\ [EMAIL PROTECTED]',
+    r'$100\%y\ x*y\ x/y x\$y$',
+    r'$x\leftarrow y\ x\forall y$',
+    r'$x \sf x \bf x {\cal X} \rm x$',
+    r'$\{ \rm braces \}$',
+    r'$\left[\left\lfloor\frac{5}{\frac{3}{4}} y\right)\right]$',
+    r'$\left(x\right)$',
+    r'$\sin(x)$',
+    r'$x_2$',
+    r'$x^2$',
+    r'$x^2_y$',
+    r'$x_y^2$',
+    r'$\prod_{i=\alpha_{i+1}}^\infty$',
+    r'$x = \frac{x+\frac{5}{2}}{\frac{y+3}{8}}$',
+    r'$dz/dt \/ = \/ \gamma x^2 \/ + \/ {\rm sin}(2\pi y+\phi)$',
+    r'Foo: $\alpha_{i+1}^j \/ = \/ {\rm sin}(2\pi f_j t_i) e^{-5 t_i/\tau}$',
+    r'$\mathcal{R}\prod_{i=\alpha_{i+1}}^\infty a_i \sin(2 \pi f x_i)$',
+#    r'$\bigodot \bigoplus {\sf R} a_i{\rm sin}(2 \pi f x_i)$',
+    r'Variable $i$ is good',
+    r'$\Delta_i^j$',
+    r'$\Delta^j_{i+1}$',
+    r'$\ddot{o}\acute{e}\grave{e}\hat{O}\breve{\imath}\tilde{n}\vec{q}$',
+    r'$_i$',
+    r"$\arccos((x^i))$",
+    r"$\gamma = \frac{x=\frac{6}{8}}{y} \delta$",
+    r'$\"o\ddot o \'e\`e\~n\.x\^y$',
+    
+    ]
+
+from pylab import *
+
+if '--latex' in sys.argv:
+    fd = open("mathtext_examples.ltx", "w")
+    fd.write("\\documentclass{article}\n")
+    fd.write("\\begin{document}\n")
+    fd.write("\\begin{enumerate}\n")
+
+    for i, s in enumerate(stests):
+        fd.write("\\item %s\n" % s)
+
+    fd.write("\\end{enumerate}\n")
+    fd.write("\\end{document}\n")
+    fd.close()
+
+    os.system("pdflatex mathtext_examples.ltx")
+else:
+    for i, s in enumerate(stests):
+        print s
+        plot([1,2,3], 'r')
+        x = arange(0.0, 3.0, 0.1)
+
+        grid(True)
+        text(1, 1.6, s, fontsize=20)
+
+        savefig('mathtext_example%02d' % i)
+        figure()
+


Property changes on: branches/mathtext_mgd/examples/mathtext_examples.py
___________________________________________________________________
Name: svn:executable
   + *

Modified: branches/mathtext_mgd/lib/matplotlib/mathtext.py
===================================================================
--- branches/mathtext_mgd/lib/matplotlib/mathtext.py    2007-07-25 16:17:22 UTC 
(rev 3613)
+++ branches/mathtext_mgd/lib/matplotlib/mathtext.py    2007-07-25 20:19:25 UTC 
(rev 3614)
@@ -739,12 +739,6 @@
     Use the Bakoma postscript fonts for rendering to backend_ps
     """
 
-    def _get_offset(self, basename, cached_font, glyph, fontsize, dpi):
-        head = cached_font.font.get_sfnt_table("head")
-        if basename.lower() == 'cmex10':
-            return -(head['yMin']+512)/head['unitsPerEm']*10.
-        return 0.
-    
     def set_canvas_size(self, w, h, pswriter):
         'Dimension the drawing canvas; may be a noop'
         self.width  = w
@@ -756,7 +750,7 @@
                 self._get_info(font, sym, fontsize, dpi)
         oy = self.height - oy
         if basename.lower() == 'cmex10':
-            oy += offset - 512/2048.*10.
+            oy += offset
             
         ps = """/%(basename)s findfont
 %(fontsize)s scalefont
@@ -1067,7 +1061,7 @@
         self._update_metrics()
         
     def __internal_repr__(self):
-        return repr(self.c)
+        return '`%s`' % self.c
 
     def _update_metrics(self):
         metrics = self._metrics = self.font_output.get_metrics(
@@ -1097,7 +1091,7 @@
         if self.size < NUM_SIZE_LEVELS:
             self.fontsize *= SHRINK_FACTOR
             self._update_metrics()
-        
+
 class Accent(Char):
     """The font metrics need to be dealt with differently for accents, since 
they
     are already offset correctly from the baseline in TrueType fonts."""
@@ -1305,7 +1299,7 @@
         p = self.list_head
         while p is not None:
             if isinstance(p, Char):
-                raise RuntimeError("Internal error in mathtext")
+                raise RuntimeError("Internal mathtext error: Char node found 
in Vlist.")
             elif isinstance(p, Box):
                 x += d + p.height
                 d = p.depth
@@ -1504,6 +1498,19 @@
         self.super = None
         Hlist.__init__(self, [])
 
+class AutoSizedDelim(Hlist):
+    def __init__(self, c, height, depth, state):
+        char = Char(c, state)
+        shift = 0.
+        if char.height + char.depth < height + depth:
+            factor = (height + depth) / (char.height + char.depth)
+            fontsize = char.fontsize * factor
+            state = state.copy()
+            state.fontsize = fontsize
+            char = Char(c, state)
+            shift = (depth - char.depth)
+        Hlist.__init__(self, [char])
+        self.shift_amount = shift
         
 class Ship(object):
     """Once the boxes have been set up, this sends them to output.
@@ -1612,7 +1619,7 @@
 
         while p:
             if isinstance(p, Char):
-                raise RuntimeError("Internal error in mathtext")
+                raise RuntimeError("Internal mathtext error: Char node found 
in vlist")
             elif isinstance(p, List):
                 if p.list_head is None:
                     self.cur_v += p.height + p.depth
@@ -1663,7 +1670,7 @@
 ##############################################################################
 # PARSER
 
-class Parser:
+class Parser(object):
     _binary_operators = Set(r'''
       + - *
       \pm             \sqcap                   \rhd
@@ -1707,7 +1714,7 @@
 
     _spaced_symbols = _binary_operators | _relation_symbols | _arrow_symbols
 
-    _delimiter_symbols = Set(r', ; . !'.split())
+    _punctuation_symbols = Set(r', ; . !'.split())
     
     def __init__(self):
         # All forward declarations are here
@@ -1716,6 +1723,7 @@
         subsuper = 
Forward().setParseAction(self.subsuperscript).setName("subsuper")
         placeable = Forward().setName("placeable")
         simple = Forward().setName("simple")
+        autoDelim = Forward().setParseAction(self.auto_sized_delimiter)
         self._expression = 
Forward().setParseAction(self.finish).setName("finish")
 
         lbrace       = Literal('{').suppress()
@@ -1724,42 +1732,9 @@
         start_group.setParseAction(self.start_group)
         end_group    = rbrace
         end_group.setParseAction(self.end_group)
-        lbrack       = Literal('[')
-        rbrack       = Literal(']')
-        lparen       = Literal('(')
-        rparen       = Literal(')')
-        grouping     =(lbrack 
-                     | rbrack 
-                     | lparen 
-                     | rparen)
 
         bslash       = Literal('\\')
 
-        langle       = Literal('<')
-        rangle       = Literal('>')
-        equals       = Literal('=')
-        relation     =(langle
-                     | rangle
-                     | equals)
-
-        colon        = Literal(':')
-        comma        = Literal(',')
-        period       = Literal('.')
-        semicolon    = Literal(';')
-        exclamation  = Literal('!')
-        punctuation  =(colon
-                     | comma
-                     | period
-                     | semicolon)
-
-        at           = Literal('@')
-        percent      = Literal('%')
-        ampersand    = Literal('&')
-        misc         =(exclamation
-                     | at
-                     | percent
-                     | ampersand)
-
         accent       = oneOf("hat check dot breve acute ddot grave tilde bar 
vec "
                              "\" ` ' ~ . ^")
 
@@ -1794,7 +1769,7 @@
 
         symbol       = Regex("(" + ")|(".join(
                        [
-                         r"\\[a-zA-Z0-9]+(?!{)",
+                         r"\\(?!right)(?!left)[a-zA-Z0-9]+(?!{)",
                          r"[a-zA-Z0-9 ]",
                          r"[+\-*/]",
                          r"[<>=]",
@@ -1845,7 +1820,8 @@
 
         simple      <<(space
                      | font
-                     | subsuper)
+                     | subsuper
+                     )
 
         subsuperop   =(Literal("_")
                      | Literal("^")
@@ -1861,8 +1837,22 @@
                        | placeable
                      )
 
+        ambiDelim    = oneOf(r"| \| / \backslash \uparrow \downarrow 
\updownarrow \Uparrow \Downarrow \Updownarrow")
+        leftDelim    = oneOf(r"( [ { \lfloor \langle \lceil")
+        rightDelim   = oneOf(r") ] } \rfloot \rangle \rceil")
+
+        autoDelim   <<(Suppress(Literal(r"\left"))
+                     + (leftDelim | ambiDelim)
+                     + Group(
+                         autoDelim
+                       ^ OneOrMore(simple))
+                     + Suppress(Literal(r"\right"))
+                     + (rightDelim | ambiDelim)  
+                     )
+        
         math         = OneOrMore(
-                       simple
+                       autoDelim
+                     | simple
                      ).setParseAction(self.math).setName("math")
 
         math_delim   =(~bslash
@@ -1955,7 +1945,7 @@
             return [Hlist([self._make_space(0.3),
                           Char(c, self.get_state()),
                           self._make_space(0.3)])]
-        elif c in self._delimiter_symbols:
+        elif c in self._punctuation_symbols:
             return [Hlist([Char(c, self.get_state()),
                            self._make_space(0.3)])]
         return [Char(toks[0], self.get_state())]
@@ -2173,8 +2163,17 @@
         hlist = Hlist([vlist, FixedGlue(thickness * 2.)])
         return [hlist]
 
+    def auto_sized_delimiter(self, s, loc, toks):
+        front, middle, back = toks
+        state = self.get_state()
+        height = max([x.height for x in middle])
+        depth = max([x.depth for x in middle])
+        hlist = Hlist(
+            [AutoSizedDelim(front, height, depth, state)] +
+            middle.asList() +
+            [AutoSizedDelim(back, height, depth, state)])
+        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
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to