tl-开关

tl-开关

我正在使用 Lubuntu 11.10。我已经完整安装了 TeXlive 2011。

我刚刚安装了 TeXlive 2013 运行install-tl脚本。一切都很好。我选择小方案。没问题。

因此根据导游我们应该这样做:

安装完成后,您必须将 TeX Live 二进制文件的目录添加到 PATH 中 — Windows 除外,因为安装程序会处理此操作。例如:

PATH=/usr/local/texlive/2013/bin/i386-linux:$PATH

使用您的 shell、安装目录和二进制平台名称的语法,而不是 i386-linux。

到这里之前都没问题。我改变了我的,在终端上$PATH执行时,我得到了pdflatex --version

pdfTeX 3.1415926-2.5-1.40.14 (TeX Live 2013) kpathsea 版本 6.1.1

但我想知道如何处理最后的建议:

如果您在一台机器上安装了多个 TeX,则需要更改搜索路径以在它们之间切换。

怎么做?

答案1

假设您的计算机上安装了三个 TeX,例如 vanilla TeX Live 2014 和 2015,以及 Ubuntu/Debian 提供的 TeX Live。这三个发行版的二进制文件位于

/usr/local/texlive/2014/bin/<arch>
/usr/local/texlive/2015/bin/<arch>
/usr/bin

其中<arch>可能是i386-linuxx86_64-linux或者是与您的机器硬件架构相关的另一个字符串。

如果你将PATH变量设置为

export PATH=/usr/local/texlive/2015/bin/i386-linux:$PATH

在您的.profile文件中或使用添加文件的方法/etc/profile.d(我推荐),然后调用

pdftex --version

从 shell 将显示

pdfTeX 3.14159265-2.6-1.40.16 (TeX Live 2015)
kpathsea version 6.2.1
[...]

并且你确定任何 TeX 程序都会使用位于

/usr/local/texlive/2015

这是因为kpathsea所有 TeX Live 程序都链接到的库的工作方式:它根据被调用二进制文件所在的目录设置许多运行时环境变量。

<arch>您可以尝试通过从 shell 执行以下不同的调用来查看这一点(再次使用与您的机器架构相对应的字符串)

kpsewhich plain.tex
/usr/local/texlive/2014/bin/x86_64-linux/kpsewhich plain.tex
/usr/bin/kpsewhich plain.tex

您将收到三个不同的答案:

/usr/local/texlive/2015/texmf-dist/tex/plain/base/plain.tex
/usr/local/texlive/2014/texmf-dist/tex/plain/base/plain.tex
/usr/share/texlive/texmf-dist/tex/plain/base/plain.tex

该程序kpsewhich是该库的公共接口kpathsea

PATH如果你没有设置让 GUI 应用程序看到 vanilla TeX Live 二进制目录,那么你可能会遇到大问题 /usr/bin在我的测试虚拟机中,我放置了一个名为的文件,texlive.sh其中/etc/profile.d包含

export PATH=/opt/texbin:${PATH}

然后我创建一个符号链接,/opt/texbin指向我机器上最新的 TeX Live,方法是:

sudo rm /opt/texbin
sudo ln -s /usr/local/texlive/2015/bin/x86_64-linux /opt/texbin

这样echo $PATH就会显示类似

/opt/texbin:...:/usr/bin:...

只要后面的文件没有/etc/profile.d在 前面添加任何内容PATH。重要的是/opt/texbin是在 之前/usr/bin

在 TeX Live 的新版本中,您只需重置符号链接,无需执行其他任何操作:GUI 程序和 shell 将找到正确的二进制文件。但是,如上所示,您仍然可以在其他 TeX 发行版中运行这些程序。

请记住:当你安装 vanilla TeX Live 时,绝不将选项“在系统目录中创建符号链接”设置为“是”。确保将其设置为“否”,特别是在 GNU/Linux 系统上,因为在升级时,发行版提供的 TeX Live 会接管。

答案2

我很欣赏@egreg 的回答,并在此基础上提出了自己的解决方案,因为我写了一本使用 TL 2017 的书,但我想使用 TL 2019 进行包维护。

然而,由于基于 Debian 的系统由于其编译方式而无法很好地使用此解决方案sudo,因此我创建了一个解决方案和一个 BASH 脚本:https://github.com/ServusCarolus/tl-switch

下面是截至本文发布时 repo 中的 README.md 文件。以下是 TL;DR:

  1. 我下载了 TexLive 2019 的网络安装程序,并在默认情况下以 root 身份进行安装:/usr/local/texlive/2019

  2. 我为 root 和普通用户帐户执行了此操作:

    sudo mkdir -p /opt/tex/root
    sudo mkdir /opt/tex/charles
    sudo chown charles:charles /opt/tex/charles
    
  3. 我对 root.bashrc和我的用户进行了.profile如下修改:

    if [ -d "/opt/tex/$USER/bin" ] ; then
        PATH="/opt/tex/$USER/bin:$PATH"
    fi
    
  4. 我按照下面的 README 所示在 32 位机器和 64 位机器上安装了该脚本。该脚本知道如何查找这两种二进制目录类型。

作为普通用户,我只需输入tl-switch yes和即可切换 TL 发行版,而无需成为 root 用户tl-switch no。当出现新版本时,我可以通过tl-switch yes 2020等进行切换。

与上面的答案类似,该脚本会在用户可写目录中创建或销毁指向 vanilla TL 分布的符号链接,/opt/tex但它会在此过程中进行一些错误检查并节省时间。

