问题
如何安装供全系统使用的软件包,但又不需要ls-R
更新数据库?
背景
这texlive 文档表示特定用户的包应该放在 中,TEXMFHOME
而多个用户的包应该放在 中TEXMFLOCAL
(两者都由TeX 目录结构(TDS))。
在您的系统上,可以使用以下方式找到这些位置kpsewhich
(它们是在安装过程中配置的,不是就像环境变量一样):
kpsewhich -expand-var '$TEXMFHOME'
kpsewhich -expand-var '$TEXMFLOCAL'
正如指出的那样这个答案,该TEXMFHOME
解决方案不需要ls-R
更新数据库:只需在此处添加包即可找到它们。
然而TEXMFLOCAL
,要求 mktexlsr
(texhash
)运行以更新数据库(这必须在权限正确设置的情况下ls-R
完成)。root
TEXMFHOME
有没有类似的地点才不是需要一个ls-R
供全系统使用的数据库吗?
用例是共享系统上的用户维护我们托管的包TEXMFLOCAL
。每当他们更改文件名称时,ls-R
管理员都需要更新本地数据库。我们如何允许用户修改包(包括根据需要更改文件名),而无需管理员更新ls-R
?
我意识到如果不使用数据库,性能会受到影响,因此可能应该使用单独的树。另外,我确信的设置TEXMFLOCAL
可能可以调整(通过将其从TEXMFDBS
?)以消除对的需要ls-R
,但我正在寻找与记录的texlive
系统行为相适应的“标准”解决方案。
答案1
路径扩展和数据库搜索记录在kpathsea
和web2c
文档中(均可用texdoc
)。
引用 kpathsea 手册(第 3.4.1 节):
但是,如果特定路径元素以“!!”开头,则只会在数据库中搜索该元素,而不会在磁盘中搜索。
研究texmf/web2c/texmf.cnf
发现
% TEXMFLOCAL follows TEXMFMAIN (and precedes TEXMFDIST) because the
% files in TEXMFMAIN are tightly coupled with the particular version of
% the distribution, such as configuration files. Overriding them would
% be more likely to cause trouble than help. On the other hand, the
% bulk of packages and fonts are in TEXMFDIST, and locally-installed
% versions should take precedence over those -- although it is generally
% a source of confusion to have different versions of a package
% installed, whatever the trees, so try to avoid it.
TEXMF = {$TEXMFCONFIG,$TEXMFVAR,$TEXMFHOME,!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFMAIN,!!$TEXMFLOCAL,!!$TEXMFDIST}
% Where to look for ls-R files. There need not be an ls-R in the
% directories in this path, but if there is one, Kpathsea will use it.
% By default, this is only the !! elements of TEXMF, so that mktexlsr
% does not create ls-R files in the non-!! elements -- because if an
% ls-R is present, it will be used, and the disk will not be searched.
% This is arguably a bug in kpathsea.
TEXMFDBS = {!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFMAIN,!!$TEXMFLOCAL,!!$TEXMFDIST}
这应该足够了(我还没有测试过),把这些线
TEXMF = {$TEXMFCONFIG,$TEXMFVAR,$TEXMFHOME,!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFMAIN,$TEXMFLOCAL,!!$TEXMFDIST}
TEXMFDBS = {!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFMAIN,$TEXMFLOCAL,!!$TEXMFDIST}
进入texmf.cnf
返回的kpsewhich texmf.cnf
,从而禁用中的数据库搜索$TEXMFLOCAL
。
答案2
马丁的回答看起来像是你的问题的正确答案,但我想回答你没有问的问题,但应该问恕我直言:-) 那个问题是:我如何允许某人维护TEXMFLOCAL
?
您似乎假设只有管理员才能更新ls-R
中的文件TEXMFLOCAL
。事实并非如此。任何可以写入 的人TEXMFLOCAL
都可以更新文件。如果您的用户有足够的权限来更新(重命名) 中的文件TEXMFLOCAL
,他们应该已经能够ls-R
毫无问题地更新那里的文件。如果他们想避免mktexlsr /path/to/texmflocal
与他们无法写入的树相关的错误,只需告诉他们运行 而不是mktexlsr
,否则他们可以忽略错误,TEXMFLOCAL/ls-R
无论如何都会更新。
这就是如何共享 TeX Live 管理权限的简单答案:只需使用文件系统权限。
(PS:如果您当前的ls-R
文件归 root 所有,则需要第一次对其进行chown
或chgrp
和。)chmod