]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_scriptinset.C
make \newcommand{\bb}[1]{\mathbf{#1}} work for read/write/display.
[lyx.git] / src / mathed / math_scriptinset.C
index a66ec9c67624912ff435eb340c65745d484e0484..5c5aa5c7e3c79acc4379e31763da7e77b5df7bcb 100644 (file)
@@ -1,20 +1,13 @@
-
-#include <config.h>
-#include "Lsstream.h"
-
-#include "debug.h"
-#include "support.h"
-#include "support/LOstream.h"
-#include "support/LAssert.h"
-
 #ifdef __GNUG__
 #pragma implementation
 #endif
 
 #include "math_scriptinset.h"
-
-using std::ostream;
-using std::ostringstream;
+#include "math_support.h"
+#include "math_symbolinset.h"
+#include "math_mathmlstream.h"
+#include "support/LAssert.h"
+#include "debug.h"
 
 
 MathScriptInset::MathScriptInset()
@@ -113,37 +106,37 @@ int MathScriptInset::dy1(MathInset const * nuc) const
 int MathScriptInset::dx0(MathInset const * nuc) const
 {
        lyx::Assert(hasDown());
-       return hasLimits(nuc) ? (width(nuc) - down().width()) / 2 : nwid(nuc);
+       return hasLimits(nuc) ? (width2(nuc) - down().width()) / 2 : nwid(nuc);
 }
 
 
 int MathScriptInset::dx1(MathInset const * nuc) const
 {
        lyx::Assert(hasUp());
-       return hasLimits(nuc) ? (width(nuc) - up().width()) / 2 : nwid(nuc);
+       return hasLimits(nuc) ? (width2(nuc) - up().width()) / 2 : nwid(nuc);
 }
 
 
 int MathScriptInset::dxx(MathInset const * nuc) const
 {
        //lyx::Assert(nuc());
-       return hasLimits(nuc)  ?  (width(nuc) - nwid(nuc)) / 2  :  0;
+       return hasLimits(nuc)  ?  (width2(nuc) - nwid(nuc)) / 2  :  0;
 }
 
 
-int MathScriptInset::ascent(MathInset const * nuc) const
+int MathScriptInset::ascent2(MathInset const * nuc) const
 {
        return dy1(nuc) + (hasUp() ? up().ascent() : 0);
 }
 
 
-int MathScriptInset::descent(MathInset const * nuc) const
+int MathScriptInset::descent2(MathInset const * nuc) const
 {
        return dy0(nuc) + (hasDown() ? down().descent() : 0);
 }
 
 
-int MathScriptInset::width(MathInset const * nuc) const
+int MathScriptInset::width2(MathInset const * nuc) const
 {
        int wid = 0;
        if (hasLimits(nuc)) {
@@ -197,10 +190,9 @@ void MathScriptInset::metrics(MathInset const * nuc,
        MathNestInset::metrics(mi);
        if (nuc)
                nuc->metrics(mi);
-
-       ascent_  = ascent(nuc);
-       descent_ = descent(nuc);
-       width_   = width(nuc);
+       ascent_  = ascent2(nuc);
+       descent_ = descent2(nuc);
+       width_   = width2(nuc);
 }
 
 
@@ -227,75 +219,27 @@ void MathScriptInset::draw(MathInset const * nuc, Painter & pain,
 }
 
 
-void MathScriptInset::write(MathWriteInfo & os) const
-{  
-       //lyxerr << "unexpected call to MathScriptInset::write()\n";
-       write(0, os);
-}
-
-
-void MathScriptInset::write(MathInset const * nuc, MathWriteInfo & os) const
-{
-       if (nuc) {
-               nuc->write(os);
-               if (nuc->takesLimits()) {
-                       if (limits_ == -1)
-                               os << "\\nolimits ";
-                       if (limits_ == 1)
-                               os << "\\limits ";
-               }
-       }
-       else
-               os << "{}";
-
-       if (hasDown() && down().data_.size())
-               os << "_{" << down().data_ << '}';
-
-       if (hasUp() && up().data_.size())
-               os << "^{" << up().data_ << '}';
-}
-
-
-void MathScriptInset::writeNormal(ostream & os) const
-{  
-       //lyxerr << "unexpected call to MathScriptInset::writeNormal()\n";
-       writeNormal(0, os);
-}
-
-
-void MathScriptInset::writeNormal(MathInset const * nuc, ostream & os) const
+bool MathScriptInset::hasLimits(MathInset const * nuc) const
 {
-       bool d = hasDown() && down().data_.size();
-       bool u = hasUp() && up().data_.size();
-
-       ostringstream osb;
-       if (nuc)
-               nuc->writeNormal(osb);
-       else
-               osb << "[par]";
-       string base = osb.str();
-
-       if (u && d) {
-               os << "[sup [sub " << osb.str() << " ";
-               down().data_.writeNormal(os);
-               os << "] ";
-               up().data_.writeNormal(os);
-               os << ']';
-       } else if (u) {
-               os << "[sup " << osb.str() << " ";
-               up().data_.writeNormal(os);
-               os << ']';
-       } else if (d) {
-               os << "[sub " << osb.str() << " ";
-               down().data_.writeNormal(os);
-               os << ']';
-       }
-}
+       // obviuos cases
+       if (limits_ == 1)
+               return true;
+       if (limits_ == -1)
+               return false;
 
+       // we can only display limits if the nucleus wants some 
+       if (!nuc)
+               return false;
+       if (!nuc->isScriptable())
+               return false;
+       
+       // per default \int has limits beside the \int even in displayed formulas
+       if (nuc->asSymbolInset())
+               if (nuc->asSymbolInset()->name().find("int") != string::npos)
+                       return false;
 
-bool MathScriptInset::hasLimits(MathInset const * nuc) const
-{
-       return limits_ == 1 || (limits_ == 0 && nuc && nuc->isScriptable());
+       // assume "real" limits for everything else
+       return true;
 }
 
 
@@ -346,3 +290,111 @@ bool MathScriptInset::idxLeft(MathInset::idx_type &,
 }
 
 
+void MathScriptInset::write(WriteStream & os) const
+{  
+       //lyxerr << "unexpected call to MathScriptInset::write()\n";
+       write2(0, os);
+}
+
+
+void MathScriptInset::write2(MathInset const * nuc, WriteStream & os) const
+{
+       if (nuc) {
+               os << nuc;
+               if (nuc->takesLimits()) {
+                       if (limits_ == -1)
+                               os << "\\nolimits ";
+                       if (limits_ == 1)
+                               os << "\\limits ";
+               }
+       } else
+                       if (os.firstitem())
+                               lyxerr << "suppressing {} \n";
+                       else
+                               os << "{}";
+
+       if (hasDown() && down().data_.size())
+               os << "_{" << down().data_ << '}';
+
+       if (hasUp() && up().data_.size())
+               os << "^{" << up().data_ << '}';
+}
+
+
+void MathScriptInset::normalize(NormalStream & os) const
+{  
+       //lyxerr << "unexpected call to MathScriptInset::normalize()\n";
+       normalize2(0, os);
+}
+
+
+void MathScriptInset::normalize2(MathInset const * nuc, NormalStream & os) const
+{
+       bool d = hasDown() && down().data_.size();
+       bool u = hasUp() && up().data_.size();
+
+       if (u) 
+               os << "[sup ";
+       if (d)
+               os << "[sub ";
+       
+       if (nuc)
+               os << nuc << ' ';
+       else
+               os << "[par]";
+
+       if (d)
+               os << down().data_ << ']';
+       if (u) 
+               os << up().data_ << ']';
+}
+
+
+void MathScriptInset::maplize2(MathInset const * nuc, MapleStream & os) const
+{
+       if (nuc)
+               os << nuc;
+       if (hasDown() && down().data_.size())
+               os << '[' << down().data_ << ']';
+       if (hasUp() && up().data_.size())
+               os << "^(" << up().data_ << ')';
+}
+
+
+void MathScriptInset::mathmlize2(MathInset const * nuc, MathMLStream & os) const
+{
+       bool d = hasDown() && down().data_.size();
+       bool u = hasUp() && up().data_.size();
+
+       if (u && d)
+               os << MTag("msubsup");
+       else if (u)
+               os << MTag("msup");
+       else if (d)
+               os << MTag("msub");
+
+       if (nuc)
+               os << nuc;
+       else
+               os << "<mrow/>";
+
+       if (u && d)
+               os << down().data_ << up().data_ << ETag("msubsup");
+       else if (u)
+               os << up().data_ << ETag("msup");
+       else if (d)
+               os << down().data_ << ETag("msub");
+}
+
+
+void MathScriptInset::octavize2(MathInset const * nuc, OctaveStream & os) const
+{
+       if (nuc)
+               os << nuc;
+       if (hasDown() && down().data_.size())
+               os << '[' << down().data_ << ']';
+       if (hasUp() && up().data_.size())
+               os << "^(" << up().data_ << ')';
+}
+
+