]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
Remove hardcoded values
[lyx.git] / src / Paragraph.cpp
index 3bae5bc1da7a3b518955d8433ce5379d81868cbf..ba101e4eb277ac782a436a789c1d297710497f9d 100644 (file)
@@ -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;
@@ -1133,7 +1135,7 @@ void Paragraph::Private::latexInset(BufferParams const & bparams,
 
        if (close) {
                if (running_font.language()->lang() == "farsi")
-                               os << "\\endL{}";
+                               os << "\\endL" << termcmd;
                        else
                                os << '}';
        }
@@ -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;
@@ -2460,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()) &&
@@ -2469,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();
@@ -2520,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") << " '";
@@ -2539,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
@@ -3101,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;
 }
@@ -3483,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);
@@ -3648,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();
 }
@@ -3728,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);
        }
 }