@@ -70,6 +70,8 @@ def _get_preamble():
7070 path = pathlib .Path (fm .findfont (family ))
7171 preamble .append (r"\%s{%s}[Path=\detokenize{%s/}]" % (
7272 command , path .name , path .parent .as_posix ()))
73+ preamble .append (mpl .texmanager ._usepackage_if_not_loaded (
74+ "underscore" , option = "strings" )) # Documented as "must come last".
7375 return "\n " .join (preamble )
7476
7577
@@ -84,9 +86,8 @@ def _get_preamble():
8486_NO_ESCAPE = r"(?<!\\)(?:\\\\)*"
8587_split_math = re .compile (_NO_ESCAPE + r"\$" ).split
8688_replace_escapetext = functools .partial (
87- # When the next character is _, ^, $, or % (not preceded by an escape),
88- # insert a backslash.
89- re .compile (_NO_ESCAPE + "(?=[_^$%])" ).sub , "\\ \\ " )
89+ # When the next character is an unescaped % or ^, insert a backslash.
90+ re .compile (_NO_ESCAPE + "(?=[%^])" ).sub , "\\ \\ " )
9091_replace_mathdefault = functools .partial (
9192 # Replace \mathdefault (when not preceded by an escape) by empty string.
9293 re .compile (_NO_ESCAPE + r"(\\mathdefault)" ).sub , "" )
@@ -106,7 +107,7 @@ def _tex_escape(text):
106107 ``$`` with ``\(\displaystyle %s\)``. Escaped math separators (``\$``)
107108 are ignored.
108109
109- The following characters are escaped in text segments: ``_^$ %``
110+ The following characters are escaped in text segments: ``^ %``
110111 """
111112 # Sometimes, matplotlib adds the unknown command \mathdefault.
112113 # Not using \mathnormal instead since this looks odd for the latex cm font.
@@ -358,14 +359,16 @@ def _get_box_metrics(self, tex):
358359 try :
359360 answer = self ._expect_prompt ()
360361 except LatexError as err :
361- raise ValueError ("Error measuring {!r}\n LaTeX Output:\n {}"
362+ # Here and below, use '{}' instead of {!r} to avoid doubling all
363+ # backslashes.
364+ raise ValueError ("Error measuring {}\n LaTeX Output:\n {}"
362365 .format (tex , err .latex_output )) from err
363366 try :
364367 # Parse metrics from the answer string. Last line is prompt, and
365368 # next-to-last-line is blank line from \typeout.
366369 width , height , offset = answer .splitlines ()[- 3 ].split ("," )
367370 except Exception as err :
368- raise ValueError ("Error measuring {!r }\n LaTeX Output:\n {}"
371+ raise ValueError ("Error measuring {}\n LaTeX Output:\n {}"
369372 .format (tex , answer )) from err
370373 w , h , o = float (width [:- 2 ]), float (height [:- 2 ]), float (offset [:- 2 ])
371374 # The height returned from LaTeX goes from base to top;
@@ -864,8 +867,8 @@ def print_pdf(self, fname_or_fh, *, metadata=None, **kwargs):
864867 r"\documentclass[12pt]{minimal}" ,
865868 r"\usepackage[papersize={%fin,%fin}, margin=0in]{geometry}"
866869 % (w , h ),
867- _get_preamble (),
868870 r"\usepackage{pgf}" ,
871+ _get_preamble (),
869872 r"\begin{document}" ,
870873 r"\centering" ,
871874 r"\input{figure.pgf}" ,
@@ -975,8 +978,8 @@ def _write_header(self, width_inches, height_inches):
975978 r"\documentclass[12pt]{minimal}" ,
976979 r"\usepackage[papersize={%fin,%fin}, margin=0in]{geometry}"
977980 % (width_inches , height_inches ),
978- _get_preamble (),
979981 r"\usepackage{pgf}" ,
982+ _get_preamble (),
980983 r"\setlength{\parindent}{0pt}" ,
981984 r"\begin{document}%" ,
982985 ])
0 commit comments