]> git.lyx.org Git - lyx.git/commitdiff
*** Support for generic sideways floats ***
authorJürgen Spitzmüller <spitz@lyx.org>
Fri, 11 Jan 2008 18:56:53 +0000 (18:56 +0000)
committerJürgen Spitzmüller <spitz@lyx.org>
Fri, 11 Jan 2008 18:56:53 +0000 (18:56 +0000)
* src/Buffer.cpp:
- format is up to 312.
* src/LaTeXFeatures.cpp:
- add rotfloat.
* src/Insets/InsetFloat.cpp:
- handle starred and generic sideways floats.
* src/frontends/qt4/FloatPlacement.{cpp,h}:
- adjust GUI to the new features.
* lib/chkconfig.ltx:
- add rotfloat
* lib/lyx2lyx/LyX.py:
* lib/lyx2lyx/lyx_1_6.py:
- add reversion methods for new floats
* lib/lyx2lyx/lyx_1_4.py:
- add proper reversion method for sideways floats (this was missing).

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@22495 a592a061-630c-0410-9148-cb99ea01b6c8

development/FORMAT
lib/chkconfig.ltx
lib/lyx2lyx/LyX.py
lib/lyx2lyx/lyx_1_4.py
lib/lyx2lyx/lyx_1_6.py
src/Buffer.cpp
src/LaTeXFeatures.cpp
src/frontends/qt4/FloatPlacement.cpp
src/frontends/qt4/FloatPlacement.h
src/insets/InsetFloat.cpp

index 99ac9074833fda06f892a5fd72636a2586a82efa..2de19fae70ae9077092eef713f1257fcf36e3c51 100644 (file)
@@ -1,6 +1,10 @@
 LyX file-format changes
 -----------------------
 
+2008-01-11 Jürgen Spitzmüller <j.spitzmueller@gmx.de>
+       * Format incremented to 312: support for sidewaysalgorithm (rotfloat)
+         and wide sideways{figure,table}.
+
 2008-01-10 Richard Heck <rgheck@bobjweil.com>
        * Format incremented to 311: dummy format to drive the AMS conversion 
 
index c354476f3a4b5ab3b7202213fa9292f3867084c4..49d51629e92bc6484bf81d60095906b25a0f2c8c 100644 (file)
 \TestPackage{prettyref}
 \TestPackage{preview}
 \TestPackage{rotating}
+\TestPackage{rotfloat}
 \TestPackage{setspace}
 \TestPackage{soul}
 \TestPackage{subfigure}
index c4912ab9dd3d6a1f37d272e5e91f9f3e5ce13140..4c9bf8995acb2598775fe24e3a157ffce51d8c42 100644 (file)
@@ -80,7 +80,7 @@ format_relation = [("0_06",    [200], minor_versions("0.6" , 4)),
                    ("1_3",     [221], minor_versions("1.3" , 7)),
                    ("1_4", range(222,246), minor_versions("1.4" , 5)),
                    ("1_5", range(246,277), minor_versions("1.5" , 2)),
-                   ("1_6", range(277,312), minor_versions("1.6" , 0))] # Richard Heck: AMS conversion
+                   ("1_6", range(277,313), minor_versions("1.6" , 0))] # JSpitzm: rotfloat support
 
 
 def formats_list():
index dd5a63be5c0c1c8dc8e8686dd7ee8c2abe8001bd..9952d14a8f05c4adb3c4aa94b0e5d180fbbc34b2 100644 (file)
@@ -1826,20 +1826,35 @@ def convert_float(document):
 
 
 def revert_float(document):
-    " Revert sideway floats. "
+    " Revert sideways floats. "
     i = 0
     while 1:
         i = find_token_exact(document.body, '\\begin_inset Float', i)
         if i == -1:
             return
+        floatline = document.body[i]
         j = find_end_of_inset(document.body, i)
         if j == -1:
             document.warning("Malformed lyx document: Missing '\\end_inset'.")
             i = i + 1
             continue
         if get_value(document.body, 'sideways', i, j) != "false":
-            document.warning("Conversion of 'sideways true' not yet implemented.")
-            # Don't remove 'sideways' so that people will get warnings by lyx
+            l = find_token(document.body, "\\begin_layout Standard", i + 1, j)
+            if l == -1:
+                document.warning("Malformed LyX document: Missing `\\begin_layout Standard' in Float inset.")
+                return
+            floattype = "table"
+            if floatline == "\\begin_inset Float figure":
+                floattype = "figure"
+            document.body[j] = '\\layout Standard\n\\begin_inset ERT\nstatus Collapsed\n\n' \
+            '\\layout Standard\n\n\n\\backslash\n' \
+            'end{sideways' + floattype + '}\n\n\\end_inset\n'
+            del document.body[i+1:l-1]
+            document.body[i] = '\\begin_inset ERT\nstatus Collapsed\n\n' \
+            '\\layout Standard\n\n\n\\backslash\n' \
+            'begin{sideways' + floattype + '}\n\n\\end_inset\n\n'
+            add_to_preamble(document,
+                            ['\\usepackage{rotfloat}\n'])
             i = i + 1
             continue
         del_token(document.body, 'sideways', i, j)
