如何告诉 fontspec 使用特定字形变体(不是 CharacterVariant)加载字体

如何告诉 fontspec 使用特定字形变体(不是 CharacterVariant)加载字体

我想使用 OpenType福尔科恩xetex它的“1”给我带来了问题。它有一个替代字形(其字形名称为“one.ss01”),我可以通过触发它StylisticSet={1}。但这也会改变其他字符:

otfinfo -g Vollkorn-Regular.otf | grep "ss01"

J.ss01
Jcircumflex.ss01
Q.ss01
uni1E9E.ss01
a.ss01
aacute.ss01
abreve.ss01
acircumflex.ss01
adieresis.ss01
agrave.ss01
amacron.ss01
aogonek.ss01
aring.ss01
atilde.ss01
g.ss01
gbreve.ss01
gcircumflex.ss01
gcommaaccent.ss01
gdotaccent.ss01
one.ss01
three.ss01
zero.lf.ss01
three.lf.ss01
seven.lf.ss01
zero.tf.ss01
three.tf.ss01
seven.tf.ss01
slash.ss01

我不想要替代的“a”。我可以在本地使用,\XeTeXglyph如本例所示:

\documentclass{article}

\usepackage{fontspec}

% http://vollkorn-typeface.com/

\setmainfont{Vollkorn}[%StylisticSet={1},
ItalicFont={* Italic}, BoldFont={* Bold}, BoldItalicFont={* Bold Italic}]

% \def\VollkornFamilyName{Vollkorn(0)}
% utiliser \XeTeXglyph 381 en testant \f@family ?
% non je ne vais pas rendre le 1 actif !
% et c'est \XeTeXglyph 309 en italic

\begin{document}

1234567890

\bfseries 1234567890

\itshape 1234567890

\mdseries 1234567890

\normalfont

\XeTeXglyph 381 234567890

\bfseries \XeTeXglyph 381 234567890

% need to change glyph number

\itshape \XeTeXglyph 309 234567890

\mdseries \XeTeXglyph 309 234567890

\end{document}

% Local Variables:
% TeX-engine: xetex
% End:

全数字

但是我需要将其应用于从其他来源生成的非手动输入的文档,并且将其激活似乎有些危险1,因为它会测试字体系列和字体形状等......并通过\XeTeXglyph或仅插入合适的字形\string1

正如预期的那样,使 1 处于活动状态有很多问题,其中包括\XeTeXglyph无法在数学模式下使用,或者在\csname- - 只是一个选项

有没有one.ss01无需激活完整版即可使用字形的解决方案StylisticSet

我查看了fontspec手册,发现了这个概念CharacterVariant,但是 OpenType 字体中没有这样的功能:

Fonts$ otfinfo -f Vollkorn-Regular.otf 
aalt    Access All Alternates
calt    Contextual Alternates
case    Case-Sensitive Forms
cpsp    Capital Spacing
dlig    Discretionary Ligatures
dnom    Denominators
frac    Fractions
kern    Kerning
liga    Standard Ligatures
lnum    Lining Figures
mark    Mark Positioning
numr    Numerators
onum    Oldstyle Figures
ordn    Ordinals
pnum    Proportional Figures
salt    Stylistic Alternates
ss01    Stylistic Set 1
sups    Superscript
tnum    Tabular Figures

答案1

FontForge 的以下 Python 脚本创建

#!/usr/bin/env python2
import fontforge
import os.path

font_files =  [
    'Vollkorn-Bold.otf',
    'Vollkorn-BoldItalic.otf',
    'Vollkorn-Italic.otf',
    'Vollkorn-Regular.otf',
    ]

def main():
    for font_file_name in font_files:        
        make_new_font(font_file_name)

def get_file_name_stem(font_file_name):
    name_without_directory = os.path.basename(font_file_name)
    name_stem = os.path.splitext(name_without_directory)[0]
    return name_stem

