Избегайте указания семейства шрифтов в PGF-экспорте рисунка matplotlib - PullRequest
3 голосов
/ 23 мая 2019

Резюме

Я экспортирую рисунки matplotlib как PGF для использования в LaTeX.

matplotlib добавляет \sffamily дополнение к каждой текстовой записи (метки осей, метки, записи легенды, аннотации) при сохранении фигуры в виде PGF. Это остановит его от правильного наследования шрифта от шрифта глобального документа.

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

Куда я попал

Я считаю, что я изолировал проблему: если я отредактирую документ PGF и просто удаляю часть \sffamily любой текстовой записи, проблема больше не будет сохраняться, и глобальный шрифт наследуется. Удаление не мешает LaTeX правильно его компилировать, и я не получаю ошибок.

Из-за вышеизложенного я считаю, что проблема не имеет ничего общего с rcParams или какой-либо преамбулой LaTeX (как в python, так и в самом документе LaTeX).

MWE

Я только что попробовал это на простейшем из возможных сюжете и смог воспроизвести проблему:

import matplotlib.pyplot as plt

fig = plt.figure()
plt.xlabel('a label')
fig.savefig('fig.pgf')

И документ pgf будет содержать следующую строку:

\pgftext[x=3.280000in,y=0.240809in,,top]{\color{textcolor}\sffamily\fontsize{10.000000}{12.000000}\selectfont a label}%

, поэтому добавляется \sffamily. Визуализация этого в LaTeX заставит шрифт без засечек. Удаление \sffamily и его рендеринг позволит ему наследовать семейство шрифтов.

TLDR

Есть ли способ избежать включения семейства шрифтов в вывод PGF matplotlib?

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Опираясь на https://matplotlib.org/users/pgf.html#font-specification, вы можете использовать:

import matplotlib as mpl
import matplotlib.pyplot as plt

pgf_with_rc_fonts = {
    "font.family": "serif",
}
mpl.rcParams.update(pgf_with_rc_fonts)


fig = plt.figure()
plt.xlabel('a label')
fig.savefig('fig.pgf')

Таким образом, вместо \sffamily.

используется \rmfamily.
1 голос
/ 24 мая 2019

Я не могу предложить решение, но возможен обходной вариант на основе комментария @ samcarter: Вы можете переопределить \sffamily локально, например ::

\documentclass{article}

\usepackage{pgf}
\usepackage{fontspec}
\setmainfont{DejaVu Serif}
\setsansfont{DejaVu Sans}
\setmonofont{DejaVu Sans Mono}

\begin{document}
Lorem ipsum {\sffamily Lorem ipsum}
\begin{center}
    \renewcommand\sffamily{}
    \input{fig.pgf}
\end{center}
Lorem ipsum {\sffamily Lorem ipsum}
\end{document}

Вместо center вы можете использовать любую среду или \begingroup и \endgroup.

...