diff --git a/build.lua b/build.lua index 78f33ca9..5bb4aa55 100644 --- a/build.lua +++ b/build.lua @@ -20,7 +20,9 @@ if options["target"] == "ctan" then "firstaid/xcolor-patches-tmp-ltx.sty", "firstaid/color-ltx.sty", "firstaid/output-patches-tmp-ltx.dtx", - "firstaid/colorspace-patches-tmp-ltx.sty" + "firstaid/colorspace-patches-tmp-ltx.sty", + "firstaid/fontspec-luatex-tmp-ltx.sty", + "firstaid/luaotfload-l3color-tmp.lua" } else sourcefiles = {"*.dtx","*.ins", @@ -33,6 +35,8 @@ else "firstaid/output-patches-tmp-ltx.dtx", "firstaid/output-patches-tmp-ltx.dtx", "firstaid/colorspace-patches-tmp-ltx.sty", + "firstaid/fontspec-luatex-tmp-ltx.sty", + "firstaid/luaotfload-l3color-tmp.lua", "support/pdfmanagement-regressiontest.sty", "newpackages/new-bookmark.sty", "newpackages/bkm-generic.def", diff --git a/firstaid/fontspec-luatex-tmp-ltx.sty b/firstaid/fontspec-luatex-tmp-ltx.sty new file mode 100644 index 00000000..18bd326a --- /dev/null +++ b/firstaid/fontspec-luatex-tmp-ltx.sty @@ -0,0 +1,3889 @@ +%% +%% This is file `fontspec-luatex.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% fontspec.dtx (with options: `fontspec,LU') +%% fontspec-code-load.dtx (with options: `fontspec,LU') +%% fontspec-code-vars.dtx (with options: `fontspec,LU') +%% fontspec-code-msg.dtx (with options: `fontspec,LU') +%% fontspec-code-opening.dtx (with options: `fontspec,LU') +%% fontspec-code-fontload.dtx (with options: `fontspec,LU') +%% fontspec-code-interfaces.dtx (with options: `fontspec,LU') +%% fontspec-code-user.dtx (with options: `fontspec,LU') +%% fontspec-code-api.dtx (with options: `fontspec,LU') +%% fontspec-code-internal.dtx (with options: `fontspec,LU') +%% fontspec-code-opentype.dtx (with options: `fontspec,LU') +%% fontspec-code-graphite.dtx (with options: `fontspec,LU') +%% fontspec-code-keyval.dtx (with options: `fontspec,LU') +%% fontspec-code-feat-opentype.dtx (with options: `fontspec,LU') +%% fontspec-code-scripts.dtx (with options: `fontspec,LU') +%% fontspec-code-lang.dtx (with options: `fontspec,LU') +%% fontspec-code-feat-aat.dtx (with options: `fontspec,LU') +%% fontspec-code-enc.dtx (with options: `fontspec,LU') +%% fontspec-code-math.dtx (with options: `fontspec,LU') +%% fontspec-code-closing.dtx (with options: `fontspec,LU') +%% fontspec-code-xfss.dtx (with options: `fontspec,LU') +%% ------------------------------------------------ +%% The FONTSPEC package +%% ------------------------------------------------ +%% Copyright 2004-2017 Will Robertson, LPPL "maintainer" +%% Copyright 2009-2013 Khaled Hosny +%% ------------------------------------------------ +%% This package is free software and may be redistributed and/or modified under +%% the conditions of the LaTeX Project Public License, version 1.3c or higher +%% (your choice): . +%% ------------------------------------------------ +%%^^A%% fontspec.dtx -- part of FONTSPEC +%%^^A%% Metadata for the package, including files and versioning + +\RequirePackage{xparse} +\ProvidesExplPackage{fontspec-luatex}% + {2022/01/15}{2.8a}{Font selection for XeLaTeX and LuaLaTeX} + +%%^^A%% fontspec-code-load.dtx -- part of FONTSPEC +%%^^A%% fontspec-code-vars.dtx -- part of FONTSPEC +\bool_new:N \l__fontspec_firsttime_bool +\bool_new:N \l__fontspec_nobf_bool +\bool_new:N \l__fontspec_noit_bool +\bool_new:N \l__fontspec_nosc_bool +\bool_new:N \l__fontspec_check_bool +\bool_new:N \l__fontspec_tfm_bool +\bool_new:N \l__fontspec_atsui_bool +\bool_new:N \l__fontspec_ot_bool +\bool_new:N \l__fontspec_mm_bool +\bool_new:N \l__fontspec_harfbuzz_bool +\bool_new:N \l__fontspec_graphite_bool +\bool_new:N \l__fontspec_fontcfg_bool +\bool_set_true:N \l__fontspec_fontcfg_bool +\bool_new:N \g__fontspec_math_euler_bool +\bool_new:N \g__fontspec_math_lucida_bool +\bool_new:N \g__fontspec_pkg_euler_loaded_bool +\bool_new:N \g__fontspec_cfg_bool +\bool_new:N \g__fontspec_math_bool +\bool_new:N \g__fontspec_euenc_bool +\bool_new:N \l__fontspec_tmpa_bool +\bool_new:N \l__fontspec_disable_defaults_bool +\bool_new:N \l__fontspec_alias_bool +\bool_new:N \l__fontspec_external_bool +\bool_new:N \l__fontspec_defining_encoding_bool +\bool_new:N \l__fontspec_scriptlang_exist_bool +\bool_new:N \g__fontspec_em_normalise_slant_bool +\bool_new:N \l__fontspec_proceed_bool +\bool_new:N \l__fontspec_never_check_bool +\int_new:N \l__fontspec_script_int +\int_new:N \l__fontspec_language_int +\int_new:N \l__fontspec_strnum_int +\int_new:N \l__fontspec_tmp_int +\int_new:N \l__fontspec_tmpa_int +\int_new:N \l__fontspec_tmpb_int +\int_new:N \l__fontspec_tmpc_int +\int_new:N \l__fontspec_em_int +\int_new:N \l__fontspec_emdef_int +\int_new:N \l__fontspec_strong_int +\int_new:N \l__fontspec_strongdef_int +\fp_new:N \l__fontspec_tmpa_fp +\fp_new:N \l__fontspec_tmpb_fp +\dim_new:N \l__fontspec_tmpa_dim +\dim_new:N \l__fontspec_tmpb_dim +\dim_new:N \l__fontspec_tmpc_dim +\seq_new:N \l__fontspec_bf_series_seq +\clist_new:N \g__fontspec_default_fontopts_clist +\clist_new:N \g__fontspec_all_keyval_modules_clist +\clist_new:N \l__fontspec_sizefeat_clist +\clist_set:Nn \l__fontspec_sizefeat_clist {Size={-}} +\clist_new:N \l__fontspec_extensions_clist +\clist_new:N \l__fontspec_fontopts_clist +\clist_new:N \l__fontspec_family_fontopts_clist +\clist_new:N \l__fontspec_all_features_clist +\clist_new:N \l__fontspec_leftover_clist +\clist_new:N \l__fontspec_keys_leftover_clist +\clist_new:N \l__fontspec_sizing_leftover_clist +\clist_new:N \l__fontspec_fontfeat_clist +\clist_new:N \l__fontspec_fontfeat_curr_clist +\clist_new:N \l__fontspec_arg_clist +\clist_new:N \l__fontspec_this_feat_clist +\clist_new:N \l__fontspec_fontfeat_up_clist +\clist_new:N \l__fontspec_fontfeat_bf_clist +\clist_new:N \l__fontspec_fontfeat_it_clist +\clist_new:N \l__fontspec_fontfeat_bfit_clist +\clist_new:N \l__fontspec_fontfeat_sl_clist +\clist_new:N \l__fontspec_fontfeat_bfsl_clist +\clist_new:N \l__fontspec_fontfeat_sw_clist +\clist_new:N \l__fontspec_fontfeat_bfsw_clist +\clist_new:N \l__fontspec_fontfeat_sc_clist +\prop_new:N \g__fontspec_fontopts_prop +\prop_new:N \l__fontspec_nfss_prop +\prop_new:N \l__fontspec_nfssfont_prop +\prop_new:N \g__fontspec_OT_features_prop +\prop_new:N \g__fontspec_all_opentype_feature_names_prop +\prop_new:N \g__fontspec_em_prop +\prop_new:N \g__fontspec_strong_prop +\prop_new:N \g__fontspec_fontid_family_prop +\prop_new:N \g__fontspec_family_int_prop +\tl_new:N \l_fontspec_family_tl +\tl_new:N \g_fontspec_encoding_tl +\tl_new:N \l_fontspec_fontname_tl +\tl_clear_new:N \UTFencname +\tl_clear_new:N \cyrillicencoding +\tl_clear_new:N \latinencoding +\tl_new:N \l__fontspec_renderer_tl +\tl_new:N \l__fontspec_mode_tl +\tl_new:N \l__fontspec_shaper_tl +\tl_new:N \g__fontspec_defined_shapes_tl +\tl_new:N \g__fontspec_single_feat_tl +\tl_new:N \l__fontspec_basename_tl +\tl_new:N \g__fontspec_curr_series_tl +\tl_new:N \l__fontspec_curr_fontname_tl +\tl_new:N \l__fontspec_curr_bfname_tl +\tl_new:N \l__fontspec_ext_filename_tl +\tl_new:N \l__fontspec_extension_tl +\tl_new:N \l__fontspec_font_path_tl +\tl_new:N \l__fontspec_fontid_tl +\tl_new:N \l__fontspec_fontname_tl +\tl_new:N \l__fontspec_options_tl +\tl_new:N \l__fontspec_saved_fontname_tl +\tl_new:N \l__fontspec_prev_unicode_name_tl +\tl_new:N \g__fontspec_nfss_enc_tl +\tl_new:N \g__fontspec_nfss_family_tl +\tl_new:N \l__fontspec_nfss_sc_tl +\tl_new:N \l__fontspec_nfss_tl +\tl_new:N \l__fontspec_nfss_fam_tl +\tl_new:N \l__fontspec_size_tl +\tl_new:N \l__fontspec_sizedfont_tl +\tl_new:N \l__fontspec_this_font_tl +\tl_new:N \l__fontspec_ttc_index_tl +\tl_new:N \l__fontspec_smcp_shape_tl +\tl_new:N \l__fontspec_emshape_query_tl +\tl_new:N \l__fontspec_em_switch_tl +\tl_new:N \l__fontspec_strong_switch_tl +\tl_new:N \l__fontspec_tmp_tl +\tl_new:N \l__fontspec_tmpa_tl +\tl_new:N \l__fontspec_tmpb_tl +\tl_new:N \l__fontspec_em_tmp_tl +\tl_new:N \l__fontspec_strong_tmp_tl +\tl_new:N \g__fontspec_mathrm_tl +\tl_new:N \g__fontspec_bfmathrm_tl +\tl_new:N \g__fontspec_mathsf_tl +\tl_new:N \g__fontspec_mathtt_tl +\tl_gset:Nn \g__fontspec_mathrm_tl {\rmdefault} +\tl_gset:Nn \g__fontspec_mathsf_tl {\sfdefault} +\tl_gset:Nn \g__fontspec_mathtt_tl {\ttdefault} +\tl_new:N \l__fontspec_family_label_tl +\tl_new:N \l__fontspec_fake_slant_tl +\tl_new:N \l__fontspec_fake_embolden_tl +\tl_new:N \l__fontspec_fontname_up_tl +\tl_new:N \l__fontspec_fontname_bf_tl +\tl_new:N \l__fontspec_fontname_it_tl +\tl_new:N \l__fontspec_fontname_bfit_tl +\tl_new:N \l__fontspec_fontname_sl_tl +\tl_new:N \l__fontspec_fontname_bfsl_tl +\tl_new:N \l__fontspec_fontname_sw_tl +\tl_new:N \l__fontspec_fontname_bfsw_tl +\tl_new:N \l__fontspec_fontname_sc_tl +\tl_new:N \l__fontspec_script_tl +\tl_new:N \l__fontspec_script_name_tl +\tl_set:Nn \l__fontspec_script_name_tl {CustomDefault} +\tl_new:N \l__fontspec_lang_tl +\tl_new:N \l__fontspec_lang_name_tl +\tl_set:Nn \l__fontspec_lang_name_tl {Default} +\tl_new:N \l__fontspec_scale_tl +\tl_new:N \l__fontspec_hyphenchar_tl +\tl_new:N \l__fontspec_hexcol_tl +\tl_new:N \l__fontspec_opacity_tl +\tl_new:N \l__fontspec_optical_size_tl +\tl_new:N \l__fontspec_mapping_tl +\tl_new:N \l__fontspec_punctspace_adjust_tl +\tl_new:N \l__fontspec_wordspace_adjust_tl +\tl_new:N \l__fontspec_postadjust_tl +\tl_const:Nn \c__fontspec_hexcol_tl {000000} + \tl_const:Nn \c__fontspec_opacity_tl {} +\tl_const:Nn \c__fontspec_postadjust_tl { \l__fontspec_wordspace_adjust_tl \l__fontspec_punctspace_adjust_tl } +\tl_new:N \g__fontspec_rawfeatures_sclist +\tl_new:N \l__fontspec_pre_feat_sclist +\tl_new:N \l__fontspec_rmfamily_family_tl +\tl_new:N \l__fontspec_sffamily_family_tl +\tl_new:N \l__fontspec_ttfamily_family_tl +\tl_new:N \l__fontspec_rmfamily_encoding_tl +\tl_new:N \l__fontspec_sffamily_encoding_tl +\tl_new:N \l__fontspec_ttfamily_encoding_tl + +%%^^A%% fontspec-code-msg.dtx -- part of FONTSPEC +\cs_new:Npn \__fontspec_error:n { \msg_error:nn {fontspec} } +\cs_new:Npn \__fontspec_error:nn { \msg_error:nnn {fontspec} } +\cs_new:Npn \__fontspec_error:nx { \msg_error:nnx {fontspec} } +\cs_new:Npn \__fontspec_error:nxx { \msg_error:nnxx {fontspec} } +\cs_new:Npn \__fontspec_warning:n { \msg_warning:nn {fontspec} } +\cs_new:Npn \__fontspec_warning:nx { \msg_warning:nnx {fontspec} } +\cs_new:Npn \__fontspec_warning:nxx { \msg_warning:nnxx {fontspec} } +\cs_new:Npn \__fontspec_info:n { \msg_info:nn {fontspec} } +\cs_new:Npn \__fontspec_info:nx { \msg_info:nnx {fontspec} } +\cs_new:Npn \__fontspec_info:nxx { \msg_info:nnxx {fontspec} } +\cs_new:Npn \__fontspec_trace:n { \msg_trace:nn {fontspec} } +\cs_generate_variant:Nn \msg_new:nnn {nnx} +\cs_generate_variant:Nn \msg_new:nnnn {nnxx} +\cs_new:Nn \__fontspec_msg_new:nn + { \msg_new:nnx {fontspec} {#1} { \tl_trim_spaces:n {#2} } } +\cs_new:Nn \__fontspec_msg_new:nnn + { \msg_new:nnxx {fontspec} {#1} { \tl_trim_spaces:n {#2} } { \tl_trim_spaces:n {#3} } } +\char_set_catcode_space:n {32} +\__fontspec_msg_new:nn {only-inside-encdef} + { + \exp_not:N #1 can only be used in the second argument + to \string\DeclareUnicodeEncoding. + } +\__fontspec_msg_new:nn {no-size-info} + { + Size information must be supplied.\\ + For example, SizeFeatures={Size={8-12},...}. + } +\__fontspec_msg_new:nnn {font-not-found} + { + The font "#1" cannot be found. + } + { + A font might not be found for many reasons.\\ + Check the spelling, where the font is installed etc. etc.\\\\ + When in doubt, ask someone for help! + } +\__fontspec_msg_new:nnn {rename-feature-not-exist} + { + The feature #1 doesn't appear to be defined. + } + { + It looks like you're trying to rename a feature that doesn't exist. + } +\__fontspec_msg_new:nn {no-glyph} + { + '#1' does not contain glyph #2. + } +\__fontspec_msg_new:nnn {euler-too-late} + { + The euler package must be loaded BEFORE fontspec. + } + { + fontspec only overwrites euler's attempt to + define the maths text fonts if fontspec is + loaded after euler. Type to proceed + with incorrect \string\mathit, \string\mathbf, etc. + } +\__fontspec_msg_new:nnn {no-xcolor} + { + Cannot load named colours without the xcolor package. + } + { + Sorry, I can't do anything to help. Instead of loading + the color package, use xcolor instead. + } +\__fontspec_msg_new:nnn {unknown-color-model} + { + Error loading colour `#1'; unknown colour model. + } + { + Sorry, I can't do anything to help. Please report this error + to my developer with a minimal example that causes the problem. + } +\__fontspec_msg_new:nnn {not-in-addfontfeatures} + { + The "#1" font feature cannot be used in \string\addfontfeatures. + } + { + This is due to how TeX loads fonts; such settings + are global so adding them mid-document within a group causes + confusion. You'll need to define multiple font families to achieve + what you want. + } +\__fontspec_msg_new:nn {tu-clash} + { + I have found the tuenc.def encoding definition file but the TU encoding is not + defined by the LaTeX2e kernel; attempting to correct but you really should update + to the latest version of LaTeX2e. + } +\__fontspec_msg_new:nn {tu-missing} + { + The TU encoding seems to be missing; please update to the latest version of LaTeX2e. + } +\__fontspec_msg_new:nn {addfontfeatures-ignored} + { + \string\addfontfeature (s) ignored \msg_line_context:; + it cannot be used with a font that wasn't selected by a fontspec command.\\ + \\ + The current font is "\use:c{font@name}".\\ + \int_compare:nTF { \clist_count:n {#1} = 1 } + { The requested feature is "#1". } + { The requested features are "#1". } + } +\__fontspec_msg_new:nn {feature-option-overwrite} + { + Option '#2' of font feature '#1' overwritten. + } +\__fontspec_msg_new:nn {ot-tag-too-long} + { + OpenType tag '#1' is too long; script, language, and feature tags must be four characters or fewer. + } +\__fontspec_msg_new:nn {aat-feature-not-exist} + { + '\l_keys_key_tl=\l_keys_value_tl' feature not supported + for AAT font '\l_fontspec_fontname_tl'. + } +\__fontspec_msg_new:nn {aat-feature-not-exist-in-font} + { + AAT feature '\l_keys_key_tl=\l_keys_value_tl' (#1) not available + in font '\l_fontspec_fontname_tl'. + } +\__fontspec_msg_new:nn {icu-feature-not-exist} + { + '\l_keys_key_tl=\l_keys_value_tl' feature not supported + for OpenType font '\l_fontspec_fontname_tl' + } +\__fontspec_msg_new:nn {icu-feature-not-exist-in-font} + { + OpenType feature '\l_keys_key_tl=\l_keys_value_tl' (#1) not available + for font '\l_fontspec_fontname_tl' + with script '\l__fontspec_script_name_tl' and language '\l__fontspec_lang_name_tl'. + } +\__fontspec_msg_new:nn {no-opticals} + { + '#1' doesn't appear to have an Optical Size axis. + } +\__fontspec_msg_new:nn {language-not-exist} + { + Language '#1' not available + for font '\l_fontspec_fontname_tl' + with script '\l__fontspec_script_name_tl'. + } +\__fontspec_msg_new:nn {only-xetex-feature} + { + Ignored XeTeX-only feature: '#1'. + } +\__fontspec_msg_new:nn {only-luatex-feature} + { + Ignored LuaTeX-only feature: '#1'. + } +\__fontspec_msg_new:nn {unknown-renderer} + { + Renderer '#1' unknown. Assuming Harfbuzz with 'shaper=#1'. + Please raise a fontspec issue to add this shaper to the interface. + } +\__fontspec_msg_new:nn {no-mapping} + { + Input mapping not supported in LuaTeX. + } +\__fontspec_msg_new:nn {no-mapping-ligtex} + { + Input mapping not supported in LuaTeX.\\ + Use "Ligatures=TeX" instead of "Mapping=tex-text". + } +\__fontspec_msg_new:nn {cm-default-obsolete} + { + The "cm-default" package option is obsolete. + } +\__fontspec_msg_new:nn {font-index-needs-ttc} + { + The "FontIndex" feature is only supported by TTC (TrueType Collection) fonts.\\ + Feature ignored. + } +\__fontspec_msg_new:nn {feat-cannot-remove} + { + The "#1" feature cannot be deactivated. Request ignored. + } +\__fontspec_msg_new:nn {defining-font} + { + Font family '\g__fontspec_nfss_family_tl' created for font '#2' + with options [\l__fontspec_all_features_clist].\\ + \\ + This font family consists of the following NFSS series/shapes:\\ + \g__fontspec_defined_shapes_tl + } +\__fontspec_msg_new:nn {no-font-shape} + { + Could not resolve font "#1" (it probably doesn't exist). + } +\__fontspec_msg_new:nn {set-scale} + { + \l_fontspec_fontname_tl\space scale = \l__fontspec_scale_tl. + } +\__fontspec_msg_new:nn {setup-math} + { + Adjusting the maths setup (use [no-math] to avoid this). + } +\__fontspec_msg_new:nn {no-script} + { + Font "#1" does not contain requested Script "#2". + } +\__fontspec_msg_new:nn {opa-twice} + { + Opacity set twice, in both Colour and Opacity.\\ + Using specification "Opacity=#1". + } +\__fontspec_msg_new:nn {opa-twice-col} + { + Opacity set twice, in both Opacity and Colour.\\ + Using an opacity specification in hex of "#1/FF". + } +\__fontspec_msg_new:nn {bad-colour} + { + Bad colour declaration "#1". + Colour must be one of:\\ + * a named xcolor colour\\ + * a six-digit hex colour RRGGBB\\ + * an eight-digit hex colour RRGGBBTT with opacity + } +\char_set_catcode_ignore:n {32} + +%%^^A%% fontspec-code-opening.dtx -- part of FONTSPEC +\DeclareOption{cm-default} + { + \__fontspec_warning:n {cm-default-obsolete} + } +\DeclareOption {math} { \bool_gset_true:N \g__fontspec_math_bool } +\DeclareOption {no-math} { \bool_gset_false:N \g__fontspec_math_bool } +\DeclareOption {config} { \bool_gset_true:N \g__fontspec_cfg_bool } +\DeclareOption {no-config}{ \bool_gset_false:N \g__fontspec_cfg_bool } +\DeclareOption {euenc} { \bool_gset_true:N \g__fontspec_euenc_bool } +\DeclareOption {tuenc} { \bool_gset_false:N \g__fontspec_euenc_bool } +\DeclareOption {quiet} + { + \msg_redirect_module:nnn { fontspec } { warning } { info } + \msg_redirect_module:nnn { fontspec } { info } { none } + } +\DeclareOption{silent} + { + \msg_redirect_module:nnn { fontspec } { warning } { none } + \msg_redirect_module:nnn { fontspec } { info } { none } + } +\ExecuteOptions{config,math,tuenc} +\ProcessOptions* +\bool_if:NF \g__fontspec_euenc_bool + { + \file_if_exist:nTF {tuenc.def} + { + \cs_if_exist:cF {T@TU} + { + \__fontspec_warning:n {tu-clash} + \DeclareFontEncoding{TU}{}{} + \DeclareFontSubstitution{TU}{lmr}{m}{n} + } + } + { + \__fontspec_warning:n {tu-missing} + \bool_gset_true:N \g__fontspec_euenc_bool + } + } +\bool_if:NTF \g__fontspec_euenc_bool + { + \tl_gset:Nn \g_fontspec_encoding_tl {EU2} + } + { \tl_gset:Nn \g_fontspec_encoding_tl { TU } } +\tl_set:Nn \rmdefault {lmr} +\tl_set:Nn \sfdefault {lmss} +\tl_set:Nn \ttdefault {lmtt} +\RequirePackage[\g_fontspec_encoding_tl]{fontenc} +\tl_set_eq:NN \UTFencname \g_fontspec_encoding_tl % for xunicode if needed +\tl_if_in:NnT \@filelist {.cls} { \normalsize } +\tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl +\tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl +\AtBeginDocument + { + \tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl + \tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl + } +\bool_if:NT \g__fontspec_euenc_bool + { + \cs_set_eq:NN \fontspec_tmp: \XeTeXpicfile + \cs_set:Npn \XeTeXpicfile {} + \RequirePackage{xunicode} + \cs_set_eq:NN \XeTeXpicfile \fontspec_tmp: + } +\cs_new:Npn \FontspecSetCheckBoolTrue { \bool_set_true:N \l__fontspec_check_bool } +\cs_new:Npn \FontspecSetCheckBoolFalse { \bool_set_false:N \l__fontspec_check_bool } +\cs_new:Nn \__fontspec_keys_set_known:nnN + { + \keys_set_known:nnN {#1} {#2} #3 + } +\cs_generate_variant:Nn \__fontspec_keys_set_known:nnN {nx} +\cs_new:Nn \__fontspec_int_mult_truncate:Nn + { + \int_set:Nn #1 { \__dim_eval:w #2 #1 \__dim_eval_end: } + } +\cs_set:Npn \__fontspec_lua_function:ne #1#2 { \lua_now:e { fontspec.#1 ("#2") } } +\cs_set:Npn \__fontspec_lua_function:nee #1#2#3 { \lua_now:e { fontspec.#1 ("#2","#3") } } +\cs_set:Npn \__fontspec_lua_function:neee #1#2#3#4 { \lua_now:e { fontspec.#1 ("#2","#3","#4") } } +\cs_set:Npn \__fontspec_lua_function:neeee #1#2#3#4#5 { \lua_now:e { fontspec.#1 ("#2","#3","#4","#5") } } +\cs_generate_variant:Nn \int_set:Nn {Nv} +\cs_generate_variant:Nn \keys_set:nn {nx} +\cs_generate_variant:Nn \keys_set_known:nnN {nx} +\cs_generate_variant:Nn \prop_put:Nnn {Nxx} +\cs_generate_variant:Nn \prop_put:Nnn {NxV} +\cs_generate_variant:Nn \prop_gput_if_new:Nnn {NxV} +\cs_generate_variant:Nn \prop_gput:Nnn {Nxn} +\cs_generate_variant:Nn \prop_get:NnNT {NxN} +\cs_generate_variant:Nn \prop_get:NnNTF {NxN} +\cs_generate_variant:Nn \str_if_eq:nnTF {nv} +\cs_generate_variant:Nn \tl_if_empty_p:n {e} +\cs_generate_variant:Nn \tl_if_empty:nTF {x} +\cs_generate_variant:Nn \tl_if_empty:nF {x} +\cs_generate_variant:Nn \tl_if_empty:nF {f} +\cs_generate_variant:Nn \tl_if_eq:nnT {ox} +\cs_generate_variant:Nn \tl_replace_all:Nnn {Nnx} + +%%^^A%% fontspec-code-fontload.dtx -- part of FONTSPEC + +\cs_set:Npn \__fontspec_primitive_font_set:Nnn #1#2#3 + { + \font #1 = #2 ~at~ \dim_eval:n {#3} \scan_stop: + } +\cs_set:Npn \__fontspec_primitive_font_gset:Nnn #1#2#3 + { + \global \font #1 = #2 ~at~ \dim_eval:n {#3} \scan_stop: + } +\cs_set:Npn \__fontspec_font_suppress_not_found_error: + { + \int_set:Nn \suppressfontnotfounderror {1} + } +\prg_set_conditional:Nnn \__fontspec_primitive_font_if_null:N {p,TF,T,F} + { + \ifx #1 \nullfont + \prg_return_true: + \else + \prg_return_false: + \fi + } +\prg_set_conditional:Nnn \__fontspec_primitive_font_set:Nnn {TF,T,F} + { + \__fontspec_primitive_font_set:Nnn #1 {#2} {#3} + \__fontspec_primitive_font_if_null:NTF #1 {\prg_return_false:} {\prg_return_true:} + } +\prg_set_conditional:Nnn \__fontspec_primitive_font_gset:Nnn {TF,T,F} + { + \__fontspec_primitive_font_gset:Nnn #1 {#2} {#3} + \__fontspec_primitive_font_if_null:NTF #1 {\prg_return_false:} {\prg_return_true:} + } +\cs_set:Npn \__fontspec_primitive_font_set:Onn { \exp_last_unbraced:No \__fontspec_primitive_font_set:Nnn } +\cs_set:Npn \__fontspec_primitive_font_set:OnnF { \exp_last_unbraced:No \__fontspec_primitive_font_set:NnnF } +\cs_set:Npn \__fontspec_primitive_font_gset:Onn { \exp_last_unbraced:No \__fontspec_primitive_font_gset:Nnn } +\cs_set:Npn \__fontspec_primitive_font_gset:OnnF { \exp_last_unbraced:No \__fontspec_primitive_font_gset:NnnF } +\prg_set_conditional:Nnn \__fontspec_primitive_font_if_exist:n {TF,T,F} + { + \group_begin: + \__fontspec_font_suppress_not_found_error: + \__fontspec_primitive_font_set:Nnn \l__fontspec_primitive_font {#1} { \f@size pt - 1sp } + \__fontspec_primitive_font_if_null:NTF \l__fontspec_primitive_font + { \group_end: \prg_return_false: } + { \group_end: \prg_return_true: } + } +\prg_new_conditional:Nnn \__fontspec_primitive_font_glyph_if_exist:Nn {p,TF,T,F} + { + \tex_iffontchar:D #1 #2 \scan_stop: + \prg_return_true: + \else: + \prg_return_false: + \fi: + } +\cs_new:Nn \__fontspec_primitive_font_set_hyphenchar:Nn + { + \tex_hyphenchar:D #1 = #2 \scan_stop: + } +\cs_new_eq:NN \__fontspec_primitive_font_get_name:N \fontname +\cs_new:Npn \__fontspec_primitive_font_current_name: + { + \__fontspec_primitive_font_get_name:N \tex_font:D + } + +%%^^A%% fontspec-code-interfaces.dtx -- part of FONTSPEC + +\NewDocumentCommand \fontspec { O{} m O{} } + { + \__fontspec_main_fontspec:nn {#1,#3} {#2} + \ignorespaces + } +\NewDocumentCommand \setmainfont { O{} m O{} } + { + \__fontspec_main_setmainfont:nn {#1,#3} {#2} + \ignorespaces + } +\NewDocumentCommand \setsansfont { O{} m O{} } + { + \__fontspec_main_setsansfont:nn {#1,#3} {#2} + \ignorespaces + } +\NewDocumentCommand \setmonofont { O{} m O{} } + { + \__fontspec_main_setmonofont:nn {#1,#3} {#2} + \ignorespaces + } +\NewDocumentCommand \setmathrm { O{} m O{} } + { + \__fontspec_main_setmathrm:nn {#1,#3} {#2} + } +\NewDocumentCommand \setboldmathrm { O{} m O{} } + { + \__fontspec_main_setboldmathrm:nn {#1,#3} {#2} + } +\NewDocumentCommand \setmathsf { O{} m O{} } + { + \__fontspec_main_setmathsf:nn {#1,#3} {#2} + } +\NewDocumentCommand \setmathtt { O{} m O{} } + { + \__fontspec_main_setmathtt:nn {#1,#3} {#2} + } +\NewDocumentCommand \setromanfont { O{} m O{} } + { + \__fontspec_main_setmainfont:nn {#1,#3} {#2} + } +\NewDocumentCommand \newfontfamily { m O{} m O{} } + { + \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \NewDocumentCommand + } +\NewDocumentCommand \renewfontfamily { m O{} m O{} } + { + \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \RenewDocumentCommand + } +\NewDocumentCommand \setfontfamily { m O{} m O{} } + { + \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \DeclareDocumentCommand + } +\NewDocumentCommand \providefontfamily { m O{} m O{} } + { + \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \ProvideDocumentCommand + } +\NewDocumentCommand \newfontface { m O{} m O{} } + { + \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \NewDocumentCommand + } +\NewDocumentCommand \renewfontface { m O{} m O{} } + { + \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \RenewDocumentCommand + } +\NewDocumentCommand \setfontface { m O{} m O{} } + { + \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \DeclareDocumentCommand + } +\NewDocumentCommand \providefontface { m O{} m O{} } + { + \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \ProvideDocumentCommand + } +\NewDocumentCommand \defaultfontfeatures { t+ o m } + { + \IfNoValueTF {#2} + { \__fontspec_set_default_features:nn {#1} {#3} } + { \__fontspec_set_font_default_features:nnn {#1} {#2} {#3} } + \ignorespaces + } +\NewDocumentCommand \addfontfeatures {m} + { + \__fontspec_main_addfontfeatures:n {#1} + } +\NewDocumentCommand \addfontfeature {m} + { + \__fontspec_main_addfontfeatures:n {#1} + } +\NewDocumentCommand \newfontfeature {mm} + { + \__fontspec_main_newfontfeature:nn {#1} {#2} + } +\NewDocumentCommand \newAATfeature {mmmm} + { + \__fontspec_main_newAATfeature:nnnn {#1} {#2} {#3} {#4} + } +\NewDocumentCommand \newopentypefeature {mmm} + { + \__fontspec_main_newopentypefeature:nnn {#1} {#2} {#3} + } +\NewDocumentCommand \newICUfeature {mmm} + { + \__fontspec_main_newopentypefeature:nnn {#1} {#2} {#3} + } +\NewDocumentCommand \aliasfontfeature {mm} + { + \__fontspec_main_aliasfontfeature:nn {#1} {#2} + } +\NewDocumentCommand \aliasfontfeatureoption {mmm} + { + \__fontspec_main_aliasfontfeatureoption:nnn {#1} {#2} {#3} + } +\NewDocumentCommand \newfontscript {mm} + { + \fontspec_new_script:nn {#1} {#2} + } +\NewDocumentCommand \newfontlanguage {mm} + { + \fontspec_new_lang:nn {#1} {#2} + } +\NewDocumentCommand \DeclareFontExtensions {m} + { + \__fontspec_main_DeclareFontExtensions:n {#1} + } +\NewDocumentCommand \IfFontFeatureActiveTF {mmm} + { + \__fontspec_main_IfFontFeatureActiveTF:nnn {#1} {#2} {#3} + } +\AtBeginDocument + { + \RenewDocumentCommand \oldstylenums {m} + { + \__fontspec_main_oldstylenums:n {#1} + } + } +\NewDocumentCommand \liningnums {m} + { + \__fontspec_main_liningnums:n {#1} + } + +%%^^A%% fontspec-code-user.dtx -- part of FONTSPEC + +\cs_new:Nn \__fontspec_main_fontspec:nn + { + \fontspec_set_family:Nnn \f@family {#1} {#2} + \fontencoding { \g__fontspec_nfss_enc_tl } + \selectfont + } +\cs_if_exist:NTF \@rmfamilyhook + { + \tl_put_right:Nn \@rmfamilyhook {\fontencoding \l__fontspec_rmfamily_encoding_tl} + \tl_put_right:Nn \@sffamilyhook {\fontencoding \l__fontspec_sffamily_encoding_tl} + \tl_put_right:Nn \@ttfamilyhook {\fontencoding \l__fontspec_ttfamily_encoding_tl} + } + { + \tl_replace_all:cnn { rmfamily~ } { \fontfamily } + { \fontencoding \l__fontspec_rmfamily_encoding_tl \fontfamily } + \tl_replace_all:cnn { sffamily~ } { \fontfamily } + { \fontencoding \l__fontspec_sffamily_encoding_tl \fontfamily } + \tl_replace_all:cnn { ttfamily~ } { \fontfamily } + { \fontencoding \l__fontspec_ttfamily_encoding_tl \fontfamily } + } +\tl_set:Nn \l__fontspec_rmfamily_encoding_tl { \encodingdefault } +\tl_set:Nn \l__fontspec_sffamily_encoding_tl { \encodingdefault } +\tl_set:Nn \l__fontspec_ttfamily_encoding_tl { \encodingdefault } +\cs_new:Nn \__fontspec_main_setmainfont:nn + { + \ifdefined\DeclareFontSeriesDefault + \DeclareFontSeriesDefault[rm]{bf}{\bfdefault} + \fi + \fontspec_set_family:Nnn \l__fontspec_rmfamily_family_tl {#1} {#2} + \tl_set_eq:NN \rmdefault \l__fontspec_rmfamily_family_tl + \tl_set_eq:NN \l__fontspec_rmfamily_encoding_tl \g__fontspec_nfss_enc_tl + \str_if_eq:eeT {\familydefault} {\rmdefault} + { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl } + \__fontspec_setmainfont_hook:nn {#1} {#2} % for unicode-math only + \normalfont + } +\cs_new:Nn \__fontspec_main_setsansfont:nn + { + \ifdefined\DeclareFontSeriesDefault + \DeclareFontSeriesDefault[sf]{bf}{\bfdefault} + \fi + \fontspec_set_family:Nnn \l__fontspec_sffamily_family_tl {#1} {#2} + \tl_set_eq:NN \sfdefault \l__fontspec_sffamily_family_tl + \tl_set_eq:NN \l__fontspec_sffamily_encoding_tl \g__fontspec_nfss_enc_tl + \str_if_eq:eeT {\familydefault} {\sfdefault} + { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl } + \__fontspec_setsansfont_hook:nn {#1} {#2} % for unicode-math only + \normalfont + } +\cs_new:Nn \__fontspec_main_setmonofont:nn + { + \ifdefined\DeclareFontSeriesDefault + \DeclareFontSeriesDefault[tt]{bf}{\bfdefault} + \fi + \fontspec_set_family:Nnn \l__fontspec_ttfamily_family_tl {#1} {#2} + \tl_set_eq:NN \ttdefault \l__fontspec_ttfamily_family_tl + \tl_set_eq:NN \l__fontspec_ttfamily_encoding_tl \g__fontspec_nfss_enc_tl + \str_if_eq:eeT {\familydefault} {\ttdefault} + { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl } + \__fontspec_setmonofont_hook:nn {#1} {#2} % for unicode-math only + \normalfont + } +\cs_new:Nn \__fontspec_main_setmathrm:nn + { + \fontspec_gset_family:Nnn \g__fontspec_mathrm_tl {Renderer=Basic,#1} {#2} + \__fontspec_setmathrm_hook:nn {#1} {#2} % for unicode-math only + } +\cs_new:Nn \__fontspec_main_setboldmathrm:nn + { + \fontspec_gset_family:Nnn \g__fontspec_bfmathrm_tl {Renderer=Basic,#1} {#2} + \__fontspec_setboldmathrm_hook:nn {#1} {#2} % for unicode-math only + } +\cs_new:Nn \__fontspec_main_setmathsf:nn + { + \fontspec_gset_family:Nnn \g__fontspec_mathsf_tl {Renderer=Basic,#1} {#2} + \__fontspec_setmathsf_hook:nn {#1} {#2} % for unicode-math only + } +\cs_new:Nn \__fontspec_main_setmathtt:nn + { + \fontspec_gset_family:Nnn \g__fontspec_mathtt_tl {Renderer=Basic,#1} {#2} + \__fontspec_setmathtt_hook:nn {#1} {#2} % for unicode-math only + } +\cs_set_eq:NN \__fontspec_setmainfont_hook:nn \use_none:nn +\cs_set_eq:NN \__fontspec_setsansfont_hook:nn \use_none:nn +\cs_set_eq:NN \__fontspec_setmonofont_hook:nn \use_none:nn +\cs_set_eq:NN \__fontspec_setmathrm_hook:nn \use_none:nn +\cs_set_eq:NN \__fontspec_setmathsf_hook:nn \use_none:nn +\cs_set_eq:NN \__fontspec_setmathtt_hook:nn \use_none:nn +\cs_set_eq:NN \__fontspec_setboldmathrm_hook:nn \use_none:nn +\@onlypreamble\setmathrm +\@onlypreamble\setboldmathrm +\@onlypreamble\setmathsf +\@onlypreamble\setmathtt +\tl_gset:Nn \g__fontspec_mathrm_tl {\rmdefault} +\tl_gset:Nn \g__fontspec_mathsf_tl {\sfdefault} +\tl_gset:Nn \g__fontspec_mathtt_tl {\ttdefault} +\cs_new:Nn \__fontspec_main_newfontfamily:NnnN + { + \fontspec_set_family:cnn { l__fontspec_ \cs_to_str:N #1 _family_tl } {#2} {#3} + \use:x + { + \exp_not:N #4 \exp_not:N #1 {} + { + \exp_not:N \fontfamily { \use:c { l__fontspec_ \cs_to_str:N #1 _family_tl } } + \exp_not:N \fontencoding { \g__fontspec_nfss_enc_tl } + \exp_not:N \selectfont + } + } + } +\cs_new:Nn \__fontspec_main_newfontface:NnnN + { + \__fontspec_main_newfontfamily:NnnN #1 { BoldFont={},ItalicFont={},SmallCapsFont={},#2 } {#3} #4 + } +\cs_new:Nn \__fontspec_set_default_features:nn + { + \IfBooleanTF {#1} \clist_gput_right:Nn \clist_gset:Nn + \g__fontspec_default_fontopts_clist {#2} + } +\cs_new:Nn \__fontspec_set_font_default_features:nnn + { + \clist_map_inline:nn {#2} + { + \tl_if_single:nTF {##1} + { \tl_set:No \l__fontspec_tmp_tl { \cs:w l__fontspec_ \cs_to_str:N ##1 _family_tl\cs_end: } } + { \__fontspec_sanitise_fontname:Nn \l__fontspec_tmp_tl {##1} } + + \IfBooleanTF {#1} + { + \prop_get:NVNF \g__fontspec_fontopts_prop \l__fontspec_tmp_tl \l__fontspec_tmpb_tl + { \tl_clear:N \l__fontspec_tmpb_tl } + \tl_put_right:Nn \l__fontspec_tmpb_tl {#3,} + \prop_gput:NVV \g__fontspec_fontopts_prop \l__fontspec_tmp_tl \l__fontspec_tmpb_tl + } + { + \tl_if_empty:nTF {#3} + { \prop_gremove:NV \g__fontspec_fontopts_prop \l__fontspec_tmp_tl } + { \prop_gput:NVn \g__fontspec_fontopts_prop \l__fontspec_tmp_tl {#3,} } + } + } + } +\cs_new:Nn \__fontspec_main_addfontfeatures:n + { + \fontspec_if_fontspec_font:TF + { + \group_begin: + \keys_set_known:nnN {fontspec-addfeatures} {#1} \l__fontspec_tmp_tl + \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {options} \l__fontspec_options_tl + \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {fontname} \l__fontspec_fontname_tl + \bool_set_true:N \l__fontspec_disable_defaults_bool + \use:x + { + \__fontspec_select_font_family:nn + { \l__fontspec_options_tl , #1 } {\l__fontspec_fontname_tl} + } + \group_end: + \fontfamily \g__fontspec_nfss_family_tl \selectfont + } + { + \__fontspec_warning:nx {addfontfeatures-ignored} {#1} + } + \ignorespaces + } +\cs_new:Nn \__fontspec_main_newfontfeature:nn + { + \keys_define:nn { fontspec } + { + #1 .code:n = { \__fontspec_update_featstr:n {#2} } + } + } +\cs_new:Nn \__fontspec_main_newAATfeature:nnnn + { + \keys_if_exist:nnF { fontspec } {#1} + { \__fontspec_define_aat_feature_group:n {#1} } + + \keys_if_choice_exist:nnnT {fontspec} {#1} {#2} + { \__fontspec_warning:nxx {feature-option-overwrite} {#1} {#2} } + + \__fontspec_define_aat_feature:nnnn {#1}{#2}{#3}{#4} + } +\cs_new:Nn \__fontspec_main_newopentypefeature:nnn + { + \keys_if_exist:nnF { fontspec / options } {#1} + { \__fontspec_define_opentype_feature_group:n {#1} } + + \keys_if_choice_exist:nnnT {fontspec} {#1} {#2} + { \__fontspec_warning:nxx {feature-option-overwrite} {#1} {#2} } + + \exp_args:Nnnx \__fontspec_define_opentype_feature:nnnnn + {#1} {#2} { \__fontspec_strip_plus_minus:n {#3} } {#3} {} + } +\cs_new:Nn \__fontspec_strip_plus_minus:n { \__fontspec_strip_plus_minus_aux:Nq #1 \q_nil } +\cs_new:Npn \__fontspec_strip_plus_minus_aux:Nq #1#2 \q_nil + { + \str_case:nnF {#1} { {+} {#2} {-} {#2} } {#1#2} + } +\cs_new:Nn \__fontspec_main_aliasfontfeature:nn + { + \bool_set_false:N \l__fontspec_alias_bool + + \clist_map_inline:Nn \g__fontspec_all_keyval_modules_clist + { + \keys_if_exist:nnT {##1} {#1} + { + \bool_set_true:N \l__fontspec_alias_bool + \keys_define:nn {##1} + { #2 .code:n = { \keys_set:nn {##1} { #1 = {####1} } } } + } + } + + \bool_if:NF \l__fontspec_alias_bool + { \__fontspec_warning:nx {rename-feature-not-exist} {#1} } + } +\cs_new:Nn \__fontspec_main_aliasfontfeatureoption:nnn + { + \bool_set_false:N \l__fontspec_alias_bool + + \clist_map_inline:Nn \g__fontspec_all_keyval_modules_clist + { + \keys_if_exist:nnT { ##1 / #1 } {#2} + { + \bool_set_true:N \l__fontspec_alias_bool + \keys_define:nn { ##1 / #1 } + { #3 .code:n = { \keys_set:nn {##1} { #1 = {#2} } } } + } + + \keys_if_exist:nnT { ##1 / #1 } {#2Reset} + { + \keys_define:nn { ##1 / #1 } + { #3Reset .code:n = { \keys_set:nn {##1} { #1 = {#2Reset} } } } + } + + \keys_if_exist:nnT { ##1 / #1 } {#2Off} + { + \keys_define:nn { ##1 / #1 } + { #3Off .code:n = { \keys_set:nn {##1} { #1 = {#2Off} } } } + } + } + + \bool_if:NF \l__fontspec_alias_bool + { \__fontspec_warning:nx {rename-feature-not-exist} {#1/#2} } + } +\cs_new:Nn \__fontspec_main_DeclareFontExtensions:n + { + \clist_set:Nn \l__fontspec_extensions_clist { #1 } + } +\__fontspec_main_DeclareFontExtensions:n {.otf,.ttf,.OTF,.TTF,.ttc,.TTC,.dfont} +\cs_new:Nn \__fontspec_main_IfFontFeatureActiveTF:nnn + { + \__fontspec_if_font_feature:nTF {#1} {#2} {#3} + } +\prg_new_conditional:Nnn \__fontspec_if_font_feature:n {TF} + { + \tl_gclear:N \g__fontspec_single_feat_tl + \group_begin: + \__fontspec_font_suppress_not_found_error: + \__fontspec_init: + \bool_set_true:N \l__fontspec_ot_bool + \bool_set_true:N \l__fontspec_never_check_bool + \bool_set_false:N \l__fontspec_firsttime_bool + \clist_clear:N \l__fontspec_fontfeat_clist + \__fontspec_get_features:n {#1} + \group_end: + + + \tl_if_empty:NTF \g__fontspec_single_feat_tl { \prg_return_false: } + { + \exp_args:NV \fontspec_if_current_feature:nTF \g__fontspec_single_feat_tl + { \prg_return_true: } { \prg_return_false: } + } + } +\cs_new_protected:Nn \__fontspec_main_oldstylenums:n + { + \group_begin: + \addfontfeature{Numbers=OldStyle} + #1 + \group_end: + } +\cs_new_protected:Nn \__fontspec_main_liningnums:n + { + \group_begin: + \addfontfeature{Numbers=Lining} + #1 + \group_end: + } + +%%^^A%% fontspec-code-api.dtx -- part of FONTSPEC + +\prg_new_conditional:Nnn \fontspec_if_fontspec_font: {TF,T,F} + { + \cs_if_exist:cTF {g__fontspec_fontinfo_ \f@family _prop} \prg_return_true: \prg_return_false: + } +\prg_new_conditional:Nnn \fontspec_if_aat_feature:nn {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { + \__fontspec_set_font_type:N \font + \bool_if:NTF \l__fontspec_atsui_bool + { + \__fontspec_make_AAT_feature_string:NnnTF \font {#1} {#2} + \prg_return_true: \prg_return_false: + } + { + \prg_return_false: + } + } + { + \prg_return_false: + } + } +\prg_new_conditional:Nnn \fontspec_if_opentype: {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { + \__fontspec_set_font_type:N \font + \bool_if:NTF \l__fontspec_ot_bool \prg_return_true: \prg_return_false: + } + { + \prg_return_false: + } + } +\prg_new_conditional:Nnn \fontspec_if_feature:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { + \__fontspec_set_font_type:N \font + \bool_if:NTF \l__fontspec_ot_bool + { + \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-num} \l__fontspec_tmp_tl + \int_set:Nn \l__fontspec_script_int {\l__fontspec_tmp_tl} + + \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {lang-num} \l__fontspec_tmp_tl + \int_set:Nn \l__fontspec_language_int {\l__fontspec_tmp_tl} + + \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-tag} \l__fontspec_script_tl + \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {lang-tag} \l__fontspec_lang_tl + + \__fontspec_check_ot_feat:NnTF \font {#1} {\prg_return_true:} {\prg_return_false:} + } + { + \prg_return_false: + } + } + { + \prg_return_false: + } + } +\prg_new_conditional:Nnn \fontspec_if_feature:nnn {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { + \__fontspec_set_font_type:N \font + \bool_if:NTF \l__fontspec_ot_bool + { + \__fontspec_check_ot_feat:NnnnTF \font {#3} {#2} {#1} \prg_return_true: \prg_return_false: + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_script:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { + \__fontspec_set_font_type:N \font + \bool_if:NTF \l__fontspec_ot_bool + { + \__fontspec_check_script:NnTF \font {#1} \prg_return_true: \prg_return_false: + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_language:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { + \__fontspec_set_font_type:N \font + \bool_if:NTF \l__fontspec_ot_bool + { + \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-num} \l__fontspec_tmp_tl + \int_set:Nn \l__fontspec_script_int {\l__fontspec_tmp_tl} + \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-tag} \l__fontspec_script_tl + + \__fontspec_check_lang:NnTF \font {#1} \prg_return_true: \prg_return_false: + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_language:nn {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { + \__fontspec_set_font_type:N \font + \bool_if:NTF \l__fontspec_ot_bool + { + \__fontspec_check_lang:NnnTF \font {#2} {#1} \prg_return_true: \prg_return_false: + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_current_script:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { + \__fontspec_set_font_type:N \font + \bool_if:NTF \l__fontspec_ot_bool + { + \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-tag} \l__fontspec_tmp_tl + \str_if_eq:nVTF {#1} \l__fontspec_tmp_tl + {\prg_return_true:} {\prg_return_false:} + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_current_language:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { + \__fontspec_set_font_type:N \font + \bool_if:NTF \l__fontspec_ot_bool + { + \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {lang-tag} \l__fontspec_tmp_tl + \str_if_eq:nVTF {#1} \l__fontspec_tmp_tl + {\prg_return_true:} {\prg_return_false:} + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\cs_new:Nn \__fontspec_tl_new_if_free:N { \tl_if_exist:NF #1 { \tl_new:N #1 } } +\cs_new:Nn \__fontspec_set_family:NnnN + { + \tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} % reset + \tl_set:Nn \l__fontspec_family_label_tl {#1} + \__fontspec_select_font_family:nn {#2} {#3} + \__fontspec_tl_new_if_free:N #1 + #4 #1 \l_fontspec_family_tl + \tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} % reset + } +\cs_new:Nn \fontspec_gset_family:Nnn { \__fontspec_set_family:NnnN #1 {#2} {#3} \tl_gset_eq:NN } +\cs_new:Nn \fontspec_set_family:Nnn { \__fontspec_set_family:NnnN #1 {#2} {#3} \tl_set_eq:NN } +\cs_generate_variant:Nn \fontspec_set_family:Nnn {c} +\tl_new:N \l__fontspec_fontface_cs_tl +\tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} +\cs_new:Nn \__fontspec_set_fontface:NNnnN + { + \tl_set:Nn \l__fontspec_fontface_cs_tl {#1} + \tl_set:Nn \l__fontspec_family_label_tl {#2} + \__fontspec_select_font_family:nn {#3} {#4} + #5 #2 \l_fontspec_family_tl + \tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} % reset + } +\cs_new:Nn \fontspec_gset_fontface:NNnn { \__fontspec_set_fontface:NNnnN #1 #2 {#3} {#4} \tl_gset_eq:NN } +\cs_new:Nn \fontspec_set_fontface:NNnn { \__fontspec_set_fontface:NNnnN #1 #2 {#3} {#4} \tl_set_eq:NN } +\prg_new_conditional:Nnn \fontspec_font_if_exist:n {TF,T,F} + { + \group_begin: + \__fontspec_init: + \__fontspec_if_detect_external:nT {#1} { \__fontspec_font_is_file: } + \__fontspec_primitive_font_if_exist:nTF { \__fontspec_construct_font_call:nn {#1} {} } + { \group_end: \prg_return_true: } + { \group_end: \prg_return_false: } + } +\cs_set_eq:NN \IfFontExistsTF \fontspec_font_if_exist:nTF + +\prg_new_conditional:Nnn \fontspec_if_current_feature:n {TF,T,F} + { + \exp_args:Nxx \tl_if_in:nnTF + { \__fontspec_primitive_font_current_name: } { \tl_to_str:n {#1} } + { \prg_return_true: } { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_small_caps: {TF,T,F} + { + \__fontspec_if_merge_shape:nTF {sc} + { + \tl_set_eq:Nc \l__fontspec_smcp_shape_tl { \__fontspec_shape_merge:nn {\f@shape} {sc} } + } + { + \tl_set:Nn \l__fontspec_smcp_shape_tl {sc} + } + + \cs_if_exist:cTF { \f@encoding/\f@family/\f@series/\l__fontspec_smcp_shape_tl } + { + \tl_if_eq:ccTF + { \f@encoding/\f@family/\f@series/\l__fontspec_smcp_shape_tl } + { \f@encoding/\f@family/\f@series/\shapedefault } + { \prg_return_false: } + { \prg_return_true: } + } + { \prg_return_false: } + } + +%%^^A%% fontspec-code-internal.dtx -- part of FONTSPEC + +\cs_new_protected:Nn \__fontspec_select_font_family:nn + { + \group_begin: + \__fontspec_font_suppress_not_found_error: + \__fontspec_init: + + \__fontspec_sanitise_fontname:Nn \l_fontspec_fontname_tl {#2} + \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_up_tl {#2} + \__fontspec_sanitise_fontname:Nn \l__fontspec_basename_tl {#2} + + \__fontspec_if_detect_external:nT {#2} + { \keys_set:nn {fontspec-preparse-external} {Path} } + + \keys_set_known:nn {fontspec-preparse-cfg} {#1} + + \__fontspec_init_ttc:n {#2} + \__fontspec_load_external_fontoptions:N \l_fontspec_fontname_tl + + \__fontspec_extract_all_features:n {#1} + \tl_set:Nx \l__fontspec_fontid_tl { \tl_to_str:N \l_fontspec_fontname_tl-:-\tl_to_str:N \l__fontspec_all_features_clist } + + + \__fontspec_preparse_features: + \__fontspec_load_font: + \__fontspec_set_scriptlang: + \__fontspec_get_features:n {} + \bool_set_false:N \l__fontspec_firsttime_bool + + \__fontspec_save_family_needed:nTF {#2} + { + \__fontspec_save_family:nn {#1} {#2} + } + { + } + \group_end: + + \tl_set_eq:NN \l_fontspec_family_tl \g__fontspec_nfss_family_tl + } +\cs_set_eq:NN \fontspec_select:nn \__fontspec_select_font_family:nn %% deprecated, for compatibility only +\cs_new:Nn \__fontspec_sanitise_fontname:Nn + { + \tl_set:Nx #1 {#2} + \tl_remove_all:Nn #1 {~} + \clist_map_inline:Nn \l__fontspec_extensions_clist + { + \tl_if_in:NnT #1 {##1} + { + \tl_remove_once:Nn #1 {##1} + \tl_set:Nn \l__fontspec_extension_tl {##1} + \clist_map_break: + } + } + } +\prg_new_conditional:Nnn \__fontspec_if_detect_external:n {T} + { + \clist_map_inline:Nn \l__fontspec_extensions_clist + { + \bool_set_false:N \l__fontspec_tmpa_bool + \exp_args:Nx % <- this should be handled earlier + \tl_if_in:nnT {#1 <= end_of_string} {##1 <= end_of_string} + { \bool_set_true:N \l__fontspec_tmpa_bool \clist_map_break: } + } + \bool_if:NTF \l__fontspec_tmpa_bool \prg_return_true: \prg_return_false: + } +\cs_new:Nn \__fontspec_init_ttc:n + { + \str_if_eq:eeT { \str_lowercase:f {\l__fontspec_extension_tl} } {.ttc} + { + \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_it_tl {#1} + \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_bf_tl {#1} + \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_bfit_tl {#1} + } + } +\cs_new:Nn \__fontspec_load_external_fontoptions:N + { + \bool_if:NT \l__fontspec_fontcfg_bool + { + \tl_set:Nx \l__fontspec_ext_filename_tl {#1.fontspec} + \tl_remove_all:Nn \l__fontspec_ext_filename_tl {~} + \prop_if_in:NVF \g__fontspec_fontopts_prop #1 + { + \exp_args:No \file_if_exist:nT { \l__fontspec_ext_filename_tl } + { \file_input:n { \l__fontspec_ext_filename_tl } } + } + } + } +\cs_new:Nn \__fontspec_extract_all_features:n + { + \bool_if:NTF \l__fontspec_disable_defaults_bool + { + \clist_set:Nx \l__fontspec_all_features_clist {#1} + } + { + \prop_get:NVNF \g__fontspec_fontopts_prop \l_fontspec_fontname_tl \l__fontspec_fontopts_clist + { \clist_clear:N \l__fontspec_fontopts_clist } + + \prop_get:NVNF \g__fontspec_fontopts_prop \l__fontspec_family_label_tl \l__fontspec_family_fontopts_clist + { \clist_clear:N \l__fontspec_family_fontopts_clist } + \tl_clear:N \l__fontspec_family_label_tl + + \clist_set:Nx \l__fontspec_all_features_clist + { + \g__fontspec_default_fontopts_clist, + \l__fontspec_family_fontopts_clist, + \l__fontspec_fontopts_clist, + #1 + } + } + } +\cs_new:Nn \__fontspec_preparse_features: + { + + \__fontspec_keys_set_known:nxN {fontspec-preparse-external} + { \l__fontspec_all_features_clist } + \l__fontspec_keys_leftover_clist + + \tl_set_eq:NN \l_fontspec_fontname_tl \l__fontspec_fontname_up_tl + \__fontspec_keys_set_known:nxN {fontspec-renderer} {\l__fontspec_keys_leftover_clist} + \l__fontspec_keys_leftover_clist + \__fontspec_keys_set_known:nxN {fontspec-preparse} {\l__fontspec_keys_leftover_clist} + \l__fontspec_fontfeat_clist + } +\cs_new:Nn \__fontspec_load_font: + { + + \__fontspec_primitive_font_set:NnnF \l__fontspec_test_font + { \__fontspec_construct_font_call:nn { \l__fontspec_fontname_up_tl } { \l__fontspec_pre_feat_sclist } } + { \f@size pt - 2sp } + { \__fontspec_error:nx {font-not-found} {\l__fontspec_fontname_up_tl} } + + \__fontspec_set_font_type:N \l__fontspec_test_font + \__fontspec_primitive_font_gset:Onn \l__fontspec_fontface_cs_tl + { \__fontspec_construct_font_call:nn { \l__fontspec_fontname_up_tl } { \l__fontspec_pre_feat_sclist } } + { \f@size pt + 2sp } + + \l__fontspec_fontface_cs_tl % this is necessary for LuaLaTeX to check the scripts properly + + } +\cs_new:Nn \__fontspec_construct_font_call:nnnnnn + { + " \__fontspec_fontname_wrap:n { #1 #2 } #3 + #4 #5 + \str_if_eq:eeF {#6}{} {:#6} " + } +\cs_new:Nn \__fontspec_construct_font_call:nn + { + \__fontspec_construct_font_call:nnnnnn + {#1} + \l__fontspec_extension_tl + \l__fontspec_ttc_index_tl + \l__fontspec_renderer_tl + \l__fontspec_optical_size_tl + {#2} + } +\cs_new:Nn \__fontspec_font_is_name: + { + \cs_set_eq:NN \__fontspec_fontname_wrap:n \use:n + } +\cs_new:Nn \__fontspec_font_is_file: + { + \cs_set:Npn \__fontspec_fontname_wrap:n ##1 { [ \l__fontspec_font_path_tl ##1 ] } + } +\cs_new:Nn \__fontspec_set_scriptlang: + { + \bool_if:NT \l__fontspec_firsttime_bool + { + \tl_if_empty:NF \l__fontspec_script_name_tl + { + \keys_set:nx {fontspec-opentype} {Script=\l__fontspec_script_name_tl} + \keys_set:nx {fontspec-opentype} {Language=\l__fontspec_lang_name_tl} + } + } + } +\cs_new:Nn \__fontspec_get_features:n + { + \__fontspec_init_fontface: + \__fontspec_keys_set_known:nxN {fontspec-renderer} {\l__fontspec_fontfeat_clist,#1} + \l__fontspec_keys_leftover_clist + \__fontspec_keys_set_known:nxN {fontspec} {\l__fontspec_keys_leftover_clist} \l__fontspec_keys_leftover_clist + \keys_set:nV {fontspec-opentype} \l__fontspec_keys_leftover_clist + + \tl_if_empty:NF \l__fontspec_mapping_tl + { \__fontspec_update_featstr:n { mapping = \l__fontspec_mapping_tl } } + + \str_if_eq:eeF { \l__fontspec_hexcol_tl \l__fontspec_opacity_tl } + { \c__fontspec_hexcol_tl \c__fontspec_opacity_tl } + { \__fontspec_update_featstr:n { color = {\l__fontspec_hexcol_tl\l__fontspec_opacity_tl} } } + } +\prg_new_conditional:Nnn \__fontspec_save_family_needed:n { TF } + { + + + \tl_if_empty:NTF \l__fontspec_nfss_fam_tl + { + \prop_get:NVNTF \g__fontspec_fontid_family_prop \l__fontspec_fontid_tl \l__fontspec_tmp_tl + { + \tl_gset_eq:NN \g__fontspec_nfss_family_tl \l__fontspec_tmp_tl + \prg_return_false: + } + { + \tl_set:Nx \l__fontspec_tmp_tl {#1} + \tl_remove_all:Nn \l__fontspec_tmp_tl { ~ } + \__fontspec_save_fontid_family:VV \l__fontspec_fontid_tl \l__fontspec_tmp_tl + \prg_return_true: + } + } + { + \tl_gset_eq:NN \g__fontspec_nfss_family_tl \l__fontspec_nfss_fam_tl + \cs_undefine:c { g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop } + \prg_return_true: + } + } +\cs_new:Nn \__fontspec_save_fontid_family:nn + { + \prop_get:NnNTF \g__fontspec_family_int_prop {#2} \l__fontspec_tmp_tl + { + \tl_set:Nx \l__fontspec_tmp_tl + { \int_eval:n { \l__fontspec_tmp_tl + 1 } } + } + { \tl_set:Nn \l__fontspec_tmp_tl { 0 } } + \prop_gput:NnV \g__fontspec_family_int_prop {#2} \l__fontspec_tmp_tl + \tl_gset:Nx \g__fontspec_nfss_family_tl { #2 ( \l__fontspec_tmp_tl ) } + \prop_gput:NnV \g__fontspec_fontid_family_prop {#1} \g__fontspec_nfss_family_tl + } +\cs_generate_variant:Nn \__fontspec_save_fontid_family:nn { VV } +\cs_new:Nn \__fontspec_save_family:nn + { + \__fontspec_save_fontinfo:n {#2} + \__fontspec_find_autofonts: + \DeclareFontFamily{\g__fontspec_nfss_enc_tl}{\g__fontspec_nfss_family_tl}{} + \__fontspec_set_faces: + \__fontspec_info:nxx {defining-font} {#1} {#2} + } +\cs_new:Nn \__fontspec_save_fontinfo:n + { + \prop_new:c {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} + \prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {fontname} { #1 } + \prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {options} { \l__fontspec_all_features_clist } + \prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {fontdef} + { + \__fontspec_construct_font_call:nn {\l_fontspec_fontname_tl} + { \l__fontspec_pre_feat_sclist \g__fontspec_rawfeatures_sclist } + } + \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {script-num} \l__fontspec_script_int + \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {lang-num} \l__fontspec_language_int + \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {script-tag} \l__fontspec_script_tl + \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {lang-tag} \l__fontspec_lang_tl + } +\cs_new:Nn \__fontspec_find_autofonts: + { + \bool_if:nF {\l__fontspec_noit_bool || \l__fontspec_nobf_bool} + { + \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l__fontspec_fontname_it_tl} {/B} + \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l__fontspec_fontname_bf_tl} {/I} + \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l_fontspec_fontname_tl} {/BI} + } + + \bool_if:NF \l__fontspec_nobf_bool + { + \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bf_tl {\l_fontspec_fontname_tl} {/B} + } + + \bool_if:NF \l__fontspec_noit_bool + { + \__fontspec_set_autofont:Nnn \l__fontspec_fontname_it_tl {\l_fontspec_fontname_tl} {/I} + } + + \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfsl_tl {\l__fontspec_fontname_sl_tl} {/B} + } +\cs_new:Nn \__fontspec_set_faces: + { + \__fontspec_add_nfssfont:nnnn \mddefault \shapedefault \l_fontspec_fontname_tl \l__fontspec_fontfeat_up_clist + \__fontspec_add_nfssfont:nnnn \bfdefault \shapedefault \l__fontspec_fontname_bf_tl \l__fontspec_fontfeat_bf_clist + \__fontspec_add_nfssfont:nnnn \mddefault \itdefault \l__fontspec_fontname_it_tl \l__fontspec_fontfeat_it_clist + \__fontspec_add_nfssfont:nnnn \mddefault \sldefault \l__fontspec_fontname_sl_tl \l__fontspec_fontfeat_sl_clist + \__fontspec_add_nfssfont:nnnn \mddefault \swdefault \l__fontspec_fontname_sw_tl \l__fontspec_fontfeat_sw_clist + \__fontspec_add_nfssfont:nnnn \bfdefault \itdefault \l__fontspec_fontname_bfit_tl \l__fontspec_fontfeat_bfit_clist + \__fontspec_add_nfssfont:nnnn \bfdefault \sldefault \l__fontspec_fontname_bfsl_tl \l__fontspec_fontfeat_bfsl_clist + \__fontspec_add_nfssfont:nnnn \bfdefault \swdefault \l__fontspec_fontname_bfsw_tl \l__fontspec_fontfeat_bfsw_clist + \prop_map_inline:Nn \l__fontspec_nfssfont_prop { \__fontspec_set_faces_aux:nnnnn ##2 } + } +\cs_new:Nn \__fontspec_set_faces_aux:nnnnn + { + \fontspec_complete_fontname:Nn \l__fontspec_curr_fontname_tl {#3} + \__fontspec_make_font_shapes:Nnnnn \l__fontspec_curr_fontname_tl {#1} {#2} {#4} {#5} + } +\cs_new:Nn \fontspec_complete_fontname:Nn + { + \tl_set:Nx #1 {#2} + \tl_replace_all:Nnx #1 {*} {\l__fontspec_basename_tl} + \tl_remove_all:Nn #1 {~} + } +\cs_new:Nn \__fontspec_add_nfssfont:nnnn + { + \tl_set:Nx \l__fontspec_this_font_tl {#3} + + \tl_if_empty:xTF {#4} + { \clist_set:Nn \l__fontspec_sizefeat_clist {Size={-}} } + { \__fontspec_keys_set_known:nxN {fontspec-preparse-nested} {#4} \l__fontspec_tmp_tl } + + \tl_if_empty:NF \l__fontspec_this_font_tl + { + \prop_put:Nxx \l__fontspec_nfssfont_prop {#1/#2} + { {#1}{#2}{\l__fontspec_this_font_tl}{#4}{\l__fontspec_sizefeat_clist} } + } + } +\cs_new:Nn \__fontspec_set_font_type:N + { + \bool_set_true:N \l__fontspec_ot_bool + } +\cs_new:Nn \__fontspec_set_autofont:Nnn + { + \bool_if:NF \l__fontspec_external_bool + { + \tl_if_empty:xF {#2} + { + \tl_if_empty:NT #1 + { + \__fontspec_if_autofont:nnTF {#2} {#3} + { \tl_set:Nx #1 {#2#3} } + { \__fontspec_info:nx {no-font-shape} {#2#3} } + } + } + } + } +\prg_new_conditional:Nnn \__fontspec_if_autofont:nn {T,TF} + { + \group_begin: + \__fontspec_primitive_font_set:Nnn \l__fontspec_tmpa_font { \__fontspec_construct_font_call:nn {#1} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 1sp } + \__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 } + \str_if_eq:eeTF { \__fontspec_primitive_font_get_name:N \l__fontspec_tmpa_font } { \__fontspec_primitive_font_get_name:N \l__fontspec_tmpb_font } + { \group_end: \prg_return_false: } + { \group_end: \prg_return_true: } + } +\cs_new:Nn \__fontspec_make_font_shapes:Nnnnn + { + \group_begin: + \__fontspec_keys_set_known:nxN {fontspec-preparse-external} { #4 } \l__fontspec_leftover_clist + \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {#1} + \__fontspec_declare_shape:nnxx {#2} {#3} { \l__fontspec_fontopts_clist, \l__fontspec_leftover_clist } {#5} + \group_end: + } +\cs_new:Nn \__fontspec_load_fontname:Nn + { + \__fontspec_sanitise_fontname:Nn #1 {#2} + \__fontspec_load_external_fontoptions:N #1 + \prop_get:NVNF \g__fontspec_fontopts_prop #1 \l__fontspec_fontopts_clist + { \clist_clear:N \l__fontspec_fontopts_clist } + \keys_set_groups:nnV {fontspec/fontname} {getfontname} \l__fontspec_fontopts_clist + \__fontspec_primitive_font_set:OnnF \l__fontspec_fontface_cs_tl + { \__fontspec_construct_font_call:nn {#1} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 2sp } + { \__fontspec_error:nx {font-not-found} {#2} } + } +\keys_define:nn {fontspec/fontname} + { + Font .tl_set:N = \l_fontspec_fontname_tl , + Font .groups:n = {getfontname} , + } +\cs_new:Nn \__fontspec_declare_shape:nnnn + { + \tl_build_begin:N \l__fontspec_nfss_tl + \tl_build_begin:N \l__fontspec_nfss_sc_tl + \tl_set_eq:NN \l__fontspec_saved_fontname_tl \l_fontspec_fontname_tl + + \exp_args:Nx \clist_map_inline:nn {#4} { \__fontspec_setup_single_size:nn {#3} {##1} } + + \tl_build_end:N \l__fontspec_nfss_tl + \tl_build_end:N \l__fontspec_nfss_sc_tl + + \__fontspec_declare_shapes_normal:nn {#1} {#2} + \__fontspec_declare_shapes_smcaps:nn {#1} {#2} + \__fontspec_declare_shape_slanted:nn {#1} {#2} + \__fontspec_declare_shapes_bx:nn {#1} {#2} + \__fontspec_declare_shape_loginfo:nn {#1} {#2} + } +\cs_generate_variant:Nn \__fontspec_declare_shape:nnnn {nnxx} +\cs_new:Nn \__fontspec_setup_single_size:nn + { + \tl_clear:N \l__fontspec_size_tl + \tl_set_eq:NN \l__fontspec_sizedfont_tl \l__fontspec_saved_fontname_tl % in case not spec'ed + + \keys_set_known:nxN {fontspec-sizing} { \exp_after:wN \use:n #2 } + \l__fontspec_sizing_leftover_clist + \tl_if_empty:NT \l__fontspec_size_tl { \__fontspec_error:n {no-size-info} } + + % "normal" + \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_sizedfont_tl} + \__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_tl {#1} {\l__fontspec_sizing_leftover_clist} {} + + % small caps + \clist_set_eq:NN \l__fontspec_fontfeat_curr_clist \l__fontspec_fontfeat_sc_clist + + \bool_if:NF \l__fontspec_nosc_bool + { + \tl_if_empty:NTF \l__fontspec_fontname_sc_tl + { + \__fontspec_make_smallcaps:TF + { + \clist_put_left:Nn \l__fontspec_fontfeat_curr_clist {Letters=SmallCaps} + } + { + \bool_set_true:N \l__fontspec_nosc_bool + } + } + { \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_fontname_sc_tl} }% local for each size + } + + \bool_if:NF \l__fontspec_nosc_bool + { + \__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_sc_tl + {#1} {\l__fontspec_sizing_leftover_clist} {\l__fontspec_fontfeat_curr_clist} + } + } +\cs_new:Nn \__fontspec_setup_nfss:Nnnn + { + + \__fontspec_get_features:n { #2 , #3 , #4 } + + \tl_if_empty:NF \l__fontspec_scale_tl + { + \tl_set:Nx \l__fontspec_scale_tl { s*[\l__fontspec_scale_tl] } + } + + \tl_build_put_right:Nx #1 + { + <\l__fontspec_size_tl> \l__fontspec_scale_tl + \__fontspec_construct_font_call:nn { \l_fontspec_fontname_tl } + { \l__fontspec_pre_feat_sclist \g__fontspec_rawfeatures_sclist } + } + } +\cs_new:Nn \__fontspec_declare_shapes_normal:nn + { + \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} + {#1} {#2} {\l__fontspec_nfss_tl}{\l__fontspec_postadjust_tl} + } +\cs_new:Nn \__fontspec_declare_shapes_smcaps:nn + { + \tl_if_empty:NF \l__fontspec_nfss_sc_tl + { + \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} {#1} + { \__fontspec_combo_sc_shape:n {#2} } {\l__fontspec_nfss_sc_tl} {\l__fontspec_postadjust_tl} + } + } +\cs_new:Nn \__fontspec_combo_sc_shape:n + { + \tl_if_exist:cTF { \__fontspec_shape_merge:nn {#1} {\scdefault} } + { \tl_use:c { \__fontspec_shape_merge:nn {#1} {\scdefault} } } + { \scdefault#1 } + } +\cs_new:Nn \__fontspec_DeclareFontShape:nnnnnn + { +\group_begin: +\normalsize +\cs_undefine:c {#1/#2/#3/#4/\f@size} +\group_end: +\DeclareFontShape{#1}{#2}{#3}{#4}{#5}{#6} + } +\cs_generate_variant:Nn \__fontspec_DeclareFontShape:nnnnnn {xxxxxx} +\cs_new:Nn \__fontspec_declare_shape_slanted:nn + { + \bool_if:nT + { + \str_if_eq_p:ee {#2} {\itdefault} && + !(\str_if_eq_p:ee {\itdefault} {\sldefault}) + } + { + \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl}{\g__fontspec_nfss_family_tl}{#1}{\sldefault} + {<->ssub*\g__fontspec_nfss_family_tl/#1/\itdefault}{\l__fontspec_postadjust_tl} + } + } +\cs_new:Nn \__fontspec_declare_shapes_bx:nn + { + \bool_if:nT + { + \str_if_eq_p:ee {#1} {\bfdefault} && + !(\str_if_eq_p:ee {\bfdefault} {bx}) + } + { + % bx/? + \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} + {bx} {#2} + { <->ssub*\g__fontspec_nfss_family_tl/\bfdefault/#2 } + { \l__fontspec_postadjust_tl } + + % bx/sc -> b/sc + \tl_if_empty:NF \l__fontspec_nfss_sc_tl + { + \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} + {bx} { \__fontspec_combo_sc_shape:n {#2} } + { <->ssub*\g__fontspec_nfss_family_tl/\bfdefault/#2 } + { \l__fontspec_postadjust_tl } + } + + % bx/sl -> bx/it + \bool_if:nT + { + \str_if_eq_p:ee {#2} {\itdefault} && + !(\str_if_eq_p:ee {\itdefault} {\sldefault}) + } + { + \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} + {bx} {\sldefault} + { <->ssub*\g__fontspec_nfss_family_tl/bx/\itdefault } + { \l__fontspec_postadjust_tl } + } + + } + } +\cs_new:Nn \__fontspec_declare_shape_loginfo:nn + { + \tl_gput_right:Nx \g__fontspec_defined_shapes_tl + { + \exp_not:n { \\ } + -~ \exp_not:N \str_case:nn {#1/#2} + { + {\mddefault/\shapedefault} {'normal'~} + {\bfdefault/\shapedefault} {'bold'~} + {\mddefault/\itdefault} {'italic'~} + {\mddefault/\sldefault} {'slanted'~} + {\mddefault/\swdefault} {'swash'~} + {\bfdefault/\itdefault} {'bold~ italic'~} + {\bfdefault/\sldefault} {'bold~ slanted'~} + {\bfdefault/\swdefault} {'bold~ swash'~} + } (#1/#2)~ + with~ NFSS~ spec.:~ + \l__fontspec_nfss_tl + \exp_not:n { \\ } + -~ \exp_not:N \str_case:nn { #1 / \__fontspec_combo_sc_shape:n {#2} } + { + {\mddefault/\scdefault} {'small~ caps'~} + {\bfdefault/\scdefault} {'bold~ small~ caps'~} + {\mddefault/\scitdefault} {'italic~ small~ caps'~} + {\bfdefault/\scitdefault} {'bold~ italic~ small~ caps'~} + {\mddefault/\scsldefault} {'slanted~ small~ caps'~} + {\bfdefault/\scsldefault} {'bold~ slanted~ small~ caps'~} + }~( #1 / \__fontspec_combo_sc_shape:n {#2} )~ + with~ NFSS~ spec.:~ + \l__fontspec_nfss_sc_tl + \tl_if_empty:fF {\l__fontspec_postadjust_tl} + { + \exp_not:N \\ and~ font~ adjustment~ code: + \exp_not:N \\ \l__fontspec_postadjust_tl + } + } + } +\tl_set:Nn \l__fontspec_pre_feat_sclist + { + mode = \l__fontspec_mode_tl ; + \tl_if_empty:NF \l__fontspec_shaper_tl { shaper = \l__fontspec_shaper_tl ; } + \tl_if_empty:NF \l__fontspec_script_tl { script = \l__fontspec_script_tl ; } + \tl_if_empty:NF \l__fontspec_lang_tl { language = \l__fontspec_lang_tl ; } + } +\cs_new:Nn \__fontspec_make_smallcaps:TF + { + \exp_args:No \__fontspec_check_ot_feat:NnTF \l__fontspec_fontface_cs_tl {smcp} {#1} {#2} + } +\cs_new:Nn \__fontspec_update_featstr:n + { + \bool_if:NF \l__fontspec_firsttime_bool + { + \tl_gset:Nx \g__fontspec_single_feat_tl { #1 } + \tl_gput_right:Nx \g__fontspec_rawfeatures_sclist {#1;} + } + } +\cs_new:Nn \__fontspec_remove_clashing_featstr:n + { + \clist_map_inline:nn {#1} + { + \tl_gremove_all:Nn \g__fontspec_rawfeatures_sclist {##1;} + } + } +\cs_generate_variant:Nn \__fontspec_remove_clashing_featstr:n {x} +\cs_set:Npn \__fontspec_init: + { + \bool_set_false:N \l__fontspec_ot_bool + \bool_set_true:N \l__fontspec_firsttime_bool + \__fontspec_font_is_name: + \tl_clear:N \l__fontspec_font_path_tl + \tl_clear:N \l__fontspec_optical_size_tl + \tl_clear:N \l__fontspec_ttc_index_tl + \tl_clear:N \l__fontspec_renderer_tl + \tl_gclear:N \g__fontspec_defined_shapes_tl + \tl_gclear:N \g__fontspec_curr_series_tl + \tl_gset_eq:NN \g__fontspec_nfss_enc_tl \g_fontspec_encoding_tl + \tl_set:Nn \l__fontspec_mode_tl {node} + \int_set:Nn \prehyphenchar { `\- } % fixme + \int_zero:N \posthyphenchar % fixme + \int_zero:N \preexhyphenchar % fixme + \int_zero:N \postexhyphenchar % fixme + } +\cs_new:Nn \__fontspec_init_fontface: + { + \tl_gclear:N \g__fontspec_rawfeatures_sclist + \tl_clear:N \l__fontspec_scale_tl + \tl_set_eq:NN \l__fontspec_opacity_tl \c__fontspec_opacity_tl + \tl_set_eq:NN \l__fontspec_hexcol_tl \c__fontspec_hexcol_tl + \tl_set_eq:NN \l__fontspec_postadjust_tl \c__fontspec_postadjust_tl + \tl_clear:N \l__fontspec_wordspace_adjust_tl + \tl_clear:N \l__fontspec_punctspace_adjust_tl + } +\cs_new_protected:Nn \__fontspec_ot_validate_tag:n + { + \__fontspec_ot_validate_tag:w #1 \q_nil + } +\cs_generate_variant:Nn \__fontspec_ot_validate_tag:n {x} +\cs_set:Npn \__fontspec_ot_validate_tag:w #1 #2 \q_nil + { + \bool_if:nTF { \str_if_eq_p:nn {#1} {+} || \str_if_eq_p:nn {#1} {-} } + { \__fontspec_ot_validate_tag_aux:w #2 \c_empty_tl \c_empty_tl \q_nil } + { \__fontspec_ot_validate_tag_aux:w #1#2 \c_empty_tl \c_empty_tl \q_nil } + } +\cs_set:Npn \__fontspec_ot_validate_tag_aux:w #1#2#3#4#5 \q_nil + { + \int_compare:nT { \tl_count:n {#5} > 2 } + { \__fontspec_error:nx {ot-tag-too-long} {#1#2#3#4#5} } + } + +%%^^A%% fontspec-code-opentype.dtx -- part of FONTSPEC + +\cs_new:Nn \__fontspec_define_opentype_feature_group:n + { + \keys_define:nn {fontspec-opentype} { #1 .multichoice: , .groups:n = {opentype} } + } +\cs_new:Nn \__fontspec_feat_prop_add:nn + { + \tl_if_empty:nF {#1} + { + \prop_if_in:NnF \g__fontspec_OT_features_prop {#1} + { + \prop_gput:Nnn \g__fontspec_OT_features_prop {#1} {#2} + } + } + } +\cs_new:Nn \__fontspec_define_opentype_feature:nnnnn + { + \__fontspec_feat_prop_add:nn {#3} {#1\,=\,#2} + \tl_if_empty:nTF {#4} + { + \keys_define:nn {fontspec-opentype} + { + #1/#2 .code:n = + { \__fontspec_remove_clashing_featstr:n {#5} } , + #1/#2 .groups:n = {opentype} + } + } + { + \keys_define:nn {fontspec-opentype} + { + #1/#2 .code:n = + { + \__fontspec_make_OT_feature:nnn {#3} {#4} {#5} + } , + #1/#2 .groups:n = {opentype} + } + } + } +\cs_new:Nn \__fontspec_feat_off:n {#1Off} +\cs_new:Nn \__fontspec_feat_reset:n {#1Reset} +\cs_new:Nn \__fontspec_define_opentype_onoffreset:nnnnn + { + \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} {#2} {#3} {+#4} {#5} + \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} { \__fontspec_feat_off:n {#2} } {#3} {-#4} {} + \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} { \__fontspec_feat_reset:n {#2} } {} {} {+#4,-#4} + } +\cs_new:Nn \__fontspec_define_opentype_onreset:nnnnn + { + \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} {#2} {#3} {#4} {#5} + \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} { \__fontspec_feat_reset:n {#2} } {} {} {#4} + } +\cs_new:Nn \__fontspec_make_OT_feature:nnn + { + + \bool_set_true:N \l__fontspec_proceed_bool + + \tl_if_empty:nF {#1} + { + \exp_args:No \__fontspec_check_ot_feat:NnF \l__fontspec_fontface_cs_tl {#1} + { + \__fontspec_warning:nx {icu-feature-not-exist-in-font} {#1} + \bool_set_false:N \l__fontspec_proceed_bool + } + } + + \__fontspec_remove_clashing_featstr:x { #2 , \__fontspec_swap_plus_minus:n {#2} , #3 } + + \bool_if:NT \l__fontspec_proceed_bool { \__fontspec_update_featstr:n {#2} } + } +\cs_generate_variant:Nn \__fontspec_make_OT_feature:nnn {xxx} +\cs_new:Nn \__fontspec_swap_plus_minus:n { \__fontspec_swap_plus_minus_aux:Nq #1 \q_nil } +\cs_new:Npn \__fontspec_swap_plus_minus_aux:Nq #1#2 \q_nil + { \str_case:nn {#1} { {+} {-#2} {-} {+#2} } } +\prg_new_conditional:Nnn \__fontspec_check_script:Nn {TF,T} + { + \bool_if:NTF \l__fontspec_never_check_bool + { \prg_return_true: } + { + \bool_if:nTF { \tl_if_empty_p:e {#2} } + { \prg_return_false: } + { + \__fontspec_ot_validate_tag:x {#2} + \cs_if_eq:NNTF #1 \font + { \tl_set:Nx \l__fontspec_tmp_tl {\curr@fontshape/\f@size} } + { \tl_set:Nx \l__fontspec_tmp_tl {\cs_to_str:N #1} } + \lua_now:e { fontspec.check_ot_script("\l__fontspec_tmp_tl", "#2") } + \bool_if:NTF \l__fontspec_check_bool + { + \prg_return_true: + } + { + \prg_return_false: + } + } + } + } +\prg_new_conditional:Nnn \__fontspec_check_lang:Nn {TF} + { + \__fontspec_check_lang:NnnTF #1 {#2} {\l__fontspec_script_tl} {\prg_return_true:} {\prg_return_false:} + } +\prg_new_conditional:Nnn \__fontspec_check_lang:Nnn {TF} + { + \bool_if:NTF \l__fontspec_never_check_bool + { \prg_return_true: } + { + \bool_if:nTF { \tl_if_empty_p:e {#3} } + { \prg_return_false: } + { + \__fontspec_ot_validate_tag:x {#2} + \__fontspec_ot_validate_tag:x {#3} + \cs_if_eq:NNTF #1 \font + { \tl_set:Nx \l__fontspec_tmp_tl {\curr@fontshape/\f@size} } + { \tl_set:Nx \l__fontspec_tmp_tl {\cs_to_str:N #1} } + \__fontspec_lua_function:neee {check_ot_lang} {\l__fontspec_tmp_tl} {#2} {#3} + \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: + } + } + } +\prg_new_conditional:Nnn \__fontspec_check_ot_feat:Nn {TF,F} + { + \__fontspec_check_ot_feat:NnnnTF #1 {#2} {\l__fontspec_lang_tl} {\l__fontspec_script_tl} + {\prg_return_true:} {\prg_return_false:} + } +\prg_new_conditional:Nnn \__fontspec_check_ot_feat:Nnnn {TF,F} + { + \bool_if:NTF \l__fontspec_never_check_bool + { \prg_return_true: } + { + \bool_if:nTF { \tl_if_empty_p:e {#3} || \tl_if_empty_p:e {#4} } + { \prg_return_false: } + { + \__fontspec_ot_validate_tag:x {#2} + \__fontspec_ot_validate_tag:x {#3} + \__fontspec_ot_validate_tag:x {#4} + \cs_if_eq:NNTF #1 \font + { \tl_set:Nx \l__fontspec_tmp_tl {\curr@fontshape/\f@size} } + { \tl_set:Nx \l__fontspec_tmp_tl {\cs_to_str:N #1} } + \__fontspec_lua_function:neeee {check_ot_feat} {\l__fontspec_tmp_tl} {#2} {#3} {#4} + \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: + } + } + } +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {aalt}{Access~All~Alternates} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {abvf}{Above-base~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {abvm}{Above-base~Mark~Positioning} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {abvs}{Above-base~Substitutions} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {afrc}{Alternative~Fractions} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {akhn}{Akhands} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {blwf}{Below-base~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {blwm}{Below-base~Mark~Positioning} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {blws}{Below-base~Substitutions} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {calt}{Contextual~Alternates} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {case}{Case-Sensitive~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ccmp}{Glyph~Composition~/~Decomposition} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cfar}{Conjunct~Form~After~Ro} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cjct}{Conjunct~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {clig}{Contextual~Ligatures} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cpct}{Centered~CJK~Punctuation} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cpsp}{Capital~Spacing} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cswh}{Contextual~Swash} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {curs}{Cursive~Positioning} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cvNN}{Character~Variant~$N$} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {c2pc}{Petite~Capitals~From~Capitals} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {c2sc}{Small~Capitals~From~Capitals} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dist}{Distances} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dlig}{Discretionary~Ligatures} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dnom}{Denominators} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dtls}{Dotless~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {expt}{Expert~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {falt}{Final~Glyph~on~Line~Alternates} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fin2}{Terminal~Forms~\#2} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fin3}{Terminal~Forms~\#3} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fina}{Terminal~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {flac}{Flattened~accent~forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {frac}{Fractions} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fwid}{Full~Widths} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {half}{Half~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {haln}{Halant~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {halt}{Alternate~Half~Widths} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hist}{Historical~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hkna}{Horizontal~Kana~Alternates} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hlig}{Historical~Ligatures} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hngl}{Hangul} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hojo}{Hojo~Kanji~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hwid}{Half~Widths} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {init}{Initial~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {isol}{Isolated~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ital}{Italics} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jalt}{Justification~Alternates} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp78}{JIS78~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp83}{JIS83~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp90}{JIS90~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp04}{JIS2004~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {kern}{Kerning} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {lfbd}{Left~Bounds} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {liga}{Standard~Ligatures} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ljmo}{Leading~Jamo~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {lnum}{Lining~Figures} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {locl}{Localized~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ltra}{Left-to-right~alternates} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ltrm}{Left-to-right~mirrored~forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mark}{Mark~Positioning} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {med2}{Medial~Forms~\#2} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {medi}{Medial~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mgrk}{Mathematical~Greek} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mkmk}{Mark~to~Mark~Positioning} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mset}{Mark~Positioning~via~Substitution} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {nalt}{Alternate~Annotation~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {nlck}{NLC~Kanji~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {nukt}{Nukta~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {numr}{Numerators} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {onum}{Oldstyle~Figures} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {opbd}{Optical~Bounds} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ordn}{Ordinals} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ornm}{Ornaments} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {palt}{Proportional~Alternate~Widths} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pcap}{Petite~Capitals} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pkna}{Proportional~Kana} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pnum}{Proportional~Figures} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pref}{Pre-Base~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pres}{Pre-base~Substitutions} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pstf}{Post-base~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {psts}{Post-base~Substitutions} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pwid}{Proportional~Widths} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {qwid}{Quarter~Widths} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rand}{Randomize} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rclt}{Required~Contextual~Alternates} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rkrf}{Rakar~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rlig}{Required~Ligatures} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rphf}{Reph~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rtbd}{Right~Bounds} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rtla}{Right-to-left~alternates} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rtlm}{Right-to-left~mirrored~forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ruby}{Ruby~Notation~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rvrn}{Required~Variation~Alternates} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {salt}{Stylistic~Alternates} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {sinf}{Scientific~Inferiors} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {size}{Optical~size} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {smcp}{Small~Capitals} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {smpl}{Simplified~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ssNN}{Stylistic~Set~$N$} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ssty}{Math~script~style~alternates} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {stch}{Stretching~Glyph~Decomposition} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {subs}{Subscript} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {sups}{Superscript} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {swsh}{Swash} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {titl}{Titling} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {tjmo}{Trailing~Jamo~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {tnam}{Traditional~Name~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {tnum}{Tabular~Figures} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {trad}{Traditional~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {twid}{Third~Widths} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {unic}{Unicase} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {valt}{Alternate~Vertical~Metrics} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vatu}{Vattu~Variants} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vert}{Vertical~Writing} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vhal}{Alternate~Vertical~Half~Metrics} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vjmo}{Vowel~Jamo~Forms} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vkna}{Vertical~Kana~Alternates} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vkrn}{Vertical~Kerning} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vpal}{Proportional~Alternate~Vertical~Metrics} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vrt2}{Vertical~Alternates~and~Rotation} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vrtr}{Vertical~Alternates~for~Rotation} +\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {zero}{Slashed~Zero} + +%%^^A%% fontspec-code-graphite.dtx -- part of FONTSPEC + + +%%^^A%% fontspec-code-keyval.dtx -- part of FONTSPEC + +\clist_gset:Nn \g__fontspec_all_keyval_modules_clist + { + fontspec, fontspec-opentype, fontspec-aat, + fontspec-preparse, fontspec-preparse-cfg, fontspec-preparse-external, fontspec-preparse-nested, + fontspec-renderer + } +\cs_new:Nn \__fontspec_keys_define_code:nnn + { + \keys_define:nn {#1} { #2 .code:n = {#3} } + } +\cs_new:Nn \__fontspec_aff_error:n + { + \__fontspec_keys_define_code:nnn {fontspec-addfeatures} {#1} + { \__fontspec_error:nx {not-in-addfontfeatures} {#1} } + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-cfg} {IgnoreFontspecFile} + { + \bool_set_false:N \l__fontspec_fontcfg_bool + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {IgnoreFontspecFile} + { + \bool_set_false:N \l__fontspec_fontcfg_bool + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Path} + { + \bool_set_true:N \l__fontspec_nobf_bool + \bool_set_true:N \l__fontspec_noit_bool + \bool_set_true:N \l__fontspec_external_bool + \tl_set:Nn \l__fontspec_font_path_tl {#1} + \__fontspec_font_is_file: + } +\aliasfontfeature{Path}{ExternalLocation} +\__fontspec_keys_define_code:nnn {fontspec} {Path} {} +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Extension} + { + \tl_set:Nn \l__fontspec_extension_tl {#1} + \bool_if:NF \l__fontspec_external_bool + { + \keys_set:nn {fontspec-preparse-external} {Path} + } + } +\tl_clear:N \l__fontspec_extension_tl +\__fontspec_keys_define_code:nnn {fontspec} {Extension} {} +\keys_define:nn {fontspec-renderer} + { + Renderer .choices:nn = + {Full,Node,Basic,Base,HarfBuzz,Harfbuzz,OpenType,AAT,Graphite} + { + \int_compare:nT {\l_keys_choice_int >= 5} { \bool_set_true:N \l__fontspec_harfbuzz_bool } + + \tl_set:Nx \l__fontspec_mode_tl + { + \int_case:nn \l_keys_choice_int { 1 {node} 2 {node} 3 {base} 4 {base} 5 {harf} 6 {harf} 7 {harf} 8 {harf} 9 {harf}} + } + + \tl_set:Nx \l__fontspec_shaper_tl + { + \int_case:nn \l_keys_choice_int { 1 {} 2 {} 3 {} 4 {} 5 {} 6 {} 7 {ot} 8 {coretext_aat} 9 {graphite2} } + } + + + \tl_gset:Nx \g__fontspec_single_feat_tl + { + mode=\l__fontspec_mode_tl ; + \tl_if_empty:NF \l__fontspec_shaper_tl { shaper=\l__fontspec_shaper_tl} + } + } , + + Renderer unknown .code:n = + { + \bool_set_true:N \l__fontspec_harfbuzz_bool + \__fontspec_warning:nx {unknown-renderer} {#1} + \tl_set:Nn \l__fontspec_mode_tl {harf} + \tl_set:Nn \l__fontspec_shaper_tl {#1} + } , + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {Script} + { + \tl_set:Nn \l__fontspec_script_name_tl {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {Language} + { + \tl_set:Nn \l__fontspec_lang_name_tl {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {FontIndex} + { + \str_if_eq:eeF { \str_lowercase:f {\l__fontspec_extension_tl} } {.ttc} + { \__fontspec_warning:n {font-index-needs-ttc} } + \tl_set:Nn \l__fontspec_ttc_index_tl {(#1)} + } +\__fontspec_keys_define_code:nnn {fontspec} {FontIndex} + { + \tl_set:Nn \l__fontspec_ttc_index_tl {(#1)} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {UprightFont} + { + \fontspec_complete_fontname:Nn \l__fontspec_fontname_up_tl {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {ItalicFont} + { + \tl_if_empty:nTF {#1} + { + \bool_set_true:N \l__fontspec_noit_bool + } + { + \bool_set_false:N \l__fontspec_noit_bool + \fontspec_complete_fontname:Nn \l__fontspec_fontname_it_tl {#1} + } + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {SlantedFont} + { + \fontspec_complete_fontname:Nn \l__fontspec_fontname_sl_tl {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {SwashFont} + { + \fontspec_complete_fontname:Nn \l__fontspec_fontname_sw_tl {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldFont} + { + \tl_if_empty:nTF {#1} + { + \bool_set_true:N \l__fontspec_nobf_bool + } + { + \bool_set_false:N \l__fontspec_nobf_bool + \fontspec_complete_fontname:Nn \l__fontspec_curr_bfname_tl {#1} + + \seq_if_empty:NT \l__fontspec_bf_series_seq + { + \tl_gset:Nx \g__fontspec_curr_series_tl {\bfdefault} + \seq_put_right:Nx \l__fontspec_bf_series_seq {\bfdefault} + } + + \tl_if_eq:oxT \g__fontspec_curr_series_tl {\bfdefault} + { + \tl_set_eq:NN \l__fontspec_fontname_bf_tl \l__fontspec_curr_bfname_tl + } + + \prop_put:NxV \l__fontspec_nfss_prop {BoldFont-\g__fontspec_curr_series_tl} \l__fontspec_curr_bfname_tl + + + } + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldItalicFont} + { + \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfit_tl {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldSlantedFont} + { + \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfsl_tl {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldSwashFont} + { + \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfsw_tl {#1} + } +\__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFont} + { + \tl_if_empty:nTF {#1} + { + \bool_set_true:N \l__fontspec_nosc_bool + } + { + \bool_set_false:N \l__fontspec_nosc_bool + \fontspec_complete_fontname:Nn \l__fontspec_fontname_sc_tl {#1} + } + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {UprightFeatures} + { + \clist_put_right:Nn \l__fontspec_fontfeat_up_clist {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldFeatures} + { + \clist_put_right:Nn \l__fontspec_fontfeat_bf_clist {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {ItalicFeatures} + { + \clist_put_right:Nn \l__fontspec_fontfeat_it_clist {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldItalicFeatures} + { + \clist_put_right:Nn \l__fontspec_fontfeat_bfit_clist {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {SlantedFeatures} + { + \clist_put_right:Nn \l__fontspec_fontfeat_sl_clist {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldSlantedFeatures} + { + \clist_put_right:Nn \l__fontspec_fontfeat_bfsl_clist {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {SwashFeatures} + { + \clist_put_right:Nn \l__fontspec_fontfeat_sw_clist {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldSwashFeatures} + { + \clist_put_right:Nn \l__fontspec_fontfeat_bfsw_clist {#1} + } +\__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFeatures} + { + \bool_if:NF \l__fontspec_firsttime_bool + { + \clist_put_right:Nn \l__fontspec_fontfeat_sc_clist {#1} + } + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {SizeFeatures} + { + \clist_set:Nn \l__fontspec_sizefeat_clist {#1} + \clist_put_right:Nn \l__fontspec_fontfeat_up_clist { SizeFeatures = {#1} } + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-nested} {SizeFeatures} + { + \clist_set:Nn \l__fontspec_sizefeat_clist {#1} + \tl_if_empty:NT \l__fontspec_this_font_tl + { \tl_set:Nn \l__fontspec_this_font_tl { -- } } % needs to be non-empty as a flag + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-nested} {Font} + { + \tl_set:Nn \l__fontspec_this_font_tl {#1} + } +\__fontspec_keys_define_code:nnn {fontspec} {SizeFeatures} + { + % dummy + } +\__fontspec_keys_define_code:nnn {fontspec} {Font} + { + % dummy + } +\__fontspec_keys_define_code:nnn {fontspec-sizing} {Size} + { + \tl_set:Nn \l__fontspec_size_tl {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-sizing} {Font} + { + \fontspec_complete_fontname:Nn \l__fontspec_sizedfont_tl {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-opentype} {UprightFont} {} +\__fontspec_keys_define_code:nnn {fontspec-opentype} {ItalicFont} {} +\__fontspec_keys_define_code:nnn {fontspec-opentype} {SlantedFont} {} +\__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldFont} {} +\__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldItalicFont} {} +\__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldSlantedFont} {} +\__fontspec_keys_define_code:nnn {fontspec-preparse} {NFSSEncoding} + { + \tl_gset:Nx \g__fontspec_nfss_enc_tl { #1 } + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {NFSSFamily} + { + \tl_set:Nx \l__fontspec_nfss_fam_tl { #1 } + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {FontFace} + { + \tl_clear:N \l__fontspec_this_font_tl + \clist_set:No \l__fontspec_arg_clist { \use_iii:nnn #1 } + \clist_set_eq:NN \l__fontspec_this_feat_clist \l__fontspec_arg_clist + \int_compare:nT { \clist_count:N \l__fontspec_arg_clist = 1 } + { + \tl_if_in:NnF \l__fontspec_arg_clist {=} + { + \tl_set_eq:NN \l__fontspec_this_font_tl \l__fontspec_arg_clist + \tl_clear:N \l__fontspec_this_feat_clist + } + } + + \__fontspec_add_nfssfont:nnnn + {\use_i:nnn #1} {\use_ii:nnn #1} {\l__fontspec_this_font_tl} {\l__fontspec_this_feat_clist} + } +\__fontspec_keys_define_code:nnn {fontspec} {Scale} + { + \str_case:nnF {#1} + { + {MatchLowercase} { \__fontspec_calc_scale:n {5} } + {MatchUppercase} { \__fontspec_calc_scale:n {8} } + } + { \tl_set:Nx \l__fontspec_scale_tl {#1} } + } +\__fontspec_keys_define_code:nnn {fontspec} {ScaleAgain} + { + \tl_if_empty:NT \l__fontspec_scale_tl { \tl_set:Nn \l__fontspec_scale_tl {1} } + \tl_set:Nx \l__fontspec_scale_tl { \fp_eval:n { #1 * \l__fontspec_scale_tl } } + \__fontspec_info:n {set-scale} + } +\cs_new:Nn \__fontspec_calc_scale:n + { + \group_begin: + + \fontencoding { \encodingdefault } + \fontfamily { \familydefault } + \selectfont + + \__fontspec_set_font_dimen:NnN \l__fontspec_tmpa_dim {#1} \font + \__fontspec_set_font_dimen:NnN \l__fontspec_tmpb_dim {#1} \l__fontspec_fontface_cs_tl + + \tl_set:Nx \l__fontspec_scale_tl + { + \fp_eval:n { \dim_to_fp:n {\l__fontspec_tmpa_dim} / + \dim_to_fp:n {\l__fontspec_tmpb_dim} } + } + + \__fontspec_info:n {set-scale} + \exp_args:NNNx + \group_end: + \tl_set:Nx \l__fontspec_scale_tl { \l__fontspec_scale_tl } + } +\cs_new:Nn \__fontspec_set_font_dimen:NnN + { + \dim_set:Nn #1 { \fontdimen #2 #3 } + \dim_compare:nNnT #1 = {0pt} + { + \settoheight #1 + { + \str_if_eq:nnTF {#3} {\font} \rmfamily #3 + \int_case:nnF #2 + { + {5} {x} % x-height + {8} {X} % cap-height + } {?} % "else" clause; never reached. + } + } + } +\__fontspec_keys_define_code:nnn {fontspec} {WordSpace} + { + \bool_if:NF \l__fontspec_firsttime_bool + { \_fontspec_parse_wordspace:w #1,,,\q_stop } + } +\__fontspec_aff_error:n {WordSpace} +\cs_set:Npn \_fontspec_parse_wordspace:w #1,#2,#3,#4 \q_stop + { + \tl_if_empty:nTF {#4} + { + \tl_set:Nn \l__fontspec_wordspace_adjust_tl + { + \fontdimen 2 \font = #1 \fontdimen 2 \font + \fontdimen 3 \font = #1 \fontdimen 3 \font + \fontdimen 4 \font = #1 \fontdimen 4 \font + } + } + { + \tl_set:Nn \l__fontspec_wordspace_adjust_tl + { + \fontdimen 2 \font = #1 \fontdimen 2 \font + \fontdimen 3 \font = #2 \fontdimen 3 \font + \fontdimen 4 \font = #3 \fontdimen 4 \font + } + } + } +\__fontspec_keys_define_code:nnn {fontspec} {PunctuationSpace} + { + \str_case_e:nnF {#1} + { + {WordSpace} + { + \tl_set:Nn \l__fontspec_punctspace_adjust_tl + { \fontdimen 7 \font = 0 \fontdimen 2 \font } + } + {TwiceWordSpace} + { + \tl_set:Nn \l__fontspec_punctspace_adjust_tl + { \fontdimen 7 \font = 1 \fontdimen 2 \font } + } + } + { + \tl_set:Nn \l__fontspec_punctspace_adjust_tl + { \fontdimen 7 \font = #1 \fontdimen 7 \font } + } + } +\__fontspec_aff_error:n {PunctuationSpace} +\__fontspec_keys_define_code:nnn {fontspec} {FontAdjustment} + { + \tl_put_right:Nx \l__fontspec_postadjust_tl {#1} + } +\__fontspec_keys_define_code:nnn {fontspec} {LetterSpace} + { + \__fontspec_update_featstr:n {letterspace=#1} + } +\__fontspec_keys_define_code:nnn {fontspec} {HyphenChar} + { + \str_if_eq:nnTF {#1} {None} + { + \tl_put_right:Nn \l__fontspec_postadjust_tl + { \__fontspec_primitive_font_set_hyphenchar:Nn \font {-1} } + } + { + \__fontspec_warning:nx {only-xetex-feature} {HyphenChar} + + \tl_if_single:nTF {#1} + { \tl_set:Nn \l__fontspec_hyphenchar_tl {`#1} } + { \tl_set:Nn \l__fontspec_hyphenchar_tl { #1} } + + \exp_args:No \__fontspec_primitive_font_glyph_if_exist:NnTF \l__fontspec_fontface_cs_tl {\l__fontspec_hyphenchar_tl} + { + \tl_put_right:Nn \l__fontspec_postadjust_tl + { \__fontspec_primitive_font_set_hyphenchar:Nn \font { \l__fontspec_hyphenchar_tl } } + } + { \__fontspec_error:nxx {no-glyph}{\l_fontspec_fontname_tl}{#1} } + + } + } +\__fontspec_aff_error:n {HyphenChar} +\__fontspec_keys_define_code:nnn {fontspec} {Color} + { + \tl_set:Nn \l__fontspec_hexcol_tl {#1} + } +\cs_set:Npn \fontspec_parse_colour:viii #1#2#3#4#5#6#7#8 + { + \tl_set:Nn \l__fontspec_hexcol_tl {#1#2#3#4#5#6} + \tl_if_eq:NNF \l__fontspec_opacity_tl \c__fontspec_opacity_tl + { + \bool_if:NF \l__fontspec_firsttime_bool + { \__fontspec_warning:nx {opa-twice-col} {#7#8} } + } + \tl_set:Nn \l__fontspec_opacity_tl {#7#8} + } +\aliasfontfeature{Color}{Colour} +\__fontspec_keys_define_code:nnn {fontspec} {Opacity} + { + \int_set:Nn \l__fontspec_tmp_int {255} + \__fontspec_int_mult_truncate:Nn \l__fontspec_tmp_int { #1 } + \tl_if_eq:NNF \l__fontspec_opacity_tl \c__fontspec_opacity_tl + { + \bool_if:NF \l__fontspec_firsttime_bool + { \__fontspec_warning:nx {opa-twice} {#1} } + } + \tl_set:Nx \l__fontspec_opacity_tl + { + , + \int_compare:nT { \l__fontspec_tmp_int <= "F } {0} % zero pad + \int_to_hex:n { \l__fontspec_tmp_int } + } + } +\__fontspec_keys_define_code:nnn {fontspec-opentype} {Mapping} + { + \str_if_eq:nnTF {#1} {tex-text} + { + \__fontspec_warning:n {no-mapping-ligtex} + \msg_redirect_name:nnn {fontspec} {no-mapping-ligtex} {none} + \keys_set:nn {fontspec-opentype} { Ligatures=TeX } + } + { \__fontspec_warning:n {no-mapping} } + } +\__fontspec_keys_define_code:nnn {fontspec} {Weight} + { + \__fontspec_update_featstr:n{weight=#1} + } +\__fontspec_keys_define_code:nnn {fontspec} {Width} + { + \__fontspec_update_featstr:n{width=#1} + } +\__fontspec_keys_define_code:nnn {fontspec} {OpticalSize} + { + \tl_set:Nn \l__fontspec_optical_size_tl {/ S = #1} + } +\keys_define:nn {fontspec} + { + FakeSlant .code:n = + { + \__fontspec_update_featstr:n {slant=#1} + }, + FakeSlant .default:n = {0.2} + } +\keys_define:nn {fontspec} + { + FakeStretch .code:n = + { + \__fontspec_update_featstr:n {extend=#1} + }, + FakeStretch .default:n = {1.2} + } +\keys_define:nn {fontspec} + { + FakeBold .code:n = + { + \__fontspec_update_featstr:n {embolden=#1} + }, + FakeBold .default:n = {1.5} + } +\keys_define:nn {fontspec} + { + AutoFakeSlant .code:n = + { + \bool_if:NT \l__fontspec_firsttime_bool + { + \tl_set:Nn \l__fontspec_fake_slant_tl {#1} + \clist_put_right:Nn \l__fontspec_fontfeat_it_clist {FakeSlant=#1} + \tl_set_eq:NN \l__fontspec_fontname_it_tl \l_fontspec_fontname_tl + \bool_set_false:N \l__fontspec_noit_bool + + \tl_if_empty:NF \l__fontspec_fake_embolden_tl + { + \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist + {FakeBold=\l__fontspec_fake_embolden_tl} + \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist {FakeSlant=#1} + \tl_set_eq:NN \l__fontspec_fontname_bfit_tl \l_fontspec_fontname_tl + } + } + }, + AutoFakeSlant .default:n = {0.2} + } +\keys_define:nn {fontspec} + { + AutoFakeBold .code:n = + { + \bool_if:NT \l__fontspec_firsttime_bool + { + \tl_set:Nn \l__fontspec_fake_embolden_tl {#1} + \clist_put_right:Nn \l__fontspec_fontfeat_bf_clist {FakeBold=#1} + \tl_set_eq:NN \l__fontspec_fontname_bf_tl \l_fontspec_fontname_tl + \bool_set_false:N \l__fontspec_nobf_bool + + \tl_if_empty:NF \l__fontspec_fake_slant_tl + { + \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist + {FakeSlant=\l__fontspec_fake_slant_tl} + \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist {FakeBold=#1} + \tl_set_eq:NN \l__fontspec_fontname_bfit_tl \l_fontspec_fontname_tl + } + } + }, + AutoFakeBold .default:n = {1.5} + } +\__fontspec_keys_define_code:nnn {fontspec-opentype} {RawFeature} + { + \__fontspec_update_featstr:n {#1} + } +\__fontspec_keys_define_code:nnn {fontspec-aat} {RawFeature} + { + \__fontspec_update_featstr:n {#1} + } + +%%^^A%% fontspec-code-feat-opentype.dtx -- part of FONTSPEC + +\__fontspec_feat_prop_add:nn {salt} { Alternate\,=\,$N$ } +\__fontspec_feat_prop_add:nn {nalt} { Annotation\,=\,$N$ } +\__fontspec_feat_prop_add:nn {ornm} { Ornament\,=\,$N$ } +\__fontspec_feat_prop_add:nn {cvNN} { CharacterVariant\,=\,$N$:$M$ } +\__fontspec_feat_prop_add:nn {ssNN} { StylisticSet\,=\,$N$ } +\__fontspec_define_opentype_feature_group:n {Ligatures} +\__fontspec_define_opentype_feature:nnnnn {Ligatures} {ResetAll} {} {} + { + +dlig,-dlig,+rlig,-rlig,+liga,-liga,+dlig,-dlig,+clig,-clig,+hlig,-hlig, + +tlig,-tlig + } +\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Required} {rlig} {rlig} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Common} {liga} {liga} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Rare} {dlig} {dlig} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Discretionary} {dlig} {dlig} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Contextual} {clig} {clig} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Historic} {hlig} {hlig} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {TeX} {} {tlig} {} +\__fontspec_define_opentype_feature_group:n {Letters} +\__fontspec_define_opentype_feature:nnnnn {Letters} {ResetAll} {} {} + { + +case,+smcp,+pcap,+c2sc,+c2pc,+unic,+rand, + -case,-smcp,-pcap,-c2sc,-c2pc,-unic,-rand + } +\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Uppercase} {case} {case} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {SmallCaps} {smcp} {smcp} {+pcap,+unic} +\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {PetiteCaps} {pcap} {pcap} {+smcp,+unic} +\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {UppercaseSmallCaps} {c2sc} {c2sc} {+c2pc,+unic} +\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {UppercasePetiteCaps} {c2pc} {c2pc} {+c2sc,+unic} +\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Unicase} {unic} {unic} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Random} {rand} {rand} {} +\__fontspec_define_opentype_feature_group:n {Numbers} +\__fontspec_define_opentype_feature:nnnnn {Numbers} {ResetAll} {} {} + { + +tnum,-tnum, + +pnum,-pnum, + +onum,-onum, + +lnum,-lnum, + +zero,-zero, + +anum,-anum, + } +\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Monospaced} {tnum} {tnum} {+pnum,-pnum} +\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Proportional} {pnum} {pnum} {+tnum,-tnum} +\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Lowercase} {onum} {onum} {+lnum,-lnum} +\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Uppercase} {lnum} {lnum} {+onum,-onum} +\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {SlashedZero} {zero} {zero} {} +\aliasfontfeatureoption {Numbers} {Monospaced} {Tabular} +\aliasfontfeatureoption {Numbers} {Lowercase} {OldStyle} +\aliasfontfeatureoption {Numbers} {Uppercase} {Lining} + \__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Arabic} {anum} {anum} {} +\__fontspec_define_opentype_feature_group:n {VerticalPosition} +\__fontspec_define_opentype_feature:nnnnn {VerticalPosition} {ResetAll} {} {} + { + +sups,-sups, + +subs,-subs, + +ordn,-ordn, + +numr,-numr, + +dnom,-dnom, + +sinf,-sinf, + } +\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Superior} {sups} {sups} {+subs,+ordn,+numr,+dnom,+sinf} +\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Inferior} {subs} {subs} {+sups,+ordn,+numr,+dnom,+sinf} +\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Ordinal} {ordn} {ordn} {+sups,+subs,+numr,+dnom,+sinf} +\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Numerator} {numr} {numr} {+sups,+subs,+ordn,+dnom,+sinf} +\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Denominator} {dnom} {dnom} {+sups,+subs,+ordn,+numr,+sinf} +\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {ScientificInferior} {sinf} {sinf} {+sups,+subs,+ordn,+numr,+dnom} +\__fontspec_define_opentype_feature_group:n {Contextuals} +\__fontspec_define_opentype_feature:nnnnn {Contextuals} {ResetAll} {} {} + { + +cswh,-cswh, + +calt,-calt, + +init,-init, + +fina,-fina, + +falt,-falt, + +medi,-medi, + } +\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {Swash} {cswh} {cswh} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {Alternate} {calt} {calt} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {WordInitial} {init} {init} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {WordFinal} {fina} {fina} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {LineFinal} {falt} {falt} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {Inner} {medi} {medi} {} +\__fontspec_define_opentype_feature_group:n {Diacritics} +\__fontspec_define_opentype_feature:nnnnn {Diacritics} {ResetAll} {} {} + { + +mark,-mark, + +mkmk,-mkmk, + +abvm,-abvm, + +blwm,-blwm, + } +\__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {MarkToBase} {mark} {mark} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {MarkToMark} {mkmk} {mkmk} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {AboveBase} {abvm} {abvm} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {BelowBase} {blwm} {blwm} {} +\__fontspec_define_opentype_feature_group:n {Kerning} +\__fontspec_define_opentype_feature:nnnnn {Kerning} {ResetAll} {} {} + { + +cpsp,-cpsp, + +kern,-kern, + } +\__fontspec_define_opentype_onoffreset:nnnnn {Kerning} {Uppercase} {cpsp} {cpsp} {} +\__fontspec_define_opentype_feature:nnnnn {Kerning} {On} {kern} {+kern} {-kern} +\__fontspec_define_opentype_feature:nnnnn {Kerning} {Off} {kern} {-kern} {+kern} +\__fontspec_define_opentype_feature:nnnnn {Kerning} {Reset} {} {} {+kern,-kern} +\__fontspec_define_opentype_feature_group:n {Fractions} +\__fontspec_define_opentype_feature:nnnnn {Fractions} {ResetAll} {} {} + { + +frac,-frac, + +afrc,-afrc, + } +\__fontspec_define_opentype_feature:nnnnn {Fractions} {On} {frac} {+frac} {} +\__fontspec_define_opentype_feature:nnnnn {Fractions} {Off} {frac} {-frac} {} +\__fontspec_define_opentype_feature:nnnnn {Fractions} {Reset} {} {} {+frac,-frac} +\__fontspec_define_opentype_onoffreset:nnnnn {Fractions} {Alternate} {afrc} {afrc} {-frac} +\__fontspec_define_opentype_feature_group:n {LocalForms} +\__fontspec_define_opentype_feature:nnnnn {LocalForms} {On} {locl} {+locl} {} +\__fontspec_define_opentype_feature:nnnnn {LocalForms} {Off} {locl} {-locl} {} +\__fontspec_define_opentype_feature:nnnnn {LocalForms} {Reset} {} {} {+locl,-locl} + +\__fontspec_define_opentype_feature_group:n {Style} +\__fontspec_define_opentype_feature:nnnnn {Style} {ResetAll} {} {} + { + +salt,-salt, + +ital,-ital, + +ruby,-ruby, + +swsh,-swsh, + +hist,-hist, + +titl,-titl, + +hkna,-hkna, + +vkna,-vkna, + +ssty=0,-ssty=0, + +ssty=1,-ssty=1, + } +\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Alternate} {salt} {salt} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Italic} {ital} {ital} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Ruby} {ruby} {ruby} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Swash} {swsh} {swsh} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Cursive} {swsh} {curs} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Historic} {hist} {hist} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Titling} {titl} {titl} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Style} {TitlingCaps} {titl} {titl} {} % backwards compat +\__fontspec_define_opentype_onoffreset:nnnnn {Style} {HorizontalKana} {hkna} {hkna} {+vkna,+pkna} +\__fontspec_define_opentype_onoffreset:nnnnn {Style} {VerticalKana} {vkna} {vkna} {+hkna,+pkna} +\__fontspec_define_opentype_onoffreset:nnnnn {Style} {ProportionalKana} {pkna} {pkna} {+vkna,+hkna} +\__fontspec_define_opentype_feature:nnnnn {Style} {MathScript} {ssty} {+ssty=0} {+ssty=1} +\__fontspec_define_opentype_feature:nnnnn {Style} {MathScriptScript} {ssty} {+ssty=1} {+ssty=0} +\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Uppercase} {case} {case} {} +\__fontspec_define_opentype_feature_group:n {CJKShape} +\__fontspec_define_opentype_feature:nnnnn {CJKShape} {ResetAll} {} {} + { + +trad,-trad, + +smpl,-smpl, + +jp78,-jp78, + +jp83,-jp83, + +jp90,-jp90, + +jp04,-jp04, + +expt,-expt, + +nlck,-nlck, + } +\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {Traditional} {trad} {trad} {+smpl,+jp78,+jp83,+jp90,+jp04,+expt,+nlck} +\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {Simplified} {smpl} {smpl} {+trad,+jp78,+jp83,+jp90,+jp04,+expt,+nlck} +\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS1978} {jp78} {jp78} {+trad,+smpl,+jp83,+jp90,+jp04,+expt,+nlck} +\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS1983} {jp83} {jp83} {+trad,+smpl,+jp78,+jp90,+jp04,+expt,+nlck} +\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS1990} {jp90} {jp90} {+trad,+smpl,+jp78,+jp83,+jp04,+expt,+nlck} +\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS2004} {jp04} {jp04} {+trad,+smpl,+jp78,+jp83,+jp90,+expt,+nlck} +\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {Expert} {expt} {expt} {+trad,+smpl,+jp78,+jp83,+jp90,+jp04,+nlck} +\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {NLC} {nlck} {nlck} {+trad,+smpl,+jp78,+jp83,+jp90,+jp04,+expt} +\__fontspec_define_opentype_feature_group:n {CharacterWidth} +\__fontspec_define_opentype_feature:nnnnn {CharacterWidth} {ResetAll} {} {} + { + +pwid,-pwid, + +fwid,-fwid, + +hwid,-hwid, + +twid,-twid, + +qwid,-qwid, + +palt,-palt, + +halt,-halt, + } +\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Proportional} {pwid} {pwid} {+fwid,+hwid,+twid,+qwid,+palt,+halt} +\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Full} {fwid} {fwid} {+pwid,+hwid,+twid,+qwid,+palt,+halt} +\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Half} {hwid} {hwid} {+pwid,+fwid,+twid,+qwid,+palt,+halt} +\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Third} {twid} {twid} {+pwid,+fwid,+hwid,+qwid,+palt,+halt} +\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Quarter} {qwid} {qwid} {+pwid,+fwid,+hwid,+twid,+palt,+halt} +\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {AlternateProportional} {palt} {palt} {+pwid,+fwid,+hwid,+twid,+qwid,+halt} +\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {AlternateHalf} {halt} {halt} {+pwid,+fwid,+hwid,+twid,+qwid,+palt} +\__fontspec_define_opentype_feature_group:n {Vertical} +\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {RotatedGlyphs} {vrt2} {vrt2} {+vrtr,+vert} +\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {AlternatesForRotation} {vrtr} {vrtr} {+vrt2} +\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {Alternates} {vert} {vert} {+vrt2} +\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {KanaAlternates} {vkna} {vkna} {+hkna} +\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {Kerning} {vkrn} {vkrn} {} +\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {AlternateMetrics} {valt} {valt} {+vhal,+vpal,+kern} +\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {HalfMetrics} {vhal} {vhal} {+valt,+vpal,+kern} +\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {ProportionalMetrics} {vpal} {vpal} {+valt,+vhal} +\__fontspec_define_opentype_feature_group:n {Alternate} +\keys_define:nn {fontspec-opentype} + { + Alternate .default:n = {0} , + Alternate .groups:n = {opentype}, + Alternate / unknown .code:n = + { + \clist_map_inline:nn {#1} + { \__fontspec_make_OT_feature:nnn {salt}{ +salt = ##1 }{} } + } + } +\keys_define:nn {fontspec-opentype} + { + Alternate / Random .code:n = + { \__fontspec_make_OT_feature:nnn {salt}{ +salt = random }{} } , + } +\aliasfontfeature{Alternate}{StylisticAlternates} +\__fontspec_define_opentype_feature_group:n {Variant} +\keys_define:nn {fontspec-opentype} + { + Variant .default:n = {0} , + Variant .groups:n = {opentype} , + Variant / unknown .code:n = + { + \clist_map_inline:nn {#1} + { + \__fontspec_make_OT_feature:xxx { ss \two@digits {##1} } { +ss \two@digits {##1} } {} + } + } + } +\aliasfontfeature{Variant}{StylisticSet} +\__fontspec_define_opentype_feature_group:n {CharacterVariant} +\use:x + { + \cs_new:Npn \exp_not:N \fontspec_parse_cv:w + ##1 \c_colon_str ##2 \c_colon_str ##3 \exp_not:N \q_nil + { + \__fontspec_make_OT_feature:xxx + { cv \exp_not:N \two@digits {##1} } + { +cv \exp_not:N \two@digits {##1} = ##2 } {} + } + \keys_define:nn {fontspec-opentype} + { + CharacterVariant / unknown .code:n = + { + \clist_map_inline:nn {##1} + { + \exp_not:N \fontspec_parse_cv:w + ####1 \c_colon_str 0 \c_colon_str \exp_not:N \q_nil + } + } + } + } +\__fontspec_define_opentype_feature_group:n {Annotation} +\keys_define:nn {fontspec-opentype} + { + Annotation .default:n = {0} , + Annotation .groups:n = {opentype}, + Annotation / unknown .code:n = + { + \__fontspec_make_OT_feature:nnn {nalt} {+nalt=#1} {} + } + } +\__fontspec_define_opentype_feature_group:n {Ornament} +\keys_define:nn {fontspec-opentype} + { + Ornament .default:n = {0} , + Ornament .groups:n = {opentype}, + Ornament / unknown .code:n = + { + \__fontspec_make_OT_feature:nnn {ornm} { +ornm=#1 } {} + } + } +\keys_define:nn {fontspec-opentype} + { + Script .choice: , + Script .groups:n = {opentype} , + } +\cs_new:Nn \fontspec_new_script:nn + { + \keys_define:nn {fontspec-opentype} { Script / #1 .code:n = + { + \bool_set_false:N \l__fontspec_scriptlang_exist_bool + \clist_map_inline:nn {#2} + { + \exp_args:No \__fontspec_check_script:NnT \l__fontspec_fontface_cs_tl {####1} + { + \tl_set:Nn \l__fontspec_script_name_tl {#1} + \tl_set:Nn \l__fontspec_script_tl {####1} + \int_set:Nn \l__fontspec_script_int {\l__fontspec_strnum_int} + \bool_set_true:N \l__fontspec_scriptlang_exist_bool + \tl_gset:Nx \g__fontspec_single_feat_tl { script=####1 } + \clist_map_break: + } + } + + \bool_if:NF \l__fontspec_scriptlang_exist_bool + { + \bool_if:nF { \str_if_eq_p:ee {#1} {CustomDefault} } + { + \tl_clear:N \l__fontspec_script_name_tl + \__fontspec_warning:nxx {no-script} {\l_fontspec_fontname_tl} {#1} + } + + \bool_if:nF + { + \str_if_eq_p:ee {#1} {Default} || + \str_if_eq_p:ee {#1} {Latin} || + \str_if_eq_p:ee {#1} {CustomDefault} + } + { + \keys_set:nn {fontspec-opentype} { Script = CustomDefault } + } + } + } + } + } +\keys_define:nn {fontspec-opentype} + { + Language .choice: , + Language .groups:n = {opentype} , + } +\cs_new:Nn \fontspec_new_lang:nn + { + \keys_define:nn {fontspec-opentype} { Language / #1 .code:n = + { + \bool_set_false:N \l__fontspec_scriptlang_exist_bool + \clist_map_inline:nn {#2} + { + \exp_args:No \__fontspec_check_lang:NnTF \l__fontspec_fontface_cs_tl {####1} + { + \tl_set:Nn \l__fontspec_lang_tl {####1} + \int_set:Nn \l__fontspec_language_int {\l__fontspec_strnum_int} + \tl_gset:Nx \g__fontspec_single_feat_tl { language=####1 } + \bool_set_true:N \l__fontspec_scriptlang_exist_bool + \clist_map_break: + } + } + \bool_if:NF \l__fontspec_scriptlang_exist_bool + { + \__fontspec_warning:nx {language-not-exist} {#1} + \keys_set:nn {fontspec-opentype} { Language = Default } + } + } + } + } +\__fontspec_keys_define_code:nnn {fontspec-opentype} { Language / Default } + { + \tl_set:Nn \l__fontspec_lang_tl {dflt} + \int_zero:N \l__fontspec_language_int + \tl_gset:Nn \g__fontspec_single_feat_tl { language=dflt } + } +\cs_new:Nn \__fontspec_ot_compat:nn + { + \aliasfontfeatureoption {#1} {#2Off} {No#2} + } +\__fontspec_ot_compat:nn {Ligatures} {Rare} +\__fontspec_ot_compat:nn {Ligatures} {Required} +\__fontspec_ot_compat:nn {Ligatures} {Common} +\__fontspec_ot_compat:nn {Ligatures} {Discretionary} +\__fontspec_ot_compat:nn {Ligatures} {Contextual} +\__fontspec_ot_compat:nn {Ligatures} {Historic} +\__fontspec_ot_compat:nn {Numbers} {SlashedZero} +\__fontspec_ot_compat:nn {Contextuals} {Swash} +\__fontspec_ot_compat:nn {Contextuals} {Alternate} +\__fontspec_ot_compat:nn {Contextuals} {WordInitial} +\__fontspec_ot_compat:nn {Contextuals} {WordFinal} +\__fontspec_ot_compat:nn {Contextuals} {LineFinal} +\__fontspec_ot_compat:nn {Contextuals} {Inner} +\__fontspec_ot_compat:nn {Diacritics} {MarkToBase} +\__fontspec_ot_compat:nn {Diacritics} {MarkToMark} +\__fontspec_ot_compat:nn {Diacritics} {AboveBase} +\__fontspec_ot_compat:nn {Diacritics} {BelowBase} + +%%^^A%% fontspec-code-scripts.dtx -- part of FONTSPEC + +\newfontscript{Adlam}{adlm} +\newfontscript{Ahom}{ahom} +\newfontscript{Anatolian~Hieroglyphs}{hluw} +\newfontscript{Arabic}{arab} +\newfontscript{Armenian}{armn} +\newfontscript{Avestan}{avst} +\newfontscript{Balinese}{bali} +\newfontscript{Bamum}{bamu} +\newfontscript{Bassa~Vah}{bass} +\newfontscript{Batak}{batk} +\newfontscript{Bengali}{bng2,beng} +\newfontscript{Bhaiksuki}{bhks} +\newfontscript{Bopomofo}{bopo} +\newfontscript{Brahmi}{brah} +\newfontscript{Braille}{brai} +\newfontscript{Buginese}{bugi} +\newfontscript{Buhid}{buhd} +\newfontscript{Byzantine~Music}{byzm} +\newfontscript{Canadian~Syllabics}{cans} +\newfontscript{Carian}{cari} +\newfontscript{Caucasian~Albanian}{aghb} +\newfontscript{Chakma}{cakm} +\newfontscript{Cham}{cham} +\newfontscript{Cherokee}{cher} +\newfontscript{Chorasmian}{chrs} +\newfontscript{CJK~Ideographic}{hani} +\newfontscript{Coptic}{copt} +\newfontscript{Cypriot~Syllabary}{cprt} +\newfontscript{Cypro~Minoan}{cpmn} +\newfontscript{Cyrillic}{cyrl} +\newfontscript{Default}{DFLT} +\newfontscript{CustomDefault}{latn,DFLT} +\newfontscript{Deseret}{dsrt} +\newfontscript{Devanagari}{dev2,deva} +\newfontscript{Dives~Akuru}{diak} +\newfontscript{Dogra}{dogr} +\newfontscript{Duployan}{dupl} +\newfontscript{Egyptian~Hieroglyphs}{egyp} +\newfontscript{Elbasan}{elba} +\newfontscript{Elymaic}{elym} +\newfontscript{Ethiopic}{ethi} +\newfontscript{Georgian}{geor} +\newfontscript{Glagolitic}{glag} +\newfontscript{Gothic}{goth} +\newfontscript{Grantha}{gran} +\newfontscript{Greek}{grek} +\newfontscript{Gujarati}{gjr2,gujr} +\newfontscript{Gunjala~Gondi}{gong} +\newfontscript{Gurmukhi}{gur2,guru} +\newfontscript{Hangul~Jamo}{jamo} +\newfontscript{Hangul}{hang} +\newfontscript{Hanifi~Rohingya}{rohg} +\newfontscript{Hanunoo}{hano} +\newfontscript{Hatran}{hatr} +\newfontscript{Hebrew}{hebr} +\newfontscript{Hiragana~and~Katakana}{kana} +\newfontscript{Imperial~Aramaic}{armi} +\newfontscript{Inscriptional~Pahlavi}{phli} +\newfontscript{Inscriptional~Parthian}{prti} +\newfontscript{Javanese}{java} +\newfontscript{Kaithi}{kthi} +\newfontscript{Kannada}{knd2,knda} +\newfontscript{Kayah~Li}{kali} +\newfontscript{Kharosthi}{khar} +\newfontscript{Khitan~Small~Script}{kits} +\newfontscript{Khmer}{khmr} +\newfontscript{Khojki}{khoj} +\newfontscript{Khudawadi}{sind} +\newfontscript{Lao}{lao~} +\newfontscript{Latin}{latn} +\newfontscript{Lepcha}{lepc} +\newfontscript{Limbu}{limb} +\newfontscript{Linear~A}{lina} +\newfontscript{Linear~B}{linb} +\newfontscript{Lisu}{lisu} +\newfontscript{Lycian}{lyci} +\newfontscript{Lydian}{lydi} +\newfontscript{Mahajani}{mahj} +\newfontscript{Makasar}{maka} +\newfontscript{Malayalam}{mlm2,mlym} +\newfontscript{Mandaic}{mand} +\newfontscript{Manichaean}{mani} +\newfontscript{Marchen}{marc} +\newfontscript{Masaram Gondi}{gonm} +\newfontscript{Math}{math} +\newfontscript{Medefaidrin}{medf} +\newfontscript{Meitei~Mayek}{mtei} +\newfontscript{Mende~Kikakui}{mend} +\newfontscript{Meroitic~Cursive}{merc} +\newfontscript{Meroitic~Hieroglyphs}{mero} +\newfontscript{Miao}{plrd} +\newfontscript{Modi}{modi} +\newfontscript{Mongolian}{mong} +\newfontscript{Mro}{mroo} +\newfontscript{Multani}{mult} +\newfontscript{Musical~Symbols}{musc} +\newfontscript{Myanmar}{mym2,mymr} +\newfontscript{N'Ko}{nko~} +\newfontscript{Nabataean}{nbat} +\newfontscript{Nandinagari}{nand} +\newfontscript{Newa}{newa} +\newfontscript{Nushu}{nshu} +\newfontscript{Nyiakeng~Puachue~Hmong}{hmnp} +\newfontscript{Odia}{ory2,orya} +\newfontscript{Ogham}{ogam} +\newfontscript{Ol~Chiki}{olck} +\newfontscript{Old~Italic}{ital} +\newfontscript{Old~Hungarian}{hung} +\newfontscript{Old~North~Arabian}{narb} +\newfontscript{Old~Permic}{perm} +\newfontscript{Old~Persian~Cuneiform}{xpeo} +\newfontscript{Old~Sogdian}{sogo} +\newfontscript{Old~South~Arabian}{sarb} +\newfontscript{Old~Turkic}{orkh} +\newfontscript{Old~Uyghur}{ougr} +\newfontscript{Osage}{osge} +\newfontscript{Osmanya}{osma} +\newfontscript{Pahawh~Hmong}{hmng} +\newfontscript{Palmyrene}{palm} +\newfontscript{Pau~Cin~Hau}{pauc} +\newfontscript{Phags-pa}{phag} +\newfontscript{Phoenician}{phnx} +\newfontscript{Psalter~Pahlavi}{phlp} +\newfontscript{Rejang}{rjng} +\newfontscript{Runic}{runr} +\newfontscript{Samaritan}{samr} +\newfontscript{Saurashtra}{saur} +\newfontscript{Sharada}{shrd} +\newfontscript{Shavian}{shaw} +\newfontscript{Siddham}{sidd} +\newfontscript{Sign~Writing}{sgnw} +\newfontscript{Sinhala}{sinh} +\newfontscript{Sogdian}{sogd} +\newfontscript{Sora~Sompeng}{sora} +\newfontscript{Sumero-Akkadian~Cuneiform}{xsux} +\newfontscript{Sundanese}{sund} +\newfontscript{Syloti~Nagri}{sylo} +\newfontscript{Syriac}{syrc} +\newfontscript{Tagalog}{tglg} +\newfontscript{Tagbanwa}{tagb} +\newfontscript{Tai~Le}{tale} +\newfontscript{Tai~Lu}{talu} +\newfontscript{Tai~Tham}{lana} +\newfontscript{Tai~Viet}{tavt} +\newfontscript{Takri}{takr} +\newfontscript{Tamil}{tml2,taml} +\newfontscript{Tangsa}{tnsa} +\newfontscript{Tangut}{tang} +\newfontscript{Telugu}{tel2,telu} +\newfontscript{Thaana}{thaa} +\newfontscript{Thai}{thai} +\newfontscript{Tibetan}{tibt} +\newfontscript{Tifinagh}{tfng} +\newfontscript{Tirhuta}{tirh} +\newfontscript{Toto}{toto} +\newfontscript{Ugaritic~Cuneiform}{ugar} +\newfontscript{Vai}{vai~} +\newfontscript{Vithkuqi}{vith} +\newfontscript{Wancho}{wcho} +\newfontscript{Warang~Citi}{wara} +\newfontscript{Yezidi}{yezi} +\newfontscript{Yi}{yi~~} +\newfontscript{Zanabazar~Square}{zanb} +\newfontscript{CJK}{hani} +\newfontscript{Kana}{kana} +\newfontscript{Maths}{math} +\newfontscript{N'ko}{nko~} +\newfontscript{Oriya}{ory2,orya} + +%%^^A%% fontspec-code-lang.dtx -- part of FONTSPEC + +\newfontlanguage{Abaza}{ABA} +\newfontlanguage{Abkhazian}{ABK} +\newfontlanguage{Adyghe}{ADY} +\newfontlanguage{Afrikaans}{AFK} +\newfontlanguage{Afar}{AFR} +\newfontlanguage{Agaw}{AGW} +\newfontlanguage{Altai}{ALT} +\newfontlanguage{Amharic}{AMH} +\newfontlanguage{Arabic}{ARA} +\newfontlanguage{Aari}{ARI} +\newfontlanguage{Arakanese}{ARK} +\newfontlanguage{Assamese}{ASM} +\newfontlanguage{Athapaskan}{ATH} +\newfontlanguage{Avar}{AVR} +\newfontlanguage{Awadhi}{AWA} +\newfontlanguage{Aymara}{AYM} +\newfontlanguage{Azeri}{AZE} +\newfontlanguage{Badaga}{BAD} +\newfontlanguage{Baghelkhandi}{BAG} +\newfontlanguage{Balkar}{BAL} +\newfontlanguage{Baule}{BAU} +\newfontlanguage{Berber}{BBR} +\newfontlanguage{Bench}{BCH} +\newfontlanguage{Bible~Cree}{BCR} +\newfontlanguage{Belarussian}{BEL} +\newfontlanguage{Bemba}{BEM} +\newfontlanguage{Bengali}{BEN} +\newfontlanguage{Bulgarian}{BGR} +\newfontlanguage{Bhili}{BHI} +\newfontlanguage{Bhojpuri}{BHO} +\newfontlanguage{Bikol}{BIK} +\newfontlanguage{Bilen}{BIL} +\newfontlanguage{Blackfoot}{BKF} +\newfontlanguage{Balochi}{BLI} +\newfontlanguage{Balante}{BLN} +\newfontlanguage{Balti}{BLT} +\newfontlanguage{Bambara}{BMB} +\newfontlanguage{Bamileke}{BML} +\newfontlanguage{Breton}{BRE} +\newfontlanguage{Brahui}{BRH} +\newfontlanguage{Braj~Bhasha}{BRI} +\newfontlanguage{Burmese}{BRM} +\newfontlanguage{Bashkir}{BSH} +\newfontlanguage{Beti}{BTI} +\newfontlanguage{Catalan}{CAT} +\newfontlanguage{Cebuano}{CEB} +\newfontlanguage{Chechen}{CHE} +\newfontlanguage{Chaha~Gurage}{CHG} +\newfontlanguage{Chattisgarhi}{CHH} +\newfontlanguage{Chichewa}{CHI} +\newfontlanguage{Chukchi}{CHK} +\newfontlanguage{Chipewyan}{CHP} +\newfontlanguage{Cherokee}{CHR} +\newfontlanguage{Chuvash}{CHU} +\newfontlanguage{Comorian}{CMR} +\newfontlanguage{Coptic}{COP} +\newfontlanguage{Cree}{CRE} +\newfontlanguage{Carrier}{CRR} +\newfontlanguage{Crimean~Tatar}{CRT} +\newfontlanguage{Church~Slavonic}{CSL} +\newfontlanguage{Czech}{CSY} +\newfontlanguage{Danish}{DAN} +\newfontlanguage{Dargwa}{DAR} +\newfontlanguage{Woods~Cree}{DCR} +\newfontlanguage{German}{DEU} +\newfontlanguage{Dogri}{DGR} +\newfontlanguage{Divehi}{DIV} +\newfontlanguage{Djerma}{DJR} +\newfontlanguage{Dangme}{DNG} +\newfontlanguage{Dinka}{DNK} +\newfontlanguage{Dungan}{DUN} +\newfontlanguage{Dzongkha}{DZN} +\newfontlanguage{Ebira}{EBI} +\newfontlanguage{Eastern~Cree}{ECR} +\newfontlanguage{Edo}{EDO} +\newfontlanguage{Efik}{EFI} +\newfontlanguage{Greek}{ELL} +\newfontlanguage{English}{ENG} +\newfontlanguage{Erzya}{ERZ} +\newfontlanguage{Spanish}{ESP} +\newfontlanguage{Estonian}{ETI} +\newfontlanguage{Basque}{EUQ} +\newfontlanguage{Evenki}{EVK} +\newfontlanguage{Even}{EVN} +\newfontlanguage{Ewe}{EWE} +\newfontlanguage{French~Antillean}{FAN} +\newfontlanguage{Farsi}{FAR} +\newfontlanguage{Parsi}{FAR} +\newfontlanguage{Persian}{FAR} +\newfontlanguage{Finnish}{FIN} +\newfontlanguage{Fijian}{FJI} +\newfontlanguage{Flemish}{FLE} +\newfontlanguage{Forest~Nenets}{FNE} +\newfontlanguage{Fon}{FON} +\newfontlanguage{Faroese}{FOS} +\newfontlanguage{French}{FRA} +\newfontlanguage{Frisian}{FRI} +\newfontlanguage{Friulian}{FRL} +\newfontlanguage{Futa}{FTA} +\newfontlanguage{Fulani}{FUL} +\newfontlanguage{Ga}{GAD} +\newfontlanguage{Gaelic}{GAE} +\newfontlanguage{Gagauz}{GAG} +\newfontlanguage{Galician}{GAL} +\newfontlanguage{Garshuni}{GAR} +\newfontlanguage{Garhwali}{GAW} +\newfontlanguage{Ge'ez}{GEZ} +\newfontlanguage{Gilyak}{GIL} +\newfontlanguage{Gumuz}{GMZ} +\newfontlanguage{Gondi}{GON} +\newfontlanguage{Greenlandic}{GRN} +\newfontlanguage{Garo}{GRO} +\newfontlanguage{Guarani}{GUA} +\newfontlanguage{Gujarati}{GUJ} +\newfontlanguage{Haitian}{HAI} +\newfontlanguage{Halam}{HAL} +\newfontlanguage{Harauti}{HAR} +\newfontlanguage{Hausa}{HAU} +\newfontlanguage{Hawaiin}{HAW} +\newfontlanguage{Hammer-Banna}{HBN} +\newfontlanguage{Hiligaynon}{HIL} +\newfontlanguage{Hindi}{HIN} +\newfontlanguage{High~Mari}{HMA} +\newfontlanguage{Hindko}{HND} +\newfontlanguage{Ho}{HO} +\newfontlanguage{Harari}{HRI} +\newfontlanguage{Croatian}{HRV} +\newfontlanguage{Hungarian}{HUN} +\newfontlanguage{Armenian}{HYE} +\newfontlanguage{Igbo}{IBO} +\newfontlanguage{Ijo}{IJO} +\newfontlanguage{Ilokano}{ILO} +\newfontlanguage{Indonesian}{IND} +\newfontlanguage{Ingush}{ING} +\newfontlanguage{Inuktitut}{INU} +\newfontlanguage{Irish}{IRI} +\newfontlanguage{Irish~Traditional}{IRT} +\newfontlanguage{Icelandic}{ISL} +\newfontlanguage{Inari~Sami}{ISM} +\newfontlanguage{Italian}{ITA} +\newfontlanguage{Hebrew}{IWR} +\newfontlanguage{Javanese}{JAV} +\newfontlanguage{Yiddish}{JII} +\newfontlanguage{Japanese}{JAN} +\newfontlanguage{Judezmo}{JUD} +\newfontlanguage{Jula}{JUL} +\newfontlanguage{Kabardian}{KAB} +\newfontlanguage{Kachchi}{KAC} +\newfontlanguage{Kalenjin}{KAL} +\newfontlanguage{Kannada}{KAN} +\newfontlanguage{Karachay}{KAR} +\newfontlanguage{Georgian}{KAT} +\newfontlanguage{Kazakh}{KAZ} +\newfontlanguage{Kebena}{KEB} +\newfontlanguage{Khutsuri~Georgian}{KGE} +\newfontlanguage{Khakass}{KHA} +\newfontlanguage{Khanty-Kazim}{KHK} +\newfontlanguage{Khmer}{KHM} +\newfontlanguage{Khanty-Shurishkar}{KHS} +\newfontlanguage{Khanty-Vakhi}{KHV} +\newfontlanguage{Khowar}{KHW} +\newfontlanguage{Kikuyu}{KIK} +\newfontlanguage{Kirghiz}{KIR} +\newfontlanguage{Kisii}{KIS} +\newfontlanguage{Kokni}{KKN} +\newfontlanguage{Kalmyk}{KLM} +\newfontlanguage{Kamba}{KMB} +\newfontlanguage{Kumaoni}{KMN} +\newfontlanguage{Komo}{KMO} +\newfontlanguage{Komso}{KMS} +\newfontlanguage{Kanuri}{KNR} +\newfontlanguage{Kodagu}{KOD} +\newfontlanguage{Korean~Old~Hangul}{KOH} +\newfontlanguage{Konkani}{KOK} +\newfontlanguage{Kikongo}{KON} +\newfontlanguage{Komi-Permyak}{KOP} +\newfontlanguage{Korean}{KOR} +\newfontlanguage{Komi-Zyrian}{KOZ} +\newfontlanguage{Kpelle}{KPL} +\newfontlanguage{Krio}{KRI} +\newfontlanguage{Karakalpak}{KRK} +\newfontlanguage{Karelian}{KRL} +\newfontlanguage{Karaim}{KRM} +\newfontlanguage{Karen}{KRN} +\newfontlanguage{Koorete}{KRT} +\newfontlanguage{Kashmiri}{KSH} +\newfontlanguage{Khasi}{KSI} +\newfontlanguage{Kildin~Sami}{KSM} +\newfontlanguage{Kui}{KUI} +\newfontlanguage{Kulvi}{KUL} +\newfontlanguage{Kumyk}{KUM} +\newfontlanguage{Kurdish}{KUR} +\newfontlanguage{Kurukh}{KUU} +\newfontlanguage{Kuy}{KUY} +\newfontlanguage{Koryak}{KYK} +\newfontlanguage{Ladin}{LAD} +\newfontlanguage{Lahuli}{LAH} +\newfontlanguage{Lak}{LAK} +\newfontlanguage{Lambani}{LAM} +\newfontlanguage{Lao}{LAO} +\newfontlanguage{Latin}{LAT} +\newfontlanguage{Laz}{LAZ} +\newfontlanguage{L-Cree}{LCR} +\newfontlanguage{Ladakhi}{LDK} +\newfontlanguage{Lezgi}{LEZ} +\newfontlanguage{Lingala}{LIN} +\newfontlanguage{Low~Mari}{LMA} +\newfontlanguage{Limbu}{LMB} +\newfontlanguage{Lomwe}{LMW} +\newfontlanguage{Lower~Sorbian}{LSB} +\newfontlanguage{Lule~Sami}{LSM} +\newfontlanguage{Lithuanian}{LTH} +\newfontlanguage{Luba}{LUB} +\newfontlanguage{Luganda}{LUG} +\newfontlanguage{Luhya}{LUH} +\newfontlanguage{Luo}{LUO} +\newfontlanguage{Latvian}{LVI} +\newfontlanguage{Majang}{MAJ} +\newfontlanguage{Makua}{MAK} +\newfontlanguage{Malayalam~Traditional}{MAL} +\newfontlanguage{Mansi}{MAN} +\newfontlanguage{Marathi}{MAR} +\newfontlanguage{Marwari}{MAW} +\newfontlanguage{Mbundu}{MBN} +\newfontlanguage{Manchu}{MCH} +\newfontlanguage{Moose~Cree}{MCR} +\newfontlanguage{Mende}{MDE} +\newfontlanguage{Me'en}{MEN} +\newfontlanguage{Mizo}{MIZ} +\newfontlanguage{Macedonian}{MKD} +\newfontlanguage{Male}{MLE} +\newfontlanguage{Malagasy}{MLG} +\newfontlanguage{Malinke}{MLN} +\newfontlanguage{Malayalam~Reformed}{MLR} +\newfontlanguage{Malay}{MLY} +\newfontlanguage{Mandinka}{MND} +\newfontlanguage{Mongolian}{MNG} +\newfontlanguage{Manipuri}{MNI} +\newfontlanguage{Maninka}{MNK} +\newfontlanguage{Manx~Gaelic}{MNX} +\newfontlanguage{Moksha}{MOK} +\newfontlanguage{Moldavian}{MOL} +\newfontlanguage{Mon}{MON} +\newfontlanguage{Moroccan}{MOR} +\newfontlanguage{Maori}{MRI} +\newfontlanguage{Maithili}{MTH} +\newfontlanguage{Maltese}{MTS} +\newfontlanguage{Mundari}{MUN} +\newfontlanguage{Naga-Assamese}{NAG} +\newfontlanguage{Nanai}{NAN} +\newfontlanguage{Naskapi}{NAS} +\newfontlanguage{N-Cree}{NCR} +\newfontlanguage{Ndebele}{NDB} +\newfontlanguage{Ndonga}{NDG} +\newfontlanguage{Nepali}{NEP} +\newfontlanguage{Newari}{NEW} +\newfontlanguage{Nagari}{NGR} +\newfontlanguage{Norway~House~Cree}{NHC} +\newfontlanguage{Nisi}{NIS} +\newfontlanguage{Niuean}{NIU} +\newfontlanguage{Nkole}{NKL} +\newfontlanguage{N'ko}{NKO} +\newfontlanguage{Dutch}{NLD} +\newfontlanguage{Nogai}{NOG} +\newfontlanguage{Norwegian}{NOR} +\newfontlanguage{Northern~Sami}{NSM} +\newfontlanguage{Northern~Tai}{NTA} +\newfontlanguage{Esperanto}{NTO} +\newfontlanguage{Nynorsk}{NYN} +\newfontlanguage{Oji-Cree}{OCR} +\newfontlanguage{Ojibway}{OJB} +\newfontlanguage{Oriya}{ORI} +\newfontlanguage{Oromo}{ORO} +\newfontlanguage{Ossetian}{OSS} +\newfontlanguage{Palestinian~Aramaic}{PAA} +\newfontlanguage{Pali}{PAL} +\newfontlanguage{Punjabi}{PAN} +\newfontlanguage{Palpa}{PAP} +\newfontlanguage{Pashto}{PAS} +\newfontlanguage{Polytonic~Greek}{PGR} +\newfontlanguage{Pilipino}{PIL} +\newfontlanguage{Palaung}{PLG} +\newfontlanguage{Polish}{PLK} +\newfontlanguage{Provencal}{PRO} +\newfontlanguage{Portuguese}{PTG} +\newfontlanguage{Chin}{QIN} +\newfontlanguage{Rajasthani}{RAJ} +\newfontlanguage{R-Cree}{RCR} +\newfontlanguage{Russian~Buriat}{RBU} +\newfontlanguage{Riang}{RIA} +\newfontlanguage{Rhaeto-Romanic}{RMS} +\newfontlanguage{Romanian}{ROM} +\newfontlanguage{Romany}{ROY} +\newfontlanguage{Rusyn}{RSY} +\newfontlanguage{Ruanda}{RUA} +\newfontlanguage{Russian}{RUS} +\newfontlanguage{Sadri}{SAD} +\newfontlanguage{Sanskrit}{SAN} +\newfontlanguage{Santali}{SAT} +\newfontlanguage{Sayisi}{SAY} +\newfontlanguage{Sekota}{SEK} +\newfontlanguage{Selkup}{SEL} +\newfontlanguage{Sango}{SGO} +\newfontlanguage{Shan}{SHN} +\newfontlanguage{Sibe}{SIB} +\newfontlanguage{Sidamo}{SID} +\newfontlanguage{Silte~Gurage}{SIG} +\newfontlanguage{Skolt~Sami}{SKS} +\newfontlanguage{Slovak}{SKY} +\newfontlanguage{Slavey}{SLA} +\newfontlanguage{Slovenian}{SLV} +\newfontlanguage{Somali}{SML} +\newfontlanguage{Samoan}{SMO} +\newfontlanguage{Sena}{SNA} +\newfontlanguage{Sindhi}{SND} +\newfontlanguage{Sinhalese}{SNH} +\newfontlanguage{Soninke}{SNK} +\newfontlanguage{Sodo~Gurage}{SOG} +\newfontlanguage{Sotho}{SOT} +\newfontlanguage{Albanian}{SQI} +\newfontlanguage{Serbian}{SRB} +\newfontlanguage{Saraiki}{SRK} +\newfontlanguage{Serer}{SRR} +\newfontlanguage{South~Slavey}{SSL} +\newfontlanguage{Southern~Sami}{SSM} +\newfontlanguage{Suri}{SUR} +\newfontlanguage{Svan}{SVA} +\newfontlanguage{Swedish}{SVE} +\newfontlanguage{Swadaya~Aramaic}{SWA} +\newfontlanguage{Swahili}{SWK} +\newfontlanguage{Swazi}{SWZ} +\newfontlanguage{Sutu}{SXT} +\newfontlanguage{Syriac}{SYR} +\newfontlanguage{Tabasaran}{TAB} +\newfontlanguage{Tajiki}{TAJ} +\newfontlanguage{Tamil}{TAM} +\newfontlanguage{Tatar}{TAT} +\newfontlanguage{TH-Cree}{TCR} +\newfontlanguage{Telugu}{TEL} +\newfontlanguage{Tongan}{TGN} +\newfontlanguage{Tigre}{TGR} +\newfontlanguage{Tigrinya}{TGY} +\newfontlanguage{Thai}{THA} +\newfontlanguage{Tahitian}{THT} +\newfontlanguage{Tibetan}{TIB} +\newfontlanguage{Turkish}{TRK,TUR} +\newfontlanguage{Turkmen}{TKM} +\newfontlanguage{Temne}{TMN} +\newfontlanguage{Tswana}{TNA} +\newfontlanguage{Tundra~Nenets}{TNE} +\newfontlanguage{Tonga}{TNG} +\newfontlanguage{Todo}{TOD} +\newfontlanguage{Tsonga}{TSG} +\newfontlanguage{Turoyo~Aramaic}{TUA} +\newfontlanguage{Tulu}{TUL} +\newfontlanguage{Tuvin}{TUV} +\newfontlanguage{Twi}{TWI} +\newfontlanguage{Udmurt}{UDM} +\newfontlanguage{Ukrainian}{UKR} +\newfontlanguage{Urdu}{URD} +\newfontlanguage{Upper~Sorbian}{USB} +\newfontlanguage{Uyghur}{UYG} +\newfontlanguage{Uzbek}{UZB} +\newfontlanguage{Venda}{VEN} +\newfontlanguage{Vietnamese}{VIT} +\newfontlanguage{Wa}{WA} +\newfontlanguage{Wagdi}{WAG} +\newfontlanguage{West-Cree}{WCR} +\newfontlanguage{Welsh}{WEL} +\newfontlanguage{Wolof}{WLF} +\newfontlanguage{Tai~Lue}{XBD} +\newfontlanguage{Xhosa}{XHS} +\newfontlanguage{Yakut}{YAK} +\newfontlanguage{Yoruba}{YBA} +\newfontlanguage{Y-Cree}{YCR} +\newfontlanguage{Yi~Classic}{YIC} +\newfontlanguage{Yi~Modern}{YIM} +\newfontlanguage{Chinese~Hong~Kong}{ZHH} +\newfontlanguage{Chinese~Phonetic}{ZHP} +\newfontlanguage{Chinese~Simplified}{ZHS} +\newfontlanguage{Chinese~Traditional}{ZHT} +\newfontlanguage{Zande}{ZND} +\newfontlanguage{Zulu}{ZUL} + +%%^^A%% fontspec-code-feat-aat.dtx -- part of FONTSPEC + + +%%^^A%% fontspec-code-enc.dtx -- part of FONTSPEC + +\DeclareDocumentCommand \EncodingCommand { m O{} O{} m } + { + \bool_if:NF \l__fontspec_defining_encoding_bool + { \__fontspec_error:nn {only-inside-encdef} \EncodingCommand } + \DeclareTextCommand{#1}{\UnicodeEncodingName}[#2][#3]{#4} + } +\DeclareDocumentCommand \EncodingAccent {mm} + { + \bool_if:NF \l__fontspec_defining_encoding_bool + { \__fontspec_error:nn {only-inside-encdef} \EncodingAccent } + \DeclareTextCommand{#1}{\UnicodeEncodingName}{\add@unicode@accent{#2}} + } +\DeclareDocumentCommand \EncodingSymbol {mm} + { + \bool_if:NF \l__fontspec_defining_encoding_bool + { \__fontspec_error:nn {only-inside-encdef} \EncodingSymbol } + \DeclareTextSymbol{#1}{\UnicodeEncodingName}{#2} + } +\DeclareDocumentCommand \EncodingComposite {mmm} + { + \bool_if:NF \l__fontspec_defining_encoding_bool + { \__fontspec_error:nn {only-inside-encdef} \EncodingComposite } + \DeclareTextComposite{#1}{\UnicodeEncodingName}{#2}{#3} + } +\DeclareDocumentCommand \EncodingCompositeCommand {mmm} + { + \bool_if:NF \l__fontspec_defining_encoding_bool + { \__fontspec_error:nn {only-inside-encdef} \EncodingCompositeCommand } + \DeclareTextCompositeCommand{#1}{\UnicodeEncodingName}{#2}{#3} + } +\DeclareDocumentCommand \DeclareUnicodeEncoding {mm} + { + \DeclareFontEncoding{#1}{}{} + \DeclareFontSubstitution{#1}{lmr}{m}{n} + \DeclareFontFamily{#1}{lmr}{} + + \DeclareFontShape{#1}{lmr}{m}{n} + {<->\UnicodeFontFile{lmroman10-regular}{\UnicodeFontTeXLigatures}}{} + \DeclareFontShape{#1}{lmr}{m}{it} + {<->\UnicodeFontFile{lmroman10-italic}{\UnicodeFontTeXLigatures}}{} + \DeclareFontShape{#1}{lmr}{m}{sc} + {<->\UnicodeFontFile{lmromancaps10-regular}{\UnicodeFontTeXLigatures}}{} + \DeclareFontShape{#1}{lmr}{bx}{n} + {<->\UnicodeFontFile{lmroman10-bold}{\UnicodeFontTeXLigatures}}{} + \DeclareFontShape{#1}{lmr}{bx}{it} + {<->\UnicodeFontFile{lmroman10-bolditalic}{\UnicodeFontTeXLigatures}}{} + + \tl_set_eq:NN \l__fontspec_prev_unicode_name_tl \UnicodeEncodingName + \tl_set:Nn \UnicodeEncodingName {#1} + \bool_set_true:N \l__fontspec_defining_encoding_bool + #2 + \bool_set_false:N \l__fontspec_defining_encoding_bool + \tl_set_eq:NN \UnicodeEncodingName \l__fontspec_prev_unicode_name_tl + } +\DeclareDocumentCommand \UndeclareSymbol {m} + { + \bool_if:NF \l__fontspec_defining_encoding_bool + { \__fontspec_error:nn {only-inside-encdef} \UndeclareSymbol } + \UndeclareTextCommand {#1} {\UnicodeEncodingName} + } +\DeclareDocumentCommand \UndeclareAccent {m} + { + \bool_if:NF \l__fontspec_defining_encoding_bool + { \__fontspec_error:nn {only-inside-encdef} \UndeclareAccent } + \UndeclareTextCommand {#1} {\UnicodeEncodingName} + } +\DeclareDocumentCommand \UndeclareCommand {m} + { + \bool_if:NF \l__fontspec_defining_encoding_bool + { \__fontspec_error:nn {only-inside-encdef} \UndeclareCommand } + \UndeclareTextCommand {#1} {\UnicodeEncodingName} + } +\DeclareDocumentCommand \UndeclareComposite {mm} + { + \bool_if:NF \l__fontspec_defining_encoding_bool + { \__fontspec_error:nn {only-inside-encdef} \UndeclareComposite } + \cs_undefine:c + { \c_backslash_str \UnicodeEncodingName \token_to_str:N #1 - \tl_to_str:n {#2} } + } + +%%^^A%% fontspec-code-math.dtx -- part of FONTSPEC +\@ifpackageloaded{euler} + { \bool_gset_true:N \g__fontspec_pkg_euler_loaded_bool } + { \bool_gset_false:N \g__fontspec_pkg_euler_loaded_bool } +\cs_new:Nn \fontspec_setup_maths: + { + \@ifpackageloaded{euler} + { + \bool_if:NTF \g__fontspec_pkg_euler_loaded_bool + { \bool_gset_true:N \g__fontspec_math_euler_bool } + { \__fontspec_error:n {euler-too-late} } + } + {} + \@ifpackageloaded{lucbmath}{ \bool_gset_true:N \g__fontspec_math_lucida_bool }{} + \@ifpackageloaded{lucidabr}{ \bool_gset_true:N \g__fontspec_math_lucida_bool }{} + \@ifpackageloaded{lucimatx}{ \bool_gset_true:N \g__fontspec_math_lucida_bool }{} + \DeclareSymbolFont{legacymaths}{OT1}{cmr}{m}{n} + \SetSymbolFont{legacymaths}{bold}{OT1}{cmr}{bx}{n} + \DeclareMathAccent{\acute} {\mathalpha}{legacymaths}{19} + \DeclareMathAccent{\grave} {\mathalpha}{legacymaths}{18} + \DeclareMathAccent{\ddot} {\mathalpha}{legacymaths}{127} + \DeclareMathAccent{\tilde} {\mathalpha}{legacymaths}{126} + \DeclareMathAccent{\bar} {\mathalpha}{legacymaths}{22} + \DeclareMathAccent{\breve} {\mathalpha}{legacymaths}{21} + \DeclareMathAccent{\check} {\mathalpha}{legacymaths}{20} + \DeclareMathAccent{\hat} {\mathalpha}{legacymaths}{94} % too bad, euler + \DeclareMathAccent{\dot} {\mathalpha}{legacymaths}{95} + \DeclareMathAccent{\mathring}{\mathalpha}{legacymaths}{23} + \group_begin: + \mathchardef\@tempa="603A \relax + \ifx\colon\@tempa + \DeclareMathSymbol{\colon}{\mathpunct}{legacymaths}{58} + \fi + \group_end: + \bool_if:NF \g__fontspec_math_euler_bool + { + \DeclareMathSymbol{!}{\mathclose}{legacymaths}{33} + \DeclareMathSymbol{:}{\mathrel} {legacymaths}{58} + \DeclareMathSymbol{;}{\mathpunct}{legacymaths}{59} + \DeclareMathSymbol{?}{\mathclose}{legacymaths}{63} + \bool_if:NF \g__fontspec_math_lucida_bool + { + \DeclareMathSymbol{0}{\mathalpha}{legacymaths}{`0} + \DeclareMathSymbol{1}{\mathalpha}{legacymaths}{`1} + \DeclareMathSymbol{2}{\mathalpha}{legacymaths}{`2} + \DeclareMathSymbol{3}{\mathalpha}{legacymaths}{`3} + \DeclareMathSymbol{4}{\mathalpha}{legacymaths}{`4} + \DeclareMathSymbol{5}{\mathalpha}{legacymaths}{`5} + \DeclareMathSymbol{6}{\mathalpha}{legacymaths}{`6} + \DeclareMathSymbol{7}{\mathalpha}{legacymaths}{`7} + \DeclareMathSymbol{8}{\mathalpha}{legacymaths}{`8} + \DeclareMathSymbol{9}{\mathalpha}{legacymaths}{`9} + \DeclareMathSymbol{\Gamma}{\mathalpha}{legacymaths}{0} + \DeclareMathSymbol{\Delta}{\mathalpha}{legacymaths}{1} + \DeclareMathSymbol{\Theta}{\mathalpha}{legacymaths}{2} + \DeclareMathSymbol{\Lambda}{\mathalpha}{legacymaths}{3} + \DeclareMathSymbol{\Xi}{\mathalpha}{legacymaths}{4} + \DeclareMathSymbol{\Pi}{\mathalpha}{legacymaths}{5} + \DeclareMathSymbol{\Sigma}{\mathalpha}{legacymaths}{6} + \DeclareMathSymbol{\Upsilon}{\mathalpha}{legacymaths}{7} + \DeclareMathSymbol{\Phi}{\mathalpha}{legacymaths}{8} + \DeclareMathSymbol{\Psi}{\mathalpha}{legacymaths}{9} + \DeclareMathSymbol{\Omega}{\mathalpha}{legacymaths}{10} + \DeclareMathSymbol{+}{\mathbin}{legacymaths}{43} + \DeclareMathSymbol{=}{\mathrel}{legacymaths}{61} + \DeclareMathDelimiter{(}{\mathopen} {legacymaths}{40}{largesymbols}{0} + \DeclareMathDelimiter{)}{\mathclose}{legacymaths}{41}{largesymbols}{1} + \DeclareMathDelimiter{[}{\mathopen} {legacymaths}{91}{largesymbols}{2} + \DeclareMathDelimiter{]}{\mathclose}{legacymaths}{93}{largesymbols}{3} + \DeclareMathDelimiter{/}{\mathord}{legacymaths}{47}{largesymbols}{14} + \DeclareMathSymbol{\mathdollar}{\mathord}{legacymaths}{36} + \renewcommand{\hbar}{{\mathchar"AF\mkern-9mu h}}% TODO: test with other fonts + } + } + \DeclareSymbolFont{operators}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\shapedefault + \SetSymbolFont{operators}{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\shapedefault + \DeclareSymbolFontAlphabet\mathrm{operators} + \SetMathAlphabet\mathit{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\itdefault + \SetMathAlphabet\mathbf{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\shapedefault + \SetMathAlphabet\mathsf{normal}\g_fontspec_encoding_tl\g__fontspec_mathsf_tl\mddefault\shapedefault + \SetMathAlphabet\mathtt{normal}\g_fontspec_encoding_tl\g__fontspec_mathtt_tl\mddefault\shapedefault + \SetSymbolFont{operators}{bold}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\shapedefault + \tl_if_empty:NTF \g__fontspec_bfmathrm_tl + { + \SetMathAlphabet\mathit{bold}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\itdefault + } + { + \SetMathAlphabet\mathrm{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\mddefault\shapedefault + \SetMathAlphabet\mathbf{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\bfdefault\shapedefault + \SetMathAlphabet\mathit{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\mddefault\itdefault + } + \SetMathAlphabet\mathsf{bold}\g_fontspec_encoding_tl\g__fontspec_mathsf_tl\bfdefault\shapedefault + \SetMathAlphabet\mathtt{bold}\g_fontspec_encoding_tl\g__fontspec_mathtt_tl\bfdefault\shapedefault + } +\cs_new:Nn \fontspec_maybe_setup_maths: + { + \@ifpackageloaded{anttor} + { + \ifx\define@antt@mathversions a\bool_gset_false:N \g__fontspec_math_bool\fi + }{} + \@ifpackageloaded{arevmath} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{eulervm} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{mathdesign} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{concmath} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{cmbright} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{mathesf} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{gfsartemisia} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{gfsneohellenic} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{iwona} + { + \ifx\define@iwona@mathversions a\bool_set_false:N \g__fontspec_math_bool\fi + }{} + \@ifpackageloaded{kpfonts}{\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{kmath} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{kurier} + { + \ifx\define@kurier@mathversions a\bool_set_false:N \g__fontspec_math_bool\fi + }{} + \@ifpackageloaded{fouriernc} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{fourier} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{lmodern} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{mathpazo} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{mathptmx} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{MinionPro} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{unicode-math} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{breqn} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{pxfonts} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{txfonts} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{newpxmath} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{newtxmath} {\bool_gset_false:N \g__fontspec_math_bool}{} + \@ifpackageloaded{mtpro2} {\bool_gset_false:N \g__fontspec_math_bool}{} + \bool_if:NT \g__fontspec_math_bool + { + \__fontspec_info:n {setup-math} + \fontspec_setup_maths: + } + } +\AtBeginDocument{\fontspec_maybe_setup_maths:} + +%%^^A%% fontspec-code-closing.dtx -- part of FONTSPEC +\bool_if:NT \g__fontspec_cfg_bool + { + \InputIfFileExists{fontspec.cfg} + {} + { \typeout{No~ fontspec.cfg~ file~ found;~ no~ configuration~ loaded.} } + } + +%%^^A%% fontspec-code-xfss.dtx -- part of FONTSPEC + +\providecommand*\scitdefault{\scdefault\itdefault} +\providecommand*\scsldefault{\scdefault\sldefault} +\providecommand*\scswdefault{\scdefault\swdefault} +\cs_new:Nn \__fontspec_shape_merge:nn { c__fontspec_shape_#1_#2_tl } +\cs_new:Nn \__fontspec_merge_default_shapes: + { + \tl_const:cn { \__fontspec_shape_merge:nn \shapedefault\scdefault } {\scdefault} + \tl_const:cn { \__fontspec_shape_merge:nn \itdefault \scdefault } {\scitdefault} + \tl_const:cn { \__fontspec_shape_merge:nn \sldefault \scdefault } {\scsldefault} + \tl_const:cn { \__fontspec_shape_merge:nn \swdefault \scdefault } {\scswdefault} + \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \itdefault } {\scitdefault} + \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \sldefault } {\scsldefault} + \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \swdefault } {\scswdefault} + \tl_const:cn { \__fontspec_shape_merge:nn \scsldefault \itdefault } {\scitdefault} + \tl_const:cn { \__fontspec_shape_merge:nn \scitdefault \sldefault } {\scsldefault} + \tl_const:cn { \__fontspec_shape_merge:nn \scitdefault \shapedefault } {\scdefault} + \tl_const:cn { \__fontspec_shape_merge:nn \scsldefault \shapedefault } {\scdefault} + } +\__fontspec_merge_default_shapes: +\prg_new_conditional:Nnn \__fontspec_if_merge_shape:n {TF} + { + \bool_lazy_and:nnTF + { \tl_if_exist_p:c { \__fontspec_shape_merge:nn {\f@shape} {#1} } } + { + \cs_if_exist_p:c + { + \f@encoding/\f@family/\f@series/ + \tl_use:c { \__fontspec_shape_merge:nn {\f@shape} {#1} } + } + } + \prg_return_true: \prg_return_false: + } +\cs_set_eq:NN \emfontdeclare \DeclareEmphSequence +\cs_set_protected:Npn \strongfontdeclare #1 + { + \prop_gclear:N \g__fontspec_strong_prop + \int_zero:N \l__fontspec_strongdef_int + + \group_begin: + \normalfont + \clist_map_inline:nn {\strongreset,#1} + { + ##1 + \prop_gput_if_new:NxV \g__fontspec_strong_prop { \f@series } { \l__fontspec_strongdef_int } + \prop_gput:Nxn \g__fontspec_strong_prop { switch-\int_use:N \l__fontspec_strongdef_int } { ##1 } + \int_incr:N \l__fontspec_strongdef_int + } + \group_end: + } +\DeclareRobustCommand \strongenv + { + \@nomath\strongenv + + \prop_get:NxNT \g__fontspec_strong_prop { \f@series } \l__fontspec_strong_tmp_tl + { + \int_set:Nn \l__fontspec_strong_int { \l__fontspec_strong_tmp_tl } + } + + \int_incr:N \l__fontspec_strong_int + + \prop_get:NxNTF \g__fontspec_strong_prop { switch-\int_use:N \l__fontspec_strong_int } \l__fontspec_strong_switch_tl + { \l__fontspec_strong_switch_tl } + { + \int_zero:N \l__fontspec_strong_int + \strongreset + } + + } +\DeclareTextFontCommand{\strong}{\strongenv} +\cs_set:Npn \strongreset {} +\cs_set:Npn \reset@font + { + \normalfont + \int_zero:N \l__fontspec_strong_int + } +\cs_new:Nn \fontspec_set_strong_level:n { \int_set:Nn \l__fontspec_strong_int {#1} } +\strongfontdeclare{ \bfseries } + diff --git a/firstaid/luaotfload-l3color-tmp.lua b/firstaid/luaotfload-l3color-tmp.lua new file mode 100644 index 00000000..1d4eab4d --- /dev/null +++ b/firstaid/luaotfload-l3color-tmp.lua @@ -0,0 +1,78 @@ +if not luaotfload.set_transparent_colorstack then return end +local l = lpeg +local spaces = l.P' '^0 +local digit16 = l.R('09', 'af', 'AF') + +local octet = digit16 * digit16 / function(s) return string.format('%.3g ', tonumber(s, 16) / 255) end +local htmlcolor = l.Cs(octet * octet * octet * -1 * l.Cc'rg') +local color_export = { + token.create'endlocalcontrol', + token.create'tex_hpack:D', + token.new(0, 1), + token.create'color_export:nnN', + token.new(0, 1), + '', + token.new(0, 2), + token.new(0, 1), + 'backend', + token.new(0, 2), + token.create'l_tmpa_tl', + token.create'exp_after:wN', + token.create'__color_select:nn', + token.create'l_tmpa_tl', + token.new(0, 2), +} +local group_end = token.create'group_end:' +local value = (1 - l.P'}')^0 +luatexbase.add_to_callback('luaotfload.parse_color', function (value) + local html = htmlcolor:match(value) + if html then return html end + + tex.runtoks(function() + token.get_next() + color_export[6] = value + tex.sprint(-2, color_export) + end) + local list = token.scan_list() + if not list.head or list.head.next or list.head.subtype ~= node.subtype'pdf_colorstack' then + error'Unexpected backend behavior' + end + local cmd = list.head.data + node.free(list) + return cmd +end, 'l3color') + +-- Let's also integrate l3opacity + +luaotfload.set_transparent_colorstack(token.create'c__opacity_backend_stack_int'.index) + +local transparent_register = { + token.create'pdfmanagement_add:nnn', + token.new(0, 1), + 'Page/Resources/ExtGState', + token.new(0, 2), + token.new(0, 1), + '', + token.new(0, 2), + token.new(0, 1), + '<>', + token.new(0, 2), +} +luatexbase.add_to_callback('luaotfload.parse_transparent', function(value) + value = (octet * -1):match(value) + if not value then + tex.error'Invalid transparency value' + return + end + value = value:sub(1, -2) + local result = 'opacity' .. value + tex.runtoks(function() + transparent_register[6], transparent_register[10], transparent_register[12] = result, value, value + tex.sprint(-2, transparent_register) + end) + return '/' .. result .. ' gs' +end, 'l3opacity') diff --git a/pdfmanagement-firstaid.dtx b/pdfmanagement-firstaid.dtx index 009f1bf0..aab1b15e 100644 --- a/pdfmanagement-firstaid.dtx +++ b/pdfmanagement-firstaid.dtx @@ -68,7 +68,7 @@ {LaTeX PDF management testphase bundle / firstaid-patches} %<@@=pdfmanagement> -\clist_map_inline:nn {pgf,transparent,hyperxmp,pdflscape,xcolor,color,beamer,output,colorspace} +\clist_map_inline:nn {pgf,transparent,hyperxmp,pdflscape,xcolor,color,beamer,output,colorspace,fontspec} { \bool_new:c { g_@@_firstaid_#1_bool } \bool_gset_true:c { g_@@_firstaid_#1_bool } @@ -82,6 +82,34 @@ } \msg_new:nnn { pdfmanagement } { firstaid } { loading~pdfmanagement~firstaid~code~for~#1 } +\msg_new:nnn { pdfmanagement } { firstaid-changed } + { package~#1~has~changed.~Check~if~patch~is~still~valid! } +% \end{macrocode} +% \subsection{Fontspec} +% When using luaLaTeX opacity is broken (issue \#30) as +% fontspec/luaotfload doesn't use the pdfmanagement but write to ExtGState directly +% To repair this some new lua code is needed. This also +% improves the color parsing and allows to use cmyk and spot colors as font colors. +% It is also needed to use a patch version of \texttt{fontspec-luatex.sty} to +% slightly change the way how the Opacity and Color key are handled. +% \begin{macrocode} +\bool_if:NT \g_@@_firstaid_fontspec_bool + { + \sys_if_engine_luatex:T + { + \msg_info:nnn{pdfmanagement}{firstaid}{fontspec} + \file_if_exist:nT { luaotfload-l3color-tmp.lua } + { + \lua_load_module:n { luaotfload-l3color-tmp.lua } + } + } + \declare@file@substitution{fontspec-luatex.sty}{fontspec-luatex-tmp-ltx.sty} + \AddToHook{package/fontspec/after} + { + \str_if_eq:vnF{ver@fontspec.sty}{2022/01/15~v2.8a~Font~selection~for~XeLaTeX~and~LuaLaTeX} + {\msg_warn:nnn{pdfmanagement}{firstaid-changed}{fontspec}} + } + } % \end{macrocode} % \subsection{Output routine} % This load as few patches for the LaTeX output routine commands. They add