Do not output deleted rows columns if show changes in output is false

This commit is contained in:
Juergen Spitzmueller 2020-01-14 13:03:12 +01:00
parent 78ac0b4266
commit 66c5d055e7
2 changed files with 53 additions and 17 deletions

View File

@ -1647,7 +1647,7 @@ int Tabular::textVOffset(idx_type cell) const
} }
Tabular::idx_type Tabular::getFirstCellInRow(row_type row) const Tabular::idx_type Tabular::getFirstCellInRow(row_type row, bool const ct) const
{ {
col_type c = 0; col_type c = 0;
idx_type const numcells = numberOfCellsInRow(row); idx_type const numcells = numberOfCellsInRow(row);
@ -1656,26 +1656,52 @@ Tabular::idx_type Tabular::getFirstCellInRow(row_type row) const
// is really invalid, i.e., it is NOT the first cell in the row. but // is really invalid, i.e., it is NOT the first cell in the row. but
// i do not know what to do here. (rgh) // i do not know what to do here. (rgh)
while (c < numcells - 1 while (c < numcells - 1
&& cell_info[row][c].multirow == CELL_PART_OF_MULTIROW) && (cell_info[row][c].multirow == CELL_PART_OF_MULTIROW
|| (ct && column_info[c].change.deleted())))
++c; ++c;
return cell_info[row][c].cellno; return cell_info[row][c].cellno;
} }
Tabular::idx_type Tabular::getLastCellInRow(row_type row) const Tabular::idx_type Tabular::getLastCellInRow(row_type row, bool const ct) const
{ {
col_type c = ncols() - 1; col_type c = ncols() - 1;
// of course we check against 0 so we don't crash. but we have the same // of course we check against 0 so we don't crash. but we have the same
// problem as in the previous routine: if all the cells are part of a // problem as in the previous routine: if all the cells are part of a
// multirow or part of a multi column, then our return value is invalid. // multirow or part of a multi column, then our return value is invalid.
while (c > 0 while (c > 0
&& (cell_info[row][c].multirow == CELL_PART_OF_MULTIROW && ((cell_info[row][c].multirow == CELL_PART_OF_MULTIROW
|| cell_info[row][c].multicolumn == CELL_PART_OF_MULTICOLUMN)) || cell_info[row][c].multicolumn == CELL_PART_OF_MULTICOLUMN)
|| (ct && column_info[c].change.deleted())))
--c; --c;
return cell_info[row][c].cellno; return cell_info[row][c].cellno;
} }
Tabular::row_type Tabular::getFirstRow(bool const ct) const
{
row_type r = 0;
if (!ct)
return r;
// exclude deleted rows if ct == true
while (r < nrows() && row_info[r].change.deleted())
++r;
return r;
}
Tabular::row_type Tabular::getLastRow(bool const ct) const
{
row_type r = nrows() - 1;
if (!ct)
return r;
// exclude deleted rows if ct == true
while (r > 0 && row_info[r].change.deleted())
--r;
return r;
}
Tabular::row_type Tabular::cellRow(idx_type cell) const Tabular::row_type Tabular::cellRow(idx_type cell) const
{ {
if (cell >= numberofcells) if (cell >= numberofcells)
@ -2497,15 +2523,16 @@ void Tabular::TeXTopHLine(otexstream & os, row_type row, list<col_type> columns)
} }
// do nothing if empty first row, or incomplete row line after // do nothing if empty first row, or incomplete row line after
if ((row == 0 && nset == 0) || (row > 0 && nset != ncols())) row_type first = getFirstRow(!buffer().params().output_changes);
if ((row == first && nset == 0) || (row > first && nset != columns.size()))
return; return;
// Is this the actual first row (excluding longtable caption row)? // Is this the actual first row (excluding longtable caption row)?
bool const realfirstrow = (row == 0 bool const realfirstrow = (row == first
|| (is_long_tabular && row == 1 && ltCaption(0))); || (is_long_tabular && row == first + 1 && ltCaption(first)));
// only output complete row lines and the 1st row's clines // only output complete row lines and the 1st row's clines
if (nset == ncols() && !have_trims) { if (nset == columns.size() && !have_trims) {
if (use_booktabs) { if (use_booktabs) {
os << (realfirstrow ? "\\toprule " : "\\midrule "); os << (realfirstrow ? "\\toprule " : "\\midrule ");
} else { } else {
@ -2557,7 +2584,7 @@ void Tabular::TeXTopHLine(otexstream & os, row_type row, list<col_type> columns)
if (!trim.empty()) if (!trim.empty())
os << "(" << trim << ")"; os << "(" << trim << ")";
os << "{" << firstcol << '-' << lastcol << "}"; os << "{" << firstcol << '-' << lastcol << "}";
if (c == ncols() - 1) if (c == columns.size() - 1)
break; break;
++c; ++c;
} }
@ -2573,7 +2600,7 @@ void Tabular::TeXBottomHLine(otexstream & os, row_type row, list<col_type> colum
// if the latter do not span the whole tabular // if the latter do not span the whole tabular
// get the bottomlines of row r, and toplines in next row // get the bottomlines of row r, and toplines in next row
bool lastrow = row == nrows() - 1; bool lastrow = row == getLastRow(!buffer().params().output_changes);
map<col_type, bool> bottomline, topline, topltrims, toprtrims, bottomltrims, bottomrtrims; map<col_type, bool> bottomline, topline, topltrims, toprtrims, bottomltrims, bottomrtrims;
bool nextrowset = true; bool nextrowset = true;
for (auto const & c : columns) { for (auto const & c : columns) {
@ -2626,10 +2653,10 @@ void Tabular::TeXBottomHLine(otexstream & os, row_type row, list<col_type> colum
} }
// do nothing if empty, OR incomplete row line with a topline in next row // do nothing if empty, OR incomplete row line with a topline in next row
if (nset == 0 || (nextrowset && nset != ncols())) if (nset == 0 || (nextrowset && nset != columns.size()))
return; return;
if (nset == ncols() && !have_trims) { if (nset == columns.size() && !have_trims) {
if (use_booktabs) if (use_booktabs)
os << (lastrow ? "\\bottomrule" : "\\midrule"); os << (lastrow ? "\\bottomrule" : "\\midrule");
else else
@ -2682,7 +2709,7 @@ void Tabular::TeXBottomHLine(otexstream & os, row_type row, list<col_type> colum
if (!trim.empty()) if (!trim.empty())
os << "(" << trim << ")"; os << "(" << trim << ")";
os << "{" << firstcol << '-' << lastcol << "}"; os << "{" << firstcol << '-' << lastcol << "}";
if (c == ncols() - 1) if (c == columns.size() - 1)
break; break;
++c; ++c;
} }
@ -3003,8 +3030,9 @@ void Tabular::TeXRow(otexstream & os, row_type row,
bool const bidi_rtl = bool const bidi_rtl =
runparams.local_font->isRightToLeft() runparams.local_font->isRightToLeft()
&& runparams.useBidiPackage(); && runparams.useBidiPackage();
bool const ct = !buffer().params().output_changes;
idx_type lastcell = idx_type lastcell =
bidi_rtl ? getFirstCellInRow(row) : getLastCellInRow(row); bidi_rtl ? getFirstCellInRow(row, ct) : getLastCellInRow(row, ct);
for (auto const & c : columns) { for (auto const & c : columns) {
if (isPartOfMultiColumn(row, c)) if (isPartOfMultiColumn(row, c))
@ -3175,6 +3203,8 @@ void Tabular::latex(otexstream & os, OutputParams const & runparams) const
&& runparams.useBidiPackage(); && runparams.useBidiPackage();
list<col_type> columns; list<col_type> columns;
for (col_type cl = 0; cl < ncols(); ++cl) { for (col_type cl = 0; cl < ncols(); ++cl) {
if (!buffer().params().output_changes && column_info[cl].change.deleted())
continue;
if (bidi_rtl) if (bidi_rtl)
columns.push_front(cl); columns.push_front(cl);
else else
@ -3400,6 +3430,8 @@ void Tabular::latex(otexstream & os, OutputParams const & runparams) const
//+--------------------------------------------------------------------- //+---------------------------------------------------------------------
for (row_type r = 0; r < nrows(); ++r) { for (row_type r = 0; r < nrows(); ++r) {
if (!buffer().params().output_changes && row_info[r].change.deleted())
continue;
if (isValidRow(r)) { if (isValidRow(r)) {
TeXRow(os, r, runparams, columns); TeXRow(os, r, runparams, columns);
if (is_long_tabular && row_info[r].newpage) if (is_long_tabular && row_info[r].newpage)

View File

@ -555,9 +555,13 @@ public:
/// ///
void insertColumn(col_type column, bool copy); void insertColumn(col_type column, bool copy);
/// ///
idx_type getFirstCellInRow(row_type row) const; idx_type getFirstCellInRow(row_type row, bool const ct = false) const;
/// ///
idx_type getLastCellInRow(row_type row) const; idx_type getLastCellInRow(row_type row, bool const ct = false) const;
///
idx_type getFirstRow(bool const ct = false) const;
///
idx_type getLastRow(bool const ct = false) const;
/// ///
idx_type numberOfCellsInRow(row_type row) const; idx_type numberOfCellsInRow(row_type row) const;
/// ///