Current File : //usr/share/texlive/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty |
%%
%% This is file `fontspec-xetex.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% fontspec.dtx (with options: `fontspec,XE')
%% fontspec-code-load.dtx (with options: `fontspec,XE')
%% fontspec-code-vars.dtx (with options: `fontspec,XE')
%% fontspec-code-msg.dtx (with options: `fontspec,XE')
%% fontspec-code-opening.dtx (with options: `fontspec,XE')
%% fontspec-code-fontload.dtx (with options: `fontspec,XE')
%% fontspec-code-interfaces.dtx (with options: `fontspec,XE')
%% fontspec-code-user.dtx (with options: `fontspec,XE')
%% fontspec-code-api.dtx (with options: `fontspec,XE')
%% fontspec-code-internal.dtx (with options: `fontspec,XE')
%% fontspec-code-opentype.dtx (with options: `fontspec,XE')
%% fontspec-code-graphite.dtx (with options: `fontspec,XE')
%% fontspec-code-keyval.dtx (with options: `fontspec,XE')
%% fontspec-code-feat-opentype.dtx (with options: `fontspec,XE')
%% fontspec-code-scripts.dtx (with options: `fontspec,XE')
%% fontspec-code-lang.dtx (with options: `fontspec,XE')
%% fontspec-code-feat-aat.dtx (with options: `fontspec,XE')
%% fontspec-code-enc.dtx (with options: `fontspec,XE')
%% fontspec-code-math.dtx (with options: `fontspec,XE')
%% fontspec-code-closing.dtx (with options: `fontspec,XE')
%% fontspec-code-xfss.dtx (with options: `fontspec,XE')
%% ------------------------------------------------
%% The FONTSPEC package <wspr.io/fontspec>
%% ------------------------------------------------
%% 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): <http://www.latex-project.org/lppl/>.
%% ------------------------------------------------
%%^^A%% fontspec.dtx -- part of FONTSPEC <wspr.io/fontspec>
%%^^A%% Metadata for the package, including files and versioning
\RequirePackage{xparse}
\ProvidesExplPackage{fontspec-xetex}%
{2020/02/21}{2.7i}{Font selection for XeLaTeX and LuaLaTeX}
%%^^A%% fontspec-code-load.dtx -- part of FONTSPEC <wspr.io/fontspec>
%%^^A%% fontspec-code-vars.dtx -- part of FONTSPEC <wspr.io/fontspec>
\bool_new:N \l__fontspec_firsttime_bool
\bool_new:N \l__fontspec_nobf_bool
\bool_new:N \l__fontspec_noit_bool
\bool_new:N \l__fontspec_nosc_bool
\bool_new:N \l__fontspec_check_bool
\bool_new:N \l__fontspec_tfm_bool
\bool_new:N \l__fontspec_atsui_bool
\bool_new:N \l__fontspec_ot_bool
\bool_new:N \l__fontspec_mm_bool
\bool_new:N \l__fontspec_harfbuzz_bool
\bool_new:N \l__fontspec_graphite_bool
\bool_new:N \l__fontspec_fontcfg_bool
\bool_set_true:N \l__fontspec_fontcfg_bool
\bool_new:N \g__fontspec_math_euler_bool
\bool_new:N \g__fontspec_math_lucida_bool
\bool_new:N \g__fontspec_pkg_euler_loaded_bool
\bool_new:N \g__fontspec_cfg_bool
\bool_new:N \g__fontspec_math_bool
\bool_new:N \g__fontspec_euenc_bool
\bool_new:N \l__fontspec_tmpa_bool
\bool_new:N \l__fontspec_disable_defaults_bool
\bool_new:N \l__fontspec_alias_bool
\bool_new:N \l__fontspec_external_bool
\bool_new:N \l__fontspec_defining_encoding_bool
\bool_new:N \l__fontspec_scriptlang_exist_bool
\bool_new:N \g__fontspec_em_normalise_slant_bool
\bool_new:N \l__fontspec_proceed_bool
\bool_new:N \l__fontspec_never_check_bool
\int_new:N \l__fontspec_script_int
\int_new:N \l__fontspec_language_int
\int_new:N \l__fontspec_strnum_int
\int_new:N \l__fontspec_tmp_int
\int_new:N \l__fontspec_tmpa_int
\int_new:N \l__fontspec_tmpb_int
\int_new:N \l__fontspec_tmpc_int
\int_new:N \l__fontspec_em_int
\int_new:N \l__fontspec_emdef_int
\int_new:N \l__fontspec_strong_int
\int_new:N \l__fontspec_strongdef_int
\fp_new:N \l__fontspec_tmpa_fp
\fp_new:N \l__fontspec_tmpb_fp
\dim_new:N \l__fontspec_tmpa_dim
\dim_new:N \l__fontspec_tmpb_dim
\dim_new:N \l__fontspec_tmpc_dim
\seq_new:N \l__fontspec_bf_series_seq
\clist_new:N \g__fontspec_default_fontopts_clist
\clist_new:N \g__fontspec_all_keyval_modules_clist
\clist_new:N \l__fontspec_sizefeat_clist
\clist_set:Nn \l__fontspec_sizefeat_clist {Size={-}}
\clist_new:N \l__fontspec_extensions_clist
\clist_new:N \l__fontspec_fontopts_clist
\clist_new:N \l__fontspec_family_fontopts_clist
\clist_new:N \l__fontspec_all_features_clist
\clist_new:N \l__fontspec_leftover_clist
\clist_new:N \l__fontspec_keys_leftover_clist
\clist_new:N \l__fontspec_sizing_leftover_clist
\clist_new:N \l__fontspec_fontfeat_clist
\clist_new:N \l__fontspec_fontfeat_curr_clist
\clist_new:N \l__fontspec_arg_clist
\clist_new:N \l__fontspec_this_feat_clist
\clist_new:N \l__fontspec_fontfeat_up_clist
\clist_new:N \l__fontspec_fontfeat_bf_clist
\clist_new:N \l__fontspec_fontfeat_it_clist
\clist_new:N \l__fontspec_fontfeat_bfit_clist
\clist_new:N \l__fontspec_fontfeat_sl_clist
\clist_new:N \l__fontspec_fontfeat_bfsl_clist
\clist_new:N \l__fontspec_fontfeat_sc_clist
\prop_new:N \g__fontspec_fontopts_prop
\prop_new:N \l__fontspec_nfss_prop
\prop_new:N \l__fontspec_nfssfont_prop
\prop_new:N \g__fontspec_OT_features_prop
\prop_new:N \g__fontspec_all_opentype_feature_names_prop
\prop_new:N \g__fontspec_em_prop
\prop_new:N \g__fontspec_strong_prop
\prop_new:N \g__fontspec_fontid_family_prop
\prop_new:N \g__fontspec_family_int_prop
\tl_new:N \l_fontspec_family_tl
\tl_new:N \g_fontspec_encoding_tl
\tl_new:N \l_fontspec_fontname_tl
\tl_clear_new:N \UTFencname
\tl_clear_new:N \cyrillicencoding
\tl_clear_new:N \latinencoding
\tl_new:N \l__fontspec_renderer_tl
\tl_new:N \l__fontspec_mode_tl
\tl_new:N \l__fontspec_shaper_tl
\tl_new:N \g__fontspec_defined_shapes_tl
\tl_new:N \g__fontspec_single_feat_tl
\tl_new:N \l__fontspec_basename_tl
\tl_new:N \g__fontspec_curr_series_tl
\tl_new:N \l__fontspec_curr_fontname_tl
\tl_new:N \l__fontspec_curr_bfname_tl
\tl_new:N \l__fontspec_ext_filename_tl
\tl_new:N \l__fontspec_extension_tl
\tl_new:N \l__fontspec_font_path_tl
\tl_new:N \l__fontspec_fontid_tl
\tl_new:N \l__fontspec_fontname_tl
\tl_new:N \l__fontspec_options_tl
\tl_new:N \l__fontspec_saved_fontname_tl
\tl_new:N \l__fontspec_prev_unicode_name_tl
\tl_new:N \g__fontspec_nfss_enc_tl
\tl_new:N \g__fontspec_nfss_family_tl
\tl_new:N \l__fontspec_nfss_sc_tl
\tl_new:N \l__fontspec_nfss_tl
\tl_new:N \l__fontspec_nfss_fam_tl
\tl_new:N \l__fontspec_size_tl
\tl_new:N \l__fontspec_sizedfont_tl
\tl_new:N \l__fontspec_this_font_tl
\tl_new:N \l__fontspec_ttc_index_tl
\tl_new:N \l__fontspec_smcp_shape_tl
\tl_new:N \l__fontspec_emshape_query_tl
\tl_new:N \l__fontspec_em_switch_tl
\tl_new:N \l__fontspec_strong_switch_tl
\tl_new:N \l__fontspec_tmp_tl
\tl_new:N \l__fontspec_tmpa_tl
\tl_new:N \l__fontspec_tmpb_tl
\tl_new:N \l__fontspec_em_tmp_tl
\tl_new:N \l__fontspec_strong_tmp_tl
\tl_new:N \g__fontspec_mathrm_tl
\tl_new:N \g__fontspec_bfmathrm_tl
\tl_new:N \g__fontspec_mathsf_tl
\tl_new:N \g__fontspec_mathtt_tl
\tl_gset:Nn \g__fontspec_mathrm_tl {\rmdefault}
\tl_gset:Nn \g__fontspec_mathsf_tl {\sfdefault}
\tl_gset:Nn \g__fontspec_mathtt_tl {\ttdefault}
\tl_new:N \l__fontspec_family_label_tl
\tl_new:N \l__fontspec_fake_slant_tl
\tl_new:N \l__fontspec_fake_embolden_tl
\tl_new:N \l__fontspec_fontname_up_tl
\tl_new:N \l__fontspec_fontname_bf_tl
\tl_new:N \l__fontspec_fontname_it_tl
\tl_new:N \l__fontspec_fontname_bfit_tl
\tl_new:N \l__fontspec_fontname_sl_tl
\tl_new:N \l__fontspec_fontname_bfsl_tl
\tl_new:N \l__fontspec_fontname_sc_tl
\tl_new:N \l__fontspec_script_tl
\tl_new:N \l__fontspec_script_name_tl
\tl_set:Nn \l__fontspec_script_name_tl {CustomDefault}
\tl_new:N \l__fontspec_lang_tl
\tl_new:N \l__fontspec_lang_name_tl
\tl_set:Nn \l__fontspec_lang_name_tl {Default}
\tl_new:N \l__fontspec_scale_tl
\tl_new:N \l__fontspec_hyphenchar_tl
\tl_new:N \l__fontspec_hexcol_tl
\tl_new:N \l__fontspec_opacity_tl
\tl_new:N \l__fontspec_optical_size_tl
\tl_new:N \l__fontspec_mapping_tl
\tl_new:N \l__fontspec_punctspace_adjust_tl
\tl_new:N \l__fontspec_wordspace_adjust_tl
\tl_new:N \l__fontspec_postadjust_tl
\tl_const:Nn \c__fontspec_hexcol_tl {000000}
\tl_const:Nn \c__fontspec_opacity_tl {FF~}
\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 <wspr.io/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_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:nnn
{ \msg_new:nnx {#1} {#2} { \tl_trim_spaces:n {#3} } }
\cs_new:Nn \__fontspec_msg_new:nnnn
{ \msg_new:nnxx {#1} {#2} { \tl_trim_spaces:n {#3} } { \tl_trim_spaces:n {#4} } }
\char_set_catcode_space:n {32}
\__fontspec_msg_new:nnn {fontspec} {only-inside-encdef}
{
\exp_not:N#1can only be used in the second argument
to \string\DeclareUnicodeEncoding.
}
\__fontspec_msg_new:nnn {fontspec} {no-size-info}
{
Size information must be supplied.\\
For example, SizeFeatures={Size={8-12},...}.
}
\__fontspec_msg_new:nnnn {fontspec} {font-not-found}
{
The font "#1" cannot be found.
}
{
A font might not be found for many reasons.\\
Check the spelling, where the font is installed etc. etc.\\\\
When in doubt, ask someone for help!
}
\__fontspec_msg_new:nnnn {fontspec} {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:nnn {fontspec} {no-glyph}
{
'#1' does not contain glyph #2.
}
\__fontspec_msg_new:nnnn {fontspec} {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 <return> to proceed
with incorrect \string\mathit, \string\mathbf, etc.
}
\__fontspec_msg_new:nnnn {fontspec} {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:nnnn {fontspec} {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:nnnn {fontspec} {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:nnn {fontspec} {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:nnn {fontspec} {tu-missing}
{
The TU encoding seems to be missing; please update to the latest version of LaTeX2e.
}
\__fontspec_msg_new:nnn {fontspec} {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:nnn {fontspec} {feature-option-overwrite}
{
Option '#2' of font feature '#1' overwritten.
}
\__fontspec_msg_new:nnn {fontspec} {ot-tag-too-long}
{
OpenType tag '#1' is too long; script, language, and feature tags must be four characters or fewer.
}
\__fontspec_msg_new:nnn {fontspec} {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:nnn {fontspec} {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:nnn {fontspec} {icu-feature-not-exist}
{
'\l_keys_key_tl=\l_keys_value_tl' feature not supported
for OpenType font '\l_fontspec_fontname_tl'
}
\__fontspec_msg_new:nnn {fontspec} {icu-feature-not-exist-in-font}
{
OpenType feature '\l_keys_key_tl=\l_keys_value_tl' (#1) not available
for font '\l_fontspec_fontname_tl'
with script '\l__fontspec_script_name_tl' and language '\l__fontspec_lang_name_tl'.
}
\__fontspec_msg_new:nnn {fontspec} {no-opticals}
{
'#1' doesn't appear to have an Optical Size axis.
}
\__fontspec_msg_new:nnn {fontspec} {language-not-exist}
{
Language '#1' not available
for font '\l_fontspec_fontname_tl'
with script '\l__fontspec_script_name_tl'.
}
\__fontspec_msg_new:nnn {fontspec} {only-xetex-feature}
{
Ignored XeTeX-only feature: '#1'.
}
\__fontspec_msg_new:nnn {fontspec} {only-luatex-feature}
{
Ignored LuaTeX-only feature: '#1'.
}
\__fontspec_msg_new:nnn {fontspec} {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:nnn {fontspec} {no-mapping}
{
Input mapping not supported in LuaTeX.
}
\__fontspec_msg_new:nnn {fontspec} {no-mapping-ligtex}
{
Input mapping not supported in LuaTeX.\\
Use "Ligatures=TeX" instead of "Mapping=tex-text".
}
\__fontspec_msg_new:nnn {fontspec} {cm-default-obsolete}
{
The "cm-default" package option is obsolete.
}
\__fontspec_msg_new:nnn {fontspec} {font-index-needs-ttc}
{
The "FontIndex" feature is only supported by TTC (TrueType Collection) fonts.\\
Feature ignored.
}
\__fontspec_msg_new:nnn {fontspec} {feat-cannot-remove}
{
The "#1" feature cannot be deactivated. Request ignored.
}
\__fontspec_msg_new:nnn {fontspec} {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:nnn {fontspec} {no-font-shape}
{
Could not resolve font "#1" (it probably doesn't exist).
}
\__fontspec_msg_new:nnn {fontspec} {set-scale}
{
\l_fontspec_fontname_tl\space scale = \l__fontspec_scale_tl.
}
\__fontspec_msg_new:nnn {fontspec} {setup-math}
{
Adjusting the maths setup (use [no-math] to avoid this).
}
\__fontspec_msg_new:nnn {fontspec} {no-script}
{
Font "#1" does not contain requested Script "#2".
}
\__fontspec_msg_new:nnn {fontspec} {opa-twice}
{
Opacity set twice, in both Colour and Opacity.\\
Using specification "Opacity=#1".
}
\__fontspec_msg_new:nnn {fontspec} {opa-twice-col}
{
Opacity set twice, in both Opacity and Colour.\\
Using an opacity specification in hex of "#1/FF".
}
\__fontspec_msg_new:nnn {fontspec} {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 <wspr.io/fontspec>
\DeclareOption{cm-default}
{
\__fontspec_warning:n {cm-default-obsolete}
}
\DeclareOption {math} { \bool_gset_true:N \g__fontspec_math_bool }
\DeclareOption {no-math} { \bool_gset_false:N \g__fontspec_math_bool }
\DeclareOption {config} { \bool_gset_true:N \g__fontspec_cfg_bool }
\DeclareOption {no-config}{ \bool_gset_false:N \g__fontspec_cfg_bool }
\DeclareOption {euenc} { \bool_gset_true:N \g__fontspec_euenc_bool }
\DeclareOption {tuenc} { \bool_gset_false:N \g__fontspec_euenc_bool }
\DeclareOption {quiet}
{
\msg_redirect_module:nnn { fontspec } { warning } { info }
\msg_redirect_module:nnn { fontspec } { info } { none }
}
\DeclareOption{silent}
{
\msg_redirect_module:nnn { fontspec } { warning } { none }
\msg_redirect_module:nnn { fontspec } { info } { none }
}
\ExecuteOptions{config,math,tuenc}
\ProcessOptions*
\bool_if:NF \g__fontspec_euenc_bool
{
\file_if_exist:nTF {tuenc.def}
{
\cs_if_exist:cF {T@TU}
{
\__fontspec_warning:n {tu-clash}
\DeclareFontEncoding{TU}{}{}
\DeclareFontSubstitution{TU}{lmr}{m}{n}
}
}
{
\__fontspec_warning:n {tu-missing}
\bool_gset_true:N \g__fontspec_euenc_bool
}
}
\bool_if:NTF \g__fontspec_euenc_bool
{
\tl_gset:Nn \g_fontspec_encoding_tl {EU1}
}
{ \tl_gset:Nn \g_fontspec_encoding_tl { TU } }
\tl_set:Nn \rmdefault {lmr}
\tl_set:Nn \sfdefault {lmss}
\tl_set:Nn \ttdefault {lmtt}
\RequirePackage[\g_fontspec_encoding_tl]{fontenc}
\tl_set_eq:NN \UTFencname \g_fontspec_encoding_tl % for xunicode if needed
\tl_if_in:NnT \@filelist {.cls} { \normalsize }
\tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl
\tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl
\AtBeginDocument
{
\tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl
\tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl
}
\bool_if:NT \g__fontspec_euenc_bool
{
\RequirePackage{xunicode}
}
\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_generate_variant:Nn \int_set:Nn {Nv}
\cs_generate_variant:Nn \keys_set:nn {nx}
\cs_generate_variant:Nn \keys_set_known:nnN {nx}
\cs_generate_variant:Nn \prop_put:Nnn {Nxx}
\cs_generate_variant:Nn \prop_put:Nnn {NxV}
\cs_generate_variant:Nn \prop_gput_if_new:Nnn {NxV}
\cs_generate_variant:Nn \prop_gput:Nnn {Nxn}
\cs_generate_variant:Nn \prop_get:NnNT {NxN}
\cs_generate_variant:Nn \prop_get:NnNTF {NxN}
\cs_generate_variant:Nn \str_if_eq:nnTF {nv}
\cs_generate_variant:Nn \tl_if_empty_p:n {e}
\cs_generate_variant:Nn \tl_if_empty:nTF {x}
\cs_generate_variant:Nn \tl_if_empty:nF {x}
\cs_generate_variant:Nn \tl_if_empty:nF {f}
\cs_generate_variant:Nn \tl_if_eq:nnT {ox}
\cs_generate_variant:Nn \tl_replace_all:Nnn {Nnx}
%%^^A%% fontspec-code-fontload.dtx -- part of FONTSPEC <wspr.io/fontspec>
\cs_set:Npn \__fontspec_primitive_font_set:Nnn #1#2#3
{
\font #1 = #2 ~at~ \dim_eval:n {#3} \scan_stop:
}
\cs_set:Npn \__fontspec_primitive_font_gset:Nnn #1#2#3
{
\global \font #1 = #2 ~at~ \dim_eval:n {#3} \scan_stop:
}
\cs_set:Npn \__fontspec_font_suppress_not_found_error:
{
\int_set:Nn \suppressfontnotfounderror {1}
}
\prg_set_conditional:Nnn \__fontspec_primitive_font_if_null:N {p,TF,T,F}
{
\ifx #1 \nullfont
\prg_return_true:
\else
\prg_return_false:
\fi
}
\prg_set_conditional:Nnn \__fontspec_primitive_font_set:Nnn {TF,T,F}
{
\__fontspec_primitive_font_set:Nnn #1 {#2} {#3}
\__fontspec_primitive_font_if_null:NTF #1 {\prg_return_false:} {\prg_return_true:}
}
\prg_set_conditional:Nnn \__fontspec_primitive_font_gset:Nnn {TF,T,F}
{
\__fontspec_primitive_font_gset:Nnn #1 {#2} {#3}
\__fontspec_primitive_font_if_null:NTF #1 {\prg_return_false:} {\prg_return_true:}
}
\cs_set:Npn \__fontspec_primitive_font_set:Onn { \exp_last_unbraced:No \__fontspec_primitive_font_set:Nnn }
\cs_set:Npn \__fontspec_primitive_font_set:OnnF { \exp_last_unbraced:No \__fontspec_primitive_font_set:NnnF }
\cs_set:Npn \__fontspec_primitive_font_gset:Onn { \exp_last_unbraced:No \__fontspec_primitive_font_gset:Nnn }
\cs_set:Npn \__fontspec_primitive_font_gset:OnnF { \exp_last_unbraced:No \__fontspec_primitive_font_gset:NnnF }
\prg_set_conditional:Nnn \__fontspec_primitive_font_if_exist:n {TF,T,F}
{
\group_begin:
\__fontspec_font_suppress_not_found_error:
\__fontspec_primitive_font_set:Nnn \l__fontspec_primitive_font {#1} { \f@size pt - 1sp }
\__fontspec_primitive_font_if_null:NTF \l__fontspec_primitive_font
{ \group_end: \prg_return_false: }
{ \group_end: \prg_return_true: }
}
\prg_new_conditional:Nnn \__fontspec_primitive_font_glyph_if_exist:Nn {p,TF,T,F}
{
\tex_iffontchar:D #1 #2 \scan_stop:
\prg_return_true:
\else:
\prg_return_false:
\fi:
}
\cs_new:Nn \__fontspec_primitive_font_set_hyphenchar:Nn
{
\tex_hyphenchar:D #1 = #2 \scan_stop:
}
\cs_new_eq:NN \__fontspec_primitive_font_get_name:N \fontname
\cs_new:Npn \__fontspec_primitive_font_current_name:
{
\__fontspec_primitive_font_get_name:N \tex_font:D
}
%%^^A%% fontspec-code-interfaces.dtx -- part of FONTSPEC <wspr.io/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 <wspr.io/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 {#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 {#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 {#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 {#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 <wspr.io/fontspec>
\prg_new_conditional:Nnn \fontspec_if_fontspec_font: {TF,T,F}
{
\cs_if_exist:cTF {g__fontspec_fontinfo_ \f@family _prop} \prg_return_true: \prg_return_false:
}
\prg_new_conditional:Nnn \fontspec_if_aat_feature:nn {TF,T,F}
{
\fontspec_if_fontspec_font:TF
{
\__fontspec_set_font_type:N \font
\bool_if:NTF \l__fontspec_atsui_bool
{
\__fontspec_make_AAT_feature_string:NnnTF \font {#1} {#2}
\prg_return_true: \prg_return_false:
}
{
\prg_return_false:
}
}
{
\prg_return_false:
}
}
\prg_new_conditional:Nnn \fontspec_if_opentype: {TF,T,F}
{
\fontspec_if_fontspec_font:TF
{
\__fontspec_set_font_type:N \font
\bool_if:NTF \l__fontspec_ot_bool \prg_return_true: \prg_return_false:
}
{
\prg_return_false:
}
}
\prg_new_conditional:Nnn \fontspec_if_feature:n {TF,T,F}
{
\fontspec_if_fontspec_font:TF
{
\__fontspec_set_font_type:N \font
\bool_if:NTF \l__fontspec_ot_bool
{
\prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-num} \l__fontspec_tmp_tl
\int_set:Nn \l__fontspec_script_int {\l__fontspec_tmp_tl}
\prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {lang-num} \l__fontspec_tmp_tl
\int_set:Nn \l__fontspec_language_int {\l__fontspec_tmp_tl}
\prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-tag} \l__fontspec_script_tl
\prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {lang-tag} \l__fontspec_lang_tl
\__fontspec_check_ot_feat:NnTF \font {#1} {\prg_return_true:} {\prg_return_false:}
}
{
\prg_return_false:
}
}
{
\prg_return_false:
}
}
\prg_new_conditional:Nnn \fontspec_if_feature:nnn {TF,T,F}
{
\fontspec_if_fontspec_font:TF
{
\__fontspec_set_font_type:N \font
\bool_if:NTF \l__fontspec_ot_bool
{
\__fontspec_check_ot_feat:NnnnTF \font {#3} {#2} {#1} \prg_return_true: \prg_return_false:
}
{ \prg_return_false: }
}
{ \prg_return_false: }
}
\prg_new_conditional:Nnn \fontspec_if_script:n {TF,T,F}
{
\fontspec_if_fontspec_font:TF
{
\__fontspec_set_font_type:N \font
\bool_if:NTF \l__fontspec_ot_bool
{
\__fontspec_check_script:NnTF \font {#1} \prg_return_true: \prg_return_false:
}
{ \prg_return_false: }
}
{ \prg_return_false: }
}
\prg_new_conditional:Nnn \fontspec_if_language:n {TF,T,F}
{
\fontspec_if_fontspec_font:TF
{
\__fontspec_set_font_type:N \font
\bool_if:NTF \l__fontspec_ot_bool
{
\prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-num} \l__fontspec_tmp_tl
\int_set:Nn \l__fontspec_script_int {\l__fontspec_tmp_tl}
\prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-tag} \l__fontspec_script_tl
\__fontspec_check_lang:NnTF \font {#1} \prg_return_true: \prg_return_false:
}
{ \prg_return_false: }
}
{ \prg_return_false: }
}
\prg_new_conditional:Nnn \fontspec_if_language:nn {TF,T,F}
{
\fontspec_if_fontspec_font:TF
{
\__fontspec_set_font_type:N \font
\bool_if:NTF \l__fontspec_ot_bool
{
\__fontspec_check_lang:NnnTF \font {#2} {#1} \prg_return_true: \prg_return_false:
}
{ \prg_return_false: }
}
{ \prg_return_false: }
}
\prg_new_conditional:Nnn \fontspec_if_current_script:n {TF,T,F}
{
\fontspec_if_fontspec_font:TF
{
\__fontspec_set_font_type:N \font
\bool_if:NTF \l__fontspec_ot_bool
{
\prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-tag} \l__fontspec_tmp_tl
\str_if_eq:nVTF {#1} \l__fontspec_tmp_tl
{\prg_return_true:} {\prg_return_false:}
}
{ \prg_return_false: }
}
{ \prg_return_false: }
}
\prg_new_conditional:Nnn \fontspec_if_current_language:n {TF,T,F}
{
\fontspec_if_fontspec_font:TF
{
\__fontspec_set_font_type:N \font
\bool_if:NTF \l__fontspec_ot_bool
{
\prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {lang-tag} \l__fontspec_tmp_tl
\str_if_eq:nVTF {#1} \l__fontspec_tmp_tl
{\prg_return_true:} {\prg_return_false:}
}
{ \prg_return_false: }
}
{ \prg_return_false: }
}
\cs_new:Nn \__fontspec_tl_new_if_free:N { \tl_if_exist:NF #1 { \tl_new:N #1 } }
\cs_new:Nn \__fontspec_set_family:NnnN
{
\tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} % reset
\tl_set:Nn \l__fontspec_family_label_tl {#1}
\__fontspec_select_font_family:nn {#2} {#3}
\__fontspec_tl_new_if_free:N #1
#4 #1 \l_fontspec_family_tl
\tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} % reset
}
\cs_new:Nn \fontspec_gset_family:Nnn { \__fontspec_set_family:NnnN #1 {#2} {#3} \tl_gset_eq:NN }
\cs_new:Nn \fontspec_set_family:Nnn { \__fontspec_set_family:NnnN #1 {#2} {#3} \tl_set_eq:NN }
\cs_generate_variant:Nn \fontspec_set_family:Nnn {c}
\tl_new:N \l__fontspec_fontface_cs_tl
\tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font}
\cs_new:Nn \__fontspec_set_fontface:NNnnN
{
\tl_set:Nn \l__fontspec_fontface_cs_tl {#1}
\tl_set:Nn \l__fontspec_family_label_tl {#2}
\__fontspec_select_font_family:nn {#3} {#4}
#5 #2 \l_fontspec_family_tl
\tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} % reset
}
\cs_new:Nn \fontspec_gset_fontface:NNnn { \__fontspec_set_fontface:NNnnN #1 #2 {#3} {#4} \tl_gset_eq:NN }
\cs_new:Nn \fontspec_set_fontface:NNnn { \__fontspec_set_fontface:NNnnN #1 #2 {#3} {#4} \tl_set_eq:NN }
\prg_new_conditional:Nnn \fontspec_font_if_exist:n {TF,T,F}
{
\group_begin:
\__fontspec_init:
\__fontspec_if_detect_external:nT {#1} { \__fontspec_font_is_file: }
\__fontspec_primitive_font_if_exist:nTF { \__fontspec_construct_font_call:nn {#1} {} }
{ \group_end: \prg_return_true: }
{ \group_end: \prg_return_false: }
}
\cs_set_eq:NN \IfFontExistsTF \fontspec_font_if_exist:nTF
\prg_new_conditional:Nnn \fontspec_if_current_feature:n {TF,T,F}
{
\exp_args:Nxx \tl_if_in:nnTF
{ \__fontspec_primitive_font_current_name: } { \tl_to_str:n {#1} }
{ \prg_return_true: } { \prg_return_false: }
}
\prg_new_conditional:Nnn \fontspec_if_small_caps: {TF,T,F}
{
\__fontspec_if_merge_shape:nTF {sc}
{
\tl_set_eq:Nc \l__fontspec_smcp_shape_tl { \__fontspec_shape_merge:nn {\f@shape} {sc} }
}
{
\tl_set:Nn \l__fontspec_smcp_shape_tl {sc}
}
\cs_if_exist:cTF { \f@encoding/\f@family/\f@series/\l__fontspec_smcp_shape_tl }
{
\tl_if_eq:ccTF
{ \f@encoding/\f@family/\f@series/\l__fontspec_smcp_shape_tl }
{ \f@encoding/\f@family/\f@series/\shapedefault }
{ \prg_return_false: }
{ \prg_return_true: }
}
{ \prg_return_false: }
}
%%^^A%% fontspec-code-internal.dtx -- part of FONTSPEC <wspr.io/fontspec>
\cs_new_protected:Nn \__fontspec_select_font_family:nn
{
\group_begin:
\__fontspec_font_suppress_not_found_error:
\__fontspec_init:
\__fontspec_sanitise_fontname:Nn \l_fontspec_fontname_tl {#2}
\__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_up_tl {#2}
\__fontspec_sanitise_fontname:Nn \l__fontspec_basename_tl {#2}
\__fontspec_if_detect_external:nT {#2}
{ \keys_set:nn {fontspec-preparse-external} {Path} }
\keys_set_known:nn {fontspec-preparse-cfg} {#1}
\__fontspec_init_ttc:n {#2}
\__fontspec_load_external_fontoptions:Nn \l_fontspec_fontname_tl {#2}
\__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}
\clist_map_inline:Nn \l__fontspec_extensions_clist
{
\tl_if_in:NnT #1 {##1}
{
\tl_remove_once:Nn #1 {##1}
\tl_set:Nn \l__fontspec_extension_tl {##1}
\clist_map_break:
}
}
}
\prg_new_conditional:Nnn \__fontspec_if_detect_external:n {T}
{
\clist_map_inline:Nn \l__fontspec_extensions_clist
{
\bool_set_false:N \l__fontspec_tmpa_bool
\exp_args:Nx % <- this should be handled earlier
\tl_if_in:nnT {#1 <= end_of_string} {##1 <= end_of_string}
{ \bool_set_true:N \l__fontspec_tmpa_bool \clist_map_break: }
}
\bool_if:NTF \l__fontspec_tmpa_bool \prg_return_true: \prg_return_false:
}
\cs_new:Nn \__fontspec_init_ttc:n
{
\str_if_eq:eeT { \str_lowercase:f {\l__fontspec_extension_tl} } {.ttc}
{
\__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_it_tl {#1}
\__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_bf_tl {#1}
\__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_bfit_tl {#1}
}
}
\cs_new:Nn \__fontspec_load_external_fontoptions:Nn
{
\bool_if:NT \l__fontspec_fontcfg_bool
{
\__fontspec_sanitise_fontname:Nn #1 {#2}
\tl_set:Nx \l__fontspec_ext_filename_tl {#1.fontspec}
\tl_remove_all:Nn \l__fontspec_ext_filename_tl {~}
\prop_if_in:NVF \g__fontspec_fontopts_prop #1
{
\exp_args:No \file_if_exist:nT { \l__fontspec_ext_filename_tl }
{ \file_input:n { \l__fontspec_ext_filename_tl } }
}
}
}
\cs_new:Nn \__fontspec_extract_all_features:n
{
\bool_if:NTF \l__fontspec_disable_defaults_bool
{
\clist_set:Nx \l__fontspec_all_features_clist {#1}
}
{
\prop_get:NVNF \g__fontspec_fontopts_prop \l_fontspec_fontname_tl \l__fontspec_fontopts_clist
{ \clist_clear:N \l__fontspec_fontopts_clist }
\prop_get:NVNF \g__fontspec_fontopts_prop \l__fontspec_family_label_tl \l__fontspec_family_fontopts_clist
{ \clist_clear:N \l__fontspec_family_fontopts_clist }
\tl_clear:N \l__fontspec_family_label_tl
\clist_set:Nx \l__fontspec_all_features_clist
{
\g__fontspec_default_fontopts_clist,
\l__fontspec_family_fontopts_clist,
\l__fontspec_fontopts_clist,
#1
}
}
}
\cs_new:Nn \__fontspec_preparse_features:
{
\__fontspec_keys_set_known:nxN {fontspec-preparse-external}
{ \l__fontspec_all_features_clist }
\l__fontspec_keys_leftover_clist
\tl_set_eq:NN \l_fontspec_fontname_tl \l__fontspec_fontname_up_tl
\__fontspec_keys_set_known:nxN {fontspec-renderer} {\l__fontspec_keys_leftover_clist}
\l__fontspec_keys_leftover_clist
\__fontspec_keys_set_known:nxN {fontspec-preparse} {\l__fontspec_keys_leftover_clist}
\l__fontspec_fontfeat_clist
}
\cs_new:Nn \__fontspec_load_font:
{
\__fontspec_primitive_font_set:NnnF \l__fontspec_test_font
{ \__fontspec_construct_font_call:nn { \l__fontspec_fontname_up_tl } { \l__fontspec_pre_feat_sclist } }
{ \f@size pt - 2sp }
{ \__fontspec_error:nx {font-not-found} {\l__fontspec_fontname_up_tl} }
\__fontspec_set_font_type:N \l__fontspec_test_font
\__fontspec_primitive_font_gset:Onn \l__fontspec_fontface_cs_tl
{ \__fontspec_construct_font_call:nn { \l__fontspec_fontname_up_tl } { \l__fontspec_pre_feat_sclist } }
{ \f@size pt + 2sp }
\l__fontspec_fontface_cs_tl % this is necessary for LuaLaTeX to check the scripts properly
}
\cs_new:Nn \__fontspec_construct_font_call:nnnnnn
{
" \__fontspec_fontname_wrap:n { #1 #2 #3 }
#4 #5
\str_if_eq:eeF {#6}{} {:#6} "
}
\cs_new:Nn \__fontspec_construct_font_call:nn
{
\__fontspec_construct_font_call:nnnnnn
{#1}
\l__fontspec_extension_tl
\l__fontspec_ttc_index_tl
\l__fontspec_renderer_tl
\l__fontspec_optical_size_tl
{#2}
}
\cs_new:Nn \__fontspec_font_is_name:
{
\cs_set_eq:NN \__fontspec_fontname_wrap:n \use:n
}
\cs_new:Nn \__fontspec_font_is_file:
{
\cs_set:Npn \__fontspec_fontname_wrap:n ##1 { [ \l__fontspec_font_path_tl ##1 ] }
}
\cs_new:Nn \__fontspec_set_scriptlang:
{
\bool_if:NT \l__fontspec_firsttime_bool
{
\tl_if_empty:NF \l__fontspec_script_name_tl
{
\keys_set:nx {fontspec-opentype} {Script=\l__fontspec_script_name_tl}
\keys_set:nx {fontspec-opentype} {Language=\l__fontspec_lang_name_tl}
}
}
}
\cs_new:Nn \__fontspec_get_features:n
{
\__fontspec_init_fontface:
\__fontspec_keys_set_known:nxN {fontspec-renderer} {\l__fontspec_fontfeat_clist,#1}
\l__fontspec_keys_leftover_clist
\__fontspec_keys_set_known:nxN {fontspec} {\l__fontspec_keys_leftover_clist} \l__fontspec_keys_leftover_clist
\bool_if:NTF \l__fontspec_ot_bool
{
\keys_set:nV {fontspec-opentype} \l__fontspec_keys_leftover_clist
}
{
\bool_if:nT { \l__fontspec_atsui_bool || \l__fontspec_graphite_bool }
{ \keys_set:nV {fontspec-aat} \l__fontspec_keys_leftover_clist }
}
\tl_if_empty:NF \l__fontspec_mapping_tl
{ \__fontspec_update_featstr:n { mapping = \l__fontspec_mapping_tl } }
\str_if_eq:eeF { \l__fontspec_hexcol_tl \l__fontspec_opacity_tl }
{ \c__fontspec_hexcol_tl \c__fontspec_opacity_tl }
{ \__fontspec_update_featstr:n { color = \l__fontspec_hexcol_tl\l__fontspec_opacity_tl } }
}
\prg_new_conditional:Nnn \__fontspec_save_family_needed:n { TF }
{
\tl_if_empty:NTF \l__fontspec_nfss_fam_tl
{
\prop_get:NVNTF \g__fontspec_fontid_family_prop \l__fontspec_fontid_tl \l__fontspec_tmp_tl
{
\tl_gset_eq:NN \g__fontspec_nfss_family_tl \l__fontspec_tmp_tl
\prg_return_false:
}
{
\tl_set:Nx \l__fontspec_tmp_tl {#1}
\tl_remove_all:Nn \l__fontspec_tmp_tl { ~ }
\__fontspec_save_fontid_family:VV \l__fontspec_fontid_tl \l__fontspec_tmp_tl
\prg_return_true:
}
}
{
\tl_gset_eq:NN \g__fontspec_nfss_family_tl \l__fontspec_nfss_fam_tl
\cs_undefine:c { g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop }
\prg_return_true:
}
}
\cs_new:Nn \__fontspec_save_fontid_family:nn
{
\prop_get:NnNTF \g__fontspec_family_int_prop {#2} \l__fontspec_tmp_tl
{
\tl_set:Nx \l__fontspec_tmp_tl
{ \int_eval:n { \l__fontspec_tmp_tl + 1 } }
}
{ \tl_set:Nn \l__fontspec_tmp_tl { 0 } }
\prop_gput:NnV \g__fontspec_family_int_prop {#2} \l__fontspec_tmp_tl
\tl_gset:Nx \g__fontspec_nfss_family_tl { #2 ( \l__fontspec_tmp_tl ) }
\prop_gput:NnV \g__fontspec_fontid_family_prop {#1} \g__fontspec_nfss_family_tl
}
\cs_generate_variant:Nn \__fontspec_save_fontid_family:nn { VV }
\cs_new:Nn \__fontspec_save_family:nn
{
\__fontspec_save_fontinfo:n {#2}
\__fontspec_find_autofonts:
\DeclareFontFamily{\g__fontspec_nfss_enc_tl}{\g__fontspec_nfss_family_tl}{}
\__fontspec_set_faces:
\__fontspec_info:nxx {defining-font} {#1} {#2}
}
\cs_new:Nn \__fontspec_save_fontinfo:n
{
\prop_new:c {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop}
\prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {fontname} { #1 }
\prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {options} { \l__fontspec_all_features_clist }
\prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {fontdef}
{
\__fontspec_construct_font_call:nn {\l_fontspec_fontname_tl}
{ \l__fontspec_pre_feat_sclist \g__fontspec_rawfeatures_sclist }
}
\prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {script-num} \l__fontspec_script_int
\prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {lang-num} \l__fontspec_language_int
\prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {script-tag} \l__fontspec_script_tl
\prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {lang-tag} \l__fontspec_lang_tl
}
\cs_new:Nn \__fontspec_find_autofonts:
{
\bool_if:nF {\l__fontspec_noit_bool || \l__fontspec_nobf_bool}
{
\__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l__fontspec_fontname_it_tl} {/B}
\__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l__fontspec_fontname_bf_tl} {/I}
\__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l_fontspec_fontname_tl} {/BI}
}
\bool_if:NF \l__fontspec_nobf_bool
{
\__fontspec_set_autofont:Nnn \l__fontspec_fontname_bf_tl {\l_fontspec_fontname_tl} {/B}
}
\bool_if:NF \l__fontspec_noit_bool
{
\__fontspec_set_autofont:Nnn \l__fontspec_fontname_it_tl {\l_fontspec_fontname_tl} {/I}
}
\__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfsl_tl {\l__fontspec_fontname_sl_tl} {/B}
}
\cs_new:Nn \__fontspec_set_faces:
{
\__fontspec_add_nfssfont:nnnn \mddefault \shapedefault \l_fontspec_fontname_tl \l__fontspec_fontfeat_up_clist
\__fontspec_add_nfssfont:nnnn \bfdefault \shapedefault \l__fontspec_fontname_bf_tl \l__fontspec_fontfeat_bf_clist
\__fontspec_add_nfssfont:nnnn \mddefault \itdefault \l__fontspec_fontname_it_tl \l__fontspec_fontfeat_it_clist
\__fontspec_add_nfssfont:nnnn \mddefault \sldefault \l__fontspec_fontname_sl_tl \l__fontspec_fontfeat_sl_clist
\__fontspec_add_nfssfont:nnnn \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
\prop_map_inline:Nn \l__fontspec_nfssfont_prop { \__fontspec_set_faces_aux:nnnnn ##2 }
}
\cs_new:Nn \__fontspec_set_faces_aux:nnnnn
{
\fontspec_complete_fontname:Nn \l__fontspec_curr_fontname_tl {#3}
\__fontspec_make_font_shapes:Nnnnn \l__fontspec_curr_fontname_tl {#1} {#2} {#4} {#5}
}
\cs_new:Nn \fontspec_complete_fontname:Nn
{
\tl_set:Nx #1 {#2}
\tl_replace_all:Nnx #1 {*} {\l__fontspec_basename_tl}
}
\cs_new:Nn \__fontspec_add_nfssfont:nnnn
{
\tl_set:Nx \l__fontspec_this_font_tl {#3}
\tl_if_empty:xTF {#4}
{ \clist_set:Nn \l__fontspec_sizefeat_clist {Size={-}} }
{ \__fontspec_keys_set_known:nxN {fontspec-preparse-nested} {#4} \l__fontspec_tmp_tl }
\tl_if_empty:NF \l__fontspec_this_font_tl
{
\prop_put:Nxx \l__fontspec_nfssfont_prop {#1/#2}
{ {#1}{#2}{\l__fontspec_this_font_tl}{#4}{\l__fontspec_sizefeat_clist} }
}
}
\cs_new:Nn \__fontspec_set_font_type:N
{
\bool_set_false:N \l__fontspec_tfm_bool
\bool_set_false:N \l__fontspec_atsui_bool
\bool_set_false:N \l__fontspec_ot_bool
\bool_set_false:N \l__fontspec_mm_bool
\bool_set_false:N \l__fontspec_graphite_bool
\ifcase\XeTeXfonttype #1
\bool_set_true:N \l__fontspec_tfm_bool
\or
\bool_set_true:N \l__fontspec_atsui_bool
\tl_if_empty:NT \l__fontspec_renderer_tl { \tl_set:Nn \l__fontspec_renderer_tl {/AAT} }
\ifnum\XeTeXcountvariations #1 > 0\relax
\bool_set_true:N \l__fontspec_mm_bool
\fi
\or
\bool_set_true:N \l__fontspec_ot_bool
\tl_if_empty:NT \l__fontspec_renderer_tl { \tl_set:Nn \l__fontspec_renderer_tl {/OT} }
\or
\bool_set_true:N \l__fontspec_graphite_bool
\tl_if_empty:NT \l__fontspec_renderer_tl { \tl_set:Nn \l__fontspec_renderer_tl {/GR} }
\fi
}
\cs_new:Nn \__fontspec_set_autofont:Nnn
{
\bool_if:NF \l__fontspec_external_bool
{
\tl_if_empty:xF {#2}
{
\tl_if_empty:NT #1
{
\__fontspec_if_autofont:nnTF {#2} {#3}
{ \tl_set:Nx #1 {#2#3} }
{ \__fontspec_info:nx {no-font-shape} {#2#3} }
}
}
}
}
\prg_new_conditional:Nnn \__fontspec_if_autofont:nn {T,TF}
{
\group_begin:
\__fontspec_primitive_font_set:Nnn \l__fontspec_tmpa_font { \__fontspec_construct_font_call:nn {#1} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 1sp }
\__fontspec_primitive_font_set:Nnn \l__fontspec_tmpb_font { \__fontspec_construct_font_call:nn {#1#2} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 1sp }
\str_if_eq:eeTF { \__fontspec_primitive_font_get_name:N \l__fontspec_tmpa_font } { \__fontspec_primitive_font_get_name:N \l__fontspec_tmpb_font }
{ \group_end: \prg_return_false: }
{ \group_end: \prg_return_true: }
}
\cs_new:Nn \__fontspec_make_font_shapes:Nnnnn
{
\group_begin:
\__fontspec_keys_set_known:nxN {fontspec-preparse-external} { #4 } \l__fontspec_leftover_clist
\__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {#1}
\__fontspec_declare_shape:nnxx {#2} {#3} { \l__fontspec_fontopts_clist, \l__fontspec_leftover_clist } {#5}
\group_end:
}
\cs_new:Nn \__fontspec_load_fontname:Nn
{
\__fontspec_load_external_fontoptions:Nn #1 {#2}
\prop_get:NVNF \g__fontspec_fontopts_prop #1 \l__fontspec_fontopts_clist
{ \clist_clear:N \l__fontspec_fontopts_clist }
\keys_set_groups:nnV {fontspec/fontname} {getfontname} \l__fontspec_fontopts_clist
\__fontspec_primitive_font_set:OnnF \l__fontspec_fontface_cs_tl
{ \__fontspec_construct_font_call:nn {#1} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 2sp }
{ \__fontspec_error:nx {font-not-found} {#2} }
}
\keys_define:nn {fontspec/fontname}
{
Font .tl_set:N = \l_fontspec_fontname_tl ,
Font .groups:n = {getfontname} ,
}
\cs_new:Nn \__fontspec_declare_shape:nnnn
{
\tl_build_begin:N \l__fontspec_nfss_tl
\tl_build_begin:N \l__fontspec_nfss_sc_tl
\tl_set_eq:NN \l__fontspec_saved_fontname_tl \l_fontspec_fontname_tl
\exp_args:Nx \clist_map_inline:nn {#4} { \__fontspec_setup_single_size:nn {#3} {##1} }
\tl_build_end:N \l__fontspec_nfss_tl
\tl_build_end:N \l__fontspec_nfss_sc_tl
\__fontspec_declare_shapes_normal:nn {#1} {#2}
\__fontspec_declare_shapes_smcaps:nn {#1} {#2}
\__fontspec_declare_shape_slanted:nn {#1} {#2}
\__fontspec_declare_shapes_bx:nn {#1} {#2}
\__fontspec_declare_shape_loginfo:nn {#1} {#2}
}
\cs_generate_variant:Nn \__fontspec_declare_shape:nnnn {nnxx}
\cs_new:Nn \__fontspec_setup_single_size:nn
{
\tl_clear:N \l__fontspec_size_tl
\tl_set_eq:NN \l__fontspec_sizedfont_tl \l__fontspec_saved_fontname_tl % in case not spec'ed
\keys_set_known:nxN {fontspec-sizing} { \exp_after:wN \use:n #2 }
\l__fontspec_sizing_leftover_clist
\tl_if_empty:NT \l__fontspec_size_tl { \__fontspec_error:n {no-size-info} }
% "normal"
\__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_sizedfont_tl}
\__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_tl {#1} {\l__fontspec_sizing_leftover_clist} {}
% small caps
\clist_set_eq:NN \l__fontspec_fontfeat_curr_clist \l__fontspec_fontfeat_sc_clist
\bool_if:NF \l__fontspec_nosc_bool
{
\tl_if_empty:NTF \l__fontspec_fontname_sc_tl
{
\__fontspec_make_smallcaps:TF
{
\clist_put_left:Nn \l__fontspec_fontfeat_curr_clist {Letters=SmallCaps}
}
{
\bool_set_true:N \l__fontspec_nosc_bool
}
}
{ \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_fontname_sc_tl} }% local for each size
}
\bool_if:NF \l__fontspec_nosc_bool
{
\__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_sc_tl
{#1} {\l__fontspec_sizing_leftover_clist} {\l__fontspec_fontfeat_curr_clist}
}
}
\cs_new:Nn \__fontspec_setup_nfss:Nnnn
{
\__fontspec_get_features:n { #2 , #3 , #4 }
\tl_if_empty:NF \l__fontspec_scale_tl
{
\tl_set:Nx \l__fontspec_scale_tl { s*[\l__fontspec_scale_tl] }
}
\tl_build_put_right:Nx #1
{
<\l__fontspec_size_tl> \l__fontspec_scale_tl
\__fontspec_construct_font_call:nn { \l_fontspec_fontname_tl }
{ \l__fontspec_pre_feat_sclist \g__fontspec_rawfeatures_sclist }
}
}
\cs_new:Nn \__fontspec_declare_shapes_normal:nn
{
\__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl}
{#1} {#2} {\l__fontspec_nfss_tl}{\l__fontspec_postadjust_tl}
}
\cs_new:Nn \__fontspec_declare_shapes_smcaps:nn
{
\tl_if_empty:NF \l__fontspec_nfss_sc_tl
{
\__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} {#1}
{ \__fontspec_combo_sc_shape:n {#2} } {\l__fontspec_nfss_sc_tl} {\l__fontspec_postadjust_tl}
}
}
\cs_new:Nn \__fontspec_combo_sc_shape:n
{
\tl_if_exist:cTF { \__fontspec_shape_merge:nn {#1} {\scdefault} }
{ \tl_use:c { \__fontspec_shape_merge:nn {#1} {\scdefault} } }
{ \scdefault }
}
\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'~}
{\bfdefault/\itdefault} {'bold~ italic'~}
{\bfdefault/\sldefault} {'bold~ slanted'~}
} (#1/#2)~
with~ NFSS~ spec.:~
\l__fontspec_nfss_tl
\exp_not:n { \\ }
-~ \exp_not:N \str_case:nn { #1 / \__fontspec_combo_sc_shape:n {#2} }
{
{\mddefault/\scdefault} {'small~ caps'~}
{\bfdefault/\scdefault} {'bold~ small~ caps'~}
{\mddefault/\scitdefault} {'italic~ small~ caps'~}
{\bfdefault/\scitdefault} {'bold~ italic~ small~ caps'~}
{\mddefault/\scsldefault} {'slanted~ small~ caps'~}
{\bfdefault/\scsldefault} {'bold~ slanted~ small~ caps'~}
}~( #1 / \__fontspec_combo_sc_shape:n {#2} )~
with~ NFSS~ spec.:~
\l__fontspec_nfss_sc_tl
\tl_if_empty:fF {\l__fontspec_postadjust_tl}
{
\exp_not:N \\ and~ font~ adjustment~ code:
\exp_not:N \\ \l__fontspec_postadjust_tl
}
}
}
\tl_set:Nn \l__fontspec_pre_feat_sclist
{
\bool_if:NT \l__fontspec_ot_bool
{
\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
{
\exp_args:No \__fontspec_check_ot_feat:NnTF \l__fontspec_fontface_cs_tl {smcp} {#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_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
}
\cs_new:Nn \__fontspec_init_fontface:
{
\tl_gclear:N \g__fontspec_rawfeatures_sclist
\tl_clear:N \l__fontspec_scale_tl
\tl_set_eq:NN \l__fontspec_opacity_tl \c__fontspec_opacity_tl
\tl_set_eq:NN \l__fontspec_hexcol_tl \c__fontspec_hexcol_tl
\tl_set_eq:NN \l__fontspec_postadjust_tl \c__fontspec_postadjust_tl
\tl_clear:N \l__fontspec_wordspace_adjust_tl
\tl_clear:N \l__fontspec_punctspace_adjust_tl
}
\cs_new:Nn \__fontspec_iv_str_to_num:Nn
{
\__fontspec_strip_leading_sign:Nw #1#2 \q_nil
}
\cs_generate_variant:Nn \__fontspec_iv_str_to_num:Nn {Nx}
\cs_set:Npn \__fontspec_strip_leading_sign:Nw #1#2#3 \q_nil
{
\bool_if:nTF { \str_if_eq_p:nn {#2} {+} || \str_if_eq_p:nn {#2} {-} }
{ \__fontspec_iv_str_to_num:w #1 \q_nil #3 \c_empty_tl \c_empty_tl \q_nil }
{ \__fontspec_iv_str_to_num:w #1 \q_nil #2#3 \c_empty_tl \c_empty_tl \q_nil }
}
\cs_set:Npn \__fontspec_iv_str_to_num:w #1 \q_nil #2#3#4#5#6 \q_nil
{
\int_compare:nT { \tl_count:n {#6} > 2 }
{ \__fontspec_error:nx {ot-tag-too-long} {#2#3#4#5#6} }
\int_set:Nn #1
{
`#2 * "1000000
+ `#3 * "10000
+ \ifx \c_empty_tl #4 32 \else `#4 \fi * "100
+ \ifx \c_empty_tl #5 32 \else `#5 \fi
}
}
%%^^A%% fontspec-code-opentype.dtx -- part of FONTSPEC <wspr.io/fontspec>
\cs_new:Nn \__fontspec_define_opentype_feature_group:n
{
\keys_define:nn {fontspec-opentype} { #1 .multichoice: , .groups:n = {opentype} }
}
\cs_new:Nn \__fontspec_feat_prop_add:nn
{
\tl_if_empty:nF {#1}
{
\prop_if_in:NnF \g__fontspec_OT_features_prop {#1}
{
\prop_gput:Nnn \g__fontspec_OT_features_prop {#1} {#2}
}
}
}
\cs_new:Nn \__fontspec_define_opentype_feature:nnnnn
{
\__fontspec_feat_prop_add:nn {#3} {#1\,=\,#2}
\tl_if_empty:nTF {#4}
{
\keys_define:nn {fontspec-opentype}
{
#1/#2 .code:n =
{ \__fontspec_remove_clashing_featstr:n {#5} } ,
#1/#2 .groups:n = {opentype}
}
}
{
\keys_define:nn {fontspec-opentype}
{
#1/#2 .code:n =
{
\__fontspec_make_OT_feature:nnn {#3} {#4} {#5}
} ,
#1/#2 .groups:n = {opentype}
}
}
}
\cs_new:Nn \__fontspec_feat_off:n {#1Off}
\cs_new:Nn \__fontspec_feat_reset:n {#1Reset}
\cs_new:Nn \__fontspec_define_opentype_onoffreset:nnnnn
{
\exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} {#2} {#3} {+#4} {#5}
\exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} { \__fontspec_feat_off:n {#2} } {#3} {-#4} {}
\exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} { \__fontspec_feat_reset:n {#2} } {} {} {+#4,-#4}
}
\cs_new:Nn \__fontspec_define_opentype_onreset:nnnnn
{
\exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} {#2} {#3} {#4} {#5}
\exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} { \__fontspec_feat_reset:n {#2} } {} {} {#4}
}
\cs_new:Nn \__fontspec_make_OT_feature:nnn
{
\bool_set_true:N \l__fontspec_proceed_bool
\tl_if_empty:nF {#1}
{
\exp_args:No \__fontspec_check_ot_feat:NnF \l__fontspec_fontface_cs_tl {#1}
{
\__fontspec_warning:nx {icu-feature-not-exist-in-font} {#1}
\bool_set_false:N \l__fontspec_proceed_bool
}
}
\__fontspec_remove_clashing_featstr:x { #2 , \__fontspec_swap_plus_minus:n {#2} , #3 }
\bool_if:NT \l__fontspec_proceed_bool { \__fontspec_update_featstr:n {#2} }
}
\cs_generate_variant:Nn \__fontspec_make_OT_feature:nnn {xxx}
\cs_new:Nn \__fontspec_swap_plus_minus:n { \__fontspec_swap_plus_minus_aux:Nq #1 \q_nil }
\cs_new:Npn \__fontspec_swap_plus_minus_aux:Nq #1#2 \q_nil
{ \str_case:nn {#1} { {+} {-#2} {-} {+#2} } }
\prg_new_conditional:Nnn \__fontspec_check_script:Nn {TF,T}
{
\bool_if:NTF \l__fontspec_never_check_bool
{ \prg_return_true: }
{
\bool_if:nTF { \tl_if_empty_p:e {#2} }
{ \prg_return_false: }
{
\__fontspec_iv_str_to_num:Nx \l__fontspec_strnum_int {#2}
\int_set:Nn \l_tmpb_int { \XeTeXOTcountscripts #1 }
\int_zero:N \l_tmpa_int
\bool_set_false:N \l__fontspec_check_bool
\bool_until_do:nn { \int_compare_p:nNn \l_tmpa_int = \l_tmpb_int }
{
\ifnum \XeTeXOTscripttag #1 \l_tmpa_int = \l__fontspec_strnum_int
\bool_set_true:N \l__fontspec_check_bool
\int_set:Nn \l_tmpa_int {\l_tmpb_int}
\else
\int_incr:N \l_tmpa_int
\fi
}
\bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false:
}
}
}
\prg_new_conditional:Nnn \__fontspec_check_lang:Nn {TF}
{
\__fontspec_check_lang:NnnTF #1 {#2} {\l__fontspec_script_tl} {\prg_return_true:} {\prg_return_false:}
}
\prg_new_conditional:Nnn \__fontspec_check_lang:Nnn {TF}
{
\bool_if:NTF \l__fontspec_never_check_bool
{ \prg_return_true: }
{
\bool_if:nTF { \tl_if_empty_p:e {#3} }
{ \prg_return_false: }
{
\__fontspec_iv_str_to_num:Nx \l__fontspec_strnum_int {#2}
\__fontspec_iv_str_to_num:Nx \l__fontspec_script_int {#3}
\int_set:Nn \l__fontspec_tmpb_int
{ \XeTeXOTcountlanguages #1 \l__fontspec_script_int }
\int_zero:N \l__fontspec_tmpa_int
\bool_set_false:N \l__fontspec_check_bool
\bool_until_do:nn { \int_compare_p:nNn \l__fontspec_tmpa_int = \l__fontspec_tmpb_int }
{
\int_set:Nn \l__fontspec_tmpc_int
{ \XeTeXOTlanguagetag #1 \l__fontspec_script_int \l__fontspec_tmpa_int }
\int_compare:nNnTF \l__fontspec_tmpc_int = \l__fontspec_strnum_int
{
\bool_set_true:N \l__fontspec_check_bool
\int_set:Nn \l__fontspec_tmpa_int {\l__fontspec_tmpb_int}
}
{
\int_incr:N \l__fontspec_tmpa_int
}
}
\bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false:
}
}
}
\prg_new_conditional:Nnn \__fontspec_check_ot_feat:Nn {TF,F}
{
\__fontspec_check_ot_feat:NnnnTF #1 {#2} {\l__fontspec_lang_tl} {\l__fontspec_script_tl}
{\prg_return_true:} {\prg_return_false:}
}
\prg_new_conditional:Nnn \__fontspec_check_ot_feat:Nnnn {TF,F}
{
\bool_if:NTF \l__fontspec_never_check_bool
{ \prg_return_true: }
{
\bool_if:nTF { \tl_if_empty_p:e {#3} || \tl_if_empty_p:e {#4} }
{ \prg_return_false: }
{
\__fontspec_iv_str_to_num:Nx \l__fontspec_strnum_int {#2}
\str_if_eq:eeTF {#3} {dflt}
{ \int_zero:N \l__fontspec_language_int }
{ \__fontspec_iv_str_to_num:Nx \l__fontspec_language_int {#3} }
\__fontspec_iv_str_to_num:Nx \l__fontspec_script_int {#4}
\int_set:Nn \l_tmpb_int
{ \XeTeXOTcountfeatures #1 \l__fontspec_script_int \l__fontspec_language_int }
\int_zero:N \l_tmpa_int
\bool_set_false:N \l__fontspec_check_bool
\bool_until_do:nn { \int_compare_p:nNn \l_tmpa_int = \l_tmpb_int }
{
\ifnum\XeTeXOTfeaturetag #1 \l__fontspec_script_int \l__fontspec_language_int
\l_tmpa_int =\l__fontspec_strnum_int
\bool_set_true:N \l__fontspec_check_bool
\int_set:Nn \l_tmpa_int {\l_tmpb_int}
\else
\int_incr:N \l_tmpa_int
\fi
}
\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 <wspr.io/fontspec>
\cs_new:Nn \__fontspec_define_aat_feature_group:n
{
\keys_define:nn {fontspec-aat} { #1 .multichoice: }
}
\cs_new:Nn \__fontspec_define_aat_feature:nnnn
{
\keys_define:nn {fontspec-aat}
{
#1/#2 .code:n = { \__fontspec_make_AAT_feature:nn {#3}{#4} }
}
}
\cs_new:Nn \__fontspec_make_AAT_feature:nn
{
\tl_if_empty:nTF {#1}
{ \__fontspec_warning:n {aat-feature-not-exist} }
{
\exp_args:No \__fontspec_make_AAT_feature_string:NnnTF \l__fontspec_fontface_cs_tl {#1} {#2}
{
\__fontspec_update_featstr:n {\l_fontspec_feature_string_tl}
}
{
\__fontspec_warning:nx {aat-feature-not-exist-in-font} {#1,#2}
}
}
}
\prg_new_conditional:Nnn \__fontspec_make_AAT_feature_string:Nnn {TF,T,F}
{
\tl_set:Nx \l__fontspec_tmpa_tl { \XeTeXfeaturename #1 #2 }
\tl_if_empty:NTF \l__fontspec_tmpa_tl
{ \prg_return_false: }
{
\int_compare:nTF { \XeTeXisexclusivefeature #1 #2 > 0 }
{
\tl_set:Nx \l__fontspec_tmpb_tl {\XeTeXselectorname #1 #2\space #3}
}
{
\int_if_even:nTF {#3}
{
\tl_set:Nx \l__fontspec_tmpb_tl {\XeTeXselectorname #1 #2\space #3}
}
{
\tl_set:Nx \l__fontspec_tmpb_tl
{
\XeTeXselectorname #1 #2\space \numexpr#3-1\relax
}
\tl_if_empty:NF \l__fontspec_tmpb_tl { \tl_put_left:Nn \l__fontspec_tmpb_tl {!} }
}
}
\tl_if_empty:NTF \l__fontspec_tmpb_tl
{ \prg_return_false: }
{
\tl_set:Nx \l_fontspec_feature_string_tl { \l__fontspec_tmpa_tl = \l__fontspec_tmpb_tl }
\prg_return_true:
}
}
}
%%^^A%% fontspec-code-keyval.dtx -- part of FONTSPEC <wspr.io/fontspec>
\clist_gset:Nn \g__fontspec_all_keyval_modules_clist
{
fontspec, fontspec-opentype, fontspec-aat,
fontspec-preparse, fontspec-preparse-cfg, fontspec-preparse-external, fontspec-preparse-nested,
fontspec-renderer
}
\cs_new:Nn \__fontspec_keys_define_code:nnn
{
\keys_define:nn {#1} { #2 .code:n = {#3} }
}
\cs_new:Nn \__fontspec_aff_error:n
{
\__fontspec_keys_define_code:nnn {fontspec-addfeatures} {#1}
{ \__fontspec_error:nx {not-in-addfontfeatures} {#1} }
}
\__fontspec_keys_define_code:nnn {fontspec-preparse-cfg} {IgnoreFontspecFile}
{
\bool_set_false:N \l__fontspec_fontcfg_bool
}
\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {IgnoreFontspecFile}
{
\bool_set_false:N \l__fontspec_fontcfg_bool
}
\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Path}
{
\bool_set_true:N \l__fontspec_nobf_bool
\bool_set_true:N \l__fontspec_noit_bool
\bool_set_true:N \l__fontspec_external_bool
\tl_set:Nn \l__fontspec_font_path_tl {#1}
\__fontspec_font_is_file:
\keys_set:nn {fontspec-renderer} {Renderer=OpenType}
}
\aliasfontfeature{Path}{ExternalLocation}
\__fontspec_keys_define_code:nnn {fontspec} {Path} {}
\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Extension}
{
\tl_set:Nn \l__fontspec_extension_tl {#1}
\bool_if:NF \l__fontspec_external_bool
{
\keys_set:nn {fontspec-preparse-external} {Path}
}
}
\tl_clear:N \l__fontspec_extension_tl
\__fontspec_keys_define_code:nnn {fontspec} {Extension} {}
\keys_define:nn {fontspec-renderer}
{
Renderer .choices:nn =
{AAT,ICU,OpenType,Graphite,Full,Basic,Node,Base,HarfBuzz,Harfbuzz}
{
\int_compare:nTF {\l_keys_choice_int <= 4}
{
\tl_set:Nx \l__fontspec_renderer_tl
{
\int_case:nn \l_keys_choice_int { 1 {/AAT} 2 {/OT} 3 {/OT} 4 {/GR} }
}
\tl_gset:Nx \g__fontspec_single_feat_tl { \l__fontspec_renderer_tl }
}
{
\__fontspec_warning:nx {only-luatex-feature} {Renderer=Full/Basic/Node/Base/HarfBuzz}
}
}
}
\__fontspec_keys_define_code:nnn {fontspec-preparse} {Script}
{
\keys_set:nn {fontspec-renderer} {Renderer=OpenType}
\tl_set:Nn \l__fontspec_script_name_tl {#1}
}
\__fontspec_keys_define_code:nnn {fontspec-preparse} {Language}
{
\keys_set:nn {fontspec-renderer} {Renderer=OpenType}
\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} {BoldFont}
{
\tl_if_empty:nTF {#1}
{
\bool_set_true:N \l__fontspec_nobf_bool
}
{
\bool_set_false:N \l__fontspec_nobf_bool
\fontspec_complete_fontname:Nn \l__fontspec_curr_bfname_tl {#1}
\seq_if_empty:NT \l__fontspec_bf_series_seq
{
\tl_gset:Nx \g__fontspec_curr_series_tl {\bfdefault}
\seq_put_right:Nx \l__fontspec_bf_series_seq {\bfdefault}
}
\tl_if_eq:oxT \g__fontspec_curr_series_tl {\bfdefault}
{
\tl_set_eq:NN \l__fontspec_fontname_bf_tl \l__fontspec_curr_bfname_tl
}
\prop_put:NxV \l__fontspec_nfss_prop {BoldFont-\g__fontspec_curr_series_tl} \l__fontspec_curr_bfname_tl
}
}
\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldItalicFont}
{
\fontspec_complete_fontname:Nn \l__fontspec_fontname_bfit_tl {#1}
}
\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldSlantedFont}
{
\fontspec_complete_fontname:Nn \l__fontspec_fontname_bfsl_tl {#1}
}
\__fontspec_keys_define_code:nnn {fontspec} {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} {SmallCapsFeatures}
{
\bool_if:NF \l__fontspec_firsttime_bool
{
\clist_put_right:Nn \l__fontspec_fontfeat_sc_clist {#1}
}
}
\__fontspec_keys_define_code:nnn {fontspec-preparse} {SizeFeatures}
{
\clist_set:Nn \l__fontspec_sizefeat_clist {#1}
\clist_put_right:Nn \l__fontspec_fontfeat_up_clist { SizeFeatures = {#1} }
}
\__fontspec_keys_define_code:nnn {fontspec-preparse-nested} {SizeFeatures}
{
\clist_set:Nn \l__fontspec_sizefeat_clist {#1}
\tl_if_empty:NT \l__fontspec_this_font_tl
{ \tl_set:Nn \l__fontspec_this_font_tl { -- } } % needs to be non-empty as a flag
}
\__fontspec_keys_define_code:nnn {fontspec-preparse-nested} {Font}
{
\tl_set:Nn \l__fontspec_this_font_tl {#1}
}
\__fontspec_keys_define_code:nnn {fontspec} {SizeFeatures}
{
% dummy
}
\__fontspec_keys_define_code:nnn {fontspec} {Font}
{
% dummy
}
\__fontspec_keys_define_code:nnn {fontspec-sizing} {Size}
{
\tl_set:Nn \l__fontspec_size_tl {#1}
}
\__fontspec_keys_define_code:nnn {fontspec-sizing} {Font}
{
\fontspec_complete_fontname:Nn \l__fontspec_sizedfont_tl {#1}
}
\__fontspec_keys_define_code:nnn {fontspec-opentype} {UprightFont} {}
\__fontspec_keys_define_code:nnn {fontspec-opentype} {ItalicFont} {}
\__fontspec_keys_define_code:nnn {fontspec-opentype} {SlantedFont} {}
\__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldFont} {}
\__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldItalicFont} {}
\__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldSlantedFont} {}
\__fontspec_keys_define_code:nnn {fontspec-preparse} {NFSSEncoding}
{
\tl_gset:Nx \g__fontspec_nfss_enc_tl { #1 }
}
\__fontspec_keys_define_code:nnn {fontspec-preparse} {NFSSFamily}
{
\tl_set:Nx \l__fontspec_nfss_fam_tl { #1 }
}
\__fontspec_keys_define_code:nnn {fontspec-preparse} {FontFace}
{
\tl_clear:N \l__fontspec_this_font_tl
\clist_set:No \l__fontspec_arg_clist { \use_iii:nnn #1 }
\clist_set_eq:NN \l__fontspec_this_feat_clist \l__fontspec_arg_clist
\int_compare:nT { \clist_count:N \l__fontspec_arg_clist = 1 }
{
\tl_if_in:NnF \l__fontspec_arg_clist {=}
{
\tl_set_eq:NN \l__fontspec_this_font_tl \l__fontspec_arg_clist
\tl_clear:N \l__fontspec_this_feat_clist
}
}
\__fontspec_add_nfssfont:nnnn
{\use_i:nnn #1} {\use_ii:nnn #1} {\l__fontspec_this_font_tl} {\l__fontspec_this_feat_clist}
}
\__fontspec_keys_define_code:nnn {fontspec} {Scale}
{
\str_case:nnF {#1}
{
{MatchLowercase} { \__fontspec_calc_scale:n {5} }
{MatchUppercase} { \__fontspec_calc_scale:n {8} }
}
{ \tl_set:Nx \l__fontspec_scale_tl {#1} }
}
\__fontspec_keys_define_code:nnn {fontspec} {ScaleAgain}
{
\tl_if_empty:NT \l__fontspec_scale_tl { \tl_set:Nn \l__fontspec_scale_tl {1} }
\tl_set:Nx \l__fontspec_scale_tl { \fp_eval:n { #1 * \l__fontspec_scale_tl } }
\__fontspec_info:n {set-scale}
}
\cs_new:Nn \__fontspec_calc_scale:n
{
\group_begin:
\fontencoding { \encodingdefault }
\fontfamily { \familydefault }
\selectfont
\__fontspec_set_font_dimen:NnN \l__fontspec_tmpa_dim {#1} \font
\__fontspec_set_font_dimen:NnN \l__fontspec_tmpb_dim {#1} \l__fontspec_fontface_cs_tl
\tl_set:Nx \l__fontspec_scale_tl
{
\fp_eval:n { \dim_to_fp:n {\l__fontspec_tmpa_dim} /
\dim_to_fp:n {\l__fontspec_tmpb_dim} }
}
\__fontspec_info:n {set-scale}
\exp_args:NNNx
\group_end:
\tl_set:Nx \l__fontspec_scale_tl { \l__fontspec_scale_tl }
}
\cs_new:Nn \__fontspec_set_font_dimen:NnN
{
\dim_set:Nn #1 { \fontdimen #2 #3 }
\dim_compare:nNnT #1 = {0pt}
{
\settoheight #1
{
\str_if_eq:nnTF {#3} {\font} \rmfamily #3
\int_case:nnF #2
{
{5} {x} % x-height
{8} {X} % cap-height
} {?} % "else" clause; never reached.
}
}
}
\__fontspec_keys_define_code:nnn {fontspec} {WordSpace}
{
\bool_if:NF \l__fontspec_firsttime_bool
{ \_fontspec_parse_wordspace:w #1,,,\q_stop }
}
\__fontspec_aff_error:n {WordSpace}
\cs_set:Npn \_fontspec_parse_wordspace:w #1,#2,#3,#4 \q_stop
{
\tl_if_empty:nTF {#4}
{
\tl_set:Nn \l__fontspec_wordspace_adjust_tl
{
\fontdimen 2 \font = #1 \fontdimen 2 \font
\fontdimen 3 \font = #1 \fontdimen 3 \font
\fontdimen 4 \font = #1 \fontdimen 4 \font
}
}
{
\tl_set:Nn \l__fontspec_wordspace_adjust_tl
{
\fontdimen 2 \font = #1 \fontdimen 2 \font
\fontdimen 3 \font = #2 \fontdimen 3 \font
\fontdimen 4 \font = #3 \fontdimen 4 \font
}
}
}
\__fontspec_keys_define_code:nnn {fontspec} {PunctuationSpace}
{
\str_case_e:nnF {#1}
{
{WordSpace}
{
\tl_set:Nn \l__fontspec_punctspace_adjust_tl
{ \fontdimen 7 \font = 0 \fontdimen 2 \font }
}
{TwiceWordSpace}
{
\tl_set:Nn \l__fontspec_punctspace_adjust_tl
{ \fontdimen 7 \font = 1 \fontdimen 2 \font }
}
}
{
\tl_set:Nn \l__fontspec_punctspace_adjust_tl
{ \fontdimen 7 \font = #1 \fontdimen 7 \font }
}
}
\__fontspec_aff_error:n {PunctuationSpace}
\__fontspec_keys_define_code:nnn {fontspec} {FontAdjustment}
{
\tl_put_right:Nx \l__fontspec_postadjust_tl {#1}
}
\__fontspec_keys_define_code:nnn {fontspec} {LetterSpace}
{
\__fontspec_update_featstr:n {letterspace=#1}
}
\__fontspec_keys_define_code:nnn {fontspec} {HyphenChar}
{
\str_if_eq:nnTF {#1} {None}
{
\tl_put_right:Nn \l__fontspec_postadjust_tl
{ \__fontspec_primitive_font_set_hyphenchar:Nn \font {-1} }
}
{
\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}
{
\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-aat} {Mapping}
{
\tl_set:Nn \l__fontspec_mapping_tl { #1 }
}
\__fontspec_keys_define_code:nnn {fontspec-opentype} {Mapping}
{
\tl_set:Nn \l__fontspec_mapping_tl { #1 }
}
\__fontspec_keys_define_code:nnn {fontspec} {Weight}
{
\__fontspec_update_featstr:n{weight=#1}
}
\__fontspec_keys_define_code:nnn {fontspec} {Width}
{
\__fontspec_update_featstr:n{width=#1}
}
\__fontspec_keys_define_code:nnn {fontspec} {OpticalSize}
{
\bool_if:NTF \l__fontspec_ot_bool
{
\tl_set:Nn \l__fontspec_optical_size_tl {/ S = #1}
}
{
\bool_if:NT \l__fontspec_mm_bool
{
\__fontspec_update_featstr:n { optical size = #1 }
}
}
\bool_if:nT { !\l__fontspec_ot_bool && !\l__fontspec_mm_bool }
{
\bool_if:NT \l__fontspec_firsttime_bool
{ \__fontspec_warning:nx {no-opticals} {\l_fontspec_fontname_tl} }
}
}
\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 <wspr.io/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,
mapping = tex-text
}
\__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} {}
\keys_define:nn {fontspec-opentype}
{
Ligatures / TeX .code:n = { \tl_set:Nn \l__fontspec_mapping_tl {tex-text} },
Ligatures / TeXOff .code:n = { \tl_clear:N \l__fontspec_mapping_tl },
Ligatures / TeXReset .code:n = { \tl_clear:N \l__fontspec_mapping_tl },
}
\__fontspec_define_opentype_feature_group:n {Letters}
\__fontspec_define_opentype_feature:nnnnn {Letters} {ResetAll} {} {}
{
+case,+smcp,+pcap,+c2sc,+c2pc,+unic,+rand,
-case,-smcp,-pcap,-c2sc,-c2pc,-unic,-rand
}
\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Uppercase} {case} {case} {}
\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {SmallCaps} {smcp} {smcp} {+pcap,+unic}
\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {PetiteCaps} {pcap} {pcap} {+smcp,+unic}
\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {UppercaseSmallCaps} {c2sc} {c2sc} {+c2pc,+unic}
\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {UppercasePetiteCaps} {c2pc} {c2pc} {+c2sc,+unic}
\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Unicase} {unic} {unic} {}
\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Random} {rand} {rand} {}
\__fontspec_define_opentype_feature_group:n {Numbers}
\__fontspec_define_opentype_feature:nnnnn {Numbers} {ResetAll} {} {}
{
+tnum,-tnum,
+pnum,-pnum,
+onum,-onum,
+lnum,-lnum,
+zero,-zero,
+anum,-anum,
}
\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Monospaced} {tnum} {tnum} {+pnum,-pnum}
\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Proportional} {pnum} {pnum} {+tnum,-tnum}
\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Lowercase} {onum} {onum} {+lnum,-lnum}
\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Uppercase} {lnum} {lnum} {+onum,-onum}
\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {SlashedZero} {zero} {zero} {}
\aliasfontfeatureoption {Numbers} {Monospaced} {Tabular}
\aliasfontfeatureoption {Numbers} {Lowercase} {OldStyle}
\aliasfontfeatureoption {Numbers} {Uppercase} {Lining}
\__fontspec_define_opentype_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 }{} }
}
}
\aliasfontfeature{Alternate}{StylisticAlternates}
\__fontspec_define_opentype_feature_group:n {Variant}
\keys_define:nn {fontspec-opentype}
{
Variant .default:n = {0} ,
Variant .groups:n = {opentype} ,
Variant / unknown .code:n =
{
\clist_map_inline:nn {#1}
{
\__fontspec_make_OT_feature:xxx { ss \two@digits {##1} } { +ss \two@digits {##1} } {}
}
}
}
\aliasfontfeature{Variant}{StylisticSet}
\__fontspec_define_opentype_feature_group:n {CharacterVariant}
\use:x
{
\cs_new:Npn \exp_not:N \fontspec_parse_cv:w
##1 \c_colon_str ##2 \c_colon_str ##3 \exp_not:N \q_nil
{
\__fontspec_make_OT_feature:xxx
{ cv \exp_not:N \two@digits {##1} }
{ +cv \exp_not:N \two@digits {##1} = ##2 } {}
}
\keys_define:nn {fontspec-opentype}
{
CharacterVariant / unknown .code:n =
{
\clist_map_inline:nn {##1}
{
\exp_not:N \fontspec_parse_cv:w
####1 \c_colon_str 0 \c_colon_str \exp_not:N \q_nil
}
}
}
}
\__fontspec_define_opentype_feature_group:n {Annotation}
\keys_define:nn {fontspec-opentype}
{
Annotation .default:n = {0} ,
Annotation .groups:n = {opentype},
Annotation / unknown .code:n =
{
\__fontspec_make_OT_feature:nnn {nalt} {+nalt=#1} {}
}
}
\__fontspec_define_opentype_feature_group:n {Ornament}
\keys_define:nn {fontspec-opentype}
{
Ornament .default:n = {0} ,
Ornament .groups:n = {opentype},
Ornament / unknown .code:n =
{
\__fontspec_make_OT_feature:nnn {ornm} { +ornm=#1 } {}
}
}
\keys_define:nn {fontspec-opentype}
{
Script .choice: ,
Script .groups:n = {opentype} ,
}
\cs_new:Nn \fontspec_new_script:nn
{
\keys_define:nn {fontspec-opentype} { Script / #1 .code:n =
{
\bool_set_false:N \l__fontspec_scriptlang_exist_bool
\clist_map_inline:nn {#2}
{
\exp_args:No \__fontspec_check_script:NnT \l__fontspec_fontface_cs_tl {####1}
{
\tl_set:Nn \l__fontspec_script_name_tl {#1}
\tl_set:Nn \l__fontspec_script_tl {####1}
\int_set:Nn \l__fontspec_script_int {\l__fontspec_strnum_int}
\bool_set_true:N \l__fontspec_scriptlang_exist_bool
\tl_gset:Nx \g__fontspec_single_feat_tl { script=####1 }
\clist_map_break:
}
}
\bool_if:NF \l__fontspec_scriptlang_exist_bool
{
\bool_if:nF { \str_if_eq_p:ee {#1} {CustomDefault} }
{
\tl_clear:N \l__fontspec_script_name_tl
\__fontspec_warning:nxx {no-script} {\l_fontspec_fontname_tl} {#1}
}
\bool_if:nF
{
\str_if_eq_p:ee {#1} {Default} ||
\str_if_eq_p:ee {#1} {Latin} ||
\str_if_eq_p:ee {#1} {CustomDefault}
}
{
\keys_set:nn {fontspec-opentype} { Script = CustomDefault }
}
}
}
}
}
\keys_define:nn {fontspec-opentype}
{
Language .choice: ,
Language .groups:n = {opentype} ,
}
\cs_new:Nn \fontspec_new_lang:nn
{
\keys_define:nn {fontspec-opentype} { Language / #1 .code:n =
{
\bool_set_false:N \l__fontspec_scriptlang_exist_bool
\clist_map_inline:nn {#2}
{
\exp_args:No \__fontspec_check_lang:NnTF \l__fontspec_fontface_cs_tl {####1}
{
\tl_set:Nn \l__fontspec_lang_tl {####1}
\int_set:Nn \l__fontspec_language_int {\l__fontspec_strnum_int}
\tl_gset:Nx \g__fontspec_single_feat_tl { language=####1 }
\bool_set_true:N \l__fontspec_scriptlang_exist_bool
\clist_map_break:
}
}
\bool_if:NF \l__fontspec_scriptlang_exist_bool
{
\__fontspec_warning:nx {language-not-exist} {#1}
\keys_set:nn {fontspec-opentype} { Language = Default }
}
}
}
}
\__fontspec_keys_define_code:nnn {fontspec-opentype} { Language / Default }
{
\tl_set:Nn \l__fontspec_lang_tl {dflt}
\int_zero:N \l__fontspec_language_int
\tl_gset:Nn \g__fontspec_single_feat_tl { language=dflt }
}
\cs_new:Nn \__fontspec_ot_compat:nn
{
\aliasfontfeatureoption {#1} {#2Off} {No#2}
}
\__fontspec_ot_compat:nn {Ligatures} {Rare}
\__fontspec_ot_compat:nn {Ligatures} {Required}
\__fontspec_ot_compat:nn {Ligatures} {Common}
\__fontspec_ot_compat:nn {Ligatures} {Discretionary}
\__fontspec_ot_compat:nn {Ligatures} {Contextual}
\__fontspec_ot_compat:nn {Ligatures} {Historic}
\__fontspec_ot_compat:nn {Numbers} {SlashedZero}
\__fontspec_ot_compat:nn {Contextuals} {Swash}
\__fontspec_ot_compat:nn {Contextuals} {Alternate}
\__fontspec_ot_compat:nn {Contextuals} {WordInitial}
\__fontspec_ot_compat:nn {Contextuals} {WordFinal}
\__fontspec_ot_compat:nn {Contextuals} {LineFinal}
\__fontspec_ot_compat:nn {Contextuals} {Inner}
\__fontspec_ot_compat:nn {Diacritics} {MarkToBase}
\__fontspec_ot_compat:nn {Diacritics} {MarkToMark}
\__fontspec_ot_compat:nn {Diacritics} {AboveBase}
\__fontspec_ot_compat:nn {Diacritics} {BelowBase}
%%^^A%% fontspec-code-scripts.dtx -- part of FONTSPEC <wspr.io/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{CJK~Ideographic}{hani}
\newfontscript{Coptic}{copt}
\newfontscript{Cypriot~Syllabary}{cprt}
\newfontscript{Cyrillic}{cyrl}
\newfontscript{Default}{DFLT}
\newfontscript{CustomDefault}{latn,DFLT}
\newfontscript{Deseret}{dsrt}
\newfontscript{Devanagari}{dev2,deva}
\newfontscript{Dogra}{dogr}
\newfontscript{Duployan}{dupl}
\newfontscript{Egyptian~Hieroglyphs}{egyp}
\newfontscript{Elbasan}{elba}
\newfontscript{Ethiopic}{ethi}
\newfontscript{Georgian}{geor}
\newfontscript{Glagolitic}{glag}
\newfontscript{Gothic}{goth}
\newfontscript{Grantha}{gran}
\newfontscript{Greek}{grek}
\newfontscript{Gujarati}{gjr2,gujr}
\newfontscript{Gunjala~Gondi}{gong}
\newfontscript{Gurmukhi}{gur2,guru}
\newfontscript{Hangul~Jamo}{jamo}
\newfontscript{Hangul}{hang}
\newfontscript{Hanifi~Rohingya}{rohg}
\newfontscript{Hanunoo}{hano}
\newfontscript{Hatran}{hatr}
\newfontscript{Hebrew}{hebr}
\newfontscript{Hiragana~and~Katakana}{kana}
\newfontscript{Imperial~Aramaic}{armi}
\newfontscript{Inscriptional~Pahlavi}{phli}
\newfontscript{Inscriptional~Parthian}{prti}
\newfontscript{Javanese}{java}
\newfontscript{Kaithi}{kthi}
\newfontscript{Kannada}{knd2,knda}
\newfontscript{Kayah~Li}{kali}
\newfontscript{Kharosthi}{khar}
\newfontscript{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{Newa}{newa}
\newfontscript{Nushu}{nshu}
\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{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{Tangut}{tang}
\newfontscript{Telugu}{tel2,telu}
\newfontscript{Thaana}{thaa}
\newfontscript{Thai}{thai}
\newfontscript{Tibetan}{tibt}
\newfontscript{Tifinagh}{tfng}
\newfontscript{Tirhuta}{tirh}
\newfontscript{Ugaritic~Cuneiform}{ugar}
\newfontscript{Vai}{vai~}
\newfontscript{Warang~Citi}{wara}
\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 <wspr.io/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 <wspr.io/fontspec>
\__fontspec_define_aat_feature_group:n {Ligatures}
\__fontspec_define_aat_feature:nnnn {Ligatures} {Required} {1} {0}
\__fontspec_define_aat_feature:nnnn {Ligatures} {NoRequired} {1} {1}
\__fontspec_define_aat_feature:nnnn {Ligatures} {Common} {1} {2}
\__fontspec_define_aat_feature:nnnn {Ligatures} {NoCommon} {1} {3}
\__fontspec_define_aat_feature:nnnn {Ligatures} {Rare} {1} {4}
\__fontspec_define_aat_feature:nnnn {Ligatures} {NoRare} {1} {5}
\__fontspec_define_aat_feature:nnnn {Ligatures} {Discretionary} {1} {4}
\__fontspec_define_aat_feature:nnnn {Ligatures} {NoDiscretionary} {1} {5}
\__fontspec_define_aat_feature:nnnn {Ligatures} {Logos} {1} {6}
\__fontspec_define_aat_feature:nnnn {Ligatures} {NoLogos} {1} {7}
\__fontspec_define_aat_feature:nnnn {Ligatures} {Rebus} {1} {8}
\__fontspec_define_aat_feature:nnnn {Ligatures} {NoRebus} {1} {9}
\__fontspec_define_aat_feature:nnnn {Ligatures} {Diphthong} {1} {10}
\__fontspec_define_aat_feature:nnnn {Ligatures} {NoDiphthong} {1} {11}
\__fontspec_define_aat_feature:nnnn {Ligatures} {Squared} {1} {12}
\__fontspec_define_aat_feature:nnnn {Ligatures} {NoSquared} {1} {13}
\__fontspec_define_aat_feature:nnnn {Ligatures} {AbbrevSquared} {1} {14}
\__fontspec_define_aat_feature:nnnn {Ligatures} {NoAbbrevSquared} {1} {15}
\__fontspec_define_aat_feature:nnnn {Ligatures} {Icelandic} {1} {32}
\__fontspec_define_aat_feature:nnnn {Ligatures} {NoIcelandic} {1} {33}
\keys_define:nn {fontspec-aat}
{
Ligatures / TeX .code:n =
{
\tl_set:Nn \l__fontspec_mapping_tl { tex-text }
}
}
\__fontspec_define_aat_feature_group:n {Letters}
\__fontspec_define_aat_feature:nnnn {Letters} {Normal} {3} {0}
\__fontspec_define_aat_feature:nnnn {Letters} {Uppercase} {3} {1}
\__fontspec_define_aat_feature:nnnn {Letters} {Lowercase} {3} {2}
\__fontspec_define_aat_feature:nnnn {Letters} {SmallCaps} {3} {3}
\__fontspec_define_aat_feature:nnnn {Letters} {InitialCaps} {3} {4}
\__fontspec_define_aat_feature_group:n {Numbers}
\__fontspec_define_aat_feature:nnnn {Numbers} {Monospaced} {6} {0}
\__fontspec_define_aat_feature:nnnn {Numbers} {Proportional} {6} {1}
\__fontspec_define_aat_feature:nnnn {Numbers} {Lowercase} {21} {0}
\__fontspec_define_aat_feature:nnnn {Numbers} {OldStyle} {21} {0}
\__fontspec_define_aat_feature:nnnn {Numbers} {Uppercase} {21} {1}
\__fontspec_define_aat_feature:nnnn {Numbers} {Lining} {21} {1}
\__fontspec_define_aat_feature:nnnn {Numbers} {SlashedZero} {14} {5}
\__fontspec_define_aat_feature:nnnn {Numbers} {NoSlashedZero} {14} {4}
\__fontspec_define_aat_feature_group:n {Contextuals}
\__fontspec_define_aat_feature:nnnn {Contextuals} {WordInitial} {8} {0}
\__fontspec_define_aat_feature:nnnn {Contextuals} {NoWordInitial} {8} {1}
\__fontspec_define_aat_feature:nnnn {Contextuals} {WordFinal} {8} {2}
\__fontspec_define_aat_feature:nnnn {Contextuals} {NoWordFinal} {8} {3}
\__fontspec_define_aat_feature:nnnn {Contextuals} {LineInitial} {8} {4}
\__fontspec_define_aat_feature:nnnn {Contextuals} {NoLineInitial} {8} {5}
\__fontspec_define_aat_feature:nnnn {Contextuals} {LineFinal} {8} {6}
\__fontspec_define_aat_feature:nnnn {Contextuals} {NoLineFinal} {8} {7}
\__fontspec_define_aat_feature:nnnn {Contextuals} {Inner} {8} {8}
\__fontspec_define_aat_feature:nnnn {Contextuals} {NoInner} {8} {9}
\__fontspec_define_aat_feature_group:n {Diacritics}
\__fontspec_define_aat_feature:nnnn {Diacritics} {Show} {9} {0}
\__fontspec_define_aat_feature:nnnn {Diacritics} {Hide} {9} {1}
\__fontspec_define_aat_feature:nnnn {Diacritics} {Decompose} {9} {2}
\__fontspec_define_aat_feature_group:n {VerticalPosition}
\__fontspec_define_aat_feature:nnnn {VerticalPosition} {Normal} {10} {0}
\__fontspec_define_aat_feature:nnnn {VerticalPosition} {Superior} {10} {1}
\__fontspec_define_aat_feature:nnnn {VerticalPosition} {Inferior} {10} {2}
\__fontspec_define_aat_feature:nnnn {VerticalPosition} {Ordinal} {10} {3}
\__fontspec_define_aat_feature_group:n {Fractions}
\__fontspec_define_aat_feature:nnnn {Fractions} {On} {11} {1}
\__fontspec_define_aat_feature:nnnn {Fractions} {Off} {11} {0}
\__fontspec_define_aat_feature:nnnn {Fractions} {Diagonal} {11} {2}
\__fontspec_define_aat_feature_group:n { Alternate }
\keys_define:nn {fontspec-aat}
{
Alternate .default:n = {0} ,
Alternate / unknown .code:n =
{
\clist_map_inline:nn {#1}
{
\__fontspec_make_AAT_feature:nn {17}{##1}
}
}
}
\__fontspec_define_aat_feature_group:n {Variant}
\keys_define:nn {fontspec-aat}
{
Variant .default:n = {0} ,
Variant / unknown .code:n =
{
\clist_map_inline:nn {#1}
{ \__fontspec_make_AAT_feature:nn {18}{##1} }
}
}
\aliasfontfeature{Variant}{StylisticSet}
\__fontspec_define_aat_feature_group:n {Vertical}
\keys_define:nn {fontspec-aat}
{
Vertical .choice: ,
Vertical / RotatedGlyphs .code:n =
{
\__fontspec_update_featstr:n {vertical}
}
}
\__fontspec_define_aat_feature_group:n {Style}
\__fontspec_define_aat_feature:nnnn {Style} {Italic} {32} {2}
\__fontspec_define_aat_feature:nnnn {Style} {Ruby} {28} {2}
\__fontspec_define_aat_feature:nnnn {Style} {Display} {19} {1}
\__fontspec_define_aat_feature:nnnn {Style} {Engraved} {19} {2}
\__fontspec_define_aat_feature:nnnn {Style} {Titling} {19} {4}
\__fontspec_define_aat_feature:nnnn {Style} {TitlingCaps} {19} {4} % backwards compat
\__fontspec_define_aat_feature:nnnn {Style} {TallCaps} {19} {5}
\__fontspec_define_aat_feature_group:n {CJKShape}
\__fontspec_define_aat_feature:nnnn {CJKShape} {Traditional} {20} {0}
\__fontspec_define_aat_feature:nnnn {CJKShape} {Simplified} {20} {1}
\__fontspec_define_aat_feature:nnnn {CJKShape} {JIS1978} {20} {2}
\__fontspec_define_aat_feature:nnnn {CJKShape} {JIS1983} {20} {3}
\__fontspec_define_aat_feature:nnnn {CJKShape} {JIS1990} {20} {4}
\__fontspec_define_aat_feature:nnnn {CJKShape} {Expert} {20} {10}
\__fontspec_define_aat_feature:nnnn {CJKShape} {NLC} {20} {13}
\__fontspec_define_aat_feature_group:n {CharacterWidth}
\__fontspec_define_aat_feature:nnnn {CharacterWidth} {Proportional} {22} {0}
\__fontspec_define_aat_feature:nnnn {CharacterWidth} {Full} {22} {1}
\__fontspec_define_aat_feature:nnnn {CharacterWidth} {Half} {22} {2}
\__fontspec_define_aat_feature:nnnn {CharacterWidth} {Third} {22} {3}
\__fontspec_define_aat_feature:nnnn {CharacterWidth} {Quarter} {22} {4}
\__fontspec_define_aat_feature:nnnn {CharacterWidth} {AlternateProportional} {22} {5}
\__fontspec_define_aat_feature:nnnn {CharacterWidth} {AlternateHalf} {22} {6}
\__fontspec_define_aat_feature:nnnn {CharacterWidth} {Default} {22} {7}
\__fontspec_define_aat_feature_group:n {Annotation}
\__fontspec_define_aat_feature:nnnn {Annotation} {Off} {24} {0}
\__fontspec_define_aat_feature:nnnn {Annotation} {Box} {24} {1}
\__fontspec_define_aat_feature:nnnn {Annotation} {RoundedBox} {24} {2}
\__fontspec_define_aat_feature:nnnn {Annotation} {Circle} {24} {3}
\__fontspec_define_aat_feature:nnnn {Annotation} {BlackCircle} {24} {4}
\__fontspec_define_aat_feature:nnnn {Annotation} {Parenthesis} {24} {5}
\__fontspec_define_aat_feature:nnnn {Annotation} {Period} {24} {6}
\__fontspec_define_aat_feature:nnnn {Annotation} {RomanNumerals} {24} {7}
\__fontspec_define_aat_feature:nnnn {Annotation} {Diamond} {24} {8}
\__fontspec_define_aat_feature:nnnn {Annotation} {BlackSquare} {24} {9}
\__fontspec_define_aat_feature:nnnn {Annotation} {BlackRoundSquare} {24} {10}
\__fontspec_define_aat_feature:nnnn {Annotation} {DoubleCircle} {24} {11}
%%^^A%% fontspec-code-enc.dtx -- part of FONTSPEC <wspr.io/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 <wspr.io/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 <wspr.io/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 <wspr.io/fontspec>
\providecommand*\scitdefault{\scdefault\itdefault}
\providecommand*\scsldefault{\scdefault\sldefault}
\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 \itdefault \scdefault } {\scitdefault}
\tl_const:cn { \__fontspec_shape_merge:nn \sldefault \scdefault } {\scsldefault}
\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 \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_if_exist:NTF \DeclareFontSeriesChangeRule
{
\cs_set_eq:NN \emfontdeclare \DeclareEmphSequence
}
{
\DeclareRobustCommand{\sishape}
{
\not@math@alphabet\sishape\relax
\fontshape{\scitdefault}\selectfont
}
\DeclareTextFontCommand{\textsi}{\sishape}
\cs_new:Nn \__fontspec_merge_shape:n
{
\__fontspec_if_merge_shape:nTF {#1}
{ \fontshape { \tl_use:c { \__fontspec_shape_merge:nn {\f@shape} {#1} } } \selectfont }
{ \fontshape {#1} \selectfont }
}
\DeclareRobustCommand \itshape
{
\not@math@alphabet\itshape\mathit
\__fontspec_merge_shape:n\itdefault
}
\DeclareRobustCommand \slshape
{
\not@math@alphabet\slshape\relax
\__fontspec_merge_shape:n\sldefault
}
\DeclareRobustCommand \scshape
{
\not@math@alphabet\scshape\relax
\__fontspec_merge_shape:n\scdefault
}
\DeclareRobustCommand \upshape
{
\not@math@alphabet\upshape\relax
\__fontspec_merge_shape:n\updefault
}
\cs_set_protected:Npn \emfontdeclare #1
{
\prop_gclear:N \g__fontspec_em_prop
\int_zero:N \l__fontspec_emdef_int
\bool_gset_true:N \g__fontspec_em_normalise_slant_bool
\tl_if_in:nnT {#1} {\slshape}
{
\tl_if_in:nnT {#1} {\itshape}
{
\bool_gset_false:N \g__fontspec_em_normalise_slant_bool
}
}
\group_begin:
\normalfont
\clist_map_inline:nn {\emreset,#1}
{
##1
\prop_gput_if_new:NxV \g__fontspec_em_prop { \f@shape } { \l__fontspec_emdef_int }
\prop_gput:Nxn \g__fontspec_em_prop { switch-\int_use:N \l__fontspec_emdef_int } { ##1 }
\int_incr:N \l__fontspec_emdef_int
}
\group_end:
}
\DeclareRobustCommand \em
{
\@nomath\em
\tl_set:Nx \l__fontspec_emshape_query_tl { \f@shape }
\bool_if:NT \g__fontspec_em_normalise_slant_bool
{
\tl_replace_all:Nnn \l__fontspec_emshape_query_tl {/sl} {/it}
}
\prop_get:NxNT \g__fontspec_em_prop { \l__fontspec_emshape_query_tl } \l__fontspec_em_tmp_tl
{
\int_set:Nn \l__fontspec_em_int { \l__fontspec_em_tmp_tl }
}
\int_incr:N \l__fontspec_em_int
\prop_get:NxNTF \g__fontspec_em_prop { switch-\int_use:N \l__fontspec_em_int } \l__fontspec_em_switch_tl
{ \l__fontspec_em_switch_tl }
{
\int_zero:N \l__fontspec_em_int
\emreset
}
}
\DeclareTextFontCommand{\emph}{\em}
\cs_set:Npn \emreset { \upshape }
\cs_set:Npn \emshape { \itshape }
\cs_set:Npn \eminnershape { \upshape }
\emfontdeclare{ \emshape, \eminnershape }
\cs_new:Nn \fontspec_set_em_level:n { \int_set:Nn \l__fontspec_em_int {#1} }
}
\cs_set_protected:Npn \strongfontdeclare #1
{
\prop_gclear:N \g__fontspec_strong_prop
\int_zero:N \l__fontspec_strongdef_int
\group_begin:
\normalfont
\clist_map_inline:nn {\strongreset,#1}
{
##1
\prop_gput_if_new:NxV \g__fontspec_strong_prop { \f@series } { \l__fontspec_strongdef_int }
\prop_gput:Nxn \g__fontspec_strong_prop { switch-\int_use:N \l__fontspec_strongdef_int } { ##1 }
\int_incr:N \l__fontspec_strongdef_int
}
\group_end:
}
\DeclareRobustCommand \strongenv
{
\@nomath\strongenv
\prop_get:NxNT \g__fontspec_strong_prop { \f@series } \l__fontspec_strong_tmp_tl
{
\int_set:Nn \l__fontspec_strong_int { \l__fontspec_strong_tmp_tl }
}
\int_incr:N \l__fontspec_strong_int
\prop_get:NxNTF \g__fontspec_strong_prop { switch-\int_use:N \l__fontspec_strong_int } \l__fontspec_strong_switch_tl
{ \l__fontspec_strong_switch_tl }
{
\int_zero:N \l__fontspec_strong_int
\strongreset
}
}
\DeclareTextFontCommand{\strong}{\strongenv}
\cs_set:Npn \strongreset {}
\cs_set:Npn \reset@font
{
\normalfont
\int_zero:N \l__fontspec_em_int
\int_zero:N \l__fontspec_strong_int
}
\cs_new:Nn \fontspec_set_strong_level:n { \int_set:Nn \l__fontspec_strong_int {#1} }
\strongfontdeclare{ \bfseries }