编辑

编辑

前段时间,我从 TeX Live 2014 更新到了 2015。现在我有时想用去年的版本编译一个文件。似乎只需在命令行上指定可执行文件的完整路径就足够了,即/usr/local/texlive/2014/bin/x86_64-linux/xelatex,因为加载的软件包的消息都提到了 2014 目录。还是还有什么我没看到的,会从 2015 中引入内容?

答案1

对于我安装的每个 YYYY 版本的 TeX Live,我都设置了两个符号链接,如下所示:

cd /usr/local/texlive
ln -s <YYYY>/bin/x86_64-linux/
ln -s current.<YYYY> <YYYY>/

对于活动版本,我会这样做

ln -s bin.<YYYY> bin
ln -s current.<YYYY> current

例如,现在它看起来像这样:

drwxr-xr-x 11 texlive texlive    4096 Mai  20  2012 2011/
drwxr-xr-x 10 texlive texlive    4096 Ebr  11  2013 2012/
drwxr-xr-x  9 texlive texlive    4096 Ebr  22  2014 2013/
drwxr-xr-x  9 texlive texlive    4096 Ebr  15 23:15 2014/
drwxr-xr-x  9 texlive texlive    4096 Gor  25 22:11 2015/
lrwxrwxrwx  1 texlive texlive       8 Meh  17 00:36 bin -> bin.2015/
lrwxrwxrwx  1 root    root         21 Rha  12  2011 bin.2011 -> 2011/bin/x86_64-linux/
lrwxrwxrwx  1 texlive texlive      21 Gor  21  2012 bin.2012 -> 2012/bin/x86_64-linux/
lrwxrwxrwx  1 texlive texlive      21 Meh  29  2013 bin.2013 -> 2013/bin/x86_64-linux/
lrwxrwxrwx  1 texlive texlive      21 Meh  20  2014 bin.2014 -> 2014/bin/x86_64-linux/
lrwxrwxrwx  1 texlive texlive      21 Meh  12 02:03 bin.2015 -> 2015/bin/x86_64-linux/
lrwxrwxrwx  1 texlive texlive      12 Meh  17 00:36 current -> current.2015/
lrwxrwxrwx  1 texlive texlive       4 Ion  17  2012 current.2011 -> 2011/
lrwxrwxrwx  1 texlive texlive       4 Gor  21  2012 current.2012 -> 2012/
lrwxrwxrwx  1 texlive texlive       4 Meh  29  2013 current.2013 -> 2013/
lrwxrwxrwx  1 texlive texlive       4 Meh  20  2014 current.2014 -> 2014/
lrwxrwxrwx  1 texlive texlive       4 Meh  12 02:03 current.2015 -> 2015/
drwxr-xr-x 11 texlive texlive    4096 Gor  25 22:11 texmf-local/

然后我创建一个脚本部分,/etc/profile.d/<some_name_with_texlive>.sh内容如下:

if [ `whoami` != "root" ]
then
        [ -d "/usr/local/texlive/bin" ] && export PATH="/usr/local/texlive/bin:${PATH}"
fi

请注意,出于安全原因,这故意不会改变PATH用户。root

编辑

上述设置足以访问 MAN 页面,但不足以将其编入索引。为了确保 MAN 页面被编入索引,并且man -k搜索apropos时可以找到它们,我做了以下操作。这可能比本答案的前面部分更依赖于系统,因此请谨慎行事并适应系统的现有配置。

我做的第一件事就是备份一份/etc/man_db.conf然后打开原件进行编辑。

在将 PATH 的各部分映射到 MANPATH 的各部分的部分中,我添加了以下行:

MANPATH_MAP    /usr/local/texlive/bin  /usr/local/texlive/current/texmf-dist/doc/man/

在将 MANPATH 映射到 CATPATH 的部分中,我添加了以下行:

MANDB_MAP      /usr/local/texlive/current/texmf-dist/doc/man/  /var/cache/man/texlive

然后我保存了更改。

到目前为止,这并没有多大用处,因为 MAN 页的索引是由以 root 身份运行的进程创建的。由于 root 的 PATH 不包含/usr/local/texlive/bin,因此映射没有帮助。

为了解决这个问题,您需要知道哪个进程在您的系统上编译索引。索引通常会定期自动更新,例如每天一次。

cron这可能由名为或或类似名称的实用程序管理anacron。如果是这样,您可以在/etc/crontab或之类的内容中找到详细信息/etc/cron.daily/<some-script>

