X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathParser.cpp;h=fbd08c3931dd9b61fe02a531a6e46dba115e58d7;hb=85e693806e206b24e9fd7d010368fba36a2b9710;hp=1e615d248b38731575fd73b95b4aa490a592dd10;hpb=c737f1cddf7a01d81fa676d15bcd24c967246485;p=lyx.git diff --git a/src/mathed/MathParser.cpp b/src/mathed/MathParser.cpp index 1e615d248b..fbd08c3931 100644 --- a/src/mathed/MathParser.cpp +++ b/src/mathed/MathParser.cpp @@ -51,7 +51,7 @@ following hack as starting point to write some macros: #include "InsetMathEnv.h" #include "InsetMathFrac.h" #include "InsetMathKern.h" -#include "MathMacro.h" +#include "InsetMathMacro.h" #include "InsetMathPar.h" #include "InsetMathRef.h" #include "InsetMathRoot.h" @@ -63,10 +63,10 @@ following hack as starting point to write some macros: #include "InsetMathStackrel.h" #include "InsetMathString.h" #include "InsetMathTabular.h" -#include "MathMacroTemplate.h" +#include "InsetMathMacroTemplate.h" #include "MathExtern.h" #include "MathFactory.h" -#include "MathMacroArgument.h" +#include "InsetMathMacroArgument.h" #include "MathSupport.h" #include "Buffer.h" @@ -401,8 +401,6 @@ public: bool parse1(InsetMathGrid & grid, unsigned flags, mode_type mode, bool numbered); /// - MathData parse(unsigned flags, mode_type mode); - /// int lineno() const { return lineno_; } /// void putback(); @@ -435,8 +433,6 @@ private: /// void push_back(Token const & t); /// - void pop_back(); - /// Token const & prevToken() const; /// Token const & nextToken() const; @@ -501,12 +497,6 @@ void Parser::push_back(Token const & t) } -void Parser::pop_back() -{ - tokens_.pop_back(); -} - - Token const & Parser::prevToken() const { static const Token dummy; @@ -786,14 +776,6 @@ docstring Parser::parse_verbatim_item() } -MathData Parser::parse(unsigned flags, mode_type mode) -{ - MathData ar(buffer_); - parse(ar, flags, mode); - return ar; -} - - bool Parser::parse(MathData & array, unsigned flags, mode_type mode) { InsetMathGrid grid(buffer_, 1, 1); @@ -947,8 +929,13 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, } else if (t.cat() == catParameter) { - Token const & n = getToken(); - cell->push_back(MathAtom(new MathMacroArgument(n.character()-'0'))); + Token const & n = nextToken(); + char_type c = n.character(); + if (c && '0' < c && c <= '9') { + cell->push_back(MathAtom(new InsetMathMacroArgument(c - '0'))); + getToken(); + } else + cell->push_back(MathAtom(new InsetMathHash())); } else if (t.cat() == catActive) @@ -1095,7 +1082,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, if (nextToken().cat() == catBegin) parse(display, FLAG_ITEM, InsetMath::MATH_MODE); - cell->push_back(MathAtom(new MathMacroTemplate(buf, + cell->push_back(MathAtom(new InsetMathMacroTemplate(buf, name, nargs, 0, MacroTypeDef, vector(), def, display))); @@ -1143,7 +1130,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, if (nextToken().cat() == catBegin) parse(display, FLAG_ITEM, InsetMath::MATH_MODE); - cell->push_back(MathAtom(new MathMacroTemplate(buf, + cell->push_back(MathAtom(new InsetMathMacroTemplate(buf, name, nargs, optionals, MacroTypeNewcommand, optionalValues, def, display))); @@ -1264,7 +1251,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, if (nextToken().cat() == catBegin) parse(display, FLAG_ITEM, InsetMath::MATH_MODE); - cell->push_back(MathAtom(new MathMacroTemplate(buf, + cell->push_back(MathAtom(new InsetMathMacroTemplate(buf, name, nargs, optionals, MacroTypeNewcommandx, optionalValues, def, display))); @@ -1380,36 +1367,42 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, } } - else if (t.cs() == "multicolumn") { - // extract column count and insert dummy cells + else if (t.cs() == "multicolumn" && grid.handlesMulticolumn()) { + // if the columns are specified numerically, + // extract column count and insert dummy cells, + // otherwise parse it as an user macro MathData count; parse(count, FLAG_ITEM, mode); - int cols = 1; - if (!extractNumber(count, cols)) { - success_ = false; - error("can't extract number of multicolumn cells"); - } - // resize the table if necessary - size_t first = grid.index(cellrow, cellcol); - for (int i = 1; i < cols; ++i) { - if (addCol(grid, cellcol)) { - size_t const idx = grid.index(cellrow, cellcol); - grid.cellinfo(idx).multi_ = - InsetMathGrid::CELL_PART_OF_MULTICOLUMN; + int cols; + // limit arbitrarily to 100 columns + if (extractNumber(count, cols) && cols > 0 && cols < 100) { + // resize the table if necessary + size_t first = grid.index(cellrow, cellcol); + for (int i = 1; i < cols; ++i) { + if (addCol(grid, cellcol)) { + size_t const idx = grid.index(cellrow, cellcol); + grid.cellinfo(idx).multi_ = + InsetMathGrid::CELL_PART_OF_MULTICOLUMN; + } } - } - // the first cell is the real thing, not a dummy - cell = &grid.cell(first); - grid.cellinfo(first).multi_ = InsetMathGrid::CELL_BEGIN_OF_MULTICOLUMN; + // the first cell is the real thing, not a dummy + cell = &grid.cell(first); + grid.cellinfo(first).multi_ = + InsetMathGrid::CELL_BEGIN_OF_MULTICOLUMN; - // read special alignment - MathData align; - parse(align, FLAG_ITEM, mode); - grid.cellinfo(first).align_ = asString(align); + // read special alignment + MathData align; + parse(align, FLAG_ITEM, mode); + grid.cellinfo(first).align_ = asString(align); - // parse the remaining contents into the "real" cell - parse(*cell, FLAG_ITEM, mode); + // parse the remaining contents into the "real" cell + parse(*cell, FLAG_ITEM, mode); + } else { + MathAtom at = MathAtom(new InsetMathMacro(buf, t.cs())); + cell->push_back(at); + cell->push_back(MathAtom(new InsetMathBrace(count))); + } } else if (t.cs() == "limits" || t.cs() == "nolimits") { @@ -1559,7 +1552,8 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, } else if (t.cs() == "ref" || t.cs() == "eqref" || t.cs() == "prettyref" - || t.cs() == "pageref" || t.cs() == "vpageref" || t.cs() == "vref") { + || t.cs() == "nameref" || t.cs() == "pageref" + || t.cs() == "vpageref" || t.cs() == "vref") { cell->push_back(MathAtom(new InsetMathRef(buf, t.cs()))); docstring const opt = parse_verbatim_option(); docstring const ref = parse_verbatim_item(); @@ -1764,7 +1758,8 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, else { success_ = false; - if (!(mode_ & Parse::QUIET)) { + if (!(mode_ & Parse::QUIET) && + !(mode_ & Parse::TRACKMACRO)) { dump(); lyxerr << "found unknown math environment '" << to_utf8(name) << "'" << endl; @@ -1775,7 +1770,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, } } - else if (t.cs() == "kern") { + else if (t.cs() == "kern" || t.cs() == "mkern") { // FIXME: A hack... docstring s; int num_tokens = 0; @@ -1793,7 +1788,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, break; } if (s.empty()) - cell->push_back(MathAtom(new InsetMathKern)); + cell->push_back(MathAtom(new InsetMathMacro(buf, t.cs()))); else cell->push_back(MathAtom(new InsetMathKern(s))); } @@ -1805,6 +1800,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, asArray(label, ar); if (grid.asHullInset()) { grid.asHullInset()->label(cellrow, label); + grid.asHullInset()->numbered(cellrow, true); } else { cell->push_back(createInsetMath(t.cs(), buf)); cell->push_back(MathAtom(new InsetMathBrace(ar))); @@ -1902,7 +1898,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, else { // Since the Length class cannot use length variables // we must not create an InsetMathSpace. - cell->push_back(MathAtom(new MathMacro(buf, name))); + cell->push_back(MathAtom(new InsetMathMacro(buf, name))); MathData ar; mathed_parse_cell(ar, '{' + arg + '}', mode_); cell->append(ar); @@ -1921,7 +1917,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode); } else { docstring const arg = parse_verbatim_item(); - cell->push_back(MathAtom(new MathMacro(buf, t.cs()))); + cell->push_back(MathAtom(new InsetMathMacro(buf, t.cs()))); MathData ar; mathed_parse_cell(ar, '[' + opt + ']', mode_); cell->append(ar); @@ -2005,7 +2001,10 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, new InsetMathBig(t.cs(), delim))); else { cell->push_back(createInsetMath(t.cs(), buf)); - putback(); + // For some reason delim.empty() + // is always false here + if (delim.at(0)) + putback(); } } @@ -2103,7 +2102,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, } if (!is_unicode_symbol) { MathAtom at = is_user_macro ? - MathAtom(new MathMacro(buf, t.cs())) + MathAtom(new InsetMathMacro(buf, t.cs())) : createInsetMath(t.cs(), buf); InsetMath::mode_type m = mode; //if (m == InsetMath::UNDECIDED_MODE)