index b2287e55aa4e34be2c92bacbabb88c1896bc70db..3996b883bc542682737f5f3431ae63877276d239 100644 (file)
@@ -36,6 +36,15 @@ def wrap_into_ert(string, src, dst):
     return string.replace(src, '\n\\begin_inset ERT\nstatus collapsed\n\\begin_layout Standard\n' 
       + dst + '\n\\end_layout\n\\end_inset\n')
 
+def add_to_preamble(document, text):
+    """ Add text to the preamble if it is not already there.
+    Only the first line is checked!"""
+
+    if find_token(document.preamble, text[0], 0) != -1:
+        return
+
+    document.preamble.extend(text)
+
 ####################################################################
 
 def fix_wrong_tables(document):
@@ -1092,6 +1101,77 @@ def revert_serbianlatin(document):
         j = j + 1
 
 
+def revert_rotfloat(document):
+    " Revert sidewaysalgorithm. "
+    i = 0
+    while 1:
+        i = find_token(document.body, '\\begin_inset Float algorithm', i)
+        if i == -1:
+            return
+        j = find_end_of_inset(document.body, i)
+        if j == -1:
+            document.warning("Malformed lyx document: Missing '\\end_inset'.")
+            i = i + 1
+            continue
+        if get_value(document.body, 'sideways', i, j) != "false":
+            l = find_token(document.body, "\\begin_layout Standard", i + 1, j)
+            if l == -1:
+                document.warning("Malformed LyX document: Missing `\\begin_layout Standard' in Float inset.")
+                return
+            document.body[j] = '\\begin_layout Standard\n\\begin_inset ERT\nstatus collapsed\n\n' \
+            '\\begin_layout Standard\n\n\n\\backslash\n' \
+            'end{sidewaysalgorithm}\n\\end_layout\n\n\\end_inset\n'
+            del document.body[i+1:l-1]
+            document.body[i] = '\\begin_inset ERT\nstatus collapsed\n\n' \
+            '\\begin_layout Standard\n\n\n\\backslash\n' \
+            'begin{sidewaysalgorithm}\n\\end_layout\n\n\\end_inset\n\n\\end_layout\n\n'
+            add_to_preamble(document,
+                            ['% Commands inserted by lyx2lyx for sideways algorithm float',
+                             '\\usepackage{rotfloat}\n'
+                             '\\floatstyle{ruled}\n'
+                             '\\newfloat{algorithm}{tbp}{loa}\n'
+                             '\\floatname{algorithm}{Algorithm}\n'])
+            i = i + 1
+            continue
+        i = i + 1
+
+
+def revert_widesideways(document):
+    " Revert wide sideways floats. "
+    i = 0
+    while 1:
+        i = find_token(document.body, '\\begin_inset Float', i)
+        if i == -1:
+            return
+        floatline = document.body[i]
+        j = find_end_of_inset(document.body, i)
+        if j == -1:
+            document.warning("Malformed lyx document: Missing '\\end_inset'.")
+            i = i + 1
+            continue
+        if get_value(document.body, 'sideways', i, j) != "false":
+            if get_value(document.body, 'wide', i, j) != "false":
+                l = find_token(document.body, "\\begin_layout Standard", i + 1, j)
+                if l == -1:
+                    document.warning("Malformed LyX document: Missing `\\begin_layout Standard' in Float inset.")
+                    return
+                floattype = "table"
+                if floatline == "\\begin_inset Float figure":
+                    floattype = "figure"
+                document.body[j] = '\\begin_layout Standard\n\\begin_inset ERT\nstatus collapsed\n\n' \
+                '\\begin_layout Standard\n\n\n\\backslash\n' \
+                'end{sideways' + floattype + '*}\n\\end_layout\n\n\\end_inset\n'
+                del document.body[i+1:l-1]
+                document.body[i] = '\\begin_inset ERT\nstatus collapsed\n\n' \
+                '\\begin_layout Standard\n\n\n\\backslash\n' \
+                'begin{sideways' + floattype + '*}\n\\end_layout\n\n\\end_inset\n\n\\end_layout\n\n'
+                add_to_preamble(document,
+                                ['\\usepackage{rotfloat}\n'])
+                i = i + 1
+                continue
+        i = i + 1
+
+
 ##
 # Conversion hub
 #
