commit fece5d4f376393bd7bcf15393d8f04420053e7c1
Author: Enrico Forestieri <[email protected]>
Date: Thu Jan 7 00:57:36 2021 +0100
Correctly terminate a user math macro in certain circumstances
If a macro has only optionals and none is specified and a [ immediately
follows, we have to terminate the macro with {}, otherwise what follows
is taken to be an optional argument.
Fixes #11665.
---
src/mathed/InsetMathMacro.cpp | 5 ++++-
src/mathed/MathStream.cpp | 16 ++++++++++++++--
src/mathed/MathStream.h | 8 +++++++-
3 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/src/mathed/InsetMathMacro.cpp b/src/mathed/InsetMathMacro.cpp
index a214600..d2c35c7 100644
--- a/src/mathed/InsetMathMacro.cpp
+++ b/src/mathed/InsetMathMacro.cpp
@@ -1214,8 +1214,11 @@ void InsetMathMacro::write(TeXMathStream & os) const
}
// add space if there was no argument
- if (first)
+ // or add braces if we have optionals but none are present and [ follows
+ if (first) {
os.pendingSpace(true);
+ os.useBraces(d->optionals_ > 0);
+ }
// write \(no)limits modifiers if relevant
writeLimits(os);
diff --git a/src/mathed/MathStream.cpp b/src/mathed/MathStream.cpp
index 51ac984..6f4da39 100644
--- a/src/mathed/MathStream.cpp
+++ b/src/mathed/MathStream.cpp
@@ -106,6 +106,8 @@ TeXMathStream & operator<<(TeXMathStream & ws, docstring
const & s)
} else if (ws.pendingSpace()) {
if (isAlphaASCII(s[first]))
ws.os() << ' ';
+ else if (s[first] == '[' && ws.useBraces())
+ ws.os() << "{}";
else if (s[first] == ' ' && ws.textMode())
ws.os() << '\\';
ws.pendingSpace(false);
@@ -148,9 +150,17 @@ void TeXMathStream::addlines(unsigned int n)
}
-void TeXMathStream::pendingSpace(bool how)
+void TeXMathStream::pendingSpace(bool space)
{
- pendingspace_ = how;
+ pendingspace_ = space;
+ if (!space)
+ usebraces_ = false;
+}
+
+
+void TeXMathStream::useBraces(bool braces)
+{
+ usebraces_ = braces;
}
@@ -226,6 +236,8 @@ TeXMathStream & operator<<(TeXMathStream & ws, char c)
} else if (ws.pendingSpace()) {
if (isAlphaASCII(c))
ws.os() << ' ';
+ else if (c == '[' && ws.useBraces())
+ ws.os() << "{}";
else if (c == ' ' && ws.textMode())
ws.os() << '\\';
ws.pendingSpace(false);
diff --git a/src/mathed/MathStream.h b/src/mathed/MathStream.h
index aa1f71a..153e7df 100644
--- a/src/mathed/MathStream.h
+++ b/src/mathed/MathStream.h
@@ -80,9 +80,13 @@ public:
/// tell which ulem command type we are inside
UlemCmdType ulemCmd() const { return ulemcmd_; }
/// writes space if next thing is isalpha()
- void pendingSpace(bool how);
+ void pendingSpace(bool space);
/// writes space if next thing is isalpha()
bool pendingSpace() const { return pendingspace_; }
+ /// write braces if a space is pending and next char is [
+ void useBraces(bool braces);
+ /// write braces if a space is pending and next char is [
+ bool useBraces() const { return usebraces_; }
/// tell whether to write the closing brace of \ensuremath
void pendingBrace(bool brace);
/// tell whether to write the closing brace of \ensuremath
@@ -124,6 +128,8 @@ private:
OutputType output_ = wsDefault;
/// do we have a space pending?
bool pendingspace_ = false;
+ /// do we have to write braces when a space is pending and [ follows?
+ bool usebraces_ = false;
/// do we have a brace pending?
bool pendingbrace_ = false;
/// are we in text mode when producing latex code?
--
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs