commit a6be519a815893765a257bec5a456d7f6eecf8f6
Author: Georg Baum <[email protected]>
Date:   Thu Sep 8 22:38:33 2016 +0200

    Fix data loss with [ in first cell of aligned
    
    If the first character in the first cell of an aligned math environment is
    '[', and the environment does not use top or bottom vertical alignment,
    then LyX did write the '[' unprotected so that it got misinterpreted as
    optional argument, both when reading the .lyx file in LyX and when reading
    the .tex file in LaTeX => data loss!
    The fix is to output an empty optional argument in this case, which is
    interpreted as default alignment both by LyX and LaTeX. It would also be
    possible to output \[ in the first cell instead, but this would be more
    difficult to implement.
---
 src/mathed/InsetMathSplit.cpp |   18 ++++++++++++++----
 1 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/mathed/InsetMathSplit.cpp b/src/mathed/InsetMathSplit.cpp
index 515dcb0..e385e0a 100644
--- a/src/mathed/InsetMathSplit.cpp
+++ b/src/mathed/InsetMathSplit.cpp
@@ -14,7 +14,7 @@
 
 #include "MathData.h"
 #include "MathStream.h"
-#include "MathStream.h"
+#include "MathSupport.h"
 
 #include "FuncRequest.h"
 #include "FuncStatus.h"
@@ -141,9 +141,19 @@ void InsetMathSplit::write(WriteStream & ws) const
                suffix = from_ascii("*");
        ws << "\\begin{" << name_ << suffix << '}';
        bool open = ws.startOuterRow();
-       if (name_ != "split" && name_ != "align" && verticalAlignment() != 'c')
-               ws << '[' << verticalAlignment() << ']';
-       if (name_ == "alignedat")
+       bool const hasArg(name_ == "alignedat");
+       if (name_ != "split" && name_ != "align") {
+               if (verticalAlignment() != 'c')
+                       ws << '[' << verticalAlignment() << ']';
+               else if (!hasArg) {
+                       docstring const first(asString(cell(0)));
+                       // prevent misinterpretation of the first character of
+                       // the first cell as optional argument (bug 10361)
+                       if (!first.empty() && first[0] == '[')
+                               ws << "[]";
+               }
+       }
+       if (hasArg)
                ws << '{' << static_cast<unsigned int>((ncols() + 1)/2) << '}';
        InsetMathGrid::write(ws);
        if (ws.fragile())

Reply via email to