From: Richard Heck Date: Wed, 12 Jan 2011 16:04:59 +0000 (+0000) Subject: Fix bug #6894. We save counter information during updateBuffer(), and X-Git-Tag: 2.0.0~1125 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=645f9fdf6d6f58b4c0b7c19a68721cd03c03438b;p=features.git Fix bug #6894. We save counter information during updateBuffer(), and 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 --- diff --git a/src/mathed/InsetMathHull.cpp b/src/mathed/InsetMathHull.cpp index 38ea7cb77d..d99d41540a 100644 --- a/src/mathed/InsetMathHull.cpp +++ b/src/mathed/InsetMathHull.cpp @@ -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(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(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 diff --git a/src/mathed/InsetMathHull.h b/src/mathed/InsetMathHull.h index fada203531..59bc4244b7 100644 --- a/src/mathed/InsetMathHull.h +++ b/src/mathed/InsetMathHull.h @@ -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 CounterMap; + /// used to store current values of important counters + CounterMap counter_map; // // Incorporate me //