From: Christian Bauer Date: Thu, 21 Nov 2002 19:16:01 +0000 (+0000) Subject: - powers with negative exponents are printed as fractions in the LaTeX output X-Git-Tag: release_1-0-13~19 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=0f617ea4ea1dc6a33cae5e2ce518b26d8055c177 - powers with negative exponents are printed as fractions in the LaTeX output - fixed some source code formatting in clifford.cpp --- diff --git a/ginac/clifford.cpp b/ginac/clifford.cpp index c7499db6..0a10d452 100644 --- a/ginac/clifford.cpp +++ b/ginac/clifford.cpp @@ -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 ////////// diff --git a/ginac/mul.cpp b/ginac/mul.cpp index 211855a6..f6093706 100644 --- a/ginac/mul.cpp +++ b/ginac/mul.cpp @@ -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(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(c)) - c.s << ' '; + if (is_a(c)) { + + // Separate factors into those with negative numeric exponent + // and all others + exvector neg_powers, others; + while (it != itend) { + GINAC_ASSERT(is_a(it->coeff)); + if (ex_to(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) { diff --git a/ginac/power.cpp b/ginac/power.cpp index 85e5bd6c..32473bd4 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -172,11 +172,23 @@ void power::print(const print_context & c, unsigned level) const bool is_tex = is_a(c); - if (exponent.is_equal(_ex1_2)) { + if (is_tex && is_a(exponent) && ex_to(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());