def make_new_font(font_file_name):
    name_stem = get_file_name_stem(font_file_name)
    feature_file_name = name_stem + '.fea'
    new_font_file_name = name_stem + '-ss02.otf'

    print('Font file: ' + font_file_name)
    font = fontforge.open(font_file_name)
    print('Font name: ' + font.fontname)
    print('=> ' + feature_file_name)
    font.generateFeatureFile(feature_file_name)

    print('Lookup names:')
    for lookup in font.gsub_lookups:
        print('  ' + lookup)

    lookup_ss01_name = "'ss01' Style Set 1 lookup 24"
    lookup_ss02_name = "'ss02' Style Set 2 lookup 25"
    subtable_ss02_name = "'ss02' Style Set 2 lookup 25 subtable"

    (type_name,
     flags,
     feature_script_lang_tuples) = font.getLookupInfo(lookup_ss01_name)

    print('Lookup(' + lookup_ss01_name + '): ')
    print('  Type: ' + type_name)
    print('  Flags: ' + ', '.join(flags))
    print('  Feature/Script/Languages: ')
    script_lang_ss01 = None
    for (feature, script_lang) in feature_script_lang_tuples:
        print('    ' + feature + ':')
        for (script, languages) in script_lang:
            language_list = ', '.join([l.rstrip() for l in languages])
            print('      ' + script + ': ' + language_list)
        if feature == 'ss01':
            script_lang_ss01 = script_lang
    if script_lang_ss01 is None:
        raise('Feature ss01 not found in Style Set 1')
    print('  Subtables:')
    for subtable in font.getLookupSubtables(lookup_ss01_name):
        print('    ' + subtable)

    font.addLookup(lookup_ss02_name,
                   type_name,
                   flags,
                   (('ss02', script_lang_ss01),),
                   lookup_ss01_name)
    font.addLookupSubtable(lookup_ss02_name, subtable_ss02_name)

    glyph_one = [glyph for glyph in font.selection.select('one').byGlyphs][0]
    glyph_one.addPosSub(subtable_ss02_name, 'one.ss01')

    print('=> ' + new_font_file_name)
    font.generate(new_font_file_name)

if __name__ == '__main__':
    main()

它生成文件Vollkorn-Regular-ss02.otf,...带有附加样式集 02,用于替换字形oneone.ss01并且可以激活:

\documentclass{article}

\usepackage{fontspec}

\setmainfont{Vollkorn-Regular-ss02.otf}[
  StylisticSet=2,
  ItalicFont=Vollkorn-Italic-ss02.otf,
  BoldFont=Vollkorn-Bold-ss02.otf,
  BoldItalicFont=Vollkorn-BoldItalic-ss02.otf,
]

\begin{document}

1234567890

\bfseries 1234567890

\itshape 1234567890

\mdseries 1234567890

\end{document}

使用 XeLaTeX 的结果:

结果

答案2

我在这里发布的方法与lualatex@WillRobertson 在他的评论

我在我的工作目录文件中创建了testvollkornlua.fff内容(我不确定前两行是否需要,并且带有 Kerning 的内容是为了测试目的)。

languagesystem DFLT dflt;
languagesystem latn dflt;

feature oneb {
  sub one by one.ss01;
} oneb;

# Kerning for testing only
feature kern {
pos \A \Y +5000;
pos \a \y +10000;
} kern;

然后使用以下来源:

\documentclass{article}

\usepackage{fontspec}

\setmainfont{Vollkorn}[%
    FeatureFile={\jobname.fff},
    RawFeature={+oneb},
    UprightFont={* -Regular},
    ItalicFont={* -Italic}, 
    BoldFont={* -Bold}, 
    BoldItalicFont={* -BoldItalic},
    Extension={.otf}]

\begin{document}

1234567890

\bfseries 1234567890

\itshape 1234567890

\mdseries 1234567890

AY

ay

\end{document}

% Local Variables:
% TeX-engine: luatex
% End:

我获得了所需的输出(最后两行用于最初检查是否找到了功能文件,以防我对功能“oneb”的编码不正确;我确实有一个语法错误(缺少“oneb;”),结果没有任何功能,因此它没有帮助,在我修复它之前,我不知道是否找到了功能文件。

在此处输入图片描述

仍希望得到xelatex解决方案。

相关内容