]> git.lyx.org Git - lyx.git/commitdiff
New layout tags for better counter handling
authorJuergen Spitzmueller <spitz@lyx.org>
Fri, 14 Oct 2016 18:08:12 +0000 (20:08 +0200)
committerJuergen Spitzmueller <spitz@lyx.org>
Fri, 14 Oct 2016 18:08:12 +0000 (20:08 +0200)
* ResumeCounter: allow to resume an (enumerate) counter
* StepMasterCounter: allow to increase a master counter

lib/doc/Customization.lyx
lib/scripts/layout2layout.py
src/Buffer.cpp
src/Counters.cpp
src/Counters.h
src/Layout.cpp
src/Layout.h
src/TextClass.cpp

index 919f7a414bd1738ef82df51625aa6fc22eced197..8a45f6e39ddff87d7b809ac74c451c3b8f267b40 100644 (file)
@@ -14684,6 +14684,62 @@ CopyStyle
 \begin_inset Flex Code
 status collapsed
 
+\begin_layout Plain Layout
+ResumeCounter
+\end_layout
+
+\end_inset
+
+ [
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\emph on
+0
+\end_layout
+
+\end_inset
+
+,
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+1
+\end_layout
+
+\end_inset
+
+] Resumes a counter that is usually reset at each new sequence of layouts.
+ This is currently only useful when 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+LabelType
+\end_layout
+
+\end_inset
+
+ is 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Enumerate
+\end_layout
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+\begin_inset Flex Code
+status collapsed
+
 \begin_layout Plain Layout
 RightDelim
 \end_layout
@@ -14918,6 +14974,63 @@ status collapsed
 \begin_inset Flex Code
 status collapsed
 
+\begin_layout Plain Layout
+StepMasterCounter
+\end_layout
+
+\end_inset
+
+ [
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\emph on
+0
+\end_layout
+
+\end_inset
+
+,
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+1
+\end_layout
+
+\end_inset
+
+] Steps the master counter of a given counter at the beginning of a new
+ sequence of layouts.
+ This is currently only useful when 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+LabelType
+\end_layout
+
+\end_inset
+
+ is 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Enumerate
+\end_layout
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+\begin_inset Flex Code
+status collapsed
+
 \begin_layout Plain Layout
 TextFont
 \end_layout
index 113227b8efe43a121da94e852d0ecc700f19446f..753ef5e0c4c8713e2dfeb51e70bdfbebb30f2d53 100644 (file)
@@ -11,7 +11,7 @@
 # This script will update a .layout file to current format
 
 # The latest layout format is also defined in src/TextClass.cpp
-currentFormat = 60
+currentFormat = 61
 
 
 # Incremented to format 4, 6 April 2007, lasgouttes
@@ -202,6 +202,9 @@ currentFormat = 60
 # Incremented to format 60, 25 March 2016 by lasgouttes
 # Rename caption subtype LongTableNoNumber to Unnumbered
 
+# Incremented to format 61, 14 October 2016 by spitz
+# New Layout tags "ResumeCounter", "StepMasterCounter"
+
 # Do not forget to document format change in Customization
 # Manual (section "Declaring a new text class").
 
@@ -445,6 +448,11 @@ def convert(lines, end_format):
                 i += 1
             continue
 
+        if format == 60:
+            # nothing to do.
+            i += 1
+            continue
+
         if format == 59:
             match = re_InsetLayout_CaptionLTNN.match(lines[i])
             if not match:
index 99641e278c5af05157316f3208703c269dda8d69..8f04ae4e0b63bc413ccf007beed3f230911516c4 100644 (file)
@@ -4673,7 +4673,7 @@ static bool needEnumCounterReset(ParIterator const & it)
                --prev_it.top().pit();
                Paragraph const & prev_par = *prev_it;
                if (prev_par.getDepth() <= cur_depth)
-                       return  prev_par.layout().labeltype != LABEL_ENUMERATE;
+                       return prev_par.layout().name() != par.layout().name();
        }
        // start of nested inset: reset
        return true;
@@ -4757,8 +4757,12 @@ void Buffer::Impl::setLabel(ParIterator & it, UpdateType utype) const
                        break;
                }
 
+               // Increase the master counter?
+               if (layout.stepmastercounter && needEnumCounterReset(it))
+                       counters.stepMaster(enumcounter, utype);
+
                // Maybe we have to reset the enumeration counter.
-               if (needEnumCounterReset(it))
+               if (!layout.resumecounter && needEnumCounterReset(it))
                        counters.reset(enumcounter);
                counters.step(enumcounter, utype);
 
index 0b17aa1b9b84eac8b6d7f94d16cf5bdbf71af9bc..75c891128efa90777a0ba9a04a7164e5e14232aa 100644 (file)
@@ -278,6 +278,18 @@ void Counters::resetSlaves(docstring const & ctr)
 }
 
 
