- fixed some source code formatting in clifford.cpp
GINAC_IMPLEMENT_REGISTERED_CLASS(diracone, tensor)
GINAC_IMPLEMENT_REGISTERED_CLASS(diracgamma, tensor)
GINAC_IMPLEMENT_REGISTERED_CLASS(diracgamma5, tensor)
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)
GINAC_IMPLEMENT_REGISTERED_CLASS(diracgammaL, tensor)
GINAC_IMPLEMENT_REGISTERED_CLASS(diracgammaR, tensor)
//////////
// default ctor, dtor, copy ctor, assignment operator and helpers
//////////
//////////
// default ctor, dtor, copy ctor, assignment operator and helpers
//////////
DEFAULT_CTORS(diracone)
DEFAULT_CTORS(diracgamma)
DEFAULT_CTORS(diracgamma5)
DEFAULT_CTORS(diracone)
DEFAULT_CTORS(diracgamma)
DEFAULT_CTORS(diracgamma5)
DEFAULT_CTORS(diracgammaL)
DEFAULT_CTORS(diracgammaR)
DEFAULT_CTORS(diracgammaL)
DEFAULT_CTORS(diracgammaR)
//////////
// other constructors
//////////
//////////
// other constructors
//////////
DEFAULT_ARCHIVING(diracone)
DEFAULT_ARCHIVING(diracgamma)
DEFAULT_ARCHIVING(diracgamma5)
DEFAULT_ARCHIVING(diracone)
DEFAULT_ARCHIVING(diracgamma)
DEFAULT_ARCHIVING(diracgamma5)
DEFAULT_ARCHIVING(diracgammaL)
DEFAULT_ARCHIVING(diracgammaR)
DEFAULT_ARCHIVING(diracgammaL)
DEFAULT_ARCHIVING(diracgammaR)
//////////
// functions overriding virtual functions from base classes
//////////
//////////
// functions overriding virtual functions from base classes
//////////
// First print the overall numeric coefficient
numeric coeff = ex_to<numeric>(overall_coeff);
if (coeff.csgn() == -1)
// First print the overall numeric coefficient
numeric coeff = ex_to<numeric>(overall_coeff);
if (coeff.csgn() == -1)
// Then proceed with the remaining factors
epvector::const_iterator it = seq.begin(), itend = seq.end();
// 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))));
+ 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 << "}";
+
+
+ // 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) {
}
if (precedence() <= level) {
bool is_tex = is_a<print_latex>(c);
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 ? '}' : ')');
c.s << (is_tex ? "\\sqrt{" : "sqrt(");
basis.print(c);
c.s << (is_tex ? '}' : ')');
+
+ // Ordinary output of powers using '^' or '**'
if (precedence() <= level)
c.s << (is_tex ? "{(" : "(");
basis.print(c, precedence());
if (precedence() <= level)
c.s << (is_tex ? "{(" : "(");
basis.print(c, precedence());