是什么导致了这些问题?

是什么导致了这些问题?

这个问题和答案是对约瑟夫赖特 (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)。YYYY2017

这样做的直接效果非常好。个人用户发现一切正常,新安装的字体突然可以在文档中使用。

但现在 中的文件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 --usergetnonfreefonts --sys。[较旧的安装可能getnonfreefonts针对用户情况改为使用 和getnonfreefonts-sys代替getnonfreefonts --sysgetnonfreefonts --sys在这种情况下也应该有效。]
    • 在集合中安装字体时,使用getnonfreefonts --sys
    • 尽管getnonfreefonts --sysgetnonfreefonts --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 将无法为您重新生成!

读完后,把故事的寓意写在自己的便条上,这样你就不必再经历这种事情了!

相关内容