X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraph.cpp;h=59cfa6457674363a652c7373dd3fbe66b4418810;hb=1e519d1115f41f71c253cb9e2fbb7803e9a583a9;hp=e5327a4a3e851ffdd9d535c941bc9026eff989df;hpb=0a4686d8d345e7d2924bf990e99d957f045d581e;p=lyx.git diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index e5327a4a3e..59cfa64576 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -1647,6 +1647,8 @@ void Paragraph::validate(LaTeXFeatures & features) const d->validate(features); bool fragile = features.runparams().moving_arg; fragile |= layout().needprotect; + if (inInset().getLayout().isNeedProtect()) + fragile = true; if (needsCProtection(fragile)) features.require("cprotect"); } @@ -3435,10 +3437,31 @@ bool Paragraph::needsCProtection(bool const fragile) const } // now check whether we have insets that need cprotection - pos_type size = d->text_.size(); - for (pos_type i = 0; i < size; ++i) - if (isInset(i) && getInset(i)->needsCProtection(maintext, fragile)) + pos_type size = pos_type(d->text_.size()); + for (pos_type i = 0; i < size; ++i) { + if (!isInset(i)) + continue; + Inset const * ins = getInset(i); + if (ins->needsCProtection(maintext, fragile)) + return true; + if (ins->getLayout().latextype() == InsetLayout::ENVIRONMENT) + // Environments need cprotection regardless the content return true; + // Now check math environments + InsetMath const * im = getInset(i)->asInsetMath(); + if (!im || im->cell(0).empty()) + continue; + switch(im->cell(0)[0]->lyxCode()) { + case MATH_AMSARRAY_CODE: + case MATH_SUBSTACK_CODE: + case MATH_ENV_CODE: + case MATH_XYMATRIX_CODE: + // these need cprotection + return true; + default: + break; + } + } return false; } @@ -3669,32 +3692,43 @@ bool Paragraph::allowEmpty() const bool Paragraph::brokenBiblio() const { - // there is a problem if there is no bibitem at position 0 or - // if there is another bibitem in the paragraph. - return d->layout_->labeltype == LABEL_BIBLIO + // There is a problem if there is no bibitem at position 0 in + // paragraphs that need one, if there is another bibitem in the + // paragraph or if this paragraph is not supposed to have + // a bibitem inset at all. + return ((d->layout_->labeltype == LABEL_BIBLIO && (d->insetlist_.find(BIBITEM_CODE) != 0 - || d->insetlist_.find(BIBITEM_CODE, 1) > 0); + || d->insetlist_.find(BIBITEM_CODE, 1) > 0)) + || (d->layout_->labeltype != LABEL_BIBLIO + && d->insetlist_.find(BIBITEM_CODE) != -1)); } int Paragraph::fixBiblio(Buffer const & buffer) { - // FIXME: What about the case where paragraph is not BIBLIO - // but there is an InsetBibitem? // FIXME: when there was already an inset at 0, the return value is 1, // which does not tell whether another inset has been remove; the // cursor cannot be correctly updated. - if (d->layout_->labeltype != LABEL_BIBLIO) - return 0; - bool const track_changes = buffer.params().track_changes; int bibitem_pos = d->insetlist_.find(BIBITEM_CODE); - bool const hasbibitem0 = bibitem_pos == 0; + // The case where paragraph is not BIBLIO + if (d->layout_->labeltype != LABEL_BIBLIO) { + if (bibitem_pos == -1) + // No InsetBibitem => OK + return 0; + // There is an InsetBibitem: remove it! + d->insetlist_.release(bibitem_pos); + eraseChar(bibitem_pos, track_changes); + return (bibitem_pos == 0) ? -1 : -bibitem_pos; + } + + bool const hasbibitem0 = bibitem_pos == 0; if (hasbibitem0) { bibitem_pos = d->insetlist_.find(BIBITEM_CODE, 1); - // There was an InsetBibitem at pos 0, and no other one => OK + // There was an InsetBibitem at pos 0, + // and no other one => OK if (bibitem_pos == -1) return 0; // there is a bibitem at the 0 position, but since @@ -3709,7 +3743,7 @@ int Paragraph::fixBiblio(Buffer const & buffer) } // We need to create an inset at the beginning - Inset * inset = 0; + Inset * inset = nullptr; if (bibitem_pos > 0) { // there was one somewhere in the paragraph, let's move it inset = d->insetlist_.release(bibitem_pos);