X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FParagraph.cpp;h=5e582ee2ffeeaa9ad35739e775870393f6863194;hb=c7d29be153debac82e3d2e8865fcc849f0a5f40d;hp=b437cde060aa2bb41dae3d6ab564aae56dfea321;hpb=cc845ed2cf82d07c03da6dabf63a54e472b2d16e;p=lyx.git diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index b437cde060..5e582ee2ff 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -1089,14 +1089,16 @@ void Paragraph::Private::latexInset(BufferParams const & bparams, bool close = false; odocstream::pos_type const len = os.os().tellp(); - if (inset->forceLTR() - && !runparams.use_polyglossia + if (inset->forceLTR(runparams) && running_font.isRightToLeft() // ERT is an exception, it should be output with no // decorations at all && inset->lyxCode() != ERT_CODE) { - if (running_font.language()->lang() == "farsi") - os << "\\beginL" << termcmd; + if (runparams.use_polyglossia) { + os << "\\LRE{"; + } else if (running_font.language()->lang() == "farsi" + || running_font.language()->lang() == "arabic_arabi") + os << "\\textLR{" << termcmd; else os << "\\L{"; close = true; @@ -1152,12 +1154,8 @@ void Paragraph::Private::latexInset(BufferParams const & bparams, throw(e); } - if (close) { - if (running_font.language()->lang() == "farsi") - os << "\\endL" << termcmd; - else - os << '}'; - } + if (close) + os << '}'; if (os.texrow().rows() > previous_row_count) { os.texrow().start(owner_->id(), i + 1); @@ -1442,7 +1440,8 @@ void Paragraph::Private::validate(LaTeXFeatures & features) const otexstringstream os; os << layout_->preamble(); size_t const length = os.length(); - TeXOnePar(buf, buf.text(), buf.getParFromID(owner_->id()).pit(), os, + TeXOnePar(buf, *inset_owner_->getText(int(buf.getParFromID(owner_->id()).idx())), + buf.getParFromID(owner_->id()).pit(), os, features.runparams(), string(), 0, -1, true); if (os.length() > length) features.addPreambleSnippet(os.release(), true); @@ -1921,11 +1920,12 @@ char_type Paragraph::getUChar(BufferParams const & bparams, // Most likely, we should simply rely on Qt's unicode handling here. string const & lang = getFontSettings(bparams, pos).language()->lang(); - // With polyglossia, brackets and stuff need not be reversed in RTL scripts + // With polyglossia and XeTeX (bidi), brackets and stuff need not be + // reversed in RTL scripts // FIXME: The special casing for Hebrew parens is due to the special // handling on input (for Hebrew in e5f42f67d/lyxgit); see #8251. char_type uc = c; - if (rp.use_polyglossia) { + if (rp.use_polyglossia && rp.flavor == OutputParams::XETEX) { switch (c) { case '(': if (lang == "hebrew") @@ -1938,6 +1938,19 @@ char_type Paragraph::getUChar(BufferParams const & bparams, } return uc; } + // LuaTeX (luabidi) is different + if (rp.use_polyglossia && rp.flavor != OutputParams::XETEX) { + switch (c) { + case '(': + if (lang != "hebrew") + uc = ')'; + break; + case ')': + if (lang != "hebrew") + uc = '('; + break; + } + } // In the following languages, brackets don't need to be reversed. // Furthermore, in arabic_arabi, they are transformed to Arabic @@ -2033,15 +2046,29 @@ depth_type Paragraph::getMaxDepthAfter() const } -LyXAlignment Paragraph::getAlign() const +LyXAlignment Paragraph::getAlign(BufferParams const & bparams) const { if (d->params_.align() == LYX_ALIGN_LAYOUT) - return d->layout_->align; + return getDefaultAlign(bparams); else return d->params_.align(); } +LyXAlignment Paragraph::getDefaultAlign(BufferParams const & bparams) const +{ + LyXAlignment res = layout().align; + if (isRTL(bparams)) { + // Swap sides + if (res == LYX_ALIGN_LEFT) + res = LYX_ALIGN_RIGHT; + else if (res == LYX_ALIGN_RIGHT) + res = LYX_ALIGN_LEFT; + } + return res; +} + + docstring const & Paragraph::labelString() const { return d->params_.labelString(); @@ -2280,6 +2307,10 @@ int Paragraph::Private::startTeXParParams(BufferParams const & bparams, string const begin_tag = "\\begin"; InsetCode code = ownerCode(); bool const lastpar = runparams.isLastPar; + // RTL in classic (PDF)LaTeX (without the Bidi package) + // Luabibdi (used by LuaTeX) behaves like classic + bool const rtl_classic = owner_->getParLanguage(bparams)->rightToLeft() + && (!runparams.use_polyglossia || runparams.flavor != OutputParams::XETEX); switch (curAlign) { case LYX_ALIGN_NONE: @@ -2289,13 +2320,13 @@ int Paragraph::Private::startTeXParParams(BufferParams const & bparams, case LYX_ALIGN_DECIMAL: break; case LYX_ALIGN_LEFT: { - if (owner_->getParLanguage(bparams)->babel() != "hebrew") + if (!rtl_classic) corrected_env(os, begin_tag, "flushleft", code, lastpar, column); else corrected_env(os, begin_tag, "flushright", code, lastpar, column); break; } case LYX_ALIGN_RIGHT: { - if (owner_->getParLanguage(bparams)->babel() != "hebrew") + if (!rtl_classic) corrected_env(os, begin_tag, "flushright", code, lastpar, column); else corrected_env(os, begin_tag, "flushleft", code, lastpar, column); @@ -2338,6 +2369,10 @@ bool Paragraph::Private::endTeXParParams(BufferParams const & bparams, string const end_tag = "\\par\\end"; InsetCode code = ownerCode(); bool const lastpar = runparams.isLastPar; + // RTL in classic (PDF)LaTeX (without the Bidi package) + // Luabibdi (used by LuaTeX) behaves like classic + bool const rtl_classic = owner_->getParLanguage(bparams)->rightToLeft() + && (!runparams.use_polyglossia || runparams.flavor != OutputParams::XETEX); switch (curAlign) { case LYX_ALIGN_NONE: @@ -2347,13 +2382,13 @@ bool Paragraph::Private::endTeXParParams(BufferParams const & bparams, case LYX_ALIGN_DECIMAL: break; case LYX_ALIGN_LEFT: { - if (owner_->getParLanguage(bparams)->babel() != "hebrew") + if (!rtl_classic) output = corrected_env(os, end_tag, "flushleft", code, lastpar, col); else output = corrected_env(os, end_tag, "flushright", code, lastpar, col); break; } case LYX_ALIGN_RIGHT: { - if (owner_->getParLanguage(bparams)->babel() != "hebrew") + if (!rtl_classic) output = corrected_env(os, end_tag, "flushright", code, lastpar, col); else output = corrected_env(os, end_tag, "flushleft", code, lastpar, col); @@ -2463,7 +2498,7 @@ void Paragraph::latex(BufferParams const & bparams, runparams); runningChange = Change(Change::UNCHANGED); - os << "}] "; + os << (isEnvSeparator(i) ? "}]~" : "}] "); column +=3; } // For InTitle commands, we have already opened a group @@ -2712,6 +2747,14 @@ void Paragraph::latex(BufferParams const & bparams, runningChange, style, i, column); if (incremented) --parInline; + + if (deleted_display_math) { + // Close \lyxdeleted and force its + // reopening (if needed) + os << '}'; + column++; + runningChange = Change(Change::UNCHANGED); + } } } else if (i >= start_pos && (end_pos == -1 || i < end_pos)) { try { @@ -2741,6 +2784,10 @@ void Paragraph::latex(BufferParams const & bparams, // such as Note that do not produce any output, so that no // command is ever executed but its opening was recorded. runparams.inulemcmd = rp.inulemcmd; + + // These need to be passed upstream as well + runparams.need_maketitle = rp.need_maketitle; + runparams.have_maketitle = rp.have_maketitle; } // If we have an open font definition, we have to close it @@ -3320,7 +3367,10 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf, } else { char_type c = getUChar(buf.masterBuffer()->params(), runparams, i); - xs << c; + if (c == ' ' && (style.free_spacing || runparams.free_spacing)) + xs << XHTMLStream::ESCAPE_NONE << " "; + else + xs << c; } font_old = font.fontInfo(); } @@ -3520,6 +3570,14 @@ docstring Paragraph::asString(pos_type beg, pos_type end, int options, const Out if (c == META_INSET && (options & AS_STR_PLAINTEXT)) { LASSERT(runparams != 0, return docstring()); getInset(i)->plaintext(os, *runparams); + } else if (c == META_INSET && (options & AS_STR_MATHED) + && getInset(i)->lyxCode() == REF_CODE) { + Buffer const & buf = getInset(i)->buffer(); + OutputParams rp(&buf.params().encoding()); + Font const font(inherit_font, buf.params().language); + rp.local_font = &font; + otexstream ots(os); + getInset(i)->latex(ots, rp); } else { getInset(i)->toString(os); } @@ -3640,32 +3698,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 + // which does not tell whether another inset has been removed; 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 @@ -3676,11 +3745,13 @@ int Paragraph::fixBiblio(Buffer const & buffer) // than keep the first? (JMarc) Inset * inset = releaseInset(bibitem_pos); d->insetlist_.begin()->inset = inset; + // This needs to be done to update the counter (#8499) + buffer.updateBuffer(); return -bibitem_pos; } // 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); @@ -3694,6 +3765,8 @@ int Paragraph::fixBiblio(Buffer const & buffer) insertInset(0, inset, font, Change(track_changes ? Change::INSERTED : Change::UNCHANGED)); + // This is needed to get the counters right + buffer.updateBuffer(); return 1; }