ssme-thesis/polyglossia.sty

872 lines
30 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{polyglossia}[2015/03/25 v1.42.4
Alternative to Babel for 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}
% fontspec now uses LaTeX3 packages such as expl3, so we need this:
\ExplSyntaxOn
%% This is for compatibility with Babel-aware package:
\cslet{ver@babel.sty}{\@empty} % this "fakes" babel
\def\languageshorthands#1{\relax} %this is for scrlttr2 class
\AtEndPreamble{\let\bbl@set@language\xpg@set@language} %for biblatex
\AtEndPreamble{\let\bbl@main@language\xpg@main@language} %for biblatex
\ifluatex
\RequirePackage{luatexbase} % already included by fontspec, but needed here
\RequireLuaModule{polyglossia}
\fi
% Useful for getting list of loaded languages and variants. Like babel's bbl@loaded
\let\xpg@loaded\@empty
\let\xpg@vloaded\@empty
%% custom message macros
\providecommand*{\xpg@error}[1]{%
\PackageError{polyglossia}{#1}{}%
}
\providecommand*{\xpg@warning}[1]{%
\PackageWarning{polyglossia}{#1}%
}
\providecommand*{\xpg@info}[1]{%
\PackageInfo{polyglossia}%
{#1\@gobble}%
} %% the \@gobble is to prevent displaying the line nr
%TODO change all instances of \xpg@nopatterns in gloss-*.ldf files
\providecommand*{\xpg@nopatterns@fallback}[2][nohyphenation]{%
\xpg@warning{No~ hyphenation~ patterns~ were~ loaded~ for~ `#2'\MessageBreak
I~ will~ use~ \string\language=\string\l@ #1\space instead}%
\expandafter\adddialect\csname l@#2\expandafter\endcsname\csname l@#1\endcsname\relax}
\providecommand*{\xpg@nopatterns}[1]{%
\xpg@warning{No~ hyphenation~ patterns~ were~ loaded~ for~ `#1'\MessageBreak
I~ will~ use~ \string\language=\string\l@nohyphenation\space instead}%
%%TODO? \expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax
}
\def\xpg@ill@value#1#2{%
\xpg@warning{Illegal~ value~ (#1)~ for~ #2}}
%% use macro if defined, else warn that it is not
\def\csuse@warn#1{%
\ifcsundef{#1}{\xpg@warning{ \expandafter\string\csname #1\endcsname\space is~ not~ defined}}%
{\csname #1\endcsname}}
%% ensure directionality if bidi is loaded, else ignore
\def\@@ensure@dir#1{\ifcsundef{@ensure@dir}{#1}{\@ensure@dir{#1}}}
\def\@@ensure@maindir#1{\ifcsundef{@ensure@maindir}{#1}{\@ensure@maindir{#1}}}
%% Used by the language definitions files for right-to-left languages
\def\RequireBidi{%
\ifxetex
\RequirePackage{bidi}
\else\ifluatex
\RequirePackage{luabidi}
\else
\xpg@warning{Youre running a TeX engine that is not LuaTeX or XeTeX.\MessageBreak
That is almost guaranteed to cause problems.}
\fi\fi}
%% compatibility with babel
\let\addto\gappto% gappto is defined in etoolbox
%% == Utility macros ==
%% They are needed because \MakeUppercase and \MakeLowercase are protected,
%% but we need to change case while defining csnames when setting up fonts for
%% non-Latin scripts. For instance with "Script=Arabic" we need to lowercase
%% "Arabic" to create \arabicfont.
\def\xpg@uppercasefirst#1{\expandafter\xpg@@uppercasefirst #1}
\def\xpg@@uppercasefirst#1{%
\if a#1A\else
\if b#1B\else
\if c#1C\else
\if d#1D\else
\if e#1E\else
\if f#1F\else
\if g#1G\else
\if h#1H\else
\if i#1I\else
\if j#1J\else
\if k#1K\else
\if l#1L\else
\if m#1M\else
\if n#1N\else
\if o#1O\else
\if p#1P\else
\if q#1Q\else
\if r#1R\else
\if s#1S\else
\if t#1T\else
\if u#1U\else
\if v#1V\else
\if w#1W\else
\if x#1X\else
\if y#1Y\else
\if z#1Z\else
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
}
\def\xpg@lowercasefirst#1{\expandafter\xpg@@lowercasefirst #1}
\def\xpg@@lowercasefirst#1{%
\if A#1a\else
\if B#1b\else
\if C#1c\else
\if D#1d\else
\if E#1e\else
\if F#1f\else
\if G#1g\else
\if H#1h\else
\if I#1i\else
\if J#1j\else
\if K#1k\else
\if L#1l\else
\if M#1m\else
\if N#1n\else
\if O#1o\else
\if P#1p\else
\if Q#1q\else
\if R#1r\else
\if S#1s\else
\if T#1t\else
\if U#1u\else
\if V#1v\else
\if W#1w\else
\if X#1x\else
\if Y#1y\else
\if Z#1z\else
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
}
%% NEW EXPERIMENTAL SETUP INTERFACE FOR GLOSS FILES
%% options currently available:
%% language : the name of the language (as understood by fontspec)
%% hyphennames : the different hyphenation patterns to try (comma separated list)
%%% TODO: if pattern is prefixed by !, then it should be loaded as a fallback, with \xpg@nopatterns@fallback - i.e. with a warning: e.g. sanskrit for hindi, or catalan for asturian. Also for languages with variants! (English and German, etc.)
%% script : the name of the script (as understood by fontspec) default is Latin
%% direction : the direction of the script: LR or RL
%% scripttag : the OpenType tag for the script
%% langtag : the OpenType tag for the language
%% hyphenmins : the hyphenmins for this language (comma-sep list of two integers)
%% frenchspacing : boolean
%% indentfirst : boolean
%% fontsetup : boolean
%% TODO: nouppercase : boolean (for scripts like Arabic, Devanagari, etc which have no concept of uppercase/lowercase)
%% TODO: localalph = {<alph_csname>,<Alph_csname>}
%% TODO: localnumber = <csname>
%% or even better localdigits = {0123456789} for fully automatic setup
\newif\if@xpg@language@really@defined@
\newcommand*\PolyglossiaSetup[2]{%
%define booleans etoolbox style and set defaults
%% TODO ? \providetoggle{#1@setup@done}%
\providetoggle{#1@RL}%
\providetoggle{#1@latin}\toggletrue{#1@latin}%
\providetoggle{#1@scriptlangequal}% whether lang and script names are same: e.g. Hebrew, Arabic
\providebool{#1@fontsetup}%
\providebool{#1@indentfirst}%
\providebool{#1@frenchspacing}%
% 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?
\csgdef{xpg@langname@#1}{\xpg@uppercasefirst{#1}}%
%needed for docsvlist with hyphennames key:
\def\do##1{%
\xpg@check@ifdefined{#1}
\if@xpg@language@really@defined@\else
\ifstrequal{#1}{##1}{}%
{\xpg@ifdefined{##1}%
{\expandafter\ifx\csname l@##1\endcsname\l@nohyphenation\else\csletcs{l@#1}{l@##1}\xpg@set@language@luatex@iv{##1}\fi}%
{\csdef{l@##1}{l@nohyphenation}}%
}%
\fi
}%
%define all keys:
\xpg@define@keys{#1}%
\setkeys[xpg@setup]{#1}{#2}%
% here we do the fontsetup:
\ifbool{#1@fontsetup}%
{\xpg@fontsetup@auto{#1}}%
{\xpg@info{Skipping~ automatic~ font~ setup~ for~ language~ #1}}%
%% TODO? \toggletrue{#1@setup@done}%
% reinit \do
\def\do##1{\setotherlanguage{##1}}%
}
\def\xpg@first#1,#2{#1}
\def\xpg@second#1,#2{#2}
\def\xpg@define@keys#1{%
\define@key[xpg@setup]{#1}{script}{%
\ifstrequal{##1}{Latin}%
{\toggletrue{#1@latin}}%
{\togglefalse{#1@latin}}%
\csgdef{xpg@scriptname@#1}{##1}%
\csgdef{xpg@scriptname@#1@lc}{\xpg@lowercasefirst{##1}}}%
\define@key[xpg@setup]{#1}{scripttag}{%
\csgdef{xpg@scripttag@#1}{##1}}%
\define@key[xpg@setup]{#1}{language}{%
\csgdef{xpg@langname@#1}{##1}}%
\define@key[xpg@setup]{#1}{langtag}{%
\csgdef{xpg@langtag@#1}{##1}}%
\define@key[xpg@setup]{#1}{hyphennames}[{#1}]{%
\docsvlist{##1}%
% if l@#1 does not yet exist,
% we assign it to nohyphenation
% we do this here in case the hyphennames key was omitted
\xpg@ifdefined{#1}{}%
{\xpg@nopatterns{\csname xpg@langname@#1\endcsname}%
\expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax}%
\csdef{#1@language}{%
\ifbool{xpg@hyphenation@disabled}{%
\xdef\xpg@lastlanguage{\the\csname l@#1\endcsname}%
}{%
\ifluatex%
\xpg@set@language@luatex@iv{#1}%
\fi%
\language=\csname l@#1\endcsname%
}%
}%
}%
\define@choicekey+[xpg@setup]{#1}{direction}[\val\nr]{LR,RL}[LR]%
{\ifcase\nr\relax
\togglefalse{#1@RL}%
\or
\toggletrue{#1@RL}%
\ifcsundef{RTL}{\ifluatex\RequirePackage{luabidi}\else\RequirePackage{bidi}\fi}{}% FIXME Use \RequireBidi and remove calls in individual gloss files.
\fi}%
{\xpg@warning{#1: Invalid value \val\space for key "direction"}}%
\define@key[xpg@setup]{#1}{hyphenmins}[{2,3}]%
{\begingroup\edef\x{\endgroup
\noexpand\setlocalhyphenmins{#1}{\xpg@first##1}{\xpg@second##1}}\x}
\define@boolkey[xpg@setup]{#1}[#1@]{frenchspacing}[true]{%
\ifbool{#1@frenchspacing}%
{\csgappto{init@extras@#1}{\frenchspacing}}%
{\csgappto{init@extras@#1}{\nonfrenchspacing}}}%
\define@boolkey[xpg@setup]{#1}[#1@]{indentfirst}[true]{%
\ifbool{#1@indentfirst}%
{\csgappto{init@extras@#1}{\french@indent}}%
{\csgappto{init@extras@#1}{\nofrench@indent}}}%
% \define@choicekey*+[xpg@setup]{#1}{fontsetup}[\val\nr]{none,custom,auto}[none]%
% %{\csgdef{#1@fontsetup}{\val}}%
% {\xpg@fontsetup{\val}{#1}}%
% {\xpg@warning{Invalid value \val\space for key "fontsetup" in module "#1"}}%
\define@boolkey[xpg@setup]{#1}[#1@]{fontsetup}[true]{}%
%TODO assign csnames corr. to localized alph and Alph
% \define@key[xpg@setup]{#1}{localalph}[{#1@alph,#1@Alph}]{%
% \cslet{xpg@localalph@#1}{\expandafter\csname\xpg@first##1\endcsname}%
% \cslet{xpg@localAlph@#1}{\expandafter\csname\xpg@second##1\endcsname}%
%}%
%TODO same thing with localdigits
}
\def\xpg@lastlanguage{0}%
\providebool{xpg@hyphenation@disabled}%
\boolfalse{xpg@hyphenation@disabled}
\def\xpg@disablehyphenation{%
\ifbool{xpg@hyphenation@disabled}{}{%
\booltrue{xpg@hyphenation@disabled}%
\xdef\xpg@lastlanguage{\the\language}%
\xpg@set@language@luatex@iv{nohyphenation}
\language=\l@nohyphenation%
\ifluatex %
\directlua{polyglossia.disable_hyphenation()}%
\fi %
}%
}
\def\xpg@enablehyphenation{%
\ifbool{xpg@hyphenation@disabled}{%
\boolfalse{xpg@hyphenation@disabled}%
\language=\csname xpg@lastlanguage\endcsname%
\ifluatex %
\directlua{polyglossia.enable_hyphenation()}%
\fi %
}{}%
}
\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}}
\def\xpg@fontsetup@auto#1{\iftoggle{#1@latin}%
{\xpg@fontsetup@latin{#1}}%
{\xpg@fontsetup@nonlatin{#1}}%
}
\def\xpg@addfontfeature@lang#1#2{% #1 is langtag, #2 is langname
% Turkish is a special case: tag can be TRK or TUR
\edef\tmp@Turkish{Turkish}%
\edef\tmp@@langname{#2}%
% \ifstrequal{#2}{Turkish}%
\ifx\tmp@@langname\tmp@Turkish
\fontspec_if_language:nTF {TRK}%
{\addfontfeature{Language=Turkish}}%
{\fontspec_if_language:nTF {TUR}%
{\addfontfeature{Language=Turkish}}%
{}}%
% else not Turkish
\else
\edef\tmp@@langparam{Language=#2}%
\expandafter\expandafter\expandafter\fontspec_if_language:nTF \expandafter{#1}%
{\expandafter\expandafter\expandafter\addfontfeature\expandafter{\tmp@@langparam}}%
{}%
\fi
}
\def\xpg@addfontfeature@script#1#2{% #1 is scripttag, #2 is scriptname
\edef\tmp@@scriptparam{Script=#2}%
\expandafter\expandafter\expandafter\fontspec_if_script:nTF \expandafter{#1}%
{\expandafter\expandafter\expandafter\addfontfeature\expandafter{\tmp@@scriptparam}}%
{\xpg@error{The~ current~ roman~ font~ does~ not~ contain~ the~ \expandafter\noexpand#2 ~ script!\MessageBreak
Please~ define~ \expandafter\string\csname \xpg@lowercasefirst{#2}font\endcsname\space with~ \string\newfontfamily}}%
}
\def\xpg@fontsetup@latin#1{%
\begingroup
\csgdef{#1@font@rm}{%
\ifcsdef{#1font}{\csname #1font\endcsname}%
{\edef\tmp@langtag{\csuse{xpg@langtag@#1}}%
\edef\tmp@langname{\csuse{xpg@langname@#1}}%
\rmfamilylatin%
\ifcsvoid{xpg@langtag@#1}{}{%
\ifcsvoid{xpg@langname@#1}{}{%
\xpg@addfontfeature@lang{\tmp@langtag}{\tmp@langname}}%
}}}%
\csgdef{#1@font@sf}{%
\ifcsdef{#1fontsf}{\csname #1fontsf\endcsname}%
{\edef\tmp@langtag{\csuse{xpg@langtag@#1}}%
\edef\tmp@langname{\csuse{xpg@langname@#1}}%
\sffamilylatin%
\ifcsvoid{xpg@langtag@#1}{}{%
\ifcsvoid{xpg@langname@#1}{}{%
\xpg@addfontfeature@lang{\tmp@langtag}{\tmp@langname}}%
}}}%
\csgdef{#1@font@tt}{%
\ifcsdef{#1fonttt}{\csname #1fonttt\endcsname}%
{\edef\tmp@langtag{\csuse{xpg@langtag@#1}}%
\edef\tmp@langname{\csuse{xpg@langname@#1}}%
\ttfamilylatin%
\ifcsvoid{xpg@langtag@#1}{}{%
\ifcsvoid{xpg@langname@#1}{}{%
\xpg@addfontfeature@lang{\tmp@langtag}{\tmp@langname}}%
}}}%
\endgroup
}
\def\xpg@fontsetup@nonlatin#1{%
\begingroup
\edef\tmp@langname@lc{#1}% eg ukrainian
\edef\tmp@scriptname@lc{\csuse{xpg@scriptname@#1@lc}}% eg cyrillic
\ifx\tmp@scriptname@lc\tmp@langname@lc
\toggletrue{#1@scriptlangequal}%
\else
\togglefalse{#1@scriptlangequal}%
\fi
\csgdef{#1@font@rm}{%
\ifcsdef{#1font}%
{\@nameuse{#1font}}%
{\edef\tmp@scripttag{\csuse{xpg@scripttag@#1}}% eg cyrl
\edef\tmp@scriptname{\csuse{xpg@scriptname@#1}}% eg Cyrillic
\edef\tmp@langtag{\csuse{xpg@langtag@#1}}% eg UKR
\edef\tmp@langname{\csuse{xpg@langname@#1}}% eg Ukrainian
\providetoggle{#1@use@script@font}%
\iftoggle{#1@scriptlangequal}%
{\rmfamilylatin}%
{\expandafter\ifcsname\csuse{xpg@scriptname@#1@lc} font\endcsname% eg \cyrillicfont
\toggletrue{#1@use@script@font}%
\expandafter\csname\csuse{xpg@scriptname@#1@lc} font\endcsname
\else
\rmfamilylatin
\fi}
\iftoggle{#1@use@script@font}{}{%
\ifcsvoid{xpg@scripttag@#1}{}{%
\ifcsvoid{xpg@scriptname@#1}{}{%
\xpg@addfontfeature@script{\tmp@scripttag}{\tmp@scriptname}}}}%
\ifcsvoid{xpg@langtag@#1}{}{%
\ifcsvoid{xpg@langname@#1}{}{%
\xpg@addfontfeature@lang{\tmp@langtag}{\tmp@langname}}}%
}}%
\csgdef{#1@font@sf}{%
\ifcsdef{#1fontsf}%
{\@nameuse{#1fontsf}}%
{\edef\tmp@scripttag{\csuse{xpg@scripttag@#1}}% eg cyrl
\edef\tmp@scriptname{\csuse{xpg@scriptname@#1}}% eg Cyrillic
\edef\tmp@langtag{\csuse{xpg@langtag@#1}}% eg UKR
\edef\tmp@langname{\csuse{xpg@langname@#1}}% eg Ukrainian
\providetoggle{#1@use@script@fontsf}%
\iftoggle{#1@scriptlangequal}%
{\sffamilylatin}%
{\expandafter\ifcsname\csuse{xpg@scriptname@#1@lc} fontsf\endcsname% eg \cyrillicfontsf
\toggletrue{#1@use@script@fontsf}%
\expandafter\csname\csuse{xpg@scriptname@#1@lc} fontsf\endcsname
\else
\sffamilylatin
\fi}
\iftoggle{#1@use@script@fontsf}{}{%
\ifcsvoid{xpg@scripttag@#1}{}{%
\ifcsvoid{xpg@scriptname@#1}{}{%
\xpg@addfontfeature@script{\tmp@scripttag}{\tmp@scriptname}}}}%
\ifcsvoid{xpg@langtag@#1}{}{%
\ifcsvoid{xpg@langname@#1}{}{%
\xpg@addfontfeature@lang{\tmp@langtag}{\tmp@langname}}}%
}}%
\csgdef{#1@font@tt}{%
\ifcsdef{#1fonttt}%
{\@nameuse{#1fonttt}}%
{\edef\tmp@scripttag{\csuse{xpg@scripttag@#1}}% eg cyrl
\edef\tmp@scriptname{\csuse{xpg@scriptname@#1}}% eg Cyrillic
\edef\tmp@langtag{\csuse{xpg@langtag@#1}}% eg UKR
\edef\tmp@langname{\csuse{xpg@langname@#1}}% eg Ukrainian
\providetoggle{#1@use@script@fonttt}%
\iftoggle{#1@scriptlangequal}%
{\ttfamilylatin}%
{\expandafter\ifcsname\csuse{xpg@scriptname@#1@lc} fonttt\endcsname% eg \cyrillicfonttt
\toggletrue{#1@use@script@fonttt}%
\expandafter\csname\csuse{xpg@scriptname@#1@lc} fonttt\endcsname
\else
\ttfamilylatin
\fi}
\iftoggle{#1@use@script@fonttt}{}{%
\ifcsvoid{xpg@scripttag@#1}{}{%
\ifcsvoid{xpg@scriptname@#1}{}{%
\xpg@addfontfeature@script{\tmp@scripttag}{\tmp@scriptname}}}}%
\ifcsvoid{xpg@langtag@#1}{}{%
\ifcsvoid{xpg@langname@#1}{}{%
\xpg@addfontfeature@lang{\tmp@langtag}{\tmp@langname}}}%
}}%
\endgroup
}
%%% END OF PolyglossiaSetup
%% ensure localization of \markright and \markboth commands
%%% THIS IS NOW DISABLED BY DEFAULT
\define@boolkey{polyglossia}[xpg@]{localmarks}[false]{%
\ifbool{xpg@localmarks}{%
\xpg@info{Option:~ localmarks}%
\def\local@marks##1{%
\def\markboth####1####2{%
\begingroup
\let\label\relax \let\index\relax \let\glossary\relax
\unrestored@protected@xdef\@themark
{{\foreignlanguage{##1}{%
\protect\@@ensure@maindir{####1}}}%
{\foreignlanguage{##1}{%
\protect\@@ensure@maindir{####2}}}}%
\@temptokena \expandafter{\@themark}%
\mark{\the\@temptokena}%
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi}%
\def\markright####1{%
\begingroup
\let\label\relax \let\index\relax \let\glossary\relax
\expandafter\@markright\@themark
{\foreignlanguage{##1}{\protect\@@ensure@maindir{####1}}}%
\@temptokena \expandafter{\@themark}%
\mark{\the\@temptokena}%
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi}%
\def\@markright####1####2####3{\@temptokena{\protect\@@ensure@maindir{####1}}%
\unrestored@protected@xdef\@themark{{\the\@temptokena}%
{\protect\@@ensure@maindir{####3}}}}}%
}{% else
\def\local@marks##1{}%
}%
}
\setkeys{polyglossia}{localmarks=false}
% 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)
\@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{File~ gloss-#1.ldf~ does~ not~ exist!\MessageBreak
I~ will~ nevertheless~ try~ to~ use~ hyphenation~ patterns~ for~ #1.}%
\PolyglossiaSetup{#1}{hyphenmins,hyphennames={#1},fontsetup=true}%
% the above amounts to:
%\ifcsundef{l@#1}%
% {\expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax}%
% {\setlocalhyphenmins{#1}{2}{3}}%
%\csdef{#1@language}{\language=\csname l@#1\endcsname}%
}
\newcommand{\xpg@input}[1]{%
\chardef\xpg@atcatcode\catcode`\@
\makeatletter
\input{#1}\catcode`\@=\xpg@atcatcode}
\newcommand{\setdefaultlanguage}[2][]{%
\edef\xpg@loaded{#2\ifx\xpg@loaded\@empty\else,\xpg@loaded\fi}%
\IfFileExists{gloss-#2.ldf}%
{\ifcsundef{#2@loaded}%
{\xpg@input{gloss-#2.ldf}%
\xpg@info{Default~ language~ is~ #2}%
\def\languagename{#2}%
\ifluatex %
\directlua{polyglossia.set_default_language('\luatexluaescapestring{\string#2}')}%
\fi %
% This is needed because \arabic is a built-in LaTeX command:
% so now we have \begin{Arabic}... instead of \begin{arabic}...
\ifstrequal{#2}{arabic}%
{\newenvironment{Arabic}[1][]{\begin{otherlanguage}[####1]{arabic}}%
{\end{otherlanguage}}}%
{\newenvironment{#2}[1][]{\begin{otherlanguage}[####1]{#2}}%
{\end{otherlanguage}}}%
\expandafter\newcommand\csname text#2\endcsname[2][]{%
\ifcsdef{RTL}%
{\iftoggle{#2@RL}%
{\@ensure@RTL{\foreignlanguage[####1]{#2}{####2}}}%
{\@ensure@LTR{\foreignlanguage[####1]{#2}{####2}}}%
}% else bidi not loaded
{\iftoggle{#2@RL}%
{\xpg@error{Language~ #2~ is~ right-to-left,~ but~ bidi~ package~ was~ not~ loaded!}}%
{\foreignlanguage[####1]{#2}{####2}}%
}%
}%
\csletcs{local#2}{text#2}%
\csgdef{#2@loaded}{}%
\gdef\xpg@main@language{#2}%
}%
{\xpg@warning{gloss-#2.ldf~ is~ already~ loaded!}}%:
%% The following settings are for the default language and script:
\iftoggle{#2@RL}{\@RTLmaintrue}{}% this tells bidi.sty that the document is RTL
\AtBeginDocument{%
\selectlanguage[#1]{#2}%
\selectbackgroundlanguage{#2}}%
}%
%ELSE
{\xpg@nogloss{#2}}%
}
\let\setmainlanguage=\setdefaultlanguage
\newcommand{\resetdefaultlanguage}[2][]{%
\ifcsundef{#2@loaded}{%
\xpg@error{gloss-#2.ldf~ is~ not~ loaded!}}%
{\csuse{no\xpg@main@language @globalnumbers}% disable globalnumbers of previously defined default language
\csuse{noextras@\xpg@main@language}%
\csuse{init@noextras@\xpg@main@language}%
\def\languagename{#2}%
\iftoggle{#2@RL}{\@rlmaintrue\@rl@footnotetrue}{}%
\selectlanguage[#1]{#2}%
\selectbackgroundlanguage{#2}}}
\expandafter\ifx\familydefault\sfdefault
\def\familytype{sf}
\else\expandafter\ifx\familydefault\ttdefault
\def\familytype{tt}
\else
\def\familytype{rm}
\fi\fi
% This robustifies the redefinitions of \<xx>family (suggestion by Enrico Gregorio)
% e.g. to prevent expansion of the \familytype redefinition in auxiliary files
\csgappto{rmfamily~}{\def\familytype{rm}}
\csgappto{sffamily~}{\def\familytype{sf}}
\csgappto{ttfamily~}{\def\familytype{tt}}
% 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%
\def\resetfontlatin{%
\let\rmfamily=\rmfamilylatin%
\let\sffamily=\sffamilylatin%
\let\ttfamily=\ttfamilylatin%
\let\normalfont=\normalfontlatin}
\def\selectfontfamilylatin{%
\def\tmp@tt{tt}\def\tmp@sf{sf}%
\ifx\familytype\tmp@tt%
\ttfamilylatin%
\else\ifx\familytype\tmp@sf%
\sffamilylatin%
\else\rmfamilylatin\fi\fi}
\def\xpg@select@fontfamily#1{%
\def\tmp@tt{tt}\def\tmp@sf{sf}%
\ifx\familytype\tmp@tt
\csuse@warn{#1@font@tt}%
\else\ifx\familytype\tmp@sf
\csuse@warn{#1@font@sf}%
\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}%
\gdef\normalfont{\protect\xpg@select@fontfamily{#1}}%
\gdef\reset@font{\protect\normalfont}%
}
\let\@@fterindentfalse\@afterindentfalse
\def\french@indent{\let\@afterindentfalse\@afterindenttrue
\@afterindenttrue}
\def\nofrench@indent{\let\@afterindentfalse\@@fterindentfalse
\@afterindentfalse}
\newcommand{\selectbackgroundlanguage}[1]{%
\iftoggle{#1@latin}{}{\xpg@set@normalfont{#1}}%
\csuse{#1@globalnumbers}%
}
\newcommand{\setotherlanguage}[2][]{%
\edef\xpg@loaded{#2\ifx\xpg@loaded\@empty\else,\xpg@loaded\fi}%
\IfFileExists{gloss-#2.ldf}%
{\ifcsundef{#2@loaded}%
{\xpg@input{gloss-#2.ldf}%
\setkeys{#2}{#1}%
\edef\@tmpa{arabic}%
\edef\@tmpb{#2}%
\ifx\@tmpb\@tmpa%
\newenvironment{Arabic}[1][]{\begin{otherlanguage}[####1]{arabic}}%
{\end{otherlanguage}}%
\else
\newenvironment{#2}[1][]{\begin{otherlanguage}[####1]{#2}}%
{\end{otherlanguage}}%
\fi
\expandafter\newcommand\csname text#2\endcsname[2][]{%
\ifcsdef{RTL}%
{\iftoggle{#2@RL}%
{\@ensure@RTL{\foreignlanguage[####1]{#2}{####2}}}%
{\@ensure@LTR{\foreignlanguage[####1]{#2}{####2}}}%
}% else bidi not loaded
{\iftoggle{#2@RL}%
{\xpg@error{Language~ #2~ is~ right-to-left,~ but~ bidi~ package~ was~ not~ loaded!}}%
{\foreignlanguage[####1]{#2}{####2}}%
}%
}%
\csletcs{local#2}{text#2}%
\csgdef{#2@loaded}{}%
}%
{\xpg@warning{gloss-#2.ldf~ is~ already~ loaded!}}%
}%
%ELSE
{\xpg@nogloss{#2}}%
}
\newcommand\setotherlanguages[1]{%
\def\do##1{\setotherlanguage{##1}}%
\docsvlist{#1}}%
\def\common@language{% FIXME is this really needed???
\ifbool{xpg@hyphenation@disabled}{%
\xdef\xpg@lastlanguage{\z@}%
}{%
\language=\z@
}%
\lefthyphenmin=\tw@
\righthyphenmin=\thr@@}
\def\noextrascurrent#1{\csuse{noextras@#1}}
\def\xpg@initial@setup{\ifcsundef{languagename}{}%
{\noextrascurrent{\languagename}}%
\common@language}
\AtBeginDocument{\xpg@initial@setup}
\providecommand{\foreignlanguage}{}
\renewcommand{\foreignlanguage}[3][]{%
\ifcsundef{#2@loaded}%
{\xpg@nogloss{#2}}%
{{\select@@language{#2}%
\setkeys{#2}{#1}%
\use@localhyphenmins{#2}%
\ifbool{#2@frenchspacing}{\frenchspacing}{\nonfrenchspacing}%
\csuse{inlineextras@#2}%
#3}%
}%
}
% otherlanguage* is the environment equivalent of \foreignlanguage
\expandafter\providecommand\csname otherlanguage*\endcsname{}
\renewenvironment{otherlanguage*}[2][]{%
\ifcsundef{#2@loaded}%
{\xpg@nogloss{#2}}%
{\select@@language{#2}%
\setkeys{#2}{#1}%
\use@localhyphenmins{#2}%
\ifbool{#2@frenchspacing}{\frenchspacing}{\nonfrenchspacing}%
\csuse{inlineextras@#2}\csuse{date#2}%
}%
}{}
%Hook that other package authors can use
%(for instance biblatex):
\newcommand*{\xpg@hook@setlanguage}{}
\providecommand{\selectlanguage}{}
\renewcommand{\selectlanguage}[2][]{%
\ifcsundef{#2@loaded}%
{\xpg@nogloss{#2}}%
{\def\xpg@pop@language{%
\xpg@set@language{\languagename}%
\xpg@hook@setlanguage%
\let\emp@langname\@undefined}%
\aftergroup\xpg@pop@language%
% If the optional argument sets a value for the key “variant”, copy it to xpg@langvariant
\def\do##1{%
\def\xpg@parsekeyvalue####1=####2\relax{%
\def\@tmpa{####1}
\def\@tmpb{variant}
\ifx\@tmpa\@tmpb\setkeys{xpg@langvariant}{##1}\fi
}%
\xpg@parsekeyvalue##1=\relax
}%
\docsvlist{#1}
\setkeys{#2}{#1}%
\xpg@set@language{#2}%
}%
}
% Save any variant in csv list of variants
\define@key{xpg@langvariant}{variant}{%
\edef\xpg@vloaded{#1\ifx\xpg@vloaded\@empty\else,\xpg@vloaded\fi}}
\newcommand{\xpg@set@language}[1]{%
\select@language{#1}%
\if@filesw%
\protected@write\@auxout{}{\protect\select@language{#1}}%
\addtocontents{toc}{\protect\select@language{#1}}%
\addtocontents{lof}{\protect\select@language{#1}}%
\addtocontents{lot}{\protect\select@language{#1}}%
\fi
}
\def\xpg@set@language@luatex@iii#1#2{%
% here we use lu@texhyphen@loaded@\the\language, the same as in babel
\ifcsdef{bbl@hyphendata@#2}{}{%
\global\@namedef{bbl@hyphendata@\the\language}{}%
\directlua{polyglossia.select_language('\luatexluaescapestring{\string#1}', \the\csname l@#1\endcsname)}%
}
}
\newcommand\xpg@check@ifdefined[1]{%
\expandafter\ifx\csname l@#1\endcsname\relax\@xpg@language@really@defined@false\else
\ifx\csname l@#1\endcsname\l@nohyphenation\@xpg@language@really@defined@false\else
\@xpg@language@really@defined@true
\fi
\fi
}
\newcommand\xpg@ifdefined[3]{%
\ifluatex
\xpg@set@language@luatex@iv{#1}%
\fi
\xpg@check@ifdefined{#1}
\if@xpg@language@really@defined@#2\else#3\fi
}%
\newcommand\xpg@set@language@luatex@iv[1]{%
\ifluatex
\xpg@check@ifdefined{#1}%
\if@xpg@language@really@defined@\else
\expandafter\chardef\csname l@#1\endcsname=\directlua{tex.sprint(polyglossia.newloader('#1'))}%
\fi
\language\directlua{tex.sprint(polyglossia.newloader('#1'))}%
\fi
}
\newcommand\xpg@set@language@luatex@ii[1]{%
\ifluatex %
\xpg@set@language@luatex@iii{#1}{\expandafter\the\csname l@#1\endcsname}
\fi %
}
\def\select@language#1{%
\ifluatex %
\xpg@set@language@luatex@iii{#1}{\the\language}
\fi %
\xpg@initial@setup%
\select@@language{#1}%
\ifcsundef{setRL}{}%
{\iftoggle{#1@RL}{\setRL}{\setLR}}%
\csuse{captions#1}%
\local@marks{#1}%
\csuse{init@extras@#1}%
\csuse{blockextras@#1}%
}
% Common code for `\select@language' and `\foreignlanguage'.
\newcommand{\select@@language}[1]{%
\edef\languagename{#1}%
\xpg@select@fontfamily{#1}%
\csuse@warn{#1@language}%
\csuse{date#1}%
\csuse{#1@numbers}%
\use@localhyphenmins{#1}%
}
\let\xpg@pop@language\relax
\provideenvironment{otherlanguage}{}{}
\renewenvironment{otherlanguage}[2][]
{\selectlanguage[#1]{#2}}
{}
\newcommand{\setlocalhyphenmins}[3]{%
\xpg@ifdefined{#1}{%
\expandafter\ifx\csname l@#1\endcsname\l@nohyphenation%
\xpg@warning{\string\setlocalhyphenmin\space~ useless~ for~ unhyphenated~ language~ #1}%
\else
\providehyphenmins{#1}{#2#3}%
\fi
}{%
\xpg@warning{\string\setlocalhyphenmin\space~ useless~ for~ unknown~ language~ #1}%
}}%
\def\use@localhyphenmins#1{%
\ifcsundef{#1hyphenmins}{}%
{\expandafter\expandafter\expandafter\set@hyphenmins\csname #1hyphenmins\endcsname\relax}}
\define@boolkey{polyglossia}[system@]{babelshorthands}[false]{}
\AtEndPreamble{\@ifpackageloaded{bidi}{\providecommand*{\aemph}[1]{$\overline{\hboxR{#1}}$}}{}}% TODO Make that work for luabidi too.
%% Package Options %%
\DeclareOption{nolocalmarks}{\setkeys{polyglossia}{localmarks=false}}
\DeclareOption{localmarks}{\setkeys{polyglossia}{localmarks=true}}
\DeclareOption{babelshorthands}{\setkeys{polyglossia}{babelshorthands=true}}
\DeclareOption{quiet}{%
\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
\gdef\zf@PackageInfo#1{\relax}% no fontspec info
\gdef\xpg@info#1{\relax}}% no polyglossia info
%
% FIXME these should also be loaded \AtEndOfPackage !!!
\def\xpg@option#1#2{%
\ifcsundef{xpg@main@language}{\setdefaultlanguage}{\setotherlanguage}%
[#1]{#2}}
\ExplSyntaxOff
\ProcessOptions*
\endinput