From f6a8810d9df7288a6b818cab444ac1f6fa884852 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Sat, 30 Jun 2018 14:32:27 +0200 Subject: [PATCH] Wrap rotated cells with linebreaks in varwidth Fixes: #8085 (cherry picked from commit 88e5e5fd345c280b0927ad84785657cbc9e55f77) --- src/insets/InsetTabular.cpp | 32 +++++++++++++++++++++++++++----- src/insets/InsetTabular.h | 4 +++- status.23x | 2 ++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index 7ca111c9d4..3d69ed90c8 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -263,6 +263,8 @@ string const tostr(Tabular::BoxType const & num) return "parbox"; case Tabular::BOX_MINIPAGE: return "minipage"; + case Tabular::BOX_VARWIDTH: + return "varwidth"; } return string(); } @@ -325,6 +327,8 @@ bool string2type(string const & str, Tabular::BoxType & num) num = Tabular::BOX_PARBOX; else if (str == "minipage") num = Tabular::BOX_MINIPAGE; + else if (str == "varwidth") + num = Tabular::BOX_VARWIDTH; else return false; return true; @@ -1916,12 +1920,11 @@ void Tabular::setUsebox(idx_type cell, BoxType type) } -// FIXME: Remove this routine because we cannot insert \parboxes when the user -// adds line breaks, see bug 4886. Tabular::BoxType Tabular::getUsebox(idx_type cell) const { - if ((!column_info[cellColumn(cell)].p_width.zero() && !isMultiColumn(cell)) || - (isMultiColumn(cell) && !cellInfo(cell).p_width.zero())) + if (getRotateCell(cell) == 0 + && ((!column_info[cellColumn(cell)].p_width.zero() && !isMultiColumn(cell)) || + (isMultiColumn(cell) && !cellInfo(cell).p_width.zero()))) return BOX_NONE; if (cellInfo(cell).usebox > 1) return cellInfo(cell).usebox; @@ -2454,7 +2457,21 @@ void Tabular::TeXCellPreamble(otexstream & os, idx_type cell, } os << "]{" << from_ascii(getPWidth(cell).asLatexString()) << "}\n"; + } else if (getUsebox(cell) == BOX_VARWIDTH) { + os << "\\begin{varwidth}["; + switch (valign) { + case LYX_VALIGN_TOP: + os << 't'; + break; + case LYX_VALIGN_MIDDLE: + os << 'm'; + break; + case LYX_VALIGN_BOTTOM: + os << 'b'; + break; } + os << "]{\\linewidth}\n"; +} } @@ -2470,6 +2487,8 @@ void Tabular::TeXCellPostamble(otexstream & os, idx_type cell, os << '}'; else if (getUsebox(cell) == BOX_MINIPAGE) os << breakln << "\\end{minipage}"; + else if (getUsebox(cell) == BOX_VARWIDTH) + os << breakln << "\\end{varwidth}"; if (getRotateCell(cell) != 0) os << breakln << "\\end{turn}"; if (ismultirow) @@ -3444,6 +3463,8 @@ void Tabular::validate(LaTeXFeatures & features) const for (idx_type cell = 0; cell < numberofcells; ++cell) { if (isMultiRow(cell)) features.require("multirow"); + if (getUsebox(cell) == BOX_VARWIDTH) + features.require("varwidth"); if (getVAlignment(cell) != LYX_VALIGN_TOP || !getPWidth(cell).zero()) features.require("array"); @@ -3466,11 +3487,12 @@ Tabular::BoxType Tabular::useParbox(idx_type cell) const ParagraphList const & parlist = cellInset(cell)->paragraphs(); ParagraphList::const_iterator cit = parlist.begin(); ParagraphList::const_iterator end = parlist.end(); + bool const turned = getRotateCell(cell) != 0; for (; cit != end; ++cit) for (int i = 0; i < cit->size(); ++i) if (cit->isNewline(i)) - return BOX_PARBOX; + return turned ? BOX_VARWIDTH : BOX_PARBOX; return BOX_NONE; } diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h index bdd21aff4e..605815aa03 100644 --- a/src/insets/InsetTabular.h +++ b/src/insets/InsetTabular.h @@ -339,7 +339,9 @@ public: /// BOX_PARBOX = 1, /// - BOX_MINIPAGE = 2 + BOX_MINIPAGE = 2, + /// + BOX_VARWIDTH = 3 }; enum CaptionType { diff --git a/status.23x b/status.23x index 8ad20bc562..60faa62eb4 100644 --- a/status.23x +++ b/status.23x @@ -17,6 +17,8 @@ What's new - Add support for non-ASCII characters in hyperlinks (bug 11165). +- Support rotated table cells with linebreaks (bug 8085). + * MISCELLANEOUS -- 2.39.5