commit f5510a8a8db4c0b09cb220d0e884f66d78e2ba9c
Author: Enrico Forestieri <[email protected]>
Date: Tue Jun 25 22:09:12 2019 +0200
Fix bug #11552
Do not write supefluous braces in optionals of a macro when saving.
---
src/mathed/InsetMathMacro.cpp | 37 +++++++++++++++++--------------------
src/mathed/MathStream.cpp | 8 ++++----
src/mathed/MathStream.h | 6 ------
status.23x | 2 ++
4 files changed, 23 insertions(+), 30 deletions(-)
diff --git a/src/mathed/InsetMathMacro.cpp b/src/mathed/InsetMathMacro.cpp
index 1164abf..5e72eec 100644
--- a/src/mathed/InsetMathMacro.cpp
+++ b/src/mathed/InsetMathMacro.cpp
@@ -1082,15 +1082,6 @@ void InsetMathMacro::write(WriteStream & os) const
// we should be ok to continue even if this fails.
LATTEST(d->macro_);
- // We may already be in the argument of a macro
- bool const inside_macro = os.insideMacro();
- os.insideMacro(true);
-
- // Enclose in braces to avoid latex errors with xargs if we have
- // optional arguments and are in the optional argument of a macro
- if (d->optionals_ && inside_macro)
- os << '{';
-
// Always protect macros in a fragile environment
if (os.fragile())
os << "\\protect";
@@ -1113,14 +1104,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) << "}]";
@@ -1144,13 +1145,9 @@ void InsetMathMacro::write(WriteStream & os) const
first = false;
}
- // Close the opened brace or add space if there was no argument
- if (d->optionals_ && inside_macro)
- os << '}';
- else if (first)
+ // add space if there was no argument
+ if (first)
os.pendingSpace(true);
-
- os.insideMacro(inside_macro);
}
diff --git a/src/mathed/MathStream.cpp b/src/mathed/MathStream.cpp
index b2d01cf..acb7ee7 100644
--- a/src/mathed/MathStream.cpp
+++ b/src/mathed/MathStream.cpp
@@ -128,10 +128,10 @@ WriteStream & operator<<(WriteStream & ws, docstring
const & s)
WriteStream::WriteStream(otexrowstream & os, bool fragile, bool latex,
OutputType output, Encoding
const * encoding)
: os_(os), fragile_(fragile), firstitem_(false), latex_(latex),
- output_(output), insidemacro_(false), pendingspace_(false),
- pendingbrace_(false), textmode_(false), locked_(0), ascii_(0),
- canbreakline_(true), mathsout_(false), ulemcmd_(NONE), line_(0),
- encoding_(encoding), row_entry_(TexRow::row_none)
+ output_(output), pendingspace_(false), pendingbrace_(false),
+ textmode_(false), locked_(0), ascii_(0), canbreakline_(true),
+ mathsout_(false), ulemcmd_(NONE), line_(0), encoding_(encoding),
+ row_entry_(TexRow::row_none)
{}
diff --git a/src/mathed/MathStream.h b/src/mathed/MathStream.h
index 19da276..b7e7943 100644
--- a/src/mathed/MathStream.h
+++ b/src/mathed/MathStream.h
@@ -81,10 +81,6 @@ public:
void ulemCmd(UlemCmdType ulemcmd) { ulemcmd_ = ulemcmd; }
/// tell which ulem command type we are inside
UlemCmdType ulemCmd() const { return ulemcmd_; }
- /// record whether we are in the argument of a math macro
- void insideMacro(bool insidemacro) { insidemacro_ = insidemacro; }
- /// tell whether we are in the argument of a math macro
- bool insideMacro() const { return insidemacro_; }
/// writes space if next thing is isalpha()
void pendingSpace(bool how);
/// writes space if next thing is isalpha()
@@ -124,8 +120,6 @@ private:
int latex_;
/// output type (default, source preview, instant preview)?
OutputType output_;
- /// are we in the argument of a math macro?
- bool insidemacro_;
/// do we have a space pending?
bool pendingspace_;
/// do we have a brace pending?
diff --git a/status.23x b/status.23x
index 91ca6df..964a539 100644
--- a/status.23x
+++ b/status.23x
@@ -52,6 +52,8 @@ Avoid using text mode for unicode symbols representable in
math mode (bug 9616).
- Avoid adding spaces when parsing an array in a macro template (bug 10499).
+- Avoid superfluous braces in the optional argument of a macro (bug 11552).
+
* USER INTERFACE