]> www.ginac.de Git - ginac.git/blobdiff - ginac/inifcns.cpp
Output LaTeX-symbols using \mathrm, instead of \mbox.
[ginac.git] / ginac / inifcns.cpp
index c49fc7021aa5694c1862d8ff743ac9f7936b60e6..20ea659ff52dee8286ce5ff09877f847a7c4a61e 100644 (file)
@@ -3,7 +3,7 @@
  *  Implementation of GiNaC's initially known functions. */
 
 /*
- *  GiNaC Copyright (C) 1999-2005 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2009 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -20,9 +20,6 @@
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <vector>
-#include <stdexcept>
-
 #include "inifcns.h"
 #include "ex.h"
 #include "constant.h"
@@ -37,6 +34,9 @@
 #include "symmetry.h"
 #include "utils.h"
 
+#include <stdexcept>
+#include <vector>
+
 namespace GiNaC {
 
 //////////
@@ -190,8 +190,14 @@ static ex abs_eval(const ex & arg)
 {
        if (is_exactly_a<numeric>(arg))
                return abs(ex_to<numeric>(arg));
-       else
-               return abs(arg).hold();
+
+       if (arg.info(info_flags::nonnegative))
+               return arg;
+
+       if (is_ex_the_function(arg, abs))
+               return arg;
+
+       return abs(arg).hold();
 }
 
 static void abs_print_latex(const ex & arg, const print_context & c)
@@ -641,7 +647,7 @@ REGISTER_FUNCTION(Li2, eval_func(Li2_eval).
                        evalf_func(Li2_evalf).
                        derivative_func(Li2_deriv).
                        series_func(Li2_series).
-                       latex_name("\\mbox{Li}_2"));
+                       latex_name("\\mathrm{Li}_2"));
 
 //////////
 // trilogarithm
@@ -655,7 +661,7 @@ static ex Li3_eval(const ex & x)
 }
 
 REGISTER_FUNCTION(Li3, eval_func(Li3_eval).
-                       latex_name("\\mbox{Li}_3"));
+                       latex_name("\\mathrm{Li}_3"));
 
 //////////
 // Derivatives of Riemann's Zeta-function  zetaderiv(0,x)==zeta(x)
@@ -753,7 +759,7 @@ static ex binomial_sym(const ex & x, const numeric & y)
        if (y.is_integer()) {
                if (y.is_nonneg_integer()) {
                        const unsigned N = y.to_int();
-                       if (N == 0) return _ex0;
+                       if (N == 0) return _ex1;
                        if (N == 1) return x;
                        ex t = x.expand();
                        for (unsigned i = 2; i <= N; ++i)
@@ -878,7 +884,7 @@ ex lsolve(const ex &eqns, const ex &symbols, unsigned options)
        
        // syntax checks
        if (!eqns.info(info_flags::list)) {
-               throw(std::invalid_argument("lsolve(): 1st argument must be a list"));
+               throw(std::invalid_argument("lsolve(): 1st argument must be a list or an equation"));
        }
        for (size_t i=0; i<eqns.nops(); i++) {
                if (!eqns.op(i).info(info_flags::relation_equal)) {
@@ -886,7 +892,7 @@ ex lsolve(const ex &eqns, const ex &symbols, unsigned options)
                }
        }
        if (!symbols.info(info_flags::list)) {
-               throw(std::invalid_argument("lsolve(): 2nd argument must be a list"));
+               throw(std::invalid_argument("lsolve(): 2nd argument must be a list or a symbol"));
        }
        for (size_t i=0; i<symbols.nops(); i++) {
                if (!symbols.op(i).info(info_flags::symbol)) {