XeLaTeX 和字体选择

XeLaTeX 和字体选择

这几乎是重复的,但它的答案对我来说不起作用。

我下载了完整的 Roboto 超家族(机器人Roboto 浓缩版机器人板坯机器人莫诺),我想在我的文档中使用所有系列、所有粗细、宽度、变体和样式。当然,这不是我真正的需要,但我想清楚地了解该fontspec包的工作原理。

我所有的 .ttf 文件都位于一个名为的目录中fonts,该目录按系列名称细分为目录(fonts/Roboto、、fonts/Roboto_Condensed等等……)。

灵感来自XeLaTeX 和字体粗细, 这包装文档fontspectexdoc 字体安装指南我以这种方式包含了 Roboto 字体。

\setmainfont{Roboto}[
  Path = fonts/Roboto/,
  Extension = .ttf,
  %-- Upright --%
  FontFace={ul}{n}{Font=*-Thin},
  FontFace={l}{n}{Font=*-Light},
  FontFace={m}{n}{Font=*-Regular},
  FontFace={mb}{n}{Font=*-Medium},
  FontFace={b}{n}{Font=*-Bold},
  FontFace={eb}{n}{Font=*-Black},
  % %-- Italic --%
  FontFace={ul}{it}{Font=*-ThinItalic},
  FontFace={l}{it}{Font=*-LightItalic},
  FontFace={m}{it}{Font=*-Italic},
  FontFace={mb}{it}{Font=*-MediumItalic},
  FontFace={b}{it}{Font=*-BoldItalic},
  FontFace={eb}{it}{Font=*-BlackItalic},
]

但我收到以下错误:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

! 字体规范错误:“未找到字体”

! 无法找到字体“Roboto”。

! 请参阅 fontspec 文档以了解更多信息。

!如需立即帮助,请输入 H 。

!..............................................

但道路是正确的。事实上,有了这个 MWE

\documentclass[10pt]{article}

\usepackage{fontspec}

\setmainfont{Roboto}[
  Path = fonts/Roboto/,
  Extension = .ttf,
  UprightFont = *-Regular,
  %-- Upright --%
  FontFace={ul}{n}{Font=*-Thin},
  FontFace={l}{n}{Font=*-Light},
  FontFace={m}{n}{Font=*-Regular},
  FontFace={mb}{n}{Font=*-Medium},
  FontFace={b}{n}{Font=*-Bold},
  FontFace={eb}{n}{Font=*-Black},
  % %-- Italic --%
  FontFace={ul}{it}{Font=*-ThinItalic},
  FontFace={l}{it}{Font=*-LightItalic},
  FontFace={m}{it}{Font=*-Italic},
  FontFace={mb}{it}{Font=*-MediumItalic},
  FontFace={b}{it}{Font=*-BoldItalic},
  FontFace={eb}{it}{Font=*-BlackItalic},
]

\DeclareRobustCommand{\ulseries}{\fontseries{ul}\selectfont}
\DeclareRobustCommand{\lseries}{\fontseries{l}\selectfont}
\DeclareRobustCommand{\mseries}{\fontseries{m}\selectfont}
\DeclareRobustCommand{\mbseries}{\fontseries{mb}\selectfont}
\DeclareRobustCommand{\bseries}{\fontseries{b}\selectfont}
\DeclareRobustCommand{\ebseries}{\fontseries{eb}\selectfont}
\DeclareTextFontCommand{\textul}{\ulseries}
\DeclareTextFontCommand{\textl}{\lseries}
\DeclareTextFontCommand{\textm}{\mseries}
\DeclareTextFontCommand{\textmb}{\mbseries}
\DeclareTextFontCommand{\textb}{\bseries}
\DeclareTextFontCommand{\texteb}{\ebseries}

\begin{document}

\sffamily
\textul{Abc Thin} {\ulseries Thin}

\textl{Abc Light} {\lseries Light}

\textm{Abc Light} {\mseries Light}

Abc Regular

\textmb{Abc SemiBold} {\mbseries SemiBold}

\textb{Abc Bold} {\bseries Bold}

\texteb{Abc ExtraBold} {\ebseries ExtraBold}

\end{document}

我收到此警告

