![系列/系列/形状区别的起源是什么?](https://linux22.com/image/355720/%E7%B3%BB%E5%88%97%2F%E7%B3%BB%E5%88%97%2F%E5%BD%A2%E7%8A%B6%E5%8C%BA%E5%88%AB%E7%9A%84%E8%B5%B7%E6%BA%90%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我最近开始学习 LaTeX,刚刚发现了字体命令和声明之间的区别。作为一名学习者,命令遵循常规的文本模式,而声明区分 -family/-series/-shape,这似乎没有必要那么复杂。
我的问题是:是什么促使字体声明中 -family、-series 和 -shape 之间有所区别?在另一个问题的答案中(\bfseries 与 \textbf 的关系与 \textsf 的关系相同在本书中,我详细解释了 LaTeX 中不同字体元素的含义以及它们如何组合在一起,但我的问题是为什么它们一开始要这样设计。
答案1
该特定术语由 Rainer Schöpf 和 Frank Mittelbach 在新字体选择方案中引入,该方案最初是 LaTeX 2.09 的变体版本,但后来成为 LaTeX2e 版本的核心。
但它与字体的自然语言术语相当接近,也与后来的系统(如 CSS)使用的分类相当接近,用于在网络上设置字体样式,其中有font-family: Times Roman
、font-weight: bold
、font-style: italic
。
在原始的 TeX 字体加载器中,每种字体都是一个独特的实体,因此计算机现代罗马字体和计算机现代粗体之间没有任何联系,因此您无法要求当前字体的粗体版本。
NFSS 根据系列、系列(粗细)等对字体进行分类,因此如果您使用\itshape
它,只需改变形状it
,然后尝试选择一种其他所有属性均不变的字体。
声明是较低级别的形式,每个声明都被命名以告诉您它更改了哪个“轴”,因此\itshape
将形状轴更改为it
等等。\text...
接受参数的命令形式会更改一个或多个字体轴并在插入自动斜体校正方面做一些工作,并且在这些情况下,我们删除了名称的轴部分,只是为了使名称更短。
原始 LaTeX2.09/NFSS 版本在内部字体声明中引入了轴的术语,但没有用户级命令\bfseries
,而是\textbf
重新定义了现有的“两个字母”命令,例如\bf
表示当前字体的粗体版本,而不是无论上下文如何都始终切换到相同的粗体字体。这导致了一些兼容性问题和混乱,当重新完成 NFSS 以生成 LaTeX2e 时,引入了当前命令集,表示\bfseries
当前字体的粗体版本,并且\bf
不是默认定义的,而是在标准类中定义为(或多或少)\normalfont\bfseries
给出向后兼容的定义,该定义始终选择默认文档字体的粗体版本。
答案2
在旧时代(NFSS 之前),LaTeX 有命令\it
、\sl
和,它们彼此并不“正交”。因此\bf
\tt
Normal {\it italic {\bf boldface {\sl slanted}}}
会以直立字体打印“粗体”,以倾斜字体和中等重量打印“倾斜”。
为了获得粗体斜体,您必须使用相当低级的接口定义自己的命令:低到需要几个声明。还请记住,字体以格式保存,因此如果您想使用“任意”字体系列,则必须基于完全重写的文件\font
创建全新的格式。latexwhatever
lfonts.tex
当 AMS 启动将 AMS-TeX 移植到 LaTeX 的项目时,这种情况是无法接受的。需要一种全新的、更灵活的字体选择方案;Frank Mittelbach 和 Rainer Schöpf 负责移植工作,并设计了“新字体选择方案”(版本 1),它比旧字体加载器强大得多。
而不是像下面这样的代码
% ten point
\font\tenrm = cmr10 % roman
\font\tenmi = cmmi10 % math italic
\skewchar\tenmi ='177 % for placement of accents
%\font\tenmib = cmmib10 % bold math italic
\font\tensy = cmsy10 % math symbols
\skewchar\tensy ='60 % for placement of math accents
%\font\tensyb = cmbsy10 % bold symbols
\font\tenit = cmti10 % text italic
\font\tensl = cmsl10 % slanted
\font\tenbf = cmbx10 % extended bold
%\font\tenbfs = cmbxsl10 % extended bold slanted
\font\tentt = cmtt10 % typewriter
\hyphenchar\tentt = -1 % suppress hyphenation in \tt font
%\font\tentti = cmitt10 % italic typewriter
%\font\tentts = cmsltt10 % slanted typewriter
\font\tensf = cmss10 % sans serif
%\font\tensfi = cmssi10 % italic sans serif
%\font\tensfb = cmssbx10 % bold sans serif
%\font\tensc = cmcsc10 % small caps
\font\tenly = lasy10 % LaTeX symbols
%\font\tenlyb = lasyb10 % bold LaTeX symbols
%\font\tenuit = cmu10 % unslanted italic
在定义特定大小的字体时,它们将字体分组为类;每个类都定义了各种大小。有些条目被注释,因为存在一种(相当原始的)按需加载字体的机制,但无论如何都必须在格式中预定义(如果没有预加载)字体。
而不必定义
\fivrm \sixrm \sevrm \egtrm \ninrm \tenrm
\elvrm \twlvrm \frtnrm \svtnrm \twtyrm \twfvrm
对于中等大小的直立字体,他们决定将名字改为
\cmr/m/n/5 \cmr/m/n/6 \cmr/m/n/7 \cmr/m/n/8 \cmr/m/n/9 \cmr/m/n/10
\cmr/m/n/11 \cmr/m/n/12 \cmr/m/n/14 \cmr/m/n/17 \cmr/m/n/20 \cmr/m/n/25
(名称中带有斜线,这需要一些技巧),因此名称编码了字体的各种特征。最重要的是,家庭:该格式仍然预装了基本字体,但可以根据需求加载全新的字体系列。
系列、系列和形状的概念当然来自于 Unix 的 X 窗口系统对字体的分类。
这种方案允许字体选择命令相互正交,因此
Normal {\itshape italic {\bfseries boldface {\slshape slanted}}}
将以粗体斜体打印“boldface”(如果字体可用),并以粗体斜体打印“slanted”(同样,如果字体可用)。我使用“可用”的含义是对应于外部字体文件并在宏文件中定义。
NFSS 第 2 版引入了字体的概念编码,因此系统现在将正常字体识别为\OT1/cmr/m/n/10
。
在名称中对特征进行编码可以实现更精细的选择:粗体字体称为\OT1/cmr/bx/n/10
,因此,为了从当前字体中选择它,只需拆开名称并更改为m
,bx
这最终就是\bfseries
所做的,本质上是调用\fontseries{bx}\selectfont
。
获取粗体斜体的声明可以定义为
\DeclareRobustCommand{\bfitfont}{\fontseries{bx}\fontshape{it}\selectfont}
该计划还引入了\DeclareTextFontCommand
,所以我们有类似
\DeclareTextFontCommand{\textbf}{\bfseries}
你可以\textbfit
定义
\DeclareTextFontCommand{\textbfit}{\bfseries\itshape}
称为\textbfit{word}
。
NFSS 的另一个重要方面是在单独的.fd
文件中定义字体系列的可能性,其中给定系列的每种可用字体类别(按特征分组)都是通过选择各种大小的外部字体文件来定义的。
这样的方案非常灵活,可以fontspec
将其挂钩:当您说时\setmainfont{FONT}
,文件的内容就会.fd
动态创建。