Jürgen Spitzmüller schrieb:
Michael Gerz wrote:
After some (short) investigation, I came to the conclusion that using
the colors defined within LyX is not that trivial.

Why? Look at shadecolor (in LaTeXFeatures.cpp) for a model.
Something like (untested):
Ah, learning from the expert!

Thanks, Jürgen. Are you happy with the attached patch?

Michael
Index: src/Changes.cpp
===================================================================
--- src/Changes.cpp	(Revision 18282)
+++ src/Changes.cpp	(Arbeitskopie)
@@ -303,7 +303,7 @@
 	int column = 0;
 
 	if (oldChange.type != Change::UNCHANGED) {
-		os << '}'; // close \lyxinserted or \lyxdeleted
+		os << '}'; // close \lyxadded or \lyxdeleted
 		column++;
 	}
 
@@ -318,7 +318,7 @@
 		os << str;
 		column += str.size();
 	} else if (change.type == Change::INSERTED) {
-		docstring str = "\\lyxinserted{" +
+		docstring str = "\\lyxadded{" +
 			bparams.authors().get(change.author).name() + "}{" +
 			chgTime + "}{";
 		os << str;
Index: src/Color.h
===================================================================
--- src/Color.h	(Revision 18282)
+++ src/Color.h	(Arbeitskopie)
@@ -153,10 +153,10 @@
 		appendix,
 		/// changebar color
 		changebar,
-		/// strike-out color
-		strikeout,
+		/// deleted text color
+		deletedtext,
 		/// added text color
-		newtext,
+		addedtext,
 		/// Top and bottom line color
 		topline,
 		/// Table line color
Index: src/insets/InsetTabular.cpp
===================================================================
--- src/insets/InsetTabular.cpp	(Revision 18282)
+++ src/insets/InsetTabular.cpp	(Arbeitskopie)
@@ -3105,8 +3105,8 @@
 	Color::color onoffcol = Color::tabularonoffline;
 
 	if (erased) {
-		col = Color::strikeout;
-		onoffcol = Color::strikeout;
+		col = Color::deletedtext;
+		onoffcol = Color::deletedtext;
 	}
 
 	if (!tabular.topAlreadyDrawn(cell)) {
Index: src/BufferView.cpp
===================================================================
--- src/BufferView.cpp	(Revision 18282)
+++ src/BufferView.cpp	(Arbeitskopie)
@@ -891,18 +891,22 @@
 	case LFUN_CHANGES_OUTPUT:
 		buffer_->params().outputChanges = !buffer_->params().outputChanges;
 		if (buffer_->params().outputChanges) {
-			if (!LaTeXFeatures::isAvailable("dvipost")) {
+			bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
+			bool xcolorsoul = LaTeXFeatures::isAvailable("soul") &&
+			                  LaTeXFeatures::isAvailable("xcolor");
+		
+			if (!dvipost && !xcolorsoul) {
 				Alert::warning(_("Changes not shown in LaTeX output"),
 				               _("Changes will not be highlighted in LaTeX output, "
-				                 "because dvipost is not installed.\n"
-				                 "If you are familiar with TeX, consider redefining "
-				                 "\\lyxinserted and \\lyxdeleted in the LaTeX preamble."));
-			} else {
+				                 "because neither dvipost nor xcolor/soul are installed.\n"
+				                 "Please install these packages or redefine "
+				                 "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
+			} else if (!xcolorsoul) {
 				Alert::warning(_("Changes not shown in LaTeX output"),
 				               _("Changes will not be highlighted in LaTeX output "
-				                 "when using pdflatex.\n"
-				                 "If you are familiar with TeX, consider redefining "
-				                 "\\lyxinserted and \\lyxdeleted in the LaTeX preamble."));
+				                 "when using pdflatex, because xcolor and soul are not installed.\n"
+				                 "Please install both packages or redefine "
+				                 "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
 			}
 		}
 		break;
Index: src/LaTeXFeatures.cpp
===================================================================
--- src/LaTeXFeatures.cpp	(Revision 18282)
+++ src/LaTeXFeatures.cpp	(Arbeitskopie)
@@ -178,18 +178,13 @@
 	"\\dvipost{osend color pop}\n"
 	"\\dvipost{cbstart color push Blue}\n"
 	"\\dvipost{cbend color pop}\n"
-	"\\newcommand{\\lyxinserted}[3]{\\changestart#3\\changeend}\n"
+	"\\newcommand{\\lyxadded}[3]{\\changestart#3\\changeend}\n"
 	"\\newcommand{\\lyxdeleted}[3]{%\n"
 	"\\changestart\\overstrikeon#3\\overstrikeoff\\changeend}\n";
 
-// TODO
-//static string const changetracking_soul_def =
-//	"\\newcommand{\\lyxinserted}[3]{\\uwave{\\textcolor{blue}{#3}}}\n"
-//	"\\newcommand{\\lyxdeleted}[3]{\\sout{\\textcolor{red}{#3}}}";
-
 static string const changetracking_none_def =
-	"\\newcommand{\\lyxinserted}[3]{#3}\n"
-	"\\newcommand{\\lyxdeleted}[3]{}";
+	"\\newcommand{\\lyxadded}[3]{#3}\n"
+	"\\newcommand{\\lyxdeleted}[3]{}\n";
 
 
 /////////////////////////////////////////////////////////////////////
@@ -411,7 +406,10 @@
 	"nicefrac",
 	"tipa",
 	"framed",
+	"pdfcolmk",
+	"soul",
 	"textcomp",
+	"xcolor",
 };
 
 int const nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *);
@@ -643,10 +641,24 @@
 	getFloatDefinitions(macros);
 
 	// change tracking
-	if (mustProvide("dvipost"))
+	if (mustProvide("ct-dvipost")) {
 		macros << changetracking_dvipost_def;
-	if (mustProvide("ct-none"))
+	}
+	if (mustProvide("ct-xcolor-soul")) {
+		RGBColor cadd = RGBColor(lcolor.getX11Name(Color::addedtext));
+		macros << "\\providecolor{lyxadded}{rgb}{" 
+		       << cadd.r/255 << ',' << cadd.g/255 << ',' << cadd.b/255 << "}\n";
+
+		RGBColor cdel = RGBColor(lcolor.getX11Name(Color::deletedtext));
+		macros << "\\providecolor{lyxdeleted}{rgb}{" 
+		       << cdel.r/255 << ',' << cdel.g/255 << ',' << cdel.b/255 << "}\n";
+
+		macros << "\\newcommand{\\lyxadded}[3]{\\textcolor{lyxadded}{#3}}\n"
+		       << "\\newcommand{\\lyxdeleted}[3]{\\textcolor{lyxdeleted}{\\st{#3}}}\n";
+	}
+	if (mustProvide("ct-none")) {
 		macros << changetracking_none_def;
+	}
 
 	return macros.str();
 }
