让 xetex 识别系统字体的特定样式?

让 xetex 识别系统字体的特定样式?

我正在尝试更改乳胶模板以使用库珀·休伊特章节标题的字体。(我正在使用 pandoc 将 markdown 转换为 pdf,通过调整内置 pandoc 模板并使用 xelatex 引擎。)

然而,出于某些奇怪的原因,当我尝试更改标题的字体时,它总是以斜体显示,除非我将路径硬编码为我想要的字体的特定样式---这看起来非常脆弱,并且不可能是唯一的方法,对吧?

不起作用的东西:

这是我的基本尝试。我将以下三行放在模板文件中,位于所有其他包声明之后,标题声明之前:

\usepackage{sectsty}
\setsansfont{Cooper Hewitt}
\allsectionsfont{\sffamily}

Cooper Hewitt 在我的 (MacOS) 系统上以普通方式安装(显示在 Font Book 中,不会报告任何错误等)。但是,出于某种原因,标题变成了斜体。经过一番调查(见下文),我能辨别出的最好的结果是 XeLaTeX 无法确定安装的字体的哪个版本是哪个版本。

我尝试将最后一行改为\allsectionsfont{\sffamily\upshape}\allsectionsfont{\upshape\sffamily},但没有什么区别,它仍然以斜体显示。

当我删除特定的字体声明时,即

\usepackage{sectsty}
\allsectionsfont{\sffamily}

然后部分字体将正确显示为非斜体,并且显示默认无衬线字体(某种计算机现代无衬线字体?)。因此,问题似乎仅在我指定要使用的特定无衬线字体时才会出现。

我甚至尝试过

\usepackage{sectsty}
\setsansfont{Cooper Hewitt}
\allsectionsfont{\sffamily}
\allsectionsfont{\upshape}

但这只是将整个事情恢复了原样,而我最终得到了采用衬线计算机现代字体的章节标题。

我尝试过不同的自定义 sans 字体,ie,\setsansfont{Fira Sans}效果不错(ie 没有显示斜体),但我不想要 Fira Sans,我想要 Cooper Hewitt...

我也尝试指定特定的子类型,即,\setsansfont{Cooper Hewitt Semibold}但是乳胶会引发以下错误:

kpathsea:make_tex: Invalid filename `Cooper Hewitt Semibold', contains ' '
Error producing PDF.
! Package fontspec Error: The font "Cooper Hewitt Semibold" cannot be found.

下列的这个 SO我也尝试过:

\usepackage{sectsty}
\setsansfont{Cooper Hewitt}[
  FontFace={sb}{n}{Font=* SemiBold}
]
\DeclareRobustCommand{\sbseries}{\fontseries{sb}\selectfont}
\allsectionsfont{\sbseries}

这会产生相同的字体未找到错误。(我也尝试使用“Semibold”代替 SemiBold,同样如此。)

什么有用,但很糟糕

最后,我尝试简单地将特定权重的绝对路径硬编码到以下位置:这个 SO

\usepackage{sectsty}
\newfontfamily\headerfont[Path=/Users/myuser/Library/Fonts/]{CooperHewitt-Semibold}
\allsectionsfont{\headerfont}

这终于终于成功了。但它似乎有点脆弱,因为我似乎必须在我使用的每台机器上硬编码特定的字体路径,或者将字体与我编写的每个文档捆绑在一起,这两种方式都没有任何意义(这是操作系统的工作!)。

有没有更好的办法?一定有更好的办法!

相关内容