Author: rgheck
Date: Wed Jan 12 17:04:59 2011
New Revision: 37186
URL: http://www.lyx.org/trac/changeset/37186
Log:
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.
Modified:
lyx-devel/trunk/src/mathed/InsetMathHull.cpp
lyx-devel/trunk/src/mathed/InsetMathHull.h
Modified: lyx-devel/trunk/src/mathed/InsetMathHull.cpp
==============================================================================
--- lyx-devel/trunk/src/mathed/InsetMathHull.cpp Wed Jan 12 14:50:46
2011 (r37185)
+++ lyx-devel/trunk/src/mathed/InsetMathHull.cpp Wed Jan 12 17:04:59
2011 (r37186)
@@ -224,6 +224,12 @@
}
+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 @@
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 @@
}
}
- 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 @@
}
-// 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 @@
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 @@
// 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::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 @@
// 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 @@
// 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
Modified: lyx-devel/trunk/src/mathed/InsetMathHull.h
==============================================================================
--- lyx-devel/trunk/src/mathed/InsetMathHull.h Wed Jan 12 14:50:46 2011
(r37185)
+++ lyx-devel/trunk/src/mathed/InsetMathHull.h Wed Jan 12 17:04:59 2011
(r37186)
@@ -222,6 +222,8 @@
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 @@
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
//