通过 HPC 系统上的 Jupyter Notebook SLURM 作业在 Matplotlib 中使用 PGF / LaTeX 后端
PGF / LaTeX Backend in Matplotlib via Jupyter Notebook SLURM Job on HPC System
我是一名大学生,正在使用我大学的计算集群。
我将 Tex Live 安装到我位于 ~/.local/texlive/
的主目录中。我有一个名为 mplrc
的文件。 MATPLOTLIBRC
环境变量设置为 mplrc
文件。 mplrc
文件包含以下行
backend: pgf
pgf.rcfonts: false
pgf.texsystem: pdflatex
pgf.preamble: \input{mpl_settings.tex}
text.usetex: true
font.family: serif
font.size: 12
mpl_settings.tex
文件与mplrc
文件在同一目录下,包含以下
\usepackage{amsmath}
\usepackage[T1]{fontenc}
\usepackage{gensymb}
\usepackage{lmodern}
\usepackage{siunitx}
在我使用的集群上,我必须向 运行 Jupyter notebook 提交 SLURM 作业。我在笔记本中尝试 运行 的示例代码是
formula = (
r'$\displaystyle '
r'N = \int_{E_\text{min}}^{E_\text{max}} '
r'\int_0^A'
r'\int_{t_\text{min}}^{t_\text{max}} '
r'\Phi_0 \left(\frac{E}{\SI{1}{\GeV}}\right)^{\!\!-γ}'
r' \, \symup{d}A \, \symup{d}t \, \symup{d}E'
r'$'
)
def power_law_spectrum(energy, normalisation, spectral_index):
return normalisation * energy**(-spectral_index)
bin_edges = np.logspace(2, 5, 15)
bin_centers = 0.5 * (bin_edges[:-1] + bin_edges[1:])
y = power_law_spectrum(bin_centers, 1e-5, 2.5)
relative_error = np.random.normal(1, 0.2, size=len(y))
y_with_err = relative_error * y
fig, ax = plt.subplots()
ax.errorbar(
np.log10(bin_centers),
y_with_err,
xerr=[
np.log10(bin_centers) - np.log10(bin_edges[:-1]),
np.log10(bin_edges[1:]) - np.log10(bin_centers)
],
yerr=0.5 * y_with_err,
linestyle='',
)
ax.text(0.1, 0.1, formula, transform=plt.gca().transAxes)
ax.set_yscale('log')
fig.tight_layout(pad=0)
plt.show()
这会生成一条巨大的错误消息,但它的根源是
RuntimeError: latex was not able to process the following string:
b'lp'
然而,在那之下,我看到了我认为真正的问题
! LaTeX Error: File `article.cls' not found.
我已经设置了 PATH
以便它找到正确的 latex
命令,但是还需要设置什么才能找到 article.cls
文件?这似乎是 Python 笔记本的特殊之处。当在 Jupyterlab 界面的终端中 运行ning kpsewhich article.cls
时,会找到该文件。但是在 Python 笔记本中尝试 ! kpsewhich article.cls
或 subprocess.run(['kpsewhich', 'article.cls'])
找不到文件。
我明白了。我忘了我有 运行 一段代码设置
TEXINPUTS=/path/to/some/directory
看起来我在 TEXINPUTS
中漏掉了一个 :
,所以 TeX 只 在 /path/to/some/directory
中查找
解决方案是
TEXINPUTS=/path/to/some/directory:
这样它会在我的当前目录中查找,但也会继续在其他地方查找。
我是一名大学生,正在使用我大学的计算集群。
我将 Tex Live 安装到我位于 ~/.local/texlive/
的主目录中。我有一个名为 mplrc
的文件。 MATPLOTLIBRC
环境变量设置为 mplrc
文件。 mplrc
文件包含以下行
backend: pgf
pgf.rcfonts: false
pgf.texsystem: pdflatex
pgf.preamble: \input{mpl_settings.tex}
text.usetex: true
font.family: serif
font.size: 12
mpl_settings.tex
文件与mplrc
文件在同一目录下,包含以下
\usepackage{amsmath}
\usepackage[T1]{fontenc}
\usepackage{gensymb}
\usepackage{lmodern}
\usepackage{siunitx}
在我使用的集群上,我必须向 运行 Jupyter notebook 提交 SLURM 作业。我在笔记本中尝试 运行 的示例代码是
formula = (
r'$\displaystyle '
r'N = \int_{E_\text{min}}^{E_\text{max}} '
r'\int_0^A'
r'\int_{t_\text{min}}^{t_\text{max}} '
r'\Phi_0 \left(\frac{E}{\SI{1}{\GeV}}\right)^{\!\!-γ}'
r' \, \symup{d}A \, \symup{d}t \, \symup{d}E'
r'$'
)
def power_law_spectrum(energy, normalisation, spectral_index):
return normalisation * energy**(-spectral_index)
bin_edges = np.logspace(2, 5, 15)
bin_centers = 0.5 * (bin_edges[:-1] + bin_edges[1:])
y = power_law_spectrum(bin_centers, 1e-5, 2.5)
relative_error = np.random.normal(1, 0.2, size=len(y))
y_with_err = relative_error * y
fig, ax = plt.subplots()
ax.errorbar(
np.log10(bin_centers),
y_with_err,
xerr=[
np.log10(bin_centers) - np.log10(bin_edges[:-1]),
np.log10(bin_edges[1:]) - np.log10(bin_centers)
],
yerr=0.5 * y_with_err,
linestyle='',
)
ax.text(0.1, 0.1, formula, transform=plt.gca().transAxes)
ax.set_yscale('log')
fig.tight_layout(pad=0)
plt.show()
这会生成一条巨大的错误消息,但它的根源是
RuntimeError: latex was not able to process the following string:
b'lp'
然而,在那之下,我看到了我认为真正的问题
! LaTeX Error: File `article.cls' not found.
我已经设置了 PATH
以便它找到正确的 latex
命令,但是还需要设置什么才能找到 article.cls
文件?这似乎是 Python 笔记本的特殊之处。当在 Jupyterlab 界面的终端中 运行ning kpsewhich article.cls
时,会找到该文件。但是在 Python 笔记本中尝试 ! kpsewhich article.cls
或 subprocess.run(['kpsewhich', 'article.cls'])
找不到文件。
我明白了。我忘了我有 运行 一段代码设置
TEXINPUTS=/path/to/some/directory
看起来我在 TEXINPUTS
中漏掉了一个 :
,所以 TeX 只 在 /path/to/some/directory
解决方案是
TEXINPUTS=/path/to/some/directory:
这样它会在我的当前目录中查找,但也会继续在其他地方查找。