使用 fontspec 从包目录加载字体

使用 fontspec 从包目录加载字体

我正在开发一个 LaTeX 包(实际上它是一个文档类),我想让其他人可以在他们的 texmf 目录中安装它。在这个包中,我使用给定的字体为 \lstset 命令设置默认配置。例如,如果我想使用 Droid Sans Mono 作为字体,则以下命令有效(如果系统上安装了该字体):

\newfontfamily\listingsfont[Scale=0.85]{Droid Sans Mono}
\lstset {
    basicstyle=\footnotesize\listingsfont
}

但是,如果系统上没有安装字体,这当然会失败。因此,我想将字体与 LaTeX 包一起分发。我已经测试了 fontspec 的 Path 选项

\newfontfamily\listingsfont[Path=/home/username/texmf/tex/latex/mypackage/,Scale=0.85]{Droid Sans Mono}

一切正常,只是我必须事先知道用户名。

有没有办法在 fontspec 中指定相对于我的包的路径?或者获取主目录的路径?

(该软件包的大多数用户将使用 Ubuntu 作为其主要操作系统)。

答案1

这里有许多事情需要考虑

  1. 加载存储在 texmf-tree 中的字体时,您应该使用文件名而不是字体名称,因为字体名称并非在所有操作系统上都有效。因此请使用 \newfontfamily\listingsfont[Scale=0.85]{droidsansmono.ttf}而不是 \newfontfamily\listingsfont[Scale=0.85]{Droid Sans Mono}
  2. 字体属于fontstexmf 树的文件夹 —fonts\opentype对于otf-fonts 和fonts\truetypettf即使你找到一种方法将字体放在靠近你的包的地方:像 TeX 发行版这样的大型系统只有每个人都遵守某些标准才能工作。

  3. 自动将字体与类或包一起分发几乎没有意义。如果您对字体有完全控制权,或者字体确实很特殊并且只能与类一起使用,或者字体不是免费的,则例外。但是对于 Droid Sans Mono,已经有一个包含此字体的 CTAN 包,将第二个版本添加到 texmf 树只会带来麻烦。例如,如果搜索路径中有多个版本的字体,xelatex 就不喜欢它。

因此,如果您担心某些用户没有Droid Sans MonoCTAN 上的字体:请告诉他们更新他们的 TeX-System 或从 CTAN 手动安装字体。

如果您确实需要将字体与包一起分发,请告诉用户将它们安装在正确的文件夹中(如果您通过 CTAN 分发包,他们会处理此事)。

答案2

看一下“novel”文档类。可能在您的 TeXlive 2016 发行版中,或者如果不是,则在 CTAN 中。该类包含自己的自定义字体,当您安装包(实际上是一个文档类)时,它会安装在适当的位置(fonts/opentype/novel/)。

通过 tlmgr(分发安装程序)安装时有效。如果下载为 TDS 并安装在 TEXMF-LOCAL 目录中,也可以工作。请注意,在某些情况下,您可能需要重建 luatex-cache。

请注意,自定义字体不是“从软件包目录”加载的。相反,已安装的软件包会将字体放置在字体应该所在的正确目录中。这是自动完成的。

当我开始构建这个文档类时,我设想按照你在问题中要求的那样做:将字体放在包 *.sty 文件所在的位置。但这并不容易,而且事实上没有必要,因为包安装程序也可以安装字体。

编辑:最近,fontspec添加了检测是否可以找到字体的功能,并根据字体是否存在采取不同的操作。因此,可以编写一个宏来请求字体 A,但如果未找到 A,则使用 B,如果 A 和 B 都未找到,则使用 C,最后如果都未找到,则停止并显示一条消息。请参阅最近的文档fontspec

相关内容