slime/show/video/tex_environment.py

43 lines
1.9 KiB
Python

"""Use system TeX Live, or an explicitly configured local unpacked installation."""
from pathlib import Path
import os
import shutil
import subprocess
HERE = Path(__file__).resolve().parent
def prepare_tex(env):
env = dict(env)
if shutil.which('latex', path=env['PATH']) and shutil.which('dvisvgm', path=env['PATH']):
return env
root = Path(env.get('SLIME_TEX_ROOT', HERE / '.native/texlive')).resolve()
if not (root/'usr/bin/pdftex').is_file():
raise RuntimeError('需要 LaTeX / dvisvgm。Ubuntu: sudo apt install texlive-latex-extra dvisvgm')
dist = root/'usr/share/texlive/texmf-dist'
formats = root/'formats'
formats.mkdir(exist_ok=True)
env.update({
'PATH': str(root/'usr/bin')+os.pathsep+env['PATH'],
'LD_LIBRARY_PATH': str(root/'usr/lib/x86_64-linux-gnu')+os.pathsep+env.get('LD_LIBRARY_PATH', ''),
'TEXMFCNF': str(dist/'web2c'),
'TEXMFROOT': str(root/'usr/share/texlive'),
'TEXMFDIST': str(dist),
'TEXMF': '{'+str(dist)+','+str(root/'usr/share/texmf')+'}',
'TEXMFVAR': str(root/'var'),
'TEXMFCONFIG': str(root/'config'),
'TEXMFHOME': str(root/'texmf-home'),
'TEXFORMATS': str(formats)+'//:',
})
gs_roots = sorted((root/'usr/share/ghostscript').glob('*'))
if gs_roots:
gs = gs_roots[-1]
env['GS_LIB'] = os.pathsep.join(str(p) for p in (
gs/'Resource/Init', gs/'lib', gs/'Resource/Font',
root/'usr/share/fonts/type1/urw-base35'))
if not (formats/'latex.fmt').is_file():
subprocess.run(['mktexlsr', str(dist), str(root/'usr/share/texmf')], env=env, check=True)
subprocess.run(['pdftex', '-ini', '-etex', '-interaction=nonstopmode', '-halt-on-error',
'-jobname=latex', '-progname=latex', 'latex.ini'],
cwd=formats, env=env, check=True)
return env