]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_extern.C
try to fix rounding errors
[lyx.git] / src / mathed / math_extern.C
index 1681338fc174ceeda7d209a250d9340dd93b187c..502c640e2d2d236725422e4b5f67f7bedd49e667 100644 (file)
@@ -1,22 +1,22 @@
-
 // This file contains most of the magic that extracts "context
 // information" from the unstructered layout-oriented stuff in an
 // MathArray.
 
 #include <algorithm>
 
+#include "math_amsarrayinset.h"
 #include "math_charinset.h"
 #include "math_deliminset.h"
 #include "math_diffinset.h"
 #include "math_exfuncinset.h"
 #include "math_exintinset.h"
-#include "math_funcinset.h"
 #include "math_fracinset.h"
 #include "math_matrixinset.h"
 #include "math_mathmlstream.h"
 #include "math_scriptinset.h"
 #include "math_stringinset.h"
 #include "math_symbolinset.h"
+#include "math_unknowninset.h"
 #include "Lsstream.h"
 #include "debug.h"
 
@@ -28,7 +28,7 @@ using std::find_if;
 
 ostream & operator<<(ostream & os, MathArray const & ar)
 {
-       NormalStream ns(os);    
+       NormalStream ns(os);
        ns << ar;
        return os;
 }
@@ -42,7 +42,7 @@ typedef MathInset * ReplaceArgumentFunc(const MathArray & ar);
 
 
 
-// try to extract a super/subscript 
+// try to extract a super/subscript
 // modify iterator position to point behind the thing
 bool extractScript(MathArray & ar,
        MathArray::iterator & pos, MathArray::iterator last)
@@ -106,6 +106,8 @@ MathArray::iterator extractArgument(MathArray & ar,
 
 MathScriptInset const * asScript(MathArray::const_iterator it)
 {
+       if (!it->nucleus())
+               return 0;
        if (it->nucleus()->asScriptInset())
                return 0;
        ++it;
@@ -119,16 +121,10 @@ MathScriptInset const * asScript(MathArray::const_iterator it)
 // returns sequence of char with same code starting at it up to end
 // it might be less, though...
 MathArray::const_iterator charSequence(MathArray::const_iterator it,
-       MathArray::const_iterator end, string & s, MathTextCodes & c)
+       MathArray::const_iterator end, string & s)
 {
-       MathCharInset const * p = (*it)->asCharInset();
-       c = p->code();
-       for (; it != end; ++it) {
-               p = (*it)->asCharInset();
-               if (!p || p->code() != c)
-                       break;
-               s += p->getChar();
-       }
+       for (; it != end && (*it)->asCharInset(); ++it)
+               s += (*it)->getChar();
        return it;
 }
 
@@ -144,7 +140,7 @@ void extractStrings(MathArray & ar)
                // create proper string inset
                MathStringInset * p = new MathStringInset;
                MathArray::const_iterator
-                       jt = charSequence(it, ar.end(), p->str_, p->code_);
+                       jt = charSequence(it, ar.end(), p->str_);
 
                // clean up
                (*it).reset(p);
@@ -163,14 +159,23 @@ MathInset * singleItem(MathArray & ar)
 void extractMatrices(MathArray & ar)
 {
        //lyxerr << "\nMatrices from: " << ar << "\n";
+       // first pass for explicitly delimited stuff
        for (MathArray::iterator it = ar.begin(); it != ar.end(); ++it) {
                MathDelimInset * del = (*it)->asDelimInset();
                if (!del)
                        continue;
                MathInset * arr = singleItem(del->cell(0));
-               if (!arr || !arr->asArrayInset())
+               if (!arr || !arr->asGridInset())
+                       continue;
+               *it = MathAtom(new MathMatrixInset(*(arr->asGridInset())));
+       }
+
+       // second pass for AMS "pmatrix" etc
+       for (MathArray::iterator it = ar.begin(); it != ar.end(); ++it) {
+               MathAMSArrayInset * ams = (*it)->asAMSArrayInset();
+               if (!ams)
                        continue;
-               *it = MathAtom(new MathMatrixInset(*(arr->asArrayInset())));
+               *it = MathAtom(new MathMatrixInset(*ams));
        }
        //lyxerr << "\nMatrices to: " << ar << "\n";
 }
@@ -197,8 +202,17 @@ bool extractString(MathInset * p, string & str)
 bool extractNumber(MathArray const & ar, int & i)
 {
        string s;
-       MathTextCodes c;
-       charSequence(ar.begin(), ar.end(), s, c);
+       charSequence(ar.begin(), ar.end(), s);
+       istringstream is(s.c_str());
+       is >> i;
+       return is;
+}
+
+
+bool extractNumber(MathArray const & ar, double & i)
+{
+       string s;
+       charSequence(ar.begin(), ar.end(), s);
        istringstream is(s.c_str());
        is >> i;
        return is;
@@ -260,13 +274,13 @@ void replaceNested(
                ar.erase(it + 1, jt + 1);
                (*it).reset(p);
        }
-} 
+}
 
 
 
 //
 // split scripts into seperate super- and subscript insets. sub goes in
-// front of super... 
+// front of super...
 //
 
 void splitScripts(MathArray & ar)
@@ -286,13 +300,13 @@ void splitScripts(MathArray & ar)
 
                // create extra script inset and move superscript over
                MathScriptInset * q = new MathScriptInset;
-               q->ensure(true); 
+               q->ensure(true);
                q->up().data_.swap(p->up().data_);
                p->removeScript(true);
 
                // insert new inset behind
                ++i;
