的文件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