前段时间,我从 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。2015
2014
old
new
答案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
这确实可以写入脚本中。