Index: src/rowpainter.cpp
===================================================================
--- src/rowpainter.cpp	(Revision 18282)
+++ src/rowpainter.cpp	(Arbeitskopie)
@@ -368,9 +368,9 @@
 	if (prev_change != Change::UNCHANGED) {
 		Font copy(font);
 		if (prev_change == Change::DELETED) {
-			copy.setColor(Color::strikeout);
+			copy.setColor(Color::deletedtext);
 		} else if (prev_change == Change::INSERTED) {
-			copy.setColor(Color::newtext);
+			copy.setColor(Color::addedtext);
 		}
 		x_ += pain_.text(int(x_), yo_, s, copy);
 	} else {
@@ -669,7 +669,7 @@
 	if (par_.isInserted(par_.size()) || par_.isDeleted(par_.size())) {
 		FontMetrics const & fm = theFontMetrics(bv_.buffer()->params().getFont());
 		int const length = fm.maxAscent() / 2;
-		Color::color col = par_.isInserted(par_.size()) ? Color::newtext : Color::strikeout;
+		Color::color col = par_.isInserted(par_.size()) ? Color::addedtext : Color::deletedtext;
 		
 		pain_.line(int(x_) + 1, yo_ + 2, int(x_) + 1, yo_ + 2 - length, col,
 		           Painter::line_solid, Painter::line_thick);
@@ -779,7 +779,7 @@
 				= theFontMetrics(bv_.buffer()->params().getFont());
 			int const middle = yo_ - fm.maxAscent() / 3;
 			pain_.line(last_strikeout_x, middle, int(x_), middle,
-				Color::strikeout, Painter::line_solid, Painter::line_thin);
+				Color::deletedtext, Painter::line_solid, Painter::line_thin);
 			running_strikeout = false;
 		}
 
@@ -834,7 +834,7 @@
 			= theFontMetrics(bv_.buffer()->params().getFont());
 		int const middle = yo_ - fm.maxAscent() / 3;
 		pain_.line(last_strikeout_x, middle, int(x_), middle,
-			Color::strikeout, Painter::line_solid, Painter::line_thin);
+			Color::deletedtext, Painter::line_solid, Painter::line_thin);
 		running_strikeout = false;
 	}
 }
