]> git.lyx.org Git - features.git/commitdiff
Fix bug #6894. We save counter information during updateBuffer(), and
authorRichard Heck <rgheck@comcast.net>
Wed, 12 Jan 2011 16:04:59 +0000 (16:04 +0000)
committerRichard Heck <rgheck@comcast.net>
Wed, 12 Jan 2011 16:04:59 +0000 (16:04 +0000)
then output \setcounter macros during snippet generation, so that we get
the right equation values.

Note: It would be possible to use this same machinery to fix bugs in
instant preview, e.g., that you always get things like (0.3) as equation
numbers, if you use equations numbered by section. I'll perhaps post a
patch for that.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@37186 a592a061-630c-0410-9148-cb99ea01b6c8

src/mathed/InsetMathHull.cpp
src/mathed/InsetMathHull.h

index 38ea7cb77dbfca3fb513dd6d616f948494568f87..d99d41540ac33223e625d270f994cc5bbf3e056b 100644 (file)
@@ -224,6 +224,12 @@ void InsetMathHull::setBuffer(Buffer & buffer)
 }
 
 
+namespace {
+       const char * counters_to_save[] = {"section", "chapter"};
+       unsigned int const numcnts = sizeof(counters_to_save)/sizeof(char *);
+}
+
+
 void InsetMathHull::updateBuffer(ParIterator const & it, UpdateType utype)
 {
        if (!buffer_) {
@@ -233,18 +239,40 @@ void InsetMathHull::updateBuffer(ParIterator const & it, UpdateType utype)
                return;
        }
 
-       BufferParams const & bp = buffer_->params();
-       string const & lang = it->getParLanguage(bp)->code();
-       Counters & cnts = bp.documentClass().counters();
-       // so we don't have to write it ten times...
-       docstring const eqstr = from_ascii("equation");
+       // if any of the equations are numbered, then we want to save the values
+       // of some of the counters.
+       if (haveNumbers()) {
+               BufferParams const & bp = buffer_->params();
+               string const & lang = it->getParLanguage(bp)->code();
+               Counters & cnts = bp.documentClass().counters();
+
+               // right now, we only need to do this at export time
+               if (utype == OutputUpdate) {
+                       for (size_t i = 0; i < numcnts; ++i) {
+                               docstring const cnt = from_ascii(counters_to_save[i]);
+                               if (cnts.hasCounter(cnt))
+                                       counter_map[cnt] = cnts.value(cnt);
+                       }
+               }
 
+               // this has to be done separately
+               docstring const eqstr = from_ascii("equation");
+               if (cnts.hasCounter(eqstr)) {
+                       if (utype == OutputUpdate) {
+                               counter_map[eqstr] = cnts.value(eqstr);
+                       LYXERR0(counter_map[eqstr]);}
+                       for (size_t i = 0; i != label_.size(); ++i) {
+                               if (numbered(i)) {
+                                       cnts.step(eqstr, utype);
+                                       numbers_[i] = cnts.theCounter(eqstr, lang);
+                               } else
+                                       numbers_[i] = empty_docstring();
+                       }
+               }
+       }
+
+       // now the labels
        for (size_t i = 0; i != label_.size(); ++i) {
-               if (numbered(i) && cnts.hasCounter(eqstr)) {
-                       cnts.step(eqstr, utype);
-                       numbers_[i] = cnts.theCounter(eqstr, lang);
-               } else
-                       numbers_[i] = empty_docstring();
                if (label_[i])
                        label_[i]->updateBuffer(it, utype);
        }
@@ -561,7 +589,29 @@ void InsetMathHull::preparePreview(DocIterator const & pos,
                }
        }
 
-       docstring const snippet = macro_preamble.str() + latexString(*this);
+       docstring setcnt;
+       if (forexport && haveNumbers()) {
+               docstring eqstr = from_ascii("equation");
+               CounterMap::const_iterator it = counter_map.find(eqstr);
+               if (it != counter_map.end()) {
+                       int num = it->second;
+                       if (num >= 0)
+                               setcnt += from_ascii("\\setcounter{") + eqstr + '}' +
+                                         '{' + convert<docstring>(num) + '}' + '\n';
+               }
+               for (size_t i = 0; i != numcnts; ++i) {
+                       docstring cnt = from_ascii(counters_to_save[i]);
+                       it = counter_map.find(cnt);
+                       if (it == counter_map.end())
+                                       continue;
+                       int num = it->second;
+                       if (num > 0)
+                               setcnt += from_ascii("\\setcounter{") + cnt + '}' +
+                                         '{' + convert<docstring>(num) + '}';
+               }
+       }
+       docstring const snippet = macro_preamble.str() +
+           setcnt + latexString(*this);
        LYXERR(Debug::MACROS, "Preview snippet: " << snippet);
        preview_->addPreview(snippet, *buffer, forexport);
 }
