\setmainfont 与 \fontspec

\setmainfont 与 \fontspec

的文件fontspec包装相当混乱:

本节涉及可用于选择字体的各种命令。

\fontspec{⟨font name⟩}[⟨font features⟩]
\setmainfont{⟨font name⟩}[⟨font features⟩]
\setsansfont{⟨font name⟩}[⟨font features⟩]
\setmonofont{⟨font name⟩}[⟨font features⟩]
\newfontfamily⟨cmd⟩{⟨font name⟩}[⟨font features⟩]

这些是此包的主要字体选择命令。该 \fontspec命令选择一次性使用的字体;所有其他命令应用于定义文档中使用的标准字体,如示例 1 所示。

上述示例 1 并没有真正阐明很多内容。在阅读了几页之后,我仍然无法理解这些命令的确切效果以及为什么需要和\setmainfont\fontspec大多数示例都提供了\setmainfont

为什么像

\setmainfont[UprightFont={* 10 Regular},
             BoldFont={* 10 Bold},
             ItalicFont={* 10 Italic},
             BoldItalicFont={* 10 Bold Italic},
             SmallCapsFont={* Caps 10 Regular},
             SlantedFont={* Slanted 10 Regular}
            ]{Latin Modern Roman}

还不够吗?什么时候用\setmainfont,什么时候用\fontspec

答案1

我的印象是,用法\fontspec从一开始就被误解了。当我与 Will Robertson 讨论这个话题时,他承认这不是最好的选择。

根据 LaTeX3 编程指南,内部函数可以具有用户级接口。的所有主要命令fontspec都是根据共享内部函数定义的:

\setmainfont
\setsansfont
\setmonofont
\newfontfamily
\newfontface

\fontspec

前五个比最后一个功能更多,因为它们设置了文档中一般使用的字体,而\fontspec直接访问较低级别的功能。

可以\fontspec在序言中使用,但它不会做任何事情,因为\begin{document}执行\normalfont。因此

\documentclass{article}
\usepackage{fontspec}

\fontspec{EB Garamond}

\begin{document}

Abc def ghi \textit{abc def ghi}

\end{document}

你只会得到默认的 Latin Modern 字体。

\documentclass{article}
\usepackage{fontspec}

\begin{document}
\fontspec{EB Garamond}

Abc def ghi \textit{abc def ghi}

\end{document}

但随后的\normalfont声明将返回到拉丁现代字体。最重要的是,这将违背“抽象范式”:在文档中,您永远不应该(嗯,几乎不应该)选择特定字体,而是发出高级指令,例如\textit\emph\sffamily。我会更加严格,并且说\textit\sffamily应该很少出现在写得很好的打字稿中。

抽象是好的,因为它将细节放在特定的位置(序言),因此文档尽可能独立于字体选择。

下面是一个常见的例子,虽然它与这个问题没有严格的联系。假设你正在写一篇计算机科学的论文,并且你有几个多字母的函数标识符。你选择把它们设置为无衬线字体,然后愉快地输入$\mathsf{foo}(x)=2$。现在你给你的导师看了一份初稿,她扬起眉毛告诉你“这是怎么排版函数名的?大家都知道它们应该是 Fraktur 字体!”然后是疯狂的搜索和替换:每个\mathsf命令都变成了\mathfrak。几周后,你的导师说:“我有没有告诉你,在最近的一次会议上,一位同事说服我函数名应该是粗体罗马字体?”但是等等!如果你在序言中

以 开始,并在文档中使用,那么更改为 Fraktur 或粗体只需要\newcommand{\func}[1]{\mathsf{#1}}$\func{foo}(x)$文件中的变更。

现在,\setmainfont{EB Garamond}不仅在开始文档时发出相当于的\fontspec{EB Garamond}一部分\normalfont,而且还设置了所有字体相关的基础设施。

\documentclass{article}
\usepackage{fontspec}

\setmainfont{EB Garamond}

\begin{document}

Abc def ghi \textit{abc def ghi}

\end{document}

文档可能会在某些部分(例如标题)使用无衬线字体,因此最好使用\setsansfont来决定使用哪种字体作为无衬线字体。对于等宽字体(如果在文档中使用的话),情况也是如此。您不想这样做

{\fontspec{Futura}This is sans serif}

每次你想用无衬线字体打印一些东西时,你会这样做吗?相反,你\setsansfont{Futura}在序言中这样做,并使用\textsf{This is sans serif}(与上面的警告当然是关于抽象。

如果你需要辅助字体,例如当你首选的文本字体(当然是 Comic Sans)不支持希腊语时,需要一种希腊语字体来显示那几个希腊语单词,那么你可以这样做

\newfontfamily{\greekfont}{GFS Artemisia}[Scale=MatchUppercase]

{\greekfont ελληνική λέξη}并在文档中使用。

使用{\fontspec{GFS Artemisia}ελληνική λέξη}会做同样的事情,代价是每次发出命令时都要重新计算这个系列的所有字体(嗯,其实不是,但效率比序言中\fontspec低得多)。\newfontfamily

答案2

\setmainfont设置主文档字体和常见变体(如粗体和斜体)(如果可用),因此通常在序言中使用。\fontspec实际上是在使用时选择一次性字体。

\documentclass{article}

\usepackage{fontspec}

\setmainfont{Tex Gyre Termes}

\begin{document}


one two \textbf{three}

four {\fontspec{Arial Bold} six} seven

\end{document}

在此处输入图片描述

相关内容