+void Counters::stepMaster(docstring const & ctr, UpdateType utype)
+{
+       CounterList::iterator it = counterList_.find(ctr);
+       if (it == counterList_.end()) {
+               lyxerr << "step: Counter does not exist: "
+                      << to_utf8(ctr) << endl;
+               return;
+       }
+       step(it->second.master(), utype);
+}
+
+
 void Counters::step(docstring const & ctr, UpdateType utype)
 {
        CounterList::iterator it = counterList_.find(ctr);
index 4ba0d004846d2f0f8361e10d9286d5f0754b03f4..360e297070a3bc256bb6f3325ef5d2388b420d63 100644 (file)
@@ -130,6 +130,10 @@ public:
        int value(docstring const & ctr) const;
        /// Reset recursively all the counters that are slaves of the one named by \c ctr.
        void resetSlaves(docstring const & ctr);
+       /// Increment by one master of counter named by \c ctr.
+       /// This also resets the counter named by \c ctr.
+       /// \param utype determines whether we track the counters.
+       void stepMaster(docstring const & ctr, UpdateType utype);
        /// Increment by one counter named by \c ctr, and zeroes slave
        /// counter(s) for which it is the master.
        /// \param utype determines whether we track the counters.
index d6a01c9f7cb12adbd94cef4ffa9352828d532a6f..f3af6986157156d6653baf834e263ce8e7ba8673 100644 (file)
@@ -105,6 +105,8 @@ enum LayoutTags {
        LT_SPELLCHECK,
        LT_REFPREFIX,
        LT_RESETARGS,
+       LT_RESUMECOUNTER,
+       LT_STEPMASTERCOUNTER,
        LT_RIGHTDELIM,
        LT_FORCELOCAL,
        LT_TOGGLE_INDENT,
@@ -121,6 +123,8 @@ Layout::Layout()
        unknown_ = false;
        margintype = MARGIN_STATIC;
        latextype = LATEX_PARAGRAPH;
+       resumecounter = false;
+       stepmastercounter = false;
        intitle = false;
        inpreamble = false;
        needprotect = false;
@@ -249,10 +253,12 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                { "refprefix",      LT_REFPREFIX },
                { "requires",       LT_REQUIRES },
                { "resetargs",      LT_RESETARGS },
+               { "resumecounter",  LT_RESUMECOUNTER },
                { "rightdelim",     LT_RIGHTDELIM },
                { "rightmargin",    LT_RIGHTMARGIN },
                { "spacing",        LT_SPACING },
                { "spellcheck",     LT_SPELLCHECK },
+               { "stepmastercounter",  LT_STEPMASTERCOUNTER },
                { "textfont",       LT_TEXTFONT },
                { "toclevel",       LT_TOCLEVEL },
                { "toggleindent",   LT_TOGGLE_INDENT },
@@ -367,6 +373,14 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                        }
                        break;
 
+               case LT_RESUMECOUNTER:
+                       lex >> resumecounter;
+                       break;
+
+               case LT_STEPMASTERCOUNTER:
+                       lex >> stepmastercounter;
+                       break;
+
                case LT_ARGUMENT:
                        readArgument(lex);
                        break;
@@ -1139,7 +1153,9 @@ void Layout::write(ostream & os) const
        }
        os << "\tInTitle " << intitle << "\n"
              "\tInPreamble " << inpreamble << "\n"
-             "\tTocLevel " << toclevel << '\n';
+             "\tTocLevel " << toclevel << "\n"
+             "\tResumeCounter " << resumecounter << "\n"
+            "\tStepMasterCounter " << stepmastercounter << '\n';
        // ResetArgs does not make sense here
        for (LaTeXArgMap::const_iterator it = latexargs_.begin();
             it != latexargs_.end(); ++it)
index 273a36155bbedbfeb10124980993a7808737fb5b..5f964f80df421f80b3621b951514582f258554e8 100644 (file)
@@ -313,6 +313,10 @@ public:
        bool inpreamble;
        /// Which counter to step
        docstring counter;
+       /// Resume counter?
+       bool resumecounter;
+       /// Step master counter?
+       bool stepmastercounter;
        /// Prefix to use when creating labels
        docstring refprefix;
        /// Depth of XML command
index a78343769a3df7b7d1b5c257bb133692b54ece84..5b71cb0496c9a3a38c629147f3225a86a79fc37c 100644 (file)
@@ -61,7 +61,7 @@ namespace lyx {
 // You should also run the development/tools/updatelayouts.py script,
 // to update the format of all of our layout files.
 //
-int const LAYOUT_FORMAT = 60; //lasgouttes LongTableNoNumber => Unnumbered
+int const LAYOUT_FORMAT = 61; //spitz ResumeCounter, StepMasterCounter
 
 
 // Layout format for the current lyx file format. Controls which format is