@@ -192,6 +192,25 @@ def get_custom_preamble(self):
192192 """Return a string containing user additions to the tex preamble."""
193193 return rcParams ['text.latex.preamble' ]
194194
195+ def _get_preamble (self ):
196+ unicode_preamble = "\n " .join ([
197+ r"\usepackage[utf8]{inputenc}" ,
198+ r"\DeclareUnicodeCharacter{2212}{\ensuremath{-}}" ,
199+ ]) if rcParams ["text.latex.unicode" ] else ""
200+ return "\n " .join ([
201+ r"\documentclass{article}" ,
202+ # Pass-through \mathdefault, which is used in non-usetex mode to
203+ # use the default text font but was historically suppressed in
204+ # usetex mode.
205+ r"\newcommand{\mathdefault}[1]{#1}" ,
206+ self ._font_preamble ,
207+ unicode_preamble ,
208+ # Needs to come early so that the custom preamble can change the
209+ # geometry, e.g. in convert_psfrags.
210+ r"\usepackage[papersize=72in,body=70in,margin=1in]{geometry}" ,
211+ self .get_custom_preamble (),
212+ ])
213+
195214 def make_tex (self , tex , fontsize ):
196215 """
197216 Generate a tex file to render the tex string at a specific font size.
@@ -200,29 +219,22 @@ def make_tex(self, tex, fontsize):
200219 """
201220 basefile = self .get_basefile (tex , fontsize )
202221 texfile = '%s.tex' % basefile
203- custom_preamble = self .get_custom_preamble ()
204222 fontcmd = {'sans-serif' : r'{\sffamily %s}' ,
205223 'monospace' : r'{\ttfamily %s}' }.get (self .font_family ,
206224 r'{\rmfamily %s}' )
207225 tex = fontcmd % tex
208226
209- unicode_preamble = "\n " .join ([
210- r"\usepackage[utf8]{inputenc}" ,
211- r"\DeclareUnicodeCharacter{2212}{\ensuremath{-}}" ,
212- ]) if rcParams ["text.latex.unicode" ] else ""
213-
214227 s = r"""
215- \documentclass{article}
216228%s
217- %s
218- %s
219- \usepackage[papersize={72in,72in},body={70in,70in},margin={1in,1in}]{geometry}
220229\pagestyle{empty}
221230\begin{document}
222- \fontsize{%f}{%f}%s
231+ %% The empty hbox ensures that a page is printed even for empty inputs, except
232+ %% when using psfrag which gets confused by it.
233+ \fontsize{%f}{%f}%%
234+ \ifdefined\psfrag\else\hbox{}\fi%%
235+ %s
223236\end{document}
224- """ % (self ._font_preamble , unicode_preamble , custom_preamble ,
225- fontsize , fontsize * 1.25 , tex )
237+ """ % (self ._get_preamble (), fontsize , fontsize * 1.25 , tex )
226238 with open (texfile , 'wb' ) as fh :
227239 if rcParams ['text.latex.unicode' ]:
228240 fh .write (s .encode ('utf8' ))
@@ -250,27 +262,17 @@ def make_tex_preview(self, tex, fontsize):
250262 """
251263 basefile = self .get_basefile (tex , fontsize )
252264 texfile = '%s.tex' % basefile
253- custom_preamble = self .get_custom_preamble ()
254265 fontcmd = {'sans-serif' : r'{\sffamily %s}' ,
255266 'monospace' : r'{\ttfamily %s}' }.get (self .font_family ,
256267 r'{\rmfamily %s}' )
257268 tex = fontcmd % tex
258269
259- unicode_preamble = "\n " .join ([
260- r"\usepackage[utf8]{inputenc}" ,
261- r"\DeclareUnicodeCharacter{2212}{\ensuremath{-}}" ,
262- ]) if rcParams ["text.latex.unicode" ] else ""
263-
264270 # newbox, setbox, immediate, etc. are used to find the box
265271 # extent of the rendered text.
266272
267273 s = r"""
268- \documentclass{article}
269- %s
270- %s
271274%s
272275\usepackage[active,showbox,tightpage]{preview}
273- \usepackage[papersize={72in,72in},body={70in,70in},margin={1in,1in}]{geometry}
274276
275277%% we override the default showbox as it is treated as an error and makes
276278%% the exit status not zero
@@ -282,8 +284,7 @@ def make_tex_preview(self, tex, fontsize):
282284{\fontsize{%f}{%f}%s}
283285\end{preview}
284286\end{document}
285- """ % (self ._font_preamble , unicode_preamble , custom_preamble ,
286- fontsize , fontsize * 1.25 , tex )
287+ """ % (self ._get_preamble (), fontsize , fontsize * 1.25 , tex )
287288 with open (texfile , 'wb' ) as fh :
288289 if rcParams ['text.latex.unicode' ]:
289290 fh .write (s .encode ('utf8' ))
@@ -391,9 +392,16 @@ def make_png(self, tex, fontsize, dpi):
391392 # see get_rgba for a discussion of the background
392393 if not os .path .exists (pngfile ):
393394 dvifile = self .make_dvi (tex , fontsize )
394- self ._run_checked_subprocess (
395- ["dvipng" , "-bg" , "Transparent" , "-D" , str (dpi ),
396- "-T" , "tight" , "-o" , pngfile , dvifile ], tex )
395+ cmd = ["dvipng" , "-bg" , "Transparent" , "-D" , str (dpi ),
396+ "-T" , "tight" , "-o" , pngfile , dvifile ]
397+ # When testing, disable FreeType rendering for reproducibility; but
398+ # dvipng 1.16 has a bug (fixed in f3ff241) that breaks --freetype0
399+ # mode, so for it we keep FreeType enabled; the image will be
400+ # slightly off.
401+ if (getattr (mpl , "_called_from_pytest" , False )
402+ and mpl ._get_executable_info ("dvipng" ).version != "1.16" ):
403+ cmd .insert (1 , "--freetype0" )
404+ self ._run_checked_subprocess (cmd , tex )
397405 return pngfile
398406
399407 def get_grey (self , tex , fontsize = None , dpi = None ):
@@ -446,7 +454,7 @@ def get_text_width_height_descent(self, tex, fontsize, renderer=None):
446454 return width , height + depth , depth
447455
448456 else :
449- # use dviread. It sometimes returns a wrong descent.
457+ # use dviread.
450458 dvifile = self .make_dvi (tex , fontsize )
451459 with dviread .Dvi (dvifile , 72 * dpi_fraction ) as dvi :
452460 page , = dvi
0 commit comments