commit 9e52c7693e4c660bb4fbad4884a64442a40b4982
Author: Juergen Spitzmueller <[email protected]>
Date: Wed Apr 18 13:22:29 2018 +0200
Add support for rotated longtabulars (via [pdf]lscape)
Fixes: #9194
See #9194 for why we use an earlier file format change here.
(cherry picked from commit feab528fd1555065592284603d8443b71f534a7a)
---
lib/chkconfig.ltx | 2 +
lib/doc/LaTeXConfig.lyx | 64 ++++++++++++++++++++++++++++++++++++++
lib/lyx2lyx/lyx_2_3.py | 26 +++++++++++++++-
src/LaTeXFeatures.cpp | 9 +++++
src/frontends/qt4/GuiTabular.cpp | 22 +++++++------
src/insets/InsetTabular.cpp | 18 ++++++++--
status.23x | 2 +
7 files changed, 128 insertions(+), 15 deletions(-)
diff --git a/lib/chkconfig.ltx b/lib/chkconfig.ltx
index 3fd9572..4adc56a 100644
--- a/lib/chkconfig.ltx
+++ b/lib/chkconfig.ltx
@@ -334,6 +334,7 @@
\TestPackage{listings}
\TestPackage[lithuanian.ldf]{lithuanian}
\TestPackage{longtable}
+\TestPackage{lscape}
\TestPackage{luainputenc}
\TestPackage{mathdots}
\TestPackage{mathrsfs}
@@ -348,6 +349,7 @@
\TestPackage{nomencl}
\TestPackage{paralist}
\TestPackage{pdfcolmk}
+\TestPackage{pdflscape}
\TestPackage{polyglossia}
\TestPackage{pdfcomment}
\TestPackage{pdfpages}
diff --git a/lib/doc/LaTeXConfig.lyx b/lib/doc/LaTeXConfig.lyx
index 2fbba56..b99b340 100644
--- a/lib/doc/LaTeXConfig.lyx
+++ b/lib/doc/LaTeXConfig.lyx
@@ -5919,6 +5919,38 @@ natbib
\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
diff --git a/lib/lyx2lyx/lyx_2_3.py b/lib/lyx2lyx/lyx_2_3.py
index a39aaad..9a39568 100644
--- a/lib/lyx2lyx/lyx_2_3.py
+++ b/lib/lyx2lyx/lyx_2_3.py
@@ -2256,6 +2256,30 @@ def revert_minted(document):
document.header.pop(i)
+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
#
@@ -2301,7 +2325,7 @@ convert = [
]
revert = [
- [543, [revert_minted]],
+ [543, [revert_minted, revert_longtable_lscape]],
[542, [revert_mathnumberingname]],
[541, [revert_mathnumberpos]],
[540, [revert_allowbreak]],
diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp
index 850af10..0291242 100644
--- a/src/LaTeXFeatures.cpp
+++ b/src/LaTeXFeatures.cpp
@@ -1098,6 +1098,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
diff --git a/src/frontends/qt4/GuiTabular.cpp b/src/frontends/qt4/GuiTabular.cpp
index 151a714..71be308 100644
--- a/src/frontends/qt4/GuiTabular.cpp
+++ b/src/frontends/qt4/GuiTabular.cpp
@@ -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));
diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp
index 2037b76..26397ea 100644
--- a/src/insets/InsetTabular.cpp
+++ b/src/insets/InsetTabular.cpp
@@ -2731,8 +2731,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}";
@@ -2882,8 +2886,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);
@@ -3428,6 +3436,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) {
diff --git a/status.23x b/status.23x
index 1662e82..65eacbb 100644
--- a/status.23x
+++ b/status.23x
@@ -20,6 +20,8 @@ What's new
- It possible to anonymize document's content for bug submissions
via buffer-anonymize lfun (bug 7259).
+- Support rotation of multi-page tables via (pdf)lscape (bug 9194).
+
* TEX2LYX IMPROVEMENTS