mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-29 13:04:58 +00:00
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:
parent
da5e4606d1
commit
96f64ac028
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user