LaTeX 字体警告:输入行 53 上的字体形状为 TU/lmss/m/n'。TU/lmss/ul/n' undefined (Font)
using

LaTeX 字体警告:输入行 55 上的字体形状为 TU/lmss/m/n'。TU/lmss/l/n' undefined (Font)
using

LaTeX 字体警告:输入行 61 上的字体形状为 TU/lmss/m/n'。TU/lmss/mb/n' undefined (Font)
using

LaTeX 字体警告:输入行 65 上的字体形状为 TU/lmss/m/n'。TU/lmss/eb/n' undefined (Font)
using

而这个结果,这显然不是我想要的。

例子

答案1

问题是我没有选择罗马字体系列,而是选择了无衬线字体,正如埃格尔在评论中。然而,在我看来,仍然存在一个谜团:为什么如果我不放,xelatex 会抛出错误UprightFont = ...

但这是最终的结果

\documentclass[10pt]{article}

\usepackage{fontspec}

\setmainfont{RobotoSlab}[
  Path = fonts/Roboto_Slab/,
  Extension = .ttf,
  UprightFont = *-Regular,
  %-- Upright --%
  FontFace={ul}{n}{Font=*-Thin},
  FontFace={l}{n}{Font=*-Light},
  FontFace={m}{n}{Font=*-Regular},
  FontFace={b}{n}{Font=*-Bold},
]

\setmonofont{RobotoMono}[
  Path = fonts/Roboto_Mono/,
  Extension = .ttf,
  UprightFont = *-Regular,
  %-- Upright --%
  FontFace={ul}{n}{Font=*-Thin},
  FontFace={l}{n}{Font=*-Light},
  FontFace={m}{n}{Font=*-Regular},
  FontFace={mb}{n}{Font=*-Medium},
  FontFace={b}{n}{Font=*-Bold},
  % %-- Italic --%
  FontFace={l}{it}{Font=*-LightItalic},
  FontFace={m}{it}{Font=*-Italic},
  FontFace={mb}{it}{Font=*-MediumItalic},
  FontFace={b}{it}{Font=*-BoldItalic},
]

\setsansfont{Roboto}[
  Path = fonts/Roboto/,
  Extension = .ttf,
  UprightFont = *-Regular,
  %-- Upright --%
  FontFace={ul}{n}{Font=*-Thin},
  FontFace={l}{n}{Font=*-Light},
  FontFace={m}{n}{Font=*-Regular},
  FontFace={mb}{n}{Font=*-Medium},
  FontFace={b}{n}{Font=*-Bold},
  FontFace={eb}{n}{Font=*-Black},
  % %-- Italic --%
  FontFace={ul}{it}{Font=*-ThinItalic},
  FontFace={l}{it}{Font=*-LightItalic},
  FontFace={m}{it}{Font=*-Italic},
  FontFace={mb}{it}{Font=*-MediumItalic},
  FontFace={b}{it}{Font=*-BoldItalic},
  FontFace={eb}{it}{Font=*-BlackItalic},
]

\DeclareRobustCommand{\ulseries}{\fontseries{ul}\selectfont}
\DeclareRobustCommand{\lseries}{\fontseries{l}\selectfont}
\DeclareRobustCommand{\mseries}{\fontseries{m}\selectfont}
\DeclareRobustCommand{\mbseries}{\fontseries{mb}\selectfont}
\DeclareRobustCommand{\bseries}{\fontseries{b}\selectfont}
\DeclareRobustCommand{\ebseries}{\fontseries{eb}\selectfont}
\DeclareTextFontCommand{\textul}{\ulseries}
\DeclareTextFontCommand{\textl}{\lseries}
\DeclareTextFontCommand{\textm}{\mseries}
\DeclareTextFontCommand{\textmb}{\mbseries}
\DeclareTextFontCommand{\textb}{\bseries}
\DeclareTextFontCommand{\texteb}{\ebseries}

\begin{document}

