diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty | 234 |
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 |