Matplotlib、Inkscape、TeXStudio 工作流程 SVG 图形

Matplotlib、Inkscape、TeXStudio 工作流程 SVG 图形

当我在 matplotlib 中创建 SVG 图形时

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

new_rc_params = {'text.usetex': False,
"svg.fonttype": 'none'
}
matplotlib.rcParams.update(new_rc_params)

x = np.linspace(-1, 1, 100)
y = x**2
plt.plot(x,y)
plt.xlabel(r'x \$\rightarrow\$')
plt.ylabel(r'y \$\rightarrow\$')
plt.savefig('./figures/figure.svg', format='svg')

然后txs:///pdflatex/[--shell-escape]在 TeXstudio 中运行,Inkscape(版本 1.0.2)会自动生成该图的 .pdf 和 .pdf_tex 文件。然后我想在 LaTeX 中集成该图:

\documentclass[12pt]{article}
\usepackage{svg}
\svgsetup{inkscapeexe=inkscape, inkscapearea=drawing, inkscapeversion=1}
\svgpath{{figures/}}

\begin{document}
This is a test document
    \begin{figure}
        \centering
        \includesvg[width=1\textwidth]{figure}
    \end{figure}
\end{document}

编译该 LaTeX 文件会导致以下错误消息: Package inputenc Error: Unicode character − (U+2212)(inputenc) not set up for use with LaTeX.

该错误是由于 .pdf_tex 文件中的以下几行引起的:

\smash{\begin{tabular}[t]{c}−1.00\end{tabular}}
\smash{\begin{tabular}[t]{c}−0.75\end{tabular}}
\smash{\begin{tabular}[t]{c}−0.50\end{tabular}}
\smash{\begin{tabular}[t]{c}−0.25\end{tabular}}

这些线的出现是为了绘制轴刻度。

我遗漏了什么?Inkscape 是否生成了“有缺陷的” .pdf_tex 文件?有没有一种干净的方法可以避免这种行为?

答案1

问题是matplotlib 使用 Unicode“减号”而不是 ASCII 连字符来表示负数中的减号。其他答案解释了如何调整 LaTeX 以接受它;另一个选择是告诉matplotlib不要这样做,方法是将其设置为使用 ASCII 符号。

我认为,最好从源头上解决问题并直接避免它。您可以在此处获得更多信息:https://stackoverflow.com/questions/30201310/use-of-hyphen-or-minus-sign-in-matplotlib-versus-compatibility-with-latex

基本上,如果我运行你的 Python 代码,svg文件中会有以下内容:

在此处输入图片描述

但如果我补充一点:

matplotlib.rcParams['axes.unicode_minus']=False

svg文件将带有带有“真实”减号的负标签(无论您在这里指的是真实的值是什么 --- 我知道这是有争议的):

在此处输入图片描述

所以你在 LaTeX 方面不应该有任何问题(无法检查,因为我没有你的设置......)

答案2

你可以切换到 LuaTeX 而不是 pdfTeX,或者只是为缺失的字符声明一个合理的替代,如\DeclareUnicodeCharacter{2212}{\ensuremath{-}},\DeclareUnicodeCharacter{2212}{\textminus}\DeclareUnicodeCharacter{2212}{\ifmmode-\else--\fi}。这应该有效:

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{svg}
\svgsetup{inkscapeexe=inkscape, inkscapearea=drawing, inkscapeversion=1}
\svgpath{{figures/}}

\DeclareUnicodeCharacter{2212}{\ensuremath{-}}
%\DeclareUnicodeCharacter{2212}{\textminus}

\begin{document}
This is a test document
    \begin{figure}
        \centering
        \includesvg[width=1\textwidth]{figure}
    \end{figure}
\end{document}

答案3

这些行的错误是因为您没有使用 ASCII 连字符作为减号,而是使用了它的 unicode 变体。您可以尝试\usepackage[utf8]{inputenc}在前言中添加它,LaTeX 可能能够识别它。如果可以,那么问题仍然是 Computer Modern 是否提供该字符。

我只需将这些减号替换为 ASCII 减号(键盘上的减号)。接下来,如果您不编辑 SVG 文件,我建议您让 matplotlib 输出 PDF

plt.savefig('./figures/figure.pdf')

并包含在序言中\usepackage{graphicx}。这样你就不需要 SVG 转换了,这使你的文档更加健壮。要包含 PDF,您可以使用原生

\includegraphics[width=\linewidth]{figure}

或者

\includegraphics[width=\linewidth]{figure.pdf}

反而。

相关内容