Ticket #13735: trac_13735_fix_latex_repr_lincomb.patch

File trac_13735_fix_latex_repr_lincomb.patch, 5.4 KB (added by vittucek, 9 years ago)

fix the representation of linear combinations and include more testcases

  • sage/misc/misc.py

    # HG changeset patch
    # User vit.tucek <vit.tucek@gmail.com>
    # Date 1365427510 -7200
    # Node ID f6f0d82d6ac9cb872fe8c9600c2f2116fd44c561
    # Parent  bfdc420249e7d251de5c3b0343a5c9d56a2c6df4
    Trac 13735: avoid extra parentheses in latex expression for linear combinations with negative coefficients
    
    diff --git a/sage/misc/misc.py b/sage/misc/misc.py
    a b  
    694694       
    695695
    696696def coeff_repr(c, is_latex=False):
     697    if c == 1:
     698        return ""
    697699    if not is_latex:
    698700        try:
    699701            return c._coeff_repr()
     
    732734
    733735    EXAMPLES::
    734736
    735         sage: repr_lincomb([('a',1), ('b',2), ('c',3)])
    736         'a + 2*b + 3*c'
    737         sage: repr_lincomb([('a',1), ('b','2+3*x'), ('c',3)])
    738         'a + (2+3*x)*b + 3*c'
     737        sage: repr_lincomb([('a',1), ('b',-2), ('c',3)])
     738        'a - 2*b + 3*c'
     739        sage: repr_lincomb([('a',0), ('b',-2), ('c',3)])
     740        '-2*b + 3*c'
     741        sage: repr_lincomb([('a',0), ('b',2), ('c',3)])
     742        '2*b + 3*c'
     743        sage: repr_lincomb([('a',1), ('b',0), ('c',3)])
     744        'a + 3*c'
     745        sage: repr_lincomb([('a',-1), ('b','2+3*x'), ('c',3)])
     746        '-a + (2+3*x)*b + 3*c'
    739747        sage: repr_lincomb([('a', '1+x^2'), ('b', '2+3*x'), ('c', 3)])
    740748        '(1+x^2)*a + (2+3*x)*b + 3*c'
    741749        sage: repr_lincomb([('a', '1+x^2'), ('b', '-2+3*x'), ('c', 3)])
     
    750758
    751759        sage: repr_lincomb([('a',1), ('b',2), ('c',3)], scalar_mult='*')
    752760        'a + 2*b + 3*c'
    753         sage: repr_lincomb([('a',1), ('b',2), ('c',3)], scalar_mult='**')
    754         'a + 2**b + 3**c'
    755         sage: repr_lincomb([('a',1), ('b',2), ('c',3)], scalar_mult='**')
    756         'a + 2**b + 3**c'
     761        sage: repr_lincomb([('a',2), ('b',0), ('c',-3)], scalar_mult='**')
     762        '2**a - 3**c'
     763        sage: repr_lincomb([('a',-1), ('b',2), ('c',3)], scalar_mult='**')
     764        '-a + 2**b + 3**c'
    757765
    758766    Examples for ``scalar_mult`` and ``is_latex``::
    759767
    760         sage: repr_lincomb([('a',1), ('b',2), ('c',3)], is_latex=True)
    761         'a + 2b + 3c'
    762         sage: repr_lincomb([('a',1), ('b',2), ('c',3)], is_latex=True, scalar_mult='*')
    763         'a + 2b + 3c'
    764         sage: repr_lincomb([('a',1), ('b',2), ('c',3)], is_latex=True, scalar_mult='**')
    765         'a + 2**b + 3**c'
    766         sage: repr_lincomb([('a',1), ('b',2), ('c',3)], is_latex=True, latex_scalar_mult='*')
    767         'a + 2*b + 3*c'
     768        sage: repr_lincomb([('a',-1), ('b',2), ('c',3)], is_latex=True)
     769        '-a + 2b + 3c'
     770        sage: repr_lincomb([('a',-1), ('b',-1), ('c',3)], is_latex=True, scalar_mult='*')
     771        '-a - b + 3c'
     772        sage: repr_lincomb([('a',-1), ('b',2), ('c',-3)], is_latex=True, scalar_mult='**')
     773        '-a + 2**b - 3**c'
     774        sage: repr_lincomb([('a',-2), ('b',-1), ('c',-3)], is_latex=True, latex_scalar_mult='*')
     775        '-2*a - b - 3*c'
    768776
    769777    Examples for ``strip_one``::
    770778
    771         sage: repr_lincomb([ ('a',1), (1,2), ('3',3) ])
    772         'a + 2*1 + 3*3'
    773         sage: repr_lincomb([ ('a',1), (1,1), ('3',3) ])
    774         'a + 1 + 3*3'
    775         sage: repr_lincomb([ ('a',1), (1,2), ('3',3) ], strip_one = True)
    776         'a + 2 + 3*3'
    777         sage: repr_lincomb([ ('a',1), (1,1), ('3',3) ], strip_one = True)
    778         'a + 1 + 3*3'
     779        sage: repr_lincomb([ ('a',1), (1,-2), ('3',3) ])
     780        'a - 2*1 + 3*3'
     781        sage: repr_lincomb([ ('a',-1), (1,1), ('3',3) ])
     782        '-a + 1 + 3*3'
     783        sage: repr_lincomb([ ('a',1), (1,-2), ('3',3) ], strip_one = True)
     784        'a - 2 + 3*3'
     785        sage: repr_lincomb([ ('a',-1), (1,1), ('3',3) ], strip_one = True)
     786        '-a + 1 + 3*3'
     787        sage: repr_lincomb([ ('a',1), (1,-1), ('3',3) ], strip_one = True)
     788        'a - 1 + 3*3'
    779789
    780790    Examples for ``repr_monomial``::
    781791
     
    819829
    820830    all_atomic = True
    821831    for (monomial,c) in terms:
    822         b = repr_monomial(monomial)
    823832        if c != 0:
    824             coeff = coeff_repr(c, is_latex)
     833            b = repr_monomial(monomial)
     834            if c < 0:
     835                coeff = coeff_repr(-c, is_latex)
     836            else:
     837                coeff = coeff_repr(c, is_latex)
    825838            if coeff != "0":
    826                 if coeff == "1":
    827                     coeff = ""
    828                 elif coeff == "-1":
    829                     coeff = "-"
    830                 elif len(b) > 0:
    831                     if len(coeff) > 0 and b == "1" and strip_one:
     839                if c < 0:
     840                    if first:
     841                        coeff = "-%s"%coeff # leading space
     842                    else:
     843                        coeff = " - %s"%coeff
     844                else:
     845                    if first:
     846                        coeff = "%s"%coeff
     847                    else:
     848                        coeff = " + %s"%coeff
     849                if len(b) > 0 and c != 1 and c != -1:
     850                    if b =="1" and strip_one:
    832851                        b = ""
    833852                    else:
    834853                        b = scalar_mult + b
    835                 if not first:
    836                     if len(coeff) > 0 and coeff[0] == "-":
    837                         coeff = " - %s"%coeff[1:]
    838                     else:
    839                         coeff = " + %s"%coeff
    840                 else:
    841                     coeff = "%s"%coeff
    842             s += "%s%s"%(coeff, b)
    843             first = False
     854                s += "%s%s"%(coeff, b)
     855                first = False
    844856    if first:
    845         return "0"
     857        return "0" # this can happen only if are only terms with coeff_repr(c) == "0"
    846858    elif s == "":
    847859        return "1"
    848860    else: