Wrap rotated cells with linebreaks in varwidth

Fixes: #8085
This commit is contained in:
Juergen Spitzmueller 2018-06-30 14:32:27 +02:00
parent fc9d47f7f4
commit 88e5e5fd34
2 changed files with 30 additions and 6 deletions

View File

@ -264,6 +264,8 @@ string const tostr(Tabular::BoxType const & num)
return "parbox"; return "parbox";
case Tabular::BOX_MINIPAGE: case Tabular::BOX_MINIPAGE:
return "minipage"; return "minipage";
case Tabular::BOX_VARWIDTH:
return "varwidth";
} }
return string(); return string();
} }
@ -326,6 +328,8 @@ bool string2type(string const & str, Tabular::BoxType & num)
num = Tabular::BOX_PARBOX; num = Tabular::BOX_PARBOX;
else if (str == "minipage") else if (str == "minipage")
num = Tabular::BOX_MINIPAGE; num = Tabular::BOX_MINIPAGE;
else if (str == "varwidth")
num = Tabular::BOX_VARWIDTH;
else else
return false; return false;
return true; return true;
@ -1937,12 +1941,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 Tabular::BoxType Tabular::getUsebox(idx_type cell) const
{ {
if ((!column_info[cellColumn(cell)].p_width.zero() && !isMultiColumn(cell)) || if (getRotateCell(cell) == 0
(isMultiColumn(cell) && !cellInfo(cell).p_width.zero())) && ((!column_info[cellColumn(cell)].p_width.zero() && !isMultiColumn(cell)) ||
(isMultiColumn(cell) && !cellInfo(cell).p_width.zero())))
return BOX_NONE; return BOX_NONE;
if (cellInfo(cell).usebox > 1) if (cellInfo(cell).usebox > 1)
return cellInfo(cell).usebox; return cellInfo(cell).usebox;
@ -2487,7 +2490,21 @@ void Tabular::TeXCellPreamble(otexstream & os, idx_type cell,
} }
os << "]{" << from_ascii(getPWidth(cell).asLatexString()) os << "]{" << from_ascii(getPWidth(cell).asLatexString())
<< "}\n"; << "}\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";
}
} }
@ -2503,6 +2520,8 @@ void Tabular::TeXCellPostamble(otexstream & os, idx_type cell,
os << '}'; os << '}';
else if (getUsebox(cell) == BOX_MINIPAGE) else if (getUsebox(cell) == BOX_MINIPAGE)
os << breakln << "\\end{minipage}"; os << breakln << "\\end{minipage}";
else if (getUsebox(cell) == BOX_VARWIDTH)
os << breakln << "\\end{varwidth}";
if (getRotateCell(cell) != 0) if (getRotateCell(cell) != 0)
os << breakln << "\\end{turn}"; os << breakln << "\\end{turn}";
if (ismultirow) if (ismultirow)
@ -3566,6 +3585,8 @@ void Tabular::validate(LaTeXFeatures & features) const
for (idx_type cell = 0; cell < numberofcells; ++cell) { for (idx_type cell = 0; cell < numberofcells; ++cell) {
if (isMultiRow(cell)) if (isMultiRow(cell))
features.require("multirow"); features.require("multirow");
if (getUsebox(cell) == BOX_VARWIDTH)
features.require("varwidth");
if (getVAlignment(cell) != LYX_VALIGN_TOP if (getVAlignment(cell) != LYX_VALIGN_TOP
|| !getPWidth(cell).zero()) || !getPWidth(cell).zero())
features.require("array"); features.require("array");
@ -3588,11 +3609,12 @@ Tabular::BoxType Tabular::useParbox(idx_type cell) const
ParagraphList const & parlist = cellInset(cell)->paragraphs(); ParagraphList const & parlist = cellInset(cell)->paragraphs();
ParagraphList::const_iterator cit = parlist.begin(); ParagraphList::const_iterator cit = parlist.begin();
ParagraphList::const_iterator end = parlist.end(); ParagraphList::const_iterator end = parlist.end();
bool const turned = getRotateCell(cell) != 0;
for (; cit != end; ++cit) for (; cit != end; ++cit)
for (int i = 0; i < cit->size(); ++i) for (int i = 0; i < cit->size(); ++i)
if (cit->isNewline(i)) if (cit->isNewline(i))
return BOX_PARBOX; return turned ? BOX_VARWIDTH : BOX_PARBOX;
return BOX_NONE; return BOX_NONE;
} }

View File

@ -341,7 +341,9 @@ public:
/// ///
BOX_PARBOX = 1, BOX_PARBOX = 1,
/// ///
BOX_MINIPAGE = 2 BOX_MINIPAGE = 2,
///
BOX_VARWIDTH = 3
}; };
enum CaptionType { enum CaptionType {