]> git.lyx.org Git - features.git/commitdiff
Fix dataloss for align env inside math
authorGeorg Baum <baum@lyx.org>
Thu, 27 Feb 2014 20:25:19 +0000 (21:25 +0100)
committerGeorg Baum <baum@lyx.org>
Thu, 27 Feb 2014 20:25:19 +0000 (21:25 +0100)
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.

src/mathed/InsetMathSplit.cpp
src/mathed/InsetMathSplit.h
src/mathed/MathParser.cpp

index 240126d122e2d774f4531ff340baa1ccd64cc499..de4ddc03202f9b5bd86b4d1676494ad15a971419 100644 (file)
@@ -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");
index 0310ce13c492ca6495b8e068a0f7c8697fa11fa3..b0ff437f3ddcc5a2920f24f718024eca9062447a 100644 (file)
@@ -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_;
 };
 
 
index ca66f1c6a58bbfe956b0d2a8dcddbe10c0192b88..1c7f2ff0ad3abc79a452d187f29378c3eb4d7a15 100644 (file)
@@ -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*") {