|
From: <md...@us...> - 2007-08-06 18:52:10
|
Revision: 3676
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3676&view=rev
Author: mdboom
Date: 2007-08-06 11:52:07 -0700 (Mon, 06 Aug 2007)
Log Message:
-----------
Removed mathtext2. Fix horizontal centering in mathtext. Put all
mathtext_examples on one plot.
Modified Paths:
--------------
trunk/matplotlib/CHANGELOG
trunk/matplotlib/examples/mathtext_examples.py
trunk/matplotlib/lib/matplotlib/config/mplconfig.py
trunk/matplotlib/lib/matplotlib/config/rcsetup.py
trunk/matplotlib/lib/matplotlib/mathtext.py
trunk/matplotlib/lib/matplotlib/mpl-data/matplotlibrc
trunk/matplotlib/lib/matplotlib/rcsetup.py
Removed Paths:
-------------
trunk/matplotlib/examples/mathtext2_demo.py
trunk/matplotlib/lib/matplotlib/mathtext2.py
Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG 2007-08-06 18:50:00 UTC (rev 3675)
+++ trunk/matplotlib/CHANGELOG 2007-08-06 18:52:07 UTC (rev 3676)
@@ -1,3 +1,17 @@
+2007-08-06 Removed mathtext2
+
+2007-07-31 Refactoring of distutils scripts.
+ - Will not fail on the entire build if an optional Python
+ package (e.g. Tkinter) is installed but its development
+ headers are not (e.g. tk-devel). Instead, it will
+ continue to build all other extensions.
+ - Provide an overview at the top of the output to display
+ what dependencies and their versions were found, and (by
+ extension) what will be built.
+ - Use pkg-config, when available, to find freetype2, since
+ this was broken on Mac OS-X when using MacPorts in a non-
+ standard location.
+
2007-07-30 Reorganized configuration code to work with traited config
objects. The new config system is located in the
matplotlib.config package, but it is disabled by default.
Deleted: trunk/matplotlib/examples/mathtext2_demo.py
===================================================================
--- trunk/matplotlib/examples/mathtext2_demo.py 2007-08-06 18:50:00 UTC (rev 3675)
+++ trunk/matplotlib/examples/mathtext2_demo.py 2007-08-06 18:52:07 UTC (rev 3676)
@@ -1,89 +0,0 @@
-#!/usr/bin/env python
-"""
-
-In order to use mathtext2, you must build matplotlib.ft2font. This is
-built by default in the windows installer.
-
-For other platforms, edit setup.py and set
-
-BUILD_FT2FONT = True
-
-You have to put the following lines in your matplotlibrc file if you want to
-enable mathtext2 globaly (not needed for running this example):
-
-mathtext.mathtext2: True # Needed to enable the new mathtext
-mathtext.rm : FreeSerif.ttf
-mathtext.it : FreeSerifItalic.ttf # Text italic
-mathtext.tt : FreeMono.ttf # Typewriter (monospaced)
-mathtext.mit : FreeSerifItalic.ttf # Math italic
-mathtext.cal : FreeSansOblique.ttf # Caligraphic
-mathtext.nonascii: FreeSerif.ttf # #Used for \sum, \infty etc.
-
-Note that "FreeSerif.ttf" etc. may be replaced by any font. Font files must be
-in your system's font path.
-
-Only the first parameter must be set (mathtext2 uses BaKoMa fonts by
-default, and they come packaged with matplotlib, so the above lines
-override them) because mathtext2 is disabled by default.
-
-This demo assumes that you have FreeSerif.ttf installed.
-You can get FreeSerif.ttf (and other files) from:
-http://download.savannah.gnu.org/releases/freefont/
-if you are on windows. On linux, they are usually shipped by default.
-FreeFonts are distributed under GPL.
-
-"""
-# We override the default params
-from matplotlib import rcParams
-rcParams['mathtext.mathtext2'] = True
-
-# You can put other fonts to override the default ones
-rcParams['mathtext.rm'] = 'FreeSerif.ttf'
-rcParams['mathtext.it'] = 'FreeSerifItalic.ttf'
-rcParams['mathtext.tt'] = 'FreeMono.ttf'
-rcParams['mathtext.mit'] = 'FreeSerifItalic.ttf'
-rcParams['mathtext.cal'] = 'FreeSansOblique.ttf'
-
-# This is used by mathtext2 to find chars with ord > 255 (Unicode characters)
-rcParams['mathtext.nonascii'] = 'FreeSerif.ttf'
-from pylab import *
-subplot(111, axisbg='y')
-plot([1,2,3], 'r')
-x = arange(0.0, 3.0, 0.1)
-grid(True)
-
-tex = r'$1+1\ u_{x^2_1}^{y_{-q_u}}$'
-#text(0.5, 2., tex, fontsize=20)
-#show()
-#xlabel(r'$\Delta_i^j$', fontsize=20)
-#ylabel(r'$\Delta_{i+1}^j$', fontsize=20)
-#tex = r'$\cal{R}\prod_{i=\alpha_{i+1}}^\infty a_i\rm{sin}(2 \pi f x_i)$'
-#tex = ur"$1^j_3$"
-#tex = ur"$Tj_1j_jj_gT$"
-#tex = ur"$F_1^1y_{1_{2_{3_2\sum_1^2{4}^6}}3}1_23$"
-#tex = ur"$x_2{\cal TRALALA}\sum_1^2$"
-#tex = ur"$a = x_2{\cal TRALALA}\sum_1^2$"
-#tex = r'$K_{R osman dsfgs Tralala_{K_4^3}}X_1^1$'
-#tex = ur"$Tutinjac\ fff\sin\exp$"
-#tex = ur"$\sin\exp{\rm sin\ exp}$"
-#tex = ur"$a^{\sin x}\sin b\sin(x/x), {\rm sin}(x/x){\rm sin\ }(x/x)$"
-#tex = ur"$1\frac {\int_{-\infty}^\infty} 22$"
-#tex = ur"$\rm a\vtext{Traktor}b$"
-#tex = ur"$\frac{\int_{-\infty}^\infty} 2$"
-#tex = ur"$1_\frac{\sum^2_{i_{23}=0}} 2678$"
-#tex = ur"$1_{\frac{\sum^2_{i_{23}=0}}{\sum_{i=\frac94}^\infty} 345}678$"
-text(0.5, 2., tex, fontsize=20)
-tex = r'${\cal R}\prod_{i=\alpha_{i+1}}^\infty a_i\sin\exp(2 \pi f x_i)$'
-#text(1, 1.9, tex, fontsize=20)
-tex = ur"$F_1^1y_{1_{2_{3_2\sum_1^2{4}^6}}3}1_23$"
-#text(1, 1.7, tex, fontsize=20)
-tex = ur"$x = \sin(\sum_{i=0}^\infty y_i)$"
-#text(1, 1.5, tex, fontsize=20)
-#title(r'$\Delta_i^j \hspace{0.4} \rm{versus} \hspace{0.4} \Delta_{i+1}^j$', fontsize=20)
-
-savefig('mathtext_demo.png')
-savefig('mathtext_demo.svg')
-savefig('mathtext_demo.ps')
-
-
-show()
Modified: trunk/matplotlib/examples/mathtext_examples.py
===================================================================
--- trunk/matplotlib/examples/mathtext_examples.py 2007-08-06 18:50:00 UTC (rev 3675)
+++ trunk/matplotlib/examples/mathtext_examples.py 2007-08-06 18:52:07 UTC (rev 3676)
@@ -20,8 +20,8 @@
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'$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',
@@ -33,7 +33,7 @@
r"$\gamma = \frac{x=\frac{6}{8}}{y} \delta$",
r'$\limsup_{x\to\infty}$',
r'$\oint^\infty_0$',
- r"$f'$",
+ r"$f^'$",
r'$\frac{x_2888}{y}$',
r"$\sqrt[3]{\frac{X_2}{Y}}=5$",
r"$\sqrt[5x\pi]{\prod^\frac{x}{2\pi^2}_\infty}$",
@@ -41,24 +41,29 @@
r'$\frac{X}{\frac{X}{Y}}$',
# From UTR #25
r"$W^{3\beta}_{\delta_1 \rho_1 \sigma_2} = U^{3\beta}_{\delta_1 \rho_1} + \frac{1}{8 \pi 2} \int^{\alpha_2}_{\alpha_2} d \alpha^\prime_2 \left[\frac{ U^{2\beta}_{\delta_1 \rho_1} - \alpha^\prime_2U^{1\beta}_{\rho_1 \sigma_2} }{U^{0\beta}_{\rho_1 \sigma_2}}\right]$",
- r'$\mathcal{H} = \int d \tau (\epsilon E^2 + \mu H^2)$',
- r'$\widehat{abc}\widetilde{def}$'
+ r'$\mathcal{H} = \int d \tau \left(\epsilon E^2 + \mu H^2\right)$',
+ r'$\widehat{abc}\widetilde{def}$',
+ r'$\Gamma \Delta \Theta \Lambda \Xi \Pi \Sigma \Upsilon \Phi \Psi \Omega$',
+ r'$\alpha \beta \gamma \delta \epsilon \zeta \eta \theta \iota \lambda \mu \nu \xi \pi \kappa \rho \sigma \tau \upsilon \phi \chi \psi$'
]
from pylab import *
def doall():
- for i, s in enumerate(stests):
+ tests = stests
+
+ figure(figsize=(8, (len(tests) * 1) + 2))
+ plot([0, 0], 'r')
+ grid(False)
+ axis([0, 3, -len(tests), 0])
+ yticks(arange(len(tests)) * -1)
+ for i, s in enumerate(tests):
print "%02d: %s" % (i, s)
- plot([0,0,3], 'r')
- x = arange(0.0, 3.0, 0.1)
+ text(0.1, -i, s, fontsize=20, markup="tex")
- grid(True)
- text(0.1, 1.6, s, fontsize=20, markup="tex")
+ savefig('mathtext_example')
+ figure()
- savefig('mathtext_example%02d' % i)
- figure()
-
if '--latex' in sys.argv:
fd = open("mathtext_examples.ltx", "w")
fd.write("\\documentclass{article}\n")
Modified: trunk/matplotlib/lib/matplotlib/config/mplconfig.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/config/mplconfig.py 2007-08-06 18:50:00 UTC (rev 3675)
+++ trunk/matplotlib/lib/matplotlib/config/mplconfig.py 2007-08-06 18:52:07 UTC (rev 3676)
@@ -153,21 +153,13 @@
class text(TConfig):
color = T.Trait('black',mplT.ColorHandler())
usetex = T.false
+ markup = T.Trait('plain', 'tex')
class latex(TConfig):
unicode = T.false
preamble = T.ListStr([])
dvipnghack = T.false
- class math(TConfig):
- mathtext2 = T.false
- rm = T.Trait('cmr10.ttf')
- it = T.Trait('cmmi10.ttf')
- tt = T.Trait('cmtt10.ttf')
- mit = T.Trait('cmmi10.ttf')
- cal = T.Trait('cmsy10.ttf')
- nonascii = T.Trait('cmex10.ttf')
-
class axes(TConfig):
hold = T.Trait(True, mplT.BoolHandler())
facecolor = T.Trait('white', mplT.ColorHandler())
@@ -336,6 +328,7 @@
'text.latex.unicode' : (self.tconfig.text.latex, 'unicode'),
'text.latex.preamble' : (self.tconfig.text.latex, 'preamble'),
'text.dvipnghack' : (self.tconfig.text.latex, 'dvipnghack'),
+ 'text.markup' : (self.tconfig.text.markup, 'markup'),
'image.aspect' : (self.tconfig.image, 'aspect'),
'image.interpolation' : (self.tconfig.image, 'interpolation'),
@@ -429,14 +422,6 @@
'svg.image_noscale' : (self.tconfig.backend.svg, 'image_noscale'),
'svg.embed_char_paths' : (self.tconfig.backend.svg, 'embed_chars'),
- # mathtext settings
- 'mathtext.mathtext2' : (self.tconfig.text.math, 'mathtext2'),
- 'mathtext.rm' : (self.tconfig.text.math, 'rm'),
- 'mathtext.it' : (self.tconfig.text.math, 'it'),
- 'mathtext.tt' : (self.tconfig.text.math, 'tt'),
- 'mathtext.mit' : (self.tconfig.text.math, 'mit'),
- 'mathtext.cal' : (self.tconfig.text.math, 'cal'),
- 'mathtext.nonascii' : (self.tconfig.text.math, 'nonascii'),
}
def __setitem__(self, key, val):
Modified: trunk/matplotlib/lib/matplotlib/config/rcsetup.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/config/rcsetup.py 2007-08-06 18:50:00 UTC (rev 3675)
+++ trunk/matplotlib/lib/matplotlib/config/rcsetup.py 2007-08-06 18:52:07 UTC (rev 3676)
@@ -448,16 +448,6 @@
'svg.embed_char_paths' : [False, validate_bool], # True to save
#all characters as paths in the SVG
- # mathtext settings
- 'mathtext.mathtext2' : [False, validate_bool], # Needed to enable Unicode
- # fonts used by mathtext. These ship with matplotlib
- 'mathtext.rm' : ['cmr10.ttf', str], # Roman (normal)
- 'mathtext.it' : ['cmmi10.ttf', str], # Italic
- 'mathtext.tt' : ['cmtt10.ttf', str], # Typewriter (monospaced)
- 'mathtext.mit' : ['cmmi10.ttf', str], # Math italic
- 'mathtext.cal' : ['cmsy10.ttf', str], # Caligraphic
- 'mathtext.nonascii' : ['cmex10.ttf', str], # All other nonascii fonts
-
}
if __name__ == '__main__':
Modified: trunk/matplotlib/lib/matplotlib/mathtext.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/mathtext.py 2007-08-06 18:50:00 UTC (rev 3675)
+++ trunk/matplotlib/lib/matplotlib/mathtext.py 2007-08-06 18:52:07 UTC (rev 3676)
@@ -246,7 +246,7 @@
def render_glyph(self, ox, oy, info):
info.font.draw_glyph_to_bitmap(
- int(ox), int(oy - info.metrics.ymax), info.glyph)
+ ox, oy - info.metrics.ymax, info.glyph)
def render_rect_filled(self, x1, y1, x2, y2):
font = self.fonts_object.get_fonts()[0]
@@ -297,7 +297,7 @@
def render_glyph(self, ox, oy, info):
filename = info.font.fname
oy = self.height - oy + info.offset
-
+
self.pswriter.append(('glyph', ox, oy, filename, info.fontsize, info.num))
def render_rect_filled(self, x1, y1, x2, y2):
@@ -865,7 +865,7 @@
# get any smaller
NUM_SIZE_LEVELS = 4
# Percentage of x-height of additional horiz. space after sub/superscripts
-SCRIPT_SPACE = 0.3
+SCRIPT_SPACE = 0.2
# Percentage of x-height that sub/superscripts drop below the baseline
SUBDROP = 0.3
# Percentage of x-height that superscripts drop below the baseline
@@ -873,7 +873,7 @@
# Percentage of x-height that subscripts drop below the baseline
SUB1 = 0.0
# Percentage of x-height that superscripts are offset relative to the subscript
-DELTA = 0.25
+DELTA = 0.18
class MathTextWarning(Warning):
pass
@@ -1101,19 +1101,20 @@
list in the correct way."""
new_children = []
num_children = len(self.children)
- for i in range(num_children):
- elem = self.children[i]
- if i < num_children - 1:
- next = self.children[i + 1]
- else:
- next = None
+ if num_children:
+ for i in range(num_children):
+ elem = self.children[i]
+ if i < num_children - 1:
+ next = self.children[i + 1]
+ else:
+ next = None
- new_children.append(elem)
- kerning_distance = elem.get_kerning(next)
- if kerning_distance != 0.:
- kern = Kern(kerning_distance)
- new_children.append(kern)
- self.children = new_children
+ new_children.append(elem)
+ kerning_distance = elem.get_kerning(next)
+ if kerning_distance != 0.:
+ kern = Kern(kerning_distance)
+ new_children.append(kern)
+ self.children = new_children
def hpack(self, w=0., m='additional'):
"""The main duty of hpack is to compute the dimensions of the
@@ -1372,9 +1373,15 @@
class HCentered(Hlist):
"""A convenience class to create an Hlist whose contents are centered
within its enclosing box."""
- def __init__(self, elements):
+ def __init__(self, elements, is_accent = False):
+ self.is_accent = is_accent
Hlist.__init__(self, [SsGlue()] + elements + [SsGlue()])
+ def kern(self):
+ Hlist.kern(self)
+ if not self.is_accent and isinstance(self.children[-2], Kern):
+ self.children = self.children[:-2] + [SsGlue()]
+
class VCentered(Hlist):
"""A convenience class to create an Vlist whose contents are centered
within its enclosing box."""
@@ -1982,7 +1989,7 @@
else:
accent = Accent(self._accent_map[accent], state)
shift_amount = accent._metrics.xmin
- centered = HCentered([accent])
+ centered = HCentered([accent], is_accent=True)
centered.hpack(sym.width, 'exactly')
centered.shift_amount = shift_amount
return Vlist([
Deleted: trunk/matplotlib/lib/matplotlib/mathtext2.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/mathtext2.py 2007-08-06 18:50:00 UTC (rev 3675)
+++ trunk/matplotlib/lib/matplotlib/mathtext2.py 2007-08-06 18:52:07 UTC (rev 3676)
@@ -1,1038 +0,0 @@
-r"""
-Supported commands:
--------------------
- * _, ^, to any depth
- * commands for typesetting functions (\sin, \cos etc.),
- * commands for changing the current font (\rm, \cal etc.),
- * Space/kern commands "\ ", \thinspace
- * \frac
-
-Small TO-DO's:
---------------
- * Display braces etc. \} not working (displaying wierd characters) etc.
- * better placing of sub/superscripts. F_1^1y_{1_{2_{3_{4}^3}}3}1_23
- * implement crampedness (or is it smth. else?). y_1 vs. y_1^1
- * add better italic correction. F^1
- * implement other space/kern commands
-
-TO-DO's:
---------
- * \over, \above, \choose etc.
- * Add support for other backends
-
-"""
-import os
-from math import fabs, floor, ceil
-
-from matplotlib import get_data_path, rcParams
-from matplotlib._mathtext_data import tex2uni
-from matplotlib.ft2font import FT2Font, KERNING_DEFAULT
-from matplotlib.font_manager import findSystemFonts
-from copy import deepcopy
-from matplotlib.cbook import Bunch
-
-_path = get_data_path()
-faces = ('mit', 'rm', 'tt', 'cal', 'nonascii')
-
-filenamesd = {}
-fonts = {}
-
-# Filling the above dicts
-for face in faces:
- # The filename without the path
- barefname = rcParams['mathtext.' + face]
- base, ext = os.path.splitext(barefname)
- if not ext:
- ext = '.ttf'
- barefname = base + ext
- # First, we search for the font in the system font dir
- for fname in findSystemFonts(fontext=ext[1:]):
- if fname.endswith(barefname):
- filenamesd[face] = str(fname)
- break
- # We check if the for loop above had success. If it failed, we try to
- # find the font in the mpl-data dir
- if not face in filenamesd:
- fontdirs = [os.path.join(_path,'fonts','afm'),
- os.path.join(_path,'fonts','ttf')]
- for fontdir in fontdirs:
- fname = os.path.join(fontdir, barefname)
- if os.path.exists( fname ):
- filenamesd[face] = fname
- break
- # Display a useful message when the fontfile is not found.
- # TO-DO: Maybe this should just throw a warning to the user?
- try:
- fonts[face] = FT2Font(filenamesd[face])
- except KeyError:
- msg = "Can't find the font file for the '%s' face"%face
- raise KeyError(msg)
-
-svg_elements = Bunch(svg_glyphs=[], svg_lines=[])
-
-esc_char = '\\'
-# Grouping delimiters
-begin_group_char = '{'
-end_group_char = '}'
-dec_delim = '.'
-word_delim = ' '
-mathstyles = ["display", "text", "script", "scriptscript"]
-modes = ["mathmode", "displaymathmode"]
-
-# Commands
-scripts = ("_", "^")
-functions = ("sin", "tan", "cos", "exp", "arctan", "arccos", "arcsin", "cot",
- "lim", "log")
-reserved = ("{", "}", "%", "$", "#", "~")
-# Commands that change the environment (in the current scope)
-setters = faces
-# Maximum number of nestings (groups within groups)
-max_depth = 10
-
-#~ environment = {
-#~ "mode": "mathmode",
-#~ "mathstyle" : "display",
-#~ "cramped" : False,
-#~ # We start with zero scriptdepth (should be incremented by a Scripted
-#~ # instance)
-#~ "scriptdepth" : 0,
-#~ "face" : None,
-#~ "fontsize" : 12,
-#~ "dpi" : 100,
-#~ }
-
-
-# _textclass can be unicode or str.
-_textclass = unicode
-
-
-# Exception classes
-class TexParseError(Exception):
- pass
-
-# Helper classes
-class Scriptfactors(dict):
- """Used for returning the factor with wich you should multiply the
- fontsize to get the font size of the script
-
- """
- _scriptfactors = {
- 0 : 1, # Normal text
- 1: 0.8, # Script
- 2: 0.6, # Scriptscript
- # For keys > 3 returns 0.6
- }
-
- def __getitem__(self, key):
- if not isinstance(key, int):
- raise KeyError("Integer value needed for scriptdepth")
- if key < 0:
- raise KeyError("scriptdepth must be positive")
- if key in self._scriptfactors:
- return self._scriptfactors[key]
- else:
- # Maximum depth of scripts is 2 (scriptscript)
- return self._scriptfactors[2]
-
-scriptfactors = Scriptfactors()
-
-
-class Environment:
- """Class used for representing the TeX environment variables"""
- def __init__(self):
- self.mode = "mathmode"
- self.mathstyle = "display"
- self.cramped = False
- # We start with zero scriptdepth (should be incremented by a Scripted
- # instance)
- self.scriptdepth = 0
- self.face = None
- self.fontsize = 12
- self.dpi = 100
- self.output = "AGG"
-
- def copy(self):
- return deepcopy(self)
-
-# The topmost environment
-environment = Environment()
-
-
-# Helper functions used by the renderer
-def get_frac_bar_height(env):
- # TO-DO: Find a better way to calculate the height of the rule
- c = Char(env, ".")
- return (c.ymax - c.ymin)/2
-
-def get_font(env):
- env = env.copy()
- # TO-DO: Perhaps this should be done somewhere else
- fontsize = env.fontsize * scriptfactors[env.scriptdepth]
- dpi = env.dpi
- if not env.face:
- env.face = "rm"
- font = fonts[env.face]
-
- font.set_size(fontsize, dpi)
- return font
- #~ font = FT2Font(filenamesd[face])
- #~ if fonts:
- #~ fonts[max(fonts.keys()) + 1] = font
- #~ else:
- #~ fonts[1] = font
-
-def infer_face(env, item):
- if item.isalpha():
- if env.mode == "mathmode" and item < "z":
- face = "mit"
- else:
- # TO-DO: Perhaps change to 'rm'
- face = "nonascii"
- elif item.isdigit():
- face = "rm"
- elif ord(item) < 256:
- face = "rm"
- else:
- face = "nonascii"
- return face
-
-def get_space(env):
- _env = env.copy()
- if not _env.face:
- _env.face = "rm"
- space = Char(_env, " ")
- return space
-
-def get_kern(first, second):
- # TO-DO: Something's wrong
- if isinstance(first,Char) and isinstance(second, Char):
- if first.env.__dict__ == second.env.__dict__:
- font = get_font(first.env)
- advance = -font.get_kerning(first.uniindex, second.uniindex,
- KERNING_DEFAULT)/64.0
- #print first.char, second.char, advance
- return Kern(first.env, advance)
- else:
- return Kern(first.env, 0)
- else:
- return Kern(first.env, 0)
-
-
-# Classes used for renderering
-
-# Base rendering class
-class Renderer:
- """Abstract class that implements the rendering methods"""
- def __init__(self, env):
- # We initialize all the values to 0.0
- self.xmin, self.ymin, self.xmax, self.ymax = (0.0,)*4
- self.width, self.height = (0.0,)*2
- (self.hadvance, self.hbearingx, self.hbearingy,
- self.hdescent)= (0.0,)*4
- (self.vadvance, self.vbearingx, self.vbearingy)= (0.0,)*3
- self.env = env
-
- def hrender(self, x, y):
- pass
-
- def vrender(self, x, y):
- # We reuse hrender. This can be used by all subclasses of Renderer
- y += self.vbearingy + self.hbearingy
- x -= -self.vbearingx + self.hbearingx
- self.hrender(x, y)
-
-# Primitive rendering classes
-class Char(Renderer):
- """A class that implements rendering of a single character."""
- def __init__(self, env, char, uniindex=None):
- #Renderer.__init__(self, env)
- self.env = env
- # uniindex is used to override ord(char) (needed on platforms where
- # there is only BMP support for unicode, i.e. windows)
- msg = "A char (string with length == 1) is needed"
- if isinstance(_textclass(char), _textclass) and len(char) == 1:
- self.char = char
- else:
- raise ValueError(msg)
- if not uniindex:
- self.uniindex = ord(char)
- else:
- if isinstance(uniindex, int):
- self.uniindex = uniindex
- else:
- raise ValueError("uniindex must be an int")
- #print self.env.face, filenamesd
- # TO-DO: This code is needed for BaKoMa fonts. To be removed when
- # mathtext migrates to completely unicode fonts
- if self.env.face == "rm" and filenamesd["rm"].endswith("cmr10.ttf"):
- _env = self.env.copy()
- if self.char in ("{", "}"):
- _env.face = "cal"
- font = get_font(_env)
- if self.char == "{":
- index = 118
- elif self.char == "}":
- index = 119
- glyph = font.load_char(index)
- else:
- font = get_font(self.env)
- glyph = font.load_char(self.uniindex)
- else:
- font = get_font(self.env)
- glyph = font.load_char(self.uniindex)
- self.glyph = glyph
- self.xmin, self.ymin, self.xmax, self.ymax = [
- val/64.0 for val in self.glyph.bbox]
-
- self.width = self.xmax - self.xmin#glyph.width/64.0
- self.height = self.ymax - self.ymin#glyph.height/64.0
- # Horizontal values
- self.hadvance = glyph.horiAdvance/64.0
- self.hbearingx = glyph.horiBearingX/64.0
- self.hbearingy = glyph.horiBearingY/64.0
- # Vertical values
- self.vadvance = glyph.vertAdvance/64.0
- self.vbearingx = glyph.vertBearingX/64.0
- self.vbearingy = glyph.vertBearingY/64.0
-
- def hrender(self, x, y):
- #y -= self.ymax
- #y -= (self.height - self.hbearingy)
- #print x, y
- font = get_font(self.env)
- output = self.env.output
- if output == "AGG":
- x += self.hbearingx
- y -= self.hbearingy
- font.draw_glyph_to_bitmap(x, y, self.glyph)
- elif output == "SVG":
- familyname = font.get_sfnt()[(1,0,0,1)]
- thetext = unichr(self.uniindex)
- thetext.encode('utf-8')
- fontsize = self.env.fontsize * scriptfactors[self.env.scriptdepth]
- svg_elements.svg_glyphs.append((familyname, fontsize,thetext, x, y,
- Bunch(advance=self.hadvance))) # last was originaly metrics (in old mathtext)
-
-
-class Kern(Renderer):
- """Class that implements the rendering of a Kern."""
-
- def __init__(self, env, hadvance):
- Renderer.__init__(self, env)
- self.width = hadvance
- self.hadvance = hadvance
-
- def __repr__(self):
- return "Kern(%s, %s)"%(self.env, self.hadvance)
-
-class Line(Renderer):
- """Class that implements the rendering of a line."""
-
- def __init__(self, env, width, height):
- Renderer.__init__(self, env)
- self.ymin = -height/2.
- self.xmax = width
- self.ymax = height/2.
-
- self.width = width
- self.height = height
- self.hadvance = width
- self.hbearingy = self.ymax
- # vertical
- self.vadvance = height
- self.vbearingx = - width/2.0
-
- def hrender(self, x, y):
- font = get_font(self.env)
- coords = (x + self.xmin, y + self.ymin, x + self.xmax,
- y + self.ymax)
- #print coords
- #print "\n".join(repr(self.__dict__).split(","))
- if self.env.output == "AGG":
- coords = (coords[0]+2, coords[1]-1, coords[2]-2,
- coords[3]-1)
- #print coords
- font.draw_rect_filled(*coords)
- elif self.env.output == "SVG":
- svg_elements.svg_lines.append(coords)
- #~ familyname = font.get_sfnt()[(1,0,0,1)]
- #~ svg_elements.svg_glyphs.append((familyname, self.env.fontsize,
- #~ "---", x,y, None))
-
-
-# Complex rendering classes
-class Hbox(Renderer):
- """A class that corresponds to a TeX hbox."""
- def __init__(self, env, texlist=[]):
- Renderer.__init__(self, env)
- self.items = texlist
- if not self.items:
- # empty group
- return
- previous = None
- for item in self.items:
- # Checking for kerning
- if previous:
- kern = get_kern(previous, item)
- item.hadvance += kern.hadvance
- self.hbearingy = max((item.hbearingy, self.hbearingy))
- self.ymax = max((item.ymax, self.ymax))
- if self.ymin == 0:
- self.ymin = item.ymin
- else:
- self.ymin = min((item.ymin, self.ymin))
- self.hadvance += item.hadvance
- # vertical
- self.vadvance = max((item.vadvance, self.vadvance))
- if self.vbearingy == 0:
- self.vbearingy = item.vbearingy
- else:
- self.vbearingy = min(item.vbearingy, self.vbearingy)
- previous = item
- first = self.items[0]
- self.hbearingx = 0#first.hbearingx
- self.xmin = 0#first.xmin
-
- last = self.items[-1]
- self.xmax = self.hadvance# + fabs(last.hadvance - last.xmax)
- self.xmax -= first.hbearingx
- self.width = self.xmax - self.xmin
- self.height = self.ymax - self.ymin
- # vertical
- self.vbearingx = - self.width/2.0
-
- def hrender(self, x, y):
- for item in self.items:
- item.hrender(x, y)
- x += item.hadvance
-
-# TO-DO
-class Vbox(Renderer):
- """A class representing a vertical box. ref is the index of the texlist
- element whose origin will be used as the vbox origin. The default is
- ref=-1. If ref is None, then ref is set to be the middle index (if the
- number of items in the list is even, a new list element is inserted (as
- Kern(0)) to make the list odd).
- The box is rendered top down - the last element of the list is rendered
- at the bottom.
-
- """
- def __init__(self, env, texlist=[], ref=None):
- if ref == None:
- if not len(texlist)%2:
- texlist = texlist.insert(len(texlist)/2,Kern(env, 0))
- ref = len(texlist)/2
- if ref < 0:
- ref = len(texlist) + ref
- Renderer.__init__(self, env)
-
- self.items = texlist
- if not self.items:
- return
-
- for i, item in enumerate(self.items):
- if i == 0:
- self.vbearingy = item.vbearingy
- if i == ref:
- # ymax is determined by the reference item
- if self.vadvance == 0:
- #self.ymax = item.ymax
- self.hbearingy = item.hbearingy
- else:
- #self.ymax = self.vadvance + item.ymax + item.vbearingy
- self.hbearingy = self.vadvance + item.hbearingy +\
- item.vbearingy
- self.width = max(self.width, item.width)
- if self.width < item.width:
- self.width = item.width
- self.hbearingx = item.hbearingx
- self.hadvance = max(self.hadvance, item.hadvance)
- self.vbearingx = min(self.vbearingx, item.vbearingx)
- self.vadvance += item.vadvance
- if i == len(self.items) - 1:
- # last item
- if i == 0:
- self.ymin = item.ymin
- else:
- _overlap = item.vadvance - item.height -item.vbearingy
- self.ymin = -(self.vadvance - _overlap - self.hbearingy)
- self.xmin = self.hbearingx
- self.xmax = self.xmin + self.width
-
- self.ymax = self.hbearingy
- self.height = self.ymax - self.ymin
-
- def hrender(self, x, y):
- # We reuse vrender.
- print "H"
- y -= self.vbearingy + self.hbearingy
- x += -self.vbearingx + self.hbearingx
- self.vrender(x, y)
-
- def vrender(self, x, y):
- print "V"
- #print "\n".join(repr(self.__dict__).split(","))
- for item in self.items:
- for key in item.__dict__:
- try:
- print key, getattr(self, key), getattr(item, key)
- except AttributeError:
- pass
- #print "\n".join(repr(item.__dict__).split(","))
- item.vrender(x, y)
- y += item.vadvance
-
-class Scripted(Renderer):
- """Used for creating elements that have sub/superscripts"""
- def __init__(self, env, nuc=None, type="ord", sub=None,
- sup=None):
- Renderer.__init__(self, env)
- if not nuc:
- nuc = Hbox([])
- if not sub:
- sub = Hbox([])
- if not sup:
- sup = Hbox([])
- self.nuc = nuc
- self.sub = sub
- self.sup = sup
- self.type = type
- # Heuristics for figuring out how much the subscripts origin has to be
- # below the origin of the nucleus (the descent of the letter "j").
- # TO-DO: Change with a better alternative. Not working: F_1^1y_1
- c = Char(env, "j")
- C = Char(env, "M")
-
- self.subpad = c.height - c.hbearingy
- # If subscript is complex (i.e. a large Hbox - fraction etc.)
- # we have to aditionaly lower the subscript
- if sub.ymax > (C.height/2.1 + self.subpad):
- self.subpad = sub.ymax - C.height/2.1
-
- #self.subpad = max(self.subpad)
- #self.subpad = 0.5*sub.height
- # Similar for the superscript
- self.suppad = max(nuc.height/1.9, C.ymax/1.9) - sup.ymin# - C.hbearingy
-
-
- #self.hadvance = nuc.hadvance + max((sub.hadvance, sup.hadvance))
-
- self.xmin = nuc.xmin
-
- self.xmax = max(nuc.hadvance, nuc.hbearingx + nuc.width) +\
- max((sub.hadvance, sub.hbearingx + sub.width,
- sup.hadvance, sup.hbearingx + sup.width))# - corr
-
- self.ymin = min(nuc.ymin, -self.subpad + sub.ymin)
-
- self.ymax = max((nuc.ymax, self.suppad + sup.hbearingy))
-
- # The bearing of the whole element is the bearing of the nucleus
- self.hbearingx = nuc.hbearingx
- self.hadvance = self.xmax
- # Heruistics. Feel free to change
- self.hbearingy = self.ymax
-
- self.width = self.xmax - self.xmin
- self.height = self.ymax - self.ymin
- # vertical
- self.vadvance = self.height
- self.vbearingx = - self.width/2.0
-
- def hrender(self, x, y):
- nuc, sub, sup = self.nuc, self.sub, self.sup
- nx = x
- ny = y
-
- subx = x + max(nuc.hadvance, nuc.hbearingx + nuc.width)# + sub.hbearingx
- suby = y + self.subpad# - subfactor*self.env.fontsize
-
- supx = x + max(nuc.hadvance, nuc.hbearingx + nuc.width)# + sup.hbearingx
- supy = y - self.suppad# + 10#subfactor*self.env.fontsize
-
- self.nuc.hrender(nx, ny)
- self.sub.hrender(subx, suby)
- self.sup.hrender(supx, supy)
-
- def __repr__(self):
- tmp = [repr(i) for i in [self.env, self.nuc, self.type,
- self.sub, self.sup]]
- tmp = tuple(tmp)
- return "Scripted(env=%s,nuc=%s, type=%s, \
-sub=%s, sup=%s)"%tmp
-
-
-class Fraction(Renderer):
- """A class for rendering a fraction."""
-
- def __init__(self, env, num, den):
- Renderer.__init__(self, env)
- self.numer = num
- self.denom = den
-
- # TO-DO: Find a better way to implement the fraction bar
- self.pad = get_frac_bar_height(self.env)
- pad = self.pad
- self.bar = Line(env.copy(), max(num.width, den.width) + 2*pad, pad)
- #~ self.bar.hbearingx = pad
- #~ self.bar.hadvance = self.bar.width + 2*pad
- #~ self.bar.hbearingy = pad + pad
-
- self.xmin = 0
- #self.xmax = self.bar.hadvance
- self.xmax = self.bar.width# + 2*pad
-
- self.ymin = -(2*pad + den.height)
- self.ymax = 2*pad + num.height
- # The amount by which we raise the bar (the whole fraction)
- # of the bottom (origin)
- # TO-DO: Find a better way to implement it
- _env = env.copy()
- _env.face = "rm"
- c = Char(_env, "+")
- self.barpad = 1./2.*(c.ymax-c.ymin) + c.ymin
- self.ymin += self.barpad
- self.ymax += self.barpad
-
- self.width = self.xmax - self.xmin
- self.height = self.ymax - self.ymin
- #print self.width, self.height
-
- #self.hbearingx = pad
- self.hbearingx = 0
- self.hbearingy = self.ymax
- #self.hadvance = self.bar.hadvance
- self.hadvance = self.xmax
- # vertical
- self.vbearingx = - self.width/2.0
- self.vbearingy = num.vbearingy
- self.vadvance = self.height + num.vbearingy + (den.vadvance + den.ymin)
-
- def hrender(self, x, y):
- y -= self.barpad
- pad = self.pad
- #print self.bar.xmax, self.bar.xmin, self.bar.ymin, self.bar.ymax
- self.bar.hrender(x, y)
-
- nx = x - self.numer.hbearingx + (self.width - self.numer.width)/2.
- ny = y - 2*pad - (self.numer.height - self.numer.ymax)
- self.numer.hrender(nx, ny)
-
- dx = x - self.denom.hbearingx+ (self.width - self.denom.width)/2.
- dy = y + 2*pad + self.denom.hbearingy
- self.denom.hrender(dx, dy)
-
-
-
-
-# Helper functions used by the parser
-def parse_tex(texstring):
- texstring = normalize_tex(texstring)
- _parsed = to_list(texstring)
- #_parsed = Hbox(_parsed)
- return _parsed
-
-def remove_comments(texstring):
- # TO-DO
- return texstring
-
-def group_split(texstring):
- """Splits the string into three parts based on the grouping delimiters,
- and returns them as a list.
- """
- if texstring == begin_group_char + end_group_char:
- return '', [], ''
- length = len(texstring)
- i = texstring.find(begin_group_char)
- if i == -1:
- return texstring, '', ''
- pos_begin = i
- count = 1
- num_groups = 0
- while count != 0:
- i = i + 1
- # First we check some things
- if num_groups > max_depth:
- message = "Maximum number of nestings reached. Too many groups"
- raise TexParseError(message)
- if i == length:
- message = "Group not closed properly"
- raise TexParseError(message)
-
- if texstring[i] == end_group_char:
- count -= 1
- elif texstring[i] == begin_group_char:
- num_groups += 1
- count += 1
- before = texstring[:pos_begin]
- if pos_begin + 1 == i:
- grouping = []
- else:
- grouping = texstring[pos_begin + 1:i]
- after = texstring[i + 1:]
- return before, grouping, after
-
-def break_up_commands(texstring):
- """Breaks up a string (mustn't contain any groupings) into a list
- of commands and pure text.
- """
- result = []
- if not texstring:
- return result
- _texstrings = texstring.split(esc_char)
- for i, _texstring in enumerate(_texstrings):
- _command, _puretext = split_command(_texstring)
- if i == 0 and _texstrings[0]:
- # Case when the first command is a not a command but text
- result.extend([c for c in _command])
- result.extend(_puretext)
- continue
- if _command:
- result.append(esc_char + _command)
- if _puretext:
- if _puretext[0] == word_delim:
- _puretext = _puretext[1:]
- result.extend(_puretext)
- return result
-
-def split_command(texstring):
- """Splits a texstring into a command part and a pure text (as a list) part
-
- """
- if not texstring:
- return "", []
- _puretext = []
- _command, _rest = get_first_word(texstring)
- if not _command:
- _command = texstring[0]
- _rest = texstring[1:]
- _puretext = [c for c in _rest]
- #~ while True:
- #~ _word, _rest = get_first_word(_rest)
- #~ if _word:
- #~ _puretext.append(_word)
- #~ if _rest:
- #~ _puretext.extend(_rest[0])
- #~ if len(_rest) == 1:
- #~ break
- #~ _rest = _rest[1:]
- #~ else:
- #~ break
- return _command, _puretext
-
-def get_first_word(texstring):
- _word = ""
- i = 0
- _length = len(texstring)
- if _length == 0:
- return "", ""
- if texstring[0].isalpha():
- while _length > i and texstring[i].isalpha():
- _word += texstring[i]
- i = i + 1
- elif texstring[0].isdigit():
- while _length > i and (texstring[i].isdigit()):
- _word += texstring[i]
- i = i + 1
-
- return _word, texstring[i:]
-
-def to_list(texstring):
- """Parses the normalized tex string and returns a list. Used recursively.
- """
- result = []
- if not texstring:
- return result
- # Checking for groupings: begin_group_char...end_group_char
- before, grouping, after = group_split(texstring)
- #print "Before: ", before, '\n', grouping, '\n', after
-
- if before:
- result.extend(break_up_commands(before))
- if grouping or grouping == []:
- result.append(to_list(grouping))
- if after:
- result.extend(to_list(after))
-
- return result
-
-def normalize_tex(texstring):
- """Normalizes the whole TeX expression (that is: prepares it for
- parsing)"""
- texstring = remove_comments(texstring)
- # Removing the escaped escape character (replacing it)
- texstring = texstring.replace(esc_char + esc_char, esc_char + 'backslash ')
-
- # Removing the escaped scope/grouping characters
- texstring = texstring.replace(esc_char + begin_group_char, esc_char + 'lbrace ')
- texstring = texstring.replace(esc_char + end_group_char, esc_char + 'rbrace ')
-
- # Now we should have a clean expression, so we check if all the groupings
- # are OK (every begin_group_char should have a matching end_group_char)
- # TO-DO
-
- # Replacing all space-like characters with a single space word_delim
- texstring = word_delim.join(texstring.split())
-
- # Removing unnecessary white space
- texstring = word_delim.join(texstring.split())
- return texstring
-
-def is_command(item):
- try:
- return item.startswith(esc_char)
- except AttributeError:
- return False
-
-
-
-
-# Main parser functions
-def handle_tokens(texgroup, env, box=Hbox):
- """Scans the entire (tex)group to handle tokens. Tokens are other groups,
- commands, characters, kerns etc. Used recursively.
-
- """
- result = []
- # So we're sure that nothing changes the outer environment
- env = env.copy()
- while texgroup:
- item = texgroup.pop(0)
- #print texgroup, type(texgroup)
- #print env.face, type(item), repr(item)
- if isinstance(item, list):
- appendix = handle_tokens(item, env.copy())
- elif item in scripts:
- sub, sup, texgroup = handle_scripts(item, texgroup, env.copy())
- try:
- nuc = result.pop()
- except IndexError:
- nuc = Hbox([])
- appendix = Scripted(env.copy(), nuc=nuc, sub=sub, sup=sup)
- elif is_command(item):
- command = item.strip(esc_char)
- texgroup, env = handle_command(command, texgroup, env.copy(),
- allowsetters=True)
- continue
- elif isinstance(item, _textclass):
- if env.mode == "mathmode":
- if item == word_delim:
- # Disregard space in mathmode
- continue
- elif item == "-":
- # load the math minus sign
- item = u"\u2212"
- uniindex = ord(item)
- appendix = handle_char(uniindex, env.copy())
- else:
- appendix = item
- result.append(appendix)
- return box(env.copy(),result)
-
-def handle_command(command, texgroup, env, allowsetters=False):
- """Handles TeX commands that don't have backward propagation, and
- aren't setting anything in the environment.
-
- """
- # First we deal with setters - commands that change the
- # environment of the current group (scope)
- if command in setters:
- if not allowsetters:
- raise TexParseError("Seter not allowed here")
- if command in faces:
- env.face = command
- else:
- raise TexParseError("Unknown setter: %s%s"%(esc_char, command))
- return texgroup, env
- elif command == "frac":
- texgroup, args = get_args(command, texgroup, env.copy(), 2)
- num, den = args
- frac = Fraction(env=env, num=num, den=den)
- appendix = frac
- elif command in functions:
- _tex = "%srm %sthinspace %s"%(esc_char, esc_char, command)
- appendix = handle_tokens(parse_tex(_tex), env.copy())
- elif command in (" "):
- space = get_space(env)
- appendix = Kern(env, space.hadvance)
- elif command == "thinspace":
- #print command
- space = get_space(env)
- appendix = Kern(env, 1/2. * space.hadvance)
- elif command in reserved:
- uniindex = ord(command)
- appendix = handle_char(uniindex, env.copy())
- #elif command == "vtext":
- # _vlist = texgroup.pop(0)
- # appendix = handle_tokens(_vlist, env.copy(), box=Vbox)
- elif command in tex2uni:
- uniindex = tex2uni[command]
- appendix = handle_char(uniindex, env.copy())
- else:
- #appendix = handle_tokens([r"\backslash"] + [
- #~ c for c in command], env.copy())
- #appendix.env = env.copy()
- #print appendix
- raise TexParseError("Unknown command: " + esc_char + command)
- appendix = [appendix]
- appendix.extend(texgroup)
- #print "App",appendix
- return appendix, env
-
-def handle_scripts(firsttype, texgroup, env):
- sub = None
- sup = None
- env = env.copy()
- # The environment for the script elements
- _env = env.copy()
- _env.scriptdepth += 1
- firstscript = texgroup.pop(0)
- if firstscript in scripts:
- # An "_" or "^", immediately folowed by another "_" or "^"
- raise TexParseError("Missing { inserted. " + firsttype + firstscript)
- elif is_command(firstscript):
- command = firstscript.strip(esc_char)
- texgroup, _env = handle_command(command, texgroup, _env)
- firstscript = texgroup.pop(0)
- else:
- _tmp = handle_tokens([firstscript], _env)
- firstscript = _tmp.items.pop(0)
- if firsttype == "_":
- sub = firstscript
- else:
- sup = firstscript
- # Check if the next item is also a command for scripting
- try:
- second = texgroup[0]
- except IndexError:
- second = None
- if second in scripts:
- secondtype = texgroup.pop(0)
- if secondtype == firsttype:
- raise TexParseError("Double script: " + secondtype)
- try:
- secondscript = texgroup.pop(0)
- except IndexError:
- raise TexParseError("Empty script: " + secondtype)
- if secondscript in scripts:
- # An "_" or "^", immediately folowed by another "_" or "^"
- raise TexParseError("Missing { inserted. "\
- + secondtype + secondscript)
- elif is_command(secondscript):
- command = secondscript.strip(esc_char)
- texgroup, _env = handle_command(command, texgroup, _env)
- secondscript = texgroup.pop(0)
- else:
- _tmp = handle_tokens([secondscript], _env)
- secondscript = _tmp.items.pop(0)
- if secondtype == "_":
- sub = secondscript
- else:
- sup = secondscript
- # Check if the next item is also a command for scripting
- try:
- next = texgroup[0]
- except IndexError:
- next = None
- if next in scripts:
- raise TexParseError("Double script: " + next)
- return sub, sup, texgroup
-
-def handle_char(uniindex, env):
- env = env.copy()
- char = unichr(uniindex)
- if not env.face:
- env.face = infer_face(env, char)
- return Char(env, char, uniindex=uniindex)
-
-def get_args(command, texgroup, env, num_args):
- """Returns the arguments needed by a TeX command"""
- args = []
- i = 0
- while i < num_args:
- try:
- arg = texgroup.pop(0)
- except IndexError:
- msg = "%s is missing it's %d argument"%(command, i+1)
- raise TexParseError(msg)
- # We skip space
- if arg == " ":
- continue
- tmp = handle_tokens([arg], env.copy())
- arg = tmp.items.pop()
- args.append(arg)
- i += 1
- return texgroup, args
-
-
-# Functions exported to backends
-def math_parse_s_ft2font(s, dpi, fontsize, angle=0, output="AGG"):
- """This function is called by the backends"""
- # Reseting the variables used for rendering
- for font in fonts.values():
- font.clear()
- svg_elements.svg_glyphs = []
- svg_elements.svg_lines = []
-
- s = s[1:-1]
- parsed = parse_tex(_textclass(s))
- env = environment.copy()
- env.dpi = dpi
- env.fontsize = fontsize
- env.output = output
- parsed = handle_tokens(parsed, env)
- #print "\n".join(str(parsed.__dict__).split(","))
- width, height = parsed.width + 2, parsed.height + 2
- #print width, height
- if output == "AGG":
- for key in fonts:
- fonts[key].set_bitmap_size(width, height)
- parsed.hrender(-parsed.items[0].hbearingx, height + parsed.ymin - 1)
- #~ parsed.hrender(-parsed.hbearingx, height - 1 - (
- #~ parsed.height - parsed.hbearingy))
- if output == "AGG":
- return width, height, fonts.values()
- elif output == "SVG":
- return width, height, svg_elements
-
-def math_parse_s_ft2font_svg(s, dpi, fontsize, angle=0):
- return math_parse_s_ft2font(s, dpi, fontsize, angle, "SVG")
-
-def math_parse_s_ft2font1(s, dpi, fontsize, angle=0):
- "Used only for testing"
- s = s[1:-1]
- parsed = parse_tex(_textclass(s))
- env = environment.copy()
- env.dpi = dpi
- env.fontsize = fontsize
- parsed = handle_tokens(parsed, env)
- #print "\n".join(str(parsed.__dict__).split(","))
- width, height = parsed.width + 10, parsed.height + 10
- width, height = 300, 300
- #print width, height
- for key in fonts:
- fonts[key].set_bitmap_size(width, height)
- parsed.hrender(width/2., height/2.)
- #fonts["mit"].draw_rect(0, 0, 40, 0)
- #fonts["mit"].draw_rect(0, 1, 40, 0)
- #parsed.hrender(20, 20)
- #~ parsed.hrender(-parsed.hbearingx, height - 1 - (
- #~ parsed.height - parsed.hbearingy))
- _fonts = fonts.values()
- return width, height, _fonts
-
-
-if __name__ == '__main__':
- pass
- #texstring = r"\\{ \horse\ Hello\^ ^ a^b_c}"
- #texstring = r" asdf { \horse{}tralala1234\ \zztop{} \ Hello\^^a^{b_c}}"
- #texstring = r"{}{} { }"
- #texstring = r"{{{_ }}}"
- #texstring = r"\horse{}"
- #texstring = r"\horse;,.?)_)(*(*^*%&$$%{} Haha! Kako je frajeru?"
- #texstring = r"a_2\trav 32"
- #texstring = r"a_24{\sum_4^5} _3"
- #texstring = _textclass(r"1_2^{4^5}32 5")
- #parsed = parse_tex(texstring)
- #~ print bool(a)
- #print is_scriptcommand('\\subscript')
Modified: trunk/matplotlib/lib/matplotlib/mpl-data/matplotlibrc
===================================================================
--- trunk/matplotlib/lib/matplotlib/mpl-data/matplotlibrc 2007-08-06 18:50:00 UTC (rev 3675)
+++ trunk/matplotlib/lib/matplotlib/mpl-data/matplotlibrc 2007-08-06 18:52:07 UTC (rev 3676)
@@ -26,7 +26,7 @@
#### CONFIGURATION BEGINS HERE
# the default backend; one of GTK GTKAgg GTKCairo FltkAgg QtAgg TkAgg
# Agg Cairo GD GDK Paint PS PDF SVG Template
-backend : TkAgg
+backend : WXAgg
numerix : numpy # numpy, Numeric or numarray
#maskedarray : False # True to use external maskedarray module
# instead of numpy.ma; this is a temporary
@@ -150,6 +150,14 @@
#text.dvipnghack : False # some versions of dvipng don't handle
# alpha channel properly. Use True to correct and flush
# ~/.matplotlib/tex.cache before testing
+#text.markup : 'plain' # Affects how text, such as titles and lables, are
+ # interpreted by default.
+ # 'plain': As plain, unformatted text
+ # 'tex': As TeX-like text. Text between $'s will be
+ # formatted as a TeX math expression.
+ # This setting has no effect when text.usetex is True.
+ # In that case, all text will be sent to TeX for
+ # processing.
### AXES
# default face and edge color, default tick sizes,
Modified: trunk/matplotlib/lib/matplotlib/rcsetup.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/rcsetup.py 2007-08-06 18:50:00 UTC (rev 3675)
+++ trunk/matplotlib/lib/matplotlib/rcsetup.py 2007-08-06 18:52:07 UTC (rev 3676)
@@ -458,16 +458,6 @@
'svg.embed_char_paths' : [False, validate_bool], # True to save all characters as paths in the SVG
'plugins.directory' : ['.matplotlib_plugins', str], # where plugin directory is locate
- # mathtext settings
- 'mathtext.mathtext2' : [False, validate_bool], # Needed to enable Unicode
- # fonts used by mathtext. These ship with matplotlib
- 'mathtext.rm' : ['cmr10.ttf', str], # Roman (normal)
- 'mathtext.it' : ['cmmi10.ttf', str], # Italic
- 'mathtext.tt' : ['cmtt10.ttf', str], # Typewriter (monospaced)
- 'mathtext.mit' : ['cmmi10.ttf', str], # Math italic
- 'mathtext.cal' : ['cmsy10.ttf', str], # Caligraphic
- 'mathtext.nonascii' : ['cmex10.ttf', str], # All other nonascii fonts
-
}
if __name__ == '__main__':
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|