%% %% 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}% {2024/05/11}{2.9e}{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 \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_external_kpse_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 \prop_new:N \g__fontspec_rawvariations_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_new:N \g__fontspec_instance_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} { ^^J \tl_trim_spaces:n {#2} } } \cs_new:Nn \__fontspec_msg_new:nnn { \msg_new:nnxx {fontspec} {#1} { ^^J \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; this may be but usually is not a fontspec bug. Either there is a typo in the font name/file, the font is not installed (correctly), or there is a bug in the underlying font loading engine (XeTeX/luaotfload). } { 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 {no-opticals} { '#1' doesn't appear to have an Optical Size axis. } \__fontspec_msg_new:nn {script-not-exist} { Script '#2' not explicitly supported within font '#1'. Check the typeset output, and if it is okay then ignore this warning. Otherwise a different font should be chosen. } \__fontspec_msg_new:nn {language-not-exist} { Language '#1' not explicitly supported within font '\l_fontspec_fontname_tl' with script '\l__fontspec_script_name_tl'. Check the typeset output, and if it is okay then ignore this warning. Otherwise a different font should be chosen. } \__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 {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 {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 \cs_if_exist:cF {T@TU} { \__fontspec_warning:n {tu-clash} \DeclareFontEncoding{TU}{}{} \DeclareFontSubstitution{TU}{lmr}{m}{n} } \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 } \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 \prop_gput_if_not_in:Nnn {NeV} \cs_generate_variant:Nn \prop_gput:Nnn {Nxn} % needed by unicode-math \cs_generate_variant:Nn \tl_if_empty:nF {f} \cs_generate_variant:Nn \tl_if_eq:nnT {oe} %%^^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_new_conditional:Nnn \__fontspec_primitive_font_if_null:N {p,TF,T,F} { \ifx #1 \nullfont \prg_return_true: \else \prg_return_false: \fi } \prg_new_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_new_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_new_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:NnnnTF \font {#1} {\l__fontspec_lang_tl} {\l__fontspec_script_tl} {\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} \tl_set_eq:NN \l__fontspec_fontname_up_tl \l_fontspec_fontname_tl \tl_set_eq:NN \l__fontspec_basename_tl \l_fontspec_fontname_tl \__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_trim_spaces:N #1 \__fontspec_process_ext:N #1 } \cs_new:Nn \__fontspec_process_ext:N { \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} \__fontspec_font_is_file: \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} { \tl_set_eq:NN \l__fontspec_fontname_it_tl \l_fontspec_fontname_tl \tl_set_eq:NN \l__fontspec_fontname_bf_tl \l_fontspec_fontname_tl \tl_set_eq:NN \l__fontspec_fontname_bfit_tl \l_fontspec_fontname_tl } } \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:nTF { \l__fontspec_ext_filename_tl } { \file_input:n { \l__fontspec_ext_filename_tl } } { \tl_remove_all:Nn \l__fontspec_ext_filename_tl {~} \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_sanitise_fontname:Nn \l__fontspec_fontname_up_tl { \l__fontspec_fontname_up_tl } \__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:Npn \__fontspec_fontname_wrap:n ##1 { name: ##1 } } \cs_new:Nn \__fontspec_font_is_file: { \bool_set_true:N \l__fontspec_external_bool \bool_lazy_and:nnTF { \l__fontspec_external_kpse_bool } { \tl_if_empty_p:N \l__fontspec_font_path_tl } { \cs_set:Npn \__fontspec_fontname_wrap:n ##1 { kpse: ##1 } } { \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:ne {fontspec-opentype} {Script=\l__fontspec_script_name_tl} \keys_set:ne {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_known: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 \__fontspec_get_variations: } } \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_if_in:NnF \l_fontspec_fontname_tl {*} { \tl_replace_all:Nne #1 {*} {\l__fontspec_basename_tl} } } \cs_new:Nn \__fontspec_add_nfssfont:nnnn { \tl_set:Nx \l__fontspec_this_font_tl {#3} \tl_if_empty:eTF {#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:Nee \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:eF {#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 } \cs_if_eq:NNTF \l__fontspec_tmpa_font \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:neN {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:Nn \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:Nn \l__fontspec_nfss_sc_tl {#1 , \l__fontspec_sizing_leftover_clist , \l__fontspec_fontfeat_curr_clist} } } \cs_new:Nn \__fontspec_setup_nfss:Nn { \__fontspec_get_features:n { #2 } \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 \__fontspec_get_variations: } } } \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 \tl_if_empty:NF \l__fontspec_nfss_sc_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_ot_smallcaps:TF { \bool_set_false:N \l__fontspec_tmpa_bool \exp_args:Ne \clist_map_inline:nn { \l__fontspec_lang_tl , \g__fontspec_default_langs_clist } { \exp_args:Ne \clist_map_inline:nn { \l__fontspec_script_tl , \g__fontspec_default_scripts_clist } { \exp_args:No \__fontspec_check_ot_feat:NnnnT \l__fontspec_fontface_cs_tl {smcp} {##1} {####1} { \bool_set_true:N \l__fontspec_tmpa_bool \clist_map_break: } } } \bool_if:NTF \l__fontspec_tmpa_bool {#1} {#2} } \cs_new:Nn \__fontspec_make_smallcaps:TF { \bool_if:NTF \l__fontspec_ot_bool { \__fontspec_make_ot_smallcaps:TF {#1} {#2} } { \bool_if:NT \l__fontspec_atsui_bool { \exp_args:No \__fontspec_make_AAT_feature_string:NnnTF \l__fontspec_fontface_cs_tl {3} {3} {#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_generate_variant:Nn \tl_tail:n { e } \cs_new:Nn \__fontspec_format_axis:nn { , #1 = #2 } \cs_new:Nn \__fontspec_get_variations: { \tl_if_empty:NF \g__fontspec_instance_tl { instance = { \g__fontspec_instance_tl }; } \prop_if_empty:NF \g__fontspec_rawvariations_prop { axis = { \tl_tail:e { \prop_map_function:NN \g__fontspec_rawvariations_prop \__fontspec_format_axis:nn } }; } } \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} } \cs_new:Nn \__fontspec_init_fontface: { \tl_gclear:N \g__fontspec_rawfeatures_sclist \prop_gclear:N \g__fontspec_rawvariations_prop \tl_gclear:N \g__fontspec_instance_tl \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_variation_axis:nn { \keys_define:nn {fontspec-opentype} { #1 .code:n = { \prop_gput:Nnn \g__fontspec_rawvariations_prop { #2 } { ##1 } }, #1 .value_required:n = true, #1 .groups:n = {opentype}, } } \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 { \__fontspec_remove_clashing_featstr:x { #2 , \__fontspec_swap_plus_minus:n {#2} , #3 } \__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,F} { \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,F} { \__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:Nnnn {TF,T,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 \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} {} \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {KpseOnly} { \bool_set_true:N \l__fontspec_external_kpse_bool \bool_if:NT \l__fontspec_external_bool \__fontspec_font_is_file: } \__fontspec_keys_define_code:nnn {fontspec} {KpseOnly} {} \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:oeT \g__fontspec_curr_series_tl {\bfdefault} { \tl_set_eq:NN \l__fontspec_fontname_bf_tl \l__fontspec_curr_bfname_tl } \prop_put:NeV \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} } {MatchAveragecase} { \__fontspec_calc_scale:nn {5} {8} } } { \tl_set:Nx \l__fontspec_scale_tl {#1} } \__fontspec_info:n {set-scale} } \__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} } } \exp_args:NNNx \group_end: \tl_set:Nx \l__fontspec_scale_tl { \l__fontspec_scale_tl } } \cs_new:Nn \__fontspec_calc_scale:nn { \group_begin: \__fontspec_calc_scale:n {#1} \tl_set_eq:NN \l__fontspec_tmp_tl \l__fontspec_scale_tl \__fontspec_calc_scale:n {#2} \tl_set:Nx \l__fontspec_scale_tl { \fp_eval:n { (\l__fontspec_tmp_tl + \l__fontspec_scale_tl)/2 } } \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} { \color_if_exist:nTF {#1} { \tl_set:Nn \l__fontspec_hexcol_tl {#1} } { \cs_if_exist:cTF { \token_to_str:N \color@ #1 } { \convertcolorspec{named}{#1}{HTML}\l__fontspec_hexcol_tl } { \int_compare:nTF { \tl_count:n {#1} == 6 } { \tl_set:Nn \l__fontspec_hexcol_tl {#1} } { \int_compare:nTF { \tl_count:n {#1} == 8 } { \fontspec_parse_colour:viii #1 } { \bool_if:NF \l__fontspec_firsttime_bool { \__fontspec_warning:nx {bad-colour} {#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_define_opentype_variation_axis:nn {Weight} {wght} \__fontspec_define_opentype_variation_axis:nn {Width} {wdth} \__fontspec_define_opentype_variation_axis:nn {Slant} {slnt} \__fontspec_keys_define_code:nnn {fontspec} {OpticalSize} { \tl_set:Nn \l__fontspec_optical_size_tl {/ S = #1} } \__fontspec_keys_define_code:nnn {fontspec-opentype} {RawAxis} { \prop_gput_from_keyval:Nn \g__fontspec_rawvariations_prop {#1} } \__fontspec_keys_define_code:nnn {fontspec-opentype} {Instance} { \tl_gset:Nn \g__fontspec_instance_tl {#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} {} {} { +lower,-lower,+upper,-upper,+case,+cpsp, +smcp,+pcap,+c2sc,+c2pc,+unic,+rand, -smcp,-pcap,-c2sc,-c2pc,-unic,-rand } \keys_define:nn {fontspec-opentype} { Letters / Uppercase .code:n = { \__fontspec_make_OT_feature:nnn {} {+upper} {+lower} \__fontspec_make_OT_feature:nnn {} {+case} {} \__fontspec_make_OT_feature:nnn {} {+cpsp} {} }, } \__fontspec_define_opentype_feature:nnnnn {Letters} {UppercaseOff} {} {-upper} {+case,+cpsp} \__fontspec_define_opentype_feature:nnnnn {Letters} {UppercaseReset} {} {} {+upper,-upper} \__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Lowercase} {} {lower} {+upper,+case,+cpsp} \__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 { \__fontspec_info:nxx {script-not-exist} {\l_fontspec_fontname_tl} {#1} \clist_set:Nn \l_tmpa_clist {#2} \clist_get:NN \l_tmpa_clist \l__fontspec_script_tl \exp_args:Noo \__fontspec_check_script:NnF \l__fontspec_fontface_cs_tl \l__fontspec_script_tl { \tl_set:Nn \l__fontspec_script_name_tl {#1} \int_set:Nn \l__fontspec_script_int {\l__fontspec_strnum_int} \tl_gset:Nx \g__fontspec_single_feat_tl { script=\l__fontspec_script_tl } } } } } } \clist_new:N \g__fontspec_default_scripts_clist \cs_new:Nn \fontspec_default_script:n { \clist_gset:Nn \g__fontspec_default_scripts_clist {#1} } \fontspec_default_script:n {latn,DFLT} \keys_define:nn {fontspec-opentype} { Script / CustomDefault .code:n = { \bool_set_false:N \l__fontspec_scriptlang_exist_bool \clist_map_inline:Nn \g__fontspec_default_scripts_clist { \exp_args:No \__fontspec_check_script:NnT \l__fontspec_fontface_cs_tl {##1} { \tl_set:Nn \l__fontspec_script_name_tl {Default (##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 { \tl_clear:N \l__fontspec_script_name_tl } } } \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_info:nx {language-not-exist} {#1} \clist_set:Nn \l_tmpa_clist {#2} \clist_get:NN \l_tmpa_clist \l__fontspec_lang_tl \exp_args:Noo \__fontspec_check_lang:NnF \l__fontspec_fontface_cs_tl \l__fontspec_lang_tl { \tl_set:Nn \l__fontspec_lang_name_tl {#1} \int_set:Nn \l__fontspec_language_int {\l__fontspec_strnum_int} \tl_gset:Nx \g__fontspec_single_feat_tl { language=\l__fontspec_lang_tl } } } } } } \clist_new:N \g__fontspec_default_langs_clist \cs_new:Nn \fontspec_default_lang:n { \clist_gset:Nn \g__fontspec_default_langs_clist {#1} } \fontspec_default_lang:n {dflt} \__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{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{Kawi}{kawi} \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{Nag~Mundari}{nagm} \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_not_in:NeV \g__fontspec_strong_prop { \f@series } { \l__fontspec_strongdef_int } \prop_gput:Nen \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:NeNT \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:NeNTF \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_protected:Npn \reset@font { \normalfont \int_zero:N \l__fontspec_strong_int } \strongfontdeclare{\bfseries}