@@ -1131,10 +1211,12 @@ convert = [[277, [fix_wrong_tables]],
            [308, []],
            [309, []],
            [310, []],
-           [311, [convert_ams_classes]]
+           [311, [convert_ams_classes]],
+           [312, []],
           ]
 
-revert =  [[310, []],
+revert =  [[311, [revert_rotfloat, revert_widesideways]],
+           [310, []],
            [309, [revert_btprintall]],
            [308, [revert_nocite]],
            [307, [revert_serbianlatin]],
index 5d90106fad5361212d24e96452d56def64027bd6..d33fa3f31a966ea67441d8aba424db1075ea925c 100644 (file)
@@ -118,7 +118,7 @@ namespace os = support::os;
 
 namespace {
 
-int const LYX_FORMAT = 311; // Richard Heck: a dummy format to drive the AMS conversion
+int const LYX_FORMAT = 312; // JSpitzm: rotfloat support
 
 } // namespace anon
 
index e60fd461d9a9c279c766da0efd4af2d68a8ed05f..3abf35872cb18ff54e82feee8c565b1bdf907767 100644 (file)
@@ -510,6 +510,7 @@ char const * simplefeatures[] = {
          the `float' package. See the caption package documentation
          for explanation.*/
        "float",
+       "rotfloat",
        "wrapfig",
        "booktabs",
        "dvipost",
index f8025ef6051a9122d4f571e6dd1f839e89454081..f689ab24e84839bc822696b3914613da5d0cd428 100644 (file)
@@ -112,6 +112,9 @@ void FloatPlacement::set(lyx::InsetFloatParams const & params)
 {
        set(params.placement);
 
+       standardfloat_ = (params.type == "figure"
+               || params.type == "table");
+
        if (params.wide) {
                herepossiblyCB->setChecked(false);
                heredefinitelyCB->setChecked(false);
@@ -120,8 +123,8 @@ void FloatPlacement::set(lyx::InsetFloatParams const & params)
 
        spanCB->setChecked(params.wide);
        sidewaysCB->setChecked(params.sideways);
-       sidewaysCB->setEnabled(params.type == "figure"
-               || params.type == "table");
+       // the package rotfloat only has *-versions for figure and table
+       spanCB->setEnabled(!params.sideways || standardfloat_);
        checkAllowed();
 }
 
@@ -225,7 +228,7 @@ void FloatPlacement::checkAllowed()
                ignoreCB->setEnabled(!sideways && !defaults && ignore);
                herepossiblyCB->setEnabled(!sideways && !defaults && !span);
                heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
-               spanCB->setEnabled(!sideways);
+               spanCB->setEnabled(!sideways || standardfloat_);
        } else {
                topCB->setEnabled(!defaults);
                bottomCB->setEnabled(!defaults);
index 581d5d711a4bd6d17cf783c70092d19e15044ba6..557f48ab5267ea98841aecc98f77f78ec2ff1b4a 100644 (file)
@@ -46,6 +46,10 @@ public Q_SLOTS:
 Q_SIGNALS:
        void changed();
 
+private:
+       /// one of figure or table?
+       bool standardfloat_;
+
 };
 
 
index 0d80dcbf5b777518a10143bd83278855722945df..08625e2884032dd906e766854febd511ee334ef7 100644 (file)
@@ -261,7 +261,7 @@ void InsetFloat::validate(LaTeXFeatures & features) const
        }
 
        if (params_.sideways)
-               features.require("rotating");
+               features.require("rotfloat");
 
        features.useFloat(params_.type);
        InsetCollapsable::validate(features);
@@ -284,13 +284,13 @@ int InsetFloat::latex(Buffer const & buf, odocstream & os,
                      OutputParams const & runparams) const
 {
        FloatList const & floats = buf.params().getTextClass().floats();
-       string tmptype = (params_.wide ? params_.type + "*" : params_.type);
-       if (params_.sideways) {
-               if (params_.type == "table")
-                       tmptype = "sidewaystable";
-               else if (params_.type == "figure")
-                       tmptype = "sidewaysfigure";
-       }
+       string tmptype = params_.type;
+       if (params_.sideways)
+               tmptype = "sideways" + params_.type;
+       if (params_.wide && (!params_.sideways ||
+                            params_.type == "figure" ||
+                            params_.type == "table"))
+               tmptype += "*";
        // Figure out the float placement to use.
        // From lowest to highest:
        // - float default placement