Load geometry after graphics

Newer graphics driver overwrite some (output) page settings otherwise
See https://tex.stackexchange.com/a/384952/19291

Re-fixes #10970

(cherry picked from commit ca4fc01847)
This commit is contained in:
Juergen Spitzmueller 2024-07-27 12:46:12 +02:00 committed by Richard Kimberly Heck
parent 73bfef16f3
commit c16f99c524
3 changed files with 29 additions and 15 deletions

View File

@ -2071,43 +2071,49 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
case PAPER_DEFAULT: case PAPER_DEFAULT:
break; break;
} }
docstring g_options = trim(ods.str(), ","); string g_options = to_ascii(trim(ods.str(), ","));
os << "\\usepackage"; // 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 // geometry-light means that the class works with geometry, but overwrites
// the package options and paper sizes (memoir does this). // the package options and paper sizes (memoir does this).
// In this case, all options need to go to \geometry // In this case, all options need to go to \geometry
// and the standard paper sizes need to go to the class options. // and the standard paper sizes need to go to the class options.
if (!g_options.empty() && !features.isProvided("geometry-light")) { if (!g_options.empty() && !features.isProvided("geometry-light")) {
os << '[' << g_options << ']'; gs << '[' << g_options << ']';
g_options.clear(); g_options.clear();
} }
os << "{geometry}\n"; gs << "{geometry}\n";
if (use_geometry || features.isProvided("geometry-light")) { if (use_geometry || features.isProvided("geometry-light")) {
os << "\\geometry{verbose"; gs << "\\geometry{verbose";
if (!g_options.empty()) if (!g_options.empty())
// Output general options here with "geometry light". // Output general options here with "geometry light".
os << "," << g_options; gs << "," << g_options;
// output this only if use_geometry is true // output this only if use_geometry is true
if (use_geometry) { if (use_geometry) {
if (!topmargin.empty()) if (!topmargin.empty())
os << ",tmargin=" << from_ascii(Length(topmargin).asLatexString()); gs << ",tmargin=" << Length(topmargin).asLatexString();
if (!bottommargin.empty()) if (!bottommargin.empty())
os << ",bmargin=" << from_ascii(Length(bottommargin).asLatexString()); gs << ",bmargin=" << Length(bottommargin).asLatexString();
if (!leftmargin.empty()) if (!leftmargin.empty())
os << ",lmargin=" << from_ascii(Length(leftmargin).asLatexString()); gs << ",lmargin=" << Length(leftmargin).asLatexString();
if (!rightmargin.empty()) if (!rightmargin.empty())
os << ",rmargin=" << from_ascii(Length(rightmargin).asLatexString()); gs << ",rmargin=" << Length(rightmargin).asLatexString();
if (!headheight.empty()) if (!headheight.empty())
os << ",headheight=" << from_ascii(Length(headheight).asLatexString()); gs << ",headheight=" << Length(headheight).asLatexString();
if (!headsep.empty()) if (!headsep.empty())
os << ",headsep=" << from_ascii(Length(headsep).asLatexString()); gs << ",headsep=" << Length(headsep).asLatexString();
if (!footskip.empty()) if (!footskip.empty())
os << ",footskip=" << from_ascii(Length(footskip).asLatexString()); gs << ",footskip=" << Length(footskip).asLatexString();
if (!columnsep.empty()) 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 } else if (orientation == ORIENTATION_LANDSCAPE
|| papersize != PAPER_DEFAULT) { || papersize != PAPER_DEFAULT) {
features.require("papersize"); features.require("papersize");

View File

@ -247,6 +247,8 @@ public:
/// use custom margins /// use custom margins
bool use_geometry; bool use_geometry;
/// ///
mutable std::string set_geometry;
///
std::string paperwidth; std::string paperwidth;
/// ///
std::string paperheight; std::string paperheight;

View File

@ -1383,6 +1383,12 @@ string const LaTeXFeatures::getPackages() const
<< "]{graphicx}\n"; << "]{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 // These must be loaded after graphicx, since they try
// to load graphicx without options // to load graphicx without options
if (mustProvide("rotating")) if (mustProvide("rotating"))