From: Georg Baum Date: Sat, 10 Oct 2015 16:58:18 +0000 (+0200) Subject: Fix multicolumn regression (bug #9788) X-Git-Tag: 2.2.0alpha1~249 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=96f64ac028b305707c2876b5503359709e0dc3e7;p=features.git Fix multicolumn regression (bug #9788) The test case did show several problems: - The alignment argument was not parsed correctly if it was not in braces - There one column too much created, since I did not take into account that the current cell must bge replaced by the multicolumn cell - If the last line of an array contained only an empty multicolumn cell, then the complete multicolumn was swallowed - The decision whether to output the column separator & was sometimes wrong for multicolumns --- diff --git a/src/mathed/InsetMathGrid.cpp b/src/mathed/InsetMathGrid.cpp index ae32558361..a9970f440e 100644 --- a/src/mathed/InsetMathGrid.cpp +++ b/src/mathed/InsetMathGrid.cpp @@ -1256,12 +1256,11 @@ void InsetMathGrid::write(WriteStream & os, bool last_eoln = true; for (col_type col = beg_col; col < end_col; ++col) { idx_type const idx = index(row, col); - if (cellinfo_[idx].multi_ == CELL_PART_OF_MULTICOLUMN) - continue; bool const empty_cell = cell(idx).empty(); - if (!empty_cell) + if (!empty_cell || cellinfo_[idx].multi_ != CELL_NORMAL) last_eoln = false; - if (!empty_cell || colinfo_[col + 1].lines_) { + if (!empty_cell || cellinfo_[idx].multi_ != CELL_NORMAL || + colinfo_[col + 1].lines_) { lastcol = col + 1; emptyline = false; } @@ -1284,7 +1283,7 @@ void InsetMathGrid::write(WriteStream & os, ModeSpecifier specifier(os, TEXT_MODE); if (cellinfo_[idx].multi_ == CELL_BEGIN_OF_MULTICOLUMN) os << '}'; - os << eocString(col, lastcol); + os << eocString(col + nccols - 1, lastcol); col += nccols; } eol = eolString(row, os.fragile(), os.latex(), last_eoln); diff --git a/src/mathed/MathParser.cpp b/src/mathed/MathParser.cpp index 0f10aa5ed7..2849b0f80b 100644 --- a/src/mathed/MathParser.cpp +++ b/src/mathed/MathParser.cpp @@ -229,6 +229,8 @@ bool addCol(InsetMathGrid & grid, InsetMathGrid::col_type & cellcol) * \endverbatim * will result in a grid with 3 rows (+ the dummy row that is always present), * because the last '\\' opens a new row. + * Do never delete a row that contains a multicolumn, even if all cells empty, + * since the multicolumn information would get lost otherwise. * Note that this is only needed for inner-hull grid types, such as array * or aligned, but not for outer-hull grid types, such as eqnarray or align. */ @@ -236,7 +238,9 @@ void delEmptyLastRow(InsetMathGrid & grid) { InsetMathGrid::row_type const row = grid.nrows() - 1; for (InsetMathGrid::col_type col = 0; col < grid.ncols(); ++col) { - if (!grid.cell(grid.index(row, col)).empty()) + InsetMathGrid::idx_type const idx = grid.index(row, col); + if (!grid.cell(idx).empty() || + grid.cellinfo(idx).multi_ != InsetMathGrid::CELL_NORMAL) return; } // Copy the row information of the empty row (which would contain the @@ -1385,12 +1389,10 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, error("can't extract number of multicolumn cells"); } // resize the table if necessary - size_t first = 0; - for (int i = 0; i < cols; ++i) { + 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); - if (i == 0) - first = idx; grid.cellinfo(idx).multi_ = InsetMathGrid::CELL_PART_OF_MULTICOLUMN; } @@ -1401,7 +1403,9 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, grid.cellinfo(first).multi_ = InsetMathGrid::CELL_BEGIN_OF_MULTICOLUMN; // read special alignment - grid.cellinfo(first).align_ = parse_verbatim_item(); + 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);