From a6be519a815893765a257bec5a456d7f6eecf8f6 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 8 Sep 2016 22:38:33 +0200 Subject: [PATCH] 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 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/mathed/InsetMathSplit.cpp b/src/mathed/InsetMathSplit.cpp index 515dcb0459..e385e0a09a 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((ncols() + 1)/2) << '}'; InsetMathGrid::write(ws); if (ws.fragile())