commit 5dedf8005dfd4ba53cbb44ad94b540c4ed670493
Author: Georg Baum <[email protected]>
Date:   Thu Feb 27 21:25:19 2014 +0100

    Fix dataloss for align env inside math
    
    The math parser aborts with an error message on \begin{align} and
    \begin{align*} if this is not the hull inset. This is now fixed, however
    this is not complete support for these two environments (the GUI does not
    respect the numbering). It is only the minimal fix that ensures that no data
    loss occurs for documents imported by tex2lyx.

diff --git a/src/mathed/InsetMathSplit.cpp b/src/mathed/InsetMathSplit.cpp
index 240126d..de4ddc0 100644
--- a/src/mathed/InsetMathSplit.cpp
+++ b/src/mathed/InsetMathSplit.cpp
@@ -32,9 +32,12 @@ namespace lyx {
 using support::bformat;
 
 
+// FIXME: handle numbers in gui, currently they are only read and written
+
 InsetMathSplit::InsetMathSplit(Buffer * buf, docstring const & name,
-       char valign)
-       : InsetMathGrid(buf, 1, 1, valign, docstring()), name_(name)
+       char valign, bool numbered)
+       : InsetMathGrid(buf, 1, 1, valign, docstring()), name_(name),
+         numbered_(numbered)
 {
 }
 
@@ -51,7 +54,7 @@ char InsetMathSplit::defaultColAlign(col_type col)
                return 'l';
        if (name_ == "gathered")
                return 'c';
-       if (name_ == "aligned")
+       if (name_ == "aligned" || name_ == "align")
                return (col & 1) ? 'l' : 'r';
        if (name_ == "alignedat")
                return (col & 1) ? 'l' : 'r';
@@ -97,15 +100,18 @@ void InsetMathSplit::write(WriteStream & ws) const
        MathEnsurer ensurer(ws);
        if (ws.fragile())
                ws << "\\protect";
-       ws << "\\begin{" << name_ << '}';
-       if (name_ != "split" && verticalAlignment() != 'c')
+       docstring suffix;
+       if (!numbered_ && name_ == "align")
+               suffix = from_ascii("*");
+       ws << "\\begin{" << name_ << suffix << '}';
+       if (name_ != "split" && name_ != "align" && verticalAlignment() != 'c')
                ws << '[' << verticalAlignment() << ']';
        if (name_ == "alignedat")
                ws << '{' << static_cast<unsigned int>((ncols() + 1)/2) << '}';
        InsetMathGrid::write(ws);
        if (ws.fragile())
                ws << "\\protect";
-       ws << "\\end{" << name_ << "}\n";
+       ws << "\\end{" << name_ << suffix << "}\n";
 }
 
 
@@ -113,7 +119,10 @@ void InsetMathSplit::infoize(odocstream & os) const
 {
        docstring name = name_;
        name[0] = support::uppercase(name[0]);
-       os << name << ' ';
+       if (name_ == "align" && !numbered_)
+               os << name << "* ";
+       else
+               os << name << ' ';
 }
 
 
@@ -127,6 +136,7 @@ void InsetMathSplit::mathmlize(MathStream & ms) const
        // it's not clear how to do that without copying a lot of code.
        // One idea would be to wrap the table in an <mrow>, and set the
        // alignment there via CSS.
+       // FIXME how to handle numbered and unnumbered align?
        InsetMathGrid::mathmlize(ms);
 }
 
@@ -138,6 +148,7 @@ void InsetMathSplit::htmlize(HtmlStream & ms) const
        // special treatment.
        // FIXME
        // lgathered and rgathered could use the proper alignment.
+       // FIXME how to handle numbered and unnumbered align?
        InsetMathGrid::htmlize(ms);
 }
 
@@ -145,7 +156,7 @@ void InsetMathSplit::htmlize(HtmlStream & ms) const
 void InsetMathSplit::validate(LaTeXFeatures & features) const
 {
        if (name_ == "split" || name_ == "gathered" || name_ == "aligned" ||
-           name_ == "alignedat")
+           name_ == "alignedat" || name_ == "align")
                features.require("amsmath");
        else if (name_ == "lgathered" || name_ == "rgathered")
                features.require("mathtools");
diff --git a/src/mathed/InsetMathSplit.h b/src/mathed/InsetMathSplit.h
index 0310ce1..b0ff437 100644
--- a/src/mathed/InsetMathSplit.h
+++ b/src/mathed/InsetMathSplit.h
@@ -22,7 +22,7 @@ class InsetMathSplit : public InsetMathGrid {
 public:
        ///
        explicit InsetMathSplit(Buffer * buf, docstring const & name,
-               char valign = 'c');
+               char valign = 'c', bool numbered = false);
        ///
        void draw(PainterInfo & pi, int x, int y) const;
        ///
@@ -50,6 +50,8 @@ private:
        virtual Inset * clone() const;
        ///
        docstring name_;
+       ///
+       bool numbered_;
 };
 
 
diff --git a/src/mathed/MathParser.cpp b/src/mathed/MathParser.cpp
index ca66f1c..1c7f2ff 100644
--- a/src/mathed/MathParser.cpp
+++ b/src/mathed/MathParser.cpp
@@ -1603,14 +1603,14 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned 
flags,
                        }
 
                        else if (name == "align" || name == "align*") {
-                               if (mode != InsetMath::UNDECIDED_MODE) {
-                                       // FIXME this is wrong: amsmath supports
-                                       //       align* inside gather, see 
testmath.tex.
-                                       error("bad math environment " + name);
-                                       break;
+                               if (mode == InsetMath::UNDECIDED_MODE) {
+                                       cell->push_back(MathAtom(new 
InsetMathHull(buf, hullAlign)));
+                                       parse2(cell->back(), FLAG_END, 
InsetMath::MATH_MODE, !stared(name));
+                               } else {
+                                       cell->push_back(MathAtom(new 
InsetMathSplit(buf, name,
+                                                       'c', !stared(name))));
+                                       parse2(cell->back(), FLAG_END, mode, 
!stared(name));
                                }
-                               cell->push_back(MathAtom(new InsetMathHull(buf, 
hullAlign)));
-                               parse2(cell->back(), FLAG_END, 
InsetMath::MATH_MODE, !stared(name));
                        }
 
                        else if (name == "flalign" || name == "flalign*") {

Reply via email to