commit b0c102cfb40985f46283e4fab0870ec5e2900699
Author: Juergen Spitzmueller <[email protected]>
Date:   Sun Jun 28 17:20:18 2020 +0200

    use package parskip to separate paragraphs with vertical space (#4796)
    
    File format change
---
 lib/chkconfig.ltx                |    1 +
 lib/doc/LaTeXConfig.lyx          |   57 +++++++++++++++++++++++++++-
 lib/lyx2lyx/lyx_2_4.py           |   63 +++++++++++++++++++++++++++++-
 src/BufferParams.cpp             |   22 ++++++----
 src/VSpace.cpp                   |   77 ++++++++++++++++++++++++++++++++-----
 src/VSpace.h                     |    2 +
 src/frontends/qt/GuiDocument.cpp |   62 ++++++++++++-------------------
 src/frontends/qt/GuiVSpace.cpp   |   28 +++++++++++---
 src/tex2lyx/Preamble.cpp         |   32 ++++++++++++---
 src/version.h                    |    4 +-
 10 files changed, 271 insertions(+), 77 deletions(-)

diff --git a/lib/chkconfig.ltx b/lib/chkconfig.ltx
index 4d647c6..9a15abc 100644
--- a/lib/chkconfig.ltx
+++ b/lib/chkconfig.ltx
@@ -405,6 +405,7 @@
 \TestPackage{nicefrac}
 \TestPackage{nomencl}
 \TestPackage{paralist}
+\TestPackage{parskip}
 \TestPackage{pdfcolmk}
 \TestPackage{pdflscape}
 \TestPackage{polyglossia}
diff --git a/lib/doc/LaTeXConfig.lyx b/lib/doc/LaTeXConfig.lyx
index 6e69bfd..bfaad60 100644
--- a/lib/doc/LaTeXConfig.lyx
+++ b/lib/doc/LaTeXConfig.lyx
@@ -1,5 +1,5 @@
 #LyX 2.4 created this file. For more info see https://www.lyx.org/
-\lyxformat 594
+\lyxformat 595
 \begin_document
 \begin_header
 \save_transient_properties true
@@ -5683,6 +5683,61 @@ longtable
 \family default
  is needed by \SpecialChar LyX
  to output multi-page tables.
+\change_inserted -712698321 1593341214
+
+\end_layout
+
+\begin_layout Subsection
+
+\change_deleted -712698321 1593341218
+longtable
+\change_inserted -712698321 1593341222
+parskip
+\change_unchanged
+
+\end_layout
+
+\begin_layout Description
+Found: 
+\begin_inset Info
+type  "package"
+arg   "parskip"
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+CTAN: 
+\family typewriter
+macros/latex/
+\change_deleted -712698321 1593341294
+required/tools
+\change_inserted -712698321 1593341297
+contrib/parskip
+\change_unchanged
+/
+\end_layout
+
+\begin_layout Description
+Notes: The package 
+\change_deleted -712698321 1593341266
+
+\family sans
+longtable
+\change_inserted -712698321 1593341267
+parskip
+\change_unchanged
+
+\family default
+ is needed by \SpecialChar LyX
+ to 
+\change_deleted -712698321 1593341302
+output multi-page tables
+\change_inserted -712698321 1593341311
+separate paragraphs by vertical space
+\change_unchanged
+.
 \end_layout
 
 \begin_layout Subsection
diff --git a/lib/lyx2lyx/lyx_2_4.py b/lib/lyx2lyx/lyx_2_4.py
index f778b4a..4e2533c 100644
--- a/lib/lyx2lyx/lyx_2_4.py
+++ b/lib/lyx2lyx/lyx_2_4.py
@@ -3775,7 +3775,62 @@ def revert_ams_spaces(document):
         if i == -1:
             add_to_preamble(document, 
["\\@ifundefined{thickspace}{\\usepackage{amsmath}}{}"])
             return
-        
+
+
+def convert_parskip(document):
+    " Move old parskip settings to preamble "
+    
+    i = find_token(document.header, "\\paragraph_separation skip", 0)
+    if i == -1:
+        return
+    
+    j = find_token(document.header, "\\defskip", 0)
+    if j == -1:
+        document.warning("Malformed LyX document! Missing \\defskip.")
+        return
+    
+    val = get_value(document.header, "\\defskip", j)
+    
+    skipval = "\\medskipamount"
+    if val == "smallskip" or val == "medskip" or val == "bigskip":
+        skipval = "\\" + val + "amount"
+    else:
+        skipval = val
+
+    add_to_preamble(document, ["\\setlength{\\parskip}{" + skipval + "}", 
"\\setlength{\\parindent}{0pt}"])
+    
+    document.header[i] = "\\paragraph_separation indent"
+    document.header[j] = "\\paragraph_indentation default"
+
+
+def revert_parskip(document):
+    " Revert new parskip settings to preamble "
+    
+    i = find_token(document.header, "\\paragraph_separation skip", 0)
+    if i == -1:
+        return
+    
+    j = find_token(document.header, "\\defskip", 0)
+    if j == -1:
+        document.warning("Malformed LyX document! Missing \\defskip.")
+        return
+    
+    val = get_value(document.header, "\\defskip", j)
+    
+    skipval = ""
+    if val == "smallskip" or val == "medskip" or val == "bigskip":
+        skipval = "[skip=\\" + val + "amount]"
+    elif val == "fullline":
+        skipval = "[skip=\\baselineskip]"
+    elif val != "halfline":
+        skipval = "[skip={" + val + "}]"
+    
+    add_to_preamble(document, ["\\usepackage" + skipval + "{parskip}"])
+    
+    document.header[i] = "\\paragraph_separation indent"
+    document.header[j] = "\\paragraph_indentation default"
+
+
 ##
 # Conversion hub
 #
@@ -3832,10 +3887,12 @@ convert = [
            [592, []],
            [593, [convert_counter_maintenance]],
            [594, []],
-           [595, []]
+           [595, []],
+           [596, [convert_parskip]]
           ]
 
-revert =  [[594, [revert_ams_spaces]],
+revert =  [[595, [revert_parskip]],
+           [594, [revert_ams_spaces]],
            [593, [revert_counter_inset]],
            [592, [revert_counter_maintenance]],
            [591, [revert_colrow_tracking]],
diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index 9f6a3fb..776c5c9 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -2003,26 +2003,30 @@ bool BufferParams::writeLaTeX(otexstream & os, 
LaTeXFeatures & features,
 
        if (paragraph_separation) {
                // when skip separation
+               string psopt;
                switch (getDefSkip().kind()) {
                case VSpace::SMALLSKIP:
-                       os << "\\setlength{\\parskip}{\\smallskipamount}\n";
+                       psopt = "[skip=\\smallskipamount]";
                        break;
                case VSpace::MEDSKIP:
-                       os << "\\setlength{\\parskip}{\\medskipamount}\n";
+                       psopt = "[skip=\\medskipamount]";
                        break;
                case VSpace::BIGSKIP:
-                       os << "\\setlength{\\parskip}{\\bigskipamount}\n";
+                       psopt = "[skip=\\bigskipamount]";
+                       break;
+               case VSpace::HALFLINE:
+                       break;
+               case VSpace::FULLLINE:
+                       psopt = "[skip=\\baselineskip]";
                        break;
                case VSpace::LENGTH:
-                       os << "\\setlength{\\parskip}{"
-                          << from_utf8(getDefSkip().length().asLatexString())
-                          << "}\n";
+                       psopt = "[skip={" + 
getDefSkip().length().asLatexString() + "}]";
                        break;
-               default: // should never happen // Then delete it.
-                       os << "\\setlength{\\parskip}{\\medskipamount}\n";
+               default:
                        break;
                }
-               os << "\\setlength{\\parindent}{0pt}\n";
+               if (features.isAvailable("parskip"))
+                       os << "\\usepackage" + psopt + "{parskip}\n";
        } else {
                // when separation by indentation
                // only output something when a width is given
diff --git a/src/VSpace.cpp b/src/VSpace.cpp
index 971ac96..a2d4a3d 100644
--- a/src/VSpace.cpp
+++ b/src/VSpace.cpp
@@ -78,6 +78,10 @@ VSpace::VSpace(string const & data)
                kind_ = MEDSKIP;
        else if (prefixIs(input, "bigskip"))
                kind_ = BIGSKIP;
+       else if (prefixIs(input, "halfline"))
+               kind_ = HALFLINE;
+       else if (prefixIs(input, "fullline"))
+               kind_ = FULLLINE;
        else if (prefixIs(input, "vfill"))
                kind_ = VFILL;
        else if (isValidGlueLength(input, &len_))
@@ -111,12 +115,30 @@ string const VSpace::asLyXCommand() const
 {
        string result;
        switch (kind_) {
-       case DEFSKIP:   result = "defskip";      break;
-       case SMALLSKIP: result = "smallskip";    break;
-       case MEDSKIP:   result = "medskip";      break;
-       case BIGSKIP:   result = "bigskip";      break;
-       case VFILL:     result = "vfill";        break;
-       case LENGTH:    result = len_.asString(); break;
+       case DEFSKIP:
+               result = "defskip";
+               break;
+       case SMALLSKIP:
+               result = "smallskip";
+               break;
+       case MEDSKIP:
+               result = "medskip";
+               break;
+       case BIGSKIP:
+               result = "bigskip";
+               break;
+       case HALFLINE:
+               result = "halfline";
+               break;
+       case FULLLINE:
+               result = "fullline";
+               break;
+       case VFILL:
+               result = "vfill";
+               break;
+       case LENGTH:
+               result = len_.asString();
+               break;
        }
        if (keep_)
                result += '*';
@@ -138,6 +160,12 @@ string const VSpace::asLatexCommand(BufferParams const & 
params) const
 
        case BIGSKIP:
                return keep_ ? "\\vspace*{\\bigskipamount}" : "\\bigskip{}";
+       
+       case HALFLINE:
+               return keep_ ? "\\vspace*{.5\\baselineskip}" : 
"\\vspace{.5\\baselineskip}";
+
+       case FULLLINE:
+               return keep_ ? "\\vspace*{\\baselineskip}" : 
"\\vspace{\\baselineskip}";
 
        case VFILL:
                return keep_ ? "\\vspace*{\\fill}" : "\\vfill{}";
@@ -170,6 +198,12 @@ docstring const VSpace::asGUIName() const
        case BIGSKIP:
                result = _("Big skip");
                break;
+       case HALFLINE:
+               result = _("Half line height");
+               break;
+       case FULLLINE:
+               result = _("Line height");
+               break;
        case VFILL:
                result = _("Vertical fill");
                break;
@@ -187,16 +221,31 @@ string VSpace::asHTMLLength() const
 {
        string result;
        switch (kind_) {
-               case DEFSKIP:   result = "2ex"; break;
-               case SMALLSKIP: result = "1ex"; break;
-               case MEDSKIP:   result = "3ex"; break;
-               case BIGSKIP:   result = "5ex"; break;
+               case DEFSKIP:
+                       result = "2ex";
+                       break;
+               case SMALLSKIP:
+                       result = "1ex";
+                       break;
+               case MEDSKIP:
+                       result = "3ex";
+                       break;
+               case BIGSKIP:
+                       result = "5ex";
+                       break;
+               case HALFLINE:
+                       result = "0.6em";
+                       break;
+               case FULLLINE:
+                       result = "1.2em";
+                       break;
                case LENGTH: {
                        Length tmp = len_.len();
                        if (tmp.value() > 0)
                                result = tmp.asHTMLString();
                }
-               case VFILL:     break;
+               case VFILL:
+                       break;
        }
        return result;
 }
@@ -227,6 +276,12 @@ int VSpace::inPixels(BufferView const & bv) const
                // leave space for the vfill symbol
                return 3 * default_height;
 
+       case HALFLINE:
+               return int(default_height / 2);
+
+       case FULLLINE:
+               return default_height;
+
        case LENGTH:
                return bv.inPixels(len_.len());
 
diff --git a/src/VSpace.h b/src/VSpace.h
index 0d154d6..2bce154 100644
--- a/src/VSpace.h
+++ b/src/VSpace.h
@@ -31,6 +31,8 @@ public:
                SMALLSKIP,
                MEDSKIP,
                BIGSKIP,
+               HALFLINE,
+               FULLLINE,
                VFILL,
                LENGTH ///< user-defined length
        };
diff --git a/src/frontends/qt/GuiDocument.cpp b/src/frontends/qt/GuiDocument.cpp
index bcf33c0..9d8de56 100644
--- a/src/frontends/qt/GuiDocument.cpp
+++ b/src/frontends/qt/GuiDocument.cpp
@@ -860,10 +860,12 @@ GuiDocument::GuiDocument(GuiView & lv)
 
        textLayoutModule->indentCO->addItem(qt_("Default"));
        textLayoutModule->indentCO->addItem(qt_("Custom"));
-       textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
-       textLayoutModule->skipCO->addItem(qt_("MedSkip"));
-       textLayoutModule->skipCO->addItem(qt_("BigSkip"));
-       textLayoutModule->skipCO->addItem(qt_("Custom"));
+       textLayoutModule->skipCO->addItem(qt_("Half line height"), 
VSpace::HALFLINE);
+       textLayoutModule->skipCO->addItem(qt_("Line height"), VSpace::FULLLINE);
+       textLayoutModule->skipCO->addItem(qt_("SmallSkip"), VSpace::SMALLSKIP);
+       textLayoutModule->skipCO->addItem(qt_("MedSkip"), VSpace::MEDSKIP);
+       textLayoutModule->skipCO->addItem(qt_("BigSkip"), VSpace::BIGSKIP);
+       textLayoutModule->skipCO->addItem(qt_("Custom"), VSpace::LENGTH);
        textLayoutModule->lspacingCO->insertItem(
                Spacing::Single, qt_("Single"));
        textLayoutModule->lspacingCO->insertItem(
@@ -2028,7 +2030,9 @@ void GuiDocument::enableIndent(bool indent)
 
 void GuiDocument::setSkip(int item)
 {
-       bool const enable = (item == 3);
+       VSpace::VSpaceKind kind =
+               
VSpace::VSpaceKind(textLayoutModule->skipCO->itemData(item).toInt());
+       bool const enable = (kind == VSpace::LENGTH);
        textLayoutModule->skipLE->setEnabled(enable);
        textLayoutModule->skipLengthCO->setEnabled(enable);
        isValid();
@@ -3611,25 +3615,24 @@ void GuiDocument::applyView()
        } else {
                // if paragraphs are separated by a skip
                bp_.paragraph_separation = 
BufferParams::ParagraphSkipSeparation;
-               switch (textLayoutModule->skipCO->currentIndex()) {
-               case 0:
-                       bp_.setDefSkip(VSpace(VSpace::SMALLSKIP));
-                       break;
-               case 1:
-                       bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
-                       break;
-               case 2:
-                       bp_.setDefSkip(VSpace(VSpace::BIGSKIP));
+               VSpace::VSpaceKind spacekind =
+                       
VSpace::VSpaceKind(textLayoutModule->skipCO->itemData(textLayoutModule->skipCO->currentIndex()).toInt());
+               switch (spacekind) {
+               case VSpace::SMALLSKIP:
+               case VSpace::MEDSKIP:
+               case VSpace::BIGSKIP:
+               case VSpace::HALFLINE:
+               case VSpace::FULLLINE:
+                       bp_.setDefSkip(VSpace(spacekind));
                        break;
-               case 3:
-                       {
+               case VSpace::LENGTH: {
                        VSpace vs = VSpace(
                                widgetsToLength(textLayoutModule->skipLE,
                                textLayoutModule->skipLengthCO)
                                );
                        bp_.setDefSkip(vs);
                        break;
-                       }
+               }
                default:
                        // this should never happen
                        bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
@@ -4113,32 +4116,15 @@ void GuiDocument::paramsToDialog()
                setIndent(indent);
        } else {
                textLayoutModule->skipRB->setChecked(true);
-               int skip = 0;
-               switch (bp_.getDefSkip().kind()) {
-               case VSpace::SMALLSKIP:
-                       skip = 0;
-                       break;
-               case VSpace::MEDSKIP:
-                       skip = 1;
-                       break;
-               case VSpace::BIGSKIP:
-                       skip = 2;
-                       break;
-               case VSpace::LENGTH:
-                       {
-                       skip = 3;
+               VSpace::VSpaceKind skip = bp_.getDefSkip().kind();
+               
textLayoutModule->skipCO->setCurrentIndex(textLayoutModule->skipCO->findData(skip));
+               if (skip == VSpace::LENGTH) {
                        string const length = bp_.getDefSkip().asLyXCommand();
                        lengthToWidgets(textLayoutModule->skipLE,
                                textLayoutModule->skipLengthCO,
                                length, default_unit);
-                       break;
-                       }
-               default:
-                       skip = 0;
-                       break;
                }
-               textLayoutModule->skipCO->setCurrentIndex(skip);
-               setSkip(skip);
+               setSkip(textLayoutModule->skipCO->currentIndex());
        }
 
        textLayoutModule->twoColumnCB->setChecked(
diff --git a/src/frontends/qt/GuiVSpace.cpp b/src/frontends/qt/GuiVSpace.cpp
index 6eec958..cbd0265 100644
--- a/src/frontends/qt/GuiVSpace.cpp
+++ b/src/frontends/qt/GuiVSpace.cpp
@@ -84,12 +84,28 @@ static void setWidgetsFromVSpace(VSpace const & space,
 {
        int item = 0;
        switch (space.kind()) {
-               case VSpace::DEFSKIP:   item = 0; break;
-               case VSpace::SMALLSKIP: item = 1; break;
-               case VSpace::MEDSKIP:   item = 2; break;
-               case VSpace::BIGSKIP:   item = 3; break;
-               case VSpace::VFILL:     item = 4; break;
-               case VSpace::LENGTH:    item = 5; break;
+               case VSpace::DEFSKIP:
+                       item = 0;
+                       break;
+               case VSpace::SMALLSKIP:
+                       item = 1;
+                       break;
+               case VSpace::MEDSKIP:
+                       item = 2;
+                       break;
+               case VSpace::BIGSKIP:
+                       item = 3;
+                       break;
+               case VSpace::VFILL:
+                       item = 4;
+                       break;
+               case VSpace::LENGTH:
+                       item = 5;
+                       break;
+               case VSpace::HALFLINE:
+               case VSpace::FULLLINE:
+                       // not supported here yet
+                       break;
        }
        spacing->setCurrentIndex(item);
        keep->setChecked(space.keep());
diff --git a/src/tex2lyx/Preamble.cpp b/src/tex2lyx/Preamble.cpp
index 875b61a..187a0da 100644
--- a/src/tex2lyx/Preamble.cpp
+++ b/src/tex2lyx/Preamble.cpp
@@ -203,7 +203,7 @@ const char * const known_xetex_packages[] = {"arabxetex", 
"fixlatvian",
 const char * const known_lyx_packages[] = {"amsbsy", "amsmath", "amssymb",
 "amstext", "amsthm", "array", "babel", "booktabs", "calc", "CJK", "color",
 "float", "fontspec", "framed", "graphicx", "hhline", "ifthen", "longtable",
-"makeidx", "minted", "multirow", "nomencl", "pdfpages", "prettyref", 
"refstyle",
+"makeidx", "minted", "multirow", "nomencl", "parskip", "pdfpages", 
"prettyref", "refstyle",
 "rotating", "rotfloat", "splitidx", "setspace", "subscript", 
"tabularx","textcomp", "tipa",
 "tipx", "tone", "ulem", "url", "varioref", "verbatim", "wrapfig", "xcolor", 
"xltabular",
 "xunicode", 0};
@@ -1644,6 +1644,24 @@ void Preamble::handle_package(Parser &p, string const & 
name,
                delete_opt(options, o);
        }
 
+       else if (name == "parskip" && options.size() < 2 && (opts.empty() || 
prefixIs(opts, "skip="))) {
+               if (opts.empty())
+                       h_paragraph_separation = "halfline";
+               else {
+                       if (opts == "skip=\\smallskipamount")
+                               h_defskip = "smallskip";
+                       else if (opts == "skip=\\medskipamount")
+                               h_defskip = "medskip";
+                       else if (opts == "skip=\\bigskipamount")
+                               h_defskip = "bigskip";
+                       else if (opts == "skip=\\baselineskip")
+                               h_defskip = "fullline";
+                       else
+                               h_defskip = "opts";
+                       h_paragraph_separation = "skip";
+               }
+       }
+
        else if (is_known(name, known_lyx_packages) && options.empty()) {
                if (name == "splitidx")
                        h_use_indices = "true";
@@ -1653,6 +1671,7 @@ void Preamble::handle_package(Parser &p, string const & 
name,
                        h_use_refstyle = true;
                else if (name == "prettyref")
                        h_use_refstyle = false;
+
                if (!in_lyx_preamble) {
                        h_preamble << package_beg_sep << name
                                   << package_mid_sep << "\\usepackage{"
@@ -2781,18 +2800,17 @@ void Preamble::parse(Parser & p, string const & 
forceclass,
                        string const name = p.verbatim_item();
                        string const content = p.verbatim_item();
                        // the paragraphs are only not indented when \parindent 
is set to zero
-                       if (name == "\\parindent" && content != "") {
-                               if (content[0] == '0')
-                                       h_paragraph_separation = "skip";
-                               else
-                                       h_paragraph_indentation = 
translate_len(content);
-                       } else if (name == "\\parskip") {
+                       if (name == "\\parindent" && content != "")
+                               h_paragraph_indentation = 
translate_len(content);
+                       else if (name == "\\parskip" && 
isPackageUsed("parskip")) {
                                if (content == "\\smallskipamount")
                                        h_defskip = "smallskip";
                                else if (content == "\\medskipamount")
                                        h_defskip = "medskip";
                                else if (content == "\\bigskipamount")
                                        h_defskip = "bigskip";
+                               else if (content == "\\baselineskip")
+                                       h_defskip = "fullline";
                                else
                                        h_defskip = translate_len(content);
                        } else if (name == "\\mathindent") {
diff --git a/src/version.h b/src/version.h
index fd40047..b8d30fd 100644
--- a/src/version.h
+++ b/src/version.h
@@ -32,8 +32,8 @@ extern char const * const lyx_version_info;
 
 // Do not remove the comment below, so we get merge conflict in
 // independent branches. Instead add your own.
-#define LYX_FORMAT_LYX 595 // spitz: medspace and thickspace
-#define LYX_FORMAT_TEX2LYX 595
+#define LYX_FORMAT_LYX 596 // spitz: parskip
+#define LYX_FORMAT_TEX2LYX 596
 
 #if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX
 #ifndef _MSC_VER
-- 
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to