这个问题和答案是对约瑟夫赖特 (Joseph Wright) 的请求的回应。
为什么我不应该
getnonfreefonts
安装其他字体?updmap
为什么在安装或删除字体时不应该使用?
背景
网站上有很多关于人们安装附加字体和使用updmap
更新 TeX 所依赖的“地图”文件所导致的问题。
导致这些问题的一个常见原因是使用getnonfreefonts
。
其他原因有使用其他字体安装脚本或者updmap
直接执行。
答案1
是什么导致了这些问题?
这里的根本问题是updmap
某种方式、形状或形式来执行。
运行旧版本的getnonfreefonts
会导致问题因为它执行updmap
。
跑步getnonfreefonts --user
导致问题因为它执行updmap
。
其他字体安装脚本导致此问题因为它们执行updmap
。(当然,并非所有脚本都会这样做。但我们这里关注的是那些这样做的脚本。)
最后,当然,执行updmap
直接执行会导致问题因为它执行updmap
。
getnonfreefonts
[旧版本] 和有什么问题getnonfreefonts --user
?
他们跑了updmap
。(如果你对这一点还不清楚,请参阅上一节。)
有什么问题updmap
?
简短回答
本质上,问题在于updmap
创建个人字体映射文件,当为 TeX Live 的系统范围安装删除、添加或更新字体时(例如,当tlmgr
用于更新时),该文件不会更新。
详细说明
Tex Live 提供了一系列用于管理 TeX 安装的命令。一组特别重要的命令来自两种口味。这些命令的命名如下:
<command name>
和/或<command name> --user
<command name>-sys
和/或<command name> --sys
我们感兴趣的命令updmap
是这些命令之一。也就是说,它有两种形式:
updmap
updmap-sys
这意味着第一个命令管理配置和安装仅适用于当前用户. 第二个命令,updmap-sys
,管理配置和安装对于所有用户、全系统。
和 都会updmap
读取updmap-sys
一系列配置文件,这些文件告诉它们.map
要查找哪些文件、要激活哪些文件,以及一些有关如何使用字体的信息。然后,它们尝试读取这些.map
文件,并使用其中的信息创建一些“超级”.map
文件,供各种程序使用。
例如,假设程序找到一个包含以下行的配置文件
Map AnonymousPro.map
除其他事项外,这还会告诉它读取文件AnonymousPro.map
并启用该文件描述的字体。
例如,该文件的前几行是
AnonymousPro-Regular-01 AnonymousPro <AnonymousPro-01.enc <AnonymousPro-Regular.pfb " fontinst-autoenc-AnonymousPro-01 ReEncodeFont "
AnonymousPro-Regular-02 AnonymousPro <AnonymousPro-02.enc <AnonymousPro-Regular.pfb " fontinst-autoenc-AnonymousPro-02 ReEncodeFont "
AnonymousPro-Regular-03 AnonymousPro <AnonymousPro-03.enc <AnonymousPro-Regular.pfb " fontinst-autoenc-AnonymousPro-03 ReEncodeFont "
它基本上告诉 TeX 如何处理来自 AnonymousPro 系列的各种字体的请求。
关键在于,updmap
或者updmap-sys
读取此文件并将相关信息添加到.map
他们生成的“超级”文件中。
例如,他们会将以下几行添加到pdftex.map
,pdfTeX 将使用它们将您对 AnonymousPro 字体的请求转化为现实:
% AnonymousPro.map
AnonymousPro-Bold-01 AnonymousPro-Bold <AnonymousPro-01.enc <AnonymousPro-Bold.pfb " fontinst-autoenc-AnonymousPro-01 ReEncodeFont "
AnonymousPro-Bold-02 AnonymousPro-Bold <AnonymousPro-02.enc <AnonymousPro-Bold.pfb " fontinst-autoenc-AnonymousPro-02 ReEncodeFont "
AnonymousPro-Bold-03 AnonymousPro-Bold <AnonymousPro-03.enc <AnonymousPro-Bold.pfb " fontinst-autoenc-AnonymousPro-03 ReEncodeFont "
当您使用 pdfTeX 或 TeX 编译文档时,.map
不会读取 AnonymousPro 字体包中的小文件片段:TeX 仅读取.map
包含有关安装可用的所有字体的信息的“超级”文件。
到目前为止,两者updmap
都能updmap-sys
完成工作。
但是因为updmap
只在个人用户级别配置事物,它会.map
在中创建“超级”文件TEXMFVAR
。在典型的 GNU/Linux 安装中,这就是TeX Live 版本的位置(例如~/.texliveYYYY/texmf-var
)。YYYY
2017
这样做的直接效果非常好。个人用户发现一切正常,新安装的字体突然可以在文档中使用。
但现在 中的文件TEXMFVAR
取代了 的系统范围副本pdftex.map
等等。目前,这没问题,因为 中的所有系统范围信息都将在 中的新版本中复制TEXMFVAR
。
问题始于安装更新时。假设用户现在运行tlmgr
更新安装,并很高兴看到安装了新的 type1 postscript 字体 GorgeousGraffiti。tlmgr
完成所有更新,因此应该可以使用。用户阅读文档并尝试在文档中使用新字体。
TeX 现在抱怨它找不到字体。由于不确定该怎么做,它尝试查找.mf
创建.pk
文件的配方,但当然没有。编译失败。
为什么?
当用户使用 pdfTeX 进行编译时,程序会读取.map
它使用的“超级”文件。它优先考虑系统内的文件TEXMFVAR
,而不是系统范围的文件。例如,它优先考虑用户的个人文件pdftex.map
,而不读取系统范围的文件。(如果用户使用 TeX 而不是 pdfTeX,也会发生类似的事情。)
但tlmgr
管理整个系统的配置和安装。因此它添加了有关 GorgeousGraffiti 的信息不是不是添加到 的单个用户副本pdftex.map
,而是添加到 的系统范围副本TEXMFSYSVAR
。为了将有关 GorgeousGraffiti 的信息添加到 的用户副本pdftex.map
,用户需要updmap
再次运行。每次tlmgr
更改系统字体配置时都会发生同样的事情 - 为了将这些更改集成到 的用户副本中pdftex.map
,用户需要updmap
再次运行。
坦白地说,这是一种痛苦。
即使运行updmap
一次也意味着系统范围的字体映射信息将永远不会再被读取。
相反,updmap-sys
处理系统范围的配置。getnonfreefonts --sys
例如,当您使用 安装其他字体时,字体将安装在 中TEXMFLOCAL
,并且updmap-sys
用于将这些字体的信息添加到系统范围的配置中。
在这种情况下,当tlmgr
使用 来更新安装时,它将pdftex.map
像以前一样将有关 GorgeousGraffiti 的信息添加到系统范围等。但这次,当用户编译使用该字体的文档时,pdfTeX 将不会pdftex.map
在用户的个人 中找到 的任何副本TEXMFVAR
。因此,它将改用系统范围的TEXMFSYSVAR
。由于此版本已使用新信息进行了更新,pdfTeX 将了解有关 GorgeousGraffiti 的所有信息,并且文档将成功编译。
这个故事的主旨
用于
getnonfreefonts --sys
安装其他字体。getnonfreefonts
按通常方式安装。- 这将安装一个命令
getnonfreefonts
,二风格:getnonfreefonts --user
和getnonfreefonts --sys
。[较旧的安装可能getnonfreefonts
针对用户情况改为使用 和getnonfreefonts-sys
代替getnonfreefonts --sys
。getnonfreefonts --sys
在这种情况下也应该有效。] - 在集合中安装字体时,使用
getnonfreefonts --sys
。 - 尽管
getnonfreefonts --sys
和getnonfreefonts --user
是相同的基本命令,但您选择的风格很重要。如果您通过 调用它getnonfreefonts --sys
,它将执行正确的操作。如果您通过 调用它getnonfreefonts --user
,它将执行错误的操作。 - 请记住,莎士比亚谈论的是玫瑰,而不是字体安装脚本:字体安装脚本无论叫什么名字不是闻起来一样甜。
如果你使用其他字体安装脚本,请确保它使用
updmap-sys
。不是使用将运行的脚本updmap
。如果您需要直接更新地图文件,请始终使用
updmap-sys
。
如果你读得太晚
首先执行以下命令,将生成的文件移开updmap
。这只会重命名目录。如果一切顺利,您可以稍后将其删除。
mv -n $(dirname $(kpsewhich --var-value TEXMFVAR)) $(dirname $(kpsewhich --var-value TEXMFVAR)).bkup
请注意,运行此命令可能会导致某些文档的编译速度最初变慢。例如,LuaTeX 必须重新生成缓存信息,.pk
需要重新创建字体等。这将类似于安装新版本 TeX Live 后的首次编译。
请注意,TEXMFVAR
仅包含生成的文件。因此,这里的所有内容都可以根据需要由 TeX 重新生成。
现在确保已TEXMFHOME
删除安装在 中的所有字体和相关文件。如果您不确定它们在哪里,请运行kpsewhich --var-value TEXMFHOME
。不要删除整个目录!如果您安装了自定义类或包,则需要保留它们。您需要检查哪些应该删除,哪些不应该删除。
如果你确定你没有安装自定义包或类TEXMFHOME
,你可以尝试
mv -n $(kpsewhich --var-value TEXMFHOME) $(kpsewhich --var-value TEXMFHOME).bkup
再次,如果您确定不需要该目录中的任何内容,您可以稍后删除该目录。
请注意,其中TEXMFHOME
包含未生成的文件。因此,如果您在此处删除了重要内容,TeX 将无法为您重新生成!
读完后,把故事的寓意写在自己的便条上,这样你就不必再经历这种事情了!