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
40
41\RequirePackage{xparse}
42\ProvidesExplPackage{fontspec-xetex}%
43  {2020/02/21}{2.7i}{Font selection for XeLaTeX and LuaLaTeX}
44
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
207
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}
227 {
228  \exp_not:N#1can only be used in the second argument
229  to \string\DeclareUnicodeEncoding.
230 }
231\__fontspec_msg_new:nnn {fontspec} {no-size-info}
232 {
233  Size information must be supplied.\\
234  For example, SizeFeatures={Size={8-12},...}.
235 }
236\__fontspec_msg_new:nnnn {fontspec} {font-not-found}
237 {
238  The font "#1" cannot be found.
239 }
240 {
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!
244 }
245\__fontspec_msg_new:nnnn {fontspec} {rename-feature-not-exist}
246 {
247  The feature #1 doesn't appear to be defined.
248 }
249 {
250  It looks like you're trying to rename a feature that doesn't exist.
251 }
252\__fontspec_msg_new:nnn {fontspec} {no-glyph}
253 {
254  '#1' does not contain glyph #2.
255 }
256\__fontspec_msg_new:nnnn {fontspec} {euler-too-late}
257 {
258  The euler package must be loaded BEFORE fontspec.
259 }
260 {
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.
265 }
266\__fontspec_msg_new:nnnn {fontspec} {no-xcolor}
267 {
268  Cannot load named colours without the xcolor package.
269 }
270 {
271  Sorry, I can't do anything to help. Instead of loading
272  the color package, use xcolor instead.
273 }
274\__fontspec_msg_new:nnnn {fontspec} {unknown-color-model}
275 {
276  Error loading colour `#1'; unknown colour model.
277 }
278 {
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.
281 }
282\__fontspec_msg_new:nnnn {fontspec} {not-in-addfontfeatures}
283 {
284  The "#1" font feature cannot be used in \string\addfontfeatures.
285 }
286 {
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.
291 }
292\__fontspec_msg_new:nnn {fontspec} {tu-clash}
293 {
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.
297 }
298\__fontspec_msg_new:nnn {fontspec} {tu-missing}
299 {
300  The TU encoding seems to be missing; please update to the latest version of LaTeX2e.
301 }
302\__fontspec_msg_new:nnn {fontspec} {addfontfeatures-ignored}
303 {
304  \string\addfontfeature (s) ignored \msg_line_context:;
305  it cannot be used with a font that wasn't selected by a fontspec command.\\
306  \\
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". }
311 }
312\__fontspec_msg_new:nnn {fontspec} {feature-option-overwrite}
313 {
314  Option '#2' of font feature '#1' overwritten.
315 }
316\__fontspec_msg_new:nnn {fontspec} {ot-tag-too-long}
317 {
318  OpenType tag '#1' is too long; script, language, and feature tags must be four characters or fewer.
319 }
320\__fontspec_msg_new:nnn {fontspec} {aat-feature-not-exist}
321 {
322  '\l_keys_key_tl=\l_keys_value_tl' feature not supported
323  for AAT font '\l_fontspec_fontname_tl'.
324 }
325\__fontspec_msg_new:nnn {fontspec} {aat-feature-not-exist-in-font}
326 {
327  AAT feature '\l_keys_key_tl=\l_keys_value_tl' (#1) not available
328  in font '\l_fontspec_fontname_tl'.
329 }
330\__fontspec_msg_new:nnn {fontspec} {icu-feature-not-exist}
331 {
332  '\l_keys_key_tl=\l_keys_value_tl' feature not supported
333  for OpenType font '\l_fontspec_fontname_tl'
334 }
335\__fontspec_msg_new:nnn {fontspec} {icu-feature-not-exist-in-font}
336 {
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'.
340 }
341\__fontspec_msg_new:nnn {fontspec} {no-opticals}
342 {
343  '#1' doesn't appear to have an Optical Size axis.
344 }
345\__fontspec_msg_new:nnn {fontspec} {language-not-exist}
346 {
347  Language '#1' not available
348  for font '\l_fontspec_fontname_tl'
349  with script '\l__fontspec_script_name_tl'.
350 }
351\__fontspec_msg_new:nnn {fontspec} {only-xetex-feature}
352 {
353  Ignored XeTeX-only feature: '#1'.
354 }
355\__fontspec_msg_new:nnn {fontspec} {only-luatex-feature}
356 {
357  Ignored LuaTeX-only feature: '#1'.
358 }
359\__fontspec_msg_new:nnn {fontspec} {unknown-renderer}
360 {
361  Renderer '#1' unknown. Assuming Harfbuzz with 'shaper=#1'.
362  Please raise a fontspec issue to add this shaper to the interface.
363 }
364\__fontspec_msg_new:nnn {fontspec} {no-mapping}
365 {
366  Input mapping not supported in LuaTeX.
367 }
368\__fontspec_msg_new:nnn {fontspec} {no-mapping-ligtex}
369 {
370  Input mapping not supported in LuaTeX.\\
371  Use "Ligatures=TeX" instead of "Mapping=tex-text".
372 }
373\__fontspec_msg_new:nnn {fontspec} {cm-default-obsolete}
374 {
375  The "cm-default" package option is obsolete.
376 }
377\__fontspec_msg_new:nnn {fontspec} {font-index-needs-ttc}
378 {
379  The "FontIndex" feature is only supported by TTC (TrueType Collection) fonts.\\
380  Feature ignored.
381 }
382\__fontspec_msg_new:nnn {fontspec} {feat-cannot-remove}
383 {
384  The "#1" feature cannot be deactivated. Request ignored.
385 }
386\__fontspec_msg_new:nnn {fontspec} {defining-font}
387 {
388  Font family '\g__fontspec_nfss_family_tl' created for font '#2'
389  with options [\l__fontspec_all_features_clist].\\
390  \\
391  This font family consists of the following NFSS series/shapes:\\
392  \g__fontspec_defined_shapes_tl
393 }
394\__fontspec_msg_new:nnn {fontspec} {no-font-shape}
395 {
396  Could not resolve font "#1" (it probably doesn't exist).
397 }
398\__fontspec_msg_new:nnn {fontspec} {set-scale}
399 {
400  \l_fontspec_fontname_tl\space scale = \l__fontspec_scale_tl.
401 }
402\__fontspec_msg_new:nnn {fontspec} {setup-math}
403 {
404  Adjusting the maths setup (use [no-math] to avoid this).
405 }
406\__fontspec_msg_new:nnn {fontspec} {no-script}
407 {
408  Font "#1" does not contain requested Script "#2".
409 }
410\__fontspec_msg_new:nnn {fontspec} {opa-twice}
411 {
412  Opacity set twice, in both Colour and Opacity.\\
413  Using specification "Opacity=#1".
414 }
415\__fontspec_msg_new:nnn {fontspec} {opa-twice-col}
416 {
417  Opacity set twice, in both Opacity and Colour.\\
418  Using an opacity specification in hex of "#1/FF".
419 }
420\__fontspec_msg_new:nnn {fontspec} {bad-colour}
421 {
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
427 }
428\char_set_catcode_ignore:n {32}
429
430%%^^A%%  fontspec-code-opening.dtx -- part of FONTSPEC <wspr.io/fontspec>
431\DeclareOption{cm-default}
432  {
433    \__fontspec_warning:n {cm-default-obsolete}
434  }
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}
442  {
443    \msg_redirect_module:nnn { fontspec } { warning } { info }
444    \msg_redirect_module:nnn { fontspec } { info } { none }
445  }
446\DeclareOption{silent}
447  {
448    \msg_redirect_module:nnn { fontspec } { warning } { none }
449    \msg_redirect_module:nnn { fontspec } { info } { none }
450  }
451\ExecuteOptions{config,math,tuenc}
452\ProcessOptions*
453\bool_if:NF \g__fontspec_euenc_bool
454  {
455    \file_if_exist:nTF {tuenc.def}
456      {
457        \cs_if_exist:cF {T@TU}
458          {
459            \__fontspec_warning:n {tu-clash}
460            \DeclareFontEncoding{TU}{}{}
461            \DeclareFontSubstitution{TU}{lmr}{m}{n}
462          }
463      }
464      {
465        \__fontspec_warning:n {tu-missing}
466        \bool_gset_true:N \g__fontspec_euenc_bool
467      }
468  }
469\bool_if:NTF \g__fontspec_euenc_bool
470  {
471    \tl_gset:Nn \g_fontspec_encoding_tl {EU1}
472  }
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
483  {
484    \tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl
485    \tl_set_eq:NN \latinencoding    \g_fontspec_encoding_tl
486  }
487\bool_if:NT \g__fontspec_euenc_bool
488  {
489    \RequirePackage{xunicode}
490  }
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
494  {
495    \keys_set_known:nnN {#1} {#2} #3
496  }
497\cs_generate_variant:Nn \__fontspec_keys_set_known:nnN {nx}
498\cs_new:Nn \__fontspec_int_mult_truncate:Nn
499  {
500    \int_set:Nn #1 { \__dim_eval:w #2 #1 \__dim_eval_end: }
501  }
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}
518
519%%^^A%%  fontspec-code-fontload.dtx -- part of FONTSPEC <wspr.io/fontspec>
520
521\cs_set:Npn \__fontspec_primitive_font_set:Nnn #1#2#3
522  {
523    \font #1 = #2 ~at~ \dim_eval:n {#3} \scan_stop:
524  }
525\cs_set:Npn \__fontspec_primitive_font_gset:Nnn #1#2#3
526  {
527    \global \font #1 = #2 ~at~ \dim_eval:n {#3} \scan_stop:
528  }
529\cs_set:Npn \__fontspec_font_suppress_not_found_error:
530  {
531    \int_set:Nn \suppressfontnotfounderror {1}
532  }
533\prg_set_conditional:Nnn \__fontspec_primitive_font_if_null:N {p,TF,T,F}
534  {
535    \ifx #1 \nullfont
536      \prg_return_true:
537    \else
538      \prg_return_false:
539    \fi
540  }
541\prg_set_conditional:Nnn \__fontspec_primitive_font_set:Nnn {TF,T,F}
542  {
543    \__fontspec_primitive_font_set:Nnn #1 {#2} {#3}
544    \__fontspec_primitive_font_if_null:NTF #1 {\prg_return_false:} {\prg_return_true:}
545  }
546\prg_set_conditional:Nnn \__fontspec_primitive_font_gset:Nnn {TF,T,F}
547  {
548    \__fontspec_primitive_font_gset:Nnn #1 {#2} {#3}
549    \__fontspec_primitive_font_if_null:NTF #1 {\prg_return_false:} {\prg_return_true:}
550  }
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}
556  {
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:  }
563  }
564\prg_new_conditional:Nnn \__fontspec_primitive_font_glyph_if_exist:Nn {p,TF,T,F}
565  {
566    \tex_iffontchar:D #1 #2 \scan_stop:
567      \prg_return_true:
568    \else:
569      \prg_return_false:
570    \fi:
571  }
572\cs_new:Nn \__fontspec_primitive_font_set_hyphenchar:Nn
573  {
574     \tex_hyphenchar:D #1 = #2 \scan_stop:
575  }
576\cs_new_eq:NN \__fontspec_primitive_font_get_name:N \fontname
577\cs_new:Npn \__fontspec_primitive_font_current_name:
578  {
579    \__fontspec_primitive_font_get_name:N \tex_font:D
580  }
581
582%%^^A%%  fontspec-code-interfaces.dtx -- part of FONTSPEC <wspr.io/fontspec>
583
584\NewDocumentCommand \fontspec { O{} m O{} }
585  {
586    \__fontspec_main_fontspec:nn {#1,#3} {#2}
587    \ignorespaces
588  }
589\NewDocumentCommand \setmainfont { O{} m O{} }
590  {
591    \__fontspec_main_setmainfont:nn {#1,#3} {#2}
592    \ignorespaces
593  }
594\NewDocumentCommand \setsansfont { O{} m O{} }
595  {
596    \__fontspec_main_setsansfont:nn {#1,#3} {#2}
597    \ignorespaces
598  }
599\NewDocumentCommand \setmonofont { O{} m O{} }
600  {
601    \__fontspec_main_setmonofont:nn {#1,#3} {#2}
602    \ignorespaces
603  }
604\NewDocumentCommand \setmathrm { O{} m O{} }
605  {
606    \__fontspec_main_setmathrm:nn {#1,#3} {#2}
607  }
608\NewDocumentCommand \setboldmathrm { O{} m O{} }
609  {
610    \__fontspec_main_setboldmathrm:nn {#1,#3} {#2}
611  }
612\NewDocumentCommand \setmathsf { O{} m O{} }
613  {
614    \__fontspec_main_setmathsf:nn {#1,#3} {#2}
615  }
616\NewDocumentCommand \setmathtt { O{} m O{} }
617  {
618    \__fontspec_main_setmathtt:nn {#1,#3} {#2}
619  }
620\NewDocumentCommand \setromanfont { O{} m O{} }
621  {
622    \__fontspec_main_setmainfont:nn {#1,#3} {#2}
623  }
624\NewDocumentCommand \newfontfamily { m O{} m O{} }
625  {
626    \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \NewDocumentCommand
627  }
628\NewDocumentCommand \renewfontfamily { m O{} m O{} }
629  {
630    \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \RenewDocumentCommand
631  }
632\NewDocumentCommand \setfontfamily { m O{} m O{} }
633  {
634    \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \DeclareDocumentCommand
635  }
636\NewDocumentCommand \providefontfamily { m O{} m O{} }
637  {
638    \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \ProvideDocumentCommand
639  }
640\NewDocumentCommand \newfontface { m O{} m O{} }
641  {
642    \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \NewDocumentCommand
643  }
644\NewDocumentCommand \renewfontface { m O{} m O{} }
645  {
646    \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \RenewDocumentCommand
647  }
648\NewDocumentCommand \setfontface { m O{} m O{} }
649  {
650    \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \DeclareDocumentCommand
651  }
652\NewDocumentCommand \providefontface { m O{} m O{} }
653  {
654    \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \ProvideDocumentCommand
655  }
656\NewDocumentCommand \defaultfontfeatures { t+ o m }
657  {
658    \IfNoValueTF {#2}
659      { \__fontspec_set_default_features:nn {#1} {#3} }
660      { \__fontspec_set_font_default_features:nnn {#1} {#2} {#3} }
661    \ignorespaces
662  }
663\NewDocumentCommand \addfontfeatures {m}
664  {
665    \__fontspec_main_addfontfeatures:n {#1}
666  }
667\NewDocumentCommand \addfontfeature  {m}
668  {
669    \__fontspec_main_addfontfeatures:n {#1}
670  }
671\NewDocumentCommand \newfontfeature {mm}
672  {
673    \__fontspec_main_newfontfeature:nn {#1} {#2}
674  }
675\NewDocumentCommand \newAATfeature {mmmm}
676  {
677    \__fontspec_main_newAATfeature:nnnn {#1} {#2} {#3} {#4}
678  }
679\NewDocumentCommand \newopentypefeature {mmm}
680  {
681    \__fontspec_main_newopentypefeature:nnn {#1} {#2} {#3}
682  }
683\NewDocumentCommand \newICUfeature {mmm}
684  {
685    \__fontspec_main_newopentypefeature:nnn {#1} {#2} {#3}
686  }
687\NewDocumentCommand \aliasfontfeature {mm}
688  {
689    \__fontspec_main_aliasfontfeature:nn {#1} {#2}
690  }
691\NewDocumentCommand \aliasfontfeatureoption {mmm}
692  {
693    \__fontspec_main_aliasfontfeatureoption:nnn {#1} {#2} {#3}
694  }
695\NewDocumentCommand \newfontscript {mm}
696  {
697    \fontspec_new_script:nn {#1} {#2}
698  }
699\NewDocumentCommand \newfontlanguage {mm}
700  {
701    \fontspec_new_lang:nn {#1} {#2}
702  }
703\NewDocumentCommand \DeclareFontExtensions {m}
704  {
705    \__fontspec_main_DeclareFontExtensions:n {#1}
706  }
707\NewDocumentCommand \IfFontFeatureActiveTF {mmm}
708  {
709    \__fontspec_main_IfFontFeatureActiveTF:nnn {#1} {#2} {#3}
710  }
711\AtBeginDocument
712  {
713    \RenewDocumentCommand \oldstylenums {m}
714      {
715        \__fontspec_main_oldstylenums:n {#1}
716      }
717  }
718\NewDocumentCommand \liningnums {m}
719  {
720    \__fontspec_main_liningnums:n {#1}
721  }
722
723%%^^A%%  fontspec-code-user.dtx -- part of FONTSPEC <wspr.io/fontspec>
724
725\cs_new:Nn \__fontspec_main_fontspec:nn
726  {
727    \fontspec_set_family:Nnn \f@family {#1} {#2}
728    \fontencoding { \g__fontspec_nfss_enc_tl }
729    \selectfont
730  }
731\cs_if_exist:NTF \@rmfamilyhook
732  {
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}
736  }
737  {
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 }
744  }
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
749  {
750    \ifdefined\DeclareFontSeriesDefault
751      \DeclareFontSeriesDefault[rm]{bf}{\bfdefault}
752    \fi
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
760  }
761\cs_new:Nn \__fontspec_main_setsansfont:nn
762  {
763    \ifdefined\DeclareFontSeriesDefault
764      \DeclareFontSeriesDefault[sf]{bf}{\bfdefault}
765    \fi
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
773  }
774\cs_new:Nn \__fontspec_main_setmonofont:nn
775  {
776    \ifdefined\DeclareFontSeriesDefault
777      \DeclareFontSeriesDefault[tt]{bf}{\bfdefault}
778    \fi
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
786  }
787\cs_new:Nn \__fontspec_main_setmathrm:nn
788  {
789 \fontspec_gset_family:Nnn \g__fontspec_mathrm_tl {#1} {#2}
790    \__fontspec_setmathrm_hook:nn {#1} {#2} % for unicode-math only
791  }
792\cs_new:Nn \__fontspec_main_setboldmathrm:nn
793  {
794 \fontspec_gset_family:Nnn \g__fontspec_bfmathrm_tl {#1} {#2}
795    \__fontspec_setboldmathrm_hook:nn {#1} {#2} % for unicode-math only
796  }
797\cs_new:Nn \__fontspec_main_setmathsf:nn
798  {
799 \fontspec_gset_family:Nnn \g__fontspec_mathsf_tl {#1} {#2}
800    \__fontspec_setmathsf_hook:nn {#1} {#2} % for unicode-math only
801  }
802\cs_new:Nn \__fontspec_main_setmathtt:nn
803  {
804 \fontspec_gset_family:Nnn \g__fontspec_mathtt_tl {#1} {#2}
805    \__fontspec_setmathtt_hook:nn {#1} {#2} % for unicode-math only
806  }
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
822  {
823    \fontspec_set_family:cnn { l__fontspec_ \cs_to_str:N #1 _family_tl } {#2} {#3}
824    \use:x
825      {
826        \exp_not:N #4 \exp_not:N #1 {}
827          {
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
831          }
832      }
833  }
834\cs_new:Nn \__fontspec_main_newfontface:NnnN
835  {
836    \__fontspec_main_newfontfamily:NnnN #1 { BoldFont={},ItalicFont={},SmallCapsFont={},#2 } {#3} #4
837  }
838\cs_new:Nn \__fontspec_set_default_features:nn
839  {
840    \IfBooleanTF {#1} \clist_gput_right:Nn \clist_gset:Nn
841      \g__fontspec_default_fontopts_clist {#2}
842  }
843\cs_new:Nn \__fontspec_set_font_default_features:nnn
844  {
845    \clist_map_inline:nn {#2}
846      {
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} }
850
851        \IfBooleanTF {#1}
852          {
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
857          }
858          {
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,} }
862          }
863      }
864  }
865\cs_new:Nn \__fontspec_main_addfontfeatures:n
866  {
867    \fontspec_if_fontspec_font:TF
868      {
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
875            {
876              \__fontspec_select_font_family:nn
877                { \l__fontspec_options_tl , #1 } {\l__fontspec_fontname_tl}
878            }
879        \group_end:
880        \fontfamily \g__fontspec_nfss_family_tl \selectfont
881      }
882      {
883        \__fontspec_warning:nx {addfontfeatures-ignored} {#1}
884      }
885    \ignorespaces
886  }
887\cs_new:Nn \__fontspec_main_newfontfeature:nn
888  {
889    \keys_define:nn { fontspec }
890      {
891        #1 .code:n = { \__fontspec_update_featstr:n {#2} }
892      }
893  }
894\cs_new:Nn \__fontspec_main_newAATfeature:nnnn
895  {
896    \keys_if_exist:nnF { fontspec } {#1}
897      { \__fontspec_define_aat_feature_group:n {#1} }
898
899    \keys_if_choice_exist:nnnT {fontspec} {#1} {#2}
900      { \__fontspec_warning:nxx {feature-option-overwrite} {#1} {#2} }
901
902    \__fontspec_define_aat_feature:nnnn {#1}{#2}{#3}{#4}
903  }
904\cs_new:Nn \__fontspec_main_newopentypefeature:nnn
905  {
906    \keys_if_exist:nnF { fontspec / options } {#1}
907      { \__fontspec_define_opentype_feature_group:n {#1} }
908
909    \keys_if_choice_exist:nnnT {fontspec} {#1} {#2}
910      { \__fontspec_warning:nxx {feature-option-overwrite} {#1} {#2} }
911
912    \exp_args:Nnnx \__fontspec_define_opentype_feature:nnnnn
913      {#1} {#2} { \__fontspec_strip_plus_minus:n {#3} } {#3} {}
914  }
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
917  {
918    \str_case:nnF {#1} { {+} {#2} {-} {#2} } {#1#2}
919  }
920\cs_new:Nn \__fontspec_main_aliasfontfeature:nn
921  {
922    \bool_set_false:N \l__fontspec_alias_bool
923
924    \clist_map_inline:Nn \g__fontspec_all_keyval_modules_clist
925      {
926        \keys_if_exist:nnT {##1} {#1}
927          {
928            \bool_set_true:N \l__fontspec_alias_bool
929            \keys_define:nn {##1}
930              { #2 .code:n = { \keys_set:nn {##1} { #1 = {####1} } } }
931          }
932      }
933
934    \bool_if:NF \l__fontspec_alias_bool
935      { \__fontspec_warning:nx {rename-feature-not-exist} {#1} }
936  }
937\cs_new:Nn \__fontspec_main_aliasfontfeatureoption:nnn
938  {
939    \bool_set_false:N \l__fontspec_alias_bool
940
941    \clist_map_inline:Nn \g__fontspec_all_keyval_modules_clist
942      {
943        \keys_if_exist:nnT { ##1 / #1 } {#2}
944          {
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} } } }
948          }
949
950       \keys_if_exist:nnT { ##1 / #1 } {#2Reset}
951         {
952            \keys_define:nn { ##1 / #1 }
953              { #3Reset .code:n = { \keys_set:nn {##1} { #1 = {#2Reset} } } }
954         }
955
956       \keys_if_exist:nnT { ##1 / #1 } {#2Off}
957         {
958            \keys_define:nn { ##1 / #1 }
959              { #3Off .code:n = { \keys_set:nn {##1} { #1 = {#2Off} } } }
960         }
961     }
962
963    \bool_if:NF \l__fontspec_alias_bool
964      { \__fontspec_warning:nx {rename-feature-not-exist} {#1/#2} }
965  }
966\cs_new:Nn \__fontspec_main_DeclareFontExtensions:n
967  {
968    \clist_set:Nn \l__fontspec_extensions_clist { #1 }
969  }
970\__fontspec_main_DeclareFontExtensions:n {.otf,.ttf,.OTF,.TTF,.ttc,.TTC,.dfont}
971\cs_new:Nn \__fontspec_main_IfFontFeatureActiveTF:nnn
972  {
973    \__fontspec_if_font_feature:nTF {#1} {#2} {#3}
974  }
975\prg_new_conditional:Nnn \__fontspec_if_font_feature:n {TF}
976  {
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:
987
988
989    \tl_if_empty:NTF \g__fontspec_single_feat_tl { \prg_return_false: }
990      {
991        \exp_args:NV \fontspec_if_current_feature:nTF \g__fontspec_single_feat_tl
992          { \prg_return_true: } { \prg_return_false: }
993      }
994  }
995\cs_new_protected:Nn \__fontspec_main_oldstylenums:n
996  {
997    \group_begin:
998      \addfontfeature{Numbers=OldStyle}
999      #1
1000    \group_end:
1001  }
1002\cs_new_protected:Nn \__fontspec_main_liningnums:n
1003  {
1004    \group_begin:
1005      \addfontfeature{Numbers=Lining}
1006      #1
1007    \group_end:
1008  }
1009
1010%%^^A%%  fontspec-code-api.dtx -- part of FONTSPEC <wspr.io/fontspec>
1011
1012\prg_new_conditional:Nnn \fontspec_if_fontspec_font: {TF,T,F}
1013  {
1014    \cs_if_exist:cTF {g__fontspec_fontinfo_ \f@family _prop} \prg_return_true: \prg_return_false:
1015  }
1016\prg_new_conditional:Nnn \fontspec_if_aat_feature:nn {TF,T,F}
1017  {
1018    \fontspec_if_fontspec_font:TF
1019      {
1020        \__fontspec_set_font_type:N \font
1021        \bool_if:NTF \l__fontspec_atsui_bool
1022          {
1023            \__fontspec_make_AAT_feature_string:NnnTF \font {#1} {#2}
1024              \prg_return_true: \prg_return_false:
1025          }
1026          {
1027            \prg_return_false:
1028          }
1029      }
1030      {
1031        \prg_return_false:
1032      }
1033  }
1034\prg_new_conditional:Nnn \fontspec_if_opentype: {TF,T,F}
1035  {
1036    \fontspec_if_fontspec_font:TF
1037      {
1038        \__fontspec_set_font_type:N \font
1039        \bool_if:NTF \l__fontspec_ot_bool \prg_return_true: \prg_return_false:
1040      }
1041      {
1042        \prg_return_false:
1043      }
1044  }
1045\prg_new_conditional:Nnn \fontspec_if_feature:n {TF,T,F}
1046  {
1047    \fontspec_if_fontspec_font:TF
1048      {
1049        \__fontspec_set_font_type:N \font
1050        \bool_if:NTF \l__fontspec_ot_bool
1051          {
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}
1054
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}
1057
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
1060
1061            \__fontspec_check_ot_feat:NnTF \font {#1} {\prg_return_true:} {\prg_return_false:}
1062          }
1063          {
1064            \prg_return_false:
1065          }
1066      }
1067      {
1068        \prg_return_false:
1069      }
1070  }
1071\prg_new_conditional:Nnn \fontspec_if_feature:nnn {TF,T,F}
1072  {
1073    \fontspec_if_fontspec_font:TF
1074      {
1075        \__fontspec_set_font_type:N \font
1076        \bool_if:NTF \l__fontspec_ot_bool
1077          {
1078            \__fontspec_check_ot_feat:NnnnTF \font {#3} {#2} {#1} \prg_return_true: \prg_return_false:
1079          }
1080          { \prg_return_false: }
1081      }
1082      { \prg_return_false: }
1083  }
1084\prg_new_conditional:Nnn \fontspec_if_script:n {TF,T,F}
1085  {
1086    \fontspec_if_fontspec_font:TF
1087      {
1088        \__fontspec_set_font_type:N \font
1089        \bool_if:NTF \l__fontspec_ot_bool
1090          {
1091            \__fontspec_check_script:NnTF \font {#1} \prg_return_true: \prg_return_false:
1092          }
1093          { \prg_return_false: }
1094      }
1095      { \prg_return_false: }
1096  }
1097\prg_new_conditional:Nnn \fontspec_if_language:n {TF,T,F}
1098  {
1099    \fontspec_if_fontspec_font:TF
1100      {
1101        \__fontspec_set_font_type:N \font
1102        \bool_if:NTF \l__fontspec_ot_bool
1103          {
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
1107
1108            \__fontspec_check_lang:NnTF \font {#1} \prg_return_true: \prg_return_false:
1109          }
1110          { \prg_return_false: }
1111      }
1112      { \prg_return_false: }
1113  }
1114\prg_new_conditional:Nnn \fontspec_if_language:nn {TF,T,F}
1115  {
1116    \fontspec_if_fontspec_font:TF
1117      {
1118        \__fontspec_set_font_type:N \font
1119        \bool_if:NTF \l__fontspec_ot_bool
1120          {
1121            \__fontspec_check_lang:NnnTF \font {#2} {#1} \prg_return_true: \prg_return_false:
1122          }
1123          { \prg_return_false: }
1124      }
1125      { \prg_return_false: }
1126  }
1127\prg_new_conditional:Nnn \fontspec_if_current_script:n {TF,T,F}
1128  {
1129    \fontspec_if_fontspec_font:TF
1130      {
1131        \__fontspec_set_font_type:N \font
1132        \bool_if:NTF \l__fontspec_ot_bool
1133          {
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:}
1137          }
1138          { \prg_return_false: }
1139      }
1140      { \prg_return_false: }
1141  }
1142\prg_new_conditional:Nnn \fontspec_if_current_language:n {TF,T,F}
1143  {
1144    \fontspec_if_fontspec_font:TF
1145      {
1146        \__fontspec_set_font_type:N \font
1147        \bool_if:NTF \l__fontspec_ot_bool
1148          {
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:}
1152          }
1153          { \prg_return_false: }
1154      }
1155      { \prg_return_false: }
1156  }
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
1159  {
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
1166  }
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
1173  {
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
1179  }
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}
1183  {
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:  }
1190  }
1191\cs_set_eq:NN \IfFontExistsTF \fontspec_font_if_exist:nTF
1192
1193\prg_new_conditional:Nnn \fontspec_if_current_feature:n {TF,T,F}
1194  {
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: }
1198  }
1199\prg_new_conditional:Nnn \fontspec_if_small_caps: {TF,T,F}
1200  {
1201    \__fontspec_if_merge_shape:nTF {sc}
1202      {
1203        \tl_set_eq:Nc \l__fontspec_smcp_shape_tl { \__fontspec_shape_merge:nn {\f@shape} {sc} }
1204      }
1205      {
1206        \tl_set:Nn \l__fontspec_smcp_shape_tl {sc}
1207      }
1208
1209    \cs_if_exist:cTF { \f@encoding/\f@family/\f@series/\l__fontspec_smcp_shape_tl }
1210      {
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:  }
1216      }
1217      { \prg_return_false: }
1218  }
1219
1220%%^^A%%  fontspec-code-internal.dtx -- part of FONTSPEC <wspr.io/fontspec>
1221
1222\cs_new_protected:Nn \__fontspec_select_font_family:nn
1223  {
1224    \group_begin:
1225    \__fontspec_font_suppress_not_found_error:
1226    \__fontspec_init:
1227
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}
1231
1232    \__fontspec_if_detect_external:nT {#2}
1233     { \keys_set:nn {fontspec-preparse-external} {Path} }
1234
1235    \keys_set_known:nn {fontspec-preparse-cfg} {#1}
1236
1237    \__fontspec_init_ttc:n {#2}
1238    \__fontspec_load_external_fontoptions:Nn \l_fontspec_fontname_tl {#2}
1239
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 }
1242
1243
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
1249
1250    \__fontspec_save_family_needed:nTF {#2}
1251      {
1252        \__fontspec_save_family:nn {#1} {#2}
1253      }
1254      {
1255      }
1256    \group_end:
1257
1258    \tl_set_eq:NN \l_fontspec_family_tl \g__fontspec_nfss_family_tl
1259  }
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
1262  {
1263    \tl_set:Nx #1 {#2}
1264    \clist_map_inline:Nn \l__fontspec_extensions_clist
1265      {
1266        \tl_if_in:NnT #1 {##1}
1267          {
1268            \tl_remove_once:Nn #1 {##1}
1269            \tl_set:Nn \l__fontspec_extension_tl {##1}
1270            \clist_map_break:
1271          }
1272      }
1273  }
1274\prg_new_conditional:Nnn \__fontspec_if_detect_external:n {T}
1275  {
1276    \clist_map_inline:Nn \l__fontspec_extensions_clist
1277      {
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: }
1282      }
1283    \bool_if:NTF \l__fontspec_tmpa_bool \prg_return_true: \prg_return_false:
1284  }
1285\cs_new:Nn \__fontspec_init_ttc:n
1286  {
1287    \str_if_eq:eeT { \str_lowercase:f {\l__fontspec_extension_tl} } {.ttc}
1288      {
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}
1292      }
1293  }
1294\cs_new:Nn \__fontspec_load_external_fontoptions:Nn
1295  {
1296    \bool_if:NT \l__fontspec_fontcfg_bool
1297      {
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
1302         {
1303          \exp_args:No \file_if_exist:nT { \l__fontspec_ext_filename_tl }
1304           { \file_input:n { \l__fontspec_ext_filename_tl } }
1305         }
1306      }
1307  }
1308\cs_new:Nn \__fontspec_extract_all_features:n
1309  {
1310    \bool_if:NTF \l__fontspec_disable_defaults_bool
1311      {
1312        \clist_set:Nx \l__fontspec_all_features_clist {#1}
1313      }
1314      {
1315        \prop_get:NVNF \g__fontspec_fontopts_prop \l_fontspec_fontname_tl \l__fontspec_fontopts_clist
1316          { \clist_clear:N \l__fontspec_fontopts_clist }
1317
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
1321
1322        \clist_set:Nx \l__fontspec_all_features_clist
1323          {
1324            \g__fontspec_default_fontopts_clist,
1325            \l__fontspec_family_fontopts_clist,
1326            \l__fontspec_fontopts_clist,
1327            #1
1328          }
1329      }
1330  }
1331\cs_new:Nn \__fontspec_preparse_features:
1332  {
1333
1334    \__fontspec_keys_set_known:nxN {fontspec-preparse-external}
1335      { \l__fontspec_all_features_clist }
1336      \l__fontspec_keys_leftover_clist
1337
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
1343  }
1344\cs_new:Nn \__fontspec_load_font:
1345  {
1346
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} }
1351
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 }
1356
1357    \l__fontspec_fontface_cs_tl % this is necessary for LuaLaTeX to check the scripts properly
1358
1359  }
1360\cs_new:Nn \__fontspec_construct_font_call:nnnnnn
1361  {
1362  " \__fontspec_fontname_wrap:n { #1 #2 #3 }
1363    #4 #5
1364    \str_if_eq:eeF {#6}{} {:#6} "
1365  }
1366\cs_new:Nn \__fontspec_construct_font_call:nn
1367  {
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}
1375  }
1376\cs_new:Nn \__fontspec_font_is_name:
1377  {
1378    \cs_set_eq:NN \__fontspec_fontname_wrap:n \use:n
1379  }
1380\cs_new:Nn \__fontspec_font_is_file:
1381  {
1382    \cs_set:Npn \__fontspec_fontname_wrap:n ##1 { [ \l__fontspec_font_path_tl ##1 ] }
1383  }
1384\cs_new:Nn \__fontspec_set_scriptlang:
1385  {
1386    \bool_if:NT \l__fontspec_firsttime_bool
1387      {
1388        \tl_if_empty:NF \l__fontspec_script_name_tl
1389          {
1390            \keys_set:nx {fontspec-opentype} {Script=\l__fontspec_script_name_tl}
1391            \keys_set:nx {fontspec-opentype} {Language=\l__fontspec_lang_name_tl}
1392          }
1393      }
1394  }
1395\cs_new:Nn \__fontspec_get_features:n
1396  {
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
1402      {
1403        \keys_set:nV {fontspec-opentype} \l__fontspec_keys_leftover_clist
1404      }
1405      {
1406        \bool_if:nT { \l__fontspec_atsui_bool || \l__fontspec_graphite_bool }
1407          { \keys_set:nV {fontspec-aat} \l__fontspec_keys_leftover_clist }
1408      }
1409
1410    \tl_if_empty:NF \l__fontspec_mapping_tl
1411      { \__fontspec_update_featstr:n { mapping = \l__fontspec_mapping_tl } }
1412
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 } }
1416  }
1417\prg_new_conditional:Nnn \__fontspec_save_family_needed:n { TF }
1418  {
1419
1420
1421  \tl_if_empty:NTF \l__fontspec_nfss_fam_tl
1422    {
1423      \prop_get:NVNTF \g__fontspec_fontid_family_prop \l__fontspec_fontid_tl \l__fontspec_tmp_tl
1424        {
1425          \tl_gset_eq:NN \g__fontspec_nfss_family_tl \l__fontspec_tmp_tl
1426          \prg_return_false:
1427        }
1428        {
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:
1433        }
1434    }
1435    {
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:
1439    }
1440  }
1441\cs_new:Nn \__fontspec_save_fontid_family:nn
1442  {
1443    \prop_get:NnNTF \g__fontspec_family_int_prop {#2} \l__fontspec_tmp_tl
1444      {
1445        \tl_set:Nx \l__fontspec_tmp_tl
1446          { \int_eval:n { \l__fontspec_tmp_tl + 1 } }
1447      }
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
1452  }
1453\cs_generate_variant:Nn \__fontspec_save_fontid_family:nn { VV }
1454\cs_new:Nn \__fontspec_save_family:nn
1455  {
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}
1461  }
1462\cs_new:Nn \__fontspec_save_fontinfo:n
1463  {
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}
1468      {
1469        \__fontspec_construct_font_call:nn {\l_fontspec_fontname_tl}
1470          { \l__fontspec_pre_feat_sclist \g__fontspec_rawfeatures_sclist }
1471      }
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
1476  }
1477\cs_new:Nn \__fontspec_find_autofonts:
1478  {
1479    \bool_if:nF {\l__fontspec_noit_bool || \l__fontspec_nobf_bool}
1480      {
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}
1484      }
1485
1486    \bool_if:NF \l__fontspec_nobf_bool
1487      {
1488        \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bf_tl {\l_fontspec_fontname_tl} {/B}
1489      }
1490
1491    \bool_if:NF \l__fontspec_noit_bool
1492      {
1493        \__fontspec_set_autofont:Nnn \l__fontspec_fontname_it_tl {\l_fontspec_fontname_tl} {/I}
1494      }
1495
1496    \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfsl_tl {\l__fontspec_fontname_sl_tl} {/B}
1497  }
1498\cs_new:Nn \__fontspec_set_faces:
1499  {
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 }
1507  }
1508\cs_new:Nn \__fontspec_set_faces_aux:nnnnn
1509  {
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}
1512  }
1513\cs_new:Nn \fontspec_complete_fontname:Nn
1514  {
1515    \tl_set:Nx #1 {#2}
1516    \tl_replace_all:Nnx #1 {*} {\l__fontspec_basename_tl}
1517  }
1518\cs_new:Nn \__fontspec_add_nfssfont:nnnn
1519  {
1520    \tl_set:Nx \l__fontspec_this_font_tl {#3}
1521
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 }
1525
1526    \tl_if_empty:NF \l__fontspec_this_font_tl
1527      {
1528        \prop_put:Nxx \l__fontspec_nfssfont_prop {#1/#2}
1529          { {#1}{#2}{\l__fontspec_this_font_tl}{#4}{\l__fontspec_sizefeat_clist} }
1530      }
1531  }
1532\cs_new:Nn \__fontspec_set_font_type:N
1533  {
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
1541\or
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
1546\fi
1547\or
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} }
1550\or
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} }
1553\fi
1554  }
1555\cs_new:Nn \__fontspec_set_autofont:Nnn
1556  {
1557    \bool_if:NF \l__fontspec_external_bool
1558      {
1559        \tl_if_empty:xF {#2}
1560          {
1561            \tl_if_empty:NT #1
1562              {
1563                \__fontspec_if_autofont:nnTF {#2} {#3}
1564                  { \tl_set:Nx #1 {#2#3} }
1565                  { \__fontspec_info:nx {no-font-shape} {#2#3} }
1566              }
1567          }
1568      }
1569  }
1570\prg_new_conditional:Nnn \__fontspec_if_autofont:nn {T,TF}
1571  {
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: }
1578  }
1579\cs_new:Nn \__fontspec_make_font_shapes:Nnnnn
1580  {
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:
1586  }
1587\cs_new:Nn \__fontspec_load_fontname:Nn
1588  {
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} }
1596  }
1597\keys_define:nn {fontspec/fontname}
1598  {
1599    Font .tl_set:N = \l_fontspec_fontname_tl ,
1600    Font .groups:n = {getfontname} ,
1601  }
1602\cs_new:Nn \__fontspec_declare_shape:nnnn
1603  {
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
1607
1608    \exp_args:Nx \clist_map_inline:nn {#4} { \__fontspec_setup_single_size:nn {#3} {##1} }
1609
1610    \tl_build_end:N \l__fontspec_nfss_tl
1611    \tl_build_end:N \l__fontspec_nfss_sc_tl
1612
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}
1618  }
1619\cs_generate_variant:Nn \__fontspec_declare_shape:nnnn {nnxx}
1620\cs_new:Nn \__fontspec_setup_single_size:nn
1621  {
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
1624
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} }
1628
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} {}
1632
1633    % small caps
1634    \clist_set_eq:NN \l__fontspec_fontfeat_curr_clist \l__fontspec_fontfeat_sc_clist
1635
1636    \bool_if:NF \l__fontspec_nosc_bool
1637      {
1638        \tl_if_empty:NTF \l__fontspec_fontname_sc_tl
1639          {
1640            \__fontspec_make_smallcaps:TF
1641              {
1642                \clist_put_left:Nn \l__fontspec_fontfeat_curr_clist {Letters=SmallCaps}
1643              }
1644              {
1645                \bool_set_true:N \l__fontspec_nosc_bool
1646              }
1647          }
1648          { \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_fontname_sc_tl} }% local for each size
1649      }
1650
1651    \bool_if:NF \l__fontspec_nosc_bool
1652      {
1653        \__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_sc_tl
1654          {#1} {\l__fontspec_sizing_leftover_clist} {\l__fontspec_fontfeat_curr_clist}
1655      }
1656  }
1657\cs_new:Nn \__fontspec_setup_nfss:Nnnn
1658  {
1659
1660    \__fontspec_get_features:n { #2 , #3 , #4 }
1661
1662    \tl_if_empty:NF \l__fontspec_scale_tl
1663      {
1664        \tl_set:Nx \l__fontspec_scale_tl { s*[\l__fontspec_scale_tl] }
1665      }
1666
1667    \tl_build_put_right:Nx #1
1668      {
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 }
1672      }
1673  }
1674\cs_new:Nn \__fontspec_declare_shapes_normal:nn
1675  {
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}
1678  }
1679\cs_new:Nn \__fontspec_declare_shapes_smcaps:nn
1680  {
1681    \tl_if_empty:NF \l__fontspec_nfss_sc_tl
1682     {
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}
1685     }
1686  }
1687\cs_new:Nn \__fontspec_combo_sc_shape:n
1688  {
1689    \tl_if_exist:cTF { \__fontspec_shape_merge:nn {#1} {\scdefault} }
1690         { \tl_use:c { \__fontspec_shape_merge:nn {#1} {\scdefault} } }
1691         { \scdefault }
1692  }
1693\cs_new:Nn \__fontspec_DeclareFontShape:nnnnnn
1694  {
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}
1700  }
1701\cs_generate_variant:Nn \__fontspec_DeclareFontShape:nnnnnn {xxxxxx}
1702\cs_new:Nn \__fontspec_declare_shape_slanted:nn
1703  {
1704    \bool_if:nT
1705      {
1706          \str_if_eq_p:ee {#2} {\itdefault}  &&
1707        !(\str_if_eq_p:ee {\itdefault} {\sldefault})
1708      }
1709      {
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}
1712      }
1713  }
1714\cs_new:Nn \__fontspec_declare_shapes_bx:nn
1715  {
1716    \bool_if:nT
1717      {
1718          \str_if_eq_p:ee {#1} {\bfdefault}  &&
1719        !(\str_if_eq_p:ee {\bfdefault} {bx})
1720      }
1721      {
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 }
1727
1728        % bx/sc -> b/sc
1729        \tl_if_empty:NF \l__fontspec_nfss_sc_tl
1730          {
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 }
1735          }
1736
1737        % bx/sl -> bx/it
1738        \bool_if:nT
1739          {
1740              \str_if_eq_p:ee {#2} {\itdefault}  &&
1741            !(\str_if_eq_p:ee {\itdefault} {\sldefault})
1742          }
1743          {
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 }
1748          }
1749
1750      }
1751  }
1752\cs_new:Nn \__fontspec_declare_shape_loginfo:nn
1753  {
1754    \tl_gput_right:Nx \g__fontspec_defined_shapes_tl
1755      {
1756        \exp_not:n { \\ }
1757        -~ \exp_not:N \str_case:nn {#1/#2}
1758        {
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} }
1770        {
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}
1781          {
1782          \exp_not:N \\ and~ font~ adjustment~ code:
1783          \exp_not:N \\ \l__fontspec_postadjust_tl
1784          }
1785      }
1786  }
1787\tl_set:Nn \l__fontspec_pre_feat_sclist
1788  {
1789    \bool_if:NT \l__fontspec_ot_bool
1790      {
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   ; }
1793      }
1794  }
1795\cs_new:Nn \__fontspec_make_ot_smallcaps:TF
1796  {
1797    \exp_args:No \__fontspec_check_ot_feat:NnTF \l__fontspec_fontface_cs_tl {smcp} {#1} {#2}
1798  }
1799\cs_new:Nn \__fontspec_make_smallcaps:TF
1800  {
1801    \bool_if:NTF \l__fontspec_ot_bool
1802      { \__fontspec_make_ot_smallcaps:TF {#1} {#2} }
1803      {
1804        \bool_if:NT \l__fontspec_atsui_bool
1805          {
1806            \exp_args:No \__fontspec_make_AAT_feature_string:NnnTF
1807              \l__fontspec_fontface_cs_tl {3} {3} {#1} {#2}
1808          }
1809      }
1810  }
1811\cs_new:Nn \__fontspec_update_featstr:n
1812  {
1813    \bool_if:NF \l__fontspec_firsttime_bool
1814      {
1815        \tl_gset:Nx \g__fontspec_single_feat_tl { #1 }
1816        \tl_gput_right:Nx  \g__fontspec_rawfeatures_sclist {#1;}
1817      }
1818  }
1819\cs_new:Nn \__fontspec_remove_clashing_featstr:n
1820  {
1821    \clist_map_inline:nn {#1}
1822      {
1823        \tl_gremove_all:Nn \g__fontspec_rawfeatures_sclist {##1;}
1824      }
1825  }
1826\cs_generate_variant:Nn \__fontspec_remove_clashing_featstr:n {x}
1827\cs_set:Npn \__fontspec_init:
1828  {
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
1839  }
1840\cs_new:Nn \__fontspec_init_fontface:
1841  {
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
1849  }
1850\cs_new:Nn \__fontspec_iv_str_to_num:Nn
1851  {
1852    \__fontspec_strip_leading_sign:Nw #1#2 \q_nil
1853  }
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
1856  {
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 }
1860  }
1861\cs_set:Npn \__fontspec_iv_str_to_num:w #1 \q_nil #2#3#4#5#6 \q_nil
1862  {
1863    \int_compare:nT { \tl_count:n {#6} > 2 }
1864      { \__fontspec_error:nx {ot-tag-too-long} {#2#3#4#5#6} }
1865
1866    \int_set:Nn #1
1867      {
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
1872      }
1873  }
1874
1875%%^^A%%  fontspec-code-opentype.dtx -- part of FONTSPEC <wspr.io/fontspec>
1876
1877\cs_new:Nn \__fontspec_define_opentype_feature_group:n
1878  {
1879    \keys_define:nn {fontspec-opentype} { #1 .multichoice: , .groups:n = {opentype} }
1880  }
1881\cs_new:Nn \__fontspec_feat_prop_add:nn
1882  {
1883    \tl_if_empty:nF {#1}
1884     {
1885      \prop_if_in:NnF \g__fontspec_OT_features_prop {#1}
1886        {
1887          \prop_gput:Nnn \g__fontspec_OT_features_prop {#1} {#2}
1888        }
1889     }
1890  }
1891\cs_new:Nn \__fontspec_define_opentype_feature:nnnnn
1892  {
1893    \__fontspec_feat_prop_add:nn {#3} {#1\,=\,#2}
1894      \tl_if_empty:nTF {#4}
1895        {
1896          \keys_define:nn {fontspec-opentype}
1897            {
1898              #1/#2 .code:n =
1899                { \__fontspec_remove_clashing_featstr:n {#5} } ,
1900              #1/#2 .groups:n = {opentype}
1901            }
1902        }
1903        {
1904          \keys_define:nn {fontspec-opentype}
1905            {
1906              #1/#2 .code:n =
1907                {
1908                  \__fontspec_make_OT_feature:nnn {#3} {#4} {#5}
1909                } ,
1910              #1/#2 .groups:n = {opentype}
1911            }
1912        }
1913  }
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
1917  {
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}
1921  }
1922\cs_new:Nn \__fontspec_define_opentype_onreset:nnnnn
1923  {
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}
1926  }
1927\cs_new:Nn \__fontspec_make_OT_feature:nnn
1928  {
1929
1930    \bool_set_true:N \l__fontspec_proceed_bool
1931
1932    \tl_if_empty:nF {#1}
1933      {
1934        \exp_args:No \__fontspec_check_ot_feat:NnF \l__fontspec_fontface_cs_tl {#1}
1935          {
1936            \__fontspec_warning:nx {icu-feature-not-exist-in-font} {#1}
1937            \bool_set_false:N \l__fontspec_proceed_bool
1938          }
1939      }
1940
1941    \__fontspec_remove_clashing_featstr:x { #2 , \__fontspec_swap_plus_minus:n {#2} , #3 }
1942
1943    \bool_if:NT \l__fontspec_proceed_bool { \__fontspec_update_featstr:n {#2} }
1944  }
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}
1950  {
1951    \bool_if:NTF \l__fontspec_never_check_bool
1952      { \prg_return_true: }
1953      {
1954    \bool_if:nTF { \tl_if_empty_p:e {#2} }
1955      { \prg_return_false: }
1956      {
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 }
1962          {
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
1968            \fi
1969          }
1970        \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false:
1971      }
1972      }
1973  }
1974\prg_new_conditional:Nnn \__fontspec_check_lang:Nn {TF}
1975  {
1976    \__fontspec_check_lang:NnnTF #1 {#2} {\l__fontspec_script_tl} {\prg_return_true:} {\prg_return_false:}
1977  }
1978\prg_new_conditional:Nnn \__fontspec_check_lang:Nnn {TF}
1979  {
1980    \bool_if:NTF \l__fontspec_never_check_bool
1981      { \prg_return_true: }
1982      {
1983    \bool_if:nTF { \tl_if_empty_p:e {#3} }
1984      { \prg_return_false: }
1985      {
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 }
1993          {
1994            \int_set:Nn \l__fontspec_tmpc_int
1995              { \XeTeXOTlanguagetag #1 \l__fontspec_script_int \l__fontspec_tmpa_int }
1996
1997            \int_compare:nNnTF \l__fontspec_tmpc_int = \l__fontspec_strnum_int
1998              {
1999                \bool_set_true:N \l__fontspec_check_bool
2000                \int_set:Nn \l__fontspec_tmpa_int {\l__fontspec_tmpb_int}
2001              }
2002              {
2003                \int_incr:N \l__fontspec_tmpa_int
2004              }
2005          }
2006        \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false:
2007      }
2008      }
2009  }
2010\prg_new_conditional:Nnn \__fontspec_check_ot_feat:Nn {TF,F}
2011  {
2012    \__fontspec_check_ot_feat:NnnnTF #1 {#2} {\l__fontspec_lang_tl} {\l__fontspec_script_tl}
2013      {\prg_return_true:} {\prg_return_false:}
2014  }
2015\prg_new_conditional:Nnn \__fontspec_check_ot_feat:Nnnn {TF,F}
2016  {
2017    \bool_if:NTF \l__fontspec_never_check_bool
2018      { \prg_return_true: }
2019      {
2020    \bool_if:nTF { \tl_if_empty_p:e {#3} || \tl_if_empty_p:e {#4} }
2021      { \prg_return_false: }
2022      {
2023        \__fontspec_iv_str_to_num:Nx \l__fontspec_strnum_int   {#2}
2024
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}
2029
2030        \int_set:Nn \l_tmpb_int
2031          { \XeTeXOTcountfeatures #1 \l__fontspec_script_int \l__fontspec_language_int }
2032
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 }
2036          {
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
2043            \fi
2044          }
2045        \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false:
2046      }
2047      }
2048  }
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}
2171
2172%%^^A%%  fontspec-code-graphite.dtx -- part of FONTSPEC <wspr.io/fontspec>
2173
2174
2175\cs_new:Nn \__fontspec_define_aat_feature_group:n
2176  {
2177    \keys_define:nn {fontspec-aat} { #1 .multichoice: }
2178  }
2179\cs_new:Nn \__fontspec_define_aat_feature:nnnn
2180  {
2181    \keys_define:nn {fontspec-aat}
2182      {
2183        #1/#2 .code:n = { \__fontspec_make_AAT_feature:nn {#3}{#4} }
2184      }
2185  }
2186
2187\cs_new:Nn \__fontspec_make_AAT_feature:nn
2188  {
2189    \tl_if_empty:nTF {#1}
2190      { \__fontspec_warning:n {aat-feature-not-exist} }
2191      {
2192        \exp_args:No \__fontspec_make_AAT_feature_string:NnnTF \l__fontspec_fontface_cs_tl {#1} {#2}
2193          {
2194            \__fontspec_update_featstr:n {\l_fontspec_feature_string_tl}
2195          }
2196          {
2197            \__fontspec_warning:nx {aat-feature-not-exist-in-font} {#1,#2}
2198          }
2199      }
2200  }
2201\prg_new_conditional:Nnn \__fontspec_make_AAT_feature_string:Nnn {TF,T,F}
2202  {
2203    \tl_set:Nx \l__fontspec_tmpa_tl { \XeTeXfeaturename #1 #2 }
2204    \tl_if_empty:NTF \l__fontspec_tmpa_tl
2205      { \prg_return_false: }
2206      {
2207        \int_compare:nTF { \XeTeXisexclusivefeature #1 #2 > 0 }
2208          {
2209            \tl_set:Nx \l__fontspec_tmpb_tl {\XeTeXselectorname #1 #2\space #3}
2210          }
2211          {
2212            \int_if_even:nTF {#3}
2213              {
2214                \tl_set:Nx \l__fontspec_tmpb_tl {\XeTeXselectorname #1 #2\space #3}
2215              }
2216              {
2217                \tl_set:Nx \l__fontspec_tmpb_tl
2218                  {
2219                    \XeTeXselectorname #1 #2\space \numexpr#3-1\relax
2220                  }
2221                \tl_if_empty:NF \l__fontspec_tmpb_tl { \tl_put_left:Nn \l__fontspec_tmpb_tl {!} }
2222              }
2223          }
2224
2225        \tl_if_empty:NTF \l__fontspec_tmpb_tl
2226          { \prg_return_false: }
2227          {
2228            \tl_set:Nx \l_fontspec_feature_string_tl { \l__fontspec_tmpa_tl = \l__fontspec_tmpb_tl }
2229            \prg_return_true:
2230          }
2231     }
2232  }
2233
2234%%^^A%%  fontspec-code-keyval.dtx -- part of FONTSPEC <wspr.io/fontspec>
2235
2236\clist_gset:Nn \g__fontspec_all_keyval_modules_clist
2237  {
2238    fontspec, fontspec-opentype, fontspec-aat,
2239    fontspec-preparse, fontspec-preparse-cfg, fontspec-preparse-external, fontspec-preparse-nested,
2240    fontspec-renderer
2241  }
2242\cs_new:Nn \__fontspec_keys_define_code:nnn
2243  {
2244    \keys_define:nn {#1} { #2 .code:n = {#3} }
2245  }
2246\cs_new:Nn \__fontspec_aff_error:n
2247  {
2248    \__fontspec_keys_define_code:nnn {fontspec-addfeatures} {#1}
2249      { \__fontspec_error:nx {not-in-addfontfeatures} {#1} }
2250  }
2251\__fontspec_keys_define_code:nnn {fontspec-preparse-cfg} {IgnoreFontspecFile}
2252  {
2253    \bool_set_false:N \l__fontspec_fontcfg_bool
2254  }
2255\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {IgnoreFontspecFile}
2256  {
2257    \bool_set_false:N \l__fontspec_fontcfg_bool
2258  }
2259\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Path}
2260  {
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}
2267  }
2268\aliasfontfeature{Path}{ExternalLocation}
2269\__fontspec_keys_define_code:nnn {fontspec} {Path} {}
2270\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Extension}
2271  {
2272    \tl_set:Nn \l__fontspec_extension_tl {#1}
2273    \bool_if:NF \l__fontspec_external_bool
2274      {
2275        \keys_set:nn {fontspec-preparse-external} {Path}
2276      }
2277  }
2278\tl_clear:N \l__fontspec_extension_tl
2279\__fontspec_keys_define_code:nnn {fontspec} {Extension} {}
2280\keys_define:nn {fontspec-renderer}
2281  {
2282    Renderer .choices:nn =
2283      {AAT,ICU,OpenType,Graphite,Full,Basic,Node,Base,HarfBuzz,Harfbuzz}
2284      {
2285        \int_compare:nTF {\l_keys_choice_int <= 4}
2286          {
2287            \tl_set:Nx \l__fontspec_renderer_tl
2288              {
2289                \int_case:nn \l_keys_choice_int { 1 {/AAT} 2 {/OT} 3 {/OT} 4 {/GR} }
2290              }
2291            \tl_gset:Nx \g__fontspec_single_feat_tl { \l__fontspec_renderer_tl }
2292          }
2293          {
2294            \__fontspec_warning:nx {only-luatex-feature} {Renderer=Full/Basic/Node/Base/HarfBuzz}
2295          }
2296      }
2297  }
2298\__fontspec_keys_define_code:nnn {fontspec-preparse} {Script}
2299  {
2300    \keys_set:nn {fontspec-renderer} {Renderer=OpenType}
2301    \tl_set:Nn \l__fontspec_script_name_tl {#1}
2302  }
2303\__fontspec_keys_define_code:nnn {fontspec-preparse} {Language}
2304  {
2305    \keys_set:nn {fontspec-renderer} {Renderer=OpenType}
2306    \tl_set:Nn \l__fontspec_lang_name_tl {#1}
2307  }
2308\__fontspec_keys_define_code:nnn {fontspec-preparse} {FontIndex}
2309  {
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}
2313  }
2314\__fontspec_keys_define_code:nnn {fontspec} {FontIndex}
2315  {
2316  \tl_set:Nn \l__fontspec_ttc_index_tl {:#1}
2317  }
2318\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {UprightFont}
2319  {
2320    \fontspec_complete_fontname:Nn \l__fontspec_fontname_up_tl {#1}
2321  }
2322\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {ItalicFont}
2323  {
2324    \tl_if_empty:nTF {#1}
2325      {
2326        \bool_set_true:N \l__fontspec_noit_bool
2327      }
2328      {
2329        \bool_set_false:N \l__fontspec_noit_bool
2330        \fontspec_complete_fontname:Nn \l__fontspec_fontname_it_tl {#1}
2331      }
2332  }
2333\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {SlantedFont}
2334  {
2335    \fontspec_complete_fontname:Nn \l__fontspec_fontname_sl_tl {#1}
2336  }
2337\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldFont}
2338  {
2339    \tl_if_empty:nTF {#1}
2340      {
2341        \bool_set_true:N \l__fontspec_nobf_bool
2342      }
2343      {
2344        \bool_set_false:N \l__fontspec_nobf_bool
2345        \fontspec_complete_fontname:Nn \l__fontspec_curr_bfname_tl {#1}
2346
2347        \seq_if_empty:NT \l__fontspec_bf_series_seq
2348          {
2349            \tl_gset:Nx \g__fontspec_curr_series_tl {\bfdefault}
2350            \seq_put_right:Nx \l__fontspec_bf_series_seq {\bfdefault}
2351          }
2352
2353        \tl_if_eq:oxT \g__fontspec_curr_series_tl {\bfdefault}
2354          {
2355            \tl_set_eq:NN \l__fontspec_fontname_bf_tl \l__fontspec_curr_bfname_tl
2356          }
2357
2358        \prop_put:NxV \l__fontspec_nfss_prop {BoldFont-\g__fontspec_curr_series_tl} \l__fontspec_curr_bfname_tl
2359
2360
2361      }
2362  }
2363\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldItalicFont}
2364  {
2365    \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfit_tl {#1}
2366  }
2367\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldSlantedFont}
2368  {
2369    \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfsl_tl {#1}
2370  }
2371\__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFont}
2372  {
2373    \tl_if_empty:nTF {#1}
2374      {
2375        \bool_set_true:N \l__fontspec_nosc_bool
2376      }
2377      {
2378        \bool_set_false:N \l__fontspec_nosc_bool
2379        \fontspec_complete_fontname:Nn \l__fontspec_fontname_sc_tl {#1}
2380      }
2381  }
2382\__fontspec_keys_define_code:nnn {fontspec-preparse} {UprightFeatures}
2383  {
2384    \clist_put_right:Nn \l__fontspec_fontfeat_up_clist {#1}
2385  }
2386\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldFeatures}
2387  {
2388    \clist_put_right:Nn \l__fontspec_fontfeat_bf_clist {#1}
2389
2390  }
2391\__fontspec_keys_define_code:nnn {fontspec-preparse} {ItalicFeatures}
2392  {
2393    \clist_put_right:Nn \l__fontspec_fontfeat_it_clist {#1}
2394  }
2395\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldItalicFeatures}
2396  {
2397    \clist_put_right:Nn \l__fontspec_fontfeat_bfit_clist {#1}
2398  }
2399\__fontspec_keys_define_code:nnn {fontspec-preparse} {SlantedFeatures}
2400  {
2401    \clist_put_right:Nn \l__fontspec_fontfeat_sl_clist {#1}
2402  }
2403\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldSlantedFeatures}
2404  {
2405    \clist_put_right:Nn \l__fontspec_fontfeat_bfsl_clist {#1}
2406  }
2407\__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFeatures}
2408  {
2409    \bool_if:NF \l__fontspec_firsttime_bool
2410      {
2411        \clist_put_right:Nn \l__fontspec_fontfeat_sc_clist {#1}
2412      }
2413  }
2414\__fontspec_keys_define_code:nnn {fontspec-preparse} {SizeFeatures}
2415  {
2416    \clist_set:Nn \l__fontspec_sizefeat_clist {#1}
2417    \clist_put_right:Nn \l__fontspec_fontfeat_up_clist { SizeFeatures = {#1} }
2418  }
2419\__fontspec_keys_define_code:nnn {fontspec-preparse-nested} {SizeFeatures}
2420  {
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
2424  }
2425\__fontspec_keys_define_code:nnn {fontspec-preparse-nested} {Font}
2426  {
2427    \tl_set:Nn \l__fontspec_this_font_tl {#1}
2428  }
2429\__fontspec_keys_define_code:nnn {fontspec} {SizeFeatures}
2430  {
2431    % dummy
2432  }
2433\__fontspec_keys_define_code:nnn {fontspec} {Font}
2434  {
2435    % dummy
2436  }
2437\__fontspec_keys_define_code:nnn {fontspec-sizing} {Size}
2438  {
2439    \tl_set:Nn \l__fontspec_size_tl {#1}
2440  }
2441\__fontspec_keys_define_code:nnn {fontspec-sizing} {Font}
2442  {
2443    \fontspec_complete_fontname:Nn \l__fontspec_sizedfont_tl {#1}
2444  }
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}
2452  {
2453    \tl_gset:Nx \g__fontspec_nfss_enc_tl { #1 }
2454  }
2455\__fontspec_keys_define_code:nnn {fontspec-preparse} {NFSSFamily}
2456  {
2457    \tl_set:Nx \l__fontspec_nfss_fam_tl { #1 }
2458  }
2459\__fontspec_keys_define_code:nnn {fontspec-preparse} {FontFace}
2460  {
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 }
2465      {
2466        \tl_if_in:NnF \l__fontspec_arg_clist {=}
2467          {
2468            \tl_set_eq:NN \l__fontspec_this_font_tl \l__fontspec_arg_clist
2469            \tl_clear:N \l__fontspec_this_feat_clist
2470          }
2471      }
2472
2473    \__fontspec_add_nfssfont:nnnn
2474      {\use_i:nnn #1} {\use_ii:nnn #1} {\l__fontspec_this_font_tl} {\l__fontspec_this_feat_clist}
2475  }
2476\__fontspec_keys_define_code:nnn {fontspec} {Scale}
2477  {
2478    \str_case:nnF {#1}
2479      {
2480        {MatchLowercase} { \__fontspec_calc_scale:n {5} }
2481        {MatchUppercase} { \__fontspec_calc_scale:n {8} }
2482      }
2483      { \tl_set:Nx \l__fontspec_scale_tl {#1} }
2484  }
2485\__fontspec_keys_define_code:nnn {fontspec} {ScaleAgain}
2486  {
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}
2490  }
2491\cs_new:Nn \__fontspec_calc_scale:n
2492  {
2493    \group_begin:
2494
2495      \fontencoding { \encodingdefault }
2496      \fontfamily { \familydefault }
2497      \selectfont
2498
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
2501
2502      \tl_set:Nx \l__fontspec_scale_tl
2503        {
2504          \fp_eval:n { \dim_to_fp:n {\l__fontspec_tmpa_dim} /
2505                       \dim_to_fp:n {\l__fontspec_tmpb_dim}   }
2506        }
2507
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 }
2512  }
2513\cs_new:Nn \__fontspec_set_font_dimen:NnN
2514  {
2515    \dim_set:Nn #1 { \fontdimen #2 #3 }
2516    \dim_compare:nNnT #1 = {0pt}
2517      {
2518        \settoheight #1
2519          {
2520            \str_if_eq:nnTF {#3} {\font} \rmfamily #3
2521            \int_case:nnF #2
2522              {
2523                {5} {x} % x-height
2524                {8} {X} % cap-height
2525              } {?} % "else" clause; never reached.
2526          }
2527      }
2528  }
2529\__fontspec_keys_define_code:nnn {fontspec} {WordSpace}
2530  {
2531    \bool_if:NF \l__fontspec_firsttime_bool
2532      { \_fontspec_parse_wordspace:w #1,,,\q_stop }
2533  }
2534\__fontspec_aff_error:n {WordSpace}
2535\cs_set:Npn \_fontspec_parse_wordspace:w #1,#2,#3,#4 \q_stop
2536  {
2537    \tl_if_empty:nTF {#4}
2538      {
2539        \tl_set:Nn \l__fontspec_wordspace_adjust_tl
2540          {
2541            \fontdimen 2 \font = #1 \fontdimen 2 \font
2542            \fontdimen 3 \font = #1 \fontdimen 3 \font
2543            \fontdimen 4 \font = #1 \fontdimen 4 \font
2544          }
2545      }
2546      {
2547        \tl_set:Nn \l__fontspec_wordspace_adjust_tl
2548          {
2549            \fontdimen 2 \font = #1 \fontdimen 2 \font
2550            \fontdimen 3 \font = #2 \fontdimen 3 \font
2551            \fontdimen 4 \font = #3 \fontdimen 4 \font
2552          }
2553      }
2554  }
2555\__fontspec_keys_define_code:nnn {fontspec} {PunctuationSpace}
2556  {
2557    \str_case_e:nnF {#1}
2558      {
2559        {WordSpace}
2560          {
2561            \tl_set:Nn \l__fontspec_punctspace_adjust_tl
2562              { \fontdimen 7 \font = 0 \fontdimen 2 \font }
2563          }
2564        {TwiceWordSpace}
2565        {
2566          \tl_set:Nn \l__fontspec_punctspace_adjust_tl
2567            { \fontdimen 7 \font = 1 \fontdimen 2 \font }
2568        }
2569      }
2570      {
2571        \tl_set:Nn \l__fontspec_punctspace_adjust_tl
2572          { \fontdimen 7 \font = #1 \fontdimen 7 \font }
2573      }
2574  }
2575\__fontspec_aff_error:n {PunctuationSpace}
2576\__fontspec_keys_define_code:nnn {fontspec} {FontAdjustment}
2577  {
2578    \tl_put_right:Nx \l__fontspec_postadjust_tl {#1}
2579  }
2580\__fontspec_keys_define_code:nnn {fontspec} {LetterSpace}
2581  {
2582    \__fontspec_update_featstr:n {letterspace=#1}
2583  }
2584\__fontspec_keys_define_code:nnn {fontspec} {HyphenChar}
2585  {
2586    \str_if_eq:nnTF {#1} {None}
2587      {
2588        \tl_put_right:Nn \l__fontspec_postadjust_tl
2589          { \__fontspec_primitive_font_set_hyphenchar:Nn \font {-1} }
2590      }
2591      {
2592
2593        \tl_if_single:nTF {#1}
2594          { \tl_set:Nn \l__fontspec_hyphenchar_tl {`#1} }
2595          { \tl_set:Nn \l__fontspec_hyphenchar_tl { #1} }
2596
2597        \exp_args:No \__fontspec_primitive_font_glyph_if_exist:NnTF \l__fontspec_fontface_cs_tl {\l__fontspec_hyphenchar_tl}
2598          {
2599            \tl_put_right:Nn \l__fontspec_postadjust_tl
2600              { \__fontspec_primitive_font_set_hyphenchar:Nn \font { \l__fontspec_hyphenchar_tl } }
2601          }
2602          { \__fontspec_error:nxx {no-glyph}{\l_fontspec_fontname_tl}{#1} }
2603
2604      }
2605  }
2606\__fontspec_aff_error:n {HyphenChar}
2607\__fontspec_keys_define_code:nnn {fontspec} {Color}
2608  {
2609    \cs_if_exist:cTF { \token_to_str:N \color@ #1 }
2610      {
2611        \convertcolorspec{named}{#1}{HTML}\l__fontspec_hexcol_tl
2612      }
2613      {
2614        \int_compare:nTF { \tl_count:n {#1} == 6 }
2615          { \tl_set:Nn \l__fontspec_hexcol_tl {#1} }
2616          {
2617            \int_compare:nTF { \tl_count:n {#1} == 8 }
2618              { \fontspec_parse_colour:viii #1 }
2619              {
2620                \bool_if:NF \l__fontspec_firsttime_bool
2621                  { \__fontspec_warning:nx {bad-colour} {#1} }
2622              }
2623          }
2624      }
2625  }
2626\cs_set:Npn \fontspec_parse_colour:viii #1#2#3#4#5#6#7#8
2627  {
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
2630      {
2631        \bool_if:NF \l__fontspec_firsttime_bool
2632        { \__fontspec_warning:nx {opa-twice-col} {#7#8} }
2633      }
2634    \tl_set:Nn \l__fontspec_opacity_tl {#7#8}
2635  }
2636\aliasfontfeature{Color}{Colour}
2637\__fontspec_keys_define_code:nnn {fontspec} {Opacity}
2638  {
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
2642      {
2643        \bool_if:NF \l__fontspec_firsttime_bool
2644        { \__fontspec_warning:nx {opa-twice} {#1} }
2645      }
2646    \tl_set:Nx \l__fontspec_opacity_tl
2647      {
2648        \int_compare:nT { \l__fontspec_tmp_int <= "F } {0} % zero pad
2649        \int_to_hex:n { \l__fontspec_tmp_int }
2650      }
2651  }
2652\__fontspec_keys_define_code:nnn {fontspec-aat} {Mapping}
2653  {
2654    \tl_set:Nn \l__fontspec_mapping_tl { #1 }
2655  }
2656\__fontspec_keys_define_code:nnn {fontspec-opentype} {Mapping}
2657  {
2658    \tl_set:Nn \l__fontspec_mapping_tl { #1 }
2659  }
2660\__fontspec_keys_define_code:nnn {fontspec} {Weight}
2661  {
2662    \__fontspec_update_featstr:n{weight=#1}
2663  }
2664\__fontspec_keys_define_code:nnn {fontspec} {Width}
2665  {
2666    \__fontspec_update_featstr:n{width=#1}
2667  }
2668\__fontspec_keys_define_code:nnn {fontspec} {OpticalSize}
2669  {
2670    \bool_if:NTF \l__fontspec_ot_bool
2671      {
2672        \tl_set:Nn \l__fontspec_optical_size_tl {/ S = #1}
2673      }
2674      {
2675        \bool_if:NT \l__fontspec_mm_bool
2676        {
2677          \__fontspec_update_featstr:n { optical size = #1 }
2678        }
2679      }
2680    \bool_if:nT { !\l__fontspec_ot_bool && !\l__fontspec_mm_bool }
2681      {
2682        \bool_if:NT \l__fontspec_firsttime_bool
2683        { \__fontspec_warning:nx {no-opticals} {\l_fontspec_fontname_tl} }
2684      }
2685  }
2686\keys_define:nn {fontspec}
2687  {
2688    FakeSlant .code:n =
2689      {
2690        \__fontspec_update_featstr:n {slant=#1}
2691      },
2692    FakeSlant .default:n = {0.2}
2693 }
2694\keys_define:nn {fontspec}
2695  {
2696    FakeStretch .code:n =
2697      {
2698        \__fontspec_update_featstr:n {extend=#1}
2699      },
2700    FakeStretch .default:n = {1.2}
2701  }
2702\keys_define:nn {fontspec}
2703  {
2704    FakeBold .code:n =
2705      {
2706        \__fontspec_update_featstr:n {embolden=#1}
2707      },
2708    FakeBold .default:n = {1.5}
2709  }
2710\keys_define:nn {fontspec}
2711  {
2712    AutoFakeSlant .code:n =
2713      {
2714        \bool_if:NT \l__fontspec_firsttime_bool
2715          {
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
2720
2721            \tl_if_empty:NF \l__fontspec_fake_embolden_tl
2722              {
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
2727              }
2728          }
2729      },
2730    AutoFakeSlant .default:n = {0.2}
2731  }
2732\keys_define:nn {fontspec}
2733  {
2734    AutoFakeBold .code:n =
2735      {
2736        \bool_if:NT \l__fontspec_firsttime_bool
2737          {
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
2742
2743            \tl_if_empty:NF \l__fontspec_fake_slant_tl
2744              {
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
2749              }
2750          }
2751      },
2752    AutoFakeBold .default:n = {1.5}
2753  }
2754\__fontspec_keys_define_code:nnn {fontspec-opentype} {RawFeature}
2755  {
2756    \__fontspec_update_featstr:n {#1}
2757  }
2758\__fontspec_keys_define_code:nnn {fontspec-aat} {RawFeature}
2759  {
2760    \__fontspec_update_featstr:n {#1}
2761  }
2762
2763%%^^A%%  fontspec-code-feat-opentype.dtx -- part of FONTSPEC <wspr.io/fontspec>
2764
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} {} {}
2772  {
2773    +dlig,-dlig,+rlig,-rlig,+liga,-liga,+dlig,-dlig,+clig,-clig,+hlig,-hlig,
2774  mapping = tex-text
2775  }
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}
2783  {
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 },
2787  }
2788\__fontspec_define_opentype_feature_group:n {Letters}
2789\__fontspec_define_opentype_feature:nnnnn   {Letters} {ResetAll} {} {}
2790  {
2791    +case,+smcp,+pcap,+c2sc,+c2pc,+unic,+rand,
2792    -case,-smcp,-pcap,-c2sc,-c2pc,-unic,-rand
2793  }
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} {} {}
2803  {
2804    +tnum,-tnum,
2805    +pnum,-pnum,
2806    +onum,-onum,
2807    +lnum,-lnum,
2808    +zero,-zero,
2809    +anum,-anum,
2810  }
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} {} {}
2821  {
2822    +sups,-sups,
2823    +subs,-subs,
2824    +ordn,-ordn,
2825    +numr,-numr,
2826    +dnom,-dnom,
2827    +sinf,-sinf,
2828  }
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} {} {}
2837  {
2838    +cswh,-cswh,
2839    +calt,-calt,
2840    +init,-init,
2841    +fina,-fina,
2842    +falt,-falt,
2843    +medi,-medi,
2844  }
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} {} {}
2853  {
2854    +mark,-mark,
2855    +mkmk,-mkmk,
2856    +abvm,-abvm,
2857    +blwm,-blwm,
2858  }
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} {} {}
2865  {
2866    +cpsp,-cpsp,
2867    +kern,-kern,
2868  }
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} {} {}
2875  {
2876    +frac,-frac,
2877    +afrc,-afrc,
2878  }
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}
2887
2888\__fontspec_define_opentype_feature_group:n  {Style}
2889\__fontspec_define_opentype_feature:nnnnn    {Style} {ResetAll} {} {}
2890  {
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,
2901  }
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} {} {}
2918  {
2919    +trad,-trad,
2920    +smpl,-smpl,
2921    +jp78,-jp78,
2922    +jp83,-jp83,
2923    +jp90,-jp90,
2924    +jp04,-jp04,
2925    +expt,-expt,
2926    +nlck,-nlck,
2927  }
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} {} {}
2938  {
2939    +pwid,-pwid,
2940    +fwid,-fwid,
2941    +hwid,-hwid,
2942    +twid,-twid,
2943    +qwid,-qwid,
2944    +palt,-palt,
2945    +halt,-halt,
2946  }
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}
2965  {
2966    Alternate .default:n = {0} ,
2967    Alternate .groups:n = {opentype},
2968    Alternate / unknown .code:n =
2969      {
2970        \clist_map_inline:nn {#1}
2971          { \__fontspec_make_OT_feature:nnn {salt}{ +salt = ##1 }{} }
2972      }
2973  }
2974\aliasfontfeature{Alternate}{StylisticAlternates}
2975\__fontspec_define_opentype_feature_group:n  {Variant}
2976\keys_define:nn {fontspec-opentype}
2977  {
2978    Variant .default:n = {0} ,
2979    Variant .groups:n = {opentype} ,
2980    Variant / unknown .code:n =
2981      {
2982        \clist_map_inline:nn {#1}
2983          {
2984            \__fontspec_make_OT_feature:xxx { ss \two@digits {##1} } { +ss \two@digits {##1} } {}
2985          }
2986      }
2987  }
2988\aliasfontfeature{Variant}{StylisticSet}
2989\__fontspec_define_opentype_feature_group:n  {CharacterVariant}
2990\use:x
2991  {
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
2994      {
2995        \__fontspec_make_OT_feature:xxx
2996          {  cv \exp_not:N \two@digits {##1} }
2997          { +cv \exp_not:N \two@digits {##1} = ##2 } {}
2998      }
2999    \keys_define:nn {fontspec-opentype}
3000      {
3001        CharacterVariant / unknown .code:n =
3002          {
3003            \clist_map_inline:nn {##1}
3004              {
3005                \exp_not:N \fontspec_parse_cv:w
3006                  ####1 \c_colon_str 0 \c_colon_str \exp_not:N \q_nil
3007              }
3008          }
3009      }
3010  }
3011\__fontspec_define_opentype_feature_group:n {Annotation}
3012\keys_define:nn {fontspec-opentype}
3013  {
3014    Annotation .default:n = {0} ,
3015    Annotation .groups:n = {opentype},
3016    Annotation / unknown .code:n =
3017      {
3018        \__fontspec_make_OT_feature:nnn {nalt} {+nalt=#1} {}
3019      }
3020  }
3021\__fontspec_define_opentype_feature_group:n  {Ornament}
3022\keys_define:nn {fontspec-opentype}
3023  {
3024    Ornament .default:n = {0} ,
3025    Ornament .groups:n = {opentype},
3026    Ornament / unknown .code:n =
3027      {
3028        \__fontspec_make_OT_feature:nnn {ornm} { +ornm=#1 } {}
3029      }
3030  }
3031\keys_define:nn {fontspec-opentype}
3032  {
3033    Script .choice: ,
3034    Script .groups:n = {opentype} ,
3035  }
3036\cs_new:Nn \fontspec_new_script:nn
3037  {
3038    \keys_define:nn {fontspec-opentype} { Script / #1 .code:n =
3039      {
3040        \bool_set_false:N \l__fontspec_scriptlang_exist_bool
3041        \clist_map_inline:nn {#2}
3042          {
3043            \exp_args:No \__fontspec_check_script:NnT \l__fontspec_fontface_cs_tl {####1}
3044              {
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:
3051              }
3052          }
3053
3054        \bool_if:NF \l__fontspec_scriptlang_exist_bool
3055          {
3056            \bool_if:nF { \str_if_eq_p:ee {#1} {CustomDefault} }
3057              {
3058                \tl_clear:N \l__fontspec_script_name_tl
3059                \__fontspec_warning:nxx {no-script} {\l_fontspec_fontname_tl} {#1}
3060              }
3061
3062            \bool_if:nF
3063              {
3064                \str_if_eq_p:ee {#1} {Default} ||
3065                \str_if_eq_p:ee {#1} {Latin}   ||
3066                \str_if_eq_p:ee {#1} {CustomDefault}
3067              }
3068              {
3069                \keys_set:nn {fontspec-opentype} { Script = CustomDefault }
3070              }
3071          }
3072      }
3073    }
3074  }
3075\keys_define:nn {fontspec-opentype}
3076  {
3077    Language .choice: ,
3078    Language .groups:n = {opentype} ,
3079  }
3080\cs_new:Nn \fontspec_new_lang:nn
3081  {
3082    \keys_define:nn {fontspec-opentype} { Language / #1 .code:n =
3083      {
3084        \bool_set_false:N \l__fontspec_scriptlang_exist_bool
3085        \clist_map_inline:nn {#2}
3086          {
3087            \exp_args:No \__fontspec_check_lang:NnTF \l__fontspec_fontface_cs_tl {####1}
3088              {
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:
3094              }
3095          }
3096        \bool_if:NF \l__fontspec_scriptlang_exist_bool
3097          {
3098            \__fontspec_warning:nx {language-not-exist} {#1}
3099            \keys_set:nn {fontspec-opentype} { Language = Default }
3100          }
3101      }
3102    }
3103  }
3104\__fontspec_keys_define_code:nnn {fontspec-opentype} { Language / Default }
3105  {
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 }
3109  }
3110\cs_new:Nn \__fontspec_ot_compat:nn
3111  {
3112    \aliasfontfeatureoption {#1} {#2Off} {No#2}
3113  }
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}
3131
3132%%^^A%%  fontspec-code-scripts.dtx -- part of FONTSPEC <wspr.io/fontspec>
3133
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}
3297
3298%%^^A%%  fontspec-code-lang.dtx -- part of FONTSPEC <wspr.io/fontspec>
3299
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}
3683
3684%%^^A%%  fontspec-code-feat-aat.dtx -- part of FONTSPEC <wspr.io/fontspec>
3685
3686
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}
3709 {
3710  Ligatures / TeX .code:n =
3711   {
3712     \tl_set:Nn \l__fontspec_mapping_tl { tex-text }
3713   }
3714 }
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}
3756  {
3757    Alternate .default:n = {0} ,
3758    Alternate / unknown .code:n =
3759      {
3760        \clist_map_inline:nn {#1}
3761          {
3762            \__fontspec_make_AAT_feature:nn {17}{##1}
3763          }
3764      }
3765  }
3766\__fontspec_define_aat_feature_group:n  {Variant}
3767\keys_define:nn {fontspec-aat}
3768  {
3769    Variant .default:n = {0} ,
3770    Variant / unknown .code:n =
3771      {
3772        \clist_map_inline:nn {#1}
3773          { \__fontspec_make_AAT_feature:nn {18}{##1} }
3774      }
3775  }
3776\aliasfontfeature{Variant}{StylisticSet}
3777\__fontspec_define_aat_feature_group:n  {Vertical}
3778\keys_define:nn {fontspec-aat}
3779  {
3780    Vertical .choice: ,
3781    Vertical / RotatedGlyphs .code:n =
3782      {
3783        \__fontspec_update_featstr:n {vertical}
3784      }
3785  }
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}
3824
3825%%^^A%%  fontspec-code-enc.dtx -- part of FONTSPEC <wspr.io/fontspec>
3826
3827\DeclareDocumentCommand \EncodingCommand { m O{} O{} m }
3828  {
3829    \bool_if:NF \l__fontspec_defining_encoding_bool
3830      { \__fontspec_error:nn {only-inside-encdef} \EncodingCommand }
3831    \DeclareTextCommand{#1}{\UnicodeEncodingName}[#2][#3]{#4}
3832  }
3833\DeclareDocumentCommand \EncodingAccent {mm}
3834  {
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}}
3838  }
3839\DeclareDocumentCommand \EncodingSymbol {mm}
3840  {
3841    \bool_if:NF \l__fontspec_defining_encoding_bool
3842      { \__fontspec_error:nn {only-inside-encdef} \EncodingSymbol }
3843    \DeclareTextSymbol{#1}{\UnicodeEncodingName}{#2}
3844  }
3845\DeclareDocumentCommand \EncodingComposite {mmm}
3846  {
3847    \bool_if:NF \l__fontspec_defining_encoding_bool
3848      { \__fontspec_error:nn {only-inside-encdef} \EncodingComposite }
3849    \DeclareTextComposite{#1}{\UnicodeEncodingName}{#2}{#3}
3850  }
3851\DeclareDocumentCommand \EncodingCompositeCommand {mmm}
3852  {
3853    \bool_if:NF \l__fontspec_defining_encoding_bool
3854      { \__fontspec_error:nn {only-inside-encdef} \EncodingCompositeCommand }
3855    \DeclareTextCompositeCommand{#1}{\UnicodeEncodingName}{#2}{#3}
3856  }
3857\DeclareDocumentCommand \DeclareUnicodeEncoding {mm}
3858  {
3859    \DeclareFontEncoding{#1}{}{}
3860    \DeclareFontSubstitution{#1}{lmr}{m}{n}
3861    \DeclareFontFamily{#1}{lmr}{}
3862
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}}{}
3873
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
3877    #2
3878    \bool_set_false:N \l__fontspec_defining_encoding_bool
3879    \tl_set_eq:NN \UnicodeEncodingName \l__fontspec_prev_unicode_name_tl
3880  }
3881\DeclareDocumentCommand \UndeclareSymbol {m}
3882  {
3883    \bool_if:NF \l__fontspec_defining_encoding_bool
3884      { \__fontspec_error:nn {only-inside-encdef} \UndeclareSymbol }
3885    \UndeclareTextCommand {#1} {\UnicodeEncodingName}
3886  }
3887\DeclareDocumentCommand \UndeclareAccent {m}
3888  {
3889    \bool_if:NF \l__fontspec_defining_encoding_bool
3890      { \__fontspec_error:nn {only-inside-encdef} \UndeclareAccent }
3891    \UndeclareTextCommand {#1} {\UnicodeEncodingName}
3892  }
3893\DeclareDocumentCommand \UndeclareCommand {m}
3894  {
3895    \bool_if:NF \l__fontspec_defining_encoding_bool
3896      { \__fontspec_error:nn {only-inside-encdef} \UndeclareCommand }
3897    \UndeclareTextCommand {#1} {\UnicodeEncodingName}
3898  }
3899\DeclareDocumentCommand \UndeclareComposite {mm}
3900  {
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} }
3905  }
3906
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:
3912 {
3913  \@ifpackageloaded{euler}
3914   {
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} }
3918   }
3919   {}
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}
3939    \fi
3940  \group_end:
3941  \bool_if:NF \g__fontspec_math_euler_bool
3942   {
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
3948     {
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
3979    }
3980  }
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
3990   {
3991    \SetMathAlphabet\mathit{bold}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\itdefault
3992   }
3993   {
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
3997   }
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
4000 }
4001\cs_new:Nn \fontspec_maybe_setup_maths:
4002 {
4003  \@ifpackageloaded{anttor}
4004   {
4005    \ifx\define@antt@mathversions a\bool_gset_false:N \g__fontspec_math_bool\fi
4006   }{}
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}
4016   {
4017    \ifx\define@iwona@mathversions a\bool_set_false:N \g__fontspec_math_bool\fi
4018   }{}
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}
4022   {
4023    \ifx\define@kurier@mathversions a\bool_set_false:N \g__fontspec_math_bool\fi
4024   }{}
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
4039   {
4040    \__fontspec_info:n {setup-math}
4041    \fontspec_setup_maths:
4042   }
4043 }
4044\AtBeginDocument{\fontspec_maybe_setup_maths:}
4045
4046%%^^A%%  fontspec-code-closing.dtx -- part of FONTSPEC <wspr.io/fontspec>
4047\bool_if:NT \g__fontspec_cfg_bool
4048  {
4049    \InputIfFileExists{fontspec.cfg}
4050      {}
4051      { \typeout{No~ fontspec.cfg~ file~ found;~ no~ configuration~ loaded.} }
4052  }
4053
4054%%^^A%%  fontspec-code-xfss.dtx -- part of FONTSPEC <wspr.io/fontspec>
4055
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:
4060  {
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}
4069  }
4070\__fontspec_merge_default_shapes:
4071\prg_new_conditional:Nnn \__fontspec_if_merge_shape:n {TF}
4072  {
4073    \bool_lazy_and:nnTF
4074      { \tl_if_exist_p:c { \__fontspec_shape_merge:nn {\f@shape} {#1} } }
4075      {
4076        \cs_if_exist_p:c
4077          {
4078            \f@encoding/\f@family/\f@series/
4079            \tl_use:c { \__fontspec_shape_merge:nn {\f@shape} {#1} }
4080          }
4081      }
4082    \prg_return_true: \prg_return_false:
4083  }
4084\cs_if_exist:NTF \DeclareFontSeriesChangeRule
4085{
4086  \cs_set_eq:NN \emfontdeclare \DeclareEmphSequence
4087}
4088{
4089\DeclareRobustCommand{\sishape}
4090  {
4091    \not@math@alphabet\sishape\relax
4092    \fontshape{\scitdefault}\selectfont
4093  }
4094\DeclareTextFontCommand{\textsi}{\sishape}
4095\cs_new:Nn \__fontspec_merge_shape:n
4096  {
4097    \__fontspec_if_merge_shape:nTF {#1}
4098      { \fontshape { \tl_use:c { \__fontspec_shape_merge:nn {\f@shape} {#1} } } \selectfont }
4099      { \fontshape {#1} \selectfont }
4100  }
4101\DeclareRobustCommand \itshape
4102  {
4103    \not@math@alphabet\itshape\mathit
4104    \__fontspec_merge_shape:n\itdefault
4105  }
4106\DeclareRobustCommand \slshape
4107  {
4108    \not@math@alphabet\slshape\relax
4109    \__fontspec_merge_shape:n\sldefault
4110  }
4111\DeclareRobustCommand \scshape
4112  {
4113    \not@math@alphabet\scshape\relax
4114    \__fontspec_merge_shape:n\scdefault
4115  }
4116\DeclareRobustCommand \upshape
4117  {
4118    \not@math@alphabet\upshape\relax
4119    \__fontspec_merge_shape:n\updefault
4120  }
4121\cs_set_protected:Npn \emfontdeclare #1
4122  {
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
4126
4127    \tl_if_in:nnT {#1} {\slshape}
4128      {
4129        \tl_if_in:nnT {#1} {\itshape}
4130          {
4131            \bool_gset_false:N \g__fontspec_em_normalise_slant_bool
4132          }
4133      }
4134
4135    \group_begin:
4136      \normalfont
4137      \clist_map_inline:nn {\emreset,#1}
4138        {
4139          ##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
4143        }
4144    \group_end:
4145  }
4146\DeclareRobustCommand \em
4147  {
4148    \@nomath\em
4149    \tl_set:Nx \l__fontspec_emshape_query_tl { \f@shape }
4150
4151    \bool_if:NT \g__fontspec_em_normalise_slant_bool
4152      {
4153        \tl_replace_all:Nnn \l__fontspec_emshape_query_tl {/sl} {/it}
4154      }
4155
4156    \prop_get:NxNT \g__fontspec_em_prop { \l__fontspec_emshape_query_tl } \l__fontspec_em_tmp_tl
4157      {
4158        \int_set:Nn \l__fontspec_em_int { \l__fontspec_em_tmp_tl }
4159      }
4160
4161    \int_incr:N \l__fontspec_em_int
4162
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 }
4165      {
4166        \int_zero:N \l__fontspec_em_int
4167        \emreset
4168      }
4169
4170  }
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} }
4177}
4178\cs_set_protected:Npn \strongfontdeclare #1
4179  {
4180    \prop_gclear:N   \g__fontspec_strong_prop
4181    \int_zero:N      \l__fontspec_strongdef_int
4182
4183    \group_begin:
4184      \normalfont
4185      \clist_map_inline:nn {\strongreset,#1}
4186        {
4187          ##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
4191        }
4192    \group_end:
4193  }
4194\DeclareRobustCommand \strongenv
4195  {
4196    \@nomath\strongenv
4197
4198    \prop_get:NxNT \g__fontspec_strong_prop { \f@series } \l__fontspec_strong_tmp_tl
4199      {
4200        \int_set:Nn \l__fontspec_strong_int { \l__fontspec_strong_tmp_tl }
4201      }
4202
4203    \int_incr:N \l__fontspec_strong_int
4204
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 }
4207      {
4208        \int_zero:N \l__fontspec_strong_int
4209        \strongreset
4210      }
4211
4212  }
4213\DeclareTextFontCommand{\strong}{\strongenv}
4214\cs_set:Npn \strongreset {}
4215\cs_set:Npn \reset@font
4216  {
4217    \normalfont
4218    \int_zero:N \l__fontspec_em_int
4219    \int_zero:N \l__fontspec_strong_int
4220  }
4221\cs_new:Nn \fontspec_set_strong_level:n { \int_set:Nn \l__fontspec_strong_int {#1} }
4222\strongfontdeclare{ \bfseries }
4223
4224