summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/xelatex/polyglossia/polyglossia.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/xelatex/polyglossia/polyglossia.sty')
-rw-r--r--Master/texmf-dist/tex/xelatex/polyglossia/polyglossia.sty703
1 files changed, 540 insertions, 163 deletions
diff --git a/Master/texmf-dist/tex/xelatex/polyglossia/polyglossia.sty b/Master/texmf-dist/tex/xelatex/polyglossia/polyglossia.sty
index 02889374b43..f990db9fd3b 100644
--- a/Master/texmf-dist/tex/xelatex/polyglossia/polyglossia.sty
+++ b/Master/texmf-dist/tex/xelatex/polyglossia/polyglossia.sty
@@ -1,9 +1,17 @@
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{polyglossia}[2010/03/23 v1.1.1
+\ProvidesPackage{polyglossia}[2010/07/15 v1.2.0
Babel replacement for XeLaTeX]
\RequirePackage{etoolbox}
\RequirePackage{makecmds}
-\RequirePackage{fontspec} %which itself depends on xkeyval
+\RequirePackage{fontspec}[2010/06/08]% v2.0
+% fontspec now uses LaTeX3 packages such as expl3, so we need this:
+% TODO is is possible to localize this further?
+\ExplSyntaxOn
+
+\ifcsundef{newXeTeXintercharclass}{%
+ \xpg@error{Your~ xelatex~ format~ appears~ to~ be~ outdated!^^J
+~~~~Please~ update~ your~ system~ and~ recreate~ it~ with~ fmtutil.}
+ }{}
%% This is for compatibility with Babel-aware package:
\cslet{ver@babel.sty}{\@empty} % this "fakes" babel
@@ -11,26 +19,41 @@
\AtEndPreamble{\let\bbl@set@language\xpg@set@language} %for biblatex
\AtEndPreamble{\let\bbl@main@language\xpg@main@language} %for biblatex
+%% for \docvslist (etoolbox)
+\providecommand*{\do}[1]{}%
+
%% custom message macros
+\providecommand*{\xpg@error}[1]{%
+ \PackageError{polyglossia}{#1}{}%
+}
+
\providecommand*{\xpg@warning}[1]{%
- \PackageWarning{polyglossia}%
- {#1}}
+ \PackageWarning{polyglossia}{#1}%
+}
+
\providecommand*{\xpg@info}[1]{%
\PackageInfo{polyglossia}%
- {#1\@gobble}} %% the \@gobble is to prevent displaying the line nr
-\providecommand*{\xpg@nopatterns}[1]{%
- \xpg@warning{No hyphenation patterns were loaded for `#1'\MessageBreak
- I will use the patterns for \string\language=\string\l@nohyphenation\space instead}}
-\providecommand*{\xpg@nolang}[1]{%
- \xpg@warning{File gloss-#1.ldf does not exist!^^J
- I will nevertheless try to use hyphenation patterns for #1.}}%
- %TODO try at least to load the hyphenation patterns for #1.
+ {#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}}
+ \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}}%
+ \ifcsundef{#1}{\xpg@warning{ \expandafter\string\csname #1\endcsname\space is~ not~ defined}}%
{\csname #1\endcsname}}
%% ensure directionality if bidi is loaded, else ignore
@@ -39,44 +62,377 @@
%% 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.
+%% 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
+
+\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 docvslist with hyphennames key:
+ \renewcommand*{\do}[1]{%
+ \ifcsdef{l@#1}{}{%
+ \ifstrequal{#1}{##1}{}%
+ {\ifcsdef{l@##1}%
+ {\csletcs{l@#1}{l@##1}\listbreak}%
+ {}%
+ }%
+ }%
+ }%
+ %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
+ \renewcommand*{\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
+ \ifcsundef{l@#1}%
+ {\xpg@nopatterns{\csname xpg@langname@#1\endcsname}%
+ \expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax}{}%
+ \csdef{#1@language}{\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}{\RequirePackage{bidi}}{}%
+ \fi}%
+ {\xpg@warning{#1: Invalid value \val\space for key "direction"}}%
+ \define@key[xpg@setup]{#1}{hyphenmins}[{2,3}]%
+ {\edef\@tmpfirst{\xpg@first##1}%
+ \edef\@tmpsecond{\xpg@second##1}%
+ \setlocalhyphenmins{#1}{\@tmpfirst}{\@tmpsecond}}%
+ \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@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{^^J
+ The~ current~ roman~ font~ does~ not~ contain~ the~ \expandafter\noexpand#2 ~ script!^^J
+ 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
-\def\opt@enabled{on}
-\def\opt@disabled{off}
-\define@key{polyglossia}{localmarks}[on]{%
- \def\@tmpa{#1}
- \ifx\@tmpa\opt@enabled
+%%% 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}{%
+ \begingroup
+ \let\label\relax \let\index\relax \let\glossary\relax
+ \unrestored@protected@xdef\@themark
+ {{\foreignlanguage{##1}{%
\protect\@@ensure@maindir{####1}}}%
- {\foreignlanguage{##1}{%
+ {\foreignlanguage{##1}{%
\protect\@@ensure@maindir{####2}}}}%
\@temptokena \expandafter{\@themark}%
\mark{\the\@temptokena}%
- \endgroup%
+ \endgroup
\if@nobreak\ifvmode\nobreak\fi\fi}%
\def\markright####1{%
- \begingroup%
- \let\label\relax \let\index\relax \let\glossary\relax%
- \expandafter\@markright\@themark%
+ \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%
+ \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{}
- \xpg@info{Option: localmarks=off}
- \fi
+ {\protect\@@ensure@maindir{####3}}}}}%
+ }{% else
+ \def\local@marks##1{}%
+ }%
}
-\setkeys{polyglossia}{localmarks=on}
+\setkeys{polyglossia}{localmarks=false}
% to reset the intercharclass of a character to "normal"
\newXeTeXintercharclass\xpg@normalclass %TODO
@@ -85,80 +441,89 @@
%% (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!^^J
+ 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{\setdefaultlanguage}[2][]{%
\IfFileExists{gloss-#2.ldf}%
{\ifcsundef{#2@loaded}%
{\input{gloss-#2.ldf}%
- \xpg@info{Default language is #2.}
+ \xpg@info{Default~ language~ is~ #2.}
\def\languagename{#2}%
% This is needed because \arabic is a built-in LaTeX command:
- % so now we have \begin{Arabic}... instead of \begin{arabic}...
- \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
+ % 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{RL}%
- {\ifcsundef{#2@RL}%
- {\@ensure@LTR{\foreignlanguage[####1]{#2}{####2}}}%
- {\@ensure@RTL{\foreignlanguage[####1]{#2}{####2}}}}%
- {\foreignlanguage[####1]{#2}{####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}%
}%
- {\PackageWarning{polyglossia}{gloss-#2.ldf is already loaded!}}%
- %% The following settings are for the default language and script:
- \ifcsundef{#2@RL}{}{\@RTLmaintrue}% this tells bidi.sty that the document is RTL
- \AtBeginDocument{%
- \selectlanguage[#1]{#2}%
- \selectbackgroundlanguage{#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@nolang{#2}\hyphenrules{#2}}}%
+ {\xpg@nogloss{#2}}%
+}
\let\setmainlanguage=\setdefaultlanguage
\newcommand{\resetdefaultlanguage}[2][]{%
\ifcsundef{#2@loaded}{%
- \PackageError{polyglossia}{gloss-#2.ldf is not 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}%
- \ifcsundef{#2@RL}{}{\@rlmaintrue\@rl@footnotetrue}%
+ \iftoggle{#2@RL}{\@rlmaintrue\@rl@footnotetrue}{}%
\selectlanguage[#1]{#2}%
\selectbackgroundlanguage{#2}}}
\def\familytype{rm}
-\gappto\rmfamily{\def\familytype{rm}}
-\gappto\sffamily{\def\familytype{sf}}
-\gappto\ttfamily{\def\familytype{tt}}
+% 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\reset@latin@script{%
+\def\resetfontlatin{%
\let\rmfamily=\rmfamilylatin%
\let\sffamily=\sffamilylatin%
\let\ttfamily=\ttfamilylatin%
- \normalfontlatin}
-
-\def\reset@LR{\csuse{setLR}}
-
-\def\selectnormalfontlatin{%
- \if\normalfont\ttfamily\ttfamilylatin\else
- \if\normalfont\sffamily\sffamilylatin\else
- \normalfontlatin\fi\fi}
+ \let\normalfont=\normalfontlatin}
-\DeclareRobustCommand\selectfontfamilylatin{%
+\def\selectfontfamilylatin{%
\def\tmp@tt{tt}\def\tmp@sf{sf}%
\ifx\familytype\tmp@tt%
\ttfamilylatin%
@@ -166,6 +531,22 @@
\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}
@@ -173,7 +554,7 @@
\@afterindentfalse}
\newcommand{\selectbackgroundlanguage}[1]{%
- \csuse{selectnormalfont#1}%
+ \iftoggle{#1@latin}{}{\xpg@set@normalfont{#1}}%
\csuse{#1@globalnumbers}%
}
@@ -187,35 +568,35 @@
\ifx\@tmpb\@tmpa%
\newenvironment{Arabic}[1][]{\begin{otherlanguage}[####1]{arabic}}%
{\end{otherlanguage}}%
- \else%
+ \else
\newenvironment{#2}[1][]{\begin{otherlanguage}[####1]{#2}}%
{\end{otherlanguage}}%
\fi
\expandafter\newcommand\csname text#2\endcsname[2][]{%
- \ifcsdef{RL}{%
- \ifcsundef{#2@RL}%
- {\@ensure@LTR{\foreignlanguage[####1]{#2}{####2}}}%
- {\@ensure@RTL{\foreignlanguage[####1]{#2}{####2}}}%
- }{% else
- \foreignlanguage[####1]{#2}{####2}%
- }}%
- \csletcs{local#2}{text#2}%
- \csgdef{#2@loaded}{}%
+ \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}{}%
}%
- {\PackageWarning{polyglossia}{gloss-#2.ldf is already loaded!}}%
+ {\xpg@warning{gloss-#2.ldf~ is~ already~ loaded!}}%
}%
- %ELSE
- {\xpg@nolang{#2}\hyphenrules{#2}}%
- %TODO ? \expandafter\ifx\csname l@#2\endcsname\@undefined
- %\xpg@nopatterns{#2}\expandafter\adddialect\csname l@#2\endcsname 0%
- %\else\expandafter\expandafter\protect\language=\csname l@#2\endcsname\fi
+ %ELSE
+ {\xpg@nogloss{#2}}%
}
\newcommand\setotherlanguages[1]{%
- \def\do##1{\setotherlanguage{##1}}%
+ \renewcommand*{\do}[1]{\setotherlanguage{##1}}%
\docsvlist{#1}}%
-\def\common@language{%
+\def\common@language{% FIXME is this really needed???
\language=\z@
\lefthyphenmin=\tw@
\righthyphenmin=\thr@@}
@@ -231,34 +612,47 @@
\providecommand{\foreignlanguage}{}
\renewcommand{\foreignlanguage}[3][]{%
- \ifcsundef{#2@loaded}{\xpg@nolang{#2}\hyphenrules{#2}}{%
- {\def\languagename{#2}%
+ \ifcsundef{#2@loaded}%
+ {\xpg@nogloss{#2}}%
+ {{\select@@language{#2}%
\setkeys{#2}{#1}%
- \csuse@warn{#2@font}%
- \csuse@warn{#2@language}%
- \csuse{date#2}%
- \csuse{#2@numbers}%
\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}%
+ {\bgroup\xpg@nogloss{#2}}%
+ {\bgroup\select@@language{#2}%
+ \setkeys{#2}{#1}%
+ \use@localhyphenmins{#2}%
+ \ifbool{#2@frenchspacing}{\frenchspacing}{\nonfrenchspacing}%
+ \csuse{inlineextras@#2}%
+ }%
+}{\egroup}
+
%Hook that other package authors can use
%(for instance biblatex):
\newcommand*{\xpg@hook@setlanguage}{}
\providecommand{\selectlanguage}{}
\renewcommand{\selectlanguage}[2][]{%
- \ifcsundef{#2@loaded}{\xpg@nolang{#2}\hyphenrules{#2}}{%
- \def\xpg@pop@language{%
+ \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%
\setkeys{#2}{#1}%
\xpg@set@language{#2}%
-}}
+ }%
+}
\newcommand{\xpg@set@language}[1]{%
\select@language{#1}%
@@ -272,19 +666,26 @@
\def\select@language#1{%
\xpg@initial@setup%
- \edef\languagename{#1}%
- \ifcsundef{RL}{}%
- {\ifcsundef{#1@RL}{\setLR}{\setRL}}%
- \csuse@warn{#1@font}%
- \csuse@warn{#1@language}%
- \use@localhyphenmins{#1}%
+ \select@@language{#1}%
+ \ifcsundef{setRL}{}%
+ {\iftoggle{#1@RL}{\setRL}{\setLR}}%
\csuse{captions#1}%
- \csuse{date#1}%
- \csuse{#1@numbers}%
\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}{}{}
@@ -295,10 +696,10 @@
\newcommand{\setlocalhyphenmins}[3]{%
\expandafter\ifx\csname l@#1\endcsname\relax%
- \xpg@warning{\string\setlocalhyphenmin useless for unknown language #1}%
+ \xpg@warning{\string\setlocalhyphenmin\space~ useless~ for~ unknown~ language~ #1}%
\else
\expandafter\ifx\csname l@#1\endcsname\l@nohyphenation%
- \xpg@warning{\string\setlocalhyphenmin useless for unhyphenated language #1}%
+ \xpg@warning{\string\setlocalhyphenmin\space~ useless~ for~ unhyphenated~ language~ #1}%
\else
\providehyphenmins{#1}{#2#3}%
\fi
@@ -308,40 +709,13 @@
\ifcsundef{#1hyphenmins}{}%
{\expandafter\expandafter\expandafter\set@hyphenmins\csname #1hyphenmins\endcsname\relax}}
-% FIXME: remove this eventually, say in 2012 :)
-% taken from xelatex.ini, in case the xelatex format is too old
-\ifcsundef{newXeTeXintercharclass}{%
- \xpg@warning{Your xelatex format appears to be outdated!^^J
- Please update your system and recreate it with fmtutil.}
- \newcount\xe@alloc@intercharclass % allocates intercharclass
- \xe@alloc@intercharclass=\thr@@ % from 4 (1,2 and 3 are used by CJK, AFAIK)
- \def\xe@alloc@#1#2#3#4#5{\global\advance#1\@ne
- \xe@ch@ck#1#4#2% make sure there's still room
- \allocationnumber#1%
- \global#3#5\allocationnumber
- \wlog{\string#5=\string#2\the\allocationnumber}}
- \def\xe@ch@ck#1#2#3{%
- \ifnum#1<#2\else
- \errmessage{No room for a new #3}%
- \fi}
- \def\newXeTeXintercharclass{%
- \xe@alloc@\xe@alloc@intercharclass\XeTeXintercharclass\chardef\@cclv} %at most 254
- }
- {}
-
-%% patch lastpage to avoid problem with \thepage when \@arabic is redefined for non-Latin numbers
-%\@ifpackageloaded{lastpage}{%
-%\xpg@info{Redefining lastpage command \string\lastpage@putlabel}%
-%\def\lastpage@putlabel{\addtocounter{page}{-1}%
-% \immediate\write\@auxout{\string
-% \newlabel{LastPage}{{}{\number\c@page}}}%
-% \addtocounter{page}{1}}}%
-% {}
-%
\define@boolkey{polyglossia}[system@]{babelshorthands}[false]{}
+\AtEndPreamble{\@ifpackageloaded{bidi}{\newcommand*{\aemph}[1]{$\overline{\hboxR{#1}}$}}{}}
+
%% Package Options %%
-\DeclareOption{nolocalmarks}{\setkeys{polyglossia}{localmarks=off}}
+\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
@@ -349,27 +723,30 @@
\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}}
-\DeclareOption{USenglish}{\xpg@option{variant=american}{english}}
-\DeclareOption{american}{\xpg@option{variant=american}{english}}
-\DeclareOption{UKenglish}{\xpg@option{variant=british}{english}}
-\DeclareOption{british}{\xpg@option{variant=british}{english}}
-\DeclareOption{australian}{\xpg@option{variant=australian}{english}}
-\DeclareOption{newzealand}{\xpg@option{variant=newzealand}{english}}
-\DeclareOption{ngerman}{\xpg@option{spelling=new}{german}}
-\DeclareOption{polygreek}{\xpg@option{variant=poly}{greek}}
-\DeclareOption{monogreek}{\xpg@option{variant=mono}{greek}}
-\DeclareOption{ancientgreek}{\xpg@option{variant=ancient}{greek}}
-\DeclareOption*{%
- \edef\@temp{%
- \noexpand\ifcsundef{xpg@main@language}%
- \noexpand\setdefaultlanguage
- \noexpand\setotherlanguage
- {\CurrentOption}%
- }%
- \expandafter\AtEndOfPackage\expandafter{\@temp}%
-}
+%\DeclareOption{USenglish}{\xpg@option{variant=american}{english}}
+%\DeclareOption{american}{\xpg@option{variant=american}{english}}
+%\DeclareOption{UKenglish}{\xpg@option{variant=british}{english}}
+%\DeclareOption{british}{\xpg@option{variant=british}{english}}
+%\DeclareOption{australian}{\xpg@option{variant=australian}{english}}
+%\DeclareOption{newzealand}{\xpg@option{variant=newzealand}{english}}
+%\DeclareOption{ngerman}{\xpg@option{spelling=new}{german}}
+%\DeclareOption{polygreek}{\xpg@option{variant=poly}{greek}}
+%\DeclareOption{monogreek}{\xpg@option{variant=mono}{greek}}
+%\DeclareOption{ancientgreek}{\xpg@option{variant=ancient}{greek}}
+%%% TODO add warning message that this approach is deprecated <<<<<<<<<<<<<<
+%\DeclareOption*{%
+% \edef\@temp{%
+% \noexpand\ifcsundef{xpg@main@language}%
+% \noexpand\setdefaultlanguage
+% \noexpand\setotherlanguage
+% {\CurrentOption}%
+% }%
+% \expandafter\AtEndOfPackage\expandafter{\@temp}%
+%}
\ProcessOptions*
\endinput