功能文件小指南

功能文件小指南

Bringhurst 在第 10 章中敦促我们印刷风格元素:版本 4.0如果需要,修复字体文件。请参阅下面使用章节标题的章节摘要。

Bringhurst 建议修改字体文件,这样修复就永远完成了。但我认为对于某些修复,我们可以使用 LuaTeX 中的功能文件。这样可以更轻松地从安装了全系统字体的计算机传输项目。

我请求帮助来确定可以使用功能文件纠正什么,并显示一个示例文件。(将这个问题变成社区维基会更好吗?)

可能需要修复的问题列表

  1. 信纸

    有时字形完全错误。通常是由于缺少从其他字体中获取的字形。在这种情况下,唯一的可能性是使用字体编辑器。使用功能文件则不可能。

  2. 提示

    提示并非易事,有时会出错或完全缺失。在这种情况下,唯一的可能性是使用字体编辑器。使用功能文件则不可能。

  3. 垂直位置

    某些字符的垂直位置(特别是 +、-、破折号等)可以改进。是否可以使用功能文件来修复它?

  4. 西贝林

    这是框内字形轮廓左右两侧的空白区域。Bringhurst 说他通常必须修复这些值以修复字母和标点符号之间的空间(他将自己的风格描述为介于英国和法国印刷传统之间)。可以/应该使用功能文件来完成吗?(该microtype软件包可以实现法语排版风格。它是否为此使用了字距校正?)

  5. 字符替换

    有些字符可能处于不适当的编码位置。我猜这可以用 GSUB 规则来解决。

  6. 字距调整

    关于字距调整不当,这个论坛的观众还不知道!这个问题很简单;我甚至可以自己回答 :-)

第 10 章摘要

10 修饰字体

10.1 法律考虑

10.1 在调整数字字体之前检查许可证

10.2 伦理与美学考虑

!0.2.1 如果没有坏...

10.2.2 如果字体不协调,请一劳永逸地修复

10.2.3 首先尊重字体,其次尊重字形,第三尊重字体设计师,第四尊重铸造厂

10.2.4 继续修复

10.3 完善字符集

10.3.1 如果有缺陷的字形,则

10.3.2 如果您经常需要的文本图形、连字或其他字形不在基础字体中,请将它们安装在那里

10.3.3 如果你需要的字形完全缺失,那么就把它们

10.3.4 检查并纠正侧向弯曲

10.3.5 优化字距调整表

10.3.6 检查字距调整

10.4 提示

10.4.1 如果字体在低分辨率下看起来不好,请检查提示

10.5 命名约定

答案1

功能文件小指南

使用功能文件,您可以在查找中定义两种类型的操作:用sub其他字形替换 ( ) 字形和定位 ( pos) 字形。不可能的是修改字母形式或添加缺失的字形。此外,功能文件无法纠正错误的编码。在这种情况下,唯一能做的就是用字体中的另一个字形替换一个字形,这样至少视觉外观符合预期。

简单查找

最简单的定位就是字距调整:

lookup mykern {
  pos A V -70; # 'pos' is short for the keyword 'position'
  pos T e -100;
} mykern;

可以进行 1:1、n:1(连字符)、1:n 替换

lookup mysmallcaps {
  sub u by v.sc;  # have a v shaped smallcap glyph instead of a u-shaped one; with copy/paste this gets copied as "v"!
} mysmallcaps;

lookup myligatures {
  sub a e by ae; # 'sub' is short for the keyword 'substitute'
} myligatures;

lookup unligate {
  sub f_f_l by f f l;
} unligate;

上下文查找

更复杂的查找可以定义操作发生的上下文:

lookup myordinals {
  sub one s' by s.sups;
  sub s.sups t' by t.sups;
} myordinals;

lookup kernwithdiacritics {
  pos T' 50 e acutecomb;  # this is accumulative to a previous kern of T e
} kernwithdiacritics;

使用关键字,ignore可以从替换中排除上下文。如果 e 后面没有字母 AZ 或 az,则以下将用词尾形式替换 e:

lookup finals {
  ignore sub e' [A-Z a-z]; # the content inside the brackets is a "glyph class"
  sub e' by e.fina;
} finals;

高级定位

字距查找中的两种位置参数都是短格式。完整格式为<xplacement yplacement xadvance yadvance>。例如,使用以下命令调整上标字形的垂直位置:

lookup mysuperscript {
 pos e.sups <0 50 0 0>;  # e.sups is positioned 50 design-units higher
} mysuperscript;

