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
 

Reply via email to