X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraph.cpp;h=7b0b3552ddda4fb7eebf201f25917a3026def7ce;hb=f5fe3c17be0a66b32085585962877dfc2dae9140;hp=b009607b139b8c4f35750de53e4bfbc0cd02740f;hpb=8d5899aaf3116c1d1e57bc7c9f460404d7cd35b0;p=lyx.git diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index b009607b13..7b0b3552dd 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -363,6 +363,12 @@ public: pos_type i, unsigned int & column); /// + bool latexSpecialTU( + char_type const c, + otexstream & os, + pos_type i, + unsigned int & column); + /// bool latexSpecialT3( char_type const c, otexstream & os, @@ -562,10 +568,10 @@ Paragraph::Private::Private(Private const & p, Paragraph * owner, } -void Paragraph::addChangesToToc(DocIterator const & cdit, - Buffer const & buf, bool output_active) const +void Paragraph::addChangesToToc(DocIterator const & cdit, Buffer const & buf, + bool output_active, TocBackend & backend) const { - d->changes_.addToToc(cdit, buf, output_active); + d->changes_.addToToc(cdit, buf, output_active, backend); } @@ -1079,7 +1085,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; @@ -1135,7 +1141,7 @@ void Paragraph::Private::latexInset(BufferParams const & bparams, if (close) { if (running_font.language()->lang() == "farsi") - os << "\\endL{}"; + os << "\\endL" << termcmd; else os << '}'; } @@ -1188,25 +1194,30 @@ 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() - && bparams.font_encoding() == "T1" && latexSpecialT1(c, os, i, column)) + && !runparams.isFullUnicode() && bparams.main_font_encoding() == "T1" + && latexSpecialT1(c, os, i, column)) return; + // NOTE: XeTeX and LuaTeX use EU1/2 (pre 2017) or TU (as of 2017) encoding + else if (!runparams.inIPA && !running_font.language()->internalFontEncoding() + && runparams.isFullUnicode() && latexSpecialTU(c, os, i, column)) + return; // 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 '-': @@ -1223,7 +1234,7 @@ void Paragraph::Private::latexSpecialChar(otexstream & os, } break; case '\"': - os << "\\char`\\\"{}"; + os << "\\char34" << termcmd; column += 9; break; @@ -1236,12 +1247,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; @@ -1263,6 +1274,21 @@ void Paragraph::Private::latexSpecialChar(otexstream & os, // written. (Asger) break; + case 0x2013: + case 0x2014: + if (bparams.use_dash_ligatures && !bparams.useNonTeXFonts) { + if (c == 0x2013) { + // en-dash + os << "--"; + column +=2; + } else { + // em-dash + os << "---"; + column +=3; + } + break; + } + // fall through default: if (c == '\0') return; @@ -1339,7 +1365,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 '|': @@ -1347,7 +1373,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: @@ -1356,6 +1382,14 @@ bool Paragraph::Private::latexSpecialT1(char_type const c, otexstream & os, } +bool Paragraph::Private::latexSpecialTU(char_type const c, otexstream & os, + pos_type i, unsigned int & column) +{ + // TU encoding is currently on par with T1. + return latexSpecialT1(c, os, i, column); +} + + bool Paragraph::Private::latexSpecialT3(char_type const c, otexstream & os, pos_type /*i*/, unsigned int & column) { @@ -1367,7 +1401,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: @@ -1389,6 +1423,7 @@ void Paragraph::Private::validate(LaTeXFeatures & features) const // output is wrong if this paragraph contains content // that needs to switch encoding. otexstringstream os; + os << layout_->preamble(); if (is_command) { os << '\\' << from_ascii(layout_->latexname()); // we have to provide all the optional arguments here, even though @@ -1948,7 +1983,7 @@ depth_type Paragraph::getMaxDepthAfter() const } -char Paragraph::getAlign() const +LyXAlignment Paragraph::getAlign() const { if (d->params_.align() == LYX_ALIGN_LAYOUT) return d->layout_->align; @@ -2389,6 +2424,7 @@ void Paragraph::latex(BufferParams const & bparams, runparams); } + runparams.wasDisplayMath = runparams.inDisplayMath; runparams.inDisplayMath = false; bool deleted_display_math = false; @@ -2561,12 +2597,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") << " '"; @@ -2580,7 +2616,6 @@ void Paragraph::latex(BufferParams const & bparams, } } } - } // Set the encoding to that returned from latexSpecialChar (see // comment for encoding member in OutputParams.h) @@ -3147,6 +3182,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; } @@ -3328,11 +3368,11 @@ docstring Paragraph::asString(pos_type beg, pos_type end, int options, const Out void Paragraph::forOutliner(docstring & os, size_t const maxlen, - bool const shorten) const + bool const shorten, bool const label) const { size_t tmplen = shorten ? maxlen + 1 : maxlen; - if (!d->params_.labelString().empty()) - os += d->params_.labelString() + ' '; + if (label && !labelString().empty()) + os += labelString() + ' '; for (pos_type i = 0; i < size() && os.length() < tmplen; ++i) { if (isDeleted(i)) continue; @@ -3529,6 +3569,12 @@ void Paragraph::setBuffer(Buffer & b) } +void Paragraph::resetBuffer() +{ + d->insetlist_.resetBuffer(); +} + + Inset * Paragraph::releaseInset(pos_type pos) { Inset * inset = d->insetlist_.release(pos); @@ -3694,11 +3740,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(); } @@ -3774,11 +3820,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); } }