Do not write supefluous braces in optionals of a macro when saving.
This commit is contained in:
Enrico Forestieri 2019-06-25 22:09:12 +02:00
parent 911e6412b8
commit f5510a8a8d
4 changed files with 23 additions and 30 deletions

View File

@ -1082,15 +1082,6 @@ void InsetMathMacro::write(WriteStream & os) const
// we should be ok to continue even if this fails. // we should be ok to continue even if this fails.
LATTEST(d->macro_); 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 // Always protect macros in a fragile environment
if (os.fragile()) if (os.fragile())
os << "\\protect"; os << "\\protect";
@ -1113,14 +1104,24 @@ void InsetMathMacro::write(WriteStream & os) const
// For correctly parsing it when a document is reloaded, we // For correctly parsing it when a document is reloaded, we
// need to enclose an optional argument in braces if it starts // need to enclose an optional argument in braces if it starts
// with a script inset with empty nucleus or ends with a // 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; bool braced = false;
size_type last = cell(i).size() - 1; size_type last = cell(i).size() - 1;
if (cell(i).size() && cell(i)[last].nucleus()->asUnknownInset()) { if (cell(i).size() && cell(i)[last]->asUnknownInset()) {
latexkeys const * l = in_word_set(cell(i)[last].nucleus()->name()); latexkeys const * l = in_word_set(cell(i)[last]->name());
braced = (l && l->inset == "big"); braced = (l && l->inset == "big");
} else if (cell(i).size() && cell(i)[0].nucleus()->asScriptInset()) { } else if (cell(i).size() && cell(i)[0]->asScriptInset()) {
braced = cell(i)[0].nucleus()->asScriptInset()->nuc().empty(); 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) if (braced)
os << "[{" << cell(i) << "}]"; os << "[{" << cell(i) << "}]";
@ -1144,13 +1145,9 @@ void InsetMathMacro::write(WriteStream & os) const
first = false; first = false;
} }
// Close the opened brace or add space if there was no argument // add space if there was no argument
if (d->optionals_ && inside_macro) if (first)
os << '}';
else if (first)
os.pendingSpace(true); os.pendingSpace(true);
os.insideMacro(inside_macro);
} }

View File

@ -128,10 +128,10 @@ WriteStream & operator<<(WriteStream & ws, docstring const & s)
WriteStream::WriteStream(otexrowstream & os, bool fragile, bool latex, WriteStream::WriteStream(otexrowstream & os, bool fragile, bool latex,
OutputType output, Encoding const * encoding) OutputType output, Encoding const * encoding)
: os_(os), fragile_(fragile), firstitem_(false), latex_(latex), : os_(os), fragile_(fragile), firstitem_(false), latex_(latex),
output_(output), insidemacro_(false), pendingspace_(false), output_(output), pendingspace_(false), pendingbrace_(false),
pendingbrace_(false), textmode_(false), locked_(0), ascii_(0), textmode_(false), locked_(0), ascii_(0), canbreakline_(true),
canbreakline_(true), mathsout_(false), ulemcmd_(NONE), line_(0), mathsout_(false), ulemcmd_(NONE), line_(0), encoding_(encoding),
encoding_(encoding), row_entry_(TexRow::row_none) row_entry_(TexRow::row_none)
{} {}

View File

@ -81,10 +81,6 @@ public:
void ulemCmd(UlemCmdType ulemcmd) { ulemcmd_ = ulemcmd; } void ulemCmd(UlemCmdType ulemcmd) { ulemcmd_ = ulemcmd; }
/// tell which ulem command type we are inside /// tell which ulem command type we are inside
UlemCmdType ulemCmd() const { return ulemcmd_; } 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() /// writes space if next thing is isalpha()
void pendingSpace(bool how); void pendingSpace(bool how);
/// writes space if next thing is isalpha() /// writes space if next thing is isalpha()
@ -124,8 +120,6 @@ private:
int latex_; int latex_;
/// output type (default, source preview, instant preview)? /// output type (default, source preview, instant preview)?
OutputType output_; OutputType output_;
/// are we in the argument of a math macro?
bool insidemacro_;
/// do we have a space pending? /// do we have a space pending?
bool pendingspace_; bool pendingspace_;
/// do we have a brace pending? /// do we have a brace pending?

View File

@ -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 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 * USER INTERFACE