]> git.lyx.org Git - lyx.git/commitdiff
Load geometry after graphics
authorJuergen Spitzmueller <spitz@lyx.org>
Sat, 27 Jul 2024 10:46:12 +0000 (12:46 +0200)
committerJuergen Spitzmueller <spitz@lyx.org>
Sat, 27 Jul 2024 10:46:12 +0000 (12:46 +0200)
Newer graphics driver overwrite some (output) page settings otherwise
See https://tex.stackexchange.com/a/384952/19291

Re-fixes #10970

src/BufferParams.cpp
src/BufferParams.h
src/LaTeXFeatures.cpp

index 0a01f9bb4f0bbd5e8047473bc8006d7e7e0c6310..a81d9af866c7ae3d4bd80421c0b8e46d7736b359 100644 (file)
@@ -2078,43 +2078,49 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                case PAPER_DEFAULT:
                        break;
                }
-               docstring g_options = trim(ods.str(), ",");
-               os << "\\usepackage";
+               string g_options = to_ascii(trim(ods.str(), ","));
+               // geometry must be loaded after graphics nowadays, since
+               // graphic drivers might overwrite some settings
+               // see https://tex.stackexchange.com/a/384952/19291
+               // Hence we store this and output it later
+               ostringstream gs;
+               gs << "\\usepackage";
                // geometry-light means that the class works with geometry, but overwrites
                // the package options and paper sizes (memoir does this).
                // In this case, all options need to go to \geometry
                // and the standard paper sizes need to go to the class options.
                if (!g_options.empty() && !features.isProvided("geometry-light")) {
-                       os << '[' << g_options << ']';
+                       gs << '[' << g_options << ']';
                        g_options.clear();
                }
-               os << "{geometry}\n";
+               gs << "{geometry}\n";
                if (use_geometry || features.isProvided("geometry-light")) {
-                       os << "\\geometry{verbose";
+                       gs << "\\geometry{verbose";
                        if (!g_options.empty())
                                // Output general options here with "geometry light".
-                               os << "," << g_options;
+                               gs << "," << g_options;
                        // output this only if use_geometry is true
                        if (use_geometry) {
                                if (!topmargin.empty())
-                                       os << ",tmargin=" << from_ascii(Length(topmargin).asLatexString());
+                                       gs << ",tmargin=" << Length(topmargin).asLatexString();
                                if (!bottommargin.empty())
-                                       os << ",bmargin=" << from_ascii(Length(bottommargin).asLatexString());
+                                       gs << ",bmargin=" << Length(bottommargin).asLatexString();
                                if (!leftmargin.empty())
-                                       os << ",lmargin=" << from_ascii(Length(leftmargin).asLatexString());
+                                       gs << ",lmargin=" << Length(leftmargin).asLatexString();
                                if (!rightmargin.empty())
-                                       os << ",rmargin=" << from_ascii(Length(rightmargin).asLatexString());
+                                       gs << ",rmargin=" << Length(rightmargin).asLatexString();
                                if (!headheight.empty())
-                                       os << ",headheight=" << from_ascii(Length(headheight).asLatexString());
+                                       gs << ",headheight=" << Length(headheight).asLatexString();
                                if (!headsep.empty())
-                                       os << ",headsep=" << from_ascii(Length(headsep).asLatexString());
+                                       gs << ",headsep=" << Length(headsep).asLatexString();
                                if (!footskip.empty())
-                                       os << ",footskip=" << from_ascii(Length(footskip).asLatexString());
+                                       gs << ",footskip=" << Length(footskip).asLatexString();
                                if (!columnsep.empty())
-                                       os << ",columnsep=" << from_ascii(Length(columnsep).asLatexString());
+                                       gs << ",columnsep=" << Length(columnsep).asLatexString();
                        }
-               os << "}\n";
+                       gs << "}\n";
                }
+               set_geometry = gs.str();
        } else if (orientation == ORIENTATION_LANDSCAPE
                   || papersize != PAPER_DEFAULT) {
                features.require("papersize");
index 9bfd16d492b13a195bc3cf9b1fba3b139323929b..72d2117193ff4f929fbf4348d552032bd49739e3 100644 (file)
@@ -249,6 +249,8 @@ public:
        /// use custom margins
        bool use_geometry;
        ///
+       mutable std::string set_geometry;
+       ///
        std::string paperwidth;
        ///
        std::string paperheight;
index 81022cad01b1060b346de92e0cb3340081ecb819..3736953480752881d53756d85208157008273756 100644 (file)
@@ -1375,6 +1375,12 @@ string const LaTeXFeatures::getPackages() const
                                 << "]{graphicx}\n";
        }
 
+       // geometry must be loaded after graphics, since
+       // graphic drivers might overwrite some settings
+       // see https://tex.stackexchange.com/a/384952/19291
+       if (!params_.set_geometry.empty())
+               packages << params_.set_geometry;
+
        // These must be loaded after graphicx, since they try
        // to load graphicx without options
        if (mustProvide("rotating"))