为了说明这一点,让我们调整带有多音调重音的希腊字母 Η。在第一个例子中,它是带有重音符号的 Eta(Ὴ,需要左侧的空格),在第二个例子中,我们添加了 iota 附加符号(ῌ 需要右侧的空格。xplacement将字形的图像按给定值移动而不更改其框,xadvance更改字形框的大小:

lookup greekaccents1 {
 pos Eta' <79 0 79 0> gravecomb.grk;
} greekaccents1;

lookup greekaccents2 {
 pos Eta' <0 0 200 0> ypogegrammeni.cap;
 pos Eta' <79 0 279 0> ypogegrammeni.cap gravecomb.grk;
} greekaccents1;

重要的:

  • 可以通过功能访问查找,其中一个功能可以激活一个或多个查找,而不同的功能可以激活相同的查找:
    feature gacc { # featurenames 是四个字母的标签
      查找 greekaccents1;
      查找 greekaccents2;
    } gacc;
  • 查找应用于需要定义的语言系统,但请确保该系统存在于字体中。语言系统可以在功能文件的开头定义,它们将应用于所有后续功能中的查找。如果只需要在特定语言系统中应用查找,则必须在功能内明确执行:
    语言系统 DFLT dflt;
    语言系统希腊语 dflt;
    语言系统 latn dflt;
    语言系统 latn TRK;

    特征 mkrn {
      lookup mykern; # 这将应用于上述所有语言系统
    } mkrn;

    功能 itrk {
      拉丁文脚本;
        语言 TRK exclude_dflt;
          查找 turkish_i {
            sub i.sc by i.sc dotaccent; # 这只适用于拉丁字母的土耳其语
          } 土耳其语;
    } 它rk;
  • 正如您上面所看到的,查找可以单独定义或嵌套在功能内部。
  • 对于更大的任务,您可以定义字形类(例如,在查找之前):
    @letters = [az aacute eacute adieresis odieresis];
    @LETTERS = [AZ Aacute Eacute Adieresis Odieresis];
  • 确保使用字体中显示的字形名称。这可能比较棘手,您可能需要在字体编辑器中打开字体或使用某些工具将其转储(有人知道更直接的方法吗?)例如,字形名称 Delta 可以指希腊字母或同一 Adob​​e 规范的不同版本中的符号。此外,字体设计师可以使用与 Adob​​e 建议不同的名称来命名字形。

答案2

以下是我的经历中的三个例子:

有时,字体的罗马体和斜体中都有旧式数字,但该onum功能仅适用于罗马体。 Didot LT Pro 就是这样一种字体,其旧式斜体数字可以通过以下方式轻松访问:

\documentclass{article}
\usepackage{filecontents,fontspec}

\begin{filecontents*}{didot.fea}
languagesystem DFLT dflt;
languagesystem latn dflt;

# fix for italic
feature inum {
  sub zero by zero.onum;
  sub one by one.onum;
  sub two by two.onum;
  sub three by three.onum;
  sub four by four.onum;
  sub five by five.onum;
  sub six by six.onum;
  sub seven by seven.onum;
  sub eight by eight.onum;
  sub nine by nine.onum;
} inum;
\end{filecontents*}

\setmainfont[FeatureFile={didot.fea},
  UprightFeatures={Numbers=OldStyle},
  ItalicFeatures={RawFeature={+inum}}]
  {Didot LT Pro}
\begin{document}
1234567890 \textit{1234567890}
\end{document}

有时字体有连字,但该liga功能未定义。Freundschafts Antiqua 就是一个例子。您可以这样使用连字:

\documentclass{article}
\usepackage{filecontents,fontspec}

\begin{filecontents*}{frnd.fea}
languagesystem DFLT dflt;
languagesystem latn dflt;

feature liga {
  sub \f \i by \fi;
  sub \f \l by \fl;
} liga;
\end{filecontents*}

\setmainfont[FeatureFile={frnd.fea},
  ItalicFont={FreundschaftsKursivA}]
  {FreundschaftsAnt}
\begin{document}
fine flowers
\end{document}

请注意,您不必说RawFeature={+liga},因为 fontspec 默认启用该功能。

Hermecito 是一种既没有liga也没有sups定义的字体,尽管它有连字和上部数字。它的小写字母受到 Freundschafts Antiqua 使用的修复类型的不利影响,但更冗长的方法有效:

\documentclass{article}
\usepackage{filecontents,fontspec,realscripts}

\begin{filecontents*}{herm.fea}
languagesystem DFLT dflt;
languagesystem latn dflt;

feature liga {
  sub \f \f by \ff;
  sub \f \i by \fi;
  sub \f \l by \fl;
  sub \f \f \i by \ffi;
  sub \f \f \l by \ffl;
} liga;

feature sups {
  sub \zero by \zerosuperior;
  sub \one by \onesuperior;
  sub \two by \twosuperior;
  sub \three by \threesuperior;
  sub \four by \foursuperior;
  sub \five by \fivesuperior;
  sub \six by \sixsuperior;
  sub \seven by \sevensuperior;
  sub \eight by \eightsuperior;
  sub \nine by \ninesuperior;
} sups;
\end{filecontents*}

\setmainfont[FeatureFile={herm.fea},
  SmallCapsFont={HermecitoSpecial SC},
  RawFeature={+liga},
  SmallCapsFeatures={RawFeature={-liga}}]
  {HermecitoSpecial}
\begin{document}
finest,\footnote{One} fluffiest\footnote{Two} felines\footnote{Three}
\end{document}

答案3

kerning可以使用此功能文件来修改两个字母之间的距离:

mykern.fea

languagesystem DFLT dflt;
languagesystem latn dflt;
feature kern {
pos \V  \A -800;
} kern;

单位是em/1000。

相关内容