我尝试制作 TeX Live 的嵌入式版本。我的目标是能够在 Web 应用程序中使用它来编译 TeX 文档。由于软件包太旧,我无法使用系统 LaTeX 发行版。
为了实现这一点,我编写了一个 bash 脚本:
#!/bin/bash
set -x
#set proxy if needed
arch=x86_64-linux
tlmgr=./texlive/bin/$arch/tlmgr
fmtutils=./texlive/bin/$arch/fmtutil
webc2=./texlive/texmf-dist/web2c/
#export http_proxy
if [ -d build ]
then
rm -rf build
fi
mkdir build
echo prepare build tree
cp texlive.profile build
pushd build
sed -i "s|%BASEDIR%|$PWD|" texlive.profile
echo download installer
wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
echo extract installer
tar -xzf install-tl-unx.tar.gz
pushd install-tl-*
echo basic instalation of texlive
./install-tl -profile ../texlive.profile
popd
echo custom installation
$tlmgr list --only-installed | sed -r "s/i ([a-zA-Z0-9_\.-]+):.*/\1/" > installedPkg
cp ../pkglist pkglist
for i in $(cat pkglist)
do
if ! grep "^$i$" installedPkg
then
echo $i >> needInstall
fi
done
for i in $(cat installedPkg)
do
if ! grep "^$i$" pkglist
then
echo $i >> needRemove
fi
done
$tlmgr install $(cat needInstall)
$tlmgr remove $(cat needRemove) --force
echo regenerate format
for i in mptopdf dvilualatex luatex lualatex dviluatex etex pdfetex xetex xelatex
do
$fmtutils --disablefmt=$i --fmtdir=$webc2
done
$fmtutils --all --fmtdir=$webc2
pushd texlive/bin/*
rm pdflatex
ln -s ./pdftex pdflatex
popd
cp -R texlive ..
实际行为
当我在路径中设置时texlive/bin/x86_64-linux
,一切都正常。但是,如果我texlive/bin/x86_64-linux/pdflatex
明确调用可执行文件,则会使用系统库(并失败)。
需要的行为
我希望能够像这样运行 pdfLaTeX:
texlive/bin/x86_64-linux/pdflatex foo.tex
此外,我希望这种调用 pdfLaTeX 的方式能够在正确的路径中搜索库,而无需手动设置环境变量(包装脚本可用)。
答案1
经过一些搜索(和 irc 相关帮助)后,我找到了解决方案。
fmtutils 命令为每个 tex 相关编译器创建 .fmt 文件。此实用程序加载一个文件,其中包含正确构建 .fmt 文件所需的命令。
这些命令明确调用 pdftex、xetex、luatex……
当为 fmtutils 指定正确的路径时,嵌入的 fmtutils 版本被正确调用,但是子进程调用了这些系统相关的版本。
有了这个提示,我已经编辑了我的脚本以遵循这种方式。之后,我可以正确地显式调用 pdflatex 编译器,而不会与系统 tex 基础设施发生冲突
#!/bin/bash
set -x
#http_prox=
arch=x86_64-linux
tlmgr=./texlive/bin/$arch/tlmgr
fmtutils=./texlive/bin/$arch/fmtutil
texhash=./texlive/bin/$arch/texhash
webc2=./texlive/texmf-dist/web2c/
#export http_proxy
if [ -d build ]
then
rm -rf build
fi
mkdir build
echo prepare build tree
cp texlive.profile build
pushd build
sed -i "s|%BASEDIR%|$PWD|" texlive.profile
echo download installer
wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
echo extract installer
tar -xzf install-tl-unx.tar.gz
pushd install-tl-*
echo basic instalation of texlive
./install-tl -profile ../texlive.profile
popd
echo custom installation
$tlmgr list --only-installed | sed -r "s/i ([a-zA-Z0-9_\.-]+):.*/\1/" > installedPkg
cp ../pkglist pkglist
for i in $(cat pkglist)
do
if ! grep "^$i$" installedPkg
then
echo $i >> needInstall
fi
done
for i in $(cat installedPkg)
do
if ! grep "^$i$" pkglist
then
echo $i >> needRemove
fi
done
$tlmgr install $(cat needInstall)
$tlmgr remove $(cat needRemove) --force
OLD_PATH=$PATH
PATH=$PWD/texlive/bin/$arch:$PATH
echo regenerate format
for i in mptopdf dvilualatex luatex lualatex dviluatex etex pdfetex xetex xelatex tex
do
fmtutil-sys --disablefmt=$i --fmtdir=$webc2
done
fmtutil-sys --all
texhash
PATH=$OLD_PATH
pushd texlive/bin/*
rm pdflatex
ln -s ./pdftex pdflatex
chmod ax pdflatex
popd
cp -R texlive ..
该脚本需要在同一目录中添加两个文件:
- pkglist :最小安装所需软件包列表:texlive 的最终安装仅包含此软件包列表
texlive.profile:使用最少的软件包自动安装 texlive 的配置文件。一些变量被正则表达式替换
# texlive.profile written on Tue Mar 18 09:05:20 2014 UTC # It will NOT be updated and reflects only the # installation profile at installation time. selected_scheme scheme-custom TEXDIR %BASEDIR%/texlive TEXMFCONFIG $TEXMFSYSCONFIG TEXMFHOME $TEXMFLOCAL TEXMFLOCAL %BASEDIR%/texlive/texmf-local TEXMFSYSCONFIG %BASEDIR%/texlive/texmf-config TEXMFSYSVAR %BASEDIR%/texlive/texmf-var TEXMFVAR $TEXMFSYSVAR binary_x86_64-linux 1 collection-basic 1 collection-langfrench 1 in_place 0 option_adjustrepo 1 option_autobackup 1 option_backupdir tlpkg/backups option_desktop_integration option_doc 0 option_file_assocs option_fmt 1 option_letter 0 option_menu_integration option_path option_post_code 1 option_src 0 option_sys_bin /usr/local/bin option_sys_info /usr/local/share/info option_sys_man /usr/local/share/man option_w32_multi_user 1 option_write18_restricted 1 portable 1