У меня есть проблема с Python (WinPython-64bit-3.6.5.0Qt5)/MATPLOTLIB (версия 2.2.2) при рендеринге текста с TeX (MikTeX 2.9) и применением шрифта "Times", который находится в списке стандартных шрифтов (см. https://matplotlib.org/users/customizing.html)
В приведенном ниже минимальном примере появляется следующее сообщение об ошибке:
File "C:\WinPython-64bit-3.6.5.0Qt5\python-3.6.5.amd64\lib\site-packages\matplotlib\dviread.py", line 471, in _fnt_def_real
raise error_class("missing font metrics file: %s" % fontname)
FileNotFoundError: missing font metrics file: rsfs10
Вот пример, чтобы воспроизвести проблему:
import numpy as np
import matplotlib.pyplot as plt
# Example data
t = np.arange(0.0, 1.0 + 0.01, 0.01)
s = np.cos(4 * np.pi * t) + 2
from matplotlib import rc
rc('font',**{'family':'serif','serif':['Times']})
rc('text', usetex=True)
plt.plot(t, s)
plt.xlabel(r'\textbf{time} (s)')
plt.ylabel(r'\textit{voltage} (mV)',fontsize=16)
plt.title(r"\TeX\ is Number "
r"$\displaystyle\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}$!",
fontsize=16, color='gray')
# Make room for the ridiculously large title.
plt.subplots_adjust(top=0.8)
plt.savefig('tex_demo')
plt.show()
Похоже, что у python нет доступа к шрифтам TeX, например, rsfs10, который находится в моей установочной папке MikTeX. C:\Program Files\MiKTeX 2.9\fonts\source\public\rsfs
Если я не укажу имя шрифта, он работает со стандартным шрифтом serif (он выглядит как современный компьютерный шрифт).
from matplotlib import rc
rc("pdf", fonttype=3)
rc('font',**{'family':'serif'})
rc('text', usetex=True)
Я должен добавить следующее: В минимальном примере ниже я сначала получаю предупреждающее сообщение (которое я не получаю в своем полном исходном коде, и это, вероятно, не связано с основной проблемой):
C:\WinPython-64bit-3.6.5.0Qt5\python-3.6.5.amd64\lib\site-packages\matplotlib\font_manager.py:1328: UserWarning: findfont: Font family ['serif'] not found. Falling back to DejaVu Sans (prop.get_family(), self.defaultFamily[fontext]))
Я уже пробовал решение для Windows, описанное здесь: Matplotlib не может найти основные шрифты, но это не помогло удалить предупреждение. Если я не укажу Times как font, предупреждение также не будет поднято.
С обсуждением здесь https://tex.stackexchange.com/questions/442179/why-are-tfm-files-missing-in-the-latex-rsfs-package Я нашел решение:
На моем компьютере установка MikTex была совершенно новой, и шрифт никогда не использовался раньше, поэтому необходимые файлы tfm не были созданы.
Тем не менее, пакет matplotlib Python (dviread.py) пытался идентифицировать файлы tfm перед использованием, чтобы создать кеш шрифта.
Я установил полную установку TeXLive на другой компьютер. Там файлы tfm уже были созданы во время установки, и я просто скопировал файлы в соответствующее место на моем компьютере.