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