Fix OTS warning about `maxp.maxSizeOfInstructions`.
[ttfautohint.git] / doc / fontspec-xetex.sty
blobfd5b2844c20c4943ff584529c7ba31062c4611b5
1 %%
2 %% This is file `fontspec-xetex.sty',
3 %% generated with the docstrip utility.
4 %%
5 %% The original source files were:
6 %%
7 %% fontspec.dtx (with options: `fontspec,XE')
8 %% fontspec-code-load.dtx (with options: `fontspec,XE')
9 %% fontspec-code-vars.dtx (with options: `fontspec,XE')
10 %% fontspec-code-msg.dtx (with options: `fontspec,XE')
11 %% fontspec-code-opening.dtx (with options: `fontspec,XE')
12 %% fontspec-code-fontload.dtx (with options: `fontspec,XE')
13 %% fontspec-code-interfaces.dtx (with options: `fontspec,XE')
14 %% fontspec-code-user.dtx (with options: `fontspec,XE')
15 %% fontspec-code-api.dtx (with options: `fontspec,XE')
16 %% fontspec-code-internal.dtx (with options: `fontspec,XE')
17 %% fontspec-code-opentype.dtx (with options: `fontspec,XE')
18 %% fontspec-code-graphite.dtx (with options: `fontspec,XE')
19 %% fontspec-code-keyval.dtx (with options: `fontspec,XE')
20 %% fontspec-code-feat-opentype.dtx (with options: `fontspec,XE')
21 %% fontspec-code-scripts.dtx (with options: `fontspec,XE')
22 %% fontspec-code-lang.dtx (with options: `fontspec,XE')
23 %% fontspec-code-feat-aat.dtx (with options: `fontspec,XE')
24 %% fontspec-code-enc.dtx (with options: `fontspec,XE')
25 %% fontspec-code-math.dtx (with options: `fontspec,XE')
26 %% fontspec-code-closing.dtx (with options: `fontspec,XE')
27 %% fontspec-code-xfss.dtx (with options: `fontspec,XE')
28 %% ------------------------------------------------
29 %% The FONTSPEC package <wspr.io/fontspec>
30 %% ------------------------------------------------
31 %% Copyright 2004-2017 Will Robertson, LPPL "maintainer"
32 %% Copyright 2009-2013 Khaled Hosny
33 %% ------------------------------------------------
34 %% This package is free software and may be redistributed and/or modified under
35 %% the conditions of the LaTeX Project Public License, version 1.3c or higher
36 %% (your choice): <http://www.latex-project.org/lppl/>.
37 %% ------------------------------------------------
38 %%^^A%% fontspec.dtx -- part of FONTSPEC <wspr.io/fontspec>
39 %%^^A%% Metadata for the package, including files and versioning
41 \RequirePackage{xparse}
42 \ProvidesExplPackage{fontspec-xetex}%
43 {2020/02/21}{2.7i}{Font selection for XeLaTeX and LuaLaTeX}
45 %%^^A%% fontspec-code-load.dtx -- part of FONTSPEC <wspr.io/fontspec>
46 %%^^A%% fontspec-code-vars.dtx -- part of FONTSPEC <wspr.io/fontspec>
47 \bool_new:N \l__fontspec_firsttime_bool
48 \bool_new:N \l__fontspec_nobf_bool
49 \bool_new:N \l__fontspec_noit_bool
50 \bool_new:N \l__fontspec_nosc_bool
51 \bool_new:N \l__fontspec_check_bool
52 \bool_new:N \l__fontspec_tfm_bool
53 \bool_new:N \l__fontspec_atsui_bool
54 \bool_new:N \l__fontspec_ot_bool
55 \bool_new:N \l__fontspec_mm_bool
56 \bool_new:N \l__fontspec_harfbuzz_bool
57 \bool_new:N \l__fontspec_graphite_bool
58 \bool_new:N \l__fontspec_fontcfg_bool
59 \bool_set_true:N \l__fontspec_fontcfg_bool
60 \bool_new:N \g__fontspec_math_euler_bool
61 \bool_new:N \g__fontspec_math_lucida_bool
62 \bool_new:N \g__fontspec_pkg_euler_loaded_bool
63 \bool_new:N \g__fontspec_cfg_bool
64 \bool_new:N \g__fontspec_math_bool
65 \bool_new:N \g__fontspec_euenc_bool
66 \bool_new:N \l__fontspec_tmpa_bool
67 \bool_new:N \l__fontspec_disable_defaults_bool
68 \bool_new:N \l__fontspec_alias_bool
69 \bool_new:N \l__fontspec_external_bool
70 \bool_new:N \l__fontspec_defining_encoding_bool
71 \bool_new:N \l__fontspec_scriptlang_exist_bool
72 \bool_new:N \g__fontspec_em_normalise_slant_bool
73 \bool_new:N \l__fontspec_proceed_bool
74 \bool_new:N \l__fontspec_never_check_bool
75 \int_new:N \l__fontspec_script_int
76 \int_new:N \l__fontspec_language_int
77 \int_new:N \l__fontspec_strnum_int
78 \int_new:N \l__fontspec_tmp_int
79 \int_new:N \l__fontspec_tmpa_int
80 \int_new:N \l__fontspec_tmpb_int
81 \int_new:N \l__fontspec_tmpc_int
82 \int_new:N \l__fontspec_em_int
83 \int_new:N \l__fontspec_emdef_int
84 \int_new:N \l__fontspec_strong_int
85 \int_new:N \l__fontspec_strongdef_int
86 \fp_new:N \l__fontspec_tmpa_fp
87 \fp_new:N \l__fontspec_tmpb_fp
88 \dim_new:N \l__fontspec_tmpa_dim
89 \dim_new:N \l__fontspec_tmpb_dim
90 \dim_new:N \l__fontspec_tmpc_dim
91 \seq_new:N \l__fontspec_bf_series_seq
92 \clist_new:N \g__fontspec_default_fontopts_clist
93 \clist_new:N \g__fontspec_all_keyval_modules_clist
94 \clist_new:N \l__fontspec_sizefeat_clist
95 \clist_set:Nn \l__fontspec_sizefeat_clist {Size={-}}
96 \clist_new:N \l__fontspec_extensions_clist
97 \clist_new:N \l__fontspec_fontopts_clist
98 \clist_new:N \l__fontspec_family_fontopts_clist
99 \clist_new:N \l__fontspec_all_features_clist
100 \clist_new:N \l__fontspec_leftover_clist
101 \clist_new:N \l__fontspec_keys_leftover_clist
102 \clist_new:N \l__fontspec_sizing_leftover_clist
103 \clist_new:N \l__fontspec_fontfeat_clist
104 \clist_new:N \l__fontspec_fontfeat_curr_clist
105 \clist_new:N \l__fontspec_arg_clist
106 \clist_new:N \l__fontspec_this_feat_clist
107 \clist_new:N \l__fontspec_fontfeat_up_clist
108 \clist_new:N \l__fontspec_fontfeat_bf_clist
109 \clist_new:N \l__fontspec_fontfeat_it_clist
110 \clist_new:N \l__fontspec_fontfeat_bfit_clist
111 \clist_new:N \l__fontspec_fontfeat_sl_clist
112 \clist_new:N \l__fontspec_fontfeat_bfsl_clist
113 \clist_new:N \l__fontspec_fontfeat_sc_clist
114 \prop_new:N \g__fontspec_fontopts_prop
115 \prop_new:N \l__fontspec_nfss_prop
116 \prop_new:N \l__fontspec_nfssfont_prop
117 \prop_new:N \g__fontspec_OT_features_prop
118 \prop_new:N \g__fontspec_all_opentype_feature_names_prop
119 \prop_new:N \g__fontspec_em_prop
120 \prop_new:N \g__fontspec_strong_prop
121 \prop_new:N \g__fontspec_fontid_family_prop
122 \prop_new:N \g__fontspec_family_int_prop
123 \tl_new:N \l_fontspec_family_tl
124 \tl_new:N \g_fontspec_encoding_tl
125 \tl_new:N \l_fontspec_fontname_tl
126 \tl_clear_new:N \UTFencname
127 \tl_clear_new:N \cyrillicencoding
128 \tl_clear_new:N \latinencoding
129 \tl_new:N \l__fontspec_renderer_tl
130 \tl_new:N \l__fontspec_mode_tl
131 \tl_new:N \l__fontspec_shaper_tl
132 \tl_new:N \g__fontspec_defined_shapes_tl
133 \tl_new:N \g__fontspec_single_feat_tl
134 \tl_new:N \l__fontspec_basename_tl
135 \tl_new:N \g__fontspec_curr_series_tl
136 \tl_new:N \l__fontspec_curr_fontname_tl
137 \tl_new:N \l__fontspec_curr_bfname_tl
138 \tl_new:N \l__fontspec_ext_filename_tl
139 \tl_new:N \l__fontspec_extension_tl
140 \tl_new:N \l__fontspec_font_path_tl
141 \tl_new:N \l__fontspec_fontid_tl
142 \tl_new:N \l__fontspec_fontname_tl
143 \tl_new:N \l__fontspec_options_tl
144 \tl_new:N \l__fontspec_saved_fontname_tl
145 \tl_new:N \l__fontspec_prev_unicode_name_tl
146 \tl_new:N \g__fontspec_nfss_enc_tl
147 \tl_new:N \g__fontspec_nfss_family_tl
148 \tl_new:N \l__fontspec_nfss_sc_tl
149 \tl_new:N \l__fontspec_nfss_tl
150 \tl_new:N \l__fontspec_nfss_fam_tl
151 \tl_new:N \l__fontspec_size_tl
152 \tl_new:N \l__fontspec_sizedfont_tl
153 \tl_new:N \l__fontspec_this_font_tl
154 \tl_new:N \l__fontspec_ttc_index_tl
155 \tl_new:N \l__fontspec_smcp_shape_tl
156 \tl_new:N \l__fontspec_emshape_query_tl
157 \tl_new:N \l__fontspec_em_switch_tl
158 \tl_new:N \l__fontspec_strong_switch_tl
159 \tl_new:N \l__fontspec_tmp_tl
160 \tl_new:N \l__fontspec_tmpa_tl
161 \tl_new:N \l__fontspec_tmpb_tl
162 \tl_new:N \l__fontspec_em_tmp_tl
163 \tl_new:N \l__fontspec_strong_tmp_tl
164 \tl_new:N \g__fontspec_mathrm_tl
165 \tl_new:N \g__fontspec_bfmathrm_tl
166 \tl_new:N \g__fontspec_mathsf_tl
167 \tl_new:N \g__fontspec_mathtt_tl
168 \tl_gset:Nn \g__fontspec_mathrm_tl {\rmdefault}
169 \tl_gset:Nn \g__fontspec_mathsf_tl {\sfdefault}
170 \tl_gset:Nn \g__fontspec_mathtt_tl {\ttdefault}
171 \tl_new:N \l__fontspec_family_label_tl
172 \tl_new:N \l__fontspec_fake_slant_tl
173 \tl_new:N \l__fontspec_fake_embolden_tl
174 \tl_new:N \l__fontspec_fontname_up_tl
175 \tl_new:N \l__fontspec_fontname_bf_tl
176 \tl_new:N \l__fontspec_fontname_it_tl
177 \tl_new:N \l__fontspec_fontname_bfit_tl
178 \tl_new:N \l__fontspec_fontname_sl_tl
179 \tl_new:N \l__fontspec_fontname_bfsl_tl
180 \tl_new:N \l__fontspec_fontname_sc_tl
181 \tl_new:N \l__fontspec_script_tl
182 \tl_new:N \l__fontspec_script_name_tl
183 \tl_set:Nn \l__fontspec_script_name_tl {CustomDefault}
184 \tl_new:N \l__fontspec_lang_tl
185 \tl_new:N \l__fontspec_lang_name_tl
186 \tl_set:Nn \l__fontspec_lang_name_tl {Default}
187 \tl_new:N \l__fontspec_scale_tl
188 \tl_new:N \l__fontspec_hyphenchar_tl
189 \tl_new:N \l__fontspec_hexcol_tl
190 \tl_new:N \l__fontspec_opacity_tl
191 \tl_new:N \l__fontspec_optical_size_tl
192 \tl_new:N \l__fontspec_mapping_tl
193 \tl_new:N \l__fontspec_punctspace_adjust_tl
194 \tl_new:N \l__fontspec_wordspace_adjust_tl
195 \tl_new:N \l__fontspec_postadjust_tl
196 \tl_const:Nn \c__fontspec_hexcol_tl {000000}
197 \tl_const:Nn \c__fontspec_opacity_tl {FF~}
198 \tl_const:Nn \c__fontspec_postadjust_tl { \l__fontspec_wordspace_adjust_tl \l__fontspec_punctspace_adjust_tl }
199 \tl_new:N \g__fontspec_rawfeatures_sclist
200 \tl_new:N \l__fontspec_pre_feat_sclist
201 \tl_new:N \l__fontspec_rmfamily_family_tl
202 \tl_new:N \l__fontspec_sffamily_family_tl
203 \tl_new:N \l__fontspec_ttfamily_family_tl
204 \tl_new:N \l__fontspec_rmfamily_encoding_tl
205 \tl_new:N \l__fontspec_sffamily_encoding_tl
206 \tl_new:N \l__fontspec_ttfamily_encoding_tl
208 %%^^A%% fontspec-code-msg.dtx -- part of FONTSPEC <wspr.io/fontspec>
209 \cs_new:Npn \__fontspec_error:n { \msg_error:nn {fontspec} }
210 \cs_new:Npn \__fontspec_error:nn { \msg_error:nnn {fontspec} }
211 \cs_new:Npn \__fontspec_error:nx { \msg_error:nnx {fontspec} }
212 \cs_new:Npn \__fontspec_warning:n { \msg_warning:nn {fontspec} }
213 \cs_new:Npn \__fontspec_warning:nx { \msg_warning:nnx {fontspec} }
214 \cs_new:Npn \__fontspec_warning:nxx { \msg_warning:nnxx {fontspec} }
215 \cs_new:Npn \__fontspec_info:n { \msg_info:nn {fontspec} }
216 \cs_new:Npn \__fontspec_info:nx { \msg_info:nnx {fontspec} }
217 \cs_new:Npn \__fontspec_info:nxx { \msg_info:nnxx {fontspec} }
218 \cs_new:Npn \__fontspec_trace:n { \msg_trace:nn {fontspec} }
219 \cs_generate_variant:Nn \msg_new:nnn {nnx}
220 \cs_generate_variant:Nn \msg_new:nnnn {nnxx}
221 \cs_new:Nn \__fontspec_msg_new:nnn
222 { \msg_new:nnx {#1} {#2} { \tl_trim_spaces:n {#3} } }
223 \cs_new:Nn \__fontspec_msg_new:nnnn
224 { \msg_new:nnxx {#1} {#2} { \tl_trim_spaces:n {#3} } { \tl_trim_spaces:n {#4} } }
225 \char_set_catcode_space:n {32}
226 \__fontspec_msg_new:nnn {fontspec} {only-inside-encdef}
228 \exp_not:N#1can only be used in the second argument
229 to \string\DeclareUnicodeEncoding.
231 \__fontspec_msg_new:nnn {fontspec} {no-size-info}
233 Size information must be supplied.\\
234 For example, SizeFeatures={Size={8-12},...}.
236 \__fontspec_msg_new:nnnn {fontspec} {font-not-found}
238 The font "#1" cannot be found.
241 A font might not be found for many reasons.\\
242 Check the spelling, where the font is installed etc. etc.\\\\
243 When in doubt, ask someone for help!
245 \__fontspec_msg_new:nnnn {fontspec} {rename-feature-not-exist}
247 The feature #1 doesn't appear to be defined.
250 It looks like you're trying to rename a feature that doesn't exist.
252 \__fontspec_msg_new:nnn {fontspec} {no-glyph}
254 '#1' does not contain glyph #2.
256 \__fontspec_msg_new:nnnn {fontspec} {euler-too-late}
258 The euler package must be loaded BEFORE fontspec.
261 fontspec only overwrites euler's attempt to
262 define the maths text fonts if fontspec is
263 loaded after euler. Type <return> to proceed
264 with incorrect \string\mathit, \string\mathbf, etc.
266 \__fontspec_msg_new:nnnn {fontspec} {no-xcolor}
268 Cannot load named colours without the xcolor package.
271 Sorry, I can't do anything to help. Instead of loading
272 the color package, use xcolor instead.
274 \__fontspec_msg_new:nnnn {fontspec} {unknown-color-model}
276 Error loading colour `#1'; unknown colour model.
279 Sorry, I can't do anything to help. Please report this error
280 to my developer with a minimal example that causes the problem.
282 \__fontspec_msg_new:nnnn {fontspec} {not-in-addfontfeatures}
284 The "#1" font feature cannot be used in \string\addfontfeatures.
287 This is due to how TeX loads fonts; such settings
288 are global so adding them mid-document within a group causes
289 confusion. You'll need to define multiple font families to achieve
290 what you want.
292 \__fontspec_msg_new:nnn {fontspec} {tu-clash}
294 I have found the tuenc.def encoding definition file but the TU encoding is not
295 defined by the LaTeX2e kernel; attempting to correct but you really should update
296 to the latest version of LaTeX2e.
298 \__fontspec_msg_new:nnn {fontspec} {tu-missing}
300 The TU encoding seems to be missing; please update to the latest version of LaTeX2e.
302 \__fontspec_msg_new:nnn {fontspec} {addfontfeatures-ignored}
304 \string\addfontfeature (s) ignored \msg_line_context:;
305 it cannot be used with a font that wasn't selected by a fontspec command.\\
307 The current font is "\use:c{font@name}".\\
308 \int_compare:nTF { \clist_count:n {#1} = 1 }
309 { The requested feature is "#1". }
310 { The requested features are "#1". }
312 \__fontspec_msg_new:nnn {fontspec} {feature-option-overwrite}
314 Option '#2' of font feature '#1' overwritten.
316 \__fontspec_msg_new:nnn {fontspec} {ot-tag-too-long}
318 OpenType tag '#1' is too long; script, language, and feature tags must be four characters or fewer.
320 \__fontspec_msg_new:nnn {fontspec} {aat-feature-not-exist}
322 '\l_keys_key_tl=\l_keys_value_tl' feature not supported
323 for AAT font '\l_fontspec_fontname_tl'.
325 \__fontspec_msg_new:nnn {fontspec} {aat-feature-not-exist-in-font}
327 AAT feature '\l_keys_key_tl=\l_keys_value_tl' (#1) not available
328 in font '\l_fontspec_fontname_tl'.
330 \__fontspec_msg_new:nnn {fontspec} {icu-feature-not-exist}
332 '\l_keys_key_tl=\l_keys_value_tl' feature not supported
333 for OpenType font '\l_fontspec_fontname_tl'
335 \__fontspec_msg_new:nnn {fontspec} {icu-feature-not-exist-in-font}
337 OpenType feature '\l_keys_key_tl=\l_keys_value_tl' (#1) not available
338 for font '\l_fontspec_fontname_tl'
339 with script '\l__fontspec_script_name_tl' and language '\l__fontspec_lang_name_tl'.
341 \__fontspec_msg_new:nnn {fontspec} {no-opticals}
343 '#1' doesn't appear to have an Optical Size axis.
345 \__fontspec_msg_new:nnn {fontspec} {language-not-exist}
347 Language '#1' not available
348 for font '\l_fontspec_fontname_tl'
349 with script '\l__fontspec_script_name_tl'.
351 \__fontspec_msg_new:nnn {fontspec} {only-xetex-feature}
353 Ignored XeTeX-only feature: '#1'.
355 \__fontspec_msg_new:nnn {fontspec} {only-luatex-feature}
357 Ignored LuaTeX-only feature: '#1'.
359 \__fontspec_msg_new:nnn {fontspec} {unknown-renderer}
361 Renderer '#1' unknown. Assuming Harfbuzz with 'shaper=#1'.
362 Please raise a fontspec issue to add this shaper to the interface.
364 \__fontspec_msg_new:nnn {fontspec} {no-mapping}
366 Input mapping not supported in LuaTeX.
368 \__fontspec_msg_new:nnn {fontspec} {no-mapping-ligtex}
370 Input mapping not supported in LuaTeX.\\
371 Use "Ligatures=TeX" instead of "Mapping=tex-text".
373 \__fontspec_msg_new:nnn {fontspec} {cm-default-obsolete}
375 The "cm-default" package option is obsolete.
377 \__fontspec_msg_new:nnn {fontspec} {font-index-needs-ttc}
379 The "FontIndex" feature is only supported by TTC (TrueType Collection) fonts.\\
380 Feature ignored.
382 \__fontspec_msg_new:nnn {fontspec} {feat-cannot-remove}
384 The "#1" feature cannot be deactivated. Request ignored.
386 \__fontspec_msg_new:nnn {fontspec} {defining-font}
388 Font family '\g__fontspec_nfss_family_tl' created for font '#2'
389 with options [\l__fontspec_all_features_clist].\\
391 This font family consists of the following NFSS series/shapes:\\
392 \g__fontspec_defined_shapes_tl
394 \__fontspec_msg_new:nnn {fontspec} {no-font-shape}
396 Could not resolve font "#1" (it probably doesn't exist).
398 \__fontspec_msg_new:nnn {fontspec} {set-scale}
400 \l_fontspec_fontname_tl\space scale = \l__fontspec_scale_tl.
402 \__fontspec_msg_new:nnn {fontspec} {setup-math}
404 Adjusting the maths setup (use [no-math] to avoid this).
406 \__fontspec_msg_new:nnn {fontspec} {no-script}
408 Font "#1" does not contain requested Script "#2".
410 \__fontspec_msg_new:nnn {fontspec} {opa-twice}
412 Opacity set twice, in both Colour and Opacity.\\
413 Using specification "Opacity=#1".
415 \__fontspec_msg_new:nnn {fontspec} {opa-twice-col}
417 Opacity set twice, in both Opacity and Colour.\\
418 Using an opacity specification in hex of "#1/FF".
420 \__fontspec_msg_new:nnn {fontspec} {bad-colour}
422 Bad colour declaration "#1".
423 Colour must be one of:\\
424 * a named xcolor colour\\
425 * a six-digit hex colour RRGGBB\\
426 * an eight-digit hex colour RRGGBBTT with opacity
428 \char_set_catcode_ignore:n {32}
430 %%^^A%% fontspec-code-opening.dtx -- part of FONTSPEC <wspr.io/fontspec>
431 \DeclareOption{cm-default}
433 \__fontspec_warning:n {cm-default-obsolete}
435 \DeclareOption {math} { \bool_gset_true:N \g__fontspec_math_bool }
436 \DeclareOption {no-math} { \bool_gset_false:N \g__fontspec_math_bool }
437 \DeclareOption {config} { \bool_gset_true:N \g__fontspec_cfg_bool }
438 \DeclareOption {no-config}{ \bool_gset_false:N \g__fontspec_cfg_bool }
439 \DeclareOption {euenc} { \bool_gset_true:N \g__fontspec_euenc_bool }
440 \DeclareOption {tuenc} { \bool_gset_false:N \g__fontspec_euenc_bool }
441 \DeclareOption {quiet}
443 \msg_redirect_module:nnn { fontspec } { warning } { info }
444 \msg_redirect_module:nnn { fontspec } { info } { none }
446 \DeclareOption{silent}
448 \msg_redirect_module:nnn { fontspec } { warning } { none }
449 \msg_redirect_module:nnn { fontspec } { info } { none }
451 \ExecuteOptions{config,math,tuenc}
452 \ProcessOptions*
453 \bool_if:NF \g__fontspec_euenc_bool
455 \file_if_exist:nTF {tuenc.def}
457 \cs_if_exist:cF {T@TU}
459 \__fontspec_warning:n {tu-clash}
460 \DeclareFontEncoding{TU}{}{}
461 \DeclareFontSubstitution{TU}{lmr}{m}{n}
465 \__fontspec_warning:n {tu-missing}
466 \bool_gset_true:N \g__fontspec_euenc_bool
469 \bool_if:NTF \g__fontspec_euenc_bool
471 \tl_gset:Nn \g_fontspec_encoding_tl {EU1}
473 { \tl_gset:Nn \g_fontspec_encoding_tl { TU } }
474 \tl_set:Nn \rmdefault {lmr}
475 \tl_set:Nn \sfdefault {lmss}
476 \tl_set:Nn \ttdefault {lmtt}
477 \RequirePackage[\g_fontspec_encoding_tl]{fontenc}
478 \tl_set_eq:NN \UTFencname \g_fontspec_encoding_tl % for xunicode if needed
479 \tl_if_in:NnT \@filelist {.cls} { \normalsize }
480 \tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl
481 \tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl
482 \AtBeginDocument
484 \tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl
485 \tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl
487 \bool_if:NT \g__fontspec_euenc_bool
489 \RequirePackage{xunicode}
491 \cs_new:Npn \FontspecSetCheckBoolTrue { \bool_set_true:N \l__fontspec_check_bool }
492 \cs_new:Npn \FontspecSetCheckBoolFalse { \bool_set_false:N \l__fontspec_check_bool }
493 \cs_new:Nn \__fontspec_keys_set_known:nnN
495 \keys_set_known:nnN {#1} {#2} #3
497 \cs_generate_variant:Nn \__fontspec_keys_set_known:nnN {nx}
498 \cs_new:Nn \__fontspec_int_mult_truncate:Nn
500 \int_set:Nn #1 { \__dim_eval:w #2 #1 \__dim_eval_end: }
502 \cs_generate_variant:Nn \int_set:Nn {Nv}
503 \cs_generate_variant:Nn \keys_set:nn {nx}
504 \cs_generate_variant:Nn \keys_set_known:nnN {nx}
505 \cs_generate_variant:Nn \prop_put:Nnn {Nxx}
506 \cs_generate_variant:Nn \prop_put:Nnn {NxV}
507 \cs_generate_variant:Nn \prop_gput_if_new:Nnn {NxV}
508 \cs_generate_variant:Nn \prop_gput:Nnn {Nxn}
509 \cs_generate_variant:Nn \prop_get:NnNT {NxN}
510 \cs_generate_variant:Nn \prop_get:NnNTF {NxN}
511 \cs_generate_variant:Nn \str_if_eq:nnTF {nv}
512 \cs_generate_variant:Nn \tl_if_empty_p:n {e}
513 \cs_generate_variant:Nn \tl_if_empty:nTF {x}
514 \cs_generate_variant:Nn \tl_if_empty:nF {x}
515 \cs_generate_variant:Nn \tl_if_empty:nF {f}
516 \cs_generate_variant:Nn \tl_if_eq:nnT {ox}
517 \cs_generate_variant:Nn \tl_replace_all:Nnn {Nnx}
519 %%^^A%% fontspec-code-fontload.dtx -- part of FONTSPEC <wspr.io/fontspec>
521 \cs_set:Npn \__fontspec_primitive_font_set:Nnn #1#2#3
523 \font #1 = #2 ~at~ \dim_eval:n {#3} \scan_stop:
525 \cs_set:Npn \__fontspec_primitive_font_gset:Nnn #1#2#3
527 \global \font #1 = #2 ~at~ \dim_eval:n {#3} \scan_stop:
529 \cs_set:Npn \__fontspec_font_suppress_not_found_error:
531 \int_set:Nn \suppressfontnotfounderror {1}
533 \prg_set_conditional:Nnn \__fontspec_primitive_font_if_null:N {p,TF,T,F}
535 \ifx #1 \nullfont
536 \prg_return_true:
537 \else
538 \prg_return_false:
541 \prg_set_conditional:Nnn \__fontspec_primitive_font_set:Nnn {TF,T,F}
543 \__fontspec_primitive_font_set:Nnn #1 {#2} {#3}
544 \__fontspec_primitive_font_if_null:NTF #1 {\prg_return_false:} {\prg_return_true:}
546 \prg_set_conditional:Nnn \__fontspec_primitive_font_gset:Nnn {TF,T,F}
548 \__fontspec_primitive_font_gset:Nnn #1 {#2} {#3}
549 \__fontspec_primitive_font_if_null:NTF #1 {\prg_return_false:} {\prg_return_true:}
551 \cs_set:Npn \__fontspec_primitive_font_set:Onn { \exp_last_unbraced:No \__fontspec_primitive_font_set:Nnn }
552 \cs_set:Npn \__fontspec_primitive_font_set:OnnF { \exp_last_unbraced:No \__fontspec_primitive_font_set:NnnF }
553 \cs_set:Npn \__fontspec_primitive_font_gset:Onn { \exp_last_unbraced:No \__fontspec_primitive_font_gset:Nnn }
554 \cs_set:Npn \__fontspec_primitive_font_gset:OnnF { \exp_last_unbraced:No \__fontspec_primitive_font_gset:NnnF }
555 \prg_set_conditional:Nnn \__fontspec_primitive_font_if_exist:n {TF,T,F}
557 \group_begin:
558 \__fontspec_font_suppress_not_found_error:
559 \__fontspec_primitive_font_set:Nnn \l__fontspec_primitive_font {#1} { \f@size pt - 1sp }
560 \__fontspec_primitive_font_if_null:NTF \l__fontspec_primitive_font
561 { \group_end: \prg_return_false: }
562 { \group_end: \prg_return_true: }
564 \prg_new_conditional:Nnn \__fontspec_primitive_font_glyph_if_exist:Nn {p,TF,T,F}
566 \tex_iffontchar:D #1 #2 \scan_stop:
567 \prg_return_true:
568 \else:
569 \prg_return_false:
570 \fi:
572 \cs_new:Nn \__fontspec_primitive_font_set_hyphenchar:Nn
574 \tex_hyphenchar:D #1 = #2 \scan_stop:
576 \cs_new_eq:NN \__fontspec_primitive_font_get_name:N \fontname
577 \cs_new:Npn \__fontspec_primitive_font_current_name:
579 \__fontspec_primitive_font_get_name:N \tex_font:D
582 %%^^A%% fontspec-code-interfaces.dtx -- part of FONTSPEC <wspr.io/fontspec>
584 \NewDocumentCommand \fontspec { O{} m O{} }
586 \__fontspec_main_fontspec:nn {#1,#3} {#2}
587 \ignorespaces
589 \NewDocumentCommand \setmainfont { O{} m O{} }
591 \__fontspec_main_setmainfont:nn {#1,#3} {#2}
592 \ignorespaces
594 \NewDocumentCommand \setsansfont { O{} m O{} }
596 \__fontspec_main_setsansfont:nn {#1,#3} {#2}
597 \ignorespaces
599 \NewDocumentCommand \setmonofont { O{} m O{} }
601 \__fontspec_main_setmonofont:nn {#1,#3} {#2}
602 \ignorespaces
604 \NewDocumentCommand \setmathrm { O{} m O{} }
606 \__fontspec_main_setmathrm:nn {#1,#3} {#2}
608 \NewDocumentCommand \setboldmathrm { O{} m O{} }
610 \__fontspec_main_setboldmathrm:nn {#1,#3} {#2}
612 \NewDocumentCommand \setmathsf { O{} m O{} }
614 \__fontspec_main_setmathsf:nn {#1,#3} {#2}
616 \NewDocumentCommand \setmathtt { O{} m O{} }
618 \__fontspec_main_setmathtt:nn {#1,#3} {#2}
620 \NewDocumentCommand \setromanfont { O{} m O{} }
622 \__fontspec_main_setmainfont:nn {#1,#3} {#2}
624 \NewDocumentCommand \newfontfamily { m O{} m O{} }
626 \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \NewDocumentCommand
628 \NewDocumentCommand \renewfontfamily { m O{} m O{} }
630 \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \RenewDocumentCommand
632 \NewDocumentCommand \setfontfamily { m O{} m O{} }
634 \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \DeclareDocumentCommand
636 \NewDocumentCommand \providefontfamily { m O{} m O{} }
638 \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \ProvideDocumentCommand
640 \NewDocumentCommand \newfontface { m O{} m O{} }
642 \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \NewDocumentCommand
644 \NewDocumentCommand \renewfontface { m O{} m O{} }
646 \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \RenewDocumentCommand
648 \NewDocumentCommand \setfontface { m O{} m O{} }
650 \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \DeclareDocumentCommand
652 \NewDocumentCommand \providefontface { m O{} m O{} }
654 \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \ProvideDocumentCommand
656 \NewDocumentCommand \defaultfontfeatures { t+ o m }
658 \IfNoValueTF {#2}
659 { \__fontspec_set_default_features:nn {#1} {#3} }
660 { \__fontspec_set_font_default_features:nnn {#1} {#2} {#3} }
661 \ignorespaces
663 \NewDocumentCommand \addfontfeatures {m}
665 \__fontspec_main_addfontfeatures:n {#1}
667 \NewDocumentCommand \addfontfeature {m}
669 \__fontspec_main_addfontfeatures:n {#1}
671 \NewDocumentCommand \newfontfeature {mm}
673 \__fontspec_main_newfontfeature:nn {#1} {#2}
675 \NewDocumentCommand \newAATfeature {mmmm}
677 \__fontspec_main_newAATfeature:nnnn {#1} {#2} {#3} {#4}
679 \NewDocumentCommand \newopentypefeature {mmm}
681 \__fontspec_main_newopentypefeature:nnn {#1} {#2} {#3}
683 \NewDocumentCommand \newICUfeature {mmm}
685 \__fontspec_main_newopentypefeature:nnn {#1} {#2} {#3}
687 \NewDocumentCommand \aliasfontfeature {mm}
689 \__fontspec_main_aliasfontfeature:nn {#1} {#2}
691 \NewDocumentCommand \aliasfontfeatureoption {mmm}
693 \__fontspec_main_aliasfontfeatureoption:nnn {#1} {#2} {#3}
695 \NewDocumentCommand \newfontscript {mm}
697 \fontspec_new_script:nn {#1} {#2}
699 \NewDocumentCommand \newfontlanguage {mm}
701 \fontspec_new_lang:nn {#1} {#2}
703 \NewDocumentCommand \DeclareFontExtensions {m}
705 \__fontspec_main_DeclareFontExtensions:n {#1}
707 \NewDocumentCommand \IfFontFeatureActiveTF {mmm}
709 \__fontspec_main_IfFontFeatureActiveTF:nnn {#1} {#2} {#3}
711 \AtBeginDocument
713 \RenewDocumentCommand \oldstylenums {m}
715 \__fontspec_main_oldstylenums:n {#1}
718 \NewDocumentCommand \liningnums {m}
720 \__fontspec_main_liningnums:n {#1}
723 %%^^A%% fontspec-code-user.dtx -- part of FONTSPEC <wspr.io/fontspec>
725 \cs_new:Nn \__fontspec_main_fontspec:nn
727 \fontspec_set_family:Nnn \f@family {#1} {#2}
728 \fontencoding { \g__fontspec_nfss_enc_tl }
729 \selectfont
731 \cs_if_exist:NTF \@rmfamilyhook
733 \tl_put_right:Nn \@rmfamilyhook {\fontencoding \l__fontspec_rmfamily_encoding_tl}
734 \tl_put_right:Nn \@sffamilyhook {\fontencoding \l__fontspec_sffamily_encoding_tl}
735 \tl_put_right:Nn \@ttfamilyhook {\fontencoding \l__fontspec_ttfamily_encoding_tl}
738 \tl_replace_all:cnn { rmfamily~ } { \fontfamily }
739 { \fontencoding \l__fontspec_rmfamily_encoding_tl \fontfamily }
740 \tl_replace_all:cnn { sffamily~ } { \fontfamily }
741 { \fontencoding \l__fontspec_sffamily_encoding_tl \fontfamily }
742 \tl_replace_all:cnn { ttfamily~ } { \fontfamily }
743 { \fontencoding \l__fontspec_ttfamily_encoding_tl \fontfamily }
745 \tl_set:Nn \l__fontspec_rmfamily_encoding_tl { \encodingdefault }
746 \tl_set:Nn \l__fontspec_sffamily_encoding_tl { \encodingdefault }
747 \tl_set:Nn \l__fontspec_ttfamily_encoding_tl { \encodingdefault }
748 \cs_new:Nn \__fontspec_main_setmainfont:nn
750 \ifdefined\DeclareFontSeriesDefault
751 \DeclareFontSeriesDefault[rm]{bf}{\bfdefault}
753 \fontspec_set_family:Nnn \l__fontspec_rmfamily_family_tl {#1} {#2}
754 \tl_set_eq:NN \rmdefault \l__fontspec_rmfamily_family_tl
755 \tl_set_eq:NN \l__fontspec_rmfamily_encoding_tl \g__fontspec_nfss_enc_tl
756 \str_if_eq:eeT {\familydefault} {\rmdefault}
757 { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl }
758 \__fontspec_setmainfont_hook:nn {#1} {#2} % for unicode-math only
759 \normalfont
761 \cs_new:Nn \__fontspec_main_setsansfont:nn
763 \ifdefined\DeclareFontSeriesDefault
764 \DeclareFontSeriesDefault[sf]{bf}{\bfdefault}
766 \fontspec_set_family:Nnn \l__fontspec_sffamily_family_tl {#1} {#2}
767 \tl_set_eq:NN \sfdefault \l__fontspec_sffamily_family_tl
768 \tl_set_eq:NN \l__fontspec_sffamily_encoding_tl \g__fontspec_nfss_enc_tl
769 \str_if_eq:eeT {\familydefault} {\sfdefault}
770 { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl }
771 \__fontspec_setsansfont_hook:nn {#1} {#2} % for unicode-math only
772 \normalfont
774 \cs_new:Nn \__fontspec_main_setmonofont:nn
776 \ifdefined\DeclareFontSeriesDefault
777 \DeclareFontSeriesDefault[tt]{bf}{\bfdefault}
779 \fontspec_set_family:Nnn \l__fontspec_ttfamily_family_tl {#1} {#2}
780 \tl_set_eq:NN \ttdefault \l__fontspec_ttfamily_family_tl
781 \tl_set_eq:NN \l__fontspec_ttfamily_encoding_tl \g__fontspec_nfss_enc_tl
782 \str_if_eq:eeT {\familydefault} {\ttdefault}
783 { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl }
784 \__fontspec_setmonofont_hook:nn {#1} {#2} % for unicode-math only
785 \normalfont
787 \cs_new:Nn \__fontspec_main_setmathrm:nn
789 \fontspec_gset_family:Nnn \g__fontspec_mathrm_tl {#1} {#2}
790 \__fontspec_setmathrm_hook:nn {#1} {#2} % for unicode-math only
792 \cs_new:Nn \__fontspec_main_setboldmathrm:nn
794 \fontspec_gset_family:Nnn \g__fontspec_bfmathrm_tl {#1} {#2}
795 \__fontspec_setboldmathrm_hook:nn {#1} {#2} % for unicode-math only
797 \cs_new:Nn \__fontspec_main_setmathsf:nn
799 \fontspec_gset_family:Nnn \g__fontspec_mathsf_tl {#1} {#2}
800 \__fontspec_setmathsf_hook:nn {#1} {#2} % for unicode-math only
802 \cs_new:Nn \__fontspec_main_setmathtt:nn
804 \fontspec_gset_family:Nnn \g__fontspec_mathtt_tl {#1} {#2}
805 \__fontspec_setmathtt_hook:nn {#1} {#2} % for unicode-math only
807 \cs_set_eq:NN \__fontspec_setmainfont_hook:nn \use_none:nn
808 \cs_set_eq:NN \__fontspec_setsansfont_hook:nn \use_none:nn
809 \cs_set_eq:NN \__fontspec_setmonofont_hook:nn \use_none:nn
810 \cs_set_eq:NN \__fontspec_setmathrm_hook:nn \use_none:nn
811 \cs_set_eq:NN \__fontspec_setmathsf_hook:nn \use_none:nn
812 \cs_set_eq:NN \__fontspec_setmathtt_hook:nn \use_none:nn
813 \cs_set_eq:NN \__fontspec_setboldmathrm_hook:nn \use_none:nn
814 \@onlypreamble\setmathrm
815 \@onlypreamble\setboldmathrm
816 \@onlypreamble\setmathsf
817 \@onlypreamble\setmathtt
818 \tl_gset:Nn \g__fontspec_mathrm_tl {\rmdefault}
819 \tl_gset:Nn \g__fontspec_mathsf_tl {\sfdefault}
820 \tl_gset:Nn \g__fontspec_mathtt_tl {\ttdefault}
821 \cs_new:Nn \__fontspec_main_newfontfamily:NnnN
823 \fontspec_set_family:cnn { l__fontspec_ \cs_to_str:N #1 _family_tl } {#2} {#3}
824 \use:x
826 \exp_not:N #4 \exp_not:N #1 {}
828 \exp_not:N \fontfamily { \use:c { l__fontspec_ \cs_to_str:N #1 _family_tl } }
829 \exp_not:N \fontencoding { \g__fontspec_nfss_enc_tl }
830 \exp_not:N \selectfont
834 \cs_new:Nn \__fontspec_main_newfontface:NnnN
836 \__fontspec_main_newfontfamily:NnnN #1 { BoldFont={},ItalicFont={},SmallCapsFont={},#2 } {#3} #4
838 \cs_new:Nn \__fontspec_set_default_features:nn
840 \IfBooleanTF {#1} \clist_gput_right:Nn \clist_gset:Nn
841 \g__fontspec_default_fontopts_clist {#2}
843 \cs_new:Nn \__fontspec_set_font_default_features:nnn
845 \clist_map_inline:nn {#2}
847 \tl_if_single:nTF {##1}
848 { \tl_set:No \l__fontspec_tmp_tl { \cs:w l__fontspec_ \cs_to_str:N ##1 _family_tl\cs_end: } }
849 { \__fontspec_sanitise_fontname:Nn \l__fontspec_tmp_tl {##1} }
851 \IfBooleanTF {#1}
853 \prop_get:NVNF \g__fontspec_fontopts_prop \l__fontspec_tmp_tl \l__fontspec_tmpb_tl
854 { \tl_clear:N \l__fontspec_tmpb_tl }
855 \tl_put_right:Nn \l__fontspec_tmpb_tl {#3,}
856 \prop_gput:NVV \g__fontspec_fontopts_prop \l__fontspec_tmp_tl \l__fontspec_tmpb_tl
859 \tl_if_empty:nTF {#3}
860 { \prop_gremove:NV \g__fontspec_fontopts_prop \l__fontspec_tmp_tl }
861 { \prop_gput:NVn \g__fontspec_fontopts_prop \l__fontspec_tmp_tl {#3,} }
865 \cs_new:Nn \__fontspec_main_addfontfeatures:n
867 \fontspec_if_fontspec_font:TF
869 \group_begin:
870 \keys_set_known:nnN {fontspec-addfeatures} {#1} \l__fontspec_tmp_tl
871 \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {options} \l__fontspec_options_tl
872 \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {fontname} \l__fontspec_fontname_tl
873 \bool_set_true:N \l__fontspec_disable_defaults_bool
874 \use:x
876 \__fontspec_select_font_family:nn
877 { \l__fontspec_options_tl , #1 } {\l__fontspec_fontname_tl}
879 \group_end:
880 \fontfamily \g__fontspec_nfss_family_tl \selectfont
883 \__fontspec_warning:nx {addfontfeatures-ignored} {#1}
885 \ignorespaces
887 \cs_new:Nn \__fontspec_main_newfontfeature:nn
889 \keys_define:nn { fontspec }
891 #1 .code:n = { \__fontspec_update_featstr:n {#2} }
894 \cs_new:Nn \__fontspec_main_newAATfeature:nnnn
896 \keys_if_exist:nnF { fontspec } {#1}
897 { \__fontspec_define_aat_feature_group:n {#1} }
899 \keys_if_choice_exist:nnnT {fontspec} {#1} {#2}
900 { \__fontspec_warning:nxx {feature-option-overwrite} {#1} {#2} }
902 \__fontspec_define_aat_feature:nnnn {#1}{#2}{#3}{#4}
904 \cs_new:Nn \__fontspec_main_newopentypefeature:nnn
906 \keys_if_exist:nnF { fontspec / options } {#1}
907 { \__fontspec_define_opentype_feature_group:n {#1} }
909 \keys_if_choice_exist:nnnT {fontspec} {#1} {#2}
910 { \__fontspec_warning:nxx {feature-option-overwrite} {#1} {#2} }
912 \exp_args:Nnnx \__fontspec_define_opentype_feature:nnnnn
913 {#1} {#2} { \__fontspec_strip_plus_minus:n {#3} } {#3} {}
915 \cs_new:Nn \__fontspec_strip_plus_minus:n { \__fontspec_strip_plus_minus_aux:Nq #1 \q_nil }
916 \cs_new:Npn \__fontspec_strip_plus_minus_aux:Nq #1#2 \q_nil
918 \str_case:nnF {#1} { {+} {#2} {-} {#2} } {#1#2}
920 \cs_new:Nn \__fontspec_main_aliasfontfeature:nn
922 \bool_set_false:N \l__fontspec_alias_bool
924 \clist_map_inline:Nn \g__fontspec_all_keyval_modules_clist
926 \keys_if_exist:nnT {##1} {#1}
928 \bool_set_true:N \l__fontspec_alias_bool
929 \keys_define:nn {##1}
930 { #2 .code:n = { \keys_set:nn {##1} { #1 = {####1} } } }
934 \bool_if:NF \l__fontspec_alias_bool
935 { \__fontspec_warning:nx {rename-feature-not-exist} {#1} }
937 \cs_new:Nn \__fontspec_main_aliasfontfeatureoption:nnn
939 \bool_set_false:N \l__fontspec_alias_bool
941 \clist_map_inline:Nn \g__fontspec_all_keyval_modules_clist
943 \keys_if_exist:nnT { ##1 / #1 } {#2}
945 \bool_set_true:N \l__fontspec_alias_bool
946 \keys_define:nn { ##1 / #1 }
947 { #3 .code:n = { \keys_set:nn {##1} { #1 = {#2} } } }
950 \keys_if_exist:nnT { ##1 / #1 } {#2Reset}
952 \keys_define:nn { ##1 / #1 }
953 { #3Reset .code:n = { \keys_set:nn {##1} { #1 = {#2Reset} } } }
956 \keys_if_exist:nnT { ##1 / #1 } {#2Off}
958 \keys_define:nn { ##1 / #1 }
959 { #3Off .code:n = { \keys_set:nn {##1} { #1 = {#2Off} } } }
963 \bool_if:NF \l__fontspec_alias_bool
964 { \__fontspec_warning:nx {rename-feature-not-exist} {#1/#2} }
966 \cs_new:Nn \__fontspec_main_DeclareFontExtensions:n
968 \clist_set:Nn \l__fontspec_extensions_clist { #1 }
970 \__fontspec_main_DeclareFontExtensions:n {.otf,.ttf,.OTF,.TTF,.ttc,.TTC,.dfont}
971 \cs_new:Nn \__fontspec_main_IfFontFeatureActiveTF:nnn
973 \__fontspec_if_font_feature:nTF {#1} {#2} {#3}
975 \prg_new_conditional:Nnn \__fontspec_if_font_feature:n {TF}
977 \tl_gclear:N \g__fontspec_single_feat_tl
978 \group_begin:
979 \__fontspec_font_suppress_not_found_error:
980 \__fontspec_init:
981 \bool_set_true:N \l__fontspec_ot_bool
982 \bool_set_true:N \l__fontspec_never_check_bool
983 \bool_set_false:N \l__fontspec_firsttime_bool
984 \clist_clear:N \l__fontspec_fontfeat_clist
985 \__fontspec_get_features:n {#1}
986 \group_end:
989 \tl_if_empty:NTF \g__fontspec_single_feat_tl { \prg_return_false: }
991 \exp_args:NV \fontspec_if_current_feature:nTF \g__fontspec_single_feat_tl
992 { \prg_return_true: } { \prg_return_false: }
995 \cs_new_protected:Nn \__fontspec_main_oldstylenums:n
997 \group_begin:
998 \addfontfeature{Numbers=OldStyle}
1000 \group_end:
1002 \cs_new_protected:Nn \__fontspec_main_liningnums:n
1004 \group_begin:
1005 \addfontfeature{Numbers=Lining}
1007 \group_end:
1010 %%^^A%% fontspec-code-api.dtx -- part of FONTSPEC <wspr.io/fontspec>
1012 \prg_new_conditional:Nnn \fontspec_if_fontspec_font: {TF,T,F}
1014 \cs_if_exist:cTF {g__fontspec_fontinfo_ \f@family _prop} \prg_return_true: \prg_return_false:
1016 \prg_new_conditional:Nnn \fontspec_if_aat_feature:nn {TF,T,F}
1018 \fontspec_if_fontspec_font:TF
1020 \__fontspec_set_font_type:N \font
1021 \bool_if:NTF \l__fontspec_atsui_bool
1023 \__fontspec_make_AAT_feature_string:NnnTF \font {#1} {#2}
1024 \prg_return_true: \prg_return_false:
1027 \prg_return_false:
1031 \prg_return_false:
1034 \prg_new_conditional:Nnn \fontspec_if_opentype: {TF,T,F}
1036 \fontspec_if_fontspec_font:TF
1038 \__fontspec_set_font_type:N \font
1039 \bool_if:NTF \l__fontspec_ot_bool \prg_return_true: \prg_return_false:
1042 \prg_return_false:
1045 \prg_new_conditional:Nnn \fontspec_if_feature:n {TF,T,F}
1047 \fontspec_if_fontspec_font:TF
1049 \__fontspec_set_font_type:N \font
1050 \bool_if:NTF \l__fontspec_ot_bool
1052 \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-num} \l__fontspec_tmp_tl
1053 \int_set:Nn \l__fontspec_script_int {\l__fontspec_tmp_tl}
1055 \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {lang-num} \l__fontspec_tmp_tl
1056 \int_set:Nn \l__fontspec_language_int {\l__fontspec_tmp_tl}
1058 \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-tag} \l__fontspec_script_tl
1059 \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {lang-tag} \l__fontspec_lang_tl
1061 \__fontspec_check_ot_feat:NnTF \font {#1} {\prg_return_true:} {\prg_return_false:}
1064 \prg_return_false:
1068 \prg_return_false:
1071 \prg_new_conditional:Nnn \fontspec_if_feature:nnn {TF,T,F}
1073 \fontspec_if_fontspec_font:TF
1075 \__fontspec_set_font_type:N \font
1076 \bool_if:NTF \l__fontspec_ot_bool
1078 \__fontspec_check_ot_feat:NnnnTF \font {#3} {#2} {#1} \prg_return_true: \prg_return_false:
1080 { \prg_return_false: }
1082 { \prg_return_false: }
1084 \prg_new_conditional:Nnn \fontspec_if_script:n {TF,T,F}
1086 \fontspec_if_fontspec_font:TF
1088 \__fontspec_set_font_type:N \font
1089 \bool_if:NTF \l__fontspec_ot_bool
1091 \__fontspec_check_script:NnTF \font {#1} \prg_return_true: \prg_return_false:
1093 { \prg_return_false: }
1095 { \prg_return_false: }
1097 \prg_new_conditional:Nnn \fontspec_if_language:n {TF,T,F}
1099 \fontspec_if_fontspec_font:TF
1101 \__fontspec_set_font_type:N \font
1102 \bool_if:NTF \l__fontspec_ot_bool
1104 \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-num} \l__fontspec_tmp_tl
1105 \int_set:Nn \l__fontspec_script_int {\l__fontspec_tmp_tl}
1106 \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-tag} \l__fontspec_script_tl
1108 \__fontspec_check_lang:NnTF \font {#1} \prg_return_true: \prg_return_false:
1110 { \prg_return_false: }
1112 { \prg_return_false: }
1114 \prg_new_conditional:Nnn \fontspec_if_language:nn {TF,T,F}
1116 \fontspec_if_fontspec_font:TF
1118 \__fontspec_set_font_type:N \font
1119 \bool_if:NTF \l__fontspec_ot_bool
1121 \__fontspec_check_lang:NnnTF \font {#2} {#1} \prg_return_true: \prg_return_false:
1123 { \prg_return_false: }
1125 { \prg_return_false: }
1127 \prg_new_conditional:Nnn \fontspec_if_current_script:n {TF,T,F}
1129 \fontspec_if_fontspec_font:TF
1131 \__fontspec_set_font_type:N \font
1132 \bool_if:NTF \l__fontspec_ot_bool
1134 \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-tag} \l__fontspec_tmp_tl
1135 \str_if_eq:nVTF {#1} \l__fontspec_tmp_tl
1136 {\prg_return_true:} {\prg_return_false:}
1138 { \prg_return_false: }
1140 { \prg_return_false: }
1142 \prg_new_conditional:Nnn \fontspec_if_current_language:n {TF,T,F}
1144 \fontspec_if_fontspec_font:TF
1146 \__fontspec_set_font_type:N \font
1147 \bool_if:NTF \l__fontspec_ot_bool
1149 \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {lang-tag} \l__fontspec_tmp_tl
1150 \str_if_eq:nVTF {#1} \l__fontspec_tmp_tl
1151 {\prg_return_true:} {\prg_return_false:}
1153 { \prg_return_false: }
1155 { \prg_return_false: }
1157 \cs_new:Nn \__fontspec_tl_new_if_free:N { \tl_if_exist:NF #1 { \tl_new:N #1 } }
1158 \cs_new:Nn \__fontspec_set_family:NnnN
1160 \tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} % reset
1161 \tl_set:Nn \l__fontspec_family_label_tl {#1}
1162 \__fontspec_select_font_family:nn {#2} {#3}
1163 \__fontspec_tl_new_if_free:N #1
1164 #4 #1 \l_fontspec_family_tl
1165 \tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} % reset
1167 \cs_new:Nn \fontspec_gset_family:Nnn { \__fontspec_set_family:NnnN #1 {#2} {#3} \tl_gset_eq:NN }
1168 \cs_new:Nn \fontspec_set_family:Nnn { \__fontspec_set_family:NnnN #1 {#2} {#3} \tl_set_eq:NN }
1169 \cs_generate_variant:Nn \fontspec_set_family:Nnn {c}
1170 \tl_new:N \l__fontspec_fontface_cs_tl
1171 \tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font}
1172 \cs_new:Nn \__fontspec_set_fontface:NNnnN
1174 \tl_set:Nn \l__fontspec_fontface_cs_tl {#1}
1175 \tl_set:Nn \l__fontspec_family_label_tl {#2}
1176 \__fontspec_select_font_family:nn {#3} {#4}
1177 #5 #2 \l_fontspec_family_tl
1178 \tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} % reset
1180 \cs_new:Nn \fontspec_gset_fontface:NNnn { \__fontspec_set_fontface:NNnnN #1 #2 {#3} {#4} \tl_gset_eq:NN }
1181 \cs_new:Nn \fontspec_set_fontface:NNnn { \__fontspec_set_fontface:NNnnN #1 #2 {#3} {#4} \tl_set_eq:NN }
1182 \prg_new_conditional:Nnn \fontspec_font_if_exist:n {TF,T,F}
1184 \group_begin:
1185 \__fontspec_init:
1186 \__fontspec_if_detect_external:nT {#1} { \__fontspec_font_is_file: }
1187 \__fontspec_primitive_font_if_exist:nTF { \__fontspec_construct_font_call:nn {#1} {} }
1188 { \group_end: \prg_return_true: }
1189 { \group_end: \prg_return_false: }
1191 \cs_set_eq:NN \IfFontExistsTF \fontspec_font_if_exist:nTF
1193 \prg_new_conditional:Nnn \fontspec_if_current_feature:n {TF,T,F}
1195 \exp_args:Nxx \tl_if_in:nnTF
1196 { \__fontspec_primitive_font_current_name: } { \tl_to_str:n {#1} }
1197 { \prg_return_true: } { \prg_return_false: }
1199 \prg_new_conditional:Nnn \fontspec_if_small_caps: {TF,T,F}
1201 \__fontspec_if_merge_shape:nTF {sc}
1203 \tl_set_eq:Nc \l__fontspec_smcp_shape_tl { \__fontspec_shape_merge:nn {\f@shape} {sc} }
1206 \tl_set:Nn \l__fontspec_smcp_shape_tl {sc}
1209 \cs_if_exist:cTF { \f@encoding/\f@family/\f@series/\l__fontspec_smcp_shape_tl }
1211 \tl_if_eq:ccTF
1212 { \f@encoding/\f@family/\f@series/\l__fontspec_smcp_shape_tl }
1213 { \f@encoding/\f@family/\f@series/\shapedefault }
1214 { \prg_return_false: }
1215 { \prg_return_true: }
1217 { \prg_return_false: }
1220 %%^^A%% fontspec-code-internal.dtx -- part of FONTSPEC <wspr.io/fontspec>
1222 \cs_new_protected:Nn \__fontspec_select_font_family:nn
1224 \group_begin:
1225 \__fontspec_font_suppress_not_found_error:
1226 \__fontspec_init:
1228 \__fontspec_sanitise_fontname:Nn \l_fontspec_fontname_tl {#2}
1229 \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_up_tl {#2}
1230 \__fontspec_sanitise_fontname:Nn \l__fontspec_basename_tl {#2}
1232 \__fontspec_if_detect_external:nT {#2}
1233 { \keys_set:nn {fontspec-preparse-external} {Path} }
1235 \keys_set_known:nn {fontspec-preparse-cfg} {#1}
1237 \__fontspec_init_ttc:n {#2}
1238 \__fontspec_load_external_fontoptions:Nn \l_fontspec_fontname_tl {#2}
1240 \__fontspec_extract_all_features:n {#1}
1241 \tl_set:Nx \l__fontspec_fontid_tl { \tl_to_str:N \l_fontspec_fontname_tl-:-\tl_to_str:N \l__fontspec_all_features_clist }
1244 \__fontspec_preparse_features:
1245 \__fontspec_load_font:
1246 \__fontspec_set_scriptlang:
1247 \__fontspec_get_features:n {}
1248 \bool_set_false:N \l__fontspec_firsttime_bool
1250 \__fontspec_save_family_needed:nTF {#2}
1252 \__fontspec_save_family:nn {#1} {#2}
1256 \group_end:
1258 \tl_set_eq:NN \l_fontspec_family_tl \g__fontspec_nfss_family_tl
1260 \cs_set_eq:NN \fontspec_select:nn \__fontspec_select_font_family:nn %% deprecated, for compatibility only
1261 \cs_new:Nn \__fontspec_sanitise_fontname:Nn
1263 \tl_set:Nx #1 {#2}
1264 \clist_map_inline:Nn \l__fontspec_extensions_clist
1266 \tl_if_in:NnT #1 {##1}
1268 \tl_remove_once:Nn #1 {##1}
1269 \tl_set:Nn \l__fontspec_extension_tl {##1}
1270 \clist_map_break:
1274 \prg_new_conditional:Nnn \__fontspec_if_detect_external:n {T}
1276 \clist_map_inline:Nn \l__fontspec_extensions_clist
1278 \bool_set_false:N \l__fontspec_tmpa_bool
1279 \exp_args:Nx % <- this should be handled earlier
1280 \tl_if_in:nnT {#1 <= end_of_string} {##1 <= end_of_string}
1281 { \bool_set_true:N \l__fontspec_tmpa_bool \clist_map_break: }
1283 \bool_if:NTF \l__fontspec_tmpa_bool \prg_return_true: \prg_return_false:
1285 \cs_new:Nn \__fontspec_init_ttc:n
1287 \str_if_eq:eeT { \str_lowercase:f {\l__fontspec_extension_tl} } {.ttc}
1289 \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_it_tl {#1}
1290 \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_bf_tl {#1}
1291 \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_bfit_tl {#1}
1294 \cs_new:Nn \__fontspec_load_external_fontoptions:Nn
1296 \bool_if:NT \l__fontspec_fontcfg_bool
1298 \__fontspec_sanitise_fontname:Nn #1 {#2}
1299 \tl_set:Nx \l__fontspec_ext_filename_tl {#1.fontspec}
1300 \tl_remove_all:Nn \l__fontspec_ext_filename_tl {~}
1301 \prop_if_in:NVF \g__fontspec_fontopts_prop #1
1303 \exp_args:No \file_if_exist:nT { \l__fontspec_ext_filename_tl }
1304 { \file_input:n { \l__fontspec_ext_filename_tl } }
1308 \cs_new:Nn \__fontspec_extract_all_features:n
1310 \bool_if:NTF \l__fontspec_disable_defaults_bool
1312 \clist_set:Nx \l__fontspec_all_features_clist {#1}
1315 \prop_get:NVNF \g__fontspec_fontopts_prop \l_fontspec_fontname_tl \l__fontspec_fontopts_clist
1316 { \clist_clear:N \l__fontspec_fontopts_clist }
1318 \prop_get:NVNF \g__fontspec_fontopts_prop \l__fontspec_family_label_tl \l__fontspec_family_fontopts_clist
1319 { \clist_clear:N \l__fontspec_family_fontopts_clist }
1320 \tl_clear:N \l__fontspec_family_label_tl
1322 \clist_set:Nx \l__fontspec_all_features_clist
1324 \g__fontspec_default_fontopts_clist,
1325 \l__fontspec_family_fontopts_clist,
1326 \l__fontspec_fontopts_clist,
1331 \cs_new:Nn \__fontspec_preparse_features:
1334 \__fontspec_keys_set_known:nxN {fontspec-preparse-external}
1335 { \l__fontspec_all_features_clist }
1336 \l__fontspec_keys_leftover_clist
1338 \tl_set_eq:NN \l_fontspec_fontname_tl \l__fontspec_fontname_up_tl
1339 \__fontspec_keys_set_known:nxN {fontspec-renderer} {\l__fontspec_keys_leftover_clist}
1340 \l__fontspec_keys_leftover_clist
1341 \__fontspec_keys_set_known:nxN {fontspec-preparse} {\l__fontspec_keys_leftover_clist}
1342 \l__fontspec_fontfeat_clist
1344 \cs_new:Nn \__fontspec_load_font:
1347 \__fontspec_primitive_font_set:NnnF \l__fontspec_test_font
1348 { \__fontspec_construct_font_call:nn { \l__fontspec_fontname_up_tl } { \l__fontspec_pre_feat_sclist } }
1349 { \f@size pt - 2sp }
1350 { \__fontspec_error:nx {font-not-found} {\l__fontspec_fontname_up_tl} }
1352 \__fontspec_set_font_type:N \l__fontspec_test_font
1353 \__fontspec_primitive_font_gset:Onn \l__fontspec_fontface_cs_tl
1354 { \__fontspec_construct_font_call:nn { \l__fontspec_fontname_up_tl } { \l__fontspec_pre_feat_sclist } }
1355 { \f@size pt + 2sp }
1357 \l__fontspec_fontface_cs_tl % this is necessary for LuaLaTeX to check the scripts properly
1360 \cs_new:Nn \__fontspec_construct_font_call:nnnnnn
1362 " \__fontspec_fontname_wrap:n { #1 #2 #3 }
1363 #4 #5
1364 \str_if_eq:eeF {#6}{} {:#6} "
1366 \cs_new:Nn \__fontspec_construct_font_call:nn
1368 \__fontspec_construct_font_call:nnnnnn
1369 {#1}
1370 \l__fontspec_extension_tl
1371 \l__fontspec_ttc_index_tl
1372 \l__fontspec_renderer_tl
1373 \l__fontspec_optical_size_tl
1374 {#2}
1376 \cs_new:Nn \__fontspec_font_is_name:
1378 \cs_set_eq:NN \__fontspec_fontname_wrap:n \use:n
1380 \cs_new:Nn \__fontspec_font_is_file:
1382 \cs_set:Npn \__fontspec_fontname_wrap:n ##1 { [ \l__fontspec_font_path_tl ##1 ] }
1384 \cs_new:Nn \__fontspec_set_scriptlang:
1386 \bool_if:NT \l__fontspec_firsttime_bool
1388 \tl_if_empty:NF \l__fontspec_script_name_tl
1390 \keys_set:nx {fontspec-opentype} {Script=\l__fontspec_script_name_tl}
1391 \keys_set:nx {fontspec-opentype} {Language=\l__fontspec_lang_name_tl}
1395 \cs_new:Nn \__fontspec_get_features:n
1397 \__fontspec_init_fontface:
1398 \__fontspec_keys_set_known:nxN {fontspec-renderer} {\l__fontspec_fontfeat_clist,#1}
1399 \l__fontspec_keys_leftover_clist
1400 \__fontspec_keys_set_known:nxN {fontspec} {\l__fontspec_keys_leftover_clist} \l__fontspec_keys_leftover_clist
1401 \bool_if:NTF \l__fontspec_ot_bool
1403 \keys_set:nV {fontspec-opentype} \l__fontspec_keys_leftover_clist
1406 \bool_if:nT { \l__fontspec_atsui_bool || \l__fontspec_graphite_bool }
1407 { \keys_set:nV {fontspec-aat} \l__fontspec_keys_leftover_clist }
1410 \tl_if_empty:NF \l__fontspec_mapping_tl
1411 { \__fontspec_update_featstr:n { mapping = \l__fontspec_mapping_tl } }
1413 \str_if_eq:eeF { \l__fontspec_hexcol_tl \l__fontspec_opacity_tl }
1414 { \c__fontspec_hexcol_tl \c__fontspec_opacity_tl }
1415 { \__fontspec_update_featstr:n { color = \l__fontspec_hexcol_tl\l__fontspec_opacity_tl } }
1417 \prg_new_conditional:Nnn \__fontspec_save_family_needed:n { TF }
1421 \tl_if_empty:NTF \l__fontspec_nfss_fam_tl
1423 \prop_get:NVNTF \g__fontspec_fontid_family_prop \l__fontspec_fontid_tl \l__fontspec_tmp_tl
1425 \tl_gset_eq:NN \g__fontspec_nfss_family_tl \l__fontspec_tmp_tl
1426 \prg_return_false:
1429 \tl_set:Nx \l__fontspec_tmp_tl {#1}
1430 \tl_remove_all:Nn \l__fontspec_tmp_tl { ~ }
1431 \__fontspec_save_fontid_family:VV \l__fontspec_fontid_tl \l__fontspec_tmp_tl
1432 \prg_return_true:
1436 \tl_gset_eq:NN \g__fontspec_nfss_family_tl \l__fontspec_nfss_fam_tl
1437 \cs_undefine:c { g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop }
1438 \prg_return_true:
1441 \cs_new:Nn \__fontspec_save_fontid_family:nn
1443 \prop_get:NnNTF \g__fontspec_family_int_prop {#2} \l__fontspec_tmp_tl
1445 \tl_set:Nx \l__fontspec_tmp_tl
1446 { \int_eval:n { \l__fontspec_tmp_tl + 1 } }
1448 { \tl_set:Nn \l__fontspec_tmp_tl { 0 } }
1449 \prop_gput:NnV \g__fontspec_family_int_prop {#2} \l__fontspec_tmp_tl
1450 \tl_gset:Nx \g__fontspec_nfss_family_tl { #2 ( \l__fontspec_tmp_tl ) }
1451 \prop_gput:NnV \g__fontspec_fontid_family_prop {#1} \g__fontspec_nfss_family_tl
1453 \cs_generate_variant:Nn \__fontspec_save_fontid_family:nn { VV }
1454 \cs_new:Nn \__fontspec_save_family:nn
1456 \__fontspec_save_fontinfo:n {#2}
1457 \__fontspec_find_autofonts:
1458 \DeclareFontFamily{\g__fontspec_nfss_enc_tl}{\g__fontspec_nfss_family_tl}{}
1459 \__fontspec_set_faces:
1460 \__fontspec_info:nxx {defining-font} {#1} {#2}
1462 \cs_new:Nn \__fontspec_save_fontinfo:n
1464 \prop_new:c {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop}
1465 \prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {fontname} { #1 }
1466 \prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {options} { \l__fontspec_all_features_clist }
1467 \prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {fontdef}
1469 \__fontspec_construct_font_call:nn {\l_fontspec_fontname_tl}
1470 { \l__fontspec_pre_feat_sclist \g__fontspec_rawfeatures_sclist }
1472 \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {script-num} \l__fontspec_script_int
1473 \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {lang-num} \l__fontspec_language_int
1474 \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {script-tag} \l__fontspec_script_tl
1475 \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {lang-tag} \l__fontspec_lang_tl
1477 \cs_new:Nn \__fontspec_find_autofonts:
1479 \bool_if:nF {\l__fontspec_noit_bool || \l__fontspec_nobf_bool}
1481 \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l__fontspec_fontname_it_tl} {/B}
1482 \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l__fontspec_fontname_bf_tl} {/I}
1483 \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l_fontspec_fontname_tl} {/BI}
1486 \bool_if:NF \l__fontspec_nobf_bool
1488 \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bf_tl {\l_fontspec_fontname_tl} {/B}
1491 \bool_if:NF \l__fontspec_noit_bool
1493 \__fontspec_set_autofont:Nnn \l__fontspec_fontname_it_tl {\l_fontspec_fontname_tl} {/I}
1496 \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfsl_tl {\l__fontspec_fontname_sl_tl} {/B}
1498 \cs_new:Nn \__fontspec_set_faces:
1500 \__fontspec_add_nfssfont:nnnn \mddefault \shapedefault \l_fontspec_fontname_tl \l__fontspec_fontfeat_up_clist
1501 \__fontspec_add_nfssfont:nnnn \bfdefault \shapedefault \l__fontspec_fontname_bf_tl \l__fontspec_fontfeat_bf_clist
1502 \__fontspec_add_nfssfont:nnnn \mddefault \itdefault \l__fontspec_fontname_it_tl \l__fontspec_fontfeat_it_clist
1503 \__fontspec_add_nfssfont:nnnn \mddefault \sldefault \l__fontspec_fontname_sl_tl \l__fontspec_fontfeat_sl_clist
1504 \__fontspec_add_nfssfont:nnnn \bfdefault \itdefault \l__fontspec_fontname_bfit_tl \l__fontspec_fontfeat_bfit_clist
1505 \__fontspec_add_nfssfont:nnnn \bfdefault \sldefault \l__fontspec_fontname_bfsl_tl \l__fontspec_fontfeat_bfsl_clist
1506 \prop_map_inline:Nn \l__fontspec_nfssfont_prop { \__fontspec_set_faces_aux:nnnnn ##2 }
1508 \cs_new:Nn \__fontspec_set_faces_aux:nnnnn
1510 \fontspec_complete_fontname:Nn \l__fontspec_curr_fontname_tl {#3}
1511 \__fontspec_make_font_shapes:Nnnnn \l__fontspec_curr_fontname_tl {#1} {#2} {#4} {#5}
1513 \cs_new:Nn \fontspec_complete_fontname:Nn
1515 \tl_set:Nx #1 {#2}
1516 \tl_replace_all:Nnx #1 {*} {\l__fontspec_basename_tl}
1518 \cs_new:Nn \__fontspec_add_nfssfont:nnnn
1520 \tl_set:Nx \l__fontspec_this_font_tl {#3}
1522 \tl_if_empty:xTF {#4}
1523 { \clist_set:Nn \l__fontspec_sizefeat_clist {Size={-}} }
1524 { \__fontspec_keys_set_known:nxN {fontspec-preparse-nested} {#4} \l__fontspec_tmp_tl }
1526 \tl_if_empty:NF \l__fontspec_this_font_tl
1528 \prop_put:Nxx \l__fontspec_nfssfont_prop {#1/#2}
1529 { {#1}{#2}{\l__fontspec_this_font_tl}{#4}{\l__fontspec_sizefeat_clist} }
1532 \cs_new:Nn \__fontspec_set_font_type:N
1534 \bool_set_false:N \l__fontspec_tfm_bool
1535 \bool_set_false:N \l__fontspec_atsui_bool
1536 \bool_set_false:N \l__fontspec_ot_bool
1537 \bool_set_false:N \l__fontspec_mm_bool
1538 \bool_set_false:N \l__fontspec_graphite_bool
1539 \ifcase\XeTeXfonttype #1
1540 \bool_set_true:N \l__fontspec_tfm_bool
1542 \bool_set_true:N \l__fontspec_atsui_bool
1543 \tl_if_empty:NT \l__fontspec_renderer_tl { \tl_set:Nn \l__fontspec_renderer_tl {/AAT} }
1544 \ifnum\XeTeXcountvariations #1 > 0\relax
1545 \bool_set_true:N \l__fontspec_mm_bool
1548 \bool_set_true:N \l__fontspec_ot_bool
1549 \tl_if_empty:NT \l__fontspec_renderer_tl { \tl_set:Nn \l__fontspec_renderer_tl {/OT} }
1551 \bool_set_true:N \l__fontspec_graphite_bool
1552 \tl_if_empty:NT \l__fontspec_renderer_tl { \tl_set:Nn \l__fontspec_renderer_tl {/GR} }
1555 \cs_new:Nn \__fontspec_set_autofont:Nnn
1557 \bool_if:NF \l__fontspec_external_bool
1559 \tl_if_empty:xF {#2}
1561 \tl_if_empty:NT #1
1563 \__fontspec_if_autofont:nnTF {#2} {#3}
1564 { \tl_set:Nx #1 {#2#3} }
1565 { \__fontspec_info:nx {no-font-shape} {#2#3} }
1570 \prg_new_conditional:Nnn \__fontspec_if_autofont:nn {T,TF}
1572 \group_begin:
1573 \__fontspec_primitive_font_set:Nnn \l__fontspec_tmpa_font { \__fontspec_construct_font_call:nn {#1} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 1sp }
1574 \__fontspec_primitive_font_set:Nnn \l__fontspec_tmpb_font { \__fontspec_construct_font_call:nn {#1#2} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 1sp }
1575 \str_if_eq:eeTF { \__fontspec_primitive_font_get_name:N \l__fontspec_tmpa_font } { \__fontspec_primitive_font_get_name:N \l__fontspec_tmpb_font }
1576 { \group_end: \prg_return_false: }
1577 { \group_end: \prg_return_true: }
1579 \cs_new:Nn \__fontspec_make_font_shapes:Nnnnn
1581 \group_begin:
1582 \__fontspec_keys_set_known:nxN {fontspec-preparse-external} { #4 } \l__fontspec_leftover_clist
1583 \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {#1}
1584 \__fontspec_declare_shape:nnxx {#2} {#3} { \l__fontspec_fontopts_clist, \l__fontspec_leftover_clist } {#5}
1585 \group_end:
1587 \cs_new:Nn \__fontspec_load_fontname:Nn
1589 \__fontspec_load_external_fontoptions:Nn #1 {#2}
1590 \prop_get:NVNF \g__fontspec_fontopts_prop #1 \l__fontspec_fontopts_clist
1591 { \clist_clear:N \l__fontspec_fontopts_clist }
1592 \keys_set_groups:nnV {fontspec/fontname} {getfontname} \l__fontspec_fontopts_clist
1593 \__fontspec_primitive_font_set:OnnF \l__fontspec_fontface_cs_tl
1594 { \__fontspec_construct_font_call:nn {#1} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 2sp }
1595 { \__fontspec_error:nx {font-not-found} {#2} }
1597 \keys_define:nn {fontspec/fontname}
1599 Font .tl_set:N = \l_fontspec_fontname_tl ,
1600 Font .groups:n = {getfontname} ,
1602 \cs_new:Nn \__fontspec_declare_shape:nnnn
1604 \tl_build_begin:N \l__fontspec_nfss_tl
1605 \tl_build_begin:N \l__fontspec_nfss_sc_tl
1606 \tl_set_eq:NN \l__fontspec_saved_fontname_tl \l_fontspec_fontname_tl
1608 \exp_args:Nx \clist_map_inline:nn {#4} { \__fontspec_setup_single_size:nn {#3} {##1} }
1610 \tl_build_end:N \l__fontspec_nfss_tl
1611 \tl_build_end:N \l__fontspec_nfss_sc_tl
1613 \__fontspec_declare_shapes_normal:nn {#1} {#2}
1614 \__fontspec_declare_shapes_smcaps:nn {#1} {#2}
1615 \__fontspec_declare_shape_slanted:nn {#1} {#2}
1616 \__fontspec_declare_shapes_bx:nn {#1} {#2}
1617 \__fontspec_declare_shape_loginfo:nn {#1} {#2}
1619 \cs_generate_variant:Nn \__fontspec_declare_shape:nnnn {nnxx}
1620 \cs_new:Nn \__fontspec_setup_single_size:nn
1622 \tl_clear:N \l__fontspec_size_tl
1623 \tl_set_eq:NN \l__fontspec_sizedfont_tl \l__fontspec_saved_fontname_tl % in case not spec'ed
1625 \keys_set_known:nxN {fontspec-sizing} { \exp_after:wN \use:n #2 }
1626 \l__fontspec_sizing_leftover_clist
1627 \tl_if_empty:NT \l__fontspec_size_tl { \__fontspec_error:n {no-size-info} }
1629 % "normal"
1630 \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_sizedfont_tl}
1631 \__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_tl {#1} {\l__fontspec_sizing_leftover_clist} {}
1633 % small caps
1634 \clist_set_eq:NN \l__fontspec_fontfeat_curr_clist \l__fontspec_fontfeat_sc_clist
1636 \bool_if:NF \l__fontspec_nosc_bool
1638 \tl_if_empty:NTF \l__fontspec_fontname_sc_tl
1640 \__fontspec_make_smallcaps:TF
1642 \clist_put_left:Nn \l__fontspec_fontfeat_curr_clist {Letters=SmallCaps}
1645 \bool_set_true:N \l__fontspec_nosc_bool
1648 { \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_fontname_sc_tl} }% local for each size
1651 \bool_if:NF \l__fontspec_nosc_bool
1653 \__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_sc_tl
1654 {#1} {\l__fontspec_sizing_leftover_clist} {\l__fontspec_fontfeat_curr_clist}
1657 \cs_new:Nn \__fontspec_setup_nfss:Nnnn
1660 \__fontspec_get_features:n { #2 , #3 , #4 }
1662 \tl_if_empty:NF \l__fontspec_scale_tl
1664 \tl_set:Nx \l__fontspec_scale_tl { s*[\l__fontspec_scale_tl] }
1667 \tl_build_put_right:Nx #1
1669 <\l__fontspec_size_tl> \l__fontspec_scale_tl
1670 \__fontspec_construct_font_call:nn { \l_fontspec_fontname_tl }
1671 { \l__fontspec_pre_feat_sclist \g__fontspec_rawfeatures_sclist }
1674 \cs_new:Nn \__fontspec_declare_shapes_normal:nn
1676 \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl}
1677 {#1} {#2} {\l__fontspec_nfss_tl}{\l__fontspec_postadjust_tl}
1679 \cs_new:Nn \__fontspec_declare_shapes_smcaps:nn
1681 \tl_if_empty:NF \l__fontspec_nfss_sc_tl
1683 \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} {#1}
1684 { \__fontspec_combo_sc_shape:n {#2} } {\l__fontspec_nfss_sc_tl} {\l__fontspec_postadjust_tl}
1687 \cs_new:Nn \__fontspec_combo_sc_shape:n
1689 \tl_if_exist:cTF { \__fontspec_shape_merge:nn {#1} {\scdefault} }
1690 { \tl_use:c { \__fontspec_shape_merge:nn {#1} {\scdefault} } }
1691 { \scdefault }
1693 \cs_new:Nn \__fontspec_DeclareFontShape:nnnnnn
1695 \group_begin:
1696 \normalsize
1697 \cs_undefine:c {#1/#2/#3/#4/\f@size}
1698 \group_end:
1699 \DeclareFontShape{#1}{#2}{#3}{#4}{#5}{#6}
1701 \cs_generate_variant:Nn \__fontspec_DeclareFontShape:nnnnnn {xxxxxx}
1702 \cs_new:Nn \__fontspec_declare_shape_slanted:nn
1704 \bool_if:nT
1706 \str_if_eq_p:ee {#2} {\itdefault} &&
1707 !(\str_if_eq_p:ee {\itdefault} {\sldefault})
1710 \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl}{\g__fontspec_nfss_family_tl}{#1}{\sldefault}
1711 {<->ssub*\g__fontspec_nfss_family_tl/#1/\itdefault}{\l__fontspec_postadjust_tl}
1714 \cs_new:Nn \__fontspec_declare_shapes_bx:nn
1716 \bool_if:nT
1718 \str_if_eq_p:ee {#1} {\bfdefault} &&
1719 !(\str_if_eq_p:ee {\bfdefault} {bx})
1722 % bx/?
1723 \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl}
1724 {bx} {#2}
1725 { <->ssub*\g__fontspec_nfss_family_tl/\bfdefault/#2 }
1726 { \l__fontspec_postadjust_tl }
1728 % bx/sc -> b/sc
1729 \tl_if_empty:NF \l__fontspec_nfss_sc_tl
1731 \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl}
1732 {bx} { \__fontspec_combo_sc_shape:n {#2} }
1733 { <->ssub*\g__fontspec_nfss_family_tl/\bfdefault/#2 }
1734 { \l__fontspec_postadjust_tl }
1737 % bx/sl -> bx/it
1738 \bool_if:nT
1740 \str_if_eq_p:ee {#2} {\itdefault} &&
1741 !(\str_if_eq_p:ee {\itdefault} {\sldefault})
1744 \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl}
1745 {bx} {\sldefault}
1746 { <->ssub*\g__fontspec_nfss_family_tl/bx/\itdefault }
1747 { \l__fontspec_postadjust_tl }
1752 \cs_new:Nn \__fontspec_declare_shape_loginfo:nn
1754 \tl_gput_right:Nx \g__fontspec_defined_shapes_tl
1756 \exp_not:n { \\ }
1757 -~ \exp_not:N \str_case:nn {#1/#2}
1759 {\mddefault/\shapedefault} {'normal'~}
1760 {\bfdefault/\shapedefault} {'bold'~}
1761 {\mddefault/\itdefault} {'italic'~}
1762 {\mddefault/\sldefault} {'slanted'~}
1763 {\bfdefault/\itdefault} {'bold~ italic'~}
1764 {\bfdefault/\sldefault} {'bold~ slanted'~}
1765 } (#1/#2)~
1766 with~ NFSS~ spec.:~
1767 \l__fontspec_nfss_tl
1768 \exp_not:n { \\ }
1769 -~ \exp_not:N \str_case:nn { #1 / \__fontspec_combo_sc_shape:n {#2} }
1771 {\mddefault/\scdefault} {'small~ caps'~}
1772 {\bfdefault/\scdefault} {'bold~ small~ caps'~}
1773 {\mddefault/\scitdefault} {'italic~ small~ caps'~}
1774 {\bfdefault/\scitdefault} {'bold~ italic~ small~ caps'~}
1775 {\mddefault/\scsldefault} {'slanted~ small~ caps'~}
1776 {\bfdefault/\scsldefault} {'bold~ slanted~ small~ caps'~}
1777 }~( #1 / \__fontspec_combo_sc_shape:n {#2} )~
1778 with~ NFSS~ spec.:~
1779 \l__fontspec_nfss_sc_tl
1780 \tl_if_empty:fF {\l__fontspec_postadjust_tl}
1782 \exp_not:N \\ and~ font~ adjustment~ code:
1783 \exp_not:N \\ \l__fontspec_postadjust_tl
1787 \tl_set:Nn \l__fontspec_pre_feat_sclist
1789 \bool_if:NT \l__fontspec_ot_bool
1791 \tl_if_empty:NF \l__fontspec_script_tl { script = \l__fontspec_script_tl ; }
1792 \tl_if_empty:NF \l__fontspec_lang_tl { language = \l__fontspec_lang_tl ; }
1795 \cs_new:Nn \__fontspec_make_ot_smallcaps:TF
1797 \exp_args:No \__fontspec_check_ot_feat:NnTF \l__fontspec_fontface_cs_tl {smcp} {#1} {#2}
1799 \cs_new:Nn \__fontspec_make_smallcaps:TF
1801 \bool_if:NTF \l__fontspec_ot_bool
1802 { \__fontspec_make_ot_smallcaps:TF {#1} {#2} }
1804 \bool_if:NT \l__fontspec_atsui_bool
1806 \exp_args:No \__fontspec_make_AAT_feature_string:NnnTF
1807 \l__fontspec_fontface_cs_tl {3} {3} {#1} {#2}
1811 \cs_new:Nn \__fontspec_update_featstr:n
1813 \bool_if:NF \l__fontspec_firsttime_bool
1815 \tl_gset:Nx \g__fontspec_single_feat_tl { #1 }
1816 \tl_gput_right:Nx \g__fontspec_rawfeatures_sclist {#1;}
1819 \cs_new:Nn \__fontspec_remove_clashing_featstr:n
1821 \clist_map_inline:nn {#1}
1823 \tl_gremove_all:Nn \g__fontspec_rawfeatures_sclist {##1;}
1826 \cs_generate_variant:Nn \__fontspec_remove_clashing_featstr:n {x}
1827 \cs_set:Npn \__fontspec_init:
1829 \bool_set_false:N \l__fontspec_ot_bool
1830 \bool_set_true:N \l__fontspec_firsttime_bool
1831 \__fontspec_font_is_name:
1832 \tl_clear:N \l__fontspec_font_path_tl
1833 \tl_clear:N \l__fontspec_optical_size_tl
1834 \tl_clear:N \l__fontspec_ttc_index_tl
1835 \tl_clear:N \l__fontspec_renderer_tl
1836 \tl_gclear:N \g__fontspec_defined_shapes_tl
1837 \tl_gclear:N \g__fontspec_curr_series_tl
1838 \tl_gset_eq:NN \g__fontspec_nfss_enc_tl \g_fontspec_encoding_tl
1840 \cs_new:Nn \__fontspec_init_fontface:
1842 \tl_gclear:N \g__fontspec_rawfeatures_sclist
1843 \tl_clear:N \l__fontspec_scale_tl
1844 \tl_set_eq:NN \l__fontspec_opacity_tl \c__fontspec_opacity_tl
1845 \tl_set_eq:NN \l__fontspec_hexcol_tl \c__fontspec_hexcol_tl
1846 \tl_set_eq:NN \l__fontspec_postadjust_tl \c__fontspec_postadjust_tl
1847 \tl_clear:N \l__fontspec_wordspace_adjust_tl
1848 \tl_clear:N \l__fontspec_punctspace_adjust_tl
1850 \cs_new:Nn \__fontspec_iv_str_to_num:Nn
1852 \__fontspec_strip_leading_sign:Nw #1#2 \q_nil
1854 \cs_generate_variant:Nn \__fontspec_iv_str_to_num:Nn {Nx}
1855 \cs_set:Npn \__fontspec_strip_leading_sign:Nw #1#2#3 \q_nil
1857 \bool_if:nTF { \str_if_eq_p:nn {#2} {+} || \str_if_eq_p:nn {#2} {-} }
1858 { \__fontspec_iv_str_to_num:w #1 \q_nil #3 \c_empty_tl \c_empty_tl \q_nil }
1859 { \__fontspec_iv_str_to_num:w #1 \q_nil #2#3 \c_empty_tl \c_empty_tl \q_nil }
1861 \cs_set:Npn \__fontspec_iv_str_to_num:w #1 \q_nil #2#3#4#5#6 \q_nil
1863 \int_compare:nT { \tl_count:n {#6} > 2 }
1864 { \__fontspec_error:nx {ot-tag-too-long} {#2#3#4#5#6} }
1866 \int_set:Nn #1
1868 `#2 * "1000000
1869 + `#3 * "10000
1870 + \ifx \c_empty_tl #4 32 \else `#4 \fi * "100
1871 + \ifx \c_empty_tl #5 32 \else `#5 \fi
1875 %%^^A%% fontspec-code-opentype.dtx -- part of FONTSPEC <wspr.io/fontspec>
1877 \cs_new:Nn \__fontspec_define_opentype_feature_group:n
1879 \keys_define:nn {fontspec-opentype} { #1 .multichoice: , .groups:n = {opentype} }
1881 \cs_new:Nn \__fontspec_feat_prop_add:nn
1883 \tl_if_empty:nF {#1}
1885 \prop_if_in:NnF \g__fontspec_OT_features_prop {#1}
1887 \prop_gput:Nnn \g__fontspec_OT_features_prop {#1} {#2}
1891 \cs_new:Nn \__fontspec_define_opentype_feature:nnnnn
1893 \__fontspec_feat_prop_add:nn {#3} {#1\,=\,#2}
1894 \tl_if_empty:nTF {#4}
1896 \keys_define:nn {fontspec-opentype}
1898 #1/#2 .code:n =
1899 { \__fontspec_remove_clashing_featstr:n {#5} } ,
1900 #1/#2 .groups:n = {opentype}
1904 \keys_define:nn {fontspec-opentype}
1906 #1/#2 .code:n =
1908 \__fontspec_make_OT_feature:nnn {#3} {#4} {#5}
1910 #1/#2 .groups:n = {opentype}
1914 \cs_new:Nn \__fontspec_feat_off:n {#1Off}
1915 \cs_new:Nn \__fontspec_feat_reset:n {#1Reset}
1916 \cs_new:Nn \__fontspec_define_opentype_onoffreset:nnnnn
1918 \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} {#2} {#3} {+#4} {#5}
1919 \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} { \__fontspec_feat_off:n {#2} } {#3} {-#4} {}
1920 \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} { \__fontspec_feat_reset:n {#2} } {} {} {+#4,-#4}
1922 \cs_new:Nn \__fontspec_define_opentype_onreset:nnnnn
1924 \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} {#2} {#3} {#4} {#5}
1925 \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} { \__fontspec_feat_reset:n {#2} } {} {} {#4}
1927 \cs_new:Nn \__fontspec_make_OT_feature:nnn
1930 \bool_set_true:N \l__fontspec_proceed_bool
1932 \tl_if_empty:nF {#1}
1934 \exp_args:No \__fontspec_check_ot_feat:NnF \l__fontspec_fontface_cs_tl {#1}
1936 \__fontspec_warning:nx {icu-feature-not-exist-in-font} {#1}
1937 \bool_set_false:N \l__fontspec_proceed_bool
1941 \__fontspec_remove_clashing_featstr:x { #2 , \__fontspec_swap_plus_minus:n {#2} , #3 }
1943 \bool_if:NT \l__fontspec_proceed_bool { \__fontspec_update_featstr:n {#2} }
1945 \cs_generate_variant:Nn \__fontspec_make_OT_feature:nnn {xxx}
1946 \cs_new:Nn \__fontspec_swap_plus_minus:n { \__fontspec_swap_plus_minus_aux:Nq #1 \q_nil }
1947 \cs_new:Npn \__fontspec_swap_plus_minus_aux:Nq #1#2 \q_nil
1948 { \str_case:nn {#1} { {+} {-#2} {-} {+#2} } }
1949 \prg_new_conditional:Nnn \__fontspec_check_script:Nn {TF,T}
1951 \bool_if:NTF \l__fontspec_never_check_bool
1952 { \prg_return_true: }
1954 \bool_if:nTF { \tl_if_empty_p:e {#2} }
1955 { \prg_return_false: }
1957 \__fontspec_iv_str_to_num:Nx \l__fontspec_strnum_int {#2}
1958 \int_set:Nn \l_tmpb_int { \XeTeXOTcountscripts #1 }
1959 \int_zero:N \l_tmpa_int
1960 \bool_set_false:N \l__fontspec_check_bool
1961 \bool_until_do:nn { \int_compare_p:nNn \l_tmpa_int = \l_tmpb_int }
1963 \ifnum \XeTeXOTscripttag #1 \l_tmpa_int = \l__fontspec_strnum_int
1964 \bool_set_true:N \l__fontspec_check_bool
1965 \int_set:Nn \l_tmpa_int {\l_tmpb_int}
1966 \else
1967 \int_incr:N \l_tmpa_int
1970 \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false:
1974 \prg_new_conditional:Nnn \__fontspec_check_lang:Nn {TF}
1976 \__fontspec_check_lang:NnnTF #1 {#2} {\l__fontspec_script_tl} {\prg_return_true:} {\prg_return_false:}
1978 \prg_new_conditional:Nnn \__fontspec_check_lang:Nnn {TF}
1980 \bool_if:NTF \l__fontspec_never_check_bool
1981 { \prg_return_true: }
1983 \bool_if:nTF { \tl_if_empty_p:e {#3} }
1984 { \prg_return_false: }
1986 \__fontspec_iv_str_to_num:Nx \l__fontspec_strnum_int {#2}
1987 \__fontspec_iv_str_to_num:Nx \l__fontspec_script_int {#3}
1988 \int_set:Nn \l__fontspec_tmpb_int
1989 { \XeTeXOTcountlanguages #1 \l__fontspec_script_int }
1990 \int_zero:N \l__fontspec_tmpa_int
1991 \bool_set_false:N \l__fontspec_check_bool
1992 \bool_until_do:nn { \int_compare_p:nNn \l__fontspec_tmpa_int = \l__fontspec_tmpb_int }
1994 \int_set:Nn \l__fontspec_tmpc_int
1995 { \XeTeXOTlanguagetag #1 \l__fontspec_script_int \l__fontspec_tmpa_int }
1997 \int_compare:nNnTF \l__fontspec_tmpc_int = \l__fontspec_strnum_int
1999 \bool_set_true:N \l__fontspec_check_bool
2000 \int_set:Nn \l__fontspec_tmpa_int {\l__fontspec_tmpb_int}
2003 \int_incr:N \l__fontspec_tmpa_int
2006 \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false:
2010 \prg_new_conditional:Nnn \__fontspec_check_ot_feat:Nn {TF,F}
2012 \__fontspec_check_ot_feat:NnnnTF #1 {#2} {\l__fontspec_lang_tl} {\l__fontspec_script_tl}
2013 {\prg_return_true:} {\prg_return_false:}
2015 \prg_new_conditional:Nnn \__fontspec_check_ot_feat:Nnnn {TF,F}
2017 \bool_if:NTF \l__fontspec_never_check_bool
2018 { \prg_return_true: }
2020 \bool_if:nTF { \tl_if_empty_p:e {#3} || \tl_if_empty_p:e {#4} }
2021 { \prg_return_false: }
2023 \__fontspec_iv_str_to_num:Nx \l__fontspec_strnum_int {#2}
2025 \str_if_eq:eeTF {#3} {dflt}
2026 { \int_zero:N \l__fontspec_language_int }
2027 { \__fontspec_iv_str_to_num:Nx \l__fontspec_language_int {#3} }
2028 \__fontspec_iv_str_to_num:Nx \l__fontspec_script_int {#4}
2030 \int_set:Nn \l_tmpb_int
2031 { \XeTeXOTcountfeatures #1 \l__fontspec_script_int \l__fontspec_language_int }
2033 \int_zero:N \l_tmpa_int
2034 \bool_set_false:N \l__fontspec_check_bool
2035 \bool_until_do:nn { \int_compare_p:nNn \l_tmpa_int = \l_tmpb_int }
2037 \ifnum\XeTeXOTfeaturetag #1 \l__fontspec_script_int \l__fontspec_language_int
2038 \l_tmpa_int =\l__fontspec_strnum_int
2039 \bool_set_true:N \l__fontspec_check_bool
2040 \int_set:Nn \l_tmpa_int {\l_tmpb_int}
2041 \else
2042 \int_incr:N \l_tmpa_int
2045 \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false:
2049 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {aalt}{Access~All~Alternates}
2050 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {abvf}{Above-base~Forms}
2051 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {abvm}{Above-base~Mark~Positioning}
2052 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {abvs}{Above-base~Substitutions}
2053 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {afrc}{Alternative~Fractions}
2054 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {akhn}{Akhands}
2055 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {blwf}{Below-base~Forms}
2056 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {blwm}{Below-base~Mark~Positioning}
2057 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {blws}{Below-base~Substitutions}
2058 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {calt}{Contextual~Alternates}
2059 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {case}{Case-Sensitive~Forms}
2060 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ccmp}{Glyph~Composition~/~Decomposition}
2061 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cfar}{Conjunct~Form~After~Ro}
2062 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cjct}{Conjunct~Forms}
2063 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {clig}{Contextual~Ligatures}
2064 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cpct}{Centered~CJK~Punctuation}
2065 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cpsp}{Capital~Spacing}
2066 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cswh}{Contextual~Swash}
2067 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {curs}{Cursive~Positioning}
2068 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cvNN}{Character~Variant~$N$}
2069 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {c2pc}{Petite~Capitals~From~Capitals}
2070 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {c2sc}{Small~Capitals~From~Capitals}
2071 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dist}{Distances}
2072 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dlig}{Discretionary~Ligatures}
2073 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dnom}{Denominators}
2074 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dtls}{Dotless~Forms}
2075 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {expt}{Expert~Forms}
2076 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {falt}{Final~Glyph~on~Line~Alternates}
2077 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fin2}{Terminal~Forms~\#2}
2078 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fin3}{Terminal~Forms~\#3}
2079 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fina}{Terminal~Forms}
2080 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {flac}{Flattened~accent~forms}
2081 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {frac}{Fractions}
2082 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fwid}{Full~Widths}
2083 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {half}{Half~Forms}
2084 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {haln}{Halant~Forms}
2085 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {halt}{Alternate~Half~Widths}
2086 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hist}{Historical~Forms}
2087 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hkna}{Horizontal~Kana~Alternates}
2088 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hlig}{Historical~Ligatures}
2089 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hngl}{Hangul}
2090 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hojo}{Hojo~Kanji~Forms}
2091 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hwid}{Half~Widths}
2092 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {init}{Initial~Forms}
2093 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {isol}{Isolated~Forms}
2094 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ital}{Italics}
2095 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jalt}{Justification~Alternates}
2096 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp78}{JIS78~Forms}
2097 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp83}{JIS83~Forms}
2098 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp90}{JIS90~Forms}
2099 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp04}{JIS2004~Forms}
2100 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {kern}{Kerning}
2101 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {lfbd}{Left~Bounds}
2102 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {liga}{Standard~Ligatures}
2103 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ljmo}{Leading~Jamo~Forms}
2104 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {lnum}{Lining~Figures}
2105 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {locl}{Localized~Forms}
2106 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ltra}{Left-to-right~alternates}
2107 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ltrm}{Left-to-right~mirrored~forms}
2108 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mark}{Mark~Positioning}
2109 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {med2}{Medial~Forms~\#2}
2110 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {medi}{Medial~Forms}
2111 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mgrk}{Mathematical~Greek}
2112 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mkmk}{Mark~to~Mark~Positioning}
2113 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mset}{Mark~Positioning~via~Substitution}
2114 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {nalt}{Alternate~Annotation~Forms}
2115 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {nlck}{NLC~Kanji~Forms}
2116 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {nukt}{Nukta~Forms}
2117 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {numr}{Numerators}
2118 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {onum}{Oldstyle~Figures}
2119 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {opbd}{Optical~Bounds}
2120 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ordn}{Ordinals}
2121 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ornm}{Ornaments}
2122 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {palt}{Proportional~Alternate~Widths}
2123 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pcap}{Petite~Capitals}
2124 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pkna}{Proportional~Kana}
2125 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pnum}{Proportional~Figures}
2126 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pref}{Pre-Base~Forms}
2127 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pres}{Pre-base~Substitutions}
2128 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pstf}{Post-base~Forms}
2129 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {psts}{Post-base~Substitutions}
2130 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pwid}{Proportional~Widths}
2131 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {qwid}{Quarter~Widths}
2132 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rand}{Randomize}
2133 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rclt}{Required~Contextual~Alternates}
2134 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rkrf}{Rakar~Forms}
2135 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rlig}{Required~Ligatures}
2136 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rphf}{Reph~Forms}
2137 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rtbd}{Right~Bounds}
2138 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rtla}{Right-to-left~alternates}
2139 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rtlm}{Right-to-left~mirrored~forms}
2140 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ruby}{Ruby~Notation~Forms}
2141 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rvrn}{Required~Variation~Alternates}
2142 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {salt}{Stylistic~Alternates}
2143 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {sinf}{Scientific~Inferiors}
2144 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {size}{Optical~size}
2145 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {smcp}{Small~Capitals}
2146 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {smpl}{Simplified~Forms}
2147 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ssNN}{Stylistic~Set~$N$}
2148 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ssty}{Math~script~style~alternates}
2149 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {stch}{Stretching~Glyph~Decomposition}
2150 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {subs}{Subscript}
2151 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {sups}{Superscript}
2152 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {swsh}{Swash}
2153 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {titl}{Titling}
2154 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {tjmo}{Trailing~Jamo~Forms}
2155 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {tnam}{Traditional~Name~Forms}
2156 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {tnum}{Tabular~Figures}
2157 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {trad}{Traditional~Forms}
2158 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {twid}{Third~Widths}
2159 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {unic}{Unicase}
2160 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {valt}{Alternate~Vertical~Metrics}
2161 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vatu}{Vattu~Variants}
2162 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vert}{Vertical~Writing}
2163 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vhal}{Alternate~Vertical~Half~Metrics}
2164 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vjmo}{Vowel~Jamo~Forms}
2165 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vkna}{Vertical~Kana~Alternates}
2166 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vkrn}{Vertical~Kerning}
2167 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vpal}{Proportional~Alternate~Vertical~Metrics}
2168 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vrt2}{Vertical~Alternates~and~Rotation}
2169 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vrtr}{Vertical~Alternates~for~Rotation}
2170 \prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {zero}{Slashed~Zero}
2172 %%^^A%% fontspec-code-graphite.dtx -- part of FONTSPEC <wspr.io/fontspec>
2175 \cs_new:Nn \__fontspec_define_aat_feature_group:n
2177 \keys_define:nn {fontspec-aat} { #1 .multichoice: }
2179 \cs_new:Nn \__fontspec_define_aat_feature:nnnn
2181 \keys_define:nn {fontspec-aat}
2183 #1/#2 .code:n = { \__fontspec_make_AAT_feature:nn {#3}{#4} }
2187 \cs_new:Nn \__fontspec_make_AAT_feature:nn
2189 \tl_if_empty:nTF {#1}
2190 { \__fontspec_warning:n {aat-feature-not-exist} }
2192 \exp_args:No \__fontspec_make_AAT_feature_string:NnnTF \l__fontspec_fontface_cs_tl {#1} {#2}
2194 \__fontspec_update_featstr:n {\l_fontspec_feature_string_tl}
2197 \__fontspec_warning:nx {aat-feature-not-exist-in-font} {#1,#2}
2201 \prg_new_conditional:Nnn \__fontspec_make_AAT_feature_string:Nnn {TF,T,F}
2203 \tl_set:Nx \l__fontspec_tmpa_tl { \XeTeXfeaturename #1 #2 }
2204 \tl_if_empty:NTF \l__fontspec_tmpa_tl
2205 { \prg_return_false: }
2207 \int_compare:nTF { \XeTeXisexclusivefeature #1 #2 > 0 }
2209 \tl_set:Nx \l__fontspec_tmpb_tl {\XeTeXselectorname #1 #2\space #3}
2212 \int_if_even:nTF {#3}
2214 \tl_set:Nx \l__fontspec_tmpb_tl {\XeTeXselectorname #1 #2\space #3}
2217 \tl_set:Nx \l__fontspec_tmpb_tl
2219 \XeTeXselectorname #1 #2\space \numexpr#3-1\relax
2221 \tl_if_empty:NF \l__fontspec_tmpb_tl { \tl_put_left:Nn \l__fontspec_tmpb_tl {!} }
2225 \tl_if_empty:NTF \l__fontspec_tmpb_tl
2226 { \prg_return_false: }
2228 \tl_set:Nx \l_fontspec_feature_string_tl { \l__fontspec_tmpa_tl = \l__fontspec_tmpb_tl }
2229 \prg_return_true:
2234 %%^^A%% fontspec-code-keyval.dtx -- part of FONTSPEC <wspr.io/fontspec>
2236 \clist_gset:Nn \g__fontspec_all_keyval_modules_clist
2238 fontspec, fontspec-opentype, fontspec-aat,
2239 fontspec-preparse, fontspec-preparse-cfg, fontspec-preparse-external, fontspec-preparse-nested,
2240 fontspec-renderer
2242 \cs_new:Nn \__fontspec_keys_define_code:nnn
2244 \keys_define:nn {#1} { #2 .code:n = {#3} }
2246 \cs_new:Nn \__fontspec_aff_error:n
2248 \__fontspec_keys_define_code:nnn {fontspec-addfeatures} {#1}
2249 { \__fontspec_error:nx {not-in-addfontfeatures} {#1} }
2251 \__fontspec_keys_define_code:nnn {fontspec-preparse-cfg} {IgnoreFontspecFile}
2253 \bool_set_false:N \l__fontspec_fontcfg_bool
2255 \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {IgnoreFontspecFile}
2257 \bool_set_false:N \l__fontspec_fontcfg_bool
2259 \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Path}
2261 \bool_set_true:N \l__fontspec_nobf_bool
2262 \bool_set_true:N \l__fontspec_noit_bool
2263 \bool_set_true:N \l__fontspec_external_bool
2264 \tl_set:Nn \l__fontspec_font_path_tl {#1}
2265 \__fontspec_font_is_file:
2266 \keys_set:nn {fontspec-renderer} {Renderer=OpenType}
2268 \aliasfontfeature{Path}{ExternalLocation}
2269 \__fontspec_keys_define_code:nnn {fontspec} {Path} {}
2270 \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Extension}
2272 \tl_set:Nn \l__fontspec_extension_tl {#1}
2273 \bool_if:NF \l__fontspec_external_bool
2275 \keys_set:nn {fontspec-preparse-external} {Path}
2278 \tl_clear:N \l__fontspec_extension_tl
2279 \__fontspec_keys_define_code:nnn {fontspec} {Extension} {}
2280 \keys_define:nn {fontspec-renderer}
2282 Renderer .choices:nn =
2283 {AAT,ICU,OpenType,Graphite,Full,Basic,Node,Base,HarfBuzz,Harfbuzz}
2285 \int_compare:nTF {\l_keys_choice_int <= 4}
2287 \tl_set:Nx \l__fontspec_renderer_tl
2289 \int_case:nn \l_keys_choice_int { 1 {/AAT} 2 {/OT} 3 {/OT} 4 {/GR} }
2291 \tl_gset:Nx \g__fontspec_single_feat_tl { \l__fontspec_renderer_tl }
2294 \__fontspec_warning:nx {only-luatex-feature} {Renderer=Full/Basic/Node/Base/HarfBuzz}
2298 \__fontspec_keys_define_code:nnn {fontspec-preparse} {Script}
2300 \keys_set:nn {fontspec-renderer} {Renderer=OpenType}
2301 \tl_set:Nn \l__fontspec_script_name_tl {#1}
2303 \__fontspec_keys_define_code:nnn {fontspec-preparse} {Language}
2305 \keys_set:nn {fontspec-renderer} {Renderer=OpenType}
2306 \tl_set:Nn \l__fontspec_lang_name_tl {#1}
2308 \__fontspec_keys_define_code:nnn {fontspec-preparse} {FontIndex}
2310 \str_if_eq:eeF { \str_lowercase:f {\l__fontspec_extension_tl} } {.ttc}
2311 { \__fontspec_warning:n {font-index-needs-ttc} }
2312 \tl_set:Nn \l__fontspec_ttc_index_tl {:#1}
2314 \__fontspec_keys_define_code:nnn {fontspec} {FontIndex}
2316 \tl_set:Nn \l__fontspec_ttc_index_tl {:#1}
2318 \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {UprightFont}
2320 \fontspec_complete_fontname:Nn \l__fontspec_fontname_up_tl {#1}
2322 \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {ItalicFont}
2324 \tl_if_empty:nTF {#1}
2326 \bool_set_true:N \l__fontspec_noit_bool
2329 \bool_set_false:N \l__fontspec_noit_bool
2330 \fontspec_complete_fontname:Nn \l__fontspec_fontname_it_tl {#1}
2333 \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {SlantedFont}
2335 \fontspec_complete_fontname:Nn \l__fontspec_fontname_sl_tl {#1}
2337 \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldFont}
2339 \tl_if_empty:nTF {#1}
2341 \bool_set_true:N \l__fontspec_nobf_bool
2344 \bool_set_false:N \l__fontspec_nobf_bool
2345 \fontspec_complete_fontname:Nn \l__fontspec_curr_bfname_tl {#1}
2347 \seq_if_empty:NT \l__fontspec_bf_series_seq
2349 \tl_gset:Nx \g__fontspec_curr_series_tl {\bfdefault}
2350 \seq_put_right:Nx \l__fontspec_bf_series_seq {\bfdefault}
2353 \tl_if_eq:oxT \g__fontspec_curr_series_tl {\bfdefault}
2355 \tl_set_eq:NN \l__fontspec_fontname_bf_tl \l__fontspec_curr_bfname_tl
2358 \prop_put:NxV \l__fontspec_nfss_prop {BoldFont-\g__fontspec_curr_series_tl} \l__fontspec_curr_bfname_tl
2363 \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldItalicFont}
2365 \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfit_tl {#1}
2367 \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldSlantedFont}
2369 \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfsl_tl {#1}
2371 \__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFont}
2373 \tl_if_empty:nTF {#1}
2375 \bool_set_true:N \l__fontspec_nosc_bool
2378 \bool_set_false:N \l__fontspec_nosc_bool
2379 \fontspec_complete_fontname:Nn \l__fontspec_fontname_sc_tl {#1}
2382 \__fontspec_keys_define_code:nnn {fontspec-preparse} {UprightFeatures}
2384 \clist_put_right:Nn \l__fontspec_fontfeat_up_clist {#1}
2386 \__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldFeatures}
2388 \clist_put_right:Nn \l__fontspec_fontfeat_bf_clist {#1}
2391 \__fontspec_keys_define_code:nnn {fontspec-preparse} {ItalicFeatures}
2393 \clist_put_right:Nn \l__fontspec_fontfeat_it_clist {#1}
2395 \__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldItalicFeatures}
2397 \clist_put_right:Nn \l__fontspec_fontfeat_bfit_clist {#1}
2399 \__fontspec_keys_define_code:nnn {fontspec-preparse} {SlantedFeatures}
2401 \clist_put_right:Nn \l__fontspec_fontfeat_sl_clist {#1}
2403 \__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldSlantedFeatures}
2405 \clist_put_right:Nn \l__fontspec_fontfeat_bfsl_clist {#1}
2407 \__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFeatures}
2409 \bool_if:NF \l__fontspec_firsttime_bool
2411 \clist_put_right:Nn \l__fontspec_fontfeat_sc_clist {#1}
2414 \__fontspec_keys_define_code:nnn {fontspec-preparse} {SizeFeatures}
2416 \clist_set:Nn \l__fontspec_sizefeat_clist {#1}
2417 \clist_put_right:Nn \l__fontspec_fontfeat_up_clist { SizeFeatures = {#1} }
2419 \__fontspec_keys_define_code:nnn {fontspec-preparse-nested} {SizeFeatures}
2421 \clist_set:Nn \l__fontspec_sizefeat_clist {#1}
2422 \tl_if_empty:NT \l__fontspec_this_font_tl
2423 { \tl_set:Nn \l__fontspec_this_font_tl { -- } } % needs to be non-empty as a flag
2425 \__fontspec_keys_define_code:nnn {fontspec-preparse-nested} {Font}
2427 \tl_set:Nn \l__fontspec_this_font_tl {#1}
2429 \__fontspec_keys_define_code:nnn {fontspec} {SizeFeatures}
2431 % dummy
2433 \__fontspec_keys_define_code:nnn {fontspec} {Font}
2435 % dummy
2437 \__fontspec_keys_define_code:nnn {fontspec-sizing} {Size}
2439 \tl_set:Nn \l__fontspec_size_tl {#1}
2441 \__fontspec_keys_define_code:nnn {fontspec-sizing} {Font}
2443 \fontspec_complete_fontname:Nn \l__fontspec_sizedfont_tl {#1}
2445 \__fontspec_keys_define_code:nnn {fontspec-opentype} {UprightFont} {}
2446 \__fontspec_keys_define_code:nnn {fontspec-opentype} {ItalicFont} {}
2447 \__fontspec_keys_define_code:nnn {fontspec-opentype} {SlantedFont} {}
2448 \__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldFont} {}
2449 \__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldItalicFont} {}
2450 \__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldSlantedFont} {}
2451 \__fontspec_keys_define_code:nnn {fontspec-preparse} {NFSSEncoding}
2453 \tl_gset:Nx \g__fontspec_nfss_enc_tl { #1 }
2455 \__fontspec_keys_define_code:nnn {fontspec-preparse} {NFSSFamily}
2457 \tl_set:Nx \l__fontspec_nfss_fam_tl { #1 }
2459 \__fontspec_keys_define_code:nnn {fontspec-preparse} {FontFace}
2461 \tl_clear:N \l__fontspec_this_font_tl
2462 \clist_set:No \l__fontspec_arg_clist { \use_iii:nnn #1 }
2463 \clist_set_eq:NN \l__fontspec_this_feat_clist \l__fontspec_arg_clist
2464 \int_compare:nT { \clist_count:N \l__fontspec_arg_clist = 1 }
2466 \tl_if_in:NnF \l__fontspec_arg_clist {=}
2468 \tl_set_eq:NN \l__fontspec_this_font_tl \l__fontspec_arg_clist
2469 \tl_clear:N \l__fontspec_this_feat_clist
2473 \__fontspec_add_nfssfont:nnnn
2474 {\use_i:nnn #1} {\use_ii:nnn #1} {\l__fontspec_this_font_tl} {\l__fontspec_this_feat_clist}
2476 \__fontspec_keys_define_code:nnn {fontspec} {Scale}
2478 \str_case:nnF {#1}
2480 {MatchLowercase} { \__fontspec_calc_scale:n {5} }
2481 {MatchUppercase} { \__fontspec_calc_scale:n {8} }
2483 { \tl_set:Nx \l__fontspec_scale_tl {#1} }
2485 \__fontspec_keys_define_code:nnn {fontspec} {ScaleAgain}
2487 \tl_if_empty:NT \l__fontspec_scale_tl { \tl_set:Nn \l__fontspec_scale_tl {1} }
2488 \tl_set:Nx \l__fontspec_scale_tl { \fp_eval:n { #1 * \l__fontspec_scale_tl } }
2489 \__fontspec_info:n {set-scale}
2491 \cs_new:Nn \__fontspec_calc_scale:n
2493 \group_begin:
2495 \fontencoding { \encodingdefault }
2496 \fontfamily { \familydefault }
2497 \selectfont
2499 \__fontspec_set_font_dimen:NnN \l__fontspec_tmpa_dim {#1} \font
2500 \__fontspec_set_font_dimen:NnN \l__fontspec_tmpb_dim {#1} \l__fontspec_fontface_cs_tl
2502 \tl_set:Nx \l__fontspec_scale_tl
2504 \fp_eval:n { \dim_to_fp:n {\l__fontspec_tmpa_dim} /
2505 \dim_to_fp:n {\l__fontspec_tmpb_dim} }
2508 \__fontspec_info:n {set-scale}
2509 \exp_args:NNNx
2510 \group_end:
2511 \tl_set:Nx \l__fontspec_scale_tl { \l__fontspec_scale_tl }
2513 \cs_new:Nn \__fontspec_set_font_dimen:NnN
2515 \dim_set:Nn #1 { \fontdimen #2 #3 }
2516 \dim_compare:nNnT #1 = {0pt}
2518 \settoheight #1
2520 \str_if_eq:nnTF {#3} {\font} \rmfamily #3
2521 \int_case:nnF #2
2523 {5} {x} % x-height
2524 {8} {X} % cap-height
2525 } {?} % "else" clause; never reached.
2529 \__fontspec_keys_define_code:nnn {fontspec} {WordSpace}
2531 \bool_if:NF \l__fontspec_firsttime_bool
2532 { \_fontspec_parse_wordspace:w #1,,,\q_stop }
2534 \__fontspec_aff_error:n {WordSpace}
2535 \cs_set:Npn \_fontspec_parse_wordspace:w #1,#2,#3,#4 \q_stop
2537 \tl_if_empty:nTF {#4}
2539 \tl_set:Nn \l__fontspec_wordspace_adjust_tl
2541 \fontdimen 2 \font = #1 \fontdimen 2 \font
2542 \fontdimen 3 \font = #1 \fontdimen 3 \font
2543 \fontdimen 4 \font = #1 \fontdimen 4 \font
2547 \tl_set:Nn \l__fontspec_wordspace_adjust_tl
2549 \fontdimen 2 \font = #1 \fontdimen 2 \font
2550 \fontdimen 3 \font = #2 \fontdimen 3 \font
2551 \fontdimen 4 \font = #3 \fontdimen 4 \font
2555 \__fontspec_keys_define_code:nnn {fontspec} {PunctuationSpace}
2557 \str_case_e:nnF {#1}
2559 {WordSpace}
2561 \tl_set:Nn \l__fontspec_punctspace_adjust_tl
2562 { \fontdimen 7 \font = 0 \fontdimen 2 \font }
2564 {TwiceWordSpace}
2566 \tl_set:Nn \l__fontspec_punctspace_adjust_tl
2567 { \fontdimen 7 \font = 1 \fontdimen 2 \font }
2571 \tl_set:Nn \l__fontspec_punctspace_adjust_tl
2572 { \fontdimen 7 \font = #1 \fontdimen 7 \font }
2575 \__fontspec_aff_error:n {PunctuationSpace}
2576 \__fontspec_keys_define_code:nnn {fontspec} {FontAdjustment}
2578 \tl_put_right:Nx \l__fontspec_postadjust_tl {#1}
2580 \__fontspec_keys_define_code:nnn {fontspec} {LetterSpace}
2582 \__fontspec_update_featstr:n {letterspace=#1}
2584 \__fontspec_keys_define_code:nnn {fontspec} {HyphenChar}
2586 \str_if_eq:nnTF {#1} {None}
2588 \tl_put_right:Nn \l__fontspec_postadjust_tl
2589 { \__fontspec_primitive_font_set_hyphenchar:Nn \font {-1} }
2593 \tl_if_single:nTF {#1}
2594 { \tl_set:Nn \l__fontspec_hyphenchar_tl {`#1} }
2595 { \tl_set:Nn \l__fontspec_hyphenchar_tl { #1} }
2597 \exp_args:No \__fontspec_primitive_font_glyph_if_exist:NnTF \l__fontspec_fontface_cs_tl {\l__fontspec_hyphenchar_tl}
2599 \tl_put_right:Nn \l__fontspec_postadjust_tl
2600 { \__fontspec_primitive_font_set_hyphenchar:Nn \font { \l__fontspec_hyphenchar_tl } }
2602 { \__fontspec_error:nxx {no-glyph}{\l_fontspec_fontname_tl}{#1} }
2606 \__fontspec_aff_error:n {HyphenChar}
2607 \__fontspec_keys_define_code:nnn {fontspec} {Color}
2609 \cs_if_exist:cTF { \token_to_str:N \color@ #1 }
2611 \convertcolorspec{named}{#1}{HTML}\l__fontspec_hexcol_tl
2614 \int_compare:nTF { \tl_count:n {#1} == 6 }
2615 { \tl_set:Nn \l__fontspec_hexcol_tl {#1} }
2617 \int_compare:nTF { \tl_count:n {#1} == 8 }
2618 { \fontspec_parse_colour:viii #1 }
2620 \bool_if:NF \l__fontspec_firsttime_bool
2621 { \__fontspec_warning:nx {bad-colour} {#1} }
2626 \cs_set:Npn \fontspec_parse_colour:viii #1#2#3#4#5#6#7#8
2628 \tl_set:Nn \l__fontspec_hexcol_tl {#1#2#3#4#5#6}
2629 \tl_if_eq:NNF \l__fontspec_opacity_tl \c__fontspec_opacity_tl
2631 \bool_if:NF \l__fontspec_firsttime_bool
2632 { \__fontspec_warning:nx {opa-twice-col} {#7#8} }
2634 \tl_set:Nn \l__fontspec_opacity_tl {#7#8}
2636 \aliasfontfeature{Color}{Colour}
2637 \__fontspec_keys_define_code:nnn {fontspec} {Opacity}
2639 \int_set:Nn \l__fontspec_tmp_int {255}
2640 \__fontspec_int_mult_truncate:Nn \l__fontspec_tmp_int { #1 }
2641 \tl_if_eq:NNF \l__fontspec_opacity_tl \c__fontspec_opacity_tl
2643 \bool_if:NF \l__fontspec_firsttime_bool
2644 { \__fontspec_warning:nx {opa-twice} {#1} }
2646 \tl_set:Nx \l__fontspec_opacity_tl
2648 \int_compare:nT { \l__fontspec_tmp_int <= "F } {0} % zero pad
2649 \int_to_hex:n { \l__fontspec_tmp_int }
2652 \__fontspec_keys_define_code:nnn {fontspec-aat} {Mapping}
2654 \tl_set:Nn \l__fontspec_mapping_tl { #1 }
2656 \__fontspec_keys_define_code:nnn {fontspec-opentype} {Mapping}
2658 \tl_set:Nn \l__fontspec_mapping_tl { #1 }
2660 \__fontspec_keys_define_code:nnn {fontspec} {Weight}
2662 \__fontspec_update_featstr:n{weight=#1}
2664 \__fontspec_keys_define_code:nnn {fontspec} {Width}
2666 \__fontspec_update_featstr:n{width=#1}
2668 \__fontspec_keys_define_code:nnn {fontspec} {OpticalSize}
2670 \bool_if:NTF \l__fontspec_ot_bool
2672 \tl_set:Nn \l__fontspec_optical_size_tl {/ S = #1}
2675 \bool_if:NT \l__fontspec_mm_bool
2677 \__fontspec_update_featstr:n { optical size = #1 }
2680 \bool_if:nT { !\l__fontspec_ot_bool && !\l__fontspec_mm_bool }
2682 \bool_if:NT \l__fontspec_firsttime_bool
2683 { \__fontspec_warning:nx {no-opticals} {\l_fontspec_fontname_tl} }
2686 \keys_define:nn {fontspec}
2688 FakeSlant .code:n =
2690 \__fontspec_update_featstr:n {slant=#1}
2692 FakeSlant .default:n = {0.2}
2694 \keys_define:nn {fontspec}
2696 FakeStretch .code:n =
2698 \__fontspec_update_featstr:n {extend=#1}
2700 FakeStretch .default:n = {1.2}
2702 \keys_define:nn {fontspec}
2704 FakeBold .code:n =
2706 \__fontspec_update_featstr:n {embolden=#1}
2708 FakeBold .default:n = {1.5}
2710 \keys_define:nn {fontspec}
2712 AutoFakeSlant .code:n =
2714 \bool_if:NT \l__fontspec_firsttime_bool
2716 \tl_set:Nn \l__fontspec_fake_slant_tl {#1}
2717 \clist_put_right:Nn \l__fontspec_fontfeat_it_clist {FakeSlant=#1}
2718 \tl_set_eq:NN \l__fontspec_fontname_it_tl \l_fontspec_fontname_tl
2719 \bool_set_false:N \l__fontspec_noit_bool
2721 \tl_if_empty:NF \l__fontspec_fake_embolden_tl
2723 \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist
2724 {FakeBold=\l__fontspec_fake_embolden_tl}
2725 \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist {FakeSlant=#1}
2726 \tl_set_eq:NN \l__fontspec_fontname_bfit_tl \l_fontspec_fontname_tl
2730 AutoFakeSlant .default:n = {0.2}
2732 \keys_define:nn {fontspec}
2734 AutoFakeBold .code:n =
2736 \bool_if:NT \l__fontspec_firsttime_bool
2738 \tl_set:Nn \l__fontspec_fake_embolden_tl {#1}
2739 \clist_put_right:Nn \l__fontspec_fontfeat_bf_clist {FakeBold=#1}
2740 \tl_set_eq:NN \l__fontspec_fontname_bf_tl \l_fontspec_fontname_tl
2741 \bool_set_false:N \l__fontspec_nobf_bool
2743 \tl_if_empty:NF \l__fontspec_fake_slant_tl
2745 \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist
2746 {FakeSlant=\l__fontspec_fake_slant_tl}
2747 \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist {FakeBold=#1}
2748 \tl_set_eq:NN \l__fontspec_fontname_bfit_tl \l_fontspec_fontname_tl
2752 AutoFakeBold .default:n = {1.5}
2754 \__fontspec_keys_define_code:nnn {fontspec-opentype} {RawFeature}
2756 \__fontspec_update_featstr:n {#1}
2758 \__fontspec_keys_define_code:nnn {fontspec-aat} {RawFeature}
2760 \__fontspec_update_featstr:n {#1}
2763 %%^^A%% fontspec-code-feat-opentype.dtx -- part of FONTSPEC <wspr.io/fontspec>
2765 \__fontspec_feat_prop_add:nn {salt} { Alternate\,=\,$N$ }
2766 \__fontspec_feat_prop_add:nn {nalt} { Annotation\,=\,$N$ }
2767 \__fontspec_feat_prop_add:nn {ornm} { Ornament\,=\,$N$ }
2768 \__fontspec_feat_prop_add:nn {cvNN} { CharacterVariant\,=\,$N$:$M$ }
2769 \__fontspec_feat_prop_add:nn {ssNN} { StylisticSet\,=\,$N$ }
2770 \__fontspec_define_opentype_feature_group:n {Ligatures}
2771 \__fontspec_define_opentype_feature:nnnnn {Ligatures} {ResetAll} {} {}
2773 +dlig,-dlig,+rlig,-rlig,+liga,-liga,+dlig,-dlig,+clig,-clig,+hlig,-hlig,
2774 mapping = tex-text
2776 \__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Required} {rlig} {rlig} {}
2777 \__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Common} {liga} {liga} {}
2778 \__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Rare} {dlig} {dlig} {}
2779 \__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Discretionary} {dlig} {dlig} {}
2780 \__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Contextual} {clig} {clig} {}
2781 \__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Historic} {hlig} {hlig} {}
2782 \keys_define:nn {fontspec-opentype}
2784 Ligatures / TeX .code:n = { \tl_set:Nn \l__fontspec_mapping_tl {tex-text} },
2785 Ligatures / TeXOff .code:n = { \tl_clear:N \l__fontspec_mapping_tl },
2786 Ligatures / TeXReset .code:n = { \tl_clear:N \l__fontspec_mapping_tl },
2788 \__fontspec_define_opentype_feature_group:n {Letters}
2789 \__fontspec_define_opentype_feature:nnnnn {Letters} {ResetAll} {} {}
2791 +case,+smcp,+pcap,+c2sc,+c2pc,+unic,+rand,
2792 -case,-smcp,-pcap,-c2sc,-c2pc,-unic,-rand
2794 \__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Uppercase} {case} {case} {}
2795 \__fontspec_define_opentype_onoffreset:nnnnn {Letters} {SmallCaps} {smcp} {smcp} {+pcap,+unic}
2796 \__fontspec_define_opentype_onoffreset:nnnnn {Letters} {PetiteCaps} {pcap} {pcap} {+smcp,+unic}
2797 \__fontspec_define_opentype_onoffreset:nnnnn {Letters} {UppercaseSmallCaps} {c2sc} {c2sc} {+c2pc,+unic}
2798 \__fontspec_define_opentype_onoffreset:nnnnn {Letters} {UppercasePetiteCaps} {c2pc} {c2pc} {+c2sc,+unic}
2799 \__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Unicase} {unic} {unic} {}
2800 \__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Random} {rand} {rand} {}
2801 \__fontspec_define_opentype_feature_group:n {Numbers}
2802 \__fontspec_define_opentype_feature:nnnnn {Numbers} {ResetAll} {} {}
2804 +tnum,-tnum,
2805 +pnum,-pnum,
2806 +onum,-onum,
2807 +lnum,-lnum,
2808 +zero,-zero,
2809 +anum,-anum,
2811 \__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Monospaced} {tnum} {tnum} {+pnum,-pnum}
2812 \__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Proportional} {pnum} {pnum} {+tnum,-tnum}
2813 \__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Lowercase} {onum} {onum} {+lnum,-lnum}
2814 \__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Uppercase} {lnum} {lnum} {+onum,-onum}
2815 \__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {SlashedZero} {zero} {zero} {}
2816 \aliasfontfeatureoption {Numbers} {Monospaced} {Tabular}
2817 \aliasfontfeatureoption {Numbers} {Lowercase} {OldStyle}
2818 \aliasfontfeatureoption {Numbers} {Uppercase} {Lining}
2819 \__fontspec_define_opentype_feature_group:n {VerticalPosition}
2820 \__fontspec_define_opentype_feature:nnnnn {VerticalPosition} {ResetAll} {} {}
2822 +sups,-sups,
2823 +subs,-subs,
2824 +ordn,-ordn,
2825 +numr,-numr,
2826 +dnom,-dnom,
2827 +sinf,-sinf,
2829 \__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Superior} {sups} {sups} {+subs,+ordn,+numr,+dnom,+sinf}
2830 \__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Inferior} {subs} {subs} {+sups,+ordn,+numr,+dnom,+sinf}
2831 \__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Ordinal} {ordn} {ordn} {+sups,+subs,+numr,+dnom,+sinf}
2832 \__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Numerator} {numr} {numr} {+sups,+subs,+ordn,+dnom,+sinf}
2833 \__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Denominator} {dnom} {dnom} {+sups,+subs,+ordn,+numr,+sinf}
2834 \__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {ScientificInferior} {sinf} {sinf} {+sups,+subs,+ordn,+numr,+dnom}
2835 \__fontspec_define_opentype_feature_group:n {Contextuals}
2836 \__fontspec_define_opentype_feature:nnnnn {Contextuals} {ResetAll} {} {}
2838 +cswh,-cswh,
2839 +calt,-calt,
2840 +init,-init,
2841 +fina,-fina,
2842 +falt,-falt,
2843 +medi,-medi,
2845 \__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {Swash} {cswh} {cswh} {}
2846 \__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {Alternate} {calt} {calt} {}
2847 \__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {WordInitial} {init} {init} {}
2848 \__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {WordFinal} {fina} {fina} {}
2849 \__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {LineFinal} {falt} {falt} {}
2850 \__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {Inner} {medi} {medi} {}
2851 \__fontspec_define_opentype_feature_group:n {Diacritics}
2852 \__fontspec_define_opentype_feature:nnnnn {Diacritics} {ResetAll} {} {}
2854 +mark,-mark,
2855 +mkmk,-mkmk,
2856 +abvm,-abvm,
2857 +blwm,-blwm,
2859 \__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {MarkToBase} {mark} {mark} {}
2860 \__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {MarkToMark} {mkmk} {mkmk} {}
2861 \__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {AboveBase} {abvm} {abvm} {}
2862 \__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {BelowBase} {blwm} {blwm} {}
2863 \__fontspec_define_opentype_feature_group:n {Kerning}
2864 \__fontspec_define_opentype_feature:nnnnn {Kerning} {ResetAll} {} {}
2866 +cpsp,-cpsp,
2867 +kern,-kern,
2869 \__fontspec_define_opentype_onoffreset:nnnnn {Kerning} {Uppercase} {cpsp} {cpsp} {}
2870 \__fontspec_define_opentype_feature:nnnnn {Kerning} {On} {kern} {+kern} {-kern}
2871 \__fontspec_define_opentype_feature:nnnnn {Kerning} {Off} {kern} {-kern} {+kern}
2872 \__fontspec_define_opentype_feature:nnnnn {Kerning} {Reset} {} {} {+kern,-kern}
2873 \__fontspec_define_opentype_feature_group:n {Fractions}
2874 \__fontspec_define_opentype_feature:nnnnn {Fractions} {ResetAll} {} {}
2876 +frac,-frac,
2877 +afrc,-afrc,
2879 \__fontspec_define_opentype_feature:nnnnn {Fractions} {On} {frac} {+frac} {}
2880 \__fontspec_define_opentype_feature:nnnnn {Fractions} {Off} {frac} {-frac} {}
2881 \__fontspec_define_opentype_feature:nnnnn {Fractions} {Reset} {} {} {+frac,-frac}
2882 \__fontspec_define_opentype_onoffreset:nnnnn {Fractions} {Alternate} {afrc} {afrc} {-frac}
2883 \__fontspec_define_opentype_feature_group:n {LocalForms}
2884 \__fontspec_define_opentype_feature:nnnnn {LocalForms} {On} {locl} {+locl} {}
2885 \__fontspec_define_opentype_feature:nnnnn {LocalForms} {Off} {locl} {-locl} {}
2886 \__fontspec_define_opentype_feature:nnnnn {LocalForms} {Reset} {} {} {+locl,-locl}
2888 \__fontspec_define_opentype_feature_group:n {Style}
2889 \__fontspec_define_opentype_feature:nnnnn {Style} {ResetAll} {} {}
2891 +salt,-salt,
2892 +ital,-ital,
2893 +ruby,-ruby,
2894 +swsh,-swsh,
2895 +hist,-hist,
2896 +titl,-titl,
2897 +hkna,-hkna,
2898 +vkna,-vkna,
2899 +ssty=0,-ssty=0,
2900 +ssty=1,-ssty=1,
2902 \__fontspec_define_opentype_onoffreset:nnnnn {Style} {Alternate} {salt} {salt} {}
2903 \__fontspec_define_opentype_onoffreset:nnnnn {Style} {Italic} {ital} {ital} {}
2904 \__fontspec_define_opentype_onoffreset:nnnnn {Style} {Ruby} {ruby} {ruby} {}
2905 \__fontspec_define_opentype_onoffreset:nnnnn {Style} {Swash} {swsh} {swsh} {}
2906 \__fontspec_define_opentype_onoffreset:nnnnn {Style} {Cursive} {swsh} {curs} {}
2907 \__fontspec_define_opentype_onoffreset:nnnnn {Style} {Historic} {hist} {hist} {}
2908 \__fontspec_define_opentype_onoffreset:nnnnn {Style} {Titling} {titl} {titl} {}
2909 \__fontspec_define_opentype_onoffreset:nnnnn {Style} {TitlingCaps} {titl} {titl} {} % backwards compat
2910 \__fontspec_define_opentype_onoffreset:nnnnn {Style} {HorizontalKana} {hkna} {hkna} {+vkna,+pkna}
2911 \__fontspec_define_opentype_onoffreset:nnnnn {Style} {VerticalKana} {vkna} {vkna} {+hkna,+pkna}
2912 \__fontspec_define_opentype_onoffreset:nnnnn {Style} {ProportionalKana} {pkna} {pkna} {+vkna,+hkna}
2913 \__fontspec_define_opentype_feature:nnnnn {Style} {MathScript} {ssty} {+ssty=0} {+ssty=1}
2914 \__fontspec_define_opentype_feature:nnnnn {Style} {MathScriptScript} {ssty} {+ssty=1} {+ssty=0}
2915 \__fontspec_define_opentype_onoffreset:nnnnn {Style} {Uppercase} {case} {case} {}
2916 \__fontspec_define_opentype_feature_group:n {CJKShape}
2917 \__fontspec_define_opentype_feature:nnnnn {CJKShape} {ResetAll} {} {}
2919 +trad,-trad,
2920 +smpl,-smpl,
2921 +jp78,-jp78,
2922 +jp83,-jp83,
2923 +jp90,-jp90,
2924 +jp04,-jp04,
2925 +expt,-expt,
2926 +nlck,-nlck,
2928 \__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {Traditional} {trad} {trad} {+smpl,+jp78,+jp83,+jp90,+jp04,+expt,+nlck}
2929 \__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {Simplified} {smpl} {smpl} {+trad,+jp78,+jp83,+jp90,+jp04,+expt,+nlck}
2930 \__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS1978} {jp78} {jp78} {+trad,+smpl,+jp83,+jp90,+jp04,+expt,+nlck}
2931 \__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS1983} {jp83} {jp83} {+trad,+smpl,+jp78,+jp90,+jp04,+expt,+nlck}
2932 \__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS1990} {jp90} {jp90} {+trad,+smpl,+jp78,+jp83,+jp04,+expt,+nlck}
2933 \__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS2004} {jp04} {jp04} {+trad,+smpl,+jp78,+jp83,+jp90,+expt,+nlck}
2934 \__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {Expert} {expt} {expt} {+trad,+smpl,+jp78,+jp83,+jp90,+jp04,+nlck}
2935 \__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {NLC} {nlck} {nlck} {+trad,+smpl,+jp78,+jp83,+jp90,+jp04,+expt}
2936 \__fontspec_define_opentype_feature_group:n {CharacterWidth}
2937 \__fontspec_define_opentype_feature:nnnnn {CharacterWidth} {ResetAll} {} {}
2939 +pwid,-pwid,
2940 +fwid,-fwid,
2941 +hwid,-hwid,
2942 +twid,-twid,
2943 +qwid,-qwid,
2944 +palt,-palt,
2945 +halt,-halt,
2947 \__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Proportional} {pwid} {pwid} {+fwid,+hwid,+twid,+qwid,+palt,+halt}
2948 \__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Full} {fwid} {fwid} {+pwid,+hwid,+twid,+qwid,+palt,+halt}
2949 \__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Half} {hwid} {hwid} {+pwid,+fwid,+twid,+qwid,+palt,+halt}
2950 \__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Third} {twid} {twid} {+pwid,+fwid,+hwid,+qwid,+palt,+halt}
2951 \__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Quarter} {qwid} {qwid} {+pwid,+fwid,+hwid,+twid,+palt,+halt}
2952 \__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {AlternateProportional} {palt} {palt} {+pwid,+fwid,+hwid,+twid,+qwid,+halt}
2953 \__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {AlternateHalf} {halt} {halt} {+pwid,+fwid,+hwid,+twid,+qwid,+palt}
2954 \__fontspec_define_opentype_feature_group:n {Vertical}
2955 \__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {RotatedGlyphs} {vrt2} {vrt2} {+vrtr,+vert}
2956 \__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {AlternatesForRotation} {vrtr} {vrtr} {+vrt2}
2957 \__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {Alternates} {vert} {vert} {+vrt2}
2958 \__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {KanaAlternates} {vkna} {vkna} {+hkna}
2959 \__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {Kerning} {vkrn} {vkrn} {}
2960 \__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {AlternateMetrics} {valt} {valt} {+vhal,+vpal,+kern}
2961 \__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {HalfMetrics} {vhal} {vhal} {+valt,+vpal,+kern}
2962 \__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {ProportionalMetrics} {vpal} {vpal} {+valt,+vhal}
2963 \__fontspec_define_opentype_feature_group:n {Alternate}
2964 \keys_define:nn {fontspec-opentype}
2966 Alternate .default:n = {0} ,
2967 Alternate .groups:n = {opentype},
2968 Alternate / unknown .code:n =
2970 \clist_map_inline:nn {#1}
2971 { \__fontspec_make_OT_feature:nnn {salt}{ +salt = ##1 }{} }
2974 \aliasfontfeature{Alternate}{StylisticAlternates}
2975 \__fontspec_define_opentype_feature_group:n {Variant}
2976 \keys_define:nn {fontspec-opentype}
2978 Variant .default:n = {0} ,
2979 Variant .groups:n = {opentype} ,
2980 Variant / unknown .code:n =
2982 \clist_map_inline:nn {#1}
2984 \__fontspec_make_OT_feature:xxx { ss \two@digits {##1} } { +ss \two@digits {##1} } {}
2988 \aliasfontfeature{Variant}{StylisticSet}
2989 \__fontspec_define_opentype_feature_group:n {CharacterVariant}
2990 \use:x
2992 \cs_new:Npn \exp_not:N \fontspec_parse_cv:w
2993 ##1 \c_colon_str ##2 \c_colon_str ##3 \exp_not:N \q_nil
2995 \__fontspec_make_OT_feature:xxx
2996 { cv \exp_not:N \two@digits {##1} }
2997 { +cv \exp_not:N \two@digits {##1} = ##2 } {}
2999 \keys_define:nn {fontspec-opentype}
3001 CharacterVariant / unknown .code:n =
3003 \clist_map_inline:nn {##1}
3005 \exp_not:N \fontspec_parse_cv:w
3006 ####1 \c_colon_str 0 \c_colon_str \exp_not:N \q_nil
3011 \__fontspec_define_opentype_feature_group:n {Annotation}
3012 \keys_define:nn {fontspec-opentype}
3014 Annotation .default:n = {0} ,
3015 Annotation .groups:n = {opentype},
3016 Annotation / unknown .code:n =
3018 \__fontspec_make_OT_feature:nnn {nalt} {+nalt=#1} {}
3021 \__fontspec_define_opentype_feature_group:n {Ornament}
3022 \keys_define:nn {fontspec-opentype}
3024 Ornament .default:n = {0} ,
3025 Ornament .groups:n = {opentype},
3026 Ornament / unknown .code:n =
3028 \__fontspec_make_OT_feature:nnn {ornm} { +ornm=#1 } {}
3031 \keys_define:nn {fontspec-opentype}
3033 Script .choice: ,
3034 Script .groups:n = {opentype} ,
3036 \cs_new:Nn \fontspec_new_script:nn
3038 \keys_define:nn {fontspec-opentype} { Script / #1 .code:n =
3040 \bool_set_false:N \l__fontspec_scriptlang_exist_bool
3041 \clist_map_inline:nn {#2}
3043 \exp_args:No \__fontspec_check_script:NnT \l__fontspec_fontface_cs_tl {####1}
3045 \tl_set:Nn \l__fontspec_script_name_tl {#1}
3046 \tl_set:Nn \l__fontspec_script_tl {####1}
3047 \int_set:Nn \l__fontspec_script_int {\l__fontspec_strnum_int}
3048 \bool_set_true:N \l__fontspec_scriptlang_exist_bool
3049 \tl_gset:Nx \g__fontspec_single_feat_tl { script=####1 }
3050 \clist_map_break:
3054 \bool_if:NF \l__fontspec_scriptlang_exist_bool
3056 \bool_if:nF { \str_if_eq_p:ee {#1} {CustomDefault} }
3058 \tl_clear:N \l__fontspec_script_name_tl
3059 \__fontspec_warning:nxx {no-script} {\l_fontspec_fontname_tl} {#1}
3062 \bool_if:nF
3064 \str_if_eq_p:ee {#1} {Default} ||
3065 \str_if_eq_p:ee {#1} {Latin} ||
3066 \str_if_eq_p:ee {#1} {CustomDefault}
3069 \keys_set:nn {fontspec-opentype} { Script = CustomDefault }
3075 \keys_define:nn {fontspec-opentype}
3077 Language .choice: ,
3078 Language .groups:n = {opentype} ,
3080 \cs_new:Nn \fontspec_new_lang:nn
3082 \keys_define:nn {fontspec-opentype} { Language / #1 .code:n =
3084 \bool_set_false:N \l__fontspec_scriptlang_exist_bool
3085 \clist_map_inline:nn {#2}
3087 \exp_args:No \__fontspec_check_lang:NnTF \l__fontspec_fontface_cs_tl {####1}
3089 \tl_set:Nn \l__fontspec_lang_tl {####1}
3090 \int_set:Nn \l__fontspec_language_int {\l__fontspec_strnum_int}
3091 \tl_gset:Nx \g__fontspec_single_feat_tl { language=####1 }
3092 \bool_set_true:N \l__fontspec_scriptlang_exist_bool
3093 \clist_map_break:
3096 \bool_if:NF \l__fontspec_scriptlang_exist_bool
3098 \__fontspec_warning:nx {language-not-exist} {#1}
3099 \keys_set:nn {fontspec-opentype} { Language = Default }
3104 \__fontspec_keys_define_code:nnn {fontspec-opentype} { Language / Default }
3106 \tl_set:Nn \l__fontspec_lang_tl {dflt}
3107 \int_zero:N \l__fontspec_language_int
3108 \tl_gset:Nn \g__fontspec_single_feat_tl { language=dflt }
3110 \cs_new:Nn \__fontspec_ot_compat:nn
3112 \aliasfontfeatureoption {#1} {#2Off} {No#2}
3114 \__fontspec_ot_compat:nn {Ligatures} {Rare}
3115 \__fontspec_ot_compat:nn {Ligatures} {Required}
3116 \__fontspec_ot_compat:nn {Ligatures} {Common}
3117 \__fontspec_ot_compat:nn {Ligatures} {Discretionary}
3118 \__fontspec_ot_compat:nn {Ligatures} {Contextual}
3119 \__fontspec_ot_compat:nn {Ligatures} {Historic}
3120 \__fontspec_ot_compat:nn {Numbers} {SlashedZero}
3121 \__fontspec_ot_compat:nn {Contextuals} {Swash}
3122 \__fontspec_ot_compat:nn {Contextuals} {Alternate}
3123 \__fontspec_ot_compat:nn {Contextuals} {WordInitial}
3124 \__fontspec_ot_compat:nn {Contextuals} {WordFinal}
3125 \__fontspec_ot_compat:nn {Contextuals} {LineFinal}
3126 \__fontspec_ot_compat:nn {Contextuals} {Inner}
3127 \__fontspec_ot_compat:nn {Diacritics} {MarkToBase}
3128 \__fontspec_ot_compat:nn {Diacritics} {MarkToMark}
3129 \__fontspec_ot_compat:nn {Diacritics} {AboveBase}
3130 \__fontspec_ot_compat:nn {Diacritics} {BelowBase}
3132 %%^^A%% fontspec-code-scripts.dtx -- part of FONTSPEC <wspr.io/fontspec>
3134 \newfontscript{Adlam}{adlm}
3135 \newfontscript{Ahom}{ahom}
3136 \newfontscript{Anatolian~Hieroglyphs}{hluw}
3137 \newfontscript{Arabic}{arab}
3138 \newfontscript{Armenian}{armn}
3139 \newfontscript{Avestan}{avst}
3140 \newfontscript{Balinese}{bali}
3141 \newfontscript{Bamum}{bamu}
3142 \newfontscript{Bassa~Vah}{bass}
3143 \newfontscript{Batak}{batk}
3144 \newfontscript{Bengali}{bng2,beng}
3145 \newfontscript{Bhaiksuki}{bhks}
3146 \newfontscript{Bopomofo}{bopo}
3147 \newfontscript{Brahmi}{brah}
3148 \newfontscript{Braille}{brai}
3149 \newfontscript{Buginese}{bugi}
3150 \newfontscript{Buhid}{buhd}
3151 \newfontscript{Byzantine~Music}{byzm}
3152 \newfontscript{Canadian~Syllabics}{cans}
3153 \newfontscript{Carian}{cari}
3154 \newfontscript{Caucasian~Albanian}{aghb}
3155 \newfontscript{Chakma}{cakm}
3156 \newfontscript{Cham}{cham}
3157 \newfontscript{Cherokee}{cher}
3158 \newfontscript{Chorasmian}{chrs}
3159 \newfontscript{CJK~Ideographic}{hani}
3160 \newfontscript{Coptic}{copt}
3161 \newfontscript{Cypriot~Syllabary}{cprt}
3162 \newfontscript{Cyrillic}{cyrl}
3163 \newfontscript{Default}{DFLT}
3164 \newfontscript{CustomDefault}{latn,DFLT}
3165 \newfontscript{Deseret}{dsrt}
3166 \newfontscript{Devanagari}{dev2,deva}
3167 \newfontscript{Dives~Akuru}{diak}
3168 \newfontscript{Dogra}{dogr}
3169 \newfontscript{Duployan}{dupl}
3170 \newfontscript{Egyptian~Hieroglyphs}{egyp}
3171 \newfontscript{Elbasan}{elba}
3172 \newfontscript{Elymaic}{elym}
3173 \newfontscript{Ethiopic}{ethi}
3174 \newfontscript{Georgian}{geor}
3175 \newfontscript{Glagolitic}{glag}
3176 \newfontscript{Gothic}{goth}
3177 \newfontscript{Grantha}{gran}
3178 \newfontscript{Greek}{grek}
3179 \newfontscript{Gujarati}{gjr2,gujr}
3180 \newfontscript{Gunjala~Gondi}{gong}
3181 \newfontscript{Gurmukhi}{gur2,guru}
3182 \newfontscript{Hangul~Jamo}{jamo}
3183 \newfontscript{Hangul}{hang}
3184 \newfontscript{Hanifi~Rohingya}{rohg}
3185 \newfontscript{Hanunoo}{hano}
3186 \newfontscript{Hatran}{hatr}
3187 \newfontscript{Hebrew}{hebr}
3188 \newfontscript{Hiragana~and~Katakana}{kana}
3189 \newfontscript{Imperial~Aramaic}{armi}
3190 \newfontscript{Inscriptional~Pahlavi}{phli}
3191 \newfontscript{Inscriptional~Parthian}{prti}
3192 \newfontscript{Javanese}{java}
3193 \newfontscript{Kaithi}{kthi}
3194 \newfontscript{Kannada}{knd2,knda}
3195 \newfontscript{Kayah~Li}{kali}
3196 \newfontscript{Kharosthi}{khar}
3197 \newfontscript{Khitan~Small~Script}{kits}
3198 \newfontscript{Khmer}{khmr}
3199 \newfontscript{Khojki}{khoj}
3200 \newfontscript{Khudawadi}{sind}
3201 \newfontscript{Lao}{lao~}
3202 \newfontscript{Latin}{latn}
3203 \newfontscript{Lepcha}{lepc}
3204 \newfontscript{Limbu}{limb}
3205 \newfontscript{Linear~A}{lina}
3206 \newfontscript{Linear~B}{linb}
3207 \newfontscript{Lisu}{lisu}
3208 \newfontscript{Lycian}{lyci}
3209 \newfontscript{Lydian}{lydi}
3210 \newfontscript{Mahajani}{mahj}
3211 \newfontscript{Makasar}{maka}
3212 \newfontscript{Malayalam}{mlm2,mlym}
3213 \newfontscript{Mandaic}{mand}
3214 \newfontscript{Manichaean}{mani}
3215 \newfontscript{Marchen}{marc}
3216 \newfontscript{Masaram Gondi}{gonm}
3217 \newfontscript{Math}{math}
3218 \newfontscript{Medefaidrin}{medf}
3219 \newfontscript{Meitei~Mayek}{mtei}
3220 \newfontscript{Mende~Kikakui}{mend}
3221 \newfontscript{Meroitic~Cursive}{merc}
3222 \newfontscript{Meroitic~Hieroglyphs}{mero}
3223 \newfontscript{Miao}{plrd}
3224 \newfontscript{Modi}{modi}
3225 \newfontscript{Mongolian}{mong}
3226 \newfontscript{Mro}{mroo}
3227 \newfontscript{Multani}{mult}
3228 \newfontscript{Musical~Symbols}{musc}
3229 \newfontscript{Myanmar}{mym2,mymr}
3230 \newfontscript{N'Ko}{nko~}
3231 \newfontscript{Nabataean}{nbat}
3232 \newfontscript{Nandinagari}{nand}
3233 \newfontscript{Newa}{newa}
3234 \newfontscript{Nushu}{nshu}
3235 \newfontscript{Nyiakeng~Puachue~Hmong}{hmnp}
3236 \newfontscript{Odia}{ory2,orya}
3237 \newfontscript{Ogham}{ogam}
3238 \newfontscript{Ol~Chiki}{olck}
3239 \newfontscript{Old~Italic}{ital}
3240 \newfontscript{Old~Hungarian}{hung}
3241 \newfontscript{Old~North~Arabian}{narb}
3242 \newfontscript{Old~Permic}{perm}
3243 \newfontscript{Old~Persian~Cuneiform}{xpeo}
3244 \newfontscript{Old~Sogdian}{sogo}
3245 \newfontscript{Old~South~Arabian}{sarb}
3246 \newfontscript{Old~Turkic}{orkh}
3247 \newfontscript{Osage}{osge}
3248 \newfontscript{Osmanya}{osma}
3249 \newfontscript{Pahawh~Hmong}{hmng}
3250 \newfontscript{Palmyrene}{palm}
3251 \newfontscript{Pau~Cin~Hau}{pauc}
3252 \newfontscript{Phags-pa}{phag}
3253 \newfontscript{Phoenician}{phnx}
3254 \newfontscript{Psalter~Pahlavi}{phlp}
3255 \newfontscript{Rejang}{rjng}
3256 \newfontscript{Runic}{runr}
3257 \newfontscript{Samaritan}{samr}
3258 \newfontscript{Saurashtra}{saur}
3259 \newfontscript{Sharada}{shrd}
3260 \newfontscript{Shavian}{shaw}
3261 \newfontscript{Siddham}{sidd}
3262 \newfontscript{Sign~Writing}{sgnw}
3263 \newfontscript{Sinhala}{sinh}
3264 \newfontscript{Sogdian}{sogd}
3265 \newfontscript{Sora~Sompeng}{sora}
3266 \newfontscript{Sumero-Akkadian~Cuneiform}{xsux}
3267 \newfontscript{Sundanese}{sund}
3268 \newfontscript{Syloti~Nagri}{sylo}
3269 \newfontscript{Syriac}{syrc}
3270 \newfontscript{Tagalog}{tglg}
3271 \newfontscript{Tagbanwa}{tagb}
3272 \newfontscript{Tai~Le}{tale}
3273 \newfontscript{Tai~Lu}{talu}
3274 \newfontscript{Tai~Tham}{lana}
3275 \newfontscript{Tai~Viet}{tavt}
3276 \newfontscript{Takri}{takr}
3277 \newfontscript{Tamil}{tml2,taml}
3278 \newfontscript{Tangut}{tang}
3279 \newfontscript{Telugu}{tel2,telu}
3280 \newfontscript{Thaana}{thaa}
3281 \newfontscript{Thai}{thai}
3282 \newfontscript{Tibetan}{tibt}
3283 \newfontscript{Tifinagh}{tfng}
3284 \newfontscript{Tirhuta}{tirh}
3285 \newfontscript{Ugaritic~Cuneiform}{ugar}
3286 \newfontscript{Vai}{vai~}
3287 \newfontscript{Wancho}{wcho}
3288 \newfontscript{Warang~Citi}{wara}
3289 \newfontscript{Yezidi}{yezi}
3290 \newfontscript{Yi}{yi~~}
3291 \newfontscript{Zanabazar~Square}{zanb}
3292 \newfontscript{CJK}{hani}
3293 \newfontscript{Kana}{kana}
3294 \newfontscript{Maths}{math}
3295 \newfontscript{N'ko}{nko~}
3296 \newfontscript{Oriya}{ory2,orya}
3298 %%^^A%% fontspec-code-lang.dtx -- part of FONTSPEC <wspr.io/fontspec>
3300 \newfontlanguage{Abaza}{ABA}
3301 \newfontlanguage{Abkhazian}{ABK}
3302 \newfontlanguage{Adyghe}{ADY}
3303 \newfontlanguage{Afrikaans}{AFK}
3304 \newfontlanguage{Afar}{AFR}
3305 \newfontlanguage{Agaw}{AGW}
3306 \newfontlanguage{Altai}{ALT}
3307 \newfontlanguage{Amharic}{AMH}
3308 \newfontlanguage{Arabic}{ARA}
3309 \newfontlanguage{Aari}{ARI}
3310 \newfontlanguage{Arakanese}{ARK}
3311 \newfontlanguage{Assamese}{ASM}
3312 \newfontlanguage{Athapaskan}{ATH}
3313 \newfontlanguage{Avar}{AVR}
3314 \newfontlanguage{Awadhi}{AWA}
3315 \newfontlanguage{Aymara}{AYM}
3316 \newfontlanguage{Azeri}{AZE}
3317 \newfontlanguage{Badaga}{BAD}
3318 \newfontlanguage{Baghelkhandi}{BAG}
3319 \newfontlanguage{Balkar}{BAL}
3320 \newfontlanguage{Baule}{BAU}
3321 \newfontlanguage{Berber}{BBR}
3322 \newfontlanguage{Bench}{BCH}
3323 \newfontlanguage{Bible~Cree}{BCR}
3324 \newfontlanguage{Belarussian}{BEL}
3325 \newfontlanguage{Bemba}{BEM}
3326 \newfontlanguage{Bengali}{BEN}
3327 \newfontlanguage{Bulgarian}{BGR}
3328 \newfontlanguage{Bhili}{BHI}
3329 \newfontlanguage{Bhojpuri}{BHO}
3330 \newfontlanguage{Bikol}{BIK}
3331 \newfontlanguage{Bilen}{BIL}
3332 \newfontlanguage{Blackfoot}{BKF}
3333 \newfontlanguage{Balochi}{BLI}
3334 \newfontlanguage{Balante}{BLN}
3335 \newfontlanguage{Balti}{BLT}
3336 \newfontlanguage{Bambara}{BMB}
3337 \newfontlanguage{Bamileke}{BML}
3338 \newfontlanguage{Breton}{BRE}
3339 \newfontlanguage{Brahui}{BRH}
3340 \newfontlanguage{Braj~Bhasha}{BRI}
3341 \newfontlanguage{Burmese}{BRM}
3342 \newfontlanguage{Bashkir}{BSH}
3343 \newfontlanguage{Beti}{BTI}
3344 \newfontlanguage{Catalan}{CAT}
3345 \newfontlanguage{Cebuano}{CEB}
3346 \newfontlanguage{Chechen}{CHE}
3347 \newfontlanguage{Chaha~Gurage}{CHG}
3348 \newfontlanguage{Chattisgarhi}{CHH}
3349 \newfontlanguage{Chichewa}{CHI}
3350 \newfontlanguage{Chukchi}{CHK}
3351 \newfontlanguage{Chipewyan}{CHP}
3352 \newfontlanguage{Cherokee}{CHR}
3353 \newfontlanguage{Chuvash}{CHU}
3354 \newfontlanguage{Comorian}{CMR}
3355 \newfontlanguage{Coptic}{COP}
3356 \newfontlanguage{Cree}{CRE}
3357 \newfontlanguage{Carrier}{CRR}
3358 \newfontlanguage{Crimean~Tatar}{CRT}
3359 \newfontlanguage{Church~Slavonic}{CSL}
3360 \newfontlanguage{Czech}{CSY}
3361 \newfontlanguage{Danish}{DAN}
3362 \newfontlanguage{Dargwa}{DAR}
3363 \newfontlanguage{Woods~Cree}{DCR}
3364 \newfontlanguage{German}{DEU}
3365 \newfontlanguage{Dogri}{DGR}
3366 \newfontlanguage{Divehi}{DIV}
3367 \newfontlanguage{Djerma}{DJR}
3368 \newfontlanguage{Dangme}{DNG}
3369 \newfontlanguage{Dinka}{DNK}
3370 \newfontlanguage{Dungan}{DUN}
3371 \newfontlanguage{Dzongkha}{DZN}
3372 \newfontlanguage{Ebira}{EBI}
3373 \newfontlanguage{Eastern~Cree}{ECR}
3374 \newfontlanguage{Edo}{EDO}
3375 \newfontlanguage{Efik}{EFI}
3376 \newfontlanguage{Greek}{ELL}
3377 \newfontlanguage{English}{ENG}
3378 \newfontlanguage{Erzya}{ERZ}
3379 \newfontlanguage{Spanish}{ESP}
3380 \newfontlanguage{Estonian}{ETI}
3381 \newfontlanguage{Basque}{EUQ}
3382 \newfontlanguage{Evenki}{EVK}
3383 \newfontlanguage{Even}{EVN}
3384 \newfontlanguage{Ewe}{EWE}
3385 \newfontlanguage{French~Antillean}{FAN}
3386 \newfontlanguage{Farsi}{FAR}
3387 \newfontlanguage{Parsi}{FAR}
3388 \newfontlanguage{Persian}{FAR}
3389 \newfontlanguage{Finnish}{FIN}
3390 \newfontlanguage{Fijian}{FJI}
3391 \newfontlanguage{Flemish}{FLE}
3392 \newfontlanguage{Forest~Nenets}{FNE}
3393 \newfontlanguage{Fon}{FON}
3394 \newfontlanguage{Faroese}{FOS}
3395 \newfontlanguage{French}{FRA}
3396 \newfontlanguage{Frisian}{FRI}
3397 \newfontlanguage{Friulian}{FRL}
3398 \newfontlanguage{Futa}{FTA}
3399 \newfontlanguage{Fulani}{FUL}
3400 \newfontlanguage{Ga}{GAD}
3401 \newfontlanguage{Gaelic}{GAE}
3402 \newfontlanguage{Gagauz}{GAG}
3403 \newfontlanguage{Galician}{GAL}
3404 \newfontlanguage{Garshuni}{GAR}
3405 \newfontlanguage{Garhwali}{GAW}
3406 \newfontlanguage{Ge'ez}{GEZ}
3407 \newfontlanguage{Gilyak}{GIL}
3408 \newfontlanguage{Gumuz}{GMZ}
3409 \newfontlanguage{Gondi}{GON}
3410 \newfontlanguage{Greenlandic}{GRN}
3411 \newfontlanguage{Garo}{GRO}
3412 \newfontlanguage{Guarani}{GUA}
3413 \newfontlanguage{Gujarati}{GUJ}
3414 \newfontlanguage{Haitian}{HAI}
3415 \newfontlanguage{Halam}{HAL}
3416 \newfontlanguage{Harauti}{HAR}
3417 \newfontlanguage{Hausa}{HAU}
3418 \newfontlanguage{Hawaiin}{HAW}
3419 \newfontlanguage{Hammer-Banna}{HBN}
3420 \newfontlanguage{Hiligaynon}{HIL}
3421 \newfontlanguage{Hindi}{HIN}
3422 \newfontlanguage{High~Mari}{HMA}
3423 \newfontlanguage{Hindko}{HND}
3424 \newfontlanguage{Ho}{HO}
3425 \newfontlanguage{Harari}{HRI}
3426 \newfontlanguage{Croatian}{HRV}
3427 \newfontlanguage{Hungarian}{HUN}
3428 \newfontlanguage{Armenian}{HYE}
3429 \newfontlanguage{Igbo}{IBO}
3430 \newfontlanguage{Ijo}{IJO}
3431 \newfontlanguage{Ilokano}{ILO}
3432 \newfontlanguage{Indonesian}{IND}
3433 \newfontlanguage{Ingush}{ING}
3434 \newfontlanguage{Inuktitut}{INU}
3435 \newfontlanguage{Irish}{IRI}
3436 \newfontlanguage{Irish~Traditional}{IRT}
3437 \newfontlanguage{Icelandic}{ISL}
3438 \newfontlanguage{Inari~Sami}{ISM}
3439 \newfontlanguage{Italian}{ITA}
3440 \newfontlanguage{Hebrew}{IWR}
3441 \newfontlanguage{Javanese}{JAV}
3442 \newfontlanguage{Yiddish}{JII}
3443 \newfontlanguage{Japanese}{JAN}
3444 \newfontlanguage{Judezmo}{JUD}
3445 \newfontlanguage{Jula}{JUL}
3446 \newfontlanguage{Kabardian}{KAB}
3447 \newfontlanguage{Kachchi}{KAC}
3448 \newfontlanguage{Kalenjin}{KAL}
3449 \newfontlanguage{Kannada}{KAN}
3450 \newfontlanguage{Karachay}{KAR}
3451 \newfontlanguage{Georgian}{KAT}
3452 \newfontlanguage{Kazakh}{KAZ}
3453 \newfontlanguage{Kebena}{KEB}
3454 \newfontlanguage{Khutsuri~Georgian}{KGE}
3455 \newfontlanguage{Khakass}{KHA}
3456 \newfontlanguage{Khanty-Kazim}{KHK}
3457 \newfontlanguage{Khmer}{KHM}
3458 \newfontlanguage{Khanty-Shurishkar}{KHS}
3459 \newfontlanguage{Khanty-Vakhi}{KHV}
3460 \newfontlanguage{Khowar}{KHW}
3461 \newfontlanguage{Kikuyu}{KIK}
3462 \newfontlanguage{Kirghiz}{KIR}
3463 \newfontlanguage{Kisii}{KIS}
3464 \newfontlanguage{Kokni}{KKN}
3465 \newfontlanguage{Kalmyk}{KLM}
3466 \newfontlanguage{Kamba}{KMB}
3467 \newfontlanguage{Kumaoni}{KMN}
3468 \newfontlanguage{Komo}{KMO}
3469 \newfontlanguage{Komso}{KMS}
3470 \newfontlanguage{Kanuri}{KNR}
3471 \newfontlanguage{Kodagu}{KOD}
3472 \newfontlanguage{Korean~Old~Hangul}{KOH}
3473 \newfontlanguage{Konkani}{KOK}
3474 \newfontlanguage{Kikongo}{KON}
3475 \newfontlanguage{Komi-Permyak}{KOP}
3476 \newfontlanguage{Korean}{KOR}
3477 \newfontlanguage{Komi-Zyrian}{KOZ}
3478 \newfontlanguage{Kpelle}{KPL}
3479 \newfontlanguage{Krio}{KRI}
3480 \newfontlanguage{Karakalpak}{KRK}
3481 \newfontlanguage{Karelian}{KRL}
3482 \newfontlanguage{Karaim}{KRM}
3483 \newfontlanguage{Karen}{KRN}
3484 \newfontlanguage{Koorete}{KRT}
3485 \newfontlanguage{Kashmiri}{KSH}
3486 \newfontlanguage{Khasi}{KSI}
3487 \newfontlanguage{Kildin~Sami}{KSM}
3488 \newfontlanguage{Kui}{KUI}
3489 \newfontlanguage{Kulvi}{KUL}
3490 \newfontlanguage{Kumyk}{KUM}
3491 \newfontlanguage{Kurdish}{KUR}
3492 \newfontlanguage{Kurukh}{KUU}
3493 \newfontlanguage{Kuy}{KUY}
3494 \newfontlanguage{Koryak}{KYK}
3495 \newfontlanguage{Ladin}{LAD}
3496 \newfontlanguage{Lahuli}{LAH}
3497 \newfontlanguage{Lak}{LAK}
3498 \newfontlanguage{Lambani}{LAM}
3499 \newfontlanguage{Lao}{LAO}
3500 \newfontlanguage{Latin}{LAT}
3501 \newfontlanguage{Laz}{LAZ}
3502 \newfontlanguage{L-Cree}{LCR}
3503 \newfontlanguage{Ladakhi}{LDK}
3504 \newfontlanguage{Lezgi}{LEZ}
3505 \newfontlanguage{Lingala}{LIN}
3506 \newfontlanguage{Low~Mari}{LMA}
3507 \newfontlanguage{Limbu}{LMB}
3508 \newfontlanguage{Lomwe}{LMW}
3509 \newfontlanguage{Lower~Sorbian}{LSB}
3510 \newfontlanguage{Lule~Sami}{LSM}
3511 \newfontlanguage{Lithuanian}{LTH}
3512 \newfontlanguage{Luba}{LUB}
3513 \newfontlanguage{Luganda}{LUG}
3514 \newfontlanguage{Luhya}{LUH}
3515 \newfontlanguage{Luo}{LUO}
3516 \newfontlanguage{Latvian}{LVI}
3517 \newfontlanguage{Majang}{MAJ}
3518 \newfontlanguage{Makua}{MAK}
3519 \newfontlanguage{Malayalam~Traditional}{MAL}
3520 \newfontlanguage{Mansi}{MAN}
3521 \newfontlanguage{Marathi}{MAR}
3522 \newfontlanguage{Marwari}{MAW}
3523 \newfontlanguage{Mbundu}{MBN}
3524 \newfontlanguage{Manchu}{MCH}
3525 \newfontlanguage{Moose~Cree}{MCR}
3526 \newfontlanguage{Mende}{MDE}
3527 \newfontlanguage{Me'en}{MEN}
3528 \newfontlanguage{Mizo}{MIZ}
3529 \newfontlanguage{Macedonian}{MKD}
3530 \newfontlanguage{Male}{MLE}
3531 \newfontlanguage{Malagasy}{MLG}
3532 \newfontlanguage{Malinke}{MLN}
3533 \newfontlanguage{Malayalam~Reformed}{MLR}
3534 \newfontlanguage{Malay}{MLY}
3535 \newfontlanguage{Mandinka}{MND}
3536 \newfontlanguage{Mongolian}{MNG}
3537 \newfontlanguage{Manipuri}{MNI}
3538 \newfontlanguage{Maninka}{MNK}
3539 \newfontlanguage{Manx~Gaelic}{MNX}
3540 \newfontlanguage{Moksha}{MOK}
3541 \newfontlanguage{Moldavian}{MOL}
3542 \newfontlanguage{Mon}{MON}
3543 \newfontlanguage{Moroccan}{MOR}
3544 \newfontlanguage{Maori}{MRI}
3545 \newfontlanguage{Maithili}{MTH}
3546 \newfontlanguage{Maltese}{MTS}
3547 \newfontlanguage{Mundari}{MUN}
3548 \newfontlanguage{Naga-Assamese}{NAG}
3549 \newfontlanguage{Nanai}{NAN}
3550 \newfontlanguage{Naskapi}{NAS}
3551 \newfontlanguage{N-Cree}{NCR}
3552 \newfontlanguage{Ndebele}{NDB}
3553 \newfontlanguage{Ndonga}{NDG}
3554 \newfontlanguage{Nepali}{NEP}
3555 \newfontlanguage{Newari}{NEW}
3556 \newfontlanguage{Nagari}{NGR}
3557 \newfontlanguage{Norway~House~Cree}{NHC}
3558 \newfontlanguage{Nisi}{NIS}
3559 \newfontlanguage{Niuean}{NIU}
3560 \newfontlanguage{Nkole}{NKL}
3561 \newfontlanguage{N'ko}{NKO}
3562 \newfontlanguage{Dutch}{NLD}
3563 \newfontlanguage{Nogai}{NOG}
3564 \newfontlanguage{Norwegian}{NOR}
3565 \newfontlanguage{Northern~Sami}{NSM}
3566 \newfontlanguage{Northern~Tai}{NTA}
3567 \newfontlanguage{Esperanto}{NTO}
3568 \newfontlanguage{Nynorsk}{NYN}
3569 \newfontlanguage{Oji-Cree}{OCR}
3570 \newfontlanguage{Ojibway}{OJB}
3571 \newfontlanguage{Oriya}{ORI}
3572 \newfontlanguage{Oromo}{ORO}
3573 \newfontlanguage{Ossetian}{OSS}
3574 \newfontlanguage{Palestinian~Aramaic}{PAA}
3575 \newfontlanguage{Pali}{PAL}
3576 \newfontlanguage{Punjabi}{PAN}
3577 \newfontlanguage{Palpa}{PAP}
3578 \newfontlanguage{Pashto}{PAS}
3579 \newfontlanguage{Polytonic~Greek}{PGR}
3580 \newfontlanguage{Pilipino}{PIL}
3581 \newfontlanguage{Palaung}{PLG}
3582 \newfontlanguage{Polish}{PLK}
3583 \newfontlanguage{Provencal}{PRO}
3584 \newfontlanguage{Portuguese}{PTG}
3585 \newfontlanguage{Chin}{QIN}
3586 \newfontlanguage{Rajasthani}{RAJ}
3587 \newfontlanguage{R-Cree}{RCR}
3588 \newfontlanguage{Russian~Buriat}{RBU}
3589 \newfontlanguage{Riang}{RIA}
3590 \newfontlanguage{Rhaeto-Romanic}{RMS}
3591 \newfontlanguage{Romanian}{ROM}
3592 \newfontlanguage{Romany}{ROY}
3593 \newfontlanguage{Rusyn}{RSY}
3594 \newfontlanguage{Ruanda}{RUA}
3595 \newfontlanguage{Russian}{RUS}
3596 \newfontlanguage{Sadri}{SAD}
3597 \newfontlanguage{Sanskrit}{SAN}
3598 \newfontlanguage{Santali}{SAT}
3599 \newfontlanguage{Sayisi}{SAY}
3600 \newfontlanguage{Sekota}{SEK}
3601 \newfontlanguage{Selkup}{SEL}
3602 \newfontlanguage{Sango}{SGO}
3603 \newfontlanguage{Shan}{SHN}
3604 \newfontlanguage{Sibe}{SIB}
3605 \newfontlanguage{Sidamo}{SID}
3606 \newfontlanguage{Silte~Gurage}{SIG}
3607 \newfontlanguage{Skolt~Sami}{SKS}
3608 \newfontlanguage{Slovak}{SKY}
3609 \newfontlanguage{Slavey}{SLA}
3610 \newfontlanguage{Slovenian}{SLV}
3611 \newfontlanguage{Somali}{SML}
3612 \newfontlanguage{Samoan}{SMO}
3613 \newfontlanguage{Sena}{SNA}
3614 \newfontlanguage{Sindhi}{SND}
3615 \newfontlanguage{Sinhalese}{SNH}
3616 \newfontlanguage{Soninke}{SNK}
3617 \newfontlanguage{Sodo~Gurage}{SOG}
3618 \newfontlanguage{Sotho}{SOT}
3619 \newfontlanguage{Albanian}{SQI}
3620 \newfontlanguage{Serbian}{SRB}
3621 \newfontlanguage{Saraiki}{SRK}
3622 \newfontlanguage{Serer}{SRR}
3623 \newfontlanguage{South~Slavey}{SSL}
3624 \newfontlanguage{Southern~Sami}{SSM}
3625 \newfontlanguage{Suri}{SUR}
3626 \newfontlanguage{Svan}{SVA}
3627 \newfontlanguage{Swedish}{SVE}
3628 \newfontlanguage{Swadaya~Aramaic}{SWA}
3629 \newfontlanguage{Swahili}{SWK}
3630 \newfontlanguage{Swazi}{SWZ}
3631 \newfontlanguage{Sutu}{SXT}
3632 \newfontlanguage{Syriac}{SYR}
3633 \newfontlanguage{Tabasaran}{TAB}
3634 \newfontlanguage{Tajiki}{TAJ}
3635 \newfontlanguage{Tamil}{TAM}
3636 \newfontlanguage{Tatar}{TAT}
3637 \newfontlanguage{TH-Cree}{TCR}
3638 \newfontlanguage{Telugu}{TEL}
3639 \newfontlanguage{Tongan}{TGN}
3640 \newfontlanguage{Tigre}{TGR}
3641 \newfontlanguage{Tigrinya}{TGY}
3642 \newfontlanguage{Thai}{THA}
3643 \newfontlanguage{Tahitian}{THT}
3644 \newfontlanguage{Tibetan}{TIB}
3645 \newfontlanguage{Turkish}{TRK,TUR}
3646 \newfontlanguage{Turkmen}{TKM}
3647 \newfontlanguage{Temne}{TMN}
3648 \newfontlanguage{Tswana}{TNA}
3649 \newfontlanguage{Tundra~Nenets}{TNE}
3650 \newfontlanguage{Tonga}{TNG}
3651 \newfontlanguage{Todo}{TOD}
3652 \newfontlanguage{Tsonga}{TSG}
3653 \newfontlanguage{Turoyo~Aramaic}{TUA}
3654 \newfontlanguage{Tulu}{TUL}
3655 \newfontlanguage{Tuvin}{TUV}
3656 \newfontlanguage{Twi}{TWI}
3657 \newfontlanguage{Udmurt}{UDM}
3658 \newfontlanguage{Ukrainian}{UKR}
3659 \newfontlanguage{Urdu}{URD}
3660 \newfontlanguage{Upper~Sorbian}{USB}
3661 \newfontlanguage{Uyghur}{UYG}
3662 \newfontlanguage{Uzbek}{UZB}
3663 \newfontlanguage{Venda}{VEN}
3664 \newfontlanguage{Vietnamese}{VIT}
3665 \newfontlanguage{Wa}{WA}
3666 \newfontlanguage{Wagdi}{WAG}
3667 \newfontlanguage{West-Cree}{WCR}
3668 \newfontlanguage{Welsh}{WEL}
3669 \newfontlanguage{Wolof}{WLF}
3670 \newfontlanguage{Tai~Lue}{XBD}
3671 \newfontlanguage{Xhosa}{XHS}
3672 \newfontlanguage{Yakut}{YAK}
3673 \newfontlanguage{Yoruba}{YBA}
3674 \newfontlanguage{Y-Cree}{YCR}
3675 \newfontlanguage{Yi~Classic}{YIC}
3676 \newfontlanguage{Yi~Modern}{YIM}
3677 \newfontlanguage{Chinese~Hong~Kong}{ZHH}
3678 \newfontlanguage{Chinese~Phonetic}{ZHP}
3679 \newfontlanguage{Chinese~Simplified}{ZHS}
3680 \newfontlanguage{Chinese~Traditional}{ZHT}
3681 \newfontlanguage{Zande}{ZND}
3682 \newfontlanguage{Zulu}{ZUL}
3684 %%^^A%% fontspec-code-feat-aat.dtx -- part of FONTSPEC <wspr.io/fontspec>
3687 \__fontspec_define_aat_feature_group:n {Ligatures}
3688 \__fontspec_define_aat_feature:nnnn {Ligatures} {Required} {1} {0}
3689 \__fontspec_define_aat_feature:nnnn {Ligatures} {NoRequired} {1} {1}
3690 \__fontspec_define_aat_feature:nnnn {Ligatures} {Common} {1} {2}
3691 \__fontspec_define_aat_feature:nnnn {Ligatures} {NoCommon} {1} {3}
3692 \__fontspec_define_aat_feature:nnnn {Ligatures} {Rare} {1} {4}
3693 \__fontspec_define_aat_feature:nnnn {Ligatures} {NoRare} {1} {5}
3694 \__fontspec_define_aat_feature:nnnn {Ligatures} {Discretionary} {1} {4}
3695 \__fontspec_define_aat_feature:nnnn {Ligatures} {NoDiscretionary} {1} {5}
3696 \__fontspec_define_aat_feature:nnnn {Ligatures} {Logos} {1} {6}
3697 \__fontspec_define_aat_feature:nnnn {Ligatures} {NoLogos} {1} {7}
3698 \__fontspec_define_aat_feature:nnnn {Ligatures} {Rebus} {1} {8}
3699 \__fontspec_define_aat_feature:nnnn {Ligatures} {NoRebus} {1} {9}
3700 \__fontspec_define_aat_feature:nnnn {Ligatures} {Diphthong} {1} {10}
3701 \__fontspec_define_aat_feature:nnnn {Ligatures} {NoDiphthong} {1} {11}
3702 \__fontspec_define_aat_feature:nnnn {Ligatures} {Squared} {1} {12}
3703 \__fontspec_define_aat_feature:nnnn {Ligatures} {NoSquared} {1} {13}
3704 \__fontspec_define_aat_feature:nnnn {Ligatures} {AbbrevSquared} {1} {14}
3705 \__fontspec_define_aat_feature:nnnn {Ligatures} {NoAbbrevSquared} {1} {15}
3706 \__fontspec_define_aat_feature:nnnn {Ligatures} {Icelandic} {1} {32}
3707 \__fontspec_define_aat_feature:nnnn {Ligatures} {NoIcelandic} {1} {33}
3708 \keys_define:nn {fontspec-aat}
3710 Ligatures / TeX .code:n =
3712 \tl_set:Nn \l__fontspec_mapping_tl { tex-text }
3715 \__fontspec_define_aat_feature_group:n {Letters}
3716 \__fontspec_define_aat_feature:nnnn {Letters} {Normal} {3} {0}
3717 \__fontspec_define_aat_feature:nnnn {Letters} {Uppercase} {3} {1}
3718 \__fontspec_define_aat_feature:nnnn {Letters} {Lowercase} {3} {2}
3719 \__fontspec_define_aat_feature:nnnn {Letters} {SmallCaps} {3} {3}
3720 \__fontspec_define_aat_feature:nnnn {Letters} {InitialCaps} {3} {4}
3721 \__fontspec_define_aat_feature_group:n {Numbers}
3722 \__fontspec_define_aat_feature:nnnn {Numbers} {Monospaced} {6} {0}
3723 \__fontspec_define_aat_feature:nnnn {Numbers} {Proportional} {6} {1}
3724 \__fontspec_define_aat_feature:nnnn {Numbers} {Lowercase} {21} {0}
3725 \__fontspec_define_aat_feature:nnnn {Numbers} {OldStyle} {21} {0}
3726 \__fontspec_define_aat_feature:nnnn {Numbers} {Uppercase} {21} {1}
3727 \__fontspec_define_aat_feature:nnnn {Numbers} {Lining} {21} {1}
3728 \__fontspec_define_aat_feature:nnnn {Numbers} {SlashedZero} {14} {5}
3729 \__fontspec_define_aat_feature:nnnn {Numbers} {NoSlashedZero} {14} {4}
3730 \__fontspec_define_aat_feature_group:n {Contextuals}
3731 \__fontspec_define_aat_feature:nnnn {Contextuals} {WordInitial} {8} {0}
3732 \__fontspec_define_aat_feature:nnnn {Contextuals} {NoWordInitial} {8} {1}
3733 \__fontspec_define_aat_feature:nnnn {Contextuals} {WordFinal} {8} {2}
3734 \__fontspec_define_aat_feature:nnnn {Contextuals} {NoWordFinal} {8} {3}
3735 \__fontspec_define_aat_feature:nnnn {Contextuals} {LineInitial} {8} {4}
3736 \__fontspec_define_aat_feature:nnnn {Contextuals} {NoLineInitial} {8} {5}
3737 \__fontspec_define_aat_feature:nnnn {Contextuals} {LineFinal} {8} {6}
3738 \__fontspec_define_aat_feature:nnnn {Contextuals} {NoLineFinal} {8} {7}
3739 \__fontspec_define_aat_feature:nnnn {Contextuals} {Inner} {8} {8}
3740 \__fontspec_define_aat_feature:nnnn {Contextuals} {NoInner} {8} {9}
3741 \__fontspec_define_aat_feature_group:n {Diacritics}
3742 \__fontspec_define_aat_feature:nnnn {Diacritics} {Show} {9} {0}
3743 \__fontspec_define_aat_feature:nnnn {Diacritics} {Hide} {9} {1}
3744 \__fontspec_define_aat_feature:nnnn {Diacritics} {Decompose} {9} {2}
3745 \__fontspec_define_aat_feature_group:n {VerticalPosition}
3746 \__fontspec_define_aat_feature:nnnn {VerticalPosition} {Normal} {10} {0}
3747 \__fontspec_define_aat_feature:nnnn {VerticalPosition} {Superior} {10} {1}
3748 \__fontspec_define_aat_feature:nnnn {VerticalPosition} {Inferior} {10} {2}
3749 \__fontspec_define_aat_feature:nnnn {VerticalPosition} {Ordinal} {10} {3}
3750 \__fontspec_define_aat_feature_group:n {Fractions}
3751 \__fontspec_define_aat_feature:nnnn {Fractions} {On} {11} {1}
3752 \__fontspec_define_aat_feature:nnnn {Fractions} {Off} {11} {0}
3753 \__fontspec_define_aat_feature:nnnn {Fractions} {Diagonal} {11} {2}
3754 \__fontspec_define_aat_feature_group:n { Alternate }
3755 \keys_define:nn {fontspec-aat}
3757 Alternate .default:n = {0} ,
3758 Alternate / unknown .code:n =
3760 \clist_map_inline:nn {#1}
3762 \__fontspec_make_AAT_feature:nn {17}{##1}
3766 \__fontspec_define_aat_feature_group:n {Variant}
3767 \keys_define:nn {fontspec-aat}
3769 Variant .default:n = {0} ,
3770 Variant / unknown .code:n =
3772 \clist_map_inline:nn {#1}
3773 { \__fontspec_make_AAT_feature:nn {18}{##1} }
3776 \aliasfontfeature{Variant}{StylisticSet}
3777 \__fontspec_define_aat_feature_group:n {Vertical}
3778 \keys_define:nn {fontspec-aat}
3780 Vertical .choice: ,
3781 Vertical / RotatedGlyphs .code:n =
3783 \__fontspec_update_featstr:n {vertical}
3786 \__fontspec_define_aat_feature_group:n {Style}
3787 \__fontspec_define_aat_feature:nnnn {Style} {Italic} {32} {2}
3788 \__fontspec_define_aat_feature:nnnn {Style} {Ruby} {28} {2}
3789 \__fontspec_define_aat_feature:nnnn {Style} {Display} {19} {1}
3790 \__fontspec_define_aat_feature:nnnn {Style} {Engraved} {19} {2}
3791 \__fontspec_define_aat_feature:nnnn {Style} {Titling} {19} {4}
3792 \__fontspec_define_aat_feature:nnnn {Style} {TitlingCaps} {19} {4} % backwards compat
3793 \__fontspec_define_aat_feature:nnnn {Style} {TallCaps} {19} {5}
3794 \__fontspec_define_aat_feature_group:n {CJKShape}
3795 \__fontspec_define_aat_feature:nnnn {CJKShape} {Traditional} {20} {0}
3796 \__fontspec_define_aat_feature:nnnn {CJKShape} {Simplified} {20} {1}
3797 \__fontspec_define_aat_feature:nnnn {CJKShape} {JIS1978} {20} {2}
3798 \__fontspec_define_aat_feature:nnnn {CJKShape} {JIS1983} {20} {3}
3799 \__fontspec_define_aat_feature:nnnn {CJKShape} {JIS1990} {20} {4}
3800 \__fontspec_define_aat_feature:nnnn {CJKShape} {Expert} {20} {10}
3801 \__fontspec_define_aat_feature:nnnn {CJKShape} {NLC} {20} {13}
3802 \__fontspec_define_aat_feature_group:n {CharacterWidth}
3803 \__fontspec_define_aat_feature:nnnn {CharacterWidth} {Proportional} {22} {0}
3804 \__fontspec_define_aat_feature:nnnn {CharacterWidth} {Full} {22} {1}
3805 \__fontspec_define_aat_feature:nnnn {CharacterWidth} {Half} {22} {2}
3806 \__fontspec_define_aat_feature:nnnn {CharacterWidth} {Third} {22} {3}
3807 \__fontspec_define_aat_feature:nnnn {CharacterWidth} {Quarter} {22} {4}
3808 \__fontspec_define_aat_feature:nnnn {CharacterWidth} {AlternateProportional} {22} {5}
3809 \__fontspec_define_aat_feature:nnnn {CharacterWidth} {AlternateHalf} {22} {6}
3810 \__fontspec_define_aat_feature:nnnn {CharacterWidth} {Default} {22} {7}
3811 \__fontspec_define_aat_feature_group:n {Annotation}
3812 \__fontspec_define_aat_feature:nnnn {Annotation} {Off} {24} {0}
3813 \__fontspec_define_aat_feature:nnnn {Annotation} {Box} {24} {1}
3814 \__fontspec_define_aat_feature:nnnn {Annotation} {RoundedBox} {24} {2}
3815 \__fontspec_define_aat_feature:nnnn {Annotation} {Circle} {24} {3}
3816 \__fontspec_define_aat_feature:nnnn {Annotation} {BlackCircle} {24} {4}
3817 \__fontspec_define_aat_feature:nnnn {Annotation} {Parenthesis} {24} {5}
3818 \__fontspec_define_aat_feature:nnnn {Annotation} {Period} {24} {6}
3819 \__fontspec_define_aat_feature:nnnn {Annotation} {RomanNumerals} {24} {7}
3820 \__fontspec_define_aat_feature:nnnn {Annotation} {Diamond} {24} {8}
3821 \__fontspec_define_aat_feature:nnnn {Annotation} {BlackSquare} {24} {9}
3822 \__fontspec_define_aat_feature:nnnn {Annotation} {BlackRoundSquare} {24} {10}
3823 \__fontspec_define_aat_feature:nnnn {Annotation} {DoubleCircle} {24} {11}
3825 %%^^A%% fontspec-code-enc.dtx -- part of FONTSPEC <wspr.io/fontspec>
3827 \DeclareDocumentCommand \EncodingCommand { m O{} O{} m }
3829 \bool_if:NF \l__fontspec_defining_encoding_bool
3830 { \__fontspec_error:nn {only-inside-encdef} \EncodingCommand }
3831 \DeclareTextCommand{#1}{\UnicodeEncodingName}[#2][#3]{#4}
3833 \DeclareDocumentCommand \EncodingAccent {mm}
3835 \bool_if:NF \l__fontspec_defining_encoding_bool
3836 { \__fontspec_error:nn {only-inside-encdef} \EncodingAccent }
3837 \DeclareTextCommand{#1}{\UnicodeEncodingName}{\add@unicode@accent{#2}}
3839 \DeclareDocumentCommand \EncodingSymbol {mm}
3841 \bool_if:NF \l__fontspec_defining_encoding_bool
3842 { \__fontspec_error:nn {only-inside-encdef} \EncodingSymbol }
3843 \DeclareTextSymbol{#1}{\UnicodeEncodingName}{#2}
3845 \DeclareDocumentCommand \EncodingComposite {mmm}
3847 \bool_if:NF \l__fontspec_defining_encoding_bool
3848 { \__fontspec_error:nn {only-inside-encdef} \EncodingComposite }
3849 \DeclareTextComposite{#1}{\UnicodeEncodingName}{#2}{#3}
3851 \DeclareDocumentCommand \EncodingCompositeCommand {mmm}
3853 \bool_if:NF \l__fontspec_defining_encoding_bool
3854 { \__fontspec_error:nn {only-inside-encdef} \EncodingCompositeCommand }
3855 \DeclareTextCompositeCommand{#1}{\UnicodeEncodingName}{#2}{#3}
3857 \DeclareDocumentCommand \DeclareUnicodeEncoding {mm}
3859 \DeclareFontEncoding{#1}{}{}
3860 \DeclareFontSubstitution{#1}{lmr}{m}{n}
3861 \DeclareFontFamily{#1}{lmr}{}
3863 \DeclareFontShape{#1}{lmr}{m}{n}
3864 {<->\UnicodeFontFile{lmroman10-regular}{\UnicodeFontTeXLigatures}}{}
3865 \DeclareFontShape{#1}{lmr}{m}{it}
3866 {<->\UnicodeFontFile{lmroman10-italic}{\UnicodeFontTeXLigatures}}{}
3867 \DeclareFontShape{#1}{lmr}{m}{sc}
3868 {<->\UnicodeFontFile{lmromancaps10-regular}{\UnicodeFontTeXLigatures}}{}
3869 \DeclareFontShape{#1}{lmr}{bx}{n}
3870 {<->\UnicodeFontFile{lmroman10-bold}{\UnicodeFontTeXLigatures}}{}
3871 \DeclareFontShape{#1}{lmr}{bx}{it}
3872 {<->\UnicodeFontFile{lmroman10-bolditalic}{\UnicodeFontTeXLigatures}}{}
3874 \tl_set_eq:NN \l__fontspec_prev_unicode_name_tl \UnicodeEncodingName
3875 \tl_set:Nn \UnicodeEncodingName {#1}
3876 \bool_set_true:N \l__fontspec_defining_encoding_bool
3878 \bool_set_false:N \l__fontspec_defining_encoding_bool
3879 \tl_set_eq:NN \UnicodeEncodingName \l__fontspec_prev_unicode_name_tl
3881 \DeclareDocumentCommand \UndeclareSymbol {m}
3883 \bool_if:NF \l__fontspec_defining_encoding_bool
3884 { \__fontspec_error:nn {only-inside-encdef} \UndeclareSymbol }
3885 \UndeclareTextCommand {#1} {\UnicodeEncodingName}
3887 \DeclareDocumentCommand \UndeclareAccent {m}
3889 \bool_if:NF \l__fontspec_defining_encoding_bool
3890 { \__fontspec_error:nn {only-inside-encdef} \UndeclareAccent }
3891 \UndeclareTextCommand {#1} {\UnicodeEncodingName}
3893 \DeclareDocumentCommand \UndeclareCommand {m}
3895 \bool_if:NF \l__fontspec_defining_encoding_bool
3896 { \__fontspec_error:nn {only-inside-encdef} \UndeclareCommand }
3897 \UndeclareTextCommand {#1} {\UnicodeEncodingName}
3899 \DeclareDocumentCommand \UndeclareComposite {mm}
3901 \bool_if:NF \l__fontspec_defining_encoding_bool
3902 { \__fontspec_error:nn {only-inside-encdef} \UndeclareComposite }
3903 \cs_undefine:c
3904 { \c_backslash_str \UnicodeEncodingName \token_to_str:N #1 - \tl_to_str:n {#2} }
3907 %%^^A%% fontspec-code-math.dtx -- part of FONTSPEC <wspr.io/fontspec>
3908 \@ifpackageloaded{euler}
3909 { \bool_gset_true:N \g__fontspec_pkg_euler_loaded_bool }
3910 { \bool_gset_false:N \g__fontspec_pkg_euler_loaded_bool }
3911 \cs_new:Nn \fontspec_setup_maths:
3913 \@ifpackageloaded{euler}
3915 \bool_if:NTF \g__fontspec_pkg_euler_loaded_bool
3916 { \bool_gset_true:N \g__fontspec_math_euler_bool }
3917 { \__fontspec_error:n {euler-too-late} }
3920 \@ifpackageloaded{lucbmath}{ \bool_gset_true:N \g__fontspec_math_lucida_bool }{}
3921 \@ifpackageloaded{lucidabr}{ \bool_gset_true:N \g__fontspec_math_lucida_bool }{}
3922 \@ifpackageloaded{lucimatx}{ \bool_gset_true:N \g__fontspec_math_lucida_bool }{}
3923 \DeclareSymbolFont{legacymaths}{OT1}{cmr}{m}{n}
3924 \SetSymbolFont{legacymaths}{bold}{OT1}{cmr}{bx}{n}
3925 \DeclareMathAccent{\acute} {\mathalpha}{legacymaths}{19}
3926 \DeclareMathAccent{\grave} {\mathalpha}{legacymaths}{18}
3927 \DeclareMathAccent{\ddot} {\mathalpha}{legacymaths}{127}
3928 \DeclareMathAccent{\tilde} {\mathalpha}{legacymaths}{126}
3929 \DeclareMathAccent{\bar} {\mathalpha}{legacymaths}{22}
3930 \DeclareMathAccent{\breve} {\mathalpha}{legacymaths}{21}
3931 \DeclareMathAccent{\check} {\mathalpha}{legacymaths}{20}
3932 \DeclareMathAccent{\hat} {\mathalpha}{legacymaths}{94} % too bad, euler
3933 \DeclareMathAccent{\dot} {\mathalpha}{legacymaths}{95}
3934 \DeclareMathAccent{\mathring}{\mathalpha}{legacymaths}{23}
3935 \group_begin:
3936 \mathchardef\@tempa="603A \relax
3937 \ifx\colon\@tempa
3938 \DeclareMathSymbol{\colon}{\mathpunct}{legacymaths}{58}
3940 \group_end:
3941 \bool_if:NF \g__fontspec_math_euler_bool
3943 \DeclareMathSymbol{!}{\mathclose}{legacymaths}{33}
3944 \DeclareMathSymbol{:}{\mathrel} {legacymaths}{58}
3945 \DeclareMathSymbol{;}{\mathpunct}{legacymaths}{59}
3946 \DeclareMathSymbol{?}{\mathclose}{legacymaths}{63}
3947 \bool_if:NF \g__fontspec_math_lucida_bool
3949 \DeclareMathSymbol{0}{\mathalpha}{legacymaths}{`0}
3950 \DeclareMathSymbol{1}{\mathalpha}{legacymaths}{`1}
3951 \DeclareMathSymbol{2}{\mathalpha}{legacymaths}{`2}
3952 \DeclareMathSymbol{3}{\mathalpha}{legacymaths}{`3}
3953 \DeclareMathSymbol{4}{\mathalpha}{legacymaths}{`4}
3954 \DeclareMathSymbol{5}{\mathalpha}{legacymaths}{`5}
3955 \DeclareMathSymbol{6}{\mathalpha}{legacymaths}{`6}
3956 \DeclareMathSymbol{7}{\mathalpha}{legacymaths}{`7}
3957 \DeclareMathSymbol{8}{\mathalpha}{legacymaths}{`8}
3958 \DeclareMathSymbol{9}{\mathalpha}{legacymaths}{`9}
3959 \DeclareMathSymbol{\Gamma}{\mathalpha}{legacymaths}{0}
3960 \DeclareMathSymbol{\Delta}{\mathalpha}{legacymaths}{1}
3961 \DeclareMathSymbol{\Theta}{\mathalpha}{legacymaths}{2}
3962 \DeclareMathSymbol{\Lambda}{\mathalpha}{legacymaths}{3}
3963 \DeclareMathSymbol{\Xi}{\mathalpha}{legacymaths}{4}
3964 \DeclareMathSymbol{\Pi}{\mathalpha}{legacymaths}{5}
3965 \DeclareMathSymbol{\Sigma}{\mathalpha}{legacymaths}{6}
3966 \DeclareMathSymbol{\Upsilon}{\mathalpha}{legacymaths}{7}
3967 \DeclareMathSymbol{\Phi}{\mathalpha}{legacymaths}{8}
3968 \DeclareMathSymbol{\Psi}{\mathalpha}{legacymaths}{9}
3969 \DeclareMathSymbol{\Omega}{\mathalpha}{legacymaths}{10}
3970 \DeclareMathSymbol{+}{\mathbin}{legacymaths}{43}
3971 \DeclareMathSymbol{=}{\mathrel}{legacymaths}{61}
3972 \DeclareMathDelimiter{(}{\mathopen} {legacymaths}{40}{largesymbols}{0}
3973 \DeclareMathDelimiter{)}{\mathclose}{legacymaths}{41}{largesymbols}{1}
3974 \DeclareMathDelimiter{[}{\mathopen} {legacymaths}{91}{largesymbols}{2}
3975 \DeclareMathDelimiter{]}{\mathclose}{legacymaths}{93}{largesymbols}{3}
3976 \DeclareMathDelimiter{/}{\mathord}{legacymaths}{47}{largesymbols}{14}
3977 \DeclareMathSymbol{\mathdollar}{\mathord}{legacymaths}{36}
3978 \renewcommand{\hbar}{{\mathchar"AF\mkern-9mu h}}% TODO: test with other fonts
3981 \DeclareSymbolFont{operators}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\shapedefault
3982 \SetSymbolFont{operators}{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\shapedefault
3983 \DeclareSymbolFontAlphabet\mathrm{operators}
3984 \SetMathAlphabet\mathit{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\itdefault
3985 \SetMathAlphabet\mathbf{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\shapedefault
3986 \SetMathAlphabet\mathsf{normal}\g_fontspec_encoding_tl\g__fontspec_mathsf_tl\mddefault\shapedefault
3987 \SetMathAlphabet\mathtt{normal}\g_fontspec_encoding_tl\g__fontspec_mathtt_tl\mddefault\shapedefault
3988 \SetSymbolFont{operators}{bold}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\shapedefault
3989 \tl_if_empty:NTF \g__fontspec_bfmathrm_tl
3991 \SetMathAlphabet\mathit{bold}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\itdefault
3994 \SetMathAlphabet\mathrm{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\mddefault\shapedefault
3995 \SetMathAlphabet\mathbf{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\bfdefault\shapedefault
3996 \SetMathAlphabet\mathit{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\mddefault\itdefault
3998 \SetMathAlphabet\mathsf{bold}\g_fontspec_encoding_tl\g__fontspec_mathsf_tl\bfdefault\shapedefault
3999 \SetMathAlphabet\mathtt{bold}\g_fontspec_encoding_tl\g__fontspec_mathtt_tl\bfdefault\shapedefault
4001 \cs_new:Nn \fontspec_maybe_setup_maths:
4003 \@ifpackageloaded{anttor}
4005 \ifx\define@antt@mathversions a\bool_gset_false:N \g__fontspec_math_bool\fi
4007 \@ifpackageloaded{arevmath} {\bool_gset_false:N \g__fontspec_math_bool}{}
4008 \@ifpackageloaded{eulervm} {\bool_gset_false:N \g__fontspec_math_bool}{}
4009 \@ifpackageloaded{mathdesign} {\bool_gset_false:N \g__fontspec_math_bool}{}
4010 \@ifpackageloaded{concmath} {\bool_gset_false:N \g__fontspec_math_bool}{}
4011 \@ifpackageloaded{cmbright} {\bool_gset_false:N \g__fontspec_math_bool}{}
4012 \@ifpackageloaded{mathesf} {\bool_gset_false:N \g__fontspec_math_bool}{}
4013 \@ifpackageloaded{gfsartemisia} {\bool_gset_false:N \g__fontspec_math_bool}{}
4014 \@ifpackageloaded{gfsneohellenic} {\bool_gset_false:N \g__fontspec_math_bool}{}
4015 \@ifpackageloaded{iwona}
4017 \ifx\define@iwona@mathversions a\bool_set_false:N \g__fontspec_math_bool\fi
4019 \@ifpackageloaded{kpfonts}{\bool_gset_false:N \g__fontspec_math_bool}{}
4020 \@ifpackageloaded{kmath} {\bool_gset_false:N \g__fontspec_math_bool}{}
4021 \@ifpackageloaded{kurier}
4023 \ifx\define@kurier@mathversions a\bool_set_false:N \g__fontspec_math_bool\fi
4025 \@ifpackageloaded{fouriernc} {\bool_gset_false:N \g__fontspec_math_bool}{}
4026 \@ifpackageloaded{fourier} {\bool_gset_false:N \g__fontspec_math_bool}{}
4027 \@ifpackageloaded{lmodern} {\bool_gset_false:N \g__fontspec_math_bool}{}
4028 \@ifpackageloaded{mathpazo} {\bool_gset_false:N \g__fontspec_math_bool}{}
4029 \@ifpackageloaded{mathptmx} {\bool_gset_false:N \g__fontspec_math_bool}{}
4030 \@ifpackageloaded{MinionPro} {\bool_gset_false:N \g__fontspec_math_bool}{}
4031 \@ifpackageloaded{unicode-math} {\bool_gset_false:N \g__fontspec_math_bool}{}
4032 \@ifpackageloaded{breqn} {\bool_gset_false:N \g__fontspec_math_bool}{}
4033 \@ifpackageloaded{pxfonts} {\bool_gset_false:N \g__fontspec_math_bool}{}
4034 \@ifpackageloaded{txfonts} {\bool_gset_false:N \g__fontspec_math_bool}{}
4035 \@ifpackageloaded{newpxmath} {\bool_gset_false:N \g__fontspec_math_bool}{}
4036 \@ifpackageloaded{newtxmath} {\bool_gset_false:N \g__fontspec_math_bool}{}
4037 \@ifpackageloaded{mtpro2} {\bool_gset_false:N \g__fontspec_math_bool}{}
4038 \bool_if:NT \g__fontspec_math_bool
4040 \__fontspec_info:n {setup-math}
4041 \fontspec_setup_maths:
4044 \AtBeginDocument{\fontspec_maybe_setup_maths:}
4046 %%^^A%% fontspec-code-closing.dtx -- part of FONTSPEC <wspr.io/fontspec>
4047 \bool_if:NT \g__fontspec_cfg_bool
4049 \InputIfFileExists{fontspec.cfg}
4051 { \typeout{No~ fontspec.cfg~ file~ found;~ no~ configuration~ loaded.} }
4054 %%^^A%% fontspec-code-xfss.dtx -- part of FONTSPEC <wspr.io/fontspec>
4056 \providecommand*\scitdefault{\scdefault\itdefault}
4057 \providecommand*\scsldefault{\scdefault\sldefault}
4058 \cs_new:Nn \__fontspec_shape_merge:nn { c__fontspec_shape_#1_#2_tl }
4059 \cs_new:Nn \__fontspec_merge_default_shapes:
4061 \tl_const:cn { \__fontspec_shape_merge:nn \itdefault \scdefault } {\scitdefault}
4062 \tl_const:cn { \__fontspec_shape_merge:nn \sldefault \scdefault } {\scsldefault}
4063 \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \itdefault } {\scitdefault}
4064 \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \sldefault } {\scsldefault}
4065 \tl_const:cn { \__fontspec_shape_merge:nn \scsldefault \itdefault } {\scitdefault}
4066 \tl_const:cn { \__fontspec_shape_merge:nn \scitdefault \sldefault } {\scsldefault}
4067 \tl_const:cn { \__fontspec_shape_merge:nn \scitdefault \shapedefault } {\scdefault}
4068 \tl_const:cn { \__fontspec_shape_merge:nn \scsldefault \shapedefault } {\scdefault}
4070 \__fontspec_merge_default_shapes:
4071 \prg_new_conditional:Nnn \__fontspec_if_merge_shape:n {TF}
4073 \bool_lazy_and:nnTF
4074 { \tl_if_exist_p:c { \__fontspec_shape_merge:nn {\f@shape} {#1} } }
4076 \cs_if_exist_p:c
4078 \f@encoding/\f@family/\f@series/
4079 \tl_use:c { \__fontspec_shape_merge:nn {\f@shape} {#1} }
4082 \prg_return_true: \prg_return_false:
4084 \cs_if_exist:NTF \DeclareFontSeriesChangeRule
4086 \cs_set_eq:NN \emfontdeclare \DeclareEmphSequence
4089 \DeclareRobustCommand{\sishape}
4091 \not@math@alphabet\sishape\relax
4092 \fontshape{\scitdefault}\selectfont
4094 \DeclareTextFontCommand{\textsi}{\sishape}
4095 \cs_new:Nn \__fontspec_merge_shape:n
4097 \__fontspec_if_merge_shape:nTF {#1}
4098 { \fontshape { \tl_use:c { \__fontspec_shape_merge:nn {\f@shape} {#1} } } \selectfont }
4099 { \fontshape {#1} \selectfont }
4101 \DeclareRobustCommand \itshape
4103 \not@math@alphabet\itshape\mathit
4104 \__fontspec_merge_shape:n\itdefault
4106 \DeclareRobustCommand \slshape
4108 \not@math@alphabet\slshape\relax
4109 \__fontspec_merge_shape:n\sldefault
4111 \DeclareRobustCommand \scshape
4113 \not@math@alphabet\scshape\relax
4114 \__fontspec_merge_shape:n\scdefault
4116 \DeclareRobustCommand \upshape
4118 \not@math@alphabet\upshape\relax
4119 \__fontspec_merge_shape:n\updefault
4121 \cs_set_protected:Npn \emfontdeclare #1
4123 \prop_gclear:N \g__fontspec_em_prop
4124 \int_zero:N \l__fontspec_emdef_int
4125 \bool_gset_true:N \g__fontspec_em_normalise_slant_bool
4127 \tl_if_in:nnT {#1} {\slshape}
4129 \tl_if_in:nnT {#1} {\itshape}
4131 \bool_gset_false:N \g__fontspec_em_normalise_slant_bool
4135 \group_begin:
4136 \normalfont
4137 \clist_map_inline:nn {\emreset,#1}
4140 \prop_gput_if_new:NxV \g__fontspec_em_prop { \f@shape } { \l__fontspec_emdef_int }
4141 \prop_gput:Nxn \g__fontspec_em_prop { switch-\int_use:N \l__fontspec_emdef_int } { ##1 }
4142 \int_incr:N \l__fontspec_emdef_int
4144 \group_end:
4146 \DeclareRobustCommand \em
4148 \@nomath\em
4149 \tl_set:Nx \l__fontspec_emshape_query_tl { \f@shape }
4151 \bool_if:NT \g__fontspec_em_normalise_slant_bool
4153 \tl_replace_all:Nnn \l__fontspec_emshape_query_tl {/sl} {/it}
4156 \prop_get:NxNT \g__fontspec_em_prop { \l__fontspec_emshape_query_tl } \l__fontspec_em_tmp_tl
4158 \int_set:Nn \l__fontspec_em_int { \l__fontspec_em_tmp_tl }
4161 \int_incr:N \l__fontspec_em_int
4163 \prop_get:NxNTF \g__fontspec_em_prop { switch-\int_use:N \l__fontspec_em_int } \l__fontspec_em_switch_tl
4164 { \l__fontspec_em_switch_tl }
4166 \int_zero:N \l__fontspec_em_int
4167 \emreset
4171 \DeclareTextFontCommand{\emph}{\em}
4172 \cs_set:Npn \emreset { \upshape }
4173 \cs_set:Npn \emshape { \itshape }
4174 \cs_set:Npn \eminnershape { \upshape }
4175 \emfontdeclare{ \emshape, \eminnershape }
4176 \cs_new:Nn \fontspec_set_em_level:n { \int_set:Nn \l__fontspec_em_int {#1} }
4178 \cs_set_protected:Npn \strongfontdeclare #1
4180 \prop_gclear:N \g__fontspec_strong_prop
4181 \int_zero:N \l__fontspec_strongdef_int
4183 \group_begin:
4184 \normalfont
4185 \clist_map_inline:nn {\strongreset,#1}
4188 \prop_gput_if_new:NxV \g__fontspec_strong_prop { \f@series } { \l__fontspec_strongdef_int }
4189 \prop_gput:Nxn \g__fontspec_strong_prop { switch-\int_use:N \l__fontspec_strongdef_int } { ##1 }
4190 \int_incr:N \l__fontspec_strongdef_int
4192 \group_end:
4194 \DeclareRobustCommand \strongenv
4196 \@nomath\strongenv
4198 \prop_get:NxNT \g__fontspec_strong_prop { \f@series } \l__fontspec_strong_tmp_tl
4200 \int_set:Nn \l__fontspec_strong_int { \l__fontspec_strong_tmp_tl }
4203 \int_incr:N \l__fontspec_strong_int
4205 \prop_get:NxNTF \g__fontspec_strong_prop { switch-\int_use:N \l__fontspec_strong_int } \l__fontspec_strong_switch_tl
4206 { \l__fontspec_strong_switch_tl }
4208 \int_zero:N \l__fontspec_strong_int
4209 \strongreset
4213 \DeclareTextFontCommand{\strong}{\strongenv}
4214 \cs_set:Npn \strongreset {}
4215 \cs_set:Npn \reset@font
4217 \normalfont
4218 \int_zero:N \l__fontspec_em_int
4219 \int_zero:N \l__fontspec_strong_int
4221 \cs_new:Nn \fontspec_set_strong_level:n { \int_set:Nn \l__fontspec_strong_int {#1} }
4222 \strongfontdeclare{ \bfseries }