|
From: <md...@us...> - 2007-07-17 12:22:06
|
Revision: 3548
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3548&view=rev
Author: mdboom
Date: 2007-07-17 05:21:59 -0700 (Tue, 17 Jul 2007)
Log Message:
-----------
Add support for Latex2e-style math fonts (\mathrm, \mathit etc.)
Add support for function name shortcuts (\sin, \cos etc.)
Raise an exception when encountering double subscript or superscripts
(e.g. x_i_j)
Modified Paths:
--------------
branches/mathtext_mgd/lib/matplotlib/mathtext.py
Modified: branches/mathtext_mgd/lib/matplotlib/mathtext.py
===================================================================
--- branches/mathtext_mgd/lib/matplotlib/mathtext.py 2007-07-17 10:09:27 UTC (rev 3547)
+++ branches/mathtext_mgd/lib/matplotlib/mathtext.py 2007-07-17 12:21:59 UTC (rev 3548)
@@ -135,7 +135,7 @@
from matplotlib.pyparsing import Literal, Word, OneOrMore, ZeroOrMore, \
Combine, Group, Optional, Forward, NotAny, alphas, nums, alphanums, \
StringStart, StringEnd, ParseException, FollowedBy, Regex, \
- operatorPrecedence, opAssoc, ParseResults, Or, Suppress
+ operatorPrecedence, opAssoc, ParseResults, Or, Suppress, oneOf
from matplotlib.afm import AFM
from matplotlib.cbook import enumerate, iterable, Bunch
@@ -1230,6 +1230,8 @@
"""
def __init__(self, elements):
Element.__init__(self)
+ if not isinstance(elements, list):
+ elements = elements.asList()
self.elements = elements
for i in range(len(elements)-1):
self.elements[i].neighbors['right'] = self.elements[i+1]
@@ -1414,6 +1416,15 @@
self.symbols.append(above)
return [sym]
+ def function(self, s, loc, toks):
+ #~ print "function", toks
+ symbols = [FontElement("rm")]
+ for c in toks[0]:
+ sym = SymbolElement(c)
+ symbols.append(sym)
+ self.symbols.append(sym)
+ return [GroupElement(symbols)]
+
def group(self, s, loc, toks):
assert(len(toks)==1)
#print 'grp', toks
@@ -1427,6 +1438,16 @@
font = FontElement(name)
return [font]
+ def latexfont(self, s, loc, toks):
+ assert(len(toks)==1)
+ name, grp = toks[0]
+ if len(grp.elements):
+ font = FontElement(name[4:])
+ font.neighbors['right'] = grp.elements[0]
+ grp.elements.insert(0, font)
+ return [grp]
+ return []
+
_subsuperscript_names = {
'normal': ['subscript', 'superscript'],
'overUnder': ['below', 'above']
@@ -1463,6 +1484,10 @@
if compound[other_index] in next.neighbors:
prev.neighbors[names[other_index]] = next.neighbors[compound[other_index]]
del next.neighbors[compound[other_index]]
+ elif compound[index] in next.neighbors:
+ raise ValueError(
+ "Double %ss" %
+ self._subsuperscript_names['normal'][index])
return [prev]
def is_overunder(self, prev):
@@ -1472,6 +1497,7 @@
# All forward declarations are here
font = Forward().setParseAction(handler.font).setName("font")
+latexfont = Forward().setParseAction(handler.latexfont).setName("latexfont")
subsuper = Forward().setParseAction(handler.subsuperscript).setName("subsuper")
placeable = Forward().setName("placeable")
@@ -1522,12 +1548,13 @@
overUnder =(over
| under)
-accent =(Literal('hat') | Literal('check') | Literal('dot') |
- Literal('breve') | Literal('acute') | Literal('ddot') |
- Literal('grave') | Literal('tilde') | Literal('bar') |
- Literal('vec') | Literal('"') | Literal("`") | Literal("'") |
- Literal('~') | Literal('.') | Literal('^'))
+accent = oneOf("hat check dot breve acute ddot grave tilde bar vec "
+ "\" ` ' ~ . ^")
+function = oneOf("arccos csc ker min arcsin deg lg Pr arctan det lim sec "
+ "arg dim liminf sin cos exp limsup sinh cosh gcd ln sup "
+ "cot hom log tan coth inf max tanh")
+
number = Combine(Word(nums) + Optional(Literal('.')) + Optional( Word(nums) ))
plus = Literal('+')
@@ -1539,14 +1566,9 @@
| times
| div)
-roman = Literal('rm')
-cal = Literal('cal')
-italics = Literal('it')
-typewriter = Literal('tt')
-fontname =(roman
- | cal
- | italics
- | typewriter)
+fontname = oneOf("rm cal it tt")
+ # mathbf and mathsf not supported yet
+latex2efont = oneOf("mathrm mathcal mathit mathtt")
texsym = Combine(bslash + Word(alphanums) + NotAny("{"))
@@ -1588,16 +1610,28 @@
+ Optional(rbrace)
).setParseAction(handler.accent).setName("accent")
+function =(Suppress(bslash)
+ + function).setParseAction(handler.function).setName("function")
+
group = Group(
lbrace
+ OneOrMore(
space
| font
+ | latexfont
| subsuper
)
+ rbrace
).setParseAction(handler.group).setName("group")
+font <<(Suppress(bslash)
+ + fontname)
+
+latexfont << Group(
+ Suppress(bslash)
+ + latex2efont
+ + group)
+
composite = Group(
Combine(
bslash
@@ -1607,10 +1641,8 @@
+ group
).setParseAction(handler.composite).setName("composite")
-font <<(Suppress(bslash)
- + fontname)
-
placeable <<(accent
+ ^ function
^ symbol
^ group
^ composite
@@ -1632,6 +1664,7 @@
expression = OneOrMore(
space
| font
+ | latexfont
| subsuper
).setParseAction(handler.expression).setName("expression")
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|