From: Enrico Forestieri Date: Fri, 26 Apr 2019 13:30:08 +0000 (+0200) Subject: Correctly protect macros with optionals inserted in an optional argument X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=510815fc5c1cd1c38fd5fa9e9ccc76912790ff75;p=features.git Correctly protect macros with optionals inserted in an optional argument The trick turns out to be inserting in braces the whole optional argument, rather than the single macro. See #11552 for the long history. --- diff --git a/src/mathed/InsetMathMacro.cpp b/src/mathed/InsetMathMacro.cpp index 4b5242e5fc..5269df005f 100644 --- a/src/mathed/InsetMathMacro.cpp +++ b/src/mathed/InsetMathMacro.cpp @@ -1101,14 +1101,24 @@ void InsetMathMacro::write(WriteStream & os) const // 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) + // delimiter-size-modifier macro (see #10497 and #11346). + // We also need to do that when the optional argument + // contains macros with optionals. bool braced = false; size_type last = cell(i).size() - 1; - if (cell(i).size() && cell(i)[last].nucleus()->asUnknownInset()) { - latexkeys const * l = in_word_set(cell(i)[last].nucleus()->name()); + if (cell(i).size() && cell(i)[last]->asUnknownInset()) { + latexkeys const * l = in_word_set(cell(i)[last]->name()); braced = (l && l->inset == "big"); - } else if (cell(i).size() && cell(i)[0].nucleus()->asScriptInset()) { - braced = cell(i)[0].nucleus()->asScriptInset()->nuc().empty(); + } else if (cell(i).size() && cell(i)[0]->asScriptInset()) { + braced = cell(i)[0]->asScriptInset()->nuc().empty(); + } else { + for (size_type j = 0; j < cell(i).size(); ++j) { + InsetMathMacro const * ma = cell(i)[j]->asMacro(); + if (ma && ma->optionals()) { + braced = true; + break; + } + } } if (braced) os << "[{" << cell(i) << "}]";