From 0eb651a2cf6c8c4d39e461748292ffe4e69f2386 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Fri, 14 Oct 2016 20:08:12 +0200 Subject: [PATCH] New layout tags for better counter handling * ResumeCounter: allow to resume an (enumerate) counter * StepMasterCounter: allow to increase a master counter --- lib/doc/Customization.lyx | 113 +++++++++++++++++++++++++++++++++++ lib/scripts/layout2layout.py | 10 +++- src/Buffer.cpp | 8 ++- src/Counters.cpp | 12 ++++ src/Counters.h | 4 ++ src/Layout.cpp | 18 +++++- src/Layout.h | 4 ++ src/TextClass.cpp | 2 +- 8 files changed, 166 insertions(+), 5 deletions(-) diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx index 919f7a414b..8a45f6e39d 100644 --- a/lib/doc/Customization.lyx +++ b/lib/doc/Customization.lyx @@ -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 diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py index 113227b8ef..753ef5e0c4 100644 --- a/lib/scripts/layout2layout.py +++ b/lib/scripts/layout2layout.py @@ -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: diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 99641e278c..8f04ae4e0b 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -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); diff --git a/src/Counters.cpp b/src/Counters.cpp index 0b17aa1b9b..75c891128e 100644 --- a/src/Counters.cpp +++ b/src/Counters.cpp @@ -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); diff --git a/src/Counters.h b/src/Counters.h index 4ba0d00484..360e297070 100644 --- a/src/Counters.h +++ b/src/Counters.h @@ -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. diff --git a/src/Layout.cpp b/src/Layout.cpp index d6a01c9f7c..f3af698615 100644 --- a/src/Layout.cpp +++ b/src/Layout.cpp @@ -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) diff --git a/src/Layout.h b/src/Layout.h index 273a36155b..5f964f80df 100644 --- a/src/Layout.h +++ b/src/Layout.h @@ -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 diff --git a/src/TextClass.cpp b/src/TextClass.cpp index a78343769a..5b71cb0496 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -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 -- 2.39.5