在我的系统上,索引现在由 控制systemd。控制它的默认文件是/usr/lib/systemd/system/man-db.service/usr/lib/systemd/system/man-db.timer

`.service 文件包含以下内容:

[Unit]
Description=Update man-db cache
RequiresMountsFor=/var/cache/man

[Service]
Type=oneshot
ExecStart=/usr/bin/mkdir -m 0755 -p /var/cache/man
ExecStart=/usr/bin/mandb --quiet
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7

文件.timer内容如下:

[Unit]
Description=Daily man-db cache update

[Timer]
OnCalendar=daily
AccuracySec=12h
Persistent=true

您可能已经猜到了,该.timer文件只是指示systemd每天更新索引。无需更改。

因此,我仅复制了该.service文件/etc/systemd/system/man-db.service并将以下行添加到该[Service]部分:

Environment=PATH=${PATH}:/usr/local/texlive/bin

这意味着,在索引 MAN 页时,root 的 PATH 将添加/usr/local/texlive/bin到现有 PATH。然后它将映射到适当的 MANPATH 和 CATPATH,因为我已经在 中设置了这些映射/etc/man-db.conf

因此,完整的systemd单元文件在/etc/systemd/system/man-db.service

[Unit]
Description=Update man-db cache
RequiresMountsFor=/var/cache/man

[Service]
Type=oneshot
Environment=PATH=${PATH}:/usr/local/texlive/bin
ExecStart=/usr/bin/mkdir -m 0755 -p /var/cache/man
ExecStart=/usr/bin/mandb --quiet
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7

注意两点:

  • root 的 PATH 仅针对此单个任务进行改变,而不会进行其他更改;
  • 即使对于这个任务,PATH 的添加也会添加到结尾根路径和不是回到开头,就像配置普通用户的默认PATH一样。

这两种方法都比同时改变 root 的 PATH 和普通用户的 PATH 提供了更高的安全性。

结果如何?apropos pdflatex- 昨天才发现nothing appropriate- 今天建议使用以下 MAN 页面:

pdflatex (1)         - PDF output from TeX
purifyeps (1)        - make an Encapsulated PostScript file work with both dvips and pdflatex

答案2

您已安装两个 texlive:

/usr/local/texlive/2014/
/usr/local/texlive/2015/

对于个人使用,无需更改任何内容。只需将其放入文件中即可

/home/<username>/.profile

PATH=/usr/local/texlive/2014/bin/x86_64-linux:$PATH; export PATH

保存文件,注销(无需重新启动),再次登录,您就进入了 texlive 2014。

至少这是我从 2009 年开始在 openSuse 上的做法。

我确信有更好更简单的方法。可能必须维护不同版本的软件包的开发人员不会总是登录和退出。

也许您可以为您的机器设置第二个用户,这样您只需要在用户之间切换即可。但是,如果一个用户拥有您想要编译的文件,那么这种方法就行不通了。

答案3

当您安装 texlive 时(我使用二进制文件的符号链接进行安装),所有内容都在目录中:

/usr/loca/share/texlive/2014或者2015

二进制文件(对我而言)是/usr/local/bin指向最后安装的 2014 或 2015 先前看到的目录的链接。

环境变量和帕特斯设置在上次安装(2014 或 2015)之前看到的目录中(与二进制文件相同)。

您只需使用链接在 2015 年和 2014 年目录之间切换即可:

重命名/usr/loca/share/texlive/2014/usr/loca/share/texlive/old 重命名/usr/loca/share/texlive/2015/usr/loca/share/texlive/new

在目录中建立一个名为或的/usr/loca/share/texlive/链接(取决于哪个是最后安装的 texlive),指向或取决于您想要使用的 texlive。20152014oldnew

答案4

我现在做了以下事情:

$ sudo ln -s /usr/local/texlive/2014 /usr/local/texlive/active

编辑/etc/profile.d/texlive.sh后,唯一未注释的行是

export PATH=/usr/local/texlive/active/bin/x86_64-linux:$PATH
export MANPATH=/usr/local/texlive/active/texmf-dist/doc/man:$MANPATH
export INFOPATH=/usr/local/texlive/active/texmf-dist/doc/info:$INFOPATH

然后我重新启动了,但肯定有更简单的方法来重置路径。

现在 TeX Live 2014 已启用。要切换回 2015:

$ sudo rm /usr/local/texlive/active
$ sudo ln -s /usr/local/texlive/2015 /usr/local/texlive/active

这确实可以写入脚本中。

相关内容