summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty')
-rw-r--r--Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty1205
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