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();
///
void push_back(Token const & t);
///
- void pop_back();
- ///
Token const & prevToken() const;
///
Token const & nextToken() const;
}
-void Parser::pop_back()
-{
- tokens_.pop_back();
-}
-
-
Token const & Parser::prevToken() const
{
static const Token dummy;
}
-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);
}
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 MathMacroArgument(c - '0')));
+ getToken();
+ } else
+ cell->push_back(MathAtom(new InsetMathHash()));
}
else if (t.cat() == catActive)
}
}
- 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;
+ if (extractNumber(count, cols)) {
+ // 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 MathMacro(buf, t.cs()));
+ cell->push_back(at);
+ cell->push_back(MathAtom(new InsetMathBrace(count)));
+ }
}
else if (t.cs() == "limits" || t.cs() == "nolimits") {
}
}
- else if (t.cs() == "kern") {
+ else if (t.cs() == "kern" || t.cs() == "mkern") {
// FIXME: A hack...
docstring s;
int num_tokens = 0;