New layout tags for better counter handling

* ResumeCounter: allow to resume an (enumerate) counter
* StepMasterCounter: allow to increase a master counter
This commit is contained in:
Juergen Spitzmueller 2016-10-14 20:08:12 +02:00
parent 91f5d90971
commit 0eb651a2cf
8 changed files with 166 additions and 5 deletions

View File

@ -14684,6 +14684,62 @@ CopyStyle
\begin_inset Flex Code \begin_inset Flex Code
status collapsed 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 \begin_layout Plain Layout
RightDelim RightDelim
\end_layout \end_layout
@ -14918,6 +14974,63 @@ status collapsed
\begin_inset Flex Code \begin_inset Flex Code
status collapsed 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 \begin_layout Plain Layout
TextFont TextFont
\end_layout \end_layout

View File

@ -11,7 +11,7 @@
# This script will update a .layout file to current format # This script will update a .layout file to current format
# The latest layout format is also defined in src/TextClass.cpp # The latest layout format is also defined in src/TextClass.cpp
currentFormat = 60 currentFormat = 61
# Incremented to format 4, 6 April 2007, lasgouttes # Incremented to format 4, 6 April 2007, lasgouttes
@ -202,6 +202,9 @@ currentFormat = 60
# Incremented to format 60, 25 March 2016 by lasgouttes # Incremented to format 60, 25 March 2016 by lasgouttes
# Rename caption subtype LongTableNoNumber to Unnumbered # 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 # Do not forget to document format change in Customization
# Manual (section "Declaring a new text class"). # Manual (section "Declaring a new text class").
@ -445,6 +448,11 @@ def convert(lines, end_format):
i += 1 i += 1
continue continue
if format == 60:
# nothing to do.
i += 1
continue
if format == 59: if format == 59:
match = re_InsetLayout_CaptionLTNN.match(lines[i]) match = re_InsetLayout_CaptionLTNN.match(lines[i])
if not match: if not match:

View File

@ -4673,7 +4673,7 @@ static bool needEnumCounterReset(ParIterator const & it)
--prev_it.top().pit(); --prev_it.top().pit();
Paragraph const & prev_par = *prev_it; Paragraph const & prev_par = *prev_it;
if (prev_par.getDepth() <= cur_depth) 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 // start of nested inset: reset
return true; return true;
@ -4757,8 +4757,12 @@ void Buffer::Impl::setLabel(ParIterator & it, UpdateType utype) const
break; break;
} }
// Increase the master counter?
if (layout.stepmastercounter && needEnumCounterReset(it))
counters.stepMaster(enumcounter, utype);
// Maybe we have to reset the enumeration counter. // Maybe we have to reset the enumeration counter.
if (needEnumCounterReset(it)) if (!layout.resumecounter && needEnumCounterReset(it))
counters.reset(enumcounter); counters.reset(enumcounter);
counters.step(enumcounter, utype); counters.step(enumcounter, utype);

View 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) void Counters::step(docstring const & ctr, UpdateType utype)
{ {
CounterList::iterator it = counterList_.find(ctr); CounterList::iterator it = counterList_.find(ctr);

View File

@ -130,6 +130,10 @@ public:
int value(docstring const & ctr) const; int value(docstring const & ctr) const;
/// Reset recursively all the counters that are slaves of the one named by \c ctr. /// Reset recursively all the counters that are slaves of the one named by \c ctr.
void resetSlaves(docstring const & 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 /// Increment by one counter named by \c ctr, and zeroes slave
/// counter(s) for which it is the master. /// counter(s) for which it is the master.
/// \param utype determines whether we track the counters. /// \param utype determines whether we track the counters.

View File

@ -105,6 +105,8 @@ enum LayoutTags {
LT_SPELLCHECK, LT_SPELLCHECK,
LT_REFPREFIX, LT_REFPREFIX,
LT_RESETARGS, LT_RESETARGS,
LT_RESUMECOUNTER,
LT_STEPMASTERCOUNTER,
LT_RIGHTDELIM, LT_RIGHTDELIM,
LT_FORCELOCAL, LT_FORCELOCAL,
LT_TOGGLE_INDENT, LT_TOGGLE_INDENT,
@ -121,6 +123,8 @@ Layout::Layout()
unknown_ = false; unknown_ = false;
margintype = MARGIN_STATIC; margintype = MARGIN_STATIC;
latextype = LATEX_PARAGRAPH; latextype = LATEX_PARAGRAPH;
resumecounter = false;
stepmastercounter = false;
intitle = false; intitle = false;
inpreamble = false; inpreamble = false;
needprotect = false; needprotect = false;
@ -249,10 +253,12 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
{ "refprefix", LT_REFPREFIX }, { "refprefix", LT_REFPREFIX },
{ "requires", LT_REQUIRES }, { "requires", LT_REQUIRES },
{ "resetargs", LT_RESETARGS }, { "resetargs", LT_RESETARGS },
{ "resumecounter", LT_RESUMECOUNTER },
{ "rightdelim", LT_RIGHTDELIM }, { "rightdelim", LT_RIGHTDELIM },
{ "rightmargin", LT_RIGHTMARGIN }, { "rightmargin", LT_RIGHTMARGIN },
{ "spacing", LT_SPACING }, { "spacing", LT_SPACING },
{ "spellcheck", LT_SPELLCHECK }, { "spellcheck", LT_SPELLCHECK },
{ "stepmastercounter", LT_STEPMASTERCOUNTER },
{ "textfont", LT_TEXTFONT }, { "textfont", LT_TEXTFONT },
{ "toclevel", LT_TOCLEVEL }, { "toclevel", LT_TOCLEVEL },
{ "toggleindent", LT_TOGGLE_INDENT }, { "toggleindent", LT_TOGGLE_INDENT },
@ -367,6 +373,14 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
} }
break; break;
case LT_RESUMECOUNTER:
lex >> resumecounter;
break;
case LT_STEPMASTERCOUNTER:
lex >> stepmastercounter;
break;
case LT_ARGUMENT: case LT_ARGUMENT:
readArgument(lex); readArgument(lex);
break; break;
@ -1139,7 +1153,9 @@ void Layout::write(ostream & os) const
} }
os << "\tInTitle " << intitle << "\n" os << "\tInTitle " << intitle << "\n"
"\tInPreamble " << inpreamble << "\n" "\tInPreamble " << inpreamble << "\n"
"\tTocLevel " << toclevel << '\n'; "\tTocLevel " << toclevel << "\n"
"\tResumeCounter " << resumecounter << "\n"
"\tStepMasterCounter " << stepmastercounter << '\n';
// ResetArgs does not make sense here // ResetArgs does not make sense here
for (LaTeXArgMap::const_iterator it = latexargs_.begin(); for (LaTeXArgMap::const_iterator it = latexargs_.begin();
it != latexargs_.end(); ++it) it != latexargs_.end(); ++it)

View File

@ -313,6 +313,10 @@ public:
bool inpreamble; bool inpreamble;
/// Which counter to step /// Which counter to step
docstring counter; docstring counter;
/// Resume counter?
bool resumecounter;
/// Step master counter?
bool stepmastercounter;
/// Prefix to use when creating labels /// Prefix to use when creating labels
docstring refprefix; docstring refprefix;
/// Depth of XML command /// Depth of XML command

View File

@ -61,7 +61,7 @@ namespace lyx {
// You should also run the development/tools/updatelayouts.py script, // You should also run the development/tools/updatelayouts.py script,
// to update the format of all of our layout files. // 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 // Layout format for the current lyx file format. Controls which format is