summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/pdfmanagement-testphase
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2022-06-15 03:00:50 +0000
committerNorbert Preining <norbert@preining.info>2022-06-15 03:00:50 +0000
commitda68bce1d25d68087ca3b70134a61ae1c3a96b67 (patch)
tree4d176d7c6b7c9bdbe49b9d24d72b61493ff25dc1 /macros/latex/contrib/pdfmanagement-testphase
parent0123ca8e30234615dca0d8853dffec2fb93fe9a8 (diff)
CTAN sync 202206150300
Diffstat (limited to 'macros/latex/contrib/pdfmanagement-testphase')
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md8
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/README.md2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/fontspec-luatex-tmp-ltx.sty3888
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdfbin953118 -> 953783 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/hyperxmp-patches-tmp-ltx.sty2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx14
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdfbin682110 -> 682784 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdfbin577528 -> 578204 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdfbin505145 -> 506128 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdfbin546572 -> 547234 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdfbin529620 -> 530285 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdfbin532810 -> 533482 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdfbin524996 -> 525675 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdfbin580444 -> 581124 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdfbin504246 -> 504914 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdfbin738718 -> 739385 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdfbin551839 -> 552527 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdfbin673287 -> 674451 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdfbin672124 -> 672805 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdfbin517003 -> 517685 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdfbin416870 -> 417902 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdfbin573044 -> 573866 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/luaotfload-l3color-tmp.lua78
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/output-patches-tmp-ltx.pdfbin385112 -> 385316 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdflscape-ltx.sty2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx43
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdfbin419517 -> 426234 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx6
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdfbin445946 -> 447021 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/transparent-ltx.sty2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty7
49 files changed, 4061 insertions, 47 deletions
diff --git a/macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md b/macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md
index 17c90a18ae..5ab0105eb4 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md
+++ b/macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md
@@ -5,6 +5,14 @@ first release 0.95a, 2021-02-23 will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
this project uses date-based 'snapshot' version identifiers.
+## [2022-06-14]
+### Fixed
+ - avoid errors with spot color models
+ - opacity of fontspec (issue #30)
+### Added
+ - firstaid support for spot colors for open type fonts
+
+
## [2022-05-11]
### Added
diff --git a/macros/latex/contrib/pdfmanagement-testphase/README.md b/macros/latex/contrib/pdfmanagement-testphase/README.md
index cd4af9c120..02fbfb8bfb 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/README.md
+++ b/macros/latex/contrib/pdfmanagement-testphase/README.md
@@ -1,6 +1,6 @@
# LaTeX PDF management testphase bundle
-Version: 0.95o, 2022-05-11
+Version: 0.95p, 2022-06-14
This package is used during a test phase to load the new PDF management code
of LaTeX.
diff --git a/macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty
index 6c06a0022d..6953affb0f 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty
+++ b/macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty
@@ -24,7 +24,7 @@
%% This file has the LPPL maintenance status "maintained".
%%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesPackage{color-ltx}[2022-05-11 v0.95o
+\ProvidesPackage{color-ltx}[2022-06-14 v0.95p
Standard LaTeX Color (patched for l3color, part of pdfmanagement-testphase, original version 2022/01/06 v1.3d) (DPC)]
\edef\Gin@codes{%
\catcode`\noexpand\^^A\the\catcode`\^^A\relax
diff --git a/macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty
index 7bef618163..3e5c7f6d55 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty
+++ b/macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty
@@ -19,7 +19,7 @@
%
% for those people who are interested.
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
-\ProvidesExplPackage{colorspace-patches-tmp-ltx}{2022-05-11}{0.95o}
+\ProvidesExplPackage{colorspace-patches-tmp-ltx}{2022-06-14}{0.95p}
{temporay patches to for the colorspace package to test pdfresource management ... UF}
\hook_gput_code:nnn {begindocument} {pdf}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/fontspec-luatex-tmp-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/fontspec-luatex-tmp-ltx.sty
new file mode 100644
index 0000000000..913552ee05
--- /dev/null
+++ b/macros/latex/contrib/pdfmanagement-testphase/fontspec-luatex-tmp-ltx.sty
@@ -0,0 +1,3888 @@
+%%
+%% This is file `fontspec-luatex.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% fontspec.dtx (with options: `fontspec,LU')
+%% fontspec-code-load.dtx (with options: `fontspec,LU')
+%% fontspec-code-vars.dtx (with options: `fontspec,LU')
+%% fontspec-code-msg.dtx (with options: `fontspec,LU')
+%% fontspec-code-opening.dtx (with options: `fontspec,LU')
+%% fontspec-code-fontload.dtx (with options: `fontspec,LU')
+%% fontspec-code-interfaces.dtx (with options: `fontspec,LU')
+%% fontspec-code-user.dtx (with options: `fontspec,LU')
+%% fontspec-code-api.dtx (with options: `fontspec,LU')
+%% fontspec-code-internal.dtx (with options: `fontspec,LU')
+%% fontspec-code-opentype.dtx (with options: `fontspec,LU')
+%% fontspec-code-graphite.dtx (with options: `fontspec,LU')
+%% fontspec-code-keyval.dtx (with options: `fontspec,LU')
+%% fontspec-code-feat-opentype.dtx (with options: `fontspec,LU')
+%% fontspec-code-scripts.dtx (with options: `fontspec,LU')
+%% fontspec-code-lang.dtx (with options: `fontspec,LU')
+%% fontspec-code-feat-aat.dtx (with options: `fontspec,LU')
+%% fontspec-code-enc.dtx (with options: `fontspec,LU')
+%% fontspec-code-math.dtx (with options: `fontspec,LU')
+%% fontspec-code-closing.dtx (with options: `fontspec,LU')
+%% fontspec-code-xfss.dtx (with options: `fontspec,LU')
+%% ------------------------------------------------
+%% The FONTSPEC package <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-luatex-tmp-ltx}%
+ {2022/01/15}{2022-06-14}{0.95p}
+
+%%^^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_sw_clist
+\clist_new:N \l__fontspec_fontfeat_bfsw_clist
+\clist_new:N \l__fontspec_fontfeat_sc_clist
+\prop_new:N \g__fontspec_fontopts_prop
+\prop_new:N \l__fontspec_nfss_prop
+\prop_new:N \l__fontspec_nfssfont_prop
+\prop_new:N \g__fontspec_OT_features_prop
+\prop_new:N \g__fontspec_all_opentype_feature_names_prop
+\prop_new:N \g__fontspec_em_prop
+\prop_new:N \g__fontspec_strong_prop
+\prop_new:N \g__fontspec_fontid_family_prop
+\prop_new:N \g__fontspec_family_int_prop
+\tl_new:N \l_fontspec_family_tl
+\tl_new:N \g_fontspec_encoding_tl
+\tl_new:N \l_fontspec_fontname_tl
+\tl_clear_new:N \UTFencname
+\tl_clear_new:N \cyrillicencoding
+\tl_clear_new:N \latinencoding
+\tl_new:N \l__fontspec_renderer_tl
+\tl_new:N \l__fontspec_mode_tl
+\tl_new:N \l__fontspec_shaper_tl
+\tl_new:N \g__fontspec_defined_shapes_tl
+\tl_new:N \g__fontspec_single_feat_tl
+\tl_new:N \l__fontspec_basename_tl
+\tl_new:N \g__fontspec_curr_series_tl
+\tl_new:N \l__fontspec_curr_fontname_tl
+\tl_new:N \l__fontspec_curr_bfname_tl
+\tl_new:N \l__fontspec_ext_filename_tl
+\tl_new:N \l__fontspec_extension_tl
+\tl_new:N \l__fontspec_font_path_tl
+\tl_new:N \l__fontspec_fontid_tl
+\tl_new:N \l__fontspec_fontname_tl
+\tl_new:N \l__fontspec_options_tl
+\tl_new:N \l__fontspec_saved_fontname_tl
+\tl_new:N \l__fontspec_prev_unicode_name_tl
+\tl_new:N \g__fontspec_nfss_enc_tl
+\tl_new:N \g__fontspec_nfss_family_tl
+\tl_new:N \l__fontspec_nfss_sc_tl
+\tl_new:N \l__fontspec_nfss_tl
+\tl_new:N \l__fontspec_nfss_fam_tl
+\tl_new:N \l__fontspec_size_tl
+\tl_new:N \l__fontspec_sizedfont_tl
+\tl_new:N \l__fontspec_this_font_tl
+\tl_new:N \l__fontspec_ttc_index_tl
+\tl_new:N \l__fontspec_smcp_shape_tl
+\tl_new:N \l__fontspec_emshape_query_tl
+\tl_new:N \l__fontspec_em_switch_tl
+\tl_new:N \l__fontspec_strong_switch_tl
+\tl_new:N \l__fontspec_tmp_tl
+\tl_new:N \l__fontspec_tmpa_tl
+\tl_new:N \l__fontspec_tmpb_tl
+\tl_new:N \l__fontspec_em_tmp_tl
+\tl_new:N \l__fontspec_strong_tmp_tl
+\tl_new:N \g__fontspec_mathrm_tl
+\tl_new:N \g__fontspec_bfmathrm_tl
+\tl_new:N \g__fontspec_mathsf_tl
+\tl_new:N \g__fontspec_mathtt_tl
+\tl_gset:Nn \g__fontspec_mathrm_tl {\rmdefault}
+\tl_gset:Nn \g__fontspec_mathsf_tl {\sfdefault}
+\tl_gset:Nn \g__fontspec_mathtt_tl {\ttdefault}
+\tl_new:N \l__fontspec_family_label_tl
+\tl_new:N \l__fontspec_fake_slant_tl
+\tl_new:N \l__fontspec_fake_embolden_tl
+\tl_new:N \l__fontspec_fontname_up_tl
+\tl_new:N \l__fontspec_fontname_bf_tl
+\tl_new:N \l__fontspec_fontname_it_tl
+\tl_new:N \l__fontspec_fontname_bfit_tl
+\tl_new:N \l__fontspec_fontname_sl_tl
+\tl_new:N \l__fontspec_fontname_bfsl_tl
+\tl_new:N \l__fontspec_fontname_sw_tl
+\tl_new:N \l__fontspec_fontname_bfsw_tl
+\tl_new:N \l__fontspec_fontname_sc_tl
+\tl_new:N \l__fontspec_script_tl
+\tl_new:N \l__fontspec_script_name_tl
+\tl_set:Nn \l__fontspec_script_name_tl {CustomDefault}
+\tl_new:N \l__fontspec_lang_tl
+\tl_new:N \l__fontspec_lang_name_tl
+\tl_set:Nn \l__fontspec_lang_name_tl {Default}
+\tl_new:N \l__fontspec_scale_tl
+\tl_new:N \l__fontspec_hyphenchar_tl
+\tl_new:N \l__fontspec_hexcol_tl
+\tl_new:N \l__fontspec_opacity_tl
+\tl_new:N \l__fontspec_optical_size_tl
+\tl_new:N \l__fontspec_mapping_tl
+\tl_new:N \l__fontspec_punctspace_adjust_tl
+\tl_new:N \l__fontspec_wordspace_adjust_tl
+\tl_new:N \l__fontspec_postadjust_tl
+\tl_const:Nn \c__fontspec_hexcol_tl {000000}
+ \tl_const:Nn \c__fontspec_opacity_tl {}
+\tl_const:Nn \c__fontspec_postadjust_tl { \l__fontspec_wordspace_adjust_tl \l__fontspec_punctspace_adjust_tl }
+\tl_new:N \g__fontspec_rawfeatures_sclist
+\tl_new:N \l__fontspec_pre_feat_sclist
+\tl_new:N \l__fontspec_rmfamily_family_tl
+\tl_new:N \l__fontspec_sffamily_family_tl
+\tl_new:N \l__fontspec_ttfamily_family_tl
+\tl_new:N \l__fontspec_rmfamily_encoding_tl
+\tl_new:N \l__fontspec_sffamily_encoding_tl
+\tl_new:N \l__fontspec_ttfamily_encoding_tl
+
+%%^^A%% fontspec-code-msg.dtx -- part of FONTSPEC <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_error:nxx { \msg_error:nnxx {fontspec} }
+\cs_new:Npn \__fontspec_warning:n { \msg_warning:nn {fontspec} }
+\cs_new:Npn \__fontspec_warning:nx { \msg_warning:nnx {fontspec} }
+\cs_new:Npn \__fontspec_warning:nxx { \msg_warning:nnxx {fontspec} }
+\cs_new:Npn \__fontspec_info:n { \msg_info:nn {fontspec} }
+\cs_new:Npn \__fontspec_info:nx { \msg_info:nnx {fontspec} }
+\cs_new:Npn \__fontspec_info:nxx { \msg_info:nnxx {fontspec} }
+\cs_new:Npn \__fontspec_trace:n { \msg_trace:nn {fontspec} }
+\cs_generate_variant:Nn \msg_new:nnn {nnx}
+\cs_generate_variant:Nn \msg_new:nnnn {nnxx}
+\cs_new:Nn \__fontspec_msg_new:nn
+ { \msg_new:nnx {fontspec} {#1} { \tl_trim_spaces:n {#2} } }
+\cs_new:Nn \__fontspec_msg_new:nnn
+ { \msg_new:nnxx {fontspec} {#1} { \tl_trim_spaces:n {#2} } { \tl_trim_spaces:n {#3} } }
+\char_set_catcode_space:n {32}
+\__fontspec_msg_new:nn {only-inside-encdef}
+ {
+ \exp_not:N #1 can only be used in the second argument
+ to \string\DeclareUnicodeEncoding.
+ }
+\__fontspec_msg_new:nn {no-size-info}
+ {
+ Size information must be supplied.\\
+ For example, SizeFeatures={Size={8-12},...}.
+ }
+\__fontspec_msg_new:nnn {font-not-found}
+ {
+ The font "#1" cannot be found.
+ }
+ {
+ A font might not be found for many reasons.\\
+ Check the spelling, where the font is installed etc. etc.\\\\
+ When in doubt, ask someone for help!
+ }
+\__fontspec_msg_new:nnn {rename-feature-not-exist}
+ {
+ The feature #1 doesn't appear to be defined.
+ }
+ {
+ It looks like you're trying to rename a feature that doesn't exist.
+ }
+\__fontspec_msg_new:nn {no-glyph}
+ {
+ '#1' does not contain glyph #2.
+ }
+\__fontspec_msg_new:nnn {euler-too-late}
+ {
+ The euler package must be loaded BEFORE fontspec.
+ }
+ {
+ fontspec only overwrites euler's attempt to
+ define the maths text fonts if fontspec is
+ loaded after euler. Type <return> to proceed
+ with incorrect \string\mathit, \string\mathbf, etc.
+ }
+\__fontspec_msg_new:nnn {no-xcolor}
+ {
+ Cannot load named colours without the xcolor package.
+ }
+ {
+ Sorry, I can't do anything to help. Instead of loading
+ the color package, use xcolor instead.
+ }
+\__fontspec_msg_new:nnn {unknown-color-model}
+ {
+ Error loading colour `#1'; unknown colour model.
+ }
+ {
+ Sorry, I can't do anything to help. Please report this error
+ to my developer with a minimal example that causes the problem.
+ }
+\__fontspec_msg_new:nnn {not-in-addfontfeatures}
+ {
+ The "#1" font feature cannot be used in \string\addfontfeatures.
+ }
+ {
+ This is due to how TeX loads fonts; such settings
+ are global so adding them mid-document within a group causes
+ confusion. You'll need to define multiple font families to achieve
+ what you want.
+ }
+\__fontspec_msg_new:nn {tu-clash}
+ {
+ I have found the tuenc.def encoding definition file but the TU encoding is not
+ defined by the LaTeX2e kernel; attempting to correct but you really should update
+ to the latest version of LaTeX2e.
+ }
+\__fontspec_msg_new:nn {tu-missing}
+ {
+ The TU encoding seems to be missing; please update to the latest version of LaTeX2e.
+ }
+\__fontspec_msg_new:nn {addfontfeatures-ignored}
+ {
+ \string\addfontfeature (s) ignored \msg_line_context:;
+ it cannot be used with a font that wasn't selected by a fontspec command.\\
+ \\
+ The current font is "\use:c{font@name}".\\
+ \int_compare:nTF { \clist_count:n {#1} = 1 }
+ { The requested feature is "#1". }
+ { The requested features are "#1". }
+ }
+\__fontspec_msg_new:nn {feature-option-overwrite}
+ {
+ Option '#2' of font feature '#1' overwritten.
+ }
+\__fontspec_msg_new:nn {ot-tag-too-long}
+ {
+ OpenType tag '#1' is too long; script, language, and feature tags must be four characters or fewer.
+ }
+\__fontspec_msg_new:nn {aat-feature-not-exist}
+ {
+ '\l_keys_key_tl=\l_keys_value_tl' feature not supported
+ for AAT font '\l_fontspec_fontname_tl'.
+ }
+\__fontspec_msg_new:nn {aat-feature-not-exist-in-font}
+ {
+ AAT feature '\l_keys_key_tl=\l_keys_value_tl' (#1) not available
+ in font '\l_fontspec_fontname_tl'.
+ }
+\__fontspec_msg_new:nn {icu-feature-not-exist}
+ {
+ '\l_keys_key_tl=\l_keys_value_tl' feature not supported
+ for OpenType font '\l_fontspec_fontname_tl'
+ }
+\__fontspec_msg_new:nn {icu-feature-not-exist-in-font}
+ {
+ OpenType feature '\l_keys_key_tl=\l_keys_value_tl' (#1) not available
+ for font '\l_fontspec_fontname_tl'
+ with script '\l__fontspec_script_name_tl' and language '\l__fontspec_lang_name_tl'.
+ }
+\__fontspec_msg_new:nn {no-opticals}
+ {
+ '#1' doesn't appear to have an Optical Size axis.
+ }
+\__fontspec_msg_new:nn {language-not-exist}
+ {
+ Language '#1' not available
+ for font '\l_fontspec_fontname_tl'
+ with script '\l__fontspec_script_name_tl'.
+ }
+\__fontspec_msg_new:nn {only-xetex-feature}
+ {
+ Ignored XeTeX-only feature: '#1'.
+ }
+\__fontspec_msg_new:nn {only-luatex-feature}
+ {
+ Ignored LuaTeX-only feature: '#1'.
+ }
+\__fontspec_msg_new:nn {unknown-renderer}
+ {
+ Renderer '#1' unknown. Assuming Harfbuzz with 'shaper=#1'.
+ Please raise a fontspec issue to add this shaper to the interface.
+ }
+\__fontspec_msg_new:nn {no-mapping}
+ {
+ Input mapping not supported in LuaTeX.
+ }
+\__fontspec_msg_new:nn {no-mapping-ligtex}
+ {
+ Input mapping not supported in LuaTeX.\\
+ Use "Ligatures=TeX" instead of "Mapping=tex-text".
+ }
+\__fontspec_msg_new:nn {cm-default-obsolete}
+ {
+ The "cm-default" package option is obsolete.
+ }
+\__fontspec_msg_new:nn {font-index-needs-ttc}
+ {
+ The "FontIndex" feature is only supported by TTC (TrueType Collection) fonts.\\
+ Feature ignored.
+ }
+\__fontspec_msg_new:nn {feat-cannot-remove}
+ {
+ The "#1" feature cannot be deactivated. Request ignored.
+ }
+\__fontspec_msg_new:nn {defining-font}
+ {
+ Font family '\g__fontspec_nfss_family_tl' created for font '#2'
+ with options [\l__fontspec_all_features_clist].\\
+ \\
+ This font family consists of the following NFSS series/shapes:\\
+ \g__fontspec_defined_shapes_tl
+ }
+\__fontspec_msg_new:nn {no-font-shape}
+ {
+ Could not resolve font "#1" (it probably doesn't exist).
+ }
+\__fontspec_msg_new:nn {set-scale}
+ {
+ \l_fontspec_fontname_tl\space scale = \l__fontspec_scale_tl.
+ }
+\__fontspec_msg_new:nn {setup-math}
+ {
+ Adjusting the maths setup (use [no-math] to avoid this).
+ }
+\__fontspec_msg_new:nn {no-script}
+ {
+ Font "#1" does not contain requested Script "#2".
+ }
+\__fontspec_msg_new:nn {opa-twice}
+ {
+ Opacity set twice, in both Colour and Opacity.\\
+ Using specification "Opacity=#1".
+ }
+\__fontspec_msg_new:nn {opa-twice-col}
+ {
+ Opacity set twice, in both Opacity and Colour.\\
+ Using an opacity specification in hex of "#1/FF".
+ }
+\__fontspec_msg_new:nn {bad-colour}
+ {
+ Bad colour declaration "#1".
+ Colour must be one of:\\
+ * a named xcolor colour\\
+ * a six-digit hex colour RRGGBB\\
+ * an eight-digit hex colour RRGGBBTT with opacity
+ }
+\char_set_catcode_ignore:n {32}
+
+%%^^A%% fontspec-code-opening.dtx -- part of FONTSPEC <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 {EU2}
+ }
+ { \tl_gset:Nn \g_fontspec_encoding_tl { TU } }
+\tl_set:Nn \rmdefault {lmr}
+\tl_set:Nn \sfdefault {lmss}
+\tl_set:Nn \ttdefault {lmtt}
+\RequirePackage[\g_fontspec_encoding_tl]{fontenc}
+\tl_set_eq:NN \UTFencname \g_fontspec_encoding_tl % for xunicode if needed
+\tl_if_in:NnT \@filelist {.cls} { \normalsize }
+\tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl
+\tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl
+\AtBeginDocument
+ {
+ \tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl
+ \tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl
+ }
+\bool_if:NT \g__fontspec_euenc_bool
+ {
+ \cs_set_eq:NN \fontspec_tmp: \XeTeXpicfile
+ \cs_set:Npn \XeTeXpicfile {}
+ \RequirePackage{xunicode}
+ \cs_set_eq:NN \XeTeXpicfile \fontspec_tmp:
+ }
+\cs_new:Npn \FontspecSetCheckBoolTrue { \bool_set_true:N \l__fontspec_check_bool }
+\cs_new:Npn \FontspecSetCheckBoolFalse { \bool_set_false:N \l__fontspec_check_bool }
+\cs_new:Nn \__fontspec_keys_set_known:nnN
+ {
+ \keys_set_known:nnN {#1} {#2} #3
+ }
+\cs_generate_variant:Nn \__fontspec_keys_set_known:nnN {nx}
+\cs_new:Nn \__fontspec_int_mult_truncate:Nn
+ {
+ \int_set:Nn #1 { \__dim_eval:w #2 #1 \__dim_eval_end: }
+ }
+\cs_set:Npn \__fontspec_lua_function:ne #1#2 { \lua_now:e { fontspec.#1 ("#2") } }
+\cs_set:Npn \__fontspec_lua_function:nee #1#2#3 { \lua_now:e { fontspec.#1 ("#2","#3") } }
+\cs_set:Npn \__fontspec_lua_function:neee #1#2#3#4 { \lua_now:e { fontspec.#1 ("#2","#3","#4") } }
+\cs_set:Npn \__fontspec_lua_function:neeee #1#2#3#4#5 { \lua_now:e { fontspec.#1 ("#2","#3","#4","#5") } }
+\cs_generate_variant:Nn \int_set:Nn {Nv}
+\cs_generate_variant:Nn \keys_set:nn {nx}
+\cs_generate_variant:Nn \keys_set_known:nnN {nx}
+\cs_generate_variant:Nn \prop_put:Nnn {Nxx}
+\cs_generate_variant:Nn \prop_put:Nnn {NxV}
+\cs_generate_variant:Nn \prop_gput_if_new:Nnn {NxV}
+\cs_generate_variant:Nn \prop_gput:Nnn {Nxn}
+\cs_generate_variant:Nn \prop_get:NnNT {NxN}
+\cs_generate_variant:Nn \prop_get:NnNTF {NxN}
+\cs_generate_variant:Nn \str_if_eq:nnTF {nv}
+\cs_generate_variant:Nn \tl_if_empty_p:n {e}
+\cs_generate_variant:Nn \tl_if_empty:nTF {x}
+\cs_generate_variant:Nn \tl_if_empty:nF {x}
+\cs_generate_variant:Nn \tl_if_empty:nF {f}
+\cs_generate_variant:Nn \tl_if_eq:nnT {ox}
+\cs_generate_variant:Nn \tl_replace_all:Nnn {Nnx}
+
+%%^^A%% fontspec-code-fontload.dtx -- part of FONTSPEC <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 {Renderer=Basic,#1} {#2}
+ \__fontspec_setmathrm_hook:nn {#1} {#2} % for unicode-math only
+ }
+\cs_new:Nn \__fontspec_main_setboldmathrm:nn
+ {
+ \fontspec_gset_family:Nnn \g__fontspec_bfmathrm_tl {Renderer=Basic,#1} {#2}
+ \__fontspec_setboldmathrm_hook:nn {#1} {#2} % for unicode-math only
+ }
+\cs_new:Nn \__fontspec_main_setmathsf:nn
+ {
+ \fontspec_gset_family:Nnn \g__fontspec_mathsf_tl {Renderer=Basic,#1} {#2}
+ \__fontspec_setmathsf_hook:nn {#1} {#2} % for unicode-math only
+ }
+\cs_new:Nn \__fontspec_main_setmathtt:nn
+ {
+ \fontspec_gset_family:Nnn \g__fontspec_mathtt_tl {Renderer=Basic,#1} {#2}
+ \__fontspec_setmathtt_hook:nn {#1} {#2} % for unicode-math only
+ }
+\cs_set_eq:NN \__fontspec_setmainfont_hook:nn \use_none:nn
+\cs_set_eq:NN \__fontspec_setsansfont_hook:nn \use_none:nn
+\cs_set_eq:NN \__fontspec_setmonofont_hook:nn \use_none:nn
+\cs_set_eq:NN \__fontspec_setmathrm_hook:nn \use_none:nn
+\cs_set_eq:NN \__fontspec_setmathsf_hook:nn \use_none:nn
+\cs_set_eq:NN \__fontspec_setmathtt_hook:nn \use_none:nn
+\cs_set_eq:NN \__fontspec_setboldmathrm_hook:nn \use_none:nn
+\@onlypreamble\setmathrm
+\@onlypreamble\setboldmathrm
+\@onlypreamble\setmathsf
+\@onlypreamble\setmathtt
+\tl_gset:Nn \g__fontspec_mathrm_tl {\rmdefault}
+\tl_gset:Nn \g__fontspec_mathsf_tl {\sfdefault}
+\tl_gset:Nn \g__fontspec_mathtt_tl {\ttdefault}
+\cs_new:Nn \__fontspec_main_newfontfamily:NnnN
+ {
+ \fontspec_set_family:cnn { l__fontspec_ \cs_to_str:N #1 _family_tl } {#2} {#3}
+ \use:x
+ {
+ \exp_not:N #4 \exp_not:N #1 {}
+ {
+ \exp_not:N \fontfamily { \use:c { l__fontspec_ \cs_to_str:N #1 _family_tl } }
+ \exp_not:N \fontencoding { \g__fontspec_nfss_enc_tl }
+ \exp_not:N \selectfont
+ }
+ }
+ }
+\cs_new:Nn \__fontspec_main_newfontface:NnnN
+ {
+ \__fontspec_main_newfontfamily:NnnN #1 { BoldFont={},ItalicFont={},SmallCapsFont={},#2 } {#3} #4
+ }
+\cs_new:Nn \__fontspec_set_default_features:nn
+ {
+ \IfBooleanTF {#1} \clist_gput_right:Nn \clist_gset:Nn
+ \g__fontspec_default_fontopts_clist {#2}
+ }
+\cs_new:Nn \__fontspec_set_font_default_features:nnn
+ {
+ \clist_map_inline:nn {#2}
+ {
+ \tl_if_single:nTF {##1}
+ { \tl_set:No \l__fontspec_tmp_tl { \cs:w l__fontspec_ \cs_to_str:N ##1 _family_tl\cs_end: } }
+ { \__fontspec_sanitise_fontname:Nn \l__fontspec_tmp_tl {##1} }
+
+ \IfBooleanTF {#1}
+ {
+ \prop_get:NVNF \g__fontspec_fontopts_prop \l__fontspec_tmp_tl \l__fontspec_tmpb_tl
+ { \tl_clear:N \l__fontspec_tmpb_tl }
+ \tl_put_right:Nn \l__fontspec_tmpb_tl {#3,}
+ \prop_gput:NVV \g__fontspec_fontopts_prop \l__fontspec_tmp_tl \l__fontspec_tmpb_tl
+ }
+ {
+ \tl_if_empty:nTF {#3}
+ { \prop_gremove:NV \g__fontspec_fontopts_prop \l__fontspec_tmp_tl }
+ { \prop_gput:NVn \g__fontspec_fontopts_prop \l__fontspec_tmp_tl {#3,} }
+ }
+ }
+ }
+\cs_new:Nn \__fontspec_main_addfontfeatures:n
+ {
+ \fontspec_if_fontspec_font:TF
+ {
+ \group_begin:
+ \keys_set_known:nnN {fontspec-addfeatures} {#1} \l__fontspec_tmp_tl
+ \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {options} \l__fontspec_options_tl
+ \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {fontname} \l__fontspec_fontname_tl
+ \bool_set_true:N \l__fontspec_disable_defaults_bool
+ \use:x
+ {
+ \__fontspec_select_font_family:nn
+ { \l__fontspec_options_tl , #1 } {\l__fontspec_fontname_tl}
+ }
+ \group_end:
+ \fontfamily \g__fontspec_nfss_family_tl \selectfont
+ }
+ {
+ \__fontspec_warning:nx {addfontfeatures-ignored} {#1}
+ }
+ \ignorespaces
+ }
+\cs_new:Nn \__fontspec_main_newfontfeature:nn
+ {
+ \keys_define:nn { fontspec }
+ {
+ #1 .code:n = { \__fontspec_update_featstr:n {#2} }
+ }
+ }
+\cs_new:Nn \__fontspec_main_newAATfeature:nnnn
+ {
+ \keys_if_exist:nnF { fontspec } {#1}
+ { \__fontspec_define_aat_feature_group:n {#1} }
+
+ \keys_if_choice_exist:nnnT {fontspec} {#1} {#2}
+ { \__fontspec_warning:nxx {feature-option-overwrite} {#1} {#2} }
+
+ \__fontspec_define_aat_feature:nnnn {#1}{#2}{#3}{#4}
+ }
+\cs_new:Nn \__fontspec_main_newopentypefeature:nnn
+ {
+ \keys_if_exist:nnF { fontspec / options } {#1}
+ { \__fontspec_define_opentype_feature_group:n {#1} }
+
+ \keys_if_choice_exist:nnnT {fontspec} {#1} {#2}
+ { \__fontspec_warning:nxx {feature-option-overwrite} {#1} {#2} }
+
+ \exp_args:Nnnx \__fontspec_define_opentype_feature:nnnnn
+ {#1} {#2} { \__fontspec_strip_plus_minus:n {#3} } {#3} {}
+ }
+\cs_new:Nn \__fontspec_strip_plus_minus:n { \__fontspec_strip_plus_minus_aux:Nq #1 \q_nil }
+\cs_new:Npn \__fontspec_strip_plus_minus_aux:Nq #1#2 \q_nil
+ {
+ \str_case:nnF {#1} { {+} {#2} {-} {#2} } {#1#2}
+ }
+\cs_new:Nn \__fontspec_main_aliasfontfeature:nn
+ {
+ \bool_set_false:N \l__fontspec_alias_bool
+
+ \clist_map_inline:Nn \g__fontspec_all_keyval_modules_clist
+ {
+ \keys_if_exist:nnT {##1} {#1}
+ {
+ \bool_set_true:N \l__fontspec_alias_bool
+ \keys_define:nn {##1}
+ { #2 .code:n = { \keys_set:nn {##1} { #1 = {####1} } } }
+ }
+ }
+
+ \bool_if:NF \l__fontspec_alias_bool
+ { \__fontspec_warning:nx {rename-feature-not-exist} {#1} }
+ }
+\cs_new:Nn \__fontspec_main_aliasfontfeatureoption:nnn
+ {
+ \bool_set_false:N \l__fontspec_alias_bool
+
+ \clist_map_inline:Nn \g__fontspec_all_keyval_modules_clist
+ {
+ \keys_if_exist:nnT { ##1 / #1 } {#2}
+ {
+ \bool_set_true:N \l__fontspec_alias_bool
+ \keys_define:nn { ##1 / #1 }
+ { #3 .code:n = { \keys_set:nn {##1} { #1 = {#2} } } }
+ }
+
+ \keys_if_exist:nnT { ##1 / #1 } {#2Reset}
+ {
+ \keys_define:nn { ##1 / #1 }
+ { #3Reset .code:n = { \keys_set:nn {##1} { #1 = {#2Reset} } } }
+ }
+
+ \keys_if_exist:nnT { ##1 / #1 } {#2Off}
+ {
+ \keys_define:nn { ##1 / #1 }
+ { #3Off .code:n = { \keys_set:nn {##1} { #1 = {#2Off} } } }
+ }
+ }
+
+ \bool_if:NF \l__fontspec_alias_bool
+ { \__fontspec_warning:nx {rename-feature-not-exist} {#1/#2} }
+ }
+\cs_new:Nn \__fontspec_main_DeclareFontExtensions:n
+ {
+ \clist_set:Nn \l__fontspec_extensions_clist { #1 }
+ }
+\__fontspec_main_DeclareFontExtensions:n {.otf,.ttf,.OTF,.TTF,.ttc,.TTC,.dfont}
+\cs_new:Nn \__fontspec_main_IfFontFeatureActiveTF:nnn
+ {
+ \__fontspec_if_font_feature:nTF {#1} {#2} {#3}
+ }
+\prg_new_conditional:Nnn \__fontspec_if_font_feature:n {TF}
+ {
+ \tl_gclear:N \g__fontspec_single_feat_tl
+ \group_begin:
+ \__fontspec_font_suppress_not_found_error:
+ \__fontspec_init:
+ \bool_set_true:N \l__fontspec_ot_bool
+ \bool_set_true:N \l__fontspec_never_check_bool
+ \bool_set_false:N \l__fontspec_firsttime_bool
+ \clist_clear:N \l__fontspec_fontfeat_clist
+ \__fontspec_get_features:n {#1}
+ \group_end:
+
+
+ \tl_if_empty:NTF \g__fontspec_single_feat_tl { \prg_return_false: }
+ {
+ \exp_args:NV \fontspec_if_current_feature:nTF \g__fontspec_single_feat_tl
+ { \prg_return_true: } { \prg_return_false: }
+ }
+ }
+\cs_new_protected:Nn \__fontspec_main_oldstylenums:n
+ {
+ \group_begin:
+ \addfontfeature{Numbers=OldStyle}
+ #1
+ \group_end:
+ }
+\cs_new_protected:Nn \__fontspec_main_liningnums:n
+ {
+ \group_begin:
+ \addfontfeature{Numbers=Lining}
+ #1
+ \group_end:
+ }
+
+%%^^A%% fontspec-code-api.dtx -- part of FONTSPEC <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:N \l_fontspec_fontname_tl
+
+ \__fontspec_extract_all_features:n {#1}
+ \tl_set:Nx \l__fontspec_fontid_tl { \tl_to_str:N \l_fontspec_fontname_tl-:-\tl_to_str:N \l__fontspec_all_features_clist }
+
+
+ \__fontspec_preparse_features:
+ \__fontspec_load_font:
+ \__fontspec_set_scriptlang:
+ \__fontspec_get_features:n {}
+ \bool_set_false:N \l__fontspec_firsttime_bool
+
+ \__fontspec_save_family_needed:nTF {#2}
+ {
+ \__fontspec_save_family:nn {#1} {#2}
+ }
+ {
+ }
+ \group_end:
+
+ \tl_set_eq:NN \l_fontspec_family_tl \g__fontspec_nfss_family_tl
+ }
+\cs_set_eq:NN \fontspec_select:nn \__fontspec_select_font_family:nn %% deprecated, for compatibility only
+\cs_new:Nn \__fontspec_sanitise_fontname:Nn
+ {
+ \tl_set:Nx #1 {#2}
+ \tl_remove_all:Nn #1 {~}
+ \clist_map_inline:Nn \l__fontspec_extensions_clist
+ {
+ \tl_if_in:NnT #1 {##1}
+ {
+ \tl_remove_once:Nn #1 {##1}
+ \tl_set:Nn \l__fontspec_extension_tl {##1}
+ \clist_map_break:
+ }
+ }
+ }
+\prg_new_conditional:Nnn \__fontspec_if_detect_external:n {T}
+ {
+ \clist_map_inline:Nn \l__fontspec_extensions_clist
+ {
+ \bool_set_false:N \l__fontspec_tmpa_bool
+ \exp_args:Nx % <- this should be handled earlier
+ \tl_if_in:nnT {#1 <= end_of_string} {##1 <= end_of_string}
+ { \bool_set_true:N \l__fontspec_tmpa_bool \clist_map_break: }
+ }
+ \bool_if:NTF \l__fontspec_tmpa_bool \prg_return_true: \prg_return_false:
+ }
+\cs_new:Nn \__fontspec_init_ttc:n
+ {
+ \str_if_eq:eeT { \str_lowercase:f {\l__fontspec_extension_tl} } {.ttc}
+ {
+ \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_it_tl {#1}
+ \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_bf_tl {#1}
+ \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_bfit_tl {#1}
+ }
+ }
+\cs_new:Nn \__fontspec_load_external_fontoptions:N
+ {
+ \bool_if:NT \l__fontspec_fontcfg_bool
+ {
+ \tl_set:Nx \l__fontspec_ext_filename_tl {#1.fontspec}
+ \tl_remove_all:Nn \l__fontspec_ext_filename_tl {~}
+ \prop_if_in:NVF \g__fontspec_fontopts_prop #1
+ {
+ \exp_args:No \file_if_exist:nT { \l__fontspec_ext_filename_tl }
+ { \file_input:n { \l__fontspec_ext_filename_tl } }
+ }
+ }
+ }
+\cs_new:Nn \__fontspec_extract_all_features:n
+ {
+ \bool_if:NTF \l__fontspec_disable_defaults_bool
+ {
+ \clist_set:Nx \l__fontspec_all_features_clist {#1}
+ }
+ {
+ \prop_get:NVNF \g__fontspec_fontopts_prop \l_fontspec_fontname_tl \l__fontspec_fontopts_clist
+ { \clist_clear:N \l__fontspec_fontopts_clist }
+
+ \prop_get:NVNF \g__fontspec_fontopts_prop \l__fontspec_family_label_tl \l__fontspec_family_fontopts_clist
+ { \clist_clear:N \l__fontspec_family_fontopts_clist }
+ \tl_clear:N \l__fontspec_family_label_tl
+
+ \clist_set:Nx \l__fontspec_all_features_clist
+ {
+ \g__fontspec_default_fontopts_clist,
+ \l__fontspec_family_fontopts_clist,
+ \l__fontspec_fontopts_clist,
+ #1
+ }
+ }
+ }
+\cs_new:Nn \__fontspec_preparse_features:
+ {
+
+ \__fontspec_keys_set_known:nxN {fontspec-preparse-external}
+ { \l__fontspec_all_features_clist }
+ \l__fontspec_keys_leftover_clist
+
+ \tl_set_eq:NN \l_fontspec_fontname_tl \l__fontspec_fontname_up_tl
+ \__fontspec_keys_set_known:nxN {fontspec-renderer} {\l__fontspec_keys_leftover_clist}
+ \l__fontspec_keys_leftover_clist
+ \__fontspec_keys_set_known:nxN {fontspec-preparse} {\l__fontspec_keys_leftover_clist}
+ \l__fontspec_fontfeat_clist
+ }
+\cs_new:Nn \__fontspec_load_font:
+ {
+
+ \__fontspec_primitive_font_set:NnnF \l__fontspec_test_font
+ { \__fontspec_construct_font_call:nn { \l__fontspec_fontname_up_tl } { \l__fontspec_pre_feat_sclist } }
+ { \f@size pt - 2sp }
+ { \__fontspec_error:nx {font-not-found} {\l__fontspec_fontname_up_tl} }
+
+ \__fontspec_set_font_type:N \l__fontspec_test_font
+ \__fontspec_primitive_font_gset:Onn \l__fontspec_fontface_cs_tl
+ { \__fontspec_construct_font_call:nn { \l__fontspec_fontname_up_tl } { \l__fontspec_pre_feat_sclist } }
+ { \f@size pt + 2sp }
+
+ \l__fontspec_fontface_cs_tl % this is necessary for LuaLaTeX to check the scripts properly
+
+ }
+\cs_new:Nn \__fontspec_construct_font_call:nnnnnn
+ {
+ " \__fontspec_fontname_wrap:n { #1 #2 } #3
+ #4 #5
+ \str_if_eq:eeF {#6}{} {:#6} "
+ }
+\cs_new:Nn \__fontspec_construct_font_call:nn
+ {
+ \__fontspec_construct_font_call:nnnnnn
+ {#1}
+ \l__fontspec_extension_tl
+ \l__fontspec_ttc_index_tl
+ \l__fontspec_renderer_tl
+ \l__fontspec_optical_size_tl
+ {#2}
+ }
+\cs_new:Nn \__fontspec_font_is_name:
+ {
+ \cs_set_eq:NN \__fontspec_fontname_wrap:n \use:n
+ }
+\cs_new:Nn \__fontspec_font_is_file:
+ {
+ \cs_set:Npn \__fontspec_fontname_wrap:n ##1 { [ \l__fontspec_font_path_tl ##1 ] }
+ }
+\cs_new:Nn \__fontspec_set_scriptlang:
+ {
+ \bool_if:NT \l__fontspec_firsttime_bool
+ {
+ \tl_if_empty:NF \l__fontspec_script_name_tl
+ {
+ \keys_set:nx {fontspec-opentype} {Script=\l__fontspec_script_name_tl}
+ \keys_set:nx {fontspec-opentype} {Language=\l__fontspec_lang_name_tl}
+ }
+ }
+ }
+\cs_new:Nn \__fontspec_get_features:n
+ {
+ \__fontspec_init_fontface:
+ \__fontspec_keys_set_known:nxN {fontspec-renderer} {\l__fontspec_fontfeat_clist,#1}
+ \l__fontspec_keys_leftover_clist
+ \__fontspec_keys_set_known:nxN {fontspec} {\l__fontspec_keys_leftover_clist} \l__fontspec_keys_leftover_clist
+ \keys_set:nV {fontspec-opentype} \l__fontspec_keys_leftover_clist
+
+ \tl_if_empty:NF \l__fontspec_mapping_tl
+ { \__fontspec_update_featstr:n { mapping = \l__fontspec_mapping_tl } }
+
+ \str_if_eq:eeF { \l__fontspec_hexcol_tl \l__fontspec_opacity_tl }
+ { \c__fontspec_hexcol_tl \c__fontspec_opacity_tl }
+ { \__fontspec_update_featstr:n { color = {\l__fontspec_hexcol_tl\l__fontspec_opacity_tl} } }
+ }
+\prg_new_conditional:Nnn \__fontspec_save_family_needed:n { TF }
+ {
+
+
+ \tl_if_empty:NTF \l__fontspec_nfss_fam_tl
+ {
+ \prop_get:NVNTF \g__fontspec_fontid_family_prop \l__fontspec_fontid_tl \l__fontspec_tmp_tl
+ {
+ \tl_gset_eq:NN \g__fontspec_nfss_family_tl \l__fontspec_tmp_tl
+ \prg_return_false:
+ }
+ {
+ \tl_set:Nx \l__fontspec_tmp_tl {#1}
+ \tl_remove_all:Nn \l__fontspec_tmp_tl { ~ }
+ \__fontspec_save_fontid_family:VV \l__fontspec_fontid_tl \l__fontspec_tmp_tl
+ \prg_return_true:
+ }
+ }
+ {
+ \tl_gset_eq:NN \g__fontspec_nfss_family_tl \l__fontspec_nfss_fam_tl
+ \cs_undefine:c { g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop }
+ \prg_return_true:
+ }
+ }
+\cs_new:Nn \__fontspec_save_fontid_family:nn
+ {
+ \prop_get:NnNTF \g__fontspec_family_int_prop {#2} \l__fontspec_tmp_tl
+ {
+ \tl_set:Nx \l__fontspec_tmp_tl
+ { \int_eval:n { \l__fontspec_tmp_tl + 1 } }
+ }
+ { \tl_set:Nn \l__fontspec_tmp_tl { 0 } }
+ \prop_gput:NnV \g__fontspec_family_int_prop {#2} \l__fontspec_tmp_tl
+ \tl_gset:Nx \g__fontspec_nfss_family_tl { #2 ( \l__fontspec_tmp_tl ) }
+ \prop_gput:NnV \g__fontspec_fontid_family_prop {#1} \g__fontspec_nfss_family_tl
+ }
+\cs_generate_variant:Nn \__fontspec_save_fontid_family:nn { VV }
+\cs_new:Nn \__fontspec_save_family:nn
+ {
+ \__fontspec_save_fontinfo:n {#2}
+ \__fontspec_find_autofonts:
+ \DeclareFontFamily{\g__fontspec_nfss_enc_tl}{\g__fontspec_nfss_family_tl}{}
+ \__fontspec_set_faces:
+ \__fontspec_info:nxx {defining-font} {#1} {#2}
+ }
+\cs_new:Nn \__fontspec_save_fontinfo:n
+ {
+ \prop_new:c {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop}
+ \prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {fontname} { #1 }
+ \prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {options} { \l__fontspec_all_features_clist }
+ \prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {fontdef}
+ {
+ \__fontspec_construct_font_call:nn {\l_fontspec_fontname_tl}
+ { \l__fontspec_pre_feat_sclist \g__fontspec_rawfeatures_sclist }
+ }
+ \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {script-num} \l__fontspec_script_int
+ \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {lang-num} \l__fontspec_language_int
+ \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {script-tag} \l__fontspec_script_tl
+ \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {lang-tag} \l__fontspec_lang_tl
+ }
+\cs_new:Nn \__fontspec_find_autofonts:
+ {
+ \bool_if:nF {\l__fontspec_noit_bool || \l__fontspec_nobf_bool}
+ {
+ \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l__fontspec_fontname_it_tl} {/B}
+ \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l__fontspec_fontname_bf_tl} {/I}
+ \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l_fontspec_fontname_tl} {/BI}
+ }
+
+ \bool_if:NF \l__fontspec_nobf_bool
+ {
+ \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bf_tl {\l_fontspec_fontname_tl} {/B}
+ }
+
+ \bool_if:NF \l__fontspec_noit_bool
+ {
+ \__fontspec_set_autofont:Nnn \l__fontspec_fontname_it_tl {\l_fontspec_fontname_tl} {/I}
+ }
+
+ \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfsl_tl {\l__fontspec_fontname_sl_tl} {/B}
+ }
+\cs_new:Nn \__fontspec_set_faces:
+ {
+ \__fontspec_add_nfssfont:nnnn \mddefault \shapedefault \l_fontspec_fontname_tl \l__fontspec_fontfeat_up_clist
+ \__fontspec_add_nfssfont:nnnn \bfdefault \shapedefault \l__fontspec_fontname_bf_tl \l__fontspec_fontfeat_bf_clist
+ \__fontspec_add_nfssfont:nnnn \mddefault \itdefault \l__fontspec_fontname_it_tl \l__fontspec_fontfeat_it_clist
+ \__fontspec_add_nfssfont:nnnn \mddefault \sldefault \l__fontspec_fontname_sl_tl \l__fontspec_fontfeat_sl_clist
+ \__fontspec_add_nfssfont:nnnn \mddefault \swdefault \l__fontspec_fontname_sw_tl \l__fontspec_fontfeat_sw_clist
+ \__fontspec_add_nfssfont:nnnn \bfdefault \itdefault \l__fontspec_fontname_bfit_tl \l__fontspec_fontfeat_bfit_clist
+ \__fontspec_add_nfssfont:nnnn \bfdefault \sldefault \l__fontspec_fontname_bfsl_tl \l__fontspec_fontfeat_bfsl_clist
+ \__fontspec_add_nfssfont:nnnn \bfdefault \swdefault \l__fontspec_fontname_bfsw_tl \l__fontspec_fontfeat_bfsw_clist
+ \prop_map_inline:Nn \l__fontspec_nfssfont_prop { \__fontspec_set_faces_aux:nnnnn ##2 }
+ }
+\cs_new:Nn \__fontspec_set_faces_aux:nnnnn
+ {
+ \fontspec_complete_fontname:Nn \l__fontspec_curr_fontname_tl {#3}
+ \__fontspec_make_font_shapes:Nnnnn \l__fontspec_curr_fontname_tl {#1} {#2} {#4} {#5}
+ }
+\cs_new:Nn \fontspec_complete_fontname:Nn
+ {
+ \tl_set:Nx #1 {#2}
+ \tl_replace_all:Nnx #1 {*} {\l__fontspec_basename_tl}
+ \tl_remove_all:Nn #1 {~}
+ }
+\cs_new:Nn \__fontspec_add_nfssfont:nnnn
+ {
+ \tl_set:Nx \l__fontspec_this_font_tl {#3}
+
+ \tl_if_empty:xTF {#4}
+ { \clist_set:Nn \l__fontspec_sizefeat_clist {Size={-}} }
+ { \__fontspec_keys_set_known:nxN {fontspec-preparse-nested} {#4} \l__fontspec_tmp_tl }
+
+ \tl_if_empty:NF \l__fontspec_this_font_tl
+ {
+ \prop_put:Nxx \l__fontspec_nfssfont_prop {#1/#2}
+ { {#1}{#2}{\l__fontspec_this_font_tl}{#4}{\l__fontspec_sizefeat_clist} }
+ }
+ }
+\cs_new:Nn \__fontspec_set_font_type:N
+ {
+ \bool_set_true:N \l__fontspec_ot_bool
+ }
+\cs_new:Nn \__fontspec_set_autofont:Nnn
+ {
+ \bool_if:NF \l__fontspec_external_bool
+ {
+ \tl_if_empty:xF {#2}
+ {
+ \tl_if_empty:NT #1
+ {
+ \__fontspec_if_autofont:nnTF {#2} {#3}
+ { \tl_set:Nx #1 {#2#3} }
+ { \__fontspec_info:nx {no-font-shape} {#2#3} }
+ }
+ }
+ }
+ }
+\prg_new_conditional:Nnn \__fontspec_if_autofont:nn {T,TF}
+ {
+ \group_begin:
+ \__fontspec_primitive_font_set:Nnn \l__fontspec_tmpa_font { \__fontspec_construct_font_call:nn {#1} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 1sp }
+ \__fontspec_primitive_font_set:Nnn \l__fontspec_tmpb_font { \__fontspec_construct_font_call:nn {#1#2} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 1sp }
+ \str_if_eq:eeTF { \__fontspec_primitive_font_get_name:N \l__fontspec_tmpa_font } { \__fontspec_primitive_font_get_name:N \l__fontspec_tmpb_font }
+ { \group_end: \prg_return_false: }
+ { \group_end: \prg_return_true: }
+ }
+\cs_new:Nn \__fontspec_make_font_shapes:Nnnnn
+ {
+ \group_begin:
+ \__fontspec_keys_set_known:nxN {fontspec-preparse-external} { #4 } \l__fontspec_leftover_clist
+ \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {#1}
+ \__fontspec_declare_shape:nnxx {#2} {#3} { \l__fontspec_fontopts_clist, \l__fontspec_leftover_clist } {#5}
+ \group_end:
+ }
+\cs_new:Nn \__fontspec_load_fontname:Nn
+ {
+ \__fontspec_sanitise_fontname:Nn #1 {#2}
+ \__fontspec_load_external_fontoptions:N #1
+ \prop_get:NVNF \g__fontspec_fontopts_prop #1 \l__fontspec_fontopts_clist
+ { \clist_clear:N \l__fontspec_fontopts_clist }
+ \keys_set_groups:nnV {fontspec/fontname} {getfontname} \l__fontspec_fontopts_clist
+ \__fontspec_primitive_font_set:OnnF \l__fontspec_fontface_cs_tl
+ { \__fontspec_construct_font_call:nn {#1} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 2sp }
+ { \__fontspec_error:nx {font-not-found} {#2} }
+ }
+\keys_define:nn {fontspec/fontname}
+ {
+ Font .tl_set:N = \l_fontspec_fontname_tl ,
+ Font .groups:n = {getfontname} ,
+ }
+\cs_new:Nn \__fontspec_declare_shape:nnnn
+ {
+ \tl_build_begin:N \l__fontspec_nfss_tl
+ \tl_build_begin:N \l__fontspec_nfss_sc_tl
+ \tl_set_eq:NN \l__fontspec_saved_fontname_tl \l_fontspec_fontname_tl
+
+ \exp_args:Nx \clist_map_inline:nn {#4} { \__fontspec_setup_single_size:nn {#3} {##1} }
+
+ \tl_build_end:N \l__fontspec_nfss_tl
+ \tl_build_end:N \l__fontspec_nfss_sc_tl
+
+ \__fontspec_declare_shapes_normal:nn {#1} {#2}
+ \__fontspec_declare_shapes_smcaps:nn {#1} {#2}
+ \__fontspec_declare_shape_slanted:nn {#1} {#2}
+ \__fontspec_declare_shapes_bx:nn {#1} {#2}
+ \__fontspec_declare_shape_loginfo:nn {#1} {#2}
+ }
+\cs_generate_variant:Nn \__fontspec_declare_shape:nnnn {nnxx}
+\cs_new:Nn \__fontspec_setup_single_size:nn
+ {
+ \tl_clear:N \l__fontspec_size_tl
+ \tl_set_eq:NN \l__fontspec_sizedfont_tl \l__fontspec_saved_fontname_tl % in case not spec'ed
+
+ \keys_set_known:nxN {fontspec-sizing} { \exp_after:wN \use:n #2 }
+ \l__fontspec_sizing_leftover_clist
+ \tl_if_empty:NT \l__fontspec_size_tl { \__fontspec_error:n {no-size-info} }
+
+ % "normal"
+ \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_sizedfont_tl}
+ \__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_tl {#1} {\l__fontspec_sizing_leftover_clist} {}
+
+ % small caps
+ \clist_set_eq:NN \l__fontspec_fontfeat_curr_clist \l__fontspec_fontfeat_sc_clist
+
+ \bool_if:NF \l__fontspec_nosc_bool
+ {
+ \tl_if_empty:NTF \l__fontspec_fontname_sc_tl
+ {
+ \__fontspec_make_smallcaps:TF
+ {
+ \clist_put_left:Nn \l__fontspec_fontfeat_curr_clist {Letters=SmallCaps}
+ }
+ {
+ \bool_set_true:N \l__fontspec_nosc_bool
+ }
+ }
+ { \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_fontname_sc_tl} }% local for each size
+ }
+
+ \bool_if:NF \l__fontspec_nosc_bool
+ {
+ \__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_sc_tl
+ {#1} {\l__fontspec_sizing_leftover_clist} {\l__fontspec_fontfeat_curr_clist}
+ }
+ }
+\cs_new:Nn \__fontspec_setup_nfss:Nnnn
+ {
+
+ \__fontspec_get_features:n { #2 , #3 , #4 }
+
+ \tl_if_empty:NF \l__fontspec_scale_tl
+ {
+ \tl_set:Nx \l__fontspec_scale_tl { s*[\l__fontspec_scale_tl] }
+ }
+
+ \tl_build_put_right:Nx #1
+ {
+ <\l__fontspec_size_tl> \l__fontspec_scale_tl
+ \__fontspec_construct_font_call:nn { \l_fontspec_fontname_tl }
+ { \l__fontspec_pre_feat_sclist \g__fontspec_rawfeatures_sclist }
+ }
+ }
+\cs_new:Nn \__fontspec_declare_shapes_normal:nn
+ {
+ \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl}
+ {#1} {#2} {\l__fontspec_nfss_tl}{\l__fontspec_postadjust_tl}
+ }
+\cs_new:Nn \__fontspec_declare_shapes_smcaps:nn
+ {
+ \tl_if_empty:NF \l__fontspec_nfss_sc_tl
+ {
+ \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} {#1}
+ { \__fontspec_combo_sc_shape:n {#2} } {\l__fontspec_nfss_sc_tl} {\l__fontspec_postadjust_tl}
+ }
+ }
+\cs_new:Nn \__fontspec_combo_sc_shape:n
+ {
+ \tl_if_exist:cTF { \__fontspec_shape_merge:nn {#1} {\scdefault} }
+ { \tl_use:c { \__fontspec_shape_merge:nn {#1} {\scdefault} } }
+ { \scdefault#1 }
+ }
+\cs_new:Nn \__fontspec_DeclareFontShape:nnnnnn
+ {
+\group_begin:
+\normalsize
+\cs_undefine:c {#1/#2/#3/#4/\f@size}
+\group_end:
+\DeclareFontShape{#1}{#2}{#3}{#4}{#5}{#6}
+ }
+\cs_generate_variant:Nn \__fontspec_DeclareFontShape:nnnnnn {xxxxxx}
+\cs_new:Nn \__fontspec_declare_shape_slanted:nn
+ {
+ \bool_if:nT
+ {
+ \str_if_eq_p:ee {#2} {\itdefault} &&
+ !(\str_if_eq_p:ee {\itdefault} {\sldefault})
+ }
+ {
+ \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl}{\g__fontspec_nfss_family_tl}{#1}{\sldefault}
+ {<->ssub*\g__fontspec_nfss_family_tl/#1/\itdefault}{\l__fontspec_postadjust_tl}
+ }
+ }
+\cs_new:Nn \__fontspec_declare_shapes_bx:nn
+ {
+ \bool_if:nT
+ {
+ \str_if_eq_p:ee {#1} {\bfdefault} &&
+ !(\str_if_eq_p:ee {\bfdefault} {bx})
+ }
+ {
+ % bx/?
+ \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl}
+ {bx} {#2}
+ { <->ssub*\g__fontspec_nfss_family_tl/\bfdefault/#2 }
+ { \l__fontspec_postadjust_tl }
+
+ % bx/sc -> b/sc
+ \tl_if_empty:NF \l__fontspec_nfss_sc_tl
+ {
+ \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl}
+ {bx} { \__fontspec_combo_sc_shape:n {#2} }
+ { <->ssub*\g__fontspec_nfss_family_tl/\bfdefault/#2 }
+ { \l__fontspec_postadjust_tl }
+ }
+
+ % bx/sl -> bx/it
+ \bool_if:nT
+ {
+ \str_if_eq_p:ee {#2} {\itdefault} &&
+ !(\str_if_eq_p:ee {\itdefault} {\sldefault})
+ }
+ {
+ \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl}
+ {bx} {\sldefault}
+ { <->ssub*\g__fontspec_nfss_family_tl/bx/\itdefault }
+ { \l__fontspec_postadjust_tl }
+ }
+
+ }
+ }
+\cs_new:Nn \__fontspec_declare_shape_loginfo:nn
+ {
+ \tl_gput_right:Nx \g__fontspec_defined_shapes_tl
+ {
+ \exp_not:n { \\ }
+ -~ \exp_not:N \str_case:nn {#1/#2}
+ {
+ {\mddefault/\shapedefault} {'normal'~}
+ {\bfdefault/\shapedefault} {'bold'~}
+ {\mddefault/\itdefault} {'italic'~}
+ {\mddefault/\sldefault} {'slanted'~}
+ {\mddefault/\swdefault} {'swash'~}
+ {\bfdefault/\itdefault} {'bold~ italic'~}
+ {\bfdefault/\sldefault} {'bold~ slanted'~}
+ {\bfdefault/\swdefault} {'bold~ swash'~}
+ } (#1/#2)~
+ with~ NFSS~ spec.:~
+ \l__fontspec_nfss_tl
+ \exp_not:n { \\ }
+ -~ \exp_not:N \str_case:nn { #1 / \__fontspec_combo_sc_shape:n {#2} }
+ {
+ {\mddefault/\scdefault} {'small~ caps'~}
+ {\bfdefault/\scdefault} {'bold~ small~ caps'~}
+ {\mddefault/\scitdefault} {'italic~ small~ caps'~}
+ {\bfdefault/\scitdefault} {'bold~ italic~ small~ caps'~}
+ {\mddefault/\scsldefault} {'slanted~ small~ caps'~}
+ {\bfdefault/\scsldefault} {'bold~ slanted~ small~ caps'~}
+ }~( #1 / \__fontspec_combo_sc_shape:n {#2} )~
+ with~ NFSS~ spec.:~
+ \l__fontspec_nfss_sc_tl
+ \tl_if_empty:fF {\l__fontspec_postadjust_tl}
+ {
+ \exp_not:N \\ and~ font~ adjustment~ code:
+ \exp_not:N \\ \l__fontspec_postadjust_tl
+ }
+ }
+ }
+\tl_set:Nn \l__fontspec_pre_feat_sclist
+ {
+ mode = \l__fontspec_mode_tl ;
+ \tl_if_empty:NF \l__fontspec_shaper_tl { shaper = \l__fontspec_shaper_tl ; }
+ \tl_if_empty:NF \l__fontspec_script_tl { script = \l__fontspec_script_tl ; }
+ \tl_if_empty:NF \l__fontspec_lang_tl { language = \l__fontspec_lang_tl ; }
+ }
+\cs_new:Nn \__fontspec_make_smallcaps:TF
+ {
+ \exp_args:No \__fontspec_check_ot_feat:NnTF \l__fontspec_fontface_cs_tl {smcp} {#1} {#2}
+ }
+\cs_new:Nn \__fontspec_update_featstr:n
+ {
+ \bool_if:NF \l__fontspec_firsttime_bool
+ {
+ \tl_gset:Nx \g__fontspec_single_feat_tl { #1 }
+ \tl_gput_right:Nx \g__fontspec_rawfeatures_sclist {#1;}
+ }
+ }
+\cs_new:Nn \__fontspec_remove_clashing_featstr:n
+ {
+ \clist_map_inline:nn {#1}
+ {
+ \tl_gremove_all:Nn \g__fontspec_rawfeatures_sclist {##1;}
+ }
+ }
+\cs_generate_variant:Nn \__fontspec_remove_clashing_featstr:n {x}
+\cs_set:Npn \__fontspec_init:
+ {
+ \bool_set_false:N \l__fontspec_ot_bool
+ \bool_set_true:N \l__fontspec_firsttime_bool
+ \__fontspec_font_is_name:
+ \tl_clear:N \l__fontspec_font_path_tl
+ \tl_clear:N \l__fontspec_optical_size_tl
+ \tl_clear:N \l__fontspec_ttc_index_tl
+ \tl_clear:N \l__fontspec_renderer_tl
+ \tl_gclear:N \g__fontspec_defined_shapes_tl
+ \tl_gclear:N \g__fontspec_curr_series_tl
+ \tl_gset_eq:NN \g__fontspec_nfss_enc_tl \g_fontspec_encoding_tl
+ \tl_set:Nn \l__fontspec_mode_tl {node}
+ \int_set:Nn \prehyphenchar { `\- } % fixme
+ \int_zero:N \posthyphenchar % fixme
+ \int_zero:N \preexhyphenchar % fixme
+ \int_zero:N \postexhyphenchar % fixme
+ }
+\cs_new:Nn \__fontspec_init_fontface:
+ {
+ \tl_gclear:N \g__fontspec_rawfeatures_sclist
+ \tl_clear:N \l__fontspec_scale_tl
+ \tl_set_eq:NN \l__fontspec_opacity_tl \c__fontspec_opacity_tl
+ \tl_set_eq:NN \l__fontspec_hexcol_tl \c__fontspec_hexcol_tl
+ \tl_set_eq:NN \l__fontspec_postadjust_tl \c__fontspec_postadjust_tl
+ \tl_clear:N \l__fontspec_wordspace_adjust_tl
+ \tl_clear:N \l__fontspec_punctspace_adjust_tl
+ }
+\cs_new_protected:Nn \__fontspec_ot_validate_tag:n
+ {
+ \__fontspec_ot_validate_tag:w #1 \q_nil
+ }
+\cs_generate_variant:Nn \__fontspec_ot_validate_tag:n {x}
+\cs_set:Npn \__fontspec_ot_validate_tag:w #1 #2 \q_nil
+ {
+ \bool_if:nTF { \str_if_eq_p:nn {#1} {+} || \str_if_eq_p:nn {#1} {-} }
+ { \__fontspec_ot_validate_tag_aux:w #2 \c_empty_tl \c_empty_tl \q_nil }
+ { \__fontspec_ot_validate_tag_aux:w #1#2 \c_empty_tl \c_empty_tl \q_nil }
+ }
+\cs_set:Npn \__fontspec_ot_validate_tag_aux:w #1#2#3#4#5 \q_nil
+ {
+ \int_compare:nT { \tl_count:n {#5} > 2 }
+ { \__fontspec_error:nx {ot-tag-too-long} {#1#2#3#4#5} }
+ }
+
+%%^^A%% fontspec-code-opentype.dtx -- part of FONTSPEC <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_ot_validate_tag:x {#2}
+ \cs_if_eq:NNTF #1 \font
+ { \tl_set:Nx \l__fontspec_tmp_tl {\curr@fontshape/\f@size} }
+ { \tl_set:Nx \l__fontspec_tmp_tl {\cs_to_str:N #1} }
+ \lua_now:e { fontspec.check_ot_script("\l__fontspec_tmp_tl", "#2") }
+ \bool_if:NTF \l__fontspec_check_bool
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+ }
+ }
+ }
+\prg_new_conditional:Nnn \__fontspec_check_lang:Nn {TF}
+ {
+ \__fontspec_check_lang:NnnTF #1 {#2} {\l__fontspec_script_tl} {\prg_return_true:} {\prg_return_false:}
+ }
+\prg_new_conditional:Nnn \__fontspec_check_lang:Nnn {TF}
+ {
+ \bool_if:NTF \l__fontspec_never_check_bool
+ { \prg_return_true: }
+ {
+ \bool_if:nTF { \tl_if_empty_p:e {#3} }
+ { \prg_return_false: }
+ {
+ \__fontspec_ot_validate_tag:x {#2}
+ \__fontspec_ot_validate_tag:x {#3}
+ \cs_if_eq:NNTF #1 \font
+ { \tl_set:Nx \l__fontspec_tmp_tl {\curr@fontshape/\f@size} }
+ { \tl_set:Nx \l__fontspec_tmp_tl {\cs_to_str:N #1} }
+ \__fontspec_lua_function:neee {check_ot_lang} {\l__fontspec_tmp_tl} {#2} {#3}
+ \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false:
+ }
+ }
+ }
+\prg_new_conditional:Nnn \__fontspec_check_ot_feat:Nn {TF,F}
+ {
+ \__fontspec_check_ot_feat:NnnnTF #1 {#2} {\l__fontspec_lang_tl} {\l__fontspec_script_tl}
+ {\prg_return_true:} {\prg_return_false:}
+ }
+\prg_new_conditional:Nnn \__fontspec_check_ot_feat:Nnnn {TF,F}
+ {
+ \bool_if:NTF \l__fontspec_never_check_bool
+ { \prg_return_true: }
+ {
+ \bool_if:nTF { \tl_if_empty_p:e {#3} || \tl_if_empty_p:e {#4} }
+ { \prg_return_false: }
+ {
+ \__fontspec_ot_validate_tag:x {#2}
+ \__fontspec_ot_validate_tag:x {#3}
+ \__fontspec_ot_validate_tag:x {#4}
+ \cs_if_eq:NNTF #1 \font
+ { \tl_set:Nx \l__fontspec_tmp_tl {\curr@fontshape/\f@size} }
+ { \tl_set:Nx \l__fontspec_tmp_tl {\cs_to_str:N #1} }
+ \__fontspec_lua_function:neeee {check_ot_feat} {\l__fontspec_tmp_tl} {#2} {#3} {#4}
+ \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false:
+ }
+ }
+ }
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {aalt}{Access~All~Alternates}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {abvf}{Above-base~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {abvm}{Above-base~Mark~Positioning}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {abvs}{Above-base~Substitutions}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {afrc}{Alternative~Fractions}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {akhn}{Akhands}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {blwf}{Below-base~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {blwm}{Below-base~Mark~Positioning}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {blws}{Below-base~Substitutions}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {calt}{Contextual~Alternates}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {case}{Case-Sensitive~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ccmp}{Glyph~Composition~/~Decomposition}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cfar}{Conjunct~Form~After~Ro}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cjct}{Conjunct~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {clig}{Contextual~Ligatures}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cpct}{Centered~CJK~Punctuation}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cpsp}{Capital~Spacing}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cswh}{Contextual~Swash}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {curs}{Cursive~Positioning}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cvNN}{Character~Variant~$N$}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {c2pc}{Petite~Capitals~From~Capitals}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {c2sc}{Small~Capitals~From~Capitals}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dist}{Distances}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dlig}{Discretionary~Ligatures}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dnom}{Denominators}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dtls}{Dotless~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {expt}{Expert~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {falt}{Final~Glyph~on~Line~Alternates}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fin2}{Terminal~Forms~\#2}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fin3}{Terminal~Forms~\#3}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fina}{Terminal~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {flac}{Flattened~accent~forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {frac}{Fractions}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fwid}{Full~Widths}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {half}{Half~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {haln}{Halant~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {halt}{Alternate~Half~Widths}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hist}{Historical~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hkna}{Horizontal~Kana~Alternates}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hlig}{Historical~Ligatures}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hngl}{Hangul}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hojo}{Hojo~Kanji~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hwid}{Half~Widths}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {init}{Initial~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {isol}{Isolated~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ital}{Italics}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jalt}{Justification~Alternates}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp78}{JIS78~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp83}{JIS83~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp90}{JIS90~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp04}{JIS2004~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {kern}{Kerning}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {lfbd}{Left~Bounds}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {liga}{Standard~Ligatures}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ljmo}{Leading~Jamo~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {lnum}{Lining~Figures}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {locl}{Localized~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ltra}{Left-to-right~alternates}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ltrm}{Left-to-right~mirrored~forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mark}{Mark~Positioning}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {med2}{Medial~Forms~\#2}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {medi}{Medial~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mgrk}{Mathematical~Greek}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mkmk}{Mark~to~Mark~Positioning}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mset}{Mark~Positioning~via~Substitution}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {nalt}{Alternate~Annotation~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {nlck}{NLC~Kanji~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {nukt}{Nukta~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {numr}{Numerators}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {onum}{Oldstyle~Figures}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {opbd}{Optical~Bounds}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ordn}{Ordinals}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ornm}{Ornaments}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {palt}{Proportional~Alternate~Widths}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pcap}{Petite~Capitals}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pkna}{Proportional~Kana}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pnum}{Proportional~Figures}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pref}{Pre-Base~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pres}{Pre-base~Substitutions}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pstf}{Post-base~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {psts}{Post-base~Substitutions}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pwid}{Proportional~Widths}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {qwid}{Quarter~Widths}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rand}{Randomize}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rclt}{Required~Contextual~Alternates}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rkrf}{Rakar~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rlig}{Required~Ligatures}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rphf}{Reph~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rtbd}{Right~Bounds}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rtla}{Right-to-left~alternates}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rtlm}{Right-to-left~mirrored~forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ruby}{Ruby~Notation~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rvrn}{Required~Variation~Alternates}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {salt}{Stylistic~Alternates}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {sinf}{Scientific~Inferiors}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {size}{Optical~size}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {smcp}{Small~Capitals}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {smpl}{Simplified~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ssNN}{Stylistic~Set~$N$}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ssty}{Math~script~style~alternates}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {stch}{Stretching~Glyph~Decomposition}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {subs}{Subscript}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {sups}{Superscript}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {swsh}{Swash}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {titl}{Titling}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {tjmo}{Trailing~Jamo~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {tnam}{Traditional~Name~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {tnum}{Tabular~Figures}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {trad}{Traditional~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {twid}{Third~Widths}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {unic}{Unicase}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {valt}{Alternate~Vertical~Metrics}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vatu}{Vattu~Variants}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vert}{Vertical~Writing}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vhal}{Alternate~Vertical~Half~Metrics}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vjmo}{Vowel~Jamo~Forms}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vkna}{Vertical~Kana~Alternates}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vkrn}{Vertical~Kerning}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vpal}{Proportional~Alternate~Vertical~Metrics}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vrt2}{Vertical~Alternates~and~Rotation}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vrtr}{Vertical~Alternates~for~Rotation}
+\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {zero}{Slashed~Zero}
+
+%%^^A%% fontspec-code-graphite.dtx -- part of FONTSPEC <wspr.io/fontspec>
+
+
+%%^^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:
+ }
+\aliasfontfeature{Path}{ExternalLocation}
+\__fontspec_keys_define_code:nnn {fontspec} {Path} {}
+\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Extension}
+ {
+ \tl_set:Nn \l__fontspec_extension_tl {#1}
+ \bool_if:NF \l__fontspec_external_bool
+ {
+ \keys_set:nn {fontspec-preparse-external} {Path}
+ }
+ }
+\tl_clear:N \l__fontspec_extension_tl
+\__fontspec_keys_define_code:nnn {fontspec} {Extension} {}
+\keys_define:nn {fontspec-renderer}
+ {
+ Renderer .choices:nn =
+ {Full,Node,Basic,Base,HarfBuzz,Harfbuzz,OpenType,AAT,Graphite}
+ {
+ \int_compare:nT {\l_keys_choice_int >= 5} { \bool_set_true:N \l__fontspec_harfbuzz_bool }
+
+ \tl_set:Nx \l__fontspec_mode_tl
+ {
+ \int_case:nn \l_keys_choice_int { 1 {node} 2 {node} 3 {base} 4 {base} 5 {harf} 6 {harf} 7 {harf} 8 {harf} 9 {harf}}
+ }
+
+ \tl_set:Nx \l__fontspec_shaper_tl
+ {
+ \int_case:nn \l_keys_choice_int { 1 {} 2 {} 3 {} 4 {} 5 {} 6 {} 7 {ot} 8 {coretext_aat} 9 {graphite2} }
+ }
+
+
+ \tl_gset:Nx \g__fontspec_single_feat_tl
+ {
+ mode=\l__fontspec_mode_tl ;
+ \tl_if_empty:NF \l__fontspec_shaper_tl { shaper=\l__fontspec_shaper_tl}
+ }
+ } ,
+
+ Renderer unknown .code:n =
+ {
+ \bool_set_true:N \l__fontspec_harfbuzz_bool
+ \__fontspec_warning:nx {unknown-renderer} {#1}
+ \tl_set:Nn \l__fontspec_mode_tl {harf}
+ \tl_set:Nn \l__fontspec_shaper_tl {#1}
+ } ,
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {Script}
+ {
+ \tl_set:Nn \l__fontspec_script_name_tl {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {Language}
+ {
+ \tl_set:Nn \l__fontspec_lang_name_tl {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {FontIndex}
+ {
+ \str_if_eq:eeF { \str_lowercase:f {\l__fontspec_extension_tl} } {.ttc}
+ { \__fontspec_warning:n {font-index-needs-ttc} }
+ \tl_set:Nn \l__fontspec_ttc_index_tl {(#1)}
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {FontIndex}
+ {
+ \tl_set:Nn \l__fontspec_ttc_index_tl {(#1)}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {UprightFont}
+ {
+ \fontspec_complete_fontname:Nn \l__fontspec_fontname_up_tl {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {ItalicFont}
+ {
+ \tl_if_empty:nTF {#1}
+ {
+ \bool_set_true:N \l__fontspec_noit_bool
+ }
+ {
+ \bool_set_false:N \l__fontspec_noit_bool
+ \fontspec_complete_fontname:Nn \l__fontspec_fontname_it_tl {#1}
+ }
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {SlantedFont}
+ {
+ \fontspec_complete_fontname:Nn \l__fontspec_fontname_sl_tl {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {SwashFont}
+ {
+ \fontspec_complete_fontname:Nn \l__fontspec_fontname_sw_tl {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldFont}
+ {
+ \tl_if_empty:nTF {#1}
+ {
+ \bool_set_true:N \l__fontspec_nobf_bool
+ }
+ {
+ \bool_set_false:N \l__fontspec_nobf_bool
+ \fontspec_complete_fontname:Nn \l__fontspec_curr_bfname_tl {#1}
+
+ \seq_if_empty:NT \l__fontspec_bf_series_seq
+ {
+ \tl_gset:Nx \g__fontspec_curr_series_tl {\bfdefault}
+ \seq_put_right:Nx \l__fontspec_bf_series_seq {\bfdefault}
+ }
+
+ \tl_if_eq:oxT \g__fontspec_curr_series_tl {\bfdefault}
+ {
+ \tl_set_eq:NN \l__fontspec_fontname_bf_tl \l__fontspec_curr_bfname_tl
+ }
+
+ \prop_put:NxV \l__fontspec_nfss_prop {BoldFont-\g__fontspec_curr_series_tl} \l__fontspec_curr_bfname_tl
+
+
+ }
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldItalicFont}
+ {
+ \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfit_tl {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldSlantedFont}
+ {
+ \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfsl_tl {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldSwashFont}
+ {
+ \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfsw_tl {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFont}
+ {
+ \tl_if_empty:nTF {#1}
+ {
+ \bool_set_true:N \l__fontspec_nosc_bool
+ }
+ {
+ \bool_set_false:N \l__fontspec_nosc_bool
+ \fontspec_complete_fontname:Nn \l__fontspec_fontname_sc_tl {#1}
+ }
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {UprightFeatures}
+ {
+ \clist_put_right:Nn \l__fontspec_fontfeat_up_clist {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldFeatures}
+ {
+ \clist_put_right:Nn \l__fontspec_fontfeat_bf_clist {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {ItalicFeatures}
+ {
+ \clist_put_right:Nn \l__fontspec_fontfeat_it_clist {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldItalicFeatures}
+ {
+ \clist_put_right:Nn \l__fontspec_fontfeat_bfit_clist {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {SlantedFeatures}
+ {
+ \clist_put_right:Nn \l__fontspec_fontfeat_sl_clist {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldSlantedFeatures}
+ {
+ \clist_put_right:Nn \l__fontspec_fontfeat_bfsl_clist {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {SwashFeatures}
+ {
+ \clist_put_right:Nn \l__fontspec_fontfeat_sw_clist {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldSwashFeatures}
+ {
+ \clist_put_right:Nn \l__fontspec_fontfeat_bfsw_clist {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFeatures}
+ {
+ \bool_if:NF \l__fontspec_firsttime_bool
+ {
+ \clist_put_right:Nn \l__fontspec_fontfeat_sc_clist {#1}
+ }
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {SizeFeatures}
+ {
+ \clist_set:Nn \l__fontspec_sizefeat_clist {#1}
+ \clist_put_right:Nn \l__fontspec_fontfeat_up_clist { SizeFeatures = {#1} }
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse-nested} {SizeFeatures}
+ {
+ \clist_set:Nn \l__fontspec_sizefeat_clist {#1}
+ \tl_if_empty:NT \l__fontspec_this_font_tl
+ { \tl_set:Nn \l__fontspec_this_font_tl { -- } } % needs to be non-empty as a flag
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse-nested} {Font}
+ {
+ \tl_set:Nn \l__fontspec_this_font_tl {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {SizeFeatures}
+ {
+ % dummy
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {Font}
+ {
+ % dummy
+ }
+\__fontspec_keys_define_code:nnn {fontspec-sizing} {Size}
+ {
+ \tl_set:Nn \l__fontspec_size_tl {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-sizing} {Font}
+ {
+ \fontspec_complete_fontname:Nn \l__fontspec_sizedfont_tl {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-opentype} {UprightFont} {}
+\__fontspec_keys_define_code:nnn {fontspec-opentype} {ItalicFont} {}
+\__fontspec_keys_define_code:nnn {fontspec-opentype} {SlantedFont} {}
+\__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldFont} {}
+\__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldItalicFont} {}
+\__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldSlantedFont} {}
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {NFSSEncoding}
+ {
+ \tl_gset:Nx \g__fontspec_nfss_enc_tl { #1 }
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {NFSSFamily}
+ {
+ \tl_set:Nx \l__fontspec_nfss_fam_tl { #1 }
+ }
+\__fontspec_keys_define_code:nnn {fontspec-preparse} {FontFace}
+ {
+ \tl_clear:N \l__fontspec_this_font_tl
+ \clist_set:No \l__fontspec_arg_clist { \use_iii:nnn #1 }
+ \clist_set_eq:NN \l__fontspec_this_feat_clist \l__fontspec_arg_clist
+ \int_compare:nT { \clist_count:N \l__fontspec_arg_clist = 1 }
+ {
+ \tl_if_in:NnF \l__fontspec_arg_clist {=}
+ {
+ \tl_set_eq:NN \l__fontspec_this_font_tl \l__fontspec_arg_clist
+ \tl_clear:N \l__fontspec_this_feat_clist
+ }
+ }
+
+ \__fontspec_add_nfssfont:nnnn
+ {\use_i:nnn #1} {\use_ii:nnn #1} {\l__fontspec_this_font_tl} {\l__fontspec_this_feat_clist}
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {Scale}
+ {
+ \str_case:nnF {#1}
+ {
+ {MatchLowercase} { \__fontspec_calc_scale:n {5} }
+ {MatchUppercase} { \__fontspec_calc_scale:n {8} }
+ }
+ { \tl_set:Nx \l__fontspec_scale_tl {#1} }
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {ScaleAgain}
+ {
+ \tl_if_empty:NT \l__fontspec_scale_tl { \tl_set:Nn \l__fontspec_scale_tl {1} }
+ \tl_set:Nx \l__fontspec_scale_tl { \fp_eval:n { #1 * \l__fontspec_scale_tl } }
+ \__fontspec_info:n {set-scale}
+ }
+\cs_new:Nn \__fontspec_calc_scale:n
+ {
+ \group_begin:
+
+ \fontencoding { \encodingdefault }
+ \fontfamily { \familydefault }
+ \selectfont
+
+ \__fontspec_set_font_dimen:NnN \l__fontspec_tmpa_dim {#1} \font
+ \__fontspec_set_font_dimen:NnN \l__fontspec_tmpb_dim {#1} \l__fontspec_fontface_cs_tl
+
+ \tl_set:Nx \l__fontspec_scale_tl
+ {
+ \fp_eval:n { \dim_to_fp:n {\l__fontspec_tmpa_dim} /
+ \dim_to_fp:n {\l__fontspec_tmpb_dim} }
+ }
+
+ \__fontspec_info:n {set-scale}
+ \exp_args:NNNx
+ \group_end:
+ \tl_set:Nx \l__fontspec_scale_tl { \l__fontspec_scale_tl }
+ }
+\cs_new:Nn \__fontspec_set_font_dimen:NnN
+ {
+ \dim_set:Nn #1 { \fontdimen #2 #3 }
+ \dim_compare:nNnT #1 = {0pt}
+ {
+ \settoheight #1
+ {
+ \str_if_eq:nnTF {#3} {\font} \rmfamily #3
+ \int_case:nnF #2
+ {
+ {5} {x} % x-height
+ {8} {X} % cap-height
+ } {?} % "else" clause; never reached.
+ }
+ }
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {WordSpace}
+ {
+ \bool_if:NF \l__fontspec_firsttime_bool
+ { \_fontspec_parse_wordspace:w #1,,,\q_stop }
+ }
+\__fontspec_aff_error:n {WordSpace}
+\cs_set:Npn \_fontspec_parse_wordspace:w #1,#2,#3,#4 \q_stop
+ {
+ \tl_if_empty:nTF {#4}
+ {
+ \tl_set:Nn \l__fontspec_wordspace_adjust_tl
+ {
+ \fontdimen 2 \font = #1 \fontdimen 2 \font
+ \fontdimen 3 \font = #1 \fontdimen 3 \font
+ \fontdimen 4 \font = #1 \fontdimen 4 \font
+ }
+ }
+ {
+ \tl_set:Nn \l__fontspec_wordspace_adjust_tl
+ {
+ \fontdimen 2 \font = #1 \fontdimen 2 \font
+ \fontdimen 3 \font = #2 \fontdimen 3 \font
+ \fontdimen 4 \font = #3 \fontdimen 4 \font
+ }
+ }
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {PunctuationSpace}
+ {
+ \str_case_e:nnF {#1}
+ {
+ {WordSpace}
+ {
+ \tl_set:Nn \l__fontspec_punctspace_adjust_tl
+ { \fontdimen 7 \font = 0 \fontdimen 2 \font }
+ }
+ {TwiceWordSpace}
+ {
+ \tl_set:Nn \l__fontspec_punctspace_adjust_tl
+ { \fontdimen 7 \font = 1 \fontdimen 2 \font }
+ }
+ }
+ {
+ \tl_set:Nn \l__fontspec_punctspace_adjust_tl
+ { \fontdimen 7 \font = #1 \fontdimen 7 \font }
+ }
+ }
+\__fontspec_aff_error:n {PunctuationSpace}
+\__fontspec_keys_define_code:nnn {fontspec} {FontAdjustment}
+ {
+ \tl_put_right:Nx \l__fontspec_postadjust_tl {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {LetterSpace}
+ {
+ \__fontspec_update_featstr:n {letterspace=#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {HyphenChar}
+ {
+ \str_if_eq:nnTF {#1} {None}
+ {
+ \tl_put_right:Nn \l__fontspec_postadjust_tl
+ { \__fontspec_primitive_font_set_hyphenchar:Nn \font {-1} }
+ }
+ {
+ \__fontspec_warning:nx {only-xetex-feature} {HyphenChar}
+
+ \tl_if_single:nTF {#1}
+ { \tl_set:Nn \l__fontspec_hyphenchar_tl {`#1} }
+ { \tl_set:Nn \l__fontspec_hyphenchar_tl { #1} }
+
+ \exp_args:No \__fontspec_primitive_font_glyph_if_exist:NnTF \l__fontspec_fontface_cs_tl {\l__fontspec_hyphenchar_tl}
+ {
+ \tl_put_right:Nn \l__fontspec_postadjust_tl
+ { \__fontspec_primitive_font_set_hyphenchar:Nn \font { \l__fontspec_hyphenchar_tl } }
+ }
+ { \__fontspec_error:nxx {no-glyph}{\l_fontspec_fontname_tl}{#1} }
+
+ }
+ }
+\__fontspec_aff_error:n {HyphenChar}
+\__fontspec_keys_define_code:nnn {fontspec} {Color}
+ {
+ \tl_set:Nn \l__fontspec_hexcol_tl {#1}
+ }
+\cs_set:Npn \fontspec_parse_colour:viii #1#2#3#4#5#6#7#8
+ {
+ \tl_set:Nn \l__fontspec_hexcol_tl {#1#2#3#4#5#6}
+ \tl_if_eq:NNF \l__fontspec_opacity_tl \c__fontspec_opacity_tl
+ {
+ \bool_if:NF \l__fontspec_firsttime_bool
+ { \__fontspec_warning:nx {opa-twice-col} {#7#8} }
+ }
+ \tl_set:Nn \l__fontspec_opacity_tl {#7#8}
+ }
+\aliasfontfeature{Color}{Colour}
+\__fontspec_keys_define_code:nnn {fontspec} {Opacity}
+ {
+ \int_set:Nn \l__fontspec_tmp_int {255}
+ \__fontspec_int_mult_truncate:Nn \l__fontspec_tmp_int { #1 }
+ \tl_if_eq:NNF \l__fontspec_opacity_tl \c__fontspec_opacity_tl
+ {
+ \bool_if:NF \l__fontspec_firsttime_bool
+ { \__fontspec_warning:nx {opa-twice} {#1} }
+ }
+ \tl_set:Nx \l__fontspec_opacity_tl
+ {
+ ,
+ \int_compare:nT { \l__fontspec_tmp_int <= "F } {0} % zero pad
+ \int_to_hex:n { \l__fontspec_tmp_int }
+ }
+ }
+\__fontspec_keys_define_code:nnn {fontspec-opentype} {Mapping}
+ {
+ \str_if_eq:nnTF {#1} {tex-text}
+ {
+ \__fontspec_warning:n {no-mapping-ligtex}
+ \msg_redirect_name:nnn {fontspec} {no-mapping-ligtex} {none}
+ \keys_set:nn {fontspec-opentype} { Ligatures=TeX }
+ }
+ { \__fontspec_warning:n {no-mapping} }
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {Weight}
+ {
+ \__fontspec_update_featstr:n{weight=#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {Width}
+ {
+ \__fontspec_update_featstr:n{width=#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec} {OpticalSize}
+ {
+ \tl_set:Nn \l__fontspec_optical_size_tl {/ S = #1}
+ }
+\keys_define:nn {fontspec}
+ {
+ FakeSlant .code:n =
+ {
+ \__fontspec_update_featstr:n {slant=#1}
+ },
+ FakeSlant .default:n = {0.2}
+ }
+\keys_define:nn {fontspec}
+ {
+ FakeStretch .code:n =
+ {
+ \__fontspec_update_featstr:n {extend=#1}
+ },
+ FakeStretch .default:n = {1.2}
+ }
+\keys_define:nn {fontspec}
+ {
+ FakeBold .code:n =
+ {
+ \__fontspec_update_featstr:n {embolden=#1}
+ },
+ FakeBold .default:n = {1.5}
+ }
+\keys_define:nn {fontspec}
+ {
+ AutoFakeSlant .code:n =
+ {
+ \bool_if:NT \l__fontspec_firsttime_bool
+ {
+ \tl_set:Nn \l__fontspec_fake_slant_tl {#1}
+ \clist_put_right:Nn \l__fontspec_fontfeat_it_clist {FakeSlant=#1}
+ \tl_set_eq:NN \l__fontspec_fontname_it_tl \l_fontspec_fontname_tl
+ \bool_set_false:N \l__fontspec_noit_bool
+
+ \tl_if_empty:NF \l__fontspec_fake_embolden_tl
+ {
+ \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist
+ {FakeBold=\l__fontspec_fake_embolden_tl}
+ \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist {FakeSlant=#1}
+ \tl_set_eq:NN \l__fontspec_fontname_bfit_tl \l_fontspec_fontname_tl
+ }
+ }
+ },
+ AutoFakeSlant .default:n = {0.2}
+ }
+\keys_define:nn {fontspec}
+ {
+ AutoFakeBold .code:n =
+ {
+ \bool_if:NT \l__fontspec_firsttime_bool
+ {
+ \tl_set:Nn \l__fontspec_fake_embolden_tl {#1}
+ \clist_put_right:Nn \l__fontspec_fontfeat_bf_clist {FakeBold=#1}
+ \tl_set_eq:NN \l__fontspec_fontname_bf_tl \l_fontspec_fontname_tl
+ \bool_set_false:N \l__fontspec_nobf_bool
+
+ \tl_if_empty:NF \l__fontspec_fake_slant_tl
+ {
+ \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist
+ {FakeSlant=\l__fontspec_fake_slant_tl}
+ \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist {FakeBold=#1}
+ \tl_set_eq:NN \l__fontspec_fontname_bfit_tl \l_fontspec_fontname_tl
+ }
+ }
+ },
+ AutoFakeBold .default:n = {1.5}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-opentype} {RawFeature}
+ {
+ \__fontspec_update_featstr:n {#1}
+ }
+\__fontspec_keys_define_code:nnn {fontspec-aat} {RawFeature}
+ {
+ \__fontspec_update_featstr:n {#1}
+ }
+
+%%^^A%% fontspec-code-feat-opentype.dtx -- part of FONTSPEC <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,
+ +tlig,-tlig
+ }
+\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Required} {rlig} {rlig} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Common} {liga} {liga} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Rare} {dlig} {dlig} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Discretionary} {dlig} {dlig} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Contextual} {clig} {clig} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Historic} {hlig} {hlig} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {TeX} {} {tlig} {}
+\__fontspec_define_opentype_feature_group:n {Letters}
+\__fontspec_define_opentype_feature:nnnnn {Letters} {ResetAll} {} {}
+ {
+ +case,+smcp,+pcap,+c2sc,+c2pc,+unic,+rand,
+ -case,-smcp,-pcap,-c2sc,-c2pc,-unic,-rand
+ }
+\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Uppercase} {case} {case} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {SmallCaps} {smcp} {smcp} {+pcap,+unic}
+\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {PetiteCaps} {pcap} {pcap} {+smcp,+unic}
+\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {UppercaseSmallCaps} {c2sc} {c2sc} {+c2pc,+unic}
+\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {UppercasePetiteCaps} {c2pc} {c2pc} {+c2sc,+unic}
+\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Unicase} {unic} {unic} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Random} {rand} {rand} {}
+\__fontspec_define_opentype_feature_group:n {Numbers}
+\__fontspec_define_opentype_feature:nnnnn {Numbers} {ResetAll} {} {}
+ {
+ +tnum,-tnum,
+ +pnum,-pnum,
+ +onum,-onum,
+ +lnum,-lnum,
+ +zero,-zero,
+ +anum,-anum,
+ }
+\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Monospaced} {tnum} {tnum} {+pnum,-pnum}
+\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Proportional} {pnum} {pnum} {+tnum,-tnum}
+\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Lowercase} {onum} {onum} {+lnum,-lnum}
+\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Uppercase} {lnum} {lnum} {+onum,-onum}
+\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {SlashedZero} {zero} {zero} {}
+\aliasfontfeatureoption {Numbers} {Monospaced} {Tabular}
+\aliasfontfeatureoption {Numbers} {Lowercase} {OldStyle}
+\aliasfontfeatureoption {Numbers} {Uppercase} {Lining}
+ \__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Arabic} {anum} {anum} {}
+\__fontspec_define_opentype_feature_group:n {VerticalPosition}
+\__fontspec_define_opentype_feature:nnnnn {VerticalPosition} {ResetAll} {} {}
+ {
+ +sups,-sups,
+ +subs,-subs,
+ +ordn,-ordn,
+ +numr,-numr,
+ +dnom,-dnom,
+ +sinf,-sinf,
+ }
+\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Superior} {sups} {sups} {+subs,+ordn,+numr,+dnom,+sinf}
+\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Inferior} {subs} {subs} {+sups,+ordn,+numr,+dnom,+sinf}
+\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Ordinal} {ordn} {ordn} {+sups,+subs,+numr,+dnom,+sinf}
+\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Numerator} {numr} {numr} {+sups,+subs,+ordn,+dnom,+sinf}
+\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Denominator} {dnom} {dnom} {+sups,+subs,+ordn,+numr,+sinf}
+\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {ScientificInferior} {sinf} {sinf} {+sups,+subs,+ordn,+numr,+dnom}
+\__fontspec_define_opentype_feature_group:n {Contextuals}
+\__fontspec_define_opentype_feature:nnnnn {Contextuals} {ResetAll} {} {}
+ {
+ +cswh,-cswh,
+ +calt,-calt,
+ +init,-init,
+ +fina,-fina,
+ +falt,-falt,
+ +medi,-medi,
+ }
+\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {Swash} {cswh} {cswh} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {Alternate} {calt} {calt} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {WordInitial} {init} {init} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {WordFinal} {fina} {fina} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {LineFinal} {falt} {falt} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {Inner} {medi} {medi} {}
+\__fontspec_define_opentype_feature_group:n {Diacritics}
+\__fontspec_define_opentype_feature:nnnnn {Diacritics} {ResetAll} {} {}
+ {
+ +mark,-mark,
+ +mkmk,-mkmk,
+ +abvm,-abvm,
+ +blwm,-blwm,
+ }
+\__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {MarkToBase} {mark} {mark} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {MarkToMark} {mkmk} {mkmk} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {AboveBase} {abvm} {abvm} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {BelowBase} {blwm} {blwm} {}
+\__fontspec_define_opentype_feature_group:n {Kerning}
+\__fontspec_define_opentype_feature:nnnnn {Kerning} {ResetAll} {} {}
+ {
+ +cpsp,-cpsp,
+ +kern,-kern,
+ }
+\__fontspec_define_opentype_onoffreset:nnnnn {Kerning} {Uppercase} {cpsp} {cpsp} {}
+\__fontspec_define_opentype_feature:nnnnn {Kerning} {On} {kern} {+kern} {-kern}
+\__fontspec_define_opentype_feature:nnnnn {Kerning} {Off} {kern} {-kern} {+kern}
+\__fontspec_define_opentype_feature:nnnnn {Kerning} {Reset} {} {} {+kern,-kern}
+\__fontspec_define_opentype_feature_group:n {Fractions}
+\__fontspec_define_opentype_feature:nnnnn {Fractions} {ResetAll} {} {}
+ {
+ +frac,-frac,
+ +afrc,-afrc,
+ }
+\__fontspec_define_opentype_feature:nnnnn {Fractions} {On} {frac} {+frac} {}
+\__fontspec_define_opentype_feature:nnnnn {Fractions} {Off} {frac} {-frac} {}
+\__fontspec_define_opentype_feature:nnnnn {Fractions} {Reset} {} {} {+frac,-frac}
+\__fontspec_define_opentype_onoffreset:nnnnn {Fractions} {Alternate} {afrc} {afrc} {-frac}
+\__fontspec_define_opentype_feature_group:n {LocalForms}
+\__fontspec_define_opentype_feature:nnnnn {LocalForms} {On} {locl} {+locl} {}
+\__fontspec_define_opentype_feature:nnnnn {LocalForms} {Off} {locl} {-locl} {}
+\__fontspec_define_opentype_feature:nnnnn {LocalForms} {Reset} {} {} {+locl,-locl}
+
+\__fontspec_define_opentype_feature_group:n {Style}
+\__fontspec_define_opentype_feature:nnnnn {Style} {ResetAll} {} {}
+ {
+ +salt,-salt,
+ +ital,-ital,
+ +ruby,-ruby,
+ +swsh,-swsh,
+ +hist,-hist,
+ +titl,-titl,
+ +hkna,-hkna,
+ +vkna,-vkna,
+ +ssty=0,-ssty=0,
+ +ssty=1,-ssty=1,
+ }
+\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Alternate} {salt} {salt} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Italic} {ital} {ital} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Ruby} {ruby} {ruby} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Swash} {swsh} {swsh} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Cursive} {swsh} {curs} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Historic} {hist} {hist} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Titling} {titl} {titl} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Style} {TitlingCaps} {titl} {titl} {} % backwards compat
+\__fontspec_define_opentype_onoffreset:nnnnn {Style} {HorizontalKana} {hkna} {hkna} {+vkna,+pkna}
+\__fontspec_define_opentype_onoffreset:nnnnn {Style} {VerticalKana} {vkna} {vkna} {+hkna,+pkna}
+\__fontspec_define_opentype_onoffreset:nnnnn {Style} {ProportionalKana} {pkna} {pkna} {+vkna,+hkna}
+\__fontspec_define_opentype_feature:nnnnn {Style} {MathScript} {ssty} {+ssty=0} {+ssty=1}
+\__fontspec_define_opentype_feature:nnnnn {Style} {MathScriptScript} {ssty} {+ssty=1} {+ssty=0}
+\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Uppercase} {case} {case} {}
+\__fontspec_define_opentype_feature_group:n {CJKShape}
+\__fontspec_define_opentype_feature:nnnnn {CJKShape} {ResetAll} {} {}
+ {
+ +trad,-trad,
+ +smpl,-smpl,
+ +jp78,-jp78,
+ +jp83,-jp83,
+ +jp90,-jp90,
+ +jp04,-jp04,
+ +expt,-expt,
+ +nlck,-nlck,
+ }
+\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {Traditional} {trad} {trad} {+smpl,+jp78,+jp83,+jp90,+jp04,+expt,+nlck}
+\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {Simplified} {smpl} {smpl} {+trad,+jp78,+jp83,+jp90,+jp04,+expt,+nlck}
+\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS1978} {jp78} {jp78} {+trad,+smpl,+jp83,+jp90,+jp04,+expt,+nlck}
+\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS1983} {jp83} {jp83} {+trad,+smpl,+jp78,+jp90,+jp04,+expt,+nlck}
+\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS1990} {jp90} {jp90} {+trad,+smpl,+jp78,+jp83,+jp04,+expt,+nlck}
+\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS2004} {jp04} {jp04} {+trad,+smpl,+jp78,+jp83,+jp90,+expt,+nlck}
+\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {Expert} {expt} {expt} {+trad,+smpl,+jp78,+jp83,+jp90,+jp04,+nlck}
+\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {NLC} {nlck} {nlck} {+trad,+smpl,+jp78,+jp83,+jp90,+jp04,+expt}
+\__fontspec_define_opentype_feature_group:n {CharacterWidth}
+\__fontspec_define_opentype_feature:nnnnn {CharacterWidth} {ResetAll} {} {}
+ {
+ +pwid,-pwid,
+ +fwid,-fwid,
+ +hwid,-hwid,
+ +twid,-twid,
+ +qwid,-qwid,
+ +palt,-palt,
+ +halt,-halt,
+ }
+\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Proportional} {pwid} {pwid} {+fwid,+hwid,+twid,+qwid,+palt,+halt}
+\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Full} {fwid} {fwid} {+pwid,+hwid,+twid,+qwid,+palt,+halt}
+\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Half} {hwid} {hwid} {+pwid,+fwid,+twid,+qwid,+palt,+halt}
+\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Third} {twid} {twid} {+pwid,+fwid,+hwid,+qwid,+palt,+halt}
+\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Quarter} {qwid} {qwid} {+pwid,+fwid,+hwid,+twid,+palt,+halt}
+\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {AlternateProportional} {palt} {palt} {+pwid,+fwid,+hwid,+twid,+qwid,+halt}
+\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {AlternateHalf} {halt} {halt} {+pwid,+fwid,+hwid,+twid,+qwid,+palt}
+\__fontspec_define_opentype_feature_group:n {Vertical}
+\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {RotatedGlyphs} {vrt2} {vrt2} {+vrtr,+vert}
+\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {AlternatesForRotation} {vrtr} {vrtr} {+vrt2}
+\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {Alternates} {vert} {vert} {+vrt2}
+\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {KanaAlternates} {vkna} {vkna} {+hkna}
+\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {Kerning} {vkrn} {vkrn} {}
+\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {AlternateMetrics} {valt} {valt} {+vhal,+vpal,+kern}
+\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {HalfMetrics} {vhal} {vhal} {+valt,+vpal,+kern}
+\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {ProportionalMetrics} {vpal} {vpal} {+valt,+vhal}
+\__fontspec_define_opentype_feature_group:n {Alternate}
+\keys_define:nn {fontspec-opentype}
+ {
+ Alternate .default:n = {0} ,
+ Alternate .groups:n = {opentype},
+ Alternate / unknown .code:n =
+ {
+ \clist_map_inline:nn {#1}
+ { \__fontspec_make_OT_feature:nnn {salt}{ +salt = ##1 }{} }
+ }
+ }
+\keys_define:nn {fontspec-opentype}
+ {
+ Alternate / Random .code:n =
+ { \__fontspec_make_OT_feature:nnn {salt}{ +salt = random }{} } ,
+ }
+\aliasfontfeature{Alternate}{StylisticAlternates}
+\__fontspec_define_opentype_feature_group:n {Variant}
+\keys_define:nn {fontspec-opentype}
+ {
+ Variant .default:n = {0} ,
+ Variant .groups:n = {opentype} ,
+ Variant / unknown .code:n =
+ {
+ \clist_map_inline:nn {#1}
+ {
+ \__fontspec_make_OT_feature:xxx { ss \two@digits {##1} } { +ss \two@digits {##1} } {}
+ }
+ }
+ }
+\aliasfontfeature{Variant}{StylisticSet}
+\__fontspec_define_opentype_feature_group:n {CharacterVariant}
+\use:x
+ {
+ \cs_new:Npn \exp_not:N \fontspec_parse_cv:w
+ ##1 \c_colon_str ##2 \c_colon_str ##3 \exp_not:N \q_nil
+ {
+ \__fontspec_make_OT_feature:xxx
+ { cv \exp_not:N \two@digits {##1} }
+ { +cv \exp_not:N \two@digits {##1} = ##2 } {}
+ }
+ \keys_define:nn {fontspec-opentype}
+ {
+ CharacterVariant / unknown .code:n =
+ {
+ \clist_map_inline:nn {##1}
+ {
+ \exp_not:N \fontspec_parse_cv:w
+ ####1 \c_colon_str 0 \c_colon_str \exp_not:N \q_nil
+ }
+ }
+ }
+ }
+\__fontspec_define_opentype_feature_group:n {Annotation}
+\keys_define:nn {fontspec-opentype}
+ {
+ Annotation .default:n = {0} ,
+ Annotation .groups:n = {opentype},
+ Annotation / unknown .code:n =
+ {
+ \__fontspec_make_OT_feature:nnn {nalt} {+nalt=#1} {}
+ }
+ }
+\__fontspec_define_opentype_feature_group:n {Ornament}
+\keys_define:nn {fontspec-opentype}
+ {
+ Ornament .default:n = {0} ,
+ Ornament .groups:n = {opentype},
+ Ornament / unknown .code:n =
+ {
+ \__fontspec_make_OT_feature:nnn {ornm} { +ornm=#1 } {}
+ }
+ }
+\keys_define:nn {fontspec-opentype}
+ {
+ Script .choice: ,
+ Script .groups:n = {opentype} ,
+ }
+\cs_new:Nn \fontspec_new_script:nn
+ {
+ \keys_define:nn {fontspec-opentype} { Script / #1 .code:n =
+ {
+ \bool_set_false:N \l__fontspec_scriptlang_exist_bool
+ \clist_map_inline:nn {#2}
+ {
+ \exp_args:No \__fontspec_check_script:NnT \l__fontspec_fontface_cs_tl {####1}
+ {
+ \tl_set:Nn \l__fontspec_script_name_tl {#1}
+ \tl_set:Nn \l__fontspec_script_tl {####1}
+ \int_set:Nn \l__fontspec_script_int {\l__fontspec_strnum_int}
+ \bool_set_true:N \l__fontspec_scriptlang_exist_bool
+ \tl_gset:Nx \g__fontspec_single_feat_tl { script=####1 }
+ \clist_map_break:
+ }
+ }
+
+ \bool_if:NF \l__fontspec_scriptlang_exist_bool
+ {
+ \bool_if:nF { \str_if_eq_p:ee {#1} {CustomDefault} }
+ {
+ \tl_clear:N \l__fontspec_script_name_tl
+ \__fontspec_warning:nxx {no-script} {\l_fontspec_fontname_tl} {#1}
+ }
+
+ \bool_if:nF
+ {
+ \str_if_eq_p:ee {#1} {Default} ||
+ \str_if_eq_p:ee {#1} {Latin} ||
+ \str_if_eq_p:ee {#1} {CustomDefault}
+ }
+ {
+ \keys_set:nn {fontspec-opentype} { Script = CustomDefault }
+ }
+ }
+ }
+ }
+ }
+\keys_define:nn {fontspec-opentype}
+ {
+ Language .choice: ,
+ Language .groups:n = {opentype} ,
+ }
+\cs_new:Nn \fontspec_new_lang:nn
+ {
+ \keys_define:nn {fontspec-opentype} { Language / #1 .code:n =
+ {
+ \bool_set_false:N \l__fontspec_scriptlang_exist_bool
+ \clist_map_inline:nn {#2}
+ {
+ \exp_args:No \__fontspec_check_lang:NnTF \l__fontspec_fontface_cs_tl {####1}
+ {
+ \tl_set:Nn \l__fontspec_lang_tl {####1}
+ \int_set:Nn \l__fontspec_language_int {\l__fontspec_strnum_int}
+ \tl_gset:Nx \g__fontspec_single_feat_tl { language=####1 }
+ \bool_set_true:N \l__fontspec_scriptlang_exist_bool
+ \clist_map_break:
+ }
+ }
+ \bool_if:NF \l__fontspec_scriptlang_exist_bool
+ {
+ \__fontspec_warning:nx {language-not-exist} {#1}
+ \keys_set:nn {fontspec-opentype} { Language = Default }
+ }
+ }
+ }
+ }
+\__fontspec_keys_define_code:nnn {fontspec-opentype} { Language / Default }
+ {
+ \tl_set:Nn \l__fontspec_lang_tl {dflt}
+ \int_zero:N \l__fontspec_language_int
+ \tl_gset:Nn \g__fontspec_single_feat_tl { language=dflt }
+ }
+\cs_new:Nn \__fontspec_ot_compat:nn
+ {
+ \aliasfontfeatureoption {#1} {#2Off} {No#2}
+ }
+\__fontspec_ot_compat:nn {Ligatures} {Rare}
+\__fontspec_ot_compat:nn {Ligatures} {Required}
+\__fontspec_ot_compat:nn {Ligatures} {Common}
+\__fontspec_ot_compat:nn {Ligatures} {Discretionary}
+\__fontspec_ot_compat:nn {Ligatures} {Contextual}
+\__fontspec_ot_compat:nn {Ligatures} {Historic}
+\__fontspec_ot_compat:nn {Numbers} {SlashedZero}
+\__fontspec_ot_compat:nn {Contextuals} {Swash}
+\__fontspec_ot_compat:nn {Contextuals} {Alternate}
+\__fontspec_ot_compat:nn {Contextuals} {WordInitial}
+\__fontspec_ot_compat:nn {Contextuals} {WordFinal}
+\__fontspec_ot_compat:nn {Contextuals} {LineFinal}
+\__fontspec_ot_compat:nn {Contextuals} {Inner}
+\__fontspec_ot_compat:nn {Diacritics} {MarkToBase}
+\__fontspec_ot_compat:nn {Diacritics} {MarkToMark}
+\__fontspec_ot_compat:nn {Diacritics} {AboveBase}
+\__fontspec_ot_compat:nn {Diacritics} {BelowBase}
+
+%%^^A%% fontspec-code-scripts.dtx -- part of FONTSPEC <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{Chorasmian}{chrs}
+\newfontscript{CJK~Ideographic}{hani}
+\newfontscript{Coptic}{copt}
+\newfontscript{Cypriot~Syllabary}{cprt}
+\newfontscript{Cypro~Minoan}{cpmn}
+\newfontscript{Cyrillic}{cyrl}
+\newfontscript{Default}{DFLT}
+\newfontscript{CustomDefault}{latn,DFLT}
+\newfontscript{Deseret}{dsrt}
+\newfontscript{Devanagari}{dev2,deva}
+\newfontscript{Dives~Akuru}{diak}
+\newfontscript{Dogra}{dogr}
+\newfontscript{Duployan}{dupl}
+\newfontscript{Egyptian~Hieroglyphs}{egyp}
+\newfontscript{Elbasan}{elba}
+\newfontscript{Elymaic}{elym}
+\newfontscript{Ethiopic}{ethi}
+\newfontscript{Georgian}{geor}
+\newfontscript{Glagolitic}{glag}
+\newfontscript{Gothic}{goth}
+\newfontscript{Grantha}{gran}
+\newfontscript{Greek}{grek}
+\newfontscript{Gujarati}{gjr2,gujr}
+\newfontscript{Gunjala~Gondi}{gong}
+\newfontscript{Gurmukhi}{gur2,guru}
+\newfontscript{Hangul~Jamo}{jamo}
+\newfontscript{Hangul}{hang}
+\newfontscript{Hanifi~Rohingya}{rohg}
+\newfontscript{Hanunoo}{hano}
+\newfontscript{Hatran}{hatr}
+\newfontscript{Hebrew}{hebr}
+\newfontscript{Hiragana~and~Katakana}{kana}
+\newfontscript{Imperial~Aramaic}{armi}
+\newfontscript{Inscriptional~Pahlavi}{phli}
+\newfontscript{Inscriptional~Parthian}{prti}
+\newfontscript{Javanese}{java}
+\newfontscript{Kaithi}{kthi}
+\newfontscript{Kannada}{knd2,knda}
+\newfontscript{Kayah~Li}{kali}
+\newfontscript{Kharosthi}{khar}
+\newfontscript{Khitan~Small~Script}{kits}
+\newfontscript{Khmer}{khmr}
+\newfontscript{Khojki}{khoj}
+\newfontscript{Khudawadi}{sind}
+\newfontscript{Lao}{lao~}
+\newfontscript{Latin}{latn}
+\newfontscript{Lepcha}{lepc}
+\newfontscript{Limbu}{limb}
+\newfontscript{Linear~A}{lina}
+\newfontscript{Linear~B}{linb}
+\newfontscript{Lisu}{lisu}
+\newfontscript{Lycian}{lyci}
+\newfontscript{Lydian}{lydi}
+\newfontscript{Mahajani}{mahj}
+\newfontscript{Makasar}{maka}
+\newfontscript{Malayalam}{mlm2,mlym}
+\newfontscript{Mandaic}{mand}
+\newfontscript{Manichaean}{mani}
+\newfontscript{Marchen}{marc}
+\newfontscript{Masaram Gondi}{gonm}
+\newfontscript{Math}{math}
+\newfontscript{Medefaidrin}{medf}
+\newfontscript{Meitei~Mayek}{mtei}
+\newfontscript{Mende~Kikakui}{mend}
+\newfontscript{Meroitic~Cursive}{merc}
+\newfontscript{Meroitic~Hieroglyphs}{mero}
+\newfontscript{Miao}{plrd}
+\newfontscript{Modi}{modi}
+\newfontscript{Mongolian}{mong}
+\newfontscript{Mro}{mroo}
+\newfontscript{Multani}{mult}
+\newfontscript{Musical~Symbols}{musc}
+\newfontscript{Myanmar}{mym2,mymr}
+\newfontscript{N'Ko}{nko~}
+\newfontscript{Nabataean}{nbat}
+\newfontscript{Nandinagari}{nand}
+\newfontscript{Newa}{newa}
+\newfontscript{Nushu}{nshu}
+\newfontscript{Nyiakeng~Puachue~Hmong}{hmnp}
+\newfontscript{Odia}{ory2,orya}
+\newfontscript{Ogham}{ogam}
+\newfontscript{Ol~Chiki}{olck}
+\newfontscript{Old~Italic}{ital}
+\newfontscript{Old~Hungarian}{hung}
+\newfontscript{Old~North~Arabian}{narb}
+\newfontscript{Old~Permic}{perm}
+\newfontscript{Old~Persian~Cuneiform}{xpeo}
+\newfontscript{Old~Sogdian}{sogo}
+\newfontscript{Old~South~Arabian}{sarb}
+\newfontscript{Old~Turkic}{orkh}
+\newfontscript{Old~Uyghur}{ougr}
+\newfontscript{Osage}{osge}
+\newfontscript{Osmanya}{osma}
+\newfontscript{Pahawh~Hmong}{hmng}
+\newfontscript{Palmyrene}{palm}
+\newfontscript{Pau~Cin~Hau}{pauc}
+\newfontscript{Phags-pa}{phag}
+\newfontscript{Phoenician}{phnx}
+\newfontscript{Psalter~Pahlavi}{phlp}
+\newfontscript{Rejang}{rjng}
+\newfontscript{Runic}{runr}
+\newfontscript{Samaritan}{samr}
+\newfontscript{Saurashtra}{saur}
+\newfontscript{Sharada}{shrd}
+\newfontscript{Shavian}{shaw}
+\newfontscript{Siddham}{sidd}
+\newfontscript{Sign~Writing}{sgnw}
+\newfontscript{Sinhala}{sinh}
+\newfontscript{Sogdian}{sogd}
+\newfontscript{Sora~Sompeng}{sora}
+\newfontscript{Sumero-Akkadian~Cuneiform}{xsux}
+\newfontscript{Sundanese}{sund}
+\newfontscript{Syloti~Nagri}{sylo}
+\newfontscript{Syriac}{syrc}
+\newfontscript{Tagalog}{tglg}
+\newfontscript{Tagbanwa}{tagb}
+\newfontscript{Tai~Le}{tale}
+\newfontscript{Tai~Lu}{talu}
+\newfontscript{Tai~Tham}{lana}
+\newfontscript{Tai~Viet}{tavt}
+\newfontscript{Takri}{takr}
+\newfontscript{Tamil}{tml2,taml}
+\newfontscript{Tangsa}{tnsa}
+\newfontscript{Tangut}{tang}
+\newfontscript{Telugu}{tel2,telu}
+\newfontscript{Thaana}{thaa}
+\newfontscript{Thai}{thai}
+\newfontscript{Tibetan}{tibt}
+\newfontscript{Tifinagh}{tfng}
+\newfontscript{Tirhuta}{tirh}
+\newfontscript{Toto}{toto}
+\newfontscript{Ugaritic~Cuneiform}{ugar}
+\newfontscript{Vai}{vai~}
+\newfontscript{Vithkuqi}{vith}
+\newfontscript{Wancho}{wcho}
+\newfontscript{Warang~Citi}{wara}
+\newfontscript{Yezidi}{yezi}
+\newfontscript{Yi}{yi~~}
+\newfontscript{Zanabazar~Square}{zanb}
+\newfontscript{CJK}{hani}
+\newfontscript{Kana}{kana}
+\newfontscript{Maths}{math}
+\newfontscript{N'ko}{nko~}
+\newfontscript{Oriya}{ory2,orya}
+
+%%^^A%% fontspec-code-lang.dtx -- part of FONTSPEC <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>
+
+
+%%^^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}
+\providecommand*\scswdefault{\scdefault\swdefault}
+\cs_new:Nn \__fontspec_shape_merge:nn { c__fontspec_shape_#1_#2_tl }
+\cs_new:Nn \__fontspec_merge_default_shapes:
+ {
+ \tl_const:cn { \__fontspec_shape_merge:nn \shapedefault\scdefault } {\scdefault}
+ \tl_const:cn { \__fontspec_shape_merge:nn \itdefault \scdefault } {\scitdefault}
+ \tl_const:cn { \__fontspec_shape_merge:nn \sldefault \scdefault } {\scsldefault}
+ \tl_const:cn { \__fontspec_shape_merge:nn \swdefault \scdefault } {\scswdefault}
+ \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \itdefault } {\scitdefault}
+ \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \sldefault } {\scsldefault}
+ \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \swdefault } {\scswdefault}
+ \tl_const:cn { \__fontspec_shape_merge:nn \scsldefault \itdefault } {\scitdefault}
+ \tl_const:cn { \__fontspec_shape_merge:nn \scitdefault \sldefault } {\scsldefault}
+ \tl_const:cn { \__fontspec_shape_merge:nn \scitdefault \shapedefault } {\scdefault}
+ \tl_const:cn { \__fontspec_shape_merge:nn \scsldefault \shapedefault } {\scdefault}
+ }
+\__fontspec_merge_default_shapes:
+\prg_new_conditional:Nnn \__fontspec_if_merge_shape:n {TF}
+ {
+ \bool_lazy_and:nnTF
+ { \tl_if_exist_p:c { \__fontspec_shape_merge:nn {\f@shape} {#1} } }
+ {
+ \cs_if_exist_p:c
+ {
+ \f@encoding/\f@family/\f@series/
+ \tl_use:c { \__fontspec_shape_merge:nn {\f@shape} {#1} }
+ }
+ }
+ \prg_return_true: \prg_return_false:
+ }
+\cs_set_eq:NN \emfontdeclare \DeclareEmphSequence
+\cs_set_protected:Npn \strongfontdeclare #1
+ {
+ \prop_gclear:N \g__fontspec_strong_prop
+ \int_zero:N \l__fontspec_strongdef_int
+
+ \group_begin:
+ \normalfont
+ \clist_map_inline:nn {\strongreset,#1}
+ {
+ ##1
+ \prop_gput_if_new:NxV \g__fontspec_strong_prop { \f@series } { \l__fontspec_strongdef_int }
+ \prop_gput:Nxn \g__fontspec_strong_prop { switch-\int_use:N \l__fontspec_strongdef_int } { ##1 }
+ \int_incr:N \l__fontspec_strongdef_int
+ }
+ \group_end:
+ }
+\DeclareRobustCommand \strongenv
+ {
+ \@nomath\strongenv
+
+ \prop_get:NxNT \g__fontspec_strong_prop { \f@series } \l__fontspec_strong_tmp_tl
+ {
+ \int_set:Nn \l__fontspec_strong_int { \l__fontspec_strong_tmp_tl }
+ }
+
+ \int_incr:N \l__fontspec_strong_int
+
+ \prop_get:NxNTF \g__fontspec_strong_prop { switch-\int_use:N \l__fontspec_strong_int } \l__fontspec_strong_switch_tl
+ { \l__fontspec_strong_switch_tl }
+ {
+ \int_zero:N \l__fontspec_strong_int
+ \strongreset
+ }
+
+ }
+\DeclareTextFontCommand{\strong}{\strongenv}
+\cs_set:Npn \strongreset {}
+\cs_set:Npn \reset@font
+ {
+ \normalfont
+ \int_zero:N \l__fontspec_strong_int
+ }
+\cs_new:Nn \fontspec_set_strong_level:n { \int_set:Nn \l__fontspec_strong_int {#1} }
+\strongfontdeclare{ \bfseries }
diff --git a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx
index e53325b827..9987eb268f 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx
@@ -83,7 +83,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
@@ -959,7 +959,7 @@
%<@@=hyp>
% \end{macrocode}
% \begin{macrocode}
-\ProvidesFile{hgeneric-testphase.def}[2022-05-11 v0.95o %
+\ProvidesFile{hgeneric-testphase.def}[2022-06-14 v0.95p %
generic Hyperref driver for the LaTeX PDF management testphase bundle]
\RequirePackage{etoolbox} %why?
diff --git a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf
index e9b09189ed..3328ad54ec 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/hyperxmp-patches-tmp-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/hyperxmp-patches-tmp-ltx.sty
index 70b83b44f8..88e122785b 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/hyperxmp-patches-tmp-ltx.sty
+++ b/macros/latex/contrib/pdfmanagement-testphase/hyperxmp-patches-tmp-ltx.sty
@@ -19,7 +19,7 @@
%
% for those people who are interested.
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
-\ProvidesExplPackage{hyperxmp-patches-tmp-ltx}{2022-05-11}{0.95o}
+\ProvidesExplPackage{hyperxmp-patches-tmp-ltx}{2022-06-14}{0.95p}
{Store hyperref metadata in XMP format / temporay patches to test pdfresource management ... UF}
\cs_if_exist:NT \pdfmanagement_add:nnn
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx
index 01b288ac35..f781fa8906 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx
@@ -45,7 +45,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
%
@@ -56,27 +56,27 @@
% \begin{macrocode}
%<drivers>\ProvidesExplFile
%<*dvipdfmx>
- {l3backend-testphase-dvipdfmx.def}{2022-05-11}{}
+ {l3backend-testphase-dvipdfmx.def}{2022-06-14}{}
{LaTeX~PDF~management~testphase~bundle~backend~support: dvipdfmx}
%</dvipdfmx>
%<*dvips>
- {l3backend-testphase-dvips.def}{2022-05-11}{}
+ {l3backend-testphase-dvips.def}{2022-06-14}{}
{LaTeX~PDF~management~testphase~bundle~backend~support: dvips}
%</dvips>
%<*dvisvgm>
- {l3backend-testphase-dvisvgm.def}{2022-05-11}{}
+ {l3backend-testphase-dvisvgm.def}{2022-06-14}{}
{LaTeX~PDF~management~testphase~bundle~backend~support: dvisvgm}
%</dvisvgm>
%<*luatex>
- {l3backend-testphase-luatex.def}{2022-05-11}{}
+ {l3backend-testphase-luatex.def}{2022-06-14}{}
{LaTeX~PDF~management~testphase~bundle~backend~support: PDF output (LuaTeX)}
%</luatex>
%<*pdftex>
- {l3backend-testphase-pdftex.def}{2022-05-11}{}
+ {l3backend-testphase-pdftex.def}{2022-06-14}{}
{LaTeX~PDF~management~testphase~bundle~backend~support: PDF output (pdfTeX)}
%</pdftex>
%<*xdvipdfmx>
- {l3backend-testphase-xetex.def}{2022-05-11}{}
+ {l3backend-testphase-xetex.def}{2022-06-14}{}
{LaTeX~PDF~management~testphase~bundle~backend~support: XeTeX}
%</xdvipdfmx>
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf
index 66cb1d1802..b8798209eb 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx
index 400491b8b8..5b94eebc75 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
@@ -433,7 +433,7 @@
% \begin{macrocode}
%<@@=pdfannot>
%<*header>
-\ProvidesExplPackage{l3pdfannot}{2022-05-11}{0.95o}
+\ProvidesExplPackage{l3pdfannot}{2022-06-14}{0.95p}
{PDF-annotations}
\RequirePackage{l3pdfdict}
%</header>
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf
index 32a8dd415c..5f661a49c1 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx
index fe33565a75..3899d359c2 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx
@@ -50,7 +50,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
@@ -209,7 +209,7 @@
% \begin{macrocode}
%<@@=pdfdict>
%<*header>
-\ProvidesExplPackage{l3pdfdict}{2022-05-11}{0.95o}
+\ProvidesExplPackage{l3pdfdict}{2022-06-14}{0.95p}
{Tools for PDF dictionaries (LaTeX PDF management testphase bundle)}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf
index 35b00b95f9..5c2d3af97b 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx
index 118efcafb2..6b364a4371 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx
@@ -50,7 +50,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf
index 86c2d6f152..8a542322e4 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx
index d6e1fb4eea..e7184f7346 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx
@@ -65,7 +65,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf
index b9d68650c9..98be5529a3 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx
index f88609ecf3..ed9fad214f 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx
@@ -50,7 +50,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf
index c0b2c70235..cb2d61803f 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx
index 97796862fd..df796d0b25 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx
@@ -56,7 +56,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf
index 01babfc72d..ffe5b59af8 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx
index 274aed4db7..081b945fa3 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx
@@ -84,7 +84,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf
index e801b9aa75..02c7d1e109 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx
index 289a720df0..f1b358046f 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx
@@ -50,7 +50,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf
index 7fb1850255..310ef3ff02 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx
index 309b5da3ba..40a07ce1f8 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx
@@ -70,7 +70,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
@@ -974,7 +974,7 @@
%<*package>
%<@@=pdffield>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesExplPackage{l3pdffield-testphase}{2022-05-11}{0.95o}%
+\ProvidesExplPackage{l3pdffield-testphase}{2022-06-14}{0.95p}%
{form fields}
% \end{macrocode}
% \subsection{hyperref specific command}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf
index 7c7b151522..2f04de5cd8 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx
index 6a6012cb61..1fd14a3cf8 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx
@@ -50,7 +50,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
@@ -397,7 +397,7 @@
%
% \begin{macrocode}
%<*header>
-\ProvidesExplPackage{l3pdffile}{2022-05-11}{0.95o}
+\ProvidesExplPackage{l3pdffile}{2022-06-14}{0.95p}
{embedding and referencing files in PDF---LaTeX PDF management testphase bundle}
\RequirePackage{l3pdftools} %temporarly!!
%</header>
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf
index d4b1823bf6..08e82cf10b 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx
index d5546bf702..57b34a6c1c 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx
@@ -58,7 +58,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
@@ -633,7 +633,7 @@
%<@@=pdfmanagement>
%<*header>
%
-\ProvidesExplPackage{l3pdfmanagement}{2022-05-11}{0.95o}
+\ProvidesExplPackage{l3pdfmanagement}{2022-06-14}{0.95p}
{Management of core PDF dictionaries (LaTeX PDF management testphase bundle)}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf
index ca57671fa3..d1db815023 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx
index 778141f7ae..45100b8e3d 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx
@@ -50,7 +50,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
@@ -381,7 +381,7 @@
% \begin{macrocode}
%<@@=pdfmeta>
%<*header>
-\ProvidesExplPackage{l3pdfmeta}{2022-05-11}{0.95o}
+\ProvidesExplPackage{l3pdfmeta}{2022-06-14}{0.95p}
{PDF-Standards---LaTeX PDF management testphase bundle}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf
index dc32159920..27e0fcf9a3 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx
index 23162ff2f6..3a76a28b3a 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx
@@ -50,7 +50,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
@@ -212,7 +212,7 @@
%
% \begin{macrocode}
%<*header>
-\ProvidesExplPackage{l3pdftools}{2022-05-11}{0.95o}
+\ProvidesExplPackage{l3pdftools}{2022-06-14}{0.95p}
{candidate commands for l3pdf---LaTeX PDF management testphase bundle}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf
index c6ed4aab27..f3295a834d 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx
index 2e4419950d..df6817d49d 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
@@ -133,7 +133,7 @@
% \begin{macrocode}
%<@@=pdf>
%<*header>
-\ProvidesExplPackage{l3pdfxform}{2022-05-11}{0.95o}
+\ProvidesExplPackage{l3pdfxform}{2022-06-14}{0.95p}
{command to create xforms (beta)---LaTeX PDF management testphase bundle}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf
index 8465858cd8..541ad45b7a 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx
index 0fc6be4031..ca59e88344 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
@@ -217,7 +217,7 @@
% \begin{macrocode}
%<@@=pdfmanagement>
%<*header>
-\ProvidesExplPackage{ltdocinit}{2022-05-11}{0.95o}
+\ProvidesExplPackage{ltdocinit}{2022-06-14}{0.95p}
{Initialize document metadata}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf
index f62e767f59..67c429b1b0 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/luaotfload-l3color-tmp.lua b/macros/latex/contrib/pdfmanagement-testphase/luaotfload-l3color-tmp.lua
new file mode 100644
index 0000000000..1d4eab4de1
--- /dev/null
+++ b/macros/latex/contrib/pdfmanagement-testphase/luaotfload-l3color-tmp.lua
@@ -0,0 +1,78 @@
+if not luaotfload.set_transparent_colorstack then return end
+local l = lpeg
+local spaces = l.P' '^0
+local digit16 = l.R('09', 'af', 'AF')
+
+local octet = digit16 * digit16 / function(s) return string.format('%.3g ', tonumber(s, 16) / 255) end
+local htmlcolor = l.Cs(octet * octet * octet * -1 * l.Cc'rg')
+local color_export = {
+ token.create'endlocalcontrol',
+ token.create'tex_hpack:D',
+ token.new(0, 1),
+ token.create'color_export:nnN',
+ token.new(0, 1),
+ '',
+ token.new(0, 2),
+ token.new(0, 1),
+ 'backend',
+ token.new(0, 2),
+ token.create'l_tmpa_tl',
+ token.create'exp_after:wN',
+ token.create'__color_select:nn',
+ token.create'l_tmpa_tl',
+ token.new(0, 2),
+}
+local group_end = token.create'group_end:'
+local value = (1 - l.P'}')^0
+luatexbase.add_to_callback('luaotfload.parse_color', function (value)
+ local html = htmlcolor:match(value)
+ if html then return html end
+
+ tex.runtoks(function()
+ token.get_next()
+ color_export[6] = value
+ tex.sprint(-2, color_export)
+ end)
+ local list = token.scan_list()
+ if not list.head or list.head.next or list.head.subtype ~= node.subtype'pdf_colorstack' then
+ error'Unexpected backend behavior'
+ end
+ local cmd = list.head.data
+ node.free(list)
+ return cmd
+end, 'l3color')
+
+-- Let's also integrate l3opacity
+
+luaotfload.set_transparent_colorstack(token.create'c__opacity_backend_stack_int'.index)
+
+local transparent_register = {
+ token.create'pdfmanagement_add:nnn',
+ token.new(0, 1),
+ 'Page/Resources/ExtGState',
+ token.new(0, 2),
+ token.new(0, 1),
+ '',
+ token.new(0, 2),
+ token.new(0, 1),
+ '<</ca ',
+ '',
+ '/CA ',
+ '',
+ '>>',
+ token.new(0, 2),
+}
+luatexbase.add_to_callback('luaotfload.parse_transparent', function(value)
+ value = (octet * -1):match(value)
+ if not value then
+ tex.error'Invalid transparency value'
+ return
+ end
+ value = value:sub(1, -2)
+ local result = 'opacity' .. value
+ tex.runtoks(function()
+ transparent_register[6], transparent_register[10], transparent_register[12] = result, value, value
+ tex.sprint(-2, transparent_register)
+ end)
+ return '/' .. result .. ' gs'
+end, 'l3opacity')
diff --git a/macros/latex/contrib/pdfmanagement-testphase/output-patches-tmp-ltx.pdf b/macros/latex/contrib/pdfmanagement-testphase/output-patches-tmp-ltx.pdf
index be6f8518c0..446b1518cf 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/output-patches-tmp-ltx.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/output-patches-tmp-ltx.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdflscape-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/pdflscape-ltx.sty
index 337cc6c4cc..18520f9633 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/pdflscape-ltx.sty
+++ b/macros/latex/contrib/pdfmanagement-testphase/pdflscape-ltx.sty
@@ -22,7 +22,7 @@
%% This work consists of the main source file pdflscape-ltx.sty
%%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesExplPackage{pdflscape-ltx}{2022-05-11}{0.95o}
+\ProvidesExplPackage{pdflscape-ltx}{2022-06-14}{0.95p}
{Display of landscape pages in PDF - adaption of pdflscape to the PDFmanagement bundle (testphase)}
\DeclareOption*{\PassOptionsToPackage\CurrentOption{graphics}}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx
index 009f1bf07f..107c9150ab 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
@@ -64,11 +64,11 @@
% |debug={firstaidoff={name1,name2,...},...}|.
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{pdfmanagement-firstaid}{2022-05-11}{0.95o}
+\ProvidesExplPackage{pdfmanagement-firstaid}{2022-06-14}{0.95p}
{LaTeX PDF management testphase bundle / firstaid-patches}
%<@@=pdfmanagement>
-\clist_map_inline:nn {pgf,transparent,hyperxmp,pdflscape,xcolor,color,beamer,output,colorspace}
+\clist_map_inline:nn {pgf,transparent,hyperxmp,pdflscape,xcolor,color,beamer,output,colorspace,fontspec}
{
\bool_new:c { g_@@_firstaid_#1_bool }
\bool_gset_true:c { g_@@_firstaid_#1_bool }
@@ -82,6 +82,43 @@
}
\msg_new:nnn { pdfmanagement } { firstaid }
{ loading~pdfmanagement~firstaid~code~for~#1 }
+\msg_new:nnn { pdfmanagement } { firstaid-changed }
+ { package~#1~has~changed.~Check~if~patch~is~still~valid! }
+% \end{macrocode}
+% \subsection{Fontspec}
+% When using luaLaTeX opacity is broken (issue \#30) as
+% fontspec/luaotfload doesn't use the pdfmanagement but write to ExtGState directly
+% To repair this some new lua code is needed. This also
+% improves the color parsing and allows to use cmyk and spot colors as font colors.
+% It is also needed to use a patch version of \texttt{fontspec-luatex.sty} to
+% slightly change the way how the Opacity and Color key are handled.
+% The patch is only executed if luaotfload is new enough.
+% \begin{macrocode}
+\sys_if_engine_luatex:T
+ {
+ \lua_now:n
+ {
+ if~not~luaotfload.set_transparent_colorstack~
+ then~
+ tex.print("\\bool_set_false:N\\g_@@_firstaid_fontspec_bool")~
+ end
+ }
+ \bool_if:NT \g_@@_firstaid_fontspec_bool
+ {
+ \msg_info:nnn{pdfmanagement}{firstaid}{fontspec}
+ \file_if_exist:nT { luaotfload-l3color-tmp.lua }
+ {
+ \lua_load_module:n { luaotfload-l3color-tmp.lua }
+ }
+
+ \declare@file@substitution{fontspec-luatex.sty}{fontspec-luatex-tmp-ltx.sty}
+ \AddToHook{package/fontspec/after}
+ {
+ \str_if_eq:vnF{ver@fontspec.sty}{2022/01/15~v2.8a~Font~selection~for~XeLaTeX~and~LuaLaTeX}
+ {\msg_warn:nnn{pdfmanagement}{firstaid-changed}{fontspec}}
+ }
+ }
+ }
% \end{macrocode}
% \subsection{Output routine}
% This load as few patches for the LaTeX output routine commands. They add
diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf
index b87fed57e9..37d1d1f6f4 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx
index 174a9be11c..64e80a0c5f 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Version 0.95o, released 2022-05-11}
+% \date{Version 0.95p, released 2022-06-14}
%
% \maketitle
% \begin{documentation}
@@ -386,7 +386,7 @@
% \begin{macrocode}
%<@@=pdf>
%<*package>
-\ProvidesExplPackage{pdfmanagement-testphase}{2022-05-11}{0.95o}
+\ProvidesExplPackage{pdfmanagement-testphase}{2022-06-14}{0.95p}
{LaTeX PDF management testphase bundle}
\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
\IfFormatAtLeastTF{2020-10-01}{}{
@@ -414,7 +414,7 @@
% to allow to set it in the document.
% \begin{macrocode}
%<*header>
-\ProvidesExplFile{pdfmanagement-testphase.ltx}{2022-05-11}{0.95o}
+\ProvidesExplFile{pdfmanagement-testphase.ltx}{2022-06-14}{0.95p}
{PDF~management~code~(testphase)}
%</header>
%<*package>
diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf
index 407934ef9c..f328826208 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/transparent-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/transparent-ltx.sty
index 9c8e0ee942..1a74613261 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/transparent-ltx.sty
+++ b/macros/latex/contrib/pdfmanagement-testphase/transparent-ltx.sty
@@ -3,7 +3,7 @@
%% a replacement for transparent sty from Heiko Oberdiek
%%
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
-\ProvidesExplPackage{transparent-ltx}{2022-05-11}{0.95o}
+\ProvidesExplPackage{transparent-ltx}{2022-06-14}{0.95p}
{Transparency with color stacks (replacement for transparent.sty from Heiko Oberdiek)}%
\RequirePackage{l3opacity}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty
index 17ecbfee31..459f471f5d 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty
+++ b/macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty
@@ -1,6 +1,6 @@
%% LaTeX2e file `xcolor-patches.sty'
%%
-\ProvidesPackage{xcolor-patches-tmp-ltx}[2022-05-11 v0.95o patch xcolor for l3color]
+\ProvidesPackage{xcolor-patches-tmp-ltx}[2022-06-14 v0.95p patch xcolor for l3color]
\@ifundefined{color_set:nn}{\RequirePackage{l3color}}{}
\ExplSyntaxOn
@@ -35,7 +35,10 @@
{
%this is for multi models, it will break if there is model
%l3 doesn't know, but the case is rare, so accept it for now.
- \color_set:nnn{#1}{#2}{#3}
+ \str_if_in:nnT {#2}{/}
+ {
+ \color_set:nnn{#1}{#2}{#3}
+ }
}
}
}