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.sty234
1 files changed, 170 insertions, 64 deletions
diff --git a/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty b/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty
index 620d946b416..42d3da86aa4 100644
--- a/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty
+++ b/Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty
@@ -1,17 +1,12 @@
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{polyglossia}[2020/04/08 v1.49
+\ProvidesPackage{polyglossia}[2020/10/09 v1.50
Modern multilingual typesetting with XeLaTeX and LuaLaTeX]
\RequirePackage{etoolbox}
\RequirePackage{makecmds}
\RequirePackage{xkeyval}[2008/08/13]
% Will raise error if used with anything else than XeTeX or LuaTeX
\RequirePackage{fontspec}[2010/06/08]% v2.0
-% Ironically, ifluatex.sty is included by some other package if we run
-% LuaTeX, but it's not if we run XeTeX, and we need it to know which of
-% the two engines it is! Hence we include it here.
-\RequirePackage{ifluatex}
-% For symmetry with ifluatex
-\RequirePackage{ifxetex}
+\RequirePackage{iftex}
\RequirePackage{expl3}
\RequirePackage{l3keys2e}
\RequirePackage{xparse}
@@ -32,6 +27,7 @@
\def\bbl@cs#1{\csname bbl@#1\endcsname}%
\AtEndPreamble{\let\bbl@set@language\xpg@set@language@aux} %for biblatex
\AtEndPreamble{\let\bbl@main@language\xpg@main@language} %for biblatex
+\providecommand\texorpdfstring[2]{#1}% dummy command if hyperref is not loaded
\ifluatex
\RequirePackage{luatexbase} % already included by fontspec, but needed here
@@ -1031,16 +1027,27 @@
}
\newcommand{\xpg@input}[1]{%
- \chardef\xpg@atcatcode\catcode`\@
+ % Store catcode of @ before making at letter
+ \chardef\xpg@saved@at@catcode\catcode`\@
\makeatletter
- \input{#1}\catcode`\@=\xpg@atcatcode}
+ \input{#1}%
+ % restore former @ catcode
+ \catcode`\@=\xpg@saved@at@catcode%
+}
% try to load a language file
\cs_new:Nn \polyglossia_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}
@@ -1054,8 +1061,8 @@
{
\exp_args:Nx\polyglossia@define@language@cmd:n{#1}%
}{}
- \csgdef{#1@loaded}{}
- \global\edef\xpg@loaded{#1\ifx\xpg@loaded\@empty\else,\xpg@loaded\fi}%
+ \polyglossia@register@language:nn{}{#1}%
+ \csgdef{#1@loaded}{}%
}
@@ -1116,17 +1123,38 @@
\tl_if_blank:nF {#2} {\csgdef{#4@alias@opts}{#2}}%
}
+\cs_new:Nn \polyglossia@register@language:nn {
+ % register polyglossia language name
+ \ifcsundef{#2@registered}{%
+ \global\edef\xpg@loaded{%
+ \ifx\xpg@loaded\@empty\else\xpg@loaded,\fi #2%
+ }%
+ }{}
+ \csgdef{#2@registered}{}%
+ \tl_if_blank:nF {#1}{%
+ % Register the language options
+ \polyglossia@set@lang@options:nn {#2} {#1}%
+ }%
+ % register babelname
+ \def\xpg@tmp@babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ \ifcsundef{\csname xpg@tmp@babelname\endcsname @bbl@registered}{%
+ \global\edef\xpg@bloaded{%
+ \ifx\xpg@bloaded\@empty\else\xpg@bloaded,\fi\xpg@tmp@babelname}%
+ }{}%
+ \csgdef{\csname xpg@tmp@babelname\endcsname @bbl@registered}{}%
+ % register BCP-47 ID
+ \def\xpg@tmp@bcpname{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
+ \ifcsundef{\csname xpg@tmp@bcpname\endcsname @bcp@registered}{%
+ \global\edef\xpg@bcp@loaded{%
+ \ifx\xpg@bcp@loaded\@empty\else\xpg@bcp@loaded,\fi\xpg@tmp@bcpname}%
+ }{}%
+ \csgdef{\csname xpg@tmp@bcpname\endcsname @bcp@registered}{}%
+}
+
+
\newcommand{\setdefaultlanguage}[2][]{%
\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}%
- \global\edef\xpg@bcp@loaded{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}%
- \ifx\xpg@bcp@loaded\@empty\else,\xpg@bcp@loaded\fi}%
- }%
\polyglossia_load_lang_definition:nn{#1}{#2}
% define environment and command (except for internal latex language)
\ifstrequal{#2}{latex}{}{%
@@ -1151,18 +1179,6 @@
\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}%
- \global\edef\xpg@bcp@loaded{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}%
- \ifx\xpg@bcp@loaded\@empty\else,\xpg@bcp@loaded\fi}%
- }%
- \csgdef{#2@loaded}{}%
- }{}
\gdef\xpg@main@language{#2}%
\tl_if_blank:nTF {#1}{\gdef\mainlanguagevariant{}}{%
% Register the language options
@@ -1393,9 +1409,9 @@
\else\csuse@warn{#1@font@rm}\fi\fi}
\def\xpg@set@normalfont#1{%
- \letcs{\rmfamily}{#1@font@rm}%
- \letcs{\sffamily}{#1@font@sf}%
- \letcs{\ttfamily}{#1@font@tt}%
+ \DeclareRobustCommand\rmfamily{\csuse{#1@font@rm}}%
+ \DeclareRobustCommand\sffamily{\csuse{#1@font@sf}}%
+ \DeclareRobustCommand\ttfamily{\csuse{#1@font@tt}}%
\gdef\normalfont{\protect\xpg@select@fontfamily{#1}%
\fontseries{\seriesdefault}\selectfont%
\fontshape{\shapedefault}\selectfont}%
@@ -1431,11 +1447,9 @@
\newcommand{\setotherlanguage}[2][]{%
\ifcsundef{#2@loaded}
{
- \global\edef\xpg@loaded{#2\ifx\xpg@loaded\@empty\else,\xpg@loaded\fi}%
\polyglossia_load_lang_definition:nn{#1}{#2}
% define environment and command
\exp_args:Nx\polyglossia@define@language@cmd:n{#2}
- \csgdef{#2@loaded}{}%
\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}}%
@@ -1446,17 +1460,14 @@
}{%
\polyglossia@set@other@language:nn {#1} {#2}%
}%
+ \csgdef{#2@loaded}{}%
}
{}
}
\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}{}%
- }{}
+ \polyglossia@register@language:nn{#1}{#2}%
% If a variant is set, store it.
\gdef\otherlanguagevariant{}
\tl_if_blank:nTF {#1}{}{%
@@ -1523,6 +1534,7 @@
% wrapper for foreignlanguage and otherlanguage*
\newcommand*\polyglossia@setforeignlanguage[2][]{
\select@@language[#1]{#2}
+ \polyglossia@register@language:nn{#1}{#2}%
% Store babelname of current language (for external packages such as biblatex)
\tl_if_blank:nTF {#1}{%
\ifcsundef{#2@gbabelname}{%
@@ -1678,14 +1690,7 @@
\directlua{polyglossia.select_language('\luatexluaescapestring{\string#3}',
\the\csname l@#3\endcsname)}%
\fi%
- \def\xpg@tmp@babelname{\prop_item:Nn{\polyglossia@langsetup}{#3/babelname}}
- % Store babelname in \xpg@bloaded csv list
- \ifcsundef{\csname xpg@tmp@babelname\endcsname @bbl@loaded}
- {
- \global\edef\xpg@bloaded{\xpg@tmp@babelname%
- \ifx\xpg@bloaded\@empty\else,\xpg@bloaded\fi}%
- \csgdef{\csname xpg@tmp@babelname\endcsname @bbl@loaded}{}%
- }{}
+ \polyglossia@register@language:nn{#2}{#3}%
}
@@ -1876,14 +1881,6 @@
}{%
\csedef{bcp47id}{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
}%
- % Store bcp47 in \xpg@bcp@loaded csv list
- \def\xpg@tmp@bcpname{\csuse{bcp47id}}%
- \ifcsundef{\csname xpg@tmp@bcpname\endcsname @bcp@loaded}
- {
- \global\edef\xpg@bcp@loaded{\xpg@tmp@bcpname%
- \ifx\xpg@bcp@loaded\@empty\else,\xpg@bcp@loaded\fi}%
- \csgdef{\csname xpg@tmp@bcpname\endcsname @bcp@loaded}{}%
- }{}
\@select@language[#1]{#2}%
% Write to the aux
\if@filesw%
@@ -2039,7 +2036,7 @@
\cs_if_exist_use:c{date@bbl@\babelname}%
\polyglossia@local@marks:n{#2}%
\csuse{init@extras@#2}%
- \polyglossia@lang@indentfirst:n{#2}
+ \polyglossia@lang@indentfirst:n{#2}%
\csuse{blockextras@#2}%
% This is a hook for external packages which want to access variants
% via babelname (such as biblatex)
@@ -2087,7 +2084,7 @@
\xpg@select@fontfamily{#2}%
\csuse@warn{#2@language}%
\csuse{#2@numbers}%
- \use@localhyphenmins{#2}%
+ \use@localhyphenmins[#1]{#2}%
\polyglossia@lang@frenchspacing:n{#2}
}
@@ -2124,14 +2121,66 @@
\fi
}{%
\xpg@warning{\string\setlocalhyphenmin\space~ useless~ for~ unknown~ language~ #1}%
- }}%
+ }%
+}%
+
+% \setlanghyphenmins[options]{lang}{l}{r}
+\newcommand*\setlanghyphenmins[4][]{%
+ % Check for real language name and options
+ \edef\xpg@tmp@lang{#2}%
+ \edef\xpg@tmp@opts{#1}%
+ \ifcsdef{#2@alias@lang}{%
+ \edef\xpg@tmp@lang{\csuse{#2@alias@lang}}%
+ \ifcsdef{#2@alias@opts}{%
+ \edef\xpg@tmp@opts{\csuse{#2@alias@opts},#1}%
+ }{}%
+ }{}%
+ \bgroup
+ \polyglossia@error@iflangnotloaded:n{\xpg@tmp@lang}
+ \exp_args:Nne \setkeys{\xpg@tmp@lang}{\xpg@tmp@opts}%
+ % Store BCP-47 id of language
+ \tl_if_blank:nTF {\xpg@tmp@opts}{%
+ \ifcsundef{\csname xpg@tmp@lang\endcsname @gbcp47id}{%
+ \csedef{tmp@bcp47id}{\exp_args:Nne\prop_item:Nn{\polyglossia@langsetup}{\xpg@tmp@lang /bcp47}}%
+ }{%
+ \csedef{tmp@bcp47id}{\csuse{#2@gbcp47id}}%
+ }%
+ }{%
+ \csedef{tmp@bcp47id}{\exp_args:Nne \prop_item:Nn{\polyglossia@langsetup}{\xpg@tmp@lang /bcp47}}%
+ }%
+ \xpg@warning{id: \csuse{tmp@bcp47id}}%
+ \csgdef{\csname tmp@bcp47id\endcsname @hyphenmins}{{#3}{#4}}%
+ \egroup
+}
-\def\use@localhyphenmins#1{%
- \ifcsundef{#1hyphenmins}{}%
- {\expandafter\expandafter\expandafter\set@hyphenmins\csname #1hyphenmins\endcsname\relax}
+% \use@localhypenmins[options]{lang}
+\newcommand*\use@localhyphenmins[2][]{%
+ \bgroup
+ \polyglossia@error@iflangnotloaded:n{#2}
+ \setkeys{#2}{#1}%
+ % Store BCP-47 id of language
+ \tl_if_blank:nTF {#1}{%
+ \ifcsundef{#2@gbcp47id}{%
+ \csxdef{tmp@bcp47id}{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
+ }{%
+ \csxdef{tmp@bcp47id}{\csuse{#2@gbcp47id}}%
+ }%
+ }{%
+ \csxdef{tmp@bcp47id}{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
+ }%
+ \egroup
+ \ifcsundef{\csname tmp@bcp47id\endcsname @hyphenmins}{%
+ \ifcsundef{#2hyphenmins}{}%
+ {%
+ \expandafter\expandafter\expandafter\set@hyphenmins\csname #2hyphenmins\endcsname\relax%
+ }
+ }{%
+ \edef\tmpa{\csuse{\csname tmp@bcp47id\endcsname @hyphenmins}}%
+ \expandafter\expandafter\expandafter\set@hyphenmins\tmpa\relax%
+ }
\ifluatex
% Set \totalhyphenmin if specified
- \prop_get:NxNTF \polyglossia@langsetup {#1/totalhyphenmin} \l_tmpa_tl
+ \prop_get:NxNTF \polyglossia@langsetup {#2/totalhyphenmin} \l_tmpa_tl
{
\xpg@warning{totalhyphenmin: '\l_tmpa_tl'}
\expandafter\hyphenationmin \l_tmpa_tl%
@@ -2140,6 +2189,47 @@
\fi
}
+% Babel previously compiled in hyphenrules into the kernel (via hyphen.cfg)
+% but this is no longer the case. In any case, we roll our own one now
+% and possibly overwrite babel's.
+\provideenvironment{hyphenrules}{}{}
+
+% As opposed to the one inherited from switch.def/babel, our environment
+% supports language options and aliases.
+\renewenvironment{hyphenrules}[2][]
+{%
+ % We usually embrace the switch in groups to keep the changes local.
+ % We cannot do this if an LTR environmet starts in an RTL paragraph,
+ % as bidi interferes here badly with its directionality smartness.
+ \ifxetex
+ \str_if_eq:eeT{\exp_args:Nne\prop_item:Nn{\polyglossia@langsetup}{\languagename/direction}}{RL}%
+ {%
+ \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#1/direction}}{RL}%
+ {}% RTL -> RTL
+ {\ifvmode\else\booltrue{xpg@noset@groups}\fi}% RTL -> LTR
+ }%
+ \fi%
+ \ifbool{xpg@noset@groups}{}{\xpg@set@group@aux}%
+ % Check for real language name and options
+ \edef\xpg@tmp@lang{#2}%
+ \edef\xpg@tmp@opts{#1}%
+ \ifcsdef{#2@alias@lang}{%
+ \edef\xpg@tmp@lang{\csuse{#2@alias@lang}}%
+ \ifcsdef{#2@alias@opts}{%
+ \edef\xpg@tmp@opts{\csuse{#2@alias@opts},#1}%
+ }{}%
+ }{}%
+ \tl_if_blank:nF {\xpg@tmp@opts}{%
+ % Register the language options
+ \polyglossia@set@lang@options:nn {\xpg@tmp@lang} {\xpg@tmp@opts}%
+ }%
+ % Now switch patterns
+ \csuse@warn{\csuse{xpg@tmp@lang}@language}%
+ % And activate hyphenmins
+ \use@localhyphenmins[\xpg@tmp@opts]{\xpg@tmp@lang}%
+}
+{\ifbool{xpg@noset@groups}{}{\xpg@unset@group@aux}}
+
\AtEndPreamble{%
\@ifpackageloaded{bidi}{%
\providecommand*{\aemph}[1]{$\overline{\hboxR{#1}}$}%
@@ -2172,12 +2262,18 @@
.bool_set:N = \l_polyglossia_babelshorthands_bool,
babelshorthands
.default:n = true,
+
+ luatexrenderer
+ .cs_set:Np = \l_polyglossia_luatex_renderer,
+ luatexrenderer
+ .value_required:n = true,
}
\keys_set:nn { polyglossia } {
localmarks = false,
verbose = true,
babelshorthands = false,
+ luatexrenderer = Harfbuzz
}
% load by default latex
@@ -2185,6 +2281,16 @@
% then process key in order to overwrite
\ProcessKeysOptions{polyglossia}
+% Set the LuaTeX renderer. As opposed to fontspec, we use Harfbuzz by default.
+% This can be changed via the luatexrenderer package option.
+\ifluatex
+ \exp_args:Nee \str_if_eq:nnF{\l_polyglossia_luatex_renderer}{none}
+ {
+ \xpg@info{Setting~ LuaTeX~ font~ renderer~ to~ \l_polyglossia_luatex_renderer}
+ \exp_args:Nee \defaultfontfeatures{Renderer=\l_polyglossia_luatex_renderer}
+ }
+\fi
+
\bool_if:nTF \l_polyglossia_verbose_bool {} {
\gdef\@latex@info#1{\relax}% no latex info
\gdef\@font@info#1{\relax}% no latex font info