diff options
author | Karl Berry <karl@freefriends.org> | 2013-02-26 00:29:14 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-02-26 00:29:14 +0000 |
commit | 824c41895b67301061dae9271c2b0e6b45fc5f77 (patch) | |
tree | bf32ac7f3302415c03e657738a71bf01869f701b /Master/texmf-dist/tex/latex/fontspec | |
parent | 1f9e02e82c40a4bd9e9dec120b1ea56347cf070e (diff) |
fontspec (25feb13)
git-svn-id: svn://tug.org/texlive/trunk@29230 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/fontspec')
-rw-r--r-- | Master/texmf-dist/tex/latex/fontspec/fontspec-luatex.sty | 2051 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/fontspec/fontspec-patches.sty | 123 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty | 2226 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/fontspec/fontspec.lua | 2 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/fontspec/fontspec.sty | 178 |
5 files changed, 2518 insertions, 2062 deletions
diff --git a/Master/texmf-dist/tex/latex/fontspec/fontspec-luatex.sty b/Master/texmf-dist/tex/latex/fontspec/fontspec-luatex.sty index a7ef1c9a9ec..4a82ad05de5 100644 --- a/Master/texmf-dist/tex/latex/fontspec/fontspec-luatex.sty +++ b/Master/texmf-dist/tex/latex/fontspec/fontspec-luatex.sty @@ -14,7 +14,7 @@ %% %% \ProvidesPackage{fontspec-luatex} - [2012/05/06 v2.2b Advanced font selection for XeLaTeX/LuaLaTeX] + [2013/02/25 v2.3 Font selection for XeLaTeX and LuaLaTeX] \ExplSyntaxOn @@ -26,49 +26,58 @@ \tl_set_eq:NN \UTFencname \g_fontspec_encoding_tl % for xunicode \tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl \tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl -\tl_put_right:Nn \document { +\tl_put_right:Nn \document + { \tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl \tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl -} + } \cs_set_eq:NN \fontspec_tmp: \XeTeXpicfile \cs_set:Npn \XeTeXpicfile {} \RequirePackage{xunicode} \cs_set_eq:NN \XeTeXpicfile \fontspec_tmp: -\DeclareDocumentCommand \fontspec { O{} m } { +\DeclareDocumentCommand \fontspec { O{} m } + { \fontencoding {\g_fontspec_encoding_tl} \fontspec_set_family:Nnn \f@family {#1}{#2} \selectfont \ignorespaces -} -\DeclareDocumentCommand \setmainfont { O{} m } { + } +\DeclareDocumentCommand \setmainfont { O{} m } + { \fontspec_set_family:Nnn \rmdefault {#1}{#2} \normalfont -} -\DeclareDocumentCommand \setsansfont { O{} m } { + } +\DeclareDocumentCommand \setsansfont { O{} m } + { \fontspec_set_family:Nnn \sfdefault {#1}{#2} \normalfont -} -\DeclareDocumentCommand \setmonofont { O{} m } { + } +\DeclareDocumentCommand \setmonofont { O{} m } + { \fontspec_set_family:Nnn \ttdefault {#1}{#2} \normalfont -} + } \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 } { +\DeclareDocumentCommand \setmathrm { O{} m } + { \fontspec_set_family:Nnn \g_fontspec_mathrm_tl {#1}{#2} -} -\DeclareDocumentCommand \setboldmathrm { O{} m } { + } +\DeclareDocumentCommand \setboldmathrm { O{} m } + { \fontspec_set_family:Nnn \g_fontspec_bfmathrm_tl {#1}{#2} -} -\DeclareDocumentCommand \setmathsf { O{} m } { + } +\DeclareDocumentCommand \setmathsf { O{} m } + { \fontspec_set_family:Nnn \g_fontspec_mathsf_tl {#1}{#2} -} -\DeclareDocumentCommand \setmathtt { O{} m } { + } +\DeclareDocumentCommand \setmathtt { O{} m } + { \fontspec_set_family:Nnn \g_fontspec_mathtt_tl {#1}{#2} -} + } \@onlypreamble\setmathrm \@onlypreamble\setboldmathrm \@onlypreamble\setmathsf @@ -76,318 +85,379 @@ \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 } { +\DeclareDocumentCommand \newfontfamily { m O{} m } + { \fontspec_select:nn{#2}{#3} - \use:x { - \exp_not:N \DeclareRobustCommand \exp_not:N #1 { + \use:x + { + \exp_not:N \DeclareRobustCommand \exp_not:N #1 + { \exp_not:N \fontencoding {\g_fontspec_encoding_tl} \exp_not:N \fontfamily {\l_fontspec_family_tl} \exp_not:N \selectfont - } - } -} -\DeclareDocumentCommand \newfontface { m O{} m } { + } + } + } +\DeclareDocumentCommand \newfontface { m O{} m } + { \newfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2 ] {#3} -} + } \tl_new:N \g_fontspec_default_fontopts_tl -\DeclareDocumentCommand \defaultfontfeatures {m} { +\prop_new:N \g__fontspec_fontopts_prop +\DeclareDocumentCommand \defaultfontfeatures { o m } + { + \IfNoValueTF {#1} + { \__fontspec_set_default_features:n {#2} } + { \__fontspec_set_font_default_features:nn {#1} {#2} } + } +\cs_new:Nn \__fontspec_set_default_features:n + { \tl_set:Nn \g_fontspec_default_fontopts_tl {#1,} -} -\DeclareDocumentCommand \addfontfeatures {m} { + } +\cs_new:Nn \__fontspec_set_font_default_features:nn + { + \__fontspec_sanitise_fontname:Nn \l__fontspec_tmp_tl {#1} + \tl_if_empty:nTF {#2} + { \prop_gremove:NV \g__fontspec_fontopts_prop \l__fontspec_tmp_tl } + { \prop_gput:NVn \g__fontspec_fontopts_prop \l__fontspec_tmp_tl {#2} } + } +\cs_new:Nn \__fontspec_sanitise_fontname:Nn + { + \use:x { \tl_to_lowercase:n { \tl_set:Nx \exp_not:N #1 {#2} } } + \tl_remove_all:Nn #1 {~} + \clist_map_inline:Nn \l_fontspec_extensions_clist + { \tl_remove_once:Nn #1 {##1} } + } +\DeclareDocumentCommand \addfontfeatures {m} + { \ifcsname zf@family@fontdef\f@family\endcsname \group_begin: \tl_clear:N \g_fontspec_default_fontopts_tl - \use:x { + \use:x + { \exp_not:N\fontspec_select:nn {\csname zf@family@options\f@family\endcsname,#1} {\csname zf@family@fontname\f@family\endcsname} - } + } \group_end: \fontfamily\l_fontspec_family_tl\selectfont \else \fontspec_warning:n {addfontfeatures-ignored} \fi \ignorespaces -} + } \cs_set_eq:NN \addfontfeature \addfontfeatures \DeclareDocumentCommand \newfontfeature {mm} - { - \keys_define:nn { fontspec } - { - #1 .code:n = { - \fontspec_update_fontid:n {+zf-#1} - \fontspec_update_featstr:n {#2} - } - } - } -\DeclareDocumentCommand \newAATfeature {mmmm} { + { + \keys_define:nn { fontspec } + { + #1 .code:n = + { + \fontspec_update_fontid:n {+zf-#1} + \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 \newICUfeature {mmm} { + } +\DeclareDocumentCommand \newICUfeature {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 \newopentypefeature \newICUfeature \DeclareDocumentCommand \aliasfontfeature {mm} - { - \keys_if_exist:nnTF {fontspec} {#1} - { - \keys_define:nn {fontspec} - { #2 .code:n = { \keys_set:nn {fontspec} { #1 = {##1} } } } - } - { - \keys_if_exist:nnTF {fontspec-preparse} {#1} + { + \keys_if_exist:nnTF {fontspec} {#1} + { + \keys_define:nn {fontspec} + { #2 .code:n = { \keys_set:nn {fontspec} { #1 = {##1} } } } + } + { + \keys_if_exist:nnTF {fontspec-preparse} {#1} { - \keys_define:nn {fontspec-preparse} - { #2 .code:n = { \keys_set:nn {fontspec-preparse} { #1 = {##1} } } } + \keys_define:nn {fontspec-preparse} + { #2 .code:n = { \keys_set:nn {fontspec-preparse} { #1 = {##1} } } } } { - \keys_if_exist:nnTF {fontspec-preparse-external} {#1} - { - \keys_define:nn {fontspec-preparse-external} + \keys_if_exist:nnTF {fontspec-preparse-external} {#1} + { + \keys_define:nn {fontspec-preparse-external} { - #2 .code:n = - { \keys_set:nn {fontspec-preparse-external} { #1 = {##1} } } + #2 .code:n = + { \keys_set:nn {fontspec-preparse-external} { #1 = {##1} } } } + } + { + \fontspec_warning:nx {rename-feature-not-exist} {#1} + } } - { \fontspec_warning:nx {rename-feature-not-exist} {#1} } - } - } - } + } + } \DeclareDocumentCommand \aliasfontfeatureoption {mmm} - { - \cs_set_eq:cc { \c_keys_code_root_tl fontspec/#1/#3 } - { \c_keys_code_root_tl fontspec/#1/#2 } - } + { \keys_define:nn { fontspec / #1 } { #3 .meta:n = {#2} } } \DeclareDocumentCommand \newfontscript {mm} -{ + { \fontspec_new_script:nn {#1} {#2} \fontspec_new_script:nn {#2} {#2} -} + } \keys_define:nn { fontspec } { Script .choice: } \cs_new:Nn \fontspec_new_script:nn -{ + { \keys_define:nn { fontspec } { Script / #1 .code:n = - \fontspec_check_script:nTF {#2} { + \fontspec_check_script:nTF {#2} + { \fontspec_update_fontid:n {+script=#1} \tl_set:Nn \l_fontspec_script_tl {#2} \int_set:Nn \l_fontspec_script_int {\l_fontspec_strnum_int} - }{ - \fontspec_check_script:nTF {latn} { + } + { + \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} - } - } - } -} + } + } + } + } \DeclareDocumentCommand \newfontlanguage {mm} -{ + { \fontspec_new_lang:nn {#1} {#2} \fontspec_new_lang:nn {#2} {#2} -} + } \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} { + \fontspec_check_lang:nTF {#2} + { \fontspec_update_fontid:n {+lang=#1} \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 } - } + } } -} + } \DeclareDocumentCommand \DeclareFontsExtensions {m} -{ + { \tl_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 { +\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 + { \fontspec_font_set:Nnn \l_fontspec_font {\use:c{zf@family@fontdef\f@family}} {\f@size pt} - \bool_if:NTF \l_fontspec_atsui_bool { + \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 { + } + } +\prg_new_conditional:Nnn \fontspec_if_opentype: {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: \bool_if:NTF \l_fontspec_icu_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 { + } + } +\prg_new_conditional:Nnn \fontspec_if_feature:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_bool + { \int_set:Nv \l_fontspec_script_int {g_fontspec_script_num_(\f@family)_tl} \int_set:Nv \l_fontspec_language_int {g_fontspec_lang_num_(\f@family)_tl} \tl_set:Nv \l_fontspec_script_tl {g_fontspec_script_(\f@family)_tl} \tl_set:Nv \l_fontspec_lang_tl {g_fontspec_lang_(\f@family)_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 { + } + } +\prg_new_conditional:Nnn \fontspec_if_feature:nnn {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_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 { + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_script:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_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 { + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_language:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_bool + { \tl_set:Nv \l_fontspec_script_tl {g_fontspec_script_(\f@family)_tl} \int_set:Nv \l_fontspec_script_int {g_fontspec_script_num_(\f@family)_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 { + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_language:nn {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_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 { + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_current_script:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_bool + { \str_if_eq:nvTF {#1} {g_fontspec_script_(\f@family)_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 { + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_current_language:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_bool + { \str_if_eq:nvTF {#1} {g_fontspec_lang_(\f@family)_tl} {\prg_return_true:} {\prg_return_false:} - }{ - \prg_return_false: - } - }{ - \prg_return_false: - } -} -\cs_new:Nn \fontspec_set_family:Nnn { + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\cs_new:Nn \fontspec_set_family:Nnn + { \fontspec_select:nn {#2}{#3} \tl_set_eq:NN #1 \l_fontspec_family_tl -} + } \cs_new:Nn \fontspec_set_fontface:NNnn - { - \fontspec_select:nn {#3}{#4} - \tl_set_eq:NN #1 \l_fontspec_font - \tl_set_eq:NN #2 \l_fontspec_family_tl - } + { + \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_fontwrap:n { "#1" } -\cs_if_free:NT \font_set_eq:NN { +\cs_if_free:NT \font_set_eq:NN + { \cs_set_eq:NN \font_set_eq:NN \tex_let:D - \cs_set:Npn \font_set:Nnn #1#2#3 { + \cs_set:Npn \font_set:Nnn #1#2#3 + { \font #1 = #2 ~at~ #3\scan_stop: - } - \cs_set:Npn \font_gset:Nnn #1#2#3 { + } + \cs_set:Npn \font_gset:Nnn #1#2#3 + { \global \font #1 = #2 ~at~ #3 \scan_stop: - } + } \cs_set:Npn \font_suppress_not_found_error: {\luatexsuppressfontnotfounderror=1} - \prg_set_conditional:Nnn \font_if_null:N {p,TF,T,F} { + \prg_set_conditional:Nnn \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 { + } + } +\cs_new:Nn \fontspec_font_set:Nnn + { \font_set:Nnn #1 {\fontspec_fontwrap:n {#2}} {#3} -} -\cs_new:Nn \fontspec_font_gset:Nnn { + } +\cs_new:Nn \fontspec_font_gset:Nnn + { \font_gset:Nnn #1 {\fontspec_fontwrap:n {#2}} {#3} -} -\prg_new_conditional:Nnn \font_glyph_if_exist:Nn {p,TF,T,F} { + } +\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_set:Nn \fontspec_select:nn { + } +\cs_set:Nn \fontspec_select:nn + { \group_begin: \font_suppress_not_found_error: \fontspec_init: @@ -395,7 +465,8 @@ \tl_remove_all:Nn \l_fontspec_fontname_tl {~} \tl_set_eq:NN \l_fontspec_fontid_tl \l_fontspec_fontname_tl \tl_set_eq:NN \l_fontspec_fontname_up_tl \l_fontspec_fontname_tl - \exp_args:NnV \fontspec_preparse_features:nn {#1} \l_fontspec_fontname_tl + \__fontspec_load_external_fontoptions:N \l_fontspec_fontname_tl + \fontspec_preparse_features:nN {#1} \l_fontspec_fontname_tl \fontspec_font_set:Nnn \l_fontspec_font {\fontspec_fullname:n {\l_fontspec_fontname_up_tl}} {\f@size pt} \font_if_null:NT \l_fontspec_font { \fontspec_error:nx {font-not-found} {\l_fontspec_fontname_up_tl} } \fontspec_set_font_type: @@ -404,7 +475,8 @@ \fontspec_set_scriptlang: \fontspec_get_features:n {} \bool_set_false:N \l_fontspec_firsttime_bool - \fontspec_save_family:nT {#2} { + \fontspec_save_family:nT {#2} + { \fontspec_save_fontinfo:nn {#1} {#2} \DeclareFontFamily{\g_fontspec_encoding_tl}{\l_fontspec_family_tl}{} \fontspec_set_upright: @@ -413,19 +485,39 @@ \fontspec_set_slanted: \fontspec_set_bold_italic: \fontspec_set_bold_slanted: - } + } \fontspec_info:nxx {defining-font} {#1} {#2} \group_end: -} -\cs_new:Nn \fontspec_preparse_features:nn { - \fontspec_if_detect_external:nT {#2} + } +\cs_new:Nn \__fontspec_load_external_fontoptions:N + { + \__fontspec_sanitise_fontname:Nn \l__fontspec_tmp_tl {#1} + \prop_if_in:NVF \g__fontspec_fontopts_prop {\l__fontspec_tmp_tl} + { + \exp_args:No \file_if_exist:nT {\l__fontspec_tmp_tl.fontspec} + { \file_input:n {\l__fontspec_tmp_tl.fontspec} } + } + } +\cs_new:Nn \fontspec_preparse_features:nN + { + \exp_args:NV \fontspec_if_detect_external:nT #2 { \keys_set:nn {fontspec-preparse-external} {ExternalLocation} } + + \__fontspec_sanitise_fontname:Nn \l__fontspec_tmp_tl {\l_fontspec_fontname_tl} + \prop_get:NVN \g__fontspec_fontopts_prop \l__fontspec_tmp_tl \l__fontspec_fontopts_clist \keys_set_known:nxN {fontspec-preparse-external} - {\g_fontspec_default_fontopts_tl #1} \l_fontspec_keys_leftover_clist + { + \g_fontspec_default_fontopts_tl + \quark_if_no_value:NF \l__fontspec_fontopts_clist {\l__fontspec_fontopts_clist,} + #1 + } + \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 -} + } \prg_new_conditional:Nnn \fontspec_if_detect_external:n {T} { \clist_map_inline:Nn \l_fontspec_extensions_clist @@ -436,207 +528,260 @@ } \bool_if:NTF \l_tmpa_bool \prg_return_true: \prg_return_false: } -\cs_set:Nn \fontspec_fullname:n { +\cs_set:Nn \fontspec_fullname:n + { \fontspec_namewrap:n { #1 \l_fontspec_extension_tl } \l_fontspec_renderer_tl \l_fontspec_optical_size_tl -} + } %% Now we have a unique (in fact, too unique!) string that contains -\prg_new_conditional:Nnn \fontspec_save_family:n {T} { +\prg_new_conditional:Nnn \fontspec_save_family:n {T} + { \cs_if_exist:cF {g_fontspec_UID_\l_fontspec_fontid_tl} - { - \cs_if_exist:cTF {g_fontspec_family_#1_int} { - \int_gincr:c {g_fontspec_family_#1_int} - }{ - \int_new:c {g_fontspec_family_#1_int} - } + { + \cs_if_exist:cTF {g_fontspec_family_#1_int} + { \int_gincr:c {g_fontspec_family_#1_int} } + { \int_new:c {g_fontspec_family_#1_int} } \tl_set:Nx \l_fontspec_tmp_tl {#1} \tl_remove_all:Nn \l_fontspec_tmp_tl {~} \tl_gset:cx {g_fontspec_UID_\l_fontspec_fontid_tl} - { - \l_fontspec_tmp_tl ( \int_use:c {g_fontspec_family_#1_int} ) - } - } + { + \l_fontspec_tmp_tl ( \int_use:c {g_fontspec_family_#1_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_set_scriptlang: { - \bool_if:NT \l_fontspec_firsttime_bool { - \tl_if_empty:NTF \l_fontspec_script_name_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_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_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} - } - } -} + } + } + } \cs_generate_variant:Nn \prop_gput:Nnn {cnV} \cs_generate_variant:Nn \prop_gput:Nnn {cnx} -\cs_new:Nn \fontspec_save_fontinfo:nn { - +\cs_new:Nn \fontspec_save_fontinfo:nn + { \prop_new:c {g_fontspec_ \l_fontspec_family_tl _prop} \prop_gput:cnx {g_fontspec_ \l_fontspec_family_tl _prop} {fontname} {#2} \prop_gput:cnx {g_fontspec_ \l_fontspec_family_tl _prop} {options} {\g_fontspec_default_fontopts_tl #1} - \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: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 - \tl_gset:cx {zf@family@fontname\l_fontspec_family_tl} {#2} - \tl_gset:cx {zf@family@options\l_fontspec_family_tl} {\g_fontspec_default_fontopts_tl #1} - \tl_gset:cx {zf@family@fontdef\l_fontspec_family_tl} { - \fontspec_fullname:n {\l_fontspec_fontname_tl} : - \l_fontspec_pre_feat_sclist \l_fontspec_rawfeatures_sclist - } - \tl_gset:cV {g_fontspec_script_num_(\l_fontspec_family_tl)_tl} \l_fontspec_script_int - \tl_gset:cV {g_fontspec_lang_num_(\l_fontspec_family_tl)_tl} \l_fontspec_language_int - \tl_gset_eq:cN {g_fontspec_script_(\l_fontspec_family_tl)_tl} \l_fontspec_script_tl - \tl_gset_eq:cN {g_fontspec_lang_(\l_fontspec_family_tl)_tl} \l_fontspec_lang_tl -} -\cs_new:Nn \fontspec_set_upright: { + \tl_gset:cx {zf@family@fontname\l_fontspec_family_tl} {#2} + \tl_gset:cx {zf@family@options\l_fontspec_family_tl} {\g_fontspec_default_fontopts_tl #1} + \tl_gset:cx {zf@family@fontdef\l_fontspec_family_tl} + { + \fontspec_fullname:n {\l_fontspec_fontname_tl} : + \l_fontspec_pre_feat_sclist \l_fontspec_rawfeatures_sclist + } + \tl_gset:cV {g_fontspec_script_num_(\l_fontspec_family_tl)_tl} \l_fontspec_script_int + \tl_gset:cV {g_fontspec_lang_num_(\l_fontspec_family_tl)_tl} \l_fontspec_language_int + \tl_gset_eq:cN {g_fontspec_script_(\l_fontspec_family_tl)_tl} \l_fontspec_script_tl + \tl_gset_eq:cN {g_fontspec_lang_(\l_fontspec_family_tl)_tl} \l_fontspec_lang_tl + } +\cs_new:Nn \fontspec_set_upright: + { \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_tl \mddefault \updefault \l_fontspec_fontfeat_up_clist -} -\cs_new:Nn \fontspec_set_bold: { - \bool_if:NF \l_fontspec_nobf_bool { - \tl_if_empty:NTF \l_fontspec_fontname_bf_tl { + } +\cs_new:Nn \fontspec_set_bold: + { + \bool_if:NF \l_fontspec_nobf_bool + { + \tl_if_empty:NTF \l_fontspec_fontname_bf_tl + { \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_tl {/B} \bfdefault \updefault \l_fontspec_fontfeat_bf_clist - }{ + } + { \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_bf_tl \bfdefault \updefault \l_fontspec_fontfeat_bf_clist - } - } -} -\cs_new:Nn \fontspec_set_italic: { - \bool_if:NF \l_fontspec_noit_bool { + } + } + } +\cs_new:Nn \fontspec_set_italic: + { + \bool_if:NF \l_fontspec_noit_bool + { \tl_if_empty:NTF \l_fontspec_fontname_it_tl - { \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_tl {/I} } - { \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_it_tl } - \mddefault \itdefault \l_fontspec_fontfeat_it_clist - } -} + { \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_tl {/I} } + { \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_it_tl } + \mddefault \itdefault \l_fontspec_fontfeat_it_clist + } + } \cs_new:Nn \fontspec_set_slanted: - { - \tl_if_empty:NF \l_fontspec_fontname_sl_tl - { - \fontspec_make_font_shapes:nnnn - \l_fontspec_fontname_sl_tl \mddefault \sldefault - \l_fontspec_fontfeat_sl_clist - } - } -\cs_new:Nn \fontspec_set_bold_italic: { - \bool_if:nF {\l_fontspec_noit_bool || \l_fontspec_nobf_bool} { + { + \tl_if_empty:NF \l_fontspec_fontname_sl_tl + { + \fontspec_make_font_shapes:nnnn + \l_fontspec_fontname_sl_tl \mddefault \sldefault + \l_fontspec_fontfeat_sl_clist + } + } +\cs_new:Nn \fontspec_set_bold_italic: + { + \bool_if:nF {\l_fontspec_noit_bool || \l_fontspec_nobf_bool} + { \tl_if_empty:NTF \l_fontspec_fontname_bfit_tl - { + { \tl_if_empty:NTF \l_fontspec_fontname_bf_tl - { + { \tl_if_empty:NTF \l_fontspec_fontname_it_tl - { + { \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_tl {/BI} - } - { + } + { \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_it_tl {/B} - } - } - { + } + } + { \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_bf_tl {/I} - } - } - { + } + } + { \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_bfit_tl - } + } \bfdefault \itdefault \l_fontspec_fontfeat_bfit_clist - } -} + } + } \cs_new:Nn \fontspec_set_bold_slanted: - { - \tl_if_empty:NTF \l_fontspec_fontname_bfsl_tl - { - \tl_if_empty:NF \l_fontspec_fontname_sl_tl { - \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_sl_tl {/B} - \bfdefault \sldefault \l_fontspec_fontfeat_bfsl_clist - } - }{ - \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_bfsl_tl - \bfdefault \sldefault \l_fontspec_fontfeat_bfsl_clist - } - } + { + \tl_if_empty:NTF \l_fontspec_fontname_bfsl_tl + { + \tl_if_empty:NF \l_fontspec_fontname_sl_tl + { + \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_sl_tl {/B} + \bfdefault \sldefault \l_fontspec_fontfeat_bfsl_clist + } + } + { + \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_bfsl_tl + \bfdefault \sldefault \l_fontspec_fontfeat_bfsl_clist + } + } \cs_new:Nn \fontspec_set_font_type: - { - \bool_set_true:N \l_fontspec_icu_bool - } + { + \bool_set_true:N \l_fontspec_icu_bool + } \cs_new:Nn \fontspec_make_auto_font_shapes:nnnnn - { - \bool_if:NF \l_fontspec_external_bool - { - \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:xxTF { \fontname \l_tmpa_font } { \fontname \l_tmpb_font } - { \fontspec_info:nx {no-font-shape} {#1#2} } - { \fontspec_make_font_shapes:nnnn {#1#2}{#3}{#4}{#5} } - } - } + { + \bool_if:NF \l_fontspec_external_bool + { + \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 } + { \fontspec_info:nx {no-font-shape} {#1#2} } + { \fontspec_make_font_shapes:nnnn {#1#2}{#3}{#4}{#5} } + } + } \cs_new:Nn \fontspec_make_font_shapes:nnnn { \group_begin: - \tl_set:Nx \l_fontspec_fontname_tl {#1} - \fontspec_font_set:Nnn \l_fontspec_font {\fontspec_fullname:n {#1}} {\f@size pt} - \font_if_null:NT \l_fontspec_font { \fontspec_error:nx {font-not-found} {#1} } - \fontspec_declare_shape:nnn {#2}{#3}{#4} - \tl_if_empty:NTF \l_fontspec_fontname_sc_tl { - \bool_if:NF \l_fontspec_nosc_bool { - \fontspec_make_smallcaps:T { + + \__fontspec_load_fontname:n {#1} + \fontspec_declare_shape:nnn {#2}{#3} + { \quark_if_no_value:NF \l__fontspec_fontopts_clist {\l__fontspec_fontopts_clist,} #4 } + + \tl_if_empty:NTF \l_fontspec_fontname_sc_tl + { + \bool_if:NF \l_fontspec_nosc_bool + { + \fontspec_make_smallcaps:T + { \fontspec_declare_shape:nnn {#2} { \tl_if_eq:NNTF #3 \itdefault \sidefault \scdefault } - { #4 , Letters=SmallCaps, \l_fontspec_fontfeat_sc_clist } - } - } - }{ - \fontspec_font_set:Nnn \l_fontspec_font {\fontspec_fullname:n {\l_fontspec_fontname_sc_tl}} {\f@size pt} - \tl_set:Nx \l_fontspec_fontname_tl {\l_fontspec_fontname_sc_tl} + { + \quark_if_no_value:NF \l__fontspec_fontopts_clist {\l__fontspec_fontopts_clist,} + #4 , Letters=SmallCaps , \l_fontspec_fontfeat_sc_clist + } + } + } + } + { + \__fontspec_load_fontname:n {\l_fontspec_fontname_sc_tl} \fontspec_declare_shape:nnn {#2} - { \tl_if_eq:NNTF #3 \itdefault \sidefault \scdefault } - { #4 , \l_fontspec_fontfeat_sc_clist } - } + { \tl_if_eq:NNTF #3 \itdefault \sidefault \scdefault } + { + \quark_if_no_value:NF \l__fontspec_fontopts_clist {\l__fontspec_fontopts_clist,} + #4 , \l_fontspec_fontfeat_sc_clist + } + } \group_end: -} -\cs_new:Nn \fontspec_declare_shape:nnn { + } +\cs_new:Nn \__fontspec_load_fontname:n + { + \tl_set:Nx \l_fontspec_fontname_tl {#1} + \__fontspec_load_external_fontoptions:N \l_fontspec_fontname_tl + \__fontspec_sanitise_fontname:Nn \l__fontspec_tmp_tl {\l_fontspec_fontname_tl} + \prop_get:NVN \g__fontspec_fontopts_prop \l__fontspec_tmp_tl \l__fontspec_fontopts_clist + \fontspec_font_set:Nnn \l_fontspec_font {\fontspec_fullname:n {\l_fontspec_fontname_tl}} {\f@size pt} + \font_if_null:NT \l_fontspec_font { \fontspec_error:nx {font-not-found} {#1} } + } +\cs_new:Nn \fontspec_declare_shape:nnn + { \clist_if_empty:NTF \l_fontspec_sizefeat_clist - { - \fontspec_get_features:n {#3} - \tl_set:Nx \l_fontspec_nfss_tl { + { \__fontspec_declare_shape_nosizing:n {#3} } + { \__fontspec_declare_shape_withsizing:n {#3} } + \use:x + { + \exp_not:N \DeclareFontShape {\g_fontspec_encoding_tl} {\l_fontspec_family_tl} + {#1} {#2} {\l_fontspec_nfss_tl}{\l_fontspec_postadjust_tl} + } + \__fontspec_declare_shape_slanted:nn {#1} {#2} + \__fontspec_declare_shape_loginfo:nnn {#1} {#2} {#3} + } +\cs_new:Nn \__fontspec_declare_shape_nosizing:n + { + \fontspec_get_features:n {#1} + \tl_set:Nx \l_fontspec_nfss_tl + { <-> \l_fontspec_scale_tl - \fontspec_fontwrap:n { + \fontspec_fontwrap:n + { \fontspec_fullname:n {\l_fontspec_fontname_tl} : \l_fontspec_pre_feat_sclist \l_fontspec_rawfeatures_sclist - } - } - } - { + } + } + } +\cs_new:Nn \__fontspec_declare_shape_withsizing:n + { \tl_clear:N \l_fontspec_nfss_tl - \clist_map_inline:Nn \l_fontspec_sizefeat_clist { + \clist_map_inline:Nn \l_fontspec_sizefeat_clist + { \tl_clear:N \l_fontspec_size_tl \tl_set_eq:NN \l_fontspec_sizedfont_tl \l_fontspec_fontname_tl @@ -645,35 +790,41 @@ \l_fontspec_keys_leftover_clist \tl_if_empty:NT \l_fontspec_size_tl { \fontspec_error:n {no-size-info} } - \fontspec_get_features:n{ #3 , \l_fontspec_keys_leftover_clist } + \fontspec_get_features:n { #1 , \l_fontspec_keys_leftover_clist } - \tl_put_right:Nx \l_fontspec_nfss_tl { + \tl_put_right:Nx \l_fontspec_nfss_tl + { <\l_fontspec_size_tl> \l_fontspec_scale_tl - \fontspec_fontwrap:n { + \fontspec_fontwrap:n + { \fontspec_fullname:n { \l_fontspec_sizedfont_tl } : \l_fontspec_pre_feat_sclist \l_fontspec_rawfeatures_sclist - } - } - - } - } - \use:x{ - \exp_not:N\DeclareFontShape{\g_fontspec_encoding_tl}{\l_fontspec_family_tl}{#1}{#2} - {\l_fontspec_nfss_tl}{\l_fontspec_postadjust_tl} - } - \bool_if:nT { - \str_if_eq_p:xx {#2} {\itdefault} && - !(\str_if_eq_p:xx {\itdefault} {\sldefault}) - } - { - \use:x { + } + } + } + } +\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}) + } + { + \use:x + { \exp_not:N \DeclareFontShape {\g_fontspec_encoding_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:nnn + { \tl_gput_right:Nx \l_fontspec_defined_shapes_tl - { \exp_not:n { \\ \\ } - *~ '\exp_not:N \prg_case_str:nnn {#1/#2} { + { + \exp_not:n { \\ \\ } + *~ '\exp_not:N \str_case:nnn {#1/#2} + { {\mddefault/\updefault} {normal} {\mddefault/\scdefault} {small~ caps} {\bfdefault/\updefault} {bold} @@ -682,41 +833,48 @@ {\mddefault/\sidefault} {italic~ small~ caps} {\bfdefault/\itdefault} {bold~ italic} {\bfdefault/\sidefault} {bold~ italic~ small~ caps} - } {#2/#3}'~ - with~ NFSS~ spec.: \exp_not:N \\ - \l_fontspec_nfss_tl - \tl_if_empty:NF \l_fontspec_postadjust_tl { - \exp_not:N \\ and~ font~ adjustment~ code: \exp_not:N \\ \l_fontspec_postadjust_tl - } - } -} + } {#2/#3}'~ + with~ NFSS~ spec.: \exp_not:N \\ + \l_fontspec_nfss_tl + \tl_if_empty:NF \l_fontspec_postadjust_tl + { + \exp_not:N \\ and~ font~ adjustment~ code: \exp_not:N \\ \l_fontspec_postadjust_tl + } + } + } \tl_set:Nn \l_fontspec_pre_feat_sclist - { - mode = \l_fontspec_mode_tl ; - \tl_if_empty:NF \l_fontspec_script_tl - { - script = \l_fontspec_script_tl ; - language = \l_fontspec_lang_tl ; - } - } -\cs_new:Nn \fontspec_update_fontid:n { - \bool_if:NT \l_fontspec_firsttime_bool { + { + mode = \l_fontspec_mode_tl ; + \tl_if_empty:NF \l_fontspec_script_tl + { + script = \l_fontspec_script_tl ; + language = \l_fontspec_lang_tl ; + } + } +\cs_new:Nn \fontspec_update_fontid:n + { + \bool_if:NT \l_fontspec_firsttime_bool + { \tl_gput_right:Nx \l_fontspec_fontid_tl {#1} - } -} -\cs_set:Npn \fontspec_get_features:n #1 { + } + } +\cs_set:Nn \fontspec_get_features:n + { \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_clear:N \l_fontspec_postadjust_tl - \keys_set:nx {fontspec} {\l_fontspec_fontfeat_clist, #1} - \str_if_eq:xxF { \l_fontspec_hexcol_tl \l_fontspec_opacity_tl } - { \g_fontspec_hexcol_tl \g_fontspec_opacity_tl } + + \keys_set_known:nxN {fontspec-renderer} {\l_fontspec_fontfeat_clist,#1} + \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_clear:N \l_fontspec_fontname_bf_tl \tl_clear:N \l_fontspec_fontname_it_tl \tl_clear:N \l_fontspec_fake_slant_tl @@ -741,7 +899,8 @@ \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: { +\cs_set:Npn \fontspec_init: + { \bool_set_false:N \l_fontspec_icu_bool \bool_set_true:N \l_fontspec_firsttime_bool \cs_set:Npn \fontspec_namewrap:n ##1 @@ -754,328 +913,345 @@ \luatexposthyphenchar = 0 % fixme \luatexpreexhyphenchar = 0 % fixme \luatexpostexhyphenchar= 0 % fixme -} -\cs_set:Nn \fontspec_make_ot_smallcaps:T { + } +\cs_set:Nn \fontspec_make_ot_smallcaps:T + { \fontspec_check_ot_feat:nT {+smcp} { #1 } -} + } \cs_set_eq:NN \fontspec_make_smallcaps:T \fontspec_make_ot_smallcaps:T \cs_set_eq:NN \sclist_clear:N \tl_clear:N -\cs_new:Nn \sclist_gput_right:Nn { - \tl_gput_right:Nn #1 {#2;} -} +\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 { +\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_ICU_feature:n {#3} - } + { \fontspec_make_ICU_feature:n {#3} } \cs_generate_variant:Nn \fontspec_make_feature:nnn {nnx} -\cs_new:Nn \fontspec_make_AAT_feature:nn { +\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_fontid:n {+#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_ICU_feature:n { + { \fontspec_warning:n {aat-feature-not-exist} } + { + \fontspec_make_AAT_feature_string:nnTF {#1}{#2} + { + \fontspec_update_fontid:n {+#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_ICU_feature:n + { \tl_if_empty:nTF {#1} - { \fontspec_warning:n {icu-feature-not-exist} } - { - \fontspec_check_ot_feat:nTF {#1} - { - \fontspec_update_fontid:n {#1} - \fontspec_update_featstr:n{#1} - } - { \fontspec_warning:nx {icu-feature-not-exist-in-font} {#1} } - } -} + { \fontspec_warning:n {icu-feature-not-exist} } + { + \fontspec_check_ot_feat:nTF {#1} + { + \fontspec_update_fontid:n {#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_fontid:n {#1=#2} + { + \fontspec_check_ot_feat:nTF {#1} + { + \fontspec_update_fontid:n {#1=#2} \fontspec_update_featstr:n { #1 = \int_eval:n {#2+1} } - } - { \fontspec_warning:nx {icu-feature-not-exist-in-font} {#1} } - } + } + { \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 { +\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} { + } +\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} { + { + \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: } - { + { \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 { + } + { + \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: } - { + { \prg_return_false: } + { \tl_set:Nx \l_fontspec_feature_string_tl { \l_tmpa_tl = \l_tmpb_tl } \prg_return_true: - } - } -} -\cs_set:Npn \fontspec_iv_str_to_num:Nn #1#2 { + } + } + } +\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 { + } +\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:Npn \fontspec_v_str_to_num:Nn #1#2 { +\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} } -} + { + \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")} - \if@tempswa \prg_return_true: \else: \prg_return_false: \fi: - } + { + \directlua{fontspec.check_ot_script("l_fontspec_font", "#1")} + \if@tempswa \prg_return_true: \else: \prg_return_false: \fi: + } \prg_new_conditional:Nnn \fontspec_check_lang:n {TF} - { - \directlua{ - fontspec.check_ot_lang( "l_fontspec_font", "#1", "\l_fontspec_script_tl" ) - } - \if@tempswa \prg_return_true: \else: \prg_return_false: \fi: - } + { + \directlua + { + fontspec.check_ot_lang( "l_fontspec_font", "#1", "\l_fontspec_script_tl" ) + } + \if@tempswa \prg_return_true: \else: \prg_return_false: \fi: + } \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" - ) - } - \if@tempswa \prg_return_true: \else: \prg_return_false: \fi: - } + { + \directlua + { + fontspec.check_ot_feat( + "l_fontspec_font", "#1", + "\l_fontspec_lang_tl", "\l_fontspec_script_tl" + ) + } + \if@tempswa \prg_return_true: \else: \prg_return_false: \fi: + } +\cs_new:Nn \__fontspec_keys_define_code:nnn + { + \keys_define:nn {#1} { #2 .code:n = {#3} } + } \bool_new:N \l_fontspec_external_bool -\keys_define:nn {fontspec-preparse-external} { - ExternalLocation .code:n = { +\__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_gset:Npn \fontspec_namewrap:n ##1 - { file: #1 ##1 } - } -} + { file: #1 ##1 } + } \aliasfontfeature{ExternalLocation}{Path} -\keys_define:nn {fontspec-preparse-external} { - Extension .code:n = { +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Extension} + { \tl_set:Nn \l_fontspec_extension_tl {#1} - \bool_if:NF \l_fontspec_external_bool { + \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-preparse} { - Renderer .choice_code:n = { +\keys_define:nn {fontspec-renderer} + { + Renderer .choice_code:n = + { \fontspec_update_fontid:n {+rend:\l_keys_choice_tl} - \int_compare:nTF {\l_keys_choice_int < 3} { + \int_compare:nTF {\l_keys_choice_int <= 3} { \fontspec_warning:nx {only-xetex-feature} {Renderer=AAT/ICU/Graphite} - }{ + } + { \tl_set:Nv \l_fontspec_mode_tl { g_fontspec_mode_tag_ \l_keys_choice_tl } - } - } + } + } , Renderer .generate_choices:n = {AAT,ICU,Graphite,Full,Basic} -} + } \tl_set:cn {g_fontspec_renderer_tag_AAT} {/AAT} \tl_set:cn {g_fontspec_renderer_tag_ICU} {/ICU} \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} -\keys_define:nn {fontspec-preparse} { Script .code:n = { +\__fontspec_keys_define_code:nnn {fontspec-preparse} {Script} + { \tl_set:Nn \l_fontspec_script_name_tl {#1} \fontspec_update_fontid:n {+script:#1} - } -} -\keys_define:nn {fontspec-preparse} { Language .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {Language} + { \tl_set:Nn \l_fontspec_lang_name_tl {#1} \fontspec_update_fontid:n {+language:#1} - } -} -\keys_define:nn {fontspec-preparse-external} { UprightFont .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {UprightFont} + { \fontspec_complete_fontname:Nn \l_fontspec_fontname_up_tl {#1} \fontspec_update_fontid:n {up:#1} - } -} -\keys_define:nn {fontspec-preparse-external} { BoldFont .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldFont} + { \tl_if_empty:nTF {#1} - { + { \bool_set_true:N \l_fontspec_nobf_bool \fontspec_update_fontid:n {nobf} - } - { + } + { \bool_set_false:N \l_fontspec_nobf_bool \fontspec_complete_fontname:Nn \l_fontspec_fontname_bf_tl {#1} \fontspec_update_fontid:n {bf:#1} - } - } -} -\keys_define:nn {fontspec-preparse-external} { ItalicFont .code:n = { + } + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {ItalicFont} + { \tl_if_empty:nTF {#1} - { + { \bool_set_true:N \l_fontspec_noit_bool \fontspec_update_fontid:n {noit} - }{ + } + { \bool_set_false:N \l_fontspec_noit_bool \fontspec_complete_fontname:Nn \l_fontspec_fontname_it_tl {#1} \fontspec_update_fontid:n {it:#1} - } - } -} -\keys_define:nn {fontspec-preparse-external} { BoldItalicFont .code:n = { + } + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldItalicFont} + { \fontspec_complete_fontname:Nn \l_fontspec_fontname_bfit_tl {#1} \fontspec_update_fontid:n {bfit:#1} - } -} -\keys_define:nn {fontspec-preparse-external} - { - SlantedFont .code:n = - { - \fontspec_complete_fontname:Nn \l_fontspec_fontname_sl_tl {#1} - \fontspec_update_fontid:n {sl:#1} - } - } -\keys_define:nn {fontspec-preparse-external} { BoldSlantedFont .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {SlantedFont} + { + \fontspec_complete_fontname:Nn \l_fontspec_fontname_sl_tl {#1} + \fontspec_update_fontid:n {sl:#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldSlantedFont} + { \fontspec_complete_fontname:Nn \l_fontspec_fontname_bfsl_tl {#1} \fontspec_update_fontid:n {bfsl:#1} - } -} -\keys_define:nn {fontspec} { SmallCapsFont .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFont} + { \tl_if_empty:nTF {#1} - { + { \bool_set_true:N \l_fontspec_nosc_bool \fontspec_update_fontid:n {nosc} - }{ + } + { \bool_set_true:N \l_fontspec_nosc_bool \fontspec_complete_fontname:Nn \l_fontspec_fontname_sc_tl {#1} \fontspec_update_fontid:n {sc:#1} - } - } -} -\cs_set:Npn \fontspec_complete_fontname:Nn #1#2 { + } + } +\cs_set:Nn \fontspec_complete_fontname:Nn + { \tl_set:Nn #1 {#2} \tl_replace_all:Nnx #1 {*} {\l_fontspec_fontname_tl} \tl_remove_all:Nn #1 {~} -} + } \cs_generate_variant:Nn \tl_replace_all:Nnn {Nnx} -\keys_define:nn {fontspec-preparse} { UprightFeatures .code:n = { +\__fontspec_keys_define_code:nnn {fontspec-preparse} {UprightFeatures} + { \tl_set:Nn \l_fontspec_fontfeat_up_clist { , #1} \fontspec_update_fontid:n {rmfeat:#1} - } -} -\keys_define:nn {fontspec-preparse} { BoldFeatures .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldFeatures} + { \tl_set:Nn \l_fontspec_fontfeat_bf_clist {, #1} \fontspec_update_fontid:n {bffeat:#1} - } -} -\keys_define:nn {fontspec-preparse} { ItalicFeatures .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {ItalicFeatures} + { \tl_set:Nn \l_fontspec_fontfeat_it_clist {, #1} \fontspec_update_fontid:n {itfeat:#1} - } -} -\keys_define:nn {fontspec-preparse} { BoldItalicFeatures .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldItalicFeatures} + { \tl_set:Nn \l_fontspec_fontfeat_bfit_clist {, #1} \fontspec_update_fontid:n {bfitfeat:#1} - } -} -\keys_define:nn {fontspec-preparse} { SlantedFeatures .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {SlantedFeatures} + { \tl_set:Nn \l_fontspec_fontfeat_sl_clist {, #1} \fontspec_update_fontid:n {slfeat:#1} - } -} -\keys_define:nn {fontspec-preparse} { BoldSlantedFeatures .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldSlantedFeatures} + { \tl_set:Nn \l_fontspec_fontfeat_bfsl_clist {, #1} \fontspec_update_fontid:n {bfslfeat:#1} - } -} -\keys_define:nn {fontspec} { SmallCapsFeatures .code:n = { - \bool_if:NF \l_fontspec_firsttime_bool { + } +\__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFeatures} + { + \bool_if:NF \l_fontspec_firsttime_bool + { \tl_set:Nn \l_fontspec_fontfeat_sc_clist {, #1} - } + } \fontspec_update_fontid:n {scfeat:#1} - } -} -\keys_define:nn {fontspec-preparse} { SizeFeatures .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {SizeFeatures} + { \tl_set:Nn \l_fontspec_sizefeat_clist {#1} \fontspec_update_fontid:n {sizefeat:#1} - } -} -\keys_define:nn {fontspec-sizing} - { - Size .code:n = - { - \tl_set:Nn \l_fontspec_size_tl {#1} - } - } -\keys_define:nn {fontspec-sizing} - { - Font .code:n = - { - \fontspec_complete_fontname:Nn \l_fontspec_sizedfont_tl {#1} - } - } -\keys_define:nn {fontspec} { Scale .code:n = { - \prg_case_str:nnn {#1} - { + } +\__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} {Scale} + { + \str_case:nnn {#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 {#1} } \fontspec_update_fontid:n {+scale:\l_fontspec_scale_tl} \tl_set:Nx \l_fontspec_scale_tl { s*[\l_fontspec_scale_tl] } - } -} -\cs_new:Nn \fontspec_calc_scale:n { + } +\cs_new:Nn \fontspec_calc_scale:n + { \group_begin: \rmfamily \fontspec_set_font_dimen:NnN \l_fontspec_tmpa_dim {#1} \font @@ -1086,223 +1262,234 @@ \tl_gset:Nx \l_fontspec_scale_tl { \fp_use:N \l_fontspec_tmpa_fp } \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 { + \dim_compare:nNnT #1 = {0pt} + { + \settoheight #1 + { \str_if_eq:nnTF {#3} {\font} \rmfamily #3 - \prg_case_int:nnn #2 { - {5} {x} % x-height - {8} {X} % cap-height - } {?} % "else" clause; never reached. - } - } -} -\keys_define:nn {fontspec} { WordSpace .code:n = { + \int_case:nnn #2 + { + {5} {x} % x-height + {8} {X} % cap-height + } {?} % "else" clause; never reached. + } + } + } +\__fontspec_keys_define_code:nnn {fontspec} {WordSpace} + { \fontspec_update_fontid:n {+wordspace:#1} - \bool_if:NF \l_fontspec_firsttime_bool { - \_fontspec_parse_wordspace:w #1,,,\q_stop - } - } -} -\cs_set:Npn \_fontspec_parse_wordspace:w #1,#2,#3,#4 \q_stop { + \bool_if:NF \l_fontspec_firsttime_bool + { \_fontspec_parse_wordspace:w #1,,,\q_stop } + } +\cs_set:Npn \_fontspec_parse_wordspace:w #1,#2,#3,#4 \q_stop + { \tl_if_empty:nTF {#4} - { - \tl_put_right:Nn \l_fontspec_postadjust_tl { + { + \tl_put_right:Nn \l_fontspec_postadjust_tl + { \fontdimen 2 \font = #1 \fontdimen 2 \font \fontdimen 3 \font = #1 \fontdimen 3 \font \fontdimen 4 \font = #1 \fontdimen 4 \font - } - }{ - \tl_put_right:Nn \l_fontspec_postadjust_tl { + } + } + { + \tl_put_right:Nn \l_fontspec_postadjust_tl + { \fontdimen 2 \font = #1 \fontdimen 2 \font \fontdimen 3 \font = #2 \fontdimen 3 \font \fontdimen 4 \font = #3 \fontdimen 4 \font - } - } -} -\keys_define:nn {fontspec} - { - PunctuationSpace .code:n = - { - \fontspec_update_fontid:n {+punctspace:#1} - \tl_put_right:Nx \l_fontspec_postadjust_tl - { \fontdimen 7 \font = #1 \fontdimen 7 \font } - } - } -\keys_define:nn {fontspec} { FontAdjustment .code:n = { + } + } + } +\__fontspec_keys_define_code:nnn {fontspec} {PunctuationSpace} + { + \fontspec_update_fontid:n {+punctspace:#1} + \tl_put_right:Nx \l_fontspec_postadjust_tl + { \fontdimen 7 \font = #1 \fontdimen 7 \font } + } +\__fontspec_keys_define_code:nnn {fontspec} {FontAdjustment} + { \fontspec_update_fontid:n {+fontadjust:\detokenize{#1}} \tl_put_right:Nx \l_fontspec_postadjust_tl {#1} - } -} -\keys_define:nn {fontspec} { LetterSpace .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec} {LetterSpace} + { \fontspec_update_fontid:n {+tracking:#1} \fontspec_update_featstr:n{letterspace=#1} - } -} -\keys_define:nn {fontspec} { HyphenChar .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec} {HyphenChar} + { \fontspec_update_fontid:n {+hyphenchar:#1} \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} } + { \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 \luatexprehyphenchar = \l_fontspec_hyphenchar_tl \scan_stop: } - } - { \fontspec_error:nx {no-glyph}{#1} } - } - } -} -\keys_define:nn {fontspec} { Color .code:n = { + } + { \fontspec_error:nx {no-glyph}{#1} } + } + } +\__fontspec_keys_define_code:nnn {fontspec} {Color} + { \fontspec_update_fontid:n {+col:#1} \cs_if_exist:cTF { \token_to_str:N \color@ #1 } - { + { \convertcolorspec{named}{#1}{HTML}\l_fontspec_hexcol_tl - } - { + } + { \int_compare:nTF { \tl_length:n {#1} == 6 } - { \tl_set:Nn \l_fontspec_hexcol_tl {#1} } - { + { \tl_set:Nn \l_fontspec_hexcol_tl {#1} } + { \int_compare:nTF { \tl_length: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 { + { \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} - } + \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 -\keys_define:nn {fontspec} { Opacity .code:n = { +\__fontspec_keys_define_code:nnn {fontspec} {Opacity} + { \fontspec_update_fontid:n {+opac:#1} \int_set:Nn \l_fontspec_tmp_int {255} \_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} - } + \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_hexadecimal:n { \l_fontspec_tmp_int } } - } -} -\keys_define:nn {fontspec} -{ - Mapping .code:n = { - \str_if_eq:nnTF {#1} {tex-text} { + } +\__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} - } - } -} -\keys_define:nn {fontspec} { FeatureFile .code:n = { + } + { \fontspec_warning:n {no-mapping} } + } +\__fontspec_keys_define_code:nnn {fontspec} {FeatureFile} + { \fontspec_update_fontid:n {+fea:#1} \fontspec_update_featstr:n{featurefile=#1} - } -} -\keys_define:nn {fontspec} { Weight .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec} {Weight} + { \fontspec_update_fontid:n {+weight:#1} \fontspec_update_featstr:n{weight=#1} - } -} -\keys_define:nn {fontspec} { Width .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec} {Width} + { \fontspec_update_fontid:n {+width:#1} \fontspec_update_featstr:n{width=#1} - } -} -\keys_define:nn {fontspec} { OpticalSize .code:n = - { - \tl_set:Nn \l_fontspec_optical_size_tl {/ S = #1} - \fontspec_update_fontid:n {+size:#1} - } -} -\keys_define:nn {fontspec} { FakeSlant .code:n = { - \fontspec_update_fontid:n {+slant:#1} - \fontspec_update_featstr:n{slant=#1} - }, + } +\__fontspec_keys_define_code:nnn {fontspec} {OpticalSize} + { + \tl_set:Nn \l_fontspec_optical_size_tl {/ S = #1} + \fontspec_update_fontid:n {+size:#1} + } +\keys_define:nn {fontspec} + { + FakeSlant .code:n = + { + \fontspec_update_fontid:n {+slant:#1} + \fontspec_update_featstr:n{slant=#1} + }, FakeSlant .default:n = {0.2} } -\keys_define:nn {fontspec} { FakeStretch .code:n = { - \fontspec_update_fontid:n {+extend:#1} - \fontspec_update_featstr:n{extend=#1} - }, +\keys_define:nn {fontspec} + { + FakeStretch .code:n = + { + \fontspec_update_fontid:n {+extend:#1} + \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 + { + 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 - \fontspec_update_fontid:n {fakeit:#1} + \fontspec_update_fontid:n {fakeit:#1} - \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 - } - } - }, + \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 +\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 - \fontspec_update_fontid:n {fakebf:#1} + \fontspec_update_fontid:n {fakebf:#1} - \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 - } - } - }, + \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} @@ -1331,12 +1518,13 @@ \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 = { + { + Ligatures / TeX .code:n = + { \fontspec_update_fontid:n {+tlig+trep} \fontspec_update_featstr:n{+tlig;+trep} - } -} + } + } \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} @@ -1357,9 +1545,10 @@ \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 { +\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} @@ -1406,59 +1595,61 @@ \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} } } - } - } + { + 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 = \int_eval:n {#1+1} } -\fontspec_define_font_feature:n { Variant } +\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} } } - } - } + { + 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 - } - } - } - } + { + \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 + } + } + } + } \keys_define:nn {fontspec} - { - ScriptStyle .code:n = { - \fontspec_update_fontid:n {+ssty=1} - \fontspec_update_featstr:n{+sstyle} - }, - ScriptScriptStyle .code:n = { - \fontspec_update_fontid:n {+ssty=2} - \fontspec_update_featstr:n{+ssstyle} - } - } + { + ScriptStyle .code:n = + { + \fontspec_update_fontid:n {+ssty=1} + \fontspec_update_featstr:n{+sstyle} + }, + ScriptScriptStyle .code:n = + { + \fontspec_update_fontid:n {+ssty=2} + \fontspec_update_featstr:n{+ssstyle} + } + } \fontspec_define_font_feature:n{Style} \fontspec_define_feature_option:nnnnn{Style}{Alternate} {} {} {+salt} \fontspec_define_feature_option:nnnnn{Style}{Italic} {32}{2}{+ital} @@ -1504,29 +1695,31 @@ \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= \int_eval:n {#1+1} } - } - } + { + Annotation .default:n = {0} , + Annotation / unknown .code:n = + { + \fontspec_make_feature:nnx {}{} + { +nalt= \int_eval:n {#1+1} } + } + } \keys_define:nn {fontspec} - { - Vertical .choice: , - Vertical / RotatedGlyphs .code:n = - { - \bool_if:NTF \l_fontspec_icu_bool { - \fontspec_make_feature:nnn{}{}{+vrt2} - \fontspec_update_fontid:n {+vert} - \fontspec_update_featstr:n{vertical} - }{ - \fontspec_update_fontid:n {+vert} - \fontspec_update_featstr:n{vertical} - } - } - } + { + Vertical .choice: , + Vertical / RotatedGlyphs .code:n = + { + \bool_if:NTF \l_fontspec_icu_bool + { + \fontspec_make_feature:nnn{}{}{+vrt2} + \fontspec_update_fontid:n {+vert} + \fontspec_update_featstr:n{vertical} + } + { + \fontspec_update_fontid:n {+vert} + \fontspec_update_featstr:n{vertical} + } + } + } \newfontscript{Arabic}{arab} \newfontscript{Armenian}{armn} \newfontscript{Balinese}{bali} \newfontscript{Bengali}{beng} \newfontscript{Bopomofo}{bopo} \newfontscript{Braille}{brai} @@ -1765,86 +1958,93 @@ \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} - \fontspec_update_fontid:n {+lang=Turkish} - \tl_set:Nn \l_fontspec_lang_tl {TRK} - }{ - \fontspec_check_lang:nTF {TUR} { - \int_set:Nn \l_fontspec_language_int {\l_fontspec_strnum_int} - \fontspec_update_fontid:n {+lang=Turkish} - \tl_set:Nn \l_fontspec_lang_tl {TUR} - }{ - \fontspec_warning:nx {language-not-exist} {Turkish} - \keys_set:nn {fontspec} {Language=Default} - } - } - } - } -\keys_define:nn {fontspec} - { - Language / Default .code:n = - { - \fontspec_update_fontid:n {+lang=dflt} - \tl_set:Nn \l_fontspec_lang_tl {DFLT} - \int_zero:N \l_fontspec_language_int - } - } -\keys_define:nn {fontspec} - { - RawFeature .code:n = - { - \fontspec_update_fontid:n {+Raw:#1} - \fontspec_update_featstr:n{#1} - } - } + { + Language / Turkish .code:n = + { + \fontspec_check_lang:nTF {TRK} + { + \int_set:Nn \l_fontspec_language_int {\l_fontspec_strnum_int} + \fontspec_update_fontid:n {+lang=Turkish} + \tl_set:Nn \l_fontspec_lang_tl {TRK} + } + { + \fontspec_check_lang:nTF {TUR} + { + \int_set:Nn \l_fontspec_language_int {\l_fontspec_strnum_int} + \fontspec_update_fontid:n {+lang=Turkish} + \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 } + { + \fontspec_update_fontid:n {+lang=dflt} + \tl_set:Nn \l_fontspec_lang_tl {DFLT} + \int_zero:N \l_fontspec_language_int + } +\__fontspec_keys_define_code:nnn {fontspec} {RawFeature} + { + \fontspec_update_fontid:n {+Raw:#1} + \fontspec_update_featstr:n{#1} + } \providecommand*{\sidefault}{si} -\DeclareRobustCommand{\sishape}{ +\DeclareRobustCommand{\sishape} + { \not@math@alphabet\sishape\relax \fontshape\sidefault\selectfont -} + } \DeclareTextFontCommand{\textsi}{\sishape} -\cs_new:Nn \fontspec_blend_shape:nnn { +\cs_new:Nn \fontspec_blend_shape:nnn + { \bool_if:nTF - { - \str_if_eq_p:xx {\f@shape} {#2} && + { + \str_if_eq_x_p:nn {\f@shape} {#2} && \cs_if_exist_p:c {\f@encoding/\f@family/\f@series/#3} - } - { \fontshape{#3}\selectfont } - { \fontshape{#1}\selectfont } -} -\DeclareRobustCommand \itshape { + } + { \fontshape{#3}\selectfont } + { \fontshape{#1}\selectfont } + } +\DeclareRobustCommand \itshape + { \not@math@alphabet\itshape\mathit \fontspec_blend_shape:nnn\itdefault\scdefault\sidefault -} -\DeclareRobustCommand \slshape { + } +\DeclareRobustCommand \slshape + { \not@math@alphabet\slshape\relax \fontspec_blend_shape:nnn\sldefault\scdefault\sidefault -} -\DeclareRobustCommand \scshape { + } +\DeclareRobustCommand \scshape + { \not@math@alphabet\scshape\relax \fontspec_blend_shape:nnn\scdefault\itdefault\sidefault -} -\DeclareRobustCommand \upshape { + } +\DeclareRobustCommand \upshape + { \not@math@alphabet\upshape\relax \fontspec_blend_shape:nnn\updefault\sidefault\scdefault -} -\@ifpackageloaded{euler}{ + } +\@ifpackageloaded{euler} + { \bool_set_true:N \g_fontspec_package_euler_loaded_bool -}{ + } + { \bool_set_false:N \g_fontspec_package_euler_loaded_bool -} -\cs_set:Nn \fontspec_setup_maths: { - \@ifpackageloaded{euler}{ - \bool_if:NTF \g_fontspec_package_euler_loaded_bool { - \bool_set_true:N \g_fontspec_math_euler_bool - }{ - \fontspec_error:n {euler-too-late} - } - }{} + } +\cs_set:Nn \fontspec_setup_maths: + { + \@ifpackageloaded{euler} + { + \bool_if:NTF \g_fontspec_package_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}{} @@ -1866,12 +2066,14 @@ \DeclareMathSymbol{\colon}{\mathpunct}{legacymaths}{58} \fi \group_end: - \bool_if:NF \g_fontspec_math_euler_bool { + \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 { + \bool_if:NF \g_fontspec_math_lucida_bool + { \DeclareMathSymbol{0}{\mathalpha}{legacymaths}{`0} \DeclareMathSymbol{1}{\mathalpha}{legacymaths}{`1} \DeclareMathSymbol{2}{\mathalpha}{legacymaths}{`2} @@ -1911,20 +2113,25 @@ \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 { + \tl_if_empty:NTF \g_fontspec_bfmathrm_tl + { \SetMathAlphabet\mathrm{bold}\g_fontspec_encoding_tl\g_fontspec_mathrm_tl\bfdefault\updefault \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}{} + } +\cs_new:Nn \fontspec_maybe_setup_maths: + { + \@ifpackageloaded{anttor} + { + \ifx\define@antt@mathversions a\bool_set_false:N \g_fontspec_math_bool\fi + }{} \@ifpackageloaded{arev}{\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}{} @@ -1933,12 +2140,16 @@ \@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{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{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}{} @@ -1947,24 +2158,26 @@ \@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 { + \bool_if:NT \g_fontspec_math_bool + { \fontspec_info:n {setup-math} \fontspec_setup_maths: - } -} + } + } \AtBeginDocument{\fontspec_maybe_setup_maths:} -\bool_if:NT \g_fontspec_cfg_bool { +\bool_if:NT \g_fontspec_cfg_bool + { \InputIfFileExists{fontspec.cfg} {} {\typeout{No~ fontspec.cfg~ file~ found;~ no~ configuration~ loaded.}} -} + } \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 } - } + { + \fontspec_select:nn {#1} {#2} + \tl_set:Nn \zf@family { \l_fontspec_family_tl } + \tl_set:Nn \zf@basefont { \l_fontspec_font } + } \ExplSyntaxOff %% %% Copyright 2004--2012 Will Robertson <wspr81@gmail.com> diff --git a/Master/texmf-dist/tex/latex/fontspec/fontspec-patches.sty b/Master/texmf-dist/tex/latex/fontspec/fontspec-patches.sty index f2fc15b2a82..7564e72ddc4 100644 --- a/Master/texmf-dist/tex/latex/fontspec/fontspec-patches.sty +++ b/Master/texmf-dist/tex/latex/fontspec/fontspec-patches.sty @@ -14,40 +14,47 @@ %% %% \ProvidesPackage{fontspec-patches} - [2012/05/06 v2.2b Advanced font selection for XeLaTeX/LuaLaTeX] + [2013/02/25 v2.3 Font selection for XeLaTeX and LuaLaTeX] \ExplSyntaxOn \RequirePackage{fixltx2e}[2006/03/24] -\DeclareRobustCommand \em { +\DeclareRobustCommand \em + { \@nomath\em - \str_if_eq:xxTF \f@shape \itdefault \eminnershape + \str_if_eq_x:nnTF \f@shape \itdefault \eminnershape { - \str_if_eq:xxTF \f@shape \sldefault \eminnershape \emshape + \str_if_eq_x:nnTF \f@shape \sldefault \eminnershape \emshape } -} + } \DeclareTextFontCommand{\emph}{\em} \cs_set_eq:NN \emshape \itshape \cs_set_eq:NN \eminnershape \upshape -\DeclareRobustCommand{\-}{% - \discretionary{% +\DeclareRobustCommand{\-} + { + \discretionary + { \char\ifnum\hyphenchar\font<\z@ \xlx@defaulthyphenchar \else \hyphenchar\font - \fi}{}{}} + \fi + }{}{} + } \def\xlx@defaulthyphenchar{`\-} -\cs_new:Nn \fontspec_visible_space: { +\cs_new:Nn \fontspec_visible_space: + { \font_glyph_if_exist:NnTF \font {"2423} - {\char"2423\relax} - {\fontspec_visible_space_fallback:} -} -\cs_new:Nn \fontspec_visible_space_fallback: { + { \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 + \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:{% @@ -55,60 +62,74 @@ \cs_set_eq:NN^^20\fontspec_visible_space:% }% \group_end: -\def\verb{ +\def\verb + { \relax\ifmmode\hbox\else\leavevmode\null\fi \bgroup \verb@eol@error \let\do\@makeother \dospecials \verbatim@font\@noligs - \@ifstar\@@sverb\@verb -} -\def\@@sverb{\fontspec_print_visible_spaces:\@sverb} -\AtBeginDocument{ + \@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*} { + } +\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*} { + } + } + { + \cs_set:cpn {verbatim*} + { \@verbatim \fontspec_print_visible_spaces: \@sxverbatim - } - } -} -\cs_set:Npn \fontspec_patch_moreverb: { + } + } + } +\cs_set:Npn \fontspec_patch_moreverb: + { \@ifpackageloaded{moreverb}{ - \cs_set:cpn {listingcont*} { - \cs_set:Npn \verbatim@processline { + \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:Npn \fontspec_patch_fancyvrb: + { + \@ifpackageloaded{fancyvrb} + { \cs_set_eq:NN \FancyVerbSpace \fontspec_visible_space: - }{} -} -\cs_set:Npn \fontspec_patch_listings: { - \@ifpackageloaded{listings}{ + }{} + } +\cs_set:Npn \fontspec_patch_listings: + { + \@ifpackageloaded{listings} + { \cs_set_eq:NN \lst@visiblespace \fontspec_visible_space: - }{} -} + }{} + } \RenewDocumentCommand \oldstylenums {m} - { - { \addfontfeature{Numbers=OldStyle} #1 } - } + { + { \addfontfeature{Numbers=OldStyle} #1 } + } \NewDocumentCommand \liningnums {m} - { - { \addfontfeature{Numbers=Lining} #1 } - } + { + { \addfontfeature{Numbers=Lining} #1 } + } %% %% Copyright 2004--2012 Will Robertson <wspr81@gmail.com> %% Copyright 2009--2012 Khaled Hosny <khaledhosny@eglug.org> diff --git a/Master/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty b/Master/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty index 701d5030093..ef0d4a3b988 100644 --- a/Master/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty +++ b/Master/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty @@ -14,7 +14,7 @@ %% %% \ProvidesPackage{fontspec-xetex} - [2012/05/06 v2.2b Advanced font selection for XeLaTeX/LuaLaTeX] + [2013/02/25 v2.3 Font selection for XeLaTeX and LuaLaTeX] \ExplSyntaxOn @@ -26,46 +26,55 @@ \tl_set_eq:NN \UTFencname \g_fontspec_encoding_tl % for xunicode \tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl \tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl -\tl_put_right:Nn \document { +\tl_put_right:Nn \document + { \tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl \tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl -} + } \RequirePackage{xunicode} -\DeclareDocumentCommand \fontspec { O{} m } { +\DeclareDocumentCommand \fontspec { O{} m } + { \fontencoding {\g_fontspec_encoding_tl} \fontspec_set_family:Nnn \f@family {#1}{#2} \selectfont \ignorespaces -} -\DeclareDocumentCommand \setmainfont { O{} m } { + } +\DeclareDocumentCommand \setmainfont { O{} m } + { \fontspec_set_family:Nnn \rmdefault {#1}{#2} \normalfont -} -\DeclareDocumentCommand \setsansfont { O{} m } { + } +\DeclareDocumentCommand \setsansfont { O{} m } + { \fontspec_set_family:Nnn \sfdefault {#1}{#2} \normalfont -} -\DeclareDocumentCommand \setmonofont { O{} m } { + } +\DeclareDocumentCommand \setmonofont { O{} m } + { \fontspec_set_family:Nnn \ttdefault {#1}{#2} \normalfont -} + } \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 } { +\DeclareDocumentCommand \setmathrm { O{} m } + { \fontspec_set_family:Nnn \g_fontspec_mathrm_tl {#1}{#2} -} -\DeclareDocumentCommand \setboldmathrm { O{} m } { + } +\DeclareDocumentCommand \setboldmathrm { O{} m } + { \fontspec_set_family:Nnn \g_fontspec_bfmathrm_tl {#1}{#2} -} -\DeclareDocumentCommand \setmathsf { O{} m } { + } +\DeclareDocumentCommand \setmathsf { O{} m } + { \fontspec_set_family:Nnn \g_fontspec_mathsf_tl {#1}{#2} -} -\DeclareDocumentCommand \setmathtt { O{} m } { + } +\DeclareDocumentCommand \setmathtt { O{} m } + { \fontspec_set_family:Nnn \g_fontspec_mathtt_tl {#1}{#2} -} + } \@onlypreamble\setmathrm \@onlypreamble\setboldmathrm \@onlypreamble\setmathsf @@ -73,325 +82,387 @@ \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 } { +\DeclareDocumentCommand \newfontfamily { m O{} m } + { \fontspec_select:nn{#2}{#3} - \use:x { - \exp_not:N \DeclareRobustCommand \exp_not:N #1 { + \use:x + { + \exp_not:N \DeclareRobustCommand \exp_not:N #1 + { \exp_not:N \fontencoding {\g_fontspec_encoding_tl} \exp_not:N \fontfamily {\l_fontspec_family_tl} \exp_not:N \selectfont - } - } -} -\DeclareDocumentCommand \newfontface { m O{} m } { + } + } + } +\DeclareDocumentCommand \newfontface { m O{} m } + { \newfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2 ] {#3} -} + } \tl_new:N \g_fontspec_default_fontopts_tl -\DeclareDocumentCommand \defaultfontfeatures {m} { +\prop_new:N \g__fontspec_fontopts_prop +\DeclareDocumentCommand \defaultfontfeatures { o m } + { + \IfNoValueTF {#1} + { \__fontspec_set_default_features:n {#2} } + { \__fontspec_set_font_default_features:nn {#1} {#2} } + } +\cs_new:Nn \__fontspec_set_default_features:n + { \tl_set:Nn \g_fontspec_default_fontopts_tl {#1,} -} -\DeclareDocumentCommand \addfontfeatures {m} { + } +\cs_new:Nn \__fontspec_set_font_default_features:nn + { + \__fontspec_sanitise_fontname:Nn \l__fontspec_tmp_tl {#1} + \tl_if_empty:nTF {#2} + { \prop_gremove:NV \g__fontspec_fontopts_prop \l__fontspec_tmp_tl } + { \prop_gput:NVn \g__fontspec_fontopts_prop \l__fontspec_tmp_tl {#2} } + } +\cs_new:Nn \__fontspec_sanitise_fontname:Nn + { + \use:x { \tl_to_lowercase:n { \tl_set:Nx \exp_not:N #1 {#2} } } + \tl_remove_all:Nn #1 {~} + \clist_map_inline:Nn \l_fontspec_extensions_clist + { \tl_remove_once:Nn #1 {##1} } + } +\DeclareDocumentCommand \addfontfeatures {m} + { \ifcsname zf@family@fontdef\f@family\endcsname \group_begin: \tl_clear:N \g_fontspec_default_fontopts_tl - \use:x { + \use:x + { \exp_not:N\fontspec_select:nn {\csname zf@family@options\f@family\endcsname,#1} {\csname zf@family@fontname\f@family\endcsname} - } + } \group_end: \fontfamily\l_fontspec_family_tl\selectfont \else \fontspec_warning:n {addfontfeatures-ignored} \fi \ignorespaces -} + } \cs_set_eq:NN \addfontfeature \addfontfeatures \DeclareDocumentCommand \newfontfeature {mm} - { - \keys_define:nn { fontspec } - { - #1 .code:n = { - \fontspec_update_fontid:n {+zf-#1} - \fontspec_update_featstr:n {#2} - } - } - } -\DeclareDocumentCommand \newAATfeature {mmmm} { + { + \keys_define:nn { fontspec } + { + #1 .code:n = + { + \fontspec_update_fontid:n {+zf-#1} + \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 \newICUfeature {mmm} { + } +\DeclareDocumentCommand \newICUfeature {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 \newopentypefeature \newICUfeature \DeclareDocumentCommand \aliasfontfeature {mm} - { - \keys_if_exist:nnTF {fontspec} {#1} - { - \keys_define:nn {fontspec} - { #2 .code:n = { \keys_set:nn {fontspec} { #1 = {##1} } } } - } - { - \keys_if_exist:nnTF {fontspec-preparse} {#1} + { + \keys_if_exist:nnTF {fontspec} {#1} + { + \keys_define:nn {fontspec} + { #2 .code:n = { \keys_set:nn {fontspec} { #1 = {##1} } } } + } + { + \keys_if_exist:nnTF {fontspec-preparse} {#1} { - \keys_define:nn {fontspec-preparse} - { #2 .code:n = { \keys_set:nn {fontspec-preparse} { #1 = {##1} } } } + \keys_define:nn {fontspec-preparse} + { #2 .code:n = { \keys_set:nn {fontspec-preparse} { #1 = {##1} } } } } { - \keys_if_exist:nnTF {fontspec-preparse-external} {#1} - { - \keys_define:nn {fontspec-preparse-external} + \keys_if_exist:nnTF {fontspec-preparse-external} {#1} + { + \keys_define:nn {fontspec-preparse-external} { - #2 .code:n = - { \keys_set:nn {fontspec-preparse-external} { #1 = {##1} } } + #2 .code:n = + { \keys_set:nn {fontspec-preparse-external} { #1 = {##1} } } } + } + { + \fontspec_warning:nx {rename-feature-not-exist} {#1} + } } - { \fontspec_warning:nx {rename-feature-not-exist} {#1} } - } - } - } + } + } \DeclareDocumentCommand \aliasfontfeatureoption {mmm} - { - \cs_set_eq:cc { \c_keys_code_root_tl fontspec/#1/#3 } - { \c_keys_code_root_tl fontspec/#1/#2 } - } + { \keys_define:nn { fontspec / #1 } { #3 .meta:n = {#2} } } \DeclareDocumentCommand \newfontscript {mm} -{ + { \fontspec_new_script:nn {#1} {#2} \fontspec_new_script:nn {#2} {#2} -} + } \keys_define:nn { fontspec } { Script .choice: } \cs_new:Nn \fontspec_new_script:nn -{ + { \keys_define:nn { fontspec } { Script / #1 .code:n = - \fontspec_check_script:nTF {#2} { + \fontspec_check_script:nTF {#2} + { \fontspec_update_fontid:n {+script=#1} \tl_set:Nn \l_fontspec_script_tl {#2} \int_set:Nn \l_fontspec_script_int {\l_fontspec_strnum_int} - }{ - \fontspec_check_script:nTF {latn} { + } + { + \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} - } - } - } -} + } + } + } + } \DeclareDocumentCommand \newfontlanguage {mm} -{ + { \fontspec_new_lang:nn {#1} {#2} \fontspec_new_lang:nn {#2} {#2} -} + } \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} { + \fontspec_check_lang:nTF {#2} + { \fontspec_update_fontid:n {+lang=#1} \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 } - } + } } -} + } \DeclareDocumentCommand \DeclareFontsExtensions {m} -{ + { \tl_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 { +\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 + { \fontspec_font_set:Nnn \l_fontspec_font {\use:c{zf@family@fontdef\f@family}} {\f@size pt} - \bool_if:NTF \l_fontspec_atsui_bool { + \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 { + } + } +\prg_new_conditional:Nnn \fontspec_if_opentype: {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: \bool_if:NTF \l_fontspec_icu_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 { + } + } +\prg_new_conditional:Nnn \fontspec_if_feature:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_bool + { \int_set:Nv \l_fontspec_script_int {g_fontspec_script_num_(\f@family)_tl} \int_set:Nv \l_fontspec_language_int {g_fontspec_lang_num_(\f@family)_tl} \tl_set:Nv \l_fontspec_script_tl {g_fontspec_script_(\f@family)_tl} \tl_set:Nv \l_fontspec_lang_tl {g_fontspec_lang_(\f@family)_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 { + } + } +\prg_new_conditional:Nnn \fontspec_if_feature:nnn {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_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 { + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_script:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_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 { + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_language:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_bool + { \tl_set:Nv \l_fontspec_script_tl {g_fontspec_script_(\f@family)_tl} \int_set:Nv \l_fontspec_script_int {g_fontspec_script_num_(\f@family)_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 { + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_language:nn {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_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 { + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_current_script:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_bool + { \str_if_eq:nvTF {#1} {g_fontspec_script_(\f@family)_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 { + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\prg_new_conditional:Nnn \fontspec_if_current_language:n {TF,T,F} + { + \fontspec_if_fontspec_font:TF + { \fontspec_font_set:Nnn \l_fontspec_font {\csname zf@family@fontdef\f@family\endcsname} {\f@size pt} \fontspec_set_font_type: - \bool_if:NTF \l_fontspec_icu_bool { + \bool_if:NTF \l_fontspec_icu_bool + { \str_if_eq:nvTF {#1} {g_fontspec_lang_(\f@family)_tl} {\prg_return_true:} {\prg_return_false:} - }{ - \prg_return_false: - } - }{ - \prg_return_false: - } -} -\cs_new:Nn \fontspec_set_family:Nnn { + } + { \prg_return_false: } + } + { \prg_return_false: } + } +\cs_new:Nn \fontspec_set_family:Nnn + { \fontspec_select:nn {#2}{#3} \tl_set_eq:NN #1 \l_fontspec_family_tl -} + } \cs_new:Nn \fontspec_set_fontface:NNnn - { - \fontspec_select:nn {#3}{#4} - \tl_set_eq:NN #1 \l_fontspec_font - \tl_set_eq:NN #2 \l_fontspec_family_tl - } + { + \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_fontwrap:n { "#1" } -\cs_if_free:NT \font_set_eq:NN { +\cs_if_free:NT \font_set_eq:NN + { \cs_set_eq:NN \font_set_eq:NN \tex_let:D - \cs_set:Npn \font_set:Nnn #1#2#3 { + \cs_set:Npn \font_set:Nnn #1#2#3 + { \font #1 = #2 ~at~ #3\scan_stop: - } - \cs_set:Npn \font_gset:Nnn #1#2#3 { + } + \cs_set:Npn \font_gset:Nnn #1#2#3 + { \global \font #1 = #2 ~at~ #3 \scan_stop: - } + } \cs_set:Npn \font_suppress_not_found_error: {\suppressfontnotfounderror=1} - \prg_set_conditional:Nnn \font_if_null:N {p,TF,T,F} { + \prg_set_conditional:Nnn \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 { + } + } +\cs_new:Nn \fontspec_font_set:Nnn + { \font_set:Nnn #1 {\fontspec_fontwrap:n {#2}} {#3} -} -\cs_new:Nn \fontspec_font_gset:Nnn { + } +\cs_new:Nn \fontspec_font_gset:Nnn + { \font_gset:Nnn #1 {\fontspec_fontwrap:n {#2}} {#3} -} -\prg_new_conditional:Nnn \font_glyph_if_exist:Nn {p,TF,T,F} { + } +\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_set:Nn \fontspec_select:nn { + } +\cs_set:Nn \fontspec_select:nn + { \group_begin: \font_suppress_not_found_error: \fontspec_init: \tl_set:Nx \l_fontspec_fontname_tl {#2} \tl_set_eq:NN \l_fontspec_fontid_tl \l_fontspec_fontname_tl \tl_set_eq:NN \l_fontspec_fontname_up_tl \l_fontspec_fontname_tl - \exp_args:NnV \fontspec_preparse_features:nn {#1} \l_fontspec_fontname_tl + \__fontspec_load_external_fontoptions:N \l_fontspec_fontname_tl + \fontspec_preparse_features:nN {#1} \l_fontspec_fontname_tl \fontspec_font_set:Nnn \l_fontspec_font {\fontspec_fullname:n {\l_fontspec_fontname_up_tl}} {\f@size pt} \font_if_null:NT \l_fontspec_font { \fontspec_error:nx {font-not-found} {\l_fontspec_fontname_up_tl} } \fontspec_set_font_type: @@ -400,7 +471,8 @@ \fontspec_set_scriptlang: \fontspec_get_features:n {} \bool_set_false:N \l_fontspec_firsttime_bool - \fontspec_save_family:nT {#2} { + \fontspec_save_family:nT {#2} + { \fontspec_save_fontinfo:nn {#1} {#2} \DeclareFontFamily{\g_fontspec_encoding_tl}{\l_fontspec_family_tl}{} \fontspec_set_upright: @@ -409,19 +481,39 @@ \fontspec_set_slanted: \fontspec_set_bold_italic: \fontspec_set_bold_slanted: - } + } \fontspec_info:nxx {defining-font} {#1} {#2} \group_end: -} -\cs_new:Nn \fontspec_preparse_features:nn { - \fontspec_if_detect_external:nT {#2} + } +\cs_new:Nn \__fontspec_load_external_fontoptions:N + { + \__fontspec_sanitise_fontname:Nn \l__fontspec_tmp_tl {#1} + \prop_if_in:NVF \g__fontspec_fontopts_prop {\l__fontspec_tmp_tl} + { + \exp_args:No \file_if_exist:nT {\l__fontspec_tmp_tl.fontspec} + { \file_input:n {\l__fontspec_tmp_tl.fontspec} } + } + } +\cs_new:Nn \fontspec_preparse_features:nN + { + \exp_args:NV \fontspec_if_detect_external:nT #2 { \keys_set:nn {fontspec-preparse-external} {ExternalLocation} } + + \__fontspec_sanitise_fontname:Nn \l__fontspec_tmp_tl {\l_fontspec_fontname_tl} + \prop_get:NVN \g__fontspec_fontopts_prop \l__fontspec_tmp_tl \l__fontspec_fontopts_clist \keys_set_known:nxN {fontspec-preparse-external} - {\g_fontspec_default_fontopts_tl #1} \l_fontspec_keys_leftover_clist + { + \g_fontspec_default_fontopts_tl + \quark_if_no_value:NF \l__fontspec_fontopts_clist {\l__fontspec_fontopts_clist,} + #1 + } + \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 -} + } \prg_new_conditional:Nnn \fontspec_if_detect_external:n {T} { \clist_map_inline:Nn \l_fontspec_extensions_clist @@ -432,230 +524,283 @@ } \bool_if:NTF \l_tmpa_bool \prg_return_true: \prg_return_false: } -\cs_set:Nn \fontspec_fullname:n { +\cs_set:Nn \fontspec_fullname:n + { \fontspec_namewrap:n { #1 \l_fontspec_extension_tl } \l_fontspec_renderer_tl \l_fontspec_optical_size_tl -} + } %% Now we have a unique (in fact, too unique!) string that contains -\prg_new_conditional:Nnn \fontspec_save_family:n {T} { +\prg_new_conditional:Nnn \fontspec_save_family:n {T} + { \cs_if_exist:cF {g_fontspec_UID_\l_fontspec_fontid_tl} - { - \cs_if_exist:cTF {g_fontspec_family_#1_int} { - \int_gincr:c {g_fontspec_family_#1_int} - }{ - \int_new:c {g_fontspec_family_#1_int} - } + { + \cs_if_exist:cTF {g_fontspec_family_#1_int} + { \int_gincr:c {g_fontspec_family_#1_int} } + { \int_new:c {g_fontspec_family_#1_int} } \tl_set:Nx \l_fontspec_tmp_tl {#1} \tl_remove_all:Nn \l_fontspec_tmp_tl {~} \tl_gset:cx {g_fontspec_UID_\l_fontspec_fontid_tl} - { - \l_fontspec_tmp_tl ( \int_use:c {g_fontspec_family_#1_int} ) - } - } + { + \l_fontspec_tmp_tl ( \int_use:c {g_fontspec_family_#1_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_set_scriptlang: { - \bool_if:NT \l_fontspec_firsttime_bool { - \tl_if_empty:NTF \l_fontspec_script_name_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_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_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} - } - } -} + } + } + } \cs_generate_variant:Nn \prop_gput:Nnn {cnV} \cs_generate_variant:Nn \prop_gput:Nnn {cnx} -\cs_new:Nn \fontspec_save_fontinfo:nn { - +\cs_new:Nn \fontspec_save_fontinfo:nn + { \prop_new:c {g_fontspec_ \l_fontspec_family_tl _prop} \prop_gput:cnx {g_fontspec_ \l_fontspec_family_tl _prop} {fontname} {#2} \prop_gput:cnx {g_fontspec_ \l_fontspec_family_tl _prop} {options} {\g_fontspec_default_fontopts_tl #1} - \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: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 - \tl_gset:cx {zf@family@fontname\l_fontspec_family_tl} {#2} - \tl_gset:cx {zf@family@options\l_fontspec_family_tl} {\g_fontspec_default_fontopts_tl #1} - \tl_gset:cx {zf@family@fontdef\l_fontspec_family_tl} { - \fontspec_fullname:n {\l_fontspec_fontname_tl} : - \l_fontspec_pre_feat_sclist \l_fontspec_rawfeatures_sclist - } - \tl_gset:cV {g_fontspec_script_num_(\l_fontspec_family_tl)_tl} \l_fontspec_script_int - \tl_gset:cV {g_fontspec_lang_num_(\l_fontspec_family_tl)_tl} \l_fontspec_language_int - \tl_gset_eq:cN {g_fontspec_script_(\l_fontspec_family_tl)_tl} \l_fontspec_script_tl - \tl_gset_eq:cN {g_fontspec_lang_(\l_fontspec_family_tl)_tl} \l_fontspec_lang_tl -} -\cs_new:Nn \fontspec_set_upright: { + \tl_gset:cx {zf@family@fontname\l_fontspec_family_tl} {#2} + \tl_gset:cx {zf@family@options\l_fontspec_family_tl} {\g_fontspec_default_fontopts_tl #1} + \tl_gset:cx {zf@family@fontdef\l_fontspec_family_tl} + { + \fontspec_fullname:n {\l_fontspec_fontname_tl} : + \l_fontspec_pre_feat_sclist \l_fontspec_rawfeatures_sclist + } + \tl_gset:cV {g_fontspec_script_num_(\l_fontspec_family_tl)_tl} \l_fontspec_script_int + \tl_gset:cV {g_fontspec_lang_num_(\l_fontspec_family_tl)_tl} \l_fontspec_language_int + \tl_gset_eq:cN {g_fontspec_script_(\l_fontspec_family_tl)_tl} \l_fontspec_script_tl + \tl_gset_eq:cN {g_fontspec_lang_(\l_fontspec_family_tl)_tl} \l_fontspec_lang_tl + } +\cs_new:Nn \fontspec_set_upright: + { \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_tl \mddefault \updefault \l_fontspec_fontfeat_up_clist -} -\cs_new:Nn \fontspec_set_bold: { - \bool_if:NF \l_fontspec_nobf_bool { - \tl_if_empty:NTF \l_fontspec_fontname_bf_tl { + } +\cs_new:Nn \fontspec_set_bold: + { + \bool_if:NF \l_fontspec_nobf_bool + { + \tl_if_empty:NTF \l_fontspec_fontname_bf_tl + { \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_tl {/B} \bfdefault \updefault \l_fontspec_fontfeat_bf_clist - }{ + } + { \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_bf_tl \bfdefault \updefault \l_fontspec_fontfeat_bf_clist - } - } -} -\cs_new:Nn \fontspec_set_italic: { - \bool_if:NF \l_fontspec_noit_bool { + } + } + } +\cs_new:Nn \fontspec_set_italic: + { + \bool_if:NF \l_fontspec_noit_bool + { \tl_if_empty:NTF \l_fontspec_fontname_it_tl - { \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_tl {/I} } - { \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_it_tl } - \mddefault \itdefault \l_fontspec_fontfeat_it_clist - } -} + { \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_tl {/I} } + { \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_it_tl } + \mddefault \itdefault \l_fontspec_fontfeat_it_clist + } + } \cs_new:Nn \fontspec_set_slanted: - { - \tl_if_empty:NF \l_fontspec_fontname_sl_tl - { - \fontspec_make_font_shapes:nnnn - \l_fontspec_fontname_sl_tl \mddefault \sldefault - \l_fontspec_fontfeat_sl_clist - } - } -\cs_new:Nn \fontspec_set_bold_italic: { - \bool_if:nF {\l_fontspec_noit_bool || \l_fontspec_nobf_bool} { + { + \tl_if_empty:NF \l_fontspec_fontname_sl_tl + { + \fontspec_make_font_shapes:nnnn + \l_fontspec_fontname_sl_tl \mddefault \sldefault + \l_fontspec_fontfeat_sl_clist + } + } +\cs_new:Nn \fontspec_set_bold_italic: + { + \bool_if:nF {\l_fontspec_noit_bool || \l_fontspec_nobf_bool} + { \tl_if_empty:NTF \l_fontspec_fontname_bfit_tl - { + { \tl_if_empty:NTF \l_fontspec_fontname_bf_tl - { + { \tl_if_empty:NTF \l_fontspec_fontname_it_tl - { + { \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_tl {/BI} - } - { + } + { \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_it_tl {/B} - } - } - { + } + } + { \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_bf_tl {/I} - } - } - { + } + } + { \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_bfit_tl - } + } \bfdefault \itdefault \l_fontspec_fontfeat_bfit_clist - } -} + } + } \cs_new:Nn \fontspec_set_bold_slanted: - { - \tl_if_empty:NTF \l_fontspec_fontname_bfsl_tl - { - \tl_if_empty:NF \l_fontspec_fontname_sl_tl { - \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_sl_tl {/B} - \bfdefault \sldefault \l_fontspec_fontfeat_bfsl_clist - } - }{ - \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_bfsl_tl - \bfdefault \sldefault \l_fontspec_fontfeat_bfsl_clist - } - } -\cs_new:Nn \fontspec_set_font_type: + { + \tl_if_empty:NTF \l_fontspec_fontname_bfsl_tl { - \bool_set_false:N \l_fontspec_tfm_bool - \bool_set_false:N \l_fontspec_atsui_bool - \bool_set_false:N \l_fontspec_icu_bool - \bool_set_false:N \l_fontspec_mm_bool - \bool_set_false:N \l_fontspec_graphite_bool - \ifcase\XeTeXfonttype\l_fontspec_font - \bool_set_true:N \l_fontspec_tfm_bool - \or - \bool_set_true:N \l_fontspec_atsui_bool - \ifnum\XeTeXcountvariations\l_fontspec_font > \c_zero - \bool_set_true:N \l_fontspec_mm_bool - \fi - \or - \bool_set_true:N \l_fontspec_icu_bool + \tl_if_empty:NF \l_fontspec_fontname_sl_tl + { + \fontspec_make_auto_font_shapes:nnnnn \l_fontspec_fontname_sl_tl {/B} + \bfdefault \sldefault \l_fontspec_fontfeat_bfsl_clist + } + } + { + \fontspec_make_font_shapes:nnnn \l_fontspec_fontname_bfsl_tl + \bfdefault \sldefault \l_fontspec_fontfeat_bfsl_clist + } + } +\cs_new:Nn \fontspec_set_font_type: + { + \bool_set_false:N \l_fontspec_tfm_bool + \bool_set_false:N \l_fontspec_atsui_bool + \bool_set_false:N \l_fontspec_icu_bool + \bool_set_false:N \l_fontspec_mm_bool + \bool_set_false:N \l_fontspec_graphite_bool + \ifcase\XeTeXfonttype\l_fontspec_font + \bool_set_true:N \l_fontspec_tfm_bool + \or + \bool_set_true:N \l_fontspec_atsui_bool + \ifnum\XeTeXcountvariations\l_fontspec_font > \c_zero + \bool_set_true:N \l_fontspec_mm_bool \fi - \tl_if_empty:NT \l_fontspec_renderer_tl { - \bool_if:NTF \l_fontspec_atsui_bool { - \tl_set:Nn \l_fontspec_renderer_tl {/AAT} - }{ - \bool_if:NT \l_fontspec_icu_bool { - \tl_set:Nn \l_fontspec_renderer_tl {/ICU} - } - } - } - } + \or + \bool_set_true:N \l_fontspec_icu_bool + \fi + \tl_if_empty:NT \l_fontspec_renderer_tl + { + \bool_if:NTF \l_fontspec_atsui_bool + { \tl_set:Nn \l_fontspec_renderer_tl {/AAT} } + { + \bool_if:NT \l_fontspec_icu_bool + { \tl_set:Nn \l_fontspec_renderer_tl {/ICU} } + } + } + } \cs_new:Nn \fontspec_make_auto_font_shapes:nnnnn - { - \bool_if:NF \l_fontspec_external_bool - { - \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:xxTF { \fontname \l_tmpa_font } { \fontname \l_tmpb_font } - { \fontspec_info:nx {no-font-shape} {#1#2} } - { \fontspec_make_font_shapes:nnnn {#1#2}{#3}{#4}{#5} } - } - } + { + \bool_if:NF \l_fontspec_external_bool + { + \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 } + { \fontspec_info:nx {no-font-shape} {#1#2} } + { \fontspec_make_font_shapes:nnnn {#1#2}{#3}{#4}{#5} } + } + } \cs_new:Nn \fontspec_make_font_shapes:nnnn { \group_begin: - \tl_set:Nx \l_fontspec_fontname_tl {#1} - \fontspec_font_set:Nnn \l_fontspec_font {\fontspec_fullname:n {#1}} {\f@size pt} - \font_if_null:NT \l_fontspec_font { \fontspec_error:nx {font-not-found} {#1} } - \fontspec_declare_shape:nnn {#2}{#3}{#4} - \tl_if_empty:NTF \l_fontspec_fontname_sc_tl { - \bool_if:NF \l_fontspec_nosc_bool { - \fontspec_make_smallcaps:T { + + \__fontspec_load_fontname:n {#1} + \fontspec_declare_shape:nnn {#2}{#3} + { \quark_if_no_value:NF \l__fontspec_fontopts_clist {\l__fontspec_fontopts_clist,} #4 } + + \tl_if_empty:NTF \l_fontspec_fontname_sc_tl + { + \bool_if:NF \l_fontspec_nosc_bool + { + \fontspec_make_smallcaps:T + { \fontspec_declare_shape:nnn {#2} { \tl_if_eq:NNTF #3 \itdefault \sidefault \scdefault } - { #4 , Letters=SmallCaps, \l_fontspec_fontfeat_sc_clist } - } - } - }{ - \fontspec_font_set:Nnn \l_fontspec_font {\fontspec_fullname:n {\l_fontspec_fontname_sc_tl}} {\f@size pt} - \tl_set:Nx \l_fontspec_fontname_tl {\l_fontspec_fontname_sc_tl} + { + \quark_if_no_value:NF \l__fontspec_fontopts_clist {\l__fontspec_fontopts_clist,} + #4 , Letters=SmallCaps , \l_fontspec_fontfeat_sc_clist + } + } + } + } + { + \__fontspec_load_fontname:n {\l_fontspec_fontname_sc_tl} \fontspec_declare_shape:nnn {#2} - { \tl_if_eq:NNTF #3 \itdefault \sidefault \scdefault } - { #4 , \l_fontspec_fontfeat_sc_clist } - } + { \tl_if_eq:NNTF #3 \itdefault \sidefault \scdefault } + { + \quark_if_no_value:NF \l__fontspec_fontopts_clist {\l__fontspec_fontopts_clist,} + #4 , \l_fontspec_fontfeat_sc_clist + } + } \group_end: -} -\cs_new:Nn \fontspec_declare_shape:nnn { + } +\cs_new:Nn \__fontspec_load_fontname:n + { + \tl_set:Nx \l_fontspec_fontname_tl {#1} + \__fontspec_load_external_fontoptions:N \l_fontspec_fontname_tl + \__fontspec_sanitise_fontname:Nn \l__fontspec_tmp_tl {\l_fontspec_fontname_tl} + \prop_get:NVN \g__fontspec_fontopts_prop \l__fontspec_tmp_tl \l__fontspec_fontopts_clist + \fontspec_font_set:Nnn \l_fontspec_font {\fontspec_fullname:n {\l_fontspec_fontname_tl}} {\f@size pt} + \font_if_null:NT \l_fontspec_font { \fontspec_error:nx {font-not-found} {#1} } + } +\cs_new:Nn \fontspec_declare_shape:nnn + { \clist_if_empty:NTF \l_fontspec_sizefeat_clist - { - \fontspec_get_features:n {#3} - \tl_set:Nx \l_fontspec_nfss_tl { + { \__fontspec_declare_shape_nosizing:n {#3} } + { \__fontspec_declare_shape_withsizing:n {#3} } + \use:x + { + \exp_not:N \DeclareFontShape {\g_fontspec_encoding_tl} {\l_fontspec_family_tl} + {#1} {#2} {\l_fontspec_nfss_tl}{\l_fontspec_postadjust_tl} + } + \__fontspec_declare_shape_slanted:nn {#1} {#2} + \__fontspec_declare_shape_loginfo:nnn {#1} {#2} {#3} + } +\cs_new:Nn \__fontspec_declare_shape_nosizing:n + { + \fontspec_get_features:n {#1} + \tl_set:Nx \l_fontspec_nfss_tl + { <-> \l_fontspec_scale_tl - \fontspec_fontwrap:n { + \fontspec_fontwrap:n + { \fontspec_fullname:n {\l_fontspec_fontname_tl} : \l_fontspec_pre_feat_sclist \l_fontspec_rawfeatures_sclist - } - } - } - { + } + } + } +\cs_new:Nn \__fontspec_declare_shape_withsizing:n + { \tl_clear:N \l_fontspec_nfss_tl - \clist_map_inline:Nn \l_fontspec_sizefeat_clist { + \clist_map_inline:Nn \l_fontspec_sizefeat_clist + { \tl_clear:N \l_fontspec_size_tl \tl_set_eq:NN \l_fontspec_sizedfont_tl \l_fontspec_fontname_tl @@ -664,35 +809,41 @@ \l_fontspec_keys_leftover_clist \tl_if_empty:NT \l_fontspec_size_tl { \fontspec_error:n {no-size-info} } - \fontspec_get_features:n{ #3 , \l_fontspec_keys_leftover_clist } + \fontspec_get_features:n { #1 , \l_fontspec_keys_leftover_clist } - \tl_put_right:Nx \l_fontspec_nfss_tl { + \tl_put_right:Nx \l_fontspec_nfss_tl + { <\l_fontspec_size_tl> \l_fontspec_scale_tl - \fontspec_fontwrap:n { + \fontspec_fontwrap:n + { \fontspec_fullname:n { \l_fontspec_sizedfont_tl } : \l_fontspec_pre_feat_sclist \l_fontspec_rawfeatures_sclist - } - } - - } - } - \use:x{ - \exp_not:N\DeclareFontShape{\g_fontspec_encoding_tl}{\l_fontspec_family_tl}{#1}{#2} - {\l_fontspec_nfss_tl}{\l_fontspec_postadjust_tl} - } - \bool_if:nT { - \str_if_eq_p:xx {#2} {\itdefault} && - !(\str_if_eq_p:xx {\itdefault} {\sldefault}) - } - { - \use:x { + } + } + } + } +\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}) + } + { + \use:x + { \exp_not:N \DeclareFontShape {\g_fontspec_encoding_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:nnn + { \tl_gput_right:Nx \l_fontspec_defined_shapes_tl - { \exp_not:n { \\ \\ } - *~ '\exp_not:N \prg_case_str:nnn {#1/#2} { + { + \exp_not:n { \\ \\ } + *~ '\exp_not:N \str_case:nnn {#1/#2} + { {\mddefault/\updefault} {normal} {\mddefault/\scdefault} {small~ caps} {\bfdefault/\updefault} {bold} @@ -701,42 +852,50 @@ {\mddefault/\sidefault} {italic~ small~ caps} {\bfdefault/\itdefault} {bold~ italic} {\bfdefault/\sidefault} {bold~ italic~ small~ caps} - } {#2/#3}'~ - with~ NFSS~ spec.: \exp_not:N \\ - \l_fontspec_nfss_tl - \tl_if_empty:NF \l_fontspec_postadjust_tl { - \exp_not:N \\ and~ font~ adjustment~ code: \exp_not:N \\ \l_fontspec_postadjust_tl - } - } -} + } {#2/#3}'~ + with~ NFSS~ spec.: \exp_not:N \\ + \l_fontspec_nfss_tl + \tl_if_empty:NF \l_fontspec_postadjust_tl + { + \exp_not:N \\ and~ font~ adjustment~ code: \exp_not:N \\ \l_fontspec_postadjust_tl + } + } + } \tl_set:Nn \l_fontspec_pre_feat_sclist - { - \bool_if:NT \l_fontspec_icu_bool { - \tl_if_empty:NF \l_fontspec_script_tl - { - script = \l_fontspec_script_tl ; - language = \l_fontspec_lang_tl ; - } - } - } -\cs_new:Nn \fontspec_update_fontid:n { - \bool_if:NT \l_fontspec_firsttime_bool { + { + \bool_if:NT \l_fontspec_icu_bool + { + \tl_if_empty:NF \l_fontspec_script_tl + { + script = \l_fontspec_script_tl ; + language = \l_fontspec_lang_tl ; + } + } + } +\cs_new:Nn \fontspec_update_fontid:n + { + \bool_if:NT \l_fontspec_firsttime_bool + { \tl_gput_right:Nx \l_fontspec_fontid_tl {#1} - } -} -\cs_set:Npn \fontspec_get_features:n #1 { + } + } +\cs_set:Nn \fontspec_get_features:n + { \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_clear:N \l_fontspec_postadjust_tl - \keys_set:nx {fontspec} {\l_fontspec_fontfeat_clist, #1} - \str_if_eq:xxF { \l_fontspec_hexcol_tl \l_fontspec_opacity_tl } - { \g_fontspec_hexcol_tl \g_fontspec_opacity_tl } + + \keys_set_known:nxN {fontspec-renderer} {\l_fontspec_fontfeat_clist,#1} + \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_clear:N \l_fontspec_fontname_bf_tl \tl_clear:N \l_fontspec_fontname_it_tl \tl_clear:N \l_fontspec_fake_slant_tl @@ -761,7 +920,8 @@ \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: { +\cs_set:Npn \fontspec_init: + { \bool_set_false:N \l_fontspec_icu_bool \bool_set_true:N \l_fontspec_firsttime_bool \cs_set:Npn \fontspec_namewrap:n ##1 @@ -769,381 +929,396 @@ \tl_clear:N \l_fontspec_optical_size_tl \tl_clear:N \l_fontspec_renderer_tl \tl_clear:N \l_fontspec_defined_shapes_tl -} -\cs_set:Nn \fontspec_make_ot_smallcaps:T { + } +\cs_set:Nn \fontspec_make_ot_smallcaps:T + { \fontspec_check_ot_feat:nT {+smcp} { #1 } -} + } \cs_set:Nn \fontspec_make_smallcaps:T - { - \bool_if:NTF \l_fontspec_icu_bool { - \fontspec_make_ot_smallcaps:T {#1} - }{ - \bool_if:NT \l_fontspec_atsui_bool { - \fontspec_make_AAT_feature_string:nnT {3}{3} { #1 } - } - } - } + { + \bool_if:NTF \l_fontspec_icu_bool + { \fontspec_make_ot_smallcaps:T {#1} } + { + \bool_if:NT \l_fontspec_atsui_bool + { \fontspec_make_AAT_feature_string:nnT {3}{3} { #1 } } + } + } \cs_set_eq:NN \sclist_clear:N \tl_clear:N -\cs_new:Nn \sclist_gput_right:Nn { - \tl_gput_right:Nn #1 {#2;} -} +\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 { +\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 - { - \bool_if:NTF \l_fontspec_icu_bool { - \fontspec_make_ICU_feature:n {#3} - }{ - \bool_if:NT \l_fontspec_atsui_bool { - \fontspec_make_AAT_feature:nn {#1}{#2} - } - } - } + { + \bool_if:NTF \l_fontspec_icu_bool + { \fontspec_make_ICU_feature:n {#3} } + { + \bool_if:NT \l_fontspec_atsui_bool + { \fontspec_make_AAT_feature:nn {#1}{#2} } + } + } \cs_generate_variant:Nn \fontspec_make_feature:nnn {nnx} -\cs_new:Nn \fontspec_make_AAT_feature:nn { +\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_fontid:n {+#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_ICU_feature:n { + { \fontspec_warning:n {aat-feature-not-exist} } + { + \fontspec_make_AAT_feature_string:nnTF {#1}{#2} + { + \fontspec_update_fontid:n {+#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_ICU_feature:n + { \tl_if_empty:nTF {#1} - { \fontspec_warning:n {icu-feature-not-exist} } - { - \fontspec_check_ot_feat:nTF {#1} - { - \fontspec_update_fontid:n {#1} - \fontspec_update_featstr:n{#1} - } - { \fontspec_warning:nx {icu-feature-not-exist-in-font} {#1} } - } -} + { \fontspec_warning:n {icu-feature-not-exist} } + { + \fontspec_check_ot_feat:nTF {#1} + { + \fontspec_update_fontid:n {#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_fontid:n {#1=#2} + { + \fontspec_check_ot_feat:nTF {#1} + { + \fontspec_update_fontid:n {#1=#2} \fontspec_update_featstr:n { #1 = #2 } - } - { \fontspec_warning:nx {icu-feature-not-exist-in-font} {#1} } - } + } + { \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 { +\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} { + } +\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} { + { + \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: } - { + { \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 { + } + { + \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: } - { + { \prg_return_false: } + { \tl_set:Nx \l_fontspec_feature_string_tl { \l_tmpa_tl = \l_tmpb_tl } \prg_return_true: - } - } -} -\cs_set:Npn \fontspec_iv_str_to_num:Nn #1#2 { + } + } + } +\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 { + } +\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:Npn \fontspec_v_str_to_num:Nn #1#2 { +\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} } -} + { + \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} - { - \fontspec_iv_str_to_num:Nn \l_fontspec_strnum_int {#1} - \int_set:Nn \l_tmpb_int { \XeTeXOTcountscripts\l_fontspec_font } - \int_zero:N \l_tmpa_int - \@tempswafalse - \bool_until_do:nn { \int_compare_p:nNn \l_tmpa_int = \l_tmpb_int } - { - \ifnum \XeTeXOTscripttag\l_fontspec_font \l_tmpa_int = \l_fontspec_strnum_int - \@tempswatrue - \int_set:Nn \l_tmpa_int {\l_tmpb_int} - \else - \int_incr:N \l_tmpa_int - \fi - } - \if@tempswa \prg_return_true: \else: \prg_return_false: \fi: - } + { + \fontspec_iv_str_to_num:Nn \l_fontspec_strnum_int {#1} + \int_set:Nn \l_tmpb_int { \XeTeXOTcountscripts \l_fontspec_font } + \int_zero:N \l_tmpa_int + \@tempswafalse + \bool_until_do:nn { \int_compare_p:nNn \l_tmpa_int = \l_tmpb_int } + { + \ifnum \XeTeXOTscripttag\l_fontspec_font \l_tmpa_int = \l_fontspec_strnum_int + \@tempswatrue + \int_set:Nn \l_tmpa_int {\l_tmpb_int} + \else + \int_incr:N \l_tmpa_int + \fi + } + \if@tempswa \prg_return_true: \else: \prg_return_false: \fi: + } \prg_new_conditional:Nnn \fontspec_check_lang:n {TF} - { - \fontspec_iv_str_to_num:Nn \l_fontspec_strnum_int {#1} - \int_set:Nn \l_tmpb_int { - \XeTeXOTcountlanguages \l_fontspec_font \l_fontspec_script_int - } - \int_zero:N \l_tmpa_int - \@tempswafalse - \bool_until_do:nn { \int_compare_p:nNn \l_tmpa_int = \l_tmpb_int } - { - \ifnum\XeTeXOTlanguagetag\l_fontspec_font\l_fontspec_script_int \l_tmpa_int =\l_fontspec_strnum_int - \@tempswatrue - \int_set:Nn \l_tmpa_int {\l_tmpb_int} - \else - \int_incr:N \l_tmpa_int - \fi - } - \if@tempswa \prg_return_true: \else: \prg_return_false: \fi: - } + { + \fontspec_iv_str_to_num:Nn \l_fontspec_strnum_int {#1} + \int_set:Nn \l_tmpb_int + { \XeTeXOTcountlanguages \l_fontspec_font \l_fontspec_script_int } + \int_zero:N \l_tmpa_int + \@tempswafalse + \bool_until_do:nn { \int_compare_p:nNn \l_tmpa_int = \l_tmpb_int } + { + \ifnum\XeTeXOTlanguagetag\l_fontspec_font\l_fontspec_script_int \l_tmpa_int =\l_fontspec_strnum_int + \@tempswatrue + \int_set:Nn \l_tmpa_int {\l_tmpb_int} + \else + \int_incr:N \l_tmpa_int + \fi + } + \if@tempswa \prg_return_true: \else: \prg_return_false: \fi: + } \prg_new_conditional:Nnn \fontspec_check_ot_feat:n {TF,T} + { + \int_set:Nn \l_tmpb_int { - \int_set:Nn \l_tmpb_int { - \XeTeXOTcountfeatures \l_fontspec_font - \l_fontspec_script_int - \l_fontspec_language_int - } - \fontspec_v_str_to_num:Nn \l_fontspec_strnum_int {#1} - \int_zero:N \l_tmpa_int - \@tempswafalse - \bool_until_do:nn { \int_compare_p:nNn \l_tmpa_int = \l_tmpb_int } - { - \ifnum\XeTeXOTfeaturetag\l_fontspec_font\l_fontspec_script_int\l_fontspec_language_int - \l_tmpa_int =\l_fontspec_strnum_int - \@tempswatrue - \int_set:Nn \l_tmpa_int {\l_tmpb_int} - \else - \int_incr:N \l_tmpa_int - \fi - } - \if@tempswa \prg_return_true: \else: \prg_return_false: \fi: - } + \XeTeXOTcountfeatures \l_fontspec_font + \l_fontspec_script_int + \l_fontspec_language_int + } + \fontspec_v_str_to_num:Nn \l_fontspec_strnum_int {#1} + \int_zero:N \l_tmpa_int + \@tempswafalse + \bool_until_do:nn { \int_compare_p:nNn \l_tmpa_int = \l_tmpb_int } + { + \ifnum\XeTeXOTfeaturetag\l_fontspec_font\l_fontspec_script_int\l_fontspec_language_int + \l_tmpa_int =\l_fontspec_strnum_int + \@tempswatrue + \int_set:Nn \l_tmpa_int {\l_tmpb_int} + \else + \int_incr:N \l_tmpa_int + \fi + } + \if@tempswa \prg_return_true: \else: \prg_return_false: \fi: + } +\cs_new:Nn \__fontspec_keys_define_code:nnn + { + \keys_define:nn {#1} { #2 .code:n = {#3} } + } \bool_new:N \l_fontspec_external_bool -\keys_define:nn {fontspec-preparse-external} { - ExternalLocation .code:n = { +\__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_gset:Npn \fontspec_namewrap:n ##1 - { [ #1 ##1 ] } - \keys_set:nn {fontspec-preparse} {Renderer=ICU} - } -} + { [ #1 ##1 ] } + \keys_set:nn {fontspec-renderer} {Renderer=ICU} + } \aliasfontfeature{ExternalLocation}{Path} -\keys_define:nn {fontspec-preparse-external} { - Extension .code:n = { +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Extension} + { \tl_set:Nn \l_fontspec_extension_tl {#1} - \bool_if:NF \l_fontspec_external_bool { + \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-preparse} { - Renderer .choice_code:n = { +\keys_define:nn {fontspec-renderer} + { + Renderer .choice_code:n = + { \fontspec_update_fontid:n {+rend:\l_keys_choice_tl} - \int_compare:nTF {\l_keys_choice_int < 3} { + \int_compare:nTF {\l_keys_choice_int <= 3} { \tl_set:Nv \l_fontspec_renderer_tl { g_fontspec_renderer_tag_ \l_keys_choice_tl } - }{ + } + { \fontspec_warning:nx {only-luatex-feature} {Renderer=Full/Basic} - } - } + } + } , Renderer .generate_choices:n = {AAT,ICU,Graphite,Full,Basic} -} + } \tl_set:cn {g_fontspec_renderer_tag_AAT} {/AAT} \tl_set:cn {g_fontspec_renderer_tag_ICU} {/ICU} \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} -\keys_define:nn {fontspec-preparse} { Script .code:n = { - \keys_set:nn {fontspec-preparse} {Renderer=ICU} +\__fontspec_keys_define_code:nnn {fontspec-preparse} {Script} + { + \keys_set:nn {fontspec-renderer} {Renderer=ICU} \tl_set:Nn \l_fontspec_script_name_tl {#1} \fontspec_update_fontid:n {+script:#1} - } -} -\keys_define:nn {fontspec-preparse} { Language .code:n = { - \keys_set:nn {fontspec-preparse} {Renderer=ICU} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {Language} + { + \keys_set:nn {fontspec-renderer} {Renderer=ICU} \tl_set:Nn \l_fontspec_lang_name_tl {#1} \fontspec_update_fontid:n {+language:#1} - } -} -\keys_define:nn {fontspec-preparse-external} { UprightFont .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {UprightFont} + { \fontspec_complete_fontname:Nn \l_fontspec_fontname_up_tl {#1} \fontspec_update_fontid:n {up:#1} - } -} -\keys_define:nn {fontspec-preparse-external} { BoldFont .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldFont} + { \tl_if_empty:nTF {#1} - { + { \bool_set_true:N \l_fontspec_nobf_bool \fontspec_update_fontid:n {nobf} - } - { + } + { \bool_set_false:N \l_fontspec_nobf_bool \fontspec_complete_fontname:Nn \l_fontspec_fontname_bf_tl {#1} \fontspec_update_fontid:n {bf:#1} - } - } -} -\keys_define:nn {fontspec-preparse-external} { ItalicFont .code:n = { + } + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {ItalicFont} + { \tl_if_empty:nTF {#1} - { + { \bool_set_true:N \l_fontspec_noit_bool \fontspec_update_fontid:n {noit} - }{ + } + { \bool_set_false:N \l_fontspec_noit_bool \fontspec_complete_fontname:Nn \l_fontspec_fontname_it_tl {#1} \fontspec_update_fontid:n {it:#1} - } - } -} -\keys_define:nn {fontspec-preparse-external} { BoldItalicFont .code:n = { + } + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldItalicFont} + { \fontspec_complete_fontname:Nn \l_fontspec_fontname_bfit_tl {#1} \fontspec_update_fontid:n {bfit:#1} - } -} -\keys_define:nn {fontspec-preparse-external} - { - SlantedFont .code:n = - { - \fontspec_complete_fontname:Nn \l_fontspec_fontname_sl_tl {#1} - \fontspec_update_fontid:n {sl:#1} - } - } -\keys_define:nn {fontspec-preparse-external} { BoldSlantedFont .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {SlantedFont} + { + \fontspec_complete_fontname:Nn \l_fontspec_fontname_sl_tl {#1} + \fontspec_update_fontid:n {sl:#1} + } +\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldSlantedFont} + { \fontspec_complete_fontname:Nn \l_fontspec_fontname_bfsl_tl {#1} \fontspec_update_fontid:n {bfsl:#1} - } -} -\keys_define:nn {fontspec} { SmallCapsFont .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFont} + { \tl_if_empty:nTF {#1} - { + { \bool_set_true:N \l_fontspec_nosc_bool \fontspec_update_fontid:n {nosc} - }{ + } + { \bool_set_true:N \l_fontspec_nosc_bool \fontspec_complete_fontname:Nn \l_fontspec_fontname_sc_tl {#1} \fontspec_update_fontid:n {sc:#1} - } - } -} -\cs_set:Npn \fontspec_complete_fontname:Nn #1#2 { + } + } +\cs_set:Nn \fontspec_complete_fontname:Nn + { \tl_set:Nn #1 {#2} \tl_replace_all:Nnx #1 {*} {\l_fontspec_fontname_tl} -} + } \cs_generate_variant:Nn \tl_replace_all:Nnn {Nnx} -\keys_define:nn {fontspec-preparse} { UprightFeatures .code:n = { +\__fontspec_keys_define_code:nnn {fontspec-preparse} {UprightFeatures} + { \tl_set:Nn \l_fontspec_fontfeat_up_clist { , #1} \fontspec_update_fontid:n {rmfeat:#1} - } -} -\keys_define:nn {fontspec-preparse} { BoldFeatures .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldFeatures} + { \tl_set:Nn \l_fontspec_fontfeat_bf_clist {, #1} \fontspec_update_fontid:n {bffeat:#1} - } -} -\keys_define:nn {fontspec-preparse} { ItalicFeatures .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {ItalicFeatures} + { \tl_set:Nn \l_fontspec_fontfeat_it_clist {, #1} \fontspec_update_fontid:n {itfeat:#1} - } -} -\keys_define:nn {fontspec-preparse} { BoldItalicFeatures .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldItalicFeatures} + { \tl_set:Nn \l_fontspec_fontfeat_bfit_clist {, #1} \fontspec_update_fontid:n {bfitfeat:#1} - } -} -\keys_define:nn {fontspec-preparse} { SlantedFeatures .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {SlantedFeatures} + { \tl_set:Nn \l_fontspec_fontfeat_sl_clist {, #1} \fontspec_update_fontid:n {slfeat:#1} - } -} -\keys_define:nn {fontspec-preparse} { BoldSlantedFeatures .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldSlantedFeatures} + { \tl_set:Nn \l_fontspec_fontfeat_bfsl_clist {, #1} \fontspec_update_fontid:n {bfslfeat:#1} - } -} -\keys_define:nn {fontspec} { SmallCapsFeatures .code:n = { - \bool_if:NF \l_fontspec_firsttime_bool { + } +\__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFeatures} + { + \bool_if:NF \l_fontspec_firsttime_bool + { \tl_set:Nn \l_fontspec_fontfeat_sc_clist {, #1} - } + } \fontspec_update_fontid:n {scfeat:#1} - } -} -\keys_define:nn {fontspec-preparse} { SizeFeatures .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec-preparse} {SizeFeatures} + { \tl_set:Nn \l_fontspec_sizefeat_clist {#1} \fontspec_update_fontid:n {sizefeat:#1} - } -} -\keys_define:nn {fontspec-sizing} - { - Size .code:n = - { - \tl_set:Nn \l_fontspec_size_tl {#1} - } - } -\keys_define:nn {fontspec-sizing} - { - Font .code:n = - { - \fontspec_complete_fontname:Nn \l_fontspec_sizedfont_tl {#1} - } - } -\keys_define:nn {fontspec} { Scale .code:n = { - \prg_case_str:nnn {#1} - { + } +\__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} {Scale} + { + \str_case:nnn {#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 {#1} } \fontspec_update_fontid:n {+scale:\l_fontspec_scale_tl} \tl_set:Nx \l_fontspec_scale_tl { s*[\l_fontspec_scale_tl] } - } -} -\cs_new:Nn \fontspec_calc_scale:n { + } +\cs_new:Nn \fontspec_calc_scale:n + { \group_begin: \rmfamily \fontspec_set_font_dimen:NnN \l_fontspec_tmpa_dim {#1} \font @@ -1154,229 +1329,246 @@ \tl_gset:Nx \l_fontspec_scale_tl { \fp_use:N \l_fontspec_tmpa_fp } \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 { + \dim_compare:nNnT #1 = {0pt} + { + \settoheight #1 + { \str_if_eq:nnTF {#3} {\font} \rmfamily #3 - \prg_case_int:nnn #2 { - {5} {x} % x-height - {8} {X} % cap-height - } {?} % "else" clause; never reached. - } - } -} -\keys_define:nn {fontspec} { WordSpace .code:n = { + \int_case:nnn #2 + { + {5} {x} % x-height + {8} {X} % cap-height + } {?} % "else" clause; never reached. + } + } + } +\__fontspec_keys_define_code:nnn {fontspec} {WordSpace} + { \fontspec_update_fontid:n {+wordspace:#1} - \bool_if:NF \l_fontspec_firsttime_bool { - \_fontspec_parse_wordspace:w #1,,,\q_stop - } - } -} -\cs_set:Npn \_fontspec_parse_wordspace:w #1,#2,#3,#4 \q_stop { + \bool_if:NF \l_fontspec_firsttime_bool + { \_fontspec_parse_wordspace:w #1,,,\q_stop } + } +\cs_set:Npn \_fontspec_parse_wordspace:w #1,#2,#3,#4 \q_stop + { \tl_if_empty:nTF {#4} - { - \tl_put_right:Nn \l_fontspec_postadjust_tl { + { + \tl_put_right:Nn \l_fontspec_postadjust_tl + { \fontdimen 2 \font = #1 \fontdimen 2 \font \fontdimen 3 \font = #1 \fontdimen 3 \font \fontdimen 4 \font = #1 \fontdimen 4 \font - } - }{ - \tl_put_right:Nn \l_fontspec_postadjust_tl { + } + } + { + \tl_put_right:Nn \l_fontspec_postadjust_tl + { \fontdimen 2 \font = #1 \fontdimen 2 \font \fontdimen 3 \font = #2 \fontdimen 3 \font \fontdimen 4 \font = #3 \fontdimen 4 \font - } - } -} -\keys_define:nn {fontspec} - { - PunctuationSpace .code:n = - { - \fontspec_update_fontid:n {+punctspace:#1} - \tl_put_right:Nx \l_fontspec_postadjust_tl - { \fontdimen 7 \font = #1 \fontdimen 7 \font } - } - } -\keys_define:nn {fontspec} { FontAdjustment .code:n = { + } + } + } +\__fontspec_keys_define_code:nnn {fontspec} {PunctuationSpace} + { + \fontspec_update_fontid:n {+punctspace:#1} + \tl_put_right:Nx \l_fontspec_postadjust_tl + { \fontdimen 7 \font = #1 \fontdimen 7 \font } + } +\__fontspec_keys_define_code:nnn {fontspec} {FontAdjustment} + { \fontspec_update_fontid:n {+fontadjust:\detokenize{#1}} \tl_put_right:Nx \l_fontspec_postadjust_tl {#1} - } -} -\keys_define:nn {fontspec} { LetterSpace .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec} {LetterSpace} + { \fontspec_update_fontid:n {+tracking:#1} \fontspec_update_featstr:n{letterspace=#1} - } -} -\keys_define:nn {fontspec} { HyphenChar .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec} {HyphenChar} + { \fontspec_update_fontid:n {+hyphenchar:#1} \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} } + { \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 = \l_fontspec_hyphenchar_tl \scan_stop: } - } - { \fontspec_error:nx {no-glyph}{#1} } - } - } -} -\keys_define:nn {fontspec} { Color .code:n = { + } + { \fontspec_error:nx {no-glyph}{#1} } + } + } +\__fontspec_keys_define_code:nnn {fontspec} {Color} + { \fontspec_update_fontid:n {+col:#1} \cs_if_exist:cTF { \token_to_str:N \color@ #1 } - { + { \convertcolorspec{named}{#1}{HTML}\l_fontspec_hexcol_tl - } - { + } + { \int_compare:nTF { \tl_length:n {#1} == 6 } - { \tl_set:Nn \l_fontspec_hexcol_tl {#1} } - { + { \tl_set:Nn \l_fontspec_hexcol_tl {#1} } + { \int_compare:nTF { \tl_length: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 { + { \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} - } + \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 -\keys_define:nn {fontspec} { Opacity .code:n = { +\__fontspec_keys_define_code:nnn {fontspec} {Opacity} + { \fontspec_update_fontid:n {+opac:#1} \int_set:Nn \l_fontspec_tmp_int {255} \_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} - } + \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_hexadecimal:n { \l_fontspec_tmp_int } } - } -} -\keys_define:nn {fontspec} -{ - Mapping .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec} {Mapping} + { \fontspec_update_fontid:n {+map:#1} \fontspec_update_featstr:n{mapping=#1} - } -} -\keys_define:nn {fontspec} { FeatureFile .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec} {FeatureFile} + { \fontspec_update_fontid:n {+fea:#1} \fontspec_update_featstr:n{featurefile=#1} - } -} -\keys_define:nn {fontspec} { Weight .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec} {Weight} + { \fontspec_update_fontid:n {+weight:#1} \fontspec_update_featstr:n{weight=#1} - } -} -\keys_define:nn {fontspec} { Width .code:n = { + } +\__fontspec_keys_define_code:nnn {fontspec} {Width} + { \fontspec_update_fontid:n {+width:#1} \fontspec_update_featstr:n{width=#1} - } -} -\keys_define:nn {fontspec} { OpticalSize .code:n = - { - \bool_if:NTF \l_fontspec_icu_bool { - \tl_set:Nn \l_fontspec_optical_size_tl {/ S = #1} + } +\__fontspec_keys_define_code:nnn {fontspec} {OpticalSize} + { + \bool_if:NTF \l_fontspec_icu_bool + { + \tl_set:Nn \l_fontspec_optical_size_tl {/ S = #1} + \fontspec_update_fontid:n {+size:#1} + } + { + \bool_if:NT \l_fontspec_mm_bool + { \fontspec_update_fontid:n {+size:#1} - }{ - \bool_if:NT \l_fontspec_mm_bool { - \fontspec_update_fontid:n {+size:#1} - \fontspec_update_featstr:n{optical size=#1} - } - } - \bool_if:nT { !\l_fontspec_icu_bool && !\l_fontspec_mm_bool }{ - \bool_if:NT \l_fontspec_firsttime_bool { - \fontspec_warning:n {no-opticals} - } - } - } -} -\keys_define:nn {fontspec} { FakeSlant .code:n = { - \fontspec_update_fontid:n {+slant:#1} - \fontspec_update_featstr:n{slant=#1} - }, + \fontspec_update_featstr:n{optical size=#1} + } + } + \bool_if:nT { !\l_fontspec_icu_bool && !\l_fontspec_mm_bool } + { + \bool_if:NT \l_fontspec_firsttime_bool + { \fontspec_warning:n {no-opticals} } + } + } +\keys_define:nn {fontspec} + { + FakeSlant .code:n = + { + \fontspec_update_fontid:n {+slant:#1} + \fontspec_update_featstr:n{slant=#1} + }, FakeSlant .default:n = {0.2} } -\keys_define:nn {fontspec} { FakeStretch .code:n = { - \fontspec_update_fontid:n {+extend:#1} - \fontspec_update_featstr:n{extend=#1} - }, +\keys_define:nn {fontspec} + { + FakeStretch .code:n = + { + \fontspec_update_fontid:n {+extend:#1} + \fontspec_update_featstr:n{extend=#1} + }, FakeStretch .default:n = {1.2} } -\keys_define:nn {fontspec} { FakeBold .code:n = { - \fontspec_update_fontid:n {+embolden:#1} - \fontspec_update_featstr:n{embolden=#1} - }, +\keys_define:nn {fontspec} + { + FakeBold .code:n = + { + \fontspec_update_fontid:n {+embolden:#1} + \fontspec_update_featstr:n{embolden=#1} + }, FakeBold .default:n = {1.5} -} -\keys_define:nn {fontspec} { AutoFakeSlant .code:n = { - \bool_if:NT \l_fontspec_firsttime_bool { - - \tl_set:Nn \l_fontspec_fake_slant_tl {#1} - \clist_put_right:Nn \l_fontspec_fontfeat_it_clist {FakeSlant=#1} - \tl_set_eq:NN \l_fontspec_fontname_it_tl \l_fontspec_fontname_tl - \bool_set_false:N \l_fontspec_noit_bool + } +\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 - \fontspec_update_fontid:n {fakeit:#1} + \fontspec_update_fontid:n {fakeit:#1} - \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 - } - } - }, + \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 +\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 - \fontspec_update_fontid:n {fakebf:#1} + \fontspec_update_fontid:n {fakebf:#1} - \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 - } - } - }, + \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} @@ -1405,12 +1597,13 @@ \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 = { + { + Ligatures / TeX .code:n = + { \fontspec_update_fontid:n {+map:tex-text} \fontspec_update_featstr:n{mapping=tex-text} - } -} + } + } \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} @@ -1431,9 +1624,10 @@ \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 { +\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} @@ -1480,59 +1674,61 @@ \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} } } - } - } + { + 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 } +\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} } } - } - } + { + 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 - } - } - } - } + { + \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 + } + } + } + } \keys_define:nn {fontspec} - { - ScriptStyle .code:n = { - \fontspec_update_fontid:n {+ssty=0} - \fontspec_update_featstr:n{+sstyle} - }, - ScriptScriptStyle .code:n = { - \fontspec_update_fontid:n {+ssty=1} - \fontspec_update_featstr:n{+ssstyle} - } - } + { + ScriptStyle .code:n = + { + \fontspec_update_fontid:n {+ssty=0} + \fontspec_update_featstr:n{+sstyle} + }, + ScriptScriptStyle .code:n = + { + \fontspec_update_fontid:n {+ssty=1} + \fontspec_update_featstr:n{+ssstyle} + } + } \fontspec_define_font_feature:n{Style} \fontspec_define_feature_option:nnnnn{Style}{Alternate} {} {} {+salt} \fontspec_define_feature_option:nnnnn{Style}{Italic} {32}{2}{+ital} @@ -1578,29 +1774,31 @@ \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 } - } - } + { + 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_icu_bool { - \fontspec_make_feature:nnn{}{}{+vrt2} - \fontspec_update_fontid:n {+vert} - \fontspec_update_featstr:n{vertical} - }{ - \fontspec_update_fontid:n {+vert} - \fontspec_update_featstr:n{vertical} - } - } - } + { + Vertical .choice: , + Vertical / RotatedGlyphs .code:n = + { + \bool_if:NTF \l_fontspec_icu_bool + { + \fontspec_make_feature:nnn{}{}{+vrt2} + \fontspec_update_fontid:n {+vert} + \fontspec_update_featstr:n{vertical} + } + { + \fontspec_update_fontid:n {+vert} + \fontspec_update_featstr:n{vertical} + } + } + } \newfontscript{Arabic}{arab} \newfontscript{Armenian}{armn} \newfontscript{Balinese}{bali} \newfontscript{Bengali}{beng} \newfontscript{Bopomofo}{bopo} \newfontscript{Braille}{brai} @@ -1839,86 +2037,93 @@ \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} - \fontspec_update_fontid:n {+lang=Turkish} - \tl_set:Nn \l_fontspec_lang_tl {TRK} - }{ - \fontspec_check_lang:nTF {TUR} { - \int_set:Nn \l_fontspec_language_int {\l_fontspec_strnum_int} - \fontspec_update_fontid:n {+lang=Turkish} - \tl_set:Nn \l_fontspec_lang_tl {TUR} - }{ - \fontspec_warning:nx {language-not-exist} {Turkish} - \keys_set:nn {fontspec} {Language=Default} - } - } - } - } -\keys_define:nn {fontspec} - { - Language / Default .code:n = - { - \fontspec_update_fontid:n {+lang=dflt} - \tl_set:Nn \l_fontspec_lang_tl {DFLT} - \int_zero:N \l_fontspec_language_int - } - } -\keys_define:nn {fontspec} - { - RawFeature .code:n = - { - \fontspec_update_fontid:n {+Raw:#1} - \fontspec_update_featstr:n{#1} - } - } + { + Language / Turkish .code:n = + { + \fontspec_check_lang:nTF {TRK} + { + \int_set:Nn \l_fontspec_language_int {\l_fontspec_strnum_int} + \fontspec_update_fontid:n {+lang=Turkish} + \tl_set:Nn \l_fontspec_lang_tl {TRK} + } + { + \fontspec_check_lang:nTF {TUR} + { + \int_set:Nn \l_fontspec_language_int {\l_fontspec_strnum_int} + \fontspec_update_fontid:n {+lang=Turkish} + \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 } + { + \fontspec_update_fontid:n {+lang=dflt} + \tl_set:Nn \l_fontspec_lang_tl {DFLT} + \int_zero:N \l_fontspec_language_int + } +\__fontspec_keys_define_code:nnn {fontspec} {RawFeature} + { + \fontspec_update_fontid:n {+Raw:#1} + \fontspec_update_featstr:n{#1} + } \providecommand*{\sidefault}{si} -\DeclareRobustCommand{\sishape}{ +\DeclareRobustCommand{\sishape} + { \not@math@alphabet\sishape\relax \fontshape\sidefault\selectfont -} + } \DeclareTextFontCommand{\textsi}{\sishape} -\cs_new:Nn \fontspec_blend_shape:nnn { +\cs_new:Nn \fontspec_blend_shape:nnn + { \bool_if:nTF - { - \str_if_eq_p:xx {\f@shape} {#2} && + { + \str_if_eq_x_p:nn {\f@shape} {#2} && \cs_if_exist_p:c {\f@encoding/\f@family/\f@series/#3} - } - { \fontshape{#3}\selectfont } - { \fontshape{#1}\selectfont } -} -\DeclareRobustCommand \itshape { + } + { \fontshape{#3}\selectfont } + { \fontshape{#1}\selectfont } + } +\DeclareRobustCommand \itshape + { \not@math@alphabet\itshape\mathit \fontspec_blend_shape:nnn\itdefault\scdefault\sidefault -} -\DeclareRobustCommand \slshape { + } +\DeclareRobustCommand \slshape + { \not@math@alphabet\slshape\relax \fontspec_blend_shape:nnn\sldefault\scdefault\sidefault -} -\DeclareRobustCommand \scshape { + } +\DeclareRobustCommand \scshape + { \not@math@alphabet\scshape\relax \fontspec_blend_shape:nnn\scdefault\itdefault\sidefault -} -\DeclareRobustCommand \upshape { + } +\DeclareRobustCommand \upshape + { \not@math@alphabet\upshape\relax \fontspec_blend_shape:nnn\updefault\sidefault\scdefault -} -\@ifpackageloaded{euler}{ + } +\@ifpackageloaded{euler} + { \bool_set_true:N \g_fontspec_package_euler_loaded_bool -}{ + } + { \bool_set_false:N \g_fontspec_package_euler_loaded_bool -} -\cs_set:Nn \fontspec_setup_maths: { - \@ifpackageloaded{euler}{ - \bool_if:NTF \g_fontspec_package_euler_loaded_bool { - \bool_set_true:N \g_fontspec_math_euler_bool - }{ - \fontspec_error:n {euler-too-late} - } - }{} + } +\cs_set:Nn \fontspec_setup_maths: + { + \@ifpackageloaded{euler} + { + \bool_if:NTF \g_fontspec_package_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}{} @@ -1940,12 +2145,14 @@ \DeclareMathSymbol{\colon}{\mathpunct}{legacymaths}{58} \fi \group_end: - \bool_if:NF \g_fontspec_math_euler_bool { + \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 { + \bool_if:NF \g_fontspec_math_lucida_bool + { \DeclareMathSymbol{0}{\mathalpha}{legacymaths}{`0} \DeclareMathSymbol{1}{\mathalpha}{legacymaths}{`1} \DeclareMathSymbol{2}{\mathalpha}{legacymaths}{`2} @@ -1985,20 +2192,25 @@ \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 { + \tl_if_empty:NTF \g_fontspec_bfmathrm_tl + { \SetMathAlphabet\mathrm{bold}\g_fontspec_encoding_tl\g_fontspec_mathrm_tl\bfdefault\updefault \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}{} + } +\cs_new:Nn \fontspec_maybe_setup_maths: + { + \@ifpackageloaded{anttor} + { + \ifx\define@antt@mathversions a\bool_set_false:N \g_fontspec_math_bool\fi + }{} \@ifpackageloaded{arev}{\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}{} @@ -2007,12 +2219,16 @@ \@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{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{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}{} @@ -2021,24 +2237,26 @@ \@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 { + \bool_if:NT \g_fontspec_math_bool + { \fontspec_info:n {setup-math} \fontspec_setup_maths: - } -} + } + } \AtBeginDocument{\fontspec_maybe_setup_maths:} -\bool_if:NT \g_fontspec_cfg_bool { +\bool_if:NT \g_fontspec_cfg_bool + { \InputIfFileExists{fontspec.cfg} {} {\typeout{No~ fontspec.cfg~ file~ found;~ no~ configuration~ loaded.}} -} + } \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 } - } + { + \fontspec_select:nn {#1} {#2} + \tl_set:Nn \zf@family { \l_fontspec_family_tl } + \tl_set:Nn \zf@basefont { \l_fontspec_font } + } \ExplSyntaxOff %% %% Copyright 2004--2012 Will Robertson <wspr81@gmail.com> diff --git a/Master/texmf-dist/tex/latex/fontspec/fontspec.lua b/Master/texmf-dist/tex/latex/fontspec/fontspec.lua index 06be52164de..04f3de54d22 100644 --- a/Master/texmf-dist/tex/latex/fontspec/fontspec.lua +++ b/Master/texmf-dist/tex/latex/fontspec/fontspec.lua @@ -73,7 +73,7 @@ end local function check_feature(id, feature, language, script) local s = string.lower(script) local l = string.lower(language) - local f = string.lower(feature:gsub("^[+-]", "")) + local f = string.lower(feature:gsub("^[+-]", ""):gsub("=.*$", "")) if id and id > 0 then local otfdata = fonts.identifiers[id].shared.otfdata if otfdata then diff --git a/Master/texmf-dist/tex/latex/fontspec/fontspec.sty b/Master/texmf-dist/tex/latex/fontspec/fontspec.sty index 8d9eae77f22..97b0bf750a5 100644 --- a/Master/texmf-dist/tex/latex/fontspec/fontspec.sty +++ b/Master/texmf-dist/tex/latex/fontspec/fontspec.sty @@ -14,28 +14,31 @@ %% %% \ProvidesPackage{fontspec} - [2012/05/06 v2.2b Advanced font selection for XeLaTeX/LuaLaTeX] + [2013/02/25 v2.3 Font selection for XeLaTeX and LuaLaTeX] \RequirePackage{expl3}[2011/09/05] \RequirePackage{xparse} \ExplSyntaxOn \msg_new:nnn {fontspec} {cannot-use-pdftex} -{ + { The~ fontspec~ package~ requires~ either~ XeTeX~ or~ LuaTeX~ to~ function. \\\\ You~ must~ change~ your~ typesetting~ engine~ to,~ e.g.,~ "xelatex"~ or~ "lualatex"\\ instead~ of~ plain~ "latex"~ or~ "pdflatex". -} -\xetex_if_engine:F { - \luatex_if_engine:TF { + } +\xetex_if_engine:F + { + \luatex_if_engine:TF + { \RequirePackage{luaotfload} \RequireLuaModule{fontspec} - }{ + } + { \msg_fatal:nn {fontspec} {cannot-use-pdftex} - } -} + } + } \bool_new:N \l_fontspec_firsttime_bool \bool_new:N \l_fontspec_nobf_bool \bool_new:N \l_fontspec_noit_bool @@ -80,189 +83,190 @@ \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~ <return>~ 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:nnn {fontspec} {addfontfeatures-ignored} -{ + { \string\addfontfeature (s)~ ignored;~ it~ cannot~ be~ used~ with~ a~ font~ that~ wasn't~ selected~ by~ fontspec. -} + } \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~ ICU~ 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~ [\g_fontspec_default_fontopts_tl #1].\\ \\ This~ font~ family~ consists~ of~ the~ following~ 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{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{quiet}{ +\DeclareOption{quiet} + { \msg_redirect_module:nnn { fontspec } { warning } { info } \msg_redirect_module:nnn { fontspec } { info } { none } -} -\DeclareOption{silent}{ + } +\DeclareOption{silent} + { \msg_redirect_module:nnn { fontspec } { warning } { none } \msg_redirect_module:nnn { fontspec } { info } { none } -} + } \ExecuteOptions{config,math} \ProcessOptions* \RequirePackage{fontspec-patches} |