我想使用 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,用于替换字形one
,one.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
解决方案。