]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/MathParser.cpp
Another warning.
[lyx.git] / src / mathed / MathParser.cpp
index bd66b0b5e2ba4b499c835df267f4a1678ffcf15e..4767dc1536cc6ae5bce7de6896307d7e6641902a 100644 (file)
@@ -248,9 +248,11 @@ void delEmptyLastRow(InsetMathGrid & grid)
  */
 bool innerHull(docstring const & name)
 {
+       // For [bB]matrix, [vV]matrix, and pmatrix we can check the suffix only
        return name == "array" || name == "cases" || name == "aligned"
                || name == "alignedat" || name == "gathered" || name == "split"
-               || name == "tabular";
+               || name == "subarray" || name == "tabular" || name == "matrix"
+               || name.substr(1) == "matrix";
 }
 
 
@@ -847,9 +849,16 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags,
                                Token const & n = getToken();
                                if (n.cat() == catMath) {
                                        // TeX's $$...$$ syntax for displayed math
-                                       cell->push_back(MathAtom(new InsetMathHull(buf, hullEquation)));
-                                       parse2(cell->back(), FLAG_SIMPLE, InsetMath::MATH_MODE, false);
-                                       getToken(); // skip the second '$' token
+                                       if (mode == InsetMath::UNDECIDED_MODE) {
+                                               cell->push_back(MathAtom(new InsetMathHull(buf, hullEquation)));
+                                               parse2(cell->back(), FLAG_SIMPLE, InsetMath::MATH_MODE, false);
+                                               getToken(); // skip the second '$' token
+                                       } else {
+                                               // This is not an outer hull and display math is
+                                               // not allowed inside text mode environments.
+                                               error("bad math environment");
+                                               break;
+                                       }
                                } else {
                                        // simple $...$  stuff
                                        putback();
@@ -870,8 +879,19 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags,
                        }
 
                        else {
-                               error("something strange in the parser");
-                               break;
+                               Token const & n = getToken();
+                               if (n.cat() == catMath) {
+                                       error("something strange in the parser");
+                                       break;
+                               } else {
+                                       // This is inline math ($...$), but the parser thinks we are
+                                       // already in math mode and latex would issue an error, unless we
+                                       // are inside a text mode user macro. We have no way to tell, so
+                                       // let's play safe by using \ensuremath, as it will work in any case.
+                                       putback();
+                                       cell->push_back(MathAtom(new InsetMathEnsureMath(buf)));
+                                       parse(cell->back().nucleus()->cell(0), FLAG_SIMPLE, InsetMath::MATH_MODE);
+                               }
                        }
                }
 
@@ -1215,12 +1235,8 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags,
                }
 
                else if (t.cs() == "(") {
-                       if (mode == InsetMath::MATH_MODE) {
-                               error("bad math environment");
-                               break;
-                       }
-                       cell->push_back(MathAtom(new InsetMathHull(buf, hullSimple)));
-                       parse2(cell->back(), FLAG_SIMPLE2, InsetMath::MATH_MODE, false);
+                       cell->push_back(MathAtom(new InsetMathEnsureMath(buf)));
+                       parse(cell->back().nucleus()->cell(0), FLAG_SIMPLE2, InsetMath::MATH_MODE);
                }
 
                else if (t.cs() == "[") {
@@ -1332,7 +1348,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags,
 #endif
 
                else if (t.cs() == "limits" || t.cs() == "nolimits") {
-                       CatCode cat = nextToken().cat();
+                       CatCode const cat = nextToken().cat();
                        if (cat == catSuper || cat == catSub)
                                limits = t.cs() == "limits" ? 1 : -1;
                        else {
@@ -1492,12 +1508,8 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags,
                        }
 
                        else if (name == "math") {
-                               if (mode == InsetMath::MATH_MODE) {
-                                       error("bad math environment");
-                                       break;
-                               }
-                               cell->push_back(MathAtom(new InsetMathHull(buf, hullSimple)));
-                               parse2(cell->back(), FLAG_END, InsetMath::MATH_MODE, true);
+                               cell->push_back(MathAtom(new InsetMathEnsureMath(buf)));
+                               parse(cell->back().nucleus()->cell(0), FLAG_END, InsetMath::MATH_MODE);
                        }
 
                        else if (name == "equation" || name == "equation*"
@@ -1715,6 +1727,14 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags,
                                delEmptyLastRow(subgrid);
                }
 
+               else if (t.cs() == "Diagram") {
+                       odocstringstream os;
+                       while (good() && nextToken().cat() != catBegin)
+                               os << getToken().asInput();
+                       cell->push_back(createInsetMath(t.cs() + os.str(), buf));
+                       parse2(cell->back(), FLAG_ITEM, mode, false);
+               }
+
                else if (t.cs() == "framebox" || t.cs() == "makebox") {
                        cell->push_back(createInsetMath(t.cs(), buf));
                        parse(cell->back().nucleus()->cell(0), FLAG_OPTION, InsetMath::TEXT_MODE);