Reimplement support for numbering of equation previews

This patch simplifies and fixes the generation of previews with
numbering. Instead of saving the counter values (which is complicated
and error prone), the \thequation macro is set to the numbers_ string
which has been computed by updateBuffer for screen display.

Harcoding the number in the formula means that two equations with
different numbers have different previews, which is the subject of the
bug.

The special code for saving counters in updateBuffer and outputing
them in preparePreview from 645f9fdf (ticket #6894) is removed and
replaced by this simpler approach.

This fixes ticket #11535.
This commit is contained in:
Jean-Marc Lasgouttes 2022-07-25 22:09:14 +02:00
parent a42f7ea7cd
commit a65e12d6f3
2 changed files with 5 additions and 38 deletions

View File

@ -253,20 +253,9 @@ void InsetMathHull::updateBuffer(ParIterator const & it, UpdateType utype, bool
Counters & cnts =
buffer_->masterBuffer()->params().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);
for (size_t i = 0; i != label_.size(); ++i) {
if (numbered(i)) {
Paragraph const & par = it.paragraph();
@ -837,29 +826,7 @@ void InsetMathHull::preparePreview(DocIterator const & pos,
if (lsize != "normalsize" && !prefixIs(lsize, "error"))
setfont += from_ascii("\\" + lsize + '\n');
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 + setfont + setcnt
+ latexString(*this) + endfont;
docstring const snippet = macro_preamble + setfont + latexString(*this) + endfont;
LYXERR(Debug::MACROS, "Preview snippet: " << snippet);
preview_->addPreview(snippet, *buffer, forexport);
}
@ -1696,6 +1663,10 @@ void InsetMathHull::eol(TeXMathStream & os, row_type row, bool fragile, bool lat
else if (numbered_[row] == NOTAG)
os<< "\\notag ";
}
if (os.output() == TeXMathStream::wsPreview && !numbers_[row].empty()) {
os << "\\global\\def\\theequation{" << numbers_[row] << "}\n";
}
}
// Never add \\ on the last empty line of eqnarray and friends
last_eoln = false;

View File

@ -270,10 +270,6 @@ private:
unique_ptr<RenderPreview> preview_;
///
DocIterator docit_;
///
typedef std::map<docstring, int> CounterMap;
/// used to store current values of important counters
CounterMap counter_map;
//
// Incorporate me
//