]> git.lyx.org Git - features.git/blobdiff - src/insets/InsetTabular.cpp
Fix toprule with booktabs/longtable and captions
[features.git] / src / insets / InsetTabular.cpp
index 5122e8fab757519edeb2d71db6165f7fa0e87ef9..c70207419126a5facc4388f4a2aa875c4ed3aae3 100644 (file)
@@ -2419,14 +2419,18 @@ void Tabular::TeXTopHLine(otexstream & os, row_type row, string const & lang,
        if ((row == 0 && nset == 0) || (row > 0 && nset != ncols()))
                return;
 
+       // Is this the actual first row (excluding longtable caption row)?
+       bool const realfirstrow = (row == 0
+                                  || (is_long_tabular && row == 1 && ltCaption(0)));
+
        // only output complete row lines and the 1st row's clines
        if (nset == ncols() && !have_trims) {
                if (use_booktabs) {
-                       os << (row == 0 ? "\\toprule " : "\\midrule ");
+                       os << (realfirstrow ? "\\toprule " : "\\midrule ");
                } else {
                        os << "\\hline ";
                }
-       } else if (row == 0 || have_trims) {
+       } else if (realfirstrow || have_trims) {
                string const cline = use_booktabs ? "\\cmidrule" : "\\cline";
                for (auto & c : columns) {
                        if (topline.find(c)->second) {
@@ -4431,7 +4435,9 @@ void InsetTabular::drawCellLines(PainterInfo & pi, int x, int y,
        // Top
        bool drawline = tabular.topLine(cell)
                || (row > 0 && tabular.bottomLine(tabular.cellAbove(cell)));
-       bool heavy = tabular.use_booktabs && row == 0 && tabular.rowTopLine(row);
+       bool heavy = tabular.use_booktabs
+                       && (row == 0 || (tabular.is_long_tabular && row == 1 && tabular.ltCaption(0)))
+                       && tabular.rowTopLine(row);
        if (tabular.topLineTrim(cell).first
            || (row > 0 && tabular.bottomLineTrim(tabular.cellIndex(row - 1, col)).first))
                lt = 10;
@@ -6997,20 +7003,26 @@ bool InsetTabular::insertPlaintextString(BufferView & bv, docstring const & buf,
        }
 
        size_t op = 0;
-       idx_type const cells = loctab->numberofcells;
+       idx_type cells = loctab->numberofcells;
        p = 0;
        cols = ocol;
        rows = loctab->nrows();
-       col_type const columns = loctab->ncols();
+       col_type columns = loctab->ncols();
 
-       while (cell < cells && p < len && row < rows &&
+       while (p < len &&
               (p = buf.find_first_of(from_ascii("\t\n"), p)) != docstring::npos)
        {
                if (p >= len)
                        break;
                switch (buf[p]) {
                case '\t':
-                       // we can only set this if we are not too far right
+                       // append column if necessary
+                       if (cols == columns) {
+                               loctab->appendColumn(cols - 1);
+                               columns = loctab->ncols();
+                               cells = loctab->numberofcells;
+                               ++cell;
+                       }
                        if (cols < columns) {
                                shared_ptr<InsetTableCell> inset = loctab->cellInset(cell);
                                Font const font = bv.textMetrics(&inset->text()).
@@ -7032,6 +7044,12 @@ bool InsetTabular::insertPlaintextString(BufferView & bv, docstring const & buf,
                        }
                        cols = ocol;
                        ++row;
+                       // append row if necessary
+                       if (row == rows && p < len - 1) {
+                               loctab->appendRow(row - 1);
+                               rows = loctab->nrows();
+                               cells = loctab->numberofcells;
+                       }
                        if (row < rows)
                                cell = loctab->cellIndex(row, cols);
                        break;