diff options
author | Karl Berry <karl@freefriends.org> | 2019-11-15 21:41:34 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2019-11-15 21:41:34 +0000 |
commit | 6024de648c5e4b1bcb3630cecc307ca55db9ae8e (patch) | |
tree | d9c6878e5900d0c9ea4de20694e550b88ef0ad8d /Master/texmf-dist/tex/latex/polyglossia/polyglossia.sty | |
parent | 7ebe75c756258ce417125e376f199df4fd5b47a9 (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.sty | 325 |
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} |