Changeset 7231:9a53ba484dcb


Ignore:
Timestamp:
10/29/07 13:44:57 (6 years ago)
Author:
Joel B. Mohler <jbm5@…>
Branch:
default
Children:
7232:e054455cbf30, 7233:6c1e61faebf2
Message:

Monoids, algebras, power series, polynomials and symbolic rings all latex variable names *much* better now

Location:
sage
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • sage/algebras/free_algebra_element.py

    r7195 r7231  
    8686            sage: latex(-x+3*y^20*z) 
    8787            \left(-1\right)x + 3y^{20}z 
     88            sage: alpha,beta,gamma=FreeAlgebra(ZZ,3,'alpha,beta,gamma').gens() 
     89            sage: latex(alpha-beta) 
     90            \alpha + \left(-1\right)\beta 
    8891        """ 
    8992        v = self.__monomial_coefficients.items() 
  • sage/calculus/calculus.py

    r7147 r7231  
    225225 
    226226import operator 
    227 from sage.misc.latex import latex, latex_varify 
     227from sage.misc.latex import latex, latex_variable_name 
    228228from sage.structure.sage_object import SageObject 
    229229 
     
    32903290        except AttributeError: 
    32913291            pass 
    3292         a = self._name 
    3293         if len(a) > 1: 
    3294             m = re.search('(\d|[.,])+$',a) 
    3295             if m is None: 
    3296                 a = latex_varify(a) 
    3297             else: 
    3298                 b = a[:m.start()] 
    3299                 a = '%s_{%s}'%(latex_varify(b), a[m.start():]) 
    3300                  
    3301         self.__latex = a 
    3302         return a 
     3292        self.__latex = latex_variable_name(self._name) 
     3293        return self.__latex 
    33033294 
    33043295    def _maxima_init_(self): 
  • sage/misc/latex.py

    r6141 r7231  
    604604                   'omega', 
    605605                   'Omega'] 
    606                     
    607606 
    608607def latex_varify(a): 
     
    613612    else: 
    614613        return '\\mbox{%s}'%a 
    615      
     614 
    616615def latex_variable_name(x): 
    617616    """ 
    618617    Return latex version of a variable name. 
    619      
    620     The rule is this: 
    621         x393 --> x_{393}    
    622     I.e., always replace the last numeric part by _{number}. 
    623     """ 
    624     import re 
    625     # * The "\d" means "decimal digit" 
    626     # * The "+" means "1 or more" 
    627     # * The "$" means "at the end of the line" 
    628     m = re.search('\d+$',x) 
    629     if m is None: 
    630         return x 
    631     return '%s_{%s}'%(latex_varify(x[:m.start()]), x[m.start():]) 
     618 
     619    Here are some guiding principles for usage of this function: 
     620    1)  If the variable is a single letter, that is the latex version. 
     621    2)  If the variable name is suffixed by a number, we put the number in the subscript. 
     622    3)  If the variable name contains an '_' we start the subscript at the underscore. 
     623        Note that #3 trumps rule #2. 
     624    4)  If a component of the variable is a greek letter, escape it properly. 
     625    5)  Recurse nicely with subscripts. 
     626 
     627    Refer to the examples section for how these rules might play out in practice. 
     628 
     629    EXAMPLES: 
     630        sage: import sage.misc.latex as latex_module 
     631        sage: latex_variable_name = latex_module.latex_variable_name 
     632        sage: latex_variable_name('a') 
     633        'a' 
     634        sage: latex_variable_name('abc') 
     635        '\\mbox{abc}' 
     636        sage: latex_variable_name('sigma') 
     637        '\\sigma' 
     638        sage: latex_variable_name('sigma_k') 
     639        '\\sigma_{k}' 
     640        sage: latex_variable_name('sigma389') 
     641        '\\sigma_{389}' 
     642        sage: latex_variable_name('beta_00') 
     643        '\\beta_{00}' 
     644        sage: latex_variable_name('Omega84') 
     645        '\\Omega_{84}' 
     646        sage: latex_variable_name('sigma_alpha') 
     647        '\\sigma_{\\alpha}' 
     648        sage: latex_variable_name('nothing1') 
     649        '\\mbox{nothing}_{1}' 
     650        sage: latex_variable_name('nothing_abc') 
     651        '\\mbox{nothing}_{\\mbox{abc}}' 
     652        sage: latex_variable_name('alpha_beta_gamma12') 
     653        '\\alpha_{\\beta_{\\gamma_{12}}}' 
     654 
     655    AUTHORS: 
     656        -- Joel B. Mohler -- drastic rewrite and many doc-tests 
     657    """ 
     658    underscore = x.find("_") 
     659    if underscore == -1: 
     660        import re 
     661        # * The "\d|[.,]" means "decimal digit" or period or comma 
     662        # * The "+" means "1 or more" 
     663        # * The "$" means "at the end of the line" 
     664        m = re.search('(\d|[.,])+$',x) 
     665        if m is None: 
     666            prefix = x 
     667            suffix = None 
     668        else: 
     669            prefix = x[:m.start()] 
     670            suffix = x[m.start():] 
     671    else: 
     672        prefix = x[:underscore] 
     673        suffix = x[underscore+1:] 
     674    if suffix and len(suffix) > 0: 
     675        # handle the suffix specially because it very well might be numeric 
     676        # I use strip to avoid using regex's -- It makes it a bit faster (and the code is more comprehensible to non-regex'ed people) 
     677        if suffix.strip("1234567890")!="": 
     678            suffix = latex_variable_name(suffix) # recurse to deal with recursive subscripts 
     679        return '%s_{%s}'%(latex_varify(prefix), suffix) 
     680    else: 
     681        return latex_varify(prefix) 
  • sage/misc/preparser.py

    r6510 r7231  
    475475            gen_list = [s.strip() for s in line[i+2:gen_end].split(',')] 
    476476            for g in gen_list: 
    477                 if not g.isalnum() or len(g) == 0 or not g[0].isalpha(): 
     477                if (not g.isalnum() and not g.replace("_","").isalnum()) or len(g) == 0 or not g[0].isalpha(): 
    478478                    raise SyntaxError, "variable name (='%s') must be alpha-numeric and begin with a letter"%g 
    479479 
  • sage/monoids/free_monoid_element.py

    r7206 r7231  
    2626from sage.rings.integer import Integer 
    2727from sage.structure.element import MonoidElement 
    28 from sage.misc.latex import latex, latex_varify 
     28from sage.misc.latex import latex, latex_variable_name 
    2929 
    3030def is_FreeMonoidElement(x): 
     
    121121            sage: z = F([(0,5),(1,2),(0,10),(0,2),(1,2)]) 
    122122            sage: z._latex_() 
    123             '\\mbox{a0}^{5}\\mbox{a1}^{2}\\mbox{a0}^{12}\\mbox{a1}^{2}' 
     123            'a_{0}^{5}a_{1}^{2}a_{0}^{12}a_{1}^{2}' 
    124124            sage: F, (alpha,beta,gamma) = FreeMonoid(3, 'alpha,beta,gamma').objgens() 
    125125            sage: latex(alpha*beta*gamma) 
     
    128128        s = "" 
    129129        v = self._element_list 
    130         x = self.parent().variable_names() 
     130        x = self.parent().latex_variable_names() 
    131131        for i in range(len(v)): 
    132132            g = x[int(v[i][0])] 
    133133            e = v[i][1] 
    134134            if e == 1: 
    135                 s += "%s"%(latex_varify(g),) 
    136             else: 
    137                 s += "%s^{%s}"%(latex_varify(g),e) 
     135                s += "%s"%(g,) 
     136            else: 
     137                s += "%s^{%s}"%(g,e) 
    138138        if len(s) == 0: s = "1" 
    139139        return s 
  • sage/rings/laurent_series_ring_element.pyx

    r6990 r7231  
    234234            sage: f = (17/2)*x^-2 + x + x^2 + 3*x^4 + O(x^7) 
    235235            sage: latex(f) 
    236             \frac{\frac{17}{2}}{x^{2}} + x + x^{2} + 3x^{4} + O(\text{x}^{7}) 
     236            \frac{\frac{17}{2}}{x^{2}} + x + x^{2} + 3x^{4} + O(x^{7}) 
    237237        """ 
    238238        if self.is_zero(): 
     
    245245        valuation = self.__n 
    246246        m = len(v) 
    247         X = self._parent.variable_name() 
     247        X = self._parent.latex_variable_names()[0] 
    248248        atomic_repr = self._parent.base_ring().is_atomic_repr() 
    249249        first = True 
     
    280280                bigoh = "O(1)" 
    281281            elif pr == 1: 
    282                 bigoh = "O(%s)"%sage.misc.latex.latex(self._parent.variable_name()) 
     282                bigoh = "O(%s)"%(X,) 
    283283            else: 
    284                 bigoh = "O(%s^{%s})"%(sage.misc.latex.latex(self._parent.variable_name()),pr) 
     284                bigoh = "O(%s^{%s})"%(X,pr) 
    285285            if s == " ": 
    286286                return bigoh 
  • sage/rings/polynomial/multi_polynomial_ring_generic.pyx

    r6606 r7231  
    77from sage.rings.integer_ring import ZZ 
    88from sage.rings.polynomial.polydict import PolyDict 
     9from sage.misc.latex import latex_variable_name 
    910import multi_polynomial_element 
    1011import polynomial_ring 
     
    208209 
    209210    def _latex_(self): 
    210         vars = str(self.latex_variable_names()).replace('\n','').replace("'",'') 
    211         return "%s[%s]"%(sage.misc.latex.latex(self.base_ring()), vars[1:-1]) 
    212  
     211        vars = ', '.join(self.latex_variable_names()) 
     212        return "%s[%s]"%(sage.misc.latex.latex(self.base_ring()), vars) 
    213213 
    214214    def _ideal_class_(self): 
     
    382382        raise NotImplementedError 
    383383 
    384     def latex_variable_names(self): 
    385         """ 
    386         Returns the list of variable names suitable for latex output. 
    387  
    388         All '_SOMETHING' substrings are replaced by '_{SOMETHING}' recursively 
    389         so that subscripts of subscripts work. 
    390  
    391         EXAMPLES: 
    392             sage: R, x = PolynomialRing(QQ,'x',12).objgens() 
    393             sage: x 
    394             (x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11) 
    395             sage: print R.latex_variable_names () 
    396             ['x_{0}', 'x_{1}', 'x_{2}', 'x_{3}', 'x_{4}', 'x_{5}', 'x_{6}', 'x_{7}', 'x_{8}', 'x_{9}', 'x_{10}', 'x_{11}'] 
    397             sage: f = x[0]^3 + 15/3 * x[1]^10 
    398             sage: print latex(f) 
    399             5 x_{1}^{10} + x_{0}^{3} 
    400         """ 
    401         if self._latex_names is not None: 
    402             return self._latex_names 
    403         names = [] 
    404         for g in self.variable_names(): 
    405             i = len(g)-1 
    406             while i >= 0 and g[i].isdigit(): 
    407                 i -= 1 
    408             if i < len(g)-1: 
    409                 g = '%s_{%s}'%(g[:i+1], g[i+1:]) 
    410             names.append(g) 
    411         self._latex_names = names 
    412         return names 
    413  
    414384    def __reduce__(self): 
    415385        """ 
     
    420390        names = self.variable_names() 
    421391        order = self.term_order() 
    422          
     392 
    423393        return unpickle_MPolynomialRing_generic_v1,(base_ring, n, names, order) 
    424394 
     
    427397        r""" 
    428398        Return a random polynomial in this polynomial ring. 
    429          
     399 
    430400        INPUT: 
    431401            degree -- maximum total degree of resulting polynomial 
  • sage/rings/polynomial/polynomial_element.pyx

    r6990 r7231  
    888888        r = reversed(xrange(m)) 
    889889        if name is None: 
    890             name = self.parent().variable_name() 
     890            name = self.parent().latex_variable_names()[0] 
    891891        atomic_repr = self.parent().base_ring().is_atomic_repr() 
    892892        for n in reversed(xrange(m)): 
  • sage/rings/polynomial/polynomial_ring.py

    r7177 r7231  
    378378 
    379379    def _latex_(self): 
    380         return "%s[%s]"%(latex.latex(self.base_ring()), latex.latex(self.variable_name())) 
    381          
     380        """ 
     381        EXAMPLES: 
     382            sage: S.<alpha12>=ZZ[] 
     383            sage: latex(S) 
     384            \mathbf{Z}[\alpha_{12}] 
     385        """ 
     386        return "%s[%s]"%(latex.latex(self.base_ring()), self.latex_variable_names()[0]) 
     387 
    382388    def __set_polynomial_class(self, cls=None): 
    383389        from sage.rings.padics.padic_ring_capped_relative import pAdicRingCappedRelative 
  • sage/rings/power_series_ring.py

    r7000 r7231  
    5959    sage: R.<t> = PowerSeriesRing(QQ, sparse=True) 
    6060    sage: latex(-2/3*(1/t^3) + 1/t + 3/5*t^2 + O(t^5)) 
    61     \frac{-\frac{2}{3}}{t^{3}} + \frac{1}{t} + \frac{3}{5}t^{2} + O(\text{t}^{5}) 
     61    \frac{-\frac{2}{3}}{t^{3}} + \frac{1}{t} + \frac{3}{5}t^{2} + O(t^{5}) 
    6262    sage: S = parent(1/t); S 
    6363    Sparse Laurent Series Ring in t over Rational Field     
     
    279279            sage: latex(R) 
    280280            \mathbf{F}_{17}[[y]] 
    281         """ 
    282         return "%s[[%s]]"%(latex.latex(self.base_ring()), self.variable_name()) 
     281            sage: R = GF(17)[['y12']] 
     282            sage: latex(R) 
     283            \mathbf{F}_{17}[[y_{12}]] 
     284        """ 
     285        return "%s[[%s]]"%(latex.latex(self.base_ring()), self.latex_variable_names()[0]) 
    283286 
    284287    def __call__(self, f, prec=infinity, check=True): 
  • sage/rings/power_series_ring_element.pyx

    r6990 r7231  
    473473        v = self.list() 
    474474        m = len(v) 
    475         X = self._parent.variable_name() 
     475        X = self._parent.latex_variable_names()[0] 
    476476        atomic_repr = self._parent.base_ring().is_atomic_repr() 
    477477        first = True 
     
    504504                bigoh = "O(1)" 
    505505            elif self._prec == 1: 
    506                 bigoh = "O(%s)"%sage.misc.latex.latex(self._parent.gen()) 
     506                bigoh = "O(%s)"%(X,) 
    507507            else: 
    508                 bigoh = "O(%s^{%s})"%(sage.misc.latex.latex(self._parent.gen()),self._prec) 
     508                bigoh = "O(%s^{%s})"%(X,self._prec) 
    509509            if s == " ": 
    510510                return bigoh 
  • sage/structure/parent_gens.pyx

    r6778 r7231  
    5858 
    5959import sage.misc.defaults 
    60 import sage.misc.latex 
     60from sage.misc.latex import latex_variable_name 
    6161import gens_py 
    6262import parent 
     
    121121        if len(N) == 0: 
    122122            raise ValueError, "variable name must be nonempty" 
    123         if not N.isalnum(): 
     123        if not N.isalnum() and not N.replace("_","").isalnum(): 
     124            # We must be alphanumeric, but we make an exception for non-leading '_' characters. 
    124125            raise ValueError, "variable names must be alphanumeric, but one is '%s' which is not."%N 
    125126        if not N[0].isalpha(): 
     
    377378 
    378379    def latex_variable_names(self): 
     380        """ 
     381        Returns the list of variable names suitable for latex output. 
     382 
     383        All '_SOMETHING' substrings are replaced by '_{SOMETHING}' recursively 
     384        so that subscripts of subscripts work. 
     385 
     386        EXAMPLES: 
     387            sage: R, x = PolynomialRing(QQ,'x',12).objgens() 
     388            sage: x 
     389            (x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11) 
     390            sage: print R.latex_variable_names () 
     391            ['x_{0}', 'x_{1}', 'x_{2}', 'x_{3}', 'x_{4}', 'x_{5}', 'x_{6}', 'x_{7}', 'x_{8}', 'x_{9}', 'x_{10}', 'x_{11}'] 
     392            sage: f = x[0]^3 + 15/3 * x[1]^10 
     393            sage: print latex(f) 
     394            5 x_{1}^{10} + x_{0}^{3} 
     395        """ 
    379396        if self._latex_names != None: 
    380397            return self._latex_names 
    381398        # Compute the latex versions of the variable names. 
    382         self._latex_names = [] 
    383         for x in self.variable_names(): 
    384             self._latex.append(sage.misc.latex.latex_variable_name(x)) 
     399        self._latex_names = [latex_variable_name(x) for x in self.variable_names()] 
    385400        return self._latex_names 
    386401 
Note: See TracChangeset for help on using the changeset viewer.