diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/babel/babel.sty')
-rw-r--r-- | Master/texmf-dist/tex/generic/babel/babel.sty | 3511 |
1 files changed, 3349 insertions, 162 deletions
diff --git a/Master/texmf-dist/tex/generic/babel/babel.sty b/Master/texmf-dist/tex/generic/babel/babel.sty index 4c6552ea2fd..227f72a92b3 100644 --- a/Master/texmf-dist/tex/generic/babel/babel.sty +++ b/Master/texmf-dist/tex/generic/babel/babel.sty @@ -34,7 +34,7 @@ %% \NeedsTeXFormat{LaTeX2e}[2005/12/01] -\ProvidesPackage{babel}[2021/07/22 3.63 The Babel package] +\ProvidesPackage{babel}[2021/10/13 3.64 The Babel package] \@ifpackagewith{babel}{debug} {\providecommand\bbl@trace[1]{\message{^^J[ #1 ]}}% \let\bbl@debug\@firstofone @@ -49,6 +49,28 @@ \directlua{ Babel = Babel or {} Babel.debug = false }% \fi} +\def\bbl@error#1#2{% + \begingroup + \def\\{\MessageBreak}% + \PackageError{babel}{#1}{#2}% + \endgroup} +\def\bbl@warning#1{% + \begingroup + \def\\{\MessageBreak}% + \PackageWarning{babel}{#1}% + \endgroup} +\def\bbl@infowarn#1{% + \begingroup + \def\\{\MessageBreak}% + \GenericWarning + {(babel) \@spaces\@spaces\@spaces}% + {Package babel Info: #1}% + \endgroup} +\def\bbl@info#1{% + \begingroup + \def\\{\MessageBreak}% + \PackageInfo{babel}{#1}% + \endgroup} \bbl@trace{Basic macros} \def\bbl@stripslash{\expandafter\@gobble\string} \def\bbl@add#1#2{% @@ -77,9 +99,13 @@ \def\bbl@exp#1{% \begingroup \let\\\noexpand - \def\<##1>{\expandafter\noexpand\csname##1\endcsname}% + \let\<\bbl@exp@en + \let\[\bbl@exp@ue \edef\bbl@exp@aux{\endgroup#1}% \bbl@exp@aux} +\def\bbl@exp@en#1>{\expandafter\noexpand\csname#1\endcsname}% +\def\bbl@exp@ue#1]{% + \unexpanded\expandafter\expandafter\expandafter{\csname#1\endcsname}}% \def\bbl@tempa#1{% \long\def\bbl@trim##1##2{% \futurelet\bbl@trim@a\bbl@trim@c##2\@nil\@nil#1\@nil\relax{##1}}% @@ -100,7 +126,7 @@ \else \expandafter\@secondoftwo \fi} - \bbl@ifunset{ifcsname}% + \bbl@ifunset{ifcsname}% TODO. A better test? {}% {\gdef\bbl@ifunset#1{% \ifcsname#1\endcsname @@ -233,62 +259,6 @@ \toks@\expandafter{\bbl@tempc#3}% \expandafter\edef\csname extras\languagename\endcsname{\the\toks@}% \fi} - % Temporarily repeat here the code for errors. TODO. - \def\bbl@error#1#2{% - \begingroup - \def\\{\MessageBreak}% - \PackageError{babel}{#1}{#2}% - \endgroup} - \def\bbl@warning#1{% - \begingroup - \def\\{\MessageBreak}% - \PackageWarning{babel}{#1}% - \endgroup} - \def\bbl@infowarn#1{% - \begingroup - \def\\{\MessageBreak}% - \GenericWarning - {(babel) \@spaces\@spaces\@spaces}% - {Package babel Info: #1}% - \endgroup} - \def\bbl@info#1{% - \begingroup - \def\\{\MessageBreak}% - \PackageInfo{babel}{#1}% - \endgroup} -\def\bbl@nocaption{\protect\bbl@nocaption@i} -\def\bbl@nocaption@i#1#2{% 1: text to be printed 2: caption macro \langXname - \global\@namedef{#2}{\textbf{?#1?}}% - \@nameuse{#2}% - \edef\bbl@tempa{#1}% - \bbl@sreplace\bbl@tempa{name}{}% - \bbl@warning{% - \@backslashchar#1 not set for '\languagename'. Please,\\% - define it after the language has been loaded\\% - (typically in the preamble) with\\% - \string\setlocalecaption{\languagename}{\bbl@tempa}{..}\\% - Reported}} -\def\bbl@tentative{\protect\bbl@tentative@i} -\def\bbl@tentative@i#1{% - \bbl@warning{% - Some functions for '#1' are tentative.\\% - They might not work as expected and their behavior\\% - may change in the future.\\% - Reported}} -\def\@nolanerr#1{% - \bbl@error - {You haven't defined the language '#1' yet.\\% - Perhaps you misspelled it or your installation\\% - is not complete}% - {Your command will be ignored, type <return> to proceed}} -\def\@nopatterns#1{% - \bbl@warning - {No hyphenation patterns were preloaded for\\% - the language '#1' into the format.\\% - Please, configure your TeX system to add them and\\% - rebuild the format. Now I will use the patterns\\% - preloaded for \bbl@nulllanguage\space instead}} - % End of errors \@ifpackagewith{babel}{silent} {\let\bbl@info\@gobble \let\bbl@infowarn\@gobble @@ -375,9 +345,6 @@ \DeclareOption{provide@=*}{\def\bbl@autoload@options{import}} \newif\ifbbl@single \DeclareOption{selectors=off}{\bbl@singletrue} -\DeclareOption{safe=none}{\let\bbl@opt@safe\@empty} -\DeclareOption{safe=bib}{\def\bbl@opt@safe{B}} -\DeclareOption{safe=ref}{\def\bbl@opt@safe{R}} \DeclareOption{math=active}{} \DeclareOption{math=normal}{\def\bbl@mathnormal{\noexpand\textormath}} \DeclareOption{nocase}{} @@ -390,6 +357,9 @@ \DeclareOption{hyphenmap=select}{\chardef\bbl@opt@hyphenmap\tw@} \DeclareOption{hyphenmap=other}{\chardef\bbl@opt@hyphenmap\thr@@} \DeclareOption{hyphenmap=other*}{\chardef\bbl@opt@hyphenmap4\relax} +\DeclareOption{safe=none}{\let\bbl@opt@safe\@empty} +\DeclareOption{safe=bib}{\def\bbl@opt@safe{B}} +\DeclareOption{safe=ref}{\def\bbl@opt@safe{R}} \chardef\bbl@bidimode\z@ \DeclareOption{bidi=default}{\chardef\bbl@bidimode=\@ne} \DeclareOption{bidi=basic}{\chardef\bbl@bidimode=101 } @@ -420,11 +390,23 @@ \ifin@ \expandafter\bbl@tempa\CurrentOption\bbl@tempa \else - \bbl@add@list\bbl@language@opts{\CurrentOption}% + \bbl@xin@{,\CurrentOption,}{,\bbl@language@opts,}% + \ifin@ + \bbl@exp{\\\bbl@replace\\\bbl@language@opts{,\CurrentOption,}{}}% + \fi + \edef\bbl@language@opts{\bbl@language@opts,\CurrentOption,} \fi} \ProcessOptions* -\ifx\bbl@opt@provide\@nnil\else % Tests. Ignore. +\ifx\bbl@opt@provide\@nnil + \let\bbl@opt@provide\@empty % %%% MOVE above +\else \chardef\bbl@iniflag\@ne + \bbl@exp{\\\bbl@forkv{\@nameuse{@raw@opt@babel.sty}}}{% + \in@{,provide,}{,#1,}% + \ifin@ + \def\bbl@opt@provide{#2}% + \bbl@replace\bbl@opt@provide{;}{,}% + \fi} \fi \bbl@trace{Conditional loading of shorthands} \def\bbl@sh@string#1{% @@ -464,9 +446,7 @@ \def\bbl@opt@safe{BR} \fi \ifx\bbl@opt@main\@nnil\else - \edef\bbl@language@opts{% - \ifx\bbl@language@opts\@empty\else\bbl@language@opts,\fi - \bbl@opt@main} + \edef\bbl@language@opts{\bbl@language@opts,\bbl@opt@main,} \fi \bbl@trace{Defining IfBabelLayout} \ifx\bbl@opt@layout\@nnil @@ -480,7 +460,3243 @@ \expandafter\@secondoftwo \fi} \fi -\input babel.def +\def\bbl@version{3.64} +\def\bbl@date{2021/10/13} +\ifx\language\@undefined + \csname newcount\endcsname\language +\fi +\countdef\last@language=19 +\def\addlanguage{\csname newlanguage\endcsname} +\def\adddialect#1#2{% + \global\chardef#1#2\relax + \bbl@usehooks{adddialect}{{#1}{#2}}% + \begingroup + \count@#1\relax + \def\bbl@elt##1##2##3##4{% + \ifnum\count@=##2\relax + \edef\bbl@tempa{\expandafter\@gobbletwo\string#1}% + \bbl@info{Hyphen rules for '\expandafter\@gobble\bbl@tempa' + set to \expandafter\string\csname l@##1\endcsname\\% + (\string\language\the\count@). Reported}% + \def\bbl@elt####1####2####3####4{}% + \fi}% + \bbl@cs{languages}% + \endgroup} +\def\bbl@fixname#1{% + \begingroup + \def\bbl@tempe{l@}% + \edef\bbl@tempd{\noexpand\@ifundefined{\noexpand\bbl@tempe#1}}% + \bbl@tempd + {\lowercase\expandafter{\bbl@tempd}% + {\uppercase\expandafter{\bbl@tempd}% + \@empty + {\edef\bbl@tempd{\def\noexpand#1{#1}}% + \uppercase\expandafter{\bbl@tempd}}}% + {\edef\bbl@tempd{\def\noexpand#1{#1}}% + \lowercase\expandafter{\bbl@tempd}}}% + \@empty + \edef\bbl@tempd{\endgroup\def\noexpand#1{#1}}% + \bbl@tempd + \bbl@exp{\\\bbl@usehooks{languagename}{{\languagename}{#1}}}} +\def\bbl@iflanguage#1{% + \@ifundefined{l@#1}{\@nolanerr{#1}\@gobble}\@firstofone} +\def\bbl@bcpcase#1#2#3#4\@@#5{% + \ifx\@empty#3% + \uppercase{\def#5{#1#2}}% + \else + \uppercase{\def#5{#1}}% + \lowercase{\edef#5{#5#2#3#4}}% + \fi} +\def\bbl@bcplookup#1-#2-#3-#4\@@{% + \let\bbl@bcp\relax + \lowercase{\def\bbl@tempa{#1}}% + \ifx\@empty#2% + \IfFileExists{babel-\bbl@tempa.ini}{\let\bbl@bcp\bbl@tempa}{}% + \else\ifx\@empty#3% + \bbl@bcpcase#2\@empty\@empty\@@\bbl@tempb + \IfFileExists{babel-\bbl@tempa-\bbl@tempb.ini}% + {\edef\bbl@bcp{\bbl@tempa-\bbl@tempb}}% + {}% + \ifx\bbl@bcp\relax + \IfFileExists{babel-\bbl@tempa.ini}{\let\bbl@bcp\bbl@tempa}{}% + \fi + \else + \bbl@bcpcase#2\@empty\@empty\@@\bbl@tempb + \bbl@bcpcase#3\@empty\@empty\@@\bbl@tempc + \IfFileExists{babel-\bbl@tempa-\bbl@tempb-\bbl@tempc.ini}% + {\edef\bbl@bcp{\bbl@tempa-\bbl@tempb-\bbl@tempc}}% + {}% + \ifx\bbl@bcp\relax + \IfFileExists{babel-\bbl@tempa-\bbl@tempc.ini}% + {\edef\bbl@bcp{\bbl@tempa-\bbl@tempc}}% + {}% + \fi + \ifx\bbl@bcp\relax + \IfFileExists{babel-\bbl@tempa-\bbl@tempc.ini}% + {\edef\bbl@bcp{\bbl@tempa-\bbl@tempc}}% + {}% + \fi + \ifx\bbl@bcp\relax + \IfFileExists{babel-\bbl@tempa.ini}{\let\bbl@bcp\bbl@tempa}{}% + \fi + \fi\fi} +\let\bbl@initoload\relax +\def\bbl@provide@locale{% + \ifx\babelprovide\@undefined + \bbl@error{For a language to be defined on the fly 'base'\\% + is not enough, and the whole package must be\\% + loaded. Either delete the 'base' option or\\% + request the languages explicitly}% + {See the manual for further details.}% + \fi + \let\bbl@auxname\languagename % Still necessary. TODO + \bbl@ifunset{bbl@bcp@map@\languagename}{}% Move uplevel?? + {\edef\languagename{\@nameuse{bbl@bcp@map@\languagename}}}% + \ifbbl@bcpallowed + \expandafter\ifx\csname date\languagename\endcsname\relax + \expandafter + \bbl@bcplookup\languagename-\@empty-\@empty-\@empty\@@ + \ifx\bbl@bcp\relax\else % Returned by \bbl@bcplookup + \edef\languagename{\bbl@bcp@prefix\bbl@bcp}% + \edef\localename{\bbl@bcp@prefix\bbl@bcp}% + \expandafter\ifx\csname date\languagename\endcsname\relax + \let\bbl@initoload\bbl@bcp + \bbl@exp{\\\babelprovide[\bbl@autoload@bcpoptions]{\languagename}}% + \let\bbl@initoload\relax + \fi + \bbl@csarg\xdef{bcp@map@\bbl@bcp}{\localename}% + \fi + \fi + \fi + \expandafter\ifx\csname date\languagename\endcsname\relax + \IfFileExists{babel-\languagename.tex}% + {\bbl@exp{\\\babelprovide[\bbl@autoload@options]{\languagename}}}% + {}% + \fi} +\def\iflanguage#1{% + \bbl@iflanguage{#1}{% + \ifnum\csname l@#1\endcsname=\language + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi}} +\let\bbl@select@type\z@ +\edef\selectlanguage{% + \noexpand\protect + \expandafter\noexpand\csname selectlanguage \endcsname} +\ifx\@undefined\protect\let\protect\relax\fi +\let\xstring\string +\def\bbl@language@stack{} +\def\bbl@push@language{% + \ifx\languagename\@undefined\else + \ifx\currentgrouplevel\@undefined + \xdef\bbl@language@stack{\languagename+\bbl@language@stack}% + \else + \ifnum\currentgrouplevel=\z@ + \xdef\bbl@language@stack{\languagename+}% + \else + \xdef\bbl@language@stack{\languagename+\bbl@language@stack}% + \fi + \fi + \fi} +\def\bbl@pop@lang#1+#2\@@{% + \edef\languagename{#1}% + \xdef\bbl@language@stack{#2}} +\let\bbl@ifrestoring\@secondoftwo +\def\bbl@pop@language{% + \expandafter\bbl@pop@lang\bbl@language@stack\@@ + \let\bbl@ifrestoring\@firstoftwo + \expandafter\bbl@set@language\expandafter{\languagename}% + \let\bbl@ifrestoring\@secondoftwo} +\chardef\localeid\z@ +\def\bbl@id@last{0} % No real need for a new counter +\def\bbl@id@assign{% + \bbl@ifunset{bbl@id@@\languagename}% + {\count@\bbl@id@last\relax + \advance\count@\@ne + \bbl@csarg\chardef{id@@\languagename}\count@ + \edef\bbl@id@last{\the\count@}% + \ifcase\bbl@engine\or + \directlua{ + Babel = Babel or {} + Babel.locale_props = Babel.locale_props or {} + Babel.locale_props[\bbl@id@last] = {} + Babel.locale_props[\bbl@id@last].name = '\languagename' + }% + \fi}% + {}% + \chardef\localeid\bbl@cl{id@}} +\expandafter\def\csname selectlanguage \endcsname#1{% + \ifnum\bbl@hymapsel=\@cclv\let\bbl@hymapsel\tw@\fi + \bbl@push@language + \aftergroup\bbl@pop@language + \bbl@set@language{#1}} +\def\BabelContentsFiles{toc,lof,lot} +\def\bbl@set@language#1{% from selectlanguage, pop@ + % The old buggy way. Preserved for compatibility. + \edef\languagename{% + \ifnum\escapechar=\expandafter`\string#1\@empty + \else\string#1\@empty\fi}% + \ifcat\relax\noexpand#1% + \expandafter\ifx\csname date\languagename\endcsname\relax + \edef\languagename{#1}% + \let\localename\languagename + \else + \bbl@info{Using '\string\language' instead of 'language' is\\% + deprecated. If what you want is to use a\\% + macro containing the actual locale, make\\% + sure it does not not match any language.\\% + Reported}% + \ifx\scantokens\@undefined + \def\localename{??}% + \else + \scantokens\expandafter{\expandafter + \def\expandafter\localename\expandafter{\languagename}}% + \fi + \fi + \else + \def\localename{#1}% This one has the correct catcodes + \fi + \select@language{\languagename}% + % write to auxs + \expandafter\ifx\csname date\languagename\endcsname\relax\else + \if@filesw + \ifx\babel@aux\@gobbletwo\else % Set if single in the first, redundant + \bbl@savelastskip + \protected@write\@auxout{}{\string\babel@aux{\bbl@auxname}{}}% + \bbl@restorelastskip + \fi + \bbl@usehooks{write}{}% + \fi + \fi} +\let\bbl@restorelastskip\relax +\let\bbl@savelastskip\relax +\newif\ifbbl@bcpallowed +\bbl@bcpallowedfalse +\def\select@language#1{% from set@, babel@aux + % set hymap + \ifnum\bbl@hymapsel=\@cclv\chardef\bbl@hymapsel4\relax\fi + % set name + \edef\languagename{#1}% + \bbl@fixname\languagename + % TODO. name@map must be here? + \bbl@provide@locale + \bbl@iflanguage\languagename{% + \expandafter\ifx\csname date\languagename\endcsname\relax + \bbl@error + {Unknown language '\languagename'. Either you have\\% + misspelled its name, it has not been installed,\\% + or you requested it in a previous run. Fix its name,\\% + install it or just rerun the file, respectively. In\\% + some cases, you may need to remove the aux file}% + {You may proceed, but expect wrong results}% + \else + % set type + \let\bbl@select@type\z@ + \expandafter\bbl@switch\expandafter{\languagename}% + \fi}} +\def\babel@aux#1#2{% + \select@language{#1}% + \bbl@foreach\BabelContentsFiles{% \relax -> don't assume vertical mode + \@writefile{##1}{\babel@toc{#1}{#2}\relax}}}% TODO - plain? +\def\babel@toc#1#2{% + \select@language{#1}} +\newif\ifbbl@usedategroup +\def\bbl@switch#1{% from select@, foreign@ + % make sure there is info for the language if so requested + \bbl@ensureinfo{#1}% + % restore + \originalTeX + \expandafter\def\expandafter\originalTeX\expandafter{% + \csname noextras#1\endcsname + \let\originalTeX\@empty + \babel@beginsave}% + \bbl@usehooks{afterreset}{}% + \languageshorthands{none}% + % set the locale id + \bbl@id@assign + % switch captions, date + % No text is supposed to be added here, so we remove any + % spurious spaces. + \bbl@bsphack + \ifcase\bbl@select@type + \csname captions#1\endcsname\relax + \csname date#1\endcsname\relax + \else + \bbl@xin@{,captions,}{,\bbl@select@opts,}% + \ifin@ + \csname captions#1\endcsname\relax + \fi + \bbl@xin@{,date,}{,\bbl@select@opts,}% + \ifin@ % if \foreign... within \<lang>date + \csname date#1\endcsname\relax + \fi + \fi + \bbl@esphack + % switch extras + \bbl@usehooks{beforeextras}{}% + \csname extras#1\endcsname\relax + \bbl@usehooks{afterextras}{}% + % > babel-ensure + % > babel-sh-<short> + % > babel-bidi + % > babel-fontspec + % hyphenation - case mapping + \ifcase\bbl@opt@hyphenmap\or + \def\BabelLower##1##2{\lccode##1=##2\relax}% + \ifnum\bbl@hymapsel>4\else + \csname\languagename @bbl@hyphenmap\endcsname + \fi + \chardef\bbl@opt@hyphenmap\z@ + \else + \ifnum\bbl@hymapsel>\bbl@opt@hyphenmap\else + \csname\languagename @bbl@hyphenmap\endcsname + \fi + \fi + \let\bbl@hymapsel\@cclv + % hyphenation - select rules + \ifnum\csname l@\languagename\endcsname=\l@unhyphenated + \edef\bbl@tempa{u}% + \else + \edef\bbl@tempa{\bbl@cl{lnbrk}}% + \fi + % linebreaking - handle u, e, k (v in the future) + \bbl@xin@{/u}{/\bbl@tempa}% + \ifin@\else\bbl@xin@{/e}{/\bbl@tempa}\fi % elongated forms + \ifin@\else\bbl@xin@{/k}{/\bbl@tempa}\fi % only kashida + \ifin@\else\bbl@xin@{/v}{/\bbl@tempa}\fi % variable font + \ifin@ + % unhyphenated/kashida/elongated = allow stretching + \language\l@unhyphenated + \babel@savevariable\emergencystretch + \emergencystretch\maxdimen + \babel@savevariable\hbadness + \hbadness\@M + \else + % other = select patterns + \bbl@patterns{#1}% + \fi + % hyphenation - mins + \babel@savevariable\lefthyphenmin + \babel@savevariable\righthyphenmin + \expandafter\ifx\csname #1hyphenmins\endcsname\relax + \set@hyphenmins\tw@\thr@@\relax + \else + \expandafter\expandafter\expandafter\set@hyphenmins + \csname #1hyphenmins\endcsname\relax + \fi} +\long\def\otherlanguage#1{% + \ifnum\bbl@hymapsel=\@cclv\let\bbl@hymapsel\thr@@\fi + \csname selectlanguage \endcsname{#1}% + \ignorespaces} +\long\def\endotherlanguage{% + \global\@ignoretrue\ignorespaces} +\expandafter\def\csname otherlanguage*\endcsname{% + \@ifnextchar[\bbl@otherlanguage@s{\bbl@otherlanguage@s[]}} +\def\bbl@otherlanguage@s[#1]#2{% + \ifnum\bbl@hymapsel=\@cclv\chardef\bbl@hymapsel4\relax\fi + \def\bbl@select@opts{#1}% + \foreign@language{#2}} +\expandafter\let\csname endotherlanguage*\endcsname\relax +\providecommand\bbl@beforeforeign{} +\edef\foreignlanguage{% + \noexpand\protect + \expandafter\noexpand\csname foreignlanguage \endcsname} +\expandafter\def\csname foreignlanguage \endcsname{% + \@ifstar\bbl@foreign@s\bbl@foreign@x} +\providecommand\bbl@foreign@x[3][]{% + \begingroup + \def\bbl@select@opts{#1}% + \let\BabelText\@firstofone + \bbl@beforeforeign + \foreign@language{#2}% + \bbl@usehooks{foreign}{}% + \BabelText{#3}% Now in horizontal mode! + \endgroup} +\def\bbl@foreign@s#1#2{% TODO - \shapemode, \@setpar, ?\@@par + \begingroup + {\par}% + \let\bbl@select@opts\@empty + \let\BabelText\@firstofone + \foreign@language{#1}% + \bbl@usehooks{foreign*}{}% + \bbl@dirparastext + \BabelText{#2}% Still in vertical mode! + {\par}% + \endgroup} +\def\foreign@language#1{% + % set name + \edef\languagename{#1}% + \ifbbl@usedategroup + \bbl@add\bbl@select@opts{,date,}% + \bbl@usedategroupfalse + \fi + \bbl@fixname\languagename + % TODO. name@map here? + \bbl@provide@locale + \bbl@iflanguage\languagename{% + \expandafter\ifx\csname date\languagename\endcsname\relax + \bbl@warning % TODO - why a warning, not an error? + {Unknown language '#1'. Either you have\\% + misspelled its name, it has not been installed,\\% + or you requested it in a previous run. Fix its name,\\% + install it or just rerun the file, respectively. In\\% + some cases, you may need to remove the aux file.\\% + I'll proceed, but expect wrong results.\\% + Reported}% + \fi + % set type + \let\bbl@select@type\@ne + \expandafter\bbl@switch\expandafter{\languagename}}} +\let\bbl@hyphlist\@empty +\let\bbl@hyphenation@\relax +\let\bbl@pttnlist\@empty +\let\bbl@patterns@\relax +\let\bbl@hymapsel=\@cclv +\def\bbl@patterns#1{% + \language=\expandafter\ifx\csname l@#1:\f@encoding\endcsname\relax + \csname l@#1\endcsname + \edef\bbl@tempa{#1}% + \else + \csname l@#1:\f@encoding\endcsname + \edef\bbl@tempa{#1:\f@encoding}% + \fi + \@expandtwoargs\bbl@usehooks{patterns}{{#1}{\bbl@tempa}}% + % > luatex + \@ifundefined{bbl@hyphenation@}{}{% Can be \relax! + \begingroup + \bbl@xin@{,\number\language,}{,\bbl@hyphlist}% + \ifin@\else + \@expandtwoargs\bbl@usehooks{hyphenation}{{#1}{\bbl@tempa}}% + \hyphenation{% + \bbl@hyphenation@ + \@ifundefined{bbl@hyphenation@#1}% + \@empty + {\space\csname bbl@hyphenation@#1\endcsname}}% + \xdef\bbl@hyphlist{\bbl@hyphlist\number\language,}% + \fi + \endgroup}} +\def\hyphenrules#1{% + \edef\bbl@tempf{#1}% + \bbl@fixname\bbl@tempf + \bbl@iflanguage\bbl@tempf{% + \expandafter\bbl@patterns\expandafter{\bbl@tempf}% + \ifx\languageshorthands\@undefined\else + \languageshorthands{none}% + \fi + \expandafter\ifx\csname\bbl@tempf hyphenmins\endcsname\relax + \set@hyphenmins\tw@\thr@@\relax + \else + \expandafter\expandafter\expandafter\set@hyphenmins + \csname\bbl@tempf hyphenmins\endcsname\relax + \fi}} +\let\endhyphenrules\@empty +\def\providehyphenmins#1#2{% + \expandafter\ifx\csname #1hyphenmins\endcsname\relax + \@namedef{#1hyphenmins}{#2}% + \fi} +\def\set@hyphenmins#1#2{% + \lefthyphenmin#1\relax + \righthyphenmin#2\relax} +\ifx\ProvidesFile\@undefined + \def\ProvidesLanguage#1[#2 #3 #4]{% + \wlog{Language: #1 #4 #3 <#2>}% + } +\else + \def\ProvidesLanguage#1{% + \begingroup + \catcode`\ 10 % + \@makeother\/% + \@ifnextchar[%] + {\@provideslanguage{#1}}{\@provideslanguage{#1}[]}} + \def\@provideslanguage#1[#2]{% + \wlog{Language: #1 #2}% + \expandafter\xdef\csname ver@#1.ldf\endcsname{#2}% + \endgroup} +\fi +\ifx\originalTeX\@undefined\let\originalTeX\@empty\fi +\ifx\babel@beginsave\@undefined\let\babel@beginsave\relax\fi +\providecommand\setlocale{% + \bbl@error + {Not yet available}% + {Find an armchair, sit down and wait}} +\let\uselocale\setlocale +\let\locale\setlocale +\let\selectlocale\setlocale +\let\localename\setlocale +\let\textlocale\setlocale +\let\textlanguage\setlocale +\let\languagetext\setlocale +\edef\bbl@nulllanguage{\string\language=0} +\def\bbl@nocaption{\protect\bbl@nocaption@i} +\def\bbl@nocaption@i#1#2{% 1: text to be printed 2: caption macro \langXname + \global\@namedef{#2}{\textbf{?#1?}}% + \@nameuse{#2}% + \edef\bbl@tempa{#1}% + \bbl@sreplace\bbl@tempa{name}{}% + \bbl@warning{% TODO. + \@backslashchar#1 not set for '\languagename'. Please,\\% + define it after the language has been loaded\\% + (typically in the preamble) with:\\% + \string\setlocalecaption{\languagename}{\bbl@tempa}{..}\\% + Reported}} +\def\bbl@tentative{\protect\bbl@tentative@i} +\def\bbl@tentative@i#1{% + \bbl@warning{% + Some functions for '#1' are tentative.\\% + They might not work as expected and their behavior\\% + could change in the future.\\% + Reported}} +\def\@nolanerr#1{% + \bbl@error + {You haven't defined the language '#1' yet.\\% + Perhaps you misspelled it or your installation\\% + is not complete}% + {Your command will be ignored, type <return> to proceed}} +\def\@nopatterns#1{% + \bbl@warning + {No hyphenation patterns were preloaded for\\% + the language '#1' into the format.\\% + Please, configure your TeX system to add them and\\% + rebuild the format. Now I will use the patterns\\% + preloaded for \bbl@nulllanguage\space instead}} +\let\bbl@usehooks\@gobbletwo +\ifx\bbl@onlyswitch\@empty\endinput\fi + % Here ended switch.def +\ifx\directlua\@undefined\else + \ifx\bbl@luapatterns\@undefined + \input luababel.def + \fi +\fi +\bbl@trace{Basic macros} +\def\bbl@stripslash{\expandafter\@gobble\string} +\def\bbl@add#1#2{% + \bbl@ifunset{\bbl@stripslash#1}% + {\def#1{#2}}% + {\expandafter\def\expandafter#1\expandafter{#1#2}}} +\def\bbl@xin@{\@expandtwoargs\in@} +\def\bbl@csarg#1#2{\expandafter#1\csname bbl@#2\endcsname}% +\def\bbl@cs#1{\csname bbl@#1\endcsname} +\def\bbl@cl#1{\csname bbl@#1@\languagename\endcsname} +\def\bbl@loop#1#2#3{\bbl@@loop#1{#3}#2,\@nnil,} +\def\bbl@loopx#1#2{\expandafter\bbl@loop\expandafter#1\expandafter{#2}} +\def\bbl@@loop#1#2#3,{% + \ifx\@nnil#3\relax\else + \def#1{#3}#2\bbl@afterfi\bbl@@loop#1{#2}% + \fi} +\def\bbl@for#1#2#3{\bbl@loopx#1{#2}{\ifx#1\@empty\else#3\fi}} +\def\bbl@add@list#1#2{% + \edef#1{% + \bbl@ifunset{\bbl@stripslash#1}% + {}% + {\ifx#1\@empty\else#1,\fi}% + #2}} +\long\def\bbl@afterelse#1\else#2\fi{\fi#1} +\long\def\bbl@afterfi#1\fi{\fi#1} +\def\bbl@exp#1{% + \begingroup + \let\\\noexpand + \let\<\bbl@exp@en + \let\[\bbl@exp@ue + \edef\bbl@exp@aux{\endgroup#1}% + \bbl@exp@aux} +\def\bbl@exp@en#1>{\expandafter\noexpand\csname#1\endcsname}% +\def\bbl@exp@ue#1]{% + \unexpanded\expandafter\expandafter\expandafter{\csname#1\endcsname}}% +\def\bbl@tempa#1{% + \long\def\bbl@trim##1##2{% + \futurelet\bbl@trim@a\bbl@trim@c##2\@nil\@nil#1\@nil\relax{##1}}% + \def\bbl@trim@c{% + \ifx\bbl@trim@a\@sptoken + \expandafter\bbl@trim@b + \else + \expandafter\bbl@trim@b\expandafter#1% + \fi}% + \long\def\bbl@trim@b#1##1 \@nil{\bbl@trim@i##1}} +\bbl@tempa{ } +\long\def\bbl@trim@i#1\@nil#2\relax#3{#3{#1}} +\long\def\bbl@trim@def#1{\bbl@trim{\def#1}} +\begingroup + \gdef\bbl@ifunset#1{% + \expandafter\ifx\csname#1\endcsname\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} + \bbl@ifunset{ifcsname}% TODO. A better test? + {}% + {\gdef\bbl@ifunset#1{% + \ifcsname#1\endcsname + \expandafter\ifx\csname#1\endcsname\relax + \bbl@afterelse\expandafter\@firstoftwo + \else + \bbl@afterfi\expandafter\@secondoftwo + \fi + \else + \expandafter\@firstoftwo + \fi}} +\endgroup +\def\bbl@ifblank#1{% + \bbl@ifblank@i#1\@nil\@nil\@secondoftwo\@firstoftwo\@nil} +\long\def\bbl@ifblank@i#1#2\@nil#3#4#5\@nil{#4} +\def\bbl@ifset#1#2#3{% + \bbl@ifunset{#1}{#3}{\bbl@exp{\\\bbl@ifblank{#1}}{#3}{#2}}} +\def\bbl@forkv#1#2{% + \def\bbl@kvcmd##1##2##3{#2}% + \bbl@kvnext#1,\@nil,} +\def\bbl@kvnext#1,{% + \ifx\@nil#1\relax\else + \bbl@ifblank{#1}{}{\bbl@forkv@eq#1=\@empty=\@nil{#1}}% + \expandafter\bbl@kvnext + \fi} +\def\bbl@forkv@eq#1=#2=#3\@nil#4{% + \bbl@trim@def\bbl@forkv@a{#1}% + \bbl@trim{\expandafter\bbl@kvcmd\expandafter{\bbl@forkv@a}}{#2}{#4}} +\def\bbl@vforeach#1#2{% + \def\bbl@forcmd##1{#2}% + \bbl@fornext#1,\@nil,} +\def\bbl@fornext#1,{% + \ifx\@nil#1\relax\else + \bbl@ifblank{#1}{}{\bbl@trim\bbl@forcmd{#1}}% + \expandafter\bbl@fornext + \fi} +\def\bbl@foreach#1{\expandafter\bbl@vforeach\expandafter{#1}} +\def\bbl@replace#1#2#3{% in #1 -> repl #2 by #3 + \toks@{}% + \def\bbl@replace@aux##1#2##2#2{% + \ifx\bbl@nil##2% + \toks@\expandafter{\the\toks@##1}% + \else + \toks@\expandafter{\the\toks@##1#3}% + \bbl@afterfi + \bbl@replace@aux##2#2% + \fi}% + \expandafter\bbl@replace@aux#1#2\bbl@nil#2% + \edef#1{\the\toks@}} +\ifx\detokenize\@undefined\else % Unused macros if old Plain TeX + \bbl@exp{\def\\\bbl@parsedef##1\detokenize{macro:}}#2->#3\relax{% + \def\bbl@tempa{#1}% + \def\bbl@tempb{#2}% + \def\bbl@tempe{#3}} + \def\bbl@sreplace#1#2#3{% + \begingroup + \expandafter\bbl@parsedef\meaning#1\relax + \def\bbl@tempc{#2}% + \edef\bbl@tempc{\expandafter\strip@prefix\meaning\bbl@tempc}% + \def\bbl@tempd{#3}% + \edef\bbl@tempd{\expandafter\strip@prefix\meaning\bbl@tempd}% + \bbl@xin@{\bbl@tempc}{\bbl@tempe}% If not in macro, do nothing + \ifin@ + \bbl@exp{\\\bbl@replace\\\bbl@tempe{\bbl@tempc}{\bbl@tempd}}% + \def\bbl@tempc{% Expanded an executed below as 'uplevel' + \\\makeatletter % "internal" macros with @ are assumed + \\\scantokens{% + \bbl@tempa\\\@namedef{\bbl@stripslash#1}\bbl@tempb{\bbl@tempe}}% + \catcode64=\the\catcode64\relax}% Restore @ + \else + \let\bbl@tempc\@empty % Not \relax + \fi + \bbl@exp{% For the 'uplevel' assignments + \endgroup + \bbl@tempc}} % empty or expand to set #1 with changes +\fi +\def\bbl@ifsamestring#1#2{% + \begingroup + \protected@edef\bbl@tempb{#1}% + \edef\bbl@tempb{\expandafter\strip@prefix\meaning\bbl@tempb}% + \protected@edef\bbl@tempc{#2}% + \edef\bbl@tempc{\expandafter\strip@prefix\meaning\bbl@tempc}% + \ifx\bbl@tempb\bbl@tempc + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup} +\chardef\bbl@engine=% + \ifx\directlua\@undefined + \ifx\XeTeXinputencoding\@undefined + \z@ + \else + \tw@ + \fi + \else + \@ne + \fi +\def\bbl@bsphack{% + \ifhmode + \hskip\z@skip + \def\bbl@esphack{\loop\ifdim\lastskip>\z@\unskip\repeat\unskip}% + \else + \let\bbl@esphack\@empty + \fi} +\def\bbl@cased{% + \ifx\oe\OE + \expandafter\in@\expandafter + {\expandafter\OE\expandafter}\expandafter{\oe}% + \ifin@ + \bbl@afterelse\expandafter\MakeUppercase + \else + \bbl@afterfi\expandafter\MakeLowercase + \fi + \else + \expandafter\@firstofone + \fi} +\ifx\IfFormatAtLeastTF\@undefined + \def\bbl@ifformatlater{\@ifl@t@r\fmtversion} +\else + \let\bbl@ifformatlater\IfFormatAtLeastTF +\fi +\def\bbl@extras@wrap#1#2#3{% 1:in-test, 2:before, 3:after + \toks@\expandafter\expandafter\expandafter{% + \csname extras\languagename\endcsname}% + \bbl@exp{\\\in@{#1}{\the\toks@}}% + \ifin@\else + \@temptokena{#2}% + \edef\bbl@tempc{\the\@temptokena\the\toks@}% + \toks@\expandafter{\bbl@tempc#3}% + \expandafter\edef\csname extras\languagename\endcsname{\the\toks@}% + \fi} +\bbl@trace{Compatibility with language.def} +\ifx\bbl@languages\@undefined + \ifx\directlua\@undefined + \openin1 = language.def % TODO. Remove hardcoded number + \ifeof1 + \closein1 + \message{I couldn't find the file language.def} + \else + \closein1 + \begingroup + \def\addlanguage#1#2#3#4#5{% + \expandafter\ifx\csname lang@#1\endcsname\relax\else + \global\expandafter\let\csname l@#1\expandafter\endcsname + \csname lang@#1\endcsname + \fi}% + \def\uselanguage#1{}% + \input language.def + \endgroup + \fi + \fi + \chardef\l@english\z@ +\fi +\def\addto#1#2{% + \ifx#1\@undefined + \def#1{#2}% + \else + \ifx#1\relax + \def#1{#2}% + \else + {\toks@\expandafter{#1#2}% + \xdef#1{\the\toks@}}% + \fi + \fi} +\def\bbl@withactive#1#2{% + \begingroup + \lccode`~=`#2\relax + \lowercase{\endgroup#1~}} +\def\bbl@redefine#1{% + \edef\bbl@tempa{\bbl@stripslash#1}% + \expandafter\let\csname org@\bbl@tempa\endcsname#1% + \expandafter\def\csname\bbl@tempa\endcsname} +\@onlypreamble\bbl@redefine +\def\bbl@redefine@long#1{% + \edef\bbl@tempa{\bbl@stripslash#1}% + \expandafter\let\csname org@\bbl@tempa\endcsname#1% + \expandafter\long\expandafter\def\csname\bbl@tempa\endcsname} +\@onlypreamble\bbl@redefine@long +\def\bbl@redefinerobust#1{% + \edef\bbl@tempa{\bbl@stripslash#1}% + \bbl@ifunset{\bbl@tempa\space}% + {\expandafter\let\csname org@\bbl@tempa\endcsname#1% + \bbl@exp{\def\\#1{\\\protect\<\bbl@tempa\space>}}}% + {\bbl@exp{\let\<org@\bbl@tempa>\<\bbl@tempa\space>}}% + \@namedef{\bbl@tempa\space}} +\@onlypreamble\bbl@redefinerobust +\bbl@trace{Hooks} +\newcommand\AddBabelHook[3][]{% + \bbl@ifunset{bbl@hk@#2}{\EnableBabelHook{#2}}{}% + \def\bbl@tempa##1,#3=##2,##3\@empty{\def\bbl@tempb{##2}}% + \expandafter\bbl@tempa\bbl@evargs,#3=,\@empty + \bbl@ifunset{bbl@ev@#2@#3@#1}% + {\bbl@csarg\bbl@add{ev@#3@#1}{\bbl@elth{#2}}}% + {\bbl@csarg\let{ev@#2@#3@#1}\relax}% + \bbl@csarg\newcommand{ev@#2@#3@#1}[\bbl@tempb]} +\newcommand\EnableBabelHook[1]{\bbl@csarg\let{hk@#1}\@firstofone} +\newcommand\DisableBabelHook[1]{\bbl@csarg\let{hk@#1}\@gobble} +\def\bbl@usehooks#1#2{% + \ifx\UseHook\@undefined\else\UseHook{babel/*/#1}\fi + \def\bbl@elth##1{% + \bbl@cs{hk@##1}{\bbl@cs{ev@##1@#1@}#2}}% + \bbl@cs{ev@#1@}% + \ifx\languagename\@undefined\else % Test required for Plain (?) + \ifx\UseHook\@undefined\else\UseHook{babel/\languagename/#1}\fi + \def\bbl@elth##1{% + \bbl@cs{hk@##1}{\bbl@cl{ev@##1@#1}#2}}% + \bbl@cl{ev@#1}% + \fi} +\def\bbl@evargs{,% <- don't delete this comma + everylanguage=1,loadkernel=1,loadpatterns=1,loadexceptions=1,% + adddialect=2,patterns=2,defaultcommands=0,encodedcommands=2,write=0,% + beforeextras=0,afterextras=0,stopcommands=0,stringprocess=0,% + hyphenation=2,initiateactive=3,afterreset=0,foreign=0,foreign*=0,% + beforestart=0,languagename=2} +\ifx\NewHook\@undefined\else + \def\bbl@tempa#1=#2\@@{\NewHook{babel/#1}} + \bbl@foreach\bbl@evargs{\bbl@tempa#1\@@} +\fi +\bbl@trace{Defining babelensure} +\newcommand\babelensure[2][]{% TODO - revise test files + \AddBabelHook{babel-ensure}{afterextras}{% + \ifcase\bbl@select@type + \bbl@cl{e}% + \fi}% + \begingroup + \let\bbl@ens@include\@empty + \let\bbl@ens@exclude\@empty + \def\bbl@ens@fontenc{\relax}% + \def\bbl@tempb##1{% + \ifx\@empty##1\else\noexpand##1\expandafter\bbl@tempb\fi}% + \edef\bbl@tempa{\bbl@tempb#1\@empty}% + \def\bbl@tempb##1=##2\@@{\@namedef{bbl@ens@##1}{##2}}% + \bbl@foreach\bbl@tempa{\bbl@tempb##1\@@}% + \def\bbl@tempc{\bbl@ensure}% + \expandafter\bbl@add\expandafter\bbl@tempc\expandafter{% + \expandafter{\bbl@ens@include}}% + \expandafter\bbl@add\expandafter\bbl@tempc\expandafter{% + \expandafter{\bbl@ens@exclude}}% + \toks@\expandafter{\bbl@tempc}% + \bbl@exp{% + \endgroup + \def\<bbl@e@#2>{\the\toks@{\bbl@ens@fontenc}}}} +\def\bbl@ensure#1#2#3{% 1: include 2: exclude 3: fontenc + \def\bbl@tempb##1{% elt for (excluding) \bbl@captionslist list + \ifx##1\@undefined % 3.32 - Don't assume the macro exists + \edef##1{\noexpand\bbl@nocaption + {\bbl@stripslash##1}{\languagename\bbl@stripslash##1}}% + \fi + \ifx##1\@empty\else + \in@{##1}{#2}% + \ifin@\else + \bbl@ifunset{bbl@ensure@\languagename}% + {\bbl@exp{% + \\\DeclareRobustCommand\<bbl@ensure@\languagename>[1]{% + \\\foreignlanguage{\languagename}% + {\ifx\relax#3\else + \\\fontencoding{#3}\\\selectfont + \fi + ########1}}}}% + {}% + \toks@\expandafter{##1}% + \edef##1{% + \bbl@csarg\noexpand{ensure@\languagename}% + {\the\toks@}}% + \fi + \expandafter\bbl@tempb + \fi}% + \expandafter\bbl@tempb\bbl@captionslist\today\@empty + \def\bbl@tempa##1{% elt for include list + \ifx##1\@empty\else + \bbl@csarg\in@{ensure@\languagename\expandafter}\expandafter{##1}% + \ifin@\else + \bbl@tempb##1\@empty + \fi + \expandafter\bbl@tempa + \fi}% + \bbl@tempa#1\@empty} +\def\bbl@captionslist{% + \prefacename\refname\abstractname\bibname\chaptername\appendixname + \contentsname\listfigurename\listtablename\indexname\figurename + \tablename\partname\enclname\ccname\headtoname\pagename\seename + \alsoname\proofname\glossaryname} +\bbl@trace{Macros for setting language files up} +\def\bbl@ldfinit{% + \let\bbl@screset\@empty + \let\BabelStrings\bbl@opt@string + \let\BabelOptions\@empty + \let\BabelLanguages\relax + \ifx\originalTeX\@undefined + \let\originalTeX\@empty + \else + \originalTeX + \fi} +\def\LdfInit#1#2{% + \chardef\atcatcode=\catcode`\@ + \catcode`\@=11\relax + \chardef\eqcatcode=\catcode`\= + \catcode`\==12\relax + \expandafter\if\expandafter\@backslashchar + \expandafter\@car\string#2\@nil + \ifx#2\@undefined\else + \ldf@quit{#1}% + \fi + \else + \expandafter\ifx\csname#2\endcsname\relax\else + \ldf@quit{#1}% + \fi + \fi + \bbl@ldfinit} +\def\ldf@quit#1{% + \expandafter\main@language\expandafter{#1}% + \catcode`\@=\atcatcode \let\atcatcode\relax + \catcode`\==\eqcatcode \let\eqcatcode\relax + \endinput} +\def\bbl@afterldf#1{% TODO. Merge into the next macro? Unused elsewhere + \bbl@afterlang + \let\bbl@afterlang\relax + \let\BabelModifiers\relax + \let\bbl@screset\relax}% +\def\ldf@finish#1{% + \loadlocalcfg{#1}% + \bbl@afterldf{#1}% + \expandafter\main@language\expandafter{#1}% + \catcode`\@=\atcatcode \let\atcatcode\relax + \catcode`\==\eqcatcode \let\eqcatcode\relax} +\@onlypreamble\LdfInit +\@onlypreamble\ldf@quit +\@onlypreamble\ldf@finish +\def\main@language#1{% + \def\bbl@main@language{#1}% + \let\languagename\bbl@main@language % TODO. Set localename + \bbl@id@assign + \bbl@patterns{\languagename}} +\def\bbl@beforestart{% + \def\@nolanerr##1{% + \bbl@warning{Undefined language '##1' in aux.\\Reported}}% + \bbl@usehooks{beforestart}{}% + \global\let\bbl@beforestart\relax} +\AtBeginDocument{% + {\@nameuse{bbl@beforestart}}% Group! + \if@filesw + \providecommand\babel@aux[2]{}% + \immediate\write\@mainaux{% + \string\providecommand\string\babel@aux[2]{}}% + \immediate\write\@mainaux{\string\@nameuse{bbl@beforestart}}% + \fi + \expandafter\selectlanguage\expandafter{\bbl@main@language}% + \ifbbl@single % must go after the line above. + \renewcommand\selectlanguage[1]{}% + \renewcommand\foreignlanguage[2]{#2}% + \global\let\babel@aux\@gobbletwo % Also as flag + \fi + \ifcase\bbl@engine\or\pagedir\bodydir\fi} % TODO - a better place +\def\select@language@x#1{% + \ifcase\bbl@select@type + \bbl@ifsamestring\languagename{#1}{}{\select@language{#1}}% + \else + \select@language{#1}% + \fi} +\bbl@trace{Shorhands} +\def\bbl@add@special#1{% 1:a macro like \", \?, etc. + \bbl@add\dospecials{\do#1}% test @sanitize = \relax, for back. compat. + \bbl@ifunset{@sanitize}{}{\bbl@add\@sanitize{\@makeother#1}}% + \ifx\nfss@catcodes\@undefined\else % TODO - same for above + \begingroup + \catcode`#1\active + \nfss@catcodes + \ifnum\catcode`#1=\active + \endgroup + \bbl@add\nfss@catcodes{\@makeother#1}% + \else + \endgroup + \fi + \fi} +\def\bbl@remove@special#1{% + \begingroup + \def\x##1##2{\ifnum`#1=`##2\noexpand\@empty + \else\noexpand##1\noexpand##2\fi}% + \def\do{\x\do}% + \def\@makeother{\x\@makeother}% + \edef\x{\endgroup + \def\noexpand\dospecials{\dospecials}% + \expandafter\ifx\csname @sanitize\endcsname\relax\else + \def\noexpand\@sanitize{\@sanitize}% + \fi}% + \x} +\def\bbl@active@def#1#2#3#4{% + \@namedef{#3#1}{% + \expandafter\ifx\csname#2@sh@#1@\endcsname\relax + \bbl@afterelse\bbl@sh@select#2#1{#3@arg#1}{#4#1}% + \else + \bbl@afterfi\csname#2@sh@#1@\endcsname + \fi}% + \long\@namedef{#3@arg#1}##1{% + \expandafter\ifx\csname#2@sh@#1@\string##1@\endcsname\relax + \bbl@afterelse\csname#4#1\endcsname##1% + \else + \bbl@afterfi\csname#2@sh@#1@\string##1@\endcsname + \fi}}% +\def\initiate@active@char#1{% + \bbl@ifunset{active@char\string#1}% + {\bbl@withactive + {\expandafter\@initiate@active@char\expandafter}#1\string#1#1}% + {}} +\def\@initiate@active@char#1#2#3{% + \bbl@csarg\edef{oricat@#2}{\catcode`#2=\the\catcode`#2\relax}% + \ifx#1\@undefined + \bbl@csarg\def{oridef@#2}{\def#1{\active@prefix#1\@undefined}}% + \else + \bbl@csarg\let{oridef@@#2}#1% + \bbl@csarg\edef{oridef@#2}{% + \let\noexpand#1% + \expandafter\noexpand\csname bbl@oridef@@#2\endcsname}% + \fi + \ifx#1#3\relax + \expandafter\let\csname normal@char#2\endcsname#3% + \else + \bbl@info{Making #2 an active character}% + \ifnum\mathcode`#2=\ifodd\bbl@engine"1000000 \else"8000 \fi + \@namedef{normal@char#2}{% + \textormath{#3}{\csname bbl@oridef@@#2\endcsname}}% + \else + \@namedef{normal@char#2}{#3}% + \fi + \bbl@restoreactive{#2}% + \AtBeginDocument{% + \catcode`#2\active + \if@filesw + \immediate\write\@mainaux{\catcode`\string#2\active}% + \fi}% + \expandafter\bbl@add@special\csname#2\endcsname + \catcode`#2\active + \fi + \let\bbl@tempa\@firstoftwo + \if\string^#2% + \def\bbl@tempa{\noexpand\textormath}% + \else + \ifx\bbl@mathnormal\@undefined\else + \let\bbl@tempa\bbl@mathnormal + \fi + \fi + \expandafter\edef\csname active@char#2\endcsname{% + \bbl@tempa + {\noexpand\if@safe@actives + \noexpand\expandafter + \expandafter\noexpand\csname normal@char#2\endcsname + \noexpand\else + \noexpand\expandafter + \expandafter\noexpand\csname bbl@doactive#2\endcsname + \noexpand\fi}% + {\expandafter\noexpand\csname normal@char#2\endcsname}}% + \bbl@csarg\edef{doactive#2}{% + \expandafter\noexpand\csname user@active#2\endcsname}% + \bbl@csarg\edef{active@#2}{% + \noexpand\active@prefix\noexpand#1% + \expandafter\noexpand\csname active@char#2\endcsname}% + \bbl@csarg\edef{normal@#2}{% + \noexpand\active@prefix\noexpand#1% + \expandafter\noexpand\csname normal@char#2\endcsname}% + \expandafter\let\expandafter#1\csname bbl@normal@#2\endcsname + \bbl@active@def#2\user@group{user@active}{language@active}% + \bbl@active@def#2\language@group{language@active}{system@active}% + \bbl@active@def#2\system@group{system@active}{normal@char}% + \expandafter\edef\csname\user@group @sh@#2@@\endcsname + {\expandafter\noexpand\csname normal@char#2\endcsname}% + \expandafter\edef\csname\user@group @sh@#2@\string\protect@\endcsname + {\expandafter\noexpand\csname user@active#2\endcsname}% + \if\string'#2% + \let\prim@s\bbl@prim@s + \let\active@math@prime#1% + \fi + \bbl@usehooks{initiateactive}{{#1}{#2}{#3}}} +\@ifpackagewith{babel}{KeepShorthandsActive}% + {\let\bbl@restoreactive\@gobble}% + {\def\bbl@restoreactive#1{% + \bbl@exp{% + \\\AfterBabelLanguage\\\CurrentOption + {\catcode`#1=\the\catcode`#1\relax}% + \\\AtEndOfPackage + {\catcode`#1=\the\catcode`#1\relax}}}% + \AtEndOfPackage{\let\bbl@restoreactive\@gobble}} +\def\bbl@sh@select#1#2{% + \expandafter\ifx\csname#1@sh@#2@sel\endcsname\relax + \bbl@afterelse\bbl@scndcs + \else + \bbl@afterfi\csname#1@sh@#2@sel\endcsname + \fi} +\begingroup +\bbl@ifunset{ifincsname}% TODO. Ugly. Correct? Only Plain? + {\gdef\active@prefix#1{% + \ifx\protect\@typeset@protect + \else + \ifx\protect\@unexpandable@protect + \noexpand#1% + \else + \protect#1% + \fi + \expandafter\@gobble + \fi}} + {\gdef\active@prefix#1{% + \ifincsname + \string#1% + \expandafter\@gobble + \else + \ifx\protect\@typeset@protect + \else + \ifx\protect\@unexpandable@protect + \noexpand#1% + \else + \protect#1% + \fi + \expandafter\expandafter\expandafter\@gobble + \fi + \fi}} +\endgroup +\newif\if@safe@actives +\@safe@activesfalse +\def\bbl@restore@actives{\if@safe@actives\@safe@activesfalse\fi} +\chardef\bbl@activated\z@ +\def\bbl@activate#1{% + \chardef\bbl@activated\@ne + \bbl@withactive{\expandafter\let\expandafter}#1% + \csname bbl@active@\string#1\endcsname} +\def\bbl@deactivate#1{% + \chardef\bbl@activated\tw@ + \bbl@withactive{\expandafter\let\expandafter}#1% + \csname bbl@normal@\string#1\endcsname} +\def\bbl@firstcs#1#2{\csname#1\endcsname} +\def\bbl@scndcs#1#2{\csname#2\endcsname} + +\def\babel@texpdf#1#2#3#4{% + \ifx\texorpdfstring\@undefined + \textormath{#1}{#3}% + \else + \texorpdfstring{\textormath{#1}{#3}}{#2}% + % \texorpdfstring{\textormath{#1}{#3}}{\textormath{#2}{#4}}% + \fi} +\def\declare@shorthand#1#2{\@decl@short{#1}#2\@nil} +\def\@decl@short#1#2#3\@nil#4{% + \def\bbl@tempa{#3}% + \ifx\bbl@tempa\@empty + \expandafter\let\csname #1@sh@\string#2@sel\endcsname\bbl@scndcs + \bbl@ifunset{#1@sh@\string#2@}{}% + {\def\bbl@tempa{#4}% + \expandafter\ifx\csname#1@sh@\string#2@\endcsname\bbl@tempa + \else + \bbl@info + {Redefining #1 shorthand \string#2\\% + in language \CurrentOption}% + \fi}% + \@namedef{#1@sh@\string#2@}{#4}% + \else + \expandafter\let\csname #1@sh@\string#2@sel\endcsname\bbl@firstcs + \bbl@ifunset{#1@sh@\string#2@\string#3@}{}% + {\def\bbl@tempa{#4}% + \expandafter\ifx\csname#1@sh@\string#2@\string#3@\endcsname\bbl@tempa + \else + \bbl@info + {Redefining #1 shorthand \string#2\string#3\\% + in language \CurrentOption}% + \fi}% + \@namedef{#1@sh@\string#2@\string#3@}{#4}% + \fi} +\def\textormath{% + \ifmmode + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi} +\def\user@group{user} +\def\language@group{english} % TODO. I don't like defaults +\def\system@group{system} +\def\useshorthands{% + \@ifstar\bbl@usesh@s{\bbl@usesh@x{}}} +\def\bbl@usesh@s#1{% + \bbl@usesh@x + {\AddBabelHook{babel-sh-\string#1}{afterextras}{\bbl@activate{#1}}}% + {#1}} +\def\bbl@usesh@x#1#2{% + \bbl@ifshorthand{#2}% + {\def\user@group{user}% + \initiate@active@char{#2}% + #1% + \bbl@activate{#2}}% + {\bbl@error + {I can't declare a shorthand turned off (\string#2)} + {Sorry, but you can't use shorthands which have been\\% + turned off in the package options}}} +\def\user@language@group{user@\language@group} +\def\bbl@set@user@generic#1#2{% + \bbl@ifunset{user@generic@active#1}% + {\bbl@active@def#1\user@language@group{user@active}{user@generic@active}% + \bbl@active@def#1\user@group{user@generic@active}{language@active}% + \expandafter\edef\csname#2@sh@#1@@\endcsname{% + \expandafter\noexpand\csname normal@char#1\endcsname}% + \expandafter\edef\csname#2@sh@#1@\string\protect@\endcsname{% + \expandafter\noexpand\csname user@active#1\endcsname}}% + \@empty} +\newcommand\defineshorthand[3][user]{% + \edef\bbl@tempa{\zap@space#1 \@empty}% + \bbl@for\bbl@tempb\bbl@tempa{% + \if*\expandafter\@car\bbl@tempb\@nil + \edef\bbl@tempb{user@\expandafter\@gobble\bbl@tempb}% + \@expandtwoargs + \bbl@set@user@generic{\expandafter\string\@car#2\@nil}\bbl@tempb + \fi + \declare@shorthand{\bbl@tempb}{#2}{#3}}} +\def\languageshorthands#1{\def\language@group{#1}} +\def\aliasshorthand#1#2{% + \bbl@ifshorthand{#2}% + {\expandafter\ifx\csname active@char\string#2\endcsname\relax + \ifx\document\@notprerr + \@notshorthand{#2}% + \else + \initiate@active@char{#2}% + \expandafter\let\csname active@char\string#2\expandafter\endcsname + \csname active@char\string#1\endcsname + \expandafter\let\csname normal@char\string#2\expandafter\endcsname + \csname normal@char\string#1\endcsname + \bbl@activate{#2}% + \fi + \fi}% + {\bbl@error + {Cannot declare a shorthand turned off (\string#2)} + {Sorry, but you cannot use shorthands which have been\\% + turned off in the package options}}} +\def\@notshorthand#1{% + \bbl@error{% + The character '\string #1' should be made a shorthand character;\\% + add the command \string\useshorthands\string{#1\string} to + the preamble.\\% + I will ignore your instruction}% + {You may proceed, but expect unexpected results}} +\newcommand*\shorthandon[1]{\bbl@switch@sh\@ne#1\@nnil} +\DeclareRobustCommand*\shorthandoff{% + \@ifstar{\bbl@shorthandoff\tw@}{\bbl@shorthandoff\z@}} +\def\bbl@shorthandoff#1#2{\bbl@switch@sh#1#2\@nnil} +\def\bbl@switch@sh#1#2{% + \ifx#2\@nnil\else + \bbl@ifunset{bbl@active@\string#2}% + {\bbl@error + {I can't switch '\string#2' on or off--not a shorthand}% + {This character is not a shorthand. Maybe you made\\% + a typing mistake? I will ignore your instruction.}}% + {\ifcase#1% off, on, off* + \catcode`#212\relax + \or + \catcode`#2\active + \bbl@ifunset{bbl@shdef@\string#2}% + {}% + {\bbl@withactive{\expandafter\let\expandafter}#2% + \csname bbl@shdef@\string#2\endcsname + \bbl@csarg\let{shdef@\string#2}\relax}% + \ifcase\bbl@activated\or + \bbl@activate{#2}% + \else + \bbl@deactivate{#2}% + \fi + \or + \bbl@ifunset{bbl@shdef@\string#2}% + {\bbl@withactive{\bbl@csarg\let{shdef@\string#2}}#2}% + {}% + \csname bbl@oricat@\string#2\endcsname + \csname bbl@oridef@\string#2\endcsname + \fi}% + \bbl@afterfi\bbl@switch@sh#1% + \fi} +\def\babelshorthand{\active@prefix\babelshorthand\bbl@putsh} +\def\bbl@putsh#1{% + \bbl@ifunset{bbl@active@\string#1}% + {\bbl@putsh@i#1\@empty\@nnil}% + {\csname bbl@active@\string#1\endcsname}} +\def\bbl@putsh@i#1#2\@nnil{% + \csname\language@group @sh@\string#1@% + \ifx\@empty#2\else\string#2@\fi\endcsname} +\ifx\bbl@opt@shorthands\@nnil\else + \let\bbl@s@initiate@active@char\initiate@active@char + \def\initiate@active@char#1{% + \bbl@ifshorthand{#1}{\bbl@s@initiate@active@char{#1}}{}} + \let\bbl@s@switch@sh\bbl@switch@sh + \def\bbl@switch@sh#1#2{% + \ifx#2\@nnil\else + \bbl@afterfi + \bbl@ifshorthand{#2}{\bbl@s@switch@sh#1{#2}}{\bbl@switch@sh#1}% + \fi} + \let\bbl@s@activate\bbl@activate + \def\bbl@activate#1{% + \bbl@ifshorthand{#1}{\bbl@s@activate{#1}}{}} + \let\bbl@s@deactivate\bbl@deactivate + \def\bbl@deactivate#1{% + \bbl@ifshorthand{#1}{\bbl@s@deactivate{#1}}{}} +\fi +\newcommand\ifbabelshorthand[3]{\bbl@ifunset{bbl@active@\string#1}{#3}{#2}} +\def\bbl@prim@s{% + \prime\futurelet\@let@token\bbl@pr@m@s} +\def\bbl@if@primes#1#2{% + \ifx#1\@let@token + \expandafter\@firstoftwo + \else\ifx#2\@let@token + \bbl@afterelse\expandafter\@firstoftwo + \else + \bbl@afterfi\expandafter\@secondoftwo + \fi\fi} +\begingroup + \catcode`\^=7 \catcode`\*=\active \lccode`\*=`\^ + \catcode`\'=12 \catcode`\"=\active \lccode`\"=`\' + \lowercase{% + \gdef\bbl@pr@m@s{% + \bbl@if@primes"'% + \pr@@@s + {\bbl@if@primes*^\pr@@@t\egroup}}} +\endgroup +\initiate@active@char{~} +\declare@shorthand{system}{~}{\leavevmode\nobreak\ } +\bbl@activate{~} +\expandafter\def\csname OT1dqpos\endcsname{127} +\expandafter\def\csname T1dqpos\endcsname{4} +\ifx\f@encoding\@undefined + \def\f@encoding{OT1} +\fi +\bbl@trace{Language attributes} +\newcommand\languageattribute[2]{% + \def\bbl@tempc{#1}% + \bbl@fixname\bbl@tempc + \bbl@iflanguage\bbl@tempc{% + \bbl@vforeach{#2}{% + \ifx\bbl@known@attribs\@undefined + \in@false + \else + \bbl@xin@{,\bbl@tempc-##1,}{,\bbl@known@attribs,}% + \fi + \ifin@ + \bbl@warning{% + You have more than once selected the attribute '##1'\\% + for language #1. Reported}% + \else + \bbl@exp{% + \\\bbl@add@list\\\bbl@known@attribs{\bbl@tempc-##1}}% + \edef\bbl@tempa{\bbl@tempc-##1}% + \expandafter\bbl@ifknown@ttrib\expandafter{\bbl@tempa}\bbl@attributes% + {\csname\bbl@tempc @attr@##1\endcsname}% + {\@attrerr{\bbl@tempc}{##1}}% + \fi}}} +\@onlypreamble\languageattribute +\newcommand*{\@attrerr}[2]{% + \bbl@error + {The attribute #2 is unknown for language #1.}% + {Your command will be ignored, type <return> to proceed}} +\def\bbl@declare@ttribute#1#2#3{% + \bbl@xin@{,#2,}{,\BabelModifiers,}% + \ifin@ + \AfterBabelLanguage{#1}{\languageattribute{#1}{#2}}% + \fi + \bbl@add@list\bbl@attributes{#1-#2}% + \expandafter\def\csname#1@attr@#2\endcsname{#3}} +\def\bbl@ifattributeset#1#2#3#4{% + \ifx\bbl@known@attribs\@undefined + \in@false + \else + \bbl@xin@{,#1-#2,}{,\bbl@known@attribs,}% + \fi + \ifin@ + \bbl@afterelse#3% + \else + \bbl@afterfi#4% + \fi} +\def\bbl@ifknown@ttrib#1#2{% + \let\bbl@tempa\@secondoftwo + \bbl@loopx\bbl@tempb{#2}{% + \expandafter\in@\expandafter{\expandafter,\bbl@tempb,}{,#1,}% + \ifin@ + \let\bbl@tempa\@firstoftwo + \else + \fi}% + \bbl@tempa} +\def\bbl@clear@ttribs{% + \ifx\bbl@attributes\@undefined\else + \bbl@loopx\bbl@tempa{\bbl@attributes}{% + \expandafter\bbl@clear@ttrib\bbl@tempa. + }% + \let\bbl@attributes\@undefined + \fi} +\def\bbl@clear@ttrib#1-#2.{% + \expandafter\let\csname#1@attr@#2\endcsname\@undefined} +\AtBeginDocument{\bbl@clear@ttribs} +\bbl@trace{Macros for saving definitions} +\def\babel@beginsave{\babel@savecnt\z@} +\newcount\babel@savecnt +\babel@beginsave +\def\babel@save#1{% + \expandafter\let\csname babel@\number\babel@savecnt\endcsname#1\relax + \toks@\expandafter{\originalTeX\let#1=}% + \bbl@exp{% + \def\\\originalTeX{\the\toks@\<babel@\number\babel@savecnt>\relax}}% + \advance\babel@savecnt\@ne} +\def\babel@savevariable#1{% + \toks@\expandafter{\originalTeX #1=}% + \bbl@exp{\def\\\originalTeX{\the\toks@\the#1\relax}}} +\def\bbl@frenchspacing{% + \ifnum\the\sfcode`\.=\@m + \let\bbl@nonfrenchspacing\relax + \else + \frenchspacing + \let\bbl@nonfrenchspacing\nonfrenchspacing + \fi} +\let\bbl@nonfrenchspacing\nonfrenchspacing +\let\bbl@elt\relax +\edef\bbl@fs@chars{% + \bbl@elt{\string.}\@m{3000}\bbl@elt{\string?}\@m{3000}% + \bbl@elt{\string!}\@m{3000}\bbl@elt{\string:}\@m{2000}% + \bbl@elt{\string;}\@m{1500}\bbl@elt{\string,}\@m{1250}} +\def\bbl@pre@fs{% + \def\bbl@elt##1##2##3{\sfcode`##1=\the\sfcode`##1\relax}% + \edef\bbl@save@sfcodes{\bbl@fs@chars}}% +\def\bbl@post@fs{% + \bbl@save@sfcodes + \edef\bbl@tempa{\bbl@cl{frspc}}% + \edef\bbl@tempa{\expandafter\@car\bbl@tempa\@nil}% + \if u\bbl@tempa % do nothing + \else\if n\bbl@tempa % non french + \def\bbl@elt##1##2##3{% + \ifnum\sfcode`##1=##2\relax + \babel@savevariable{\sfcode`##1}% + \sfcode`##1=##3\relax + \fi}% + \bbl@fs@chars + \else\if y\bbl@tempa % french + \def\bbl@elt##1##2##3{% + \ifnum\sfcode`##1=##3\relax + \babel@savevariable{\sfcode`##1}% + \sfcode`##1=##2\relax + \fi}% + \bbl@fs@chars + \fi\fi\fi} +\bbl@trace{Short tags} +\def\babeltags#1{% + \edef\bbl@tempa{\zap@space#1 \@empty}% + \def\bbl@tempb##1=##2\@@{% + \edef\bbl@tempc{% + \noexpand\newcommand + \expandafter\noexpand\csname ##1\endcsname{% + \noexpand\protect + \expandafter\noexpand\csname otherlanguage*\endcsname{##2}} + \noexpand\newcommand + \expandafter\noexpand\csname text##1\endcsname{% + \noexpand\foreignlanguage{##2}}} + \bbl@tempc}% + \bbl@for\bbl@tempa\bbl@tempa{% + \expandafter\bbl@tempb\bbl@tempa\@@}} +\bbl@trace{Hyphens} +\@onlypreamble\babelhyphenation +\AtEndOfPackage{% + \newcommand\babelhyphenation[2][\@empty]{% + \ifx\bbl@hyphenation@\relax + \let\bbl@hyphenation@\@empty + \fi + \ifx\bbl@hyphlist\@empty\else + \bbl@warning{% + You must not intermingle \string\selectlanguage\space and\\% + \string\babelhyphenation\space or some exceptions will not\\% + be taken into account. Reported}% + \fi + \ifx\@empty#1% + \protected@edef\bbl@hyphenation@{\bbl@hyphenation@\space#2}% + \else + \bbl@vforeach{#1}{% + \def\bbl@tempa{##1}% + \bbl@fixname\bbl@tempa + \bbl@iflanguage\bbl@tempa{% + \bbl@csarg\protected@edef{hyphenation@\bbl@tempa}{% + \bbl@ifunset{bbl@hyphenation@\bbl@tempa}% + {}% + {\csname bbl@hyphenation@\bbl@tempa\endcsname\space}% + #2}}}% + \fi}} +\def\bbl@allowhyphens{\ifvmode\else\nobreak\hskip\z@skip\fi} +\def\bbl@t@one{T1} +\def\allowhyphens{\ifx\cf@encoding\bbl@t@one\else\bbl@allowhyphens\fi} +\newcommand\babelnullhyphen{\char\hyphenchar\font} +\def\babelhyphen{\active@prefix\babelhyphen\bbl@hyphen} +\def\bbl@hyphen{% + \@ifstar{\bbl@hyphen@i @}{\bbl@hyphen@i\@empty}} +\def\bbl@hyphen@i#1#2{% + \bbl@ifunset{bbl@hy@#1#2\@empty}% + {\csname bbl@#1usehyphen\endcsname{\discretionary{#2}{}{#2}}}% + {\csname bbl@hy@#1#2\@empty\endcsname}} +\def\bbl@usehyphen#1{% + \leavevmode + \ifdim\lastskip>\z@\mbox{#1}\else\nobreak#1\fi + \nobreak\hskip\z@skip} +\def\bbl@@usehyphen#1{% + \leavevmode\ifdim\lastskip>\z@\mbox{#1}\else#1\fi} +\def\bbl@hyphenchar{% + \ifnum\hyphenchar\font=\m@ne + \babelnullhyphen + \else + \char\hyphenchar\font + \fi} +\def\bbl@hy@soft{\bbl@usehyphen{\discretionary{\bbl@hyphenchar}{}{}}} +\def\bbl@hy@@soft{\bbl@@usehyphen{\discretionary{\bbl@hyphenchar}{}{}}} +\def\bbl@hy@hard{\bbl@usehyphen\bbl@hyphenchar} +\def\bbl@hy@@hard{\bbl@@usehyphen\bbl@hyphenchar} +\def\bbl@hy@nobreak{\bbl@usehyphen{\mbox{\bbl@hyphenchar}}} +\def\bbl@hy@@nobreak{\mbox{\bbl@hyphenchar}} +\def\bbl@hy@repeat{% + \bbl@usehyphen{% + \discretionary{\bbl@hyphenchar}{\bbl@hyphenchar}{\bbl@hyphenchar}}} +\def\bbl@hy@@repeat{% + \bbl@@usehyphen{% + \discretionary{\bbl@hyphenchar}{\bbl@hyphenchar}{\bbl@hyphenchar}}} +\def\bbl@hy@empty{\hskip\z@skip} +\def\bbl@hy@@empty{\discretionary{}{}{}} +\def\bbl@disc#1#2{\nobreak\discretionary{#2-}{}{#1}\bbl@allowhyphens} +\bbl@trace{Multiencoding strings} +\def\bbl@toglobal#1{\global\let#1#1} +\def\bbl@recatcode#1{% TODO. Used only once? + \@tempcnta="7F + \def\bbl@tempa{% + \ifnum\@tempcnta>"FF\else + \catcode\@tempcnta=#1\relax + \advance\@tempcnta\@ne + \expandafter\bbl@tempa + \fi}% + \bbl@tempa} +\@ifpackagewith{babel}{nocase}% + {\let\bbl@patchuclc\relax}% + {\def\bbl@patchuclc{% + \global\let\bbl@patchuclc\relax + \g@addto@macro\@uclclist{\reserved@b{\reserved@b\bbl@uclc}}% + \gdef\bbl@uclc##1{% + \let\bbl@encoded\bbl@encoded@uclc + \bbl@ifunset{\languagename @bbl@uclc}% and resumes it + {##1}% + {\let\bbl@tempa##1\relax % Used by LANG@bbl@uclc + \csname\languagename @bbl@uclc\endcsname}% + {\bbl@tolower\@empty}{\bbl@toupper\@empty}}% + \gdef\bbl@tolower{\csname\languagename @bbl@lc\endcsname}% + \gdef\bbl@toupper{\csname\languagename @bbl@uc\endcsname}}} +\@onlypreamble\StartBabelCommands +\def\StartBabelCommands{% + \begingroup + \bbl@recatcode{11}% + \def\SetStringLoop##1##2{% + \def\bbl@templ####1{\expandafter\noexpand\csname##1\endcsname}% + \count@\z@ + \bbl@loop\bbl@tempa{##2}{% empty items and spaces are ok + \advance\count@\@ne + \toks@\expandafter{\bbl@tempa}% + \bbl@exp{% + \\\SetString\bbl@templ{\romannumeral\count@}{\the\toks@}% + \count@=\the\count@\relax}}}% + \newcommand\SetCase[3][]{% + \bbl@patchuclc + \bbl@forlang\bbl@tempa{% + \expandafter\bbl@encstring + \csname\bbl@tempa @bbl@uclc\endcsname{\bbl@tempa##1}% + \expandafter\bbl@encstring + \csname\bbl@tempa @bbl@uc\endcsname{##2}% + \expandafter\bbl@encstring + \csname\bbl@tempa @bbl@lc\endcsname{##3}}}% + \newcommand\SetHyphenMap[1]{% + \bbl@forlang\bbl@tempa{% + \expandafter\bbl@stringdef + \csname\bbl@tempa @bbl@hyphenmap\endcsname{##1}}}% + \def\bbl@provstring##1##2{% + \providecommand##1{##2}% + \bbl@toglobal##1}% + \global\let\bbl@scafter\@empty + \let\StartBabelCommands\bbl@startcmds + \ifx\BabelLanguages\relax + \let\BabelLanguages\CurrentOption + \fi + \begingroup + \let\bbl@screset\@nnil % local flag - disable 1st stopcommands + \StartBabelCommands} +\def\bbl@startcmds{% + \ifx\bbl@screset\@nnil\else + \bbl@usehooks{stopcommands}{}% + \fi + \endgroup + \begingroup + \@ifstar + {\ifx\bbl@opt@strings\@nnil + \let\bbl@opt@strings\BabelStringsDefault + \fi + \bbl@startcmds@i}% + \bbl@startcmds@i} +\def\bbl@startcmds@i#1#2{% + \edef\bbl@L{\zap@space#1 \@empty}% + \edef\bbl@G{\zap@space#2 \@empty}% + \bbl@startcmds@ii} +\let\bbl@startcommands\StartBabelCommands +\newcommand\bbl@startcmds@ii[1][\@empty]{% + \let\SetString\@gobbletwo + \let\bbl@stringdef\@gobbletwo + \let\AfterBabelCommands\@gobble + \ifx\@empty#1% + \def\bbl@sc@label{generic}% + \def\bbl@encstring##1##2{% + \ProvideTextCommandDefault##1{##2}% + \bbl@toglobal##1% + \expandafter\bbl@toglobal\csname\string?\string##1\endcsname}% + \let\bbl@sctest\in@true + \else + \let\bbl@sc@charset\space % <- zapped below + \let\bbl@sc@fontenc\space % <- " " + \def\bbl@tempa##1=##2\@nil{% + \bbl@csarg\edef{sc@\zap@space##1 \@empty}{##2 }}% + \bbl@vforeach{label=#1}{\bbl@tempa##1\@nil}% + \def\bbl@tempa##1 ##2{% space -> comma + ##1% + \ifx\@empty##2\else\ifx,##1,\else,\fi\bbl@afterfi\bbl@tempa##2\fi}% + \edef\bbl@sc@fontenc{\expandafter\bbl@tempa\bbl@sc@fontenc\@empty}% + \edef\bbl@sc@label{\expandafter\zap@space\bbl@sc@label\@empty}% + \edef\bbl@sc@charset{\expandafter\zap@space\bbl@sc@charset\@empty}% + \def\bbl@encstring##1##2{% + \bbl@foreach\bbl@sc@fontenc{% + \bbl@ifunset{T@####1}% + {}% + {\ProvideTextCommand##1{####1}{##2}% + \bbl@toglobal##1% + \expandafter + \bbl@toglobal\csname####1\string##1\endcsname}}}% + \def\bbl@sctest{% + \bbl@xin@{,\bbl@opt@strings,}{,\bbl@sc@label,\bbl@sc@fontenc,}}% + \fi + \ifx\bbl@opt@strings\@nnil % ie, no strings key -> defaults + \else\ifx\bbl@opt@strings\relax % ie, strings=encoded + \let\AfterBabelCommands\bbl@aftercmds + \let\SetString\bbl@setstring + \let\bbl@stringdef\bbl@encstring + \else % ie, strings=value + \bbl@sctest + \ifin@ + \let\AfterBabelCommands\bbl@aftercmds + \let\SetString\bbl@setstring + \let\bbl@stringdef\bbl@provstring + \fi\fi\fi + \bbl@scswitch + \ifx\bbl@G\@empty + \def\SetString##1##2{% + \bbl@error{Missing group for string \string##1}% + {You must assign strings to some category, typically\\% + captions or extras, but you set none}}% + \fi + \ifx\@empty#1% + \bbl@usehooks{defaultcommands}{}% + \else + \@expandtwoargs + \bbl@usehooks{encodedcommands}{{\bbl@sc@charset}{\bbl@sc@fontenc}}% + \fi} +\def\bbl@forlang#1#2{% + \bbl@for#1\bbl@L{% + \bbl@xin@{,#1,}{,\BabelLanguages,}% + \ifin@#2\relax\fi}} +\def\bbl@scswitch{% + \bbl@forlang\bbl@tempa{% + \ifx\bbl@G\@empty\else + \ifx\SetString\@gobbletwo\else + \edef\bbl@GL{\bbl@G\bbl@tempa}% + \bbl@xin@{,\bbl@GL,}{,\bbl@screset,}% + \ifin@\else + \global\expandafter\let\csname\bbl@GL\endcsname\@undefined + \xdef\bbl@screset{\bbl@screset,\bbl@GL}% + \fi + \fi + \fi}} +\AtEndOfPackage{% + \def\bbl@forlang#1#2{\bbl@for#1\bbl@L{\bbl@ifunset{date#1}{}{#2}}}% + \let\bbl@scswitch\relax} +\@onlypreamble\EndBabelCommands +\def\EndBabelCommands{% + \bbl@usehooks{stopcommands}{}% + \endgroup + \endgroup + \bbl@scafter} +\let\bbl@endcommands\EndBabelCommands +\def\bbl@setstring#1#2{% eg, \prefacename{<string>} + \bbl@forlang\bbl@tempa{% + \edef\bbl@LC{\bbl@tempa\bbl@stripslash#1}% + \bbl@ifunset{\bbl@LC}% eg, \germanchaptername + {\bbl@exp{% + \global\\\bbl@add\<\bbl@G\bbl@tempa>{\\\bbl@scset\\#1\<\bbl@LC>}}}% + {}% + \def\BabelString{#2}% + \bbl@usehooks{stringprocess}{}% + \expandafter\bbl@stringdef + \csname\bbl@LC\expandafter\endcsname\expandafter{\BabelString}}} +\ifx\bbl@opt@strings\relax + \def\bbl@scset#1#2{\def#1{\bbl@encoded#2}} + \bbl@patchuclc + \let\bbl@encoded\relax + \def\bbl@encoded@uclc#1{% + \@inmathwarn#1% + \expandafter\ifx\csname\cf@encoding\string#1\endcsname\relax + \expandafter\ifx\csname ?\string#1\endcsname\relax + \TextSymbolUnavailable#1% + \else + \csname ?\string#1\endcsname + \fi + \else + \csname\cf@encoding\string#1\endcsname + \fi} +\else + \def\bbl@scset#1#2{\def#1{#2}} +\fi +\def\bbl@aftercmds#1{% + \toks@\expandafter{\bbl@scafter#1}% + \xdef\bbl@scafter{\the\toks@}} +\newcommand\BabelLower[2]{% one to one. + \ifnum\lccode#1=#2\else + \babel@savevariable{\lccode#1}% + \lccode#1=#2\relax + \fi} +\newcommand\BabelLowerMM[4]{% many-to-many + \@tempcnta=#1\relax + \@tempcntb=#4\relax + \def\bbl@tempa{% + \ifnum\@tempcnta>#2\else + \@expandtwoargs\BabelLower{\the\@tempcnta}{\the\@tempcntb}% + \advance\@tempcnta#3\relax + \advance\@tempcntb#3\relax + \expandafter\bbl@tempa + \fi}% + \bbl@tempa} +\newcommand\BabelLowerMO[4]{% many-to-one + \@tempcnta=#1\relax + \def\bbl@tempa{% + \ifnum\@tempcnta>#2\else + \@expandtwoargs\BabelLower{\the\@tempcnta}{#4}% + \advance\@tempcnta#3 + \expandafter\bbl@tempa + \fi}% + \bbl@tempa} +\AtEndOfPackage{% + \ifx\bbl@opt@hyphenmap\@undefined + \bbl@xin@{,}{\bbl@language@opts}% + \chardef\bbl@opt@hyphenmap\ifin@4\else\@ne\fi + \fi} +\newcommand\setlocalecaption{% TODO. Catch typos. What about ensure? + \@ifstar\bbl@setcaption@s\bbl@setcaption@x} +\def\bbl@setcaption@x#1#2#3{% language caption-name string + \bbl@trim@def\bbl@tempa{#2}% + \bbl@xin@{.template}{\bbl@tempa}% + \ifin@ + \bbl@ini@captions@template{#3}{#1}% + \else + \edef\bbl@tempd{% + \expandafter\expandafter\expandafter + \strip@prefix\expandafter\meaning\csname captions#1\endcsname}% + \bbl@xin@ + {\expandafter\string\csname #2name\endcsname}% + {\bbl@tempd}% + \ifin@ % Renew caption + \bbl@xin@{\string\bbl@scset}{\bbl@tempd}% + \ifin@ + \bbl@exp{% + \\\bbl@ifsamestring{\bbl@tempa}{\languagename}% + {\\\bbl@scset\<#2name>\<#1#2name>}% + {}}% + \else % Old way converts to new way + \bbl@ifunset{#1#2name}% + {\bbl@exp{% + \\\bbl@add\<captions#1>{\def\<#2name>{\<#1#2name>}}% + \\\bbl@ifsamestring{\bbl@tempa}{\languagename}% + {\def\<#2name>{\<#1#2name>}}% + {}}}% + {}% + \fi + \else + \bbl@xin@{\string\bbl@scset}{\bbl@tempd}% New + \ifin@ % New way + \bbl@exp{% + \\\bbl@add\<captions#1>{\\\bbl@scset\<#2name>\<#1#2name>}% + \\\bbl@ifsamestring{\bbl@tempa}{\languagename}% + {\\\bbl@scset\<#2name>\<#1#2name>}% + {}}% + \else % Old way, but defined in the new way + \bbl@exp{% + \\\bbl@add\<captions#1>{\def\<#2name>{\<#1#2name>}}% + \\\bbl@ifsamestring{\bbl@tempa}{\languagename}% + {\def\<#2name>{\<#1#2name>}}% + {}}% + \fi% + \fi + \@namedef{#1#2name}{#3}% + \toks@\expandafter{\bbl@captionslist}% + \bbl@exp{\\\in@{\<#2name>}{\the\toks@}}% + \ifin@\else + \bbl@exp{\\\bbl@add\\\bbl@captionslist{\<#2name>}}% + \bbl@toglobal\bbl@captionslist + \fi + \fi} +\bbl@trace{Macros related to glyphs} +\def\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}% + \dimen\z@\ht\z@ \advance\dimen\z@ -\ht\tw@% + \setbox\z@\hbox{\lower\dimen\z@ \box\z@}\ht\z@\ht\tw@ \dp\z@\dp\tw@} +\def\save@sf@q#1{\leavevmode + \begingroup + \edef\@SF{\spacefactor\the\spacefactor}#1\@SF + \endgroup} +\ProvideTextCommand{\quotedblbase}{OT1}{% + \save@sf@q{\set@low@box{\textquotedblright\/}% + \box\z@\kern-.04em\bbl@allowhyphens}} +\ProvideTextCommandDefault{\quotedblbase}{% + \UseTextSymbol{OT1}{\quotedblbase}} +\ProvideTextCommand{\quotesinglbase}{OT1}{% + \save@sf@q{\set@low@box{\textquoteright\/}% + \box\z@\kern-.04em\bbl@allowhyphens}} +\ProvideTextCommandDefault{\quotesinglbase}{% + \UseTextSymbol{OT1}{\quotesinglbase}} +\ProvideTextCommand{\guillemetleft}{OT1}{% + \ifmmode + \ll + \else + \save@sf@q{\nobreak + \raise.2ex\hbox{$\scriptscriptstyle\ll$}\bbl@allowhyphens}% + \fi} +\ProvideTextCommand{\guillemetright}{OT1}{% + \ifmmode + \gg + \else + \save@sf@q{\nobreak + \raise.2ex\hbox{$\scriptscriptstyle\gg$}\bbl@allowhyphens}% + \fi} +\ProvideTextCommand{\guillemotleft}{OT1}{% + \ifmmode + \ll + \else + \save@sf@q{\nobreak + \raise.2ex\hbox{$\scriptscriptstyle\ll$}\bbl@allowhyphens}% + \fi} +\ProvideTextCommand{\guillemotright}{OT1}{% + \ifmmode + \gg + \else + \save@sf@q{\nobreak + \raise.2ex\hbox{$\scriptscriptstyle\gg$}\bbl@allowhyphens}% + \fi} +\ProvideTextCommandDefault{\guillemetleft}{% + \UseTextSymbol{OT1}{\guillemetleft}} +\ProvideTextCommandDefault{\guillemetright}{% + \UseTextSymbol{OT1}{\guillemetright}} +\ProvideTextCommandDefault{\guillemotleft}{% + \UseTextSymbol{OT1}{\guillemotleft}} +\ProvideTextCommandDefault{\guillemotright}{% + \UseTextSymbol{OT1}{\guillemotright}} +\ProvideTextCommand{\guilsinglleft}{OT1}{% + \ifmmode + <% + \else + \save@sf@q{\nobreak + \raise.2ex\hbox{$\scriptscriptstyle<$}\bbl@allowhyphens}% + \fi} +\ProvideTextCommand{\guilsinglright}{OT1}{% + \ifmmode + >% + \else + \save@sf@q{\nobreak + \raise.2ex\hbox{$\scriptscriptstyle>$}\bbl@allowhyphens}% + \fi} +\ProvideTextCommandDefault{\guilsinglleft}{% + \UseTextSymbol{OT1}{\guilsinglleft}} +\ProvideTextCommandDefault{\guilsinglright}{% + \UseTextSymbol{OT1}{\guilsinglright}} +\DeclareTextCommand{\ij}{OT1}{% + i\kern-0.02em\bbl@allowhyphens j} +\DeclareTextCommand{\IJ}{OT1}{% + I\kern-0.02em\bbl@allowhyphens J} +\DeclareTextCommand{\ij}{T1}{\char188} +\DeclareTextCommand{\IJ}{T1}{\char156} +\ProvideTextCommandDefault{\ij}{% + \UseTextSymbol{OT1}{\ij}} +\ProvideTextCommandDefault{\IJ}{% + \UseTextSymbol{OT1}{\IJ}} +\def\crrtic@{\hrule height0.1ex width0.3em} +\def\crttic@{\hrule height0.1ex width0.33em} +\def\ddj@{% + \setbox0\hbox{d}\dimen@=\ht0 + \advance\dimen@1ex + \dimen@.45\dimen@ + \dimen@ii\expandafter\rem@pt\the\fontdimen\@ne\font\dimen@ + \advance\dimen@ii.5ex + \leavevmode\rlap{\raise\dimen@\hbox{\kern\dimen@ii\vbox{\crrtic@}}}} +\def\DDJ@{% + \setbox0\hbox{D}\dimen@=.55\ht0 + \dimen@ii\expandafter\rem@pt\the\fontdimen\@ne\font\dimen@ + \advance\dimen@ii.15ex % correction for the dash position + \advance\dimen@ii-.15\fontdimen7\font % correction for cmtt font + \dimen\thr@@\expandafter\rem@pt\the\fontdimen7\font\dimen@ + \leavevmode\rlap{\raise\dimen@\hbox{\kern\dimen@ii\vbox{\crttic@}}}} +\DeclareTextCommand{\dj}{OT1}{\ddj@ d} +\DeclareTextCommand{\DJ}{OT1}{\DDJ@ D} +\ProvideTextCommandDefault{\dj}{% + \UseTextSymbol{OT1}{\dj}} +\ProvideTextCommandDefault{\DJ}{% + \UseTextSymbol{OT1}{\DJ}} +\DeclareTextCommand{\SS}{OT1}{SS} +\ProvideTextCommandDefault{\SS}{\UseTextSymbol{OT1}{\SS}} +\ProvideTextCommandDefault{\glq}{% + \textormath{\quotesinglbase}{\mbox{\quotesinglbase}}} +\ProvideTextCommand{\grq}{T1}{% + \textormath{\kern\z@\textquoteleft}{\mbox{\textquoteleft}}} +\ProvideTextCommand{\grq}{TU}{% + \textormath{\textquoteleft}{\mbox{\textquoteleft}}} +\ProvideTextCommand{\grq}{OT1}{% + \save@sf@q{\kern-.0125em + \textormath{\textquoteleft}{\mbox{\textquoteleft}}% + \kern.07em\relax}} +\ProvideTextCommandDefault{\grq}{\UseTextSymbol{OT1}\grq} +\ProvideTextCommandDefault{\glqq}{% + \textormath{\quotedblbase}{\mbox{\quotedblbase}}} +\ProvideTextCommand{\grqq}{T1}{% + \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}} +\ProvideTextCommand{\grqq}{TU}{% + \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}} +\ProvideTextCommand{\grqq}{OT1}{% + \save@sf@q{\kern-.07em + \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}% + \kern.07em\relax}} +\ProvideTextCommandDefault{\grqq}{\UseTextSymbol{OT1}\grqq} +\ProvideTextCommandDefault{\flq}{% + \textormath{\guilsinglleft}{\mbox{\guilsinglleft}}} +\ProvideTextCommandDefault{\frq}{% + \textormath{\guilsinglright}{\mbox{\guilsinglright}}} +\ProvideTextCommandDefault{\flqq}{% + \textormath{\guillemetleft}{\mbox{\guillemetleft}}} +\ProvideTextCommandDefault{\frqq}{% + \textormath{\guillemetright}{\mbox{\guillemetright}}} +\def\umlauthigh{% + \def\bbl@umlauta##1{\leavevmode\bgroup% + \expandafter\accent\csname\f@encoding dqpos\endcsname + ##1\bbl@allowhyphens\egroup}% + \let\bbl@umlaute\bbl@umlauta} +\def\umlautlow{% + \def\bbl@umlauta{\protect\lower@umlaut}} +\def\umlautelow{% + \def\bbl@umlaute{\protect\lower@umlaut}} +\umlauthigh +\expandafter\ifx\csname U@D\endcsname\relax + \csname newdimen\endcsname\U@D +\fi +\def\lower@umlaut#1{% + \leavevmode\bgroup + \U@D 1ex% + {\setbox\z@\hbox{% + \expandafter\char\csname\f@encoding dqpos\endcsname}% + \dimen@ -.45ex\advance\dimen@\ht\z@ + \ifdim 1ex<\dimen@ \fontdimen5\font\dimen@ \fi}% + \expandafter\accent\csname\f@encoding dqpos\endcsname + \fontdimen5\font\U@D #1% + \egroup} +\AtBeginDocument{% + \DeclareTextCompositeCommand{\"}{OT1}{a}{\bbl@umlauta{a}}% + \DeclareTextCompositeCommand{\"}{OT1}{e}{\bbl@umlaute{e}}% + \DeclareTextCompositeCommand{\"}{OT1}{i}{\bbl@umlaute{\i}}% + \DeclareTextCompositeCommand{\"}{OT1}{\i}{\bbl@umlaute{\i}}% + \DeclareTextCompositeCommand{\"}{OT1}{o}{\bbl@umlauta{o}}% + \DeclareTextCompositeCommand{\"}{OT1}{u}{\bbl@umlauta{u}}% + \DeclareTextCompositeCommand{\"}{OT1}{A}{\bbl@umlauta{A}}% + \DeclareTextCompositeCommand{\"}{OT1}{E}{\bbl@umlaute{E}}% + \DeclareTextCompositeCommand{\"}{OT1}{I}{\bbl@umlaute{I}}% + \DeclareTextCompositeCommand{\"}{OT1}{O}{\bbl@umlauta{O}}% + \DeclareTextCompositeCommand{\"}{OT1}{U}{\bbl@umlauta{U}}} +\ifx\l@english\@undefined + \chardef\l@english\z@ +\fi +\ifx\l@unhyphenated\@undefined + \newlanguage\l@unhyphenated +\fi +\bbl@trace{Bidi layout} +\providecommand\IfBabelLayout[3]{#3}% +\newcommand\BabelPatchSection[1]{% + \@ifundefined{#1}{}{% + \bbl@exp{\let\<bbl@ss@#1>\<#1>}% + \@namedef{#1}{% + \@ifstar{\bbl@presec@s{#1}}% + {\@dblarg{\bbl@presec@x{#1}}}}}} +\def\bbl@presec@x#1[#2]#3{% + \bbl@exp{% + \\\select@language@x{\bbl@main@language}% + \\\bbl@cs{sspre@#1}% + \\\bbl@cs{ss@#1}% + [\\\foreignlanguage{\languagename}{\unexpanded{#2}}]% + {\\\foreignlanguage{\languagename}{\unexpanded{#3}}}% + \\\select@language@x{\languagename}}} +\def\bbl@presec@s#1#2{% + \bbl@exp{% + \\\select@language@x{\bbl@main@language}% + \\\bbl@cs{sspre@#1}% + \\\bbl@cs{ss@#1}*% + {\\\foreignlanguage{\languagename}{\unexpanded{#2}}}% + \\\select@language@x{\languagename}}} +\IfBabelLayout{sectioning}% + {\BabelPatchSection{part}% + \BabelPatchSection{chapter}% + \BabelPatchSection{section}% + \BabelPatchSection{subsection}% + \BabelPatchSection{subsubsection}% + \BabelPatchSection{paragraph}% + \BabelPatchSection{subparagraph}% + \def\babel@toc#1{% + \select@language@x{\bbl@main@language}}}{} +\IfBabelLayout{captions}% + {\BabelPatchSection{caption}}{} +\bbl@trace{Input engine specific macros} +\ifcase\bbl@engine + \input txtbabel.def +\or + \input luababel.def +\or + \input xebabel.def +\fi +\bbl@trace{Creating languages and reading ini files} +\let\bbl@extend@ini\@gobble +\newcommand\babelprovide[2][]{% + \let\bbl@savelangname\languagename + \edef\bbl@savelocaleid{\the\localeid}% + % Set name and locale id + \edef\languagename{#2}% + \bbl@id@assign + % Initialize keys + \let\bbl@KVP@captions\@nil + \let\bbl@KVP@date\@nil + \let\bbl@KVP@import\@nil + \let\bbl@KVP@main\@nil + \let\bbl@KVP@script\@nil + \let\bbl@KVP@language\@nil + \let\bbl@KVP@hyphenrules\@nil + \let\bbl@KVP@linebreaking\@nil + \let\bbl@KVP@justification\@nil + \let\bbl@KVP@mapfont\@nil + \let\bbl@KVP@maparabic\@nil + \let\bbl@KVP@mapdigits\@nil + \let\bbl@KVP@intraspace\@nil + \let\bbl@KVP@intrapenalty\@nil + \let\bbl@KVP@onchar\@nil + \let\bbl@KVP@transforms\@nil + \global\let\bbl@release@transforms\@empty + \let\bbl@KVP@alph\@nil + \let\bbl@KVP@Alph\@nil + \let\bbl@KVP@labels\@nil + \bbl@csarg\let{KVP@labels*}\@nil + \global\let\bbl@inidata\@empty + \global\let\bbl@extend@ini\@gobble + \gdef\bbl@key@list{;}% + \bbl@forkv{#1}{% TODO - error handling + \in@{/}{##1}% + \ifin@ + \global\let\bbl@extend@ini\bbl@extend@ini@aux + \bbl@renewinikey##1\@@{##2}% + \else + \bbl@csarg\def{KVP@##1}{##2}% + \fi}% + \chardef\bbl@howloaded=% 0:none; 1:ldf without ini; 2:ini + \bbl@ifunset{date#2}\z@{\bbl@ifunset{bbl@llevel@#2}\@ne\tw@}% + % == init == + \ifx\bbl@screset\@undefined + \bbl@ldfinit + \fi + % == + \let\bbl@lbkflag\relax % \@empty = do setup linebreak + \ifcase\bbl@howloaded + \let\bbl@lbkflag\@empty % new + \else + \ifx\bbl@KVP@hyphenrules\@nil\else + \let\bbl@lbkflag\@empty + \fi + \ifx\bbl@KVP@import\@nil\else + \let\bbl@lbkflag\@empty + \fi + \fi + % == import, captions == + \ifx\bbl@KVP@import\@nil\else + \bbl@exp{\\\bbl@ifblank{\bbl@KVP@import}}% + {\ifx\bbl@initoload\relax + \begingroup + \def\BabelBeforeIni##1##2{\gdef\bbl@KVP@import{##1}\endinput}% + \bbl@input@texini{#2}% + \endgroup + \else + \xdef\bbl@KVP@import{\bbl@initoload}% + \fi}% + {}% + \fi + \ifx\bbl@KVP@captions\@nil + \let\bbl@KVP@captions\bbl@KVP@import + \fi + % == + \ifx\bbl@KVP@transforms\@nil\else + \bbl@replace\bbl@KVP@transforms{ }{,}% + \fi + % == Load ini == + \ifcase\bbl@howloaded + \bbl@provide@new{#2}% + \else + \bbl@ifblank{#1}% + {}% With \bbl@load@basic below + {\bbl@provide@renew{#2}}% + \fi + % Post tasks + % ---------- + % == subsequent calls after the first provide for a locale == + \ifx\bbl@inidata\@empty\else + \bbl@extend@ini{#2}% + \fi + % == ensure captions == + \ifx\bbl@KVP@captions\@nil\else + \bbl@ifunset{bbl@extracaps@#2}% + {\bbl@exp{\\\babelensure[exclude=\\\today]{#2}}}% + {\bbl@exp{\\\babelensure[exclude=\\\today, + include=\[bbl@extracaps@#2]}]{#2}}% + \bbl@ifunset{bbl@ensure@\languagename}% + {\bbl@exp{% + \\\DeclareRobustCommand\<bbl@ensure@\languagename>[1]{% + \\\foreignlanguage{\languagename}% + {####1}}}}% + {}% + \bbl@exp{% + \\\bbl@toglobal\<bbl@ensure@\languagename>% + \\\bbl@toglobal\<bbl@ensure@\languagename\space>}% + \fi + % == + % At this point all parameters are defined if 'import'. Now we + % execute some code depending on them. But what about if nothing was + % imported? We just set the basic parameters, but still loading the + % whole ini file. + \bbl@load@basic{#2}% + % == script, language == + % Override the values from ini or defines them + \ifx\bbl@KVP@script\@nil\else + \bbl@csarg\edef{sname@#2}{\bbl@KVP@script}% + \fi + \ifx\bbl@KVP@language\@nil\else + \bbl@csarg\edef{lname@#2}{\bbl@KVP@language}% + \fi + % == onchar == + \ifx\bbl@KVP@onchar\@nil\else + \bbl@luahyphenate + \directlua{ + if Babel.locale_mapped == nil then + Babel.locale_mapped = true + Babel.linebreaking.add_before(Babel.locale_map) + Babel.loc_to_scr = {} + Babel.chr_to_loc = Babel.chr_to_loc or {} + end}% + \bbl@xin@{ ids }{ \bbl@KVP@onchar\space}% + \ifin@ + \ifx\bbl@starthyphens\@undefined % Needed if no explicit selection + \AddBabelHook{babel-onchar}{beforestart}{{\bbl@starthyphens}}% + \fi + \bbl@exp{\\\bbl@add\\\bbl@starthyphens + {\\\bbl@patterns@lua{\languagename}}}% + % TODO - error/warning if no script + \directlua{ + if Babel.script_blocks['\bbl@cl{sbcp}'] then + Babel.loc_to_scr[\the\localeid] = + Babel.script_blocks['\bbl@cl{sbcp}'] + Babel.locale_props[\the\localeid].lc = \the\localeid\space + Babel.locale_props[\the\localeid].lg = \the\@nameuse{l@\languagename}\space + end + }% + \fi + \bbl@xin@{ fonts }{ \bbl@KVP@onchar\space}% + \ifin@ + \bbl@ifunset{bbl@lsys@\languagename}{\bbl@provide@lsys{\languagename}}{}% + \bbl@ifunset{bbl@wdir@\languagename}{\bbl@provide@dirs{\languagename}}{}% + \directlua{ + if Babel.script_blocks['\bbl@cl{sbcp}'] then + Babel.loc_to_scr[\the\localeid] = + Babel.script_blocks['\bbl@cl{sbcp}'] + end}% + \ifx\bbl@mapselect\@undefined % TODO. almost the same as mapfont + \AtBeginDocument{% + \bbl@patchfont{{\bbl@mapselect}}% + {\selectfont}}% + \def\bbl@mapselect{% + \let\bbl@mapselect\relax + \edef\bbl@prefontid{\fontid\font}}% + \def\bbl@mapdir##1{% + {\def\languagename{##1}% + \let\bbl@ifrestoring\@firstoftwo % To avoid font warning + \bbl@switchfont + \directlua{ + Babel.locale_props[\the\csname bbl@id@@##1\endcsname]% + ['/\bbl@prefontid'] = \fontid\font\space}}}% + \fi + \bbl@exp{\\\bbl@add\\\bbl@mapselect{\\\bbl@mapdir{\languagename}}}% + \fi + % TODO - catch non-valid values + \fi + % == mapfont == + % For bidi texts, to switch the font based on direction + \ifx\bbl@KVP@mapfont\@nil\else + \bbl@ifsamestring{\bbl@KVP@mapfont}{direction}{}% + {\bbl@error{Option '\bbl@KVP@mapfont' unknown for\\% + mapfont. Use 'direction'.% + {See the manual for details.}}}% + \bbl@ifunset{bbl@lsys@\languagename}{\bbl@provide@lsys{\languagename}}{}% + \bbl@ifunset{bbl@wdir@\languagename}{\bbl@provide@dirs{\languagename}}{}% + \ifx\bbl@mapselect\@undefined % TODO. See onchar. + \AtBeginDocument{% + \bbl@patchfont{{\bbl@mapselect}}% + {\selectfont}}% + \def\bbl@mapselect{% + \let\bbl@mapselect\relax + \edef\bbl@prefontid{\fontid\font}}% + \def\bbl@mapdir##1{% + {\def\languagename{##1}% + \let\bbl@ifrestoring\@firstoftwo % avoid font warning + \bbl@switchfont + \directlua{Babel.fontmap + [\the\csname bbl@wdir@##1\endcsname]% + [\bbl@prefontid]=\fontid\font}}}% + \fi + \bbl@exp{\\\bbl@add\\\bbl@mapselect{\\\bbl@mapdir{\languagename}}}% + \fi + % == Line breaking: intraspace, intrapenalty == + % For CJK, East Asian, Southeast Asian, if interspace in ini + \ifx\bbl@KVP@intraspace\@nil\else % We can override the ini or set + \bbl@csarg\edef{intsp@#2}{\bbl@KVP@intraspace}% + \fi + \bbl@provide@intraspace + % == Line breaking: CJK quotes == + \ifcase\bbl@engine\or + \bbl@xin@{/c}{/\bbl@cl{lnbrk}}% + \ifin@ + \bbl@ifunset{bbl@quote@\languagename}{}% + {\directlua{ + Babel.locale_props[\the\localeid].cjk_quotes = {} + local cs = 'op' + for c in string.utfvalues(% + [[\csname bbl@quote@\languagename\endcsname]]) do + if Babel.cjk_characters[c].c == 'qu' then + Babel.locale_props[\the\localeid].cjk_quotes[c] = cs + end + cs = ( cs == 'op') and 'cl' or 'op' + end + }}% + \fi + \fi + % == Line breaking: justification == + \ifx\bbl@KVP@justification\@nil\else + \let\bbl@KVP@linebreaking\bbl@KVP@justification + \fi + \ifx\bbl@KVP@linebreaking\@nil\else + \bbl@xin@{,\bbl@KVP@linebreaking,}{,elongated,kashida,cjk,unhyphenated,}% + \ifin@ + \bbl@csarg\xdef + {lnbrk@\languagename}{\expandafter\@car\bbl@KVP@linebreaking\@nil}% + \fi + \fi + \bbl@xin@{/e}{/\bbl@cl{lnbrk}}% + \ifin@\else\bbl@xin@{/k}{/\bbl@cl{lnbrk}}\fi + \ifin@\bbl@arabicjust\fi + % == Line breaking: hyphenate.other.(locale|script) == + \ifx\bbl@lbkflag\@empty + \bbl@ifunset{bbl@hyotl@\languagename}{}% + {\bbl@csarg\bbl@replace{hyotl@\languagename}{ }{,}% + \bbl@startcommands*{\languagename}{}% + \bbl@csarg\bbl@foreach{hyotl@\languagename}{% + \ifcase\bbl@engine + \ifnum##1<257 + \SetHyphenMap{\BabelLower{##1}{##1}}% + \fi + \else + \SetHyphenMap{\BabelLower{##1}{##1}}% + \fi}% + \bbl@endcommands}% + \bbl@ifunset{bbl@hyots@\languagename}{}% + {\bbl@csarg\bbl@replace{hyots@\languagename}{ }{,}% + \bbl@csarg\bbl@foreach{hyots@\languagename}{% + \ifcase\bbl@engine + \ifnum##1<257 + \global\lccode##1=##1\relax + \fi + \else + \global\lccode##1=##1\relax + \fi}}% + \fi + % == Counters: maparabic == + % Native digits, if provided in ini (TeX level, xe and lua) + \ifcase\bbl@engine\else + \bbl@ifunset{bbl@dgnat@\languagename}{}% + {\expandafter\ifx\csname bbl@dgnat@\languagename\endcsname\@empty\else + \expandafter\expandafter\expandafter + \bbl@setdigits\csname bbl@dgnat@\languagename\endcsname + \ifx\bbl@KVP@maparabic\@nil\else + \ifx\bbl@latinarabic\@undefined + \expandafter\let\expandafter\@arabic + \csname bbl@counter@\languagename\endcsname + \else % ie, if layout=counters, which redefines \@arabic + \expandafter\let\expandafter\bbl@latinarabic + \csname bbl@counter@\languagename\endcsname + \fi + \fi + \fi}% + \fi + % == Counters: mapdigits == + % Native digits (lua level). + \ifodd\bbl@engine + \ifx\bbl@KVP@mapdigits\@nil\else + \bbl@ifunset{bbl@dgnat@\languagename}{}% + {\RequirePackage{luatexbase}% + \bbl@activate@preotf + \directlua{ + Babel = Babel or {} %%% -> presets in luababel + Babel.digits_mapped = true + Babel.digits = Babel.digits or {} + Babel.digits[\the\localeid] = + table.pack(string.utfvalue('\bbl@cl{dgnat}')) + if not Babel.numbers then + function Babel.numbers(head) + local LOCALE = Babel.attr_locale + local GLYPH = node.id'glyph' + local inmath = false + for item in node.traverse(head) do + if not inmath and item.id == GLYPH then + local temp = node.get_attribute(item, LOCALE) + if Babel.digits[temp] then + local chr = item.char + if chr > 47 and chr < 58 then + item.char = Babel.digits[temp][chr-47] + end + end + elseif item.id == node.id'math' then + inmath = (item.subtype == 0) + end + end + return head + end + end + }}% + \fi + \fi + % == Counters: alph, Alph == + % What if extras<lang> contains a \babel@save\@alph? It won't be + % restored correctly when exiting the language, so we ignore + % this change with the \bbl@alph@saved trick. + \ifx\bbl@KVP@alph\@nil\else + \bbl@extras@wrap{\\\bbl@alph@saved}% + {\let\bbl@alph@saved\@alph}% + {\let\@alph\bbl@alph@saved + \babel@save\@alph}% + \bbl@exp{% + \\\bbl@add\<extras\languagename>{% + \let\\\@alph\<bbl@cntr@\bbl@KVP@alph @\languagename>}}% + \fi + \ifx\bbl@KVP@Alph\@nil\else + \bbl@extras@wrap{\\\bbl@Alph@saved}% + {\let\bbl@Alph@saved\@Alph}% + {\let\@Alph\bbl@Alph@saved + \babel@save\@Alph}% + \bbl@exp{% + \\\bbl@add\<extras\languagename>{% + \let\\\@Alph\<bbl@cntr@\bbl@KVP@Alph @\languagename>}}% + \fi + % == require.babel in ini == + % To load or reaload the babel-*.tex, if require.babel in ini + \ifx\bbl@beforestart\relax\else % But not in doc aux or body + \bbl@ifunset{bbl@rqtex@\languagename}{}% + {\expandafter\ifx\csname bbl@rqtex@\languagename\endcsname\@empty\else + \let\BabelBeforeIni\@gobbletwo + \chardef\atcatcode=\catcode`\@ + \catcode`\@=11\relax + \bbl@input@texini{\bbl@cs{rqtex@\languagename}}% + \catcode`\@=\atcatcode + \let\atcatcode\relax + \global\bbl@csarg\let{rqtex@\languagename}\relax + \fi}% + \fi + % == frenchspacing == + \ifcase\bbl@howloaded\in@true\else\in@false\fi + \ifin@\else\bbl@xin@{typography/frenchspacing}{\bbl@key@list}\fi + \ifin@ + \bbl@extras@wrap{\\\bbl@pre@fs}% + {\bbl@pre@fs}% + {\bbl@post@fs}% + \fi + % == Release saved transforms == + \bbl@release@transforms\relax % \relax closes the last item. + % == main == + \ifx\bbl@KVP@main\@nil % Restore only if not 'main' + \let\languagename\bbl@savelangname + \chardef\localeid\bbl@savelocaleid\relax + \fi} +\def\bbl@provide@new#1{% + \@namedef{date#1}{}% marks lang exists - required by \StartBabelCommands + \@namedef{extras#1}{}% + \@namedef{noextras#1}{}% + \bbl@startcommands*{#1}{captions}% + \ifx\bbl@KVP@captions\@nil % and also if import, implicit + \def\bbl@tempb##1{% elt for \bbl@captionslist + \ifx##1\@empty\else + \bbl@exp{% + \\\SetString\\##1{% + \\\bbl@nocaption{\bbl@stripslash##1}{#1\bbl@stripslash##1}}}% + \expandafter\bbl@tempb + \fi}% + \expandafter\bbl@tempb\bbl@captionslist\@empty + \else + \ifx\bbl@initoload\relax + \bbl@read@ini{\bbl@KVP@captions}2% % Here letters cat = 11 + \else + \bbl@read@ini{\bbl@initoload}2% % Same + \fi + \fi + \StartBabelCommands*{#1}{date}% + \ifx\bbl@KVP@import\@nil + \bbl@exp{% + \\\SetString\\\today{\\\bbl@nocaption{today}{#1today}}}% + \else + \bbl@savetoday + \bbl@savedate + \fi + \bbl@endcommands + \bbl@load@basic{#1}% + % == hyphenmins == (only if new) + \bbl@exp{% + \gdef\<#1hyphenmins>{% + {\bbl@ifunset{bbl@lfthm@#1}{2}{\bbl@cs{lfthm@#1}}}% + {\bbl@ifunset{bbl@rgthm@#1}{3}{\bbl@cs{rgthm@#1}}}}}% + % == hyphenrules (also in renew) == + \bbl@provide@hyphens{#1}% + \ifx\bbl@KVP@main\@nil\else + \expandafter\main@language\expandafter{#1}% + \fi} +\def\bbl@provide@renew#1{% + \ifx\bbl@KVP@captions\@nil\else + \StartBabelCommands*{#1}{captions}% + \bbl@read@ini{\bbl@KVP@captions}2% % Here all letters cat = 11 + \EndBabelCommands + \fi + \ifx\bbl@KVP@import\@nil\else + \StartBabelCommands*{#1}{date}% + \bbl@savetoday + \bbl@savedate + \EndBabelCommands + \fi + % == hyphenrules (also in new) == + \ifx\bbl@lbkflag\@empty + \bbl@provide@hyphens{#1}% + \fi} +\def\bbl@load@basic#1{% + \ifcase\bbl@howloaded\or\or + \ifcase\csname bbl@llevel@\languagename\endcsname + \bbl@csarg\let{lname@\languagename}\relax + \fi + \fi + \bbl@ifunset{bbl@lname@#1}% + {\def\BabelBeforeIni##1##2{% + \begingroup + \let\bbl@ini@captions@aux\@gobbletwo + \def\bbl@inidate ####1.####2.####3.####4\relax ####5####6{}% + \bbl@read@ini{##1}1% + \ifx\bbl@initoload\relax\endinput\fi + \endgroup}% + \begingroup % boxed, to avoid extra spaces: + \ifx\bbl@initoload\relax + \bbl@input@texini{#1}% + \else + \setbox\z@\hbox{\BabelBeforeIni{\bbl@initoload}{}}% + \fi + \endgroup}% + {}} +\def\bbl@provide@hyphens#1{% + \let\bbl@tempa\relax + \ifx\bbl@KVP@hyphenrules\@nil\else + \bbl@replace\bbl@KVP@hyphenrules{ }{,}% + \bbl@foreach\bbl@KVP@hyphenrules{% + \ifx\bbl@tempa\relax % if not yet found + \bbl@ifsamestring{##1}{+}% + {{\bbl@exp{\\\addlanguage\<l@##1>}}}% + {}% + \bbl@ifunset{l@##1}% + {}% + {\bbl@exp{\let\bbl@tempa\<l@##1>}}% + \fi}% + \fi + \ifx\bbl@tempa\relax % if no opt or no language in opt found + \ifx\bbl@KVP@import\@nil + \ifx\bbl@initoload\relax\else + \bbl@exp{% and hyphenrules is not empty + \\\bbl@ifblank{\bbl@cs{hyphr@#1}}% + {}% + {\let\\\bbl@tempa\<l@\bbl@cl{hyphr}>}}% + \fi + \else % if importing + \bbl@exp{% and hyphenrules is not empty + \\\bbl@ifblank{\bbl@cs{hyphr@#1}}% + {}% + {\let\\\bbl@tempa\<l@\bbl@cl{hyphr}>}}% + \fi + \fi + \bbl@ifunset{bbl@tempa}% ie, relax or undefined + {\bbl@ifunset{l@#1}% no hyphenrules found - fallback + {\bbl@exp{\\\adddialect\<l@#1>\language}}% + {}}% so, l@<lang> is ok - nothing to do + {\bbl@exp{\\\adddialect\<l@#1>\bbl@tempa}}}% found in opt list or ini +\def\bbl@input@texini#1{% + \bbl@bsphack + \bbl@exp{% + \catcode`\\\%=14 \catcode`\\\\=0 + \catcode`\\\{=1 \catcode`\\\}=2 + \lowercase{\\\InputIfFileExists{babel-#1.tex}{}{}}% + \catcode`\\\%=\the\catcode`\%\relax + \catcode`\\\\=\the\catcode`\\\relax + \catcode`\\\{=\the\catcode`\{\relax + \catcode`\\\}=\the\catcode`\}\relax}% + \bbl@esphack} +\def\bbl@iniline#1\bbl@iniline{% + \@ifnextchar[\bbl@inisect{\@ifnextchar;\bbl@iniskip\bbl@inistore}#1\@@}% ] +\def\bbl@inisect[#1]#2\@@{\def\bbl@section{#1}} +\def\bbl@iniskip#1\@@{}% if starts with ; +\def\bbl@inistore#1=#2\@@{% full (default) + \bbl@trim@def\bbl@tempa{#1}% + \bbl@trim\toks@{#2}% + \bbl@xin@{;\bbl@section/\bbl@tempa;}{\bbl@key@list}% + \ifin@\else + \bbl@exp{% + \\\g@addto@macro\\\bbl@inidata{% + \\\bbl@elt{\bbl@section}{\bbl@tempa}{\the\toks@}}}% + \fi} +\def\bbl@inistore@min#1=#2\@@{% minimal (maybe set in \bbl@read@ini) + \bbl@trim@def\bbl@tempa{#1}% + \bbl@trim\toks@{#2}% + \bbl@xin@{.identification.}{.\bbl@section.}% + \ifin@ + \bbl@exp{\\\g@addto@macro\\\bbl@inidata{% + \\\bbl@elt{identification}{\bbl@tempa}{\the\toks@}}}% + \fi} +\ifx\bbl@readstream\@undefined + \csname newread\endcsname\bbl@readstream +\fi +\def\bbl@read@ini#1#2{% + \global\let\bbl@extend@ini\@gobble + \openin\bbl@readstream=babel-#1.ini + \ifeof\bbl@readstream + \bbl@error + {There is no ini file for the requested language\\% + (#1). Perhaps you misspelled it or your installation\\% + is not complete.}% + {Fix the name or reinstall babel.}% + \else + % == Store ini data in \bbl@inidata == + \catcode`\[=12 \catcode`\]=12 \catcode`\==12 \catcode`\&=12 + \catcode`\;=12 \catcode`\|=12 \catcode`\%=14 \catcode`\-=12 + \bbl@info{Importing + \ifcase#2font and identification \or basic \fi + data for \languagename\\% + from babel-#1.ini. Reported}% + \ifnum#2=\z@ + \global\let\bbl@inidata\@empty + \let\bbl@inistore\bbl@inistore@min % Remember it's local + \fi + \def\bbl@section{identification}% + \bbl@exp{\\\bbl@inistore tag.ini=#1\\\@@}% + \bbl@inistore load.level=#2\@@ + \loop + \if T\ifeof\bbl@readstream F\fi T\relax % Trick, because inside \loop + \endlinechar\m@ne + \read\bbl@readstream to \bbl@line + \endlinechar`\^^M + \ifx\bbl@line\@empty\else + \expandafter\bbl@iniline\bbl@line\bbl@iniline + \fi + \repeat + % == Process stored data == + \bbl@csarg\xdef{lini@\languagename}{#1}% + \bbl@read@ini@aux + % == 'Export' data == + \bbl@ini@exports{#2}% + \global\bbl@csarg\let{inidata@\languagename}\bbl@inidata + \global\let\bbl@inidata\@empty + \bbl@exp{\\\bbl@add@list\\\bbl@ini@loaded{\languagename}}% + \bbl@toglobal\bbl@ini@loaded + \fi} +\def\bbl@read@ini@aux{% + \let\bbl@savestrings\@empty + \let\bbl@savetoday\@empty + \let\bbl@savedate\@empty + \def\bbl@elt##1##2##3{% + \def\bbl@section{##1}% + \in@{=date.}{=##1}% Find a better place + \ifin@ + \bbl@ini@calendar{##1}% + \fi + \bbl@ifunset{bbl@inikv@##1}{}% + {\csname bbl@inikv@##1\endcsname{##2}{##3}}}% + \bbl@inidata} +\def\bbl@extend@ini@aux#1{% + \bbl@startcommands*{#1}{captions}% + % Activate captions/... and modify exports + \bbl@csarg\def{inikv@captions.licr}##1##2{% + \setlocalecaption{#1}{##1}{##2}}% + \def\bbl@inikv@captions##1##2{% + \bbl@ini@captions@aux{##1}{##2}}% + \def\bbl@stringdef##1##2{\gdef##1{##2}}% + \def\bbl@exportkey##1##2##3{% + \bbl@ifunset{bbl@@kv@##2}{}% + {\expandafter\ifx\csname bbl@@kv@##2\endcsname\@empty\else + \bbl@exp{\global\let\<bbl@##1@\languagename>\<bbl@@kv@##2>}% + \fi}}% + % As with \bbl@read@ini, but with some changes + \bbl@read@ini@aux + \bbl@ini@exports\tw@ + % Update inidata@lang by pretending the ini is read. + \def\bbl@elt##1##2##3{% + \def\bbl@section{##1}% + \bbl@iniline##2=##3\bbl@iniline}% + \csname bbl@inidata@#1\endcsname + \global\bbl@csarg\let{inidata@#1}\bbl@inidata + \StartBabelCommands*{#1}{date}% And from the import stuff + \def\bbl@stringdef##1##2{\gdef##1{##2}}% + \bbl@savetoday + \bbl@savedate + \bbl@endcommands} +\def\bbl@ini@calendar#1{% + \lowercase{\def\bbl@tempa{=#1=}}% + \bbl@replace\bbl@tempa{=date.gregorian}{}% + \bbl@replace\bbl@tempa{=date.}{}% + \in@{.licr=}{#1=}% + \ifin@ + \ifcase\bbl@engine + \bbl@replace\bbl@tempa{.licr=}{}% + \else + \let\bbl@tempa\relax + \fi + \fi + \ifx\bbl@tempa\relax\else + \bbl@replace\bbl@tempa{=}{}% + \bbl@exp{% + \def\<bbl@inikv@#1>####1####2{% + \\\bbl@inidate####1...\relax{####2}{\bbl@tempa}}}% + \fi} +\def\bbl@renewinikey#1/#2\@@#3{% + \edef\bbl@tempa{\zap@space #1 \@empty}% section + \edef\bbl@tempb{\zap@space #2 \@empty}% key + \bbl@trim\toks@{#3}% value + \bbl@exp{% + \edef\\\bbl@key@list{\bbl@key@list \bbl@tempa/\bbl@tempb;}% + \\\g@addto@macro\\\bbl@inidata{% + \\\bbl@elt{\bbl@tempa}{\bbl@tempb}{\the\toks@}}}}% +\def\bbl@exportkey#1#2#3{% + \bbl@ifunset{bbl@@kv@#2}% + {\bbl@csarg\gdef{#1@\languagename}{#3}}% + {\expandafter\ifx\csname bbl@@kv@#2\endcsname\@empty + \bbl@csarg\gdef{#1@\languagename}{#3}% + \else + \bbl@exp{\global\let\<bbl@#1@\languagename>\<bbl@@kv@#2>}% + \fi}} +\def\bbl@iniwarning#1{% + \bbl@ifunset{bbl@@kv@identification.warning#1}{}% + {\bbl@warning{% + From babel-\bbl@cs{lini@\languagename}.ini:\\% + \bbl@cs{@kv@identification.warning#1}\\% + Reported }}} +\let\bbl@release@transforms\@empty +\def\bbl@ini@exports#1{% + % Identification always exported + \bbl@iniwarning{}% + \ifcase\bbl@engine + \bbl@iniwarning{.pdflatex}% + \or + \bbl@iniwarning{.lualatex}% + \or + \bbl@iniwarning{.xelatex}% + \fi% + \bbl@exportkey{llevel}{identification.load.level}{}% + \bbl@exportkey{elname}{identification.name.english}{}% + \bbl@exp{\\\bbl@exportkey{lname}{identification.name.opentype}% + {\csname bbl@elname@\languagename\endcsname}}% + \bbl@exportkey{tbcp}{identification.tag.bcp47}{}% + \bbl@exportkey{lbcp}{identification.language.tag.bcp47}{}% + \bbl@exportkey{lotf}{identification.tag.opentype}{dflt}% + \bbl@exportkey{esname}{identification.script.name}{}% + \bbl@exp{\\\bbl@exportkey{sname}{identification.script.name.opentype}% + {\csname bbl@esname@\languagename\endcsname}}% + \bbl@exportkey{sbcp}{identification.script.tag.bcp47}{}% + \bbl@exportkey{sotf}{identification.script.tag.opentype}{DFLT}% + % Also maps bcp47 -> languagename + \ifbbl@bcptoname + \bbl@csarg\xdef{bcp@map@\bbl@cl{tbcp}}{\languagename}% + \fi + % Conditional + \ifnum#1>\z@ % 0 = only info, 1, 2 = basic, (re)new + \bbl@exportkey{lnbrk}{typography.linebreaking}{h}% + \bbl@exportkey{hyphr}{typography.hyphenrules}{}% + \bbl@exportkey{lfthm}{typography.lefthyphenmin}{2}% + \bbl@exportkey{rgthm}{typography.righthyphenmin}{3}% + \bbl@exportkey{prehc}{typography.prehyphenchar}{}% + \bbl@exportkey{hyotl}{typography.hyphenate.other.locale}{}% + \bbl@exportkey{hyots}{typography.hyphenate.other.script}{}% + \bbl@exportkey{intsp}{typography.intraspace}{}% + \bbl@exportkey{frspc}{typography.frenchspacing}{u}% + \bbl@exportkey{chrng}{characters.ranges}{}% + \bbl@exportkey{quote}{characters.delimiters.quotes}{}% + \bbl@exportkey{dgnat}{numbers.digits.native}{}% + \ifnum#1=\tw@ % only (re)new + \bbl@exportkey{rqtex}{identification.require.babel}{}% + \bbl@toglobal\bbl@savetoday + \bbl@toglobal\bbl@savedate + \bbl@savestrings + \fi + \fi} +\def\bbl@inikv#1#2{% key=value + \toks@{#2}% This hides #'s from ini values + \bbl@csarg\edef{@kv@\bbl@section.#1}{\the\toks@}} +\let\bbl@inikv@identification\bbl@inikv +\let\bbl@inikv@typography\bbl@inikv +\let\bbl@inikv@characters\bbl@inikv +\let\bbl@inikv@numbers\bbl@inikv +\def\bbl@inikv@counters#1#2{% + \bbl@ifsamestring{#1}{digits}% + {\bbl@error{The counter name 'digits' is reserved for mapping\\% + decimal digits}% + {Use another name.}}% + {}% + \def\bbl@tempc{#1}% + \bbl@trim@def{\bbl@tempb*}{#2}% + \in@{.1$}{#1$}% + \ifin@ + \bbl@replace\bbl@tempc{.1}{}% + \bbl@csarg\protected@xdef{cntr@\bbl@tempc @\languagename}{% + \noexpand\bbl@alphnumeral{\bbl@tempc}}% + \fi + \in@{.F.}{#1}% + \ifin@\else\in@{.S.}{#1}\fi + \ifin@ + \bbl@csarg\protected@xdef{cntr@#1@\languagename}{\bbl@tempb*}% + \else + \toks@{}% Required by \bbl@buildifcase, which returns \bbl@tempa + \expandafter\bbl@buildifcase\bbl@tempb* \\ % Space after \\ + \bbl@csarg{\global\expandafter\let}{cntr@#1@\languagename}\bbl@tempa + \fi} +\ifcase\bbl@engine + \bbl@csarg\def{inikv@captions.licr}#1#2{% + \bbl@ini@captions@aux{#1}{#2}} +\else + \def\bbl@inikv@captions#1#2{% + \bbl@ini@captions@aux{#1}{#2}} +\fi +\def\bbl@ini@captions@template#1#2{% string language tempa=capt-name + \bbl@replace\bbl@tempa{.template}{}% + \def\bbl@toreplace{#1{}}% + \bbl@replace\bbl@toreplace{[ ]}{\nobreakspace{}}% + \bbl@replace\bbl@toreplace{[[}{\csname}% + \bbl@replace\bbl@toreplace{[}{\csname the}% + \bbl@replace\bbl@toreplace{]]}{name\endcsname{}}% + \bbl@replace\bbl@toreplace{]}{\endcsname{}}% + \bbl@xin@{,\bbl@tempa,}{,chapter,appendix,part,}% + \ifin@ + \@nameuse{bbl@patch\bbl@tempa}% + \global\bbl@csarg\let{\bbl@tempa fmt@#2}\bbl@toreplace + \fi + \bbl@xin@{,\bbl@tempa,}{,figure,table,}% + \ifin@ + \toks@\expandafter{\bbl@toreplace}% + \bbl@exp{\gdef\<fnum@\bbl@tempa>{\the\toks@}}% + \fi} +\def\bbl@ini@captions@aux#1#2{% + \bbl@trim@def\bbl@tempa{#1}% + \bbl@xin@{.template}{\bbl@tempa}% + \ifin@ + \bbl@ini@captions@template{#2}\languagename + \else + \bbl@ifblank{#2}% + {\bbl@exp{% + \toks@{\\\bbl@nocaption{\bbl@tempa}{\languagename\bbl@tempa name}}}}% + {\bbl@trim\toks@{#2}}% + \bbl@exp{% + \\\bbl@add\\\bbl@savestrings{% + \\\SetString\<\bbl@tempa name>{\the\toks@}}}% + \toks@\expandafter{\bbl@captionslist}% + \bbl@exp{\\\in@{\<\bbl@tempa name>}{\the\toks@}}% + \ifin@\else + \bbl@exp{% + \\\bbl@add\<bbl@extracaps@\languagename>{\<\bbl@tempa name>}% + \\\bbl@toglobal\<bbl@extracaps@\languagename>}% + \fi + \fi} +\def\bbl@list@the{% + part,chapter,section,subsection,subsubsection,paragraph,% + subparagraph,enumi,enumii,enumiii,enumiv,equation,figure,% + table,page,footnote,mpfootnote,mpfn} +\def\bbl@map@cnt#1{% #1:roman,etc, // #2:enumi,etc + \bbl@ifunset{bbl@map@#1@\languagename}% + {\@nameuse{#1}}% + {\@nameuse{bbl@map@#1@\languagename}}} +\def\bbl@inikv@labels#1#2{% + \in@{.map}{#1}% + \ifin@ + \ifx\bbl@KVP@labels\@nil\else + \bbl@xin@{ map }{ \bbl@KVP@labels\space}% + \ifin@ + \def\bbl@tempc{#1}% + \bbl@replace\bbl@tempc{.map}{}% + \in@{,#2,}{,arabic,roman,Roman,alph,Alph,fnsymbol,}% + \bbl@exp{% + \gdef\<bbl@map@\bbl@tempc @\languagename>% + {\ifin@\<#2>\else\\\localecounter{#2}\fi}}% + \bbl@foreach\bbl@list@the{% + \bbl@ifunset{the##1}{}% + {\bbl@exp{\let\\\bbl@tempd\<the##1>}% + \bbl@exp{% + \\\bbl@sreplace\<the##1>% + {\<\bbl@tempc>{##1}}{\\\bbl@map@cnt{\bbl@tempc}{##1}}% + \\\bbl@sreplace\<the##1>% + {\<\@empty @\bbl@tempc>\<c@##1>}{\\\bbl@map@cnt{\bbl@tempc}{##1}}}% + \expandafter\ifx\csname the##1\endcsname\bbl@tempd\else + \toks@\expandafter\expandafter\expandafter{% + \csname the##1\endcsname}% + \expandafter\xdef\csname the##1\endcsname{{\the\toks@}}% + \fi}}% + \fi + \fi + % + \else + % + % The following code is still under study. You can test it and make + % suggestions. Eg, enumerate.2 = ([enumi]).([enumii]). It's + % language dependent. + \in@{enumerate.}{#1}% + \ifin@ + \def\bbl@tempa{#1}% + \bbl@replace\bbl@tempa{enumerate.}{}% + \def\bbl@toreplace{#2}% + \bbl@replace\bbl@toreplace{[ ]}{\nobreakspace{}}% + \bbl@replace\bbl@toreplace{[}{\csname the}% + \bbl@replace\bbl@toreplace{]}{\endcsname{}}% + \toks@\expandafter{\bbl@toreplace}% + % TODO. Execute only once: + \bbl@exp{% + \\\bbl@add\<extras\languagename>{% + \\\babel@save\<labelenum\romannumeral\bbl@tempa>% + \def\<labelenum\romannumeral\bbl@tempa>{\the\toks@}}% + \\\bbl@toglobal\<extras\languagename>}% + \fi + \fi} +\def\bbl@chaptype{chapter} +\ifx\@makechapterhead\@undefined + \let\bbl@patchchapter\relax +\else\ifx\thechapter\@undefined + \let\bbl@patchchapter\relax +\else\ifx\ps@headings\@undefined + \let\bbl@patchchapter\relax +\else + \def\bbl@patchchapter{% + \global\let\bbl@patchchapter\relax + \gdef\bbl@chfmt{% + \bbl@ifunset{bbl@\bbl@chaptype fmt@\languagename}% + {\@chapapp\space\thechapter} + {\@nameuse{bbl@\bbl@chaptype fmt@\languagename}}} + \bbl@add\appendix{\def\bbl@chaptype{appendix}}% Not harmful, I hope + \bbl@sreplace\ps@headings{\@chapapp\ \thechapter}{\bbl@chfmt}% + \bbl@sreplace\chaptermark{\@chapapp\ \thechapter}{\bbl@chfmt}% + \bbl@sreplace\@makechapterhead{\@chapapp\space\thechapter}{\bbl@chfmt}% + \bbl@toglobal\appendix + \bbl@toglobal\ps@headings + \bbl@toglobal\chaptermark + \bbl@toglobal\@makechapterhead} + \let\bbl@patchappendix\bbl@patchchapter +\fi\fi\fi +\ifx\@part\@undefined + \let\bbl@patchpart\relax +\else + \def\bbl@patchpart{% + \global\let\bbl@patchpart\relax + \gdef\bbl@partformat{% + \bbl@ifunset{bbl@partfmt@\languagename}% + {\partname\nobreakspace\thepart} + {\@nameuse{bbl@partfmt@\languagename}}} + \bbl@sreplace\@part{\partname\nobreakspace\thepart}{\bbl@partformat}% + \bbl@toglobal\@part} +\fi +\let\bbl@calendar\@empty +\DeclareRobustCommand\localedate[1][]{\bbl@localedate{#1}} +\def\bbl@localedate#1#2#3#4{% + \begingroup + \ifx\@empty#1\@empty\else + \let\bbl@ld@calendar\@empty + \let\bbl@ld@variant\@empty + \edef\bbl@tempa{\zap@space#1 \@empty}% + \def\bbl@tempb##1=##2\@@{\@namedef{bbl@ld@##1}{##2}}% + \bbl@foreach\bbl@tempa{\bbl@tempb##1\@@}% + \edef\bbl@calendar{% + \bbl@ld@calendar + \ifx\bbl@ld@variant\@empty\else + .\bbl@ld@variant + \fi}% + \bbl@replace\bbl@calendar{gregorian}{}% + \fi + \bbl@cased + {\@nameuse{bbl@date@\languagename @\bbl@calendar}{#2}{#3}{#4}}% + \endgroup} +\def\bbl@inidate#1.#2.#3.#4\relax#5#6{% TODO - ignore with 'captions' + \bbl@trim@def\bbl@tempa{#1.#2}% + \bbl@ifsamestring{\bbl@tempa}{months.wide}% to savedate + {\bbl@trim@def\bbl@tempa{#3}% + \bbl@trim\toks@{#5}% + \@temptokena\expandafter{\bbl@savedate}% + \bbl@exp{% Reverse order - in ini last wins + \def\\\bbl@savedate{% + \\\SetString\<month\romannumeral\bbl@tempa#6name>{\the\toks@}% + \the\@temptokena}}}% + {\bbl@ifsamestring{\bbl@tempa}{date.long}% defined now + {\lowercase{\def\bbl@tempb{#6}}% + \bbl@trim@def\bbl@toreplace{#5}% + \bbl@TG@@date + \bbl@ifunset{bbl@date@\languagename @}% + {\bbl@exp{% TODO. Move to a better place. + \gdef\<\languagename date>{\\\protect\<\languagename date >}% + \gdef\<\languagename date >####1####2####3{% + \\\bbl@usedategrouptrue + \<bbl@ensure@\languagename>{% + \\\localedate{####1}{####2}{####3}}}% + \\\bbl@add\\\bbl@savetoday{% + \\\SetString\\\today{% + \<\languagename date>% + {\\\the\year}{\\\the\month}{\\\the\day}}}}}% + {}% + \global\bbl@csarg\let{date@\languagename @}\bbl@toreplace + \ifx\bbl@tempb\@empty\else + \global\bbl@csarg\let{date@\languagename @\bbl@tempb}\bbl@toreplace + \fi}% + {}}} +\let\bbl@calendar\@empty +\newcommand\BabelDateSpace{\nobreakspace} +\newcommand\BabelDateDot{.\@} % TODO. \let instead of repeating +\newcommand\BabelDated[1]{{\number#1}} +\newcommand\BabelDatedd[1]{{\ifnum#1<10 0\fi\number#1}} +\newcommand\BabelDateM[1]{{\number#1}} +\newcommand\BabelDateMM[1]{{\ifnum#1<10 0\fi\number#1}} +\newcommand\BabelDateMMMM[1]{{% + \csname month\romannumeral#1\bbl@calendar name\endcsname}}% +\newcommand\BabelDatey[1]{{\number#1}}% +\newcommand\BabelDateyy[1]{{% + \ifnum#1<10 0\number#1 % + \else\ifnum#1<100 \number#1 % + \else\ifnum#1<1000 \expandafter\@gobble\number#1 % + \else\ifnum#1<10000 \expandafter\@gobbletwo\number#1 % + \else + \bbl@error + {Currently two-digit years are restricted to the\\ + range 0-9999.}% + {There is little you can do. Sorry.}% + \fi\fi\fi\fi}} +\newcommand\BabelDateyyyy[1]{{\number#1}} % TODO - add leading 0 +\def\bbl@replace@finish@iii#1{% + \bbl@exp{\def\\#1####1####2####3{\the\toks@}}} +\def\bbl@TG@@date{% + \bbl@replace\bbl@toreplace{[ ]}{\BabelDateSpace{}}% + \bbl@replace\bbl@toreplace{[.]}{\BabelDateDot{}}% + \bbl@replace\bbl@toreplace{[d]}{\BabelDated{####3}}% + \bbl@replace\bbl@toreplace{[dd]}{\BabelDatedd{####3}}% + \bbl@replace\bbl@toreplace{[M]}{\BabelDateM{####2}}% + \bbl@replace\bbl@toreplace{[MM]}{\BabelDateMM{####2}}% + \bbl@replace\bbl@toreplace{[MMMM]}{\BabelDateMMMM{####2}}% + \bbl@replace\bbl@toreplace{[y]}{\BabelDatey{####1}}% + \bbl@replace\bbl@toreplace{[yy]}{\BabelDateyy{####1}}% + \bbl@replace\bbl@toreplace{[yyyy]}{\BabelDateyyyy{####1}}% + \bbl@replace\bbl@toreplace{[y|}{\bbl@datecntr[####1|}% + \bbl@replace\bbl@toreplace{[m|}{\bbl@datecntr[####2|}% + \bbl@replace\bbl@toreplace{[d|}{\bbl@datecntr[####3|}% + \bbl@replace@finish@iii\bbl@toreplace} +\def\bbl@datecntr{\expandafter\bbl@xdatecntr\expandafter} +\def\bbl@xdatecntr[#1|#2]{\localenumeral{#2}{#1}} +\let\bbl@release@transforms\@empty +\@namedef{bbl@inikv@transforms.prehyphenation}{% + \bbl@transforms\babelprehyphenation} +\@namedef{bbl@inikv@transforms.posthyphenation}{% + \bbl@transforms\babelposthyphenation} +\def\bbl@transforms@aux#1#2#3,#4\relax{#1{#2}{#3}{#4}} +\begingroup % A hack. TODO. Don't require an specific order + \catcode`\%=12 + \catcode`\&=14 + \gdef\bbl@transforms#1#2#3{&% + \ifx\bbl@KVP@transforms\@nil\else + \directlua{ + str = [==[#2]==] + str = str:gsub('%.%d+%.%d+$', '') + tex.print([[\def\string\babeltempa{]] .. str .. [[}]]) + }&% + \bbl@xin@{,\babeltempa,}{,\bbl@KVP@transforms,}&% + \ifin@ + \in@{.0$}{#2$}&% + \ifin@ + \g@addto@macro\bbl@release@transforms{&% + \relax\bbl@transforms@aux#1{\languagename}{#3}}&% + \else + \g@addto@macro\bbl@release@transforms{, {#3}}&% + \fi + \fi + \fi} +\endgroup +\def\bbl@provide@lsys#1{% + \bbl@ifunset{bbl@lname@#1}% + {\bbl@load@info{#1}}% + {}% + \bbl@csarg\let{lsys@#1}\@empty + \bbl@ifunset{bbl@sname@#1}{\bbl@csarg\gdef{sname@#1}{Default}}{}% + \bbl@ifunset{bbl@sotf@#1}{\bbl@csarg\gdef{sotf@#1}{DFLT}}{}% + \bbl@csarg\bbl@add@list{lsys@#1}{Script=\bbl@cs{sname@#1}}% + \bbl@ifunset{bbl@lname@#1}{}% + {\bbl@csarg\bbl@add@list{lsys@#1}{Language=\bbl@cs{lname@#1}}}% + \ifcase\bbl@engine\or\or + \bbl@ifunset{bbl@prehc@#1}{}% + {\bbl@exp{\\\bbl@ifblank{\bbl@cs{prehc@#1}}}% + {}% + {\ifx\bbl@xenohyph\@undefined + \let\bbl@xenohyph\bbl@xenohyph@d + \ifx\AtBeginDocument\@notprerr + \expandafter\@secondoftwo % to execute right now + \fi + \AtBeginDocument{% + \bbl@patchfont{\bbl@xenohyph}% + \expandafter\selectlanguage\expandafter{\languagename}}% + \fi}}% + \fi + \bbl@csarg\bbl@toglobal{lsys@#1}} +\def\bbl@xenohyph@d{% + \bbl@ifset{bbl@prehc@\languagename}% + {\ifnum\hyphenchar\font=\defaulthyphenchar + \iffontchar\font\bbl@cl{prehc}\relax + \hyphenchar\font\bbl@cl{prehc}\relax + \else\iffontchar\font"200B + \hyphenchar\font"200B + \else + \bbl@warning + {Neither 0 nor ZERO WIDTH SPACE are available\\% + in the current font, and therefore the hyphen\\% + will be printed. Try changing the fontspec's\\% + 'HyphenChar' to another value, but be aware\\% + this setting is not safe (see the manual)}% + \hyphenchar\font\defaulthyphenchar + \fi\fi + \fi}% + {\hyphenchar\font\defaulthyphenchar}} + % \fi} +\def\bbl@load@info#1{% + \def\BabelBeforeIni##1##2{% + \begingroup + \bbl@read@ini{##1}0% + \endinput % babel- .tex may contain onlypreamble's + \endgroup}% boxed, to avoid extra spaces: + {\bbl@input@texini{#1}}} +\def\bbl@setdigits#1#2#3#4#5{% + \bbl@exp{% + \def\<\languagename digits>####1{% ie, \langdigits + \<bbl@digits@\languagename>####1\\\@nil}% + \let\<bbl@cntr@digits@\languagename>\<\languagename digits>% + \def\<\languagename counter>####1{% ie, \langcounter + \\\expandafter\<bbl@counter@\languagename>% + \\\csname c@####1\endcsname}% + \def\<bbl@counter@\languagename>####1{% ie, \bbl@counter@lang + \\\expandafter\<bbl@digits@\languagename>% + \\\number####1\\\@nil}}% + \def\bbl@tempa##1##2##3##4##5{% + \bbl@exp{% Wow, quite a lot of hashes! :-( + \def\<bbl@digits@\languagename>########1{% + \\\ifx########1\\\@nil % ie, \bbl@digits@lang + \\\else + \\\ifx0########1#1% + \\\else\\\ifx1########1#2% + \\\else\\\ifx2########1#3% + \\\else\\\ifx3########1#4% + \\\else\\\ifx4########1#5% + \\\else\\\ifx5########1##1% + \\\else\\\ifx6########1##2% + \\\else\\\ifx7########1##3% + \\\else\\\ifx8########1##4% + \\\else\\\ifx9########1##5% + \\\else########1% + \\\fi\\\fi\\\fi\\\fi\\\fi\\\fi\\\fi\\\fi\\\fi\\\fi + \\\expandafter\<bbl@digits@\languagename>% + \\\fi}}}% + \bbl@tempa} +\def\bbl@buildifcase#1 {% Returns \bbl@tempa, requires \toks@={} + \ifx\\#1% % \\ before, in case #1 is multiletter + \bbl@exp{% + \def\\\bbl@tempa####1{% + \<ifcase>####1\space\the\toks@\<else>\\\@ctrerr\<fi>}}% + \else + \toks@\expandafter{\the\toks@\or #1}% + \expandafter\bbl@buildifcase + \fi} +\newcommand\localenumeral[2]{\bbl@cs{cntr@#1@\languagename}{#2}} +\def\bbl@localecntr#1#2{\localenumeral{#2}{#1}} +\newcommand\localecounter[2]{% + \expandafter\bbl@localecntr + \expandafter{\number\csname c@#2\endcsname}{#1}} +\def\bbl@alphnumeral#1#2{% + \expandafter\bbl@alphnumeral@i\number#2 76543210\@@{#1}} +\def\bbl@alphnumeral@i#1#2#3#4#5#6#7#8\@@#9{% + \ifcase\@car#8\@nil\or % Currenty <10000, but prepared for bigger + \bbl@alphnumeral@ii{#9}000000#1\or + \bbl@alphnumeral@ii{#9}00000#1#2\or + \bbl@alphnumeral@ii{#9}0000#1#2#3\or + \bbl@alphnumeral@ii{#9}000#1#2#3#4\else + \bbl@alphnum@invalid{>9999}% + \fi} +\def\bbl@alphnumeral@ii#1#2#3#4#5#6#7#8{% + \bbl@ifunset{bbl@cntr@#1.F.\number#5#6#7#8@\languagename}% + {\bbl@cs{cntr@#1.4@\languagename}#5% + \bbl@cs{cntr@#1.3@\languagename}#6% + \bbl@cs{cntr@#1.2@\languagename}#7% + \bbl@cs{cntr@#1.1@\languagename}#8% + \ifnum#6#7#8>\z@ % TODO. An ad hoc rule for Greek. Ugly. + \bbl@ifunset{bbl@cntr@#1.S.321@\languagename}{}% + {\bbl@cs{cntr@#1.S.321@\languagename}}% + \fi}% + {\bbl@cs{cntr@#1.F.\number#5#6#7#8@\languagename}}} +\def\bbl@alphnum@invalid#1{% + \bbl@error{Alphabetic numeral too large (#1)}% + {Currently this is the limit.}} +\newcommand\localeinfo[1]{% + \bbl@ifunset{bbl@\csname bbl@info@#1\endcsname @\languagename}% + {\bbl@error{I've found no info for the current locale.\\% + The corresponding ini file has not been loaded\\% + Perhaps it doesn't exist}% + {See the manual for details.}}% + {\bbl@cs{\csname bbl@info@#1\endcsname @\languagename}}} +\@namedef{bbl@info@tag.ini}{lini} +\@namedef{bbl@info@name.english}{elname} +\@namedef{bbl@info@name.opentype}{lname} +\@namedef{bbl@info@tag.bcp47}{tbcp} +\@namedef{bbl@info@language.tag.bcp47}{lbcp} +\@namedef{bbl@info@tag.opentype}{lotf} +\@namedef{bbl@info@script.name}{esname} +\@namedef{bbl@info@script.name.opentype}{sname} +\@namedef{bbl@info@script.tag.bcp47}{sbcp} +\@namedef{bbl@info@script.tag.opentype}{sotf} +\let\bbl@ensureinfo\@gobble +\newcommand\BabelEnsureInfo{% + \ifx\InputIfFileExists\@undefined\else + \def\bbl@ensureinfo##1{% + \bbl@ifunset{bbl@lname@##1}{\bbl@load@info{##1}}{}}% + \fi + \bbl@foreach\bbl@loaded{{% + \def\languagename{##1}% + \bbl@ensureinfo{##1}}}} +\newcommand\getlocaleproperty{% + \@ifstar\bbl@getproperty@s\bbl@getproperty@x} +\def\bbl@getproperty@s#1#2#3{% + \let#1\relax + \def\bbl@elt##1##2##3{% + \bbl@ifsamestring{##1/##2}{#3}% + {\providecommand#1{##3}% + \def\bbl@elt####1####2####3{}}% + {}}% + \bbl@cs{inidata@#2}}% +\def\bbl@getproperty@x#1#2#3{% + \bbl@getproperty@s{#1}{#2}{#3}% + \ifx#1\relax + \bbl@error + {Unknown key for locale '#2':\\% + #3\\% + \string#1 will be set to \relax}% + {Perhaps you misspelled it.}% + \fi} +\let\bbl@ini@loaded\@empty +\newcommand\LocaleForEach{\bbl@foreach\bbl@ini@loaded} +\newcommand\babeladjust[1]{% TODO. Error handling. + \bbl@forkv{#1}{% + \bbl@ifunset{bbl@ADJ@##1@##2}% + {\bbl@cs{ADJ@##1}{##2}}% + {\bbl@cs{ADJ@##1@##2}}}} +\def\bbl@adjust@lua#1#2{% + \ifvmode + \ifnum\currentgrouplevel=\z@ + \directlua{ Babel.#2 }% + \expandafter\expandafter\expandafter\@gobble + \fi + \fi + {\bbl@error % The error is gobbled if everything went ok. + {Currently, #1 related features can be adjusted only\\% + in the main vertical list.}% + {Maybe things change in the future, but this is what it is.}}} +\@namedef{bbl@ADJ@bidi.mirroring@on}{% + \bbl@adjust@lua{bidi}{mirroring_enabled=true}} +\@namedef{bbl@ADJ@bidi.mirroring@off}{% + \bbl@adjust@lua{bidi}{mirroring_enabled=false}} +\@namedef{bbl@ADJ@bidi.text@on}{% + \bbl@adjust@lua{bidi}{bidi_enabled=true}} +\@namedef{bbl@ADJ@bidi.text@off}{% + \bbl@adjust@lua{bidi}{bidi_enabled=false}} +\@namedef{bbl@ADJ@bidi.mapdigits@on}{% + \bbl@adjust@lua{bidi}{digits_mapped=true}} +\@namedef{bbl@ADJ@bidi.mapdigits@off}{% + \bbl@adjust@lua{bidi}{digits_mapped=false}} +\@namedef{bbl@ADJ@linebreak.sea@on}{% + \bbl@adjust@lua{linebreak}{sea_enabled=true}} +\@namedef{bbl@ADJ@linebreak.sea@off}{% + \bbl@adjust@lua{linebreak}{sea_enabled=false}} +\@namedef{bbl@ADJ@linebreak.cjk@on}{% + \bbl@adjust@lua{linebreak}{cjk_enabled=true}} +\@namedef{bbl@ADJ@linebreak.cjk@off}{% + \bbl@adjust@lua{linebreak}{cjk_enabled=false}} +\@namedef{bbl@ADJ@justify.arabic@on}{% + \bbl@adjust@lua{linebreak}{arabic.justify_enabled=true}} +\@namedef{bbl@ADJ@justify.arabic@off}{% + \bbl@adjust@lua{linebreak}{arabic.justify_enabled=false}} +\def\bbl@adjust@layout#1{% + \ifvmode + #1% + \expandafter\@gobble + \fi + {\bbl@error % The error is gobbled if everything went ok. + {Currently, layout related features can be adjusted only\\% + in vertical mode.}% + {Maybe things change in the future, but this is what it is.}}} +\@namedef{bbl@ADJ@layout.tabular@on}{% + \bbl@adjust@layout{\let\@tabular\bbl@NL@@tabular}} +\@namedef{bbl@ADJ@layout.tabular@off}{% + \bbl@adjust@layout{\let\@tabular\bbl@OL@@tabular}} +\@namedef{bbl@ADJ@layout.lists@on}{% + \bbl@adjust@layout{\let\list\bbl@NL@list}} +\@namedef{bbl@ADJ@layout.lists@off}{% + \bbl@adjust@layout{\let\list\bbl@OL@list}} +\@namedef{bbl@ADJ@hyphenation.extra@on}{% + \bbl@activateposthyphen} +\@namedef{bbl@ADJ@autoload.bcp47@on}{% + \bbl@bcpallowedtrue} +\@namedef{bbl@ADJ@autoload.bcp47@off}{% + \bbl@bcpallowedfalse} +\@namedef{bbl@ADJ@autoload.bcp47.prefix}#1{% + \def\bbl@bcp@prefix{#1}} +\def\bbl@bcp@prefix{bcp47-} +\@namedef{bbl@ADJ@autoload.options}#1{% + \def\bbl@autoload@options{#1}} +\let\bbl@autoload@bcpoptions\@empty +\@namedef{bbl@ADJ@autoload.bcp47.options}#1{% + \def\bbl@autoload@bcpoptions{#1}} +\newif\ifbbl@bcptoname +\@namedef{bbl@ADJ@bcp47.toname@on}{% + \bbl@bcptonametrue + \BabelEnsureInfo} +\@namedef{bbl@ADJ@bcp47.toname@off}{% + \bbl@bcptonamefalse} +\@namedef{bbl@ADJ@prehyphenation.disable@nohyphenation}{% + \directlua{ Babel.ignore_pre_char = function(node) + return (node.lang == \the\csname l@nohyphenation\endcsname) + end }} +\@namedef{bbl@ADJ@prehyphenation.disable@off}{% + \directlua{ Babel.ignore_pre_char = function(node) + return false + end }} +\@namedef{bbl@ADJ@select.write@shift}{% + \let\bbl@restorelastskip\relax + \def\bbl@savelastskip{% + \let\bbl@restorelastskip\relax + \ifvmode + \ifdim\lastskip=\z@ + \let\bbl@restorelastskip\nobreak + \else + \bbl@exp{% + \def\\\bbl@restorelastskip{% + \skip@=\the\lastskip + \\\nobreak \vskip-\skip@ \vskip\skip@}}% + \fi + \fi}} +\@namedef{bbl@ADJ@select.write@keep}{% + \let\bbl@restorelastskip\relax + \let\bbl@savelastskip\relax} +\@namedef{bbl@ADJ@select.write@omit}{% + \let\bbl@restorelastskip\relax + \def\bbl@savelastskip##1\bbl@restorelastskip{}} +\ifx\directlua\@undefined\else + \ifx\bbl@luapatterns\@undefined + \input luababel.def + \fi +\fi \bbl@trace{Cross referencing macros} \ifx\bbl@opt@safe\@empty\else \def\@newl@bel#1#2#3{% @@ -646,8 +3862,6 @@ \def\@currname{hhline}\input{hhline.sty}\makeatother \fi}% {}}} -\DeclareRobustCommand{\FOREIGNLANGUAGE}[1]{% - \lowercase{\foreignlanguage{#1}}} \def\substitutefontfamily#1#2#3{% \lowercase{\immediate\openout15=#1#2.fd\relax}% \immediate\write15{% @@ -960,78 +4174,55 @@ Local config file '\bbl@opt@config.cfg' not found}{% Perhaps you misspelled it.}}% \fi -\let\bbl@tempc\relax -\bbl@foreach\bbl@language@opts{% - \ifcase\bbl@iniflag % Default - \bbl@ifunset{ds@#1}% - {\DeclareOption{#1}{\bbl@load@language{#1}}}% - {}% - \or % provide=* - \@gobble % case 2 same as 1 - \or % provide+=* - \bbl@ifunset{ds@#1}% - {\IfFileExists{#1.ldf}{}% - {\IfFileExists{babel-#1.tex}{}{\@namedef{ds@#1}{}}}}% - {}% - \bbl@ifunset{ds@#1}% - {\def\bbl@tempc{#1}% - \DeclareOption{#1}{% - \ifnum\bbl@iniflag>\@ne - \bbl@ldfinit - \babelprovide[import]{#1}% - \bbl@afterldf{}% - \else - \bbl@load@language{#1}% - \fi}}% - {}% - \or % provide*=* - \def\bbl@tempc{#1}% - \bbl@ifunset{ds@#1}% - {\DeclareOption{#1}{% - \bbl@ldfinit - \babelprovide[import]{#1}% - \bbl@afterldf{}}}% - {}% - \fi} -\let\bbl@tempb\@nnil +\let\bbl@elt\relax +\let\bbl@tempe\@empty \bbl@foreach\@classoptionslist{% - \bbl@ifunset{ds@#1}% - {\IfFileExists{#1.ldf}% - {\def\bbl@tempb{#1}% - \DeclareOption{#1}{% - \ifnum\bbl@iniflag>\@ne - \bbl@ldfinit - \babelprovide[import]{#1}% - \bbl@afterldf{}% - \else - \bbl@load@language{#1}% - \fi}}% - {\IfFileExists{babel-#1.tex}% TODO. Copypaste pattern - {\def\bbl@tempb{#1}% - \DeclareOption{#1}{% - \ifnum\bbl@iniflag>\@ne - \bbl@ldfinit - \babelprovide[import]{#1}% - \bbl@afterldf{}% - \else - \bbl@load@language{#1}% - \fi}}% - {}}}% - {}} -\ifnum\bbl@iniflag=\z@\else - \ifx\bbl@opt@main\@nnil - \ifx\bbl@tempc\relax - \let\bbl@opt@main\bbl@tempb + \bbl@xin@{,#1,$}{\bbl@language@opts$}% Match last + \ifin@\else + \bbl@xin@{,#1,}{\bbl@language@opts}% Match non-last + \ifin@ + \bbl@replace\bbl@language@opts{,#1,}{,,}% + \edef\bbl@tempe{\bbl@tempe\bbl@elt{3}{#1}}% \else - \let\bbl@opt@main\bbl@tempc + \babel@savecnt\z@ % Use as temp + \ifnum\bbl@iniflag<\thr@@ % Optimization: 3 = always ini + \IfFileExists{#1.ldf}{\advance\babel@savecnt\@ne}{}% + \fi + \ifnum\bbl@iniflag>\z@ % Optimization: 0 = always ldf + \IfFileExists{babel-#1.tex}{\advance\babel@savecnt\tw@}{}% + \fi + \ifnum\babel@savecnt>\z@ + \edef\bbl@tempe{\bbl@tempe\bbl@elt{\the\babel@savecnt}{#1}}% + \fi + \fi + \fi} +\let\bbl@savemain\@empty +\bbl@foreach\bbl@language@opts{% + \edef\bbl@tempe{\bbl@tempe\bbl@elt{3}{#1}}} +\def\bbl@elt#1#2#3{% + \ifx#3\relax % if last + \bbl@ifunset{ds@#2}{}% + {\bbl@exp{\def\\\bbl@savemain{\\\DeclareOption{#2}{\[ds@#2]}}}}% + \bbl@add\bbl@savemain{\bbl@elt{#1}{#2}}% Save main + \DeclareOption{#2}{}% + \else + \ifnum\bbl@iniflag<\tw@ % other as ldf + \ifodd#1\relax % Class: if ldf exists 1,3. Package: always 3 + \bbl@ifunset{ds@#2}% + {\DeclareOption{#2}{\bbl@load@language{#2}}}% + {}% + \fi + \else % other as ini + \ifnum#1>\@ne % % Class: if ini exists 2,3. Package: always 3 + \DeclareOption{#2}{% + \bbl@ldfinit + \babelprovide[import]{#2}% + \bbl@afterldf{}}% + \fi \fi \fi -\fi -\ifx\bbl@opt@main\@nnil\else - \expandafter - \let\expandafter\bbl@loadmain\csname ds@\bbl@opt@main\endcsname - \expandafter\let\csname ds@\bbl@opt@main\endcsname\@empty -\fi + #3} +\bbl@tempe\relax % \relax catches last \def\AfterBabelLanguage#1{% \bbl@ifsamestring\CurrentOption{#1}{\global\bbl@add\bbl@afterlang}{}} \DeclareOption*{} @@ -1053,31 +4244,27 @@ and a package option. Use 'main=\bbl@tempc' as\\% option. Reported}% \fi -\else - \ifodd\bbl@iniflag % case 1,3 - \bbl@ldfinit - \let\CurrentOption\bbl@opt@main - \ifx\bbl@opt@provide\@nnil - \bbl@exp{\\\babelprovide[import,main]{\bbl@opt@main}}% - \else - \bbl@exp{\\\bbl@forkv{\@nameuse{@raw@opt@babel.sty}}}{% - \bbl@xin@{,provide,}{,#1,}% - \ifin@ - \def\bbl@opt@provide{#2}% - \bbl@replace\bbl@opt@provide{;}{,}% - \fi}% - \bbl@exp{% - \\\babelprovide[\bbl@opt@provide,import,main]{\bbl@opt@main}}% - \fi - \bbl@afterldf{}% - \else % case 0,2 - \chardef\bbl@iniflag\z@ % Force ldf - \expandafter\let\csname ds@\bbl@opt@main\endcsname\bbl@loadmain - \ExecuteOptions{\bbl@opt@main} - \DeclareOption*{}% - \ProcessOptions* - \fi \fi +\def\bbl@elt#1#2{% main + \ifodd\bbl@iniflag % as ini = 1(=), 3(*=) + \ifnum#1>\@ne % % Class: if ini exists 2,3. Package: always 3 + \def\CurrentOption{#2}% Directly, because luatexbase + \bbl@ldfinit + \babelprovide[\bbl@opt@provide,main,import]{#2}% + \bbl@afterldf{}% + \DeclareOption{#2}{}% + \fi + \else % as ldf = 0(no), 2(+=) + \ifodd#1\relax % Class: if ldf exists 1,3. Package: always 3 + \bbl@ifunset{ds@#2}% + {\DeclareOption{#2}{\bbl@load@language{#2}}}% + {}% + \ExecuteOptions{#2}% + \fi + \fi} +\bbl@savemain +\DeclareOption*{}% +\ProcessOptions* \def\AfterBabelLanguage{% \bbl@error {Too late for \string\AfterBabelLanguage}% |