X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraph.cpp;h=ba101e4eb277ac782a436a789c1d297710497f9d;hb=2de30c62f8d671a8c8d4d52a6a7310e2c5ca84de;hp=94cf9313d53d6eebc9e901114221cadf0ab56db6;hpb=3fd2398a28c8d2c85d1bb2c33c6ca15bfc398b54;p=lyx.git diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index 94cf9313d5..ba101e4eb2 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -53,6 +53,8 @@ #include "insets/InsetLabel.h" #include "insets/InsetSpecialChar.h" +#include "mathed/InsetMathHull.h" + #include "support/debug.h" #include "support/docstring_list.h" #include "support/ExceptionMessage.h" @@ -1077,7 +1079,7 @@ void Paragraph::Private::latexInset(BufferParams const & bparams, // decorations at all && inset->lyxCode() != ERT_CODE) { if (running_font.language()->lang() == "farsi") - os << "\\beginL{}"; + os << "\\beginL" << termcmd; else os << "\\L{"; close = true; @@ -1118,7 +1120,7 @@ void Paragraph::Private::latexInset(BufferParams const & bparams, } } - int prev_rows = os.texrow().rows(); + size_t const previous_row_count = os.texrow().rows(); try { runparams.lastid = id_; @@ -1133,12 +1135,12 @@ void Paragraph::Private::latexInset(BufferParams const & bparams, if (close) { if (running_font.language()->lang() == "farsi") - os << "\\endL{}"; + os << "\\endL" << termcmd; else os << '}'; } - if (os.texrow().rows() > prev_rows) { + if (os.texrow().rows() > previous_row_count) { os.texrow().start(owner_->id(), i + 1); column = 0; } else { @@ -1192,19 +1194,19 @@ void Paragraph::Private::latexSpecialChar(otexstream & os, // Otherwise, we use what LaTeX provides us. switch (c) { case '\\': - os << "\\textbackslash{}"; + os << "\\textbackslash" << termcmd; column += 15; break; case '<': - os << "\\textless{}"; + os << "\\textless" << termcmd; column += 10; break; case '>': - os << "\\textgreater{}"; + os << "\\textgreater" << termcmd; column += 13; break; case '|': - os << "\\textbar{}"; + os << "\\textbar" << termcmd; column += 9; break; case '-': @@ -1221,7 +1223,7 @@ void Paragraph::Private::latexSpecialChar(otexstream & os, } break; case '\"': - os << "\\char`\\\"{}"; + os << "\\char`\\\"" << termcmd; column += 9; break; @@ -1234,12 +1236,12 @@ void Paragraph::Private::latexSpecialChar(otexstream & os, break; case '~': - os << "\\textasciitilde{}"; + os << "\\textasciitilde" << termcmd; column += 16; break; case '^': - os << "\\textasciicircum{}"; + os << "\\textasciicircum" << termcmd; column += 17; break; @@ -1337,7 +1339,7 @@ bool Paragraph::Private::latexSpecialT1(char_type const c, otexstream & os, // but we should avoid ligatures if (i + 1 >= int(text_.size()) || text_[i + 1] != c) return true; - os << "\\textcompwordmark{}"; + os << "\\textcompwordmark" << termcmd; column += 19; return true; case '|': @@ -1345,7 +1347,7 @@ bool Paragraph::Private::latexSpecialT1(char_type const c, otexstream & os, return true; case '\"': // soul.sty breaks with \char`\" - os << "\\textquotedbl{}"; + os << "\\textquotedbl" << termcmd; column += 14; return true; default: @@ -1365,7 +1367,7 @@ bool Paragraph::Private::latexSpecialT3(char_type const c, otexstream & os, os.put(c); return true; case '|': - os << "\\textvertline{}"; + os << "\\textvertline" << termcmd; column += 14; return true; default: @@ -1386,8 +1388,7 @@ void Paragraph::Private::validate(LaTeXFeatures & features) const // switching machinery of odocstream. Therefore the // output is wrong if this paragraph contains content // that needs to switch encoding. - odocstringstream ods; - otexstream os(ods); + otexstringstream os; if (is_command) { os << '\\' << from_ascii(layout_->latexname()); // we have to provide all the optional arguments here, even though @@ -1400,20 +1401,19 @@ void Paragraph::Private::validate(LaTeXFeatures & features) const } os << from_ascii(layout_->latexparam()); } - docstring::size_type const length = ods.str().length(); + size_t const length = os.length(); // this will output "{" at the beginning, but not at the end owner_->latex(bp, f, os, features.runparams(), 0, -1, true); - if (ods.str().length() > length) { + if (os.length() > length) { if (is_command) { - ods << '}'; + os << '}'; if (!layout_->postcommandargs().empty()) { OutputParams rp = features.runparams(); rp.local_font = &owner_->getFirstFontSettings(bp); latexArgInsets(*owner_, os, rp, layout_->postcommandargs(), "post:"); } } - string const snippet = to_utf8(ods.str()); - features.addPreambleSnippet(snippet, true); + features.addPreambleSnippet(os.release(), true); } } @@ -1441,7 +1441,9 @@ void Paragraph::Private::validate(LaTeXFeatures & features) const InsetList::const_iterator iend = insetlist_.end(); for (; icit != iend; ++icit) { if (icit->inset) { + features.inDeletedInset(owner_->isDeleted(icit->pos)); icit->inset->validate(features); + features.inDeletedInset(false); if (layout_->needprotect && icit->inset->lyxCode() == FOOT_CODE) features.require("NeedLyXFootnoteCode"); @@ -2387,6 +2389,25 @@ void Paragraph::latex(BufferParams const & bparams, runparams); } + runparams.wasDisplayMath = runparams.inDisplayMath; + runparams.inDisplayMath = false; + bool deleted_display_math = false; + + // Check whether a display math inset follows + if (d->text_[i] == META_INSET + && i >= start_pos && (end_pos == -1 || i < end_pos)) { + InsetMath const * im = getInset(i)->asInsetMath(); + if (im && im->asHullInset() + && im->asHullInset()->outerDisplay()) { + runparams.inDisplayMath = true; + // runparams.inDeletedInset will be set by + // latexInset later, but we need this info + // before it is called. On the other hand, we + // cannot set it here because it is a counter. + deleted_display_math = isDeleted(i); + } + } + Change const & change = runparams.inDeletedInset ? runparams.changeOfDeletedInset : lookupChange(i); @@ -2398,7 +2419,6 @@ void Paragraph::latex(BufferParams const & bparams, } basefont = getLayoutFont(bparams, outerfont); running_font = basefont; - column += Changes::latexMarkChange(os, bparams, runningChange, change, runparams); runningChange = change; @@ -2441,6 +2461,8 @@ void Paragraph::latex(BufferParams const & bparams, running_lang); os << from_ascii(end_tag); column += end_tag.length(); + if (runparams.use_polyglossia) + popPolyglossiaLang(); } // Switch file encoding if necessary (and allowed) @@ -2458,6 +2480,19 @@ void Paragraph::latex(BufferParams const & bparams, char_type const c = d->text_[i]; + // A display math inset inside an ulem command will be output + // as a box of width \columnwidth, so we have to either disable + // indentation if the inset starts a paragraph, or start a new + // line to accommodate such box. This has to be done before + // writing any font changing commands. + if (runparams.inDisplayMath && !deleted_display_math + && runparams.inulemcmd) { + if (os.afterParbreak()) + os << "\\noindent"; + else + os << "\\\\\n"; + } + // Do we need to change font? if ((current_font != running_font || current_font.language() != running_font.language()) && @@ -2467,6 +2502,15 @@ void Paragraph::latex(BufferParams const & bparams, column += current_font.latexWriteStartChanges(ods, bparams, runparams, basefont, last_font); + // Check again for display math in ulem commands as a + // font change may also occur just before a math inset. + if (runparams.inDisplayMath && !deleted_display_math + && runparams.inulemcmd) { + if (os.afterParbreak()) + os << "\\noindent"; + else + os << "\\\\\n"; + } running_font = current_font; open_font = true; docstring fontchange = ods.str(); @@ -2518,12 +2562,12 @@ void Paragraph::latex(BufferParams const & bparams, basefont, outerfont, open_font, runningChange, style, i, column); } - } else { - if (i >= start_pos && (end_pos == -1 || i < end_pos)) { - try { - d->latexSpecialChar(os, bparams, rp, running_font, runningChange, - style, i, end_pos, column); - } catch (EncodingException & e) { + } else if (i >= start_pos && (end_pos == -1 || i < end_pos)) { + try { + d->latexSpecialChar(os, bparams, rp, + running_font, runningChange, + style, i, end_pos, column); + } catch (EncodingException & e) { if (runparams.dryrun) { os << "<" << _("LyX Warning: ") << _("uncodable character") << " '"; @@ -2537,11 +2581,15 @@ void Paragraph::latex(BufferParams const & bparams, } } } - } // Set the encoding to that returned from latexSpecialChar (see // comment for encoding member in OutputParams.h) runparams.encoding = rp.encoding; + + // Also carry on the info on a closed ulem command for insets + // 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; } // If we have an open font definition, we have to close it @@ -3099,6 +3147,11 @@ bool Paragraph::isHfill(pos_type pos) const bool Paragraph::isNewline(pos_type pos) const { + // U+2028 LINE SEPARATOR + // U+2029 PARAGRAPH SEPARATOR + char_type const c = d->text_[pos]; + if (c == 0x2028 || c == 0x2029) + return true; Inset const * inset = getInset(pos); return inset && inset->lyxCode() == NEWLINE_CODE; } @@ -3481,6 +3534,12 @@ void Paragraph::setBuffer(Buffer & b) } +void Paragraph::resetBuffer() +{ + d->insetlist_.resetBuffer(); +} + + Inset * Paragraph::releaseInset(pos_type pos) { Inset * inset = d->insetlist_.release(pos); @@ -3646,11 +3705,11 @@ void Paragraph::deregisterWords() Private::LangWordsMap::const_iterator itl = d->words_.begin(); Private::LangWordsMap::const_iterator ite = d->words_.end(); for (; itl != ite; ++itl) { - WordList * wl = theWordList(itl->first); + WordList & wl = theWordList(itl->first); Private::Words::const_iterator it = (itl->second).begin(); Private::Words::const_iterator et = (itl->second).end(); for (; it != et; ++it) - wl->remove(*it); + wl.remove(*it); } d->words_.clear(); } @@ -3726,11 +3785,11 @@ void Paragraph::registerWords() Private::LangWordsMap::const_iterator itl = d->words_.begin(); Private::LangWordsMap::const_iterator ite = d->words_.end(); for (; itl != ite; ++itl) { - WordList * wl = theWordList(itl->first); + WordList & wl = theWordList(itl->first); Private::Words::const_iterator it = (itl->second).begin(); Private::Words::const_iterator et = (itl->second).end(); for (; it != et; ++it) - wl->insert(*it); + wl.insert(*it); } }