Index: src/Buffer.cpp
===================================================================
--- src/Buffer.cpp	(Revision 18282)
+++ src/Buffer.cpp	(Arbeitskopie)
@@ -506,18 +506,22 @@
 	}
 
 	if (params().outputChanges) {
-		if (!LaTeXFeatures::isAvailable("dvipost")) {
+		bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
+		bool xcolorsoul = LaTeXFeatures::isAvailable("soul") &&
+		                  LaTeXFeatures::isAvailable("xcolor");
+		
+		if (!dvipost && !xcolorsoul) {
 			Alert::warning(_("Changes not shown in LaTeX output"),
 			               _("Changes will not be highlighted in LaTeX output, "
-			                 "because dvipost is not installed.\n"
-			                 "If you are familiar with TeX, consider redefining "
-			                 "\\lyxinserted and \\lyxdeleted in the LaTeX preamble."));
-		} else {
+			                 "because neither dvipost nor xcolor/soul are installed.\n"
+			                 "Please install these packages or redefine "
+			                 "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
+		} else if (!xcolorsoul) {
 			Alert::warning(_("Changes not shown in LaTeX output"),
 			               _("Changes will not be highlighted in LaTeX output "
-			                 "when using pdflatex.\n"
-			                 "If you are familiar with TeX, consider redefining "
-			                 "\\lyxinserted and \\lyxdeleted in the LaTeX preamble."));
+			                 "when using pdflatex, because xcolor and soul are not installed.\n"
+			                 "Please install both packages or redefine "
+			                 "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
 		}
 	}
 
@@ -1215,14 +1219,30 @@
 	TextClass const & tclass = params().getTextClass();
 
 	if (params().outputChanges) {
+		bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
+		bool xcolorsoul = LaTeXFeatures::isAvailable("soul") &&
+		                  LaTeXFeatures::isAvailable("xcolor");
+		
         	if (features.runparams().flavor == OutputParams::LATEX) {
-			if (LaTeXFeatures::isAvailable("dvipost")) {
+			if (dvipost) {
+				features.require("ct-dvipost");
 				features.require("dvipost");
+			} else if (xcolorsoul) {
+				features.require("ct-xcolor-soul");
+				features.require("soul");
+				features.require("xcolor");
+			} else {	
+				features.require("ct-none");
+			}
+		} else if (features.runparams().flavor == OutputParams::PDFLATEX ) {
+			if (xcolorsoul) {
+				features.require("ct-xcolor-soul");
+				features.require("soul");
+				features.require("xcolor");
+				features.require("pdfcolmk"); // improves color handling in PDF output
 			} else {
 				features.require("ct-none");
 			}
-		} else if (features.runparams().flavor == OutputParams::PDFLATEX ) {
-			features.require("ct-none");
         	}
 	}
 
Index: src/Color.cpp
===================================================================
--- src/Color.cpp	(Revision 18282)
+++ src/Color.cpp	(Arbeitskopie)
@@ -309,8 +309,8 @@
 	{ eolmarker, N_("end-of-line marker"), "eolmarker", "Brown", "eolmarker" },
 	{ appendix, N_("appendix marker"), "appendix", "Brown", "appendix" },
 	{ changebar, N_("change bar"), "changebar", "Blue", "changebar" },
-	{ strikeout, N_("Deleted text"), "strikeout", "Red", "strikeout" },
-	{ newtext, N_("Added text"), "newtext", "Blue", "newtext" },
+	{ deletedtext, N_("Deleted text"), "deletedtext", "Red", "deletedtext" },
+	{ addedtext, N_("Added text"), "addedtext", "Blue", "addedtext" },
 	{ added_space, N_("added space markers"), "added_space", "Brown", "added_space" },
 	{ topline, N_("top/bottom line"), "topline", "Brown", "topline" },
 	{ tabularline, N_("table line"), "tabularline", "black",
Index: lib/chkconfig.ltx
===================================================================
--- lib/chkconfig.ltx	(Revision 18282)
+++ lib/chkconfig.ltx	(Arbeitskopie)
@@ -238,14 +238,17 @@
 \TestPackage{longtable}
 \TestPackage{natbib}
 \TestPackage{nomencl}
+\TestPackage{pdfcolmk}
 \TestPackage{prettyref}
 \TestPackage{preview}
 \TestPackage{rotating}
 \TestPackage{setspace}
+\TestPackage{soul}
 \TestPackage{subfigure}
 \TestPackage{textcomp}
 \TestPackage{varioref}
 \TestPackage{url}
+\TestPackage{xcolor}
 
 % The test for the graphics package is slightly more involved...
 \newcommand\groption{dvips}

Reply via email to