- powers with negative exponents are printed as fractions in the LaTeX output
authorChristian Bauer <Christian.Bauer@uni-mainz.de>
Thu, 21 Nov 2002 19:16:01 +0000 (19:16 +0000)
committerChristian Bauer <Christian.Bauer@uni-mainz.de>
Thu, 21 Nov 2002 19:16:01 +0000 (19:16 +0000)
- fixed some source code formatting in clifford.cpp

ginac/clifford.cpp
ginac/mul.cpp
ginac/power.cpp

index c7499db..0a10d45 100644 (file)
@@ -43,9 +43,9 @@ GINAC_IMPLEMENT_REGISTERED_CLASS(clifford, indexed)
 GINAC_IMPLEMENT_REGISTERED_CLASS(diracone, tensor)
 GINAC_IMPLEMENT_REGISTERED_CLASS(diracgamma, tensor)
 GINAC_IMPLEMENT_REGISTERED_CLASS(diracgamma5, tensor)
-
 GINAC_IMPLEMENT_REGISTERED_CLASS(diracgammaL, tensor)
 GINAC_IMPLEMENT_REGISTERED_CLASS(diracgammaR, tensor)
+
 //////////
 // default ctor, dtor, copy ctor, assignment operator and helpers
 //////////
@@ -65,9 +65,9 @@ DEFAULT_DESTROY(clifford)
 DEFAULT_CTORS(diracone)
 DEFAULT_CTORS(diracgamma)
 DEFAULT_CTORS(diracgamma5)
-
 DEFAULT_CTORS(diracgammaL)
 DEFAULT_CTORS(diracgammaR)
+
 //////////
 // other constructors
 //////////
@@ -120,9 +120,9 @@ DEFAULT_UNARCHIVE(clifford)
 DEFAULT_ARCHIVING(diracone)
 DEFAULT_ARCHIVING(diracgamma)
 DEFAULT_ARCHIVING(diracgamma5)
-
 DEFAULT_ARCHIVING(diracgammaL)
 DEFAULT_ARCHIVING(diracgammaR)
+
 //////////
 // functions overriding virtual functions from base classes
 //////////
index 211855a..f609370 100644 (file)
@@ -193,8 +193,6 @@ void mul::print(const print_context & c, unsigned level) const
                                c.s << "(";
                }
 
-               bool first = true;
-
                // First print the overall numeric coefficient
                numeric coeff = ex_to<numeric>(overall_coeff);
                if (coeff.csgn() == -1)
@@ -220,17 +218,51 @@ void mul::print(const print_context & c, unsigned level) const
 
                // Then proceed with the remaining factors
                epvector::const_iterator it = seq.begin(), itend = seq.end();
-               while (it != itend) {
-                       if (!first) {
-                               if (is_a<print_latex>(c))
-                                       c.s << ' ';
+               if (is_a<print_latex>(c)) {
+
+                       // Separate factors into those with negative numeric exponent
+                       // and all others
+                       exvector neg_powers, others;
+                       while (it != itend) {
+                               GINAC_ASSERT(is_a<numeric>(it->coeff));
+                               if (ex_to<numeric>(it->coeff).is_negative())
+                                       neg_powers.push_back(recombine_pair_to_ex(expair(it->rest, -(it->coeff))));
                                else
-                                       c.s << '*';
+                                       others.push_back(recombine_pair_to_ex(*it));
+                               ++it;
+                       }
+
+                       if (!neg_powers.empty()) {
+
+                               // Factors with negative exponent are printed as a fraction
+                               c.s << "\\frac{";
+                               mul(others).eval().print(c);
+                               c.s << "}{";
+                               mul(neg_powers).eval().print(c);
+                               c.s << "}";
+
                        } else {
-                               first = false;
+
+                               // All other factors are printed in the ordinary way
+                               exvector::const_iterator vit = others.begin(), vitend = others.end();
+                               while (vit != vitend) {
+                                       c.s << ' ';
+                                       vit->print(c, precedence());
+                                       ++vit;
+                               }
+                       }
+
+               } else {
+
+                       bool first = true;
+                       while (it != itend) {
+                               if (!first)
+                                       c.s << '*';
+                               else
+                                       first = false;
+                               recombine_pair_to_ex(*it).print(c, precedence());
+                               ++it;
                        }
-                       recombine_pair_to_ex(*it).print(c, precedence());
-                       ++it;
                }
 
                if (precedence() <= level) {
index 85e5bd6..32473bd 100644 (file)
@@ -172,11 +172,23 @@ void power::print(const print_context & c, unsigned level) const
 
                bool is_tex = is_a<print_latex>(c);
 
-               if (exponent.is_equal(_ex1_2)) {
+               if (is_tex && is_a<numeric>(exponent) && ex_to<numeric>(exponent).is_negative()) {
+
+                       // Powers with negative numeric exponents are printed as fractions in TeX
+                       c.s << "\\frac{1}{";
+                       power(basis, -exponent).eval().print(c);
+                       c.s << "}";
+
+               } else if (exponent.is_equal(_ex1_2)) {
+
+                       // Square roots are printed in a special way
                        c.s << (is_tex ? "\\sqrt{" : "sqrt(");
                        basis.print(c);
                        c.s << (is_tex ? '}' : ')');
+
                } else {
+
+                       // Ordinary output of powers using '^' or '**'
                        if (precedence() <= level)
                                c.s << (is_tex ? "{(" : "(");
                        basis.print(c, precedence());