]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
Add FIXME
[lyx.git] / src / Paragraph.cpp
index ce95ad842edb84bb81af4fc9cb72a7e7c32a4149..135ba96b0abec1a1ee170e4338c49dc964919535 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"
@@ -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);