加载 ./fonts 目录中的字体

加载 ./fonts 目录中的字体

我是 TeX 新手。我遇到以下问题:如何从位于项目根目录的目录中的文件加载字体?

假设我有类似的东西:

/项目
  /字体
    DancingScript-Regular.ttf
  主文本
  DancingScript-Regular.ttf

当它位于根目录时加载它似乎有效。

%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode

\documentclass[a4paper,12pt]{book}
\usepackage{fontspec}
\setromanfont{DancingScript-Regular.ttf}
\begin{document}

hello world

\end{document}

但是我不知道如何在fonts目录中加载它。我试过./fonts/DancingScript-Regular.ttffonts/DancingScript-Regular.ttf和。它们"fonts/DancingScript-Regular.ttf"file:./fonts/DancingScript-Regular.ttf不起作用。

所有指南似乎都侧重于某种“如何安装字体”,但我无法接受这一点,因为字体可能会(定期)更改,并会导致某种字体版本地狱;它也不太适合版本控制。LaTeX WikiBook 中的字体部分似乎也没有涵盖使用您自己的字体。

另外,我可以将字体加载为某种预设/别名吗?由于很多字体我基本上都有字体系列,所以大约有 10 种变体(倾斜、粗体、粗倾斜、常规等)。如果可能的话,我想避免重复声明。

答案1

以下解决方案适用于 XeLaTeX 和 LuaLaTeX。

该手册第 7 页fontspec写道:

要加载不在默认搜索路径中的字体,必须使用路径功能指定其在文件系统中的位置:

\fontspec [ Path = /Users/will/Fonts/, 
UprightFont = *-regular,
 BoldFont = *-bold, ...]
{texgyrepagella}

路径不必绝对指定,因此如果您的字体在例如 texsource/fonts 中并且您的源在 texsource 中,则您可以使用:

\fontspec [ Path = fonts/, ... ]  { } % note that the trailing '/' is required

由于通常不建议\fontspec直接使用该命令,因此更常见的做法是使用主要字体选择命令之一,或者\newfontfamily

\setmainfont [ Path = fonts/, ... ] { }
\setsansfont [ Path = fonts/, ... ] { }
\setmonofont [ Path = fonts/, ... ] { }
\newfontfamily [ Path = fonts/, ... ] { }

请注意,UprightFont 等规范后面的部分必须与您使用的实际字体的名称相匹配。例如,如果您的字体文件被命名为

MyFont-Roman.ttfMyFont-Italic.ttf

加载它们的命令将使用:

\fontspec [Path = fonts/,
    UprightFont = *-Roman,
    ItalicFont = *-Italic
 ]
{MyFont}

ETC。

记得你需要\fontspec专门使用命令。任何其他字体选择命令(fontspec例如\setmainfont或 )\newfontfamily也可以与路径规范一起使用,如前所述。

除非您特别需要本地字体,否则最简单的方法是将它们安装到您的系统中(在 Mac 上/Library/Fonts),然后它们就会被自动找到。

答案2

我补充一点,如果你读过这篇文章但仍然有问题……代码查找的 ttf 与 tex 文档中指定的字体名称相同。因此,如果字体名称有空格,则 ttf 文件名也必须有空格!例如我有这个:

\newfontfamily{\rim}[Path=./fonts/, Scale=1.5]{Rat Infested Mailbox}

字体名称是 RatInfestedMailbox.ttf,而 xelatex 找不到该字体。当我将字体重命名为“Rat Infested Mailbox.ttf”时,xelatex 找到了它,并且很高兴。事实上,ttf 文件的名称必须与字体名称完全相同(包括例如特殊字符,如 &,如果它们在字体名称中,并且区分大小写(在 Linux 上))。

因此看起来对 ttf 文件的搜索根本没有做任何聪明的事情(例如,如果无法直接找到具有给定名称的 .ttf,则扫描字体路径中的所有 ttf 以寻找正确的字体名称)。

相关内容