Add support for rotated longtabulars (via [pdf]lscape)

Fixes: #9194

See #9194 for why we use an earlier file format change here.
This commit is contained in:
Juergen Spitzmueller 2018-04-18 13:22:29 +02:00
parent a714f6cb76
commit feab528fd1
6 changed files with 126 additions and 15 deletions

View File

@ -338,6 +338,7 @@
\TestPackage{listings}
\TestPackage[lithuanian.ldf]{lithuanian}
\TestPackage{longtable}
\TestPackage{lscape}
\TestPackage{luainputenc}
\TestPackage{mathdots}
\TestPackage{mathrsfs}
@ -352,6 +353,7 @@
\TestPackage{nomencl}
\TestPackage{paralist}
\TestPackage{pdfcolmk}
\TestPackage{pdflscape}
\TestPackage{polyglossia}
\TestPackage{pdfcomment}
\TestPackage{pdfpages}

View File

@ -5918,6 +5918,38 @@ natbib
You'll need to have jurabib version 0.6 at least.
\end_layout
\begin_layout Subsection
lscape
\end_layout
\begin_layout Description
Found:
\begin_inset Info
type "package"
arg "lscape"
\end_inset
\end_layout
\begin_layout Description
CTAN:
\series medium
\family typewriter
\series default
macros/latex/contrib/graphics/
\end_layout
\begin_layout Description
Notes: The package
\family sans
lscape
\family default
is used to turn specific contents (longtables particularly) to landscape
mode with DVI/PS output.
\end_layout
\begin_layout Subsection
mslapa
\end_layout
@ -6031,6 +6063,38 @@ jurabib
instead).
\end_layout
\begin_layout Subsection
pdflscape
\end_layout
\begin_layout Description
Found:
\begin_inset Info
type "package"
arg "pdflscape"
\end_inset
\end_layout
\begin_layout Description
CTAN:
\series medium
\family typewriter
\series default
macros/latex/contrib/oberdiek/
\end_layout
\begin_layout Description
Notes: The package
\family sans
pdflscape
\family default
is used to turn specific contents (longtables particularly) to landscape
mode with PDF output.
\end_layout
\begin_layout Section
Packages required by modules
\end_layout

View File

@ -2162,6 +2162,30 @@ def revert_minted(document):
del_token(document.header, "\\use_minted")
def revert_longtable_lscape(document):
" revert the longtable landcape mode to ERT "
i = 0
regexp = re.compile(r'^<features rotate=\"90\"\s.*islongtable=\"true\"\s.*$', re.IGNORECASE)
while True:
i = find_re(document.body, regexp, i)
if i == -1:
return
document.body[i] = document.body[i].replace(" rotate=\"90\"", "")
lay = get_containing_layout(document.body, i)
if lay == False:
document.warning("Longtable has not layout!")
i += 1
continue
begcmd = put_cmd_in_ert("\\begin{landscape}")
endcmd = put_cmd_in_ert("\\end{landscape}")
document.body[lay[2] : lay[2]] = endcmd + ["\\end_layout"]
document.body[lay[1] : lay[1]] = ["\\begin_layout " + lay[0], ""] + begcmd
add_to_preamble(document, ["\\usepackage{pdflscape}"])
i = lay[2]
##
# Conversion hub
#
@ -2207,7 +2231,7 @@ convert = [
]
revert = [
[543, [revert_minted]],
[543, [revert_minted, revert_longtable_lscape]],
[542, [revert_mathnumberingname]],
[541, [revert_mathnumberpos]],
[540, [revert_allowbreak]],

View File

@ -1093,6 +1093,15 @@ string const LaTeXFeatures::getPackages() const
// The rest of these packages are somewhat more complicated
// than those above.
// [pdf]lscape is used to rotate longtables
if (mustProvide("lscape")) {
if (runparams_.flavor == OutputParams::LATEX
|| runparams_.flavor == OutputParams::DVILUATEX)
packages << "\\usepackage{lscape}\n";
else
packages << "\\usepackage{pdflscape}\n";
}
// The tipa package and its extensions (tipx, tone) must not
// be loaded with non-TeX fonts, since fontspec includes the
// respective macros

View File

@ -230,7 +230,8 @@ void GuiTabular::enableWidgets() const
tabularWidthED->setEnabled(setwidth);
tabularWidthUnitLC->setEnabled(setwidth);
rotateTabularAngleSB->setEnabled(rotateTabularCB->isChecked());
rotateTabularAngleSB->setEnabled(rotateTabularCB->isChecked()
&& !longTabularCB->isChecked());
rotateCellAngleSB->setEnabled(rotateCellCB->isChecked());
bool const enable_valign =
@ -258,11 +259,8 @@ void GuiTabular::enableWidgets() const
// longtables and tabular* cannot have a vertical alignment
TableAlignLA->setDisabled(is_tabular_star || longtabular);
TableAlignCO->setDisabled(is_tabular_star || longtabular);
// longtable cannot be rotated (with rotating package)
// FIXME: Add support for [pdf]lscape
rotateTabularCB->setDisabled(longtabular);
rotateTabularLA->setDisabled(longtabular);
// this one would also be disabled with [pdf]lscape
// longtable cannot be rotated with rotating package, only
// with [pdf]lscape, which only supports 90 deg.
rotateTabularAngleSB->setDisabled(longtabular);
// FIXME: This Dialog is really horrible, disabling/enabling a checkbox
@ -743,12 +741,16 @@ void GuiTabular::paramsToDialog(Inset const * inset)
rotateCellAngleSB->setValue(90);
}
rotateTabularCB->setChecked(tabular.rotate != 0);
if (rotateTabularCB->isChecked())
rotateTabularAngleSB->setValue(tabular.rotate != 0 ? tabular.rotate : 90);
longTabularCB->setChecked(tabular.is_long_tabular);
rotateTabularCB->setChecked(tabular.rotate != 0);
if (rotateTabularCB->isChecked()) {
if (longTabularCB->isChecked())
rotateTabularAngleSB->setValue(90);
else
rotateTabularAngleSB->setValue(tabular.rotate != 0 ? tabular.rotate : 90);
}
borders->setTop(tabular.topLine(cell));
borders->setBottom(tabular.bottomLine(cell));
borders->setLeft(tabular.leftLine(cell));

View File

@ -2763,8 +2763,12 @@ void Tabular::latex(otexstream & os, OutputParams const & runparams) const
if (!TexRow::isNone(pos))
os.texrow().start(pos);
if (rotate != 0 && !is_long_tabular)
os << "\\begin{turn}{" << convert<string>(rotate) << "}\n";
if (rotate != 0) {
if (is_long_tabular)
os << "\\begin{landscape}\n";
else
os << "\\begin{turn}{" << convert<string>(rotate) << "}\n";
}
if (is_long_tabular) {
os << "\\begin{longtable}";
@ -2931,8 +2935,12 @@ void Tabular::latex(otexstream & os, OutputParams const & runparams) const
os << "\\end{tabular}";
}
if (rotate != 0 && !is_long_tabular)
os << breakln << "\\end{turn}";
if (rotate != 0) {
if (is_long_tabular)
os << breakln << "\\end{landscape}";
else
os << breakln << "\\end{turn}";
}
if (!TexRow::isNone(pos))
os.texrow().start(pos);
@ -3477,6 +3485,8 @@ void Tabular::validate(LaTeXFeatures & features) const
features.require("booktabs");
if (is_long_tabular)
features.require("longtable");
if (rotate && is_long_tabular)
features.require("lscape");
if (needRotating())
features.require("rotating");
for (idx_type cell = 0; cell < numberofcells; ++cell) {