From 46ac87e417ec4141ece678884bfd739328ce5712 Mon Sep 17 00:00:00 2001 From: Simon May Date: Sat, 23 Sep 2023 01:28:09 -0400 Subject: [PATCH 1/9] PGF: Fix inconsistent options for \documentclass This could cause a mismatch between lengths when measuring vs. producing output for things that depend on the font size setting at the beginning of the document, e.g. unicode-math. Use \documentclass{article} without options here, which defaults to a font size of 10pt (same as the matplotlib rc default for font.size). --- lib/matplotlib/backends/backend_pgf.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index a9763e04a8bd..f1228ea38c55 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -28,6 +28,8 @@ _log = logging.getLogger(__name__) +DOCUMENTCLASS = r"\documentclass{article}" + # Note: When formatting floating point values, it is important to use the # %f/{:f} format rather than %s/{} to avoid triggering scientific notation, # which is not recognized by TeX. @@ -185,7 +187,7 @@ class LatexManager: @staticmethod def _build_latex_header(): latex_header = [ - r"\documentclass{article}", + DOCUMENTCLASS, # Include TeX program name as a comment for cache invalidation. # TeX does not allow this to be the first line. rf"% !TeX program = {mpl.rcParams['pgf.texsystem']}", @@ -814,7 +816,7 @@ def print_pdf(self, fname_or_fh, *, metadata=None, **kwargs): self.print_pgf(tmppath / "figure.pgf", **kwargs) (tmppath / "figure.tex").write_text( "\n".join([ - r"\documentclass[12pt]{article}", + DOCUMENTCLASS, r"\usepackage[pdfinfo={%s}]{hyperref}" % pdfinfo, r"\usepackage[papersize={%fin,%fin}, margin=0in]{geometry}" % (w, h), @@ -924,7 +926,7 @@ def _write_header(self, width_inches, height_inches): pdfinfo = ','.join( _metadata_to_str(k, v) for k, v in self._info_dict.items()) latex_header = "\n".join([ - r"\documentclass[12pt]{article}", + DOCUMENTCLASS, r"\usepackage[pdfinfo={%s}]{hyperref}" % pdfinfo, r"\usepackage[papersize={%fin,%fin}, margin=0in]{geometry}" % (width_inches, height_inches), From 14a590011ba2d346a4b4f867f344d43575335729 Mon Sep 17 00:00:00 2001 From: Simon May Date: Sat, 23 Sep 2023 01:35:22 -0400 Subject: [PATCH 2/9] PGF: Only force loading fontspec if pgf.rcfonts=True --- lib/matplotlib/backends/backend_pgf.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index f1228ea38c55..ac973de4396d 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -44,9 +44,10 @@ def _get_preamble(): r"\everymath=\expandafter{\the\everymath\displaystyle}", # Allow pgf.preamble to override the above definitions. mpl.rcParams["pgf.preamble"], - r"\ifdefined\pdftexversion\else % non-pdftex case.", - r" \usepackage{fontspec}", *([ + r"\ifdefined\pdftexversion\else % non-pdftex case.", + r" \usepackage{fontspec}", + ] + [ r" \%s{%s}[Path=\detokenize{%s/}]" % (command, path.name, path.parent.as_posix()) for command, path in zip( @@ -54,8 +55,7 @@ def _get_preamble(): [pathlib.Path(fm.findfont(family)) for family in ["serif", "sans\\-serif", "monospace"]] ) - ] if mpl.rcParams["pgf.rcfonts"] else []), - r"\fi", + ] + [r"\fi"] if mpl.rcParams["pgf.rcfonts"] else []), # Documented as "must come last". mpl.texmanager._usepackage_if_not_loaded("underscore", option="strings"), ]) From 8bf18f2873565ab7d9dc33c5e822d8cc20de87b7 Mon Sep 17 00:00:00 2001 From: Simon May Date: Sat, 23 Sep 2023 03:52:25 -0400 Subject: [PATCH 3/9] PGF: Set up font sizes to match font.size setting This allows the output .pgf file to be used in external documents with arbitrary font size settings (which should match the rc setting font.size). This avoids mismatches between matplotlib and external LaTeX documents for things that depend on the font size setting (e.g. unicode-math). If the LaTeX package scrextend is present, this also adjusts the standard LaTeX font commands (\tiny, ..., \normalsize, ..., \Huge) relative to font.size. --- lib/matplotlib/backends/backend_pgf.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index ac973de4396d..5252e9cd5eb4 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -23,6 +23,7 @@ _create_pdf_info_dict, _datetime_to_pdf) from matplotlib.path import Path from matplotlib.figure import Figure +from matplotlib.font_manager import FontProperties from matplotlib._pylab_helpers import Gcf _log = logging.getLogger(__name__) @@ -36,12 +37,27 @@ def _get_preamble(): """Prepare a LaTeX preamble based on the rcParams configuration.""" + font_size_pt = FontProperties( + size=mpl.rcParams["font.size"] + ).get_size_in_points() return "\n".join([ # Remove Matplotlib's custom command \mathdefault. (Not using # \mathnormal instead since this looks odd with Computer Modern.) r"\def\mathdefault#1{#1}", # Use displaystyle for all math. r"\everymath=\expandafter{\the\everymath\displaystyle}", + # Set up font sizes to match font.size setting. + r"\makeatletter", + r"\IfFileExists{scrextend.sty}{", + r" %s" % mpl.texmanager._usepackage_if_not_loaded( + "scrextend", option="fontsize=%fpt" % font_size_pt + ), + r"}{", + r" \renewcommand{\normalsize}{\fontsize{%f}{%f}\selectfont}" + % (font_size_pt, 1.2 * font_size_pt), + r" \normalsize", + r"}", + r"\makeatother", # Allow pgf.preamble to override the above definitions. mpl.rcParams["pgf.preamble"], *([ From 98673a0cb44df86bb1885a3dded98b2744ba2fd4 Mon Sep 17 00:00:00 2001 From: Simon May Date: Sat, 23 Sep 2023 20:23:49 -0400 Subject: [PATCH 4/9] PGF: Remove unnecessary _usepackage_if_not_loaded --- lib/matplotlib/backends/backend_pgf.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index 5252e9cd5eb4..8225d18051ce 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -31,6 +31,7 @@ DOCUMENTCLASS = r"\documentclass{article}" + # Note: When formatting floating point values, it is important to use the # %f/{:f} format rather than %s/{} to avoid triggering scientific notation, # which is not recognized by TeX. @@ -47,17 +48,13 @@ def _get_preamble(): # Use displaystyle for all math. r"\everymath=\expandafter{\the\everymath\displaystyle}", # Set up font sizes to match font.size setting. - r"\makeatletter", r"\IfFileExists{scrextend.sty}{", - r" %s" % mpl.texmanager._usepackage_if_not_loaded( - "scrextend", option="fontsize=%fpt" % font_size_pt - ), + r" \usepackage[fontsize=%fpt]{scrextend}" % font_size_pt, r"}{", r" \renewcommand{\normalsize}{\fontsize{%f}{%f}\selectfont}" % (font_size_pt, 1.2 * font_size_pt), r" \normalsize", r"}", - r"\makeatother", # Allow pgf.preamble to override the above definitions. mpl.rcParams["pgf.preamble"], *([ From 896b280b7513d06415331c4d9e5e2566660e72ee Mon Sep 17 00:00:00 2001 From: Simon May Date: Tue, 3 Oct 2023 15:09:59 -0400 Subject: [PATCH 5/9] PGF: Do not use \setmainfont if pgf.rcfonts=False --- lib/matplotlib/backends/backend_pgf.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index 8225d18051ce..b54f3501967e 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -109,6 +109,8 @@ def _escape_and_apply_props(s, prop): family = prop.get_family()[0] if family in families: commands.append(families[family]) + elif not mpl.rcParams["pgf.rcfonts"]: + commands.append(r"\rmfamily") elif any(font.name == family for font in fm.fontManager.ttflist): commands.append( r"\ifdefined\pdftexversion\else\setmainfont{%s}\rmfamily\fi" % family) From 4a4a41fe6825973ed6cd84c3a755912922060179 Mon Sep 17 00:00:00 2001 From: Simon May Date: Tue, 3 Oct 2023 21:49:15 +0200 Subject: [PATCH 6/9] Add image test for #26892 --- .../pgf_document_font_size.pdf | Bin 0 -> 8797 bytes lib/matplotlib/tests/test_backend_pgf.py | 24 ++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_backend_pgf/pgf_document_font_size.pdf diff --git a/lib/matplotlib/tests/baseline_images/test_backend_pgf/pgf_document_font_size.pdf b/lib/matplotlib/tests/baseline_images/test_backend_pgf/pgf_document_font_size.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9f060419a2a7ca1b2599909635dbe00c03d0000e GIT binary patch literal 8797 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_backend_pgf.py b/lib/matplotlib/tests/test_backend_pgf.py index 8a83515f161c..04b51f4d3781 100644 --- a/lib/matplotlib/tests/test_backend_pgf.py +++ b/lib/matplotlib/tests/test_backend_pgf.py @@ -406,3 +406,27 @@ def test_sketch_params(): # \pgfdecoratecurrentpath must be after the path definition and before the # path is used (\pgfusepath) assert baseline in buf + + +# test to make sure that the document font size is set consistently (see #26892) +@needs_pgf_xelatex +@pytest.mark.skipif( + not _has_tex_package('unicode-math'), reason='needs unicode-math.sty' +) +@pytest.mark.backend('pgf') +@image_comparison(['pgf_document_font_size.pdf'], style='default', remove_text=True) +def test_document_font_size(): + mpl.rcParams.update({ + 'pgf.texsystem': 'xelatex', + 'pgf.rcfonts': False, + 'pgf.preamble': r'\usepackage{unicode-math}', + }) + plt.figure() + plt.plot([], + label=r'$this is a very very very long math label a \times b + 10^{-3}$ ' + r'and some text' + ) + plt.plot([], + label=r'\normalsize the document font size is \the\fontdimen6\font' + ) + plt.legend() From 0fec213c1ac5865a8f73998f7b4260446e6c4a75 Mon Sep 17 00:00:00 2001 From: Simon May Date: Mon, 22 Apr 2024 15:17:03 -0400 Subject: [PATCH 7/9] Prepend underscore to variable name DOCUMENTCLASS --- lib/matplotlib/backends/backend_pgf.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index b54f3501967e..77a9746dcad5 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -29,7 +29,7 @@ _log = logging.getLogger(__name__) -DOCUMENTCLASS = r"\documentclass{article}" +_DOCUMENTCLASS = r"\documentclass{article}" # Note: When formatting floating point values, it is important to use the @@ -202,7 +202,7 @@ class LatexManager: @staticmethod def _build_latex_header(): latex_header = [ - DOCUMENTCLASS, + _DOCUMENTCLASS, # Include TeX program name as a comment for cache invalidation. # TeX does not allow this to be the first line. rf"% !TeX program = {mpl.rcParams['pgf.texsystem']}", @@ -831,7 +831,7 @@ def print_pdf(self, fname_or_fh, *, metadata=None, **kwargs): self.print_pgf(tmppath / "figure.pgf", **kwargs) (tmppath / "figure.tex").write_text( "\n".join([ - DOCUMENTCLASS, + _DOCUMENTCLASS, r"\usepackage[pdfinfo={%s}]{hyperref}" % pdfinfo, r"\usepackage[papersize={%fin,%fin}, margin=0in]{geometry}" % (w, h), @@ -941,7 +941,7 @@ def _write_header(self, width_inches, height_inches): pdfinfo = ','.join( _metadata_to_str(k, v) for k, v in self._info_dict.items()) latex_header = "\n".join([ - DOCUMENTCLASS, + _DOCUMENTCLASS, r"\usepackage[pdfinfo={%s}]{hyperref}" % pdfinfo, r"\usepackage[papersize={%fin,%fin}, margin=0in]{geometry}" % (width_inches, height_inches), From 6d49b513856dce9189b0af078126619495890632 Mon Sep 17 00:00:00 2001 From: Simon May Date: Tue, 23 Apr 2024 11:59:50 -0400 Subject: [PATCH 8/9] PGF: Use \familydefault instead of \rmfamily if pgf.rcfonts=False --- lib/matplotlib/backends/backend_pgf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index 77a9746dcad5..76f2a9856f8d 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -110,7 +110,7 @@ def _escape_and_apply_props(s, prop): if family in families: commands.append(families[family]) elif not mpl.rcParams["pgf.rcfonts"]: - commands.append(r"\rmfamily") + commands.append(r"\fontfamily{\familydefault}") elif any(font.name == family for font in fm.fontManager.ttflist): commands.append( r"\ifdefined\pdftexversion\else\setmainfont{%s}\rmfamily\fi" % family) From f305f5f5d4d107634f69347bf8c3b1fe2a8ff088 Mon Sep 17 00:00:00 2001 From: Simon May Date: Tue, 23 Apr 2024 12:20:06 -0400 Subject: [PATCH 9/9] PGF: Expand comment on use of scrextend LaTeX package --- lib/matplotlib/backends/backend_pgf.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index 76f2a9856f8d..736656b0cc61 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -48,6 +48,9 @@ def _get_preamble(): # Use displaystyle for all math. r"\everymath=\expandafter{\the\everymath\displaystyle}", # Set up font sizes to match font.size setting. + # If present, use the KOMA package scrextend to adjust the standard + # LaTeX font commands (\tiny, ..., \normalsize, ..., \Huge) accordingly. + # Otherwise, only set \normalsize, manually. r"\IfFileExists{scrextend.sty}{", r" \usepackage[fontsize=%fpt]{scrextend}" % font_size_pt, r"}{",