%% %% This is file `fontspec-luatex.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% fontspec.dtx (with options: `fontspec,luatex') %% fontspec-vars.dtx (with options: `vars') %% fontspec-msg.dtx (with options: `msg') %% fontspec-opening.dtx (with options: `fontspec,luatex') %% fontspec-fontload.dtx (with options: `fontspec,luatex') %% fontspec-user.dtx (with options: `fontspec,luatex') %% fontspec-api.dtx (with options: `fontspec,luatex') %% fontspec-internal.dtx (with options: `fontspec,luatex') %% fontspec-keyval.dtx (with options: `fontspec,luatex') %% fontspec-math.dtx (with options: `fontspec,luatex') %% fontspec-closing.dtx (with options: `fontspec,luatex') %% fontspec-patches.dtx (with options: `patches') %% ------------------------------------------------ %% The FONTSPEC package for XeLaTeX/LuaLaTeX %% (C) 2004--2016 Will Robertson and Khaled Hosny %% License information appended. %% ------------------------------------------------ \RequirePackage{expl3} \RequirePackage{xparse} \ProvidesExplPackage{fontspec-luatex}% {2016/02/01}{2.5a}{Font selection for XeLaTeX and LuaLaTeX} \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 \cs_new:Npn \FontspecSetCheckBoolTrue { \bool_set_true:N \l__fontspec_check_bool } \cs_new:Npn \FontspecSetCheckBoolFalse { \bool_set_false: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_graphite_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 \int_new:N \l_fontspec_script_int \int_new:N \l_fontspec_language_int \int_new:N \l_fontspec_strnum_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 \tl_set:Nx \c_colon_str { \tl_to_str:N : } \cs_set:Npn \use_v:nnnnn #1#2#3#4#5 {#5} \cs_set:Npn \use_iv:nnnnn #1#2#3#4#5 {#4} \cs_generate_variant:Nn \str_if_eq:nnTF {nv} \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 \tl_if_empty:nTF {x} \cs_generate_variant:Nn \tl_if_empty:nTF {x} \cs_generate_variant:Nn \prop_put:Nnn {Nxx} \cs_new:Nn \__fontspec_int_mult_truncate:Nn { \int_set:Nn #1 { \__dim_eval:w #2 #1 \__dim_eval_end: } } \cs_new:Npn \__fontspec_error:n { \msg_error:nn {fontspec} } \cs_new:Npn \__fontspec_error:nx { \msg_error:nnx {fontspec} } \cs_new:Npn \__fontspec_warning:n { \msg_warning:nn {fontspec} } \cs_new:Npn \__fontspec_warning:nx { \msg_warning:nnx {fontspec} } \cs_new:Npn \__fontspec_warning:nxx { \msg_warning:nnxx {fontspec} } \cs_new:Npn \__fontspec_info:n { \msg_info:nn {fontspec} } \cs_new:Npn \__fontspec_info:nx { \msg_info:nnx {fontspec} } \cs_new:Npn \__fontspec_info:nxx { \msg_info:nnxx {fontspec} } \cs_new:Npn \__fontspec_trace:n { \msg_trace:nn {fontspec} } \msg_new:nnn {fontspec} {no-size-info} { Size~ information~ must~ be~ supplied.\\ For~ example,~ SizeFeatures={Size={8-12},...}. } \msg_new:nnnn {fontspec} {font-not-found} { The~ font~ "#1"~ cannot~ be~ found. } { A~font~might~not~be~found~for~many~reasons.\\ Check~the~spelling,~where~the~font~is~installed~etc.~etc.\\\\ When~in~doubt,~ask~someone~for~help! } \msg_new:nnnn {fontspec} {rename-feature-not-exist} { The~ feature~ #1~ doesn't~ appear~ to~ be~ defined. } { It~ looks~ like~ you're~ trying~ to~ rename~ a~ feature~ that~ doesn't~ exist. } \msg_new:nnn {fontspec} {no-glyph} { '\l_fontspec_fontname_tl'~ does~ not~ contain~ glyph~ #1. } \msg_new:nnnn {fontspec} {euler-too-late} { The~ euler~ package~ must~ be~ loaded~ BEFORE~ fontspec. } { fontspec~ only~ overwrites~ euler's~ attempt~ to~ define~ the~ maths~ text~ fonts~ if~ fontspec~ is~ loaded~ after~ euler.~ Type~ ~ to~ proceed~ with~ incorrect~ \string\mathit,~ \string\mathbf,~ etc. } \msg_new:nnnn {fontspec} {no-xcolor} { Cannot~ load~ named~ colours~ without~ the~ xcolor~ package. } { Sorry,~ I~ can't~ do~ anything~ to~ help.~ Instead~ of~ loading~ the~ color~ package,~ use~ xcolor~ instead.~ It's~ better. } \msg_new:nnnn {fontspec} {unknown-color-model} { Error~ loading~ colour~ `#1';~ unknown~ colour~ model. } { Sorry,~ I~ can't~ do~ anything~ to~ help.~ Please~ report~ this~ error~ to~ my~ developer~ with~ a~ minimal~ example~ that~ causes~ the~ problem. } \msg_new:nnnn {fontspec} {not-in-addfontfeatures} { The~ "#1"~ font~ feature~ cannot~ be~ used~ in~ \string\addfontfeatures. } { This~ is~ due~ to~ how~ TeX~ loads~ fonts;~ such~ settings~ are~ global~ so~ adding~ them~ mid-document~ within~ a~ group~ causes~ confusion.~ You'll~ need~ to~ define~ multiple~ font~ families~ to~ achieve~ what~ you~ want. } \msg_new:nnn {fontspec} {addfontfeatures-ignored} { \string\addfontfeature (s)~ ignored~ \msg_line_context:;~ it~ cannot~ be~ used~ with~ a~ font~ that~ wasn't~ selected~ by~ a~ fontspec~ command.\\ \\ The~ current~ font~ is~ "\use:c{font@name}".\\ \int_compare:nTF { \clist_count:n {#1} = 1 } { The~ requested~ feature~ is~ "#1". } { The~ requested~ features~ are~ "#1". } } \msg_new:nnn {fontspec} {feature-option-overwrite} { Option~ '#2'~ of~ font~ feature~ '#1'~ overwritten. } \msg_new:nnn {fontspec} {script-not-exist-latn} { Font~ '\l_fontspec_fontname_tl'~ does~ not~ contain~ script~ '#1'.\\ 'Latin'~ script~ used~ instead. } \msg_new:nnn {fontspec} {script-not-exist} { Font~ '\l_fontspec_fontname_tl'~ does~ not~ contain~ script~ '#1'. } \msg_new:nnn {fontspec} {aat-feature-not-exist} { '\l_keys_key_tl=\l_keys_value_tl'~ feature~ not~ supported~ for~ AAT~ font~ '\l_fontspec_fontname_tl'. } \msg_new:nnn {fontspec} {aat-feature-not-exist-in-font} { AAT~ feature~ '\l_keys_key_tl=\l_keys_value_tl'~ (#1)~ not~ available~ in~ font~ '\l_fontspec_fontname_tl'. } \msg_new:nnn {fontspec} {icu-feature-not-exist} { '\l_keys_key_tl=\l_keys_value_tl'~ feature~ not~ supported~ for~ OpenType~ font~ '\l_fontspec_fontname_tl' } \msg_new:nnn {fontspec} {icu-feature-not-exist-in-font} { OpenType~ feature~ '\l_keys_key_tl=\l_keys_value_tl'~ (#1)~ not~ available~ for~ font~ '\l_fontspec_fontname_tl'~ with~ script~ '\l__fontspec_script_name_tl'~ and~ language~ '\l__fontspec_lang_name_tl'. } \msg_new:nnn {fontspec} {no-opticals} { '\l_fontspec_fontname_tl'~ doesn't~ appear~ to~ have~ an~ Optical~ Size~ axis. } \msg_new:nnn {fontspec} {language-not-exist} { Language~ '#1'~ not~ available~ for~ font~ '\l_fontspec_fontname_tl'~ with~ script~ '\l__fontspec_script_name_tl'.\\ 'Default'~ language~ used~ instead. } \msg_new:nnn {fontspec} {only-xetex-feature} { Ignored~ XeTeX~ only~ feature:~ '#1'. } \msg_new:nnn {fontspec} {only-luatex-feature} { Ignored~ LuaTeX~ only~ feature:~ '#1'. } \msg_new:nnn {fontspec} {no-mapping} { Input~ mapping~ not~ (yet?)~ supported~ in~ LuaTeX. } \msg_new:nnn {fontspec} {no-mapping-ligtex} { Input~ mapping~ not~ (yet?)~ supported~ in~ LuaTeX.\\ Use~ "Ligatures=TeX"~ instead~ of~ "Mapping=tex-text". } \msg_new:nnn {fontspec} {cm-default-obsolete} { The~ "cm-default"~ package~ option~ is~ obsolete. } \msg_new:nnn {fontspec} {fakebold-only-xetex} { The~ "FakeBold"~ and~ "AutoFakeBold"~ options~ are~ only~ available~ with~ XeLaTeX.\\ Option~ ignored. } \msg_new:nnn {fontspec} {defining-font} { Font~ family~'\l_fontspec_family_tl'~ created~ for~ font~ '#2'~ with~ options~ [\l__fontspec_all_features_clist].\\ \\ This~ font~ family~ consists~ of~ the~ following~ NFSS~ series/shapes:\\ \l_fontspec_defined_shapes_tl } \msg_new:nnn {fontspec} {no-font-shape} { Could~ not~ resolve~ font~ #1~ (it~ probably~ doesn't~ exist). } \msg_new:nnn {fontspec} {set-scale} { \l_fontspec_fontname_tl\space scale ~=~ \l__fontspec_scale_tl. } \msg_new:nnn {fontspec} {setup-math} { Adjusting~ the~ maths~ setup~ (use~ [no-math]~ to~ avoid~ this). } \msg_new:nnn {fontspec} {no-scripts} { Font~ \l_fontspec_fontname_tl\space does~ not~ contain~ any~ OpenType~ `Script'~ information. } \msg_new:nnn {fontspec} {opa-twice} { Opacity~ set~ twice,~ in~ both~ Colour~ and~ Opacity.\\ Using~ specification~ "Opacity=#1". } \msg_new:nnn {fontspec} {opa-twice-col} { Opacity~ set~ twice,~ in~ both~ Opacity~ and~ Colour.\\ Using~ an~ opacity~ specification~ in~ hex~ of~ "#1/FF". } \msg_new:nnn {fontspec} {bad-colour} { Bad~ colour~ declaration~ "#1".~ Colour~ must~ be~ one~ of:\\ *~ a~ named~ xcolor~ colour\\ *~ a~ six-digit~ hex~ colour~ RRGGBB\\ *~ an~ eight-digit~ hex~ colour~ RRGGBBTT~ with~ opacity } \DeclareOption{cm-default} { \__fontspec_warning:n {cm-default-obsolete} } \DeclareOption{math}{\bool_set_true:N \g__fontspec_math_bool} \DeclareOption{no-math}{\bool_set_false:N \g__fontspec_math_bool} \DeclareOption{config}{\bool_set_true:N \g__fontspec_cfg_bool} \DeclareOption{no-config}{\bool_set_false:N \g__fontspec_cfg_bool} \DeclareOption{euenc}{\bool_set_true:N \g__fontspec_euenc_bool} \DeclareOption{tuenc}{\bool_set_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,euenc} \ProcessOptions* \tl_set:Nn \g_fontspec_encoding_tl {TU} \file_if_exist:nF {tuenc.def} { \bool_set_true:N \g__fontspec_euenc_bool } \bool_if:NT \g__fontspec_euenc_bool { \tl_set:Nn \g_fontspec_encoding_tl {EU2} } \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 \normalsize % to overcome the encoding changing the current font size \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_set:Nn \__fontspec_fontwrap:n { "#1" } \cs_set:Npn \__fontspec_primitive_font_set:Nnn #1#2#3 { \font #1 = #2 ~at~ #3 \scan_stop: } \cs_set:Npn \__fontspec_primitive_font_gset:Nnn #1#2#3 { \global \font #1 = #2 ~at~ #3 \scan_stop: } \cs_set:Npn \__fontspec_font_suppress_not_found_error: { \int_set_eq:NN \xetex_suppressfontnotfounderror:D \c_one } \prg_set_conditional:Nnn \__fontspec_font_if_null:N {p,TF,T,F} { \ifx #1 \nullfont \prg_return_true: \else \prg_return_false: \fi } \cs_new:Nn \__fontspec_font_set:Nnn { \__fontspec_primitive_font_set:Nnn #1 { \__fontspec_fontwrap:n {#2} } {#3} } \cs_new:Nn \__fontspec_font_gset:Nnn { \__fontspec_primitive_font_gset:Nnn #1 { \__fontspec_fontwrap:n {#2} } {#3} } \prg_new_conditional:Nnn \font_glyph_if_exist:Nn {p,TF,T,F} { \etex_iffontchar:D #1 #2 \scan_stop: \prg_return_true: \else: \prg_return_false: \fi: } \cs_new:Nn \__fontspec_pass_args:nnn { \IfNoValueTF {#2} { \__fontspec_post_arg:w {#1} {#3} } { #1 {#2} {#3} } } \NewDocumentCommand \__fontspec_post_arg:w { m m O{} } { #1 {#3} {#2} } \NewDocumentCommand \fontspec { o m } { \__fontspec_pass_args:nnn \__fontspec_fontspec:nn {#1} {#2} } \cs_new:Nn \__fontspec_fontspec:nn { \fontspec_set_family:Nnn \f@family {#1} {#2} \fontencoding { \l__fontspec_nfss_enc_tl } \selectfont \ignorespaces } \DeclareDocumentCommand \setmainfont { o m } { \__fontspec_pass_args:nnn \__fontspec_setmainfont:nn {#1} {#2} } \cs_new:Nn \__fontspec_setmainfont:nn { \fontspec_set_family:Nnn \rmdefault {#1}{#2} \normalfont \ignorespaces } \DeclareDocumentCommand \setsansfont { o m } { \__fontspec_pass_args:nnn \__fontspec_setsansfont:nn {#1} {#2} } \cs_new:Nn \__fontspec_setsansfont:nn { \fontspec_set_family:Nnn \sfdefault {#1}{#2} \normalfont \ignorespaces } \DeclareDocumentCommand \setmonofont { o m } { \__fontspec_pass_args:nnn \__fontspec_setmonofont:nn {#1} {#2} } \cs_new:Nn \__fontspec_setmonofont:nn { \fontspec_set_family:Nnn \ttdefault {#1}{#2} \normalfont \ignorespaces } \cs_set_eq:NN \setromanfont \setmainfont \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 \DeclareDocumentCommand \setmathrm { o m } { \__fontspec_pass_args:nnn \__fontspec_setmathrm:nn {#1} {#2} } \cs_new:Nn \__fontspec_setmathrm:nn { \fontspec_set_family:Nnn \g__fontspec_mathrm_tl {#1} {#2} } \DeclareDocumentCommand \setboldmathrm { o m } { \__fontspec_pass_args:nnn \__fontspec_setboldmathrm:nn {#1} {#2} } \cs_new:Nn \__fontspec_setboldmathrm:nn { \fontspec_set_family:Nnn \g__fontspec_bfmathrm_tl {#1} {#2} } \DeclareDocumentCommand \setmathsf { o m } { \__fontspec_pass_args:nnn \__fontspec_setmathsf:nn {#1} {#2} } \cs_new:Nn \__fontspec_setmathsf:nn { \fontspec_set_family:Nnn \g__fontspec_mathsf_tl {#1} {#2} } \DeclareDocumentCommand \setmathtt { o m } { \__fontspec_pass_args:nnn \__fontspec_setmathtt:nn {#1} {#2} } \cs_new:Nn \__fontspec_setmathtt:nn { \fontspec_set_family:Nnn \g__fontspec_mathtt_tl {#1} {#2} } \@onlypreamble\setmathrm \@onlypreamble\setboldmathrm \@onlypreamble\setmathsf \@onlypreamble\setmathtt \tl_set:Nn \g__fontspec_mathrm_tl {\rmdefault} \tl_set:Nn \g__fontspec_mathsf_tl {\sfdefault} \tl_set:Nn \g__fontspec_mathtt_tl {\ttdefault} \DeclareDocumentCommand \newfontfamily { m o m } { \__fontspec_pass_args:nnn { \__fontspec_newfontfamily:Nnn #1 } {#2} {#3} } \cs_new:Nn \__fontspec_newfontfamily:Nnn { \fontspec_set_family:cnn { g__fontspec_ \cs_to_str:N #1 _family } {#2} {#3} \use:x { \exp_not:N \DeclareRobustCommand \exp_not:N #1 { \exp_not:N \fontfamily { \use:c {g__fontspec_ \cs_to_str:N #1 _family} } \exp_not:N \fontencoding { \l__fontspec_nfss_enc_tl } \exp_not:N \selectfont } } } \DeclareDocumentCommand \newfontface { m o m } { \__fontspec_pass_args:nnn { \__fontspec_newfontface:Nnn #1 } {#2} {#3} } \cs_new:Nn \__fontspec_newfontface:Nnn { \newfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2 ] {#3} } \clist_new:N \g__fontspec_default_fontopts_clist \prop_new:N \g__fontspec_fontopts_prop \DeclareDocumentCommand \defaultfontfeatures { t+ o m } { \IfNoValueTF {#2} { \__fontspec_set_default_features:nn {#1} {#3} } { \__fontspec_set_font_default_features:nnn {#1} {#2} {#3} } \ignorespaces } \cs_new:Nn \__fontspec_set_default_features:nn { \IfBooleanTF {#1} \clist_put_right:Nn \clist_set: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 g__fontspec_ \cs_to_str:N ##1 _family\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_put:NVn \g__fontspec_fontopts_prop \l__fontspec_tmp_tl {#3,} } } } } \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} \clist_map_break: } } } \bool_new:N \l__fontspec_disable_defaults_bool \DeclareDocumentCommand \addfontfeatures {m} { \fontspec_if_fontspec_font:TF { \group_begin: \keys_set_known:nnN {fontspec-addfeatures} {#1} \l__fontspec_tmp_tl \prop_get:cnN {g__fontspec_ \f@family _prop} {options} \l__fontspec_options_tl \prop_get:cnN {g__fontspec_ \f@family _prop} {fontname} \l__fontspec_fontname_tl \bool_set_true:N \l__fontspec_disable_defaults_bool \use:x { \exp_not:N \fontspec_select:nn { \l__fontspec_options_tl , #1 } {\l__fontspec_fontname_tl} } \group_end: \fontfamily\l_fontspec_family_tl\selectfont } { \__fontspec_warning:nx {addfontfeatures-ignored} {#1} } \ignorespaces } \cs_set_eq:NN \addfontfeature \addfontfeatures \DeclareDocumentCommand \newfontfeature {mm} { \keys_define:nn { fontspec } { #1 .code:n = { \__fontspec_update_featstr:n {#2} } } } \DeclareDocumentCommand \newAATfeature {mmmm} { \keys_if_exist:nnF { fontspec } {#1} { \__fontspec_define_font_feature:n {#1} } \keys_if_choice_exist:nnnT {fontspec} {#1} {#2} { \__fontspec_warning:nxx {feature-option-overwrite} {#1} {#2} } \__fontspec_define_feature_option:nnnnn {#1}{#2}{#3}{#4}{} } \DeclareDocumentCommand \newopentypefeature {mmm} { \keys_if_exist:nnF { fontspec / options } {#1} { \__fontspec_define_font_feature:n {#1} } \keys_if_choice_exist:nnnT {fontspec} {#1} {#2} { \__fontspec_warning:nxx {feature-option-overwrite} {#1} {#2} } \__fontspec_define_feature_option:nnnnn {#1}{#2}{}{}{#3} } \cs_set_eq:NN \newICUfeature \newopentypefeature % deprecated \bool_new:N \l__fontspec_alias_bool \DeclareDocumentCommand \aliasfontfeature {mm} { \bool_set_false:N \l__fontspec_alias_bool \clist_map_inline:nn { fontspec, fontspec-preparse, fontspec-preparse-external, fontspec-preparse-nested, fontspec-renderer } { \keys_if_exist:nnT {##1} {#1} { \bool_set_true:N \l__fontspec_alias_bool \__fontspec_alias_font_feature:nnn {##1} {#1} {#2} } } \bool_if:NF \l__fontspec_alias_bool { \__fontspec_warning:nx {rename-feature-not-exist} {#1} } } \cs_set:Nn \__fontspec_alias_font_feature:nnn { \keys_define:nn {#1} { #3 .code:n = { \keys_set:nn {#1} { #2 = {##1} } } } } \DeclareDocumentCommand \aliasfontfeatureoption {mmm} { \keys_define:nn { fontspec / #1 } { #3 .meta:n = {#2} } } \DeclareDocumentCommand \newfontscript {mm} { \fontspec_new_script:nn {#1} {#2} } \DeclareDocumentCommand \newfontlanguage {mm} { \fontspec_new_lang:nn {#1} {#2} } \DeclareDocumentCommand \DeclareFontsExtensions {m} { \clist_set:Nn \l__fontspec_extensions_clist { #1 } \tl_remove_all:Nn \l__fontspec_extensions_clist {~} } \DeclareFontsExtensions{.otf,.ttf,.OTF,.TTF,.ttc,.TTC,.dfont} \prg_new_conditional:Nnn \fontspec_if_fontspec_font: {TF,T,F} { \cs_if_exist:cTF {g__fontspec_ \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 { \prop_get:cnN {g__fontspec_ \f@family _prop} {fontdef} \l__fontspec_fontdef_tl \__fontspec_font_set:Nnn \l_fontspec_font {\l__fontspec_fontdef_tl} {\f@size pt} \bool_if:NTF \l__fontspec_atsui_bool { \fontspec_make_AAT_feature_string:nnTF {#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 { \prop_get:cnN {g__fontspec_ \f@family _prop} {fontdef} \l__fontspec_fontdef_tl \__fontspec_font_set:Nnn \l_fontspec_font {\l__fontspec_fontdef_tl} {\f@size pt} \__fontspec_set_font_type: \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 { \prop_get:cnN {g__fontspec_ \f@family _prop} {fontdef} \l__fontspec_fontdef_tl \__fontspec_font_set:Nnn \l_fontspec_font {\l__fontspec_fontdef_tl} {\f@size pt} \__fontspec_set_font_type: \bool_if:NTF \l__fontspec_ot_bool { \prop_get:cnN {g__fontspec_ \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_ \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_ \f@family _prop} {script-tag} \l_fontspec_script_tl \prop_get:cnN {g__fontspec_ \f@family _prop} {lang-tag} \l_fontspec_lang_tl \fontspec_check_ot_feat:nTF {#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 { \prop_get:cnN {g__fontspec_ \f@family _prop} {fontdef} \l__fontspec_fontdef_tl \__fontspec_font_set:Nnn \l_fontspec_font {\l__fontspec_fontdef_tl} {\f@size pt} \__fontspec_set_font_type: \bool_if:NTF \l__fontspec_ot_bool { \fontspec_iv_str_to_num:Nn \l_fontspec_script_int {#1} \fontspec_iv_str_to_num:Nn \l_fontspec_language_int {#2} \fontspec_check_ot_feat:nTF {#3} \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 { \prop_get:cnN {g__fontspec_ \f@family _prop} {fontdef} \l__fontspec_fontdef_tl \__fontspec_font_set:Nnn \l_fontspec_font {\l__fontspec_fontdef_tl} {\f@size pt} \__fontspec_set_font_type: \bool_if:NTF \l__fontspec_ot_bool { \fontspec_check_script:nTF {#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 { \prop_get:cnN {g__fontspec_ \f@family _prop} {fontdef} \l__fontspec_fontdef_tl \__fontspec_font_set:Nnn \l_fontspec_font {\l__fontspec_fontdef_tl} {\f@size pt} \__fontspec_set_font_type: \bool_if:NTF \l__fontspec_ot_bool { \prop_get:cnN {g__fontspec_ \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_ \f@family _prop} {script-tag} \l_fontspec_script_tl \fontspec_check_lang:nTF {#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 { \prop_get:cnN {g__fontspec_ \f@family _prop} {fontdef} \l__fontspec_fontdef_tl \__fontspec_font_set:Nnn \l_fontspec_font {\l__fontspec_fontdef_tl} {\f@size pt} \__fontspec_set_font_type: \bool_if:NTF \l__fontspec_ot_bool { \tl_set:Nn \l_fontspec_script_tl {#1} \fontspec_iv_str_to_num:Nn \l_fontspec_script_int {#1} \fontspec_check_lang:nTF {#2} \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 { \prop_get:cnN {g__fontspec_ \f@family _prop} {fontdef} \l__fontspec_fontdef_tl \__fontspec_font_set:Nnn \l_fontspec_font {\l__fontspec_fontdef_tl} {\f@size pt} \__fontspec_set_font_type: \bool_if:NTF \l__fontspec_ot_bool { \prop_get:cnN {g__fontspec_ \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 { \prop_get:cnN {g__fontspec_ \f@family _prop} {fontdef} \l__fontspec_fontdef_tl \__fontspec_font_set:Nnn \l_fontspec_font {\l__fontspec_fontdef_tl} {\f@size pt} \__fontspec_set_font_type: \bool_if:NTF \l__fontspec_ot_bool { \prop_get:cnN {g__fontspec_ \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_set_family:Nnn { \tl_set:Nn \l__fontspec_family_label_tl { #1 } \fontspec_select:nn {#2}{#3} \tl_set_eq:NN #1 \l_fontspec_family_tl } \cs_generate_variant:Nn \fontspec_set_family:Nnn {c} \cs_new:Nn \fontspec_set_fontface:NNnn { \tl_set:Nn \l__fontspec_family_label_tl { #1 } \fontspec_select:nn {#3}{#4} \tl_set_eq:NN #1 \l_fontspec_font \tl_set_eq:NN #2 \l_fontspec_family_tl } \cs_set:Nn \fontspec_select:nn { \group_begin: \__fontspec_font_suppress_not_found_error: \__fontspec_init: \tl_set:Nx \l_fontspec_fontname_tl {#2} \tl_set:Nx \l_fontspec_fontname_up_tl {#2} \tl_set:Nx \l__fontspec_basename_tl {#2} \__fontspec_load_external_fontoptions:Nn \l_fontspec_fontname_tl {#2} \__fontspec_extract_all_features:n {#1} \__fontspec_preparse_features: \__fontspec_load_font: \__fontspec_set_scriptlang: \__fontspec_get_features:Nn \l__fontspec_rawfeatures_sclist {} \bool_set_false:N \l__fontspec_firsttime_bool \__fontspec_save_family:nTF {#2} { \__fontspec_save_fontinfo: \__fontspec_find_autofonts: \DeclareFontFamily{\l__fontspec_nfss_enc_tl}{\l_fontspec_family_tl}{} \__fontspec_set_faces: \__fontspec_info:nxx {defining-font} {#1} {#2} } { } \group_end: } \cs_new:Nn \__fontspec_load_external_fontoptions:Nn { \__fontspec_sanitise_fontname:Nn #1 {#2} \tl_set:Nx \l__fontspec_ext_filename_tl {#1.fontspec} \tl_remove_all:Nn \l__fontspec_ext_filename_tl {~} \prop_if_in:NVF \g__fontspec_fontopts_prop #1 { \exp_args:No \file_if_exist:nT { \l__fontspec_ext_filename_tl } { \file_input:n { \l__fontspec_ext_filename_tl } } } } \cs_new:Nn \__fontspec_extract_all_features:n { \bool_if:NTF \l__fontspec_disable_defaults_bool { \clist_set:Nx \l__fontspec_all_features_clist {#1} } { \prop_get:NVNF \g__fontspec_fontopts_prop \l_fontspec_fontname_tl \l__fontspec_fontopts_clist { \clist_clear:N \l__fontspec_fontopts_clist } \prop_get:NVNF \g__fontspec_fontopts_prop \l__fontspec_family_label_tl \l__fontspec_family_fontopts_clist { \clist_clear:N \l__fontspec_family_fontopts_clist } \tl_clear:N \l__fontspec_family_label_tl \clist_set:Nx \l__fontspec_all_features_clist { \g__fontspec_default_fontopts_clist, \l__fontspec_family_fontopts_clist, \l__fontspec_fontopts_clist, #1 } } \tl_set:Nx \l__fontspec_fontid_tl { \tl_to_str:N \l_fontspec_fontname_tl-:-\tl_to_str:N \l__fontspec_all_features_clist } } \cs_new:Nn \__fontspec_preparse_features: { \__fontspec_if_detect_external:VT \l__fontspec_basename_tl { \keys_set:nn {fontspec-preparse-external} {ExternalLocation} } \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 \keys_set_known:nxN {fontspec-renderer} {\l__fontspec_keys_leftover_clist} \l__fontspec_keys_leftover_clist \keys_set_known:nxN {fontspec-preparse} {\l__fontspec_keys_leftover_clist} \l__fontspec_fontfeat_clist } \cs_new:Nn \__fontspec_load_font: { \__fontspec_font_set:Nnn \l_fontspec_font { \__fontspec_fullname:n {\l_fontspec_fontname_up_tl} } {\f@size pt} \__fontspec_font_if_null:NT \l_fontspec_font { \__fontspec_error:nx {font-not-found} {\l_fontspec_fontname_up_tl} } \__fontspec_set_font_type: \__fontspec_font_gset:Nnn \l_fontspec_font { \__fontspec_fullname:n {\l_fontspec_fontname_up_tl} } {\f@size pt} \l_fontspec_font % this is necessary for LuaLaTeX to check the scripts properly } \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 \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_generate_variant:Nn \__fontspec_if_detect_external:nT {V} \cs_set:Nn \__fontspec_fullname:n { \__fontspec_namewrap:n { #1 \l__fontspec_extension_tl } \l_fontspec_renderer_tl \l__fontspec_optical_size_tl } \cs_new:Nn \__fontspec_set_scriptlang: { \bool_if:NT \l__fontspec_firsttime_bool { \tl_if_empty:NTF \l__fontspec_script_name_tl { \fontspec_check_script:nTF {latn} { \tl_set:Nn \l__fontspec_script_name_tl {Latin} \tl_if_empty:NT \l__fontspec_lang_name_tl { \tl_set:Nn \l__fontspec_lang_name_tl {Default} } \keys_set:nx {fontspec} {Script=\l__fontspec_script_name_tl} \keys_set:nx {fontspec} {Language=\l__fontspec_lang_name_tl} } { \__fontspec_info:n {no-scripts} } } { \tl_if_empty:NT \l__fontspec_lang_name_tl { \tl_set:Nn \l__fontspec_lang_name_tl {Default} } \keys_set:nx {fontspec} {Script=\l__fontspec_script_name_tl} \keys_set:nx {fontspec} {Language=\l__fontspec_lang_name_tl} } } } \prg_new_conditional:Nnn \__fontspec_save_family:n {TF} { \cs_if_exist:NT \l__fontspec_nfss_fam_tl { \cs_set_eq:cN {g__fontspec_UID_\l__fontspec_fontid_tl} \l__fontspec_nfss_fam_tl } \cs_if_exist:cF {g__fontspec_UID_\l__fontspec_fontid_tl} { % The font name is fully expanded, in case it's defined in terms of macros, before having its spaces zapped: \tl_set:Nx \l__fontspec_tmp_tl {#1} \tl_remove_all:Nn \l__fontspec_tmp_tl {~} \cs_if_exist:cTF {g__fontspec_family_ \l__fontspec_tmp_tl _int} { \int_gincr:c {g__fontspec_family_ \l__fontspec_tmp_tl _int} } { \int_new:c {g__fontspec_family_ \l__fontspec_tmp_tl _int} } \tl_gset:cx {g__fontspec_UID_\l__fontspec_fontid_tl} { \l__fontspec_tmp_tl ( \int_use:c {g__fontspec_family_ \l__fontspec_tmp_tl _int} ) } } \tl_gset:Nv \l_fontspec_family_tl {g__fontspec_UID_\l__fontspec_fontid_tl} \cs_if_exist:cTF {g__fontspec_ \l_fontspec_family_tl _prop} \prg_return_false: \prg_return_true: } \cs_new:Nn \__fontspec_save_fontinfo: { \prop_new:c {g__fontspec_ \l_fontspec_family_tl _prop} \prop_gput:cnx {g__fontspec_ \l_fontspec_family_tl _prop} {fontname} { \l__fontspec_basename_tl } \prop_gput:cnx {g__fontspec_ \l_fontspec_family_tl _prop} {options} { \l__fontspec_all_features_clist } \prop_gput:cnx {g__fontspec_ \l_fontspec_family_tl _prop} {fontdef} { \__fontspec_fullname:n {\l_fontspec_fontname_tl} : \l__fontspec_pre_feat_sclist \l__fontspec_rawfeatures_sclist } \prop_gput:cnV {g__fontspec_ \l_fontspec_family_tl _prop} {script-num} \l_fontspec_script_int \prop_gput:cnV {g__fontspec_ \l_fontspec_family_tl _prop} {lang-num} \l_fontspec_language_int \prop_gput:cnV {g__fontspec_ \l_fontspec_family_tl _prop} {script-tag} \l_fontspec_script_tl \prop_gput:cnV {g__fontspec_ \l_fontspec_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 \updefault \l_fontspec_fontname_tl \l__fontspec_fontfeat_up_clist \__fontspec_add_nfssfont:nnnn \bfdefault \updefault \l_fontspec_fontname_bf_tl \l__fontspec_fontfeat_bf_clist \__fontspec_add_nfssfont:nnnn \mddefault \itdefault \l_fontspec_fontname_it_tl \l__fontspec_fontfeat_it_clist \__fontspec_add_nfssfont:nnnn \mddefault \sldefault \l_fontspec_fontname_sl_tl \l__fontspec_fontfeat_sl_clist \__fontspec_add_nfssfont:nnnn \bfdefault \itdefault \l_fontspec_fontname_bfit_tl \l__fontspec_fontfeat_bfit_clist \__fontspec_add_nfssfont:nnnn \bfdefault \sldefault \l_fontspec_fontname_bfsl_tl \l__fontspec_fontfeat_bfsl_clist \prop_map_inline:Nn \l__fontspec_nfssfont_prop { \__fontspec_set_faces_aux:nnnnn ##2 } } \cs_new:Nn \__fontspec_set_faces_aux:nnnnn { \fontspec_complete_fontname:Nn \l__fontspec_curr_fontname_tl {#3} \__fontspec_make_font_shapes:Nnnnn \l__fontspec_curr_fontname_tl {#1} {#2} {#4} {#5} } \cs_new:Nn \__fontspec_set_font_type: { \bool_set_true:N \l__fontspec_ot_bool } \cs_generate_variant:Nn \tl_if_empty:nF {x} \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} { \__fontspec_font_set:Nnn \l_tmpa_font { \__fontspec_fullname:n {#1} } {\f@size pt} \__fontspec_font_set:Nnn \l_tmpb_font { \__fontspec_fullname:n {#1#2} } {\f@size pt} \str_if_eq_x:nnTF { \fontname \l_tmpa_font } { \fontname \l_tmpb_font } { \prg_return_false: } { \prg_return_true: } } \cs_new:Nn \__fontspec_make_font_shapes:Nnnnn { \group_begin: \keys_set_known:nxN {fontspec-preparse-external} { #4 } \l__fontspec_leftover_clist \__fontspec_load_fontname:n {#1} \__fontspec_declare_shape:nnxx {#2} {#3} { \l__fontspec_fontopts_clist, \l__fontspec_leftover_clist } {#5} \group_end: } \cs_new:Nn \__fontspec_load_fontname:n { \__fontspec_load_external_fontoptions:Nn \l_fontspec_fontname_tl {#1} \prop_get:NVNF \g__fontspec_fontopts_prop \l_fontspec_fontname_tl \l__fontspec_fontopts_clist { \clist_clear:N \l__fontspec_fontopts_clist } \__fontspec_font_set:Nnn \l_fontspec_font {\__fontspec_fullname:n {\l_fontspec_fontname_tl}} {\f@size pt} \__fontspec_font_if_null:NT \l_fontspec_font { \__fontspec_error:nx {font-not-found} {#1} } } \cs_new:Nn \__fontspec_declare_shape:nnnn { \tl_clear:N \l__fontspec_nfss_tl \tl_clear: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} { \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 ##1 } \l__fontspec_sizing_leftover_clist \tl_if_empty:NT \l__fontspec_size_tl { \__fontspec_error:n {no-size-info} } % "normal" \__fontspec_load_fontname:n {\l__fontspec_sizedfont_tl} \__fontspec_setup_nfss:Nnn \l__fontspec_nfss_tl {#3} {} % 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:n {\l_fontspec_fontname_sc_tl} }% local for each size } \bool_if:NF \l__fontspec_nosc_bool { \__fontspec_setup_nfss:Nnn \l__fontspec_nfss_sc_tl {#3} {\l__fontspec_fontfeat_curr_clist} } } \__fontspec_declare_shapes_normal:nn {#1} {#2} \__fontspec_declare_shapes_smcaps:nn {#1} {#2} \__fontspec_declare_shape_slanted:nn {#1} {#2} \__fontspec_declare_shape_loginfo:nn {#1} {#2} } \cs_generate_variant:Nn \__fontspec_declare_shape:nnnn {nnxx} \cs_new:Nn \__fontspec_setup_nfss:Nnn { \__fontspec_get_features:Nn \l__fontspec_rawfeatures_sclist { #2 , \l__fontspec_sizing_leftover_clist , #3 } \tl_put_right:Nx #1 { <\l__fontspec_size_tl> \l__fontspec_scale_tl \__fontspec_fontwrap:n { \__fontspec_fullname:n { \l_fontspec_fontname_tl } : \l__fontspec_pre_feat_sclist \l__fontspec_rawfeatures_sclist } } } \cs_new:Nn \__fontspec_declare_shapes_normal:nn { \__fontspec_DeclareFontShape:xxxxxx {\l__fontspec_nfss_enc_tl} {\l_fontspec_family_tl} {#1} {#2} {\l__fontspec_nfss_tl}{\l__fontspec_postadjust_tl} } \cs_new:Nn \__fontspec_declare_shapes_smcaps:nn { \bool_if:NF \l__fontspec_nosc_bool { \__fontspec_DeclareFontShape:xxxxxx {\l__fontspec_nfss_enc_tl} {\l_fontspec_family_tl} {#1} { \__fontspec_combo_sc_shape:n {#2} } {\l__fontspec_nfss_sc_tl} {\l__fontspec_postadjust_tl} } } \cs_new:Nn \__fontspec_combo_sc_shape:n { \tl_if_exist:cTF { \__fontspec_shape_merge:nn {#1} {\scdefault} } { \tl_use:c { \__fontspec_shape_merge:nn {#1} {\scdefault} } } { \scdefault } } \cs_new:Nn \__fontspec_DeclareFontShape:nnnnnn { \group_begin: \normalsize \cs_undefine:c {#1/#2/#3/#4/\f@size} \group_end: \DeclareFontShape{#1}{#2}{#3}{#4}{#5}{#6} } \cs_generate_variant:Nn \__fontspec_DeclareFontShape:nnnnnn {xxxxxx} \cs_new:Nn \__fontspec_declare_shape_slanted:nn { \bool_if:nT { \str_if_eq_x_p:nn {#2} {\itdefault} && !(\str_if_eq_x_p:nn {\itdefault} {\sldefault}) } { \__fontspec_DeclareFontShape:xxxxxx {\l__fontspec_nfss_enc_tl}{\l_fontspec_family_tl}{#1}{\sldefault} {<->ssub*\l_fontspec_family_tl/#1/\itdefault}{\l__fontspec_postadjust_tl} } } \cs_new:Nn \__fontspec_declare_shape_loginfo:nn { \tl_gput_right:Nx \l_fontspec_defined_shapes_tl { -~ \exp_not:N \str_case:nn {#1/#2} { {\mddefault/\updefault} {'normal'~} {\bfdefault/\updefault} {'bold'~} {\mddefault/\itdefault} {'italic'~} {\mddefault/\sldefault} {'slanted'~} {\bfdefault/\itdefault} {'bold~ italic'~} {\bfdefault/\sldefault} {'bold~ slanted'~} } (#1/#2)~ with~ NFSS~ spec.:~ \l__fontspec_nfss_tl \exp_not:n { \\ } -~ \exp_not:N \str_case:nn { #1 / \__fontspec_combo_sc_shape:n {#2} } { {\mddefault/\scdefault} {'small~ caps'~} {\bfdefault/\scdefault} {'bold~ small~ caps'~} {\mddefault/\itscdefault} {'italic~ small~ caps'~} {\bfdefault/\itscdefault} {'bold~ italic~ small~ caps'~} {\mddefault/\slscdefault} {'slanted~ small~ caps'~} {\bfdefault/\slscdefault} {'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 } } } \cs_generate_variant:Nn \tl_if_empty:nF {f} \clist_set:Nn \l__fontspec_pre_feat_sclist { mode = \l_fontspec_mode_tl ; \tl_if_empty:NF \l_fontspec_script_tl { script = \l_fontspec_script_tl ; language = \l_fontspec_lang_tl ; } } \cs_set:Nn \__fontspec_get_features:Nn { \sclist_clear:N \l__fontspec_rawfeatures_sclist \tl_clear:N \l__fontspec_scale_tl \tl_set_eq:NN \l__fontspec_opacity_tl \g__fontspec_opacity_tl \tl_set_eq:NN \l__fontspec_hexcol_tl \g__fontspec_hexcol_tl \tl_set_eq:NN \l__fontspec_postadjust_tl \g__fontspec_postadjust_tl \tl_clear:N \l__fontspec_wordspace_adjust_tl \tl_clear:N \l__fontspec_punctspace_adjust_tl \keys_set_known:nxN {fontspec-renderer} {\l__fontspec_fontfeat_clist,#2} \l__fontspec_keys_leftover_clist \keys_set:nx {fontspec} {\l__fontspec_keys_leftover_clist} \str_if_eq_x:nnF { \l__fontspec_hexcol_tl \l__fontspec_opacity_tl } { \g__fontspec_hexcol_tl \g__fontspec_opacity_tl } { \__fontspec_update_featstr:n { color = \l__fontspec_hexcol_tl\l__fontspec_opacity_tl } } \tl_set_eq:NN #1 \l__fontspec_rawfeatures_sclist } \tl_clear:N \l__fontspec_family_label_tl \tl_clear:N \l_fontspec_fontname_bf_tl \tl_clear:N \l_fontspec_fontname_it_tl \tl_clear:N \l_fontspec_fake_slant_tl \tl_clear:N \l_fontspec_fake_embolden_tl \tl_clear:N \l_fontspec_fontname_bfit_tl \tl_clear:N \l_fontspec_fontname_sl_tl \tl_clear:N \l_fontspec_fontname_bfsl_tl \tl_clear:N \l_fontspec_fontname_sc_tl \tl_clear:N \l__fontspec_fontfeat_up_clist \tl_clear:N \l__fontspec_fontfeat_bf_clist \tl_clear:N \l__fontspec_fontfeat_it_clist \tl_clear:N \l__fontspec_fontfeat_bfit_clist \tl_clear:N \l__fontspec_fontfeat_sl_clist \tl_clear:N \l__fontspec_fontfeat_bfsl_clist \tl_clear:N \l__fontspec_fontfeat_sc_clist \tl_clear:N \l__fontspec_script_name_tl \tl_clear:N \l_fontspec_script_tl \tl_clear:N \l__fontspec_lang_name_tl \tl_clear:N \l_fontspec_lang_tl \tl_set:Nn \g__fontspec_postadjust_tl { \l__fontspec_wordspace_adjust_tl \l__fontspec_punctspace_adjust_tl } \clist_set:Nn \l__fontspec_sizefeat_clist {Size={-}} \tl_new:N \g__fontspec_hexcol_tl \tl_new:N \g__fontspec_opacity_tl \tl_set:Nn \g__fontspec_hexcol_tl {000000} \tl_set:Nn \g__fontspec_opacity_tl {FF~} \cs_set:Npn \__fontspec_init: { \bool_set_false:N \l__fontspec_ot_bool \bool_set_true:N \l__fontspec_firsttime_bool \cs_set:Npn \__fontspec_namewrap:n ##1 { ##1 } \tl_clear:N \l__fontspec_optical_size_tl \tl_clear:N \l_fontspec_renderer_tl \tl_clear:N \l_fontspec_defined_shapes_tl \tl_clear:N \g__fontspec_curr_series_tl \tl_gset_eq:NN \l__fontspec_nfss_enc_tl \g_fontspec_encoding_tl % This is for detecting font families when assigning default features. % Replace defaults for the standard families because they're not set in the usual way: \exp_args:NV \str_case:nnF {\l__fontspec_family_label_tl} { {\rmdefault} { \tl_set:Nn \l__fontspec_family_label_tl {\g__fontspec_rmfamily_family} } {\sfdefault} { \tl_set:Nn \l__fontspec_family_label_tl {\g__fontspec_sffamily_family} } {\ttdefault} { \tl_set:Nn \l__fontspec_family_label_tl {\g__fontspec_ttfamily_family} } }{} \tl_set:Nn \l_fontspec_mode_tl {node} \int_set:Nn \luatex_prehyphenchar:D { `\- } % fixme \int_zero:N \luatex_posthyphenchar:D % fixme \int_zero:N \luatex_preexhyphenchar:D % fixme \int_zero:N \luatex_postexhyphenchar:D % fixme } \cs_set:Nn \fontspec_make_ot_smallcaps:TF { \fontspec_check_ot_feat:nTF {+smcp} {#1} {#2} } \cs_set_eq:NN \__fontspec_make_smallcaps:TF \fontspec_make_ot_smallcaps:TF \cs_set_eq:NN \sclist_clear:N \tl_clear:N \cs_new:Nn \sclist_gput_right:Nn { \tl_gput_right:Nn #1 {#2;} } \cs_generate_variant:Nn \sclist_gput_right:Nn {Nx} \cs_new:Nn \__fontspec_update_featstr:n { \bool_if:NF \l__fontspec_firsttime_bool { \sclist_gput_right:Nx \l__fontspec_rawfeatures_sclist {#1} } } \cs_new:Nn \fontspec_make_feature:nnn { \fontspec_make_OT_feature:n {#3} } \cs_generate_variant:Nn \fontspec_make_feature:nnn {nnx} \cs_new:Nn \fontspec_make_AAT_feature:nn { \tl_if_empty:nTF {#1} { \__fontspec_warning:n {aat-feature-not-exist} } { \fontspec_make_AAT_feature_string:nnTF {#1}{#2} { \__fontspec_update_featstr:n {\l_fontspec_feature_string_tl} } { \__fontspec_warning:nx {aat-feature-not-exist-in-font} {#1,#2} } } } \cs_new:Nn \fontspec_make_OT_feature:n { \tl_if_empty:nTF {#1} { \__fontspec_warning:n {icu-feature-not-exist} } { \fontspec_check_ot_feat:nTF {#1} { \__fontspec_update_featstr:n {#1} } { \__fontspec_warning:nx {icu-feature-not-exist-in-font} {#1} } } } \cs_new_protected:Nn \fontspec_make_numbered_feature:nn { \fontspec_check_ot_feat:nTF {#1} { \__fontspec_update_featstr:n { #1 = #2 } } { \__fontspec_warning:nx {icu-feature-not-exist-in-font} {#1} } } \cs_generate_variant:Nn \fontspec_make_numbered_feature:nn {xn} \cs_new:Nn \__fontspec_define_font_feature:n { \keys_define:nn {fontspec} { #1 .multichoice: } } \cs_new:Nn \__fontspec_define_feature_option:nnnnn { \keys_define:nn {fontspec} { #1/#2 .code:n = { \fontspec_make_feature:nnn{#3}{#4}{#5} } } } \cs_new:Nn \fontspec_define_numbered_feat:nnnn { \keys_define:nn {fontspec} { #1/#2 .code:n = { \fontspec_make_numbered_feature:nn {#3}{#4} } } } \prg_new_conditional:Nnn \fontspec_make_AAT_feature_string:nn {TF,T,F} { \tl_set:Nx \l_tmpa_tl { \XeTeXfeaturename \l_fontspec_font #1 } \tl_if_empty:NTF \l_tmpa_tl { \prg_return_false: } { \int_compare:nTF { \XeTeXisexclusivefeature\l_fontspec_font #1 > 0 } { \tl_set:Nx \l_tmpb_tl {\XeTeXselectorname\l_fontspec_font #1\space #2} } { \int_if_even:nTF {#2} { \tl_set:Nx \l_tmpb_tl {\XeTeXselectorname\l_fontspec_font #1\space #2} } { \tl_set:Nx \l_tmpb_tl { \XeTeXselectorname\l_fontspec_font #1\space \numexpr#2-1\relax } \tl_if_empty:NF \l_tmpb_tl { \tl_put_left:Nn \l_tmpb_tl {!} } } } \tl_if_empty:NTF \l_tmpb_tl { \prg_return_false: } { \tl_set:Nx \l_fontspec_feature_string_tl { \l_tmpa_tl = \l_tmpb_tl } \prg_return_true: } } } \cs_set:Nn \fontspec_iv_str_to_num:Nn { \fontspec_iv_str_to_num:w #1 \q_nil #2 \c_empty_tl \c_empty_tl \q_nil } \cs_set:Npn \fontspec_iv_str_to_num:w #1 \q_nil #2#3#4#5#6 \q_nil { \int_set:Nn #1 { `#2 * "1000000 + `#3 * "10000 + \ifx \c_empty_tl #4 32 \else `#4 \fi * "100 + \ifx \c_empty_tl #5 32 \else `#5 \fi } } \cs_generate_variant:Nn \fontspec_iv_str_to_num:Nn {No} \cs_set:Nn \fontspec_v_str_to_num:Nn { \bool_if:nTF { \tl_if_head_eq_charcode_p:nN {#2} {+} || \tl_if_head_eq_charcode_p:nN {#2} {-} } { \fontspec_iv_str_to_num:No #1 { \use_none:n #2 } } { \fontspec_iv_str_to_num:Nn #1 {#2} } } \prg_new_conditional:Nnn \fontspec_check_script:n {TF} { \directlua{fontspec.check_ot_script("l_fontspec_font", "#1")} \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: } \prg_new_conditional:Nnn \fontspec_check_lang:n {TF} { \directlua { fontspec.check_ot_lang( "l_fontspec_font", "#1", "\l_fontspec_script_tl" ) } \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: } \prg_new_conditional:Nnn \fontspec_check_ot_feat:n {TF,T} { \directlua { fontspec.check_ot_feat( "l_fontspec_font", "#1", "\l_fontspec_lang_tl", "\l_fontspec_script_tl" ) } \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: } \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} } } \bool_new:N \l__fontspec_external_bool \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {ExternalLocation} { \bool_set_true:N \l__fontspec_nobf_bool \bool_set_true:N \l__fontspec_noit_bool \bool_set_true:N \l__fontspec_external_bool \cs_set:Npn \__fontspec_namewrap:n ##1 { [ #1 ##1 ] } } \aliasfontfeature{ExternalLocation}{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} {ExternalLocation} } } \tl_clear:N \l__fontspec_extension_tl \keys_define:nn {fontspec-renderer} { Renderer .choices:nn = {AAT,ICU,OpenType,Graphite,Full,Basic} { \int_compare:nTF {\l_keys_choice_int <= 4} { \__fontspec_warning:nx {only-xetex-feature} {Renderer=AAT/OpenType/Graphite} } { \tl_set:Nv \l_fontspec_mode_tl { g_fontspec_mode_tag_ \l_keys_choice_tl } } } } \tl_set:cn {g_fontspec_renderer_tag_AAT} {/AAT} \tl_set:cn {g_fontspec_renderer_tag_ICU} {/OT} \tl_set:cn {g_fontspec_renderer_tag_OpenType} {/OT} \tl_set:cn {g_fontspec_renderer_tag_Graphite} {/GR} \tl_set:cn {g_fontspec_mode_tag_Full} {node} \tl_set:cn {g_fontspec_mode_tag_Basic} {base} \__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} } \seq_new:N \g__fontspec_bf_series_seq \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldSeries} { \tl_gset:Nx \g__fontspec_curr_series_tl { #1 } \seq_gput_right:Nx \g__fontspec_bf_series_seq { #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} {FontName} { \fontspec_complete_fontname:Nn \l_fontspec_fontname_up_tl {#1} } \cs_generate_variant:Nn \tl_if_eq:nnT {ox} \cs_generate_variant:Nn \prop_put:Nnn {NxV} \__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 \g__fontspec_bf_series_seq { \tl_gset:Nx \g__fontspec_curr_series_tl {\bfdefault} \seq_put_right:Nx \g__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 } } \prop_new:N \l__fontspec_nfss_prop \__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} {BoldItalicFont} { \fontspec_complete_fontname:Nn \l_fontspec_fontname_bfit_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} {BoldSlantedFont} { \fontspec_complete_fontname:Nn \l_fontspec_fontname_bfsl_tl {#1} } \__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFont} { \tl_if_empty:nTF {#1} { \bool_set_true:N \l__fontspec_nosc_bool } { \bool_set_false:N \l__fontspec_nosc_bool \fontspec_complete_fontname:Nn \l_fontspec_fontname_sc_tl {#1} } } \cs_set: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_generate_variant:Nn \tl_replace_all:Nnn {Nnx} \__fontspec_keys_define_code:nnn {fontspec-preparse} {UprightFeatures} { \clist_set:Nn \l__fontspec_fontfeat_up_clist {#1} } \__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldFeatures} { \clist_set:Nn \l__fontspec_fontfeat_bf_clist {#1} } \__fontspec_keys_define_code:nnn {fontspec-preparse} {ItalicFeatures} { \clist_set:Nn \l__fontspec_fontfeat_it_clist {#1} } \__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldItalicFeatures} { \clist_set:Nn \l__fontspec_fontfeat_bfit_clist {#1} } \__fontspec_keys_define_code:nnn {fontspec-preparse} {SlantedFeatures} { \clist_set:Nn \l__fontspec_fontfeat_sl_clist {#1} } \__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldSlantedFeatures} { \clist_set:Nn \l__fontspec_fontfeat_bfsl_clist {#1} } \__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFeatures} { \bool_if:NF \l__fontspec_firsttime_bool { \clist_set: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-preparse} {NFSSEncoding} { \tl_gset:Nx \l__fontspec_nfss_enc_tl { #1 } } \__fontspec_keys_define_code:nnn {fontspec-preparse} {NFSSFamily} { \tl_set:Nx \l__fontspec_nfss_fam_tl { #1 } \cs_undefine:c {g__fontspec_UID_\l__fontspec_fontid_tl} \tl_if_exist:NT \l_fontspec_family_tl { \cs_undefine:c {g__fontspec_ \l_fontspec_family_tl _prop} } } \prop_new:N \l__fontspec_nfssfont_prop \__fontspec_keys_define_code:nnn {fontspec} {FontFace} { \tl_set:No \l__fontspec_arg_tl { \use_iii:nnn #1 } \tl_set_eq:NN \l__fontspec_this_feat_tl \l__fontspec_arg_tl \tl_clear:N \l__fontspec_this_font_tl \int_compare:nT { \clist_count:N \l__fontspec_arg_tl = 1 } { \tl_if_in:NnF \l__fontspec_arg_tl {=} { \tl_set_eq:NN \l__fontspec_this_font_tl \l__fontspec_arg_tl \tl_clear:N \l__fontspec_this_feat_tl } } \__fontspec_add_nfssfont:nnnn {\use_i:nnn #1}{\use_ii:nnn #1}{\l__fontspec_this_font_tl}{\l__fontspec_this_feat_tl} } \cs_new:Nn \__fontspec_add_nfssfont:nnnn { \tl_set:Nx \l__fontspec_this_font_tl {#3} \tl_if_empty:xTF {#4} { \clist_set:Nn \l__fontspec_sizefeat_clist {Size={-}} } { \keys_set_known:noN {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} } } } \__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} } \tl_set:Nx \l__fontspec_scale_tl { s*[\l__fontspec_scale_tl] } } \cs_new:Nn \__fontspec_calc_scale:n { \group_begin: \rmfamily \__fontspec_set_font_dimen:NnN \l__fontspec_tmpa_dim {#1} \font \__fontspec_set_font_dimen:NnN \l__fontspec_tmpb_dim {#1} \l_fontspec_font \tl_gset: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} \group_end: } \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:nnn #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_x: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} { \bool_if:NT \l__fontspec_addfontfeatures_bool { \__fontspec_error:nx {not-in-addfontfeatures} {HyphenChar} } \str_if_eq:nnTF {#1} {None} { \tl_put_right:Nn \l__fontspec_postadjust_tl { \hyphenchar \font = \c_minus_one } } { \tl_if_single:nTF {#1} { \tl_set:Nn \l_fontspec_hyphenchar_tl {`#1} } { \tl_set:Nn \l_fontspec_hyphenchar_tl { #1} } \font_glyph_if_exist:NnTF \l_fontspec_font {\l_fontspec_hyphenchar_tl} { \tl_put_right:Nn \l__fontspec_postadjust_tl { \hyphenchar \font = \c_zero \int_set:Nn \luatex_prehyphenchar:D { \l_fontspec_hyphenchar_tl } } } { \__fontspec_error:nx {no-glyph}{#1} } } } \__fontspec_aff_error:n {HyphenChar} \__fontspec_keys_define_code:nnn {fontspec} {Color} { \cs_if_exist:cTF { \token_to_str:N \color@ #1 } { \convertcolorspec{named}{#1}{HTML}\l__fontspec_hexcol_tl } { \int_compare:nTF { \tl_count:n {#1} == 6 } { \tl_set:Nn \l__fontspec_hexcol_tl {#1} } { \int_compare:nTF { \tl_count:n {#1} == 8 } { \fontspec_parse_colour:viii #1 } { \bool_if:NF \l__fontspec_firsttime_bool { \__fontspec_warning:nx {bad-colour} {#1} } } } } } \cs_set:Npn \fontspec_parse_colour:viii #1#2#3#4#5#6#7#8 { \tl_set:Nn \l__fontspec_hexcol_tl {#1#2#3#4#5#6} \tl_if_eq:NNF \l__fontspec_opacity_tl \g__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} \int_new:N \l__fontspec_tmp_int \__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 \g__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} {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} { Ligatures=TeX } } { \__fontspec_warning:n {no-mapping} } } \__fontspec_keys_define_code:nnn {fontspec} {FeatureFile} { \__fontspec_update_featstr:n { featurefile = #1 } } \__fontspec_keys_define_code:nnn {fontspec} {Weight} { \__fontspec_update_featstr:n{weight=#1} } \__fontspec_keys_define_code:nnn {fontspec} {Width} { \__fontspec_update_featstr:n{width=#1} } \__fontspec_keys_define_code:nnn {fontspec} {OpticalSize} { \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_warning:n {fakebold-only-xetex} } } \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_define_font_feature:n{Ligatures} \__fontspec_define_feature_option:nnnnn{Ligatures}{Required} {1}{0}{+rlig} \__fontspec_define_feature_option:nnnnn{Ligatures}{NoRequired} {1}{1}{-rlig} \__fontspec_define_feature_option:nnnnn{Ligatures}{Common} {1}{2}{+liga} \__fontspec_define_feature_option:nnnnn{Ligatures}{NoCommon} {1}{3}{-liga} \__fontspec_define_feature_option:nnnnn{Ligatures}{Rare} {1}{4}{+dlig} \__fontspec_define_feature_option:nnnnn{Ligatures}{NoRare} {1}{5}{-dlig} \__fontspec_define_feature_option:nnnnn{Ligatures}{Discretionary} {1}{4}{+dlig} \__fontspec_define_feature_option:nnnnn{Ligatures}{NoDiscretionary}{1}{5}{-dlig} \__fontspec_define_feature_option:nnnnn{Ligatures}{Contextual} {}{} {+clig} \__fontspec_define_feature_option:nnnnn{Ligatures}{NoContextual} {}{} {-clig} \__fontspec_define_feature_option:nnnnn{Ligatures}{Historic} {}{} {+hlig} \__fontspec_define_feature_option:nnnnn{Ligatures}{NoHistoric} {}{} {-hlig} \__fontspec_define_feature_option:nnnnn{Ligatures}{Logos} {1}{6} {} \__fontspec_define_feature_option:nnnnn{Ligatures}{NoLogos} {1}{7} {} \__fontspec_define_feature_option:nnnnn{Ligatures}{Rebus} {1}{8} {} \__fontspec_define_feature_option:nnnnn{Ligatures}{NoRebus} {1}{9} {} \__fontspec_define_feature_option:nnnnn{Ligatures}{Diphthong} {1}{10}{} \__fontspec_define_feature_option:nnnnn{Ligatures}{NoDiphthong} {1}{11}{} \__fontspec_define_feature_option:nnnnn{Ligatures}{Squared} {1}{12}{} \__fontspec_define_feature_option:nnnnn{Ligatures}{NoSquared} {1}{13}{} \__fontspec_define_feature_option:nnnnn{Ligatures}{AbbrevSquared} {1}{14}{} \__fontspec_define_feature_option:nnnnn{Ligatures}{NoAbbrevSquared}{1}{15}{} \__fontspec_define_feature_option:nnnnn{Ligatures}{Icelandic} {1}{32}{} \__fontspec_define_feature_option:nnnnn{Ligatures}{NoIcelandic} {1}{33}{} \keys_define:nn {fontspec} { Ligatures / TeX .code:n = { \__fontspec_update_featstr:n { +tlig } } } \__fontspec_define_font_feature:n{Letters} \__fontspec_define_feature_option:nnnnn{Letters}{Normal} {3}{0}{} \__fontspec_define_feature_option:nnnnn{Letters}{Uppercase} {3}{1}{+case} \__fontspec_define_feature_option:nnnnn{Letters}{Lowercase} {3}{2}{} \__fontspec_define_feature_option:nnnnn{Letters}{SmallCaps} {3}{3}{+smcp} \__fontspec_define_feature_option:nnnnn{Letters}{PetiteCaps} {} {} {+pcap} \__fontspec_define_feature_option:nnnnn{Letters}{UppercaseSmallCaps} {} {} {+c2sc} \__fontspec_define_feature_option:nnnnn{Letters}{UppercasePetiteCaps}{} {} {+c2pc} \__fontspec_define_feature_option:nnnnn{Letters}{InitialCaps} {3}{4}{} \__fontspec_define_feature_option:nnnnn{Letters}{Unicase} {} {} {+unic} \__fontspec_define_feature_option:nnnnn{Letters}{Random} {} {} {+rand} \__fontspec_define_font_feature:n{Numbers} \__fontspec_define_feature_option:nnnnn{Numbers}{Monospaced} {6} {0}{+tnum} \__fontspec_define_feature_option:nnnnn{Numbers}{Proportional} {6} {1}{+pnum} \__fontspec_define_feature_option:nnnnn{Numbers}{Lowercase} {21}{0}{+onum} \__fontspec_define_feature_option:nnnnn{Numbers}{OldStyle} {21}{0}{+onum} \__fontspec_define_feature_option:nnnnn{Numbers}{Uppercase} {21}{1}{+lnum} \__fontspec_define_feature_option:nnnnn{Numbers}{Lining} {21}{1}{+lnum} \__fontspec_define_feature_option:nnnnn{Numbers}{SlashedZero} {14}{5}{+zero} \__fontspec_define_feature_option:nnnnn{Numbers}{NoSlashedZero}{14}{4}{-zero} \luatex_if_engine:T { \__fontspec_define_feature_option:nnnnn{Numbers}{Arabic}{}{}{+anum} } \__fontspec_define_font_feature:n {Contextuals} \__fontspec_define_feature_option:nnnnn{Contextuals}{Swash} {} {} {+cswh} \__fontspec_define_feature_option:nnnnn{Contextuals}{NoSwash} {} {} {-cswh} \__fontspec_define_feature_option:nnnnn{Contextuals}{Alternate} {} {} {+calt} \__fontspec_define_feature_option:nnnnn{Contextuals}{NoAlternate} {} {} {-calt} \__fontspec_define_feature_option:nnnnn{Contextuals}{WordInitial} {8}{0}{+init} \__fontspec_define_feature_option:nnnnn{Contextuals}{NoWordInitial}{8}{1}{-init} \__fontspec_define_feature_option:nnnnn{Contextuals}{WordFinal} {8}{2}{+fina} \__fontspec_define_feature_option:nnnnn{Contextuals}{NoWordFinal} {8}{3}{-fina} \__fontspec_define_feature_option:nnnnn{Contextuals}{LineInitial} {8}{4}{} \__fontspec_define_feature_option:nnnnn{Contextuals}{NoLineInitial}{8}{5}{} \__fontspec_define_feature_option:nnnnn{Contextuals}{LineFinal} {8}{6}{+falt} \__fontspec_define_feature_option:nnnnn{Contextuals}{NoLineFinal} {8}{7}{-falt} \__fontspec_define_feature_option:nnnnn{Contextuals}{Inner} {8}{8}{+medi} \__fontspec_define_feature_option:nnnnn{Contextuals}{NoInner} {8}{9}{-medi} \__fontspec_define_font_feature:n{Diacritics} \__fontspec_define_feature_option:nnnnn{Diacritics}{Show} {9}{0}{} \__fontspec_define_feature_option:nnnnn{Diacritics}{Hide} {9}{1}{} \__fontspec_define_feature_option:nnnnn{Diacritics}{Decompose} {9}{2}{} \__fontspec_define_feature_option:nnnnn{Diacritics}{MarkToBase} {}{}{+mark} \__fontspec_define_feature_option:nnnnn{Diacritics}{NoMarkToBase}{}{}{-mark} \__fontspec_define_feature_option:nnnnn{Diacritics}{MarkToMark} {}{}{+mkmk} \__fontspec_define_feature_option:nnnnn{Diacritics}{NoMarkToMark}{}{}{-mkmk} \__fontspec_define_feature_option:nnnnn{Diacritics}{AboveBase} {}{}{+abvm} \__fontspec_define_feature_option:nnnnn{Diacritics}{NoAboveBase} {}{}{-abvm} \__fontspec_define_feature_option:nnnnn{Diacritics}{BelowBase} {}{}{+blwm} \__fontspec_define_feature_option:nnnnn{Diacritics}{NoBelowBase} {}{}{-blwm} \__fontspec_define_font_feature:n{Kerning} \__fontspec_define_feature_option:nnnnn{Kerning}{Uppercase}{}{}{+cpsp} \__fontspec_define_feature_option:nnnnn{Kerning}{On} {}{}{+kern} \__fontspec_define_feature_option:nnnnn{Kerning}{Off} {}{}{-kern} \__fontspec_define_font_feature:n{VerticalPosition} \__fontspec_define_feature_option:nnnnn{VerticalPosition}{Normal} {10}{0}{} \__fontspec_define_feature_option:nnnnn{VerticalPosition}{Superior} {10}{1}{+sups} \__fontspec_define_feature_option:nnnnn{VerticalPosition}{Inferior} {10}{2}{+subs} \__fontspec_define_feature_option:nnnnn{VerticalPosition}{Ordinal} {10}{3}{+ordn} \__fontspec_define_feature_option:nnnnn{VerticalPosition}{Numerator} {} {} {+numr} \__fontspec_define_feature_option:nnnnn{VerticalPosition}{Denominator}{} {} {+dnom} \__fontspec_define_feature_option:nnnnn{VerticalPosition}{ScientificInferior}{}{}{+sinf} \__fontspec_define_font_feature:n{Fractions} \__fontspec_define_feature_option:nnnnn{Fractions}{On} {11}{1}{+frac} \__fontspec_define_feature_option:nnnnn{Fractions}{Off} {11}{0}{-frac} \__fontspec_define_feature_option:nnnnn{Fractions}{Diagonal} {11}{2}{} \__fontspec_define_feature_option:nnnnn{Fractions}{Alternate}{} {} {+afrc} \__fontspec_define_font_feature:n { Alternate } \keys_define:nn {fontspec} { Alternate .default:n = {0} , Alternate / unknown .code:n = { \clist_map_inline:nn {#1} { \fontspec_make_feature:nnx {17}{##1} { \fontspec_salt:n {##1} } } } } \cs_set:Nn \fontspec_salt:n { +salt = #1 } \__fontspec_define_font_feature:n {Variant} \keys_define:nn {fontspec} { Variant .default:n = {0} , Variant / unknown .code:n = { \clist_map_inline:nn {#1} { \fontspec_make_feature:nnx {18}{##1} { +ss \two@digits {##1} } } } } \aliasfontfeature{Variant}{StylisticSet} \__fontspec_define_font_feature: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_numbered_feature:xn { +cv \exp_not:N \two@digits {##1} } {##2} } \keys_define:nn {fontspec} { 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_font_feature:n{Style} \__fontspec_define_feature_option:nnnnn{Style}{Alternate} {} {} {+salt} \__fontspec_define_feature_option:nnnnn{Style}{Italic} {32}{2}{+ital} \__fontspec_define_feature_option:nnnnn{Style}{Ruby} {28}{2}{+ruby} \__fontspec_define_feature_option:nnnnn{Style}{Swash} {} {} {+swsh} \__fontspec_define_feature_option:nnnnn{Style}{Historic} {} {} {+hist} \__fontspec_define_feature_option:nnnnn{Style}{Display} {19}{1}{} \__fontspec_define_feature_option:nnnnn{Style}{Engraved} {19}{2}{} \__fontspec_define_feature_option:nnnnn{Style}{TitlingCaps} {19}{4}{+titl} \__fontspec_define_feature_option:nnnnn{Style}{TallCaps} {19}{5}{} \__fontspec_define_feature_option:nnnnn{Style}{HorizontalKana}{} {} {+hkna} \__fontspec_define_feature_option:nnnnn{Style}{VerticalKana} {} {} {+vkna} \fontspec_define_numbered_feat:nnnn {Style} {MathScript} {+ssty} {0} \fontspec_define_numbered_feat:nnnn {Style} {MathScriptScript} {+ssty} {1} \__fontspec_define_font_feature:n{CJKShape} \__fontspec_define_feature_option:nnnnn{CJKShape}{Traditional}{20}{0} {+trad} \__fontspec_define_feature_option:nnnnn{CJKShape}{Simplified} {20}{1} {+smpl} \__fontspec_define_feature_option:nnnnn{CJKShape}{JIS1978} {20}{2} {+jp78} \__fontspec_define_feature_option:nnnnn{CJKShape}{JIS1983} {20}{3} {+jp83} \__fontspec_define_feature_option:nnnnn{CJKShape}{JIS1990} {20}{4} {+jp90} \__fontspec_define_feature_option:nnnnn{CJKShape}{Expert} {20}{10}{+expt} \__fontspec_define_feature_option:nnnnn{CJKShape}{NLC} {20}{13}{+nlck} \__fontspec_define_font_feature:n{CharacterWidth} \__fontspec_define_feature_option:nnnnn{CharacterWidth}{Proportional}{22}{0}{+pwid} \__fontspec_define_feature_option:nnnnn{CharacterWidth}{Full}{22}{1}{+fwid} \__fontspec_define_feature_option:nnnnn{CharacterWidth}{Half}{22}{2}{+hwid} \__fontspec_define_feature_option:nnnnn{CharacterWidth}{Third}{22}{3}{+twid} \__fontspec_define_feature_option:nnnnn{CharacterWidth}{Quarter}{22}{4}{+qwid} \__fontspec_define_feature_option:nnnnn{CharacterWidth}{AlternateProportional}{22}{5}{+palt} \__fontspec_define_feature_option:nnnnn{CharacterWidth}{AlternateHalf}{22}{6}{+halt} \__fontspec_define_feature_option:nnnnn{CharacterWidth}{Default}{22}{7}{} \__fontspec_define_feature_option:nnnnn{Annotation}{Off}{24}{0}{} \__fontspec_define_feature_option:nnnnn{Annotation}{Box}{24}{1}{} \__fontspec_define_feature_option:nnnnn{Annotation}{RoundedBox}{24}{2}{} \__fontspec_define_feature_option:nnnnn{Annotation}{Circle}{24}{3}{} \__fontspec_define_feature_option:nnnnn{Annotation}{BlackCircle}{24}{4}{} \__fontspec_define_feature_option:nnnnn{Annotation}{Parenthesis}{24}{5}{} \__fontspec_define_feature_option:nnnnn{Annotation}{Period}{24}{6}{} \__fontspec_define_feature_option:nnnnn{Annotation}{RomanNumerals}{24}{7}{} \__fontspec_define_feature_option:nnnnn{Annotation}{Diamond}{24}{8}{} \__fontspec_define_feature_option:nnnnn{Annotation}{BlackSquare}{24}{9}{} \__fontspec_define_feature_option:nnnnn{Annotation}{BlackRoundSquare}{24}{10}{} \__fontspec_define_feature_option:nnnnn{Annotation}{DoubleCircle}{24}{11}{} \__fontspec_define_font_feature:n { Annotation } \keys_define:nn {fontspec} { Annotation .default:n = {0} , Annotation / unknown .code:n = { \fontspec_make_feature:nnx {}{}{ +nalt=#1 } } } \keys_define:nn {fontspec} { Vertical .choice: , Vertical / RotatedGlyphs .code:n = { \bool_if:NTF \l__fontspec_ot_bool { \fontspec_make_feature:nnn{}{}{+vrt2} \__fontspec_update_featstr:n {vertical} } { \__fontspec_update_featstr:n {vertical} } } } \keys_define:nn { fontspec } { Script .choice: } \cs_new:Nn \fontspec_new_script:nn { \keys_define:nn { fontspec } { Script / #1 .code:n = \clist_map_inline:nn {#2} { \fontspec_check_script:nTF {####1} { \tl_set:Nn \l_fontspec_script_tl {####1} \int_set:Nn \l_fontspec_script_int {\l_fontspec_strnum_int} \clist_map_break: } { \fontspec_check_script:nTF {latn} { \__fontspec_warning:nx {script-not-exist-latn} {#1} \keys_set:nn {fontspec} {Script=Latin} } { \__fontspec_warning:nx {script-not-exist} {#1} } } } } } \newfontscript{Arabic}{arab} \newfontscript{Armenian}{armn} \newfontscript{Balinese}{bali} \newfontscript{Bengali}{bng2,beng} \newfontscript{Bopomofo}{bopo} \newfontscript{Braille}{brai} \newfontscript{Buginese}{bugi} \newfontscript{Buhid}{buhd} \newfontscript{Byzantine~Music}{byzm} \newfontscript{Canadian~Syllabics}{cans} \newfontscript{Cherokee}{cher} \newfontscript{CJK~Ideographic}{hani} \newfontscript{Coptic}{copt} \newfontscript{Cypriot~Syllabary}{cprt} \newfontscript{Cyrillic}{cyrl} \newfontscript{Default}{DFLT} \newfontscript{Deseret}{dsrt} \newfontscript{Devanagari}{dev2,deva} \newfontscript{Ethiopic}{ethi} \newfontscript{Georgian}{geor} \newfontscript{Glagolitic}{glag} \newfontscript{Gothic}{goth} \newfontscript{Greek}{grek} \newfontscript{Gujarati}{gjr2,gujr} \newfontscript{Gurmukhi}{gur2,guru} \newfontscript{Hangul~Jamo}{jamo} \newfontscript{Hangul}{hang} \newfontscript{Hanunoo}{hano} \newfontscript{Hebrew}{hebr} \newfontscript{Hiragana~and~Katakana}{kana} \newfontscript{Javanese}{java} \newfontscript{Kannada}{knd2,knda} \newfontscript{Kharosthi}{khar} \newfontscript{Khmer}{khmr} \newfontscript{Lao}{lao~} \newfontscript{Latin}{latn} \newfontscript{Limbu}{limb} \newfontscript{Linear~B}{linb} \newfontscript{Malayalam}{mlm2,mlym} \newfontscript{Math}{math} \newfontscript{Mongolian}{mong} \newfontscript{Musical~Symbols}{musc} \newfontscript{Myanmar}{mymr} \newfontscript{N'ko}{nko~} \newfontscript{Ogham}{ogam} \newfontscript{Old~Italic}{ital} \newfontscript{Old~Persian~Cuneiform}{xpeo} \newfontscript{Oriya}{ory2,orya} \newfontscript{Osmanya}{osma} \newfontscript{Phags-pa}{phag} \newfontscript{Phoenician}{phnx} \newfontscript{Runic}{runr} \newfontscript{Shavian}{shaw} \newfontscript{Sinhala}{sinh} \newfontscript{Sumero-Akkadian~Cuneiform}{xsux} \newfontscript{Syloti~Nagri}{sylo} \newfontscript{Syriac}{syrc} \newfontscript{Tagalog}{tglg} \newfontscript{Tagbanwa}{tagb} \newfontscript{Tai~Le}{tale} \newfontscript{Tai~Lu}{talu} \newfontscript{Tamil}{tml2,taml} \newfontscript{Telugu}{tel2,telu} \newfontscript{Thaana}{thaa} \newfontscript{Thai}{thai} \newfontscript{Tibetan}{tibt} \newfontscript{Tifinagh}{tfng} \newfontscript{Ugaritic~Cuneiform}{ugar}\newfontscript{Yi}{yi~~} \newfontscript{Kana}{kana} \newfontscript{Maths}{math} \newfontscript{CJK}{hani} \keys_define:nn { fontspec } { Language .choice: } \cs_new:Nn \fontspec_new_lang:nn { \keys_define:nn { fontspec } { Language / #1 .code:n = \fontspec_check_lang:nTF {#2} { \tl_set:Nn \l_fontspec_lang_tl {#2} \int_set:Nn \l_fontspec_language_int {\l_fontspec_strnum_int} } { \__fontspec_warning:nx {language-not-exist} {#1} \keys_set:nn { fontspec } { Language = Default } } } } \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{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} \keys_define:nn {fontspec} { Language / Turkish .code:n = { \fontspec_check_lang:nTF {TRK} { \int_set:Nn \l_fontspec_language_int {\l_fontspec_strnum_int} \tl_set:Nn \l_fontspec_lang_tl {TRK} } { \fontspec_check_lang:nTF {TUR} { \int_set:Nn \l_fontspec_language_int {\l_fontspec_strnum_int} \tl_set:Nn \l_fontspec_lang_tl {TUR} } { \__fontspec_warning:nx {language-not-exist} {Turkish} \keys_set:nn {fontspec} {Language=Default} } } } } \__fontspec_keys_define_code:nnn {fontspec}{ Language / Default } { \tl_set:Nn \l_fontspec_lang_tl {DFLT} \int_zero:N \l_fontspec_language_int } \__fontspec_keys_define_code:nnn {fontspec} {RawFeature} { \__fontspec_update_featstr:n {#1} } \@ifpackageloaded{euler} { \bool_set_true:N \g__fontspec_pkg_euler_loaded_bool } { \bool_set_false:N \g__fontspec_pkg_euler_loaded_bool } \cs_set:Nn \fontspec_setup_maths: { \@ifpackageloaded{euler} { \bool_if:NTF \g__fontspec_pkg_euler_loaded_bool { \bool_set_true:N \g__fontspec_math_euler_bool } { \__fontspec_error:n {euler-too-late} } } {} \@ifpackageloaded{lucbmath}{\bool_set_true:N \g__fontspec_math_lucida_bool}{} \@ifpackageloaded{lucidabr}{\bool_set_true:N \g__fontspec_math_lucida_bool}{} \@ifpackageloaded{lucimatx}{\bool_set_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} } } \DeclareSymbolFont{operators}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\updefault \SetSymbolFont{operators}{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\updefault \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\updefault \SetMathAlphabet\mathsf{normal}\g_fontspec_encoding_tl\g__fontspec_mathsf_tl\mddefault\updefault \SetMathAlphabet\mathtt{normal}\g_fontspec_encoding_tl\g__fontspec_mathtt_tl\mddefault\updefault \SetSymbolFont{operators}{bold}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\updefault \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\updefault \SetMathAlphabet\mathbf{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\bfdefault\updefault \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\updefault \SetMathAlphabet\mathtt{bold}\g_fontspec_encoding_tl\g__fontspec_mathtt_tl\bfdefault\updefault } \cs_new:Nn \fontspec_maybe_setup_maths: { \@ifpackageloaded{anttor} { \ifx\define@antt@mathversions a\bool_set_false:N \g__fontspec_math_bool\fi }{} \@ifpackageloaded{arevmath}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{eulervm}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{mathdesign}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{concmath}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{cmbright}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{mathesf}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{gfsartemisia}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{gfsneohellenic}{\bool_set_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_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{kmath}{\bool_set_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_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{fourier}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{lmodern}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{mathpazo}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{mathptmx}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{MinionPro}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{unicode-math}{\bool_set_false:N \g__fontspec_math_bool}{} \@ifpackageloaded{breqn}{\bool_set_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:} \tl_set:Nn \zf@enc { \g_fontspec_encoding_tl } \cs_set:Npn \zf@fontspec #1 #2 { \fontspec_select:nn {#1} {#2} \tl_set:Nn \zf@family { \l_fontspec_family_tl } \tl_set:Nn \zf@basefont { \l_fontspec_font } } \bool_if:NT \g__fontspec_cfg_bool { \InputIfFileExists{fontspec.cfg} {} {\typeout{No~ fontspec.cfg~ file~ found;~ no~ configuration~ loaded.}} } \providecommand*\itscdefault{\itdefault\scdefault} \providecommand*\slscdefault{\sldefault\scdefault} \DeclareRobustCommand{\sishape} { \not@math@alphabet\sishape\relax \fontshape{\itscdefault}\selectfont } \DeclareTextFontCommand{\textsi}{\sishape} \cs_new:Nn \__fontspec_shape_merge:nn { c__fontspec_shape_#1_#2_tl } \tl_const:cn { \__fontspec_shape_merge:nn \itdefault \scdefault } {\itscdefault} \tl_const:cn { \__fontspec_shape_merge:nn \sldefault \scdefault } {\slscdefault} \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \itdefault } {\itscdefault} \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \sldefault } {\slscdefault} \tl_const:cn { \__fontspec_shape_merge:nn \slscdefault \itdefault } {\itscdefault} \tl_const:cn { \__fontspec_shape_merge:nn \itscdefault \sldefault } {\slscdefault} \tl_const:cn { \__fontspec_shape_merge:nn \itscdefault \updefault } {\scdefault} \tl_const:cn { \__fontspec_shape_merge:nn \slscdefault \updefault } {\scdefault} \cs_new:Nn \fontspec_merge_shape:n { \bool_if:nTF { \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} } } } { \fontshape { \tl_use:c { \__fontspec_shape_merge:nn {\f@shape} {#1} } } \selectfont } { \fontshape {#1} \selectfont } } \DeclareRobustCommand \itshape { \not@math@alphabet\itshape\mathit \fontspec_merge_shape:n\itdefault } \DeclareRobustCommand \slshape { \not@math@alphabet\slshape\relax \fontspec_merge_shape:n\sldefault } \DeclareRobustCommand \scshape { \not@math@alphabet\scshape\relax \fontspec_merge_shape:n\scdefault } \DeclareRobustCommand \upshape { \not@math@alphabet\upshape\relax \fontspec_merge_shape:n\updefault } \int_new:N \l__fontspec_em_int \int_new:N \l__fontspec_emdef_int \cs_new_protected:Npn \emfontdeclare #1 { \int_zero:N \l__fontspec_emdef_int \clist_map_inline:nn {#1} { \int_incr:N \l__fontspec_emdef_int \cs_set:cpn {__fontspec_em_font_ \int_use:N \l__fontspec_emdef_int _switch:} {##1} } } \DeclareRobustCommand \em { \@nomath\em \int_incr:N \l__fontspec_em_int \use:c {__fontspec_em_font_ \int_use:N \l__fontspec_em_int _switch:} } \DeclareTextFontCommand{\emph}{\em} \cs_set:Npn \emshape { \itshape } \cs_set:Npn \eminnershape { \upshape } \emfontdeclare{ \emshape, \eminnershape } \DeclareRobustCommand{\-} { \discretionary { \char\ifnum\hyphenchar\font<\z@ \xlx@defaulthyphenchar \else \hyphenchar\font \fi }{}{} } \def\xlx@defaulthyphenchar{`\-} \cs_new:Nn \fontspec_visible_space: { \font_glyph_if_exist:NnTF \font {"2423} { \char"2423\scan_stop: } { \fontspec_visible_space_fallback: } } \cs_new:Nn \fontspec_visible_space_fallback: { { \usefont{\g_fontspec_encoding_tl}{lmtt}{\f@series}{\f@shape} \textvisiblespace } } \group_begin: \char_set_catcode_active:n{"20}% \cs_gset:Npn\fontspec_print_visible_spaces:{% \char_set_catcode_active:n{"20}% \cs_set_eq:NN^^20\fontspec_visible_space:% }% \group_end: \def\verb { \relax\ifmmode\hbox\else\leavevmode\null\fi \bgroup \verb@eol@error \let\do\@makeother \dospecials \verbatim@font\@noligs \@ifstar\__fontspecsverb\@verb } \def\__fontspecsverb{\fontspec_print_visible_spaces:\@sverb} \AtBeginDocument { \fontspec_patch_verbatim: \fontspec_patch_moreverb: \fontspec_patch_fancyvrb: \fontspec_patch_listings: } \cs_set:Npn \fontspec_patch_verbatim: { \@ifpackageloaded{verbatim} { \cs_set:cpn {verbatim*} { \group_begin: \@verbatim \fontspec_print_visible_spaces: \verbatim@start } } { \cs_set:cpn {verbatim*} { \@verbatim \fontspec_print_visible_spaces: \@sxverbatim } } } \cs_set:Npn \fontspec_patch_moreverb: { \@ifpackageloaded{moreverb}{ \cs_set:cpn {listingcont*} { \cs_set:Npn \verbatim@processline { \thelisting@line \global\advance\listing@line\c_one \the\verbatim@line\par } \@verbatim \fontspec_print_visible_spaces: \verbatim@start } }{} } \cs_set:Npn \fontspec_patch_fancyvrb: { \@ifpackageloaded{fancyvrb} { \cs_set_eq:NN \FancyVerbSpace \fontspec_visible_space: }{} } \cs_set:Npn \fontspec_patch_listings: { \@ifpackageloaded{listings} { \cs_set_eq:NN \lst@visiblespace \fontspec_visible_space: }{} } \RenewDocumentCommand \oldstylenums {m} { { \addfontfeature{Numbers=OldStyle} #1 } } \NewDocumentCommand \liningnums {m} { { \addfontfeature{Numbers=Lining} #1 } } %% ------------------------------------------------ %% Copyright 2004--2016 Will Robertson %% Copyright 2009--2013 Khaled Hosny %% %% Distributable under the LaTeX Project Public License, version 1.3c or higher. %% The latest version of this license is at: http://www.latex-project.org/lppl.txt %% %% This work is "maintained" by Will Robertson. %% It consists of the files: fontspec*.dtx, fontspec.cfg, fontspec-example.tex. %% And the derived files: fontspec*.sty,fontspec.lua, and fontspec.pdf. %% ------------------------------------------------ %% %% End of file `fontspec-luatex.sty'.