]> git.lyx.org Git - features.git/blobdiff - src/Paragraph.cpp
Do not try to pop from an empty stack
[features.git] / src / Paragraph.cpp
index 10131efc7350b7a8e4815ad7164444d97bca6932..a08f3ac0074ec613bac5e691a4f4c7fa2eb45753 100644 (file)
@@ -1240,7 +1240,7 @@ void Paragraph::Private::latexSpecialChar(otexstream & os,
        //       non-standard font encoding. If we are using such a language,
        //       we do not output special T1 chars.
        if (!runparams.inIPA && !running_font.language()->internalFontEncoding()
-           && !runparams.isFullUnicode() && bparams.main_font_encoding() == "T1"
+           && !runparams.isFullUnicode() && runparams.main_fontenc == "T1"
            && latexSpecialT1(c, os, i, column))
                return;
        // NOTE: "fontspec" (non-TeX fonts) sets the font encoding to "TU" (untill 2017 "EU1" or "EU2")
@@ -1532,7 +1532,7 @@ void Paragraph::Private::validate(LaTeXFeatures & features) const
                if (c == 0x0022) {
                        if (features.runparams().isFullUnicode() && bp.useNonTeXFonts)
                                features.require("textquotedblp");
-                       else if (bp.main_font_encoding() != "T1"
+                       else if (features.runparams().main_fontenc != "T1"
                                 || ((&owner_->getFontSettings(bp, i))->language()->internalFontEncoding()))
                                features.require("textquotedbl");
                } else if (ci.textfeature() && contains(ci.textpreamble(), '=')) {
@@ -2269,6 +2269,12 @@ bool Paragraph::isPassThru() const
 }
 
 
+bool Paragraph::parbreakIsNewline() const
+{
+       return inInset().getLayout().parbreakIsNewline() || d->layout_->parbreak_is_newline;
+}
+
+
 bool Paragraph::isPartOfTextSequence() const
 {
        for (pos_type i = 0; i < size(); ++i) {
@@ -2355,14 +2361,23 @@ int Paragraph::Private::startTeXParParams(BufferParams const & bparams,
        // 1. that cannot have indentation or are indented always,
        // 2. that are not part of the immediate text sequence (e.g., contain only floats),
        // 3. that are PassThru,
-       // 4. that are centered,
-       // 5. or start with a vspace.
-       if (canindent && params_.noindent() && owner_->isPartOfTextSequence()
-           && !layout_->pass_thru && curAlign != LYX_ALIGN_CENTER
-           && !owner_->empty()
-           && (!owner_->isInset(0) || owner_->getInset(0)->lyxCode() != VSPACE_CODE)) {
-               os << "\\noindent" << termcmd;
-               column += 10;
+       // 4. or that are centered.
+       if (canindent && params_.noindent()
+           && owner_->isPartOfTextSequence()
+           && !layout_->pass_thru
+           && curAlign != LYX_ALIGN_CENTER) {
+               if (!owner_->empty()
+                   && (owner_->isInset(0)
+                       && owner_->getInset(0)->lyxCode() == VSPACE_CODE))
+                       // If the paragraph starts with a vspace, the \\noindent
+                       // needs to come after that (as it leaves vmode).
+                       // If the paragraph consists only of the vspace,
+                       // \\noindent is not needed at all.
+                       runparams.need_noindent = owner_->size() > 1;
+               else {
+                       os << "\\noindent" << termcmd;
+                       column += 10;
+               }
        }
 
        if (curAlign == layout_->align)
@@ -2524,10 +2539,9 @@ void Paragraph::latex(BufferParams const & bparams,
        pos_type body_pos = beginOfBody();
        unsigned int column = 0;
 
-       // If we are inside an non inheritFont() inset, the real outerfont is local_font
-       Font const real_outerfont = (!inInset().inheritFont()
-                                    && runparams.local_font != nullptr)
-                       ? Font(runparams.local_font->fontInfo()) : outerfont;
+       // If we are inside an non inheritFont() inset, the outerfont is the default font
+       Font const real_outerfont =
+               inInset().inheritFont() ? outerfont : Font(bparams.documentClass().defaultfont());
 
        if (body_pos > 0) {
                // the optional argument is kept in curly brackets in
@@ -2791,7 +2805,8 @@ void Paragraph::latex(BufferParams const & bparams,
                        string end_tag = subst(lang_end_command, "$$lang", running_lang);
                        os << from_ascii(end_tag);
                        column += end_tag.length();
-                       popLanguageName();
+                       if (!languageStackEmpty())
+                               popLanguageName();
                }
 
                // Switch file encoding if necessary (and allowed)
@@ -4099,27 +4114,12 @@ bool Paragraph::needsCProtection(bool const fragile) const
        }
 
        // now check whether we have insets that need cprotection
-       pos_type size = pos_type(d->text_.size());
-       for (pos_type i = 0; i < size; ++i) {
-               if (!isInset(i))
+       for (auto const & icit : d->insetlist_) {
+               Inset const * ins = icit.inset;
+               if (!ins)
                        continue;
-               Inset const * ins = getInset(i);
                if (ins->needsCProtection(maintext, fragile))
                        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;
@@ -4849,6 +4849,19 @@ Language * Paragraph::Private::getSpellLanguage(pos_type const from) const
 void Paragraph::requestSpellCheck(pos_type pos)
 {
        d->requestSpellCheck(pos);
+       if (pos == -1) {
+               // Also request spellcheck within (text) insets
+               for (auto const & insets : insetList()) {
+                       if (!insets.inset->asInsetText())
+                               continue;
+                       ParagraphList & inset_pars =
+                               insets.inset->asInsetText()->paragraphs();
+                       ParagraphList::iterator pit = inset_pars.begin();
+                       ParagraphList::iterator pend = inset_pars.end();
+                       for (; pit != pend; ++pit)
+                               pit->requestSpellCheck();
+               }
+       }
 }