MATPLOTLIB: Как мне предоставить файлы метрик шрифта для рендеринга текста с помощью TeX?

У меня проблема с Python (WinPython-64bit-3.6.5.0Qt5)/MATPLOTLIB (версия 2.2.2) при рендеринге текста с помощью TeX (MikTeX 2.9) и применении шрифта Times, который есть в списке стандартных шрифтов (см. Настройка библиотеки matplotlib)

В минимальном примере ниже я получаю следующее сообщение об ошибке:

  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

Если я не указываю имя шрифта, он работает со стандартным шрифтом с засечками (он выглядит как компьютерный современный шрифт с засечками).

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 в качестве шрифта, предупреждение также не выдается.


person Stellarator    schedule 15.06.2018    source источник
comment
Я провел немного больше исследований, а также заглянул в файл python C:\WinPython-64bit-3.6.5.0Qt5\python-3.6.5.amd64\lib\site-packages\matplotlib\dviread.py и где возникает проблема from: Выяснил, что внутри есть функция find_ex_file, которая должна найти файл в дереве texmf. Он вызывается с именем файла='rsfs10' и форматом='tfm'. Однако в моей системе отсутствует файл rsfs10.tfm. Однако пакет LaTeX rsfs установлен, но в этот пакет не входит файл rsfs10.tfm. см. ссылка   -  person Stellarator    schedule 18.07.2018


Ответы (2)


У меня была точно такая же проблема в matplotlib. Хотя установка texlive является одним из способов сделать это, я предпочел не переустанавливать параллельно другой дистрибутив латекса, тем более что я уже потратил некоторое время на настройку и запуск всех внешних программ.

Я немного поискал в папке C:\Program Files\MiKTeX\miktex\bin\x64, и это выглядит так:

miktex-maketfm.exe rsfs10

сделал трюк. Он собрал rsfs10.tfm и поместил его в папку C:\Users\XXX\AppData\Local\MiKTeX\fonts\tfm\public\rsfs.

Это решение для Miktex 20.10. Как только я запустил это, у matplotlib не было проблем. Обратите внимание, что этот пост является копией моего ответа здесь.

person inverteddy    schedule 30.01.2021

С обсуждением здесь на Почему файлы tfm отсутствует в пакете LaTeX rsfs?, я нашел решение:

На моем компьютере установка MikTex была совсем новой, и шрифт никогда ранее не использовался, поэтому необходимые файлы tfm не были созданы.

Однако пакет matplotlib Python (dviread.py) пытался идентифицировать файлы tfm перед использованием, чтобы создать кэш файлов шрифтов.

Я установил полную установку TeXLive на другой компьютер. Там файлы tfm уже были созданы во время установки, и я просто скопировал файлы в соответствующее место на своем компьютере.

person Stellarator    schedule 25.07.2018