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
This commit is contained in:
Georg Baum 2015-10-10 18:58:18 +02:00
parent da5e4606d1
commit 96f64ac028
2 changed files with 14 additions and 11 deletions

View File

@ -1256,12 +1256,11 @@ void InsetMathGrid::write(WriteStream & os,
bool last_eoln = true; bool last_eoln = true;
for (col_type col = beg_col; col < end_col; ++col) { for (col_type col = beg_col; col < end_col; ++col) {
idx_type const idx = index(row, col); idx_type const idx = index(row, col);
if (cellinfo_[idx].multi_ == CELL_PART_OF_MULTICOLUMN)
continue;
bool const empty_cell = cell(idx).empty(); bool const empty_cell = cell(idx).empty();
if (!empty_cell) if (!empty_cell || cellinfo_[idx].multi_ != CELL_NORMAL)
last_eoln = false; 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; lastcol = col + 1;
emptyline = false; emptyline = false;
} }
@ -1284,7 +1283,7 @@ void InsetMathGrid::write(WriteStream & os,
ModeSpecifier specifier(os, TEXT_MODE); ModeSpecifier specifier(os, TEXT_MODE);
if (cellinfo_[idx].multi_ == CELL_BEGIN_OF_MULTICOLUMN) if (cellinfo_[idx].multi_ == CELL_BEGIN_OF_MULTICOLUMN)
os << '}'; os << '}';
os << eocString(col, lastcol); os << eocString(col + nccols - 1, lastcol);
col += nccols; col += nccols;
} }
eol = eolString(row, os.fragile(), os.latex(), last_eoln); eol = eolString(row, os.fragile(), os.latex(), last_eoln);

View File

@ -229,6 +229,8 @@ bool addCol(InsetMathGrid & grid, InsetMathGrid::col_type & cellcol)
* \endverbatim * \endverbatim
* will result in a grid with 3 rows (+ the dummy row that is always present), * will result in a grid with 3 rows (+ the dummy row that is always present),
* because the last '\\' opens a new row. * 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 * 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. * 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; InsetMathGrid::row_type const row = grid.nrows() - 1;
for (InsetMathGrid::col_type col = 0; col < grid.ncols(); ++col) { 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; return;
} }
// Copy the row information of the empty row (which would contain the // 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"); error("can't extract number of multicolumn cells");
} }
// resize the table if necessary // resize the table if necessary
size_t first = 0; size_t first = grid.index(cellrow, cellcol);
for (int i = 0; i < cols; ++i) { for (int i = 1; i < cols; ++i) {
if (addCol(grid, cellcol)) { if (addCol(grid, cellcol)) {
size_t const idx = grid.index(cellrow, cellcol); size_t const idx = grid.index(cellrow, cellcol);
if (i == 0)
first = idx;
grid.cellinfo(idx).multi_ = grid.cellinfo(idx).multi_ =
InsetMathGrid::CELL_PART_OF_MULTICOLUMN; 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; grid.cellinfo(first).multi_ = InsetMathGrid::CELL_BEGIN_OF_MULTICOLUMN;
// read special alignment // 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 the remaining contents into the "real" cell
parse(*cell, FLAG_ITEM, mode); parse(*cell, FLAG_ITEM, mode);