我通过成为 root 用户sudo su,并且能够以同样的方式切换发行版,更新和维护,tlmgr并且无需改变普通用户的上下文。此外,这种方法可以扩展到我想要的尽可能多的用户和 TL 发行版。

下面我讨论其他可能的解决方案,因为不同的人有不同的需求。但至少这种方法可能有助于避免由于sudo和而自动回退到发行版软件包secure_path。再次感谢@egreg提供良好的基础和框架。

tl-开关

在安装在 /usr/local/texlive 下的 vanilla TeXLive 和安装在 Debian、Ubuntu、Mint 等系统上的 Linux 发行版 TeXLive 之间切换上下文。

脚本和安装基于以下答案: 多个 TeXlive 安装

警告:关于sudo

即使有人创建一个 shell 脚本以便在命令搜索路径/etc/profile.d之前放置一个指向 vanilla TL 路径的符号链接,该命令也不会默认遵循该链接。/usr/binsudo

问题是 Debian 及其朋友sudo使用 构建的secure_path。根据用户的偏好,有多种解决方法可以解决此问题。请参阅: https://stackoverflow.com/questions/257616/why-does-sudo-change-the-path

以 root 身份安装 vanilla TL 并使用此脚本时,在运行之前必须键入例如sudo su将上下文切换到超级用户tlmgr。替代方案包括:

  1. 侵入性最小的途径,例如:

    sudo env PATH=$PATH tlmgr -gui
    
  2. 使用下面的通用组路线,不要使用sudo,而是将目录设置为存在于/usr/local/texlive/您通过安装的位置sudo

  3. 以各种方式重新定义sudo,如上面的链接所讨论的。YMMV。

无论上述问题如何,正常使用都可以按预期进行。

编辑文件时要小心谨慎。例如,sudo echo "$USER"应指向普通用户,而不是 root。这意味着应避免使用~./文件路径之类的快捷方式。应使用明确的完整路径。

虽然通过 运行时的 GUI 界面tlmgr不会创建 root 拥有的文件sudo,但在运行时应避免使用许多桌面集成 GUI 程序sudo。这样做可能会在用户的主目录树中创建 root 拥有的文件。这会阻止用户程序正确保存信息。

要进行完整的上下文切换,请根据分布执行su或。sudo su

附记:创建群组

避免出现问题的另一种方法sudo是让所有 TeX 用户都可以写入 TeXLive 安装。这里的问题是,如果多个用户干预安装,可能会造成混乱。我们为了完整性而包括这一点:

sudo addgroup texusers
sudo addgroup "$USER" texusers
sudo mkdir -p /usr/local/texlive
sudo chgrp -R texusers /usr/local/texlive
sudo chmod -R 2775 /usr/local/texlive

请注意,adduser 和 addgroup 是 Debian 的;其他发行版(以及基于 Debian 的发行版)有命令useraddgroupadd。请参阅这些命令的手册页。因此,你可以改用:

sudo groupadd texusers
sudo usermod -a -G texusers "$USER"

然后可以将 TL 安装为 texusers 组的一部分。另请参阅:https://www.tecmint.com/create-a-shared-directory-in-linux/

步骤 1:安装 Vanilla TL

要安装 vanilla TL,请参阅:https://www.tug.org/texlive/acquire.html

注意:安装 vanilla TL 时切勿安装符号链接。

第 2 步:创建目录

我们为每个用户创建路径来创建目录链接:

sudo mkdir -p /opt/tex/root
sudo mkdir "/opt/tex/$USER"
sudo chown "$USER":$USER" "/opt/tex/$USER"

我们为每个用户重复最后两行,很可能用 $USER 替换每个用户名,例如:

sudo mkdir /opt/tex/bob
sudo chown bob:bob /opt/tex/bob

步骤 3:修改个人资料

我们将此代码片段放在每个用户.profile和根用户中.bashrc

if [ -d "/opt/tex/$USER/bin" ] ; then
    PATH="/opt/tex/$USER/bin:$PATH"
fi

另一种方法是将代码片段放入每个人的 中.bashrc,然后添加source .bashrc到每个人的 中.profile。每次打开终端时,都会更新路径环境。或者可以设置终端以打开登录 shell。

编辑 root 的文件时.bashrc,记得使用sudo su或 指定/root/.bashrc为文件。否则sudo nano ~/.bashrc将引用用户的.bashrc文件。

步骤4:安装脚本

我们进入下载或克隆存储库的目录并找到tl-switch脚本。然后输入:

sudo cp ./tl-switch /usr/local/bin
chmod +x /usr/local/bin/tl-switch

现在所有用户都有权运行该脚本。

步骤5:重新启动

安装过程完成后,最好在使用 TeXLive 之前重新启动机器,以便正确更新 root 和用户的路径。

步骤 6:切换到 Vanilla TeXLive

当用户(或 root)想要启用对 vanilla TL 2019 的访问时,只需输入:

tl-switch yes

要指定下的另一个安装/usr/local/texlive,请使用,例如:

tl-switch yes 2018

要禁用 vanilla TL 并使用发行版,只需输入:

tl-switch no

如果在会话过程中更改上下文,搜索路径不会改变。上面的步骤 3 中提到了一种(某种程度上)解决该问题的方法。

最后的想法

这种方法的一个直接缺点是需要sudo su在运行之前将上下文切换到超级用户tlmgr。它的好处包括将用户彼此隔离,并允许用户在不进行大量系统修改的情况下更改上下文。然而,为了避免出现问题,应该只在注销和重新登录之前更改上下文。

相关内容