This attachment addresses the following two bugs:

http://bugzilla.lyx.org/show_bug.cgi?id=3838
(Compilation errors with custom margins)

If the paper size options are not passed as optional argument to the geometry 
package, but as \geometry arguments (as we do now), some classes (such as 
revtex4) fail to build.

http://bugzilla.lyx.org/show_bug.cgi?id=5613
(geometry drivers not configurable)

Geometry older than 4.0 cannot detect the graphics driver automatically. 
However, setting the driver in Document>Settings has no effect. This pacth 
passes the custom driver to the package, if it is one of the supported.

BTW, I think the label "PostScript driver" in the dialog is misleading, since 
this is usually calles "graphics driver" in the manuals. I'd like to rename 
this as well.

Opinions?

Jürgen
Index: src/BufferParams.h
===================================================================
--- src/BufferParams.h	(Revision 27887)
+++ src/BufferParams.h	(Arbeitskopie)
@@ -310,6 +310,8 @@
 	std::string paperSizeName(PapersizePurpose purpose) const;
 	/// set up if and how babel is called
 	std::string babelCall(std::string const & lang_opts) const;
+	/// return supported drivers for specific packages
+	docstring getGraphicsDriver(std::string const & package) const;
 	/// handle inputenc etc.
 	void writeEncodingPreamble(odocstream & os, LaTeXFeatures & features,
 					      TexRow & texrow) const;
Index: src/BufferParams.cpp
===================================================================
--- src/BufferParams.cpp	(Revision 27887)
+++ src/BufferParams.cpp	(Arbeitskopie)
@@ -1129,71 +1129,71 @@
 		texrow.newline();
 	}
 	if (use_geometry || nonstandard_papersize) {
-		os << "\\usepackage{geometry}\n";
-		texrow.newline();
-		os << "\\geometry{verbose";
+		odocstringstream ods;
+		if (!getGraphicsDriver("geometry").empty())
+			ods << getGraphicsDriver("geometry");
 		if (orientation == ORIENTATION_LANDSCAPE)
-			os << ",landscape";
+			ods << ",landscape";
 		switch (papersize) {
 		case PAPER_CUSTOM:
 			if (!paperwidth.empty())
-				os << ",paperwidth="
+				ods << ",paperwidth="
 				   << from_ascii(paperwidth);
 			if (!paperheight.empty())
-				os << ",paperheight="
+				ods << ",paperheight="
 				   << from_ascii(paperheight);
 			break;
 		case PAPER_USLETTER:
-			os << ",letterpaper";
+			ods << ",letterpaper";
 			break;
 		case PAPER_USLEGAL:
-			os << ",legalpaper";
+			ods << ",legalpaper";
 			break;
 		case PAPER_USEXECUTIVE:
-			os << ",executivepaper";
+			ods << ",executivepaper";
 			break;
 		case PAPER_A3:
-			os << ",a3paper";
+			ods << ",a3paper";
 			break;
 		case PAPER_A4:
-			os << ",a4paper";
+			ods << ",a4paper";
 			break;
 		case PAPER_A5:
-			os << ",a5paper";
+			ods << ",a5paper";
 			break;
 		case PAPER_B3:
-			os << ",b3paper";
+			ods << ",b3paper";
 			break;
 		case PAPER_B4:
-			os << ",b4paper";
+			ods << ",b4paper";
 			break;
 		case PAPER_B5:
-			os << ",b5paper";
+			ods << ",b5paper";
 			break;
 		default:
 			// default papersize ie PAPER_DEFAULT
 			switch (lyxrc.default_papersize) {
 			case PAPER_DEFAULT: // keep compiler happy
 			case PAPER_USLETTER:
-				os << ",letterpaper";
+				ods << ",letterpaper";
 				break;
 			case PAPER_USLEGAL:
-				os << ",legalpaper";
+				ods << ",legalpaper";
 				break;
 			case PAPER_USEXECUTIVE:
-				os << ",executivepaper";
+				ods << ",executivepaper";
 				break;
 			case PAPER_A3:
-				os << ",a3paper";
+				ods << ",a3paper";
 				break;
 			case PAPER_A4:
-				os << ",a4paper";
+				ods << ",a4paper";
 				break;
 			case PAPER_A5:
-				os << ",a5paper";
+				ods << ",a5paper";
 				break;
 			case PAPER_B5:
-				os << ",b5paper";
+				ods << ",b5paper";
 				break;
 			case PAPER_B3:
 			case PAPER_B4:
@@ -1201,6 +1201,13 @@
 				break;
 			}
 		}
+		docstring const g_options = trim(ods.str(), ",");
+		os << "\\usepackage";
+		if (!g_options.empty())
+			os << '[' << g_options << ']';
+		os << "{geometry}\n";
+		texrow.newline();
+		os << "\\geometry{verbose";
 		if (!topmargin.empty())
 			os << ",tmargin=" << from_ascii(Length(topmargin).asLatexString());
 		if (!bottommargin.empty())
@@ -2103,6 +2110,24 @@
 }
 
 
+docstring BufferParams::getGraphicsDriver(string const & package) const
+{
+	docstring result;
+
+	if (package == "geometry") {
+		if (graphicsDriver == "dvips"
+		    || graphicsDriver == "dvipdfm"
+		    || graphicsDriver == "pdftex"
+		    || graphicsDriver == "vtex")
+			result = from_ascii(graphicsDriver);
+		else if (graphicsDriver == "dvipdfmx")
+			result = from_ascii("dvipdfm");
+	}
+
+	return result;
+}
+
+
 void BufferParams::writeEncodingPreamble(odocstream & os,
 		LaTeXFeatures & features, TexRow & texrow) const
 {

Reply via email to