实际行为

实际行为

我尝试制作 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
    

相关内容