|
23 | 23 | _create_pdf_info_dict, _datetime_to_pdf)
|
24 | 24 | from matplotlib.path import Path
|
25 | 25 | from matplotlib.figure import Figure
|
| 26 | +from matplotlib.font_manager import FontProperties |
26 | 27 | from matplotlib._pylab_helpers import Gcf
|
27 | 28 |
|
28 | 29 | _log = logging.getLogger(__name__)
|
29 | 30 |
|
30 | 31 |
|
| 32 | +_DOCUMENTCLASS = r"\documentclass{article}" |
| 33 | + |
| 34 | + |
31 | 35 | # Note: When formatting floating point values, it is important to use the
|
32 | 36 | # %f/{:f} format rather than %s/{} to avoid triggering scientific notation,
|
33 | 37 | # which is not recognized by TeX.
|
34 | 38 |
|
35 | 39 | def _get_preamble():
|
36 | 40 | """Prepare a LaTeX preamble based on the rcParams configuration."""
|
| 41 | + font_size_pt = FontProperties( |
| 42 | + size=mpl.rcParams["font.size"] |
| 43 | + ).get_size_in_points() |
37 | 44 | return "\n".join([
|
38 | 45 | # Remove Matplotlib's custom command \mathdefault. (Not using
|
39 | 46 | # \mathnormal instead since this looks odd with Computer Modern.)
|
40 | 47 | r"\def\mathdefault#1{#1}",
|
41 | 48 | # Use displaystyle for all math.
|
42 | 49 | r"\everymath=\expandafter{\the\everymath\displaystyle}",
|
| 50 | + # Set up font sizes to match font.size setting. |
| 51 | + # If present, use the KOMA package scrextend to adjust the standard |
| 52 | + # LaTeX font commands (\tiny, ..., \normalsize, ..., \Huge) accordingly. |
| 53 | + # Otherwise, only set \normalsize, manually. |
| 54 | + r"\IfFileExists{scrextend.sty}{", |
| 55 | + r" \usepackage[fontsize=%fpt]{scrextend}" % font_size_pt, |
| 56 | + r"}{", |
| 57 | + r" \renewcommand{\normalsize}{\fontsize{%f}{%f}\selectfont}" |
| 58 | + % (font_size_pt, 1.2 * font_size_pt), |
| 59 | + r" \normalsize", |
| 60 | + r"}", |
43 | 61 | # Allow pgf.preamble to override the above definitions.
|
44 | 62 | mpl.rcParams["pgf.preamble"],
|
45 |
| - r"\ifdefined\pdftexversion\else % non-pdftex case.", |
46 |
| - r" \usepackage{fontspec}", |
47 | 63 | *([
|
| 64 | + r"\ifdefined\pdftexversion\else % non-pdftex case.", |
| 65 | + r" \usepackage{fontspec}", |
| 66 | + ] + [ |
48 | 67 | r" \%s{%s}[Path=\detokenize{%s/}]"
|
49 | 68 | % (command, path.name, path.parent.as_posix())
|
50 | 69 | for command, path in zip(
|
51 | 70 | ["setmainfont", "setsansfont", "setmonofont"],
|
52 | 71 | [pathlib.Path(fm.findfont(family))
|
53 | 72 | for family in ["serif", "sans\\-serif", "monospace"]]
|
54 | 73 | )
|
55 |
| - ] if mpl.rcParams["pgf.rcfonts"] else []), |
56 |
| - r"\fi", |
| 74 | + ] + [r"\fi"] if mpl.rcParams["pgf.rcfonts"] else []), |
57 | 75 | # Documented as "must come last".
|
58 | 76 | mpl.texmanager._usepackage_if_not_loaded("underscore", option="strings"),
|
59 | 77 | ])
|
@@ -94,6 +112,8 @@ def _escape_and_apply_props(s, prop):
|
94 | 112 | family = prop.get_family()[0]
|
95 | 113 | if family in families:
|
96 | 114 | commands.append(families[family])
|
| 115 | + elif not mpl.rcParams["pgf.rcfonts"]: |
| 116 | + commands.append(r"\fontfamily{\familydefault}") |
97 | 117 | elif any(font.name == family for font in fm.fontManager.ttflist):
|
98 | 118 | commands.append(
|
99 | 119 | r"\ifdefined\pdftexversion\else\setmainfont{%s}\rmfamily\fi" % family)
|
@@ -185,7 +205,7 @@ class LatexManager:
|
185 | 205 | @staticmethod
|
186 | 206 | def _build_latex_header():
|
187 | 207 | latex_header = [
|
188 |
| - r"\documentclass{article}", |
| 208 | + _DOCUMENTCLASS, |
189 | 209 | # Include TeX program name as a comment for cache invalidation.
|
190 | 210 | # TeX does not allow this to be the first line.
|
191 | 211 | rf"% !TeX program = {mpl.rcParams['pgf.texsystem']}",
|
@@ -814,7 +834,7 @@ def print_pdf(self, fname_or_fh, *, metadata=None, **kwargs):
|
814 | 834 | self.print_pgf(tmppath / "figure.pgf", **kwargs)
|
815 | 835 | (tmppath / "figure.tex").write_text(
|
816 | 836 | "\n".join([
|
817 |
| - r"\documentclass[12pt]{article}", |
| 837 | + _DOCUMENTCLASS, |
818 | 838 | r"\usepackage[pdfinfo={%s}]{hyperref}" % pdfinfo,
|
819 | 839 | r"\usepackage[papersize={%fin,%fin}, margin=0in]{geometry}"
|
820 | 840 | % (w, h),
|
@@ -924,7 +944,7 @@ def _write_header(self, width_inches, height_inches):
|
924 | 944 | pdfinfo = ','.join(
|
925 | 945 | _metadata_to_str(k, v) for k, v in self._info_dict.items())
|
926 | 946 | latex_header = "\n".join([
|
927 |
| - r"\documentclass[12pt]{article}", |
| 947 | + _DOCUMENTCLASS, |
928 | 948 | r"\usepackage[pdfinfo={%s}]{hyperref}" % pdfinfo,
|
929 | 949 | r"\usepackage[papersize={%fin,%fin}, margin=0in]{geometry}"
|
930 | 950 | % (width_inches, height_inches),
|
|
0 commit comments