@@ -192,6 +192,25 @@ def get_custom_preamble(self):
192
192
"""Return a string containing user additions to the tex preamble."""
193
193
return rcParams ['text.latex.preamble' ]
194
194
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
+
195
214
def make_tex (self , tex , fontsize ):
196
215
"""
197
216
Generate a tex file to render the tex string at a specific font size.
@@ -200,29 +219,22 @@ def make_tex(self, tex, fontsize):
200
219
"""
201
220
basefile = self .get_basefile (tex , fontsize )
202
221
texfile = '%s.tex' % basefile
203
- custom_preamble = self .get_custom_preamble ()
204
222
fontcmd = {'sans-serif' : r'{\sffamily %s}' ,
205
223
'monospace' : r'{\ttfamily %s}' }.get (self .font_family ,
206
224
r'{\rmfamily %s}' )
207
225
tex = fontcmd % tex
208
226
209
- unicode_preamble = "\n " .join ([
210
- r"\usepackage[utf8]{inputenc}" ,
211
- r"\DeclareUnicodeCharacter{2212}{\ensuremath{-}}" ,
212
- ]) if rcParams ["text.latex.unicode" ] else ""
213
-
214
227
s = r"""
215
- \documentclass{article}
216
228
%s
217
- %s
218
- %s
219
- \usepackage[papersize={72in,72in},body={70in,70in},margin={1in,1in}]{geometry}
220
229
\pagestyle{empty}
221
230
\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
223
236
\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 )
226
238
with open (texfile , 'wb' ) as fh :
227
239
if rcParams ['text.latex.unicode' ]:
228
240
fh .write (s .encode ('utf8' ))
@@ -250,27 +262,17 @@ def make_tex_preview(self, tex, fontsize):
250
262
"""
251
263
basefile = self .get_basefile (tex , fontsize )
252
264
texfile = '%s.tex' % basefile
253
- custom_preamble = self .get_custom_preamble ()
254
265
fontcmd = {'sans-serif' : r'{\sffamily %s}' ,
255
266
'monospace' : r'{\ttfamily %s}' }.get (self .font_family ,
256
267
r'{\rmfamily %s}' )
257
268
tex = fontcmd % tex
258
269
259
- unicode_preamble = "\n " .join ([
260
- r"\usepackage[utf8]{inputenc}" ,
261
- r"\DeclareUnicodeCharacter{2212}{\ensuremath{-}}" ,
262
- ]) if rcParams ["text.latex.unicode" ] else ""
263
-
264
270
# newbox, setbox, immediate, etc. are used to find the box
265
271
# extent of the rendered text.
266
272
267
273
s = r"""
268
- \documentclass{article}
269
- %s
270
- %s
271
274
%s
272
275
\usepackage[active,showbox,tightpage]{preview}
273
- \usepackage[papersize={72in,72in},body={70in,70in},margin={1in,1in}]{geometry}
274
276
275
277
%% we override the default showbox as it is treated as an error and makes
276
278
%% the exit status not zero
@@ -282,8 +284,7 @@ def make_tex_preview(self, tex, fontsize):
282
284
{\fontsize{%f}{%f}%s}
283
285
\end{preview}
284
286
\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 )
287
288
with open (texfile , 'wb' ) as fh :
288
289
if rcParams ['text.latex.unicode' ]:
289
290
fh .write (s .encode ('utf8' ))
@@ -391,9 +392,16 @@ def make_png(self, tex, fontsize, dpi):
391
392
# see get_rgba for a discussion of the background
392
393
if not os .path .exists (pngfile ):
393
394
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 )
397
405
return pngfile
398
406
399
407
def get_grey (self , tex , fontsize = None , dpi = None ):
@@ -446,7 +454,7 @@ def get_text_width_height_descent(self, tex, fontsize, renderer=None):
446
454
return width , height + depth , depth
447
455
448
456
else :
449
- # use dviread. It sometimes returns a wrong descent.
457
+ # use dviread.
450
458
dvifile = self .make_dvi (tex , fontsize )
451
459
with dviread .Dvi (dvifile , 72 * dpi_fraction ) as dvi :
452
460
page , = dvi
0 commit comments