@@ -1908,13 +1958,7 @@ int InsetMathHull::docbook(odocstream & os, OutputParams const & runparams) cons
 }
 
 
-// FIXME XHTML
-// We need to do something about alignment here.
-//
-// This duplicates code from InsetMathGrid, but
-// we need access here to number information,
-// and we simply do not have that in InsetMathGrid.
-void InsetMathHull::htmlize(HtmlStream & os) const
+bool InsetMathHull::haveNumbers() const
 {
        bool havenumbers = false;
        for (size_t i = 0; i != numbered_.size(); ++i) {
@@ -1923,6 +1967,19 @@ void InsetMathHull::htmlize(HtmlStream & os) const
                        break;
                }
        }
+       return havenumbers;
+}
+
+
+// FIXME XHTML
+// We need to do something about alignment here.
+//
+// This duplicates code from InsetMathGrid, but
+// we need access here to number information,
+// and we simply do not have that in InsetMathGrid.
+void InsetMathHull::htmlize(HtmlStream & os) const
+{
+       bool const havenumbers = haveNumbers();
        bool const havetable = havenumbers || nrows() > 1 || ncols() > 1;
 
        if (!havetable) {
@@ -1956,13 +2013,7 @@ void InsetMathHull::htmlize(HtmlStream & os) const
 // and we simply do not have that in InsetMathGrid.
 void InsetMathHull::mathmlize(MathStream & os) const
 {
-       bool havenumbers = false;
-       for (size_t i = 0; i != numbered_.size(); ++i) {
-               if (numbered_[i]) {
-                       havenumbers = true;
-                       break;
-               }
-       }
+       bool havenumbers = haveNumbers();
        bool const havetable = havenumbers || nrows() > 1 || ncols() > 1;
 
        if (havetable)
@@ -1999,13 +2050,7 @@ void InsetMathHull::mathmlize(MathStream & os) const
 void InsetMathHull::mathAsLatex(WriteStream & os) const
 {
        MathEnsurer ensurer(os, false);
-       bool havenumbers = false;
-       for (size_t i = 0; i != numbered_.size(); ++i) {
-               if (numbered_[i]) {
-                       havenumbers = true;
-                       break;
-               }
-       }
+       bool havenumbers = haveNumbers();
        bool const havetable = havenumbers || nrows() > 1 || ncols() > 1;
 
        if (!havetable) {
@@ -2115,7 +2160,6 @@ docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
        // if mathtype was LaTeX, since we won't have entered any of the
        // earlier branches
        if (!success /* || mathtype != BufferParams::LaTeX */) {
-               string const tag = (getType() == hullSimple) ? "span" : "div";
                // Unfortunately, we cannot use latexString() because we do not want
                // $...$ or whatever.
                odocstringstream ls;
@@ -2128,6 +2172,7 @@ docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
                // http://www.math.union.edu/~dpvc/jsMath/
                // FIXME XHTML
                // probably should allow for some kind of customization here
+               string const tag = (getType() == hullSimple) ? "span" : "div";
                xs << html::StartTag(tag, "class='math'")
                   << XHTMLStream::ESCAPE_AND
                   << latex 
index fada2035310b53497a925f9787449cc5abb60a74..59bc4244b74d93434246125376f0bf0ec20b673f 100644 (file)
@@ -222,6 +222,8 @@ private:
        bool rowChangeOK() const;
        /// can this change its number of cols?
        bool colChangeOK() const;
+       /// are any of the equations numbered?
+       bool haveNumbers() const;
 
        /// "none", "simple", "display", "eqnarray",...
        HullType type_;
@@ -237,6 +239,10 @@ private:
        mutable bool use_preview_;
        ///
        DocIterator docit_;
+       ///
+       typedef std::map<docstring, int> CounterMap;
+       /// used to store current values of important counters
+       CounterMap counter_map;
 //
 // Incorporate me
 //