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