mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 18:08:10 +00:00
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
This commit is contained in:
parent
f1a54ebe18
commit
645f9fdf6d
@ -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;
|
||||
}
|
||||
|
||||
// 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();
|
||||
// so we don't have to write it ten times...
|
||||
docstring const eqstr = from_ascii("equation");
|
||||
|
||||
// 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.hasCounter(eqstr)) {
|
||||
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 (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
|
||||
|
@ -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
|
||||
//
|
||||
|
Loading…
Reference in New Issue
Block a user