X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraph.cpp;h=1ec43ed1634621b2219c18c00520c8adbd5b7840;hb=da1c04ea9a13dcfe75ad7e727811e9d3004609aa;hp=914ec5d85793c4939aa79a574cbe82681e60c07b;hpb=4a53fa6e018c2809a3e829c7d8d90590e420a2e3;p=lyx.git diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index 914ec5d857..1ec43ed163 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -42,6 +42,7 @@ #include "TexRow.h" #include "VSpace.h" +#include "frontends/alert.h" #include "frontends/FontMetrics.h" #include "insets/InsetBibitem.h" @@ -66,6 +67,7 @@ using std::ostream; namespace lyx { using support::contains; +using support::suffixIs; using support::rsplit; @@ -189,7 +191,7 @@ public: /// void simpleTeXSpecialChars(Buffer const &, BufferParams const &, odocstream &, - TexRow & texrow, OutputParams const &, + TexRow & texrow, OutputParams &, Font & running_font, Font & basefont, Font const & outerfont, @@ -660,7 +662,7 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf, BufferParams const & bparams, odocstream & os, TexRow & texrow, - OutputParams const & runparams, + OutputParams & runparams, Font & running_font, Font & basefont, Font const & outerfont, @@ -724,6 +726,11 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf, break; } + if (lookupChange(i).type == Change::DELETED) { + if( ++runparams.inDeletedInset == 1) + runparams.changeOfDeletedInset = lookupChange(i); + } + if (inset->canTrackChanges()) { column += Changes::latexMarkChange(os, bparams, running_change, Change(Change::UNCHANGED)); @@ -744,20 +751,39 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf, close = true; } -#ifdef WITH_WARNINGS -#warning Bug: we can have an empty font change here! +// FIXME: Bug: we can have an empty font change here! // if there has just been a font change, we are going to close it // right now, which means stupid latex code like \textsf{}. AFAIK, // this does not harm dvi output. A minor bug, thus (JMarc) -#endif - // some insets cannot be inside a font change command + // Some insets cannot be inside a font change command. + // However, even such insets *can* be placed in \L or \R + // or their equivalents (for RTL language switches), so we don't + // close the language in those cases. + // ArabTeX, though, cannot handle this special behavior, it seems. + bool arabtex = basefont.language()->lang() == "arabic_arabtex" || + running_font.language()->lang() == "arabic_arabtex"; if (open_font && inset->noFontChange()) { - column += running_font.latexWriteEndChanges( + bool closeLanguage = arabtex || + basefont.isRightToLeft() == running_font.isRightToLeft(); + unsigned int count = running_font.latexWriteEndChanges( os, bparams, runparams, - basefont, basefont); - open_font = false; - basefont = owner_->getLayoutFont(bparams, outerfont); - running_font = basefont; + basefont, basefont, closeLanguage); + column += count; + // if any font properties were closed, update the running_font, + // making sure, however, to leave the language as it was + if (count > 0) { + // FIXME: probably a better way to keep track of the old + // language, than copying the entire font? + Font const copy_font(running_font); + basefont = owner_->getLayoutFont(bparams, outerfont); + running_font = basefont; + if (!closeLanguage) + running_font.setLanguage(copy_font.language()); + // leave font open if language is still open + open_font = (running_font.language() == basefont.language()); + if (closeLanguage) + runparams.local_font = &basefont; + } } int tmp = inset->latex(buf, os, runparams); @@ -778,6 +804,10 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf, } else { column += os.tellp() - len; } + + if (lookupChange(i).type == Change::DELETED) { + --runparams.inDeletedInset; + } } break; @@ -1652,9 +1682,13 @@ docstring Paragraph::expandLabel(Layout_ptr const & layout, void Paragraph::applyLayout(Layout_ptr const & new_layout) { layout(new_layout); - params().labelWidthString(docstring()); - params().align(LYX_ALIGN_LAYOUT); - params().spacing(Spacing(Spacing::Default)); + LyXAlignment const oldAlign = params().align(); + + if (!(oldAlign & layout()->alignpossible)) { + frontend::Alert::warning(_("Alignment not permitted"), + _("The new layout does not permit the alignment previously used.\nSetting to default.")); + params().align(LYX_ALIGN_LAYOUT); + } } @@ -2010,7 +2044,8 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, runparams.moving_arg); } - Change const & change = pimpl_->lookupChange(i); + Change const & change = runparams.inDeletedInset ? runparams.changeOfDeletedInset + : pimpl_->lookupChange(i); if (bparams.outputChanges && runningChange != change) { if (open_font) { @@ -2069,11 +2104,20 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, font.language() != running_font.language()) && i != body_pos - 1) { - column += font.latexWriteStartChanges(os, bparams, + odocstringstream ods; + column += font.latexWriteStartChanges(ods, bparams, runparams, basefont, last_font); running_font = font; open_font = true; + docstring fontchange = ods.str(); + // check if the fontchange ends with a trailing blank + // (like "\small " (see bug 3382) + if (suffixIs(fontchange, ' ') && c == ' ') + os << fontchange.substr(0, fontchange.size() - 1) + << from_ascii("{}"); + else + os << fontchange; } if (c == ' ') { @@ -2103,6 +2147,10 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, texrow, rp, running_font, basefont, outerfont, open_font, runningChange, *style, i, column, c); + + // Set the encoding to that returned from simpleTeXSpecialChars (see + // comment for encoding member in OutputParams.h) + runparams.encoding = rp.encoding; } // If we have an open font definition, we have to close it @@ -2118,11 +2166,9 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, runparams, basefont, basefont); } #else -#ifdef WITH_WARNINGS -//#warning For now we ALWAYS have to close the foreign font settings if they are -//#warning there as we start another \selectlanguage with the next paragraph if -//#warning we are in need of this. This should be fixed sometime (Jug) -#endif +//FIXME: For now we ALWAYS have to close the foreign font settings if they are +//FIXME: there as we start another \selectlanguage with the next paragraph if +//FIXME: we are in need of this. This should be fixed sometime (Jug) running_font.latexWriteEndChanges(os, bparams, runparams, basefont, basefont); #endif @@ -2354,9 +2400,7 @@ Paragraph::getParLanguage(BufferParams const & bparams) const { if (!empty()) return getFirstFontSettings(bparams).language(); -#ifdef WITH_WARNINGS -#warning FIXME we should check the prev par as well (Lgb) -#endif + // FIXME: we should check the prev par as well (Lgb) return bparams.language; }