\textul{Abc Thin} {\ulseries Thin} \par
\textl{Abc Light} {\lseries Light} \par
\textm{Abc Regular} {\mseries Regular} \par
\textb{Abc Bold} {\bseries Bold} \par
\ttfamily
\textul{Abc Thin} {\ulseries Thin} \par
\textl{Abc Light} {\lseries Light} \par
\textm{Abc Regular} {\mseries Regular} \par
\textmb{Abc Medium} {\mbseries Medium} \par
\textb{Abc Bold} {\bseries Bold} \par
\itshape
\textl{Abc Light} {\lseries Light} \par
\textm{Abc Regular} {\mseries Regular} \par
\textmb{Abc Medium} {\mbseries Medium} \par
\textb{Abc Bold} {\bseries Bold} \par
\sffamily\upshape
\textul{Abc Thin} {\ulseries Thin} \par
\textl{Abc Light} {\lseries Light} \par
\textm{Abc Regular} {\mseries Regular} \par
\textmb{Abc SemiBold} {\mbseries SemiBold} \par
\textb{Abc Bold} {\bseries Bold} \par
\texteb{Abc Black} {\ebseries Black} \par
\itshape
\textul{Abc Thin} {\ulseries Thin} \par
\textl{Abc Light} {\lseries Light} \par
\textm{Abc Regular} {\mseries Regular} \par
\textmb{Abc SemiBold} {\mbseries SemiBold} \par
\textb{Abc Bold} {\bseries Bold} \par
\texteb{Abc Black} {\ebseries Black} \par

\end{document}

这就是结果。

结果

希望将来能够对某人有所帮助。

如果 egreg 想将他的评论作为答案,我会很乐意接受。

答案2

很好的自我回答!我还有一点要补充:LaTeX 中字体粗细的官方名称是:

  • 超轻:ul
  • 额外的光线:el
  • 光:l
  • 半光:sl
  • 中号/普通/书本m
  • 半粗体:sb
  • 大胆的:b
  • 特别粗体:eb
  • 超粗体:ub

这些与可选的宽度类别相结合,形成一个系列。官方宽度类别为:

  • 超浓缩(50%)uc
  • 极浓缩版(65.5%)ec
  • 浓缩版(75%)c
  • 半浓缩(87.5%)sc
  • 中等(100%)m
  • 半膨胀 (112.5%)sx
  • 扩展 (125%)x
  • 额外扩展 (150%)ex
  • 超扩展(200%)ux

粗细等级后跟宽度等级形成字体系列。(中等宽度通常被省略。)因此,{bx}{it}粗体扩展斜体,{sbc}{sl}半粗体压缩倾斜/倾斜。

尽管您可以使用任意字母字符串作为系列和形状名称并且fontspec不会出现任何问题,但如果您打算\textl在不止一种字体上使用类似命令,最好使用标准名称。您还可以简化从一些 NFSS 包(例如)的迁移nfssext-cfr

按照这些惯例,半粗体应该是sb而不是mb,而细体可以是ulel

由于查找信息很麻烦,fontspec手册认可了这种方案但没有描述它,并在 LaTeX2e 的“LaTeX 字体选择”文档中给出了一个脚注。该文件说,“只要有可能,你应该使用LaTeX 伴侣因为这样可以更轻松地将新字体与现有字体组合在一起。”这是 Frank Mittelbach 和 Michel Goossens 编写的书,由 Addison_Wesley 出版。信息在第二版第 414 页。

附言

感谢您提供“字体安装”文档的链接,其中还列出了和{mb}之间{m}以及{sb}{db}之间的{sb}系列{b}。我看到一些软件包(例如)nfssext-cfr支持它们。对于具有单独的 Regular/Book、Medium、Semibold 和 Bold 粗细或 Semibold、Demibold 和 Bold 粗细的字体系列,使用这些系列是个好主意。事实上,如果您想在同一文档中使用所有这些不同的粗细,而很多人认为您不应该这样做。

但是,如果 Regular 和 Bold 之间只有一种字体粗细,我个人建议将其命名为{sb},即使官方名称是 Medium 或 Demibold。Computer Modern Demi 就是这么做的。或者您甚至可以定义{mb}{sb}并且{db}对于每个字体系列,即使 和{sb}相同并且{mb}{db}相同{b},这样您就可以\fontseries{mb}自由使用并且总是得到一些合理的结果。当然,如果您不关心与其他软件包的兼容性或能够在序言中用另一个字体系列替换该字体系列,您可以随意命名它。

相关内容