[LyX/master] Assure correct spacing of colored items in mathed

Enrico Forestieri forenr at lyx.org
Sun Aug 2 16:38:06 UTC 2020


commit 7441172d4d9a26eb4824bb8bee003f457ef34f1c
Author: Enrico Forestieri <forenr at lyx.org>
Date:   Sun Aug 2 18:58:40 2020 +0200

    Assure correct spacing of colored items in mathed
    
    When coloring a non-ordinary math atom, explicitly apply its
    math class, so that to leave unchanged the spacing around it.
    Fixes #11827.
---
 src/mathed/InsetMath.h        |    2 ++
 src/mathed/InsetMathClass.h   |    4 ++++
 src/mathed/InsetMathColor.cpp |   41 ++++++++++++++++++++++++++++++++++++++++-
 src/mathed/InsetMathNest.cpp  |    2 ++
 src/mathed/MathStream.cpp     |    2 +-
 src/mathed/MathStream.h       |    6 ++++++
 6 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/src/mathed/InsetMath.h b/src/mathed/InsetMath.h
index 988d3c3..067bf6e 100644
--- a/src/mathed/InsetMath.h
+++ b/src/mathed/InsetMath.h
@@ -72,6 +72,7 @@ class InsetMathArray;
 class InsetMathAMSArray;
 class InsetMathBrace;
 class InsetMathChar;
+class InsetMathClass;
 class InsetMathDelim;
 class InsetMathFracBase;
 class InsetMathFrac;
@@ -150,6 +151,7 @@ public:
 	virtual InsetMathBrace          * asBraceInset()          { return nullptr; }
 	virtual InsetMathBrace const    * asBraceInset() const    { return nullptr; }
 	virtual InsetMathChar const     * asCharInset() const     { return nullptr; }
+	virtual InsetMathClass const    * asClassInset() const    { return nullptr; }
 	virtual InsetMathDelim          * asDelimInset()          { return nullptr; }
 	virtual InsetMathDelim const    * asDelimInset() const    { return nullptr; }
 	virtual InsetMathFracBase       * asFracBaseInset()       { return nullptr; }
diff --git a/src/mathed/InsetMathClass.h b/src/mathed/InsetMathClass.h
index f50040d..1b30738 100644
--- a/src/mathed/InsetMathClass.h
+++ b/src/mathed/InsetMathClass.h
@@ -38,6 +38,10 @@ public:
 	void infoize(odocstream & os) const;
 	///
 	InsetCode lyxCode() const { return MATH_CLASS_CODE; }
+	///
+	InsetMathClass * asClassInset() { return this; }
+	///
+	InsetMathClass const * asClassInset() const { return this; }
 
 private:
 	virtual Inset * clone() const;
diff --git a/src/mathed/InsetMathColor.cpp b/src/mathed/InsetMathColor.cpp
index d665734..94a6c42 100644
--- a/src/mathed/InsetMathColor.cpp
+++ b/src/mathed/InsetMathColor.cpp
@@ -96,7 +96,46 @@ void InsetMathColor::validate(LaTeXFeatures & features) const
 
 void InsetMathColor::write(WriteStream & os) const
 {
-	if (normalcolor(color_))
+	// We have to ensure correct spacing when the front and/or back
+	// atoms are not ordinary ones (bug 11827).
+	docstring const frontclass =
+		cell(0).size() ? class_to_string(cell(0).front()->mathClass())
+		               : from_ascii("mathord");
+	docstring const backclass =
+		cell(0).size() ? class_to_string(cell(0).back()->mathClass())
+		               : from_ascii("mathord");
+	bool adjchk = os.latex() && !os.inMathClass() && (normalcolor(color_) || oldstyle_);
+	bool adjust_front = frontclass != "mathord" && adjchk;
+	bool adjust_back = backclass != "mathord" && adjchk;
+	docstring const colswitch =
+		oldstyle_ ? from_ascii("{\\color{") + color_ + from_ascii("}")
+			  : from_ascii("{\\normalcolor ");
+
+	if (adjust_front && adjust_back) {
+		os << '\\' << frontclass << colswitch << cell(0).front() << '}';
+		if (cell(0).size() > 2) {
+			os << colswitch;
+			for (size_t i = 1; i < cell(0).size() - 1; ++i)
+				os << cell(0)[i];
+			os << '}';
+		}
+		if (cell(0).size() > 1)
+			os << '\\' << backclass << colswitch << cell(0).back() << '}';
+	} else if (adjust_front) {
+		os << '\\' << frontclass << colswitch << cell(0).front() << '}';
+		if (cell(0).size() > 1) {
+			os << colswitch;
+			for (size_t i = 1; i < cell(0).size(); ++i)
+				os << cell(0)[i];
+			os << '}';
+		}
+	} else if (adjust_back) {
+		os << colswitch;
+		for (size_t i = 0; i < cell(0).size() - 1; ++i)
+			os << cell(0)[i];
+		os << '}' << '\\' << backclass << colswitch << cell(0).back()
+		   << '}';
+	} else if (normalcolor(color_))
 		// reset to default color inside another color inset
 		os << "{\\normalcolor " << cell(0) << '}';
 	else if (oldstyle_)
diff --git a/src/mathed/InsetMathNest.cpp b/src/mathed/InsetMathNest.cpp
index 06d1c12..be6fecc 100644
--- a/src/mathed/InsetMathNest.cpp
+++ b/src/mathed/InsetMathNest.cpp
@@ -330,6 +330,7 @@ void InsetMathNest::write(WriteStream & os) const
 	ModeSpecifier specifier(os, currentMode(), lockedMode());
 	docstring const latex_name = name();
 	os << '\\' << latex_name;
+	os.inMathClass(asClassInset());
 	for (size_t i = 0; i < nargs(); ++i) {
 		Changer dummy = os.changeRowEntry(TexRow::mathEntry(id(),i));
 		os << '{' << cell(i) << '}';
@@ -340,6 +341,7 @@ void InsetMathNest::write(WriteStream & os) const
 		os << "\\lyxlock";
 		os.pendingSpace(true);
 	}
+	os.inMathClass(false);
 }
 
 
diff --git a/src/mathed/MathStream.cpp b/src/mathed/MathStream.cpp
index 7d355f7..f93ff72 100644
--- a/src/mathed/MathStream.cpp
+++ b/src/mathed/MathStream.cpp
@@ -131,7 +131,7 @@ WriteStream::WriteStream(otexrowstream & os, bool fragile, bool latex,
 	  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)
+	  row_entry_(TexRow::row_none), mathclass_(false)
 {}
 
 
diff --git a/src/mathed/MathStream.h b/src/mathed/MathStream.h
index bf3deb9..9344dac 100644
--- a/src/mathed/MathStream.h
+++ b/src/mathed/MathStream.h
@@ -101,6 +101,10 @@ public:
 	void asciiOnly(bool ascii);
 	/// tell whether to use only ascii chars when producing latex code
 	bool asciiOnly() const { return ascii_; }
+	/// tell whether we are in a MathClass inset
+	void inMathClass(bool mathclass) { mathclass_ = mathclass; };
+	/// tell whether we are in a MathClass inset
+	bool inMathClass() const { return mathclass_; }
 	/// LaTeX encoding
 	Encoding const * encoding() const { return encoding_; }
 
@@ -142,6 +146,8 @@ private:
 	Encoding const * encoding_;
 	/// Row entry we are in
 	TexRow::RowEntry row_entry_;
+	/// whether we are in a MathClass inset
+	bool mathclass_;
 };
 
 ///


More information about the lyx-cvs mailing list