summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-11-15 21:41:34 +0000
committerKarl Berry <karl@freefriends.org>2019-11-15 21:41:34 +0000
commit6024de648c5e4b1bcb3630cecc307ca55db9ae8e (patch)
treed9c6878e5900d0c9ea4de20694e550b88ef0ad8d /Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty
parent7ebe75c756258ce417125e376f199df4fd5b47a9 (diff)
polyglossia (15nov19)
git-svn-id: svn://tug.org/texlive/trunk@52808 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty')
-rw-r--r--Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty325
1 files changed, 267 insertions, 58 deletions
diff --git a/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty b/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty
index 4f419e14ddd..9cdb503c1ab 100644
--- a/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty
+++ b/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty
@@ -1,5 +1,5 @@
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{polyglossia}[2019/10/27 v1.45
+\ProvidesPackage{polyglossia}[2019/11/15 v1.46
Alternative to Babel for XeLaTeX and LuaLaTeX]
\RequirePackage{etoolbox}
\RequirePackage{makecmds}
@@ -324,7 +324,14 @@
\xpg@set@hyphenation@patterns{#1}
}
}
- {
+ {%
+ % Since this function is sometimes called from the gloss files
+ % directly, we need to check whether the requested hyphenname exists.
+ \xpg@ifdefined{#1}{}%
+ {%
+ \xpg@nopatterns{#1}
+ \expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax%
+ }%
\xpg@set@hyphenation@patterns{#1}
}
}
@@ -667,7 +674,7 @@
}
\cs_new_nopar:Nn{\polyglossia@lang@frenchspacing:n}{
- \prop_get:NnNTF \polyglossia@langsetup {#1/frenchspacing} \l_tmpa_tl
+ \prop_get:NxNTF \polyglossia@langsetup {#1/frenchspacing} \l_tmpa_tl
{
\str_case_e:nnF{\l_tmpa_tl}{
{true}{\frenchspacing}
@@ -682,7 +689,7 @@
}
\cs_new_nopar:Nn{\polyglossia@lang@indentfirst:n}{
- \prop_get:NnNTF \polyglossia@langsetup {#1/indentfirst} \l_tmpa_tl
+ \prop_get:NxNTF \polyglossia@langsetup {#1/indentfirst} \l_tmpa_tl
{
\str_case_e:nnF{\l_tmpa_tl}{
{true}{\french@indent}
@@ -698,7 +705,7 @@
\cs_new:Nn{\polyglossia@lang@setpardirection:n}{
- \prop_get:NnNTF \polyglossia@langsetup {#1/direction} \l_tmpa_tl
+ \prop_get:NxNTF \polyglossia@langsetup {#1/direction} \l_tmpa_tl
{
\polyglossia@setpardirection:n{\l_tmpa_tl}
}
@@ -710,7 +717,7 @@
\cs_new:Nn{\polyglossia@lang@settextdirection:nn}{
- \prop_get:NnNTF \polyglossia@langsetup {#1/direction} \l_tmpa_tl
+ \prop_get:NxNTF \polyglossia@langsetup {#1/direction} \l_tmpa_tl
{
\polyglossia@settextdirection:n{\l_tmpa_tl}{#2}
}
@@ -1003,21 +1010,73 @@
}
}
+% load a master language from an alias file
+\newcommand*\xpg@load@master@language[1] {
+ \xpg@input{gloss-#1.ldf}
+ \csgdef{#1@loaded}{}
+ \global\edef\xpg@loaded{#1\ifx\xpg@loaded\@empty\else,\xpg@loaded\fi}%
+}
+
% define environment and command
\cs_new:Nn \polyglossia@define@language@cmd:n {
- \exp_args:Ne
- \newenvironment {\prop_item:Nn{\polyglossia@langsetup}{#1/envname}} [1] []
- {
- \begin{otherlanguage}[##1]{#1}
- }%
- {
- \end{otherlanguage}
- }%
- \exp_args:Nc \newcommand {text#1} [2][]
- {%
- \xpg@textlanguage[##1]{#1}{##2}%
+ \ifcsundef{#1@alias@lang}{%
+ \exp_args:Ne
+ \newenvironment {\prop_item:Nn{\polyglossia@langsetup}{#1/envname}} [1] []
+ {
+ \begin{otherlanguage}[##1]{#1}
+ }%
+ {
+ \end{otherlanguage}
+ }%
+ \exp_args:Nc \newcommand {text#1} [2][]
+ {%
+ \xpg@textlanguage[##1]{#1}{##2}%
+ }%
+ }{}
+}
+
+% provide way to define alias environment and command
+% \setlanguagealias[<options>]{<language>}{<alias>}
+\DeclareDocumentCommand \setlanguagealias {s O{} m m}
+{
+ \ifcsundef{#4@alias@lang}{%
+ \exp_args:Ne
+ \newenvironment {#4}
+ {
+ \begin{otherlanguage}[#2]{#3}
+ }%
+ {
+ \end{otherlanguage}
+ }%
+ % The starred version does not define \text<alias>
+ \IfBooleanF {#1}
+ {
+ \exp_args:Nc \newcommand {text#4} [2][]
+ {%
+ \xpg@textlanguage[#2,##1]{#3}{##2}%
+ }%
+ }%
+ }{%
+ \exp_args:Ne
+ \renewenvironment {#4}
+ {
+ \begin{otherlanguage}[#2]{#3}
+ }%
+ {
+ \end{otherlanguage}
+ }%
+ % The starred version does not (re)define \text<alias>
+ \IfBooleanF {#1}
+ {
+ \exp_args:Nc \renewcommand {text#4} [2][]
+ {%
+ \xpg@textlanguage[#2,##1]{#3}{##2}%
+ }%
+ }%
}%
+ \csgdef{#4@alias@lang}{#3}%
+ \tl_if_blank:nF {#2} {\csgdef{#4@alias@opts}{#2}}%
}
\newcommand{\setdefaultlanguage}[2][]{%
@@ -1032,13 +1091,37 @@
\polyglossia_load_lang_definition:nn{#1}{#2}
% define environment and command (except for internal latex language)
\ifstrequal{#2}{latex}{}{%
- \polyglossia@define@language@cmd:n{#2}
+ \exp_args:Nx\polyglossia@define@language@cmd:n{#2}
}%
\csgdef{#2@loaded}{}%
}
{
\relax
}
+ \ifcsdef{#2@alias@lang}{%
+ \ifcsdef{#2@alias@opts}{%
+ \exp_args:Nxx \polyglossia_load_lang_definition:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}%
+ \exp_args:Nxx \polyglossia@set@default@language:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}%
+ }{%
+ \polyglossia@set@default@language:nn {#1} {\csuse{#2@alias@lang}}%
+ }%
+ }{%
+ \polyglossia@set@default@language:nn {#1} {#2}%
+ }%
+}
+
+\cs_new:Nn \polyglossia@set@default@language:nn
+{
+ \ifcsundef{#2@loaded}%
+ {
+ % latex is an internal language, so do not record
+ \ifstrequal{#2}{latex}{}{%
+ \global\edef\xpg@loaded{#2\ifx\xpg@loaded\@empty\else,\xpg@loaded\fi}%
+ \global\edef\xpg@bloaded{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}%
+ \ifx\xpg@bloaded\@empty\else,\xpg@bloaded\fi}%
+ }%
+ \csgdef{#2@loaded}{}%
+ }{}
\gdef\xpg@main@language{#2}%
\tl_if_blank:nTF {#1}{\gdef\mainlanguagevariant{}}{%
% If the optional argument sets a value for the key “variant”,
@@ -1047,8 +1130,7 @@
\xpg@parsevariantkeyvalue##1=@xpg@main@langvariant\relax
}%
}%
- % Store babelname of main language (for external packages such as biblatex)
- \xdef\mainbabelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ \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
\str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}}{RL}{%
@@ -1064,8 +1146,14 @@
\xpg@info{Default~ language~ is~ #2}%
\polyglossia@set@language@name[#1]{#2}%
\def\mainlanguagename{#2}
+ % Store babelname of main language (for external packages such as biblatex)
+ \prop_get:NxNT \polyglossia@langsetup {#2/babelname} \l_tmpa_tl
+ { \edef\mainbabelname{\l_tmpa_tl} }
% Store babelname of current language (for external packages such as biblatex)
- \xdef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ \prop_get:NxNT \polyglossia@langsetup {#2/babelname} \l_tmpa_tl
+ { \edef\babelname{\l_tmpa_tl}%
+ \csgdef{#2@gbabelname}{\babelname}%
+ }
\ifluatex %
\directlua{polyglossia.set_default_language('\luatexluaescapestring{\string#2}')}%
\fi %
@@ -1115,14 +1203,44 @@
\selectlanguage[#1]{#2}%
\selectbackgroundlanguage{#2}%
% Store babelname of current language (for external packages such as biblatex)
- \xdef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ \tl_if_blank:nTF {#1}{%
+ \ifcsundef{#2@gbabelname}{%
+ \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ }{%
+ \edef\babelname{\csuse{#2@gbabelname}}%
+ }%
+ }{%
+ \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ }%
}
% This saves the normalfont for the latin script since we may change normalfont in other scripts
\let\normalfontlatin=\normalfont%
-\let\rmfamilylatin=\rmfamily%
-\let\sffamilylatin=\sffamily%
-\let\ttfamilylatin=\ttfamily%
+
+% Provide default fonts (as set with \setmainfont, \setsansfont and \setmonofont)
+% for Latin scripts and as a fallback for non-Latin scripts.
+\DeclareRobustCommand\xpg@defaultfont@rm{%
+ \tl_if_empty:NF{\g__fontspec_nfss_enc_tl}{\fontencoding{\g__fontspec_nfss_enc_tl}}%
+ \fontfamily\rmdefault%
+ \selectfont%
+}
+\DeclareRobustCommand\xpg@defaultfont@sf{%
+ \tl_if_empty:NF{\g__fontspec_nfss_enc_tl}{\fontencoding{\g__fontspec_nfss_enc_tl}}%
+ \fontfamily\sfdefault%
+ \selectfont%
+}
+\DeclareRobustCommand\xpg@defaultfont@tt{%
+ \tl_if_empty:NF{\g__fontspec_nfss_enc_tl}{\fontencoding{\g__fontspec_nfss_enc_tl}}%
+ \fontfamily\ttdefault%
+ \selectfont%
+}
+
+% These switches activate the default fonts
+% Note that a simple \let\rmfamilylatin=\rmfamily
+% does not work reliably (see #24)
+\cs_gset_eq:cc{rmfamilylatin}{xpg@defaultfont@rm}%
+\cs_gset_eq:cc{sffamilylatin}{xpg@defaultfont@sf}%
+\cs_gset_eq:cc{ttfamilylatin}{xpg@defaultfont@tt}%
\def\xpg@set@familydefault{%
% We need the \edef route here in order
@@ -1144,15 +1262,16 @@
% This (re-)saves the normalfont for the latin script since we may
% change normalfont in other scripts
\let\normalfontlatin=\normalfont%
- \let\rmfamilylatin=\rmfamily%
- \let\sffamilylatin=\sffamily%
- \let\ttfamilylatin=\ttfamily%
+ % And for all cases, we also reset \<xx>familylatin
+ \cs_gset_eq:cc{rmfamilylatin}{xpg@defaultfont@rm}%
+ \cs_gset_eq:cc{sffamilylatin}{xpg@defaultfont@sf}%
+ \cs_gset_eq:cc{ttfamilylatin}{xpg@defaultfont@tt}%
}
\def\resetfontlatin{%
- \let\rmfamily=\rmfamilylatin%
- \let\sffamily=\sffamilylatin%
- \let\ttfamily=\ttfamilylatin%
+ \cs_gset_eq:cc{rmfamily}{xpg@defaultfont@rm}%
+ \cs_gset_eq:cc{sffamily}{xpg@defaultfont@sf}%
+ \cs_gset_eq:cc{ttfamily}{xpg@defaultfont@tt}%
\global\let\normalfont=\normalfontlatin}
\def\selectfontfamilylatin{%
@@ -1197,19 +1316,42 @@
\global\edef\xpg@loaded{#2\ifx\xpg@loaded\@empty\else,\xpg@loaded\fi}%
\polyglossia_load_lang_definition:nn{#1}{#2}
% define environment and command
- \polyglossia@define@language@cmd:n{#2}
+ \exp_args:Nx\polyglossia@define@language@cmd:n{#2}
\csgdef{#2@loaded}{}%
- % If a variant is set, store it.
- \gdef\otherlanguagevariant{}
- \tl_if_blank:nTF {#1}{}{%
- % If the optional argument sets a value for the key “variant”,
- % store it in \xpg@main@langvariant
- \clist_map_inline:nn { #1 } {%
- \xpg@parsevariantkeyvalue##1=@xpg@other@langvariant\relax
- }%
+ \ifcsdef{#2@alias@lang}{%
+ \ifcsdef{#2@alias@opts}{%
+ \exp_args:Nxx \polyglossia_load_lang_definition:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}%
+ \exp_args:Nxx \polyglossia@set@other@language:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}%
+ }{%
+ \polyglossia@set@other@language:nn {#1} {\csuse{#2@alias@lang}}%
+ }%
+ }{%
+ \polyglossia@set@other@language:nn {#1} {#2}%
}%
- \csgdef{#2@gvar}{\otherlanguagevariant}%
+ }
+ {}
+}
+
+\cs_new:Nn \polyglossia@set@other@language:nn
+{
+ \ifcsundef{#2@loaded}
+ {
+ \global\edef\xpg@loaded{#2\ifx\xpg@loaded\@empty\else,\xpg@loaded\fi}%
+ \csgdef{#2@loaded}{}%
}{}
+ % If a variant is set, store it.
+ \gdef\otherlanguagevariant{}
+ \tl_if_blank:nTF {#1}{}{%
+ % If the optional argument sets a value for the key “variant”,
+ % store it in \xpg@other@langvariant
+ \clist_map_inline:nn { #1 } {%
+ \xpg@parsevariantkeyvalue##1=@xpg@other@langvariant\relax
+ }%
+ }%
+ \csgdef{#2@gvar}{\otherlanguagevariant}%
+ \prop_get:NxNT \polyglossia@langsetup {#2/babelname} \l_tmpa_tl
+ { \xdef\otherlanguagebabelname{\l_tmpa_tl} }
+ \csgdef{#2@gbabelname}{\otherlanguagebabelname}%
}
% Store main language variant for external packages
@@ -1219,7 +1361,7 @@
\newcommand\setotherlanguages[1]{%
\def\do##1{\setotherlanguage{##1}}%
- \docsvlist{#1}}%
+ \exp_args:Nx\docsvlist{#1}}%
\def\common@language{% FIXME is this really needed???
\ifbool{xpg@hyphenation@disabled}{%
@@ -1234,13 +1376,38 @@
\common@language%
}
+
+% Alias to \text<lang>, but more suitable
+% for specific (esp. tag-based) aliases
+% where \text<alias> would cause clashes
+% (e.g., \textit)
+\newcommand\textlang[3][]{%
+ \ifcsdef{#2@alias@lang}{%
+ \ifcsdef{#2@alias@opts}{%
+ \xpg@textlanguage[\csuse{#2@alias@opts},#1]{\csuse{#2@alias@lang}}{#3}%
+ }{%
+ \xpg@textlanguage[#1]{\csuse{#2@alias@lang}}{#3}%
+ }%
+ }{%
+ \xpg@textlanguage[#1]{#2}{#3}%
+ }%
+}%
+
\providecommand{\foreignlanguage}{}
% wrapper for foreignlanguage and otherlanguage*
\newcommand*\polyglossia@setforeignlanguage[2][]{
\select@@language[#1]{#2}
% Store babelname of current language (for external packages such as biblatex)
- \xdef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ \tl_if_blank:nTF {#1}{%
+ \ifcsundef{#2@gbabelname}{%
+ \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ }{%
+ \edef\babelname{\csuse{#2@gbabelname}}%
+ }%
+ }{%
+ \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ }%
}
% joint code of \foreignlanguage, otherlanguage*
@@ -1248,7 +1415,7 @@
\newcommand{\xpg@otherlanguage}[2][]
{%
\polyglossia@error@iflangnotloaded:n{#2}
- \setkeys{#2}{#1}%
+ \exp_args:Nne \setkeys{#2}{#1}%
\polyglossia@setforeignlanguage[#1]{#2}
% buggy restoration heure
\csuse{inlineextras@#2}%
@@ -1259,7 +1426,20 @@
\renewcommand{\foreignlanguage}[3][]
{%
- \polyglossia@error@iflangnotloaded:n{#2}
+ \ifcsdef{#2@alias@lang}{%
+ \ifcsdef{#2@alias@opts}{%
+ \polyglossia@foreignlanguage:nnn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}} {#3}%
+ }{%
+ \polyglossia@foreignlanguage:nnn {#1} {\csuse{#2@alias@lang}} {#3}%
+ }%
+ }{%
+ \polyglossia@foreignlanguage:nnn {#1} {#2} {#3}%
+ }%
+}
+
+\cs_new:Nn \polyglossia@foreignlanguage:nnn
+{
+ \polyglossia@error@iflangnotloaded:n{#2}
\bgroup
\xpg@otherlanguage[#1]{#2}%
\polyglossia@lang@settextdirection:nn{#2}{#3}%
@@ -1271,12 +1451,25 @@
\renewenvironment{otherlanguage*}[2][]
{%
+ \ifcsdef{#2@alias@lang}{%
+ \ifcsdef{#2@alias@opts}{%
+ \polyglossia@otherlanguage:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}%
+ }{%
+ \polyglossia@otherlanguage:nn {#1} {\csuse{#2@alias@lang}}%
+ }%
+ }{%
+ \polyglossia@otherlanguage:nn {#1} {#2}%
+ }%
+}
+{\egroup}
+
+\cs_new:Nn \polyglossia@otherlanguage:nn
+{
\xpg@otherlanguage[#1]{#2}%
\polyglossia@lang@settextdirection:nn{#2}\bgroup%
}
-{\egroup}
-% use by \text<lang>. Equivalent to \foreignlanguage,
+% use by \text<lang> and \textlang. Equivalent to \foreignlanguage,
% except that dates are localized.
\newcommand*\xpg@textlanguage[3][]{%
\polyglossia@error@iflangnotloaded:n{#2}
@@ -1315,10 +1508,23 @@
\DeclareDocumentCommand \selectlanguage {s O{} m}
{%
- \polyglossia@error@iflangnotloaded:n{#3}
+ \ifcsdef{#3@alias@lang}{%
+ \ifcsdef{#3@alias@opts}{%
+ \polyglossia@select@language:nnn {#1} {\csuse{#3@alias@opts},#2} {\csuse{#3@alias@lang}}%
+ }{%
+ \polyglossia@select@language:nnn {#1} {#2} {\csuse{#3@alias@lang}}%
+ }%
+ }{%
+ \polyglossia@error@iflangnotloaded:n{#3}%
+ \polyglossia@select@language:nnn {#1} {#2} {#3}%
+ }
+}
+
+\cs_new:Nn \polyglossia@select@language:nnn
+{
\IfBooleanF {#1}
{
- \tl_set:Nx \xpg@pop@language { \exp_not:N \xpg@pop@language@i {#2} {#3} }
+ \cs_set_nopar:Npx \xpg@pop@language { \exp_not:N \xpg@pop@language@i {#2} {#3} }
\group_insert_after:N \xpg@pop@language
}
\tl_if_blank:nTF {#2}{}{%
@@ -1326,7 +1532,7 @@
\clist_map_inline:nn { #2 } {%
\xpg@parsevariantkeyvalue##1=@xpg@langvariant\relax
}%
- \setkeys{#3}{#2}%
+ \exp_args:Nne \setkeys{#3}{#2}%
}%
% The starred variant does not write to the aux
\IfBooleanTF#1{%
@@ -1386,7 +1592,15 @@
\newcommand*{\xpg@set@language@aux}[2][]{%
% Store babelname of current language (for external packages such as biblatex)
- \xdef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ \tl_if_blank:nTF {#1}{%
+ \ifcsundef{#2@gbabelname}{%
+ \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ }{%
+ \edef\babelname{\csuse{#2@gbabelname}}%
+ }%
+ }{%
+ \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ }%
\@select@language[#1]{#2}%
% Write to the aux
\if@filesw%
@@ -1491,11 +1705,6 @@
\fi
}
-% FIXME: Remove after gloss-latin (last user) has been rewritten)
-\newcommand\xpg@set@language@luatex@ii[1]{%
- \xpg@set@bbl@hyphendata{\expandafter\the\csname l@#1\endcsname}
-}
-
\newcommand*\@select@language[2][]{
% hook for compatibility with biblatex
@@ -1564,9 +1773,9 @@
\provideenvironment{otherlanguage}{}{}
\renewenvironment{otherlanguage}[2][]
-{
+{%
\xpg@set@group@aux%
- \selectlanguage[#1]{#2}
+ \selectlanguage[#1]{#2}%
}
{\xpg@unset@group@aux}