From 2dcb73002666001ff55067abab05f6ab4a5760d9 Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Tue, 18 Dec 2018 11:39:21 +0100 Subject: [PATCH] Fix bug 11346 Enclose in braces an optional argument of a math macro when it starts with an incomplete script inset or ends with a delimiter size-modifier macro. --- src/mathed/InsetMathMacro.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/mathed/InsetMathMacro.cpp b/src/mathed/InsetMathMacro.cpp index 668562899d..f37b73b963 100644 --- a/src/mathed/InsetMathMacro.cpp +++ b/src/mathed/InsetMathMacro.cpp @@ -15,6 +15,7 @@ #include "InsetMathMacro.h" #include "InsetMathChar.h" +#include "InsetMathScript.h" #include "MathCompletionList.h" #include "MathExtern.h" #include "MathFactory.h" @@ -1106,7 +1107,22 @@ void InsetMathMacro::write(WriteStream & os) const // print out optionals for (i=0; i < cells_.size() && i < emptyOptFrom; ++i) { first = false; - os << "[" << cell(i) << "]"; + // For correctly parsing it when a document is reloaded, we + // need to enclose an optional argument in braces if it starts + // with a script inset with empty nucleus or ends with a + // delimiter-size-modifier macro (see #10497 and #11346) + bool braced = false; + size_type last = cell(i).size() - 1; + if (cell(i)[last].nucleus()->asUnknownInset()) { + latexkeys const * l = in_word_set(cell(i)[last].nucleus()->name()); + braced = (l && l->inset == "big"); + } else if (cell(i)[0].nucleus()->asScriptInset()) { + braced = cell(i)[0].nucleus()->asScriptInset()->nuc().empty(); + } + if (braced) + os << "[{" << cell(i) << "}]"; + else + os << "[" << cell(i) << "]"; } // skip the tailing empty optionals