diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty | 1205 |
1 files changed, 580 insertions, 625 deletions
diff --git a/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty b/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty index 353a6442723..2e0ff2d59ec 100644 --- a/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty +++ b/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty @@ -1,43 +1,51 @@ \NeedsTeXFormat{LaTeX2e} \ProvidesExplPackage - {polyglossia} {2023/12/11} {v1.66} + {polyglossia} {2024/02/17} {v2.0} {Modern multilingual typesetting with XeLaTeX and LuaLaTeX} + \RequirePackage{etoolbox} \RequirePackage{xkeyval}[2008/08/13] % Will raise error if used with anything else than XeTeX or LuaTeX \RequirePackage{fontspec}[2010/06/08]% v2.0 \RequirePackage{iftex} -% Execute code #3 if package #1 has been loaded already, else -% add to package hook #2 -\cs_new_nopar:Nn \__xpg_at_package_hook:nnn{ - \@ifpackageloaded{#1}{#3}{\AddToHook{#2}{#3}}% -} - \prg_generate_conditional_variant:Nnn \clist_if_in:Nn {Ne} {TF, T, F} % check if needed + % correct a bug in tracklang -\__xpg_at_package_hook:nnn{tracklang}{file/tracklang.sty/after}{% - \@ifpackagelater{tracklang}{2019/08/30}{}{\global\def\AddTrackedLangage{\AddTrackedLanguage}} +\AddToHook{package/tracklang/after}{% + \IfPackageAtLeastTF{tracklang}{2019/08/30} + {} + {\cs_gset_eq:NN \AddTrackedLangage \AddTrackedLanguage} } -%% This is for compatibility with Babel-aware package: -\def\languageshorthands#1{\relax} % this is for scrlttr2 class -\def\bbl@cs#1{\csname bbl@#1\endcsname} +%% The following is for compatibility with Babel-aware package: +% \languageshorthands is provided by babelsh.def, which is +% only loaded by some glosses, but some classes presuppose +% it is there generally. So let's provide a stub: +\ProvideDocumentCommand \languageshorthands { m } {} +% These have to be provided at the end of the preamble \AddToHook{begindocument/before}{ - \let\bbl@set@language\xpg@set@language@aux % for biblatex - \let\bbl@main@language\xpg@main@language % for biblatex - \providecommand\texorpdfstring[2]{#1} % dummy command if hyperref is not loaded + \cs_gset_eq:NN \bbl@set@language \xpg@set@language@aux % for biblatex + \cs_gset_eq:NN \bbl@main@language \xpg@main@language % for biblatex + \ProvideDocumentCommand \texorpdfstring { m m } { #1 } % dummy command if hyperref is not loaded } -\sys_if_engine_luatex:T{ - \RequirePackage{luatexbase} % already included by fontspec, but needed here - \RequireLuaModule{polyglossia} -} +%% when no patterns are available, we use \l@nohyphenation, assigned to 255 +%% (suggestion by Enrico Gregorio) +%% \l@nohyphenation is defined in polyglossia.lua +\sys_if_engine_luatex:TF + { + \RequirePackage{luatexbase} % already included by fontspec, but needed here + \RequireLuaModule{polyglossia} + }{ + \cs_if_free:cT { l@nohyphenation } + { \chardef\l@nohyphenation=255 } + } % Which version of XeTeX do we use? What is the boudary class? 4095 or 255 -\@ifundefined{e@alloc@intercharclass@top} - {\chardef\xpg@boundaryclass=\@cclv} - {\let\xpg@boundaryclass=\e@alloc@intercharclass@top} +\cs_if_exist:cTF { e@alloc@intercharclass@top } + { \let\xpg@boundaryclass=\e@alloc@intercharclass@top } + { \chardef\xpg@boundaryclass=\@cclv } % Useful for getting list of loaded languages and variants. Like babel's bbl@loaded % all language loaded @@ -51,17 +59,26 @@ % list of loaded languages (bcp-47 id) \clist_new:N \xpg@bcp@loaded -% counter in latin -\def\latinalph#1{\expandafter\latin@alph\csname c@#1\endcsname} -\def\latinAlph#1{\expandafter\latin@Alph\csname c@#1\endcsname} +% output counter as lower-case latin letter +\DeclareExpandableDocumentCommand \latinalph { m } +{ + \exp_args:Nc \latin@alph {c@#1} +} +% output counter as upper-case latin letter +\DeclareExpandableDocumentCommand \latinAlph { m } +{ + \exp_args:Nc \latin@Alph {c@#1} +} +%% Internal hooks % select language hook -\cs_new_nopar:Nn \polyglossia@AtBeginDocument@selectlanguage: {} +\cs_new_nopar:Nn \__xpg_at_begin_document_selectlanguage: {} % \disablehyphenation hook -\cs_new_nopar:Nn \polyglossia@AtBeginDocument@hyphenation: {} +\cs_new_nopar:Nn \__xpg_at_begin_document_hyphenation: {} % hook to be executed at begin of document -\cs_new_nopar:Nn \polyglossia@AtBeginDocument: { +\cs_new_nopar:Nn \__xpg_at_begin_document: +{ % save various command \let\latin@alph\@alph % TODO rename when we have the C locale \let\latin@Alph\@Alph % TODO rename when we have the C locale @@ -69,22 +86,25 @@ \let\polyglossia@Clang@@arabic\@arabic \let\polyglossia@Clang@arabic\arabic - \xpg@initial@setup + \xpg_initial_setup: % apply \familydefault changes \xpg@set@familydefault } -\AtBeginDocument{ - \polyglossia@AtBeginDocument: +\AddToHook{begindocument}{ + \__xpg_at_begin_document: } % The following needs to go after any \AtBeginDocument (also of packages % loaded after \set[main|other]language -\AfterEndPreamble{ +% Track whether the main language has been set +\bool_new:N \g_xpg_main_lang_set_bool +\AddToHook{begindocument/end}{ % now we have the C locale definition: select the language - \polyglossia@AtBeginDocument@selectlanguage: + \__xpg_at_begin_document_selectlanguage: + \bool_gset_true:N \g_xpg_main_lang_set_bool % If hyphenation disabling has been requested in preamble, do it now - \polyglossia@AtBeginDocument@hyphenation: + \__xpg_at_begin_document_hyphenation: } %% custom message macros @@ -117,7 +137,7 @@ \xpg@warning{Illegal~ value~ (#1)~ for~ #2}} % error out if lang is not loaded -\cs_new_nopar:Nn \polyglossia@error@iflangnotloaded:n +\cs_new_nopar:Nn \xpg_error_if_lang_not_loaded:n { \seq_if_in:NeF \__xpg_langs_loaded {#1} { @@ -137,7 +157,16 @@ } \msg_redirect_name:nnn { polyglossia } { languagenolongerloaded } { warning } -% +\msg_new:nnn { polyglossia } { unknownlocalnumeral } +{ + Unknown~ key~ "#1"~ in~ \string\localnumeral. +} + +\msg_new:nnn { polyglossia } { localnumeralemptyvalue } +{ + Keys~ of~ \string\localnumeral~ must~ have~ value. +} + %% use macro if defined, else warn that it is not \cs_new_nopar:Nn \__xpg_use_or_warn:N @@ -155,12 +184,12 @@ \def\@@ensure@maindir#1{\ifcsundef{@ensure@maindir}{#1}{\@ensure@maindir{#1}}} %% Used by the language definitions files for right-to-left languages -\def\RequireBidi - { +\NewDocumentCommand \RequireBidi {} +{ \sys_if_engine_luatex:TF {\ifx\@onlypreamble\@notprerr\else\RequirePackage{luabidi}\fi} {\ifx\@onlypreamble\@notprerr\else\RequirePackage{bidi}\fi} - } +} % if #1 is LR run #2 else #3 \prg_set_conditional:Nnn \__xpg_if_LR_str:n {p, T, F, TF} @@ -179,20 +208,23 @@ % (lua)bidi commands to change directionality for paragraphs % and inline text. % overwritten with correct package -\cs_new_nopar:Nn{\polyglossia@setpardirection:n}{ +\cs_new_nopar:Nn \__xpg_set_par_direction:n +{ \__xpg_if_LR_str:nF {#1} { \xpg@error{right-to-left,~ but~ (lua)bidi~ package~ was~ not~ loaded!} } } -\cs_new_nopar:Nn{\polyglossia@settextdirection:n}{ +\cs_new_nopar:Nn \__xpg_set_text_direction:n +{ \__xpg_if_LR_str:nF {#1} { \xpg@error{right-to-left,~ but~ (lua)bidi~ package~ was~ not~ loaded!} } } -\__xpg_at_package_hook:nnn{bidi}{package/bidi/after}{ - \cs_gset_nopar:Nn{\polyglossia@setpardirection:n}{ +\AddToHook{package/bidi/after}{ + \cs_gset_nopar:Nn \__xpg_set_par_direction:n + { \__xpg_if_LR_str:nTF{#1} { \setLR @@ -201,7 +233,8 @@ \setRL } } - \cs_gset_nopar:Nn{\polyglossia@settextdirection:n}{ + \cs_gset_nopar:Nn \__xpg_set_text_direction:n + { \__xpg_if_LR_str:nTF{#1} { \LRE @@ -211,8 +244,9 @@ } } } -\__xpg_at_package_hook:nnn{luabidi}{package/luabidi/after}{ - \cs_gset_nopar:Nn{\polyglossia@setpardirection:n}{ +\AddToHook{package/luabidi/after}{ + \cs_gset_nopar:Nn \__xpg_set_par_direction:n + { \__xpg_if_LR_str:nTF{#1} { \setLR @@ -221,7 +255,8 @@ \setRL } } - \cs_gset_nopar:Nn{\polyglossia@settextdirection:n}{ + \cs_gset_nopar:Nn \__xpg_set_text_direction:n + { \__xpg_if_LR_str:nTF{#1} { \LRE @@ -256,18 +291,17 @@ %% TODO: localalph = {<alph_csname>,<Alph_csname>} %% TODO: localnumeral = <csname> %% or even better localdigits = {0123456789} for fully automatic setup -\newif\if@xpg@language@really@defined@ \newcommand*\PolyglossiaSetup[2]{ - \polyglossia@keys_define_lang:n{#1} + \__xpg_keys_define_lang:n{#1} \keys_set:nn { polyglossia / #1 } { #2 } - \polyglossia_setup_hyphen:n {#1} + \__xpg_setup_hyphen:n {#1} %define booleans etoolbox style and set defaults %% TODO ? \providetoggle{#1@setup@done}% % we initialize these so that we can use \gappto below \csgdef{init@extras@#1}{} \csgdef{init@noextras@#1}{} % we don't use this yet: remove? % here we do the fontsetup: - \xpg__auto_setupfont:n { #1 } + \__xpg_auto_setupfont:n { #1 } %% TODO? \toggletrue{#1@setup@done} % register base alias \xpg_language_alias { #1 } { #1 } @@ -286,15 +320,16 @@ % setup hyphennames from a str list of hyphen -\cs_new:Nn \polyglossia_setup_hyphen:n { - \clist_set:Ne{\l_tmpa_clist}{\prop_item:Nn \polyglossia@langsetup {#1 / hyphennames}} +\cs_new:Nn \__xpg_setup_hyphen:n +{ + \clist_set:Ne{\l_tmpa_clist}{\prop_item:Nn \g_xpg_langsetup_prop {#1 / hyphennames}} \providebool{havehyphen} \boolfalse{havehyphen} % for each hyphen in the set until we find one that works \clist_map_inline:Nn \l_tmpa_clist { \ifbool{havehyphen}{}{ % check if language hyphenname is defined - \__xpg_check_if_exist_l@:NF{#1}{ + \__xpg_check_if_exist_l@:nF{#1}{ % if not, first consider nohyphenation \str_if_eq:nnTF{##1}{nohyphenation} { @@ -331,7 +366,7 @@ } % setup hyphenmins \clist_set:Ne \l_tmpa_clist - { \prop_item:Nn \polyglossia@langsetup {#1 / hyphenmins} } + { \prop_item:Nn \g_xpg_langsetup_prop {#1 / hyphenmins} } \cs_if_eq:cNF {l@#1} \l@nohyphenation { \use:x @@ -344,8 +379,9 @@ } \newcommand*\polyglossia@setup@language@patterns[1]{ - \ifbool{xpg@hyphenation@disabled}{ - \xdef\xpg@lastlanguage{\the\csname l@#1\endcsname} + \bool_if:NTF \g__xpg_hyphenation_disabled_bool + { + \tl_gset:Ne \g__xpg_lastlanguage_tl {\the\csname l@#1\endcsname} }{ % first, test if \l@#1 exists % without that, \csname l@#1\endcsname will be defined as \relax @@ -372,15 +408,16 @@ } } -\prop_new:N \polyglossia@langsetup +\prop_new:N \g_xpg_langsetup_prop -\cs_new_protected:Npn \polyglossia@keys_define_lang:n #1 { +\cs_new_protected:Npn \__xpg_keys_define_lang:n #1 +{ \keys_define:nn {polyglossia}{ % the script font #1 / script .code:n = { - \prop_gput:Nnn{\polyglossia@langsetup}{#1/script}{##1} - \prop_gput:Nne{\polyglossia@langsetup}{#1/lcscript} + \prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/script}{##1} + \prop_gput:Nne{\g_xpg_langsetup_prop}{#1/lcscript} {\tl_if_empty:nF{##1}{\str_lowercase:n{##1}}} }, #1 / script @@ -389,84 +426,84 @@ .initial:n = latin, % the opentype script tag #1 / scripttag - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/scripttag}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/scripttag}{##1}}, #1 / scripttag .default:n = {}, #1 / scripttag .initial:n = {}, % the language full name #1 / language - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/language}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/language}{##1}}, #1 / language .value_required:n = true, #1 / language .initial:x = {\str_uppercase:n#1}, % the language tag #1 / langtag - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/langtag}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/langtag}{##1}}, #1 / langtag .value_required:n = true, #1 / langtag .initial:n = {}, % the BCP-47 tag #1 / bcp47 - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/bcp47}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/bcp47}{##1}}, #1 / bcp47 .value_required:n = true, #1 / bcp47 .initial:n = {}, % the BCP-47 language tag #1 / bcp47-language - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/bcp47-language}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/bcp47-language}{##1}}, #1 / bcp47-language .value_required:n = true, #1 / bcp47-language .initial:n = {}, % the BCP-47 region tag #1 / bcp47-region - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/bcp47-region}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/bcp47-region}{##1}}, #1 / bcp47-region .value_required:n = false, #1 / bcp47-region .initial:n = {}, % the BCP-47 script tag #1 / bcp47-script - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/bcp47-script}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/bcp47-script}{##1}}, #1 / bcp47-script .value_required:n = true, #1 / bcp47-script .initial:n = {}, % the BCP-47 variant tag #1 / bcp47-variant - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/bcp47-variant}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/bcp47-variant}{##1}}, #1 / bcp47-variant .value_required:n = false, #1 / bcp47-variant .initial:n = {}, % the BCP-47 extension-t tag #1 / bcp47-extension-t - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/bcp47-extension-t}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/bcp47-extension-t}{##1}}, #1 / bcp47-extension-t .value_required:n = false, #1 / bcp47-extension-t .initial:n = {}, % the BCP-47 extension-u tag #1 / bcp47-extension-u - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/bcp47-extension-u}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/bcp47-extension-u}{##1}}, #1 / bcp47-extension-u .value_required:n = false, #1 / bcp47-extension-u .initial:n = {}, % the BCP-47 extension-x tag #1 / bcp47-extension-x - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/bcp47-extension-x}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/bcp47-extension-x}{##1}}, #1 / bcp47-extension-x .value_required:n = false, #1 / bcp47-extension-x .initial:n = {}, % the BCP-47 casing alias #1 / bcp47-casing - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/bcp47-casing}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/bcp47-casing}{##1}}, #1 / bcp47-casing .value_required:n = false, #1 / bcp47-casing @@ -475,7 +512,7 @@ #1 / hyphennames .code:n = { \clist_set:Nn{\l_tmpa_clist}{##1} - \prop_gput:Nne{\polyglossia@langsetup}{#1/hyphennames}{\clist_use:Nn \l_tmpa_clist {,}} + \prop_gput:Nne{\g_xpg_langsetup_prop}{#1/hyphennames}{\clist_use:Nn \l_tmpa_clist {,}} }, #1 / hyphennames .value_required:n = true, @@ -488,7 +525,7 @@ {LR}{} {RL}{\RequireBidi} } - {\prop_gput:Nnn{\polyglossia@langsetup}{#1/direction}{##1}} + {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/direction}{##1}} {\xpg@error{Unknown~ direction~ "##1"~ for~ language~ "#1"}} }, #1 / direction @@ -502,7 +539,7 @@ \int_compare:nNnF { \clist_count:n {##1} } = {2} {\xpg@error{hypenmins~should~be~a~list~of~two~entries,~got~"##1"}} % set prop - \prop_gput:Nnn \polyglossia@langsetup {#1/hyphenmins} {##1} + \prop_gput:Nnn \g_xpg_langsetup_prop {#1/hyphenmins} {##1} }, #1 / hyphenmins .value_required:n = true, @@ -515,7 +552,7 @@ \int_compare:nNnF { \clist_count:n {##1} } = {1} {\xpg@error{totalhyphenhypenmin~should~be~a~single~entry,~got~"##1"}} % set prop - \prop_gput:Nnn \polyglossia@langsetup {#1/totalhyphenmin} {##1} + \prop_gput:Nnn \g_xpg_langsetup_prop {#1/totalhyphenmin} {##1} }, #1 / totalhyphenmin .value_required:n = false, @@ -534,35 +571,35 @@ % environment name #1 / envname .code:n = { - \prop_gput:Nnn{\polyglossia@langsetup}{#1/envname}{##1} + \prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/envname}{##1} }, #1/ envname.value_required:n = true, #1/ envname.initial:n = {#1}, % babel name #1 / babelname .code:n = { - \prop_gput:Nnn{\polyglossia@langsetup}{#1/babelname}{##1} + \prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/babelname}{##1} }, #1/ babelname.value_required:n = true, #1/ babelname.initial:n = {#1}, % default numerals #1 / localnumeral . code:n = { - \prop_gput:Nnn{\polyglossia@langsetup}{#1/localnumeral}{##1} - \prop_gput:Nnn{\polyglossia@langsetup}{#1/Localnumeral}{##1} + \prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/localnumeral}{##1} + \prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/Localnumeral}{##1} }, #1 / localnumeral.value_required:n = true, #1 / localnumeral.initial:n = {polyglossia@C@localnumeral}, % uppercased #1 / Localnumeral . code:n = { - \prop_gput:Nnn{\polyglossia@langsetup}{#1/Localnumeral}{##1} + \prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/Localnumeral}{##1} }, #1 / Localnumeral.value_required:n = true, #1 / Localnumeral.initial:n = {polyglossia@C@localnumeral}, % environment define command (by default create the environment) #1 / DefineCommandsCmd - .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/DefineCommandsCmd}{##1}}, + .code:n = {\prop_gput:Nnn{\g_xpg_langsetup_prop}{#1/DefineCommandsCmd}{##1}}, #1 / DefineCommandsCmd .value_required:n = true, #1 / DefineCommandsCmd @@ -575,29 +612,32 @@ \polyglossia@Clang@@arabic{#2} } -\tl_new:N \l__xpg_localnumeral_tl -\bool_new:N \l__xpg_localnumeral_bool - -\keys_define:nn { polyglossia / localnumeral } +\cs_new:Npn \__xpg_localnumeral_parse:nn #1 #2 { - lang .choice:, - lang / main .code:n = \tl_set:Nn \l__xpg_localnumeral_tl { \mainlanguagename } , - lang / local .code:n = \tl_set:Nn \l__xpg_localnumeral_tl { \languagename } - \bool_set_true:N \l__xpg_localnumeral_bool , - lang / unknown .code:n = \tl_set:Nn \l__xpg_localnumeral_tl { #1 } , + \str_if_eq:eeF { #1 } { lang } { \msg_error:nnn { polyglossia } { unknownlocalnumeral } { #1 } } + \exp_args:Ne \str_case:nnF { #2 } + { + { local } { } + { main } { \foreignlanguage { \mainlanguagename } } + } + { \foreignlanguage { #2 } } } \cs_new:Npn \__xpg_localnumeral:nnn #1 #2 #3 { - \group_begin: - \keys_set:ne { polyglossia / localnumeral } { #2 } - \bool_if:NF \l__xpg_localnumeral_bool { \foreignlanguage { \l__xpg_localnumeral_tl } } - { \use:c { \prop_item:Ne \polyglossia@langsetup - { \l__xpg_localnumeral_tl / #3 } } { } { #1 } } - \group_end: + \use:e + { + \keyval_parse:nnn + { \msg_error:nnn { polyglossia } { localnumeralemptyvalue } } + { + \__xpg_localnumeral_parse:nn + } { #2 } + } + { \use:c { \prop_item:Ne \g_xpg_langsetup_prop + { \languagename / #3 } } { } { #1 } } } - -\NewDocumentCommand \localnumeral { s ={ lang } O{ local } m } + +\NewExpandableDocumentCommand \localnumeral { s O{ lang=local } m } { \IfBooleanTF { #1 } { @@ -608,7 +648,7 @@ } } -\NewDocumentCommand \Localnumeral { s ={ lang } O{ local } m } +\NewExpandableDocumentCommand \Localnumeral { s O{ lang=local } m } { \IfBooleanTF { #1 } { @@ -619,86 +659,90 @@ } } -\cs_new_nopar:Npn \xpg__french_spacing:n #1 +\cs_new_nopar:Npn \__xpg_french_spacing:n #1 { \bool_if:cTF { g__xpg_#1_fs_bool } { \frenchspacing } { \nonfrenchspacing } } -\cs_new_nopar:Npn \xpg__indent_first:n #1 +\cs_new_nopar:Npn \__xpg_indent_first:n #1 { \bool_if:cTF { g__xpg_#1_if_bool } { \french@indent } { \nofrench@indent } } -\cs_new:Nn{\polyglossia@lang@setpardirection:n}{ - \prop_get:NeNTF \polyglossia@langsetup {#1/direction} \l_tmpa_tl +\cs_new:Nn \__xpg_lang_set_par_direction:n +{ + \prop_get:NeNTF \g_xpg_langsetup_prop {#1/direction} \l_tmpa_tl { - \polyglossia@setpardirection:n{\l_tmpa_tl} + \__xpg_set_par_direction:n{\l_tmpa_tl} } { \xpg@error{Could~ not~ retrieve~ key~ direction~ for~ language~ "#1"} - \prop_show:N{\polyglossia@langsetup} + \prop_show:N{\g_xpg_langsetup_prop} } } -\cs_new:Nn{\polyglossia@lang@settextdirection:nn}{ - \prop_get:NeNTF \polyglossia@langsetup {#1/direction} \l_tmpa_tl +\cs_new:Nn \__xpg_lang_set_text_direction:nn +{ + \prop_get:NeNTF \g_xpg_langsetup_prop {#1/direction} \l_tmpa_tl { - \polyglossia@settextdirection:n{\l_tmpa_tl}{#2} + \__xpg_set_text_direction:n{\l_tmpa_tl}{#2} } { \xpg@error{Could~ not~ retrieve~ key~ direction~ for~ language~ "#1"} - \prop_show:N{\polyglossia@langsetup} + \prop_show:N{\g_xpg_langsetup_prop} } } -\def\xpg@lastlanguage{0} +\tl_new:N \g__xpg_lastlanguage_tl +\tl_set:Nn \g__xpg_lastlanguage_tl { 0 } -\providebool{xpg@hyphenation@disabled} -\boolfalse{xpg@hyphenation@disabled} +% Track whether hyphenation is disabled +\bool_new:N \g__xpg_hyphenation_disabled_bool -\def\xpg@disablehyphenation{ - \ifx\@onlypreamble\@notprerr - \xpg@@disablehyphenation - \else - % if this is used in the preamble, we have to postpone - % the execution until the main language has been set (#125). - \cs_gset_nopar:Nn \polyglossia@AtBeginDocument@hyphenation: { - \xpg@@disablehyphenation +\DeclareDocumentCommand \disablehyphenation {} +{ + \bool_if:NTF \g_xpg_main_lang_set_bool + { + \__xpg_disable_hyphenation: + } + { + % we have to postpone the execution until the main language + % has been set (#125). + \cs_gset_nopar:Nn \__xpg_at_begin_document_hyphenation: { + \__xpg_disable_hyphenation: } - \fi + } } -\def\xpg@@disablehyphenation{ - \ifbool{xpg@hyphenation@disabled}{}{ - \booltrue{xpg@hyphenation@disabled} - \xdef\xpg@lastlanguage{\the\language} +\cs_new:Nn \__xpg_disable_hyphenation: +{ + \bool_if:NF \g__xpg_hyphenation_disabled_bool + { + \bool_gset_true:N \g__xpg_hyphenation_disabled_bool + \tl_gset:Ne \g__xpg_lastlanguage_tl { \the\language } % We do not call \xpg@set@hyphenation@patterns here to avoid a warning message. % "nohyphenation" is not listed in language.dat.lua. \language=\l@nohyphenation } } -\def\xpg@enablehyphenation{ - \ifbool{xpg@hyphenation@disabled}{ - \boolfalse{xpg@hyphenation@disabled} - \language=\csname xpg@lastlanguage\endcsname - }{}% +\DeclareDocumentCommand \enablehyphenation {} +{ + \bool_if:NT \g__xpg_hyphenation_disabled_bool + { + \bool_gset_false:N \g__xpg_hyphenation_disabled_bool + \language=\tl_use:N{\g__xpg_lastlanguage_tl} + }% } -\let\disablehyphenation\xpg@disablehyphenation -\let\enablehyphenation\xpg@enablehyphenation - -%\def\xpg@fontsetup#1{\xpg@csifdef@warn{xpg@fontsetup@#1}} -%\def\xpg@fontsetup@none#1{\csgdef{#1@font}{\ifcsdef{#1font}{\csname #1font\endcsname}{}}} %<-- simplistic -%\def\xpg@fontsetup@custom#1{\csuse{#1@font}} - -\cs_new:Npn \xpg__auto_setupfont:n #1 { +\cs_new:Npn \__xpg_auto_setupfont:n #1 +{ \bool_if:cTF { g__xpg_#1_fontsetup_bool } { - \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#1/lcscript}}{latin} + \str_if_eq:eeTF{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/lcscript}}{latin} {\xpg@fontsetup@latin{#1}} {\xpg@fontsetup@nonlatin{#1}} } @@ -710,11 +754,12 @@ % add fontfeature Language=#2 to langtag #1 % do nothing if #1 or #2 is empty -\cs_new:Nn \polyglossia@addfontfeature@language:nn { +\cs_new:Nn \__xpg_add_font_feature_language:nn +{ \bool_if:nTF{\tl_if_empty_p:n{#1} || \tl_if_empty_p:n{#2}} { % maybe an error ? - \xpg@warning{Asking~ to~ add~ empty~ feature~to~ latin~ font~ + \xpg@warning{Asking~ to~ add~ empty~ feature~to~ main~ font~ (Language="#2"~ to~ langtag~ "#1")} } { @@ -738,67 +783,82 @@ } } } -\cs_generate_variant:Nn \polyglossia@addfontfeature@language:nn { on , no, oo , Vn, nV, VV , xn, nx, xx} +\cs_generate_variant:Nn \__xpg_add_font_feature_language:nn { on , no, oo , Vn, nV, VV , xn, nx, xx} % add fontfeature Script=#2 to scripttag #1 % do nothing if #1 or #2 is empty -\cs_new:Nn \polyglossia@addfontfeature@script:nnn { +\cs_new:Nn \__xpg_add_font_feature_script:nnn +{ \bool_if:nTF{\tl_if_empty_p:n{#2} || \tl_if_empty_p:n{#3}} { % maybe an error ? - \xpg@warning{Asking~ to~ add~ empty~ feature~to~ latin~ font + \xpg@warning{Asking~ to~ add~ empty~ feature~to~ main~ font (Script="#3"~ to~ scripttag~ "#2")} } { \fontspec_if_script:nTF{#2} {\addfontfeature{Script=#3}} { - \tl_set:Nn \l_ffamily_tl {} - \tl_set:Nn \l_ffamilysh_tl { #1 } + \tl_set:Nn \xpg_ffamily_tl {} + \tl_set:Nn \xpg_ffamilysh_tl { #1 } \str_if_eq:nnT { #1 } { rm } { - \tl_set:Nn \l_ffamily_tl { roman } - \tl_set:Nn \l_ffamilysh_tl {} + \tl_set:Nn \xpg_ffamily_tl { roman } + \tl_set:Nn \xpg_ffamilysh_tl {} } \str_if_eq:nnT { #1 } { sf } { - \tl_set:Nn \l_ffamily_tl { sans~ serif } + \tl_set:Nn \xpg_ffamily_tl { sans~ serif } } \str_if_eq:nnT { #1 } { tt } { - \tl_set:Nn \l_ffamily_tl { monospace } + \tl_set:Nn \xpg_ffamily_tl { monospace } } + % Strip font family name for error message + % Courtesy of egreg, https://tex.stackexchange.com/a/613996 + \str_set:Nx \xpg_fname_str { \fontname\font } + % Remove all after : + \regex_replace_once:nnN { \:.* } { } \xpg_fname_str + % ... and all after / + \regex_replace_once:nnN { /.* } { } \xpg_fname_str + % ... and brackets + \regex_replace_once:nnN { \[ } { } \xpg_fname_str + \regex_replace_once:nnN { \] } { } \xpg_fname_str + % ... and extensions + \regex_replace_once:nnN { \.[^\.]* \Z } { } \xpg_fname_str + % ... and, finally, quotation marks + \regex_replace_once:nnN { " } { } \xpg_fname_str \xpg@error{ - The~ current~ latin ~ \l_ffamily_tl\space font~ does~ not~ contain~ the~"#3"~ script!\MessageBreak - Please~ define~\csname\tl_if_empty:nF{#3}{\str_lowercase:n#3}font\l_ffamilysh_tl\endcsname~ + The~ current~ main ~ \xpg_ffamily_tl\space font,~ \xpg_fname_str,~ does~ not~ contain~ the~"#3"~ script!\MessageBreak + Please~ define~\csname\tl_if_empty:nF{#3}{\str_lowercase:n{#3}}font\xpg_ffamilysh_tl\endcsname~ with~ \string\newfontfamily\space command } } } } -\cs_generate_variant:Nn \polyglossia@addfontfeature@script:nnn { non , nno, noo , nVn, nnV, nVV , nxn, nnx, nxx} +\cs_generate_variant:Nn \__xpg_add_font_feature_script:nnn { non , nno, noo , nVn, nnV, nVV , nxn, nnx, nxx} \def\xpg@fontsetup@latin#1{ \begingroup \csgdef{#1@font@rm}{ \cs_if_exist_use:cF{#1font}{ \rmfamilylatin - \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}} - {\prop_item:Nn{\polyglossia@langsetup}{#1/language}} + \__xpg_add_font_feature_language:xx{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/langtag}} + {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/language}} } } \csgdef{#1@font@sf}{ \cs_if_exist_use:cF{#1fontsf}{ \sffamilylatin - \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}} - {\prop_item:Nn{\polyglossia@langsetup}{#1/language}} + \__xpg_add_font_feature_language:xx{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/langtag}} + {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/language}} } } \csgdef{#1@font@tt}{ \cs_if_exist_use:cF{#1fonttt}{ \ttfamilylatin - \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}} - {\prop_item:Nn{\polyglossia@langsetup}{#1/language}} + \__xpg_add_font_feature_language:xx{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/langtag}} + {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/language}} } } \endgroup @@ -810,9 +870,9 @@ \cs_if_exist_use:cF{#1font} { \providetoggle{#1@use@script@font} - \str_if_eq:nnTF{\prop_item:Nn{\polyglossia@langsetup}{#1/script}}{\prop_item:Nn{\polyglossia@langsetup}{#1/language}} + \str_if_eq:nnTF{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/script}}{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/language}} {\rmfamilylatin} - {\cs_if_exist_use:cTF{\prop_item:Nn{\polyglossia@langsetup}{#1/lcscript} font} + {\cs_if_exist_use:cTF{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/lcscript} font} { \toggletrue{#1@use@script@font} } @@ -821,12 +881,12 @@ } } \iftoggle{#1@use@script@font}{}{ - \polyglossia@addfontfeature@script:nxx{rm} - {\prop_item:Nn{\polyglossia@langsetup}{#1/scripttag}} - {\prop_item:Nn{\polyglossia@langsetup}{#1/script}} + \__xpg_add_font_feature_script:nxx{rm} + {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/scripttag}} + {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/script}} }% - \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}} - {\prop_item:Nn{\polyglossia@langsetup}{#1/language}} + \__xpg_add_font_feature_language:xx{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/langtag}} + {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/language}} }% \def\familytype{rm} }% @@ -834,9 +894,9 @@ \cs_if_exist_use:cF{#1fontsf} { \providetoggle{#1@use@script@fontsf} - \str_if_eq:nnTF{\prop_item:Nn{\polyglossia@langsetup}{#1/script}}{\prop_item:Nn{\polyglossia@langsetup}{#1/language}} + \str_if_eq:nnTF{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/script}}{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/language}} {\sffamilylatin} - {\cs_if_exist_use:cTF{\prop_item:Nn{\polyglossia@langsetup}{#1/lcscript} fontsf} + {\cs_if_exist_use:cTF{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/lcscript} fontsf} { \toggletrue{#1@use@script@fontsf} } @@ -845,12 +905,12 @@ } } \iftoggle{#1@use@script@fontsf}{}{ - \polyglossia@addfontfeature@script:nxx{sf} - {\prop_item:Nn{\polyglossia@langsetup}{#1/scripttag}} - {\prop_item:Nn{\polyglossia@langsetup}{#1/script}} + \__xpg_add_font_feature_script:nxx{sf} + {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/scripttag}} + {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/script}} }% - \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}} - {\prop_item:Nn{\polyglossia@langsetup}{#1/language}} + \__xpg_add_font_feature_language:xx{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/langtag}} + {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/language}} }% \def\familytype{sf} }% @@ -858,9 +918,9 @@ \cs_if_exist_use:cF{#1fonttt} { \providetoggle{#1@use@script@fonttt} - \str_if_eq:nnTF{\prop_item:Nn{\polyglossia@langsetup}{#1/script}}{\prop_item:Nn{\polyglossia@langsetup}{#1/language}} + \str_if_eq:nnTF{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/script}}{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/language}} {\ttfamilylatin} - {\cs_if_exist_use:cTF{\prop_item:Nn{\polyglossia@langsetup}{#1/lcscript} fonttt} + {\cs_if_exist_use:cTF{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/lcscript} fonttt} { \toggletrue{#1@use@script@fonttt} } @@ -869,12 +929,12 @@ } } \iftoggle{#1@use@script@fonttt}{}{ - \polyglossia@addfontfeature@script:nxx{tt} - {\prop_item:Nn{\polyglossia@langsetup}{#1/scripttag}} - {\prop_item:Nn{\polyglossia@langsetup}{#1/script}} + \__xpg_add_font_feature_script:nxx{tt} + {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/scripttag}} + {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/script}} } - \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}} - {\prop_item:Nn{\polyglossia@langsetup}{#1/language}} + \__xpg_add_font_feature_language:xx{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/langtag}} + {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/language}} } \def\familytype{tt} } @@ -885,71 +945,42 @@ %% ensure localization of \markright and \markboth commands %%% THIS IS NOW DISABLED BY DEFAULT -\cs_new_nopar:Nn {\polyglossia@local@marks:n} {} -\cs_new_nopar:Nn {\polyglossia@enable@local@marks:} -{ - \xpg@info{Option:~ localmarks} - \cs_gset_nopar:Nn \polyglossia@local@marks:n - {% - \def\xpg@tmp@lang{##1} - \DeclareRobustCommand\markboth[2]{ - \begingroup - \let\label\relax \let\index\relax \let\glossary\relax - \unrestored@protected@xdef\@themark - {% - {\lowercase{\foreignlanguage{\xpg@tmp@lang}}{\protect\@@ensure@maindir{####1}}} - {\lowercase{\foreignlanguage{\xpg@tmp@lang}}{\protect\@@ensure@maindir{####2}}} - }% - \@temptokena \expandafter{\@themark} - \mark{\the\@temptokena} - \endgroup - \if@nobreak\ifvmode\nobreak\fi\fi - }% - \DeclareRobustCommand\markright[1]{ - \begingroup - \let\label\relax \let\index\relax \let\glossary\relax - \expandafter\@markright\@themark - {\lowercase{\foreignlanguage{\xpg@tmp@lang}}{\protect\@@ensure@maindir{####1}}} - \@temptokena \expandafter{\@themark} - \mark{\the\@temptokena} - \endgroup - \if@nobreak\ifvmode\nobreak\fi\fi - } -% This part seems wrong (see #396 for explanation). Remove after a while. -% \def\@markright####1####2####3{% -% \@temptokena{\protect\@@ensure@maindir{####1}}% -% \unrestored@protected@xdef\@themark{% -% {\the\@temptokena}% -% {\protect\@@ensure@maindir{####3}}% -% }% -% }% - }% +\cs_new_nopar:Nn \__xpg_local_marks:n { } +\cs_new_nopar:Nn \__xpg_enable_local_marks: +{ + \xpg@info{Option:~ localmarks} + \cs_gset_nopar:Nn \__xpg_local_marks:n + { + \def\xpg@tmp@lang{##1} + \DeclareRobustCommand\markboth[2]{ + \begingroup + \let\label\relax \let\index\relax \let\glossary\relax + \unrestored@protected@xdef\@themark + { + {\lowercase{\foreignlanguage{\xpg@tmp@lang}}{\protect\@@ensure@maindir{####1}}} + {\lowercase{\foreignlanguage{\xpg@tmp@lang}}{\protect\@@ensure@maindir{####2}}} + } + \@temptokena \expandafter{\@themark} + \mark{\the\@temptokena} + \endgroup + \if@nobreak\ifvmode\nobreak\fi\fi + } + \DeclareRobustCommand\markright[1]{ + \begingroup + \let\label\relax \let\index\relax \let\glossary\relax + \expandafter\@markright\@themark + {\lowercase{\foreignlanguage{\xpg@tmp@lang}}{\protect\@@ensure@maindir{####1}}} + \@temptokena \expandafter{\@themark} + \mark{\the\@temptokena} + \endgroup + \if@nobreak\ifvmode\nobreak\fi\fi + } + } } - -% Easy way out – Arthur, 2012-08-01 -\ifcsdef{newXeTeXintercharclass}{ -% to reset the intercharclass of a character to "normal" -\newXeTeXintercharclass\xpg@normalclass %TODO -}{} - -%% when no patterns are available, we use \l@nohyphenation, assigned to 255 -%% (suggestion by Enrico Gregorio) -\sys_if_engine_luatex:TF - { - \@ifundefined{l@nohyphenation} - {\chardef\l@nohyphenation=\directlua{ - tex.sprint(polyglossia.newloader_loaded_languages.nohyphenation)}\relax - } - {} - } - { - \@ifundefined{l@nohyphenation}{\chardef\l@nohyphenation=255 }{} - } - %we call this macro when a gloss file is not found for a given language \def\xpg@nogloss#1{ - \xpg@warning{Neither~ file~ gloss-#1.ldf~ nor file~ gloss-#1.lde~ exists!\MessageBreak + \xpg@warning{File~ gloss-#1.ldf~ do~ not~ exists!\MessageBreak I~ will~ nevertheless~ try~ to~ use~ hyphenation~ patterns~ for~ #1.} \PolyglossiaSetup{#1}{hyphenmins={2,3},hyphennames={#1},fontsetup=true} % the above amounts to: @@ -968,96 +999,39 @@ \catcode`\@=\xpg@saved@at@catcode } -%% Load a lde file -\cs_new_nopar:Nn \__xpg_gloss_ext: {lde} -\cs_new_nopar:Ne \__xpg_saved_@pkgextension: {\@pkgextension} - -\msg_new:nnn { polyglossia } { directloadgloss } -{ - You~ should~ not~ load~ directly~ the~ gloss~ file. ~ - You~ must~ use~ `\string\setotherlanguage\{#1\}' or `\string\setmainlanguage\{#1\}'. -} -\msg_redirect_name:nnn { polyglossia } { directloadgloss } { critical } -\NewDocumentCommand{\__xpg_ProvidesLanguageDefinitionExtension_error}{m m m m} -{ - \msg_critical:nn { polyglossia } { directloadgloss } -} -% ProvideExplPackage but for language file -\cs_new_eq:NN \ProvidesLanguageDefinitionExtension \__xpg_ProvidesLanguageDefinitionExtension_error -\cs_new_eq:NN \__xpg_saved_ProvidesExplPackage \ProvidesExplPackage -\NewDocumentCommand{\__xpg_ProvidesLanguageDefinitionExtension}{m m m m} -{ - \__xpg_saved_ProvidesExplPackage{#1}{#2}{#3}{#4} - \cs_gset_eq:NN \@pkgextension \__xpg_saved_@pkgextension: - \cs_gset_eq:NN \ProvidesLanguageDefinitionExtension \__xpg_ProvidesLanguageDefinitionExtension_error -} - - -% wrapper for loading a gle file -\NewDocumentCommand{\RequireLanguageDefinitionExtension}{O{} m} -{ - \cs_gset_eq:NN \__xpg_saved_@pkgextension: \@pkgextension - \cs_gset_eq:NN \__xpg_saved_ProvidesExplPackage \ProvidesExplPackage - \cs_gset_eq:NN \@pkgextension \__xpg_gloss_ext: - \cs_gset_eq:NN \ProvidesLanguageDefinitionExtension \__xpg_ProvidesLanguageDefinitionExtension - \RequirePackage[#1]{gloss-#2} - % be paranoiac restore - \cs_gset_eq:NN \@pkgextension \__xpg_saved_@pkgextension: - \cs_gset_eq:NN \__xpg_ProvidesLanguageDefinitionExtension_error \ProvideLanguageDefinitionExtension -} - % try to load a language file -\cs_new:Nn \polyglossia_load_lang_definition:nn { - \file_if_exist:nTF{gloss-#2.lde} - { - \RequireLanguageDefinitionExtension[#1]{#2} - \setkeys{#2}{#1} - } - { - \file_if_exist:nTF{gloss-#2.ldf} - { - % Temporarily force catcode of ~ to 13 since babelsh.def - % requires it. This is needed particularly with LaTeX3 - % packages which force \ExplSyntaxOn (#425) - \protected\edef\xpg@restore@tilde@catcode{\catcode 126 = \the\catcode 126\relax} - \catcode 126 = 13 - \xpg@input{gloss-#2.ldf} - \setkeys{#2}{#1} - % restore former ~ catcode - \xpg@restore@tilde@catcode - } - { - \xpg@nogloss{#2} - } - } -} -\cs_generate_variant:Nn \polyglossia_load_lang_definition:nn { - ee, ef, en, eo, ex, - fe, ff, fn, fo, fx, - ne, nf, no, nx, - oe, of, on, oo, ox, - xe, xf, xn, xo, xx -} +\cs_new:Nn \__xpg_load_lang_definition:nn { + \file_if_exist:nTF{gloss-#2.ldf} + { + % Temporarily force catcode of ~ to 13 since babelsh.def + % requires it. This is needed particularly with LaTeX3 + % packages which force \ExplSyntaxOn (#425) + \protected\edef\xpg@restore@tilde@catcode{\catcode 126 = \the\catcode 126\relax} + \catcode 126 = 13 + \xpg@input{gloss-#2.ldf} + \setkeys{#2}{#1} + % restore former ~ catcode + \xpg@restore@tilde@catcode + } + { + \xpg@nogloss{#2} + } +} +\cs_generate_variant:Nn \__xpg_load_lang_definition:nn { ee } % load a master language from an alias file \newcommand*\xpg@load@master@language[1] { - \file_if_exist:nTF{gloss-#1.lde} - { - \RequireLanguageDefinitionExtension{#1} - } - { - \xpg@input{gloss-#1.ldf} - } + \xpg@input{gloss-#1.ldf} \seq_if_in:NeF \__xpg_langs_loaded {#1} { % define environment and command if not alias \str_if_eq:eeT {\prop_item:Ne \__xpg_alias {#1/target}} {#1} { - \use:c{\prop_item:Nn{\polyglossia@langsetup} + \use:c{\prop_item:Nn{\g_xpg_langsetup_prop} {#1/DefineCommandsCmd}} {#1} } } - \polyglossia@register@language:nn{}{#1} + \__xpg_register_language:nn{}{#1} \seq_gput_right:Nn \__xpg_langs_loaded {#1} } @@ -1068,14 +1042,14 @@ \str_if_eq:eeT {\prop_item:Ne \__xpg_alias {#1/target}} {#1} { \exp_args:Ne - \newenvironment {\prop_item:Nn{\polyglossia@langsetup}{#1/envname}} [1] [] + \NewDocumentEnvironment {\prop_item:Nn{\g_xpg_langsetup_prop}{#1/envname}} { O{} } { - \begin{otherlanguage}[##1]{#1} + \otherlanguage [ ##1 ] { #1 } } { - \end{otherlanguage} + \endotherlanguage } - \exp_args:Nc \newcommand {text#1} [2][] + \exp_args:Nc \NewDocumentCommand {text#1} { O{} m } { \__xpg_textlanguage:een{##1}{#1}{##2} } @@ -1096,7 +1070,7 @@ % target to self fall back to language table \str_if_eq:eeTF { \prop_item:Ne \__xpg_alias {#1/target} } { #1 } { - \prop_item:Nn{\polyglossia@langsetup} {#1/#2} + \prop_item:Nn{\g_xpg_langsetup_prop} {#1/#2} } % load alias by recursion { @@ -1130,15 +1104,10 @@ % get base language -\cs_new:Nn \xpg_alias_base_lang:n { - \str_if_eq:eeTF { \prop_item:Ne \__xpg_alias {#1/target} } { #1 } +\cs_new:Nn \xpg_alias_base_lang:n { - #1 + \prop_item:Ne \__xpg_alias {#1/target} } - { - \xpg_alias_base_lang:n { \prop_item:Ne \__xpg_alias {#1/target} } - } -} \cs_generate_variant:Nn \xpg_alias_base_lang:n {e} \keys_define:nn { polyglossia/alias } @@ -1200,10 +1169,10 @@ } \DeclareDocumentEnvironment { #4 } { } { - \begin{otherlanguage}{#4} + \otherlanguage { #4 } } { - \end{otherlanguage} + \endotherlanguage } } \tl_clear_new:N \__xpg_alias_option_tl @@ -1219,19 +1188,20 @@ {#4} } -\cs_new:Nn \polyglossia@register@language:nn { +\cs_new:Nn \__xpg_register_language:nn +{ \clist_if_in:NeF \xpg@loaded {#2}{ \clist_gput_right:Ne \xpg@loaded {#2} } % Register the language options - \polyglossia@set@lang@options:nnn {#2} {#1} {@xpg@set@langvariant} + \__xpg_set_language_options:nnn {#2} {#1} {@xpg@set@langvariant} % register babelname - \prop_get:NeN \polyglossia@langsetup {#2/babelname} \l_tmpa_tl + \prop_get:NeN \g_xpg_langsetup_prop {#2/babelname} \l_tmpa_tl \clist_if_in:NeF \xpg@bloaded {\l_tmpa_tl}{ \clist_gput_right:Ne \xpg@bloaded {\l_tmpa_tl} } % register BCP-47 ID - \prop_get:NeN \polyglossia@langsetup {#2/bcp47} \l_tmpa_tl + \prop_get:NeN \g_xpg_langsetup_prop {#2/bcp47} \l_tmpa_tl \clist_if_in:NeF \xpg@bcp@loaded {\l_tmpa_tl}{ \clist_gput_right:Ne \xpg@bcp@loaded {\l_tmpa_tl} } @@ -1248,21 +1218,21 @@ } \seq_if_in:NeF \__xpg_langs_loaded {#2} { - \polyglossia_load_lang_definition:nn{#1}{#2} + \__xpg_load_lang_definition:nn{#1}{#2} % define environment and command if not alias \str_if_eq:eeT {\prop_item:Ne \__xpg_alias {#2/target}} {#2} { - \use:c{\prop_item:Ne{\polyglossia@langsetup} + \use:c{\prop_item:Ne{\g_xpg_langsetup_prop} {#2/DefineCommandsCmd}} {#2} } \seq_gput_right:Ne \__xpg_langs_loaded {#2} } - \exp_args:Nee \polyglossia@set@default@language:nn {\xpg_alias_add_to_option_i:nn{#2}{#1}} + \exp_args:Nee \__xpg_set_default_language:nn {\xpg_alias_add_to_option_i:nn{#2}{#1}} {\xpg_alias_base_lang:n{#2}} } -\cs_new:Nn \polyglossia@set@default@language:nn +\cs_new:Nn \__xpg_set_default_language:nn { \gdef\xpg@main@language{#2} \tl_if_blank:nTF {#1} @@ -1271,16 +1241,16 @@ } { % Register the language options - \polyglossia@set@lang@options:nnn {#2} {#1} {@xpg@main@langvariant} + \__xpg_set_language_options:nnn {#2} {#1} {@xpg@main@langvariant} } \csgdef{#2@gvar}{\mainlanguagevariant} %% The following settings are for the default language and script % this tells bidi.sty or luabidi.sty that the document is RTL - \__xpg_if_LR_str:eF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}} + \__xpg_if_LR_str:eF{\prop_item:Nn{\g_xpg_langsetup_prop}{#2/direction}} { \__xpg_setRTLmain: } - \cs_gset_nopar:Nn \polyglossia@AtBeginDocument@selectlanguage: { + \cs_gset_nopar:Nn \__xpg_at_begin_document_selectlanguage: { \selectbackgroundlanguage{#2} \selectlanguage[#1]{#2}% } @@ -1289,24 +1259,24 @@ \cs_gset_nopar:Npn \mainlanguagename {#2} % Store babelname of main language (for external packages such as biblatex) - \cs_gset_nopar:Npe \mainbabelname { \prop_item:Nn \polyglossia@langsetup {#2/babelname} } + \cs_gset_nopar:Npe \mainbabelname { \prop_item:Nn \g_xpg_langsetup_prop {#2/babelname} } % Store babelname of current language (for external packages such as biblatex) \cs_gset_eq:NN \babelname \mainbabelname \cs_gset_eq:cc{#2@gbabelname}{babelname}% % Store BCP-47 ID and subtags of main language: % 1. store main.* (sub)tags - \cs_gset_nopar:cpe {bcp47.main.tag} { \prop_item:Nn \polyglossia@langsetup { #2 / bcp47 } } - \cs_gset_nopar:cpe {bcp47.main.language} { \prop_item:Nn \polyglossia@langsetup { #2 / bcp47-language } } - \cs_gset_nopar:cpe {bcp47.main.region} { \prop_item:Nn \polyglossia@langsetup { #2 / bcp47-region } } - \cs_gset_nopar:cpe {bcp47.main.script} { \prop_item:Nn \polyglossia@langsetup { #2 / bcp47-script } } - \cs_gset_nopar:cpe {bcp47.main.variant} { \prop_item:Nn \polyglossia@langsetup { #2 / bcp47-variant } } - \cs_gset_nopar:cpe {bcp47.main.extension.t} { \prop_item:Nn \polyglossia@langsetup { #2 / bcp47extension-t } } - \cs_gset_nopar:cpe {bcp47.main.extension.u} { \prop_item:Nn \polyglossia@langsetup { #2 / bcp47-extension-u } } - \cs_gset_nopar:cpe {bcp47.main.extension.x} { \prop_item:Nn \polyglossia@langsetup { #2 / bcp47-extension-x } } + \cs_gset_nopar:cpe {bcp47.main.tag} { \prop_item:Nn \g_xpg_langsetup_prop { #2 / bcp47 } } + \cs_gset_nopar:cpe {bcp47.main.language} { \prop_item:Nn \g_xpg_langsetup_prop { #2 / bcp47-language } } + \cs_gset_nopar:cpe {bcp47.main.region} { \prop_item:Nn \g_xpg_langsetup_prop { #2 / bcp47-region } } + \cs_gset_nopar:cpe {bcp47.main.script} { \prop_item:Nn \g_xpg_langsetup_prop { #2 / bcp47-script } } + \cs_gset_nopar:cpe {bcp47.main.variant} { \prop_item:Nn \g_xpg_langsetup_prop { #2 / bcp47-variant } } + \cs_gset_nopar:cpe {bcp47.main.extension.t} { \prop_item:Nn \g_xpg_langsetup_prop { #2 / bcp47extension-t } } + \cs_gset_nopar:cpe {bcp47.main.extension.u} { \prop_item:Nn \g_xpg_langsetup_prop { #2 / bcp47-extension-u } } + \cs_gset_nopar:cpe {bcp47.main.extension.x} { \prop_item:Nn \g_xpg_langsetup_prop { #2 / bcp47-extension-x } } % For casing, we fall back to language if bcp47-casing is not explicitly set - \cs_set_nopar:cpx {tmpcasing} { \prop_item:Ne \polyglossia@langsetup { #2 / bcp47-casing } } + \cs_set_nopar:cpx {tmpcasing} { \prop_item:Ne \g_xpg_langsetup_prop { #2 / bcp47-casing } } \str_if_empty:NTF \tmpcasing - { \cs_gset_nopar:cpe {bcp47.main.casing} { \prop_item:Nn \polyglossia@langsetup {#2 / bcp47-language} } } + { \cs_gset_nopar:cpe {bcp47.main.casing} { \prop_item:Nn \g_xpg_langsetup_prop {#2 / bcp47-language} } } { \cs_gset_nopar:cpe {bcp47.main.casing} { \tmpcasing } } % 2. Store lang (sub)tags \cs_gset_eq:cc {bcp47.tag} {bcp47.main.tag} @@ -1328,11 +1298,6 @@ \cs_gset_eq:cc{#2@g.bcp47.extension.u}{bcp47.extension.u} \cs_gset_eq:cc{#2@g.bcp47.extension.x}{bcp47.extension.x} \cs_gset_eq:cc{#2@g.bcp47.casing}{bcp47.casing} - % Set luatex main language - \sys_if_engine_luatex:T - { - \directlua{polyglossia.set_default_language('\luaescapestring{\string#2}')}% - } } \DeclareCommandCopy \setmainlanguage \setdefaultlanguage @@ -1417,14 +1382,14 @@ \ifcsundef{#2@gvar}{\def\languagevariant{}}{\def\languagevariant{\csuse{#2@gvar}}} }{ % Register the language options - \polyglossia@set@lang@options:nnn {#2} {#1} {@xpg@set@langvariant} - \cs_set_eq:cc{#2@gvar}{languagevariant} + \__xpg_set_language_options:nnn {#2} {#1} {@xpg@set@langvariant} + \cs_set_eq:cc{#2@var}{languagevariant} }% } \newcommand*{\resetdefaultlanguage}[2][]{ - \polyglossia@reset@default@language:nn + \__xpg_reset_default_language:nn {\xpg_alias_add_to_option_i:nn{#2}{#1}} {\xpg_alias_base_lang:n{#2}} } @@ -1435,56 +1400,56 @@ \tl_if_blank:nTF {#1}{ % tag (e.g., en-US) \ifcsundef{#2@g.bcp47.tag}{ - \csedef{bcp47.tag}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47 } } + \csedef{bcp47.tag}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47 } } }{ \csedef{bcp47.tag}{\csuse{#2@g.bcp47.tag}} } % language (e.g., en) \ifcsundef{#2@g.bcp47.language}{ - \csedef{bcp47.language}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-language } } + \csedef{bcp47.language}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-language } } }{ \csedef{bcp47.language}{\csuse{#2@g.bcp47.language}} } % region (e.g., US) \ifcsundef{#2@g.bcp47.region}{% - \csedef{bcp47.region}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-region } } + \csedef{bcp47.region}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-region } } }{ \csedef{bcp47.region}{\csuse{#2@g.bcp47.region}}% } % script (e.g., Latn) \ifcsundef{#2@g.bcp47.script}{ - \csedef{bcp47.script}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-script } } + \csedef{bcp47.script}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-script } } }{ \csedef{bcp47.script}{\csuse{#2@g.bcp47.script}} } % variant (e.g., 1996) \ifcsundef{#2@g.bcp47.variant}{ - \csedef{bcp47.variant}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-variant } } + \csedef{bcp47.variant}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-variant } } }{ \csedef{bcp47.variant}{\csuse{#2@g.bcp47.variant}} } % extension.t (tranformation) \ifcsundef{#2@g.bcp47.extension.t}{% - \csedef{bcp47.extension.t}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-extension-t } } + \csedef{bcp47.extension.t}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-extension-t } } }{ \csedef{bcp47.extension.t}{\csuse{#2@g.bcp47.extension.t}} } % extension.u (additional locale information) \ifcsundef{#2@g.bcp47.extension.u}{% - \csedef{bcp47.extension.u}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-extension-u } } + \csedef{bcp47.extension.u}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-extension-u } } }{ \csedef{bcp47.extension.u}{\csuse{#2@g.bcp47.extension.u}} } % extension.x (private use area) \ifcsundef{#2@g.bcp47.extension.x}{ - \csedef{bcp47.extension.x}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-extension-x } } + \csedef{bcp47.extension.x}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-extension-x } } }{ \csedef{bcp47.extension.x}{\csuse{#2@g.bcp47.extension.x}} } % casing \ifcsundef{#2@g.bcp47.casing}{ % For casing, we fall back to language if bcp47-casing is not explicitly set - \cs_set_nopar:cpx {tmpcasing} { \prop_item:Ne \polyglossia@langsetup { #2 / bcp47-casing } } + \cs_set_nopar:cpx {tmpcasing} { \prop_item:Ne \g_xpg_langsetup_prop { #2 / bcp47-casing } } \str_if_empty:NTF \tmpcasing { \cs_gset_eq:cc {bcp47.casing} {bcp47.language} } { \csedef{bcp47.casing}{ \tmpcasing } } @@ -1492,25 +1457,25 @@ \csedef{bcp47.casing}{\csuse{#2@g.bcp47.casing}} } }{ - \csedef{bcp47.tag}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47 } } - \csedef{bcp47.language}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-language } } - \csedef{bcp47.region}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-region } } - \csedef{bcp47.script}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-script } } - \csedef{bcp47.variant}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-variant } } - \csedef{bcp47.extension.t}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-extension-t } } - \csedef{bcp47.extension.u}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-extension-u } } - \csedef{bcp47.extension.x}{ \prop_item:Nn{ \polyglossia@langsetup}{ #2 / bcp47-extension-x } } + \csedef{bcp47.tag}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47 } } + \csedef{bcp47.language}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-language } } + \csedef{bcp47.region}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-region } } + \csedef{bcp47.script}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-script } } + \csedef{bcp47.variant}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-variant } } + \csedef{bcp47.extension.t}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-extension-t } } + \csedef{bcp47.extension.u}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-extension-u } } + \csedef{bcp47.extension.x}{ \prop_item:Nn{ \g_xpg_langsetup_prop}{ #2 / bcp47-extension-x } } % For casing, we fall back to language if bcp47-casing is not explicitly set - \cs_set_nopar:cpx {tmpcasing} { \prop_item:Ne \polyglossia@langsetup { #2 / bcp47-casing } } + \cs_set_nopar:cpx {tmpcasing} { \prop_item:Ne \g_xpg_langsetup_prop { #2 / bcp47-casing } } \str_if_empty:NTF \tmpcasing { \cs_gset_eq:cc {bcp47.casing} {bcp47.language} } { \csedef{bcp47.casing}{ \tmpcasing } } } } -\cs_new:Nn \polyglossia@reset@default@language:nn +\cs_new:Nn \__xpg_reset_default_language:nn { - \polyglossia@error@iflangnotloaded:n{#2} + \xpg_error_if_lang_not_loaded:n{#2} % disable globalnumbers of previously defined default language \csuse{no\xpg@main@language @globalnumbers} \csuse{noextras@\xpg@main@language}% @@ -1519,7 +1484,7 @@ \cs_if_exist_use:c{noextras@bbl@\mainbabelname}% \csuse{init@noextras@\xpg@main@language}% \polyglossia@set@language@name[#1]{#2}% - \__xpg_if_LR_str:eF{\prop_item:Ne{\polyglossia@langsetup}{#2/direction}} + \__xpg_if_LR_str:eF{\prop_item:Ne{\g_xpg_langsetup_prop}{#2/direction}} { \@rlmaintrue\@rl@footnotetrue } @@ -1528,23 +1493,26 @@ % Store babelname of current language (for external packages such as biblatex) \tl_if_blank:nTF {#1}{% \ifcsundef{#2@gbabelname}{ - \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}} + \edef\babelname{\prop_item:Nn{\g_xpg_langsetup_prop}{#2/babelname}} }{ \edef\babelname{\csuse{#2@gbabelname}} } }{ - \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}} + \edef\babelname{\prop_item:Nn{\g_xpg_langsetup_prop}{#2/babelname}} } + % Store variant + \tl_if_blank:nTF {#1} + { + \cs_gset_nopar:Npn \mainlanguagevariant {} + } + { + % Register the language options + \__xpg_set_language_options:nnn {#2} {#1} {@xpg@main@langvariant} + } + \csgdef{#2@gvar}{\mainlanguagevariant} % Store BCP-47 id of current language \__xpg_store_bcp_info:nn {#1}{#2} } -\cs_generate_variant:Nn \polyglossia@reset@default@language:nn { - ee, ef, en, eo, ex, - fe, ff, fn, fo, fx, - ne, nf, no, nx, - oe, of, on, oo, ox, - xe, xf, xn, xo, xx -} % This saves the normalfont for the latin script since we may change normalfont in other scripts \let\normalfontlatin=\normalfont @@ -1656,56 +1624,51 @@ \@afterindentfalse } -\cs_new_nopar:Npn \selectbackgroundlanguage #1 -{% - \polyglossia@select@background@language:n {\xpg_alias_base_lang:n{#1}} +\DeclareDocumentCommand \selectbackgroundlanguage { m } +{ + \__xpg_select_background_language:n {\xpg_alias_base_lang:n{#1}} } -\cs_new:Nn \polyglossia@select@background@language:n + +\cs_new:Nn \__xpg_select_background_language:n { - \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#1/lcscript}}{latin} + \str_if_eq:eeTF{\prop_item:Nn{\g_xpg_langsetup_prop}{#1/lcscript}}{latin} {} {\xpg@set@normalfont{#1}} \csuse{#1@globalnumbers} } -\cs_generate_variant:Nn \polyglossia@select@background@language:n {e} +\cs_generate_variant:Nn \__xpg_select_background_language:n {e} % Declare secondary language #2 with language options #1 \DeclareDocumentCommand \setotherlanguage { O{} m } { \seq_if_in:NeF \__xpg_langs_loaded {#2} { - \polyglossia_load_lang_definition:ee {#1} {#2} + \__xpg_load_lang_definition:ee {#1} {#2} % define environment and command if not alias \str_if_eq:eeT {\prop_item:Ne \__xpg_alias {#2/target}} {#2} { - \use:c{\prop_item:Ne{\polyglossia@langsetup} + \use:c{\prop_item:Ne{\g_xpg_langsetup_prop} {#2/DefineCommandsCmd}} {#2} } - \polyglossia@set@other@language:ee {\xpg_alias_add_to_option_i:nn{#2}{#1}} + \__xpg_set_otherlanguage:ee {\xpg_alias_add_to_option_i:nn{#2}{#1}} {\xpg_alias_base_lang:n{#2}} \seq_gput_right:Ne \__xpg_langs_loaded {#2} } } -\cs_new:Nn \polyglossia@set@other@language:nn +\cs_new:Nn \__xpg_set_otherlanguage:nn { - \polyglossia@register@language:nn{#1}{#2} + \__xpg_register_language:nn{#1}{#2} % If a variant is set, store it. \gdef\otherlanguagevariant{} % Register the language options - \polyglossia@set@lang@options:nnn {#2} {#1} {@xpg@other@langvariant} + \__xpg_set_language_options:nnn {#2} {#1} {@xpg@other@langvariant} \csgdef{#2@gvar}{\otherlanguagevariant} - \prop_get:NeNT \polyglossia@langsetup {#2/babelname} \l_tmpa_tl + \prop_get:NeNT \g_xpg_langsetup_prop {#2/babelname} \l_tmpa_tl { \xdef\otherlanguagebabelname{\l_tmpa_tl} } \cs_gset_eq:cc{#2@gbabelname}{otherlanguagebabelname} } -\cs_generate_variant:Nn \polyglossia@set@other@language:nn { - ee, ef, en, eo, ex, - fe, ff, fn, fo, fx, - ne, nf, no, nx, - oe, of, on, oo, ox, - xe, xf, xn, xo, xx -} +\cs_generate_variant:Nn \__xpg_set_otherlanguage:nn { ee } % Store main language variant for external packages @@ -1718,17 +1681,20 @@ \clist_map_function:eN { #1 } \setotherlanguage } -\def\common@language{% FIXME is this really needed??? - \ifbool{xpg@hyphenation@disabled}{ - \xdef\xpg@lastlanguage{\z@} +\cs_set:Nn \xpg_common_language: +{% FIXME is this really needed??? + \bool_if:NTF \g__xpg_hyphenation_disabled_bool + { + \tl_gset:Ne \g__xpg_lastlanguage_tl {\z@} }{ \language=\z@ } \lefthyphenmin=\tw@ \righthyphenmin=\thr@@} -\def\xpg@initial@setup{ - \common@language +\cs_set:Nn \xpg_initial_setup: +{ + \xpg_common_language: } @@ -1749,27 +1715,21 @@ % for specific (esp. tag-based) aliases % where {<alias>} would cause clashes % (e.g., \fi) -\newenvironment{lang}[2][]{ - \begin{otherlanguage}[#1]{#2} -}{ - \end{otherlanguage} -} - -\providecommand{\foreignlanguage}{} +\DeclareEnvironmentCopy { lang } { otherlanguage } % wrapper for foreignlanguage and otherlanguage* \newcommand*\polyglossia@setforeignlanguage[2][]{ \select@@language[#1]{#2} - \polyglossia@register@language:nn{#1}{#2} + \__xpg_register_language:nn{#1}{#2} % Store babelname of current language (for external packages such as biblatex) \tl_if_blank:nTF {#1}{ \ifcsundef{#2@gbabelname}{ - \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}} + \edef\babelname{\prop_item:Nn{\g_xpg_langsetup_prop}{#2/babelname}} }{ \edef\babelname{\csuse{#2@gbabelname}} } }{ - \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}} + \edef\babelname{\prop_item:Nn{\g_xpg_langsetup_prop}{#2/babelname}} } % Store BCP-47 id of current language \__xpg_store_bcp_info:nn {#1}{#2} @@ -1786,7 +1746,7 @@ } % lowercase options before passing to setkeys -\cs_new:Nn \polyglossia@set@keys:nn +\cs_new:Nn \__xpg_set_keys:nn { \xpg@str@lowercase{\xpg@tmp@opts}{#2} \exp_args:Nne \setkeys{#1}{\xpg@tmp@opts} @@ -1796,10 +1756,10 @@ % and \text<lang> % #1 option % #2 language -\newcommand{\xpg@otherlanguage}[2][] +\cs_new:Nn \xpg_otherlanguage:nn { - \polyglossia@error@iflangnotloaded:n{#2} - \polyglossia@set@keys:nn{#2}{#1} + \xpg_error_if_lang_not_loaded:n{#2} + \__xpg_set_keys:nn{#2}{#1} \polyglossia@setforeignlanguage[#1]{#2} % Hook for external packages such as biblatex \polyglossia@language@switched @@ -1810,10 +1770,13 @@ \cs_if_exist_use:c{inlineextras@bbl@\babelname} } -\renewcommand{\foreignlanguage}[3][] -{ - \__xpg_foreignlanguage:eeen {#1} {#2} {\xpg_alias_base_lang:n{#2}} {#3} -} +\DeclareDocumentCommand { \foreignlanguage } { O{} m m } + { + \__xpg_foreignlanguage:eeen {#1} {#2} {\xpg_alias_base_lang:n{#2}} {#3} + } + +% prevent case changing of language name in \foreignlanguage +\tl_put_right:Nn \l_text_case_exclude_arg_tl { \foreignlanguage } % Direct access to polyglossia@setforeignlanguage % used in captions @@ -1840,7 +1803,7 @@ { \cs_set_eq:NN \__xpg_current_matrixlang \l_tmpa_tl } { \cs_set_eq:NN \__xpg_current_matrixlang \mainlanguagename } % Reset the language's/script's font families if the embedding script is latin - \str_if_eq:eeT{\prop_item:Ne{\polyglossia@langsetup}{\__xpg_current_matrixlang/lcscript}}{latin} + \str_if_eq:eeT{\prop_item:Ne{\g_xpg_langsetup_prop}{\__xpg_current_matrixlang/lcscript}}{latin} {\resetfontlatin} % In case a \<lang>font is defined, re-activate that \exp_args:Ne \xpg@set@normalfont{\__xpg_current_matrixlang} @@ -1859,8 +1822,8 @@ }{ \__xpg_store_matrixlang: \group_begin: - \xpg@otherlanguage[\xpg_alias_add_to_option_i:nn{#2}{#1}]{#3} - \polyglossia@lang@settextdirection:nn{#3}{#4} + \xpg_otherlanguage:nn{ \xpg_alias_add_to_option_i:nn{#2}{#1} }{ #3 } + \__xpg_lang_set_text_direction:nn{#3}{#4} \group_end: \__xpg_reset_to_matrixlang: } @@ -1869,17 +1832,14 @@ % otherlanguage* is the environment equivalent of \foreignlanguage -\expandafter\providecommand\csname otherlanguage*\endcsname{} - -\renewenvironment{otherlanguage*}[2][] -{% - \__xpg_store_matrixlang: - \__xpg_otherlanguage:eee {#1} {#2} {\xpg_alias_base_lang:n{#2}} -} -{ - \egroup - \__xpg_reset_to_matrixlang: -} +\DeclareDocumentEnvironment { otherlanguage* } { O{} m } + { + \__xpg_store_matrixlang: + \__xpg_otherlanguage:eee { #1 } { #2 } { \xpg_alias_base_lang:n { #2 } } + }{ + \group_end: + \__xpg_reset_to_matrixlang: + } % internal wrapper % #1 option @@ -1891,14 +1851,12 @@ { \msg_show:nnn { polyglossia } { languagenotloaded } {#2} }{ - \xpg@otherlanguage[\xpg_alias_add_to_option_i:nn{#2}{#1}]{#3} - \polyglossia@lang@settextdirection:nn{#3}% + \xpg_otherlanguage:nn{ \xpg_alias_add_to_option_i:nn{#2}{#1} }{ #3 } + \__xpg_lang_set_text_direction:nn{#3}% \bgroup } } -\cs_generate_variant:Nn \__xpg_otherlanguage:nnn { - eee -} +\cs_generate_variant:Nn \__xpg_otherlanguage:nnn { eee } % use by \text<lang> and \textlang. Equivalent to \foreignlanguage, % except that dates are localized. @@ -1912,7 +1870,7 @@ \cs_generate_variant:Nn \__xpg_textlanguage:nnn {een} % Track whether we are in an inline lang (\text...) switch -\bool_new:N \__xpg_inline_lang +\bool_new:N \l__xpg_inline_lang_bool % use by \text<lang> and \textlang. Equivalent to \foreignlanguage, % except that dates are localized. @@ -1929,13 +1887,13 @@ { \__xpg_store_matrixlang: \group_begin: - \bool_set_true:N \__xpg_inline_lang - \xpg@otherlanguage[#1]{#3} + \bool_set_true:N \l__xpg_inline_lang_bool + \xpg_otherlanguage:nn{#1}{#3} \csuse{date#3} % This is a hook for external packages which want to access variants % via babelname (such as biblatex) \cs_if_exist_use:c{date@bbl@\babelname} - \polyglossia@lang@settextdirection:nn{#3}{#4} + \__xpg_lang_set_text_direction:nn{#3}{#4} \group_end: \__xpg_reset_to_matrixlang: } @@ -1945,7 +1903,7 @@ % Define language-specific hyphenation exceptions \newcommand\pghyphenation[3][]{ \bgroup - \polyglossia@error@iflangnotloaded:n{#2} + \xpg_error_if_lang_not_loaded:n{#2} \setkeys{#2}{#1} \select@@language[#1]{#2} \hyphenation{#3} @@ -1955,6 +1913,7 @@ % Hook that other package authors can use % (for instance biblatex): +% Do not rename! \newcommand*{\xpg@hook@setlanguage}{} \def\xpg@pop@language@i#1#2{ @@ -1962,55 +1921,39 @@ \xpg@hook@setlanguage \let\emp@langname\@undefined} -\newif\ifxpginauxfile\xpginauxfilefalse - \DeclareDocumentCommand \selectlanguage {s O{} m} -{ - \tl_if_blank:eTF {\xpg_alias_base_lang:n{#3}} - { - \ifxpginauxfile - \msg_show:nnn { polyglossia } { languagenolongerloaded } {#3} - \else - \msg_show:nnn { polyglossia } { languagenotloaded } {#3} - \fi - } { - \polyglossia@select@language:nee {#1} - {\xpg_alias_add_to_option_i:nn{#3}{#2}} - {\xpg_alias_base_lang:n{#3}} + \tl_if_blank:eTF {\xpg_alias_base_lang:n{#3}} + { + \IfBooleanTF { #1 } + { \msg_show:nnn { polyglossia } { languagenolongerloaded } {#3} } + { \msg_show:nnn { polyglossia } { languagenotloaded } {#3} } + }{ + \__xpg_select_language:nee {#1} + { \xpg_alias_add_to_option_i:nn{#3}{#2} } + { \xpg_alias_base_lang:n{#3} } + } } -} -\cs_new:Nn \polyglossia@select@language:nnn +\cs_new:Nn \__xpg_select_language:nnn { - \IfBooleanF {#1} - { - \cs_set_nopar:Npx \xpg@pop@language { \exp_not:N \xpg@pop@language@i {#2} {#3} } - \group_insert_after:N \xpg@pop@language - } % Register the language options - \polyglossia@set@lang@options:nnn {#3} {#2} {@xpg@set@langvariant} - % The starred variant does not write to the aux - \IfBooleanTF#1{% - \xpg@set@language@nonaux[#2]{#3} - } - { - \xpg@set@language@aux[#2]{#3} - } - \sys_if_engine_luatex:T - { - \directlua{polyglossia.select_language('\luaescapestring{\string#3}', - \the\csname l@#3\endcsname)} - } - \polyglossia@register@language:nn{#2}{#3} -} -\cs_generate_variant:Nn \polyglossia@select@language:nnn { - nee, nne + \__xpg_set_language_options:nnn {#3} {#2} {@xpg@set@langvariant} + \IfBooleanTF { #1 } % The starred variant does not write to the aux + { + \xpg@set@language@nonaux[#2]{#3} + }{ + \cs_set_nopar:Npe \xpg@pop@language { \exp_not:N \xpg@pop@language@i {#2} {#3} } + \group_insert_after:N \xpg@pop@language + \xpg@set@language@aux[#2]{#3} + } + \__xpg_register_language:nn{#2}{#3} } +\cs_generate_variant:Nn \__xpg_select_language:nnn { nee, nne } % set lang option #2 for lang #1 -\cs_new:Nn \polyglossia@set@lang@options:nnn +\cs_new:Nn \__xpg_set_language_options:nnn { \tl_if_blank:nF {#2} { @@ -2018,7 +1961,7 @@ \clist_map_inline:nn { #2 } { \xpg@parsevariantkeyvalue##1=#3:#1\relax }% - \polyglossia@set@keys:nn{#1}{#2} + \__xpg_set_keys:nn{#1}{#2} } } @@ -2026,7 +1969,7 @@ % \iflanguageoption has the info it needs also % for default settings \newcommand*\xpg@initialize@gloss@options[2]{ - \polyglossia@set@lang@options:nnn {#1} {#2} {@xpg@set@langvariant} + \__xpg_set_language_options:nnn {#1} {#2} {@xpg@set@langvariant} } % Record synonymous keyvals such as variant=us and variant=american @@ -2036,6 +1979,8 @@ { \prop_new:c {xpg@alias@keyvals@#1@#3} } \prop_put:cnn { xpg@alias@keyvals@#1@#3 } {#2}{#4} + \prop_if_exist:cF { xpg@alias@keyvals@#1@#4 } + { \prop_new:c {xpg@alias@keyvals@#1@#4} } \prop_put:cnn { xpg@alias@keyvals@#1@#4 } {#2}{#3} } @@ -2072,7 +2017,7 @@ } -\prg_set_conditional:Npnn \polyglossia@check@option@value:NNN #1#2#3 { p , T , F , TF } +\prg_set_conditional:Npnn \__xpg_check_option_value:NNN #1#2#3 { p , T , F , TF } { \prop_get:cnNTF {xpg@current@options@#1} {#2} \l_tmpa_tl { @@ -2101,8 +2046,9 @@ } % Test if option value is set -\newcommand*\iflanguageoption[5]{ - \polyglossia@check@option@value:NNNTF{#1}{#2}{#3}{#4}{#5} +\DeclareDocumentCommand \iflanguageoption { m m m m m } +{ + \__xpg_check_option_value:NNNTF{#1}{#2}{#3}{#4}{#5} } @@ -2114,21 +2060,23 @@ } % Test if language is loaded -\newcommand*\iflanguageloaded[3]{ +\DeclareDocumentCommand \iflanguageloaded { m m m } +{ \AddToHook{begindocument/end}{ \clist_if_in:NeTF \xpg@loaded{#1}{#2}{#3} } } % Same for babellanguage is loaded -\newcommand*\ifbabellanguageloaded[3]{ +\DeclareDocumentCommand \ifbabellanguageloaded { m m m } +{ \AddToHook{begindocument/end}{ \clist_if_in:NeTF \xpg@bloaded{#1}{#2}{#3} } } % Same for languageid -\DeclareDocumentCommand \iflanguageidloaded {mmmm} +\DeclareDocumentCommand \iflanguageidloaded { m m m m } { \AddToHook{begindocument/end}{ \str_case:nnTF {#1} @@ -2144,7 +2092,7 @@ } % Check if the current font has a given glyph -\prg_new_conditional:Npnn \__polyglossia_if_char:N #1 { TF } +\prg_new_conditional:Npnn \__xpg_if_char:N #1 { TF } { \iffontchar\font\int_from_hex:n { #1 }~ \prg_return_true: @@ -2157,14 +2105,14 @@ % and print it, if so, otherwise print the replacement #2 \NewExpandableDocumentCommand \charifavailable { m m } { - \exp_args:Nno \__polyglossia_if_char:NTF { #1 } { \Uchar"#1 } { #2 } + \exp_args:Nno \__xpg_if_char:NTF { #1 } { \Uchar"#1 } { #2 } } % Test if a char (by char code) is available in the current font % if so, do #2, else do #3 -\NewDocumentCommand \IfCharIsAvailableTF { m m m } +\NewExpandableDocumentCommand \IfCharIsAvailableTF { m m m } { - \__polyglossia_if_char:NTF{#1}{#2}{#3} + \__xpg_if_char:NTF { #1 } { #2 } { #3 } } @@ -2177,12 +2125,12 @@ % Store babelname of current language (for external packages such as biblatex) \tl_if_blank:nTF {#1}{ \ifcsundef{#2@gbabelname}{ - \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}} + \edef\babelname{\prop_item:Nn{\g_xpg_langsetup_prop}{#2/babelname}} }{ \edef\babelname{\csuse{#2@gbabelname}} } }{ - \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}} + \edef\babelname{\prop_item:Nn{\g_xpg_langsetup_prop}{#2/babelname}} } % Store BCP-47 id of current language \__xpg_store_bcp_info:nn {#1}{#2} @@ -2194,29 +2142,14 @@ \newcommand*{\xpg@set@language@only@aux}[2][]{ % Write to the aux (toc files) \if@filesw - \ifx#1\\\\ - \addtocontents{toc}{\protect\selectlanguage*{#2}} - \else - \addtocontents{toc}{\protect\selectlanguage*[#1]{#2}} - \fi + \addtocontents{toc}{\selectlanguage*[#1]{#2}} \fi } \AtBeginDocument{ - % Tell polyglossia that we are in an aux file - \if@filesw - \addtocontents{toc}{\protect\xpginauxfiletrue} - \addtocontents{lof}{\protect\xpginauxfiletrue} - \addtocontents{lot}{\protect\xpginauxfiletrue} - \fi -} - -\AtEndDocument{ - % Tell polyglossia that we are no longer in an aux file \if@filesw - \addtocontents{toc}{\protect\xpginauxfilefalse} - \addtocontents{lof}{\protect\xpginauxfilefalse} - \addtocontents{lot}{\protect\xpginauxfilefalse} + \immediate\write\@mainaux + {\ProvideDocumentCommand\selectlanguage{sO{}m}{}} \fi } @@ -2228,49 +2161,22 @@ \addtocontents{lot}{\protect\setforeignlanguage{\languagename}} } -% The bidi package swaps the output stream within RTL tables -% (to get the column order right). This also swaps group -% delimiters inserted to the aux files via otherlanguage (see #354). -% We therefore patch bidi and insert a bool that tells us -% whether we are in such a table. -\newbool{xpg@inbiditable} -\AtBeginDocument{ - \@ifpackageloaded{bidi}{ - \patchcmd{\@tabular} - {\if@RTLtab} - {\if@RTLtab\booltrue{xpg@inbiditable}} - {} % success - {\xpg@warning{Patching bidi table failed!}} - }{} -} - % check if language is defined -\prg_set_conditional:Npnn \__xpg_check_if_exist_l@:N #1 { p , T , F , TF }{ - \cs_if_exist:cTF {l@#1} - { - \cs_if_eq:cNTF {l@#1} \l@nohyphenation - { - \prg_return_false: - } - { - % it's possible that sometimes \csname l@#1\endcsname becomes \relax - \cs_if_eq:cNTF {l@#1} \relax - { \prg_return_false: } - { \prg_return_true: } - } - } - { - \prg_return_false: - } -} +\prg_set_conditional:Npnn \__xpg_check_if_exist_l@:n #1 { F, TF } + { + \bool_lazy_and:nnTF + { \cs_if_exist_p:c { l@#1 } } + { ! (\cs_if_eq_p:cc { l@#1 } { l@nohyphenation }) } + { \prg_return_true: } + { \prg_return_false: } + } \def\polyglossia@luatex@load@lang#1{ % if \l@#1 is not properly defined, call lua function newloader(#1), % and assign the returned number to \l@#1 - \__xpg_check_if_exist_l@:NF {#1} + \__xpg_check_if_exist_l@:nF {#1} { - \expandafter\chardef\csname l@#1\endcsname= - \directlua{ tex.sprint(polyglossia.newloader'#1') }\relax + \directlua { token.set_char('l@#1', polyglossia.newloader'#1') } } } @@ -2282,7 +2188,7 @@ { \polyglossia@luatex@load@lang{#1} } - \__xpg_check_if_exist_l@:NTF{#1}{#2}{#3} + \__xpg_check_if_exist_l@:nTF{#1}{#2}{#3} } % Set \bbl@hyphendata@\the\language, which is (lua)babel's @@ -2308,20 +2214,20 @@ % hook for compatibility with biblatex \select@language{#2} \xpg@set@bbl@hyphendata{\the\language} - \xpg@initial@setup% + \xpg_initial_setup: \select@@language[#1]{#2}% % Hook for external packages such as biblatex \polyglossia@language@switched% - \polyglossia@lang@setpardirection:n{#2} + \__xpg_lang_set_par_direction:n{#2} \csuse{captions#2}% \csuse{date#2}% % These are hooks for external packages which want to access variants % via babelname (such as biblatex) \cs_if_exist_use:c{captions@bbl@\babelname} \cs_if_exist_use:c{date@bbl@\babelname} - \polyglossia@local@marks:n{#2} + \__xpg_local_marks:n{#2} \csuse{init@extras@#2}% - \xpg__indent_first:n { #2 } + \__xpg_indent_first:n { #2 } \csuse{blockextras@#2}% % This is a hook for external packages which want to access variants % via babelname (such as biblatex) @@ -2335,6 +2241,7 @@ \def\select@language#1{} % Hook for external packages such as biblatex +% do not rename! \def\polyglossia@language@switched{} % remove all custumization for language #1 @@ -2354,24 +2261,24 @@ \noextrascurrent{\languagename} \cs_if_exist_use:c{no\languagename @numbers} \sys_if_engine_xetex:T{ - \__xpg_if_LR_str:eTF{\prop_item:Ne{\polyglossia@langsetup}{\languagename/direction}} + \__xpg_if_LR_str:eTF{\prop_item:Ne{\g_xpg_langsetup_prop}{\languagename/direction}} { - \__xpg_if_LR_str:eF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}} + \__xpg_if_LR_str:eF{\prop_item:Nn{\g_xpg_langsetup_prop}{#2/direction}} {\setnonlatin} % LTR -> RTL } { - \__xpg_if_LR_str:eT{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}} + \__xpg_if_LR_str:eT{\prop_item:Nn{\g_xpg_langsetup_prop}{#2/direction}} {\setlatin} % RTL -> LTR } } } \polyglossia@set@language@name[#1]{#2} % Set the language's/script's font families - \str_if_eq:eeT{\prop_item:Nn{\polyglossia@langsetup}{#2/lcscript}} {latin} + \str_if_eq:eeT{\prop_item:Nn{\g_xpg_langsetup_prop}{#2/lcscript}} {latin} { \resetfontlatin } - \bool_if:NF \__xpg_inline_lang + \bool_if:NF \l__xpg_inline_lang_bool { % This for non-inline font switches % in case a \<lang>font is defined \xpg@set@normalfont{#2} @@ -2380,7 +2287,7 @@ \__xpg_use_or_warn:c{#2@language} \cs_if_exist_use:c{#2@numbers} \use@localhyphenmins[#1]{#2} - \xpg__french_spacing:n { #2 } + \__xpg_french_spacing:n { #2 } } @@ -2391,14 +2298,14 @@ % \clist_new:N \l_xpg_lang_stack -\cs_new:Nn \polyglossia@stack@language:nn +\cs_new:Nn \__xpg_stack_language:nn { \clist_gpush:Nn \l_xpg_lang_stack {#1:#2} } -\cs_generate_variant:Nn \polyglossia@stack@language:nn {nx} +\cs_generate_variant:Nn \__xpg_stack_language:nn {nx} -\cs_new:Nn \polyglossia@unstack@language:n +\cs_new:Nn \__xpg_unstack_language:n { \clist_gpop:NNTF \l_xpg_lang_stack \l_tmpa_tl { % Stored format = options:language => split: @@ -2408,7 +2315,7 @@ % Execute passed command with language and maybe options % and re-set stored language's keys \tl_if_empty:NTF \l_tmpb_tl {\cs_if_exist_use:c{#1}{\l_tmpc_tl}} - {\polyglossia@set@keys:nn{\l_tmpc_tl}{\l_tmpb_tl} + {\__xpg_set_keys:nn{\l_tmpc_tl}{\l_tmpb_tl} \cs_if_exist_use:c{#1}[\l_tmpb_tl]{\l_tmpc_tl} } } @@ -2419,17 +2326,19 @@ { % Get real current (pre-switch) options (incl. defaults) \clist_clear_new:N \l_xpg_current_options + \prop_if_exist:cF { xpg@current@options@\languagename } + { \prop_new:c {xpg@current@options@\languagename} } \prop_map_inline:cn {xpg@current@options@\languagename} { \clist_put_right:Nn \l_xpg_current_options {##1=##2} } % Store current (pre-switch) options and language on stack - \polyglossia@stack@language:nx{\clist_use:Nn \l_xpg_current_options {,}}{\languagename} + \__xpg_stack_language:nx{\clist_use:Nn \l_xpg_current_options {,}}{\languagename} \selectlanguage[#1]{#2} } { % restore previous language in aux file and remove closed one from stack - \polyglossia@unstack@language:n{xpg@set@language@only@aux} + \__xpg_unstack_language:n{xpg@set@language@only@aux} } \newcommand{\setlocalhyphenmins}[3]{ @@ -2450,17 +2359,17 @@ \edef\xpg@tmp@opts{\xpg_alias_add_to_option_i:nn{#2}{#1}} \edef\xpg@tmp@lang{\xpg_alias_base_lang:n{#2}} \bgroup - \polyglossia@error@iflangnotloaded:n{\xpg@tmp@lang} - \polyglossia@set@keys:nn{\xpg@tmp@lang}{\xpg@tmp@opts} + \xpg_error_if_lang_not_loaded:n{\xpg@tmp@lang} + \__xpg_set_keys:nn{\xpg@tmp@lang}{\xpg@tmp@opts} % Store bcp47.tag@hypenmins \tl_if_blank:nTF {\xpg@tmp@opts}{% \ifcsundef{\csname xpg@tmp@lang\endcsname @g.bcp47.tag}{ - \csedef{tmp@bcp47.tag}{\prop_item:Ne{\polyglossia@langsetup}{ \xpg@tmp@lang / bcp47 }} + \csedef{tmp@bcp47.tag}{\prop_item:Ne{\g_xpg_langsetup_prop}{ \xpg@tmp@lang / bcp47 }} }{ \csedef{tmp@bcp47.tag}{\csuse{#2@g.bcp47.tag}} } }{ - \csedef{tmp@bcp47.tag}{\prop_item:Ne{\polyglossia@langsetup}{ \xpg@tmp@lang / bcp47 }} + \csedef{tmp@bcp47.tag}{\prop_item:Ne{\g_xpg_langsetup_prop}{ \xpg@tmp@lang / bcp47 }} } \csgdef{\csname tmp@bcp47.tag\endcsname @hyphenmins}{{#3}{#4}} \egroup @@ -2469,17 +2378,17 @@ % \use@localhypenmins[options]{lang} \newcommand*\use@localhyphenmins[2][]{ \bgroup - \polyglossia@error@iflangnotloaded:n{#2} - \polyglossia@set@keys:nn{#2}{#1} + \xpg_error_if_lang_not_loaded:n{#2} + \__xpg_set_keys:nn{#2}{#1} % Use bcp47.tag@hypenmins \tl_if_blank:nTF {#1}{ \ifcsundef{#2@g.bcp47.tag}{ - \csxdef{tmp@bcp47.tag}{\prop_item:Nn{\polyglossia@langsetup}{ #2 / bcp47 }} + \csxdef{tmp@bcp47.tag}{\prop_item:Nn{\g_xpg_langsetup_prop}{ #2 / bcp47 }} }{ \csxdef{tmp@bcp47.tag}{\csuse{#2@g.bcp47.tag}} } }{ - \csxdef{tmp@bcp47.tag}{\prop_item:Nn{\polyglossia@langsetup}{ #2 / bcp47 }} + \csxdef{tmp@bcp47.tag}{\prop_item:Nn{\g_xpg_langsetup_prop}{ #2 / bcp47 }} } \egroup \ifcsundef{\csname tmp@bcp47.tag\endcsname @hyphenmins}{ @@ -2493,7 +2402,7 @@ } \sys_if_engine_luatex:T{ % Set \totalhyphenmin if specified - \prop_get:NeNTF \polyglossia@langsetup {#2/totalhyphenmin} \l_tmpa_tl + \prop_get:NeNTF \g_xpg_langsetup_prop {#2/totalhyphenmin} \l_tmpa_tl { \xpg@info{totalhyphenmin: '\l_tmpa_tl'} \expandafter\hyphenationmin \l_tmpa_tl @@ -2513,7 +2422,7 @@ \edef\xpg@tmp@opts{\xpg_alias_add_to_option_i:nn{#2}{#1}} \edef\xpg@tmp@lang{\xpg_alias_base_lang:n{#2}} % Register the language options - \polyglossia@set@lang@options:nnn {\xpg@tmp@lang} {\xpg@tmp@opts} {@xpg@set@langvariant} + \__xpg_set_language_options:nnn {\xpg@tmp@lang} {\xpg@tmp@opts} {@xpg@set@langvariant} % Now switch patterns \__xpg_use_or_warn:c{\use:c{xpg@tmp@lang}@language} % And activate hyphenmins @@ -2522,10 +2431,10 @@ { } \AddToHook{begindocument/before}{ - \@ifpackageloaded{bidi}{ + \IfPackageLoadedTF{bidi}{ \providecommand*{\aemph}[1]{$\overline{\hboxR{#1}}$} }{} - \@ifpackageloaded{luabidi}{ + \IfPackageLoadedTF{luabidi}{ \providecommand*{\aemph}[1]{$\overline{\hbox{\RL{#1}}}$} }{} } @@ -2534,7 +2443,7 @@ % keys for main package \keys_define:nn { polyglossia } { verbose - .bool_set:N = \l_polyglossia_verbose_bool, + .bool_set:N = \g_xpg_verbose_bool, verbose .default:n = true, % compatibility @@ -2542,7 +2451,7 @@ .meta:n = { verbose = false }, localmarks - .bool_set:N = \l_polyglossia_localmarks_bool, + .bool_set:N = \g_xpg_localmarks_bool, localmarks .default:n = true, % compatibility @@ -2550,12 +2459,12 @@ .meta:n = { localmarks = false }, babelshorthands - .bool_set:N = \l_polyglossia_babelshorthands_bool, + .legacy_if_set:n = system@babelshorthands, % compatibility babelshorthands .default:n = true, luatexrenderer - .cs_set:Np = \l_polyglossia_luatex_renderer, + .str_set:N = \g_xpg_luatex_renderer_str, luatexrenderer .value_required:n = true, } @@ -2575,14 +2484,14 @@ % Set the LuaTeX renderer. As opposed to fontspec, we use Harfbuzz by default. % This can be changed via the luatexrenderer package option. \sys_if_engine_luatex:T{ - \str_if_eq:eeF{\l_polyglossia_luatex_renderer}{none} + \str_if_eq:eeF{\g_xpg_luatex_renderer_str}{none} { - \xpg@info{Setting~ LuaTeX~ font~ renderer~ to~ \l_polyglossia_luatex_renderer} - \exp_args:Ne \defaultfontfeatures{Renderer=\l_polyglossia_luatex_renderer} + \xpg@info{Setting~ LuaTeX~ font~ renderer~ to~ \g_xpg_luatex_renderer_str} + \exp_args:Ne \defaultfontfeatures{Renderer=\g_xpg_luatex_renderer_str} } } -\bool_if:nF \l_polyglossia_verbose_bool { +\bool_if:nF \g_xpg_verbose_bool { \gdef\@latex@info#1{\relax} % no latex info \gdef\@font@info#1{\relax} % no latex font info \gdef\@font@warning#1{\relax} % no latex font warnings @@ -2590,46 +2499,92 @@ \gdef\xpg@info#1{\relax} % no polyglossia info } -\bool_if:nT \l_polyglossia_localmarks_bool { - \polyglossia@enable@local@marks: +\bool_if:nT \g_xpg_localmarks_bool { + \__xpg_enable_local_marks: } % Control shorthand (de-)activation % This checks that the shorthand char is only deactivated % if we have activated it ourselves and hence keeps % activation of other packages if no shorthands are used. -\seq_new:N \__xpg_active_shorthands +\seq_new:N \g__xpg_active_shorthands_seq \DeclareDocumentCommand \xpg@activate@shorthands { O{"} } { - \seq_if_in:NnF \__xpg_active_shorthands { #1 } + \seq_if_in:NnF \g__xpg_active_shorthands_seq { #1 } { \bbl@activate{#1} - \seq_gpush:Nn \__xpg_active_shorthands { #1 } + \seq_gpush:Nn \g__xpg_active_shorthands_seq { #1 } } } \DeclareDocumentCommand \xpg@deactivate@shorthands { O{"} } { - \seq_if_in:NnT \__xpg_active_shorthands { #1 } + \seq_if_in:NnT \g__xpg_active_shorthands_seq { #1 } { \cs_if_exist:cT{initiate@active@char}{\bbl@deactivate{#1}} - \seq_remove_all:Nn \__xpg_active_shorthands {#1} + \seq_remove_all:Nn \g__xpg_active_shorthands_seq {#1} } } -% compatibility -\newif\ifsystem@babelshorthands -\bool_if:nTF \l_polyglossia_babelshorthands_bool { - \system@babelshorthandstrue -}{ - \system@babelshorthandsfalse +% Inherit shorthands in other languages +\NewDocumentCommand \inheritbabelshorthands { m m } +{ + \AddToHook{begindocument/before}{ + % Load the involved languages if necessary + % Error if they do not exist + \tl_set:Nn \l__xpg_tmpa_lang_tl { \xpg_alias_base_lang:n{#1} } + \clist_if_in:NeF \xpg@loaded {\l__xpg_tmpa_lang_tl}{ + \file_if_exist:nTF{gloss-\l__xpg_tmpa_lang_tl .ldf} + { \setotherlanguage{#1} } + { \xpg@error{ Source~ language~ #1,~ used~ in~ + \string\inheritbabelshorthands,~ does~ not~ exist } } + } + \tl_set:Nn \l__xpg_tmpb_lang_tl { \xpg_alias_base_lang:n{#2} } + \clist_if_in:NeF \xpg@loaded {\l__xpg_tmpb_lang_tl}{ + \file_if_exist:nTF{gloss-\l__xpg_tmpb_lang_tl .ldf} + { \setotherlanguage{#2} } + { \xpg@error{ Target~ language~ #2,~ used~ in~ + \string\inheritbabelshorthands,~ does~ not~ exist } } + } + % Test whether the requested shorthands exist + \bool_if_exist:NF \l__xpg_no_shorthands_bool + { \bool_new:N \l__xpg_no_shorthands_bool } + \cs_if_exist:cF { \l__xpg_tmpa_lang_tl @shorthands } + { \bool_set_true:N \l__xpg_no_shorthands_bool } + \cs_if_exist:cF { no\l__xpg_tmpa_lang_tl @shorthands } + { \bool_set_true:N \l__xpg_no_shorthands_bool } + \bool_if:nT { \l__xpg_no_shorthands_bool } + { + \xpg@error{ No~ babel~ shorthands~ exist~ for~ language~ #1 } + } + % If so, apply: + \bool_if:nF { \l__xpg_no_shorthands_bool } + { + \exp_args:Ncc \addto { blockextras@\l__xpg_tmpb_lang_tl } { \l__xpg_tmpa_lang_tl @shorthands } + \exp_args:Ncc \addto { inlineextras@\l__xpg_tmpb_lang_tl } { \l__xpg_tmpa_lang_tl @shorthands } + \exp_args:Ncc \addto { noextras@\l__xpg_tmpb_lang_tl } { no\l__xpg_tmpa_lang_tl @shorthands } + } + } } -% -% FIXME these should also be loaded \AtEndOfPackage !!! -\def\xpg@option#1#2{ - \ifcsundef{xpg@main@language}{\setdefaultlanguage}{\setotherlanguage} - [#1]{#2}} +% Activate shorthands of a (loaded) language inline +\NewDocumentCommand \usebabelshorthands { m } +{ + \str_if_eq:nnTF { #1 } { none } + { + % "none" deactivates any shorthands + \languageshorthands{none} + } + { + \tl_set:Nn \l__xpg_tmpa_lang_tl { \xpg_alias_base_lang:n{#1} } + \iflanguageloaded{\l__xpg_tmpa_lang_tl}{ + \use:c{\l__xpg_tmpa_lang_tl @shorthands} + }{ + \xpg@error{ Language~ #1,~ requested~ in~ + \string\startbabelshorthands,~ is~ not~ loaded } + } + } +} \endinput |