通过 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.clssubprocess.run(['kpsewhich', 'article.cls']) 找不到文件。

我明白了。我忘了我有 运行 一段代码设置

TEXINPUTS=/path/to/some/directory

看起来我在 TEXINPUTS 中漏掉了一个 :,所以 TeX /path/to/some/directory

中查找

解决方案是

TEXINPUTS=/path/to/some/directory:

这样它会在我的当前目录中查找,但也会继续在其他地方查找。