|
23 | 23 | _create_pdf_info_dict,_datetime_to_pdf)
|
24 | 24 | frommatplotlib.pathimportPath
|
25 | 25 | frommatplotlib.figureimportFigure
|
| 26 | +frommatplotlib.font_managerimportFontProperties |
26 | 27 | frommatplotlib._pylab_helpersimportGcf
|
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 | forcommand,pathinzip(
|
51 | 70 | ["setmainfont","setsansfont","setmonofont"],
|
52 | 71 | [pathlib.Path(fm.findfont(family))
|
53 | 72 | forfamilyin ["serif","sans\\-serif","monospace"]]
|
54 | 73 | )
|
55 |
| - ]ifmpl.rcParams["pgf.rcfonts"]else []), |
56 |
| -r"\fi", |
| 74 | + ]+ [r"\fi"]ifmpl.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 | iffamilyinfamilies:
|
96 | 114 | commands.append(families[family])
|
| 115 | +elifnotmpl.rcParams["pgf.rcfonts"]: |
| 116 | +commands.append(r"\fontfamily{\familydefault}") |
97 | 117 | elifany(font.name==familyforfontinfm.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)fork,vinself._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),
|
|