-               ar.insert(i, MathAtom(q)); 
+               ar.insert(i, MathAtom(q));
        }
        //lyxerr << "\nScripts to: " << ar << "\n";
 }
@@ -385,10 +399,10 @@ void extractFunctions(MathArray & ar)
 
                string name;
                // is it a function?
-               if ((*it)->asFuncInset()) { 
+               if ((*it)->asUnknownInset()) {
                        // it certainly is if it is well known...
-                       name = (*it)->asFuncInset()->name();
-               } else {
+                       name = (*it)->asUnknownInset()->name();
+               } else {
                        // is this a user defined function?
                        // it it probably not, if it doesn't have a name.
                        if (!extractString((*it).nucleus(), name))
@@ -408,7 +422,7 @@ void extractFunctions(MathArray & ar)
                // 'sin' '^2' 'x' -> 'sin(x)' '^2'
                MathArray exp;
                extractScript(exp, jt, ar.end());
-       
+
                // create a proper inset as replacement
                MathExFuncInset * p = new MathExFuncInset(name);
 
@@ -417,7 +431,7 @@ void extractFunctions(MathArray & ar)
 
                // replace the function name by a real function inset
                (*it).reset(p);
-               
+
                // remove the source of the argument from the array
                ar.erase(it + 1, st);
 
@@ -425,7 +439,7 @@ void extractFunctions(MathArray & ar)
                ar.insert(i + 1, exp);
                //lyxerr << "\nFunctions to: " << ar << "\n";
        }
-} 
+}
 
 
 //
@@ -480,7 +494,7 @@ void extractIntegrals(MathArray & ar)
                // collect subscript if any
                MathArray::iterator st = it + 1;
                if (st != ar.end())
-                       if (MathScriptInset * sub = (*st)->asScriptInset()) 
+                       if (MathScriptInset * sub = (*st)->asScriptInset())
                                if (sub->hasDown()) {
                                        p->cell(2) = sub->down().data_;
                                        ++st;
@@ -488,7 +502,7 @@ void extractIntegrals(MathArray & ar)
 
                // collect superscript if any
                if (st != ar.end())
-                       if (MathScriptInset * sup = (*st)->asScriptInset()) 
+                       if (MathScriptInset * sup = (*st)->asScriptInset())
                                if (sup->hasUp()) {
                                        p->cell(3) = sup->up().data_;
                                        ++st;
@@ -499,7 +513,7 @@ void extractIntegrals(MathArray & ar)
 
                // use the "thing" behind the 'd' as differential
                MathArray::iterator tt = extractArgument(p->cell(1), jt + 1, ar.end());
-               
+
                // remove used parts
                ar.erase(it + 1, tt);
                (*it).reset(p);
@@ -632,7 +646,7 @@ void extractDiff(MathArray & ar)
                // is this a "differential fraction"?
                if (!testDiffFrac(it->nucleus()))
                        continue;
-               
+
                MathFracInset * f = (*it)->asFracInset();
                if (!f) {
                        lyxerr << "should not happen\n";
@@ -643,20 +657,20 @@ void extractDiff(MathArray & ar)
                MathDiffInset * diff = new MathDiffInset;
 
                // collect function, let jt point behind last used item
-               MathArray::iterator jt = it + 1; 
-               //int n = 1; 
+               MathArray::iterator jt = it + 1;
+               //int n = 1;
                MathArray & numer = f->cell(0);
                if (numer.size() > 1 && numer.at(1)->asScriptInset()) {
                        // this is something like  d^n f(x) / d... or  d^n / d...
                        // FIXME
-                       //n = 1;        
-                       if (numer.size() > 2) 
+                       //n = 1;
+                       if (numer.size() > 2)
                                diff->cell(0) = MathArray(numer.begin() + 2, numer.end());
                        else
                                jt = extractArgument(diff->cell(0), jt, ar.end());
                } else {
                        // simply d f(x) / d... or  d/d...
-                       if (numer.size() > 1) 
+                       if (numer.size() > 1)
                                diff->cell(0) = MathArray(numer.begin() + 1, numer.end());
                        else
                                jt = extractArgument(diff->cell(0), jt, ar.end());
@@ -725,7 +739,7 @@ void write(MathArray const & dat, WriteStream & wi)
                                q->write2(p, wi);
                                ++it;
                                continue;
-                       } 
+                       }
                }
                p->write(wi);
        }
@@ -748,7 +762,7 @@ void octavize(MathArray const & dat, OctaveStream & os)
                if (it + 1 != ar.end()) {
                        if (MathScriptInset const * q = asScript(it)) {
                                q->octavize2(p, os);
-                               ++it;   
+                               ++it;
                                continue;
                        }
                }
@@ -766,7 +780,7 @@ void maplize(MathArray const & dat, MapleStream & os)
                if (it + 1 != ar.end()) {
                        if (MathScriptInset const * q = asScript(it)) {
                                q->maplize2(p, os);
-                               ++it;   
+                               ++it;
                                continue;
                        }
                }
@@ -790,7 +804,7 @@ void mathmlize(MathArray const & dat, MathMLStream & os)
                        if (it + 1 != ar.end()) {
                                if (MathScriptInset const * q = asScript(it)) {
                                        q->mathmlize2(p, os);
-                                       ++it;   
+                                       ++it;
                                        continue;
                                }
                        }
@@ -799,4 +813,3 @@ void mathmlize(MathArray const & dat, MathMLStream & os)
                os << ETag("mrow");
        }
 }
-