]> git.lyx.org Git - lyx.git/commitdiff
Implement on screen numbering for Subequation module
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Fri, 22 Jul 2022 22:56:07 +0000 (00:56 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 25 Jul 2022 22:49:09 +0000 (00:49 +0200)
The module subequation allows to number equations in the "Subfigure"
inset to be numbered (1a), (1b), (1c), etc.

To implement this on screen, we need to redefine temporarily the
"equation" counter to use this different numbering.

To this end, implement Counters::copy method that can be used to
backup full counter definitions.

Fixes bug #12567.

src/Counters.cpp
src/Counters.h
src/insets/InsetFlex.cpp

index 519cb2734668e9a39c440bec0236d5208cde0919..0133f76bcab455f876c0f05631641313d09dfe32 100644 (file)
@@ -421,6 +421,16 @@ void Counters::reset(docstring const & match)
 }
 
 
+bool Counters::copy(docstring const & cnt, docstring const & newcnt)
+{
+       auto const it = counterList_.find(cnt);
+       if (it == counterList_.end())
+               return false;
+       counterList_[newcnt] = it->second;
+       return true;
+}
+
+
 bool Counters::remove(docstring const & cnt)
 {
        bool retval = counterList_.erase(cnt);
index 7a82df430148eb76ed8c8831409298d9f08ae965..57fff35faee57d094245a4870e88955f338fc6d3 100644 (file)
@@ -162,6 +162,8 @@ public:
        void reset();
        /// Reset counters matched by match string.
        void reset(docstring const & match);
+       /// Copy counter \p cnt to \p newcnt.
+       bool copy(docstring const & cnt, docstring const & newcnt);
        /// Remove counter \p cnt.
        bool remove(docstring const & cnt);
        /** returns the expanded string representation of counter \c
index e6076102f687ce9c428dc9c8574e68442653e307..3cf709aee3a611de7c1c0076cd390817757acd63 100644 (file)
@@ -24,6 +24,7 @@
 #include "ParIterator.h"
 #include "TextClass.h"
 
+#include "support/debug.h"
 #include "support/gettext.h"
 #include "support/lstrings.h"
 
@@ -149,11 +150,35 @@ void InsetFlex::updateBuffer(ParIterator const & it, UpdateType utype, bool cons
        docstring custom_label = translateIfPossible(il.labelstring());
 
        Counters & cnts = bp.documentClass().counters();
+
+       // Special case for `subequations' module.
+       if (il.latextype() == InsetLaTeXType::ENVIRONMENT &&
+           il.latexname() == "subequations") {
+               docstring equation(from_ascii("equation"));
+               docstring parentequation(from_ascii("parentequation"));
+               if (!deleted)
+                       cnts.step(equation, utype);
+               // save a copy of the equation counter definition
+               cnts.copy(equation, parentequation);
+               // redefine the equation counter definition
+               docstring const eqlabel = deleted ? from_ascii("#")
+                       : cnts.theCounter(equation, it->getParLanguage(bp)->code());
+               cnts.newCounter(equation, parentequation,
+                               eqlabel + from_ascii("\\alph{equation}"),
+                               eqlabel + from_ascii("\\alph{equation}"),
+                               cnts.guiName(parentequation));
+               InsetCollapsible::updateBuffer(it, utype, deleted);
+               // reset equation counter as it was.
+               cnts.copy(parentequation, equation);
+               cnts.remove(parentequation);
+               return;
+       }
+
        docstring const & count = il.counter();
        bool const have_counter = cnts.hasCounter(count);
        if (have_counter) {
                Paragraph const & par = it.paragraph();
-               if (!par.isDeleted(it.pos())) {
+               if (!deleted) {
                        cnts.step(count, utype);
                        custom_label += ' ' +
                                cnts.theCounter(count, it.paragraph().getParLanguage(bp)->code());