当我在 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}
反而。