diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/babel/babel20180419.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/babel/babel20180419.dtx | 18830 |
1 files changed, 18830 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/babel/babel20180419.dtx b/Master/texmf-dist/source/latex/babel/babel20180419.dtx new file mode 100644 index 00000000000..aec1595cc0c --- /dev/null +++ b/Master/texmf-dist/source/latex/babel/babel20180419.dtx @@ -0,0 +1,18830 @@ +% \iffalse +% This document requires lualatex +%% +%% Copyright (C) 2012-2018 Javier Bezos and Johannes L. Braams. +%% Copyright (C) 1989-2012 Johannes L. Braams and +%% any individual authors listed elsewhere in this file. +%% All rights reserved. +%% +%% This file is part of the Babel system. +%% -------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2003/12/01 or later. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% The Current Maintainer of this work is Javier Bezos. +%% +%% The list of derived (unpacked) files belonging to the distribution +%% and covered by LPPL is defined by the unpacking scripts (with +%% extension |.ins|) which are part of the distribution. +%% +% \fi +% +% \CheckSum{5011} +% +% \iffalse +%<*filedriver> +\ProvidesFile{babel.dtx}[2018/04/25 v3.19 The Babel package] +\documentclass{ltxdoc} +\GetFileInfo{babel.dtx} +\usepackage{fontspec} +\setmainfont[Scale=.88]{Noto Serif} +\setsansfont[Scale=.88]{Noto Sans} +\setmonofont[Scale=.88,FakeStretch=.95]{Noto Mono} +\raggedright +\addtolength{\textwidth}{25pt} +\addtolength{\textheight}{3.5cm} +\addtolength{\topmargin}{-2cm} +\font\manual=logo10 % font used for the METAFONT logo, etc. +\newcommand*\MF{{\manual META}\-{\manual FONT}} +\newcommand*\babel{\textsf{babel}} +\newcommand*\Babel{\textsf{Babel}} +\newcommand*\xetex{\textsf{xetex}} +\newcommand*\pdftex{\textsf{pdftex}} +\newcommand*\luatex{\textsf{luatex}} +\newcommand*\nb[1]{} +\newcommand*\m[1]{\mbox{$\langle$\normalfont\itshape#1\/$\rangle$}} +\newcommand*\langlist{% + \meta{language}\texttt{,}\meta{language}\texttt{,}...} +\newcommand*\langvar{\m{lang}} +\newcommand*\Lopt[1]{\textsf{#1}} +\newcommand*\Lenv[1]{\texttt{#1}} +\newcommand*\menv[1]{\char`\{#1\char`\}} +\newcommand*\Eenv[1]{% + \quad\ldots\quad + \texttt{\color{thered}\string\end\menv{#1}}} +\newcommand*\file[1]{\texttt{#1}} +\newcommand*\cls[1]{\texttt{#1}} +\newcommand*\pkg[1]{\texttt{#1}} +\addtolength{\oddsidemargin}{1em} +\setlength{\leftmargini}{1.5em} +\usepackage{framed} +\usepackage{multicol} +\usepackage{color,colortbl} +\usepackage[linkbordercolor={.9 .7 .5}]{hyperref} +\newcommand\New[1]{% + \colorbox[rgb]{.92, .86, .73}{New #1}\enspace\ignorespaces} +\definecolor{thered} {rgb}{0.65,0.04,0.07} +\definecolor{thegrey} {gray}{0.8} +\definecolor{shadecolor}{rgb}{1,1,0.97} +\definecolor{messages}{rgb}{.66,.13,.27} +\makeatletter +\def\@begintheorem#1#2{% + \list{}{}% + \global\advance\@listdepth\m@ne + \item[{\sffamily\bfseries\color{messages}\hspace*{1.3em}% + \MakeUppercase{#1}}]}% +\makeatother +\newtheorem{warning}{Warning} +\newtheorem{note}{Note} +\newtheorem{example}{Example} +\newtheorem{troubleshooting}{Troubleshooting} +\let\bblxv\verbatim +\let\bblexv\endverbatim +\def\verbatim{\begin{shaded*}\bblxv\vskip-\baselineskip\vskip2.5\parsep} +\def\endverbatim{\bblexv\vskip-2\baselineskip\end{shaded*}} +\catcode`\_=\active +\def_{\bgroup\let_\egroup\color{thered}} +\def\MacroFont{\fontencoding \encodingdefault \fontfamily\ttdefault + \fontseries\mddefault \fontshape\updefault \small \catcode`\_=\active} +\definecolor{shadecolor}{rgb}{0.96,0.96,0.93} +\def\PrintDescribeMacro#1{% + \strut\MacroFont\color{thered}\normalsize\string#1} +\def\Describe#1{% + \par\penalty-500\vskip3ex\noindent + \DescribeMacro{#1}\args} +\def\DescribeOther{\vskip-4ex\Describe} +\makeatletter +\def\trouble#1{\addcontentsline{tsh}{trouble}{#1}} +\def\listoftroubles{\section*{Troubleshoooting}\@starttoc{tsh}} +\let\l@trouble\l@figure +\let\saved@check@percent\check@percent +\let\check@percent\relax +\def\args#1{% + \def\bbl@tempa{#1}% + \ifx\bbl@tempa\@empty\else#1\vskip1ex\fi\ignorespaces} +\begingroup % Changes to ltxdoc + \catcode`\<\active + \catcode`\>\active + \gdef\check@plus@etc{% + \let\bbl@next\pm@module + \ifx*\next + \let\bbl@next\star@module + \else\ifx/\next + \let\bbl@next\slash@module + \else\ifx<\next + \let\bbl@next\var@module + \fi\fi\fi + \bbl@next} + \gdef\var@module#1#2#3>>{% + $\langle$\pm@module#2#3>$\rangle$% + \ifx*#2\ $\equiv$\fi} +\endgroup +\renewcommand*\l@section[2]{% + \ifnum \c@tocdepth >\z@ + \addpenalty\@secpenalty + \addvspace{1.0em \@plus\p@}% + \setlength\@tempdima{2em}% + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + \leavevmode \bfseries + \advance\leftskip\@tempdima + \hskip -\leftskip + #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par + \endgroup + \fi} +\renewcommand*\l@subsection{\@dottedtocline{2}{2em}{3em}} +\renewcommand*\l@subsubsection{\@dottedtocline{3}{5em}{4em}} +\renewcommand*\l@paragraph{\@dottedtocline{4}{9em}{4.5em}} +\renewcommand\partname{Part} +\def\@pnumwidth{3em} +\makeatother +\begin{document} +\title{Babel, a multilingual package for use with \LaTeX's standard + document classes\thanks{During the development ideas from Nico + Poppelier, Piet van Oostrum and many others have been used. + Bernd Raichle has provided many helpful suggestions.}} +\author{Johannes Braams\\ + Kersengaarde 33\\ + 2723 BP Zoetermeer\\ + The Netherlands\\ + \normalsize From version 3.9 on, Javier Bezos\\ + \normalsize \texttt{www.texnia.com}} + +\date{Typeset \today} +\begin{titlepage} +\begin{minipage}[t][0pt]{30cm} +\vspace{-3cm}\hspace{-7cm} +\sffamily +\begin{tabular}{p{8cm}p{15cm}} +\cellcolor[rgb]{.86,.73,.67} +&\cellcolor[rgb]{.95,.95,.95} +\vspace{3.6cm}% +\color[rgb]{.55,.4,.35} +\leftskip5mm +\sffamily\fontsize{72}{72}\selectfont Babel +\vspace{1.8cm} +\\ +\cellcolor[rgb]{.95,.95,.95} +\vspace{2cm}\hspace{1.5cm} +\begin{minipage}{5cm} +\Large +Version \csname @gobble\expandafter\endcsname\fileversion\newline +\filedate + +\vspace{1cm} +\textit{Original author}\newline +Johannes L. Braams + +\vspace{.3cm} +\textit{Current maintainer}\newline +Javier Bezos +\end{minipage} +&\cellcolor[rgb]{.92, .86, .73} +\vspace{2cm} +\leftskip5mm +\begin{minipage}{10cm} +\large\setlength\parskip{3mm}\raggedright + The standard distribution of \LaTeX\ contains a number of document + classes that are meant to be used, but also serve as examples for + other users to create their own document classes. These document + classes have become very popular among \LaTeX\ users. But it should + be kept in mind that they were designed for American tastes and + typography. At one time they even contained a number of hard-wired + texts. + + This manual describes \babel{}, a package that makes use of the + capabilities of \TeX\ version 3 and, to some extent, \xetex{} and + \luatex, to provide an environment in which documents can be typeset + in a language other than US English, or in more than one language or + script. + + Current development is focused on Unicode engines (Xe\TeX{} and + Lua\TeX) and the so-called \textit{complex scripts}. New features + related to font selection, bidi writing and the like will be added + incrementally. + + \Babel{} provides support (total or partial) for about 200 + languages, either as a “classical” package option or as an + |ini| file. Furthermore, new languages can be created from scratch + easily. + + \vspace{20cm} +\end{minipage} +\end{tabular} +\end{minipage} +\end{titlepage} + +\tableofcontents +\listoftroubles +\clearpage + +\part{User guide} + +\begin{itemize} +\item This user guide focuses on \LaTeX. There are also some notes on + its use with Plain \TeX. + +\item Changes and new features with relation to version 3.8 are + highlighted with \New{X.XX}\hspace{-.5em}. The most recent features + could be still unstable. Please, report any issues you find. + +\item If you are interested in the \TeX{} multilingual support, please + join the \textsf{kadingira} list on + \texttt{http://tug.org/mailman/listinfo/kadingira}. You can follow + the development of \babel{} on + \texttt{https://github.com/latex3/latex2e/tree/master/required/babel} + (which provides some sample files, too). + +\item See section \ref{contribute} for contributing a language. +\end{itemize} + +\section{The user interface}\label{U-I} + +\subsection{Monolingual documents} + +In most cases, a single language is required, and then all you need in +\LaTeX{} is to load the package using its standand mechanism for this +purpose, namely, passing that language as an optional argument. In +addition, you may want to set the font and input encodings. + +\begin{example} + Here is a simple full example for “traditional” \TeX{} engines + (see below for \xetex{} and \luatex{}). The packages |fontenc| and + |inputenc| do not belong to \babel, but they are included in the + example because typically you will need them: +\begin{verbatim} +\documentclass{article} + +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} + +_\usepackage[french]{babel}_ + +\begin{document} + +Plus ça change, plus c'est la même chose! + +\end{document} +\end{verbatim} +\end{example} +\begin{troubleshooting} +\trouble{Paragraph ended before \textbackslash UTFviii@three@octets was complete} +A common source of trouble is a wrong setting of the input encoding. +Very often you will get the following somewhat cryptic error: +\begin{verbatim} +! Paragraph ended before \UTFviii@three@octets was complete. +\end{verbatim} +Make sure you set the encoding actually used by your editor. +\end{troubleshooting} + +Another approach is making the language (\Lopt{french} in the example) +a global option in order to let other packages detect and use it: +\begin{verbatim} +_\documentclass[french]{article}_ +\usepackage{babel} +\usepackage{varioref} +\end{verbatim} + +In this last example, the package \texttt{varioref} will also see +the option and will be able to use it. + +\begin{note} + Because of the way \babel{} has evolved, ``language'' can refer to + (1) a set of hyphenation patterns as preloaded into the format, (2) + a package option, (3) an |ldf| file, and (4) a name used in the + document to select a language or dialect. So, a package option + refers to a language in a generic way -- sometimes it is the actual + language name used to select it, sometimes it is a file name loading + a language with a different name, sometimes it is a file name + loading several languages. Please, read the documentation for + specific languages for further info. +\end{note} + +\begin{troubleshooting} + The following warning is about hyphenation patterns, which are + not under the direct control of \babel: +\trouble{No hyphenation patterns were preloaded for (babel) the + language `LANG' into the format} +\begin{verbatim} +Package babel Warning: No hyphenation patterns were preloaded for +(babel) the language `LANG' into the format. +(babel) Please, configure your TeX system to add them and +(babel) rebuild the format. Now I will use the patterns +(babel) preloaded for \language=0 instead on input line 57. +\end{verbatim} + The document will be typeset, but very likely the text will not be + correctly hyphenated. Some languages may be raising this warning + wrongly (because they are not hyphenated); it is a bug to be fixed + -- just ignore it. See the manual of your distribution (Mac\TeX, + Mik\TeX, \TeX Live, etc.) for further info about how to configure + it. +\end{troubleshooting} + +\subsection{Multilingual documents} + +In multilingual documents, just use several options. The last one is +considered the main language, activated by default. Sometimes, the +main language changes the document layout (eg, |spanish| and |french|). + +\begin{example} + In \LaTeX, the preamble of the document: +\begin{verbatim} +\documentclass{article} +\usepackage[dutch,english]{babel} +\end{verbatim} + would tell \LaTeX\ that the document would be written in two + languages, Dutch and English, and that English would be the first + language in use, and the main one. +\end{example} + +You can also set the main language explicitly: +\begin{verbatim} +\documentclass{article} +\usepackage[_main=english_,dutch]{babel} +\end{verbatim} + +\begin{warning} + Languages may be set as global and as package option at the same + time, but in such a case you should set explicitly the main language + with the package option |main|: +\begin{verbatim} +\documentclass[_italian_]{book} +\usepackage[ngerman,_main=italian_]{babel} +\end{verbatim} +\end{warning} + +\begin{warning} + In the preamble the main language has \textit{not} been selected, + except hyphenation patterns and the name assigned to |\languagename| + (in particular, shorthands, captions and date are not activated). If + you need to define boxes and the like in the preamble, you might + want to use some of the language selectors described below. +\end{warning} + +To switch the language there are two basic macros, decribed below in +detail: |\selectlanguage| is used for blocks of text, while +|\foreignlanguage| is for chunks of text inside paragraphs. + +\begin{example} +A full bilingual document follows. The main language is |french|, +which is activated when the document begins. +\begin{verbatim} +\documentclass{article} + +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} + +_\usepackage[english,french]{babel}_ + +\begin{document} + +Plus ça change, plus c'est la même chose! + +_\selectlanguage{english}_ + +And an English paragraph, with a short text in +_\foreignlanguage{french}{français}_. + +\end{document} +\end{verbatim} +\end{example} + +\subsection{Modifiers} + +\New{3.9c} The basic behavior of some languages can be modified when +loading \babel{} by means of \textit{modifiers}. They are set after +the language name, and are prefixed with a dot (only when the language +is set as package option -- neither global options nor the |main| key +accept them). An example is (spaces are not significant and they can +be added or removed):\footnote{No predefined ``axis'' for modifiers +are provided because languages and their scripts have quite different +needs.} +\begin{verbatim} +\usepackage[latin_.medieval_, spanish_.notilde.lcroman_, danish]{babel} +\end{verbatim} + +Attributes (described below) are considered modifiers, ie, you can +set an attribute by including it in the list of modifiers. However, +modifiers is a more general mechanism. + +\subsection{\textsf{xelatex} and \textsf{lualatex}} + +Many languages are compatible with \textsf{xetex} and \textsf{luatex}. +With them you can use \babel{} to localize the documents. + +The Latin script is covered by default in current \LaTeX{} (provided +the document encoding is UTF-8), because the font loader is preloaded +and the font is switched to |lmroman|. Other scripts require loading +\textsf{fontspec}. You may want to set the font attributes with +\textsf{fontspec}, too. + +\begin{example} + The following bilingual, single script document in UTF-8 encoding + just prints a couple of ‘captions’ and |\today| in Danish and + Vietnamese. No additional packages are required. +\begin{verbatim} +\documentclass{article} + +_\usepackage[vietnamese,danish]{babel}_ + +\begin{document} + +\prefacename{} -- \alsoname{} -- \today + +\selectlanguage{vietnamese} + +\prefacename{} -- \alsoname{} -- \today + +\end{document} +\end{verbatim} +\end{example} + +\begin{example} +Here is a simple monolingual document in Russian (text from the +Wikipedia). Note neither \textsf{fontenc} nor \textsf{inputenc} are +necessary, but the document should be encoded in UTF-8 and a +so-called Unicode font must be loaded (in this example |\babelfont| is +used, described below). + +\begin{verbatim} +\documentclass{article} + +_\usepackage[russian]{babel}_ + +\babelfont{rm}{DejaVu Serif} + +\begin{document} + +Россия, находящаяся на пересечении множества культур, а также +с учётом многонационального характера её населения, — отличается +высокой степенью этнокультурного многообразия и способностью к +межкультурному диалогу. + +\end{document} +\end{verbatim} +\end{example} + +\subsection{Troubleshooting} + +\begin{itemize} +\item Loading directly |sty| files in \LaTeX{} (ie, + |\usepackage|\marg{language}) is deprecated and you will get the + error:\footnote{In old versions the error read ``You have used an + old interface to call babel'', not very helpful.} +\trouble{You are loading directly a language style} +\begin{verbatim} +! Package babel Error: You are loading directly a language style. +(babel) This syntax is deprecated and you must use +(babel) \usepackage[language]{babel}. +\end{verbatim} + +\item Another typical error when using \babel{} is the + following:\footnote{In old versions the error read ``You haven't + loaded the language LANG yet''.} +\trouble{Unknown language `LANG'} +\begin{verbatim} +! Package babel Error: Unknown language `LANG'. Either you have misspelled +(babel) its name, it has not been installed, or you requested +(babel) it in a previous run. Fix its name, install it or just +(babel) rerun the file, respectively +\end{verbatim} + The most frequent reason is, by far, the latest (for example, you + included |spanish|, but you realized this language is not used after + all, and therefore you removed it from the option list). In most + cases, the error vanishes when the document is typeset again, but in + more severe ones you will need to remove the |aux| file. +\end{itemize} +\subsection{Plain} + +In Plain, load languages styles with |\input| and then use +|\begindocument| (the latter is defined by \babel): +\begin{verbatim} +\input estonian.sty +\begindocument +\end{verbatim} + +\begin{warning} + Not all languages provide a |sty| file and some of them are not + compatible with Plain.\footnote{Even in the \babel{} kernel there + were some macros not compatible with plain. Hopefully these issues + will be fixed soon.} +\end{warning} + +\subsection{Basic language selectors} + +This section describes the commands to be used in the document to +switch the language in multilingual documents. In most cases, only the +two basic macros |\selectlanguage| and |\foreignlanguage| are +necessary. The environments |otherlanguage|, |otherlanguage*| and +|hyphenrules| are auxiliary, and described in the next section. + +The main language is selected automatically when the |document| +environment begins. + +\Describe{\selectlanguage}{\marg{language}} +When a user wants to switch from one language to another he can +do so using the macro |\selectlanguage|. This macro takes the +language, defined previously by a language definition file, as +its argument. It calls several macros that should be defined in +the language definition files to activate the special definitions +for the language chosen: +\begin{verbatim} +\selectlanguage{german} +\end{verbatim} + +This command can be used as environment, too. + +\begin{note} + For ``historical reasons'', a macro name is converted to a language + name without the leading |\|; in other words, + |\selectlanguage{\german}| is equivalent to |\selectlanguage{german}|. + Using a macro instead of a ``real'' name is deprecated. +\end{note} + +\begin{warning} + If used inside braces there might be some non-local changes, as this + would be roughly equivalent to: +\begin{verbatim} +{\selectlanguage{<inner-language>} ...}\selectlanguage{<outer-language>} +\end{verbatim} + If you want a change which is really local, you must enclose this + code with an additional grouping level. +\end{warning} + +\Describe{\foreignlanguage}{\marg{language}\marg{text}} +The command |\foreignlanguage| takes two arguments; the second +argument is a phrase to be typeset according to the rules of the +language named in its first one. This command (1) only switches the +extra definitions and the hyphenation rules for the language, +\emph{not} the names and dates, (2) does not send information about +the language to auxiliary files (i.e., the surrounding language is +still in force), and (3) it works even if the language has not been +set as package option (but in such a case it only sets the hyphenation +patterns and a warning is shown). + +\subsection{Auxiliary language selectors} + +\Describe{\begin\menv{otherlanguage}}{\marg{language}\Eenv{otherlanguage}} + +The environment \Lenv{otherlanguage} does basically the same as +|\selectlanguage|, except the language change is (mostly) local to +the environment. + +Actually, there might be some non-local changes, as this environment +is roughly equivalent to: +\begin{verbatim} +\begingroup +\selectlanguage{<inner-language>} +... +\endgroup +\selectlanguage{<outer-language>} +\end{verbatim} +If you want a change which is really local, you must enclose this +environment with an additional grouping, like braces |{}|. + +Spaces after the environment are ignored. + +\Describe{\begin\menv{otherlanguage*}}% +{\marg{language}\Eenv{otherlanguage*}} + +Same as |\foreignlanguage| but as environment. Spaces after the +environment are \textit{not} ignored. + +This environment was originally intended for intermixing left-to-right +ypesetting with right-to-left typesetting in engines not supporting a +change in the writing direction inside a line. However, by default it +never complied with the documented behavior and it is just a version as +environment of |\foreignlanguage|. + +\Describe{\begin\menv{hyphenrules}}{\marg{language}\Eenv{hyphenrules}} + +The environment \Lenv{hyphenrules} can be used to select \emph{only} he +hyphenation rules to be used (it can be used as command, oo). This can +for instance be used to select `nohyphenation', provided that in +\file{language.dat} the `language' \textsf{nohyphenation} is defined by +loading \file{zerohyph.tex}. It deactivates language shorthands, too +(but not user shorthands). + +Except for these simple uses, |hyphenrules| is discouraged and +|otherlanguage*| (the starred version) is preferred, as the former does +not take into account possible changes in encodings of characters like, +say, |'| done by some languages (eg, \textsf{italian}, \textsf{french}, +\textsf{ukraineb}). To set hyphenation exceptions, use +|\babelhyphenation| (see below). + +\subsection{More on selection} + +\Describe{\babeltags}{\char`\{\m{tag1} \texttt{=} \m{language1}, \m{tag2} +\texttt{=} \m{language2}, \dots\char`\}} + +\New{3.9i} In multilingual documents with many language switches he +commands above can be cumbersome. With this tool shorter names can be +defined. It adds nothing really new -- it is just syntactical sugar. + +It defines |\text|\m{tag1}\marg{text} to be +|\foreignlanguage|\marg{language1}\marg{text}, and |\begin|\marg{tag1} +o be |\begin{otherlanguage*}|\marg{language1}, and so on. Note +|\|\m{tag1} is also allowed, but remember to set it locally inside a +group. +\begin{example} +With +\begin{verbatim} +\babeltags{de = german} +\end{verbatim} +you can write +\begin{verbatim} +text \textde{German text} text +\end{verbatim} +and +\begin{verbatim} +text +\begin{de} + German text +\end{de} +text +\end{verbatim} +\end{example} + +\begin{note} + Something like \verb|\babeltags{finnish = finnish}| is legitimate -- + it defines |\textfinnish| and |\finnish| (and, of course, + |\begin{finnish}|). +\end{note} + +\begin{note} + Actually, there may be another advantage in the ‘short’ syntax |\text|\m{tag}, + namely, it is not affected by |\MakeUppercase| (while + |\foreignlanguage| is). +\end{note} + +\Describe{\babelensure}{|[include=|\m{commands}|,exclude=|\m{commands}% + |,fontenc=|\m{encoding}|]|\marg{language}} + +\New{3.9i} Except in a few languages, like \textsf{russian}, +captions and dates are just strings, and do not switch the +language. That means you should set it explicitly if you want to use +them, or hyphenation (and in some cases the text itself) will be +wrong. For example: +\begin{verbatim} +\foreignlanguage{russian}{text \foreignlanguage{polish}{\seename} text} +\end{verbatim} + +Of course, \TeX{} can do it for you. To avoid switching the language +all the while, |\babelensure| redefines the captions for a given +language to wrap them with a selector: +\begin{verbatim} +\babelensure{polish} +\end{verbatim} +By default only the basic captions and |\today| are redefined, but you +can add further macros with the key |include| in the optional argument +(without commas). Macros not to be modified are listed in +|exclude|. You can also enforce a font encoding with +|fontenc|.\footnote{With it encoded string may not work as expected.} +A couple of examples: +\begin{verbatim} +\babelensure[include=\Today]{spanish} +\babelensure[fontenc=T5]{vietnamese} +\end{verbatim} + +They are activated when the language is selected (at the |afterextras| +event), and it makes some assumptions which could not be fulfilled in +some languages. Note also you should include only macros defined by +the language, not global macros (eg, |\TeX| of |\dag|). + +With |ini| files (see below), captions are ensured by default. + +\subsection{Shorthands} + +A \textit{shorthand} is a sequence of one or two characters that +expands to arbitrary \TeX{} code. + +Shorthands can be used for different kinds of things, as for example: +(1) in some languages shorthands such as |"a| are defined to be able +to hyphenate the word if the encoding is |OT1|; (2) in some languages +shorthands such as |!| are used to insert the right amount of white +space; (3) several kinds of discretionaries and breaks can be inserted +easily with |"-|, |"=|, etc. + +The package \textsf{inputenc} as well as \xetex{} an \luatex{} have +alleviated entering non-ASCII characters, but minority languages and +some kinds of text can still require characters not directly available +on the keyboards (and sometimes not even as separated or precomposed +Unicode characters). As to the point 2, now \textsf{pdfTeX} provides +|\knbccode|, and \luatex{} can manipulate the glyph list. Tools for +point 3 can be still very useful in general. + +There are three levels of shorthands: \textit{user}, +\textit{language}, and \textit{system} (by order of +precedence). Version 3.9 introduces the \textit{language user} level +on top of the user level, as described below. In most cases, you will +use only shorthands provided by languages. + +\begin{note} Note the following: +\begin{enumerate} +\item Activated chars used for two-char shorthands cannot be followed + by a closing brace |}| and the spaces following are gobbled. With + one-char shorthands (eg,~|:|), they are preserved. +\item If on a certain level (system, language, user) there is a + one-char shorthand, two-char ones starting with that + char and on the same level are ignored. +\item Since they are active, a shorthand cannot contain the same + character in its definition (except if it is deactivated with, eg, + |string|). +\end{enumerate} +\end{note} + +A typical error when using shorthands is the following: +\trouble{Argument of \textbackslash language@active@arg" +has an extra \textbraceright} +\begin{verbatim} +! Argument of \language@active@arg" has an extra }. +\end{verbatim} +It means there is a closing brace just after a shorthand, which is not +allowed (eg,~|"}|). Just add |{}| after (eg,~|"{}}|). + +\Describe{\shorthandon}{\marg{shorthands-list}} +\DescribeOther{\shorthandoff}{% +\colorbox{thegrey}{\ttfamily\hskip-.2em*\hskip-.2em}% +\marg{shorthands-list}} +It is sometimes necessary to switch a shorthand +character off temporarily, because it must be used in an +entirely different way. For this purpose, the user commands +|\shorthandoff| and |\shorthandon| are provided. They each take a +list of characters as their arguments. + +The command |\shorthandoff| sets the |\catcode| for each of the +characters in its argument to other (12); the command |\shorthandon| +sets the |\catcode| to active (13). Both commands only work on `known' +shorthand characters. If a character is not known to be a shorthand +character its category code will be left unchanged. + +\New{3.9a} However, |\shorthandoff| does not behave as +you would expect with characters like |~| or |^|, because they +usually are not ``other''. For them |\shorthandoff*| is provided, +so that with +\begin{verbatim} +\shorthandoff*{~^} +\end{verbatim} +|~| is still active, very likely with the meaning of a non-breaking +space, and |^| is the superscript character. The catcodes used are +those when the shorthands are defined, usually when language files are +loaded. + +\Describe{\useshorthands}{% +\colorbox{thegrey}{\ttfamily\hskip-.2em*\hskip-.2em}% +\marg{char}} + +The command |\useshorthands| initiates the definition of user-defined +shorthand sequences. It has one argument, the character that starts +these personal shorthands. + +\New{3.9a} User shorthands are not always alive, as they may +be deactivated by languages (for example, if you use |"| for your user +shorthands and switch from \textsf{german} to \textsf{french}, they +stop working). Therefore, a starred version +|\useshorthands*|\marg{char} is provided, which makes sure shorthands +are always activated. + +Currently, if the package option |shorthands| is used, you must include any +character to be activated with |\useshorthands|. This restriction will +be lifted in a future release. + +\Describe\defineshorthand{\texttt{[}\langlist\texttt{]}% + \marg{shorthand}\marg{code}} + +The command |\defineshorthand| takes two arguments: the first is +a one- or two-character shorthand sequence, and the second is the +code the shorthand should expand to. + +\New{3.9a} An optional argument allows to (re)define language and +system shorthands (some languages do not activate shorthands, so you +may want to add |\languageshorthands|\marg{lang} to the corresponding +|\extras|\m{lang}, as explained below). By default, user shorthands +are (re)defined. + +User shorthands override language ones, which in turn override +system shorthands. Language-dependent user shorthands (new in +3.9) take precedence over ``normal'' user shorthands. + +\begin{example} + Let's assume you want a unified set of shorthand for discretionaries + (languages do not define shorthands consistently, and |"-|, |\-|, + |"=| have different meanings). You could start with, say: +\begin{verbatim} +\useshorthands*{"} +\defineshorthand{"*}{\babelhyphen{soft}} +\defineshorthand{"-}{\babelhyphen{hard}} +\end{verbatim} + However, behavior of hyphens is language dependent. For example, in + languages like Polish and Portuguese, a hard hyphen inside compound + words are repeated at the beginning of the next line. You could then + set: +\begin{verbatim} +\defineshorthand[*polish,*portugese]{"-}{\babelhyphen{repeat}} +\end{verbatim} + Here, options with |*| set a language-dependent user shorthand, + which means the generic one above only applies for the rest of + languages; without |*| they would (re)define the language shorthands + instead, which are overriden by user ones. + + Now, you have a single unified shorthand (|"-|), with a + content-based meaning (`compound word hyphen') whose visual behavior + is that expected in each context. +\end{example} + +\Describe\aliasshorthand{\marg{original}\marg{alias}} + +The command |\aliasshorthand| can be used to let another +character perform the same functions as the default shorthand +character. If one prefers for example to use the character |/| +over |"| in typing Polish texts, this can be achieved by entering +|\aliasshorthand{"}{/}|. + +\begin{note} + The substitute character must \textit{not} have been declared before + as shorthand (in such a case, |\aliashorthands| is ignored). +\end{note} + +\begin{example} + The following example shows how to replace a shorthand by another +\begin{verbatim} +\aliasshorthand{~}{^} +\AtBeginDocument{\shorthandoff*{~}} +\end{verbatim} +\end{example} + +\begin{warning} + Shorthands remember somehow the original character, and the fallback + value is that of the latter. So, in this example, if no shorthand if + found, |^| expands to a non-breaking space, because this is the + value of |~| (internally, |^| still calls |\active@char~| or + |\normal@char~|). Furthermore, if you change the |system| value of + |^| with |\defineshorthand| nothing happens. +\end{warning} + +\Describe\languageshorthands{\marg{language}} The command +|\languageshorthands| can be used to switch the shorthands on the +language level. It takes one argument, the name of a language or +|none| (the latter does what its name suggests).\footnote{Actually, +any name not corresponding to a language group does the same as +\texttt{none}. However, follow this convention because it might be +enforced in future releases of \babel{} to catch possible errors.} +Note that for this to work the language should have been specified as +an option when loading the \babel\ package. For example, you can use +in \textsf{english} the shorthands defined by \textsf{ngerman} with +\begin{verbatim} +\addto\extrasenglish{\languageshorthands{ngerman}} +\end{verbatim} +(You may also need to activate them with, for example, +|\useshorthands|.) + +Very often, this is a more convenient way to deactivate shorthands +than |\shorthandoff|, as for example if you want to define a macro +to easy typing phonetic characters with \textsf{tipa}: +\begin{verbatim} +\newcommand{\myipa}[1]{{\languageshorthands{none}\tipaencoding#1}} +\end{verbatim} + +\Describe\babelshorthand{\marg{shorthand}} +With this command you can use a shorthand even if (1) not activated in +\texttt{shorthands} (in this case only shorthands for the current +language are taken into account, ie, not user shorthands), (2) turned +off with |\shorthandoff| or (3) deactivated with the internal +|\bbl@deactivate|; for example, \verb|\babelshorthand{"u}| or +\verb|\babelshorthand{:}|. (You can conveniently define your own +macros, or even you own user shorthands provided they do not ovelap.) + +For your records, here is a list of shorthands, but you must double +check them, as they may change:\footnote{Thanks to Enrico Gregorio} + +\begin{description} +\itemsep=-\parskip +\item[Languages with no shorthands] Croatian, English (any variety), + Indonesian, Hebrew, Interlingua, Irish, Lower Sorbian, Malaysian, + North Sami, Romanian, Scottish, Welsh +\item[Languages with only \texttt{"} as defined shorthand character] + Albanian, Bulgarian, Danish, Dutch, Finnish, German (old and new + orthography, also Austrian), Icelandic, Italian, Norwegian, Polish, + Portuguese (also Brazilian), Russian, Serbian (with Latin script), + Slovene, Swedish, Ukrainian, Upper Sorbian +\item[Basque] |" ' ~| +\item[Breton] |: ; ? !| +\item[Catalan] |" ' `| +\item[Czech] |" -| +\item[Esperanto] |^| +\item[Estonian] |" ~| +\item[French] (all varieties) |: ; ? !| +\item[Galician] |" . ' ~ < >| +\item[Greek] |~| +\item[Hungarian] |`| +\item[Kurmanji] |^| +\item[Latin] |" ^ =| +\item[Slovak] |" ^ ' -| +\item[Spanish] |" . < > '| +\item[Turkish] |: ! =| +\end{description} +In addition, the \babel{} core declares |~| as a one-char shorthand +which is let, like the standard |~|, to a non breaking +space.\footnote{This declaration serves to nothing, but it is +preserved for backward compatibility.} + +\subsection{Package options} + +\New{3.9a} +These package options are processed before language options, so +that they are taken into account irrespective of its order. The first +three options have been available in previous versions. + +\Describe{KeepShorthandsActive}{} +Tells babel not to deactivate shorthands after loading a language +file, so that they are also availabe in the preamble. + +\Describe{activeacute}{} For some languages \babel\ supports this +options to set |'| as a shorthand in case it is not done by default. + +\Describe{activegrave}{} +Same for |`|. + +\Describe{shorthands=}{\meta{char}\meta{char}... +$\string|$ \texttt{off}} +The only language shorthands activated +are those given, like, eg: +\begin{verbatim} +\usepackage[esperanto,french,shorthands=:;!?]{babel} +\end{verbatim} +If \verb|'| is included, \texttt{activeacute} is set; if \verb|`| is +included, \texttt{activegrave} is set. Active characters (like +\verb|~|) should be preceded by \verb|\string| (otherwise they will be +expanded by \LaTeX{} before they are passed to the package and +therefore they will not be recognized); however, |t| is provided for +the common case of |~| (as well as |c| for not so common case of the +comma). + +With |shorthands=off| no language shorthands are defined, +As some languages use this mechanism for tools not available +otherwise, a macro \verb|\babelshorthand| is defined, which allows +using them; see above. + +\Describe{safe=}{\texttt{none} $\string|$ \texttt{ref} $\string|$ +\texttt{bib}} Some \LaTeX{} macros are redefined so that using +shorthands is safe. With \texttt{safe=bib} only |\nocite|, |\bibcite| +and |\bibitem| are redefined. With |safe=ref| only |\newlabel|, |\ref| +and |\pageref| are redefined (as well as a few macros from +\textsf{varioref} and \textsf{ifthen}). With |safe=none| no macro is +redefined. This option is strongly recommended, because a good deal of +incompatibilities and errors are related to these redefinitions -- of +course, in such a case you cannot use shorthands in these macros, but +this is not a real problem (just use ``allowed'' characters). + +\Describe{math=}{\texttt{active} $\string|$ \texttt{normal}} +Shorthands are mainly intended for text, not for math. By setting this +option with the value |normal| they are deactivated in math mode +(default is |active|) and things like |${a'}$| (a closing brace after +a shorthand) are not a source of trouble any more. + +\Describe{config=}{\meta{file}} Load \meta{file}\texttt{.cfg} instead +of the default config file |bblopts.cfg| (the file is loaded even +with |noconfigs|). + +\Describe{main=}{\meta{language}} Sets the main language, as explained +above, ie, this language is always loaded last. If it is not given as +package or global option, it is added to the list of requested +languages. + +\Describe{headfoot=}{\meta{language}} By default, headlines and +footlines are not touched (only marks), and if they contain language +dependent macros (which is not usual) there may be unexpected +results. With this option you may set the language in heads and foots. + +\Describe{noconfigs}{} Global and language default config files are +not loaded, so you can make sure your document is not spoilt by an +unexpected \texttt{.cfg} file. However, if the key |config| is set, +this file is loaded. + +\Describe{showlanguages}{} Prints to the log the list of languages +loaded when the format was created: number (remember dialects can +share it), name, hyphenation file and exceptions file. + +\Describe{nocase}{} \New{3.9l} Language settings for uppercase and +lowercase mapping (as set by |\SetCase|) are ignored. Use only if there +are incompatibilities with other packages. + +\Describe{silent}{} \New{3.9l} No warnings and no \textit{infos} are +written to the log file.\footnote{You can use alternatively the +package \textsf{silence}.} + +\Describe{strings=}{\texttt{generic} $\string|$ \texttt{unicode} +$\string|$ \texttt{encoded} $\string|$ \meta{label} $\string|$ +\meta{font encoding}} Selects the encoding of strings in languages +supporting this feature. Predefined labels are |generic| (for +traditional \TeX, LICR and ASCII strings), |unicode| (for engines like +\xetex{} and \luatex) and |encoded| (for special cases requiring mixed +encodings). Other allowed values are font encoding codes (|T1|, |T2A|, +|LGR|, |L7X|...), but only in languages supporting them. Be aware with +|encoded| captions are protected, but they work in |\MakeUppercase| +and the like (this feature misuses some internal \LaTeX\ tools, so use +it only as a last resort). + +\Describe{hyphenmap=}{\texttt{off} $\string|$ \texttt{main} +$\string|$ \texttt{select} $\string|$ \texttt{other} $\string|$ +\texttt{other*}} + +\New{3.9g} Sets the behavior of case mapping for hyphenation, +provided the language defines it.\footnote{Turned off in plain.} It +can take the following values: +\begin{description} +\renewcommand\makelabel[1]{% + \hspace\labelsep\normalfont\ttfamily\color{thered}#1} +\itemsep=-\parskip +\item[off] deactivates this feature and no case mapping is applied; +\item[first] sets it at the first switching commands in the + current or parent scope (typically, when the aux file is first read + and at |\begin{document}|, but also the first |\selectlanguage| in + the preamble), and it's the default if a single + language option has been stated;\footnote{Duplicated options count + as several ones.} +\item[select] sets it only at |\selectlanguage|; +\item[other] also sets it at |otherlanguage|; +\item[other*] also sets it at |otherlanguage*| as well as in heads and + foots (if the option |headfoot| is used) and in auxiliary files (ie, + at |\select@language|), and it's the default if several language + options have been stated. The option |first| can be regarded as an + optimized version of \texttt{other*} for monolingual + documents.\footnote{Providing |foreign| is pointless, because the + case mapping applied is that at the end of paragraph, but if either + \xetex{} or \luatex{} change this behavior it might be added. On + the other hand, |other| is provided even if I [JBL] think it isn't + really useful, but who knows.} +\end{description} + +\Describe{bidi=}{} + +\New{3.14} Selects the bidi algorithm to be used in \luatex{} and +\xetex{}. See sec.~\ref{bidi}. + +\Describe{layout=}{} + +\New{3.16} Selects which layout elements are adapted in bidi +documents. See sec.~\ref{bidi}. + +\subsection{The \texttt{base} option} + +With this package option \babel{} just loads some basic macros (those +in |switch.def|), defines |\AfterBabelLanguage| and exits. It also +selects the hyphenations patterns for the last language passed as +option (by its name in |language.dat|). There are two main uses: +classes and packages, and as a last resort in case there are, for some +reason, incompatible languages. It can be used if you just want to +select the hyphenations patterns of a single language, too. +% TODO: example + +\Describe\AfterBabelLanguage{\marg{option-name}\marg{code}} + +This command is currently the only provided by |base|. Executes +\meta{code} when the file loaded by the corresponding package option +is finished (at |\ldf@finish|). The setting is global. So +\begin{verbatim} +\AfterBabelLanguage{french}{...} +\end{verbatim} +does ... at the end of |french.ldf|. It can be used in |ldf| files, +too, but in such a case the code is executed only if +\meta{option-name} is the same as |\CurrentOption| (which could not +be the same as the option name as set in |\usepackage|!). + +\begin{example} + Consider two languages \textsf{foo} and \textsf{bar} defining the + same |\macro| with |\newcommand|. An error is raised if you attempt + to load both. Here is a way to overcome this problem: +\begin{verbatim} +\usepackage[base]{babel} +\AfterBabelLanguage{foo}{% + \let\macroFoo\macro + \let\macro\relax} +\usepackage[foo,bar]{babel} +\end{verbatim} +\end{example} + +\subsection{\texttt{ini} files} + +An alternative approach to define a language is by means of an +\texttt{ini} file. Currently \babel{} provides about 200 of these +files containing the basic data required for a language. + +Most of them set the date, and many also the captions (Unicode and +LICR). They will be evolving with the time to add more features +(something to keep in mind if backward compatibility is +important). The following section shows how to make use of them +currently (by means of |\babelprovide|), but a higher interface, based +on package options, in under development. + +\begin{example} + Although Georgian has its own \texttt{ldf} file, here is how to + declare this language with an |ini| file in Unicode engines. The + |nil| language is required, because currently \babel{} raises an + error if there is no language. +\begingroup +\setmonofont[Scale=.87,Script=Georgian]{DejaVu Sans Mono} +\begin{verbatim} +\documentclass{book} + +\usepackage[nil]{babel} +\babelprovide[import=ka, main]{georgian} + +\babelfont{rm}{DejaVu Sans} + +\begin{document} + +\tableofcontents + +\chapter{სამზარეულო და სუფრის ტრადიციები} + +ქართული ტრადიციული სამზარეულო ერთ-ერთი უმდიდრესია მთელ მსოფლიოში. + +\end{document} +\end{verbatim} +\endgroup +\end{example} + +Here is the list (u means Unicode captions, and l means LICR +captions): + +\begingroup +\bigskip\hrule\nobreak + +\makeatletter +\def\tag#1{\par\@hangfrom{\makebox[7em][l]{#1}}\ignorespaces} +\def\hascapu{\textsuperscript{u}} +\def\hascapl{\textsuperscript{l}} + +\begin{multicols}{2} + +\tag{af} Afrikaans\hascapu\hascapl +\tag{agq} Aghem +\tag{ak} Akan +\tag{am} Amharic\hascapu\hascapl +\tag{ar} Arabic\hascapu\hascapl +\tag{as} Assamese +\tag{asa} Asu +\tag{ast} Asturian\hascapu\hascapl +\tag{az-Cyrl} Azerbaijani +\tag{az-Latn} Azerbaijani +\tag{az} Azerbaijani\hascapu\hascapl +\tag{bas} Basaa +\tag{be} Belarusian\hascapu\hascapl +\tag{bem} Bemba +\tag{bez} Bena +\tag{bg} Bulgarian\hascapu\hascapl +\tag{bm} Bambara +\tag{bn} Bangla\hascapu\hascapl +\tag{bo} Tibetan\hascapu +\tag{brx} Bodo +\tag{bs-Cyrl} Bosnian +\tag{bs-Latn} Bosnian\hascapu\hascapl +\tag{bs} Bosnian\hascapu\hascapl +\tag{ca} Catalan\hascapu\hascapl +\tag{ce} Chechen +\tag{cgg} Chiga +\tag{chr} Cherokee +\tag{ckb} Central Kurdish +\tag{cs} Czech\hascapu\hascapl +\tag{cy} Welsh\hascapu\hascapl +\tag{da} Danish\hascapu\hascapl +\tag{dav} Taita +\tag{de-AT} German\hascapu\hascapl +\tag{de-CH} German\hascapu\hascapl +\tag{de} German\hascapu\hascapl +\tag{dje} Zarma +\tag{dsb} Lower Sorbian\hascapu\hascapl +\tag{dua} Duala +\tag{dyo} Jola-Fonyi +\tag{dz} Dzongkha +\tag{ebu} Embu +\tag{ee} Ewe +\tag{el} Greek\hascapu\hascapl +\tag{en-AU} English\hascapu\hascapl +\tag{en-CA} English\hascapu\hascapl +\tag{en-GB} English\hascapu\hascapl +\tag{en-NZ} English\hascapu\hascapl +\tag{en-US} English\hascapu\hascapl +\tag{en} English\hascapu\hascapl +\tag{eo} Esperanto\hascapu\hascapl +\tag{es-MX} Spanish\hascapu\hascapl +\tag{es} Spanish\hascapu\hascapl +\tag{et} Estonian\hascapu\hascapl +\tag{eu} Basque\hascapu\hascapl +\tag{ewo} Ewondo +\tag{fa} Persian\hascapu\hascapl +\tag{ff} Fulah +\tag{fi} Finnish\hascapu\hascapl +\tag{fil} Filipino +\tag{fo} Faroese +\tag{fr} French\hascapu\hascapl +\tag{fr-BE} French\hascapu\hascapl +\tag{fr-CA} French\hascapu\hascapl +\tag{fr-CH} French\hascapu\hascapl +\tag{fr-LU} French\hascapu\hascapl +\tag{fur} Friulian\hascapu\hascapl +\tag{fy} Western Frisian +\tag{ga} Irish\hascapu\hascapl +\tag{gd} Scottish Gaelic\hascapu\hascapl +\tag{gl} Galician\hascapu\hascapl +\tag{gsw} Swiss German +\tag{gu} Gujarati +\tag{guz} Gusii +\tag{gv} Manx +\tag{ha-GH} Hausa +\tag{ha-NE} Hausa\hascapl +\tag{ha} Hausa +\tag{haw} Hawaiian +\tag{he} Hebrew\hascapu\hascapl +\tag{hi} Hindi\hascapu +\tag{hr} Croatian\hascapu\hascapl +\tag{hsb} Upper Sorbian\hascapu\hascapl +\tag{hu} Hungarian\hascapu\hascapl +\tag{hy} Armenian +\tag{ia} Interlingua\hascapu\hascapl +\tag{id} Indonesian\hascapu\hascapl +\tag{ig} Igbo +\tag{ii} Sichuan Yi +\tag{is} Icelandic\hascapu\hascapl +\tag{it} Italian\hascapu\hascapl +\tag{ja} Japanese +\tag{jgo} Ngomba +\tag{jmc} Machame +\tag{ka} Georgian\hascapu\hascapl +\tag{kab} Kabyle +\tag{kam} Kamba +\tag{kde} Makonde +\tag{kea} Kabuverdianu +\tag{khq} Koyra Chiini +\tag{ki} Kikuyu +\tag{kk} Kazakh +\tag{kkj} Kako +\tag{kl} Kalaallisut +\tag{kln} Kalenjin +\tag{km} Khmer +\tag{kn} Kannada\hascapu\hascapl +\tag{ko} Korean +\tag{kok} Konkani +\tag{ks} Kashmiri +\tag{ksb} Shambala +\tag{ksf} Bafia +\tag{ksh} Colognian +\tag{kw} Cornish +\tag{ky} Kyrgyz +\tag{lag} Langi +\tag{lb} Luxembourgish +\tag{lg} Ganda +\tag{lkt} Lakota +\tag{ln} Lingala +\tag{lo} Lao\hascapu\hascapl +\tag{lrc} Northern Luri +\tag{lt} Lithuanian\hascapu\hascapl +\tag{lu} Luba-Katanga +\tag{luo} Luo +\tag{luy} Luyia +\tag{lv} Latvian\hascapu\hascapl +\tag{mas} Masai +\tag{mer} Meru +\tag{mfe} Morisyen +\tag{mg} Malagasy +\tag{mgh} Makhuwa-Meetto +\tag{mgo} Metaʼ +\tag{mk} Macedonian\hascapu\hascapl +\tag{ml} Malayalam\hascapu\hascapl +\tag{mn} Mongolian +\tag{mr} Marathi\hascapu\hascapl +\tag{ms-BN} Malay\hascapl +\tag{ms-SG} Malay\hascapl +\tag{ms} Malay\hascapu\hascapl +\tag{mt} Maltese +\tag{mua} Mundang +\tag{my} Burmese +\tag{mzn} Mazanderani +\tag{naq} Nama +\tag{nb} Norwegian Bokmål\hascapu\hascapl +\tag{nd} North Ndebele +\tag{ne} Nepali +\tag{nl} Dutch\hascapu\hascapl +\tag{nmg} Kwasio +\tag{nn} Norwegian Nynorsk\hascapu\hascapl +\tag{nnh} Ngiemboon +\tag{nus} Nuer +\tag{nyn} Nyankole +\tag{om} Oromo +\tag{or} Odia +\tag{os} Ossetic +\tag{pa-Arab} Punjabi +\tag{pa-Guru} Punjabi +\tag{pa} Punjabi +\tag{pl} Polish\hascapu\hascapl +\tag{pms} Piedmontese\hascapu\hascapl +\tag{ps} Pashto +\tag{pt-BR} Portuguese\hascapu\hascapl +\tag{pt-PT} Portuguese\hascapu\hascapl +\tag{pt} Portuguese\hascapu\hascapl +\tag{qu} Quechua +\tag{rm} Romansh\hascapu\hascapl +\tag{rn} Rundi +\tag{ro} Romanian\hascapu\hascapl +\tag{rof} Rombo +\tag{ru} Russian\hascapu\hascapl +\tag{rw} Kinyarwanda +\tag{rwk} Rwa +\tag{sah} Sakha +\tag{saq} Samburu +\tag{sbp} Sangu +\tag{se} Northern Sami\hascapu\hascapl +\tag{seh} Sena +\tag{ses} Koyraboro Senni +\tag{sg} Sango +\tag{shi-Latn} Tachelhit +\tag{shi-Tfng} Tachelhit +\tag{shi} Tachelhit +\tag{si} Sinhala +\tag{sk} Slovak\hascapu\hascapl +\tag{sl} Slovenian\hascapu\hascapl +\tag{smn} Inari Sami +\tag{sn} Shona +\tag{so} Somali +\tag{sq} Albanian\hascapu\hascapl +\tag{sr-Cyrl-BA} Serbian\hascapu\hascapl +\tag{sr-Cyrl-ME} Serbian\hascapu\hascapl +\tag{sr-Cyrl-XK} Serbian\hascapu\hascapl +\tag{sr-Cyrl} Serbian\hascapu\hascapl +\tag{sr-Latn-BA} Serbian\hascapu\hascapl +\tag{sr-Latn-ME} Serbian\hascapu\hascapl +\tag{sr-Latn-XK} Serbian\hascapu\hascapl +\tag{sr-Latn} Serbian\hascapu\hascapl +\tag{sr} Serbian\hascapu\hascapl +\tag{sv} Swedish\hascapu\hascapl +\tag{sw} Swahili +\tag{ta} Tamil\hascapu +\tag{te} Telugu\hascapu\hascapl +\tag{teo} Teso +\tag{th} Thai\hascapu\hascapl +\tag{ti} Tigrinya +\tag{tk} Turkmen\hascapu\hascapl +\tag{to} Tongan +\tag{tr} Turkish\hascapu\hascapl +\tag{twq} Tasawaq +\tag{tzm} Central Atlas Tamazight +\tag{ug} Uyghur +\tag{uk} Ukrainian\hascapu\hascapl +\tag{ur} Urdu\hascapu\hascapl +\tag{uz-Arab} Uzbek +\tag{uz-Cyrl} Uzbek +\tag{uz-Latn} Uzbek +\tag{uz} Uzbek +\tag{vai-Latn} Vai +\tag{vai-Vaii} Vai +\tag{vai} Vai +\tag{vi} Vietnamese\hascapu\hascapl +\tag{vun} Vunjo +\tag{wae} Walser +\tag{xog} Soga +\tag{yav} Yangben +\tag{yi} Yiddish +\tag{yo} Yoruba +\tag{yue} Cantonese +\tag{zgh} Standard Moroccan Tamazight +\tag{zh-Hans-HK} Chinese +\tag{zh-Hans-MO} Chinese +\tag{zh-Hans-SG} Chinese +\tag{zh-Hans} Chinese +\tag{zh-Hant-HK} Chinese +\tag{zh-Hant-MO} Chinese +\tag{zh-Hant} Chinese +\tag{zh} Chinese +\tag{zu} Zulu + +\end{multicols} +\endgroup +\hrule +\bigskip + +In some contexts (currently |\babelfont|) an \texttt{ini} file may be +loaded by its name. Here is the list of the names currently +supported. With these languages, |\babelfont| loads (if not done +before) the language and script names (even if the language is defined +as a package option with an \textsf{ldf} file). + +\begingroup +\bigskip\hrule\nobreak + +\let\\\par + +\begin{multicols}{2} + +aghem\\ +akan\\ +albanian\\ +american\\ +amharic\\ +arabic\\ +armenian\\ +assamese\\ +asturian\\ +asu\\ +australian\\ +austrian\\ +azerbaijani-cyrillic\\ +azerbaijani-cyrl\\ +azerbaijani-latin\\ +azerbaijani-latn\\ +azerbaijani\\ +bafia\\ +bambara\\ +basaa\\ +basque\\ +belarusian\\ +bemba\\ +bena\\ +bengali\\ +bodo\\ +bosnian-cyrillic\\ +bosnian-cyrl\\ +bosnian-latin\\ +bosnian-latn\\ +bosnian\\ +brazilian\\ +breton\\ +british\\ +bulgarian\\ +burmese\\ +canadian\\ +cantonese\\ +catalan\\ +centralatlastamazight\\ +centralkurdish\\ +chechen\\ +cherokee\\ +chiga\\ +chinese-hans-hk\\ +chinese-hans-mo\\ +chinese-hans-sg\\ +chinese-hans\\ +chinese-hant-hk\\ +chinese-hant-mo\\ +chinese-hant\\ +chinese-simplified-hongkongsarchina\\ +chinese-simplified-macausarchina\\ +chinese-simplified-singapore\\ +chinese-simplified\\ +chinese-traditional-hongkongsarchina\\ +chinese-traditional-macausarchina\\ +chinese-traditional\\ +chinese\\ +colognian\\ +cornish\\ +croatian\\ +czech\\ +danish\\ +duala\\ +dutch\\ +dzongkha\\ +embu\\ +english-au\\ +english-australia\\ +english-ca\\ +english-canada\\ +english-gb\\ +english-newzealand\\ +english-nz\\ +english-unitedkingdom\\ +english-unitedstates\\ +english-us\\ +english\\ +esperanto\\ +estonian\\ +ewe\\ +ewondo\\ +faroese\\ +filipino\\ +finnish\\ +french-be\\ +french-belgium\\ +french-ca\\ +french-canada\\ +french-ch\\ +french-lu\\ +french-luxembourg\\ +french-switzerland\\ +french\\ +friulian\\ +fulah\\ +galician\\ +ganda\\ +georgian\\ +german-at\\ +german-austria\\ +german-ch\\ +german-switzerland\\ +german\\ +greek\\ +gujarati\\ +gusii\\ +hausa-gh\\ +hausa-ghana\\ +hausa-ne\\ +hausa-niger\\ +hausa\\ +hawaiian\\ +hebrew\\ +hindi\\ +hungarian\\ +icelandic\\ +igbo\\ +inarisami\\ +indonesian\\ +interlingua\\ +irish\\ +italian\\ +japanese\\ +jolafonyi\\ +kabuverdianu\\ +kabyle\\ +kako\\ +kalaallisut\\ +kalenjin\\ +kamba\\ +kannada\\ +kashmiri\\ +kazakh\\ +khmer\\ +kikuyu\\ +kinyarwanda\\ +konkani\\ +korean\\ +koyraborosenni\\ +koyrachiini\\ +kwasio\\ +kyrgyz\\ +lakota\\ +langi\\ +lao\\ +latvian\\ +lingala\\ +lithuanian\\ +lowersorbian\\ +lsorbian\\ +lubakatanga\\ +luo\\ +luxembourgish\\ +luyia\\ +macedonian\\ +machame\\ +makhuwameetto\\ +makonde\\ +malagasy\\ +malay-bn\\ +malay-brunei\\ +malay-sg\\ +malay-singapore\\ +malay\\ +malayalam\\ +maltese\\ +manx\\ +marathi\\ +masai\\ +mazanderani\\ +meru\\ +meta\\ +mexican\\ +mongolian\\ +morisyen\\ +mundang\\ +nama\\ +nepali\\ +newzealand\\ +ngiemboon\\ +ngomba\\ +norsk\\ +northernluri\\ +northernsami\\ +northndebele\\ +norwegianbokmal\\ +norwegiannynorsk\\ +nswissgerman\\ +nuer\\ +nyankole\\ +nynorsk\\ +occitan\\ +oriya\\ +oromo\\ +ossetic\\ +pashto\\ +persian\\ +piedmontese\\ +polish\\ +portuguese-br\\ +portuguese-brazil\\ +portuguese-portugal\\ +portuguese-pt\\ +portuguese\\ +punjabi-arab\\ +punjabi-arabic\\ +punjabi-gurmukhi\\ +punjabi-guru\\ +punjabi\\ +quechua\\ +romanian\\ +romansh\\ +rombo\\ +rundi\\ +russian\\ +rwa\\ +sakha\\ +samburu\\ +samin\\ +sango\\ +sangu\\ +scottishgaelic\\ +sena\\ +serbian-cyrillic-bosniaherzegovina\\ +serbian-cyrillic-kosovo\\ +serbian-cyrillic-montenegro\\ +serbian-cyrillic\\ +serbian-cyrl-ba\\ +serbian-cyrl-me\\ +serbian-cyrl-xk\\ +serbian-cyrl\\ +serbian-latin-bosniaherzegovina\\ +serbian-latin-kosovo\\ +serbian-latin-montenegro\\ +serbian-latin\\ +serbian-latn-ba\\ +serbian-latn-me\\ +serbian-latn-xk\\ +serbian-latn\\ +serbian\\ +shambala\\ +shona\\ +sichuanyi\\ +sinhala\\ +slovak\\ +slovene\\ +slovenian\\ +soga\\ +somali\\ +spanish-mexico\\ +spanish-mx\\ +spanish\\ +standardmoroccantamazight\\ +swahili\\ +swedish\\ +swissgerman\\ +tachelhit-latin\\ +tachelhit-latn\\ +tachelhit-tfng\\ +tachelhit-tifinagh\\ +tachelhit\\ +taita\\ +tamil\\ +tasawaq\\ +telugu\\ +teso\\ +thai\\ +tibetan\\ +tigrinya\\ +tongan\\ +turkish\\ +turkmen\\ +ukenglish\\ +ukrainian\\ +uppersorbian\\ +urdu\\ +usenglish\\ +usorbian\\ +uyghur\\ +uzbek-arab\\ +uzbek-arabic\\ +uzbek-cyrillic\\ +uzbek-cyrl\\ +uzbek-latin\\ +uzbek-latn\\ +uzbek\\ +vai-latin\\ +vai-latn\\ +vai-vai\\ +vai-vaii\\ +vai\\ +vietnam\\ +vietnamese\\ +vunjo\\ +walser\\ +welsh\\ +westernfrisian\\ +yangben\\ +yiddish\\ +yoruba\\ +zarma\\ +zulu +afrikaans\\ + +\end{multicols} +\endgroup +\hrule + +\subsection{Selecting fonts} + +\New{3.15} Babel provides a high level interface on top of |fontspec| +to select fonts. There is no need to load \textsf{fontspec} explicitly +-- \babel{} does it for you with the first |\babelfont|.\footnote{See +also the package \textsf{combofont} for a complementary approach.} + +\Describe\babelfont{\oarg{language-list}\marg{font-family}% + \oarg{font-options}\marg{font-name}} + +Here \textit{font-family} is |rm|, |sf| or |tt| (or newly defined +ones, as explained below), and \textit{font-name} is the same as in +\textsf{fontspec} and the like. + +If no language is given, then it is considered the default font for +the family, activated when a language is selected. On the other hand, +if there is one or more languages in the optional argument, the font +will be assigned to them, overriding the default. Alternatively, you +may set a font for a script -- just precede its name (lowercase) with +a star (eg, |*devanagari|). + +\Babel{} takes care of the font language and the font script when +languages are selected (as well as the writing direction); see the +recognized languages above. In most cases, you will not need +\textit{font-options}, which is the same as in \textsf{fontspec}, but +you may add further key/value pairs if necessary. + +\begin{example} + Usage in most cases is very simple. Let us assume you are setting up + a document in Swedish, with some words in Hebrew, with a font suited + for both languages. + \begingroup +% If you are looking at the code to see how it has been written, you +% will be disappointed :-). The following example is built ad hoc to +% emulate the final result to avoid dependencies, and therefore it's +% not "real" code. +\setmonofont[Scale=.87,Script=Hebrew]{DejaVu Sans Mono} \catcode`@=13 +\def@#1{\ifcase#1\relax \egroup \or \bgroup\textdir TLT \else +\bgroup\textdir TRT \fontspec[Scale=.87,Script=Hebrew]{Liberation +Mono} \fi} +\begin{verbatim} +\documentclass{article} + +\usepackage[swedish, bidi=default]{babel} + +\babelprovide[import=he]{hebrew} + +_\babelfont{rm}{FreeSerif}_ + +\begin{document} + +Svenska \foreignlanguage{hebrew}{@2עִבְרִית@0} svenska. + +\end{document} +\end{verbatim} +\endgroup + +If on the other hand you have to resort to different fonts, you could +replace the red line above with, say: +\begin{verbatim} +\babelfont{rm}{Iwona} +\babelfont[hebrew]{rm}{FreeSerif} +\end{verbatim} +\end{example} + +|\babelfont| can be used to implicitly define a new font family. Just +write its name instead of |rm|, |sf| or |tt|. This is the preferred way +to select fonts in addition to the three basic ones. + +\begin{example} + Here is how to do it: +\begin{verbatim} +\babelfont{kai}{FandolKai} +\end{verbatim} + Now, |\kaifamily| and |\kaidefault|, as well as |\textkai| are at + your disposal. +\end{example} + +\begin{note} + You may load \textsf{fontspec} explicitly. For example: +\begin{verbatim} +\usepackage{fontspec} +\newfontscript{Devanagari}{deva} +\babelfont[hindi]{rm}{Shobhika} +\end{verbatim} + This makes sure the OpenType script for Devanagari is |deva| and not + |dev2|. +\end{note} + +\begin{note} + Directionality is a property affecting margins, intentation, column + order, etc., not just text. Therefore, it is under the direct + control of the language, which appplies both the script and the + direction to the text. As a consequence, there is no need to set + \texttt{Script} when declaring a font (nor \texttt{Language}). In + fact, it is even discouraged. +\end{note} + +\begin{note} + |\fontspec| is not touched at all, only the preset font families + (|rm|, |sf|, |tt|, and the like). If a language is switched when an + \textit{ad hoc} font is active, or you select the font with this + command, neither the script nor the language are passed. You must + add them by hand. This is by design, for several reasons (for + example, each font has its own set of features and a generic setting + for several of them could be problematic, and also a “lower level” + font selection is useful). +\end{note} + +\begin{note} + The keys |Language| and |Script| just pass these values to the + \textit{font}, and do \textit{not} set the script for the + \textit{language} (and therefore the writing direction). In other + words, the |ini| file or |\babelprovide| provides default values for + |\babelfont| if omitted, but the opposite is not true. See the note + above for the reasons of this behavior. +\end{note} + +\begin{warning} + Do not use |\set|\textit{xxxx}|font| and |\babelfont| at the same + time. |\babelfont| follows the standard \LaTeX{} conventions to set + the basic families -- define |\|\textit{xx}|default|, and activate + it with |\|\textit{xx}|family|. On the other hand, + |\set|\textit{xxxx}|font| in \textsf{fontspec} takes a different + approach, because |\|\textit{xx}|family| is redefined with the + family name hardcoded (so that |\|\textit{xx}|default| becomes + no-op). Of course, both methods are incompatible, and if you use + |\set|\textit{xxxx}|font|, font switching with |\babelfont| just + does \textit{not} work (nor the standard |\|\textit{xx}|default|, + for that matter). +\end{warning} + +\subsection{Modifying a language} + +Modifying the behavior of a language (say, the chapter “caption”), is +sometimes necessary, but not always trivial. +\begin{itemize} +\item The old way, still valid for many languages, to redefine a + caption is the following: +\begin{verbatim} +\addto\captionsenglish{% + \renewcommand\contentsname{Foo}% +} +\end{verbatim} + As of 3.15, there is no need to hide spaces with \texttt{\%} +(\babel{} removes them), but it is advisable to do it. +\item The new way, which is found in |bulgarian|, |azerbaijani|, + |spanish|, |french|, |turkish|, |icelandic|, |vietnamese| and a few + more, as well as in languages created with |\babelprovide| and its + key |import|, is: +\begin{verbatim} +\renewcommand\spanishchaptername{Foo} +\end{verbatim} +\item Macros to be run when a language is selected can be add to + |\extras|\m{lang}: +\begin{verbatim} +\addto\extrasrussian{\mymacro} +\end{verbatim} +There is a counterpart for code to be run when a language is +unselected: |\noextras|\m{lang}. +\end{itemize} + +\begin{note} + These macros (|\captions|\m{lang}, |\extras|\m{lang}) may be redefined, but + must not be used as such -- they just pass information to \babel{}, + which executes them in the proper context. +\end{note} + +\subsection{Creating a language} + +\New{3.10} And what if there is no style for your language or none +fits your needs? You may then define quickly a language with the +help of the following macro in the preamble. + +\Describe\babelprovide{\oarg{options}\marg{language-name}} + +Defines the internal structure of the language with some defaults: the +hyphen rules, if not available, are set to the current ones, left and +right hyphen mins are set to 2 and 3, but captions and date are not +defined. Conveniently, \babel{} warns you about what to do. Very +likely you will find alerts like that in the |log| file: +\begin{verbatim} +Package babel Warning: \mylangchaptername not set. Please, define +(babel) it in the preamble with something like: +(babel) \renewcommand\maylangchaptername{..} +(babel) Reported on input line 18. +\end{verbatim} + +In most cases, you will only need to define a few macros. + +\begin{example} + If you need a language named |arhinish|: +\begin{verbatim} +\usepackage[danish]{babel} +\babelprovide{arhinish} +\renewcommand\arhinishchaptername{Chapitula} +\renewcommand\arhinishrefname{Refirenke} +\renewcommand\arhinishhyphenmins{22} +\end{verbatim} +\end{example} + +The main language is not changed (\texttt{danish} in this example). +So, you must add |\selectlanguage{arhinish}| or other selectors where +necessary. + +If the language has been loaded as an argument in |\documentclass| or +|\usepackage|, then |\babelprovide| redefines the requested data. + +\Describe{import=}{\meta{language-tag}} +\New{3.13} Imports data from an |ini| file, including captions, date, +and hyphenmins. For example: +\begin{verbatim} +\babelprovide[import=hu]{hungarian} +\end{verbatim} +Unicode engines load the UTF-8 variants, while 8-bit engines load the +LICR (ie, with macros like |\'| or |\ss|) ones. + +There are about 200 |ini| files, with data taken from the |ldf| files +and the CLDR provided by Unicode. Not all languages in the latter are +complete, and therefore neither are the |ini| files. A few languages +will show a warning about the current lack of suitability of the date +format (\textsf{hindi}, \textsf{french}, \textsf{breton}, and +\textsf{occitan}). + +Besides |\today|, there is a |\<language>date| macro with three +arguments: year, month and day numbers. In fact, |\today| calls +|\<language>today|, which in turn calls +|\<language>date{\the\year}{\the\month}{\the\day}|. + +\Describe{captions=}{\meta{language-tag}} +Loads only the strings. For example: +\begin{verbatim} +\babelprovide[captions=hu]{hungarian} +\end{verbatim} + +\Describe{hyphenrules=}{\meta{language-list}} With this option, with a +space-separated list of hyphenation rules, \babel{} assigns to the +language the first valid hyphenation rules in the list. For example: +\begin{verbatim} +\babelprovide[hyphenrules=chavacano spanish italian]{chavacano} +\end{verbatim} +If none of the listed hyphenrules exist, the default behavior +applies. Note in this example we set |chavacano| as first option -- +without it, it would select |spanish| even if |chavacano| exists. + +A special value is |+|, which allocates a new language (in the \TeX{} +sense). It only makes sense as the last value (or the only one; the +subsequent ones are silently ignored). It is mostly useful with +\luatex, because you can add some patterns with |\babelpatterns|, as +for example: +\begin{verbatim} +\babelprovide[hyphenrules=+]{neo} +\babelpatterns[neo]{a1 e1 i1 o1 u1} +\end{verbatim} +In other engines it just supresses hyphenation (because the pattern +list is empty). + +\Describe{main}{} This valueless option makes the language the main +one. Only in newly defined languages. + +\Describe{script=}{\meta{script-name}} \New{3.15} Sets the script name +to be used by \textsf{fontspec} (eg, |Devanagari|). Overrides the +value in the |ini| file. This value is particularly important because +it sets the writing direction. + +\Describe{language=}{\meta{language-name}} \New{3.15} Sets the +language name to be used by \textsf{fontspec} (eg, |Hindi|). Overrides +the value in the |ini| file. Not so important, but sometimes still +relevant. + +\begin{note} + (1) If you need shorthands, you can use |\useshorthands| and + |\defineshorthand| as described above. (2) Captions and |\today| are + ``ensured'' with |\babelensure| (this is be the default in + |ini|-based languages). +\end{note} + +\subsection{Getting the current language name} + +\Describe\languagename{} +The control sequence |\languagename| contains the name of the +current language. + +\begin{warning} + Due to some internal inconsistencies in catcodes, it should + \textit{not} be used to test its value. Use \textsf{iflang}, by + Heiko Oberdiek. +\end{warning} + +\Describe\iflanguage{\marg{language}\marg{true}\marg{false}} + +If more than one language is used, it might be necessary to know which +language is active at a specific time. This can be checked by a call +to |\iflanguage|, but note here ``language'' is used in the \TeX\ +sense, as a set of hyphenation patterns, and \textit{not} as its +\textsf{babel} name. This macro takes three arguments. The first +argument is the name of a language; the second and third arguments are +the actions to take if the result of the test is true or false +respectively. + +\begin{warning} + The advice about |\languagename| also applies here -- use + \textsf{iflang} instead of |\iflanguage| if possible. +\end{warning} + +\subsection{Hyphenation tools} + +\Describe\babelhyphen{% + \colorbox{thegrey}{\ttfamily\hskip-.2em*\hskip-.2em}\marg{type}} +\DescribeOther\babelhyphen{% + \colorbox{thegrey}{\ttfamily\hskip-.2em*\hskip-.2em}\marg{text}} + +\New{3.9a} It is customary to classify hyphens in two types: (1) +\textit{explicit} or \textit{hard hyphens}, which in \TeX\ are +entered as \verb|-|, and (2) \textit{optional} or \textit{soft +hyphens}, which are entered as \verb|\-|. Strictly, a \textit{soft +hyphen} is not a hyphen, but just a breaking oportunity or, in +\TeX\ terms, a ``discretionary''; a \textit{hard hyphen} is a hyphen +with a breaking oportunity after it. A further type is a +\textit{non-breaking hyphen}, a hyphen without a breaking +oportunity. + +In \TeX, \verb|-| and \verb|\-| forbid further breaking oportunities +in the word. This is the desired behavior very often, but not always, +and therefore many languages provide shorthands for these +cases. Unfortunately, this has not been done consistently: for +example, \verb|"-| in Dutch, Portugese, Catalan or Danish is a hard +hyphen, while in German, Spanish, Norwegian, Slovak or Russian is a +soft hyphen. Furthermore, some of them even redefine |\-|, so that you +cannot insert a soft hyphen without breaking oportunities in the rest +of the word. + +Therefore, some macros are provide with a set of basic ``hyphens'' +which can be used by themselves, to define a user shorthand, or even +in language files. +\begin{itemize} +\item |\babelhyphen{soft}| and |\babelhyphen{hard}| are self + explanatory. +\item |\babelhyphen{repeat}| inserts a hard hyphen which is repeated + at the beginning of the next line, as done in languages like + Polish, Portugese and Spanish. +\item |\babelhyphen{nobreak}| inserts a hard hyphen without a break + after it (even if a space follows). +\item |\babelhyphen{empty}| inserts a break oportunity without + a hyphen at all. +\item |\babelhyphen|\marg{text} is a hard ``hyphen'' using \m{text} + instead. A typical case is |\babelhyphen{/}|. +\end{itemize} +With all of them hyphenation in the rest of the word is enabled. If +you don't want enabling it, there is a starred counterpart: +|\babelhyphen*{soft}| (which in most cases is equivalent to the +original |\-|), |\babelhyphen*{hard}|, etc. + +Note |hard| is also good for isolated prefixes (eg, \textit{anti-}) +and |nobreak| for isolated suffixes (eg, \textit{-ism}), but in both +cases |\babelhyphen*{nobreak}| is usually better. + +There are also some differences with \LaTeX: (1) the character used is +that set for the current font, while in \LaTeX{} it is hardwired to +|-| (a typical value); (2) the hyphen to be used in fonts with a +negative |\hyphenchar| is |-|, like in \LaTeX, but it can be changed to +another value by redefining |\babelnullhyphen|; (3) a break after the +hyphen is forbidden if preceded by a glue ${>}0$~pt (at the beginning +of a word, provided it is not immediately preceded by, say, a +parenthesis). + +\Describe\babelhyphenation{\texttt{[}\langlist\texttt{]}% + \marg{exceptions}} + +\New{3.9a} Sets hyphenation exceptions for the languages given +or, without the optional argument, for \textit{all} languages (eg, +proper nouns or common loan words, and of course monolingual +documents). Language exceptions take precedence over global ones. + +It can be used only in the preamble, and exceptions are set when the +language is first selected, thus taking into account changes of +|\lccodes|'s done in |\extras|\m{lang} as well as the language specific +encoding (not set in the preamble by default). Multiple +|\babelhyphenation|'s are allowed. For example: +\begin{verbatim} +\babelhyphenation{Wal-hal-la Dar-bhan-ga} +\end{verbatim} + +Listed words are saved expanded and therefore it relies on the +LICR. Of course, it also works without the LICR if the input and the +font encodings are the same, like in Unicode based engines. + +\Describe\babelpatterns{\texttt{[}\langlist\texttt{]}% + \marg{patterns}} + +\New{3.9m} \textit{In \textsf{luatex} only},\footnote{With +\textsf{luatex} exceptions and patterns can be modified almost +freely. However, this is very likely a task for a separate package +and \texttt{babel} only provides the most basic tools.} adds or +replaces patterns for the languages given or, without the optional +argument, for \textit{all} languages. If a pattern for a certain +combination already exists, it gets replaced by the new one. + +It can be used only in the preamble, and patterns are added when the +language is first selected, thus taking into account changes of +|\lccodes|'s done in |\extras|\m{lang} as well as the language specific +encoding (not set in the preamble by default). Multiple +|\babelpatterns|'s are allowed. + +Listed patterns are saved expanded and therefore it relies on the +LICR. Of course, it also works without the LICR if the input and the +font encodings are the same, like in Unicode based engines. + +\subsection{Selecting scripts} + +Currently \babel{} provides no standard interface to select +scripts, because they are best selected with either |\fontencoding| +(low level) or a language name (high level). Even the Latin script may +require different encodings (ie, sets of glyphs) depending on the +language, and therefore such a switch would be in a sense +incomplete.\footnote{The so-called Unicode fonts do not improve the +situation either. So, a font suited for Vietnamese is not necessarily +suited for, say, the romanization of Indic languages, and the fact it +contains glyphs for Modern Greek does not mean it includes them for +Classic Greek.} + +Some languages sharing the same script define macros to switch it (eg, +|\textcyrillic|), but be aware they may also set the language to a +certain default. Even the \babel{} core defined |\textlatin|, but is +was somewhat buggy because in some cases it messed up encodings and +fonts (for example, if the main latin encoding was |LY1|), and +therefore it has been deprecated.\footnote{But still defined for +backwards compatibility.} + +\Describe{\ensureascii}{\marg{text}} + +\New{3.9i} This macro makes sure \m{text} is typeset with a +LICR-savvy encoding in the ASCII range. It is used to redefine |\TeX| +and |\LaTeX| so that they are correctly typeset even with |LGR| or +|X2| (the complete list is stored in |\BabelNonASCII|, which by default +is |LGR|, |X2|, |OT2|, |OT3|, |OT6|, |LHE|, |LWN|, |LMA|, |LMC|, +|LMS|, |LMU|, but you can modify it). So, in some sense it fixes the +bug described in the previous paragraph. + +If non-ASCII encodings are not loaded (or no encoding at all), it is +no-op (also |\TeX| and |\LaTeX| are not redefined); otherwise, +|\ensureascii| switches to the encoding at the beginning of the +document if ASCII-savvy, or else the last ASCII-savvy encoding +loaded. For example, if you load |LY1,LGR|, then it is set to |LY1|, +but if you load |LY1,T2A| it is set to |T2A|. The symbol encodings +|TS1|, |T3|, and |TS3| are not taken into account, since they are not +used for ``ordinary'' text. + +The foregoing rules (which are applied ``at begin document'') cover +most of cases. No asumption is made on characters above +127, which may not follow the LICR conventions -- the goal is just +to ensure most of the ASCII letters and symbols are the right ones. + +\subsection{Selecting directions} +\label{bidi} + +No macros to select the writing direction are provided, either -- +writing direction is intrinsic to each script and therefore it is best +set by the language (which could be a dummy one). Furthermore, there +are in fact two right-to-left modes, depending on the language, which +differ in the way `weak' numeric characters are ordered (eg, Arabic +\%123 \textit{vs} Hebrew 123\%). + +\begin{warning} + Setting bidi text has many subtleties (see for example + <https://www.w3.org/TR/html-bidi/>). \textit{This means the \babel{} + bidi code may take some time before it is truly stable.}\footnote{A + basic stable version for \luatex{} is planned before Summer + 2018. Other engines must wait very likely until Winter.} An effort + is being made to avoid incompatibilities in the future (this one of + the reason currently bidi must be explicitly requested as a package + option, with a certain bidi model, and also the |layout| options + described below). +\end{warning} + +There are some package options controlling bidi writing. + +\Describe{bidi=}{\texttt{default} $\string|$ \texttt{basic-r} + $\string|$ \texttt{basic}} + +\New{3.14} Selects the bidi algorithm to be used. With |default| the +bidi mechanism is just activated (by default it is not), but every +change must by marked up. In \xetex{} and \pdftex{} this is the only +option. In \luatex, |basic-r| provides a simple and fast method for R +text, which handles numbers and unmarked L text within an R context. +\New{3.19} Finally, |basic| suports both L and R text (see +\ref{bidibasic}). (They are named \texttt{basic} because they only +consider the intrinsic direction of scripts and weak directionality.) + +\begin{example} + The following text comes from the Arabic Wikipedia (article about + Arabia). Copy-pasting some text from the Wikipedia is a good way to + test this feature, which will be improved in the future. Remember + |basic-r| is available in \luatex{} only.\footnote{At the time of + this writing some Arabic fonts are not rendered correctly by the + default \luatex{} font loader, with misplaced kerns inside some + words, so double check the resulting text. It seems a fix is on the + way, but in the meanwhile you could have a look at the workaround + available on GitHub, under \texttt{/required/babel/samples}} + \begingroup +% If you are looking at the code to see how it has been written, you +% will be disappointed :-). The following example is built ad hoc to +% emulate the final result to avoid dependencies, and therefore it's +% not "real" code. +\setmonofont[Scale=.87,Script=Arabic]{DejaVu Sans Mono} \catcode`@=13 +\def@#1{\ifcase#1\relax \egroup \or \bgroup\textdir TLT \else +\bgroup\textdir TRT \pardir TRT \fi} +\begin{verbatim} +\documentclass{article} + +\usepackage[nil, _bidi=basic-r_]{babel} + +_\babelprovide[import=ar, main]{arabic}_ + +\babelfont{rm}{FreeSerif} + +\begin{document} + +@9وقد عرفت شبه جزيرة العرب طيلة العصر الهيليني )الاغريقي( بـ +@1Arabia@0 أو @1Aravia@0 )بالاغريقية @1Αραβία@0(، استخدم الرومان ثلاث +بادئات بـ@1“Arabia”@0 على ثلاث مناطق من شبه الجزيرة العربية، إلا أنها +حقيقةً كانت أكبر مما تعرف عليه اليوم. + +@0\end{document} +\end{verbatim} +\endgroup +\end{example} + +\Describe{layout=}{\texttt{sectioning} $\string|$ + \texttt{counters} $\string|$ + \texttt{lists} $\string|$ + \texttt{contents} $\string|$ + \texttt{footnotes} $\string|$ + \texttt{captions} $\string|$ + \texttt{columns} $\string|$ + \texttt{extras}} + +\New{3.16} \textit{To be expanded}. Selects which layout elements are +adapted in bidi documents. You may use several options with a +comma-separated list (eg, |layout=counters.contents.sectioning|). This +list will be expanded in future releases (tables, captions, +etc.). Note not all options are required by all engines. + +\begin{description} +\renewcommand\makelabel[1]{% + \hspace\labelsep\normalfont\ttfamily\color{thered}#1} +\itemsep=-\parskip + +\item[sectioning] makes sure the sectioning macros are typeset in the + main language, but with the title text in the current language (see + below |\BabelPatchSection| for further details); + +\item[counters] required in all engines (except \luatex{} with + |bidi=basic|) to reorder correctly section numbers and the like (eg, + \m{subsection}.\m{section}); required in \xetex{} and \pdftex{} for + counters in general, as well as in \luatex{} with |bidi=default|; + required in \luatex{} for numeric footnote marks $>$9 with + |bidi=basic-r| (but \textit{not} with |bidi=basic|); note, however, + it could depend on the counter format; + +\item[lists] required in \xetex{} and \pdftex{}, but only in + multilingual documents in \luatex{}; + +\item[contents] required in \xetex{} and \pdftex{}; in \luatex{} + toc entries are R by default if the main language is R; + +\item[columns] required in \xetex{} and \pdftex{} to reverse the + column order (currently only the standard two column mode); in + \luatex{} they are R by default if the main language is R (including + \textsf{multicol}); + +\item[footnotes] not required in monolingual documents, but it may be + useful in multilingual documents in all engines; you may use + alternatively |\BabelFootnote| described below (what this options + does exactly is also explained there). + +\item[captions] is similar to |sectioning|, but for |\caption|; not + required in monolingual documents with \luatex{}, but may be + required in \xetex{} and \pdftex{} in some styles (support for the + latter two engines is still experimental); \New{3.18} + +\item[tabular] required in \luatex{} for R |tabular| (it has been + tested only with simple tables, so expect some readjustments in the + future); ignored in \pdftex{} or \xetex{} (which will not support a + similar option in the short term). \New{3.18} + +\item[extras] is used for miscelaneous readjustments which do not fit into + the previous groups. Currently redefines in \luatex{} |\underline| and + |LaTeX2e|. \New{3.19} +\end{description} + +\Describe{\babelsublr}{\marg{lr-text}} + +Digits in \pdftex{} must be marked up explicitly (unlike \luatex{} +with |bidi=basic-r| and, usually, \xetex{}). Mainly for it (although +available in all engines, because it can be useful), this command is +provided to set \marg{lr-text} in L mode. It's intended for what +Unicode calls weak characters, because words are best set with the +corresponding language. For this reason, there is no |rl| counterpart. + +\Describe{\BabelPatchSection}{\marg{section-name}} + +Mainly for bidi text, but it could be useful in other +cases. |\BabelPatchSection| and the corresponding option +|layout=sectioning| takes a more logical approach (at least in many +cases) because it applies the global language to the section format +(including the |\chaptername| in |\chapter|), while the section text +is still the current language. The latter is passed to tocs and marks, +too, and with |sectioning| in |layout| they both reset the “global” +language to the main one, while the text uses the “local” +language + +With |layout=sectioning| all the standard sectioning +commands are redefined, but with this command you can set them +individually if necessary (but note then tocs and marks are not +touched). + +\Describe{\BabelFootnote}{\marg{cmd}\marg{local-language}% + \marg{before}\marg{after}} + +\New{3.17} Something like: +\begin{verbatim} +\BabelFootnote{\parsfootnote}{\languagename}{(}{)} +\end{verbatim} +defines |\parsfootnote| so that |\parsfootnote{note}| is equivalent to: +\begin{verbatim} +\footnote{(\foreignlanguage{\languagename}{note})} +\end{verbatim} +but the footnote itself is typeset in the main language (to unify its +direction). In addition, |\parsfootnotetext| is defined. The option +|footnotes| just does the following: +\begin{verbatim} +\BabelFootnote{\footnote}{\languagename}{}{}% +\BabelFootnote{\localfootnote}{\languagename}{}{}% +\BabelFootnote{\mainfootnote}{}{}{} +\end{verbatim} +(which also redefine |\footnotetext| and define |\localfootnotetext| +and |\mainfootnotetext|). If the language argument is empty, then no +language is selected inside the argument of the footnote. Note this +command is available always in bidi documents, even without +|layout=footnotes|. + +\begin{example} + If you want to preserve directionality in footnotes and there are + many footnotes entirely in English, you can define: +\begin{verbatim} +\BabelFootnote{\enfootnote}{english}{}{.} +\end{verbatim} + It adds a period outside the English part, so that it is placed + at the left in the last line. This means the dot the end of the + footnote text should be omitted. +\end{example} + +\subsection{Language attributes} + +\DescribeMacro{\languageattribute} +This is a user-level command, to be used in the preamble of a +document (after |\usepackage[...]{babel}|), that declares which +attributes are to be used for a given language. It takes two +arguments: the first is the name of the language; the second, +a (list of) attribute(s) to be used. Attributes must be set in the +preamble and only once -- they cannot be turned on and off. +The command checks whether the language is known in this document +and whether the attribute(s) are known for this language. + +Very often, using a \textit{modifier} in a package option is better. + +Several language definition files use their own methods to set +options. For example, \textsf{french} uses |\frenchsetup|, +\textsf{magyar} (1.5) uses |\magyarOptions|; modifiers provided by +|spanish| have no attribute counterparts. Macros settting +options are also used (eg, |\ProsodicMarksOn| in \textsf{latin}). + +\subsection{Hooks} + +\New{3.9a} A hook is a piece of code to be executed at certain +events. Some hooks are predefined when \luatex{} and \xetex{} are +used. + +\Describe\AddBabelHook{\marg{name}\marg{event}\marg{code}} + +The same name can be applied to several events. Hooks may be enabled +and disabled for all defined events with +|\EnableBabelHook|\marg{name}, |\DisableBabelHook|\marg{name}. Names +containing the string |babel| are reserved (they are used, for +example, by |\useshortands*| to add a hook for the event +|afterextras|). + +Current events are the following; in some of them you can use one to +three \TeX{} parameters (|#1|, |#2|, |#3|), with the meaning given: +\begin{description} +\renewcommand\makelabel[1]{% + \hspace\labelsep\normalfont\ttfamily\color{thered}#1} +\itemsep=-\parskip +\item[adddialect] (language name, dialect name) Used by + \file{luababel.def} to load the patterns if not preloaded. +\item[patterns] (language name, language with encoding) Executed just + after the |\language| has been set. The second argument has the + patterns name actually selected (in the form of either |lang:ENC| or + |lang|). +\item[hyphenation] (language name, language with encoding) Executed + locally just before exceptions given in |\babelhyphenation| are + actually set. +\item[defaultcommands] Used (locally) in |\StartBabelCommands|. +\item[encodedcommands] (input, font encodings) Used (locally) in + |\StartBabelCommands|. Both \xetex{} and \luatex{} make sure the + encoded text is read correctly. +\item[stopcommands] Used to reset the the above, if necessary. +\item[write] This event comes just after the switching commands are + written to the |aux| file. +\item[beforeextras] Just before executing |\extras|\m{language}. This + event and the next one should not contain language-dependent code + (for that, add it to |\extras|\m{language}). +\item[afterextras] Just after executing |\extras|\m{language}. For + example, the following deactivates shorthands in all languages: +\begin{verbatim} +\AddBabelHook{noshort}{afterextras}{\languageshorthands{none}} +\end{verbatim} +\item[stringprocess] Instead of a parameter, you can manipulate the + macro |\BabelString| containing the string to be defined with + |\SetString|. For example, to use an expanded version of the string + in the definition, write: +\begin{verbatim} +\AddBabelHook{myhook}{stringprocess}{% + \protected@edef\BabelString{\BabelString}} +\end{verbatim} +\item[initiateactive] (char as active, char as other, original char) + \New{3.9i} Executed just after a shorthand has been `initiated'. The three + parameters are the same character with different catcodes: active, + other (|\string|'ed) and the original one. +\item[afterreset] \New{3.9i} Executed when selecting a language just after + |\originalTeX| is run and reset to its base value, before executing + |\captions|\m{language} and |\date|\m{language}. +\end{description} + +Four events are used in \file{hyphen.cfg}, which are handled in a +quite different way for efficiency reasons -- unlike the precedent +ones, they only have a single hook and replace a default definition. +\begin{description} +\renewcommand\makelabel[1]{% + \hspace\labelsep\normalfont\ttfamily\color{thered}#1} +\itemsep=-\parskip +\item[everylanguage] (language) Executed before every language patterns are loaded. +\item[loadkernel] (file) By default loads |switch.def|. It can be used + to load a different version of this files or to load nothing. +\item[loadpatterns] (patterns file) Loads the patterns file. Used by + \file{luababel.def}. +\item[loadexceptions] (exceptions file) Loads the exceptions + file. Used by \file{luababel.def}. +\end{description} + +\Describe\BabelContentsFiles{} +\New{3.9a} This macro contains a list of ``toc'' types +requiring a command to switch the language. Its default value is +|toc,lof,lot|, but you may redefine it with |\renewcommand| (it's up +to you to make sure no toc type is duplicated). + +\subsection{Languages supported by \babel} + +In the following table most of the languages supported by \babel{} with +and |.ldf| file are listed, together with the names of the option which +you can load \babel\ with for each language. Note this list is open and +the current options may be different. It does not include |ini| files. + +\begin{description} +\itemsep=-\parskip +\sffamily +\item[Afrikaans] afrikaans +\item[Azerbaijani] azerbaijani +\item[Basque] basque +\item[Breton] breton +\item[Bulgarian] bulgarian +\item[Catalan] catalan +\item[Croatian] croatian +\item[Czech] czech +\item[Danish] danish +\item[Dutch] dutch +\item[English] english, USenglish, american, UKenglish, + british, canadian, australian, newzealand +\item[Esperanto] esperanto +\item[Estonian] estonian +\item[Finnish] finnish +\item[French] french, francais, canadien, acadian +\item[Galician] galician +\item[German] austrian, german, germanb, ngerman, naustrian +\item[Greek] greek, polutonikogreek +\item[Hebrew] hebrew +\item[Icelandic] icelandic +\item[Indonesian] bahasa, indonesian, indon, bahasai +\item[Interlingua] interlingua +\item[Irish Gaelic] irish +\item[Italian] italian +\item[Latin] latin +\item[Lower Sorbian] lowersorbian +\item[Malay] bahasam, malay, melayu +\item[North Sami] samin +\item[Norwegian] norsk, nynorsk +\item[Polish] polish +\item[Portuguese] portuges, portuguese, brazilian, brazil +\item[Romanian] romanian +\item[Russian] russian +\item[Scottish Gaelic] scottish +\item[Spanish] spanish +\item[Slovakian] slovak +\item[Slovenian] slovene +\item[Swedish] swedish +\item[Serbian] serbian +\item[Turkish] turkish +\item[Ukrainian] ukrainian +\item[Upper Sorbian] uppersorbian +\item[Welsh] welsh +\end{description} + +There are more languages not listed above, including \textsf{hindi, +thai, thaicjk, latvian, turkmen, magyar, mongolian, romansh, +lithuanian, spanglish, vietnamese, japanese, pinyin, arabic, farsi, +ibygreek, bgreek, serbianc, frenchle, ethiop} and \textsf{friulan}. + +Most of them work out of the box, but some may require extra fonts, +encoding files, a preprocessor or even a complete framework (like +CJK). For example, if you have got the \textsf{velthuis/devnag} package, +you can create a file with extension |.dn|: +\begin{verbatim} +\documentclass{article} +\usepackage[hindi]{babel} +\begin{document} +{\dn devaanaa.m priya.h} +\end{document} +\end{verbatim} +Then you preprocess it with |devnag| \m{file}, which creates +\m{file}|.tex|; you can then typeset the latter with \LaTeX. + +\subsection{Tips, workarounds, know issues and notes} + +\begin{itemize} +\item If you use the document class \cls{book} \emph{and} you use + |\ref| inside the argument of |\chapter| (or just use |\ref| inside + |\MakeUppercase|), \LaTeX\ will keep complaining about an undefined + label. To prevent such problems, you could revert to using + uppercase labels, you can use |\lowercase{\ref{foo}}| inside the + argument of |\chapter|, or, if you will not use shorthands in + labels, set the |safe| option to |none| or |bib|. + +\item\catcode`\|=12\relax Both \textsf{ltxdoc} and \textsf{babel} use + \verb|\AtBeginDocument| to change some catcodes, and babel reloads + \textsf{hhline} to make sure \verb|:| has the right one, so if you + want to change the catcode of \verb/|/ it has to be done using the + same method at the proper place, with +\begin{verbatim} +\AtBeginDocument{\DeleteShortVerb{\|}} +\end{verbatim} + \textit{before} loading babel. This way, when the document begins + the sequence is (1) make \verb/|/ active (\textsf{ltxdoc}); (2) make + it unactive (your settings); (3) make babel shorthands active + (\textsf{babel)}; (4) reload \textsf{hhline} (\textsf{babel}, now + with the correct catcodes for \verb/|/ and + \verb|:|).\catcode`\|=\active + +\item Documents with several input encodings are not frequent, but + sometimes are useful. You can set different encodings for different + languages as the following example shows: +\begin{verbatim} +\addto\extrasfrench{\inputencoding{latin1}} +\addto\extrasrussian{\inputencoding{koi8-r}} +\end{verbatim} + (A recent version of \textsf{inputenc} is required.) + \item For the hyphenation to work correctly, lccodes cannot change, + because \TeX{} only takes into account the values when the + paragraph is hyphenated, i.e., when it has been + finished.\footnote{This explains why \LaTeX{} assumes the lowercase + mapping of T1 and does not provide a tool for multiple + mappings. Unfortunately, \cs{savinghyphcodes} is not a solution + either, because lccodes for hyphenation are frozen in the format + and cannot be changed.} So, if you write a chunk of French text + with |\foreinglanguage|, the apostrophes might not be taken into + account. This is a limitation of \TeX, not of + \babel. Alternatively, you may use |\useshorthands| to activate |'| + and |\defineshorthand|, or redefine |\textquoteright| (the latter + is called by the non-ASCII right quote). +\item \verb|\bibitem| is out of sync with \verb|\selectlanguage| in + the \file{.aux} file. The reason is \verb|\bibitem| uses + \verb|\immediate| (and others, in fact), while + \verb|\selectlanguage| doesn't. There is no known workaround. +\item Babel does not take into account |\normalsfcodes| and + (non-)French spacing is not always properly (un)set by + languages. However, problems are unlikely to happen and therefore + this part remains untouched in version 3.9 (but it is in the `to + do' list). +\item Using a character mathematically active (ie, with math code + |"8000|) as a shorthand can make \TeX{} enter in an infinite loop in + some rare cases. (Another issue in the `to do' list, although there + is a partial solution.) +\end{itemize} + +The following packages can be useful, too (the list is still +far from complete): +\begin{description} +\itemsep=-\parskip +\item[csquotes] Logical markup for quotes. +\item[iflang] Tests correctly the current language. +\item[hyphsubst] Selects a different set of patterns for a language. +\item[translator] An open platform for packages that need to be + localized. +\item[siunitx] Typesetting of numbers and physical quantities. +\item[biblatex] Programmable bibliographies and citations. +\item[bicaption] Bilingual captions. +\item[babelbib] Multilingual bibliographies. +\item[microtype] Adjusts the typesetting according to +some languages (kerning and spacing). Ligatures can be disabled. +\item[substitutefont] Combines fonts in several encodings. +\item[mkpattern] Generates hyphenation patterns. +\item[tracklang] Tracks which languages have been requested. +\end{description} + +\subsection{Current and future work} + +Current work is focused on the so-called complex scripts in \luatex{}. +In 8-bit engines, \babel{} provided a basic support for bidi text as part +of the style for Hebrew, but it is somewhat unsatisfactory and +internally replaces some hardwired commands by other hardwired +commands (generic changes would be much better). + +It is possible now to typeset Arabic or Hebrew with numbers and L +text. Next on the roadmap are line breaking in Thai and the like, +as well as “non-European” digits. Also on the roadmap are R layouts +(lists, footnotes, tables, column order), page and section numbering, +and maybe kashida justification. + +As to Thai line breaking, here is the basic idea of what \luatex{} can +do for us, with the Thai patterns and a little script (the final +version will not be so little, of course). It replaces each +discretionary by the equivalent to ZWJ. + +\begingroup +\catcode`\_=13 \def_{\string_} +\begin{verbatim} +\documentclass{article} + +\usepackage[nil]{babel} + +\babelprovide[import=th, main]{thai} + +\babelfont{rm}{FreeSerif} + +\directlua{ +local GLYF = node.id'glyph' +function insertsp (head) + local size = 0 + for item in node.traverse(head) do + local i = item.id + if i == GLYF then + f = font.getfont(item.font) + size = f.size + elseif i == 7 then + local n = node.new(12, 0) + node.setglue(n, 0, size * 1) % 1 is a factor + node.insert_before(head, item, n) + node.remove(head, item) + end + end +end + +luatexbase.add_to_callback('hyphenate', + function (head, tail) + lang.hyphenate(head) + insertsp(head) + end, 'insertsp') +} + +\begin{document} + +(Thai text.) + +\end{document} +\end{verbatim} +\endgroup + +Useful additions would be, for example, time, currency, addresses and +personal names.\footnote{See for example POSIX, ISO 14652 and the +Unicode Common Locale Data Repository (CLDR). Those system, however, +have limited application to \TeX\ because their aim is just to display +information and not fine typesetting.}. But that is the easy +part, because they don't require modifying the \LaTeX{} internals. + +Also interesting are differences in the sentence structure or related +to it. For example, in Basque the number precedes the name (including +chapters), in Hungarian ``from (1)'' is ``(1)-b\H{o}l'', but ``from +(3)'' is ``(3)-b\'{o}l'', in Spanish an item labelled +``3.$^{\textrm{\scriptsize o}}$'' may be referred to as either +``\'{\i}tem 3.$^{\textrm{\scriptsize o}}$'' or +``3.$^{\textrm{\scriptsize er}}$ \'{\i}tem'', and so on. + +\subsection{Tentative and experimental code} +\label{bidibasic} + +\textbf{Option \texttt{bidi=basic}} + +\New{3.19} With this package option \textit{both} L and R text can be +mixed without explicit markup (the latter will be only necessary in +some special cases where the Unicode algorithm fails). It is used much +like |bidi=basic-r|, but with R text inside L text you may want to map +the font so that the correct features are in force. This is accomplised +with an option in |\babelprovide|, as illustrated: + \begingroup +% If you are looking at the code to see how it has been written, you +% will be disappointed :-). The following example is built ad hoc to +% emulate the final result to avoid dependencies, and therefore it's +% not "real" code. +\setmonofont[Scale=.87,Script=Arabic]{DejaVu Sans Mono} \catcode`@=13 +\def@#1{\ifcase#1\relax \egroup \or \bgroup\textdir TRT \else +\bgroup\textdir TLT \pardir TLT \fi} +\begin{verbatim} +\documentclass{book} + +\usepackage[english, _bidi=basic_]{babel} + +\babelprovide[_mapfont=direction_]{arabic} + +\babelfont{rm}{Crimson} +\babelfont[*arabic]{rm}{FreeSerif} + +\begin{document} + +Most Arabic speakers consider the two varieties to be two registers +of one language, although the two registers can be referred to in +Arabic as @1فصحى العصر@0 \textit{fuṣḥā l-ʻaṣr} (MSA) and +@1فصحى التراث@0 \textit{fuṣḥā t-turāth} (CA). + +\end{document} +\end{verbatim} +\endgroup +What |mapfont=direction| means is, ‘when a character has the same +direction as the script for the “provided” language (|arabic| in this +case), then change its font to that set for this language (here defined +indirectly via |*arabic|)’. + +There is a sample on GitHub, under \texttt{/required/babel/samples}. + +\medskip +\textbf{Old stuff} + +A couple of tentative macros were provided by \babel{} ($\ge$3.9g) with +a partial solution for ``Unicode'' fonts. These macros are now +deprecated --- use |\babelfont|. A short description follows, for +refere +\begin{itemize} +\item |\babelFSstore|\marg{babel-language} sets the current three + basic families (rm, sf, tt) as the default for the language + given. +\item |\babelFSdefault|\marg{babel-language}\marg{fontspec-features} + patches |\fontspec| so that the given features are always passed as + the optional argument or added to it (not an ideal solution). +\end{itemize} +So, for example: +\begin{verbatim} +\setmainfont[Language=Turkish]{Minion Pro} +\babelFSstore{turkish} +\setmainfont{Minion Pro} +\babelFSfeatures{turkish}{Language=Turkish} +\end{verbatim} + +\medskip +\textbf{Bidi writing} in \luatex{} is under development, but a basic +implementation is almost finished. On the other hand, in \xetex{} it is +taking its first steps. The latter engine poses quite different +challenges. An option to manage document layout in \luatex{} (lists, +footnotes, etc.) is almost finished, but \xetex{} required more work. + +See the code section for |\foreignlanguage*| (a new starred version of +|\foreignlanguage|). + +\xetex{} relies on the font to properly handle these unmarked changes, +so it is not under the control of \TeX. + +\section{Loading languages with \file{language.dat}} + +\TeX{} and most engines based on it (pdf\TeX, \xetex, $\epsilon$-\TeX, +the main exception being \luatex) require hyphenation patterns to be +preloaded when a format is created (eg, \LaTeX, Xe\LaTeX, +pdf\LaTeX). \babel{} provides a tool which has become standand in many +distributions and based on a ``configuration file'' named +\file{language.dat}. The exact way this file is used depends on the +distribution, so please, read the documentation for the latter (note +also some distributions generate the file with some tool). + +\New{3.9q} With \luatex, however, patterns are loaded on the fly when +requested by the language (except the ``0th'' language, typically +\textsf{english}, which is preloaded always).\footnote{This feature +was added to 3.9o, but it was buggy. Both 3.9o and 3.9p are +deprecated.} Until 3.9n, this task was delegated to the package +\textsf{luatex-hyphen}, by Khaled Hosny, \'Elie Roux, and Manuel +P\'egouri\'e-Gonnard, and required an extra file named +|language.dat.lua|, but now a new mechanism has been devised based +solely on |language.dat|. \textbf{You must rebuild the formats} if +upgrading from a previous version. You may want to have a local +|language.dat| for a particular project (for example, a book on +Chemistry).\footnote{The loader for lua(e)tex is slightly different as +it's not based on \babel{} but on \texttt{etex.src}. Until 3.9p it +just didn't work, but thanks to the new code it works by reloading the +data in the \babel{} way, i.e., with \texttt{language.dat}.} + +\subsection{Format} + +In that file the person who maintains a \TeX\ environment has to record +for which languages he has hyphenation patterns \emph{and} in which +files these are stored\footnote{This is because different operating +systems sometimes use \emph{very} different file-naming +conventions.}. When hyphenation exceptions are stored in a separate +file this can be indicated by naming that file \emph{after} the file +with the hyphenation patterns. + +The file can contain empty lines and comments, as well as lines which +start with an equals (\texttt{=}) sign. Such a line will instruct +\LaTeX\ that the hyphenation patterns just processed have to be known +under an alternative name. Here is an example: +\begin{verbatim} +% File : language.dat +% Purpose : tell iniTeX what files with patterns to load. +english english.hyphenations +=british + +dutch hyphen.dutch exceptions.dutch % Nederlands +german hyphen.ger +\end{verbatim} + +You may also set the font encoding the patterns are intended for by +following the language name by a colon and the encoding +code.\footnote{This in not a new feature, but in former versions it +didn't work correctly.} For example: +\begin{verbatim} +german:T1 hyphenT1.ger +german hyphen.ger +\end{verbatim} +With the previous settings, if the enconding when the language is +selected is |T1| then the patterns in \file{hyphenT1.ger} are +used, but otherwise use those in \file{hyphen.ger} (note the encoding +could be set in |\extras|\m{lang}). + +A typical error when using \babel{} is the following: +\begin{verbatim} +No hyphenation patterns were preloaded for +the language `<lang>' into the format. +Please, configure your TeX system to add them and +rebuild the format. Now I will use the patterns +preloaded for english instead}} +\end{verbatim} +It simply means you must reconfigure \file{language.dat}, either by +hand or with the tools provided by your distribution. + +\section{The interface between the core of \babel{} and the language +definition files} + +The \textit{language definition files} (ldf) must conform to a +number of conventions, because these files have to fill in the gaps +left by the common code in \file{babel.def}, i.\,e., the +definitions of the macros that produce texts. Also the +language-switching possibility which has been built into the +\babel{} system has its implications. + +The following assumptions are made: +\begin{itemize} +\item Some of the language-specific definitions might be used by plain + \TeX\ users, so the files have to be coded so that they can be read + by both \LaTeX\ and plain \TeX. The current format can be checked by + looking at the value of the macro |\fmtname|. +\item The common part of the \babel{} system redefines a number of + macros and environments (defined previously in the document style) + to put in the names of macros that replace the previously hard-wired + texts. These macros have to be defined in the language definition + files. +\item The language definition files must define five macros, used to + activate and deactivate the language-specific definitions. These + macros are |\|\langvar|hyphenmins|, |\captions|\langvar, + |\date|\langvar, |\extras|\langvar\ and |\noextras|\langvar (the + last two may be left empty); where \langvar\ is either the name of + the language definition file or the name of the \LaTeX\ option that + is to be used. These macros and their functions are discussed + below. You must define all or none for a language (or a dialect); + defining, say, |\date|\langvar\ but not |\captions|\langvar\ does + not raise an error but can lead to unexpected results. +\item When a language definition file is loaded, it can define + |\l@|\langvar\ to be a dialect of |\language0| when |\l@|\langvar\ + is undefined. +\item Language names must be all lowercase. If an unknow language is + selected, \babel{} will attempt setting it after lowercasing its + name. +\item The semantics of modifiers is not defined (on purpose). In + most cases, they will just be simple separated options (eg, + \texttt{spanish}), but a language might require, say, a set of + options organized as a tree with suboptions (in such a case, the + recommended separator is \verb|/|). +\end{itemize} + +Some recommendations: +\begin{itemize} +\item The preferred shorthand is |"|, which is not used in \LaTeX{} + (quotes are entered as |``| and |''|). Other good choices are + characters which are not used in a certain context (eg, |=| in an + ancient language). Note however |=|, |<|, |>|, |:| and the like + can be dangerous, because they may be used as part of the syntax + of some elements (numeric expressions, key/value pairs, etc.). +\item Captions should not contain shorthands or encoding dependent + commands (the latter is not always possible, but should be clearly + documented). They should be defined using the LICR. You may + also use the new tools for encoded strings, described below. +\item Avoid adding things to |\noextras|\m{lang} except for umlauthigh + and friends, |\bbl@deactivate|, |\bbl@(non)frenchspacing|, and + language specific macros. Use always, if possible, |\bbl@save| and + |\bbl@savevariable| (except if you still want to have access to the + previous value). Do not reset a macro or a setting to a hardcoded + value. Never. Instead save its value in |\extras|\m{lang}. +\item Do not switch scripts. If you want to make sure a set of glyphs + is used, switch either the font encoding (low level) or the language + (high level, which in turn may switch the font encoding). Usage of things + like |\latintext| is deprecated.\footnote{But not removed, for backward + compatibility.} +\item Please, for ``private'' internal macros do not use the |\bbl@| + prefix. It is used by \babel{} and it can lead to incompatibilities. +\end{itemize} + +There are no special requirements for documenting your language +files. Now they are not included in the base \babel{} manual, so +provide a standalone document suited for your needs, as well as other +files you think can be useful. A PDF and a ``readme'' are strongly +recommended. + +\subsection{Guidelines for contributed languages} +\label{contribute} + +Now language files are “outsourced” and are located in a separate +directory (\texttt{/macros/latex/contrib/babel-contrib}), so that they +are contributed directly to CTAN (please, do not send to me language +styles just to upload them to CTAN). + +Of course, placing your style files in this directory is not mandatory, +but if you want to do it, here are a few guidelines. + +\begin{itemize} +\item Do not hesitate stating on the file heads you are the author and the + maintainer, if you actually are. There is no need to state the babel + maintainer(s) as authors if they have not contributed significantly + to your language files. +\item Fonts are not strictly part of a language, so they are best placed + in the corresponding TeX tree. This includes not only \texttt{tfm}, \texttt{vf}, \texttt{ps1}, + \texttt{otf}, \texttt{mf} files and the like, but also \texttt{fd} ones. +\item Font and input encodings are usually best placed in the + corresponding tree, too, but sometimes they belong more naturally to + the babel style. Note you may also need to define a LICR. +\item \Babel{} ldf files may just interface a framework, as it happens often + with Oriental languages/scripts. This framework is best placed in its + own directory. +\end{itemize} + +The following page provides a starting point: +\texttt{http://www.texnia.com/incubator.html}. + +If your need further assistance and technical advice in the +development of language styles, I am willing to help you. And of +course, you can make any suggestion you like. + +\subsection{Basic macros} + +In the core of the \babel{} system, several macros are defined for use +in language definition files. Their purpose is to make a new language +known. The first two are related to hyphenation patterns. + +\DescribeMacro{\addlanguage} +The macro |\addlanguage| is a non-outer version of the macro +|\newlanguage|, defined in \file{plain.tex} version~3.x. For older +versions of \file{plain.tex} and \file{lplain.tex} a substitute +definition is used. Here ``language'' is used in the \TeX{} sense of +set of hyphenation patterns. + +\DescribeMacro{\adddialect} +The macro |\adddialect| can be used when two languages can (or +must) use the same hyphenation patterns. This can also be useful +for languages for which no patterns are preloaded in the +format. In such cases the default behavior of the \babel{} +system is to define this language as a `dialect' of the language +for which the patterns were loaded as |\language0|. Here +``language'' is used in the \TeX{} sense of set of hyphenation +patterns. + +\DescribeMacro{\<lang>hyphenmins} +The macro |\|\langvar|hyphenmins| is used to store the values of +the |\lefthyphenmin| and |\righthyphenmin|. Redefine this macro +to set your own values, with two numbers corresponding to these +two parameters. For example: +\begin{verbatim} +\renewcommand\spanishhyphenmins{34} +\end{verbatim} +(Assigning |\lefthyphenmin| and |\righthyphenmin| directly in +|\extras<lang>| has no effect.) + +\DescribeMacro{\providehyphenmins} +The macro |\providehyphenmins| should be used in the language +definition files to set |\lefthyphenmin| and +|\righthyphenmin|. This macro will check whether these parameters +were provided by the hyphenation file before it takes any action. +If these values have been already set, this command is ignored +(currenty, default pattern files do \textit{not} set them). + +\DescribeMacro{\captions\langvar} +The macro |\captions|\langvar\ defines the macros that +hold the texts to replace the original hard-wired texts. + +\DescribeMacro{\date\langvar} +The macro |\date|\langvar\ defines |\today|. + +\DescribeMacro{\extras\langvar} +The macro |\extras|\langvar\ contains all the extra definitions needed +for a specific language. This macro, like the following, is a hook -- +you can add things to it, but it must not be used directly. + +\DescribeMacro{\noextras\langvar} +Because we want to let the user switch +between languages, but we do not know what state \TeX\ might be in +after the execution of |\extras|\langvar, a macro that brings +\TeX\ into a predefined state is needed. It will be no surprise +that the name of this macro is |\noextras|\langvar. + +\DescribeMacro{\bbl@declare@ttribute} +This is a command to be used in the language definition files for +declaring a language attribute. It takes three arguments: the +name of the language, the attribute to be defined, and the code +to be executed when the attribute is to be used. + +\DescribeMacro{\main@language} +To postpone the activation of the definitions needed for a +language until the beginning of a document, all language +definition files should use |\main@language| instead of +|\selectlanguage|. This will just store the name of the language, +and the proper language will be activated at the start of the +document. + +\DescribeMacro{\ProvidesLanguage} +The macro |\ProvidesLanguage| should be used to identify the +language definition files. Its syntax is similar to the syntax +of the \LaTeX\ command |\ProvidesPackage|. + +\DescribeMacro{\LdfInit} +The macro |\LdfInit| performs a couple of standard checks that +must be made at the beginning of a language definition file, +such as checking the category code of the @-sign, preventing +the \file{.ldf} file from being processed twice, etc. + +\DescribeMacro{\ldf@quit} +The macro |\ldf@quit| does work needed +if a \file{.ldf} file was processed +earlier. This includes resetting the category code +of the @-sign, preparing the language to be activated at +|\begin{document}| time, and ending the input stream. + +\DescribeMacro{\ldf@finish} +The macro |\ldf@finish| does work needed +at the end of each \file{.ldf} file. This +includes resetting the category code of the @-sign, +loading a local configuration file, and preparing the language +to be activated at |\begin{document}| time. + +\DescribeMacro{\loadlocalcfg} +After processing a language definition file, +\LaTeX\ can be instructed to load a local configuration +file. This file can, for instance, be used to add strings to +|\captions|\langvar\ to support local document +classes. The user will be informed that this +configuration file has been loaded. This macro is called by +|\ldf@finish|. + +\DescribeMacro{\substitutefontfamily} +(Deprecated.) This command takes three arguments, a font encoding and +two font family names. It creates a font description file for the +first font in the given encoding. This \file{.fd} file will instruct +\LaTeX\ to use a font from the second family when a font from the +first family in the given encoding seems to be needed. + +\subsection{Skeleton} + +Here is the basic structure of an |ldf| file, with a language, a +dialect and an attribute. Strings are best defined using the method +explained in in sec. \ref{s:strings} (\babel{} 3.9 and later). + +\begin{verbatim} +\ProvidesLanguage{<language>} + [2016/04/23 v0.0 <Language> support from the babel system] +\LdfInit{<language>}{captions<language>} + +\ifx\undefined\l@<language> + \@nopatterns{<Language>} + \adddialect\l@<language>0 +\fi + +\adddialect\l@<dialect>\l@<language> + +\bbl@declare@ttribute{<language>}{<attrib>}{% + \expandafter\addto\expandafter\extras<language> + \expandafter{\extras<attrib><language>}% + \let\captions<language>\captions<attrib><language>} + +\providehyphenmins{<language>}{\tw@\thr@@} + +\StartBabelCommands*{<language>}{captions} +\SetString\chaptername{<chapter name>} +% More strings + +\StartBabelCommands*{<language>}{date} +\SetString\monthiname{<name of first month>} +% More strings + +\StartBabelCommands*{<dialect>}{captions} +\SetString\chaptername{<chapter name>} +% More strings + +\StartBabelCommands*{<dialect>}{date} +\SetString\monthiname{<name of first month>} +% More strings + +\EndBabelCommands + +\addto\extras<language>{} +\addto\noextras<language>{} +\let\extras<dialect>\extras<language> +\let\noextras<dialect>\noextras<language> + +\ldf@finish{<language>} +\end{verbatim} + +\subsection{Support for active characters} + +In quite a number of language definition files, active characters are +introduced. To facilitate this, some support macros are provided. + +\DescribeMacro{\initiate@active@char} +The internal macro |\initiate@active@char| is used in language +definition files to instruct \LaTeX\ to give a character the category +code `active'. When a character has been made active it will remain +that way until the end of the document. Its definition may vary. + +\DescribeMacro{\bbl@activate} +\DescribeMacro{\bbl@deactivate} +The command |\bbl@activate| is used to change the way an active +character expands. |\bbl@activate| `switches on' the active behavior +of the character. |\bbl@deactivate| lets the active character expand +to its former (mostly) non-active self. + +\DescribeMacro{\declare@shorthand} +The macro |\declare@shorthand| is used to define the various +shorthands. It takes three arguments: the name for the collection of +shorthands this definition belongs to; the character (sequence) that +makes up the shorthand, i.e.\ |~| or |"a|; and the code to be executed +when the shorthand is encountered. (It does \textit{not} raise an +error if the shorthand character has not been ``initiated''.) + +\DescribeMacro{\bbl@add@special} +\DescribeMacro{\bbl@remove@special} +The \TeX book states: ``Plain \TeX\ includes a macro called +|\dospecials| that is essentially a set macro, representing the set of +all characters that have a special category code.'' \cite[p.~380]{DEK} +It is used to set text `verbatim'. To make this work if more +characters get a special category code, you have to add this character +to the macro |\dospecial|. \LaTeX\ adds another macro called +|\@sanitize| representing the same character set, but without the +curly braces. The macros |\bbl@add@special|\meta{char} and +|\bbl@remove@special|\meta{char} add and remove the character +\meta{char} to these two sets. + +\subsection{Support for saving macro definitions} + +Language definition files may want to \emph{re}define macros that +already exist. Therefore a mechanism for saving (and restoring) the +original definition of those macros is provided. We provide two macros +for this\footnote{This mechanism was introduced by Bernd Raichle.}. + +\DescribeMacro{\babel@save} +To save the current meaning of any control sequence, the macro +|\babel@save| is provided. It takes one argument, \meta{csname}, the +control sequence for which the meaning has to be saved. + +\DescribeMacro{\babel@savevariable} +A second macro is provided to save the current value of a variable. +In this context, anything that is allowed after the |\the| primitive +is considered to be a variable. The macro takes one argument, the +\meta{variable}. + +The effect of the preceding macros is to append a piece of code to +the current definition of |\originalTeX|. When |\originalTeX| is +expanded, this code restores the previous definition of the control +sequence or the previous value of the variable. + +\subsection{Support for extending macros} + +\DescribeMacro{\addto} +The macro |\addto{|\meta{control sequence}|}{|\meta{\TeX\ code}|}| can +be used to extend the definition of a macro. The macro need not be +defined (ie, it can be undefined or |\relax|). This macro can, for +instance, be used in adding instructions to a macro like +|\extrasenglish|. + +Be careful when using this macro, because depending on the case the +assignment could be either global (usually) or local (sometimes). That +does not seem very consistent, but this behavior is preserved for +backward compatibility. If you are using \pkg{etoolbox}, by Philipp +Lehman, consider using the tools provided by this package instead of +|\addto|. + +\subsection{Macros common to a number of languages} + +\DescribeMacro{\bbl@allowhyphens} +In several languages compound words are used. This means that when +\TeX\ has to hyphenate such a compound word, it only does so at the +`\texttt{-}' that is used in such words. To allow hyphenation in the +rest of such a compound word, the macro |\bbl@allowhyphens| can be +used. + +\DescribeMacro{\allowhyphens} +Same as |\bbl@allowhyphens|, but does nothing if the encoding is +|T1|. It is intended mainly for characters provided as real glyphs by +this encoding but constructed with |\accent| in |OT1|. + +Note the previous command (|\bbl@allowhyphens|) has different +applications (hyphens and discretionaries) than this one (composite +chars). Note also prior to version 3.7, |\allowhyphens| had the +behavior of |\bbl@allowhyphens|. + +\DescribeMacro{\set@low@box} +For some languages, quotes need to be lowered to the baseline. For +this purpose the macro |\set@low@box| is available. It takes one +argument and puts that argument in an |\hbox|, at the baseline. The +result is available in |\box0| for further processing. + +\DescribeMacro{\save@sf@q} +Sometimes it is necessary to preserve the |\spacefactor|. For this +purpose the macro |\save@sf@q| is available. It takes one argument, +saves the current spacefactor, executes the argument, and restores the +spacefactor. + +\DescribeMacro{\bbl@frenchspacing} +\DescribeMacro{\bbl@nonfrenchspacing} +The commands |\bbl@frenchspacing| and |\bbl@nonfrenchspacing| can be +used to properly switch French spacing on and off. + +\subsection{Encoding-dependent strings} +\label{s:strings} + +\New{3.9a} Babel 3.9 provides a way of defining strings in several +encodings, intended mainly for \luatex{} and \xetex. This is the only new +feature requiring changes in language files if you want to make use of +it. + +Furthermore, it must be activated explicitly, with the package option +|strings|. If there is no |strings|, these blocks are ignored, except +|\SetCase|s (and except if forced as described below). In other words, +the old way of defining/switching strings still works and it's used by +default. + +It consist is a series of blocks started with +|\StartBabelCommands|. The last block is closed with +|\EndBabelCommands|. Each block is a single group (ie, local +declarations apply until the next |\StartBabelCommands| or +|\EndBabelCommands|). An |ldf| may contain several series of this +kind. + +Thanks to this new feature, string values and string language +switching are not mixed any more. No need of |\addto|. If the language +is |french|, just redefine |\frenchchaptername|. + +\Describe\StartBabelCommands + {\marg{language-list}\marg{category}\oarg{selector}} + +The \m{language-list} specifies which languages the block is +intended for. A block is taken into account only if the +|\CurrentOption| is listed here. Alternatively, you can define +|\BabelLanguages| to a comma-separated list of languages to be +defined (if undefined, |\StartBabelCommands| sets it to +|\CurrentOption|). You may write |\CurrentOption| as the language, +but this is discouraged -- a explicit name (or names) is much better +and clearer. + +A ``selector'' is a name to be used as value in package option +|strings|, optionally followed by extra info about the encodings to be +used. The name |unicode| must be used for \xetex{} and \luatex{} (the +key |strings| has also other two special values: |generic| and +|encoded|). + +If a string is set several times (because several blocks are read), +the first one take precedence (ie, it works much like +|\providecommand|). + +Encoding info is |charset=| followed by a charset, which if given sets +how the strings should be traslated to the internal representation +used by the engine, typically |utf8|, which is the only value +supported currently (default is no traslations). Note |charset| is +applied by \luatex{} and \xetex{} when reading the file, not when the +macro or string is used in the document. + +A list of font encodings which the strings are expected to work with +can be given after |fontenc=| (separated with spaces, if two or more) -- +recommended, but not mandatory, although blocks without this key are +not taken into account if you have requested |strings=encoded|. + +Blocks without a selector are read always if the key |strings| has +been used. They provide fallback values, and therefore must be the +last blocks; they should be provided always if possible and all +strings should be defined somehow inside it; they can be the only +blocks (mainly LGC scripts using the LICR). Blocks without a selector +can be activated explicitly with |strings=generic| (no block is taken +into account except those). With |strings=encoded|, strings in those +blocks are set as default (internally, |?|). With |strings=encoded| +strings are protected, but they are correctly expanded in +|\MakeUppercase| and the like. If there is no key |strings|, string +definitions are ignored, but |\SetCase|s are still honoured (in a +|encoded| way). + +The \m{category} is either |captions|, |date| or |extras|. You must +stick to these three categories, even if no error is raised when using +other name.\footnote{In future releases further categories may be +added.\nb{like `monetary', `time', `address', `name', `case' or +`numeric'}} It may be empty, too, but in such a case using +|\SetString| is an error (but not |\SetCase|). + +\begin{verbatim} +\StartBabelCommands{language}{captions} + [unicode, fontenc=TU EU1 EU2, charset=utf8] +\SetString{\chaptername}{utf8-string} + +\StartBabelCommands{language}{captions} +\SetString{\chaptername}{ascii-maybe-LICR-string} + +\EndBabelCommands +\end{verbatim} + +A real example is: +\begin{verbatim} +\StartBabelCommands{austrian}{date} + [unicode, fontenc=TU EU1 EU2, charset=utf8] + \SetString\monthiname{Jänner} + +\StartBabelCommands{german,austrian}{date} + [unicode, fontenc=TU EU1 EU2, charset=utf8] + \SetString\monthiiiname{März} + +\StartBabelCommands{austrian}{date} + \SetString\monthiname{J\"{a}nner} + +\StartBabelCommands{german}{date} + \SetString\monthiname{Januar} + +\StartBabelCommands{german,austrian}{date} + \SetString\monthiiname{Februar} + \SetString\monthiiiname{M\"{a}rz} + \SetString\monthivname{April} + \SetString\monthvname{Mai} + \SetString\monthviname{Juni} + \SetString\monthviiname{Juli} + \SetString\monthviiiname{August} + \SetString\monthixname{September} + \SetString\monthxname{Oktober} + \SetString\monthxiname{November} + \SetString\monthxiiname{Dezenber} + \SetString\today{\number\day.~% + \csname month\romannumeral\month name\endcsname\space + \number\year} + +\StartBabelCommands{german,austrian}{captions} + \SetString\prefacename{Vorwort} + [etc.] + +\EndBabelCommands +\end{verbatim} + +When used in |ldf| files, previous values of |\|\m{category}\m{language} +are overriden, which means the old way to define strings still works +and used by default (to be precise, is first set to undefined and then +strings are added). However, when used in the preamble or in a +package, new settings are added to the previous ones, if the language +exists (in the \babel{} sense, ie, if |\date|\m{language} exists). + +\Describe\StartBabelCommands{% + \colorbox{thegrey}{\ttfamily\hskip-.2em*\hskip-.2em}% + \marg{language-list}\marg{category}\oarg{selector}} +The starred version just forces |strings| to take a value -- if not set +as package option, then the default for the engine is used. This is +not done by default to prevent backward incompatibilities, but if you +are creating a new language this version is better. It's up to +the maintainers of the current languages to decide if using it is +appropiate.\footnote{This replaces in 3.9g a short-lived +\texttt{\string\UseStrings} which has been removed because it did +not work.} + +\Describe\EndBabelCommands{} +Marks the end of the series of blocks. + +\Describe\AfterBabelCommands{\marg{code}} +The code is delayed and executed at the global scope just after |\EndBabelCommands|. + +\Describe\SetString{\marg{macro-name}\marg{string}} +Adds \meta{macro-name} to the current category, and defines globally +\meta{lang-macro-name} to \meta{code} (after applying the +transformation corresponding to the current charset or defined with +the hook |stringprocess|). + +Use this command to define strings, without including any ``logic'' if +possible, which should be a separated macro. See the example above for +the date. + +\Describe\SetStringLoop{\marg{macro-name}\marg{string-list}} +A convenient way to define several ordered names at once. For example, +to define |\abmoniname|, |\abmoniiname|, etc. (and similarly with +|abday|): +\begin{verbatim} +\SetStringLoop{abmon#1name}{en,fb,mr,ab,my,jn,jl,ag,sp,oc,nv,dc} +\SetStringLoop{abday#1name}{lu,ma,mi,ju,vi,sa,do} +\end{verbatim} +|#1| is replaced by the roman numeral. + +\Describe\SetCase{\oarg{map-list}\marg{toupper-code}\marg{tolower-code}} +Sets globally code to be executed at |\MakeUppercase| and +|\MakeLowercase|. The code would be typically things like |\let\BB\bb| +and |\uccode| or |\lccode| (although for the reasons explained above, +changes in lc/uc codes may not work). A \meta{map-list} is a series of +macros using the internal format of |\@uclclist| (eg, +|\bb\BB\cc\CC|). The mandatory arguments take precedence over the +optional one. This command, unlike |\SetString|, is executed always +(even without |strings|), and it is intented for minor readjustments +only. + +For example, as |T1| is the default case mapping in \LaTeX, we could +set for Turkish: +\begin{verbatim} +\StartBabelCommands{turkish}{}[ot1enc, fontenc=OT1] +\SetCase + {\uccode"10=`I\relax} + {\lccode`I="10\relax} + +\StartBabelCommands{turkish}{}[unicode, fontenc=TU EU1 EU2, charset=utf8] +\SetCase + {\uccode`i=`İ\relax + \uccode`ı=`I\relax} + {\lccode`İ=`i\relax + \lccode`I=`ı\relax} + +\StartBabelCommands{turkish}{} +\SetCase + {\uccode`i="9D\relax + \uccode"19=`I\relax} + {\lccode"9D=`i\relax + \lccode`I="19\relax} + +\EndBabelCommands +\end{verbatim} +(Note the mapping for |OT1| is not complete.) + +\Describe\SetHyphenMap{\marg{to-lower-macros}} +\New{3.9g} Case mapping serves in \TeX{} for two unrelated purposes: case +transforms (upper/lower) and hyphenation. |\SetCase| handles the +former, while hyphenation is handled by |\SetHyphenMap| and controlled +with the package option |hyphenmap|. So, even if internally they are based +on the same \TeX{} primitive (|\lccode|), \babel{} sets them separately. + +There are three helper macros to +be used inside |\SetHyphenMap|: +\begin{itemize} +\item |\BabelLower|\marg{uccode}\marg{lccode} is + similar to |\lccode| but it's ignored if the char has been set and + saves the original lccode to restore it when switching the language + (except with |hyphenmap=first|). +\item |\BabelLowerMM|\marg{uccode-from}\marg{uccode-to}% + \marg{step}\marg{lccode-from} loops though the given uppercase + codes, using the step, and assigns them the lccode, which is also + increased (|MM| stands for \textit{many-to-many}). +\item |\BabelLowerMO|\marg{uccode-from}\marg{uccode-to}% + \marg{step}\marg{lccode} loops though the given uppercase + codes, using the step, and assigns them the lccode, which is fixed + (|MO| stands for \textit{many-to-one}). +\end{itemize} +An example is (which is redundant, because these assignments are done +by both \luatex{} and \xetex{}): +\begin{verbatim} +\SetHyphenMap{\BabelLowerMM{"100}{"11F}{2}{"101}} +\end{verbatim} + +This macro is not intended to fix wrong mappings done by Unicode +(which are the default in both \xetex{} and \luatex{}) -- if an +assignment is wrong, fix it directly. + +\section{Changes} + +\subsection{Changes in \babel\ version 3.9} + +Most of changes in version 3.9 are related to bugs, either to fix them +(there were lots), or to provide some alternatives. Even new features +like |\babelhyphen| are intended to solve a certain problem (in this +case, the lacking of a uniform syntax and behavior for shorthands +across languages). These changes are described in this manual in the +corresponding place. A selective list follows: +\begin{itemize} +\item |\select@language| did not set |\languagename|. This meant the + language in force when auxiliary files were loaded was the one used + in, for example, shorthands -- if the language was |german|, a + |\select@language{spanish}| had no effect. + +\item |\foreignlanguage| and |otherlanguage*| messed up + |\extras<language>|. Scripts, encodings and many other things were + not switched correctly. + +\item The |:ENC| mechanism for hyphenation patterns used the encoding + of the \textit{previous} language, not that of the language being + selected. + +\item |'| (with |activeacute|) had the original value when writing to an + auxiliary file, and things like an infinite loop could happen. It + worked incorrectly with |^| (if activated) and also if deactivated. + +\item Active chars where not reset at the end of language options, and + that lead to incompatibilities between languages. + +\item |\textormath| raised and error with a conditional. + +\item |\aliasshorthand| didn't work (or only in a few and very specific + cases). + +\item |\l@english| was defined incorrectly (using |\let| instead of + |\chardef|). + +\item |ldf| files not bundled with babel were not recognized when + called as global options. +\end{itemize} + +\subsection{Changes in \babel\ version 3.7} + +In \babel\ version 3.7 a number of bugs that were found in +version~3.6 are fixed. Also a number of changes and additions +have occurred: +\begin{itemize} +\item Shorthands are expandable again. The disadvantage is that + one has to type |'{}a| when the acute accent is used as a + shorthand character. The advantage is that a number of other + problems (such as the breaking of ligatures, etc.) have + vanished. +\item Two new commands, |\shorthandon| and |\shorthandoff| have + been introduced to enable to temporarily switch off one or more + shorthands. +\item Support for typesetting Hebrew (and potential support for + typesetting other right-to-left written languages) is now + available thanks to Rama Porrat and Boris Lavva. +\item A language attribute has been added to the |\mark...| + commands in order to make sure that a Greek header line comes + out right on the last page before a language switch. +\item Hyphenation pattern files are now read \emph{inside a + group}; therefore any changes a pattern file needs to make to + lowercase codes, uppercase codes, and category codes are kept + local to that group. If they are needed for the language, these + changes will need to be repeated and stored in |\extras...| +\item The concept of language attributes is introduced. It is intended + to give the user some control over the features a + language-definition file provides. Its first use is for the Greek + language, where the user can choose the πολυτονικό (``polytonikó'' or + multi-accented) Greek way of typesetting texts. +\item The environment \Lenv{hyphenrules} is introduced. +\item The syntax of the file \file{language.dat} has been + extended to allow (optionally) specifying the font + encoding to be used while processing the patterns file. +\item The command |\providehyphenmins| should now be used in + language definition files in order to be able to keep any + settings provided by the pattern file. +\end{itemize} + +\DocInput{babel.dtx} + +\section{Acknowledgements} + +I would like to thank all who volunteered as $\beta$-testers for their +time. Michel Goossens supplied contributions for most of the other +languages. Nico Poppelier helped polish the text of the documentation +and supplied parts of the macros for the Dutch language. Paul Wackers +and Werenfried Spit helped find and repair bugs. + +During the further development of the babel system I received much +help from Bernd Raichle, for which I am grateful. + +\begin{thebibliography}{9} + \bibitem{AT} Huda Smitshuijzen Abifares, \textit{Arabic Typography}, + Saqi, 2001. + \bibitem{DEK} Donald E. Knuth, + \emph{The \TeX book}, Addison-Wesley, 1986. + \bibitem{LLbook} Leslie Lamport, + \emph{\LaTeX, A document preparation System}, Addison-Wesley, + 1986. + \bibitem{treebus} K.F. Treebus. + \emph{Tekstwijzer, een gids voor het grafisch verwerken van + tekst.} + SDU Uitgeverij ('s-Gravenhage, 1988). + \bibitem{HP} Hubert Partl, + \emph{German \TeX}, \emph{TUGboat} 9 (1988) \#1, p.~70--72. + \bibitem{LLth} Leslie Lamport, + in: \TeX hax Digest, Volume 89, \#13, 17 February 1989. + \bibitem{BEP} Johannes Braams, Victor Eijkhout and Nico Poppelier, + \emph{The development of national \LaTeX\ styles}, + \emph{TUGboat} 10 (1989) \#3, p.~401--406. + \bibitem{FE} Yannis Haralambous, + \emph{Fonts \& Encodings}, O'Reilly, 2007. + \bibitem{ilatex} Joachim Schrod, + \emph{International \LaTeX\ is ready to use}, + \emph{TUGboat} 11 (1990) \#1, p.~87--90. + \bibitem{STS} Apostolos Syropoulos, Antonis Tsolomitis and Nick + Sofroniu, + \emph{Digital typography using \LaTeX}, + Springer, 2002, p.~301--373. +\end{thebibliography} +\end{document} +%</filedriver> +% +% \fi +% +% \changes{babel~3.8e}{2005/03/24}{Many enhancements to the text by +% Andrew Young} +% \changes{babel~3.9c}{2013/04/04}{Added the ``modifiers'' mechanism} +% \changes{babel~3.9g}{2013/06/01}{bbplain merged} +% \changes{babel~3.9k}{2014/03/23}{Code and doc reorganized, and some +% minor enhancements} +% +%\begingroup +% \catcode`<=\active% +% \catcode`>=\active +% \makeatletter +% \gdef\MakePrivateLetters{% +% \catcode`@=11\relax +% \gdef<##1{\ifx##1@$\langle\langle$\bgroup\itshape\rmfamily +% \expandafter\bblref +% \else\string<##1\fi}% +% \gdef\bblref##1@>{##1\/\egroup$\rangle\rangle$}}% +% \global\let\check@percent\saved@check@percent +%\endgroup +% +% \part{The code} +% +% \babel{} is being developed incrementally, which means parts of the +% code are under development and therefore incomplete. Only documented +% features are considered complete. In other words, use \babel{} only +% as documented (except, of course, if you want to explore and test +% them -- you can post suggestions about multilingual issues to +% |kadingira@tug.org| on |http://tug.org/mailman/listinfo/kadingira|). +% +% \section{Identification and loading of required files} +% +% \textit{Code documentation is still under revision.} +% +% The \babel{} package after unpacking consists of the following files: +% \begin{description} +% \itemsep=-\parskip +% \item[switch.def] defines macros to set and switch languages. +% \item[babel.def] defines the rest of macros. It has tow parts: a +% generic one and a second one only for LaTeX{}. +% \item[babel.sty] is the \LaTeX{} package, which set options and +% load language styles. +% \item[plain.def] defines some \LaTeX{} macros required by +% \file{babel.def} and provides a few tools for Plain. +% \item[hyphen.cfg] is the file to be used when generating the +% formats to load hyphenation patterns. By default it also loads +% \file{switch.def}. +% \end{description} +% +% The \babel{} installer extends \textsf{docstrip} with a few +% ``pseudo-guards'' to set ``variables'' used at installation time. +% They are used with |<||@name@>| at the appropiated places in the +% source code and shown below with +% $\langle\langle$\textit{name}$\rangle\rangle$. That brings a +% little bit of literate programming. +% +% \begin{macrocode} +%<<version=3.19>> +%<<date=2018/04/25>> +% \end{macrocode} +% +% \section{Tools} +% +% \textbf{Do not use the following macros in \texttt{ldf} files. They +% may change in the future}. This applies mainly to those recently +% added for replacing, trimming and looping. The older ones, like +% |\bbl@afterfi|, will not change. +% +% \changes{babel~3.9t}{2017/04/22}{Added new helper macros. Not all are +% currently used, but will be in 3.10 -- \cs{bbl@trim}, +% \cs{bbl@ifunset}, \cs{bbl@exp}, \cs{bbl@stripslash}} +% +% We define some basic macros which just make the code cleaner. +% |\bbl@add| is now used internally instead of |\addto| because of +% the unpredictable behavior of the latter. Used in +% \file{babel.def} and in \file{babel.sty}, which means in \LaTeX{} +% is executed twice, but we need them when defining options and +% \file{babel.def} cannot be load until options have been defined. +% This does not hurt, but should be fixed somehow. +% +% \changes{babel~3.9i}{2014/02/16}{\cs{@for} didn't work with +% Plain. Added \cs{bbl@loop}} +% \changes{babel~3.15}{2017/10/30}{New convenience macros +% \cs{bbl@xin@} and \cs{bbl@cs}} +% +% \begin{macrocode} +%<<*Basic macros>> +\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@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}} +% \end{macrocode} +% +% \changes{babel~3.9t}{2017/04/22}{Use \cs{bbl@ifunset} instead of +% \cs{@ifundefined}.} +% +% \begin{macro}{\bbl@add@list} +% This internal macro adds its second argument to a comma +% separated list in its first argument. When the list is not +% defined yet (or empty), it will be initiated. It presumes +% expandable character strings. +% +% \changes{babel~3.9t}{2017/04/22}{Redefined to avoid infinite loops +% if the macro is \cs{relax}.} +% +% \begin{macrocode} +\def\bbl@add@list#1#2{% + \edef#1{% + \bbl@ifunset{\bbl@stripslash#1}% + {}% + {\ifx#1\@empty\else#1,\fi}% + #2}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@afterelse} +% \begin{macro}{\bbl@afterfi} +% Because the code that is used in the handling of active +% characters may need to look ahead, we take extra care to `throw' +% it over the |\else| and |\fi| parts of an +% |\if|-statement\footnote{This code is based on code presented in +% TUGboat vol. 12, no2, June 1991 in ``An expansion Power Lemma'' +% by Sonja Maus.}. These macros will break if another |\if...\fi| +% statement appears in one of the arguments and it is not enclosed +% in braces. +% +% \begin{macrocode} +\long\def\bbl@afterelse#1\else#2\fi{\fi#1} +\long\def\bbl@afterfi#1\fi{\fi#1} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bbl@trim} +% The following piece of code is stolen (with some changes) from +% \textsf{keyval}, by David Carlisle. It defines two macros: +% |\bbl@trim| and |\bbl@trim@def|. The first one strips the leading +% and trailing spaces from the second argument and then applies the +% first argument (a macro, |\toks@| and the like). The second one, +% as its name suggests, defines the first argument as the stripped +% second argument. +% +% \begin{macrocode} +\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}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\bbl@ifunset} +% To check if a macro is defined, we create a new macro, which does +% the same as |\@ifundefined|. However, in an $\epsilon$-tex engine, +% it is based on |\ifcsname|, which is more efficient, and do not +% waste memory. +% +% \begin{macrocode} +\def\bbl@ifunset#1{% + \expandafter\ifx\csname#1\endcsname\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\bbl@ifunset{ifcsname}% + {}% + {\def\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}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bbl@ifblank} +% A tool from \textsf{url}, by Donald Arseneau, which tests if a +% string is empty or space. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% \end{macro} +% +% For each element in the comma separated <key>|=|<value> list, +% execute <code> with |#1| and |#2| as the key and the value of +% current item (trimmed). In addition, the item is passed verbatim as +% |#3|. With the <key> alone, it passes |\@empty| (ie, the macro thus +% named, not an empty argument, which is what you get with <key>|=| +% and no value). +% +% \begin{macrocode} +\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}} +% \end{macrocode} +% +% A \textit{for} loop. Each item (trimmed), is |#1|. It cannot be +% nested (it's doable, but we don't need it). +% +% \begin{macrocode} +\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}} +% \end{macrocode} +% +% \begin{macro}{\bbl@replace} +% +% \begin{macrocode} +\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@}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bbl@exp} +% +% Now, just syntactical sugar, but it makes partial expansion of +% some code a lot more simple and readable. Here |\\| stands for +% |\noexpand| and |\<..>| for |\noexpand| applied to a built macro +% name (the latter does not define the macro if undefined to +% |\relax|, because it is created locally). The result may be +% followed by extra arguments, if necessary. +% +% \begin{macrocode} +\def\bbl@exp#1{% + \begingroup + \let\\\noexpand + \def\<##1>{\expandafter\noexpand\csname##1\endcsname}% + \edef\bbl@exp@aux{\endgroup#1}% + \bbl@exp@aux} +% \end{macrocode} +% \end{macro} +% +% Two further tools. |\bbl@samestring| first expand its arguments and +% then compare their expansion (sanitized, so that the catcodes do not +% matter). |\bbl@engine| takes the following values: 0 is pdf\TeX, 1 +% is \luatex, and 2 is \xetex. You may use the latter it in your +% language style if you want. +% +% \begin{macrocode} +\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 +%<</Basic macros>> +% \end{macrocode} +% +% Some files identify themselves with a \LaTeX{} macro. The following +% code is placed before them to define (and then undefine) if not in +% \LaTeX. +% +% \begin{macrocode} +%<<*Make sure ProvidesFile is defined>> +\ifx\ProvidesFile\@undefined + \def\ProvidesFile#1[#2 #3 #4]{% + \wlog{File: #1 #4 #3 <#2>}% + \let\ProvidesFile\@undefined} +\fi +%<</Make sure ProvidesFile is defined>> +% \end{macrocode} +% +% The following code is used in \file{babel.sty} and +% \file{babel.def}, and loads (only once) the data in |language.dat|. +% +% \begin{macrocode} +%<<*Load patterns in luatex>> +\ifx\directlua\@undefined\else + \ifx\bbl@luapatterns\@undefined + \input luababel.def + \fi +\fi +%<</Load patterns in luatex>> +% \end{macrocode} +% +% The following code is used in \file{babel.def} and +% \file{switch.def}. +% +% \begin{macrocode} +%<<*Load macros for plain if not LaTeX>> +\ifx\AtBeginDocument\@undefined + \input plain.def\relax +\fi +%<</Load macros for plain if not LaTeX>> +% \end{macrocode} +% +% \subsection{Multiple languages} +% +% \begin{macro}{\language} +% Plain \TeX\ version~3.0 provides the primitive |\language| that +% is used to store the current language. When used with a pre-3.0 +% version this function has to be implemented by allocating a +% counter. The following block is used in \file{switch.def} and +% \file{hyphen.cfg}; the latter may seem redundant, but remember +% \babel{} doesn't requires loading \file{switch.def} in the format. +% +% \begin{macrocode} +%<<*Define core switching macros>> +\ifx\language\@undefined + \csname newcount\endcsname\language +\fi +%<</Define core switching macros>> +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\last@language} +% Another counter is used to store the last language defined. For +% pre-3.0 formats an extra counter has to be allocated. +% +% \begin{macro}{\addlanguage} +% +% To add languages to \TeX's memory plain \TeX\ version~3.0 +% supplies |\newlanguage|, in a pre-3.0 environment a similar macro +% has to be provided. For both cases a new macro is defined here, +% because the original |\newlanguage| was defined to be |\outer|. +% +% For a format based on plain version~2.x, the definition of +% |\newlanguage| can not be copied because |\count 19| is used for +% other purposes in these formats. Therefore |\addlanguage| is +% defined using a definition based on the macros used to define +% |\newlanguage| in plain \TeX\ version~3.0. +% +% For formats based on plain version~3.0 the definition of +% |\newlanguage| can be simply copied, removing |\outer|. +% Plain \TeX\ version 3.0 uses |\count 19| for this purpose. +% +% \begin{macrocode} +%<<*Define core switching macros>> +\ifx\newlanguage\@undefined + \csname newcount\endcsname\last@language + \def\addlanguage#1{% + \global\advance\last@language\@ne + \ifnum\last@language<\@cclvi + \else + \errmessage{No room for a new \string\language!}% + \fi + \global\chardef#1\last@language + \wlog{\string#1 = \string\language\the\last@language}} +\else + \countdef\last@language=19 + \def\addlanguage{\alloc@9\language\chardef\@cclvi} +\fi +%<</Define core switching macros>> +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% Now we make sure all required files are loaded. When the command +% |\AtBeginDocument| doesn't exist we assume that we are dealing +% with a plain-based format or \LaTeX2.09. In that case the file +% \file{plain.def} is needed (which also defines +% |\AtBeginDocument|, and therefore it is not loaded twice). We +% need the first part when the format is created, and |\orig@dump| +% is used as a flag. Otherwise, we need to use the second part, so +% |\orig@dump| is not defined (\file{plain.def} undefines it). +% +% \changes{babel~3.9a}{2012/12/21}{Use \cs{orig@dump} as flag instead +% of \cs{adddialect}} +% +% Check if the current version of \file{switch.def} has been +% previously loaded (mainly, \file{hyphen.cfg}). If not, load it +% now. We cannot load |babel.def| here because we first need to +% declare and process the package options. +% +% \changes{babel~3.9a}{2012/08/11}{Now switch.def is loaded always, so +% that there is no need to rebuild formats just to update babel} +% \changes{babel~3.9a}{2012/12/13}{But switch.def is loaded only if +% loaded in a different version (or not loaded)} +% \changes{babel~3.9a}{2013/01/14}{Added the debug option} +% \changes{babel~3.9a}{2013/02/05}{Added \cs{bbl@add}} +% +% \section{The Package File (\LaTeX, \texttt{babel.sty})} +% +% In order to make use of the features of \LaTeXe, the \babel\ +% system contains a package file, \file{babel.sty}. This file is +% loaded by the |\usepackage| command and defines all the language +% options whose name is different from that of the |.ldf| file +% (like variant spellings). It also takes care of a number of +% compatibility issues with other packages an defines a few +% aditional package options. +% +% +% Apart from all the language options below we also have a few options +% that influence the behavior of language definition files. +% +% Many of the following options don't do anything themselves, they +% are just defined in order to make it possible for babel and +% language definition files to check if one of them was specified +% by the user. +% +% \subsection{\texttt{base}} +% +% The first option to be processed is |base|, which set the +% hyphenation patterns then resets |ver@babel.sty| so that +% \LaTeX forgets about the first loading. After |switch.def| has +% been loaded (above) and |\AfterBabelLanguage| defined, exits. +% +% \changes{babel~3.9a}{2012/10/05}{preset option started, +% party stolen from fontenc} +% \changes{babel~3.9a}{2012/10/17}{Hooks started} +% \changes{babel~3.9a}{2013/02/07}{Rejected preset, and replaced by +% base} +% \changes{babel~3.9q}{2016/02/11}{Load patterns with option base. +% To be improved. Moved showlanguages before base} +% \changes{babel~3.18}{2018/02/14}{Fix - prevent doble input of +% switch.def} +% +% \begin{macrocode} +%<*package> +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{babel}[<@date@> <@version@> The Babel package] +\@ifpackagewith{babel}{debug} + {\providecommand\bbl@trace[1]{\message{^^J[ #1 ]}}% + \let\bbl@debug\@firstofone} + {\providecommand\bbl@trace[1]{}% + \let\bbl@debug\@gobble} +\ifx\bbl@switchflag\@undefined % Prevent double input + \let\bbl@switchflag\relax + \input switch.def\relax +\fi +<@Load patterns in luatex@> +<@Basic macros@> +\def\AfterBabelLanguage#1{% + \global\expandafter\bbl@add\csname#1.ldf-h@@k\endcsname}% +% \end{macrocode} +% +% If the format created a list of loaded languages (in +% |\bbl@languages|), get the name of the 0-th to show the actual +% language used. +% +% \begin{macrocode} +\ifx\bbl@languages\@undefined\else + \begingroup + \catcode`\^^I=12 + \@ifpackagewith{babel}{showlanguages}{% + \begingroup + \def\bbl@elt#1#2#3#4{\wlog{#2^^I#1^^I#3^^I#4}}% + \wlog{<*languages>}% + \bbl@languages + \wlog{</languages>}% + \endgroup}{} + \endgroup + \def\bbl@elt#1#2#3#4{% + \ifnum#2=\z@ + \gdef\bbl@nulllanguage{#1}% + \def\bbl@elt##1##2##3##4{}% + \fi}% + \bbl@languages +\fi +\ifodd\bbl@engine + \def\bbl@loadbidi#1{% + \let\bbl@beforeforeign\leavevmode + \AtEndOfPackage{\EnableBabelHook{babel-bidi}}% + \RequirePackage{luatexbase}% + \directlua{ + require('babel-bidi.lua') + require('babel-bidi-#1.lua') + luatexbase.add_to_callback('pre_linebreak_filter', + Babel.pre_otfload_v, + 'Babel.pre_otfload_v', + luatexbase.priority_in_callback('pre_linebreak_filter', + 'luaotfload.node_processor') or nil) + luatexbase.add_to_callback('hpack_filter', + Babel.pre_otfload_h, + 'Babel.pre_otfload_h', + luatexbase.priority_in_callback('hpack_filter', + 'luaotfload.node_processor') or nil) + }} + \let\bbl@tempa\relax + \@ifpackagewith{babel}{bidi=basic}% + {\def\bbl@tempa{basic}}% + {\@ifpackagewith{babel}{bidi=basic-r}% + {\def\bbl@tempa{basic-r}}% + {}} + \ifx\bbl@tempa\relax\else + \let\bbl@beforeforeign\leavevmode + \AtEndOfPackage{\EnableBabelHook{babel-bidi}}% + \RequirePackage{luatexbase}% + \directlua{ + require('babel-bidi.lua') + require('babel-bidi-\bbl@tempa.lua') + luatexbase.add_to_callback('pre_linebreak_filter', + Babel.pre_otfload_v, + 'Babel.pre_otfload_v', + luatexbase.priority_in_callback('pre_linebreak_filter', + 'luaotfload.node_processor') or nil) + luatexbase.add_to_callback('hpack_filter', + Babel.pre_otfload_h, + 'Babel.pre_otfload_h', + luatexbase.priority_in_callback('hpack_filter', + 'luaotfload.node_processor') or nil) + } + \fi +\fi +% \end{macrocode} +% +% Now the \texttt{base} option. With it we can define (and load, with +% \luatex) hyphenation patterns, even if we are not interesed in the +% rest of babel. Useful for old versions of \textsf{polyglossia}, too. +% +% \begin{macrocode} +\bbl@trace{Defining option 'base'} +\@ifpackagewith{babel}{base}{% + \ifx\directlua\@undefined + \DeclareOption*{\bbl@patterns{\CurrentOption}}% + \else + \DeclareOption*{\bbl@patterns@lua{\CurrentOption}}% + \fi + \DeclareOption{base}{}% + \DeclareOption{showlanguages}{}% + \ProcessOptions + \global\expandafter\let\csname opt@babel.sty\endcsname\relax + \global\expandafter\let\csname ver@babel.sty\endcsname\relax + \global\let\@ifl@ter@@\@ifl@ter + \def\@ifl@ter#1#2#3#4#5{\global\let\@ifl@ter\@ifl@ter@@}% + \endinput}{}% +% \end{macrocode} +% +% \subsection{\texttt{key=value} options and other general option} +% +% The following macros extract language modifiers, and only real +% package options are kept in the option list. Modifiers are saved +% and assigned to |\BabelModifiers| at |\bbl@load@language|; when +% no modifiers have been given, the former is |\relax|. How +% modifiers are handled are left to language styles; they can use +% |\in@|, loop them with |\@for| or load |keyval|, for example. +% +% \changes{babel~3.9e}{2013/04/15}{Bug fixed - a dot was added in +% key=value pairs} +% +% \begin{macrocode} +\bbl@trace{key=value and another general options} +\bbl@csarg\let{tempa\expandafter}\csname opt@babel.sty\endcsname +\def\bbl@tempb#1.#2{% + #1\ifx\@empty#2\else,\bbl@afterfi\bbl@tempb#2\fi}% +\def\bbl@tempd#1.#2\@nnil{% + \ifx\@empty#2% + \edef\bbl@tempc{\ifx\bbl@tempc\@empty\else\bbl@tempc,\fi#1}% + \else + \in@{=}{#1}\ifin@ + \edef\bbl@tempc{\ifx\bbl@tempc\@empty\else\bbl@tempc,\fi#1.#2}% + \else + \edef\bbl@tempc{\ifx\bbl@tempc\@empty\else\bbl@tempc,\fi#1}% + \bbl@csarg\edef{mod@#1}{\bbl@tempb#2}% + \fi + \fi} +\let\bbl@tempc\@empty +\bbl@foreach\bbl@tempa{\bbl@tempd#1.\@empty\@nnil} +\expandafter\let\csname opt@babel.sty\endcsname\bbl@tempc +% \end{macrocode} +% +% The next option tells \babel\ to leave shorthand characters active +% at the end of processing the package. This is \emph{not} the default +% as it can cause problems with other packages, but for those who want +% to use the shorthand characters in the preamble of their documents +% this can help. +% +% \changes{babel~3.9a}{2012/08/14}{Implemented the \texttt{noconfigs} +% option} +% \changes{babel~3.9a}{2012/09/26}{Implemented the +% \texttt{showlanguages} option} +% \changes{babel~3.9g}{2013/08/07}{Options for hyphenmap} +% \changes{babel~3.9l}{2014/07/29}{Option \texttt{silent}} +% +% \begin{macrocode} +\DeclareOption{KeepShorthandsActive}{} +\DeclareOption{activeacute}{} +\DeclareOption{activegrave}{} +\DeclareOption{debug}{} +\DeclareOption{noconfigs}{} +\DeclareOption{showlanguages}{} +\DeclareOption{silent}{} +\DeclareOption{shorthands=off}{\bbl@tempa shorthands=\bbl@tempa} +<@More package options@> +% \end{macrocode} +% +% Handling of package options is done in three passes. (I [JBL] am not +% very happy with the idea, anyway.) The first one processes options +% which has been declared above or follow the syntax |<key>=<value>|, +% the second one loads the requested languages, except the main one if +% set with the key |main|, and the third one loads the latter. First, +% we ``flag'' valid keys with a nil value. +% +% \changes{babel~3.9a}{2012/08/10}{Added the `safe' key, including code +% below for selecting the redefined macros} +% +% \begin{macrocode} +\let\bbl@opt@shorthands\@nnil +\let\bbl@opt@config\@nnil +\let\bbl@opt@main\@nnil +\let\bbl@opt@headfoot\@nnil +\let\bbl@opt@layout\@nnil +% \end{macrocode} +% +% The following tool is defined temporarily to store the values of +% options. +% +% \begin{macrocode} +\def\bbl@tempa#1=#2\bbl@tempa{% + \bbl@csarg\ifx{opt@#1}\@nnil + \bbl@csarg\edef{opt@#1}{#2}% + \else + \bbl@error{% + Bad option `#1=#2'. Either you have misspelled the\\% + key or there is a previous setting of `#1'}{% + Valid keys are `shorthands', `config', `strings', `main',\\% + `headfoot', `safe', `math', among others.} + \fi} +% \end{macrocode} +% +% Now the option list is processed, taking into account only currently +% declared options (including those declared with a |=|), and +% |<key>=<value>| options (the former take precedence). Unrecognized +% options are saved in |\bbl@language@opts|, because they are language +% options. +% +% \begin{macrocode} +\let\bbl@language@opts\@empty +\DeclareOption*{% + \bbl@xin@{\string=}{\CurrentOption}% + \ifin@ + \expandafter\bbl@tempa\CurrentOption\bbl@tempa + \else + \bbl@add@list\bbl@language@opts{\CurrentOption}% + \fi} +% \end{macrocode} +% +% Now we finish the first pass (and start over). +% +% \begin{macrocode} +\ProcessOptions* +% \end{macrocode} +% +% \subsection{Conditional loading of shorthands} +% +% If there is no |shorthands=<chars>|, the original \textsf{babel} +% macros are left untouched, but if there is, these macros are +% wrapped (in |babel.def|) to define only those given. +% +% A bit of optimization: if there is no |shorthands=|, then +% |\bbl@ifshorthands| is always true, and it is always false if +% |shorthands| is empty. Also, some code makes sense only with +% |shorthands=...|. +% +% \changes{babel~3.9c}{2013/04/07}{Added t and c for tilde and comma} +% +% \begin{macrocode} +\bbl@trace{Conditional loading of shorthands} +\def\bbl@sh@string#1{% + \ifx#1\@empty\else + \ifx#1t\string~% + \else\ifx#1c\string,% + \else\string#1% + \fi\fi + \expandafter\bbl@sh@string + \fi} +\ifx\bbl@opt@shorthands\@nnil + \def\bbl@ifshorthand#1#2#3{#2}% +\else\ifx\bbl@opt@shorthands\@empty + \def\bbl@ifshorthand#1#2#3{#3}% +\else +% \end{macrocode} +% +% The following macro tests if a shortand is one of the allowed +% ones. +% +% \begin{macrocode} + \def\bbl@ifshorthand#1{% + \bbl@xin@{\string#1}{\bbl@opt@shorthands}% + \ifin@ + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +% \end{macrocode} +% +% We make sure all chars in the string are `other', with the help +% of an auxiliary macro defined above (which also zaps spaces). +% +% \begin{macrocode} + \edef\bbl@opt@shorthands{% + \expandafter\bbl@sh@string\bbl@opt@shorthands\@empty}% +% \end{macrocode} +% +% The following is ignored with |shorthands=off|, since it is +% intended to take some aditional actions for certain chars. +% +% \begin{macrocode} + \bbl@ifshorthand{'}% + {\PassOptionsToPackage{activeacute}{babel}}{} + \bbl@ifshorthand{`}% + {\PassOptionsToPackage{activegrave}{babel}}{} +\fi\fi +% \end{macrocode} +% +% \changes{babel~3.9a}{2012/07/30}{Code setting language in +% head/foots. Related to babel/3796} +% +% With |headfoot=lang| we can set the language used in heads/foots. +% For example, in babel/3796 just adds |headfoot=english|. It +% misuses \cs{@resetactivechars} but seems to work. +% +% \begin{macrocode} +\ifx\bbl@opt@headfoot\@nnil\else + \g@addto@macro\@resetactivechars{% + \set@typeset@protect + \expandafter\select@language@x\expandafter{\bbl@opt@headfoot}% + \let\protect\noexpand} +\fi +% \end{macrocode} +% +% For the option safe we use a different approach -- |\bbl@opt@safe| +% says which macros are redefined (B for bibs and R for refs). By +% default, both are set. +% +% \begin{macrocode} +\ifx\bbl@opt@safe\@undefined + \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} +\fi +% \end{macrocode} +% +% For |layout| an auxiliary macro is provided, available for packages +% and language styles. +% +% \changes{babel~3.16}{2018/01/02}{Added the basic layout stuff and the +% macro \cs{IfBabelLayout}} +% +% \begin{macrocode} +\bbl@trace{Defining IfBabelLayout} +\ifx\bbl@opt@layout\@nnil + \newcommand\IfBabelLayout[3]{#3}% +\else + \newcommand\IfBabelLayout[1]{% + \@expandtwoargs\in@{.#1.}{.\bbl@opt@layout.}% + \ifin@ + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\fi +% \end{macrocode} +% +% \subsection{Language options} +% +% \changes{babel~3.9a}{2012/06/15}{Rewritten the loading mechanism, so +% that languages not declared are also correctly recognized, even +% if given as global options} +% \changes{babel~3.9a}{2012/08/12}{Revised the loading mechanism} +% \changes{babel~3.9i}{2014/03/01}{Removed German options, because +% they are now loaded directly} +% +% Languages are loaded when processing the corresponding option +% \textit{except} if a |main| language has been set. In such a +% case, it is not loaded until all options has been processed. +% The following macro inputs the ldf file and does some additional +% checks (|\input| works, too, but possible errors are not catched). +% +% \begin{macrocode} +\bbl@trace{Language options} +\let\bbl@afterlang\relax +\let\BabelModifiers\relax +\let\bbl@loaded\@empty +\def\bbl@load@language#1{% + \InputIfFileExists{#1.ldf}% + {\edef\bbl@loaded{\CurrentOption + \ifx\bbl@loaded\@empty\else,\bbl@loaded\fi}% + \expandafter\let\expandafter\bbl@afterlang + \csname\CurrentOption.ldf-h@@k\endcsname + \expandafter\let\expandafter\BabelModifiers + \csname bbl@mod@\CurrentOption\endcsname}% + {\bbl@error{% + Unknown option `\CurrentOption'. Either you misspelled it\\% + or the language definition file \CurrentOption.ldf was not found}{% + Valid options are: shorthands=, KeepShorthandsActive,\\% + activeacute, activegrave, noconfigs, safe=, main=, math=\\% + headfoot=, strings=, config=, hyphenmap=, or a language name.}}} +% \end{macrocode} +% +% Now, we set language options whose names are different from |ldf| files. +% +% \changes{babel~3.9t}{2017/04/23}{Removed options for English, Indonesian and +% Malay, now handled with proxy files} +% \changes{babel~3.13}{2017/08/24}{Removed options for French, +% too. ldf files now takes priority if exist, except Hebrew (to do)} +% +% \begin{macrocode} +\def\bbl@try@load@lang#1#2#3{% + \IfFileExists{\CurrentOption.ldf}% + {\bbl@load@language{\CurrentOption}}% + {#1\bbl@load@language{#2}#3}} +\DeclareOption{afrikaans}{\bbl@try@load@lang{}{dutch}{}} +\DeclareOption{brazil}{\bbl@try@load@lang{}{portuges}{}} +\DeclareOption{brazilian}{\bbl@try@load@lang{}{portuges}{}} +\DeclareOption{hebrew}{% + \input{rlbabel.def}% + \bbl@load@language{hebrew}} +\DeclareOption{hungarian}{\bbl@try@load@lang{}{magyar}{}} +\DeclareOption{lowersorbian}{\bbl@try@load@lang{}{lsorbian}{}} +\DeclareOption{nynorsk}{\bbl@try@load@lang{}{norsk}{}} +\DeclareOption{polutonikogreek}{% + \bbl@try@load@lang{}{greek}{\languageattribute{greek}{polutoniko}}} +\DeclareOption{portuguese}{\bbl@try@load@lang{}{portuges}{}} +\DeclareOption{russian}{\bbl@try@load@lang{}{russianb}{}} +\DeclareOption{ukrainian}{\bbl@try@load@lang{}{ukraineb}{}} +\DeclareOption{uppersorbian}{\bbl@try@load@lang{}{usorbian}{}} +% \end{macrocode} +% +% Another way to extend the list of `known' options for \babel\ was +% to create the file \file{bblopts.cfg} in which one can add option +% declarations. However, this mechanism is deprecated -- if you +% want an alternative name for a language, just create a new |.ldf| +% file loading the actual one. You can also set the name +% of the file with the package option |config=<name>|, which will +% load |<name>.cfg| instead. +% +% \changes{babel~3.9a}{2012/06/28}{Added the \cs{AfterBabelLanguage} +% mechanism, to be used mainly with the local cfg file.} +% \changes{babel~3.9a}{2012/06/31}{Now you can set the name of the +% local cfg file.} +% +% \begin{macrocode} +\ifx\bbl@opt@config\@nnil + \@ifpackagewith{babel}{noconfigs}{}% + {\InputIfFileExists{bblopts.cfg}% + {\typeout{*************************************^^J% + * Local config file bblopts.cfg used^^J% + *}}% + {}}% +\else + \InputIfFileExists{\bbl@opt@config.cfg}% + {\typeout{*************************************^^J% + * Local config file \bbl@opt@config.cfg used^^J% + *}}% + {\bbl@error{% + Local config file `\bbl@opt@config.cfg' not found}{% + Perhaps you misspelled it.}}% +\fi +% \end{macrocode} +% +% Recognizing global options in packages not having a closed set of +% them is not trivial, as for them to be processed they must be +% defined explicitly. So, package options not yet taken into +% account and stored in |bbl@language@opts| are assumed to be +% languages (note this list also contains the language given with +% |main|). If not declared above, the name of the option and the +% file are the same. +% +% \begin{macrocode} +\bbl@for\bbl@tempa\bbl@language@opts{% + \bbl@ifunset{ds@\bbl@tempa}% + {\edef\bbl@tempb{% + \noexpand\DeclareOption + {\bbl@tempa}% + {\noexpand\bbl@load@language{\bbl@tempa}}}% + \bbl@tempb}% + \@empty} +% \end{macrocode} +% +% Now, we make sure an option is explicitly declared for any +% language set as global option, by checking if an |ldf| +% exists. The previous step was, in fact, somewhat redundant, but +% that way we minimize accesing the file system just to see if the +% option could be a language. +% +% \begin{macrocode} +\bbl@foreach\@classoptionslist{% + \bbl@ifunset{ds@#1}% + {\IfFileExists{#1.ldf}% + {\DeclareOption{#1}{\bbl@load@language{#1}}}% + {}}% + {}} +% \end{macrocode} +% +% If a main language has been set, store it for the third pass. +% +% \begin{macrocode} +\ifx\bbl@opt@main\@nnil\else + \expandafter + \let\expandafter\bbl@loadmain\csname ds@\bbl@opt@main\endcsname + \DeclareOption{\bbl@opt@main}{} +\fi +% \end{macrocode} +% +% And we are done, because all options for this pass has been +% declared. Those already processed in the first pass are just +% ignored. +% +% \changes{babel~3.9a}{2012/12/22}{Default option does nothing} +% +% The options have to be processed in the order in which the user +% specified them (except, of course, global options, which \LaTeX{} +% processes before): +% +% \begin{macrocode} +\def\AfterBabelLanguage#1{% + \bbl@ifsamestring\CurrentOption{#1}{\global\bbl@add\bbl@afterlang}{}} +\DeclareOption*{} +\ProcessOptions* +% \end{macrocode} +% +% This finished the second pass. Now the third one begins, which +% loads the main language set with the key |main|. A warning is +% raised if the main language is not the same as the last named +% one, or if the value of the key |main| is not a language. Then +% execute directly the option (because it could be used only in +% |main|). After loading all languages, we deactivate +% |\AfterBabelLanguage|. +% +% \begin{macrocode} +\ifx\bbl@opt@main\@nnil + \edef\bbl@tempa{\@classoptionslist,\bbl@language@opts} + \let\bbl@tempc\@empty + \bbl@for\bbl@tempb\bbl@tempa{% + \bbl@xin@{,\bbl@tempb,}{,\bbl@loaded,}% + \ifin@\edef\bbl@tempc{\bbl@tempb}\fi} + \def\bbl@tempa#1,#2\@nnil{\def\bbl@tempb{#1}} + \expandafter\bbl@tempa\bbl@loaded,\@nnil + \ifx\bbl@tempb\bbl@tempc\else + \bbl@warning{% + Last declared language option is `\bbl@tempc',\\% + but the last processed one was `\bbl@tempb'.\\% + The main language cannot be set as both a global\\% + and a package option. Use `main=\bbl@tempc' as\\% + option. Reported}% + \fi +\else + \DeclareOption{\bbl@opt@main}{\bbl@loadmain} + \ExecuteOptions{\bbl@opt@main} + \DeclareOption*{} + \ProcessOptions* +\fi +\def\AfterBabelLanguage{% + \bbl@error + {Too late for \string\AfterBabelLanguage}% + {Languages have been loaded, so I can do nothing}} +% \end{macrocode} +% +% In order to catch the case where the user forgot to specify a +% language we check whether |\bbl@main@language|, has become +% defined. If not, no language has been loaded and an error +% message is displayed. +% +% \changes{babel~3.9a}{2012/06/24}{Now babel is not loaded to prevent +% the document from raising errors after fixing it} +% +% \begin{macrocode} +\ifx\bbl@main@language\@undefined + \bbl@error{% + You haven't specified a language option}{% + You need to specify a language, either as a global option\\% + or as an optional argument to the \string\usepackage\space + command;\\% + You shouldn't try to proceed from here, type x to quit.} +\fi +%</package> +%<*core> +% \end{macrocode} +% +% \section{The kernel of Babel (\texttt{babel.def}, common)} +% +% The kernel of the \babel\ system is stored in either +% \file{hyphen.cfg} or \file{switch.def} and \file{babel.def}. The +% file \file{babel.def} contains most of the code, while +% \file{switch.def} defines the language switching commands; both can +% be read at run time. The file \file{hyphen.cfg} is a file that can +% be loaded into the format, which is necessary when you want to be +% able to switch hyphenation patterns (by default, it also inputs +% \file{switch.def}, for ``historical reasons'', but it is not +% necessary). When \file{babel.def} is loaded it checks if the current +% version of \file{switch.def} is in the format; if not, it is +% loaded. A further file, \file{babel.sty}, contains \LaTeX-specific +% stuff. +% +% Because plain \TeX\ users might want to use some of the features of +% the \babel{} system too, care has to be taken that plain \TeX\ can +% process the files. For this reason the current format will have to +% be checked in a number of places. Some of the code below is common +% to plain \TeX\ and \LaTeX, some of it is for the \LaTeX\ case only. +% +% Plain formats based on etex (etex, xetex, luatex) don't load +% |hyphen.cfg| but |etex.src|, which follows a different naming +% convention, so we need to define the babel names. It presumes +% |language.def| exists and it is the same file used when formats were +% created. +% +% \changes{babel~3.9a}{2013/01/11}{Added \cs{bbl@for} for loops +% ignoring empties} +% \changes{babel~3.9c}{2013/04/06}{Normalize \cs{bbl@afterlang} to +% relax} +% \changes{babel~3.9i}{2014/03/10}{Make sure \cs{bbl@language@opts} +% is defined.} +% \changes{babel~3.9i}{2014/03/11}{Define \cs{l@} values from +% \cs{lang@} values set in Plain etex/xetex/luatex} +% +% \subsection{Tools} +% +% \changes{babel~3.9k}{2014/03/24}{Added definition for +% \cs{uselanguage}} +% \changes{babel~3.9n}{2015/12/21}{Define a few macros for 2.09} +% \changes{babel~3.9p}{2016/02/05}{Added a test for lua(e)tex.} +% \changes{babel~3.9q}{2016/02/12}{Load lua patterns if not lualatex.} +% +% \begin{macrocode} +\ifx\ldf@quit\@undefined +\else + \expandafter\endinput +\fi +<@Make sure ProvidesFile is defined@> +\ProvidesFile{babel.def}[<@date@> <@version@> Babel common definitions] +<@Load macros for plain if not LaTeX@> +% \end{macrocode} +% +% The file |babel.def| expects some definitions made in the \LaTeXe{} +% style file. So, In \LaTeX2.09 and Plain{} we must provide at least +% some predefined values as well some tools to set them (even if not +% all options are available). There in no package options, and +% therefore and alternative mechanism is provided. For the moment, +% only |\babeloptionstrings| and |\babeloptionmath| are provided, +% which can be defined before loading \babel. |\BabelModifiers| can be +% set too (but not sure it works). +% +% \begin{macrocode} +\ifx\bbl@ifshorthand\@undefined + \let\bbl@opt@shorthands\@nnil + \def\bbl@ifshorthand#1#2#3{#2}% + \let\bbl@language@opts\@empty + \ifx\babeloptionstrings\@undefined + \let\bbl@opt@strings\@nnil + \else + \let\bbl@opt@strings\babeloptionstrings + \fi + \def\BabelStringsDefault{generic} + \def\bbl@tempa{normal} + \ifx\babeloptionmath\bbl@tempa + \def\bbl@mathnormal{\noexpand\textormath} + \fi + \def\AfterBabelLanguage#1#2{} + \ifx\BabelModifiers\@undefined\let\BabelModifiers\relax\fi + \let\bbl@afterlang\relax + \def\bbl@opt@safe{BR} + \ifx\@uclclist\@undefined\let\@uclclist\@empty\fi + \ifx\bbl@trace\@undefined\def\bbl@trace#1{}\fi +\fi +% \end{macrocode} +% +% And continue. +% +% \begin{macrocode} +\ifx\bbl@switchflag\@undefined % Prevent double input + \let\bbl@switchflag\relax + \input switch.def\relax +\fi +\bbl@trace{Compatibility with language.def} +\ifx\bbl@languages\@undefined + \ifx\directlua\@undefined + \openin1 = language.def + \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 +<@Load patterns in luatex@> +<@Basic macros@> +% \end{macrocode} +% +% \begin{macro}{\addto} +% For each language four control sequences have to be defined that +% control the language-specific definitions. To be able to add +% something to these macro once they have been defined the macro +% |\addto| is introduced. It takes two arguments, a \meta{control +% sequence} and \TeX-code to be added to the \meta{control +% sequence}. +% +% If the \meta{control sequence} has not been defined before it is +% defined now. The control sequence could also expand to |\relax|, +% in which case a circular definition results. The net result is a +% stack overflow. Otherwise the replacement text for the +% \meta{control sequence} is expanded and stored in a token +% register, together with the \TeX-code to be added. Finally the +% \meta{control sequence} is \emph{re}defined, using the contents +% of the token register. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \end{macro} +% +% \changes{babel~3.9a}{2012/08/10}{Removed the \cs{peek@token} and +% \textsc{test@token} stuff} +% +% The macro |\initiate@active@char| takes all the necessary actions +% to make its argument a shorthand character. The real work is +% performed once for each character. +% +% \changes{babel~3.9a}{1999/04/30}{Added \cs{bbl@withactive}} +% +% \begin{macrocode} +\def\bbl@withactive#1#2{% + \begingroup + \lccode`~=`#2\relax + \lowercase{\endgroup#1~}} +% \end{macrocode} +% +% +% \begin{macro}{\bbl@redefine} +% To redefine a command, we save the old meaning of the macro. +% Then we redefine it to call the original macro with the +% `sanitized' argument. The reason why we do it this way is that +% we don't want to redefine the \LaTeX\ macros completely in case +% their definitions change (they have changed in the past). +% +% Because we need to redefine a number of commands we define the +% command |\bbl@redefine| which takes care of this. It creates a +% new control sequence, |\org@...| +% +% \begin{macrocode} +\def\bbl@redefine#1{% + \edef\bbl@tempa{\bbl@stripslash#1}% + \expandafter\let\csname org@\bbl@tempa\endcsname#1% + \expandafter\def\csname\bbl@tempa\endcsname} +% \end{macrocode} +% +% This command should only be used in the preamble of the document. +% +% \begin{macrocode} +\@onlypreamble\bbl@redefine +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@redefine@long} +% This version of |\babel@redefine| can be used to redefine |\long| +% commands such as |\ifthenelse|. +% +% \begin{macrocode} +\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 +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@redefinerobust} +% For commands that are redefined, but which \textit{might} be +% robust we need a slightly more intelligent macro. A robust +% command |foo| is defined to expand to |\protect|\verb*|\foo |. So +% it is necessary to check whether \verb*|\foo | exists. The result +% is that the command that is being redefined is always robust +% afterwards. Therefore all we need to do now is define \verb*|\foo |. +% +% \begin{macrocode} +\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}} +% \end{macrocode} +% +% This command should only be used in the preamble of the document. +% +% \begin{macrocode} +\@onlypreamble\bbl@redefinerobust +% \end{macrocode} +% +% \end{macro} +% +% \subsection{Hooks} +% +% Note they are loaded in babel.def. switch.def only provides a +% ``hook'' for hooks (with a default value which is a no-op, +% below). Admittedly, the current implementation is a somewhat +% simplistic and does vety little to catch errors, but it is intended +% for developpers, after all. |\bbl@usehooks| is the commands used by +% babel to execute hooks defined for an event. +% +% \changes{babel~3.9k}{2014/03/23}{Removed a \cs{newcommand}, +% undefined in Plain} +% +% \begin{macrocode} +\bbl@trace{Hooks} +\def\AddBabelHook#1#2{% + \bbl@ifunset{bbl@hk@#1}{\EnableBabelHook{#1}}{}% + \def\bbl@tempa##1,#2=##2,##3\@empty{\def\bbl@tempb{##2}}% + \expandafter\bbl@tempa\bbl@evargs,#2=,\@empty + \bbl@ifunset{bbl@ev@#1@#2}% + {\bbl@csarg\bbl@add{ev@#2}{\bbl@elt{#1}}% + \bbl@csarg\newcommand}% + {\bbl@csarg\let{ev@#1@#2}\relax + \bbl@csarg\newcommand}% + {ev@#1@#2}[\bbl@tempb]} +\def\EnableBabelHook#1{\bbl@csarg\let{hk@#1}\@firstofone} +\def\DisableBabelHook#1{\bbl@csarg\let{hk@#1}\@gobble} +\def\bbl@usehooks#1#2{% + \def\bbl@elt##1{% + \@nameuse{bbl@hk@##1}{\@nameuse{bbl@ev@##1@#1}#2}}% + \@nameuse{bbl@ev@#1}} +% \end{macrocode} +% +% To ensure forward compatibility, arguments in hooks are set +% implicitly. So, if a further argument is added in the future, +% there is no need to change the existing code. Note events +% intended for \textsf{hyphen.cfg} are also loaded (just in +% case you need them for some reason). +% +% \begin{macrocode} +\def\bbl@evargs{,% don't delete the 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} +% \end{macrocode} +% +% \begin{macro}{\babelensure} +% +% The user command just parses the optional argument and creates a +% new macro named |\bbl@e@|\m{language}. We register a hook at the +% |afterextras| event which just executes this macro in a +% ``complete'' selection (which, if undefined, is |\relax| and does +% nothing). This part is somewhat involved because we have to make +% sure things are expanded the correct number of times. +% +% The macro |\bbl@e@|\m{language} contains +% |\bbl@ensure|\marg{include}\marg{exclude}\marg{fontenc}, which in in +% turn loops over the macros names in |\bbl@captionslist|, excluding +% (with the help of |\in@|) those in the |exclude| list. If the +% |fontenc| is given (and not |\relax|), the |\fontencoding| is also +% added. Then we loop over the |include| list, but if the macro +% already contains |\foreignlanguage|, nothing is done. Note this +% macro (1) is not restricted to the preamble, and (2) changes are +% local. +% +% \changes{babel~3.9i}{2014/02/14}{Macro \cs{babelensure} added} +% \changes{babel~3.9k}{2014/03/23}{Encapsulate \cs{foreignlanguage} in +% \cs{bbl@ensure@}language, to "protect" strings} +% \changes{babel~3.9s}{2017/04/10}{Bug fix - extra spaces because a +% missing percent} +% \changes{babel~3.9s}{2017/04/10}{\cs{bbl@ensure@lang} defined only +% once} +% \changes{babel~3.10}{2017/05/06}{\cs{bbl@ensured} renamed to +% \cs{bbl@captionslist} (for \cs{babelprovide}), which means +% \cs{today} must be given explicitly in \cs{babelensure}} +% +% \begin{macrocode} +\bbl@trace{Defining babelensure} +\newcommand\babelensure[2][]{% TODO - revise test files + \AddBabelHook{babel-ensure}{afterextras}{% + \ifcase\bbl@select@type + \@nameuse{bbl@e@\languagename}% + \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\@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} +% \end{macrocode} +% +% \end{macro} +% +% \subsection{Setting up language files} +% +% \begin{macro}{\LdfInit} +% The second version of |\LdfInit| macro takes two arguments. The first +% argument is the name of the language that will be defined in the +% language definition file; the second argument is either a control +% sequence or a string from which a control sequence should be +% constructed. The existence of the control sequence indicates that +% the file has been processed before. +% +% At the start of processing a language definition file we always +% check the category code of the at-sign. We make sure that it is +% a `letter' during the processing of the file. We also save its +% name as the last called option, even if not loaded. +% +% Another character that needs to have the correct category code +% during processing of language definition files is the equals sign, +% `=', because it is sometimes used in constructions with the +% |\let| primitive. Therefore we store its current catcode and +% restore it later on. +% +% Now we check whether we should perhaps stop the processing of +% this file. To do this we first need to check whether the second +% argument that is passed to |\LdfInit| is a control sequence. We +% do that by looking at the first token after passing |#2| through +% |string|. When it is equal to |\@backslashchar| we are dealing +% with a control sequence which we can compare with |\@undefined|. +% +% \changes{babel~3.9a}{2012/08/11}{\cs{ldf@quit} is not delayed any +% more after \cs{fi} , since \cs{endinput} is not executed +% immediately} +% \changes{babel~3.9g}{2012/08/11}{Preset the ``family'' of macros +% \cs{Babel}...} +% +% If so, we call |\ldf@quit| to set the main language, restore the +% category code of the @-sign and call |\endinput| +% +% When |#2| was \emph{not} a control sequence we construct one and +% compare it with |\relax|. +% +% Finally we check |\originalTeX|. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\ldf@quit} +% This macro interrupts the processing of a language definition file. +% +% \begin{macrocode} +\def\ldf@quit#1{% + \expandafter\main@language\expandafter{#1}% + \catcode`\@=\atcatcode \let\atcatcode\relax + \catcode`\==\eqcatcode \let\eqcatcode\relax + \endinput} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\ldf@finish} +% This macro takes one argument. It is the name of the language +% that was defined in the language definition file. +% +% We load the local configuration file if one is present, we set +% the main language (taking into account that the argument might be +% a control sequence that needs to be expanded) and reset the +% category code of the @-sign. +% +% \changes{babel~3.9a}{2012/10/01}{Added \cs{bbl@afterlang} which +% executes the code delayed with \cs{AfterBabelLanguage}} +% +% \begin{macrocode} +\def\bbl@afterldf#1{% + \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} +% \end{macrocode} +% +% \end{macro} +% +% After the preamble of the document the commands |\LdfInit|, +% |\ldf@quit| and |\ldf@finish| are no longer needed. Therefore +% they are turned into warning messages in \LaTeX. +% +% \begin{macrocode} +\@onlypreamble\LdfInit +\@onlypreamble\ldf@quit +\@onlypreamble\ldf@finish +% \end{macrocode} +% +% \begin{macro}{\main@language} +% \begin{macro}{\bbl@main@language} +% This command should be used in the various language definition +% files. It stores its argument in |\bbl@main@language|; to be used +% to switch to the correct language at the beginning of the +% document. +% +% \changes{babel~3.8l}{2008/07/06}{Use \cs{bbl@patterns}} +% +% \begin{macrocode} +\def\main@language#1{% + \def\bbl@main@language{#1}% + \let\languagename\bbl@main@language + \bbl@patterns{\languagename}} +% \end{macrocode} +% +% We also have to make sure that some code gets executed at the +% beginning of the document. Languages does not set |\pagedir|, so +% we set here for the whole document to the main |\bodydir|. +% +% \begin{macrocode} +\AtBeginDocument{% + \expandafter\selectlanguage\expandafter{\bbl@main@language}% + \ifcase\bbl@engine\or\pagedir\bodydir\fi} % TODO - a better place +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% A bit of optimization. Select in heads/foots the language only if +% necessary. +% +% \begin{macrocode} +\def\select@language@x#1{% + \ifcase\bbl@select@type + \bbl@ifsamestring\languagename{#1}{}{\select@language{#1}}% + \else + \select@language{#1}% + \fi} +% \end{macrocode} +% +% \subsection{Shorthands} +% +% \begin{macro}{\bbl@add@special} +% The macro |\bbl@add@special| is used to add a new character (or +% single character control sequence) to the macro |\dospecials| +% (and |\@sanitize| if \LaTeX\ is used). It is used only at one +% place, namely when |\initiate@active@char| is called (which is +% ignored if the char has been made active before). Because +% |\@sanitize| can be undefined, we put the definition inside a +% conditional. +% +% Items are added to the lists without checking its existence or +% the original catcode. It does not hurt, but should be fixed. It's +% already done with |\nfss@catcodes|, added in 3.10. +% +% \changes{3.10}{2017/05/14}{Refactored. Add to \cs{nfss@catcodes} too.} +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@remove@special} +% +% The companion of the former macro is |\bbl@remove@special|. It +% removes a character from the set macros |\dospecials| and +% |\@sanitize|, but it is not used at all in the \babel{} core. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\initiate@active@char} +% A language definition file can call this macro to make a +% character active. This macro takes one argument, the character +% that is to be made active. When the character was already active +% this macro does nothing. Otherwise, this macro defines the +% control sequence |\normal@char|\m{char} to expand to the +% character in its `normal state' and it defines the active +% character to expand to |\normal@char|\m{char} by default +% (\m{char} being the character to be made active). Later its +% definition can be changed to expand to |\active@char|\m{char} +% by calling |\bbl@activate{|\m{char}|}|. +% +% For example, to make the double quote character active one could +% have |\initiate@active@char{"}| in a language definition file. +% This defines |"| as |\active@prefix "\active@char"| (where the +% first |"| is the character with its original catcode, when the +% shorthand is created, and |\active@char"| is a single token). In +% protected contexts, it expands to |\protect "| or |\noexpand "| +% (ie, with the original |"|); otherwise |\active@char"| is +% executed. This macro in turn expands to |\normal@char"| in +% ``safe'' contexts (eg, |\label|), but |\user@active"| in normal +% ``unsafe'' ones. The latter search a definition in the user, +% language and system levels, in this order, but if none is found, +% |\normal@char"| is used. However, a deactivated shorthand (with +% |\bbl@deactivate| is defined as |\active@prefix "\normal@char"|. +% +% The following macro is used to define shorthands in the three +% levels. It takes 4 arguments: the (string'ed) character, +% |\<level>@group|, |<level>@active| and |<next-level>@active| +% (except in |system|). +% +% \changes{babel~3.9a}{2012/08/18}{New macro, with code from +% \cs{@initiate@active@char}} +% +% \begin{macrocode} +\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}% +% \end{macrocode} +% +% When there is also no current-level shorthand with an argument we +% will check whether there is a next-level defined shorthand for +% this active character. +% +% \begin{macrocode} + \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}}% +% \end{macrocode} +% +% \changes{babel~3.9a}{2012/08/18}{Removed an extra hash. Now calls +% \cs{@initiate@active@char} with 3 arguments.} +% +% |\initiate@active@char| calls |\@initiate@active@char| with 3 +% arguments. All of them are the same character with different +% catcodes: active, other (|\string|'ed) and the original one. +% This trick simplifies the code a lot. +% +% \begin{macrocode} +\def\initiate@active@char#1{% + \bbl@ifunset{active@char\string#1}% + {\bbl@withactive + {\expandafter\@initiate@active@char\expandafter}#1\string#1#1}% + {}} +% \end{macrocode} +% +% \changes{babel~3.9e}{2012/08/18}{Introduced the 3-argument +% \cs{@initiate@active@char}, with different catcodes: active, +% string'ed, and original. Reorganized} +% \changes{babel~3.9a}{2012/08/19}{The catcode is saved} +% \changes{babel~3.9a}{2012/09/09}{The original definition is saved, +% too} +% \changes{babel~3.9a}{2012/12/27}{Take into account mathematically +% active chars, to avoid infinite loops} +% +% The very first thing to do is saving the original catcode and the +% original definition, even if not active, which is possible +% (undefined characters require a special treatement to avoid +% making them |\relax|). +% +% \begin{macrocode} +\def\@initiate@active@char#1#2#3{% + \bbl@csarg\edef{oricat@#2}{\catcode`#2=\the\catcode`#2\relax}% + \ifx#1\@undefined + \bbl@csarg\edef{oridef@#2}{\let\noexpand#1\noexpand\@undefined}% + \else + \bbl@csarg\let{oridef@@#2}#1% + \bbl@csarg\edef{oridef@#2}{% + \let\noexpand#1% + \expandafter\noexpand\csname bbl@oridef@@#2\endcsname}% + \fi +% \end{macrocode} +% +% If the character is already active we provide the default +% expansion under this shorthand mechanism. Otherwise we write a +% message in the transcript file, and define |\normal@char|\m{char} +% to expand to the character in its default state. If the character +% is mathematically active when \babel{} is loaded (for example +% |'|) the normal expansion is somewhat different to avoid an +% infinite loop (but it does not prevent the loop if the mathcode +% is set to |"8000| \textit{a posteriori}). +% +% \begin{macrocode} + \ifx#1#3\relax + \expandafter\let\csname normal@char#2\endcsname#3% + \else + \bbl@info{Making #2 an active character}% + \ifnum\mathcode`#2="8000 + \@namedef{normal@char#2}{% + \textormath{#3}{\csname bbl@oridef@@#2\endcsname}}% + \else + \@namedef{normal@char#2}{#3}% + \fi +% \end{macrocode} +% +% To prevent problems with the loading of other packages after +% \babel\ we reset the catcode of the character to the original one +% at the end of the package and of each language file (except with +% \textsf{KeepShorthandsActive}). It is re-activate again at +% |\begin{document}|. We also need to make sure that the +% shorthands are active during the processing of the \file{.aux} +% file. Otherwise some citations may give unexpected results in +% the printout when a shorthand was used in the optional argument +% of |\bibitem| for example. Then we make it active (not strictly +% necessary, but done for backward compatibility). +% +% \begin{macrocode} + \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 +% \end{macrocode} +% +% Now we have set |\normal@char|\m{char}, we must define +% |\active@char|\m{char}, to be executed when the character is +% activated. We define the first level expansion of +% |\active@char|\m{char} to check the status of the |@safe@actives| +% flag. If it is set to true we expand to the `normal' version of +% this character, otherwise we call |\user@active|\m{char} to start +% the search of a definition in the user, language and system +% levels (or eventually |normal@char|\m{char}). +% +% \changes{babel~3.9a}{2012/12/27}{Added code for option math=normal} +% \changes{babel~3.9i}{2014/02/03}{Don't call directly +% \cs{user@active}, but with an intermediate step} +% +% \begin{macrocode} + \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}% +% \end{macrocode} +% +% \changes{babel~3.9a}{2012/12/27}{Shorthands are not defined +% directly, but with a couple of intermediate macros} +% +% We now define the default values which the shorthand is set to +% when activated or deactivated. It is set to the deactivated form +% (globally), so that the character expands to +% \begin{center} +% |\active@prefix| \m{char} |\normal@char|\m{char} +% \end{center} +% (where |\active@char|\m{char} is \emph{one} control sequence!). +% +% \begin{macrocode} + \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 +% \end{macrocode} +% +% The next level of the code checks whether a user has defined a +% shorthand for himself with this character. First we check for a +% single character shorthand. If that doesn't exist we check for a +% shorthand with an argument. +% +% \changes{babel~3.8b}{2004/04/19}{Now use \cs{bbl@sh@select}} +% \changes{babel~3.9a}{2012/08/18}{Instead of the ``copy-paste pattern'' +% a new macro is used} +% +% \begin{macrocode} + \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}% +% \end{macrocode} +% +% In order to do the right thing when a shorthand with an argument +% is used by itself at the end of the line we provide a definition +% for the case of an empty argument. For that case we let the +% shorthand character expand to its non-active self. Also, When a +% shorthand combination such as |''| ends up in a heading \TeX\ +% would see |\protect'\protect'|. To prevent this from happening a +% couple of shorthand needs to be defined at user level. +% +% \changes{babel~3.9a}{2012/8/18}{Use \cs{user@group}, as above, +% instead of the hardwired \texttt{user}} +% +% \begin{macrocode} + \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}% +% \end{macrocode} +% +% Finally, a couple of special cases are taken care of. (1) If we +% are making the right quote (|'|) active we need to change |\pr@m@s| as +% well. Also, make sure that a single |'| in math mode `does the +% right thing'. (2) If we are using the caret (|^|) as a shorthand +% character special care should be taken to make sure math still +% works. Therefore an extra level of expansion is introduced with a +% check for math mode on the upper level. +% +% \changes{babel~3.9a}{2012/09/11}{The output routine resets the quote +% to \cs{active@math@prime}, so we redefine the latter with the new +% ``normal'' value} +% \changes{babel~3.9a}{2012/06/20}{Added a couple of missing +% comment characters (PR 4146)} +% \changes{babel~3.9a}{2012/07/29}{Use \cs{textormath} instead of +% \cs{ifmath}} +% \changes{babel~3.9a}{2012/11/26}{Compare the char, irrespective of +% its catcode.} +% \changes{babel~3.9a}{2012/12/27}{Removed the redeclaration of +% \cs{normal@char'} because it is handled in a generic way above} +% \changes{babel~3.9a}{2012/12/29}{Removed the intermediate step of +% \cs{bbl@act@caret} and moved above} +% \changes{babel~3.9i}{2012/12/29}{Added the event \cs{initiateactive}} +% +% \begin{macrocode} + \if\string'#2% + \let\prim@s\bbl@prim@s + \let\active@math@prime#1% + \fi + \bbl@usehooks{initiateactive}{{#1}{#2}{#3}}} +% \end{macrocode} +% +% The following package options control the behavior of shorthands +% in math mode. +% +% \begin{macrocode} +%<<*More package options>> +\DeclareOption{math=active}{} +\DeclareOption{math=normal}{\def\bbl@mathnormal{\noexpand\textormath}} +%<</More package options>> +% \end{macrocode} +% +% Initiating a shorthand makes active the char. That is not +% strictly necessary but it is still done for backward +% compatibility. So we need to restore the original catcode at the +% end of package \textit{and} and the end of the |ldf|. +% +% \changes{babel~3.9a}{2012/07/04}{Catcodes are also restored after +% each language, to prevent incompatibilities. Use \cs{string} instead +% of \cs{noexpand} and add \cs{relax}} +% \changes{babel~3.9a}{2012/10/18}{Catcodes are deactivated in a separate +% macro, which is made no-op when babel exits} +% +% \begin{macrocode} +\@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}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@sh@select} +% This command helps the shorthand supporting macros to select how +% to proceed. Note that this macro needs to be expandable as do all +% the shorthand macros in order for them to work in expansion-only +% environments such as the argument of |\hyphenation|. +% +% This macro expects the name of a group of shorthands in its first +% argument and a shorthand character in its second argument. It +% will expand to either |\bbl@firstcs| or |\bbl@scndcs|. Hence two +% more arguments need to follow it. +% +% \changes{babel~3.8b}{2004/04/19}{Added command} +% \changes{babel~3.9a}{2012/08/18}{Removed \cs{string}s, because the +% char are already string'ed} +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\active@prefix} +% The command |\active@prefix| which is used in the expansion of +% active characters has a function similar to |\OT1-cmd| in that it +% |\protect|s the active character whenever |\protect| is +% \emph{not} |\@typeset@protect|. +% +% \begin{macrocode} +\def\active@prefix#1{% + \ifx\protect\@typeset@protect + \else +% \end{macrocode} +% +% When |\protect| is set to |\@unexpandable@protect| we make sure +% that the active character is als \emph{not} expanded by inserting +% |\noexpand| in front of it. The |\@gobble| is needed to remove +% a token such as |\activechar:| (when the double colon was the +% active character to be dealt with). +% +% \begin{macrocode} + \ifx\protect\@unexpandable@protect + \noexpand#1% + \else + \protect#1% + \fi + \expandafter\@gobble + \fi} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\if@safe@actives} +% In some circumstances it is necessary to be able to change the +% expansion of an active character on the fly. For this purpose the +% switch |@safe@actives| is available. The setting of this switch +% should be checked in the first level expansion of +% |\active@char|\m{char}. +% +% \begin{macrocode} +\newif\if@safe@actives +\@safe@activesfalse +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@restore@actives} +% When the output routine kicks in while the +% active characters were made ``safe'' this must be undone in +% the headers to prevent unexpected typeset results. For this +% situation we define a command to make them ``unsafe'' again. +% +% \begin{macrocode} +\def\bbl@restore@actives{\if@safe@actives\@safe@activesfalse\fi} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@activate} +% \begin{macro}{\bbl@deactivate} +% +% \changes{babel~3.9a}{2013/01/11}{\cs{bbl@withactive} makes sure the +% catcode is active} +% +% Both macros take one argument, like |\initiate@active@char|. The +% macro is used to change the definition of an active character to +% expand to |\active@char|\m{char} in the case of |\bbl@activate|, +% or |\normal@char|\m{char} in the case of +% |\bbl@deactivate|. +% +% \begin{macrocode} +\def\bbl@activate#1{% + \bbl@withactive{\expandafter\let\expandafter}#1% + \csname bbl@active@\string#1\endcsname} +\def\bbl@deactivate#1{% + \bbl@withactive{\expandafter\let\expandafter}#1% + \csname bbl@normal@\string#1\endcsname} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bbl@firstcs} +% \begin{macro}{\bbl@scndcs} +% These macros have two arguments. They use one of their arguments +% to build a control sequence from. +% +% \begin{macrocode} +\def\bbl@firstcs#1#2{\csname#1\endcsname} +\def\bbl@scndcs#1#2{\csname#2\endcsname} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\declare@shorthand} +% The command |\declare@shorthand| is used to declare a shorthand +% on a certain level. It takes three arguments: +% \begin{enumerate} +% \item a name for the collection of shorthands, i.e. `system', or +% `dutch'; +% \item the character (sequence) that makes up the shorthand, +% i.e. |~| or |"a|; +% \item the code to be executed when the shorthand is encountered. +% \end{enumerate} +% +% \changes{babel~3.8b}{2004/04/19}{We need to support shorthands with +% and without argument in different groups; added the name of the +% group to the storage macro} +% \changes{babel~3.9a}{2012/07/03}{Check if shorthands are redefined} +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\textormath} +% Some of the shorthands that will be declared by the language +% definition files have to be usable in both text and mathmode. To +% achieve this the helper macro |\textormath| is provided. +% +% \changes{babel~3.9a}{2012/12/29}{Failed if an argument had a +% condicional. Use the more robust mechanism of \cs{XXXoftwo}} +% +% \begin{macrocode} +\def\textormath{% + \ifmmode + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\user@group} +% \begin{macro}{\language@group} +% \begin{macro}{\system@group} +% The current concept of `shorthands' supports three levels or +% groups of shorthands. For each level the name of the level or +% group is stored in a macro. The default is to have a user group; +% use language group `english' and have a system group called +% `system'. +% +% \begin{macrocode} +\def\user@group{user} +\def\language@group{english} +\def\system@group{system} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\useshorthands} +% This is the user level command to tell \LaTeX\ that user level +% shorthands will be used in the document. It takes one argument, +% the character that starts a shorthand. First note that this is +% user level, and then initialize and activate the character for +% use as a shorthand character (ie, it's active in the +% preamble). Languages can deactivate shorthands, so a starred +% version is also provided which activates them always after the +% language has been switched. +% +% \changes{babel~3.9a}{2012/08/05}{Now \cs{bbl@activate} makes sure +% the catcode is active, so this part is simplified} +% \changes{babel~3.9a}{2012/08/12}{User shorhands can be +% defined even with shorthands=off} +% +% \begin{macrocode} +\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 + {Cannot declare a shorthand turned off (\string#2)} + {Sorry, but you cannot use shorthands which have been\\% + turned off in the package options}}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\defineshorthand} +% +% \changes{babel~3.9a}{2012/08/05}{Added optional argument, to provide +% a way to (re)define language shorthands} +% \changes{babel~3.9a}{2012/08/25}{Extended for language-dependent +% user macros, with two new auxiliary macros} +% +% Currently we only support two groups of user level shorthands, +% named internally |user| and |user@<lang>| (language-dependent +% user shorthands). By default, only the first one is taken into +% account, but if the former is also used (in the optional argument +% of |\defineshorthand|) a new level is inserted for it +% (|user@generic|, done by |\bbl@set@user@generic|); we make also +% sure |{}| and |\protect| are taken into account in this new top +% level. +% +% \begin{macrocode} +\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}}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\languageshorthands} +% A user level command to change the language from which shorthands +% are used. Unfortunately, \babel{} currently does not keep track +% of defined groups, and therefore there is no way to catch a +% possible change in casing. +% +% \begin{macrocode} +\def\languageshorthands#1{\def\language@group{#1}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\aliasshorthand} +% First the new shorthand needs to be initialized, +% +% \begin{macrocode} +\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}% +% \end{macrocode} +% +% \changes{babel~3.9a}{2012/08/06}{Instead of letting the new shorthand to +% the original char, which very often didn't work, we define it +% directly} +% \changes{babel~3.9a}{2012/08/20}{Make sure both characters (old an +% new) are active} +% +% Then, we define the new shorthand in terms of the original +% one, but note with |\aliasshorthands{"}{/}| is +% |\active@prefix /\active@char/|, so we still need to let the +% lattest to |\active@char"|. +% +% \begin{macrocode} + \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}}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\@notshorthand} +% +% \changes{v3.8d}{2004/11/20}{Error message added} +% +% \begin{macrocode} +\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}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\shorthandon} +% \begin{macro}{\shorthandoff} +% The first level definition of these macros just passes the +% argument on to |\bbl@switch@sh|, adding |\@nil| at the end to +% denote the end of the list of characters. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \begin{macro}{\bbl@switch@sh} +% +% \changes{babel~3.9a}{2013/02/21}{Code revised} +% +% The macro |\bbl@switch@sh| takes the list of characters apart one +% by one and subsequently switches the category code of the +% shorthand character according to the first argument of +% |\bbl@switch@sh|. +% +% But before any of this switching takes place we make sure that +% the character we are dealing with is known as a shorthand +% character. If it is, a macro such as |\active@char"| should +% exist. +% +% Switching off and on is easy -- we just set the category +% code to `other' (12) and |\active|. With the starred version, the +% original catcode and the original definition, saved +% in |@initiate@active@char|, are restored. +% +% \begin{macrocode} +\def\bbl@switch@sh#1#2{% + \ifx#2\@nnil\else + \bbl@ifunset{bbl@active@\string#2}% + {\bbl@error + {I cannot 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% + \catcode`#212\relax + \or + \catcode`#2\active + \or + \csname bbl@oricat@\string#2\endcsname + \csname bbl@oridef@\string#2\endcsname + \fi}% + \bbl@afterfi\bbl@switch@sh#1% + \fi} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% \end{macro} +% +% \changes{babel~3.9a}{2012/06/16}{Added code} +% +% Note the value is that at the expansion time, eg, in the preample +% shorhands are usually deactivated. +% +% \begin{macrocode} +\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\languagename @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 +% \end{macrocode} +% +% \changes{babel~3.9a}{2012/12/27}{Removed redundant system declarations} +% +% \begin{macro}{\bbl@prim@s} +% \begin{macro}{\bbl@pr@m@s} +% +% \changes{babel~3.9a}{2012/07/29}{\cs{bbl@pr@m@s} rewritten to +% take into account catcodes for both the quote and the hat} +% +% One of the internal macros that are involved in substituting +% |\prime| for each right quote in mathmode is |\prim@s|. This +% checks if the next character is a right quote. When the right +% quote is active, the definition of this macro needs to be adapted +% to look also for an active right quote; the hat could be active, +% too. +% +% \begin{macrocode} +\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 +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% Usually the |~| is active and expands to \verb*=\penalty\@M\ =. +% When it is written to the \file{.aux} file it is written +% expanded. To prevent that and to be able to use the character |~| +% as a start character for a shorthand, it is redefined here as a +% one character shorthand on system level. The system declaration +% is in most cases redundant (when |~| is still a non-break space), +% and in some cases is inconvenient (if |~| has been redefined); +% however, for backward compatibility it is maintained (some +% existing documents may rely on the \babel{} value). +% +% \changes{babel~3.9i}{2014/02/06}{Moved from above, after +% \cs{bbl@usehook} has been defined} +% \changes{babel~3.9k}{2014/02/06}{Moved again at the original place} +% +% \begin{macrocode} +\initiate@active@char{~} +\declare@shorthand{system}{~}{\leavevmode\nobreak\ } +\bbl@activate{~} +% \end{macrocode} +% +% \begin{macro}{\OT1dqpos} +% \begin{macro}{\T1dqpos} +% The position of the double quote character is different for the +% OT1 and T1 encodings. It will later be selected using the +% |\f@encoding| macro. Therefore we define two macros here to store +% the position of the character in these encodings. +% +% \begin{macrocode} +\expandafter\def\csname OT1dqpos\endcsname{127} +\expandafter\def\csname T1dqpos\endcsname{4} +% \end{macrocode} +% +% When the macro |\f@encoding| is undefined (as it is in plain +% \TeX) we define it here to expand to \texttt{OT1} +% +% \begin{macrocode} +\ifx\f@encoding\@undefined + \def\f@encoding{OT1} +\fi +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \subsection{Language attributes} +% +% Language attributes provide a means to give the user control over +% which features of the language definition files he wants to +% enable. +% \begin{macro}{\languageattribute} +% +% \changes{babel~3.9a}{2012/09/07}{Use \cs{@expandtwoargs} with +% \cs{in@}} +% +% The macro |\languageattribute| checks whether its arguments are +% valid and then activates the selected language attribute. +% First check whether the language is known, and then process each +% attribute in the list. +% +% \begin{macrocode} +\bbl@trace{Language attributes} +\newcommand\languageattribute[2]{% + \def\bbl@tempc{#1}% + \bbl@fixname\bbl@tempc + \bbl@iflanguage\bbl@tempc{% + \bbl@vforeach{#2}{% +% \end{macrocode} +% +% We want to make sure that each attribute is selected only once; +% therefore we store the already selected attributes in +% |\bbl@known@attribs|. When that control sequence is not yet +% defined this attribute is certainly not selected before. +% +% \begin{macrocode} + \ifx\bbl@known@attribs\@undefined + \in@false + \else +% \end{macrocode} +% +% Now we need to see if the attribute occurs in the list of +% already selected attributes. +% +% \begin{macrocode} + \bbl@xin@{,\bbl@tempc-##1,}{,\bbl@known@attribs,}% + \fi +% \end{macrocode} +% +% When the attribute was in the list we issue a warning; this might +% not be the users intention. +% +% \begin{macrocode} + \ifin@ + \bbl@warning{% + You have more than once selected the attribute '##1'\\% + for language #1}% + \else +% \end{macrocode} +% +% When we end up here the attribute is not selected before. So, we +% add it to the list of selected attributes and execute the +% associated \TeX-code. +% +% \begin{macrocode} + \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}}} +% \end{macrocode} +% +% This command should only be used in the preamble of a document. +% +% \begin{macrocode} +\@onlypreamble\languageattribute +% \end{macrocode} +% +% The error text to be issued when an unknown attribute is +% selected. +% +% \begin{macrocode} +\newcommand*{\@attrerr}[2]{% + \bbl@error + {The attribute #2 is unknown for language #1.}% + {Your command will be ignored, type <return> to proceed}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@declare@ttribute} +% This command adds the new language/attribute combination to the +% list of known attributes. +% +% Then it defines a control sequence to be executed when the +% attribute is used in a document. The result of this should be +% that the macro |\extras...| for the current language is extended, +% otherwise the attribute will not work as its code is removed from +% memory at |\begin{document}|. +% +% \begin{macrocode} +\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}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@ifattributeset} +% This internal macro has 4 arguments. It can be used to interpret +% \TeX\ code based on whether a certain attribute was set. This +% command should appear inside the argument to |\AtBeginDocument| +% because the attributes are set in the document preamble, +% \emph{after} \babel\ is loaded. +% +% The first argument is the language, the second argument the +% attribute being checked, and the third and fourth arguments are +% the true and false clauses. +% +% \begin{macrocode} +\def\bbl@ifattributeset#1#2#3#4{% +% \end{macrocode} +% +% First we need to find out if any attributes were set; if not +% we're done. +% +% \begin{macrocode} + \ifx\bbl@known@attribs\@undefined + \in@false + \else +% \end{macrocode} +% +% The we need to check the list of known attributes. +% +% \begin{macrocode} + \bbl@xin@{,#1-#2,}{,\bbl@known@attribs,}% + \fi +% \end{macrocode} +% +% When we're this far |\ifin@| has a value indicating if the +% attribute in question was set or not. Just to be safe the code to +% be executed is `thrown over the |\fi|'. +% +% \begin{macrocode} + \ifin@ + \bbl@afterelse#3% + \else + \bbl@afterfi#4% + \fi + } +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@ifknown@ttrib} +% An internal macro to check whether a given language/attribute is +% known. The macro takes 4 arguments, the language/attribute, the +% attribute list, the \TeX-code to be executed when the attribute +% is known and the \TeX-code to be executed otherwise. +% +% \begin{macrocode} +\def\bbl@ifknown@ttrib#1#2{% +% \end{macrocode} +% +% We first assume the attribute is unknown. +% +% \begin{macrocode} + \let\bbl@tempa\@secondoftwo +% \end{macrocode} +% +% Then we loop over the list of known attributes, trying to find a +% match. +% +% \begin{macrocode} + \bbl@loopx\bbl@tempb{#2}{% + \expandafter\in@\expandafter{\expandafter,\bbl@tempb,}{,#1,}% + \ifin@ +% \end{macrocode} +% +% When a match is found the definition of |\bbl@tempa| is changed. +% +% \begin{macrocode} + \let\bbl@tempa\@firstoftwo + \else + \fi}% +% \end{macrocode} +% +% Finally we execute |\bbl@tempa|. +% +% \begin{macrocode} + \bbl@tempa +} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@clear@ttribs} +% This macro removes all the attribute code from \LaTeX's memory at +% |\begin{document}| time (if any is present). +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \end{macro} +% +% \subsection{Support for saving macro definitions} +% +% To save the meaning of control sequences using |\babel@save|, we +% use temporary control sequences. To save hash table entries for +% these control sequences, we don't use the name of the control +% sequence to be saved to construct the temporary name. Instead we +% simply use the value of a counter, which is reset to zero each time +% we begin to save new values. This works well because we release +% the saved meanings before we begin to save a new set of control +% sequence meanings (see |\selectlanguage| and |\originalTeX|). Note +% undefined macros are not undefined any more when saved -- they are +% |\relax|'ed. +% +% \begin{macro}{\babel@savecnt} +% \begin{macro}{\babel@beginsave} +% The initialization of a new save cycle: reset the counter to +% zero. +% +% \begin{macrocode} +\bbl@trace{Macros for saving definitions} +\def\babel@beginsave{\babel@savecnt\z@} +% \end{macrocode} +% +% Before it's forgotten, allocate the counter and initialize all. +% +% \begin{macrocode} +\newcount\babel@savecnt +\babel@beginsave +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\babel@save} +% The macro |\babel@save|\meta{csname} saves the current meaning of +% the control sequence \meta{csname} to +% |\originalTeX|\footnote{\cs{originalTeX} has to be +% expandable, i.\,e.\ you shouldn't let it to \cs{relax}.}. +% To do this, we let the current meaning to a temporary control +% sequence, the restore commands are appended to |\originalTeX| and +% the counter is incremented. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\babel@savevariable} +% +% The macro |\babel@savevariable|\meta{variable} saves the value of +% the variable. \meta{variable} can be anything allowed after the +% |\the| primitive. +% +% \begin{macrocode} +\def\babel@savevariable#1{% + \toks@\expandafter{\originalTeX #1=}% + \bbl@exp{\def\\\originalTeX{\the\toks@\the#1\relax}}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@frenchspacing} +% \begin{macro}{\bbl@nonfrenchspacing} +% Some languages need to have |\frenchspacing| in effect. Others +% don't want that. The command |\bbl@frenchspacing| switches it on +% when it isn't already in effect and |\bbl@nonfrenchspacing| +% switches it off if necessary. +% +% \begin{macrocode} +\def\bbl@frenchspacing{% + \ifnum\the\sfcode`\.=\@m + \let\bbl@nonfrenchspacing\relax + \else + \frenchspacing + \let\bbl@nonfrenchspacing\nonfrenchspacing + \fi} +\let\bbl@nonfrenchspacing\nonfrenchspacing +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \subsection{Short tags} +% +% \begin{macro}{\babeltags} +% This macro is straightforward. After zapping spaces, we +% loop over the list and define the macros |\text|\m{tag} and +% |\|\m{tag}. Definitions are first expanded so that they don't +% contain |\csname| but the actual macro. +% +% \changes{babel~3.9i}{2014/02/21}{Macro \cs{babeltags} added} +% +% \begin{macrocode} +\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\@@}} +% \end{macrocode} +% +% \end{macro} +% +% \subsection{Hyphens} +% +% \begin{macro}{\babelhyphenation} +% +% This macro saves hyphenation exceptions. Two macros are used to +% store them: |\bbl@hyphenation@| for the global ones and +% |\bbl@hyphenation<lang>| for language ones. See |\bbl@patterns| +% above for further details. We make sure there is a space between +% words when multiple commands are used. +% +% \changes{babel~3.9a}{2012/08/28}{Macro added} +% +% \begin{macrocode} +\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}% + \@empty + {\csname bbl@hyphenation@\bbl@tempa\endcsname\space}% + #2}}}% + \fi}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@allowhyphens} +% +% \changes{babel-3.9a}{2012/07/28}{Replaced many \cs{allowhyphens} by +% \cs{bbl@allowhyphen}. They were either no-op or executed always.} +% \changes{babel-3.9i}{2014/01/29}{\cs{bbl@allowhyphens} must be +% ignored at the beginning of a paragraph or table cell.} +% \changes{babel-3.9t}{2017/04/26}{Fixed misplaced \cs{nobreak} - +% sx366454 - soft hyphens could vanish.} +% +% This macro makes hyphenation possible. Basically its definition +% is nothing more than |\nobreak| |\hskip| \texttt{0pt plus +% 0pt}\footnote{\TeX\ begins and ends a word for hyphenation at a +% glue node. The penalty prevents a linebreak at this glue node.}. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \end{macro} +% +% \changes{babel-3.9a}{2012/08/27}{Added \cs{babelhyphen} and related +% macros} +% +% \begin{macro}{\babelhyphen} +% +% Macros to insert common hyphens. Note the space before |@| in +% |\babelhyphen|. Instead of protecting it with +% |\DeclareRobustCommand|, which could insert a |\relax|, we use +% the same procedure as shorthands, with |\active@prefix|. +% +% \begin{macrocode} +\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}} +% \end{macrocode} +% +% The following two commands are used to wrap the ``hyphen'' and +% set the behavior of the rest of the word -- the version with a +% single |@| is used when further hyphenation is allowed, while +% that with |@@| if no more hyphen are allowed. In both cases, if +% the hyphen is preceded by a positive space, breaking after the +% hyphen is disallowed. +% +% There should not be a discretionaty after a hyphen at the +% beginning of a word, so it is prevented if preceded by a +% skip. Unfortunately, this does handle cases like ``(-suffix)''. +% |\nobreak| is always preceded by |\leavevmode|, in case the +% shorthand starts a paragraph. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% The following macro inserts the hyphen char. +% +% \begin{macrocode} +\def\bbl@hyphenchar{% + \ifnum\hyphenchar\font=\m@ne + \babelnullhyphen + \else + \char\hyphenchar\font + \fi} +% \end{macrocode} +% +% Finally, we define the hyphen ``types''. Their names will not +% change, so you may use them in |ldf|'s. After a space, the +% |\mbox| in |\bbl@hy@nobreak| is redundant. +% +% \begin{macrocode} +\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{}{}{}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@disc} +% For some languages the macro |\bbl@disc| is used to ease the +% insertion of discretionaries for letters that behave `abnormally' +% at a breakpoint. +% +% \begin{macrocode} +\def\bbl@disc#1#2{\nobreak\discretionary{#2-}{}{#1}\bbl@allowhyphens} +% \end{macrocode} +% +% \end{macro} +% \subsection{Multiencoding strings} +% +% \changes{babel~3.9a}{2012/09/05}{Added tentative code for string +% declarations} +% \changes{babel~3.9a}{2012/12/24}{Added hooks} +% +% The aim following commands is to provide a commom interface for +% strings in several encodings. They also contains several hooks which +% can be ued by \luatex{} and \xetex. The code is organized here with +% pseudo-guards, so we start with the basic commands. +% +% \paragraph{Tools} +% +% But first, a couple of tools. The first one makes global a local +% variable. This is not the best solution, but it works. +% +% \begin{macrocode} +\bbl@trace{Multiencoding strings} +\def\bbl@toglobal#1{\global\let#1#1} +\def\bbl@recatcode#1{% + \@tempcnta="7F + \def\bbl@tempa{% + \ifnum\@tempcnta>"FF\else + \catcode\@tempcnta=#1\relax + \advance\@tempcnta\@ne + \expandafter\bbl@tempa + \fi}% + \bbl@tempa} +% \end{macrocode} +% +% The second one. We need to patch |\@uclclist|, but it is done once +% and only if |\SetCase| is used or if strings are encoded. The code +% is far from satisfactory for several reasons, including the fact +% |\@uclclist| is not a list any more. Therefore a package option is +% added to ignore it. Instead of gobbling the macro +% getting the next two elements (usually |\reserved@a|), we pass it as +% argument to |\bbl@uclc|. The parser is restarted inside +% |\|\m{lang}|@bbl@uclc| because we do not know how many expansions +% are necessary (depends on whether strings are encoded). The last +% part is tricky -- when uppercasing, we have: +%\begin{verbatim} +% \let\bbl@tolower\@empty\bbl@toupper\@empty +%\end{verbatim} +% and starts over (and similarly when lowercasing). +% +% \changes{babel~3.9l}{2014/07/29}{Now tries to catch the parsing +% macro. Removed some redundant code. Option |nocase|.} +% +% \begin{macrocode} +\@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}}} +% \end{macrocode} +% +% \begin{macrocode} +%<<*More package options>> +\DeclareOption{nocase}{} +%<</More package options>> +% \end{macrocode} +% +% The following package options control the behavior of |\SetString|. +% +% \begin{macrocode} +%<<*More package options>> +\let\bbl@opt@strings\@nnil % accept strings=value +\DeclareOption{strings}{\def\bbl@opt@strings{\BabelStringsDefault}} +\DeclareOption{strings=encoded}{\let\bbl@opt@strings\relax} +\def\BabelStringsDefault{generic} +%<</More package options>> +% \end{macrocode} +% +% \paragraph{Main command} This is the main command. With the +% first use it is redefined to omit the basic setup in subsequent +% blocks. We make sure strings contain actual letters in the range +% 128-255, not active characters. +% +% \changes{babel~3.9g}{2013/07/29}{Added starred variant. A bit of +% clean up. Removed \cs{UseString}, which didn't work.} +% \changes{babel~3.9g}{2013/08/01}{Now several languages can be +% processed with \cs{BabelLanguages}, if set in the ldf.} +% +% \begin{macrocode} +\@onlypreamble\StartBabelCommands +\def\StartBabelCommands{% + \begingroup + \bbl@recatcode{11}% + <@Macros local to BabelCommands@> + \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} +% \end{macrocode} +% +% Parse the encoding info to get the label, input, and font parts. +% +% Select the behavior of |\SetString|. Thre are two main cases, +% depending of if there is an optional argument: without it and +% |strings=encoded|, strings are defined +% always; otherwise, they are set only if they are still undefined +% (ie, fallback values). With labelled blocks and +% |strings=encoded|, define the strings, but with another value, +% define strings only if the current label or font encoding is the +% value of |strings|; otherwise (ie, no |strings| or a block whose +% label is not in |strings=|) do nothing. +% +% We presume the current block is not loaded, and therefore set +% (above) a couple of default values to gobble the arguments. Then, +% these macros are redefined if necessary according to several +% parameters. +% +% \changes{babel~3.9g}{2013/08/04}{Use \cs{ProvideTextCommand}, which +% does with encoded strings what the manual says.} +% \changes{babel~3.9h}{2013/11/08}{Tidied up code related to +% \cs{bbl@scswitch}} +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% There are two versions of |\bbl@scswitch|. The first version is +% used when |ldf|s are read, and it makes sure +% |\|\m{group}\m{language} is reset, but only once (|\bbl@screset| +% is used to keep track of this). The second version is used in the +% preamble and packages loaded after \babel{} and does nothing. The +% macro |\bbl@forlang| loops |\bbl@L| but its body is executed only +% if the value is in |\BabelLanguages| (inside \babel) or +% |\date|\m{language} is defined (after \babel{} has been loaded). +% There are also two version of |\bbl@forlang|. The first one skips +% the current iteration if the language is not in |\BabelLanguages| +% (used in |ldf|s), and the second one skips undefined languages +% (after \babel{} has been loaded) . +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% Now we define commands to be used inside |\StartBabelCommands|. +% +% \paragraph{Strings} The following macro is the actual definition +% of |\SetString| when it is ``active'' +% +% First save the ``switcher''. Create it if undefined. Strings are +% defined only if undefined (ie, like |\providescommmand|). With +% the event |stringprocess| you can preprocess the string by +% manipulating the value of |\BabelString|. If there are several +% hooks assigned to this event, preprocessing is done in the same +% order as defined. Finally, the string is set. +% +% \changes{babel~3.9g}{2013/07/29}{Added \cs{bbl@forlang} to ignore in +% the preamble unknown languages, as described in the doc.} +% +% \begin{macrocode} +\def\bbl@setstring#1#2{% + \bbl@forlang\bbl@tempa{% + \edef\bbl@LC{\bbl@tempa\bbl@stripslash#1}% + \bbl@ifunset{\bbl@LC}% eg, \germanchaptername + {\global\expandafter % TODO - con \bbl@exp ? + \bbl@add\csname\bbl@G\bbl@tempa\expandafter\endcsname\expandafter + {\expandafter\bbl@scset\expandafter#1\csname\bbl@LC\endcsname}}% + {}% + \def\BabelString{#2}% + \bbl@usehooks{stringprocess}{}% + \expandafter\bbl@stringdef + \csname\bbl@LC\expandafter\endcsname\expandafter{\BabelString}}} +% \end{macrocode} +% +% Now, some addtional stuff to be used when encoded strings are +% used. Captions then include |\bbl@encoded| for string to be +% expanded in case transformations. It is |\relax| by default, but +% in |\MakeUppercase| and |\MakeLowercase| its value is a modified +% expandable |\@changed@cmd|. +% +% \changes{babel~3.9i}{2014/03/13}{Added code to expand captions in +% case transformations.} +% +% \begin{macrocode} +\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 +% \end{macrocode} +% +% Define |\SetStringLoop|, which is actually set inside +% |\StartBabelCommands|. The current definition is +% somewhat complicated because we need a count, but |\count@| is +% not under our control (remember |\SetString| may call hooks). +% Instead of defining a dedicated count, we just ``pre-expand'' +% its value. +% +% \changes{babel~3.9h}{2013/10/16}{Tidied up and bug fixed - first +% element expanded prematurely.} +% +% \begin{macrocode} +%<<*Macros local to BabelCommands>> +\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}}}% +%<</Macros local to BabelCommands>> +% \end{macrocode} +% +% \paragraph{Delaying code} Now the definition of +% |\AfterBabelCommands| when it is activated. +% +% \begin{macrocode} +\def\bbl@aftercmds#1{% + \toks@\expandafter{\bbl@scafter#1}% + \xdef\bbl@scafter{\the\toks@}} +% \end{macrocode} +% +% \paragraph{Case mapping} +% +% The command |\SetCase| provides a way to change the behavior of +% |\MakeUppercase| and |\MakeLowercase|. |\bbl@tempa| is set by the +% patched |\@uclclist| to the parsing command. +% +% \changes{babel~3.9h}{2013/11/08}{Use \cs{bbl@encstrings} - they +% should be defined always, even if no `strings'} +% +% \begin{macrocode} +%<<*Macros local to BabelCommands>> + \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}}}% +%<</Macros local to BabelCommands>> +% \end{macrocode} +% +% Macros to deal with case mapping for hyphenation. To decide if the +% document is monolingual or multilingual, we make a rough guess -- +% just see if there is a comma in the languages list, built in the +% first pass of the package options. +% +% \begin{macrocode} +%<<*Macros local to BabelCommands>> + \newcommand\SetHyphenMap[1]{% + \bbl@forlang\bbl@tempa{% + \expandafter\bbl@stringdef + \csname\bbl@tempa @bbl@hyphenmap\endcsname{##1}}} +%<</Macros local to BabelCommands>> +% \end{macrocode} +% +% There are 3 helper macros which do most of the work for you. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% The following package options control the behavior of +% hyphenation mapping. +% +% \changes{babel~3.9t}{2017/04/28}{Renamed \cs{bbl@hymapopt} to +% \cs{bbl@opt@hyphenmap} for consistency} +% +% \begin{macrocode} +%<<*More package options>> +\DeclareOption{hyphenmap=off}{\chardef\bbl@opt@hyphenmap\z@} +\DeclareOption{hyphenmap=first}{\chardef\bbl@opt@hyphenmap\@ne} +\DeclareOption{hyphenmap=select}{\chardef\bbl@opt@hyphenmap\tw@} +\DeclareOption{hyphenmap=other}{\chardef\bbl@opt@hyphenmap\thr@@} +\DeclareOption{hyphenmap=other*}{\chardef\bbl@opt@hyphenmap4\relax} +%<</More package options>> +% \end{macrocode} +% +% Initial setup to provide a default behavior if |hypenmap| +% is not set. +% +% \begin{macrocode} +\AtEndOfPackage{% + \ifx\bbl@opt@hyphenmap\@undefined + \bbl@xin@{,}{\bbl@language@opts}% + \chardef\bbl@opt@hyphenmap\ifin@4\else\@ne\fi + \fi} +% \end{macrocode} +% +% \subsection{Macros common to a number of languages} +% +% \begin{macro}{\set@low@box} +% The following macro is used to lower quotes to the same level as +% the comma. It prepares its argument in box register~0. +% +% \begin{macrocode} +\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@} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\save@sf@q} +% The macro |\save@sf@q| is used to save and reset the current +% space factor. +% +% \begin{macrocode} +\def\save@sf@q#1{\leavevmode + \begingroup + \edef\@SF{\spacefactor\the\spacefactor}#1\@SF + \endgroup} +% \end{macrocode} +% +% \end{macro} +% +% \subsection{Making glyphs available} +% +% This section makes a number of glyphs available that either do not +% exist in the \texttt{OT1} encoding and have to be `faked', or +% that are not accessible through \file{T1enc.def}. +% +% \subsubsection{Quotation marks} +% +% \begin{macro}{\quotedblbase} +% In the \texttt{T1} encoding the opening double quote at the +% baseline is available as a separate character, accessible via +% |\quotedblbase|. In the \texttt{OT1} encoding it is not +% available, therefore we make it available by lowering the normal +% open quote character to the baseline. +% +% \begin{macrocode} +\ProvideTextCommand{\quotedblbase}{OT1}{% + \save@sf@q{\set@low@box{\textquotedblright\/}% + \box\z@\kern-.04em\bbl@allowhyphens}} +% \end{macrocode} +% +% Make sure that when an encoding other than \texttt{OT1} or +% \texttt{T1} is used this glyph can still be typeset. +% +% \begin{macrocode} +\ProvideTextCommandDefault{\quotedblbase}{% + \UseTextSymbol{OT1}{\quotedblbase}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\quotesinglbase} +% We also need the single quote character at the baseline. +% +% \begin{macrocode} +\ProvideTextCommand{\quotesinglbase}{OT1}{% + \save@sf@q{\set@low@box{\textquoteright\/}% + \box\z@\kern-.04em\bbl@allowhyphens}} +% \end{macrocode} +% +% Make sure that when an encoding other than \texttt{OT1} or +% \texttt{T1} is used this glyph can still be typeset. +% +% \begin{macrocode} +\ProvideTextCommandDefault{\quotesinglbase}{% + \UseTextSymbol{OT1}{\quotesinglbase}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\guillemotleft} +% \begin{macro}{\guillemotright} +% The guillemet characters are not available in \texttt{OT1} +% encoding. They are faked. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% Make sure that when an encoding other than \texttt{OT1} or +% \texttt{T1} is used these glyphs can still be typeset. +% +% \begin{macrocode} +\ProvideTextCommandDefault{\guillemotleft}{% + \UseTextSymbol{OT1}{\guillemotleft}} +\ProvideTextCommandDefault{\guillemotright}{% + \UseTextSymbol{OT1}{\guillemotright}} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\guilsinglleft} +% \begin{macro}{\guilsinglright} +% The single guillemets are not available in \texttt{OT1} +% encoding. They are faked. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% Make sure that when an encoding other than \texttt{OT1} or +% \texttt{T1} is used these glyphs can still be typeset. +% +% \begin{macrocode} +\ProvideTextCommandDefault{\guilsinglleft}{% + \UseTextSymbol{OT1}{\guilsinglleft}} +\ProvideTextCommandDefault{\guilsinglright}{% + \UseTextSymbol{OT1}{\guilsinglright}} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \subsubsection{Letters} +% +% \begin{macro}{\ij} +% \begin{macro}{\IJ} +% The dutch language uses the letter `ij'. It is available in +% \texttt{T1} encoded fonts, but not in the \texttt{OT1} encoded +% fonts. Therefore we fake it for the \texttt{OT1} encoding. +% +% \changes{babel~3.9a}{2012/07/28}{Removed the first \cs{allowhyphens}. +% Moved the second one just after the kern.} +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% Make sure that when an encoding other than \texttt{OT1} or +% \texttt{T1} is used these glyphs can still be typeset. +% +% \begin{macrocode} +\ProvideTextCommandDefault{\ij}{% + \UseTextSymbol{OT1}{\ij}} +\ProvideTextCommandDefault{\IJ}{% + \UseTextSymbol{OT1}{\IJ}} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dj} +% \begin{macro}{\DJ} +% The croatian language needs the letters |\dj| and |\DJ|; they are +% available in the \texttt{T1} encoding, but not in the +% \texttt{OT1} encoding by default. +% +% Some code to construct these glyphs for the \texttt{OT1} encoding +% was made available to me by Stipcevic Mario, +% (\texttt{stipcevic@olimp.irb.hr}). +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% Make sure that when an encoding other than \texttt{OT1} or +% \texttt{T1} is used these glyphs can still be typeset. +% +% \begin{macrocode} +\ProvideTextCommandDefault{\dj}{% + \UseTextSymbol{OT1}{\dj}} +\ProvideTextCommandDefault{\DJ}{% + \UseTextSymbol{OT1}{\DJ}} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\SS} +% For the \texttt{T1} encoding |\SS| is defined and selects a +% specific glyph from the font, but for other encodings it is not +% available. Therefore we make it available here. +% +% \begin{macrocode} +\DeclareTextCommand{\SS}{OT1}{SS} +\ProvideTextCommandDefault{\SS}{\UseTextSymbol{OT1}{\SS}} +% \end{macrocode} +% +% \end{macro} +% +% \subsubsection{Shorthands for quotation marks} +% +% Shorthands are provided for a number of different quotation +% marks, which make them usable both outside and inside mathmode. +% They are defined with |\ProvideTextCommandDefault|, but this is +% very likely not required because their definitions are based on +% encoding dependent macros. +% +% \changes{babel~3.16}{2018/01/02}{Adapted to TU and refactored - +% redundant code.} +% +% \begin{macro}{\glq} +% \begin{macro}{\grq} +% +% \changes{babel~3.8b}{2004/05/02}{Made \cs{glq} fontencoding +% dependent as well} +% +% The `german' single quotes. +% +% \begin{macrocode} +\ProvideTextCommandDefault{\glq}{% + \textormath{\quotesinglbase}{\mbox{\quotesinglbase}}} +% \end{macrocode} +% +% The definition of |\grq| depends on the fontencoding. With +% \texttt{T1} encoding no extra kerning is needed. +% +% \begin{macrocode} +\ProvideTextCommand{\grq}{T1}{% + \textormath{\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} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\glqq} +% \begin{macro}{\grqq} +% +% \changes{babel~3.8b}{2004/05/02}{Made \cs{grqq} fontencoding +% dependent as well} +% +% The `german' double quotes. +% +% \begin{macrocode} +\ProvideTextCommandDefault{\glqq}{% + \textormath{\quotedblbase}{\mbox{\quotedblbase}}} +% \end{macrocode} +% +% The definition of |\grqq| depends on the fontencoding. With +% \texttt{T1} encoding no extra kerning is needed. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\flq} +% \begin{macro}{\frq} +% +% \changes{babel~3.8b}{2004/05/02}{Made \cs{flq} and \cs{frq} +% fontencoding dependent} +% +% The `french' single guillemets. +% +% \begin{macrocode} +\ProvideTextCommandDefault{\flq}{% + \textormath{\guilsinglleft}{\mbox{\guilsinglleft}}} +\ProvideTextCommandDefault{\frq}{% + \textormath{\guilsinglright}{\mbox{\guilsinglright}}} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\flqq} +% \begin{macro}{\frqq} +% +% \changes{babel~3.8b}{2004/05/02}{Made \cs{flqq} and \cs{frqq} +% fontencoding dependent} +% +% The `french' double guillemets. +% +% \begin{macrocode} +\ProvideTextCommandDefault{\flqq}{% + \textormath{\guillemotleft}{\mbox{\guillemotleft}}} +\ProvideTextCommandDefault{\frqq}{% + \textormath{\guillemotright}{\mbox{\guillemotright}}} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \subsubsection{Umlauts and tremas} +% +% The command |\"| needs to have a different effect for different +% languages. For German for instance, the `umlaut' should be +% positioned lower than the default position for placing it over +% the letters a, o, u, A, O and U. When placed over an e, i, E or I +% it can retain its normal position. For Dutch the same glyph is +% always placed in the lower position. +% +% \begin{macro}{\umlauthigh} +% +% \changes{v3.8a}{2004/02/19}{Use \cs{leavevmode}\cs{bgroup} to +% prevent problems when this command occurs in vertical mode.} +% +% \begin{macro}{\umlautlow} +% To be able to provide both positions of |\"| we provide two +% commands to switch the positioning, the default will be +% |\umlauthigh| (the normal positioning). +% +% \begin{macrocode} +\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 +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lower@umlaut} +% The command |\lower@umlaut| is used to position the |\"| closer +% to the letter. +% +% We want the umlaut character lowered, nearer to the letter. To do +% this we need an extra \meta{dimen} register. +% +% \begin{macrocode} +\expandafter\ifx\csname U@D\endcsname\relax + \csname newdimen\endcsname\U@D +\fi +% \end{macrocode} +% +% The following code fools \TeX's \texttt{make\_accent} procedure +% about the current x-height of the font to force another placement +% of the umlaut character. +% First we have to save the current x-height of the font, because +% we'll change this font dimension and this is always done +% globally. +% +% \changes{v3.8a}{2004/02/19}{Use \cs{leavevmode}\cs{bgroup} to +% prevent problems when this command occurs in vertical mode.} +% +% Then we compute the new x-height in such a way that the umlaut +% character is lowered to the base character. The value of +% \texttt{.45ex} depends on the \MF\ parameters with which the +% fonts were built. (Just try out, which value will look best.) +% If the new x-height is too low, it is not changed. +% Finally we call the |\accent| primitive, reset the old x-height +% and insert the base character in the argument. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \end{macro} +% +% For all vowels we declare |\"| to be a composite command which +% uses |\bbl@umlauta| or |\bbl@umlaute| to position the umlaut +% character. We need to be sure that these definitions override the +% ones that are provided when the package \pkg{fontenc} with +% option \Lopt{OT1} is used. Therefore these declarations are +% postponed until the beginning of the document. Note these +% definitions only apply to some languages, but +% babel sets them for \textit{all} languages -- you may want to +% redefine |\bbl@umlauta| and/or |\bbl@umlaute| for a language +% in the corresponding |ldf| (using the babel switching mechanism, +% of course). +% +% \begin{macrocode} +\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}}% +} +% \end{macrocode} +% +% Finally, the default is to use English as the main language. +% +% \changes{babel~3.9a}{2012-05-17}{Languages are best assigned with +% \cs{chardef}, not \cs{let}} +% +% \begin{macrocode} +\ifx\l@english\@undefined + \chardef\l@english\z@ +\fi +\main@language{english} +% \end{macrocode} +% +% \subsection{Layout} +% +% \textbf{Work in progress}. +% +% Layout is mainly intended to set bidi documents, but there is at +% least a tool useful in general. +% +% \begin{macrocode} +\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}% + \\\@nameuse{bbl@sspre@#1}% + \\\@nameuse{bbl@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}% + \\\@nameuse{bbl@sspre@#1}% + \\\@nameuse{bbl@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}}{} +% \end{macrocode} +% +% Now we load definition files for engines. +% +% \begin{macrocode} +\bbl@trace{Input engine specific macros} +\ifcase\bbl@engine + \input txtbabel.def +\or + \input luababel.def +\or + \input xebabel.def +\fi +% \end{macrocode} +% +% \changes{babel~3.18}{2018/02/14}{Moved \cs{babelprovide}, also for +% plain} +% +% \subsection{Creating languages} +% +% |\babelprovide| is a general purpose tool for creating +% languages. Currently it just creates the language infrastructure, +% but in the future it will be able to read data from |ini| files, as +% well as to create variants. Unlike the \textsf{nil} pseudo-language, +% captions are defined, but with a warning to invite the user to +% provide the real string. +% +% \changes{3.10}{2017/05/19}{Added \cs{babelprovide}} +% \changes{3.13}{2017/08/30}{Added \cs{import}, which also reads +% dates. Some refactoring in the ini reader.} +% \changes{3.15}{2017/10/30}{New keys script, language} +% \changes{3.16}{2018/01/02}{Make sure ensuring works even before +% the language is selected} +% +% +% \begin{macrocode} +\bbl@trace{Creating languages and reading ini files} +\newcommand\babelprovide[2][]{% + \let\bbl@savelangname\languagename + \def\languagename{#2}% + \let\bbl@KVP@captions\@nil + \let\bbl@KVP@import\@nil + \let\bbl@KVP@main\@nil + \let\bbl@KVP@script\@nil + \let\bbl@KVP@language\@nil + \let\bbl@KVP@dir\@nil + \let\bbl@KVP@hyphenrules\@nil + \let\bbl@KVP@mapfont\@nil + \bbl@forkv{#1}{\bbl@csarg\def{KVP@##1}{##2}}% TODO - error handling + \ifx\bbl@KVP@captions\@nil + \let\bbl@KVP@captions\bbl@KVP@import + \fi + \bbl@ifunset{date#2}% + {\bbl@provide@new{#2}}% + {\bbl@ifblank{#1}% + {\bbl@error + {If you want to modify `#2' you must tell how in\\% + the optional argument. Currently there are three\\% + options: captions=lang-tag, hyphenrules=lang-list\\% + import=lang-tag}% + {Use this macro as documented}}% + {\bbl@provide@renew{#2}}}% + \bbl@exp{\\\babelensure[exclude=\\\today]{#2}}% + \bbl@ifunset{bbl@ensure@\languagename}% + {\bbl@exp{% + \\\DeclareRobustCommand\<bbl@ensure@\languagename>[1]{% + \\\foreignlanguage{\languagename}% + {####1}}}}% + {}% + \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 + \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 + \AtBeginDocument{% + \expandafter\bbl@add\csname selectfont \endcsname{{\bbl@mapselect}}% + {\selectfont}}% + \def\bbl@mapselect{% + \let\bbl@mapselect\relax + \edef\bbl@prefontid{\fontid\font}}% + \def\bbl@mapdir##1{% + {\def\languagename{##1}\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 + \let\languagename\bbl@savelangname} +% \end{macrocode} +% +% Depending on whether or not the language exists, we define two macros. +% +% \begin{macrocode} +\def\bbl@provide@new#1{% + \@namedef{date#1}{}% marks lang exists - required by \StartBabelCommands + \@namedef{extras#1}{}% + \@namedef{noextras#1}{}% + \StartBabelCommands*{#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 + \bbl@read@ini{\bbl@KVP@captions}% Here all letters cat = 11 + \bbl@after@ini + \bbl@savestrings + \fi + \StartBabelCommands*{#1}{date}% + \ifx\bbl@KVP@import\@nil + \bbl@exp{% + \\\SetString\\\today{\\\bbl@nocaption{today}{\<#1today>}}}% + \else + \bbl@savetoday + \bbl@savedate + \fi + \EndBabelCommands + \bbl@exp{% + \def\<#1hyphenmins>{% + {\bbl@ifunset{bbl@lfthm@#1}{2}{\@nameuse{bbl@lfthm@#1}}}% + {\bbl@ifunset{bbl@rgthm@#1}{3}{\@nameuse{bbl@rgthm@#1}}}}}% + \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}% Here all letters cat = 11 + \bbl@after@ini + \bbl@savestrings + \EndBabelCommands + \fi + \ifx\bbl@KVP@import\@nil\else + \StartBabelCommands*{#1}{date}% + \bbl@savetoday + \bbl@savedate + \EndBabelCommands + \fi + \bbl@provide@hyphens{#1}} +% \end{macrocode} +% +% The |hyphenrules| option is handled with an auxiliary macro. +% +% \changes{3.14}{2017/10/03}{Take into account ini settings for +% hyphenrules if `import'.} +% +% \begin{macrocode} +\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\else % if importing + \bbl@exp{% and hyphenrules is not empty + \\\bbl@ifblank{\@nameuse{bbl@hyphr@#1}}% + {}% + {\let\\\bbl@tempa\<l@\@nameuse{bbl@hyphr@\languagename}>}}% + \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 +% \end{macrocode} +% +% The reader of |ini| files. There are 3 possible cases: a section name +% (in the form |[...]|), a comment (starting with |;|) and a +% key/value pair. \textit{TODO - Work in progress.} +% +% \begin{macrocode} +\def\bbl@read@ini#1{% + \openin1=babel-#1.ini + \ifeof1 + \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 + \let\bbl@section\@empty + \let\bbl@savestrings\@empty + \let\bbl@savetoday\@empty + \let\bbl@savedate\@empty + \let\bbl@inireader\bbl@iniskip + \bbl@info{Importing data from babel-#1.ini for \languagename}% + \loop + \if T\ifeof1F\fi T\relax % Trick, because inside \loop + \endlinechar\m@ne + \read1 to \bbl@line + \endlinechar`\^^M + \ifx\bbl@line\@empty\else + \expandafter\bbl@iniline\bbl@line\bbl@iniline + \fi + \repeat + \fi} +\def\bbl@iniline#1\bbl@iniline{% + \@ifnextchar[\bbl@inisec{\@ifnextchar;\bbl@iniskip\bbl@inireader}#1\@@}% ] +% \end{macrocode} +% +% The special cases for comment lines and sections are handled by the +% two following commands. In sections, we provide the posibility to +% take extra actions at the end or at the start (TODO - but note the last +% section is not ended). By default, key=val pairs are ignored. +% +% \begin{macrocode} +\def\bbl@iniskip#1\@@{}% if starts with ; +\def\bbl@inisec[#1]#2\@@{% if starts with opening bracket + \@nameuse{bbl@secpost@\bbl@section}% ends previous section + \def\bbl@section{#1}% + \@nameuse{bbl@secpre@\bbl@section}% starts current section + \bbl@ifunset{bbl@secline@#1}% + {\let\bbl@inireader\bbl@iniskip}% + {\bbl@exp{\let\\\bbl@inireader\<bbl@secline@#1>}}} +% \end{macrocode} +% +% Reads a key=val line and stores the trimmed val in +% |\bbl@@kv@<section>.<key>|. +% +% \begin{macrocode} +\def\bbl@inikv#1=#2\@@{% key=value + \bbl@trim@def\bbl@tempa{#1}% + \bbl@trim\toks@{#2}% + \bbl@csarg\edef{@kv@\bbl@section.\bbl@tempa}{\the\toks@}} +% \end{macrocode} +% +% The previous assignments are local, so we need to export them. If +% the value is empty, we can provide a default value. +% +% \begin{macrocode} +\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}} +% \end{macrocode} +% +% Key-value pairs are treated differently depending on the section in +% the |ini| file. The following macros are the readers for +% |identification| and |typography|. +% +% \begin{macrocode} +\let\bbl@secline@identification\bbl@inikv +\def\bbl@secpost@identification{% + \bbl@exportkey{lname}{identification.name.english}{}% + \bbl@exportkey{lbcp}{identification.tag.bcp47}{}% + \bbl@exportkey{lotf}{identification.tag.opentype}{dflt}% + \bbl@exportkey{sname}{identification.script.name}{}% + \bbl@exportkey{sbcp}{identification.script.tag.bcp47}{}% + \bbl@exportkey{sotf}{identification.script.tag.opentype}{DFLT}} +\let\bbl@secline@typography\bbl@inikv +\def\bbl@after@ini{% + \bbl@exportkey{lfthm}{typography.lefthyphenmin}{2}% + \bbl@exportkey{rgthm}{typography.righthyphenmin}{3}% + \bbl@exportkey{hyphr}{typography.hyphenrules}{}% + \bbl@xin@{0.9}{\@nameuse{bbl@@kv@identification.version}}% + \ifin@ + \bbl@warning{% + The `\languagename' date format may not be suitable\\% + for proper typesetting, and therefore it very likely will\\% + change in a future release. Reported}% + \fi + \bbl@toglobal\bbl@savetoday + \bbl@toglobal\bbl@savedate} +% \end{macrocode} +% +% Now |captions| and |captions.licr|, depending on the engine. And +% also for dates. They rely on a few auxilary macros. +% +% \begin{macrocode} +\ifcase\bbl@engine + \bbl@csarg\def{secline@captions.licr}#1=#2\@@{% + \bbl@ini@captions@aux{#1}{#2}} + \bbl@csarg\def{secline@date.gregorian}#1=#2\@@{% for defaults + \bbl@ini@dategreg#1...\relax{#2}} + \bbl@csarg\def{secline@date.gregorian.licr}#1=#2\@@{% override + \bbl@ini@dategreg#1...\relax{#2}} +\else + \def\bbl@secline@captions#1=#2\@@{% + \bbl@ini@captions@aux{#1}{#2}} + \bbl@csarg\def{secline@date.gregorian}#1=#2\@@{% + \bbl@ini@dategreg#1...\relax{#2}} +\fi +% \end{macrocode} +% +% The auxiliary macro for captions define |\<caption>name|. +% +% \begin{macrocode} +\def\bbl@ini@captions@aux#1#2{% + \bbl@trim@def\bbl@tempa{#1}% + \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@}}}} +% \end{macrocode} +% +% But dates are more complex. The full date format is stores in +% |date.gregorian|, so we must read it in non-Unicode engines, too. +% +% \changes{3.16}{2018/01/02}{Fix - dates were severely broken.} +% +% \begin{macrocode} +\bbl@csarg\def{secpre@date.gregorian.licr}{% + \ifcase\bbl@engine\let\bbl@savedate\@empty\fi} +\def\bbl@ini@dategreg#1.#2.#3.#4\relax#5{% TODO - ignore with 'captions' + \bbl@trim@def\bbl@tempa{#1.#2}% + \bbl@ifsamestring{\bbl@tempa}{months.wide}% + {\bbl@trim@def\bbl@tempa{#3}% + \bbl@trim\toks@{#5}% + \bbl@exp{% + \\\bbl@add\\\bbl@savedate{% + \\\SetString\<month\romannumeral\bbl@tempa name>{\the\toks@}}}}% + {\bbl@ifsamestring{\bbl@tempa}{date.long}% + {\bbl@trim@def\bbl@toreplace{#5}% + \bbl@TG@@date + \global\bbl@csarg\let{date@\languagename}\bbl@toreplace + \bbl@exp{% + \gdef\<\languagename date>{\\\protect\<\languagename date >}% + \gdef\<\languagename date >####1####2####3{% + \\\bbl@usedategrouptrue + \<bbl@ensure@\languagename>{% + \<bbl@date@\languagename>{####1}{####2}{####3}}}% + \\\bbl@add\\\bbl@savetoday{% + \\\SetString\\\today{% + \<\languagename date>{\\\the\year}{\\\the\month}{\\\the\day}}}}}}% + {}} +% \end{macrocode} +% +% Dates will require some macros for the basic formatting. They may be +% redefined by language, so ``semi-public'' names (camel case) are +% used. Oddly enough, the CLDR places particles like “de” +% inconsistenly in either in the date or in the month name. +% +% \begin{macrocode} +\newcommand\BabelDateSpace{\nobreakspace} +\newcommand\BabelDateDot{.\@} +\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#1name\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}} +\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}}% +% Note after \bbl@replace \toks@ contains the resulting string. +% TODO - Using this implicit behavior doesn't seem a good idea. + \bbl@replace@finish@iii\bbl@toreplace} +% \end{macrocode} +% +% Language and Script values to be used when defining a font or +% setting the direction are set with the following macros. +% +% \begin{macrocode} +\def\bbl@provide@lsys#1{% + \bbl@ifunset{bbl@lname@#1}% + {\bbl@ini@ids{#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}}}% + \bbl@csarg\bbl@toglobal{lsys@#1}}% + % \bbl@exp{% TODO - should be global + % \<keys_if_exist:nnF>{fontspec-opentype/Script}{\bbl@cs{sname@#1}}% + % {\\\newfontscript{\bbl@cs{sname@#1}}{\bbl@cs{sotf@#1}}}% + % \<keys_if_exist:nnF>{fontspec-opentype/Language}{\bbl@cs{lname@#1}}% + % {\\\newfontlanguage{\bbl@cs{lname@#1}}{\bbl@cs{lotf@#1}}}}} +% \end{macrocode} +% +% The following |ini| reader ignores everything but the +% |identification| section. It is called when a font is defined (ie, +% when the language is first selected) to know which script/language +% must be enabled. This means we must make sure a few characters are +% not active. The |ini| is not read directly, but with a proxy |tex| +% file named as the language. +% +% \changes{3.16}{2018/01/02}{Load ids inside a box, to prevent extra +% spaces.} +% +% \begin{macrocode} +\def\bbl@ini@ids#1{% + \def\BabelBeforeIni##1##2{% + \begingroup + \bbl@add\bbl@secpost@identification{\closein1 }% + \catcode`\[=12 \catcode`\]=12 \catcode`\==12 + \bbl@read@ini{##1}% + \endgroup}% boxed, to avoid extra spaces: + {\setbox\z@\hbox{\InputIfFileExists{babel-#1.tex}{}{}}}} +% \end{macrocode} +% +% \section{The kernel of Babel (\texttt{babel.def}, only \LaTeX)} +% +% \subsection{The redefinition of the style commands} +% +% The rest of the code in this file can only be processed by +% \LaTeX, so we check the current format. If it is plain \TeX, +% processing should stop here. But, because of the need to limit +% the scope of the definition of |\format|, a macro that is used +% locally in the following |\if|~statement, this comparison is done +% inside a group. To prevent \TeX\ from complaining about an +% unclosed group, the processing of the command |\endinput| is +% deferred until after the group is closed. This is accomplished by +% the command |\aftergroup|. +% +% \begin{macrocode} +{\def\format{lplain} +\ifx\fmtname\format +\else + \def\format{LaTeX2e} + \ifx\fmtname\format + \else + \aftergroup\endinput + \fi +\fi} +% \end{macrocode} +% +% \subsection{Cross referencing macros} +% +% The \LaTeX\ book states: +% \begin{quote} +% The \emph{key} argument is any sequence of letters, digits, and +% punctuation symbols; upper- and lowercase letters are regarded as +% different. +% \end{quote} +% When the above quote should still be true when a document is +% typeset in a language that has active characters, special care +% has to be taken of the category codes of these characters when +% they appear in an argument of the cross referencing macros. +% +% When a cross referencing command processes its argument, all +% tokens in this argument should be character tokens with category +% `letter' or `other'. +% +% The only way to accomplish this in most cases is to use the trick +% described in the \TeX book~\cite{DEK} (Appendix~D, page~382). +% The primitive |\meaning| applied to a token expands to the +% current meaning of this token. For example, `|\meaning\A|' with +% |\A| defined as `|\def\A#1{\B}|' expands to the characters +% `|macro:#1->\B|' with all category codes set to `other' or +% `space'. +% \begin{macro}{\newlabel} +% The macro |\label| writes a line with a |\newlabel| command +% into the |.aux| file to define labels. +% +% \begin{macrocode} +%\bbl@redefine\newlabel#1#2{% +% \@safe@activestrue\org@newlabel{#1}{#2}\@safe@activesfalse} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\@newl@bel} +% We need to change the definition of the \LaTeX-internal macro +% |\@newl@bel|. This is needed because we need to make sure that +% shorthand characters expand to their non-active version. +% +% The following package options control which macros are to be +% redefined. +% +% \begin{macrocode} +%<<*More package options>> +\DeclareOption{safe=none}{\let\bbl@opt@safe\@empty} +\DeclareOption{safe=bib}{\def\bbl@opt@safe{B}} +\DeclareOption{safe=ref}{\def\bbl@opt@safe{R}} +%<</More package options>> +% \end{macrocode} +% +% First we open a new group to keep the changed setting of +% |\protect| local and then we set the |@safe@actives| switch to +% true to make sure that any shorthand that appears in any of the +% arguments immediately expands to its non-active self. +% +% \begin{macrocode} +\bbl@trace{Cross referencing macros} +\ifx\bbl@opt@safe\@empty\else + \def\@newl@bel#1#2#3{% + {\@safe@activestrue + \bbl@ifunset{#1@#2}% + \relax + {\gdef\@multiplelabels{% + \@latex@warning@no@line{There were multiply-defined labels}}% + \@latex@warning@no@line{Label `#2' multiply defined}}% + \global\@namedef{#1@#2}{#3}}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\@testdef} +% An internal \LaTeX\ macro used to test if the labels that have +% been written on the |.aux| file have changed. It is called by +% the |\enddocument| macro. This macro needs to be completely +% rewritten, using |\meaning|. The reason for this is that in some +% cases the expansion of |\#1@#2| contains the same characters as +% the |#3|; but the character codes differ. Therefore \LaTeX\ keeps +% reporting that the labels may have changed. +% +% \begin{macrocode} + \CheckCommand*\@testdef[3]{% + \def\reserved@a{#3}% + \expandafter\ifx\csname#1@#2\endcsname\reserved@a + \else + \@tempswatrue + \fi} +% \end{macrocode} +% +% Now that we made sure that |\@testdef| still has the same +% definition we can rewrite it. First we make the shorthands +% `safe'. +% +% \begin{macrocode} + \def\@testdef#1#2#3{% + \@safe@activestrue +% \end{macrocode} +% +% Then we use |\bbl@tempa| as an `alias' for the macro that +% contains the label which is being checked. +% +% \begin{macrocode} + \expandafter\let\expandafter\bbl@tempa\csname #1@#2\endcsname +% \end{macrocode} +% +% Then we define |\bbl@tempb| just as |\@newl@bel| does it. +% +% \begin{macrocode} + \def\bbl@tempb{#3}% + \@safe@activesfalse +% \end{macrocode} +% +% When the label is defined we replace the definition of +% |\bbl@tempa| by its meaning. +% +% \begin{macrocode} + \ifx\bbl@tempa\relax + \else + \edef\bbl@tempa{\expandafter\strip@prefix\meaning\bbl@tempa}% + \fi +% \end{macrocode} +% +% We do the same for |\bbl@tempb|. +% +% \begin{macrocode} + \edef\bbl@tempb{\expandafter\strip@prefix\meaning\bbl@tempb}% +% \end{macrocode} +% +% If the label didn't change, |\bbl@tempa| and |\bbl@tempb| should +% be identical macros. +% +% \begin{macrocode} + \ifx\bbl@tempa\bbl@tempb + \else + \@tempswatrue + \fi} +\fi +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\ref} +% \begin{macro}{\pageref} +% The same holds for the macro |\ref| that references a label +% and |\pageref| to reference a page. So we redefine |\ref| and +% |\pageref|. While we change these macros, we make them robust as +% well (if they weren't already) to prevent problems if they should +% become expanded at the wrong moment. +% +% \begin{macrocode} +\bbl@xin@{R}\bbl@opt@safe +\ifin@ + \bbl@redefinerobust\ref#1{% + \@safe@activestrue\org@ref{#1}\@safe@activesfalse} + \bbl@redefinerobust\pageref#1{% + \@safe@activestrue\org@pageref{#1}\@safe@activesfalse} +\else + \let\org@ref\ref + \let\org@pageref\pageref +\fi +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@citex} +% The macro used to cite from a bibliography, |\cite|, uses an +% internal macro, |\@citex|. +% It is this internal macro that picks up the argument(s), +% so we redefine this internal macro and leave |\cite| alone. The +% first argument is used for typesetting, so the shorthands need +% only be deactivated in the second argument. +% +% \begin{macrocode} +\bbl@xin@{B}\bbl@opt@safe +\ifin@ + \bbl@redefine\@citex[#1]#2{% + \@safe@activestrue\edef\@tempa{#2}\@safe@activesfalse + \org@@citex[#1]{\@tempa}} +% \end{macrocode} +% +% Unfortunately, the packages \pkg{natbib} and \pkg{cite} need a +% different definition of |\@citex|... +% To begin with, \pkg{natbib} has a definition for |\@citex| with +% \emph{three} arguments... We only know that a package is loaded +% when |\begin{document}| is executed, so we need to postpone the +% different redefinition. +% +% \begin{macrocode} + \AtBeginDocument{% + \@ifpackageloaded{natbib}{% +% \end{macrocode} +% +% Notice that we use |\def| here instead of |\bbl@redefine| because +% |\org@@citex| is already defined and we don't want to overwrite +% that definition (it would result in parameter stack overflow +% because of a circular definition). +% +% (Recent versions of natbib change dynamically |\@citex|, so PR4087 +% doesn't seem fixable in a simple way. Just load natbib before.) +% +% \begin{macrocode} + \def\@citex[#1][#2]#3{% + \@safe@activestrue\edef\@tempa{#3}\@safe@activesfalse + \org@@citex[#1][#2]{\@tempa}}% + }{}} +% \end{macrocode} +% +% The package \pkg{cite} has a definition of |\@citex| where the +% shorthands need to be turned off in both arguments. +% +% \begin{macrocode} + \AtBeginDocument{% + \@ifpackageloaded{cite}{% + \def\@citex[#1]#2{% + \@safe@activestrue\org@@citex[#1]{#2}\@safe@activesfalse}% + }{}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\nocite} +% The macro |\nocite| which is used to instruct BiB\TeX\ to +% extract uncited references from the database. +% +% \begin{macrocode} + \bbl@redefine\nocite#1{% + \@safe@activestrue\org@nocite{#1}\@safe@activesfalse} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bibcite} +% The macro that is used in the |.aux| file to define citation +% labels. When packages such as \pkg{natbib} or \pkg{cite} are not +% loaded its second argument is used to typeset the citation +% label. In that case, this second argument can contain active +% characters but is used in an environment where +% |\@safe@activestrue| is in effect. This switch needs to be reset +% inside the |\hbox| which contains the citation label. In order to +% determine during \file{.aux} file processing which definition of +% |\bibcite| is needed we define |\bibcite| in such a way that it +% redefines itself with the proper definition. +% +% \begin{macrocode} + \bbl@redefine\bibcite{% +% \end{macrocode} +% +% We call |\bbl@cite@choice| to select the proper definition for +% |\bibcite|. This new definition is then activated. +% +% \begin{macrocode} + \bbl@cite@choice + \bibcite} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@bibcite} +% The macro |\bbl@bibcite| holds the definition of |\bibcite| +% needed when neither \pkg{natbib} nor \pkg{cite} is loaded. +% +% \begin{macrocode} + \def\bbl@bibcite#1#2{% + \org@bibcite{#1}{\@safe@activesfalse#2}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@cite@choice} +% The macro |\bbl@cite@choice| determines which definition of +% |\bibcite| is needed. +% +% \begin{macrocode} + \def\bbl@cite@choice{% +% \end{macrocode} +% +% First we give |\bibcite| its default definition. +% +% \begin{macrocode} + \global\let\bibcite\bbl@bibcite +% \end{macrocode} +% +% Then, when \pkg{natbib} is loaded we restore the original +% definition of |\bibcite|. +% +% \begin{macrocode} + \@ifpackageloaded{natbib}{\global\let\bibcite\org@bibcite}{}% +% \end{macrocode} +% +% For \pkg{cite} we do the same. +% +% \begin{macrocode} + \@ifpackageloaded{cite}{\global\let\bibcite\org@bibcite}{}% +% \end{macrocode} +% +% Make sure this only happens once. +% +% \begin{macrocode} + \global\let\bbl@cite@choice\relax} +% \end{macrocode} +% +% When a document is run for the first time, no \file{.aux} file is +% available, and |\bibcite| will not yet be properly defined. In +% this case, this has to happen before the document starts. +% +% \begin{macrocode} + \AtBeginDocument{\bbl@cite@choice} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\@bibitem} +% One of the two internal \LaTeX\ macros called by |\bibitem| +% that write the citation label on the |.aux| file. +% +% \begin{macrocode} + \bbl@redefine\@bibitem#1{% + \@safe@activestrue\org@@bibitem{#1}\@safe@activesfalse} +\else + \let\org@nocite\nocite + \let\org@@citex\@citex + \let\org@bibcite\bibcite + \let\org@@bibitem\@bibitem +\fi +% \end{macrocode} +% +% \end{macro} +% +% \subsection{Marks} +% +% \begin{macro}{\markright} +% Because the output routine is asynchronous, we must +% pass the current language attribute to the head lines, together +% with the text that is put into them. To achieve this we need to +% adapt the definition of |\markright| and |\markboth| somewhat. +% +% \changes{babel~3.8c}{2004/05/26}{No need to add \emph{anything} to +% an empty mark; prevented this by checking the contents of the +% argument} +% \changes{babel~3.8f}{2005/05/15}{Make the definition independent of +% the original definition; expand \cs{languagename} before passing +% it into the token registers} +% \changes{babel~3.9t}{2017/04/23}{Refactored \cs{markright} and +% \cs{markboth}} +% +% We check whether the argument is empty; if it is, we just make +% sure the scratch token register is empty. Next, we store the +% argument to |\markright| in the scratch token register. This way +% these commands will not be expanded later, and we make sure that +% the text is typeset using the correct language settings. While +% doing so, we make sure that active characters that may end up in +% the mark are not disabled by the output routine kicking in while +% \cs{@safe@activestrue} is in effect. +% +% \begin{macrocode} +\bbl@trace{Marks} +\IfBabelLayout{sectioning} + {\ifx\bbl@opt@headfoot\@nnil + \g@addto@macro\@resetactivechars{% + \set@typeset@protect + \expandafter\select@language@x\expandafter{\bbl@main@language}% + \let\protect\noexpand}% + \fi} + {\bbl@redefine\markright#1{% + \bbl@ifblank{#1}% + {\org@markright{}}% + {\toks@{#1}% + \bbl@exp{% + \\\org@markright{\\\protect\\\foreignlanguage{\languagename}% + {\\\protect\\\bbl@restore@actives\the\toks@}}}}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\markboth} +% \begin{macro}{\@mkboth} +% The definition of |\markboth| is equivalent to that of +% |\markright|, except that we need two token registers. The +% documentclasses \cls{report} and \cls{book} define and set the +% headings for the page. While doing so they also store a copy of +% |\markboth| in |\@mkboth|. Therefore we need to check whether +% |\@mkboth| has already been set. If so we neeed to do that again +% with the new definition of |\markboth|. +% +% \changes{babel~3.8c}{2004/05/26}{No need to add \emph{anything} to +% an empty mark, prevented this by checking the contents of the +% arguments} +% \changes{babel~3.8f}{2005/05/15}{Make the definition independent of +% the original definition; expand \cs{languagename} before passing +% it into the token registers} +% \changes{babel~3.8j}{2008/03/21}{Added setting of \cs{@mkboth} (PR +% 3826)} +% +% \begin{macrocode} + \ifx\@mkboth\markboth + \def\bbl@tempc{\let\@mkboth\markboth} + \else + \def\bbl@tempc{} + \fi +% \end{macrocode} +% +% Now we can start the new definition of |\markboth| +% +% \begin{macrocode} + \bbl@redefine\markboth#1#2{% + \protected@edef\bbl@tempb##1{% + \protect\foreignlanguage{\languagename}{\protect\bbl@restore@actives##1}}% + \bbl@ifblank{#1}% + {\toks@{}}% + {\toks@\expandafter{\bbl@tempb{#1}}}% + \bbl@ifblank{#2}% + {\@temptokena{}}% + {\@temptokena\expandafter{\bbl@tempb{#2}}}% + \bbl@exp{\\\org@markboth{\the\toks@}{\the\@temptokena}}} +% \end{macrocode} +% +% and copy it to |\@mkboth| if necessary. +% +% \begin{macrocode} + \bbl@tempc} % end \IfBabelLayout +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \subsection{Preventing clashes with other packages} +% +% \subsubsection{\pkg{ifthen}} +% +% \begin{macro}{\ifthenelse} +% +% \changes{babel~3.9a}{2012/09/07}{Redefine only if `ref' is `safe'} +% \changes{babel~3.9a}{2013/01/03}{Moved to babel.def} +% +% Sometimes a document writer wants to create a special effect +% depending on the page a certain fragment of text appears on. This +% can be achieved by the following piece of code: +%\begin{verbatim} +% \ifthenelse{\isodd{\pageref{some:label}}} +% {code for odd pages} +% {code for even pages} +%\end{verbatim} +% In order for this to work the argument of |\isodd| needs to be +% fully expandable. With the above redefinition of |\pageref| it is +% not in the case of this example. To overcome that, we add some +% code to the definition of |\ifthenelse| to make things work. +% +% The first thing we need to do is check if the package +% \pkg{ifthen} is loaded. This should be done at |\begin{document}| +% time. +% +% \begin{macrocode} +\bbl@trace{Preventing clashes with other packages} +\bbl@xin@{R}\bbl@opt@safe +\ifin@ + \AtBeginDocument{% + \@ifpackageloaded{ifthen}{% +% \end{macrocode} +% +% Then we can redefine |\ifthenelse|: +% +% \changes{babel~3.9a}{2012/06/22}{\cs{ref} is also taken into account} +% \changes{babel~3.9n}{2015/12/14}{Don't use generic temp +% macros. babel/4441} +% +% \begin{macrocode} + \bbl@redefine@long\ifthenelse#1#2#3{% +% \end{macrocode} +% +% We want to revert the definition of |\pageref| and |\ref| to +% their original definition for the first argument of |\ifthenelse|, +% so we first need to store their current meanings. +% +% \begin{macrocode} + \let\bbl@temp@pref\pageref + \let\pageref\org@pageref + \let\bbl@temp@ref\ref + \let\ref\org@ref +% \end{macrocode} +% +% Then we can set the |\@safe@actives| switch and call the original +% |\ifthenelse|. In order to be able to use shorthands in the +% second and third arguments of |\ifthenelse| the resetting of the +% switch \emph{and} the definition of |\pageref| happens inside +% those arguments. When the package wasn't loaded we do nothing. +% +% \begin{macrocode} + \@safe@activestrue + \org@ifthenelse{#1}% + {\let\pageref\bbl@temp@pref + \let\ref\bbl@temp@ref + \@safe@activesfalse + #2}% + {\let\pageref\bbl@temp@pref + \let\ref\bbl@temp@ref + \@safe@activesfalse + #3}% + }% + }{}% + } +% \end{macrocode} +% +% \end{macro} +% +% \subsubsection{\pkg{varioref}} +% +% \begin{macro}{\@@vpageref} +% \begin{macro}{\vrefpagenum} +% \begin{macro}{\Ref} +% +% \changes{babel~3.8g}{2005/05/21}{We also need to adapt \cs{Ref} +% which needs to be able to uppercase the first letter of the +% expansion of \cs{ref}} +% +% When the package varioref is in use we need to modify its +% internal command |\@@vpageref| in order to prevent problems when +% an active character ends up in the argument of |\vref|. +% +% \begin{macrocode} + \AtBeginDocument{% + \@ifpackageloaded{varioref}{% + \bbl@redefine\@@vpageref#1[#2]#3{% + \@safe@activestrue + \org@@@vpageref{#1}[#2]{#3}% + \@safe@activesfalse}% +% \end{macrocode} +% +% The same needs to happen for |\vrefpagenum|. +% +% \begin{macrocode} + \bbl@redefine\vrefpagenum#1#2{% + \@safe@activestrue + \org@vrefpagenum{#1}{#2}% + \@safe@activesfalse}% +% \end{macrocode} +% +% The package \pkg{varioref} defines |\Ref| to be a robust command +% wich uppercases the first character of the reference text. In +% order to be able to do that it needs to access the exandable form +% of |\ref|. So we employ a little trick here. We redefine the +% (internal) command \verb*|\Ref | to call |\org@ref| instead of +% |\ref|. The disadvantgage of this solution is that whenever the +% derfinition of |\Ref| changes, this definition needs to be updated +% as well. +% +% \begin{macrocode} + \expandafter\def\csname Ref \endcsname#1{% + \protected@edef\@tempa{\org@ref{#1}}\expandafter\MakeUppercase\@tempa} + }{}% + } +\fi +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{\pkg{hhline}} +% +% \begin{macro}{\hhline} +% Delaying the activation of the shorthand characters has introduced +% a problem with the \pkg{hhline} package. The reason is that it +% uses the `:' character which is made active by the french support +% in \babel. Therefore we need to \emph{reload} the package when +% the `:' is an active character. +% +% So at |\begin{document}| we check whether \pkg{hhline} is loaded. +% +% \begin{macrocode} +\AtEndOfPackage{% + \AtBeginDocument{% + \@ifpackageloaded{hhline}% +% \end{macrocode} +% +% Then we check whether the expansion of |\normal@char:| is not +% equal to |\relax|. +% +% \changes{babel~3.8b}{2004/04/19}{added \cs{string} to prevent +% unwanted expansion of the colon} +% +% \begin{macrocode} + {\expandafter\ifx\csname normal@char\string:\endcsname\relax + \else +% \end{macrocode} +% +% In that case we simply reload the package. Note that this happens +% \emph{after} the category code of the @-sign has been changed to +% other, so we need to temporarily change it to letter again. +% +% \begin{macrocode} + \makeatletter + \def\@currname{hhline}\input{hhline.sty}\makeatother + \fi}% + {}}} +% \end{macrocode} +% +% \end{macro} +% +% \subsubsection{\pkg{hyperref}} +% +% \begin{macro}{\pdfstringdefDisableCommands} +% +% \changes{babel~3.8j}{2008/03/16}{Inform \pkg{hyperref} to use +% shorthands at system level (PR4006)} +% +% A number of interworking problems between \pkg{babel} and +% \pkg{hyperref} are tackled by \pkg{hyperref} itself. The +% following code was introduced to prevent some annoying warnings +% but it broke bookmarks. This was quickly fixed in \pkg{hyperref}, +% which essentially made it no-op. However, it will not removed for +% the moment because \pkg{hyperref} is expecting it. +% +% \begin{macrocode} +\AtBeginDocument{% + \ifx\pdfstringdefDisableCommands\@undefined\else + \pdfstringdefDisableCommands{\languageshorthands{system}}% + \fi} +% \end{macrocode} +% +% \end{macro} +% +% \subsubsection{\pkg{fancyhdr}} +% +% \begin{macro}{\FOREIGNLANGUAGE} +% The package \pkg{fancyhdr} treats the running head and fout lines +% somewhat differently as the standard classes. A symptom of this is +% that the command |\foreignlanguage| which \babel\ adds to the +% marks can end up inside the argument of |\MakeUppercase|. To +% prevent unexpected results we need to define |\FOREIGNLANGUAGE| +% here. +% +% \begin{macrocode} +\DeclareRobustCommand{\FOREIGNLANGUAGE}[1]{% + \lowercase{\foreignlanguage{#1}}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\substitutefontfamily} +% The command |\substitutefontfamily| creates an +% \file{.fd} file on the fly. The first argument is an encoding +% mnemonic, the second and third arguments are font family names. +% +% \begin{macrocode} +\def\substitutefontfamily#1#2#3{% + \lowercase{\immediate\openout15=#1#2.fd\relax}% + \immediate\write15{% + \string\ProvidesFile{#1#2.fd}% + [\the\year/\two@digits{\the\month}/\two@digits{\the\day} + \space generated font description file]^^J + \string\DeclareFontFamily{#1}{#2}{}^^J + \string\DeclareFontShape{#1}{#2}{m}{n}{<->ssub * #3/m/n}{}^^J + \string\DeclareFontShape{#1}{#2}{m}{it}{<->ssub * #3/m/it}{}^^J + \string\DeclareFontShape{#1}{#2}{m}{sl}{<->ssub * #3/m/sl}{}^^J + \string\DeclareFontShape{#1}{#2}{m}{sc}{<->ssub * #3/m/sc}{}^^J + \string\DeclareFontShape{#1}{#2}{b}{n}{<->ssub * #3/bx/n}{}^^J + \string\DeclareFontShape{#1}{#2}{b}{it}{<->ssub * #3/bx/it}{}^^J + \string\DeclareFontShape{#1}{#2}{b}{sl}{<->ssub * #3/bx/sl}{}^^J + \string\DeclareFontShape{#1}{#2}{b}{sc}{<->ssub * #3/bx/sc}{}^^J + }% + \closeout15 + } +% \end{macrocode} +% +% This command should only be used in the preamble of a document. +% +% \begin{macrocode} +\@onlypreamble\substitutefontfamily +% \end{macrocode} +% +% \end{macro} +% +% \subsection{Encoding and fonts} +% +% Because documents may use non-ASCII font encodings, we make sure +% that the logos of \TeX\ and \LaTeX\ always come out in the right +% encoding. There is a list of non-ASCII encodings. Unfortunately, +% \textsf{fontenc} deletes its package options, so we must guess +% which encodings has been loaded by traversing |\@filelist| to +% search for \m{enc}|enc.def|. If a non-ASCII has been loaded, we +% define versions of |\TeX| and |\LaTeX| for them using +% |\ensureascii|. The default ASCII encoding is set, too (in reverse +% order): the ``main'' encoding (when the document begins), the last +% loaded, or |OT1|. +% +% \begin{macro}{\ensureascii} +% +% \changes{babel~3.9i}{2014/02/14}{Macro added, to replace +% \cs{textlatin} and friends} +% \changes{babel~3.9j}{2014/03/17}{Moved misplaced code - it should be +% executed only with LaTeX} +% +% \begin{macrocode} +\bbl@trace{Encoding and fonts} +\newcommand\BabelNonASCII{LGR,X2,OT2,OT3,OT6,LHE,LWN,LMA,LMC,LMS,LMU,} +\let\org@TeX\TeX +\let\org@LaTeX\LaTeX +\let\ensureascii\@firstofone +\AtBeginDocument{% + \in@false + \bbl@foreach\BabelNonASCII{% is there a non-ascii enc? + \ifin@\else + \lowercase{\bbl@xin@{,#1enc.def,}{,\@filelist,}}% + \fi}% + \ifin@ % if a non-ascii has been loaded + \def\ensureascii#1{{\fontencoding{OT1}\selectfont#1}}% + \DeclareTextCommandDefault{\TeX}{\org@TeX}% + \DeclareTextCommandDefault{\LaTeX}{\org@LaTeX}% + \def\bbl@tempb#1\@@{\uppercase{\bbl@tempc#1}ENC.DEF\@empty\@@}% + \def\bbl@tempc#1ENC.DEF#2\@@{% + \ifx\@empty#2\else + \bbl@ifunset{T@#1}% + {}% + {\bbl@xin@{,#1,}{,\BabelNonASCII,}% + \ifin@ + \DeclareTextCommand{\TeX}{#1}{\ensureascii{\org@TeX}}% + \DeclareTextCommand{\LaTeX}{#1}{\ensureascii{\org@LaTeX}}% + \else + \def\ensureascii##1{{\fontencoding{#1}\selectfont##1}}% + \fi}% + \fi}% + \bbl@foreach\@filelist{\bbl@tempb#1\@@}% TODO - \@@ de mas?? + \bbl@xin@{,\cf@encoding,}{,\BabelNonASCII,}% + \ifin@\else + \edef\ensureascii#1{{% + \noexpand\fontencoding{\cf@encoding}\noexpand\selectfont#1}}% + \fi + \fi} +% \end{macrocode} +% +% \end{macro} +% +% Now comes the old deprecated stuff (with a little change in 3.9l, +% for \textsf{fontspec}). The first thing we need to do is to +% determine, at |\begin{document}|, which latin fontencoding to use. +% +% \begin{macro}{\latinencoding} +% When text is being typeset in an encoding other than `latin' +% (\texttt{OT1} or \texttt{T1}), it would be nice to still have +% Roman numerals come out in the Latin encoding. +% So we first assume that the current encoding at the end +% of processing the package is the Latin encoding. +% +% \begin{macrocode} +\AtEndOfPackage{\edef\latinencoding{\cf@encoding}} +% \end{macrocode} +% +% But this might be overruled with a later loading of the package +% \pkg{fontenc}. Therefore we check at the execution of +% |\begin{document}| whether it was loaded with the \Lopt{T1} +% option. The normal way to do this (using |\@ifpackageloaded|) is +% disabled for this package. Now we have to revert to parsing the +% internal macro |\@filelist| which contains all the filenames +% loaded. +% +% \changes{babel~3.9l}{2014/08/02}{fontspec used to set +% \cs{latinencoding} to EUx, but now it doesn't. So, it's done +% here.} +% \changes{babel~3.9o}{2016/01/27}{With fontspec, first check if +% \cs{UTFencname} exists.} +% +% \begin{macrocode} +\AtBeginDocument{% + \@ifpackageloaded{fontspec}% + {\xdef\latinencoding{% + \ifx\UTFencname\@undefined + EU\ifcase\bbl@engine\or2\or1\fi + \else + \UTFencname + \fi}}% + {\gdef\latinencoding{OT1}% + \ifx\cf@encoding\bbl@t@one + \xdef\latinencoding{\bbl@t@one}% + \else + \@ifl@aded{def}{t1enc}{\xdef\latinencoding{\bbl@t@one}}{}% + \fi}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\latintext} +% Then we can define the command |\latintext| which is a +% declarative switch to a latin font-encoding. Usage of this macro +% is deprecated. +% +% \begin{macrocode} +\DeclareRobustCommand{\latintext}{% + \fontencoding{\latinencoding}\selectfont + \def\encodingdefault{\latinencoding}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\textlatin} +% This command takes an argument which is then typeset using the +% requested font encoding. In order to avoid many encoding switches +% it operates in a local scope. +% +% \begin{macrocode} +\ifx\@undefined\DeclareTextFontCommand + \DeclareRobustCommand{\textlatin}[1]{\leavevmode{\latintext #1}} +\else + \DeclareTextFontCommand{\textlatin}{\latintext} +\fi +% \end{macrocode} +% +% \end{macro} +% +% \subsection{Basic bidi support} +% +% \textbf{Work in progress.} This code is currently placed here for +% practical reasons. +% +% It is loosely based on |rlbabel.def|, but most of it has been +% developed from scratch. This \babel{} module (by Johannes Braams and +% Boris Lavva) has served the purpose of typesetting R documents for +% two decades, and despite its flaws I think it is still a good starting +% point (some parts have been copied here almost verbatim), partly +% thanks to its simplicity. I've also looked at \textsc{arabi} (by +% Youssef Jabri), which is compatible with \babel{}. +% +% There are two ways of modifying macros to make them “bidi”, namely, +% by patching the internal low level macros (which is what I have done +% with lists, columns, counters, tocs, much like |rlbabel| did), and +% by introducing a “middle layer” just below the user interface +% (sectioning, footnotes). +% +% \begin{itemize} +% \item pdftex provides a minimal support for bidi text, and it +% must be done by hand. Vertical typesetting is not possible. +% \item \xetex{} is somewhat better, thanks to its font engine +% (even if not always reliable) and a few additional tools. However, +% very little is done at the paragraph level. Another challenging +% problem is text direction does not honour \TeX{} grouping. +% \item \luatex{} can provide the most complete solution, as we can +% manipulate almost freely the node list, the generated lines, +% and so on, but bidi text does not work out of the box and some +% development is necessary. It also provides tools to properly +% set left-to-right and right-to-left page layouts. As Lua\TeX-ja +% shows, vertical typesetting is posible, too. Its main drawback +% is font handling is often considered to be less mature than +% \xetex{}, mainly in Indic scripts (but there are steps to make +% HarfBuzz, the \xetex{} font engine, available in \luatex{}; see +% <https://github.com/tatzetwerk/luatex-harfbuzz>). +% \end{itemize} +% +% \changes{3.15}{2017/10/30}{Use an attribute instead of tex language +% (reserved for hyphenation).} +% \changes{3.15}{2017/10/30}{Store direction in @wdir@<lang>.} +% +% \begin{macrocode} +\bbl@trace{Basic (internal) bidi support} +\def\bbl@alscripts{,Arabic,Syriac,Thaana,} +\def\bbl@rscripts{% + ,Imperial Aramaic,Avestan,Cypriot,Hatran,Hebrew,% + Old Hungarian,Old Hungarian,Lydian,Mandaean,Manichaean,% + Manichaean,Meroitic Cursive,Meroitic,Old North Arabian,% + Nabataean,N'Ko,Orkhon,Palmyrene,Inscriptional Pahlavi,% + Psalter Pahlavi,Phoenician,Inscriptional Parthian,Samaritan,% + Old South Arabian,}% +\def\bbl@provide@dirs#1{% + \bbl@xin@{\csname bbl@sname@#1\endcsname}{\bbl@alscripts\bbl@rscripts}% + \ifin@ + \global\bbl@csarg\chardef{wdir@#1}\@ne + \bbl@xin@{\csname bbl@sname@#1\endcsname}{\bbl@alscripts}% + \ifin@ + \global\bbl@csarg\chardef{wdir@#1}\tw@ % useless in xetex + \fi + \else + \global\bbl@csarg\chardef{wdir@#1}\z@ + \fi} +\def\bbl@switchdir{% + \bbl@ifunset{bbl@lsys@\languagename}{\bbl@provide@lsys{\languagename}}{}% + \bbl@ifunset{bbl@wdir@\languagename}{\bbl@provide@dirs{\languagename}}{}% + \bbl@exp{\\\bbl@setdirs\bbl@cs{wdir@\languagename}}} +\def\bbl@setdirs#1{% TODO - math + \ifcase\bbl@select@type % TODO - strictly, not the right test + \bbl@bodydir{#1}% + \bbl@pardir{#1}% + \fi + \bbl@textdir{#1}} +\ifodd\bbl@engine % luatex=1 + \AddBabelHook{babel-bidi}{afterextras}{\bbl@switchdir} + \DisableBabelHook{babel-bidi} + \chardef\bbl@thepardir\z@ + \def\bbl@getluadir#1{% + \directlua{ + if tex.#1dir == 'TLT' then + tex.sprint('0') + elseif tex.#1dir == 'TRT' then + tex.sprint('1') + end}} + \def\bbl@setluadir#1#2#3{% 1=text/par.. 2=\textdir.. 3=0 lr/1 rl + \ifcase#3\relax + \ifcase\bbl@getluadir{#1}\relax\else + #2 TLT\relax + \fi + \else + \ifcase\bbl@getluadir{#1}\relax + #2 TRT\relax + \fi + \fi} + \def\bbl@textdir#1{% + \bbl@setluadir{text}\textdir{#1}% TODO - ?\linedir + \setattribute\bbl@attr@dir{\numexpr\bbl@thepardir*3+#1}} + \def\bbl@pardir#1{\bbl@setluadir{par}\pardir{#1}% + \chardef\bbl@thepardir#1\relax} + \def\bbl@bodydir{\bbl@setluadir{body}\bodydir} + \def\bbl@pagedir{\bbl@setluadir{page}\pagedir} + \def\bbl@dirparastext{\pardir\the\textdir\relax}% %%%% +\else % pdftex=0, xetex=2 + \AddBabelHook{babel-bidi}{afterextras}{\bbl@switchdir} + \DisableBabelHook{babel-bidi} + \newcount\bbl@dirlevel + \chardef\bbl@thetextdir\z@ + \chardef\bbl@thepardir\z@ + \def\bbl@textdir#1{% + \ifcase#1\relax + \chardef\bbl@thetextdir\z@ + \bbl@textdir@i\beginL\endL + \else + \chardef\bbl@thetextdir\@ne + \bbl@textdir@i\beginR\endR + \fi} + \def\bbl@textdir@i#1#2{% + \ifhmode + \ifnum\currentgrouplevel>\z@ + \ifnum\currentgrouplevel=\bbl@dirlevel + \bbl@error{Multiple bidi settings inside a group}% + {I'll insert a new group, but expect wrong results.}% + \bgroup\aftergroup#2\aftergroup\egroup + \else + \ifcase\currentgrouptype\or % 0 bottom + \aftergroup#2% 1 simple {} + \or + \bgroup\aftergroup#2\aftergroup\egroup % 2 hbox + \or + \bgroup\aftergroup#2\aftergroup\egroup % 3 adj hbox + \or\or\or % vbox vtop align + \or + \bgroup\aftergroup#2\aftergroup\egroup % 7 noalign + \or\or\or\or\or\or % output math disc insert vcent mathchoice + \or + \aftergroup#2% 14 \begingroup + \else + \bgroup\aftergroup#2\aftergroup\egroup % 15 adj + \fi + \fi + \bbl@dirlevel\currentgrouplevel + \fi + #1% + \fi} + \def\bbl@pardir#1{\chardef\bbl@thepardir#1\relax} + \let\bbl@bodydir\@gobble + \let\bbl@pagedir\@gobble + \def\bbl@dirparastext{\chardef\bbl@thepardir\bbl@thetextdir} +% \end{macrocode} +% +% The following command is executed only if there is a right-to-left +% script (once). It activates the |\everypar| hack for \xetex, to +% properly handle the par direction. Note text and par dirs are +% decoupled to some extent (although not completely). +% +% \changes{3.16}{2018/01/02}{Fix - the direction prevented the removal +% of the indent to be re-placed} +% +% \begin{macrocode} + \def\bbl@xebidipar{% + \let\bbl@xebidipar\relax + \TeXXeTstate\@ne + \def\bbl@xeeverypar{% + \ifcase\bbl@thepardir + \ifcase\bbl@thetextdir\else\beginR\fi + \else + {\setbox\z@\lastbox\beginR\box\z@}% + \fi}% + \let\bbl@severypar\everypar + \newtoks\everypar + \everypar=\bbl@severypar + \bbl@severypar{\bbl@xeeverypar\the\everypar}} +\fi +% \end{macrocode} +% +% A tool for weak L (mainly digits). +% +% \changes{3.16}{2018/01/02}{New macro \cs{babelsublr}} +% +% \begin{macrocode} +%\ifodd\bbl@engine %%%%%% TODO +% \DeclareRobustCommand\babelsublr[1]{% +% \leavevmode +% {\setattribute\bbl@attr@dir\@M{\bbl@setluadir{text}\textdir\z@#1}}} +% \DeclareRobustCommand\babelsubrl[1]{% +% \leavevmode +% {\setattribute\bbl@attr@dir\@M{\bbl@setluadir{text}\textdir\@ne#1}}} +%\else + \DeclareRobustCommand\babelsublr[1]{\leavevmode{\bbl@textdir\z@#1}} +%\fi +% \end{macrocode} +% +% \subsection{Local Language Configuration} +% +% \begin{macro}{\loadlocalcfg} +% At some sites it may be necessary to add site-specific actions to +% a language definition file. This can be done by creating a file +% with the same name as the language definition file, but with the +% extension \file{.cfg}. For instance the file \file{norsk.cfg} +% will be loaded when the language definition file \file{norsk.ldf} +% is loaded. +% +% For plain-based formats we don't want to override the definition +% of |\loadlocalcfg| from \file{plain.def}. +% +% \begin{macrocode} +\bbl@trace{Local Language Configuration} +\ifx\loadlocalcfg\@undefined + \@ifpackagewith{babel}{noconfigs}% + {\let\loadlocalcfg\@gobble}% + {\def\loadlocalcfg#1{% + \InputIfFileExists{#1.cfg}% + {\typeout{*************************************^^J% + * Local config file #1.cfg used^^J% + *}}% + \@empty}} +\fi +% \end{macrocode} +% +% Just to be compatible with \LaTeX$\:$2.09 we add a few more lines +% of code: +% +% \begin{macrocode} +\ifx\@unexpandable@protect\@undefined + \def\@unexpandable@protect{\noexpand\protect\noexpand} + \long\def\protected@write#1#2#3{% + \begingroup + \let\thepage\relax + #2% + \let\protect\@unexpandable@protect + \edef\reserved@a{\write#1{#3}}% + \reserved@a + \endgroup + \if@nobreak\ifvmode\nobreak\fi\fi} +\fi +%</core> +%<*kernel> +% \end{macrocode}% +% \end{macro} +% +% \section{Multiple languages (\texttt{switch.def)}} +% +% Plain \TeX\ version~3.0 provides the primitive |\language| that +% is used to store the current language. When used with a pre-3.0 +% version this function has to be implemented by allocating a +% counter. +% +% \begin{macrocode} +<@Make sure ProvidesFile is defined@> +\ProvidesFile{switch.def}[<@date@> <@version@> Babel switching mechanism] +<@Load macros for plain if not LaTeX@> +<@Define core switching macros@> +% \end{macrocode} +% +% \begin{macro}{\adddialect} +% The macro |\adddialect| can be used to add the name of a dialect +% or variant language, for which an already defined hyphenation +% table can be used. +% +% \begin{macrocode} +\def\bbl@version{<@version@>} +\def\bbl@date{<@date@>} +\def\adddialect#1#2{% + \global\chardef#1#2\relax + \bbl@usehooks{adddialect}{{#1}{#2}}% + \wlog{\string#1 = a dialect from \string\language#2}} +% \end{macrocode} +% +% \end{macro} +% +% \changes{babel~3.9a}{2012/09/07}{Added macro} +% \changes{babel~3.9a}{2013/01/23}{New macro to normalize +% a macro (eg, \cs{languagename}) to lowercase if necessary} +% +% |\bbl@iflanguage| executes code only if the language |l@| +% exists. Otherwise raises and error. +% +% The argument of |\bbl@fixname| has to be a macro name, as it may get +% ``fixed'' if casing (lc/uc) is wrong. It's intented to fix a +% long-standing bug when |\foreignlanguage| and the like appear in +% a |\MakeXXXcase|. However, a lowercase form is not imposed to +% improve backward compatibility (perhaps you defined a language +% named |MYLANG|, but unfortunately mixed case names cannot be +% trapped). Note |l@| is encapsulated, so that its case does not +% change. +% +% \begin{macrocode} +\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} +\def\bbl@iflanguage#1{% + \@ifundefined{l@#1}{\@nolanerr{#1}\@gobble}\@firstofone} +% \end{macrocode} +% +% \begin{macro}{\iflanguage} +% Users might want to test (in a private package for instance) +% which language is currently active. For this we provide a test +% macro, |\iflanguage|, that has three arguments. It checks +% whether the first argument is a known language. If so, it +% compares the first argument with the value of |\language|. Then, +% depending on the result of the comparison, it executes either the +% second or the third argument. +% +% \begin{macrocode} +\def\iflanguage#1{% + \bbl@iflanguage{#1}{% + \ifnum\csname l@#1\endcsname=\language + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi}} +% \end{macrocode} +% +% \end{macro} +% +% \subsection{Selecting the language} +% +% \begin{macro}{\selectlanguage} +% The macro |\selectlanguage| checks whether the language is +% already defined before it performs its actual task, which is to +% update |\language| and activate language-specific definitions. +% +% To allow the call of |\selectlanguage| either with a control +% sequence name or with a simple string as argument, we have to use +% a trick to delete the optional escape character. +% +% To convert a control sequence to a string, we use the |\string| +% primitive. Next we have to look at the first character of this +% string and compare it with the escape character. Because this +% escape character can be changed by setting the internal integer +% |\escapechar| to a character number, we have to compare this +% number with the character of the string. To do this we have to +% use \TeX's backquote notation to specify the character as a +% number. +% +% If the first character of the |\string|'ed argument is the +% current escape character, the comparison has stripped this +% character and the rest in the `then' part consists of the rest of +% the control sequence name. Otherwise we know that either the +% argument is not a control sequence or |\escapechar| is set to a +% value outside of the character range~$0$--$255$. +% +% If the user gives an empty argument, we provide a default +% argument for |\string|. This argument should expand to nothing. +% +% \changes{babel~3.9a}{2012/11/16}{\cs{bbl@select@type} keep tracks of +% the selection method: 0 is select, 1 is foreign} +% +% \begin{macrocode} +\let\bbl@select@type\z@ +\edef\selectlanguage{% + \noexpand\protect + \expandafter\noexpand\csname selectlanguage \endcsname} +% \end{macrocode} +% +% Because the command |\selectlanguage| could be used in a moving +% argument it expands to \verb*=\protect\selectlanguage =. +% Therefore, we have to make sure that a macro |\protect| exists. +% If it doesn't it is |\let| to |\relax|. +% +% \begin{macrocode} +\ifx\@undefined\protect\let\protect\relax\fi +% \end{macrocode} +% +% As \LaTeX$\:$2.09 writes to files \textit{expanded} whereas +% \LaTeXe\ takes care \textit{not} to expand the arguments of +% |\write| statements we need to be a bit clever about the way we +% add information to \file{.aux} files. Therefore we introduce the +% macro |\xstring| which should expand to the right amount of +% |\string|'s. +% +% \begin{macrocode} +\ifx\documentclass\@undefined + \def\xstring{\string\string\string} +\else + \let\xstring\string +\fi +% \end{macrocode} +% +% \end{macro} +% +% Since version 3.5 \babel\ writes entries to the auxiliary files in +% order to typeset table of contents etc. in the correct language +% environment. +% \begin{macro}{\bbl@pop@language} +% \emph{But} when the language change happens \emph{inside} a group +% the end of the group doesn't write anything to the auxiliary +% files. Therefore we need \TeX's |aftergroup| mechanism to help +% us. The command |\aftergroup| stores the token immediately +% following it to be executed when the current group is closed. So +% we define a temporary control sequence |\bbl@pop@language| to be +% executed at the end of the group. It calls |\bbl@set@language| +% with the name of the current language as its argument. +% +% \begin{macro}{\bbl@language@stack} +% The previous solution works for one level of nesting groups, but +% as soon as more levels are used it is no longer adequate. For +% that case we need to keep track of the nested languages using a +% stack mechanism. This stack is called |\bbl@language@stack| and +% initially empty. +% +% \begin{macrocode} +\def\bbl@language@stack{} +% \end{macrocode} +% +% When using a stack we need a mechanism to push an element on the +% stack and to retrieve the information afterwards. +% \begin{macro}{\bbl@push@language} +% \begin{macro}{\bbl@pop@language} +% The stack is simply a list of languagenames, separated with a `+' +% sign; the push function can be simple: +% +% \begin{macrocode} +\def\bbl@push@language{% + \xdef\bbl@language@stack{\languagename+\bbl@language@stack}} +% \end{macrocode} +% +% Retrieving information from the stack is a little bit less simple, +% as we need to remove the element from the stack while storing it +% in the macro |\languagename|. For this we first define a helper function. +% \begin{macro}{\bbl@pop@lang} +% This macro stores its first element (which is delimited by the +% `+'-sign) in |\languagename| and stores the rest of the string +% (delimited by `-') in its third argument. +% +% \begin{macrocode} +\def\bbl@pop@lang#1+#2-#3{% + \edef\languagename{#1}\xdef#3{#2}} +% \end{macrocode} +% +% \end{macro} +% The reason for the somewhat weird arrangement of arguments to the +% helper function is the fact it is called in the following way. +% This means that before |\bbl@pop@lang| is executed \TeX\ first +% \emph{expands} the stack, stored in |\bbl@language@stack|. The +% result of that is that the argument string of |\bbl@pop@lang| +% contains one or more language names, each followed by a `+'-sign +% (zero language names won't occur as this macro will only be +% called after something has been pushed on the stack) followed by +% the `-'-sign and finally the reference to the stack. +% +% \begin{macrocode} +\let\bbl@ifrestoring\@secondoftwo +\def\bbl@pop@language{% + \expandafter\bbl@pop@lang\bbl@language@stack-\bbl@language@stack + \let\bbl@ifrestoring\@firstoftwo + \expandafter\bbl@set@language\expandafter{\languagename}% + \let\bbl@ifrestoring\@secondoftwo} +% \end{macrocode} +% +% Once the name of the previous language is retrieved from the stack, +% it is fed to |\bbl@set@language| to do the actual work of +% switching everything that needs switching. +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +\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}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@set@language} +% +% The macro |\bbl@set@language| takes care of switching the +% language environment \emph{and} of writing entries on the +% auxiliary files. For historial reasons, language names can be +% either |language| of |\language|. To catch either form a trick is +% used, but unfortunately as a side effect the catcodes of letters +% in |\languagename| are not well defined. The list of auxiliary +% files can be extended by redefining |\BabelContentsFiles|, but +% make sure they are loaded inside a group (as |aux|, |toc|, +% |lof|, and |lot| do) or the last language of the document will +% remain active afterwards. +% +% We also write a command to change the current language in the +% auxiliary files. +% +% \changes{babel~3.9a}{2012/09/09}{Added hook} +% \changes{babel~3.9a}{2012/11/07}{Use a loop for contents files, with +% the help of \cs{BabelContentsFiles}} +% \changes{babel~3.9a}{2013/03/08}{Don't write to aux if language is +% unknown} +% \changes{babel~3.9h}{2013/11/20}{Error with a more helpful text } +% \changes{babel~3.16}{2018/01/02}{New mechanism to pass the language +% to aux, toc, etc.} +% +% \begin{macrocode} +\def\BabelContentsFiles{toc,lof,lot} +\def\bbl@set@language#1{% + \edef\languagename{% + \ifnum\escapechar=\expandafter`\string#1\@empty + \else\string#1\@empty\fi}% + \select@language{\languagename}% + \expandafter\ifx\csname date\languagename\endcsname\relax\else + \if@filesw + \protected@write\@auxout{}{\string\babel@aux{\languagename}{}}% + \bbl@usehooks{write}{}% + \fi + \fi} +\def\select@language#1{% + \ifnum\bbl@hymapsel=\@cclv\chardef\bbl@hymapsel4\relax\fi + \edef\languagename{#1}% + \bbl@fixname\languagename + \bbl@iflanguage\languagename{% + \expandafter\ifx\csname date\languagename\endcsname\relax + \bbl@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}% + {You may proceed, but expect wrong results}% + \else + \let\bbl@select@type\z@ + \expandafter\bbl@switch\expandafter{\languagename}% + \fi}} +\def\babel@aux#1#2{% + \select@language{#1}% + \bbl@foreach\BabelContentsFiles{% + \@writefile{##1}{\babel@toc{#1}{#2}}}} %% TODO - ok in plain? +\def\babel@toc#1#2{% + \select@language{#1}} +% \end{macrocode} +% +% A bit of optimization. Select in heads/foots the language only if +% necessary. The real thing is in \texttt{babel.def}. +% +% \begin{macrocode} +\let\select@language@x\select@language +% \end{macrocode} +% +% \end{macro} +% +% First, check if the user asks for a known language. If so, +% update the value of |\language| and call |\originalTeX| +% to bring \TeX\ in a certain pre-defined state. +% +% \changes{babel~3.8l}{2008/07/06}{Use \cs{bbl@patterns}} +% \changes{babel~3.9a}{2012/07/27}{Moved \cs{bbl@patterns} to the +% correct place, after setting the extras for the current +% language} +% \changes{babel~3.9a}{2012/08/01}{Created \cs{bbl@switch} with code +% shared by \cs{select@language} and \cs{foreing@language}} +% +% The name of the language is stored in the control sequence +% |\languagename|. +% +% Then we have to \emph{re}define |\originalTeX| to compensate for +% the things that have been activated. To save memory space for +% the macro definition of |\originalTeX|, we construct the control +% sequence name for the |\noextras|\langvar\ command at definition +% time by expanding the |\csname| primitive. +% +% Now activate the language-specific definitions. This is done by +% constructing the names of three macros by concatenating three +% words with the argument of |\selectlanguage|, and calling these +% macros. \nb{What if \cs{hyphenation} was used in |extras|? Patch +% temporarily |\set@hyphenmins| and hyphenation. It can be done in +% hooks if necessary.} +% +% The switching of the values of |\lefthyphenmin| and +% |\righthyphenmin| is somewhat different. First we save their +% current values, then we check if |\|\langvar|hyphenmins| is +% defined. If it is not, we set default values (2 and 3), otherwise +% the values in |\|\langvar|hyphenmins| will be used. +% +% \changes{babel~3.9a}{2012/08/01}{Adddd \cs{bbl@iflanguagename} and +% \cs{select@language@x}, which is no-op if the language is the same} +% \changes{babel~3.9a}{2013/01/23}{\cs{select@language} sets +% \textsc{languagename} so that it has the correct value in the aux +% file (eg, shorthand expansion was wrong)} +% \changes{babel~3.9a}{2012/08/14}{Make sure the save counter is reset +% even if \cs{originalTeX} is used in other contexts} +% \changes{babel~3.9c}{2013/04/08}{Removed an extra empty line} +% \changes{babel~3.9h}{2013/11/29}{Use \cs{def} instead of +% \cs{renewcommand} for \cs{BabelLower}} +% \changes{babel~3.9i}{2014/03/04}{Added `afterreset' hook} +% \changes{3.15}{2017/10/30}{Remove spaces inside captions and date.} +% +% \begin{macrocode} +\newif\ifbbl@usedategroup +\def\bbl@switch#1{% + \originalTeX + \expandafter\def\expandafter\originalTeX\expandafter{% + \csname noextras#1\endcsname + \let\originalTeX\@empty + \babel@beginsave}% + \bbl@usehooks{afterreset}{}% + \languageshorthands{none}% + \ifcase\bbl@select@type + \ifhmode + \hskip\z@skip % trick to ignore spaces + \csname captions#1\endcsname\relax + \csname date#1\endcsname\relax + \loop\ifdim\lastskip>\z@\unskip\repeat\unskip + \else + \csname captions#1\endcsname\relax + \csname date#1\endcsname\relax + \fi + \else\ifbbl@usedategroup + \bbl@usedategroupfalse + \ifhmode + \hskip\z@skip % trick to ignore spaces + \csname date#1\endcsname\relax + \loop\ifdim\lastskip>\z@\unskip\repeat\unskip + \else + \csname date#1\endcsname\relax + \fi + \fi\fi + \bbl@usehooks{beforeextras}{}% + \csname extras#1\endcsname\relax + \bbl@usehooks{afterextras}{}% + \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 + \global\let\bbl@hymapsel\@cclv + \bbl@patterns{#1}% + \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} +% \end{macrocode} +% +% \begin{environment}{otherlanguage} +% The \Lenv{otherlanguage} environment can be used as an +% alternative to using the |\selectlanguage| declarative +% command. When you are typesetting a document which mixes +% left-to-right and right-to-left typesetting you have to use this +% environment in order to let things work as you expect them to. +% +% The |\ignorespaces| command is necessary to hide the environment +% when it is entered in horizontal mode. +% +% \changes{babel~3.9a}{2012/07/31}{Removed \cs{originalTeX}} +% +% \begin{macrocode} +\long\def\otherlanguage#1{% + \ifnum\bbl@hymapsel=\@cclv\let\bbl@hymapsel\thr@@\fi + \csname selectlanguage \endcsname{#1}% + \ignorespaces} +% \end{macrocode} +% +% The |\endotherlanguage| part of the environment tries to hide +% itself when it is called in horizontal mode. +% +% \begin{macrocode} +\long\def\endotherlanguage{% + \global\@ignoretrue\ignorespaces} +% \end{macrocode} +% +% \end{environment} +% +% \begin{environment}{otherlanguage*} +% The \Lenv{otherlanguage} environment is meant to be used when a +% large part of text from a different language needs to be typeset, +% but without changing the translation of words such as `figure'. +% This environment makes use of |\foreign@language|. +% +% \begin{macrocode} +\expandafter\def\csname otherlanguage*\endcsname#1{% + \ifnum\bbl@hymapsel=\@cclv\chardef\bbl@hymapsel4\relax\fi + \foreign@language{#1}} +% \end{macrocode} +% +% At the end of the environment we need to switch off the extra +% definitions. The grouping mechanism of the environment will take +% care of resetting the correct hyphenation rules and ``extras''. +% +% \begin{macrocode} +\expandafter\let\csname endotherlanguage*\endcsname\relax +% \end{macrocode} +% +% \end{environment} +% +% \begin{macro}{\foreignlanguage} +% The |\foreignlanguage| command is another substitute for the +% |\selectlanguage| command. This command takes two arguments, the +% first argument is the name of the language to use for typesetting +% the text specified in the second argument. +% +% Unlike |\selectlanguage| this command doesn't switch +% \emph{everything}, it only switches the hyphenation rules and the +% extra definitions for the language specified. It does this within +% a group and assumes the |\extras|\langvar\ command doesn't make +% any |\global| changes. The coding is very similar to part of +% |\selectlanguage|. +% +% |\bbl@beforeforeign| is a trick to fix a bug in bidi +% texts. |\foreignlanguage| is supposed to be a `text' command, and +% therefore it must emit a |\leavevmode|, but it does not, and +% therefore the indent is placed on the opposite margin. For +% backward compatibility, however, it is done only if a +% right-to-left script is requested; otherwise, it is no-op. +% +% (3.11) |\foreignlanguage*| is a temporary, experimental macro for +% a few lines with a different script direction, while preserving +% the paragraph format (thank the braces around |\par|, things like +% |\hangindent| are not reset). Do not use it in production, +% because its semantics and its syntax may change (and very likely +% will, or even it could be removed altogether). Currently it +% enters in vmode and then selects the language (which in turn sets the +% paragraph direction). +% +% (3.11) Also experimental are the hook |foreign| and +% |foreign*|. With them you can redefine |\BabelText| which by +% default does nothing. Its +% behavior is not well defined yet. So, use it in +% horizontal mode only if you do not want surprises. +% +% In other words, at the beginning of a paragraph |\foreignlanguage| +% enters into hmode with the surrounding lang, and with +% |\foreignlanguage*| with the new lang. +% +% \changes{babel~3.9a}{2012/07/30}{Removed unnecesary \cs{noextras} +% just before closing the group} +% \changes{babel~3.9a}{2012/07/31}{Moved \cs{originalTeX} to +% \cs{foreing@language} so that it's also used in +% \texttt{otherlanguage*}} +% \changes{babel~3.9a}{2012/12/24}{\cs{foreignlanguage} defined +% similarly to \cs{selectlanguage}, protecting the whole macro} +% \changes{babel~3.11}{2017/03/04}{\cs{foreignlanguage*}, +% \cs{bbl@beforeforeign} and hooks} +% +% \begin{macrocode} +\providecommand\bbl@beforeforeign{} +\edef\foreignlanguage{% + \noexpand\protect + \expandafter\noexpand\csname foreignlanguage \endcsname} +\expandafter\def\csname foreignlanguage \endcsname{% + \@ifstar\bbl@foreign@s\bbl@foreign@x} +\def\bbl@foreign@x#1#2{% + \begingroup + \let\BabelText\@firstofone + \bbl@beforeforeign + \foreign@language{#1}% + \bbl@usehooks{foreign}{}% + \BabelText{#2}% Now in horizontal mode! + \endgroup} +\def\bbl@foreign@s#1#2{% TODO - \shapemode, \@setpar, ?\@@par + \begingroup + {\par}% + \let\BabelText\@firstofone + \foreign@language{#1}% + \bbl@usehooks{foreign*}{}% + \bbl@dirparastext + \BabelText{#2}% Still in vertical mode! + {\par}% + \endgroup} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\foreign@language} +% This macro does the +% work for |\foreignlanguage| and the \Lenv{otherlanguage*} +% environment. First we need to store the name of the language and +% check that it is a known language. Then it just calls +% |bbl@switch|. +% +% \changes{babel~3.9h}{2013/11/29}{The warning shows the language +% actually selected (with fixed case)} +% +% \begin{macrocode} +\def\foreign@language#1{% + \edef\languagename{#1}% + \bbl@fixname\languagename + \bbl@iflanguage\languagename{% + \expandafter\ifx\csname date\languagename\endcsname\relax + \bbl@warning + {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.\\% + I'll proceed, but expect wrong results.\\% + Reported}% + \fi + \let\bbl@select@type\@ne + \expandafter\bbl@switch\expandafter{\languagename}}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\bbl@patterns} +% +% \changes{babel~3.8l}{2008/07/06}{Macro added} +% \changes{babel~3.9a}{2012/08/28}{Extended to set hyphenation +% exceptions as defined with \cs{babelhyphenation}} +% \changes{babel~3.9m}{2015/07/25}{Preset \cs{bbl@pttnlist} and +% \cs{bbl@patterns@} to relax, for luatex.} +% +% This macro selects the hyphenation patterns by changing the +% \cs{language} register. If special hyphenation patterns +% are available specifically for the current font encoding, +% use them instead of the default. +% +% It also sets hyphenation exceptions, but only once, because they +% are global (here language |\lccode|'s has been set, +% too). |\bbl@hyphenation@| is set to relax until the very first +% |\babelhyphenation|, so do nothing with this value. If the +% exceptions for a language (by its number, not its name, so that +% |:ENC| is taken into account) has been set, then use +% |\hyphenation| with both global and language exceptions and empty +% the latter to mark they must not be set again. +% +% \begin{macrocode} +\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}}% + \@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}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{environment}{hyphenrules} +% The environment \Lenv{hyphenrules} can be used to select +% \emph{just} the hyphenation rules. This environment does +% \emph{not} change |\languagename| and when the hyphenation rules +% specified were not loaded it has no effect. Note however, +% |\lccode|'s and font encodings are not set at all, so in most +% cases you should use |otherlanguage*|. +% +% \changes{babel~3.8j}{2008/03/16}{Also set the hyphenmin parameters to +% the correct value (PR3997)} +% \changes{babel~3.8l}{2008/07/06}{Use \cs{bbl@patterns}} +% \changes{3.15}{2017/10/30}{Don't set language name. Use temp macro.} +% \changes{3.15}{2018/02/14}{Fix - didn't work with polyglossia} +% +% \begin{macrocode} +\def\hyphenrules#1{% + \edef\bbl@tempf{#1}% + \bbl@fixname\bbl@tempf + \bbl@iflanguage\bbl@tempf{% + \expandafter\bbl@patterns\expandafter{\bbl@tempf}% + \languageshorthands{none}% + \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 +% \end{macrocode} +% +% \end{environment} +% +% \begin{macro}{\providehyphenmins} +% The macro |\providehyphenmins| should be used in the language +% definition files to provide a \emph{default} setting for the +% hyphenation parameters |\lefthyphenmin| and |\righthyphenmin|. If +% the macro |\|\langvar|hyphenmins| is already defined this command +% has no effect. +% +% \begin{macrocode} +\def\providehyphenmins#1#2{% + \expandafter\ifx\csname #1hyphenmins\endcsname\relax + \@namedef{#1hyphenmins}{#2}% + \fi} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\set@hyphenmins} +% This macro sets the values of |\lefthyphenmin| and +% |\righthyphenmin|. It expects two values as its argument. +% +% \begin{macrocode} +\def\set@hyphenmins#1#2{% + \lefthyphenmin#1\relax + \righthyphenmin#2\relax} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\ProvidesLanguage} +% The identification code for each file is something that was +% introduced in \LaTeXe. When the command |\ProvidesFile| does not +% exist, a dummy definition is provided temporarily. For use in the +% language definition file the command |\ProvidesLanguage| is +% defined by \babel. +% +% Depending on the format, ie, on if the former is defined, we use +% a similar definition or not. +% +% \changes{babel~3.9a}{2012/12/09}{Save info about the babel +% version in the format (switch.def) so that it can be checked +% later if necessary} +% +% \begin{macrocode} +\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 +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\LdfInit} +% This macro is defined in two versions. The first version is to be +% part of the `kernel' of \babel, ie. the part that is loaded in +% the format; the second version is defined in \file{babel.def}. +% The version in the format just checks the category code of the +% ampersand and then loads \file{babel.def}. +% +% The category code of the ampersand is restored and the macro +% calls itself again with the new definition from +% \file{babel.def} +% +% \begin{macrocode} +\def\LdfInit{% + \chardef\atcatcode=\catcode`\@ + \catcode`\@=11\relax + \input babel.def\relax + \catcode`\@=\atcatcode \let\atcatcode\relax + \LdfInit} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\originalTeX} +% The macro|\originalTeX| should be known to \TeX\ at this moment. +% As it has to be expandable we |\let| it to |\@empty| instead of +% |\relax|. +% +% \begin{macrocode} +\ifx\originalTeX\@undefined\let\originalTeX\@empty\fi +% \end{macrocode} +% +% Because this part of the code can be included in a format, we +% make sure that the macro which initialises the save mechanism, +% |\babel@beginsave|, is not considered to be undefined. +% +% \begin{macrocode} +\ifx\babel@beginsave\@undefined\let\babel@beginsave\relax\fi +% \end{macrocode} +% +% \end{macro} +% +% A few macro names are reserved for future releases of \babel, which +% will use the concept of `locale': +% +% \changes{babel~3.9s}{2017/04/13}{Reserved macro names for `locale'} +% +% \begin{macrocode} +\providecommand\setlocale{% + \bbl@error + {Not yet available}% + {Find an armchair, sit down and wait}} +\let\uselocale\setlocale +\let\locale\setlocale +\let\selectlocale\setlocale +\let\textlocale\setlocale +\let\textlanguage\setlocale +\let\languagetext\setlocale +% \end{macrocode} +% +% \subsection{Errors} +% +% \begin{macro}{\@nolanerr} +% \begin{macro}{\@nopatterns} +% The \babel\ package will signal an error when a documents tries +% to select a language that hasn't been defined earlier. When a +% user selects a language for which no hyphenation patterns were +% loaded into the format he will be given a warning about that +% fact. We revert to the patterns for |\language|=0 in that case. +% In most formats that will be (US)english, but it might also be +% empty. +% \begin{macro}{\@noopterr} +% When the package was loaded without options not everything will +% work as expected. An error message is issued in that case. +% +% When the format knows about |\PackageError| it must be \LaTeXe, +% so we can safely use its error handling interface. Otherwise +% we'll have to `keep it simple'. +% +% \changes{babel~3.9a}{2012/07/30}{\cs{newcommand}s replaced by +% \cs{def}'s, so that the file can be loaded twice} +% \changes{babel~3.9a}{2013/01/26}{Define generic variants instead of +% duplicating each predefined message} +% +% \begin{macrocode} +\edef\bbl@nulllanguage{\string\language=0} +\ifx\PackageError\@undefined + \def\bbl@error#1#2{% + \begingroup + \newlinechar=`\^^J + \def\\{^^J(babel) }% + \errhelp{#2}\errmessage{\\#1}% + \endgroup} + \def\bbl@warning#1{% + \begingroup + \newlinechar=`\^^J + \def\\{^^J(babel) }% + \message{\\#1}% + \endgroup} + \def\bbl@info#1{% + \begingroup + \newlinechar=`\^^J + \def\\{^^J}% + \wlog{#1}% + \endgroup} +\else + \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@info#1{% + \begingroup + \def\\{\MessageBreak}% + \PackageInfo{babel}{#1}% + \endgroup} +\fi +\@ifpackagewith{babel}{silent} + {\let\bbl@info\@gobble + \let\bbl@warning\@gobble} + {} +\def\bbl@nocaption#1#2{% 1: text to be printed 2: caption macro \langXname + \gdef#2{\textbf{?#1?}}% + #2% + \bbl@warning{% + \string#2 not set. Please, define\\% + it in the preamble with something like:\\% + \string\renewcommand\string#2{..}\\% + Reported}} +\def\@nolanerr#1{% + \bbl@error + {You haven't defined the language #1\space yet}% + {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 +%</kernel> +%<*patterns> +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% \end{macro} +% +% \section{Loading hyphenation patterns} +% +% The following code is meant to be read by ini\TeX\ because it +% should instruct \TeX\ to read hyphenation patterns. To this end the +% \texttt{docstrip} option \texttt{patterns} can be used to include +% this code in the file \file{hyphen.cfg}. Code is written with lower +% level macros. +% +% |toks8| stores info to be shown when the program is run. +% +% \changes{babel~3.9g}{2013/05/30}{Code moved from plain.def} +% +% We want to add a message to the message \LaTeX$\:$2.09 puts in +% the |\everyjob| register. This could be done by the following +% code: +%\begin{verbatim} +% \let\orgeveryjob\everyjob +% \def\everyjob#1{% +% \orgeveryjob{#1}% +% \orgeveryjob\expandafter{\the\orgeveryjob\immediate\write16{% +% hyphenation patterns for \the\loaded@patterns loaded.}}% +% \let\everyjob\orgeveryjob\let\orgeveryjob\@undefined} +%\end{verbatim} +% The code above redefines the control sequence \cs{everyjob} +% in order to be able to add something to the current contents of +% the register. This is necessary because the processing of +% hyphenation patterns happens long before \LaTeX\ fills the +% register. +% +% There are some problems with this approach though. +% \begin{itemize} +% \item When someone wants to use several hyphenation patterns with +% \SliTeX\ the above scheme won't work. The reason is that \SliTeX\ +% overwrites the contents of the |\everyjob| register with its own +% message. +% \item Plain \TeX\ does not use the |\everyjob| register so the +% message would not be displayed. +% \end{itemize} +% To circumvent this a `dirty trick' can be used. As this code is +% only processed when creating a new format file there is one +% command that is sure to be used, |\dump|. Therefore the original +% |\dump| is saved in |\org@dump| and a new definition is supplied. +% +% To make sure that \LaTeX$\:$2.09 executes the +% |\@begindocumenthook| we would want to alter |\begin{document}|, +% but as this done too often already, we add the new code at the +% front of |\@preamblecmds|. But we can only do that after it has +% been defined, so we add this piece of code to |\dump|. +% +% This new definition starts by adding an instruction to write a +% message on the terminal and in the transcript file to inform the +% user of the preloaded hyphenation patterns. +% +% Then everything is restored to the old situation and the format +% is dumped. +% +% \begin{macrocode} +<@Make sure ProvidesFile is defined@> +\ProvidesFile{hyphen.cfg}[<@date@> <@version@> Babel hyphens] +\xdef\bbl@format{\jobname} +\ifx\AtBeginDocument\@undefined + \def\@empty{} + \let\orig@dump\dump + \def\dump{% + \ifx\@ztryfc\@undefined + \else + \toks0=\expandafter{\@preamblecmds}% + \edef\@preamblecmds{\noexpand\@begindocumenthook\the\toks0}% + \def\@begindocumenthook{}% + \fi + \let\dump\orig@dump\let\orig@dump\@undefined\dump} +\fi +<@Define core switching macros@> +\toks8{Babel <<@version@>> and hyphenation patterns for }% +% \end{macrocode} +% +% +% \begin{macro}{\process@line} +% Each line in the file \file{language.dat} is processed by +% |\process@line| after it is read. The first thing this macro does +% is to check whether the line starts with \texttt{=}. +% When the first token of a line is an \texttt{=}, the macro +% |\process@synonym| is called; otherwise the macro +% |\process@language| will continue. +% +% \changes{babel~3.9a}{2012/12/12}{Use spaces as delimiters, to avoid +% extra spaces. Once parsed, pass them in the traditional way} +% +% \begin{macrocode} +\def\process@line#1#2 #3 #4 {% + \ifx=#1% + \process@synonym{#2}% + \else + \process@language{#1#2}{#3}{#4}% + \fi + \ignorespaces} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\process@synonym} +% +% This macro takes care of the lines which start with an +% \texttt{=}. It needs an empty token register to begin with. +% |\bbl@languages| is also set to empty. +% +% \begin{macrocode} +\toks@{} +\def\bbl@languages{} +% \end{macrocode} +% +% When no languages have been loaded yet, the name following the +% \texttt{=} will be a synonym for hyphenation register 0. So, it is stored +% in a token register and executed when the first pattern file has +% been processed. (The |\relax| just helps to the |\if| below +% catching synonyms without a language.) +% +% Otherwise the name will be a synonym for the language loaded last. +% +% We also need to copy the hyphenmin parameters for the synonym. +% +% \changes{babel~3.9a}{2012/06/25}{Added \cs{bbl@languages}} +% +% \begin{macrocode} +\def\process@synonym#1{% + \ifnum\last@language=\m@ne + \toks@\expandafter{\the\toks@\relax\process@synonym{#1}}% + \else + \expandafter\chardef\csname l@#1\endcsname\last@language + \wlog{\string\l@#1=\string\language\the\last@language}% + \expandafter\let\csname #1hyphenmins\expandafter\endcsname + \csname\languagename hyphenmins\endcsname + \let\bbl@elt\relax + \edef\bbl@languages{\bbl@languages\bbl@elt{#1}{\the\last@language}{}{}}% + \fi} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\process@language} +% The macro |\process@language| is used to process a non-empty line +% from the `configuration file'. It has three arguments, each +% delimited by white space. The first argument is the `name' of a +% language; the second is the name of the file that contains the +% patterns. The optional third argument is the name of a file +% containing hyphenation exceptions. +% +% The first thing to do is call |\addlanguage| to allocate a +% pattern register and to make that register `active'. +% Then the `name' of the language that will be loaded now is +% added to the token register |\toks8|. and finally +% the pattern file is read. +% +% \changes{babel~3.9a}{2012/12/10}{Removed \cs{selectfont} (I presume +% it was intended to catch wrong encoding codes, but I don't think +% this is necessary and as a side effect it might preload fonts)} +% +% For some hyphenation patterns it is needed to load them with a +% specific font encoding selected. This can be specified in the +% file \file{language.dat} by adding for instance `\texttt{:T1}' to +% the name of the language. The macro |\bbl@get@enc| extracts the +% font encoding from the language name and stores it in +% |\bbl@hyph@enc|. The latter can be used in hyphenation files if +% you need to set a behavior depending on the given encoding (it +% is set to empty if no encoding is given). +% +% Pattern files may contain assignments to |\lefthyphenmin| and +% |\righthyphenmin|. \TeX\ does not keep track of these +% assignments. Therefore we try to detect such assignments and +% store them in the |\|\langvar|hyphenmins| macro. When no +% assignments were made we provide a default setting. +% +% Some pattern files contain changes to the |\lccode| en |\uccode| +% arrays. Such changes should remain local to the language; +% therefore we process the pattern file in a group; the |\patterns| +% command acts globally so its effect will be remembered. +% +% Then we globally store the settings of |\lefthyphenmin| and +% |\righthyphenmin| and close the group. +% +% When the hyphenation patterns have been processed we need to see +% if a file with hyphenation exceptions needs to be read. This is +% the case when the third argument is not empty and when it does +% not contain a space token. (Note however there is no need to save +% hyphenation exceptions into the format.) +% +% \changes{babel~3.9a}{2012/06/25}{Added \cs{bbl@languages}} +% \changes{babel~3.9f}{2013/05/16}{Restored code to set default +% hyphenmins, which was deleted mistakenly} +% +% \cs{bbl@languages} saves a snapshot of the loaded languagues in the +% form \cs{bbl@elt}\marg{language-name}\marg{number}% +% \marg{patterns-file}\marg{exceptions-file}. Note the last 2 +% arguments are empty in `dialects' defined in |language.dat| with +% |=|. Note also the language name can have encoding info. +% +% Finally, if the counter |\language| is equal to zero we execute the +% synonyms stored. +% +% \begin{macrocode} +\def\process@language#1#2#3{% + \expandafter\addlanguage\csname l@#1\endcsname + \expandafter\language\csname l@#1\endcsname + \edef\languagename{#1}% + \bbl@hook@everylanguage{#1}% + \bbl@get@enc#1::\@@@ + \begingroup + \lefthyphenmin\m@ne + \bbl@hook@loadpatterns{#2}% + \ifnum\lefthyphenmin=\m@ne + \else + \expandafter\xdef\csname #1hyphenmins\endcsname{% + \the\lefthyphenmin\the\righthyphenmin}% + \fi + \endgroup + \def\bbl@tempa{#3}% + \ifx\bbl@tempa\@empty\else + \bbl@hook@loadexceptions{#3}% + \fi + \let\bbl@elt\relax + \edef\bbl@languages{% + \bbl@languages\bbl@elt{#1}{\the\language}{#2}{\bbl@tempa}}% + \ifnum\the\language=\z@ + \expandafter\ifx\csname #1hyphenmins\endcsname\relax + \set@hyphenmins\tw@\thr@@\relax + \else + \expandafter\expandafter\expandafter\set@hyphenmins + \csname #1hyphenmins\endcsname + \fi + \the\toks@ + \toks@{}% + \fi} +% \end{macrocode} +% +% \begin{macro}{\bbl@get@enc} +% +% \changes{babel~3.9a}{2012/12/11}{Code much simplified} +% +% \begin{macro}{\bbl@hyph@enc} +% The macro |\bbl@get@enc| extracts the font encoding from the +% language name and stores it in |\bbl@hyph@enc|. It uses delimited +% arguments to achieve this. +% +% \begin{macrocode} +\def\bbl@get@enc#1:#2:#3\@@@{\def\bbl@hyph@enc{#2}} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% \end{macro} +% +% Now, hooks are defined. For efficiency reasons, they are dealt +% here in a special way. Besides \luatex, format specific +% configuration files are taken into account. +% +% \changes{babel~3.9b}{2013/03/25}{Fixed an idiot slip: \cs{def} +% intead of \cs{let}} +% +% \begin{macrocode} +\def\bbl@hook@everylanguage#1{} +\def\bbl@hook@loadpatterns#1{\input #1\relax} +\let\bbl@hook@loadexceptions\bbl@hook@loadpatterns +\let\bbl@hook@loadkernel\bbl@hook@loadpatterns +\begingroup + \def\AddBabelHook#1#2{% + \expandafter\ifx\csname bbl@hook@#2\endcsname\relax + \def\next{\toks1}% + \else + \def\next{\expandafter\gdef\csname bbl@hook@#2\endcsname####1}% + \fi + \next} + \ifx\directlua\@undefined + \ifx\XeTeXinputencoding\@undefined\else + \input xebabel.def + \fi + \else + \input luababel.def + \fi + \openin1 = babel-\bbl@format.cfg + \ifeof1 + \else + \input babel-\bbl@format.cfg\relax + \fi + \closein1 +\endgroup +\bbl@hook@loadkernel{switch.def} +% \end{macrocode} +% +% \begin{macro}{\readconfigfile} +% The configuration file can now be opened for reading. +% +% \begin{macrocode} +\openin1 = language.dat +% \end{macrocode} +% +% See if the file exists, if not, use the default hyphenation file +% \file{hyphen.tex}. The user will be informed about this. +% +% \begin{macrocode} +\def\languagename{english}% +\ifeof1 + \message{I couldn't find the file language.dat,\space + I will try the file hyphen.tex} + \input hyphen.tex\relax + \chardef\l@english\z@ +\else +% \end{macrocode} +% +% Pattern registers are allocated using count register +% |\last@language|. Its initial value is~0. The definition of the +% macro |\newlanguage| is such that it first increments the count +% register and then defines the language. In order to have the +% first patterns loaded in pattern register number~0 we initialize +% |\last@language| with the value~$-1$. +% +% \begin{macrocode} + \last@language\m@ne +% \end{macrocode} +% +% We now read lines from the file until the end is found +% +% \begin{macrocode} + \loop +% \end{macrocode} +% +% While reading from the input, it is useful to switch off +% recognition of the end-of-line character. This saves us stripping +% off spaces from the contents of the control sequence. +% +% \begin{macrocode} + \endlinechar\m@ne + \read1 to \bbl@line + \endlinechar`\^^M +% \end{macrocode} +% +% \changes{babel~3.9a}{2012/12/14}{Test simplified and moved} +% \changes{babel~3.9a}{2012/12/12}{Use only spaces as delimiters and +% not /, as previouly done} +% +% If the file has reached its end, exit from the loop here. If not, +% empty lines are skipped. Add 3 space characters to the end of +% |\bbl@line|. This is needed to be able to recognize the arguments +% of |\process@line| later on. The default language should be the +% very first one. +% +% \begin{macrocode} + \if T\ifeof1F\fi T\relax + \ifx\bbl@line\@empty\else + \edef\bbl@line{\bbl@line\space\space\space}% + \expandafter\process@line\bbl@line\relax + \fi + \repeat +% \end{macrocode} +% +% Check for the end of the file. We must reverse the test for +% |\ifeof| without |\else|. Then reactivate the default patterns. +% +% \changes{babel~3.8m}{2008/07/08}{Also restore the name of the +% language in \cs{languagename} (PR 4039)} +% +% \begin{macrocode} + \begingroup + \def\bbl@elt#1#2#3#4{% + \global\language=#2\relax + \gdef\languagename{#1}% + \def\bbl@elt##1##2##3##4{}}% + \bbl@languages + \endgroup +\fi +% \end{macrocode} +% +% and close the configuration file. +% +% \begin{macrocode} +\closein1 +% \end{macrocode} +% +% We add a message about the fact that babel is loaded in the +% format and with which language patterns to the \cs{everyjob} +% register. +% +% \changes{babel~3.9a}{2012/09/25}{The list of languages is not +% printed every job any more (it is saved in \cs{bbl@languages}).} +% \changes{babel~3.9g}{2013/07/28}{In non-LaTeX formats the number of +% languages were not printed. Moved from \cs{dump} and cleaned up: +% now \cs{toks}8 is expanded here.} +% \changes{babel~3.9o}{2016/01/25}{The number of languages loaded was +% off by 1.} +% +% \begin{macrocode} +\if/\the\toks@/\else + \errhelp{language.dat loads no language, only synonyms} + \errmessage{Orphan language synonym} +\fi +\advance\last@language\@ne +\edef\bbl@tempa{% + \everyjob{% + \the\everyjob + \ifx\typeout\@undefined + \immediate\write16% + \else + \noexpand\typeout + \fi + {\the\toks8 \the\last@language\space language(s) loaded.}}} +\advance\last@language\m@ne +\bbl@tempa +% \end{macrocode} +% +% Also remove some macros from memory and raise an error +% if |\toks@| is not empty. Finally load \file{switch.def}, but the +% latter is not required and the line inputting it may be commented +% out. +% +% \changes{babel~3.9a}{2012/12/11}{Raise error if there are synonyms +% without languages} +% +% \begin{macrocode} +\let\bbl@line\@undefined +\let\process@line\@undefined +\let\process@synonym\@undefined +\let\process@language\@undefined +\let\bbl@get@enc\@undefined +\let\bbl@hyph@enc\@undefined +\let\bbl@tempa\@undefined +\let\bbl@hook@loadkernel\@undefined +\let\bbl@hook@everylanguage\@undefined +\let\bbl@hook@loadpatterns\@undefined +\let\bbl@hook@loadexceptions\@undefined +%</patterns> +% \end{macrocode} +% +% Here the code for ini\TeX\ ends. +% \end{macro} +% +% \section{Font handling with fontspec} +% +% \changes{3.15}{2017/10/30}{New way to select fonts, with \cs{babelfont}} +% +% Add the bidi handler just before luaoftload, which is loaded by default +% by LaTeX. Just in case, consider the possibility it has not been +% loaded. First, a couple of definitions related to bidi [misplaced]. +% +% \begin{macrocode} +%<<*More package options>> +\ifodd\bbl@engine + \DeclareOption{bidi=basic-r}% + {\ExecuteOptions{bidi=basic}} + \DeclareOption{bidi=basic}% + {\let\bbl@beforeforeign\leavevmode + \newattribute\bbl@attr@dir + \bbl@exp{\output{\bodydir\pagedir\the\output}}% + \AtEndOfPackage{\EnableBabelHook{babel-bidi}}} +\else + \DeclareOption{bidi=basic-r}% + {\ExecuteOptions{bidi=basic}} + \DeclareOption{bidi=basic}% + {\bbl@error + {The bidi method `basic' is available only in\\% + luatex. I'll continue with `bidi=default', so\\% + expect wrong results}% + {See the manual for further details.}% + \let\bbl@beforeforeign\leavevmode + \AtEndOfPackage{% + \EnableBabelHook{babel-bidi}% + \bbl@xebidipar}} +\fi +\DeclareOption{bidi=default}% + {\let\bbl@beforeforeign\leavevmode + \ifodd\bbl@engine + \newattribute\bbl@attr@dir + \bbl@exp{\output{\bodydir\pagedir\the\output}}% + \fi + \AtEndOfPackage{% + \EnableBabelHook{babel-bidi}% + \ifodd\bbl@engine\else + \bbl@xebidipar + \fi}} +%<</More package options>> +% \end{macrocode} +% +% With explicit languages, we could define the font at once, but we +% don't. Just wait and see if the language is actually activated. +% +% \begin{macrocode} +%<<*Font selection>> +\bbl@trace{Font handling with fontspec} +\@onlypreamble\babelfont +\newcommand\babelfont[2][]{% 1=langs/scripts 2=fam + \edef\bbl@tempa{#1}% + \def\bbl@tempb{#2}% + \ifx\fontspec\@undefined + \usepackage{fontspec}% + \fi + \EnableBabelHook{babel-fontspec}% + \bbl@bblfont} +\newcommand\bbl@bblfont[2][]{% 1=features 2=fontname + \bbl@ifunset{\bbl@tempb family}{\bbl@providefam{\bbl@tempb}}{}% + \bbl@ifunset{bbl@lsys@\languagename}{\bbl@provide@lsys{\languagename}}{}% + \expandafter\bbl@ifblank\expandafter{\bbl@tempa}% + {\bbl@csarg\edef{\bbl@tempb dflt@}{<>{#1}{#2}}% save bbl@rmdflt@ + \bbl@exp{% + \let\<bbl@\bbl@tempb dflt@\languagename>\<bbl@\bbl@tempb dflt@>% + \\\bbl@font@set\<bbl@\bbl@tempb dflt@\languagename>% + \<\bbl@tempb default>\<\bbl@tempb family>}}% + {\bbl@foreach\bbl@tempa{% ie bbl@rmdflt@lang / *scrt + \bbl@csarg\def{\bbl@tempb dflt@##1}{<>{#1}{#2}}}}}% +% \end{macrocode} +% +% If the family in the previous command does not exist, it must be +% defined. Here is how: +% +% \begin{macrocode} +\def\bbl@providefam#1{% + \bbl@exp{% + \\\newcommand\<#1default>{}% Just define it + \\\bbl@add@list\\\bbl@font@fams{#1}% + \\\DeclareRobustCommand\<#1family>{% + \\\not@math@alphabet\<#1family>\relax + \\\fontfamily\<#1default>\\\selectfont}% + \\\DeclareTextFontCommand{\<text#1>}{\<#1family>}}} +% \end{macrocode} +% +% The following macro is activated when the hook |babel-fontspec| is +% enabled. +% +% \begin{macrocode} +\def\bbl@switchfont{% + \bbl@ifunset{bbl@lsys@\languagename}{\bbl@provide@lsys{\languagename}}{}% + \bbl@exp{% eg Arabic -> arabic + \lowercase{\edef\\\bbl@tempa{\bbl@cs{sname@\languagename}}}}% + \bbl@foreach\bbl@font@fams{% + \bbl@ifunset{bbl@##1dflt@\languagename}% (1) language? + {\bbl@ifunset{bbl@##1dflt@*\bbl@tempa}% (2) from script? + {\bbl@ifunset{bbl@##1dflt@}% 2=F - (3) from generic? + {}% 123=F - nothing! + {\bbl@exp{% 3=T - from generic + \global\let\<bbl@##1dflt@\languagename>% + \<bbl@##1dflt@>}}}% + {\bbl@exp{% 2=T - from script + \global\let\<bbl@##1dflt@\languagename>% + \<bbl@##1dflt@*\bbl@tempa>}}}% + {}}% 1=T - language, already defined + \def\bbl@tempa{% + \bbl@warning{The current font is not a standard family:\\% + \fontname\font\\% + Script and Language are not applied. Consider defining a\\% + new family with \string\babelfont. Reported}}% + \bbl@foreach\bbl@font@fams{% don't gather with prev for + \bbl@ifunset{bbl@##1dflt@\languagename}% + {\bbl@cs{famrst@##1}% + \global\bbl@csarg\let{famrst@##1}\relax}% + {\bbl@exp{% order is relevant + \\\bbl@add\\\originalTeX{% + \\\bbl@font@rst{\bbl@cs{##1dflt@\languagename}}% + \<##1default>\<##1family>{##1}}% + \\\bbl@font@set\<bbl@##1dflt@\languagename>% the main part! + \<##1default>\<##1family>}}}% + \bbl@ifrestoring{}{\bbl@tempa}}% +% \end{macrocode} +% +% Now the macros defining the font with \textsf{fontspec}. +% +% When there are repeated keys in \textsf{fontspec}, the last value +% wins. So, we just place the ini settings at the beginning, and user +% settings will take precedence. +% +% \begin{macrocode} +\def\bbl@font@set#1#2#3{% eg \bbl@rmdflt@lang \rmdefault \rmfamily + \bbl@xin@{<>}{#1}% + \ifin@ + \bbl@exp{\\\bbl@fontspec@set\\#1\expandafter\@gobbletwo#1}% + \fi + \bbl@exp{% + \def\\#2{#1}% eg, \rmdefault{\bbl@rmdflt@lang} + \\\bbl@ifsamestring{#2}{\f@family}{\\#3\let\\\bbl@tempa\relax}{}}} +\def\bbl@fontspec@set#1#2#3{% eg \bbl@rmdflt@lang fnt-opt fnt-nme + \let\bbl@tempe\bbl@mapselect + \let\bbl@mapselect\relax + \bbl@exp{\<fontspec_set_family:Nnn>\\#1% + {\bbl@cs{lsys@\languagename},#2}}{#3}% + \let\bbl@mapselect\bbl@tempe + \bbl@toglobal#1}% +% \end{macrocode} +% +% font@rst and famrst are only used when there is no global settings, +% to save and restore de previous families. Not really necessary, but +% done for optimization. +% +% \begin{macrocode} +\def\bbl@font@rst#1#2#3#4{% + \bbl@csarg\def{famrst@#4}{\bbl@font@set{#1}#2#3}} +% \end{macrocode} +% +% The default font families. They are eurocentric, but the list can be +% expanded easily with |\babelfont|. +% +% \begin{macrocode} +\def\bbl@font@fams{rm,sf,tt} +% \end{macrocode} +% +% The old tentative way. Short and preverved for compatibility, but +% deprecated. Note there is no direct alternative for +% |\babelFSfeatures|. The reason in explained in the user guide, but +% essentially -- that was not the way to go :-). +% +% \begin{macrocode} +\newcommand\babelFSstore[2][]{% + \bbl@ifblank{#1}% + {\bbl@csarg\def{sname@#2}{Latin}}% + {\bbl@csarg\def{sname@#2}{#1}}% + \bbl@provide@dirs{#2}% + \bbl@csarg\ifnum{wdir@#2}>\z@ + \let\bbl@beforeforeign\leavevmode + \EnableBabelHook{babel-bidi}% + \fi + \bbl@foreach{#2}{% + \bbl@FSstore{##1}{rm}\rmdefault\bbl@save@rmdefault + \bbl@FSstore{##1}{sf}\sfdefault\bbl@save@sfdefault + \bbl@FSstore{##1}{tt}\ttdefault\bbl@save@ttdefault}} +\def\bbl@FSstore#1#2#3#4{% + \bbl@csarg\edef{#2default#1}{#3}% + \expandafter\addto\csname extras#1\endcsname{% + \let#4#3% + \ifx#3\f@family + \edef#3{\csname bbl@#2default#1\endcsname}% + \fontfamily{#3}\selectfont + \else + \edef#3{\csname bbl@#2default#1\endcsname}% + \fi}% + \expandafter\addto\csname noextras#1\endcsname{% + \ifx#3\f@family + \fontfamily{#4}\selectfont + \fi + \let#3#4}} +\let\bbl@langfeatures\@empty +\def\babelFSfeatures{% make sure \fontspec is redefined once + \let\bbl@ori@fontspec\fontspec + \renewcommand\fontspec[1][]{% + \bbl@ori@fontspec[\bbl@langfeatures##1]} + \let\babelFSfeatures\bbl@FSfeatures + \babelFSfeatures} +\def\bbl@FSfeatures#1#2{% + \expandafter\addto\csname extras#1\endcsname{% + \babel@save\bbl@langfeatures + \edef\bbl@langfeatures{#2,}}} +%<</Font selection>> +% \end{macrocode} +% +% +% \section{Hooks for XeTeX and LuaTeX} +% +% \subsection{XeTeX} +% +% Unfortunately, the current encoding cannot be retrieved and +% therefore it is reset always to |utf8|, which seems a sensible +% default. +% +% \LaTeX{} sets many ``codes'' just before loading +% \verb|hyphen.cfg|. That is not a problem in luatex, but in xetex +% they must be reset to the proper value. Most of the work is done in +% \textsf{xe(la)tex.ini}, so here we just ``undo'' some of the +% changes done by \LaTeX. Anyway, for consistency Lua\TeX{} also +% resets the catcodes. +% +% \changes{bbunicode~1.0c}{2014/03/10}{Reset ``codes'' set by \cs{LaTeX} +% to what xetex expects. Used also in luatex.} +% \changes{bbunicode~1.0f}{2015/12/06}{This block was assigned to +% xetex, even in luatex. Fixed here and below.} +% +% \begin{macrocode} +%<<*Restore Unicode catcodes before loading patterns>> + \begingroup + % Reset chars "80-"C0 to category "other", no case mapping: + \catcode`\@=11 \count@=128 + \loop\ifnum\count@<192 + \global\uccode\count@=0 \global\lccode\count@=0 + \global\catcode\count@=12 \global\sfcode\count@=1000 + \advance\count@ by 1 \repeat + % Other: + \def\O ##1 {% + \global\uccode"##1=0 \global\lccode"##1=0 + \global\catcode"##1=12 \global\sfcode"##1=1000 }% + % Letter: + \def\L ##1 ##2 ##3 {\global\catcode"##1=11 + \global\uccode"##1="##2 + \global\lccode"##1="##3 + % Uppercase letters have sfcode=999: + \ifnum"##1="##3 \else \global\sfcode"##1=999 \fi }% + % Letter without case mappings: + \def\l ##1 {\L ##1 ##1 ##1 }% + \l 00AA + \L 00B5 039C 00B5 + \l 00BA + \O 00D7 + \l 00DF + \O 00F7 + \L 00FF 0178 00FF + \endgroup + \input #1\relax +%<</Restore Unicode catcodes before loading patterns>> +% \end{macrocode} +% +% Some more common code. +% +% \changes{babel 3.17}{2018/01/24}{Tools for bidi footnote} +% +% \begin{macrocode} +%<<*Footnote changes>> +\bbl@trace{Bidi footnotes} +\ifx\bbl@beforeforeign\leavevmode + \def\bbl@footnote#1#2#3{% + \@ifnextchar[% + {\bbl@footnote@o{#1}{#2}{#3}}% + {\bbl@footnote@x{#1}{#2}{#3}}} + \def\bbl@footnote@x#1#2#3#4{% + \bgroup + \select@language@x{\bbl@main@language}% + \bbl@fn@footnote{#2#1{\ignorespaces#4}#3}% + \egroup} + \def\bbl@footnote@o#1#2#3[#4]#5{% + \bgroup + \select@language@x{\bbl@main@language}% + \bbl@fn@footnote[#4]{#2#1{\ignorespaces#5}#3}% + \egroup} + \def\bbl@footnotetext#1#2#3{% + \@ifnextchar[% + {\bbl@footnotetext@o{#1}{#2}{#3}}% + {\bbl@footnotetext@x{#1}{#2}{#3}}} + \def\bbl@footnotetext@x#1#2#3#4{% + \bgroup + \select@language@x{\bbl@main@language}% + \bbl@fn@footnotetext{#2#1{\ignorespaces#4}#3}% + \egroup} + \def\bbl@footnotetext@o#1#2#3[#4]#5{% + \bgroup + \select@language@x{\bbl@main@language}% + \bbl@fn@footnotetext[#4]{#2#1{\ignorespaces#5}#3}% + \egroup} + \def\BabelFootnote#1#2#3#4{% + \ifx\bbl@fn@footnote\@undefined + \let\bbl@fn@footnote\footnote + \fi + \ifx\bbl@fn@footnotetext\@undefined + \let\bbl@fn@footnotetext\footnotetext + \fi + \bbl@ifblank{#2}% + {\def#1{\bbl@footnote{\@firstofone}{#3}{#4}} + \@namedef{\bbl@stripslash#1text}% + {\bbl@footnotetext{\@firstofone}{#3}{#4}}}% + {\def#1{\bbl@exp{\\\bbl@footnote{\\\foreignlanguage{#2}}}{#3}{#4}}% + \@namedef{\bbl@stripslash#1text}% + {\bbl@exp{\\\bbl@footnotetext{\\\foreignlanguage{#2}}}{#3}{#4}}}} +\fi +%<</Footnote changes>> +% \end{macrocode} +% +% Now, the code. +% +% \begin{macrocode} +%<*xetex> +\def\BabelStringsDefault{unicode} +\let\xebbl@stop\relax +\AddBabelHook{xetex}{encodedcommands}{% + \def\bbl@tempa{#1}% + \ifx\bbl@tempa\@empty + \XeTeXinputencoding"bytes"% + \else + \XeTeXinputencoding"#1"% + \fi + \def\xebbl@stop{\XeTeXinputencoding"utf8"}} +\AddBabelHook{xetex}{stopcommands}{% + \xebbl@stop + \let\xebbl@stop\relax} +\AddBabelHook{xetex}{loadkernel}{% +<@Restore Unicode catcodes before loading patterns@>} +\ifx\DisableBabelHook\@undefined\endinput\fi +\AddBabelHook{babel-fontspec}{afterextras}{\bbl@switchfont} +\DisableBabelHook{babel-fontspec} +<@Font selection@> +\input txtbabel.def +%</xetex> +% \end{macrocode} +% +% \subsection{Layout} +% +% \changes{babel~3.16}{2018/01/02}{Option layout - first available options: +% sectioning, counters, lists, columns, contents} +% +% \textit{In progress.} +% +% Unfortunately, proper support for \xetex{} requires patching somehow +% lots of macros and packages (and some issues related to |\special|s +% remain, like color and hyperlinks). At least at this stage, \babel{} +% will not do it and therefore a package like \textsf{bidi} (by Vafa +% Khalighi) would be necessary to overcome the limitations of +% \xetex. Any help in making \babel{} and \textsf{bidi} collaborate +% will be welcome, although the underlying concepts in both packages +% seem very different. Note also elements like headlines and margins +% can be modified easily with packages like \textsf{fancyhdr}, +% \textsf{typearea} or \textsf{titleps}, and \textsf{geometry}. +% +% |\bbl@startskip| and |\bbl@endskip| are available to package +% authors. Thanks to the \TeX{} expansion mechanism the following +% constructs are valid: |\adim\bbl@startskip|, +% |\advance\bbl@startskip\adim|, |\bbl@startskip\adim|. +% +% Consider |txtbabel| as a shorthand for \textit{tex--xet babel}, +% which is the bidi model in both \pdftex{} and \xetex{}. +% +% \begin{macrocode} +%<*texxet> +\bbl@trace{Redefinitions for bidi layout} +\def\bbl@sspre@caption{% + \bbl@exp{\everyhbox{\\\bbl@textdir\bbl@cs{wdir@\bbl@main@language}}}} +\ifx\bbl@opt@layout\@nnil\endinput\fi % No layout +\def\bbl@startskip{\ifcase\bbl@thepardir\leftskip\else\rightskip\fi} +\def\bbl@endskip{\ifcase\bbl@thepardir\rightskip\else\leftskip\fi} +\ifx\bbl@beforeforeign\leavevmode % A poor test for bidi= + \def\@hangfrom#1{% + \setbox\@tempboxa\hbox{{#1}}% + \hangindent\ifcase\bbl@thepardir\wd\@tempboxa\else-\wd\@tempboxa\fi + \noindent\box\@tempboxa} + \def\raggedright{% + \let\\\@centercr + \bbl@startskip\z@skip + \@rightskip\@flushglue + \bbl@endskip\@rightskip + \parindent\z@ + \parfillskip\bbl@startskip} + \def\raggedleft{% + \let\\\@centercr + \bbl@startskip\@flushglue + \bbl@endskip\z@skip + \parindent\z@ + \parfillskip\bbl@endskip} +\fi +\IfBabelLayout{lists} + {\def\list#1#2{% + \ifnum \@listdepth >5\relax + \@toodeep + \else + \global\advance\@listdepth\@ne + \fi + \rightmargin\z@ + \listparindent\z@ + \itemindent\z@ + \csname @list\romannumeral\the\@listdepth\endcsname + \def\@itemlabel{#1}% + \let\makelabel\@mklab + \@nmbrlistfalse + #2\relax + \@trivlist + \parskip\parsep + \parindent\listparindent + \advance\linewidth-\rightmargin + \advance\linewidth-\leftmargin + \advance\@totalleftmargin + \ifcase\bbl@thepardir\leftmargin\else\rightmargin\fi + \parshape\@ne\@totalleftmargin\linewidth + \ignorespaces}% + \ifcase\bbl@engine + \def\labelenumii{)\theenumii(}% + \def\p@enumiii{\p@enumii)\theenumii(}% + \fi + \def\@verbatim{% + \trivlist \item\relax + \if@minipage\else\vskip\parskip\fi + \bbl@startskip\textwidth + \advance\bbl@startskip-\linewidth + \bbl@endskip\z@skip + \parindent\z@ + \parfillskip\@flushglue + \parskip\z@skip + \@@par + \language\l@nohyphenation + \@tempswafalse + \def\par{% + \if@tempswa + \leavevmode\null + \@@par\penalty\interlinepenalty + \else + \@tempswatrue + \ifhmode\@@par\penalty\interlinepenalty\fi + \fi}% + \let\do\@makeother \dospecials + \obeylines \verbatim@font \@noligs + \everypar\expandafter{\the\everypar\unpenalty}}} + {} +\IfBabelLayout{contents} + {\def\@dottedtocline#1#2#3#4#5{% + \ifnum#1>\c@tocdepth\else + \vskip \z@ \@plus.2\p@ + {\bbl@startskip#2\relax + \bbl@endskip\@tocrmarg + \parfillskip-\bbl@endskip + \parindent#2\relax + \@afterindenttrue + \interlinepenalty\@M + \leavevmode + \@tempdima#3\relax + \advance\bbl@startskip\@tempdima + \null\nobreak\hskip-\bbl@startskip + {#4}\nobreak + \leaders\hbox{% + $\m@th\mkern\@dotsep mu\hbox{.}\mkern\@dotsep mu$}% + \hfill\nobreak + \hb@xt@\@pnumwidth{\hfil\normalfont\normalcolor#5}% + \par}% + \fi}} + {} +\IfBabelLayout{columns} + {\def\@outputdblcol{% + \if@firstcolumn + \global\@firstcolumnfalse + \global\setbox\@leftcolumn\copy\@outputbox + \splitmaxdepth\maxdimen + \vbadness\maxdimen + \setbox\@outputbox\vbox{\unvbox\@outputbox\unskip}% + \setbox\@outputbox\vsplit\@outputbox to\maxdimen + \toks@\expandafter{\topmark}% + \xdef\@firstcoltopmark{\the\toks@}% + \toks@\expandafter{\splitfirstmark}% + \xdef\@firstcolfirstmark{\the\toks@}% + \ifx\@firstcolfirstmark\@empty + \global\let\@setmarks\relax + \else + \gdef\@setmarks{% + \let\firstmark\@firstcolfirstmark + \let\topmark\@firstcoltopmark}% + \fi + \else + \global\@firstcolumntrue + \setbox\@outputbox\vbox{% + \hb@xt@\textwidth{% + \hskip\columnwidth + \hfil + {\normalcolor\vrule \@width\columnseprule}% + \hfil + \hb@xt@\columnwidth{\box\@leftcolumn \hss}% + \hskip-\textwidth + \hb@xt@\columnwidth{\box\@outputbox \hss}% + \hskip\columnsep + \hskip\columnwidth}}% + \@combinedblfloats + \@setmarks + \@outputpage + \begingroup + \@dblfloatplacement + \@startdblcolumn + \@whilesw\if@fcolmade \fi{\@outputpage + \@startdblcolumn}% + \endgroup + \fi}}% + {} +<@Footnote changes@> +\IfBabelLayout{footnotes}% + {\BabelFootnote\footnote\languagename{}{}% + \BabelFootnote\localfootnote\languagename{}{}% + \BabelFootnote\mainfootnote{}{}{}} + {} +% \end{macrocode} +% +% Implicitly reverses sectioning labels in |bidi=basic-r|, because +% the full stop is not in contact with L numbers any more. I +% think there must be a better way. +% +% \begin{macrocode} +\IfBabelLayout{counters}% + {\let\bbl@latinarabic=\@arabic + \def\@arabic#1{\babelsublr{\bbl@latinarabic#1}}% + \let\bbl@asciiroman=\@roman + \def\@roman#1{\babelsublr{\ensureascii{\bbl@asciiroman#1}}}% + \let\bbl@asciiRoman=\@Roman + \def\@Roman#1{\babelsublr{\ensureascii{\bbl@asciiRoman#1}}}}{} +%</texxet> +% \end{macrocode} +% +% \subsection{LuaTeX} +% +% The new loader for luatex is based solely on |language.dat|, which +% is read on the fly. The code shouldn't be executed when the format +% is build, so we check if |\AddBabelHook| is defined. Then comes a +% modified version of the loader in |hyphen.cfg| (without the +% hyphenmins stuff, which is under the direct control of \babel). +% +% The names |\l@<language>| are defined and take some value from the +% beginning because all \texttt{ldf} files assume this for the +% corresponding language to be considered valid, but patterns are not +% loaded (except the first one). This is done later, when the language +% is first selected (which usually means when the \texttt{ldf} +% finishes). If a language has been loaded, |\bbl@hyphendata@<num>| +% exists (with the names of the files read). +% +% The default setup preloads the first language into the format. This +% is intended mainly for `english', so that it's available without +% further intervention from the user. To avoid duplicating it, the +% following rule applies: if the ``0th'' language and the first +% language in |language.dat| have the same name then just ignore the +% latter. If there are new synonymous, the are added, but note if the +% language patterns have not been preloaded they won't at run time. +% +% Other preloaded languages could be read twice, if they has been +% preloaded into the format. This is not optimal, but it shouldn't +% happen very often -- with \luatex{} patterns are best loaded when +% the document is typeset, and the ``0th'' language is preloaded just +% for backwards compatibility. +% +% As of 1.1b, lua(e)tex is taken into account. Formerly, loading of +% patterns on the fly didn't work in this format, but with the new +% loader it does. Unfortunately, the format is not based on \babel, +% and data could be duplicated, because languages are reassigned above +% those in the format (nothing serious, anyway). Note even with this +% format |language.dat| is used (under the principle of a single +% source), instead of |language.def|. +% +% Of course, there is room for improvements, like tools to read and +% reassign languages, which would require modifying the language list, +% and better error handling. +% +% We need catcode tables, but no format (targeted by \babel) provide a +% command to allocate them (although there are packages like +% \textsf{ctablestack}). For the moment, a dangerous approach is used +% -- just allocate a high random number and cross the fingers. To +% complicate things, \textsf{etex.sty} changes the way languages are +% allocated. +% +% \changes{bbunicode~1.0b}{2013/04/22}{luatex-hyphen is loaded with +% require. Changes supplied by \'{E}lie Roux.} +% \changes{bbunicode~1.0c}{2014/03/10}{Defined hook for +% `initiateactive', to fetch the next token and continue only if +% letter or other.} +% \changes{bbunicode~1.0d}{2014/03/21}{Removed the `misfeature' for +% `initiateactive'.} +% \changes{bbunicode~1.0e}{2015/05/10}{Use brackets instead of +% \cs{luaescapestring}.} +% \changes{bbunicode~1.0e}{2015/07/26}{Added function addpattern +% and modified the patterns hook.} +% \changes{bbunicode~1.1a}{2016/01/26}{New hyphenation loader for +% luatex.} +% \changes{bbunicode~1.1b}{2016/02/05}{Also lua(e)tex.} +% \changes{bbunicode~1.1c}{2016/02/08}{Base reading of patterns on +% number, not in name.} +% \changes{bbunicode~1.1c}{2016/02/08}{Some hacks for polyglossia. To +% be improved.} +% \changes{bbunicode~1.1c}{2016/02/23}{Thoroughly revised.} +% \changes{bbunicode~1.1d}{2016/4/22}{Lua: Fixed a line break at +% \cs{foreignlanguage} with unloaded patterns. Added +% \cs{babelcatcodetablenum}, just in case.} +% +% \begin{macrocode} +%<*luatex> +\ifx\AddBabelHook\@undefined +\bbl@trace{Read language.dat} +\begingroup + \toks@{} + \count@\z@ % 0=start, 1=0th, 2=normal + \def\bbl@process@line#1#2 #3 #4 {% + \ifx=#1% + \bbl@process@synonym{#2}% + \else + \bbl@process@language{#1#2}{#3}{#4}% + \fi + \ignorespaces} + \def\bbl@manylang{% + \ifnum\bbl@last>\@ne + \bbl@info{Non-standard hyphenation setup}% + \fi + \let\bbl@manylang\relax} + \def\bbl@process@language#1#2#3{% + \ifcase\count@ + \@ifundefined{zth@#1}{\count@\tw@}{\count@\@ne}% + \or + \count@\tw@ + \fi + \ifnum\count@=\tw@ + \expandafter\addlanguage\csname l@#1\endcsname + \language\allocationnumber + \chardef\bbl@last\allocationnumber + \bbl@manylang + \let\bbl@elt\relax + \xdef\bbl@languages{% + \bbl@languages\bbl@elt{#1}{\the\language}{#2}{#3}}% + \fi + \the\toks@ + \toks@{}} + \def\bbl@process@synonym@aux#1#2{% + \global\expandafter\chardef\csname l@#1\endcsname#2\relax + \let\bbl@elt\relax + \xdef\bbl@languages{% + \bbl@languages\bbl@elt{#1}{#2}{}{}}}% + \def\bbl@process@synonym#1{% + \ifcase\count@ + \toks@\expandafter{\the\toks@\relax\bbl@process@synonym{#1}}% + \or + \@ifundefined{zth@#1}{\bbl@process@synonym@aux{#1}{0}}{}% + \else + \bbl@process@synonym@aux{#1}{\the\bbl@last}% + \fi} + \ifx\bbl@languages\@undefined % Just a (sensible?) guess + \chardef\l@english\z@ + \chardef\l@USenglish\z@ + \chardef\bbl@last\z@ + \global\@namedef{bbl@hyphendata@0}{{hyphen.tex}{}} + \gdef\bbl@languages{% + \bbl@elt{english}{0}{hyphen.tex}{}% + \bbl@elt{USenglish}{0}{}{}} + \else + \global\let\bbl@languages@format\bbl@languages + \def\bbl@elt#1#2#3#4{% Remove all except language 0 + \ifnum#2>\z@\else + \noexpand\bbl@elt{#1}{#2}{#3}{#4}% + \fi}% + \xdef\bbl@languages{\bbl@languages}% + \fi + \def\bbl@elt#1#2#3#4{\@namedef{zth@#1}{}} % Define flags + \bbl@languages + \openin1=language.dat + \ifeof1 + \bbl@warning{I couldn't find language.dat. No additional\\% + patterns loaded. Reported}% + \else + \loop + \endlinechar\m@ne + \read1 to \bbl@line + \endlinechar`\^^M + \if T\ifeof1F\fi T\relax + \ifx\bbl@line\@empty\else + \edef\bbl@line{\bbl@line\space\space\space}% + \expandafter\bbl@process@line\bbl@line\relax + \fi + \repeat + \fi +\endgroup +\bbl@trace{Macros for reading patterns files} +\def\bbl@get@enc#1:#2:#3\@@@{\def\bbl@hyph@enc{#2}} +\ifx\babelcatcodetablenum\@undefined + \def\babelcatcodetablenum{5211} +\fi +\def\bbl@luapatterns#1#2{% + \bbl@get@enc#1::\@@@ + \setbox\z@\hbox\bgroup + \begingroup + \ifx\catcodetable\@undefined + \let\savecatcodetable\luatexsavecatcodetable + \let\initcatcodetable\luatexinitcatcodetable + \let\catcodetable\luatexcatcodetable + \fi + \savecatcodetable\babelcatcodetablenum\relax + \initcatcodetable\numexpr\babelcatcodetablenum+1\relax + \catcodetable\numexpr\babelcatcodetablenum+1\relax + \catcode`\#=6 \catcode`\$=3 \catcode`\&=4 \catcode`\^=7 + \catcode`\_=8 \catcode`\{=1 \catcode`\}=2 \catcode`\~=13 + \catcode`\@=11 \catcode`\^^I=10 \catcode`\^^J=12 + \catcode`\<=12 \catcode`\>=12 \catcode`\*=12 \catcode`\.=12 + \catcode`\-=12 \catcode`\/=12 \catcode`\[=12 \catcode`\]=12 + \catcode`\`=12 \catcode`\'=12 \catcode`\"=12 + \input #1\relax + \catcodetable\babelcatcodetablenum\relax + \endgroup + \def\bbl@tempa{#2}% + \ifx\bbl@tempa\@empty\else + \input #2\relax + \fi + \egroup}% +\def\bbl@patterns@lua#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\relax + \@namedef{lu@texhyphen@loaded@\the\language}{}% Temp + \@ifundefined{bbl@hyphendata@\the\language}% + {\def\bbl@elt##1##2##3##4{% + \ifnum##2=\csname l@\bbl@tempa\endcsname % #2=spanish, dutch:OT1... + \def\bbl@tempb{##3}% + \ifx\bbl@tempb\@empty\else % if not a synonymous + \def\bbl@tempc{{##3}{##4}}% + \fi + \bbl@csarg\xdef{hyphendata@##2}{\bbl@tempc}% + \fi}% + \bbl@languages + \@ifundefined{bbl@hyphendata@\the\language}% + {\bbl@info{No hyphenation patterns were set for\\% + language ‘\bbl@tempa’. Reported}}% + {\expandafter\expandafter\expandafter\bbl@luapatterns + \csname bbl@hyphendata@\the\language\endcsname}}{}} +\endinput\fi +\begingroup +\catcode`\%=12 +\catcode`\'=12 +\catcode`\"=12 +\catcode`\:=12 +\directlua{ + Babel = Babel or {} + function Babel.bytes(line) + return line:gsub("(.)", + function (chr) return unicode.utf8.char(string.byte(chr)) end) + end + function Babel.begin_process_input() + if luatexbase and luatexbase.add_to_callback then + luatexbase.add_to_callback('process_input_buffer', + Babel.bytes,'Babel.bytes') + else + Babel.callback = callback.find('process_input_buffer') + callback.register('process_input_buffer',Babel.bytes) + end + end + function Babel.end_process_input () + if luatexbase and luatexbase.remove_from_callback then + luatexbase.remove_from_callback('process_input_buffer','Babel.bytes') + else + callback.register('process_input_buffer',Babel.callback) + end + end + function Babel.addpatterns(pp, lg) + local lg = lang.new(lg) + local pats = lang.patterns(lg) or '' + lang.clear_patterns(lg) + for p in pp:gmatch('[^%s]+') do + ss = '' + for i in string.utfcharacters(p:gsub('%d', '')) do + ss = ss .. '%d?' .. i + end + ss = ss:gsub('^%%d%?%.', '%%.') .. '%d?' + ss = ss:gsub('%.%%d%?$', '%%.') + pats, n = pats:gsub('%s' .. ss .. '%s', ' ' .. p .. ' ') + if n == 0 then + tex.sprint( + [[\string\csname\space bbl@info\endcsname{New pattern: ]] + .. p .. [[}]]) + pats = pats .. ' ' .. p + else + tex.sprint( + [[\string\csname\space bbl@info\endcsname{Renew pattern: ]] + .. p .. [[}]]) + end + end + lang.patterns(lg, pats) + end +} +\endgroup +\def\BabelStringsDefault{unicode} +\let\luabbl@stop\relax +\AddBabelHook{luatex}{encodedcommands}{% + \def\bbl@tempa{utf8}\def\bbl@tempb{#1}% + \ifx\bbl@tempa\bbl@tempb\else + \directlua{Babel.begin_process_input()}% + \def\luabbl@stop{% + \directlua{Babel.end_process_input()}}% + \fi}% +\AddBabelHook{luatex}{stopcommands}{% + \luabbl@stop + \let\luabbl@stop\relax} +\AddBabelHook{luatex}{patterns}{% + \@ifundefined{bbl@hyphendata@\the\language}% + {\def\bbl@elt##1##2##3##4{% + \ifnum##2=\csname l@#2\endcsname % #2=spanish, dutch:OT1... + \def\bbl@tempb{##3}% + \ifx\bbl@tempb\@empty\else % if not a synonymous + \def\bbl@tempc{{##3}{##4}}% + \fi + \bbl@csarg\xdef{hyphendata@##2}{\bbl@tempc}% + \fi}% + \bbl@languages + \@ifundefined{bbl@hyphendata@\the\language}% + {\bbl@info{No hyphenation patterns were set for\\% + language ‘#2’. Reported}}% + {\expandafter\expandafter\expandafter\bbl@luapatterns + \csname bbl@hyphendata@\the\language\endcsname}}{}% + \@ifundefined{bbl@patterns@}{}{% + \begingroup + \bbl@xin@{,\number\language,}{,\bbl@pttnlist}% + \ifin@\else + \ifx\bbl@patterns@\@empty\else + \directlua{ Babel.addpatterns( + [[\bbl@patterns@]], \number\language) }% + \fi + \@ifundefined{bbl@patterns@#1}% + \@empty + {\directlua{ Babel.addpatterns( + [[\space\csname bbl@patterns@#1\endcsname]], + \number\language) }}% + \xdef\bbl@pttnlist{\bbl@pttnlist\number\language,}% + \fi + \endgroup}} +\AddBabelHook{luatex}{everylanguage}{% + \def\process@language##1##2##3{% + \def\process@line####1####2 ####3 ####4 {}}} +\AddBabelHook{luatex}{loadpatterns}{% + \input #1\relax + \expandafter\gdef\csname bbl@hyphendata@\the\language\endcsname + {{#1}{}}} +\AddBabelHook{luatex}{loadexceptions}{% + \input #1\relax + \def\bbl@tempb##1##2{{##1}{#1}}% + \expandafter\xdef\csname bbl@hyphendata@\the\language\endcsname + {\expandafter\expandafter\expandafter\bbl@tempb + \csname bbl@hyphendata@\the\language\endcsname}} +% \end{macrocode} +% +% \begin{macro}{\babelpatterns} +% +% This macro adds patterns. Two macros are used to store them: +% |\bbl@patterns@| for the global ones and |\bbl@patterns@<lang>| +% for language ones. We make sure there is a space between words +% when multiple commands are used. +% \changes{bbunicode~1.0e}{2015/07/26}{Macro \cs{babelpatterns} added} +% +% \begin{macrocode} +\@onlypreamble\babelpatterns +\AtEndOfPackage{% + \newcommand\babelpatterns[2][\@empty]{% + \ifx\bbl@patterns@\relax + \let\bbl@patterns@\@empty + \fi + \ifx\bbl@pttnlist\@empty\else + \bbl@warning{% + You must not intermingle \string\selectlanguage\space and\\% + \string\babelpatterns\space or some patterns will not\\% + be taken into account. Reported}% + \fi + \ifx\@empty#1% + \protected@edef\bbl@patterns@{\bbl@patterns@\space#2}% + \else + \edef\bbl@tempb{\zap@space#1 \@empty}% + \bbl@for\bbl@tempa\bbl@tempb{% + \bbl@fixname\bbl@tempa + \bbl@iflanguage\bbl@tempa{% + \bbl@csarg\protected@edef{patterns@\bbl@tempa}{% + \@ifundefined{bbl@patterns@\bbl@tempa}% + \@empty + {\csname bbl@patterns@\bbl@tempa\endcsname\space}% + #2}}}% + \fi}} +% \end{macrocode} +% \end{macro} +% +% Common stuff. +% +% \begin{macrocode} +\AddBabelHook{luatex}{loadkernel}{% +<@Restore Unicode catcodes before loading patterns@>} +\ifx\DisableBabelHook\@undefined\endinput\fi +\AddBabelHook{babel-fontspec}{afterextras}{\bbl@switchfont} +\DisableBabelHook{babel-fontspec} +<@Font selection@> +% \end{macrocode} +% +% \subsection{Layout} +% +% \textbf{Work in progress}. +% +% Unlike \xetex{}, \luatex{} requires only minimal changes for +% right-to-left layouts, particularly in monolingual documents (the +% engine itself reverses boxes -- including column order or headings +% --, margins, etc.) and with |bidi=basic-r|, without having to patch +% almost any macro where text direction is relevant. +% +% |\@hangfrom| is useful in many contexts and it is redefined always +% with the |layout| option. +% +% There are, however, a number of issues when the text direction is +% not the same as the box direction (as set by |\bodydir|), and when +% |\parbox| and |\hangindent| are involved. Fortunately, latest +% releases of \luatex{} simplify a lot the solution with |\shapemode|. +% +% \changes{3.18}{2018/02/14}{\cs{bbl@nextfake}, similar to the old +% \cs{nextfakemath} in Omega} +% +% \begin{macrocode} +\bbl@trace{Redefinitions for bidi layout} +\ifx\bbl@opt@layout\@nnil\endinput\fi % if no layout +\ifx\bbl@beforeforeign\leavevmode % A poor test for bidi= + \def\bbl@nextfake#1{% + \mathdir\bodydir % non-local, use always inside a group! + \bbl@exp{% + #1% Once entered in math, set boxes to restore values + \everyvbox{% + \the\everyvbox + \bodydir\the\bodydir + \mathdir\the\mathdir + \everyhbox{\the\everyhbox}% + \everyvbox{\the\everyvbox}}% + \everyhbox{% + \the\everyhbox + \bodydir\the\bodydir + \mathdir\the\mathdir + \everyhbox{\the\everyhbox}% + \everyvbox{\the\everyvbox}}}}% + \def\@hangfrom#1{% + \setbox\@tempboxa\hbox{{#1}}% + \hangindent\wd\@tempboxa + \ifnum\bbl@getluadir{page}=\bbl@getluadir{par}\else + \shapemode\@ne + \fi + \noindent\box\@tempboxa} +\fi +\IfBabelLayout{tabular} + {\def\@tabular{% + \leavevmode\hbox\bgroup\bbl@nextfake$% %$ + \let\@acol\@tabacol \let\@classz\@tabclassz + \let\@classiv\@tabclassiv \let\\\@tabularcr\@tabarray}} + {} +\IfBabelLayout{lists} + {\def\list#1#2{% + \ifnum \@listdepth >5\relax + \@toodeep + \else + \global\advance\@listdepth\@ne + \fi + \rightmargin\z@ + \listparindent\z@ + \itemindent\z@ + \csname @list\romannumeral\the\@listdepth\endcsname + \def\@itemlabel{#1}% + \let\makelabel\@mklab + \@nmbrlistfalse + #2\relax + \@trivlist + \parskip\parsep + \parindent\listparindent + \advance\linewidth -\rightmargin + \advance\linewidth -\leftmargin + \advance\@totalleftmargin \leftmargin + \parshape \@ne + \@totalleftmargin \linewidth + \ifnum\bbl@getluadir{page}=\bbl@getluadir{par}\else + \shapemode\tw@ + \fi + \ignorespaces}} + {} +% \end{macrocode} +% +% Implicitly reverses sectioning labels in bidi=basic-r, because +% the full stop is not in contact with L numbers any more. I +% think there must be a better way. Assumes |bidi=basic-r|, but +% there are some additional readjustments for |bidi=default|. +% +% \begin{macrocode} +\IfBabelLayout{counters}% + {\def\@textsuperscript#1{{% lua has separate settings for math + \m@th + \mathdir\pagedir % required with basic-r; ok with default, too + \ensuremath{^{\mbox {\fontsize \sf@size \z@ #1}}}}}% + \let\bbl@latinarabic=\@arabic + \def\@arabic#1{\babelsublr{\bbl@latinarabic#1}}% + \@ifpackagewith{babel}{bidi=default}% + {\let\bbl@asciiroman=\@roman + \def\@roman#1{\babelsublr{\ensureascii{\bbl@asciiroman#1}}}% + \let\bbl@asciiRoman=\@Roman + \def\@Roman#1{\babelsublr{\ensureascii{\bbl@asciiRoman#1}}}% + \def\labelenumii{)\theenumii(}% + \def\p@enumiii{\p@enumii)\theenumii(}}{}}{} +<@Footnote changes@> +\IfBabelLayout{footnotes}% + {\BabelFootnote\footnote\languagename{}{}% + \BabelFootnote\localfootnote\languagename{}{}% + \BabelFootnote\mainfootnote{}{}{}} + {} +% \end{macrocode} +% +% Some \LaTeX{} macros use internally the math mode for text +% formatting. They have very little in common and are grouped here, as +% a single option. +% +% \begin{macrocode} +\IfBabelLayout{extras}% + {\def\underline#1{% + \relax + \ifmmode\@@underline{#1}% + \else\bbl@nextfake$\@@underline{\hbox{#1}}\m@th$\relax\fi}% + \DeclareRobustCommand{\LaTeXe}{\mbox{\m@th + \if b\expandafter\@car\f@series\@nil\boldmath\fi + \babelsublr{% + \LaTeX\kern.15em2\bbl@nextfake$_{\textstyle\varepsilon}$}}}} + {} +%</luatex> +% \end{macrocode} +% +% \subsection{Auto bidi with \texttt{basic-r}} +% +% \changes{3.14}{2017/09/30}{LuaTeX - support for R/AL texts - basic-r} +% +% The file \textsf{babel-bidi.lua} currently only contains data. It is +% a large and boring file and it's not shown here. See the generated +% file. +%\iffalse +% \begin{macrocode} +%<*bidi> +-- Data from Unicode and ConTeXt + +Babel = Babel or {} + +Babel.ranges={ + {0x0590, 0x05FF, 'r'}, + {0x0600, 0x07BF, 'al'}, + {0x07C0, 0x085F, 'r'}, + {0x0860, 0x086F, 'al'}, + {0x08A0, 0x08FF, 'al'}, + {0xFB1D, 0xFB4F, 'r'}, + {0xFB50, 0xFDFF, 'al'}, + {0xFE70, 0xFEFF, 'al'}, + {0x10800, 0x10C4F, 'r'}, + {0x1E800, 0x1E8DF, 'r'}, + {0x1E900, 0x1E95F, 'r'}, + {0x1F300, 0x1F9FF, 'on'} +} + +Babel.characters={ + [0x0]={d='bn'}, + [0x1]={d='bn'}, + [0x2]={d='bn'}, + [0x3]={d='bn'}, + [0x4]={d='bn'}, + [0x5]={d='bn'}, + [0x6]={d='bn'}, + [0x7]={d='bn'}, + [0x8]={d='bn'}, + [0x9]={d='s'}, + [0xA]={d='b'}, + [0xB]={d='s'}, + [0xC]={d='ws'}, + [0xD]={d='b'}, + [0xE]={d='bn'}, + [0xF]={d='bn'}, + [0x10]={d='bn'}, + [0x11]={d='bn'}, + [0x12]={d='bn'}, + [0x13]={d='bn'}, + [0x14]={d='bn'}, + [0x15]={d='bn'}, + [0x16]={d='bn'}, + [0x17]={d='bn'}, + [0x18]={d='bn'}, + [0x19]={d='bn'}, + [0x1A]={d='bn'}, + [0x1B]={d='bn'}, + [0x1C]={d='b'}, + [0x1D]={d='b'}, + [0x1E]={d='b'}, + [0x1F]={d='s'}, + [0x20]={d='ws'}, + [0x21]={d='on'}, + [0x22]={d='on'}, + [0x23]={d='et'}, + [0x24]={d='et'}, + [0x25]={d='et'}, + [0x26]={d='on'}, + [0x27]={d='on'}, + [0x28]={d='on', m=0x29}, + [0x29]={d='on', m=0x28}, + [0x2A]={d='on'}, + [0x2B]={d='es'}, + [0x2C]={d='cs'}, + [0x2D]={d='es'}, + [0x2E]={d='cs'}, + [0x2F]={d='cs'}, + [0x30]={d='en'}, + [0x31]={d='en'}, + [0x32]={d='en'}, + [0x33]={d='en'}, + [0x34]={d='en'}, + [0x35]={d='en'}, + [0x36]={d='en'}, + [0x37]={d='en'}, + [0x38]={d='en'}, + [0x39]={d='en'}, + [0x3A]={d='cs'}, + [0x3B]={d='on'}, + [0x3C]={d='on', m=0x3E}, + [0x3D]={d='on'}, + [0x3E]={d='on', m=0x3C}, + [0x3F]={d='on'}, + [0x40]={d='on'}, + [0x5B]={d='on', m=0x5D}, + [0x5C]={d='on'}, + [0x5D]={d='on', m=0x5B}, + [0x5E]={d='on'}, + [0x5F]={d='on'}, + [0x60]={d='on'}, + [0x7B]={d='on', m=0x7D}, + [0x7C]={d='on'}, + [0x7D]={d='on', m=0x7B}, + [0x7E]={d='on'}, + [0x7F]={d='bn'}, + [0x80]={d='bn'}, + [0x81]={d='bn'}, + [0x82]={d='bn'}, + [0x83]={d='bn'}, + [0x84]={d='bn'}, + [0x85]={d='b'}, + [0x86]={d='bn'}, + [0x87]={d='bn'}, + [0x88]={d='bn'}, + [0x89]={d='bn'}, + [0x8A]={d='bn'}, + [0x8B]={d='bn'}, + [0x8C]={d='bn'}, + [0x8D]={d='bn'}, + [0x8E]={d='bn'}, + [0x8F]={d='bn'}, + [0x90]={d='bn'}, + [0x91]={d='bn'}, + [0x92]={d='bn'}, + [0x93]={d='bn'}, + [0x94]={d='bn'}, + [0x95]={d='bn'}, + [0x96]={d='bn'}, + [0x97]={d='bn'}, + [0x98]={d='bn'}, + [0x99]={d='bn'}, + [0x9A]={d='bn'}, + [0x9B]={d='bn'}, + [0x9C]={d='bn'}, + [0x9D]={d='bn'}, + [0x9E]={d='bn'}, + [0x9F]={d='bn'}, + [0xA0]={d='cs'}, + [0xA1]={d='on'}, + [0xA2]={d='et'}, + [0xA3]={d='et'}, + [0xA4]={d='et'}, + [0xA5]={d='et'}, + [0xA6]={d='on'}, + [0xA7]={d='on'}, + [0xA8]={d='on'}, + [0xA9]={d='on'}, + [0xAB]={d='on', m=0xBB}, + [0xAC]={d='on'}, + [0xAD]={d='bn'}, + [0xAE]={d='on'}, + [0xAF]={d='on'}, + [0xB0]={d='et'}, + [0xB1]={d='et'}, + [0xB2]={d='en'}, + [0xB3]={d='en'}, + [0xB4]={d='on'}, + [0xB6]={d='on'}, + [0xB7]={d='on'}, + [0xB8]={d='on'}, + [0xB9]={d='en'}, + [0xBB]={d='on', m=0xAB}, + [0xBC]={d='on'}, + [0xBD]={d='on'}, + [0xBE]={d='on'}, + [0xBF]={d='on'}, + [0xD7]={d='on'}, + [0xF7]={d='on'}, + [0x2B9]={d='on'}, + [0x2BA]={d='on'}, + [0x2C2]={d='on'}, + [0x2C3]={d='on'}, + [0x2C4]={d='on'}, + [0x2C5]={d='on'}, + [0x2C6]={d='on'}, + [0x2C7]={d='on'}, + [0x2C8]={d='on'}, + [0x2C9]={d='on'}, + [0x2CA]={d='on'}, + [0x2CB]={d='on'}, + [0x2CC]={d='on'}, + [0x2CD]={d='on'}, + [0x2CE]={d='on'}, + [0x2CF]={d='on'}, + [0x2D2]={d='on'}, + [0x2D3]={d='on'}, + [0x2D4]={d='on'}, + [0x2D5]={d='on'}, + [0x2D6]={d='on'}, + [0x2D7]={d='on'}, + [0x2D8]={d='on'}, + [0x2D9]={d='on'}, + [0x2DA]={d='on'}, + [0x2DB]={d='on'}, + [0x2DC]={d='on'}, + [0x2DD]={d='on'}, + [0x2DE]={d='on'}, + [0x2DF]={d='on'}, + [0x2E5]={d='on'}, + [0x2E6]={d='on'}, + [0x2E7]={d='on'}, + [0x2E8]={d='on'}, + [0x2E9]={d='on'}, + [0x2EA]={d='on'}, + [0x2EB]={d='on'}, + [0x2EC]={d='on'}, + [0x2ED]={d='on'}, + [0x2EF]={d='on'}, + [0x2F0]={d='on'}, + [0x2F1]={d='on'}, + [0x2F2]={d='on'}, + [0x2F3]={d='on'}, + [0x2F4]={d='on'}, + [0x2F5]={d='on'}, + [0x2F6]={d='on'}, + [0x2F7]={d='on'}, + [0x2F8]={d='on'}, + [0x2F9]={d='on'}, + [0x2FA]={d='on'}, + [0x2FB]={d='on'}, + [0x2FC]={d='on'}, + [0x2FD]={d='on'}, + [0x2FE]={d='on'}, + [0x2FF]={d='on'}, + [0x300]={d='nsm'}, + [0x301]={d='nsm'}, + [0x302]={d='nsm'}, + [0x303]={d='nsm'}, + [0x304]={d='nsm'}, + [0x305]={d='nsm'}, + [0x306]={d='nsm'}, + [0x307]={d='nsm'}, + [0x308]={d='nsm'}, + [0x309]={d='nsm'}, + [0x30A]={d='nsm'}, + [0x30B]={d='nsm'}, + [0x30C]={d='nsm'}, + [0x30D]={d='nsm'}, + [0x30E]={d='nsm'}, + [0x30F]={d='nsm'}, + [0x310]={d='nsm'}, + [0x311]={d='nsm'}, + [0x312]={d='nsm'}, + [0x313]={d='nsm'}, + [0x314]={d='nsm'}, + [0x315]={d='nsm'}, + [0x316]={d='nsm'}, + [0x317]={d='nsm'}, + [0x318]={d='nsm'}, + [0x319]={d='nsm'}, + [0x31A]={d='nsm'}, + [0x31B]={d='nsm'}, + [0x31C]={d='nsm'}, + [0x31D]={d='nsm'}, + [0x31E]={d='nsm'}, + [0x31F]={d='nsm'}, + [0x320]={d='nsm'}, + [0x321]={d='nsm'}, + [0x322]={d='nsm'}, + [0x323]={d='nsm'}, + [0x324]={d='nsm'}, + [0x325]={d='nsm'}, + [0x326]={d='nsm'}, + [0x327]={d='nsm'}, + [0x328]={d='nsm'}, + [0x329]={d='nsm'}, + [0x32A]={d='nsm'}, + [0x32B]={d='nsm'}, + [0x32C]={d='nsm'}, + [0x32D]={d='nsm'}, + [0x32E]={d='nsm'}, + [0x32F]={d='nsm'}, + [0x330]={d='nsm'}, + [0x331]={d='nsm'}, + [0x332]={d='nsm'}, + [0x333]={d='nsm'}, + [0x334]={d='nsm'}, + [0x335]={d='nsm'}, + [0x336]={d='nsm'}, + [0x337]={d='nsm'}, + [0x338]={d='nsm'}, + [0x339]={d='nsm'}, + [0x33A]={d='nsm'}, + [0x33B]={d='nsm'}, + [0x33C]={d='nsm'}, + [0x33D]={d='nsm'}, + [0x33E]={d='nsm'}, + [0x33F]={d='nsm'}, + [0x340]={d='nsm'}, + [0x341]={d='nsm'}, + [0x342]={d='nsm'}, + [0x343]={d='nsm'}, + [0x344]={d='nsm'}, + [0x345]={d='nsm'}, + [0x346]={d='nsm'}, + [0x347]={d='nsm'}, + [0x348]={d='nsm'}, + [0x349]={d='nsm'}, + [0x34A]={d='nsm'}, + [0x34B]={d='nsm'}, + [0x34C]={d='nsm'}, + [0x34D]={d='nsm'}, + [0x34E]={d='nsm'}, + [0x34F]={d='nsm'}, + [0x350]={d='nsm'}, + [0x351]={d='nsm'}, + [0x352]={d='nsm'}, + [0x353]={d='nsm'}, + [0x354]={d='nsm'}, + [0x355]={d='nsm'}, + [0x356]={d='nsm'}, + [0x357]={d='nsm'}, + [0x358]={d='nsm'}, + [0x359]={d='nsm'}, + [0x35A]={d='nsm'}, + [0x35B]={d='nsm'}, + [0x35C]={d='nsm'}, + [0x35D]={d='nsm'}, + [0x35E]={d='nsm'}, + [0x35F]={d='nsm'}, + [0x360]={d='nsm'}, + [0x361]={d='nsm'}, + [0x362]={d='nsm'}, + [0x363]={d='nsm'}, + [0x364]={d='nsm'}, + [0x365]={d='nsm'}, + [0x366]={d='nsm'}, + [0x367]={d='nsm'}, + [0x368]={d='nsm'}, + [0x369]={d='nsm'}, + [0x36A]={d='nsm'}, + [0x36B]={d='nsm'}, + [0x36C]={d='nsm'}, + [0x36D]={d='nsm'}, + [0x36E]={d='nsm'}, + [0x36F]={d='nsm'}, + [0x374]={d='on'}, + [0x375]={d='on'}, + [0x37E]={d='on'}, + [0x384]={d='on'}, + [0x385]={d='on'}, + [0x387]={d='on'}, + [0x3F6]={d='on'}, + [0x483]={d='nsm'}, + [0x484]={d='nsm'}, + [0x485]={d='nsm'}, + [0x486]={d='nsm'}, + [0x487]={d='nsm'}, + [0x488]={d='nsm'}, + [0x489]={d='nsm'}, + [0x58A]={d='on'}, + [0x58D]={d='on'}, + [0x58E]={d='on'}, + [0x58F]={d='et'}, + [0x591]={d='nsm'}, + [0x592]={d='nsm'}, + [0x593]={d='nsm'}, + [0x594]={d='nsm'}, + [0x595]={d='nsm'}, + [0x596]={d='nsm'}, + [0x597]={d='nsm'}, + [0x598]={d='nsm'}, + [0x599]={d='nsm'}, + [0x59A]={d='nsm'}, + [0x59B]={d='nsm'}, + [0x59C]={d='nsm'}, + [0x59D]={d='nsm'}, + [0x59E]={d='nsm'}, + [0x59F]={d='nsm'}, + [0x5A0]={d='nsm'}, + [0x5A1]={d='nsm'}, + [0x5A2]={d='nsm'}, + [0x5A3]={d='nsm'}, + [0x5A4]={d='nsm'}, + [0x5A5]={d='nsm'}, + [0x5A6]={d='nsm'}, + [0x5A7]={d='nsm'}, + [0x5A8]={d='nsm'}, + [0x5A9]={d='nsm'}, + [0x5AA]={d='nsm'}, + [0x5AB]={d='nsm'}, + [0x5AC]={d='nsm'}, + [0x5AD]={d='nsm'}, + [0x5AE]={d='nsm'}, + [0x5AF]={d='nsm'}, + [0x5B0]={d='nsm'}, + [0x5B1]={d='nsm'}, + [0x5B2]={d='nsm'}, + [0x5B3]={d='nsm'}, + [0x5B4]={d='nsm'}, + [0x5B5]={d='nsm'}, + [0x5B6]={d='nsm'}, + [0x5B7]={d='nsm'}, + [0x5B8]={d='nsm'}, + [0x5B9]={d='nsm'}, + [0x5BA]={d='nsm'}, + [0x5BB]={d='nsm'}, + [0x5BC]={d='nsm'}, + [0x5BD]={d='nsm'}, + [0x5BF]={d='nsm'}, + [0x5C1]={d='nsm'}, + [0x5C2]={d='nsm'}, + [0x5C4]={d='nsm'}, + [0x5C5]={d='nsm'}, + [0x5C7]={d='nsm'}, + [0x600]={d='an'}, + [0x601]={d='an'}, + [0x602]={d='an'}, + [0x603]={d='an'}, + [0x604]={d='an'}, + [0x605]={d='an'}, + [0x606]={d='on'}, + [0x607]={d='on'}, + [0x608]={d='al'}, + [0x609]={d='et'}, + [0x60A]={d='et'}, + [0x60B]={d='al'}, + [0x60C]={d='cs'}, + [0x60D]={d='al'}, + [0x60E]={d='on'}, + [0x60F]={d='on'}, + [0x610]={d='nsm'}, + [0x611]={d='nsm'}, + [0x612]={d='nsm'}, + [0x613]={d='nsm'}, + [0x614]={d='nsm'}, + [0x615]={d='nsm'}, + [0x616]={d='nsm'}, + [0x617]={d='nsm'}, + [0x618]={d='nsm'}, + [0x619]={d='nsm'}, + [0x61A]={d='nsm'}, + [0x64B]={d='nsm'}, + [0x64C]={d='nsm'}, + [0x64D]={d='nsm'}, + [0x64E]={d='nsm'}, + [0x64F]={d='nsm'}, + [0x650]={d='nsm'}, + [0x651]={d='nsm'}, + [0x652]={d='nsm'}, + [0x653]={d='nsm'}, + [0x654]={d='nsm'}, + [0x655]={d='nsm'}, + [0x656]={d='nsm'}, + [0x657]={d='nsm'}, + [0x658]={d='nsm'}, + [0x659]={d='nsm'}, + [0x65A]={d='nsm'}, + [0x65B]={d='nsm'}, + [0x65C]={d='nsm'}, + [0x65D]={d='nsm'}, + [0x65E]={d='nsm'}, + [0x65F]={d='nsm'}, + [0x660]={d='an'}, + [0x661]={d='an'}, + [0x662]={d='an'}, + [0x663]={d='an'}, + [0x664]={d='an'}, + [0x665]={d='an'}, + [0x666]={d='an'}, + [0x667]={d='an'}, + [0x668]={d='an'}, + [0x669]={d='an'}, + [0x66A]={d='et'}, + [0x66B]={d='an'}, + [0x66C]={d='an'}, + [0x670]={d='nsm'}, + [0x6D6]={d='nsm'}, + [0x6D7]={d='nsm'}, + [0x6D8]={d='nsm'}, + [0x6D9]={d='nsm'}, + [0x6DA]={d='nsm'}, + [0x6DB]={d='nsm'}, + [0x6DC]={d='nsm'}, + [0x6DD]={d='an'}, + [0x6DE]={d='on'}, + [0x6DF]={d='nsm'}, + [0x6E0]={d='nsm'}, + [0x6E1]={d='nsm'}, + [0x6E2]={d='nsm'}, + [0x6E3]={d='nsm'}, + [0x6E4]={d='nsm'}, + [0x6E7]={d='nsm'}, + [0x6E8]={d='nsm'}, + [0x6E9]={d='on'}, + [0x6EA]={d='nsm'}, + [0x6EB]={d='nsm'}, + [0x6EC]={d='nsm'}, + [0x6ED]={d='nsm'}, + [0x6F0]={d='en'}, + [0x6F1]={d='en'}, + [0x6F2]={d='en'}, + [0x6F3]={d='en'}, + [0x6F4]={d='en'}, + [0x6F5]={d='en'}, + [0x6F6]={d='en'}, + [0x6F7]={d='en'}, + [0x6F8]={d='en'}, + [0x6F9]={d='en'}, + [0x711]={d='nsm'}, + [0x730]={d='nsm'}, + [0x731]={d='nsm'}, + [0x732]={d='nsm'}, + [0x733]={d='nsm'}, + [0x734]={d='nsm'}, + [0x735]={d='nsm'}, + [0x736]={d='nsm'}, + [0x737]={d='nsm'}, + [0x738]={d='nsm'}, + [0x739]={d='nsm'}, + [0x73A]={d='nsm'}, + [0x73B]={d='nsm'}, + [0x73C]={d='nsm'}, + [0x73D]={d='nsm'}, + [0x73E]={d='nsm'}, + [0x73F]={d='nsm'}, + [0x740]={d='nsm'}, + [0x741]={d='nsm'}, + [0x742]={d='nsm'}, + [0x743]={d='nsm'}, + [0x744]={d='nsm'}, + [0x745]={d='nsm'}, + [0x746]={d='nsm'}, + [0x747]={d='nsm'}, + [0x748]={d='nsm'}, + [0x749]={d='nsm'}, + [0x74A]={d='nsm'}, + [0x7A6]={d='nsm'}, + [0x7A7]={d='nsm'}, + [0x7A8]={d='nsm'}, + [0x7A9]={d='nsm'}, + [0x7AA]={d='nsm'}, + [0x7AB]={d='nsm'}, + [0x7AC]={d='nsm'}, + [0x7AD]={d='nsm'}, + [0x7AE]={d='nsm'}, + [0x7AF]={d='nsm'}, + [0x7B0]={d='nsm'}, + [0x7EB]={d='nsm'}, + [0x7EC]={d='nsm'}, + [0x7ED]={d='nsm'}, + [0x7EE]={d='nsm'}, + [0x7EF]={d='nsm'}, + [0x7F0]={d='nsm'}, + [0x7F1]={d='nsm'}, + [0x7F2]={d='nsm'}, + [0x7F3]={d='nsm'}, + [0x7F6]={d='on'}, + [0x7F7]={d='on'}, + [0x7F8]={d='on'}, + [0x7F9]={d='on'}, + [0x816]={d='nsm'}, + [0x817]={d='nsm'}, + [0x818]={d='nsm'}, + [0x819]={d='nsm'}, + [0x81B]={d='nsm'}, + [0x81C]={d='nsm'}, + [0x81D]={d='nsm'}, + [0x81E]={d='nsm'}, + [0x81F]={d='nsm'}, + [0x820]={d='nsm'}, + [0x821]={d='nsm'}, + [0x822]={d='nsm'}, + [0x823]={d='nsm'}, + [0x825]={d='nsm'}, + [0x826]={d='nsm'}, + [0x827]={d='nsm'}, + [0x829]={d='nsm'}, + [0x82A]={d='nsm'}, + [0x82B]={d='nsm'}, + [0x82C]={d='nsm'}, + [0x82D]={d='nsm'}, + [0x859]={d='nsm'}, + [0x85A]={d='nsm'}, + [0x85B]={d='nsm'}, + [0x8D4]={d='nsm'}, + [0x8D5]={d='nsm'}, + [0x8D6]={d='nsm'}, + [0x8D7]={d='nsm'}, + [0x8D8]={d='nsm'}, + [0x8D9]={d='nsm'}, + [0x8DA]={d='nsm'}, + [0x8DB]={d='nsm'}, + [0x8DC]={d='nsm'}, + [0x8DD]={d='nsm'}, + [0x8DE]={d='nsm'}, + [0x8DF]={d='nsm'}, + [0x8E0]={d='nsm'}, + [0x8E1]={d='nsm'}, + [0x8E2]={d='an'}, + [0x8E3]={d='nsm'}, + [0x8E4]={d='nsm'}, + [0x8E5]={d='nsm'}, + [0x8E6]={d='nsm'}, + [0x8E7]={d='nsm'}, + [0x8E8]={d='nsm'}, + [0x8E9]={d='nsm'}, + [0x8EA]={d='nsm'}, + [0x8EB]={d='nsm'}, + [0x8EC]={d='nsm'}, + [0x8ED]={d='nsm'}, + [0x8EE]={d='nsm'}, + [0x8EF]={d='nsm'}, + [0x8F0]={d='nsm'}, + [0x8F1]={d='nsm'}, + [0x8F2]={d='nsm'}, + [0x8F3]={d='nsm'}, + [0x8F4]={d='nsm'}, + [0x8F5]={d='nsm'}, + [0x8F6]={d='nsm'}, + [0x8F7]={d='nsm'}, + [0x8F8]={d='nsm'}, + [0x8F9]={d='nsm'}, + [0x8FA]={d='nsm'}, + [0x8FB]={d='nsm'}, + [0x8FC]={d='nsm'}, + [0x8FD]={d='nsm'}, + [0x8FE]={d='nsm'}, + [0x8FF]={d='nsm'}, + [0x900]={d='nsm'}, + [0x901]={d='nsm'}, + [0x902]={d='nsm'}, + [0x93A]={d='nsm'}, + [0x93C]={d='nsm'}, + [0x941]={d='nsm'}, + [0x942]={d='nsm'}, + [0x943]={d='nsm'}, + [0x944]={d='nsm'}, + [0x945]={d='nsm'}, + [0x946]={d='nsm'}, + [0x947]={d='nsm'}, + [0x948]={d='nsm'}, + [0x94D]={d='nsm'}, + [0x951]={d='nsm'}, + [0x952]={d='nsm'}, + [0x953]={d='nsm'}, + [0x954]={d='nsm'}, + [0x955]={d='nsm'}, + [0x956]={d='nsm'}, + [0x957]={d='nsm'}, + [0x962]={d='nsm'}, + [0x963]={d='nsm'}, + [0x981]={d='nsm'}, + [0x9BC]={d='nsm'}, + [0x9C1]={d='nsm'}, + [0x9C2]={d='nsm'}, + [0x9C3]={d='nsm'}, + [0x9C4]={d='nsm'}, + [0x9CD]={d='nsm'}, + [0x9E2]={d='nsm'}, + [0x9E3]={d='nsm'}, + [0x9F2]={d='et'}, + [0x9F3]={d='et'}, + [0x9FB]={d='et'}, + [0xA01]={d='nsm'}, + [0xA02]={d='nsm'}, + [0xA3C]={d='nsm'}, + [0xA41]={d='nsm'}, + [0xA42]={d='nsm'}, + [0xA47]={d='nsm'}, + [0xA48]={d='nsm'}, + [0xA4B]={d='nsm'}, + [0xA4C]={d='nsm'}, + [0xA4D]={d='nsm'}, + [0xA51]={d='nsm'}, + [0xA70]={d='nsm'}, + [0xA71]={d='nsm'}, + [0xA75]={d='nsm'}, + [0xA81]={d='nsm'}, + [0xA82]={d='nsm'}, + [0xABC]={d='nsm'}, + [0xAC1]={d='nsm'}, + [0xAC2]={d='nsm'}, + [0xAC3]={d='nsm'}, + [0xAC4]={d='nsm'}, + [0xAC5]={d='nsm'}, + [0xAC7]={d='nsm'}, + [0xAC8]={d='nsm'}, + [0xACD]={d='nsm'}, + [0xAE2]={d='nsm'}, + [0xAE3]={d='nsm'}, + [0xAF1]={d='et'}, + [0xB01]={d='nsm'}, + [0xB3C]={d='nsm'}, + [0xB3F]={d='nsm'}, + [0xB41]={d='nsm'}, + [0xB42]={d='nsm'}, + [0xB43]={d='nsm'}, + [0xB44]={d='nsm'}, + [0xB4D]={d='nsm'}, + [0xB56]={d='nsm'}, + [0xB62]={d='nsm'}, + [0xB63]={d='nsm'}, + [0xB82]={d='nsm'}, + [0xBC0]={d='nsm'}, + [0xBCD]={d='nsm'}, + [0xBF3]={d='on'}, + [0xBF4]={d='on'}, + [0xBF5]={d='on'}, + [0xBF6]={d='on'}, + [0xBF7]={d='on'}, + [0xBF8]={d='on'}, + [0xBF9]={d='et'}, + [0xBFA]={d='on'}, + [0xC00]={d='nsm'}, + [0xC3E]={d='nsm'}, + [0xC3F]={d='nsm'}, + [0xC40]={d='nsm'}, + [0xC46]={d='nsm'}, + [0xC47]={d='nsm'}, + [0xC48]={d='nsm'}, + [0xC4A]={d='nsm'}, + [0xC4B]={d='nsm'}, + [0xC4C]={d='nsm'}, + [0xC4D]={d='nsm'}, + [0xC55]={d='nsm'}, + [0xC56]={d='nsm'}, + [0xC62]={d='nsm'}, + [0xC63]={d='nsm'}, + [0xC78]={d='on'}, + [0xC79]={d='on'}, + [0xC7A]={d='on'}, + [0xC7B]={d='on'}, + [0xC7C]={d='on'}, + [0xC7D]={d='on'}, + [0xC7E]={d='on'}, + [0xC81]={d='nsm'}, + [0xCBC]={d='nsm'}, + [0xCCC]={d='nsm'}, + [0xCCD]={d='nsm'}, + [0xCE2]={d='nsm'}, + [0xCE3]={d='nsm'}, + [0xD01]={d='nsm'}, + [0xD41]={d='nsm'}, + [0xD42]={d='nsm'}, + [0xD43]={d='nsm'}, + [0xD44]={d='nsm'}, + [0xD4D]={d='nsm'}, + [0xD62]={d='nsm'}, + [0xD63]={d='nsm'}, + [0xDCA]={d='nsm'}, + [0xDD2]={d='nsm'}, + [0xDD3]={d='nsm'}, + [0xDD4]={d='nsm'}, + [0xDD6]={d='nsm'}, + [0xE31]={d='nsm'}, + [0xE34]={d='nsm'}, + [0xE35]={d='nsm'}, + [0xE36]={d='nsm'}, + [0xE37]={d='nsm'}, + [0xE38]={d='nsm'}, + [0xE39]={d='nsm'}, + [0xE3A]={d='nsm'}, + [0xE3F]={d='et'}, + [0xE47]={d='nsm'}, + [0xE48]={d='nsm'}, + [0xE49]={d='nsm'}, + [0xE4A]={d='nsm'}, + [0xE4B]={d='nsm'}, + [0xE4C]={d='nsm'}, + [0xE4D]={d='nsm'}, + [0xE4E]={d='nsm'}, + [0xEB1]={d='nsm'}, + [0xEB4]={d='nsm'}, + [0xEB5]={d='nsm'}, + [0xEB6]={d='nsm'}, + [0xEB7]={d='nsm'}, + [0xEB8]={d='nsm'}, + [0xEB9]={d='nsm'}, + [0xEBB]={d='nsm'}, + [0xEBC]={d='nsm'}, + [0xEC8]={d='nsm'}, + [0xEC9]={d='nsm'}, + [0xECA]={d='nsm'}, + [0xECB]={d='nsm'}, + [0xECC]={d='nsm'}, + [0xECD]={d='nsm'}, + [0xF18]={d='nsm'}, + [0xF19]={d='nsm'}, + [0xF35]={d='nsm'}, + [0xF37]={d='nsm'}, + [0xF39]={d='nsm'}, + [0xF3A]={d='on', m=0xF3B}, + [0xF3B]={d='on', m=0xF3A}, + [0xF3C]={d='on', m=0xF3D}, + [0xF3D]={d='on', m=0xF3C}, + [0xF71]={d='nsm'}, + [0xF72]={d='nsm'}, + [0xF73]={d='nsm'}, + [0xF74]={d='nsm'}, + [0xF75]={d='nsm'}, + [0xF76]={d='nsm'}, + [0xF77]={d='nsm'}, + [0xF78]={d='nsm'}, + [0xF79]={d='nsm'}, + [0xF7A]={d='nsm'}, + [0xF7B]={d='nsm'}, + [0xF7C]={d='nsm'}, + [0xF7D]={d='nsm'}, + [0xF7E]={d='nsm'}, + [0xF80]={d='nsm'}, + [0xF81]={d='nsm'}, + [0xF82]={d='nsm'}, + [0xF83]={d='nsm'}, + [0xF84]={d='nsm'}, + [0xF86]={d='nsm'}, + [0xF87]={d='nsm'}, + [0xF8D]={d='nsm'}, + [0xF8E]={d='nsm'}, + [0xF8F]={d='nsm'}, + [0xF90]={d='nsm'}, + [0xF91]={d='nsm'}, + [0xF92]={d='nsm'}, + [0xF93]={d='nsm'}, + [0xF94]={d='nsm'}, + [0xF95]={d='nsm'}, + [0xF96]={d='nsm'}, + [0xF97]={d='nsm'}, + [0xF99]={d='nsm'}, + [0xF9A]={d='nsm'}, + [0xF9B]={d='nsm'}, + [0xF9C]={d='nsm'}, + [0xF9D]={d='nsm'}, + [0xF9E]={d='nsm'}, + [0xF9F]={d='nsm'}, + [0xFA0]={d='nsm'}, + [0xFA1]={d='nsm'}, + [0xFA2]={d='nsm'}, + [0xFA3]={d='nsm'}, + [0xFA4]={d='nsm'}, + [0xFA5]={d='nsm'}, + [0xFA6]={d='nsm'}, + [0xFA7]={d='nsm'}, + [0xFA8]={d='nsm'}, + [0xFA9]={d='nsm'}, + [0xFAA]={d='nsm'}, + [0xFAB]={d='nsm'}, + [0xFAC]={d='nsm'}, + [0xFAD]={d='nsm'}, + [0xFAE]={d='nsm'}, + [0xFAF]={d='nsm'}, + [0xFB0]={d='nsm'}, + [0xFB1]={d='nsm'}, + [0xFB2]={d='nsm'}, + [0xFB3]={d='nsm'}, + [0xFB4]={d='nsm'}, + [0xFB5]={d='nsm'}, + [0xFB6]={d='nsm'}, + [0xFB7]={d='nsm'}, + [0xFB8]={d='nsm'}, + [0xFB9]={d='nsm'}, + [0xFBA]={d='nsm'}, + [0xFBB]={d='nsm'}, + [0xFBC]={d='nsm'}, + [0xFC6]={d='nsm'}, + [0x102D]={d='nsm'}, + [0x102E]={d='nsm'}, + [0x102F]={d='nsm'}, + [0x1030]={d='nsm'}, + [0x1032]={d='nsm'}, + [0x1033]={d='nsm'}, + [0x1034]={d='nsm'}, + [0x1035]={d='nsm'}, + [0x1036]={d='nsm'}, + [0x1037]={d='nsm'}, + [0x1039]={d='nsm'}, + [0x103A]={d='nsm'}, + [0x103D]={d='nsm'}, + [0x103E]={d='nsm'}, + [0x1058]={d='nsm'}, + [0x1059]={d='nsm'}, + [0x105E]={d='nsm'}, + [0x105F]={d='nsm'}, + [0x1060]={d='nsm'}, + [0x1071]={d='nsm'}, + [0x1072]={d='nsm'}, + [0x1073]={d='nsm'}, + [0x1074]={d='nsm'}, + [0x1082]={d='nsm'}, + [0x1085]={d='nsm'}, + [0x1086]={d='nsm'}, + [0x108D]={d='nsm'}, + [0x109D]={d='nsm'}, + [0x135D]={d='nsm'}, + [0x135E]={d='nsm'}, + [0x135F]={d='nsm'}, + [0x1390]={d='on'}, + [0x1391]={d='on'}, + [0x1392]={d='on'}, + [0x1393]={d='on'}, + [0x1394]={d='on'}, + [0x1395]={d='on'}, + [0x1396]={d='on'}, + [0x1397]={d='on'}, + [0x1398]={d='on'}, + [0x1399]={d='on'}, + [0x1400]={d='on'}, + [0x1680]={d='ws'}, + [0x169B]={d='on', m=0x169C}, + [0x169C]={d='on', m=0x169B}, + [0x1712]={d='nsm'}, + [0x1713]={d='nsm'}, + [0x1714]={d='nsm'}, + [0x1732]={d='nsm'}, + [0x1733]={d='nsm'}, + [0x1734]={d='nsm'}, + [0x1752]={d='nsm'}, + [0x1753]={d='nsm'}, + [0x1772]={d='nsm'}, + [0x1773]={d='nsm'}, + [0x17B4]={d='nsm'}, + [0x17B5]={d='nsm'}, + [0x17B7]={d='nsm'}, + [0x17B8]={d='nsm'}, + [0x17B9]={d='nsm'}, + [0x17BA]={d='nsm'}, + [0x17BB]={d='nsm'}, + [0x17BC]={d='nsm'}, + [0x17BD]={d='nsm'}, + [0x17C6]={d='nsm'}, + [0x17C9]={d='nsm'}, + [0x17CA]={d='nsm'}, + [0x17CB]={d='nsm'}, + [0x17CC]={d='nsm'}, + [0x17CD]={d='nsm'}, + [0x17CE]={d='nsm'}, + [0x17CF]={d='nsm'}, + [0x17D0]={d='nsm'}, + [0x17D1]={d='nsm'}, + [0x17D2]={d='nsm'}, + [0x17D3]={d='nsm'}, + [0x17DB]={d='et'}, + [0x17DD]={d='nsm'}, + [0x17F0]={d='on'}, + [0x17F1]={d='on'}, + [0x17F2]={d='on'}, + [0x17F3]={d='on'}, + [0x17F4]={d='on'}, + [0x17F5]={d='on'}, + [0x17F6]={d='on'}, + [0x17F7]={d='on'}, + [0x17F8]={d='on'}, + [0x17F9]={d='on'}, + [0x1800]={d='on'}, + [0x1801]={d='on'}, + [0x1802]={d='on'}, + [0x1803]={d='on'}, + [0x1804]={d='on'}, + [0x1805]={d='on'}, + [0x1806]={d='on'}, + [0x1807]={d='on'}, + [0x1808]={d='on'}, + [0x1809]={d='on'}, + [0x180A]={d='on'}, + [0x180B]={d='nsm'}, + [0x180C]={d='nsm'}, + [0x180D]={d='nsm'}, + [0x180E]={d='bn'}, + [0x1885]={d='nsm'}, + [0x1886]={d='nsm'}, + [0x18A9]={d='nsm'}, + [0x1920]={d='nsm'}, + [0x1921]={d='nsm'}, + [0x1922]={d='nsm'}, + [0x1927]={d='nsm'}, + [0x1928]={d='nsm'}, + [0x1932]={d='nsm'}, + [0x1939]={d='nsm'}, + [0x193A]={d='nsm'}, + [0x193B]={d='nsm'}, + [0x1940]={d='on'}, + [0x1944]={d='on'}, + [0x1945]={d='on'}, + [0x19DE]={d='on'}, + [0x19DF]={d='on'}, + [0x19E0]={d='on'}, + [0x19E1]={d='on'}, + [0x19E2]={d='on'}, + [0x19E3]={d='on'}, + [0x19E4]={d='on'}, + [0x19E5]={d='on'}, + [0x19E6]={d='on'}, + [0x19E7]={d='on'}, + [0x19E8]={d='on'}, + [0x19E9]={d='on'}, + [0x19EA]={d='on'}, + [0x19EB]={d='on'}, + [0x19EC]={d='on'}, + [0x19ED]={d='on'}, + [0x19EE]={d='on'}, + [0x19EF]={d='on'}, + [0x19F0]={d='on'}, + [0x19F1]={d='on'}, + [0x19F2]={d='on'}, + [0x19F3]={d='on'}, + [0x19F4]={d='on'}, + [0x19F5]={d='on'}, + [0x19F6]={d='on'}, + [0x19F7]={d='on'}, + [0x19F8]={d='on'}, + [0x19F9]={d='on'}, + [0x19FA]={d='on'}, + [0x19FB]={d='on'}, + [0x19FC]={d='on'}, + [0x19FD]={d='on'}, + [0x19FE]={d='on'}, + [0x19FF]={d='on'}, + [0x1A17]={d='nsm'}, + [0x1A18]={d='nsm'}, + [0x1A1B]={d='nsm'}, + [0x1A56]={d='nsm'}, + [0x1A58]={d='nsm'}, + [0x1A59]={d='nsm'}, + [0x1A5A]={d='nsm'}, + [0x1A5B]={d='nsm'}, + [0x1A5C]={d='nsm'}, + [0x1A5D]={d='nsm'}, + [0x1A5E]={d='nsm'}, + [0x1A60]={d='nsm'}, + [0x1A62]={d='nsm'}, + [0x1A65]={d='nsm'}, + [0x1A66]={d='nsm'}, + [0x1A67]={d='nsm'}, + [0x1A68]={d='nsm'}, + [0x1A69]={d='nsm'}, + [0x1A6A]={d='nsm'}, + [0x1A6B]={d='nsm'}, + [0x1A6C]={d='nsm'}, + [0x1A73]={d='nsm'}, + [0x1A74]={d='nsm'}, + [0x1A75]={d='nsm'}, + [0x1A76]={d='nsm'}, + [0x1A77]={d='nsm'}, + [0x1A78]={d='nsm'}, + [0x1A79]={d='nsm'}, + [0x1A7A]={d='nsm'}, + [0x1A7B]={d='nsm'}, + [0x1A7C]={d='nsm'}, + [0x1A7F]={d='nsm'}, + [0x1AB0]={d='nsm'}, + [0x1AB1]={d='nsm'}, + [0x1AB2]={d='nsm'}, + [0x1AB3]={d='nsm'}, + [0x1AB4]={d='nsm'}, + [0x1AB5]={d='nsm'}, + [0x1AB6]={d='nsm'}, + [0x1AB7]={d='nsm'}, + [0x1AB8]={d='nsm'}, + [0x1AB9]={d='nsm'}, + [0x1ABA]={d='nsm'}, + [0x1ABB]={d='nsm'}, + [0x1ABC]={d='nsm'}, + [0x1ABD]={d='nsm'}, + [0x1ABE]={d='nsm'}, + [0x1B00]={d='nsm'}, + [0x1B01]={d='nsm'}, + [0x1B02]={d='nsm'}, + [0x1B03]={d='nsm'}, + [0x1B34]={d='nsm'}, + [0x1B36]={d='nsm'}, + [0x1B37]={d='nsm'}, + [0x1B38]={d='nsm'}, + [0x1B39]={d='nsm'}, + [0x1B3A]={d='nsm'}, + [0x1B3C]={d='nsm'}, + [0x1B42]={d='nsm'}, + [0x1B6B]={d='nsm'}, + [0x1B6C]={d='nsm'}, + [0x1B6D]={d='nsm'}, + [0x1B6E]={d='nsm'}, + [0x1B6F]={d='nsm'}, + [0x1B70]={d='nsm'}, + [0x1B71]={d='nsm'}, + [0x1B72]={d='nsm'}, + [0x1B73]={d='nsm'}, + [0x1B80]={d='nsm'}, + [0x1B81]={d='nsm'}, + [0x1BA2]={d='nsm'}, + [0x1BA3]={d='nsm'}, + [0x1BA4]={d='nsm'}, + [0x1BA5]={d='nsm'}, + [0x1BA8]={d='nsm'}, + [0x1BA9]={d='nsm'}, + [0x1BAB]={d='nsm'}, + [0x1BAC]={d='nsm'}, + [0x1BAD]={d='nsm'}, + [0x1BE6]={d='nsm'}, + [0x1BE8]={d='nsm'}, + [0x1BE9]={d='nsm'}, + [0x1BED]={d='nsm'}, + [0x1BEF]={d='nsm'}, + [0x1BF0]={d='nsm'}, + [0x1BF1]={d='nsm'}, + [0x1C2C]={d='nsm'}, + [0x1C2D]={d='nsm'}, + [0x1C2E]={d='nsm'}, + [0x1C2F]={d='nsm'}, + [0x1C30]={d='nsm'}, + [0x1C31]={d='nsm'}, + [0x1C32]={d='nsm'}, + [0x1C33]={d='nsm'}, + [0x1C36]={d='nsm'}, + [0x1C37]={d='nsm'}, + [0x1CD0]={d='nsm'}, + [0x1CD1]={d='nsm'}, + [0x1CD2]={d='nsm'}, + [0x1CD4]={d='nsm'}, + [0x1CD5]={d='nsm'}, + [0x1CD6]={d='nsm'}, + [0x1CD7]={d='nsm'}, + [0x1CD8]={d='nsm'}, + [0x1CD9]={d='nsm'}, + [0x1CDA]={d='nsm'}, + [0x1CDB]={d='nsm'}, + [0x1CDC]={d='nsm'}, + [0x1CDD]={d='nsm'}, + [0x1CDE]={d='nsm'}, + [0x1CDF]={d='nsm'}, + [0x1CE0]={d='nsm'}, + [0x1CE2]={d='nsm'}, + [0x1CE3]={d='nsm'}, + [0x1CE4]={d='nsm'}, + [0x1CE5]={d='nsm'}, + [0x1CE6]={d='nsm'}, + [0x1CE7]={d='nsm'}, + [0x1CE8]={d='nsm'}, + [0x1CED]={d='nsm'}, + [0x1CF4]={d='nsm'}, + [0x1CF8]={d='nsm'}, + [0x1CF9]={d='nsm'}, + [0x1DC0]={d='nsm'}, + [0x1DC1]={d='nsm'}, + [0x1DC2]={d='nsm'}, + [0x1DC3]={d='nsm'}, + [0x1DC4]={d='nsm'}, + [0x1DC5]={d='nsm'}, + [0x1DC6]={d='nsm'}, + [0x1DC7]={d='nsm'}, + [0x1DC8]={d='nsm'}, + [0x1DC9]={d='nsm'}, + [0x1DCA]={d='nsm'}, + [0x1DCB]={d='nsm'}, + [0x1DCC]={d='nsm'}, + [0x1DCD]={d='nsm'}, + [0x1DCE]={d='nsm'}, + [0x1DCF]={d='nsm'}, + [0x1DD0]={d='nsm'}, + [0x1DD1]={d='nsm'}, + [0x1DD2]={d='nsm'}, + [0x1DD3]={d='nsm'}, + [0x1DD4]={d='nsm'}, + [0x1DD5]={d='nsm'}, + [0x1DD6]={d='nsm'}, + [0x1DD7]={d='nsm'}, + [0x1DD8]={d='nsm'}, + [0x1DD9]={d='nsm'}, + [0x1DDA]={d='nsm'}, + [0x1DDB]={d='nsm'}, + [0x1DDC]={d='nsm'}, + [0x1DDD]={d='nsm'}, + [0x1DDE]={d='nsm'}, + [0x1DDF]={d='nsm'}, + [0x1DE0]={d='nsm'}, + [0x1DE1]={d='nsm'}, + [0x1DE2]={d='nsm'}, + [0x1DE3]={d='nsm'}, + [0x1DE4]={d='nsm'}, + [0x1DE5]={d='nsm'}, + [0x1DE6]={d='nsm'}, + [0x1DE7]={d='nsm'}, + [0x1DE8]={d='nsm'}, + [0x1DE9]={d='nsm'}, + [0x1DEA]={d='nsm'}, + [0x1DEB]={d='nsm'}, + [0x1DEC]={d='nsm'}, + [0x1DED]={d='nsm'}, + [0x1DEE]={d='nsm'}, + [0x1DEF]={d='nsm'}, + [0x1DF0]={d='nsm'}, + [0x1DF1]={d='nsm'}, + [0x1DF2]={d='nsm'}, + [0x1DF3]={d='nsm'}, + [0x1DF4]={d='nsm'}, + [0x1DF5]={d='nsm'}, + [0x1DFB]={d='nsm'}, + [0x1DFC]={d='nsm'}, + [0x1DFD]={d='nsm'}, + [0x1DFE]={d='nsm'}, + [0x1DFF]={d='nsm'}, + [0x1FBD]={d='on'}, + [0x1FBF]={d='on'}, + [0x1FC0]={d='on'}, + [0x1FC1]={d='on'}, + [0x1FCD]={d='on'}, + [0x1FCE]={d='on'}, + [0x1FCF]={d='on'}, + [0x1FDD]={d='on'}, + [0x1FDE]={d='on'}, + [0x1FDF]={d='on'}, + [0x1FED]={d='on'}, + [0x1FEE]={d='on'}, + [0x1FEF]={d='on'}, + [0x1FFD]={d='on'}, + [0x1FFE]={d='on'}, + [0x2000]={d='ws'}, + [0x2001]={d='ws'}, + [0x2002]={d='ws'}, + [0x2003]={d='ws'}, + [0x2004]={d='ws'}, + [0x2005]={d='ws'}, + [0x2006]={d='ws'}, + [0x2007]={d='ws'}, + [0x2008]={d='ws'}, + [0x2009]={d='ws'}, + [0x200A]={d='ws'}, + [0x200B]={d='bn'}, + [0x200C]={d='bn'}, + [0x200D]={d='bn'}, + [0x200F]={d='r'}, + [0x2010]={d='on'}, + [0x2011]={d='on'}, + [0x2012]={d='on'}, + [0x2013]={d='on'}, + [0x2014]={d='on'}, + [0x2015]={d='on'}, + [0x2016]={d='on'}, + [0x2017]={d='on'}, + [0x2018]={d='on'}, + [0x2019]={d='on'}, + [0x201A]={d='on'}, + [0x201B]={d='on'}, + [0x201C]={d='on'}, + [0x201D]={d='on'}, + [0x201E]={d='on'}, + [0x201F]={d='on'}, + [0x2020]={d='on'}, + [0x2021]={d='on'}, + [0x2022]={d='on'}, + [0x2023]={d='on'}, + [0x2024]={d='on'}, + [0x2025]={d='on'}, + [0x2026]={d='on'}, + [0x2027]={d='on'}, + [0x2028]={d='ws'}, + [0x2029]={d='b'}, + [0x202A]={d='lre'}, + [0x202B]={d='rle'}, + [0x202C]={d='pdf'}, + [0x202D]={d='lro'}, + [0x202E]={d='rlo'}, + [0x202F]={d='cs'}, + [0x2030]={d='et'}, + [0x2031]={d='et'}, + [0x2032]={d='et'}, + [0x2033]={d='et'}, + [0x2034]={d='et'}, + [0x2035]={d='on'}, + [0x2036]={d='on'}, + [0x2037]={d='on'}, + [0x2038]={d='on'}, + [0x2039]={d='on', m=0x203A}, + [0x203A]={d='on', m=0x2039}, + [0x203B]={d='on'}, + [0x203C]={d='on'}, + [0x203D]={d='on'}, + [0x203E]={d='on'}, + [0x203F]={d='on'}, + [0x2040]={d='on'}, + [0x2041]={d='on'}, + [0x2042]={d='on'}, + [0x2043]={d='on'}, + [0x2044]={d='cs'}, + [0x2045]={d='on', m=0x2046}, + [0x2046]={d='on', m=0x2045}, + [0x2047]={d='on'}, + [0x2048]={d='on'}, + [0x2049]={d='on'}, + [0x204A]={d='on'}, + [0x204B]={d='on'}, + [0x204C]={d='on'}, + [0x204D]={d='on'}, + [0x204E]={d='on'}, + [0x204F]={d='on'}, + [0x2050]={d='on'}, + [0x2051]={d='on'}, + [0x2052]={d='on'}, + [0x2053]={d='on'}, + [0x2054]={d='on'}, + [0x2055]={d='on'}, + [0x2056]={d='on'}, + [0x2057]={d='on'}, + [0x2058]={d='on'}, + [0x2059]={d='on'}, + [0x205A]={d='on'}, + [0x205B]={d='on'}, + [0x205C]={d='on'}, + [0x205D]={d='on'}, + [0x205E]={d='on'}, + [0x205F]={d='ws'}, + [0x2060]={d='bn'}, + [0x2061]={d='bn'}, + [0x2062]={d='bn'}, + [0x2063]={d='bn'}, + [0x2064]={d='bn'}, + [0x2066]={d='lri'}, + [0x2067]={d='rli'}, + [0x2068]={d='fsi'}, + [0x2069]={d='pdi'}, + [0x206A]={d='bn'}, + [0x206B]={d='bn'}, + [0x206C]={d='bn'}, + [0x206D]={d='bn'}, + [0x206E]={d='bn'}, + [0x206F]={d='bn'}, + [0x2070]={d='en'}, + [0x2074]={d='en'}, + [0x2075]={d='en'}, + [0x2076]={d='en'}, + [0x2077]={d='en'}, + [0x2078]={d='en'}, + [0x2079]={d='en'}, + [0x207A]={d='es'}, + [0x207B]={d='es'}, + [0x207C]={d='on'}, + [0x207D]={d='on', m=0x207E}, + [0x207E]={d='on', m=0x207D}, + [0x2080]={d='en'}, + [0x2081]={d='en'}, + [0x2082]={d='en'}, + [0x2083]={d='en'}, + [0x2084]={d='en'}, + [0x2085]={d='en'}, + [0x2086]={d='en'}, + [0x2087]={d='en'}, + [0x2088]={d='en'}, + [0x2089]={d='en'}, + [0x208A]={d='es'}, + [0x208B]={d='es'}, + [0x208C]={d='on'}, + [0x208D]={d='on', m=0x208E}, + [0x208E]={d='on', m=0x208D}, + [0x20A0]={d='et'}, + [0x20A1]={d='et'}, + [0x20A2]={d='et'}, + [0x20A3]={d='et'}, + [0x20A4]={d='et'}, + [0x20A5]={d='et'}, + [0x20A6]={d='et'}, + [0x20A7]={d='et'}, + [0x20A8]={d='et'}, + [0x20A9]={d='et'}, + [0x20AA]={d='et'}, + [0x20AB]={d='et'}, + [0x20AC]={d='et'}, + [0x20AD]={d='et'}, + [0x20AE]={d='et'}, + [0x20AF]={d='et'}, + [0x20B0]={d='et'}, + [0x20B1]={d='et'}, + [0x20B2]={d='et'}, + [0x20B3]={d='et'}, + [0x20B4]={d='et'}, + [0x20B5]={d='et'}, + [0x20B6]={d='et'}, + [0x20B7]={d='et'}, + [0x20B8]={d='et'}, + [0x20B9]={d='et'}, + [0x20BA]={d='et'}, + [0x20BB]={d='et'}, + [0x20BC]={d='et'}, + [0x20BD]={d='et'}, + [0x20BE]={d='et'}, + [0x20D0]={d='nsm'}, + [0x20D1]={d='nsm'}, + [0x20D2]={d='nsm'}, + [0x20D3]={d='nsm'}, + [0x20D4]={d='nsm'}, + [0x20D5]={d='nsm'}, + [0x20D6]={d='nsm'}, + [0x20D7]={d='nsm'}, + [0x20D8]={d='nsm'}, + [0x20D9]={d='nsm'}, + [0x20DA]={d='nsm'}, + [0x20DB]={d='nsm'}, + [0x20DC]={d='nsm'}, + [0x20DD]={d='nsm'}, + [0x20DE]={d='nsm'}, + [0x20DF]={d='nsm'}, + [0x20E0]={d='nsm'}, + [0x20E1]={d='nsm'}, + [0x20E2]={d='nsm'}, + [0x20E3]={d='nsm'}, + [0x20E4]={d='nsm'}, + [0x20E5]={d='nsm'}, + [0x20E6]={d='nsm'}, + [0x20E7]={d='nsm'}, + [0x20E8]={d='nsm'}, + [0x20E9]={d='nsm'}, + [0x20EA]={d='nsm'}, + [0x20EB]={d='nsm'}, + [0x20EC]={d='nsm'}, + [0x20ED]={d='nsm'}, + [0x20EE]={d='nsm'}, + [0x20EF]={d='nsm'}, + [0x20F0]={d='nsm'}, + [0x2100]={d='on'}, + [0x2101]={d='on'}, + [0x2103]={d='on'}, + [0x2104]={d='on'}, + [0x2105]={d='on'}, + [0x2106]={d='on'}, + [0x2108]={d='on'}, + [0x2109]={d='on'}, + [0x2114]={d='on'}, + [0x2116]={d='on'}, + [0x2117]={d='on'}, + [0x2118]={d='on'}, + [0x211E]={d='on'}, + [0x211F]={d='on'}, + [0x2120]={d='on'}, + [0x2121]={d='on'}, + [0x2122]={d='on'}, + [0x2123]={d='on'}, + [0x2125]={d='on'}, + [0x2127]={d='on'}, + [0x2129]={d='on'}, + [0x212E]={d='et'}, + [0x213A]={d='on'}, + [0x213B]={d='on'}, + [0x2140]={d='on'}, + [0x2141]={d='on'}, + [0x2142]={d='on'}, + [0x2143]={d='on'}, + [0x2144]={d='on'}, + [0x214A]={d='on'}, + [0x214B]={d='on'}, + [0x214C]={d='on'}, + [0x214D]={d='on'}, + [0x2150]={d='on'}, + [0x2151]={d='on'}, + [0x2152]={d='on'}, + [0x2153]={d='on'}, + [0x2154]={d='on'}, + [0x2155]={d='on'}, + [0x2156]={d='on'}, + [0x2157]={d='on'}, + [0x2158]={d='on'}, + [0x2159]={d='on'}, + [0x215A]={d='on'}, + [0x215B]={d='on'}, + [0x215C]={d='on'}, + [0x215D]={d='on'}, + [0x215E]={d='on'}, + [0x215F]={d='on'}, + [0x2189]={d='on'}, + [0x218A]={d='on'}, + [0x218B]={d='on'}, + [0x2190]={d='on'}, + [0x2191]={d='on'}, + [0x2192]={d='on'}, + [0x2193]={d='on'}, + [0x2194]={d='on'}, + [0x2195]={d='on'}, + [0x2196]={d='on'}, + [0x2197]={d='on'}, + [0x2198]={d='on'}, + [0x2199]={d='on'}, + [0x219A]={d='on'}, + [0x219B]={d='on'}, + [0x219C]={d='on'}, + [0x219D]={d='on'}, + [0x219E]={d='on'}, + [0x219F]={d='on'}, + [0x21A0]={d='on'}, + [0x21A1]={d='on'}, + [0x21A2]={d='on'}, + [0x21A3]={d='on'}, + [0x21A4]={d='on'}, + [0x21A5]={d='on'}, + [0x21A6]={d='on'}, + [0x21A7]={d='on'}, + [0x21A8]={d='on'}, + [0x21A9]={d='on'}, + [0x21AA]={d='on'}, + [0x21AB]={d='on'}, + [0x21AC]={d='on'}, + [0x21AD]={d='on'}, + [0x21AE]={d='on'}, + [0x21AF]={d='on'}, + [0x21B0]={d='on'}, + [0x21B1]={d='on'}, + [0x21B2]={d='on'}, + [0x21B3]={d='on'}, + [0x21B4]={d='on'}, + [0x21B5]={d='on'}, + [0x21B6]={d='on'}, + [0x21B7]={d='on'}, + [0x21B8]={d='on'}, + [0x21B9]={d='on'}, + [0x21BA]={d='on'}, + [0x21BB]={d='on'}, + [0x21BC]={d='on'}, + [0x21BD]={d='on'}, + [0x21BE]={d='on'}, + [0x21BF]={d='on'}, + [0x21C0]={d='on'}, + [0x21C1]={d='on'}, + [0x21C2]={d='on'}, + [0x21C3]={d='on'}, + [0x21C4]={d='on'}, + [0x21C5]={d='on'}, + [0x21C6]={d='on'}, + [0x21C7]={d='on'}, + [0x21C8]={d='on'}, + [0x21C9]={d='on'}, + [0x21CA]={d='on'}, + [0x21CB]={d='on'}, + [0x21CC]={d='on'}, + [0x21CD]={d='on'}, + [0x21CE]={d='on'}, + [0x21CF]={d='on'}, + [0x21D0]={d='on'}, + [0x21D1]={d='on'}, + [0x21D2]={d='on'}, + [0x21D3]={d='on'}, + [0x21D4]={d='on'}, + [0x21D5]={d='on'}, + [0x21D6]={d='on'}, + [0x21D7]={d='on'}, + [0x21D8]={d='on'}, + [0x21D9]={d='on'}, + [0x21DA]={d='on'}, + [0x21DB]={d='on'}, + [0x21DC]={d='on'}, + [0x21DD]={d='on'}, + [0x21DE]={d='on'}, + [0x21DF]={d='on'}, + [0x21E0]={d='on'}, + [0x21E1]={d='on'}, + [0x21E2]={d='on'}, + [0x21E3]={d='on'}, + [0x21E4]={d='on'}, + [0x21E5]={d='on'}, + [0x21E6]={d='on'}, + [0x21E7]={d='on'}, + [0x21E8]={d='on'}, + [0x21E9]={d='on'}, + [0x21EA]={d='on'}, + [0x21EB]={d='on'}, + [0x21EC]={d='on'}, + [0x21ED]={d='on'}, + [0x21EE]={d='on'}, + [0x21EF]={d='on'}, + [0x21F0]={d='on'}, + [0x21F1]={d='on'}, + [0x21F2]={d='on'}, + [0x21F3]={d='on'}, + [0x21F4]={d='on'}, + [0x21F5]={d='on'}, + [0x21F6]={d='on'}, + [0x21F7]={d='on'}, + [0x21F8]={d='on'}, + [0x21F9]={d='on'}, + [0x21FA]={d='on'}, + [0x21FB]={d='on'}, + [0x21FC]={d='on'}, + [0x21FD]={d='on'}, + [0x21FE]={d='on'}, + [0x21FF]={d='on'}, + [0x2200]={d='on'}, + [0x2201]={d='on'}, + [0x2202]={d='on'}, + [0x2203]={d='on'}, + [0x2204]={d='on'}, + [0x2205]={d='on'}, + [0x2206]={d='on'}, + [0x2207]={d='on'}, + [0x2208]={d='on', m=0x220B}, + [0x2209]={d='on', m=0x220C}, + [0x220A]={d='on', m=0x220D}, + [0x220B]={d='on', m=0x2208}, + [0x220C]={d='on', m=0x2209}, + [0x220D]={d='on', m=0x220A}, + [0x220E]={d='on'}, + [0x220F]={d='on'}, + [0x2210]={d='on'}, + [0x2211]={d='on'}, + [0x2212]={d='es'}, + [0x2213]={d='et'}, + [0x2214]={d='on'}, + [0x2215]={d='on', m=0x29F5}, + [0x2216]={d='on'}, + [0x2217]={d='on'}, + [0x2218]={d='on'}, + [0x2219]={d='on'}, + [0x221A]={d='on'}, + [0x221B]={d='on'}, + [0x221C]={d='on'}, + [0x221D]={d='on'}, + [0x221E]={d='on'}, + [0x221F]={d='on'}, + [0x2220]={d='on'}, + [0x2221]={d='on'}, + [0x2222]={d='on'}, + [0x2223]={d='on'}, + [0x2224]={d='on'}, + [0x2225]={d='on'}, + [0x2226]={d='on'}, + [0x2227]={d='on'}, + [0x2228]={d='on'}, + [0x2229]={d='on'}, + [0x222A]={d='on'}, + [0x222B]={d='on'}, + [0x222C]={d='on'}, + [0x222D]={d='on'}, + [0x222E]={d='on'}, + [0x222F]={d='on'}, + [0x2230]={d='on'}, + [0x2231]={d='on'}, + [0x2232]={d='on'}, + [0x2233]={d='on'}, + [0x2234]={d='on'}, + [0x2235]={d='on'}, + [0x2236]={d='on'}, + [0x2237]={d='on'}, + [0x2238]={d='on'}, + [0x2239]={d='on'}, + [0x223A]={d='on'}, + [0x223B]={d='on'}, + [0x223C]={d='on', m=0x223D}, + [0x223D]={d='on', m=0x223C}, + [0x223E]={d='on'}, + [0x223F]={d='on'}, + [0x2240]={d='on'}, + [0x2241]={d='on'}, + [0x2242]={d='on'}, + [0x2243]={d='on', m=0x22CD}, + [0x2244]={d='on'}, + [0x2245]={d='on'}, + [0x2246]={d='on'}, + [0x2247]={d='on'}, + [0x2248]={d='on'}, + [0x2249]={d='on'}, + [0x224A]={d='on'}, + [0x224B]={d='on'}, + [0x224C]={d='on'}, + [0x224D]={d='on'}, + [0x224E]={d='on'}, + [0x224F]={d='on'}, + [0x2250]={d='on'}, + [0x2251]={d='on'}, + [0x2252]={d='on', m=0x2253}, + [0x2253]={d='on', m=0x2252}, + [0x2254]={d='on', m=0x2255}, + [0x2255]={d='on', m=0x2254}, + [0x2256]={d='on'}, + [0x2257]={d='on'}, + [0x2258]={d='on'}, + [0x2259]={d='on'}, + [0x225A]={d='on'}, + [0x225B]={d='on'}, + [0x225C]={d='on'}, + [0x225D]={d='on'}, + [0x225E]={d='on'}, + [0x225F]={d='on'}, + [0x2260]={d='on'}, + [0x2261]={d='on'}, + [0x2262]={d='on'}, + [0x2263]={d='on'}, + [0x2264]={d='on', m=0x2265}, + [0x2265]={d='on', m=0x2264}, + [0x2266]={d='on', m=0x2267}, + [0x2267]={d='on', m=0x2266}, + [0x2268]={d='on', m=0x2269}, + [0x2269]={d='on', m=0x2268}, + [0x226A]={d='on', m=0x226B}, + [0x226B]={d='on', m=0x226A}, + [0x226C]={d='on'}, + [0x226D]={d='on'}, + [0x226E]={d='on', m=0x226F}, + [0x226F]={d='on', m=0x226E}, + [0x2270]={d='on', m=0x2271}, + [0x2271]={d='on', m=0x2270}, + [0x2272]={d='on', m=0x2273}, + [0x2273]={d='on', m=0x2272}, + [0x2274]={d='on', m=0x2275}, + [0x2275]={d='on', m=0x2274}, + [0x2276]={d='on', m=0x2277}, + [0x2277]={d='on', m=0x2276}, + [0x2278]={d='on', m=0x2279}, + [0x2279]={d='on', m=0x2278}, + [0x227A]={d='on', m=0x227B}, + [0x227B]={d='on', m=0x227A}, + [0x227C]={d='on', m=0x227D}, + [0x227D]={d='on', m=0x227C}, + [0x227E]={d='on', m=0x227F}, + [0x227F]={d='on', m=0x227E}, + [0x2280]={d='on', m=0x2281}, + [0x2281]={d='on', m=0x2280}, + [0x2282]={d='on', m=0x2283}, + [0x2283]={d='on', m=0x2282}, + [0x2284]={d='on', m=0x2285}, + [0x2285]={d='on', m=0x2284}, + [0x2286]={d='on', m=0x2287}, + [0x2287]={d='on', m=0x2286}, + [0x2288]={d='on', m=0x2289}, + [0x2289]={d='on', m=0x2288}, + [0x228A]={d='on', m=0x228B}, + [0x228B]={d='on', m=0x228A}, + [0x228C]={d='on'}, + [0x228D]={d='on'}, + [0x228E]={d='on'}, + [0x228F]={d='on', m=0x2290}, + [0x2290]={d='on', m=0x228F}, + [0x2291]={d='on', m=0x2292}, + [0x2292]={d='on', m=0x2291}, + [0x2293]={d='on'}, + [0x2294]={d='on'}, + [0x2295]={d='on'}, + [0x2296]={d='on'}, + [0x2297]={d='on'}, + [0x2298]={d='on', m=0x29B8}, + [0x2299]={d='on'}, + [0x229A]={d='on'}, + [0x229B]={d='on'}, + [0x229C]={d='on'}, + [0x229D]={d='on'}, + [0x229E]={d='on'}, + [0x229F]={d='on'}, + [0x22A0]={d='on'}, + [0x22A1]={d='on'}, + [0x22A2]={d='on', m=0x22A3}, + [0x22A3]={d='on', m=0x22A2}, + [0x22A4]={d='on'}, + [0x22A5]={d='on'}, + [0x22A6]={d='on', m=0x2ADE}, + [0x22A7]={d='on'}, + [0x22A8]={d='on', m=0x2AE4}, + [0x22A9]={d='on', m=0x2AE3}, + [0x22AA]={d='on'}, + [0x22AB]={d='on', m=0x2AE5}, + [0x22AC]={d='on'}, + [0x22AD]={d='on'}, + [0x22AE]={d='on'}, + [0x22AF]={d='on'}, + [0x22B0]={d='on', m=0x22B1}, + [0x22B1]={d='on', m=0x22B0}, + [0x22B2]={d='on', m=0x22B3}, + [0x22B3]={d='on', m=0x22B2}, + [0x22B4]={d='on', m=0x22B5}, + [0x22B5]={d='on', m=0x22B4}, + [0x22B6]={d='on', m=0x22B7}, + [0x22B7]={d='on', m=0x22B6}, + [0x22B8]={d='on'}, + [0x22B9]={d='on'}, + [0x22BA]={d='on'}, + [0x22BB]={d='on'}, + [0x22BC]={d='on'}, + [0x22BD]={d='on'}, + [0x22BE]={d='on'}, + [0x22BF]={d='on'}, + [0x22C0]={d='on'}, + [0x22C1]={d='on'}, + [0x22C2]={d='on'}, + [0x22C3]={d='on'}, + [0x22C4]={d='on'}, + [0x22C5]={d='on'}, + [0x22C6]={d='on'}, + [0x22C7]={d='on'}, + [0x22C8]={d='on'}, + [0x22C9]={d='on', m=0x22CA}, + [0x22CA]={d='on', m=0x22C9}, + [0x22CB]={d='on', m=0x22CC}, + [0x22CC]={d='on', m=0x22CB}, + [0x22CD]={d='on', m=0x2243}, + [0x22CE]={d='on'}, + [0x22CF]={d='on'}, + [0x22D0]={d='on', m=0x22D1}, + [0x22D1]={d='on', m=0x22D0}, + [0x22D2]={d='on'}, + [0x22D3]={d='on'}, + [0x22D4]={d='on'}, + [0x22D5]={d='on'}, + [0x22D6]={d='on', m=0x22D7}, + [0x22D7]={d='on', m=0x22D6}, + [0x22D8]={d='on', m=0x22D9}, + [0x22D9]={d='on', m=0x22D8}, + [0x22DA]={d='on', m=0x22DB}, + [0x22DB]={d='on', m=0x22DA}, + [0x22DC]={d='on', m=0x22DD}, + [0x22DD]={d='on', m=0x22DC}, + [0x22DE]={d='on', m=0x22DF}, + [0x22DF]={d='on', m=0x22DE}, + [0x22E0]={d='on', m=0x22E1}, + [0x22E1]={d='on', m=0x22E0}, + [0x22E2]={d='on', m=0x22E3}, + [0x22E3]={d='on', m=0x22E2}, + [0x22E4]={d='on', m=0x22E5}, + [0x22E5]={d='on', m=0x22E4}, + [0x22E6]={d='on', m=0x22E7}, + [0x22E7]={d='on', m=0x22E6}, + [0x22E8]={d='on', m=0x22E9}, + [0x22E9]={d='on', m=0x22E8}, + [0x22EA]={d='on', m=0x22EB}, + [0x22EB]={d='on', m=0x22EA}, + [0x22EC]={d='on', m=0x22ED}, + [0x22ED]={d='on', m=0x22EC}, + [0x22EE]={d='on'}, + [0x22EF]={d='on'}, + [0x22F0]={d='on', m=0x22F1}, + [0x22F1]={d='on', m=0x22F0}, + [0x22F2]={d='on', m=0x22FA}, + [0x22F3]={d='on', m=0x22FB}, + [0x22F4]={d='on', m=0x22FC}, + [0x22F5]={d='on'}, + [0x22F6]={d='on', m=0x22FD}, + [0x22F7]={d='on', m=0x22FE}, + [0x22F8]={d='on'}, + [0x22F9]={d='on'}, + [0x22FA]={d='on', m=0x22F2}, + [0x22FB]={d='on', m=0x22F3}, + [0x22FC]={d='on', m=0x22F4}, + [0x22FD]={d='on', m=0x22F6}, + [0x22FE]={d='on', m=0x22F7}, + [0x22FF]={d='on'}, + [0x2300]={d='on'}, + [0x2301]={d='on'}, + [0x2302]={d='on'}, + [0x2303]={d='on'}, + [0x2304]={d='on'}, + [0x2305]={d='on'}, + [0x2306]={d='on'}, + [0x2307]={d='on'}, + [0x2308]={d='on', m=0x2309}, + [0x2309]={d='on', m=0x2308}, + [0x230A]={d='on', m=0x230B}, + [0x230B]={d='on', m=0x230A}, + [0x230C]={d='on'}, + [0x230D]={d='on'}, + [0x230E]={d='on'}, + [0x230F]={d='on'}, + [0x2310]={d='on'}, + [0x2311]={d='on'}, + [0x2312]={d='on'}, + [0x2313]={d='on'}, + [0x2314]={d='on'}, + [0x2315]={d='on'}, + [0x2316]={d='on'}, + [0x2317]={d='on'}, + [0x2318]={d='on'}, + [0x2319]={d='on'}, + [0x231A]={d='on'}, + [0x231B]={d='on'}, + [0x231C]={d='on'}, + [0x231D]={d='on'}, + [0x231E]={d='on'}, + [0x231F]={d='on'}, + [0x2320]={d='on'}, + [0x2321]={d='on'}, + [0x2322]={d='on'}, + [0x2323]={d='on'}, + [0x2324]={d='on'}, + [0x2325]={d='on'}, + [0x2326]={d='on'}, + [0x2327]={d='on'}, + [0x2328]={d='on'}, + [0x2329]={d='on', m=0x232A}, + [0x232A]={d='on', m=0x2329}, + [0x232B]={d='on'}, + [0x232C]={d='on'}, + [0x232D]={d='on'}, + [0x232E]={d='on'}, + [0x232F]={d='on'}, + [0x2330]={d='on'}, + [0x2331]={d='on'}, + [0x2332]={d='on'}, + [0x2333]={d='on'}, + [0x2334]={d='on'}, + [0x2335]={d='on'}, + [0x237B]={d='on'}, + [0x237C]={d='on'}, + [0x237D]={d='on'}, + [0x237E]={d='on'}, + [0x237F]={d='on'}, + [0x2380]={d='on'}, + [0x2381]={d='on'}, + [0x2382]={d='on'}, + [0x2383]={d='on'}, + [0x2384]={d='on'}, + [0x2385]={d='on'}, + [0x2386]={d='on'}, + [0x2387]={d='on'}, + [0x2388]={d='on'}, + [0x2389]={d='on'}, + [0x238A]={d='on'}, + [0x238B]={d='on'}, + [0x238C]={d='on'}, + [0x238D]={d='on'}, + [0x238E]={d='on'}, + [0x238F]={d='on'}, + [0x2390]={d='on'}, + [0x2391]={d='on'}, + [0x2392]={d='on'}, + [0x2393]={d='on'}, + [0x2394]={d='on'}, + [0x2396]={d='on'}, + [0x2397]={d='on'}, + [0x2398]={d='on'}, + [0x2399]={d='on'}, + [0x239A]={d='on'}, + [0x239B]={d='on'}, + [0x239C]={d='on'}, + [0x239D]={d='on'}, + [0x239E]={d='on'}, + [0x239F]={d='on'}, + [0x23A0]={d='on'}, + [0x23A1]={d='on'}, + [0x23A2]={d='on'}, + [0x23A3]={d='on'}, + [0x23A4]={d='on'}, + [0x23A5]={d='on'}, + [0x23A6]={d='on'}, + [0x23A7]={d='on'}, + [0x23A8]={d='on'}, + [0x23A9]={d='on'}, + [0x23AA]={d='on'}, + [0x23AB]={d='on'}, + [0x23AC]={d='on'}, + [0x23AD]={d='on'}, + [0x23AE]={d='on'}, + [0x23AF]={d='on'}, + [0x23B0]={d='on'}, + [0x23B1]={d='on'}, + [0x23B2]={d='on'}, + [0x23B3]={d='on'}, + [0x23B4]={d='on'}, + [0x23B5]={d='on'}, + [0x23B6]={d='on'}, + [0x23B7]={d='on'}, + [0x23B8]={d='on'}, + [0x23B9]={d='on'}, + [0x23BA]={d='on'}, + [0x23BB]={d='on'}, + [0x23BC]={d='on'}, + [0x23BD]={d='on'}, + [0x23BE]={d='on'}, + [0x23BF]={d='on'}, + [0x23C0]={d='on'}, + [0x23C1]={d='on'}, + [0x23C2]={d='on'}, + [0x23C3]={d='on'}, + [0x23C4]={d='on'}, + [0x23C5]={d='on'}, + [0x23C6]={d='on'}, + [0x23C7]={d='on'}, + [0x23C8]={d='on'}, + [0x23C9]={d='on'}, + [0x23CA]={d='on'}, + [0x23CB]={d='on'}, + [0x23CC]={d='on'}, + [0x23CD]={d='on'}, + [0x23CE]={d='on'}, + [0x23CF]={d='on'}, + [0x23D0]={d='on'}, + [0x23D1]={d='on'}, + [0x23D2]={d='on'}, + [0x23D3]={d='on'}, + [0x23D4]={d='on'}, + [0x23D5]={d='on'}, + [0x23D6]={d='on'}, + [0x23D7]={d='on'}, + [0x23D8]={d='on'}, + [0x23D9]={d='on'}, + [0x23DA]={d='on'}, + [0x23DB]={d='on'}, + [0x23DC]={d='on'}, + [0x23DD]={d='on'}, + [0x23DE]={d='on'}, + [0x23DF]={d='on'}, + [0x23E0]={d='on'}, + [0x23E1]={d='on'}, + [0x23E2]={d='on'}, + [0x23E3]={d='on'}, + [0x23E4]={d='on'}, + [0x23E5]={d='on'}, + [0x23E6]={d='on'}, + [0x23E7]={d='on'}, + [0x23E8]={d='on'}, + [0x23E9]={d='on'}, + [0x23EA]={d='on'}, + [0x23EB]={d='on'}, + [0x23EC]={d='on'}, + [0x23ED]={d='on'}, + [0x23EE]={d='on'}, + [0x23EF]={d='on'}, + [0x23F0]={d='on'}, + [0x23F1]={d='on'}, + [0x23F2]={d='on'}, + [0x23F3]={d='on'}, + [0x23F4]={d='on'}, + [0x23F5]={d='on'}, + [0x23F6]={d='on'}, + [0x23F7]={d='on'}, + [0x23F8]={d='on'}, + [0x23F9]={d='on'}, + [0x23FA]={d='on'}, + [0x23FB]={d='on'}, + [0x23FC]={d='on'}, + [0x23FD]={d='on'}, + [0x23FE]={d='on'}, + [0x2400]={d='on'}, + [0x2401]={d='on'}, + [0x2402]={d='on'}, + [0x2403]={d='on'}, + [0x2404]={d='on'}, + [0x2405]={d='on'}, + [0x2406]={d='on'}, + [0x2407]={d='on'}, + [0x2408]={d='on'}, + [0x2409]={d='on'}, + [0x240A]={d='on'}, + [0x240B]={d='on'}, + [0x240C]={d='on'}, + [0x240D]={d='on'}, + [0x240E]={d='on'}, + [0x240F]={d='on'}, + [0x2410]={d='on'}, + [0x2411]={d='on'}, + [0x2412]={d='on'}, + [0x2413]={d='on'}, + [0x2414]={d='on'}, + [0x2415]={d='on'}, + [0x2416]={d='on'}, + [0x2417]={d='on'}, + [0x2418]={d='on'}, + [0x2419]={d='on'}, + [0x241A]={d='on'}, + [0x241B]={d='on'}, + [0x241C]={d='on'}, + [0x241D]={d='on'}, + [0x241E]={d='on'}, + [0x241F]={d='on'}, + [0x2420]={d='on'}, + [0x2421]={d='on'}, + [0x2422]={d='on'}, + [0x2423]={d='on'}, + [0x2424]={d='on'}, + [0x2425]={d='on'}, + [0x2426]={d='on'}, + [0x2440]={d='on'}, + [0x2441]={d='on'}, + [0x2442]={d='on'}, + [0x2443]={d='on'}, + [0x2444]={d='on'}, + [0x2445]={d='on'}, + [0x2446]={d='on'}, + [0x2447]={d='on'}, + [0x2448]={d='on'}, + [0x2449]={d='on'}, + [0x244A]={d='on'}, + [0x2460]={d='on'}, + [0x2461]={d='on'}, + [0x2462]={d='on'}, + [0x2463]={d='on'}, + [0x2464]={d='on'}, + [0x2465]={d='on'}, + [0x2466]={d='on'}, + [0x2467]={d='on'}, + [0x2468]={d='on'}, + [0x2469]={d='on'}, + [0x246A]={d='on'}, + [0x246B]={d='on'}, + [0x246C]={d='on'}, + [0x246D]={d='on'}, + [0x246E]={d='on'}, + [0x246F]={d='on'}, + [0x2470]={d='on'}, + [0x2471]={d='on'}, + [0x2472]={d='on'}, + [0x2473]={d='on'}, + [0x2474]={d='on'}, + [0x2475]={d='on'}, + [0x2476]={d='on'}, + [0x2477]={d='on'}, + [0x2478]={d='on'}, + [0x2479]={d='on'}, + [0x247A]={d='on'}, + [0x247B]={d='on'}, + [0x247C]={d='on'}, + [0x247D]={d='on'}, + [0x247E]={d='on'}, + [0x247F]={d='on'}, + [0x2480]={d='on'}, + [0x2481]={d='on'}, + [0x2482]={d='on'}, + [0x2483]={d='on'}, + [0x2484]={d='on'}, + [0x2485]={d='on'}, + [0x2486]={d='on'}, + [0x2487]={d='on'}, + [0x2488]={d='en'}, + [0x2489]={d='en'}, + [0x248A]={d='en'}, + [0x248B]={d='en'}, + [0x248C]={d='en'}, + [0x248D]={d='en'}, + [0x248E]={d='en'}, + [0x248F]={d='en'}, + [0x2490]={d='en'}, + [0x2491]={d='en'}, + [0x2492]={d='en'}, + [0x2493]={d='en'}, + [0x2494]={d='en'}, + [0x2495]={d='en'}, + [0x2496]={d='en'}, + [0x2497]={d='en'}, + [0x2498]={d='en'}, + [0x2499]={d='en'}, + [0x249A]={d='en'}, + [0x249B]={d='en'}, + [0x24EA]={d='on'}, + [0x24EB]={d='on'}, + [0x24EC]={d='on'}, + [0x24ED]={d='on'}, + [0x24EE]={d='on'}, + [0x24EF]={d='on'}, + [0x24F0]={d='on'}, + [0x24F1]={d='on'}, + [0x24F2]={d='on'}, + [0x24F3]={d='on'}, + [0x24F4]={d='on'}, + [0x24F5]={d='on'}, + [0x24F6]={d='on'}, + [0x24F7]={d='on'}, + [0x24F8]={d='on'}, + [0x24F9]={d='on'}, + [0x24FA]={d='on'}, + [0x24FB]={d='on'}, + [0x24FC]={d='on'}, + [0x24FD]={d='on'}, + [0x24FE]={d='on'}, + [0x24FF]={d='on'}, + [0x2500]={d='on'}, + [0x2501]={d='on'}, + [0x2502]={d='on'}, + [0x2503]={d='on'}, + [0x2504]={d='on'}, + [0x2505]={d='on'}, + [0x2506]={d='on'}, + [0x2507]={d='on'}, + [0x2508]={d='on'}, + [0x2509]={d='on'}, + [0x250A]={d='on'}, + [0x250B]={d='on'}, + [0x250C]={d='on'}, + [0x250D]={d='on'}, + [0x250E]={d='on'}, + [0x250F]={d='on'}, + [0x2510]={d='on'}, + [0x2511]={d='on'}, + [0x2512]={d='on'}, + [0x2513]={d='on'}, + [0x2514]={d='on'}, + [0x2515]={d='on'}, + [0x2516]={d='on'}, + [0x2517]={d='on'}, + [0x2518]={d='on'}, + [0x2519]={d='on'}, + [0x251A]={d='on'}, + [0x251B]={d='on'}, + [0x251C]={d='on'}, + [0x251D]={d='on'}, + [0x251E]={d='on'}, + [0x251F]={d='on'}, + [0x2520]={d='on'}, + [0x2521]={d='on'}, + [0x2522]={d='on'}, + [0x2523]={d='on'}, + [0x2524]={d='on'}, + [0x2525]={d='on'}, + [0x2526]={d='on'}, + [0x2527]={d='on'}, + [0x2528]={d='on'}, + [0x2529]={d='on'}, + [0x252A]={d='on'}, + [0x252B]={d='on'}, + [0x252C]={d='on'}, + [0x252D]={d='on'}, + [0x252E]={d='on'}, + [0x252F]={d='on'}, + [0x2530]={d='on'}, + [0x2531]={d='on'}, + [0x2532]={d='on'}, + [0x2533]={d='on'}, + [0x2534]={d='on'}, + [0x2535]={d='on'}, + [0x2536]={d='on'}, + [0x2537]={d='on'}, + [0x2538]={d='on'}, + [0x2539]={d='on'}, + [0x253A]={d='on'}, + [0x253B]={d='on'}, + [0x253C]={d='on'}, + [0x253D]={d='on'}, + [0x253E]={d='on'}, + [0x253F]={d='on'}, + [0x2540]={d='on'}, + [0x2541]={d='on'}, + [0x2542]={d='on'}, + [0x2543]={d='on'}, + [0x2544]={d='on'}, + [0x2545]={d='on'}, + [0x2546]={d='on'}, + [0x2547]={d='on'}, + [0x2548]={d='on'}, + [0x2549]={d='on'}, + [0x254A]={d='on'}, + [0x254B]={d='on'}, + [0x254C]={d='on'}, + [0x254D]={d='on'}, + [0x254E]={d='on'}, + [0x254F]={d='on'}, + [0x2550]={d='on'}, + [0x2551]={d='on'}, + [0x2552]={d='on'}, + [0x2553]={d='on'}, + [0x2554]={d='on'}, + [0x2555]={d='on'}, + [0x2556]={d='on'}, + [0x2557]={d='on'}, + [0x2558]={d='on'}, + [0x2559]={d='on'}, + [0x255A]={d='on'}, + [0x255B]={d='on'}, + [0x255C]={d='on'}, + [0x255D]={d='on'}, + [0x255E]={d='on'}, + [0x255F]={d='on'}, + [0x2560]={d='on'}, + [0x2561]={d='on'}, + [0x2562]={d='on'}, + [0x2563]={d='on'}, + [0x2564]={d='on'}, + [0x2565]={d='on'}, + [0x2566]={d='on'}, + [0x2567]={d='on'}, + [0x2568]={d='on'}, + [0x2569]={d='on'}, + [0x256A]={d='on'}, + [0x256B]={d='on'}, + [0x256C]={d='on'}, + [0x256D]={d='on'}, + [0x256E]={d='on'}, + [0x256F]={d='on'}, + [0x2570]={d='on'}, + [0x2571]={d='on'}, + [0x2572]={d='on'}, + [0x2573]={d='on'}, + [0x2574]={d='on'}, + [0x2575]={d='on'}, + [0x2576]={d='on'}, + [0x2577]={d='on'}, + [0x2578]={d='on'}, + [0x2579]={d='on'}, + [0x257A]={d='on'}, + [0x257B]={d='on'}, + [0x257C]={d='on'}, + [0x257D]={d='on'}, + [0x257E]={d='on'}, + [0x257F]={d='on'}, + [0x2580]={d='on'}, + [0x2581]={d='on'}, + [0x2582]={d='on'}, + [0x2583]={d='on'}, + [0x2584]={d='on'}, + [0x2585]={d='on'}, + [0x2586]={d='on'}, + [0x2587]={d='on'}, + [0x2588]={d='on'}, + [0x2589]={d='on'}, + [0x258A]={d='on'}, + [0x258B]={d='on'}, + [0x258C]={d='on'}, + [0x258D]={d='on'}, + [0x258E]={d='on'}, + [0x258F]={d='on'}, + [0x2590]={d='on'}, + [0x2591]={d='on'}, + [0x2592]={d='on'}, + [0x2593]={d='on'}, + [0x2594]={d='on'}, + [0x2595]={d='on'}, + [0x2596]={d='on'}, + [0x2597]={d='on'}, + [0x2598]={d='on'}, + [0x2599]={d='on'}, + [0x259A]={d='on'}, + [0x259B]={d='on'}, + [0x259C]={d='on'}, + [0x259D]={d='on'}, + [0x259E]={d='on'}, + [0x259F]={d='on'}, + [0x25A0]={d='on'}, + [0x25A1]={d='on'}, + [0x25A2]={d='on'}, + [0x25A3]={d='on'}, + [0x25A4]={d='on'}, + [0x25A5]={d='on'}, + [0x25A6]={d='on'}, + [0x25A7]={d='on'}, + [0x25A8]={d='on'}, + [0x25A9]={d='on'}, + [0x25AA]={d='on'}, + [0x25AB]={d='on'}, + [0x25AC]={d='on'}, + [0x25AD]={d='on'}, + [0x25AE]={d='on'}, + [0x25AF]={d='on'}, + [0x25B0]={d='on'}, + [0x25B1]={d='on'}, + [0x25B2]={d='on'}, + [0x25B3]={d='on'}, + [0x25B4]={d='on'}, + [0x25B5]={d='on'}, + [0x25B6]={d='on'}, + [0x25B7]={d='on'}, + [0x25B8]={d='on'}, + [0x25B9]={d='on'}, + [0x25BA]={d='on'}, + [0x25BB]={d='on'}, + [0x25BC]={d='on'}, + [0x25BD]={d='on'}, + [0x25BE]={d='on'}, + [0x25BF]={d='on'}, + [0x25C0]={d='on'}, + [0x25C1]={d='on'}, + [0x25C2]={d='on'}, + [0x25C3]={d='on'}, + [0x25C4]={d='on'}, + [0x25C5]={d='on'}, + [0x25C6]={d='on'}, + [0x25C7]={d='on'}, + [0x25C8]={d='on'}, + [0x25C9]={d='on'}, + [0x25CA]={d='on'}, + [0x25CB]={d='on'}, + [0x25CC]={d='on'}, + [0x25CD]={d='on'}, + [0x25CE]={d='on'}, + [0x25CF]={d='on'}, + [0x25D0]={d='on'}, + [0x25D1]={d='on'}, + [0x25D2]={d='on'}, + [0x25D3]={d='on'}, + [0x25D4]={d='on'}, + [0x25D5]={d='on'}, + [0x25D6]={d='on'}, + [0x25D7]={d='on'}, + [0x25D8]={d='on'}, + [0x25D9]={d='on'}, + [0x25DA]={d='on'}, + [0x25DB]={d='on'}, + [0x25DC]={d='on'}, + [0x25DD]={d='on'}, + [0x25DE]={d='on'}, + [0x25DF]={d='on'}, + [0x25E0]={d='on'}, + [0x25E1]={d='on'}, + [0x25E2]={d='on'}, + [0x25E3]={d='on'}, + [0x25E4]={d='on'}, + [0x25E5]={d='on'}, + [0x25E6]={d='on'}, + [0x25E7]={d='on'}, + [0x25E8]={d='on'}, + [0x25E9]={d='on'}, + [0x25EA]={d='on'}, + [0x25EB]={d='on'}, + [0x25EC]={d='on'}, + [0x25ED]={d='on'}, + [0x25EE]={d='on'}, + [0x25EF]={d='on'}, + [0x25F0]={d='on'}, + [0x25F1]={d='on'}, + [0x25F2]={d='on'}, + [0x25F3]={d='on'}, + [0x25F4]={d='on'}, + [0x25F5]={d='on'}, + [0x25F6]={d='on'}, + [0x25F7]={d='on'}, + [0x25F8]={d='on'}, + [0x25F9]={d='on'}, + [0x25FA]={d='on'}, + [0x25FB]={d='on'}, + [0x25FC]={d='on'}, + [0x25FD]={d='on'}, + [0x25FE]={d='on'}, + [0x25FF]={d='on'}, + [0x2600]={d='on'}, + [0x2601]={d='on'}, + [0x2602]={d='on'}, + [0x2603]={d='on'}, + [0x2604]={d='on'}, + [0x2605]={d='on'}, + [0x2606]={d='on'}, + [0x2607]={d='on'}, + [0x2608]={d='on'}, + [0x2609]={d='on'}, + [0x260A]={d='on'}, + [0x260B]={d='on'}, + [0x260C]={d='on'}, + [0x260D]={d='on'}, + [0x260E]={d='on'}, + [0x260F]={d='on'}, + [0x2610]={d='on'}, + [0x2611]={d='on'}, + [0x2612]={d='on'}, + [0x2613]={d='on'}, + [0x2614]={d='on'}, + [0x2615]={d='on'}, + [0x2616]={d='on'}, + [0x2617]={d='on'}, + [0x2618]={d='on'}, + [0x2619]={d='on'}, + [0x261A]={d='on'}, + [0x261B]={d='on'}, + [0x261C]={d='on'}, + [0x261D]={d='on'}, + [0x261E]={d='on'}, + [0x261F]={d='on'}, + [0x2620]={d='on'}, + [0x2621]={d='on'}, + [0x2622]={d='on'}, + [0x2623]={d='on'}, + [0x2624]={d='on'}, + [0x2625]={d='on'}, + [0x2626]={d='on'}, + [0x2627]={d='on'}, + [0x2628]={d='on'}, + [0x2629]={d='on'}, + [0x262A]={d='on'}, + [0x262B]={d='on'}, + [0x262C]={d='on'}, + [0x262D]={d='on'}, + [0x262E]={d='on'}, + [0x262F]={d='on'}, + [0x2630]={d='on'}, + [0x2631]={d='on'}, + [0x2632]={d='on'}, + [0x2633]={d='on'}, + [0x2634]={d='on'}, + [0x2635]={d='on'}, + [0x2636]={d='on'}, + [0x2637]={d='on'}, + [0x2638]={d='on'}, + [0x2639]={d='on'}, + [0x263A]={d='on'}, + [0x263B]={d='on'}, + [0x263C]={d='on'}, + [0x263D]={d='on'}, + [0x263E]={d='on'}, + [0x263F]={d='on'}, + [0x2640]={d='on'}, + [0x2641]={d='on'}, + [0x2642]={d='on'}, + [0x2643]={d='on'}, + [0x2644]={d='on'}, + [0x2645]={d='on'}, + [0x2646]={d='on'}, + [0x2647]={d='on'}, + [0x2648]={d='on'}, + [0x2649]={d='on'}, + [0x264A]={d='on'}, + [0x264B]={d='on'}, + [0x264C]={d='on'}, + [0x264D]={d='on'}, + [0x264E]={d='on'}, + [0x264F]={d='on'}, + [0x2650]={d='on'}, + [0x2651]={d='on'}, + [0x2652]={d='on'}, + [0x2653]={d='on'}, + [0x2654]={d='on'}, + [0x2655]={d='on'}, + [0x2656]={d='on'}, + [0x2657]={d='on'}, + [0x2658]={d='on'}, + [0x2659]={d='on'}, + [0x265A]={d='on'}, + [0x265B]={d='on'}, + [0x265C]={d='on'}, + [0x265D]={d='on'}, + [0x265E]={d='on'}, + [0x265F]={d='on'}, + [0x2660]={d='on'}, + [0x2661]={d='on'}, + [0x2662]={d='on'}, + [0x2663]={d='on'}, + [0x2664]={d='on'}, + [0x2665]={d='on'}, + [0x2666]={d='on'}, + [0x2667]={d='on'}, + [0x2668]={d='on'}, + [0x2669]={d='on'}, + [0x266A]={d='on'}, + [0x266B]={d='on'}, + [0x266C]={d='on'}, + [0x266D]={d='on'}, + [0x266E]={d='on'}, + [0x266F]={d='on'}, + [0x2670]={d='on'}, + [0x2671]={d='on'}, + [0x2672]={d='on'}, + [0x2673]={d='on'}, + [0x2674]={d='on'}, + [0x2675]={d='on'}, + [0x2676]={d='on'}, + [0x2677]={d='on'}, + [0x2678]={d='on'}, + [0x2679]={d='on'}, + [0x267A]={d='on'}, + [0x267B]={d='on'}, + [0x267C]={d='on'}, + [0x267D]={d='on'}, + [0x267E]={d='on'}, + [0x267F]={d='on'}, + [0x2680]={d='on'}, + [0x2681]={d='on'}, + [0x2682]={d='on'}, + [0x2683]={d='on'}, + [0x2684]={d='on'}, + [0x2685]={d='on'}, + [0x2686]={d='on'}, + [0x2687]={d='on'}, + [0x2688]={d='on'}, + [0x2689]={d='on'}, + [0x268A]={d='on'}, + [0x268B]={d='on'}, + [0x268C]={d='on'}, + [0x268D]={d='on'}, + [0x268E]={d='on'}, + [0x268F]={d='on'}, + [0x2690]={d='on'}, + [0x2691]={d='on'}, + [0x2692]={d='on'}, + [0x2693]={d='on'}, + [0x2694]={d='on'}, + [0x2695]={d='on'}, + [0x2696]={d='on'}, + [0x2697]={d='on'}, + [0x2698]={d='on'}, + [0x2699]={d='on'}, + [0x269A]={d='on'}, + [0x269B]={d='on'}, + [0x269C]={d='on'}, + [0x269D]={d='on'}, + [0x269E]={d='on'}, + [0x269F]={d='on'}, + [0x26A0]={d='on'}, + [0x26A1]={d='on'}, + [0x26A2]={d='on'}, + [0x26A3]={d='on'}, + [0x26A4]={d='on'}, + [0x26A5]={d='on'}, + [0x26A6]={d='on'}, + [0x26A7]={d='on'}, + [0x26A8]={d='on'}, + [0x26A9]={d='on'}, + [0x26AA]={d='on'}, + [0x26AB]={d='on'}, + [0x26AD]={d='on'}, + [0x26AE]={d='on'}, + [0x26AF]={d='on'}, + [0x26B0]={d='on'}, + [0x26B1]={d='on'}, + [0x26B2]={d='on'}, + [0x26B3]={d='on'}, + [0x26B4]={d='on'}, + [0x26B5]={d='on'}, + [0x26B6]={d='on'}, + [0x26B7]={d='on'}, + [0x26B8]={d='on'}, + [0x26B9]={d='on'}, + [0x26BA]={d='on'}, + [0x26BB]={d='on'}, + [0x26BC]={d='on'}, + [0x26BD]={d='on'}, + [0x26BE]={d='on'}, + [0x26BF]={d='on'}, + [0x26C0]={d='on'}, + [0x26C1]={d='on'}, + [0x26C2]={d='on'}, + [0x26C3]={d='on'}, + [0x26C4]={d='on'}, + [0x26C5]={d='on'}, + [0x26C6]={d='on'}, + [0x26C7]={d='on'}, + [0x26C8]={d='on'}, + [0x26C9]={d='on'}, + [0x26CA]={d='on'}, + [0x26CB]={d='on'}, + [0x26CC]={d='on'}, + [0x26CD]={d='on'}, + [0x26CE]={d='on'}, + [0x26CF]={d='on'}, + [0x26D0]={d='on'}, + [0x26D1]={d='on'}, + [0x26D2]={d='on'}, + [0x26D3]={d='on'}, + [0x26D4]={d='on'}, + [0x26D5]={d='on'}, + [0x26D6]={d='on'}, + [0x26D7]={d='on'}, + [0x26D8]={d='on'}, + [0x26D9]={d='on'}, + [0x26DA]={d='on'}, + [0x26DB]={d='on'}, + [0x26DC]={d='on'}, + [0x26DD]={d='on'}, + [0x26DE]={d='on'}, + [0x26DF]={d='on'}, + [0x26E0]={d='on'}, + [0x26E1]={d='on'}, + [0x26E2]={d='on'}, + [0x26E3]={d='on'}, + [0x26E4]={d='on'}, + [0x26E5]={d='on'}, + [0x26E6]={d='on'}, + [0x26E7]={d='on'}, + [0x26E8]={d='on'}, + [0x26E9]={d='on'}, + [0x26EA]={d='on'}, + [0x26EB]={d='on'}, + [0x26EC]={d='on'}, + [0x26ED]={d='on'}, + [0x26EE]={d='on'}, + [0x26EF]={d='on'}, + [0x26F0]={d='on'}, + [0x26F1]={d='on'}, + [0x26F2]={d='on'}, + [0x26F3]={d='on'}, + [0x26F4]={d='on'}, + [0x26F5]={d='on'}, + [0x26F6]={d='on'}, + [0x26F7]={d='on'}, + [0x26F8]={d='on'}, + [0x26F9]={d='on'}, + [0x26FA]={d='on'}, + [0x26FB]={d='on'}, + [0x26FC]={d='on'}, + [0x26FD]={d='on'}, + [0x26FE]={d='on'}, + [0x26FF]={d='on'}, + [0x2700]={d='on'}, + [0x2701]={d='on'}, + [0x2702]={d='on'}, + [0x2703]={d='on'}, + [0x2704]={d='on'}, + [0x2705]={d='on'}, + [0x2706]={d='on'}, + [0x2707]={d='on'}, + [0x2708]={d='on'}, + [0x2709]={d='on'}, + [0x270A]={d='on'}, + [0x270B]={d='on'}, + [0x270C]={d='on'}, + [0x270D]={d='on'}, + [0x270E]={d='on'}, + [0x270F]={d='on'}, + [0x2710]={d='on'}, + [0x2711]={d='on'}, + [0x2712]={d='on'}, + [0x2713]={d='on'}, + [0x2714]={d='on'}, + [0x2715]={d='on'}, + [0x2716]={d='on'}, + [0x2717]={d='on'}, + [0x2718]={d='on'}, + [0x2719]={d='on'}, + [0x271A]={d='on'}, + [0x271B]={d='on'}, + [0x271C]={d='on'}, + [0x271D]={d='on'}, + [0x271E]={d='on'}, + [0x271F]={d='on'}, + [0x2720]={d='on'}, + [0x2721]={d='on'}, + [0x2722]={d='on'}, + [0x2723]={d='on'}, + [0x2724]={d='on'}, + [0x2725]={d='on'}, + [0x2726]={d='on'}, + [0x2727]={d='on'}, + [0x2728]={d='on'}, + [0x2729]={d='on'}, + [0x272A]={d='on'}, + [0x272B]={d='on'}, + [0x272C]={d='on'}, + [0x272D]={d='on'}, + [0x272E]={d='on'}, + [0x272F]={d='on'}, + [0x2730]={d='on'}, + [0x2731]={d='on'}, + [0x2732]={d='on'}, + [0x2733]={d='on'}, + [0x2734]={d='on'}, + [0x2735]={d='on'}, + [0x2736]={d='on'}, + [0x2737]={d='on'}, + [0x2738]={d='on'}, + [0x2739]={d='on'}, + [0x273A]={d='on'}, + [0x273B]={d='on'}, + [0x273C]={d='on'}, + [0x273D]={d='on'}, + [0x273E]={d='on'}, + [0x273F]={d='on'}, + [0x2740]={d='on'}, + [0x2741]={d='on'}, + [0x2742]={d='on'}, + [0x2743]={d='on'}, + [0x2744]={d='on'}, + [0x2745]={d='on'}, + [0x2746]={d='on'}, + [0x2747]={d='on'}, + [0x2748]={d='on'}, + [0x2749]={d='on'}, + [0x274A]={d='on'}, + [0x274B]={d='on'}, + [0x274C]={d='on'}, + [0x274D]={d='on'}, + [0x274E]={d='on'}, + [0x274F]={d='on'}, + [0x2750]={d='on'}, + [0x2751]={d='on'}, + [0x2752]={d='on'}, + [0x2753]={d='on'}, + [0x2754]={d='on'}, + [0x2755]={d='on'}, + [0x2756]={d='on'}, + [0x2757]={d='on'}, + [0x2758]={d='on'}, + [0x2759]={d='on'}, + [0x275A]={d='on'}, + [0x275B]={d='on'}, + [0x275C]={d='on'}, + [0x275D]={d='on'}, + [0x275E]={d='on'}, + [0x275F]={d='on'}, + [0x2760]={d='on'}, + [0x2761]={d='on'}, + [0x2762]={d='on'}, + [0x2763]={d='on'}, + [0x2764]={d='on'}, + [0x2765]={d='on'}, + [0x2766]={d='on'}, + [0x2767]={d='on'}, + [0x2768]={d='on', m=0x2769}, + [0x2769]={d='on', m=0x2768}, + [0x276A]={d='on', m=0x276B}, + [0x276B]={d='on', m=0x276A}, + [0x276C]={d='on', m=0x276D}, + [0x276D]={d='on', m=0x276C}, + [0x276E]={d='on', m=0x276F}, + [0x276F]={d='on', m=0x276E}, + [0x2770]={d='on', m=0x2771}, + [0x2771]={d='on', m=0x2770}, + [0x2772]={d='on', m=0x2773}, + [0x2773]={d='on', m=0x2772}, + [0x2774]={d='on', m=0x2775}, + [0x2775]={d='on', m=0x2774}, + [0x2776]={d='on'}, + [0x2777]={d='on'}, + [0x2778]={d='on'}, + [0x2779]={d='on'}, + [0x277A]={d='on'}, + [0x277B]={d='on'}, + [0x277C]={d='on'}, + [0x277D]={d='on'}, + [0x277E]={d='on'}, + [0x277F]={d='on'}, + [0x2780]={d='on'}, + [0x2781]={d='on'}, + [0x2782]={d='on'}, + [0x2783]={d='on'}, + [0x2784]={d='on'}, + [0x2785]={d='on'}, + [0x2786]={d='on'}, + [0x2787]={d='on'}, + [0x2788]={d='on'}, + [0x2789]={d='on'}, + [0x278A]={d='on'}, + [0x278B]={d='on'}, + [0x278C]={d='on'}, + [0x278D]={d='on'}, + [0x278E]={d='on'}, + [0x278F]={d='on'}, + [0x2790]={d='on'}, + [0x2791]={d='on'}, + [0x2792]={d='on'}, + [0x2793]={d='on'}, + [0x2794]={d='on'}, + [0x2795]={d='on'}, + [0x2796]={d='on'}, + [0x2797]={d='on'}, + [0x2798]={d='on'}, + [0x2799]={d='on'}, + [0x279A]={d='on'}, + [0x279B]={d='on'}, + [0x279C]={d='on'}, + [0x279D]={d='on'}, + [0x279E]={d='on'}, + [0x279F]={d='on'}, + [0x27A0]={d='on'}, + [0x27A1]={d='on'}, + [0x27A2]={d='on'}, + [0x27A3]={d='on'}, + [0x27A4]={d='on'}, + [0x27A5]={d='on'}, + [0x27A6]={d='on'}, + [0x27A7]={d='on'}, + [0x27A8]={d='on'}, + [0x27A9]={d='on'}, + [0x27AA]={d='on'}, + [0x27AB]={d='on'}, + [0x27AC]={d='on'}, + [0x27AD]={d='on'}, + [0x27AE]={d='on'}, + [0x27AF]={d='on'}, + [0x27B0]={d='on'}, + [0x27B1]={d='on'}, + [0x27B2]={d='on'}, + [0x27B3]={d='on'}, + [0x27B4]={d='on'}, + [0x27B5]={d='on'}, + [0x27B6]={d='on'}, + [0x27B7]={d='on'}, + [0x27B8]={d='on'}, + [0x27B9]={d='on'}, + [0x27BA]={d='on'}, + [0x27BB]={d='on'}, + [0x27BC]={d='on'}, + [0x27BD]={d='on'}, + [0x27BE]={d='on'}, + [0x27BF]={d='on'}, + [0x27C0]={d='on'}, + [0x27C1]={d='on'}, + [0x27C2]={d='on'}, + [0x27C3]={d='on', m=0x27C4}, + [0x27C4]={d='on', m=0x27C3}, + [0x27C5]={d='on', m=0x27C6}, + [0x27C6]={d='on', m=0x27C5}, + [0x27C7]={d='on'}, + [0x27C8]={d='on', m=0x27C9}, + [0x27C9]={d='on', m=0x27C8}, + [0x27CA]={d='on'}, + [0x27CB]={d='on', m=0x27CD}, + [0x27CC]={d='on'}, + [0x27CD]={d='on', m=0x27CB}, + [0x27CE]={d='on'}, + [0x27CF]={d='on'}, + [0x27D0]={d='on'}, + [0x27D1]={d='on'}, + [0x27D2]={d='on'}, + [0x27D3]={d='on'}, + [0x27D4]={d='on'}, + [0x27D5]={d='on', m=0x27D6}, + [0x27D6]={d='on', m=0x27D5}, + [0x27D7]={d='on'}, + [0x27D8]={d='on'}, + [0x27D9]={d='on'}, + [0x27DA]={d='on'}, + [0x27DB]={d='on'}, + [0x27DC]={d='on'}, + [0x27DD]={d='on', m=0x27DE}, + [0x27DE]={d='on', m=0x27DD}, + [0x27DF]={d='on'}, + [0x27E0]={d='on'}, + [0x27E1]={d='on'}, + [0x27E2]={d='on', m=0x27E3}, + [0x27E3]={d='on', m=0x27E2}, + [0x27E4]={d='on', m=0x27E5}, + [0x27E5]={d='on', m=0x27E4}, + [0x27E6]={d='on', m=0x27E7}, + [0x27E7]={d='on', m=0x27E6}, + [0x27E8]={d='on', m=0x27E9}, + [0x27E9]={d='on', m=0x27E8}, + [0x27EA]={d='on', m=0x27EB}, + [0x27EB]={d='on', m=0x27EA}, + [0x27EC]={d='on', m=0x27ED}, + [0x27ED]={d='on', m=0x27EC}, + [0x27EE]={d='on', m=0x27EF}, + [0x27EF]={d='on', m=0x27EE}, + [0x27F0]={d='on'}, + [0x27F1]={d='on'}, + [0x27F2]={d='on'}, + [0x27F3]={d='on'}, + [0x27F4]={d='on'}, + [0x27F5]={d='on'}, + [0x27F6]={d='on'}, + [0x27F7]={d='on'}, + [0x27F8]={d='on'}, + [0x27F9]={d='on'}, + [0x27FA]={d='on'}, + [0x27FB]={d='on'}, + [0x27FC]={d='on'}, + [0x27FD]={d='on'}, + [0x27FE]={d='on'}, + [0x27FF]={d='on'}, + [0x2900]={d='on'}, + [0x2901]={d='on'}, + [0x2902]={d='on'}, + [0x2903]={d='on'}, + [0x2904]={d='on'}, + [0x2905]={d='on'}, + [0x2906]={d='on'}, + [0x2907]={d='on'}, + [0x2908]={d='on'}, + [0x2909]={d='on'}, + [0x290A]={d='on'}, + [0x290B]={d='on'}, + [0x290C]={d='on'}, + [0x290D]={d='on'}, + [0x290E]={d='on'}, + [0x290F]={d='on'}, + [0x2910]={d='on'}, + [0x2911]={d='on'}, + [0x2912]={d='on'}, + [0x2913]={d='on'}, + [0x2914]={d='on'}, + [0x2915]={d='on'}, + [0x2916]={d='on'}, + [0x2917]={d='on'}, + [0x2918]={d='on'}, + [0x2919]={d='on'}, + [0x291A]={d='on'}, + [0x291B]={d='on'}, + [0x291C]={d='on'}, + [0x291D]={d='on'}, + [0x291E]={d='on'}, + [0x291F]={d='on'}, + [0x2920]={d='on'}, + [0x2921]={d='on'}, + [0x2922]={d='on'}, + [0x2923]={d='on'}, + [0x2924]={d='on'}, + [0x2925]={d='on'}, + [0x2926]={d='on'}, + [0x2927]={d='on'}, + [0x2928]={d='on'}, + [0x2929]={d='on'}, + [0x292A]={d='on'}, + [0x292B]={d='on'}, + [0x292C]={d='on'}, + [0x292D]={d='on'}, + [0x292E]={d='on'}, + [0x292F]={d='on'}, + [0x2930]={d='on'}, + [0x2931]={d='on'}, + [0x2932]={d='on'}, + [0x2933]={d='on'}, + [0x2934]={d='on'}, + [0x2935]={d='on'}, + [0x2936]={d='on'}, + [0x2937]={d='on'}, + [0x2938]={d='on'}, + [0x2939]={d='on'}, + [0x293A]={d='on'}, + [0x293B]={d='on'}, + [0x293C]={d='on'}, + [0x293D]={d='on'}, + [0x293E]={d='on'}, + [0x293F]={d='on'}, + [0x2940]={d='on'}, + [0x2941]={d='on'}, + [0x2942]={d='on'}, + [0x2943]={d='on'}, + [0x2944]={d='on'}, + [0x2945]={d='on'}, + [0x2946]={d='on'}, + [0x2947]={d='on'}, + [0x2948]={d='on'}, + [0x2949]={d='on'}, + [0x294A]={d='on'}, + [0x294B]={d='on'}, + [0x294C]={d='on'}, + [0x294D]={d='on'}, + [0x294E]={d='on'}, + [0x294F]={d='on'}, + [0x2950]={d='on'}, + [0x2951]={d='on'}, + [0x2952]={d='on'}, + [0x2953]={d='on'}, + [0x2954]={d='on'}, + [0x2955]={d='on'}, + [0x2956]={d='on'}, + [0x2957]={d='on'}, + [0x2958]={d='on'}, + [0x2959]={d='on'}, + [0x295A]={d='on'}, + [0x295B]={d='on'}, + [0x295C]={d='on'}, + [0x295D]={d='on'}, + [0x295E]={d='on'}, + [0x295F]={d='on'}, + [0x2960]={d='on'}, + [0x2961]={d='on'}, + [0x2962]={d='on'}, + [0x2963]={d='on'}, + [0x2964]={d='on'}, + [0x2965]={d='on'}, + [0x2966]={d='on'}, + [0x2967]={d='on'}, + [0x2968]={d='on'}, + [0x2969]={d='on'}, + [0x296A]={d='on'}, + [0x296B]={d='on'}, + [0x296C]={d='on'}, + [0x296D]={d='on'}, + [0x296E]={d='on'}, + [0x296F]={d='on'}, + [0x2970]={d='on'}, + [0x2971]={d='on'}, + [0x2972]={d='on'}, + [0x2973]={d='on'}, + [0x2974]={d='on'}, + [0x2975]={d='on'}, + [0x2976]={d='on'}, + [0x2977]={d='on'}, + [0x2978]={d='on'}, + [0x2979]={d='on'}, + [0x297A]={d='on'}, + [0x297B]={d='on'}, + [0x297C]={d='on'}, + [0x297D]={d='on'}, + [0x297E]={d='on'}, + [0x297F]={d='on'}, + [0x2980]={d='on'}, + [0x2981]={d='on'}, + [0x2982]={d='on'}, + [0x2983]={d='on', m=0x2984}, + [0x2984]={d='on', m=0x2983}, + [0x2985]={d='on', m=0x2986}, + [0x2986]={d='on', m=0x2985}, + [0x2987]={d='on', m=0x2988}, + [0x2988]={d='on', m=0x2987}, + [0x2989]={d='on', m=0x298A}, + [0x298A]={d='on', m=0x2989}, + [0x298B]={d='on', m=0x298C}, + [0x298C]={d='on', m=0x298B}, + [0x298D]={d='on', m=0x2990}, + [0x298E]={d='on', m=0x298F}, + [0x298F]={d='on', m=0x298E}, + [0x2990]={d='on', m=0x298D}, + [0x2991]={d='on', m=0x2992}, + [0x2992]={d='on', m=0x2991}, + [0x2993]={d='on', m=0x2994}, + [0x2994]={d='on', m=0x2993}, + [0x2995]={d='on', m=0x2996}, + [0x2996]={d='on', m=0x2995}, + [0x2997]={d='on', m=0x2998}, + [0x2998]={d='on', m=0x2997}, + [0x2999]={d='on'}, + [0x299A]={d='on'}, + [0x299B]={d='on'}, + [0x299C]={d='on'}, + [0x299D]={d='on'}, + [0x299E]={d='on'}, + [0x299F]={d='on'}, + [0x29A0]={d='on'}, + [0x29A1]={d='on'}, + [0x29A2]={d='on'}, + [0x29A3]={d='on'}, + [0x29A4]={d='on'}, + [0x29A5]={d='on'}, + [0x29A6]={d='on'}, + [0x29A7]={d='on'}, + [0x29A8]={d='on'}, + [0x29A9]={d='on'}, + [0x29AA]={d='on'}, + [0x29AB]={d='on'}, + [0x29AC]={d='on'}, + [0x29AD]={d='on'}, + [0x29AE]={d='on'}, + [0x29AF]={d='on'}, + [0x29B0]={d='on'}, + [0x29B1]={d='on'}, + [0x29B2]={d='on'}, + [0x29B3]={d='on'}, + [0x29B4]={d='on'}, + [0x29B5]={d='on'}, + [0x29B6]={d='on'}, + [0x29B7]={d='on'}, + [0x29B8]={d='on', m=0x2298}, + [0x29B9]={d='on'}, + [0x29BA]={d='on'}, + [0x29BB]={d='on'}, + [0x29BC]={d='on'}, + [0x29BD]={d='on'}, + [0x29BE]={d='on'}, + [0x29BF]={d='on'}, + [0x29C0]={d='on', m=0x29C1}, + [0x29C1]={d='on', m=0x29C0}, + [0x29C2]={d='on'}, + [0x29C3]={d='on'}, + [0x29C4]={d='on', m=0x29C5}, + [0x29C5]={d='on', m=0x29C4}, + [0x29C6]={d='on'}, + [0x29C7]={d='on'}, + [0x29C8]={d='on'}, + [0x29C9]={d='on'}, + [0x29CA]={d='on'}, + [0x29CB]={d='on'}, + [0x29CC]={d='on'}, + [0x29CD]={d='on'}, + [0x29CE]={d='on'}, + [0x29CF]={d='on', m=0x29D0}, + [0x29D0]={d='on', m=0x29CF}, + [0x29D1]={d='on', m=0x29D2}, + [0x29D2]={d='on', m=0x29D1}, + [0x29D3]={d='on'}, + [0x29D4]={d='on', m=0x29D5}, + [0x29D5]={d='on', m=0x29D4}, + [0x29D6]={d='on'}, + [0x29D7]={d='on'}, + [0x29D8]={d='on', m=0x29D9}, + [0x29D9]={d='on', m=0x29D8}, + [0x29DA]={d='on', m=0x29DB}, + [0x29DB]={d='on', m=0x29DA}, + [0x29DC]={d='on'}, + [0x29DD]={d='on'}, + [0x29DE]={d='on'}, + [0x29DF]={d='on'}, + [0x29E0]={d='on'}, + [0x29E1]={d='on'}, + [0x29E2]={d='on'}, + [0x29E3]={d='on'}, + [0x29E4]={d='on'}, + [0x29E5]={d='on'}, + [0x29E6]={d='on'}, + [0x29E7]={d='on'}, + [0x29E8]={d='on'}, + [0x29E9]={d='on'}, + [0x29EA]={d='on'}, + [0x29EB]={d='on'}, + [0x29EC]={d='on'}, + [0x29ED]={d='on'}, + [0x29EE]={d='on'}, + [0x29EF]={d='on'}, + [0x29F0]={d='on'}, + [0x29F1]={d='on'}, + [0x29F2]={d='on'}, + [0x29F3]={d='on'}, + [0x29F4]={d='on'}, + [0x29F5]={d='on', m=0x2215}, + [0x29F6]={d='on'}, + [0x29F7]={d='on'}, + [0x29F8]={d='on', m=0x29F9}, + [0x29F9]={d='on', m=0x29F8}, + [0x29FA]={d='on'}, + [0x29FB]={d='on'}, + [0x29FC]={d='on', m=0x29FD}, + [0x29FD]={d='on', m=0x29FC}, + [0x29FE]={d='on'}, + [0x29FF]={d='on'}, + [0x2A00]={d='on'}, + [0x2A01]={d='on'}, + [0x2A02]={d='on'}, + [0x2A03]={d='on'}, + [0x2A04]={d='on'}, + [0x2A05]={d='on'}, + [0x2A06]={d='on'}, + [0x2A07]={d='on'}, + [0x2A08]={d='on'}, + [0x2A09]={d='on'}, + [0x2A0A]={d='on'}, + [0x2A0B]={d='on'}, + [0x2A0C]={d='on'}, + [0x2A0D]={d='on'}, + [0x2A0E]={d='on'}, + [0x2A0F]={d='on'}, + [0x2A10]={d='on'}, + [0x2A11]={d='on'}, + [0x2A12]={d='on'}, + [0x2A13]={d='on'}, + [0x2A14]={d='on'}, + [0x2A15]={d='on'}, + [0x2A16]={d='on'}, + [0x2A17]={d='on'}, + [0x2A18]={d='on'}, + [0x2A19]={d='on'}, + [0x2A1A]={d='on'}, + [0x2A1B]={d='on'}, + [0x2A1C]={d='on'}, + [0x2A1D]={d='on'}, + [0x2A1E]={d='on'}, + [0x2A1F]={d='on'}, + [0x2A20]={d='on'}, + [0x2A21]={d='on'}, + [0x2A22]={d='on'}, + [0x2A23]={d='on'}, + [0x2A24]={d='on'}, + [0x2A25]={d='on'}, + [0x2A26]={d='on'}, + [0x2A27]={d='on'}, + [0x2A28]={d='on'}, + [0x2A29]={d='on'}, + [0x2A2A]={d='on'}, + [0x2A2B]={d='on', m=0x2A2C}, + [0x2A2C]={d='on', m=0x2A2B}, + [0x2A2D]={d='on', m=0x2A2E}, + [0x2A2E]={d='on', m=0x2A2D}, + [0x2A2F]={d='on'}, + [0x2A30]={d='on'}, + [0x2A31]={d='on'}, + [0x2A32]={d='on'}, + [0x2A33]={d='on'}, + [0x2A34]={d='on', m=0x2A35}, + [0x2A35]={d='on', m=0x2A34}, + [0x2A36]={d='on'}, + [0x2A37]={d='on'}, + [0x2A38]={d='on'}, + [0x2A39]={d='on'}, + [0x2A3A]={d='on'}, + [0x2A3B]={d='on'}, + [0x2A3C]={d='on', m=0x2A3D}, + [0x2A3D]={d='on', m=0x2A3C}, + [0x2A3E]={d='on'}, + [0x2A3F]={d='on'}, + [0x2A40]={d='on'}, + [0x2A41]={d='on'}, + [0x2A42]={d='on'}, + [0x2A43]={d='on'}, + [0x2A44]={d='on'}, + [0x2A45]={d='on'}, + [0x2A46]={d='on'}, + [0x2A47]={d='on'}, + [0x2A48]={d='on'}, + [0x2A49]={d='on'}, + [0x2A4A]={d='on'}, + [0x2A4B]={d='on'}, + [0x2A4C]={d='on'}, + [0x2A4D]={d='on'}, + [0x2A4E]={d='on'}, + [0x2A4F]={d='on'}, + [0x2A50]={d='on'}, + [0x2A51]={d='on'}, + [0x2A52]={d='on'}, + [0x2A53]={d='on'}, + [0x2A54]={d='on'}, + [0x2A55]={d='on'}, + [0x2A56]={d='on'}, + [0x2A57]={d='on'}, + [0x2A58]={d='on'}, + [0x2A59]={d='on'}, + [0x2A5A]={d='on'}, + [0x2A5B]={d='on'}, + [0x2A5C]={d='on'}, + [0x2A5D]={d='on'}, + [0x2A5E]={d='on'}, + [0x2A5F]={d='on'}, + [0x2A60]={d='on'}, + [0x2A61]={d='on'}, + [0x2A62]={d='on'}, + [0x2A63]={d='on'}, + [0x2A64]={d='on', m=0x2A65}, + [0x2A65]={d='on', m=0x2A64}, + [0x2A66]={d='on'}, + [0x2A67]={d='on'}, + [0x2A68]={d='on'}, + [0x2A69]={d='on'}, + [0x2A6A]={d='on'}, + [0x2A6B]={d='on'}, + [0x2A6C]={d='on'}, + [0x2A6D]={d='on'}, + [0x2A6E]={d='on'}, + [0x2A6F]={d='on'}, + [0x2A70]={d='on'}, + [0x2A71]={d='on'}, + [0x2A72]={d='on'}, + [0x2A73]={d='on'}, + [0x2A74]={d='on'}, + [0x2A75]={d='on'}, + [0x2A76]={d='on'}, + [0x2A77]={d='on'}, + [0x2A78]={d='on'}, + [0x2A79]={d='on', m=0x2A7A}, + [0x2A7A]={d='on', m=0x2A79}, + [0x2A7B]={d='on'}, + [0x2A7C]={d='on'}, + [0x2A7D]={d='on', m=0x2A7E}, + [0x2A7E]={d='on', m=0x2A7D}, + [0x2A7F]={d='on', m=0x2A80}, + [0x2A80]={d='on', m=0x2A7F}, + [0x2A81]={d='on', m=0x2A82}, + [0x2A82]={d='on', m=0x2A81}, + [0x2A83]={d='on', m=0x2A84}, + [0x2A84]={d='on', m=0x2A83}, + [0x2A85]={d='on'}, + [0x2A86]={d='on'}, + [0x2A87]={d='on'}, + [0x2A88]={d='on'}, + [0x2A89]={d='on'}, + [0x2A8A]={d='on'}, + [0x2A8B]={d='on', m=0x2A8C}, + [0x2A8C]={d='on', m=0x2A8B}, + [0x2A8D]={d='on'}, + [0x2A8E]={d='on'}, + [0x2A8F]={d='on'}, + [0x2A90]={d='on'}, + [0x2A91]={d='on', m=0x2A92}, + [0x2A92]={d='on', m=0x2A91}, + [0x2A93]={d='on', m=0x2A94}, + [0x2A94]={d='on', m=0x2A93}, + [0x2A95]={d='on', m=0x2A96}, + [0x2A96]={d='on', m=0x2A95}, + [0x2A97]={d='on', m=0x2A98}, + [0x2A98]={d='on', m=0x2A97}, + [0x2A99]={d='on', m=0x2A9A}, + [0x2A9A]={d='on', m=0x2A99}, + [0x2A9B]={d='on', m=0x2A9C}, + [0x2A9C]={d='on', m=0x2A9B}, + [0x2A9D]={d='on'}, + [0x2A9E]={d='on'}, + [0x2A9F]={d='on'}, + [0x2AA0]={d='on'}, + [0x2AA1]={d='on', m=0x2AA2}, + [0x2AA2]={d='on', m=0x2AA1}, + [0x2AA3]={d='on'}, + [0x2AA4]={d='on'}, + [0x2AA5]={d='on'}, + [0x2AA6]={d='on', m=0x2AA7}, + [0x2AA7]={d='on', m=0x2AA6}, + [0x2AA8]={d='on', m=0x2AA9}, + [0x2AA9]={d='on', m=0x2AA8}, + [0x2AAA]={d='on', m=0x2AAB}, + [0x2AAB]={d='on', m=0x2AAA}, + [0x2AAC]={d='on', m=0x2AAD}, + [0x2AAD]={d='on', m=0x2AAC}, + [0x2AAE]={d='on'}, + [0x2AAF]={d='on', m=0x2AB0}, + [0x2AB0]={d='on', m=0x2AAF}, + [0x2AB1]={d='on'}, + [0x2AB2]={d='on'}, + [0x2AB3]={d='on', m=0x2AB4}, + [0x2AB4]={d='on', m=0x2AB3}, + [0x2AB5]={d='on'}, + [0x2AB6]={d='on'}, + [0x2AB7]={d='on'}, + [0x2AB8]={d='on'}, + [0x2AB9]={d='on'}, + [0x2ABA]={d='on'}, + [0x2ABB]={d='on', m=0x2ABC}, + [0x2ABC]={d='on', m=0x2ABB}, + [0x2ABD]={d='on', m=0x2ABE}, + [0x2ABE]={d='on', m=0x2ABD}, + [0x2ABF]={d='on', m=0x2AC0}, + [0x2AC0]={d='on', m=0x2ABF}, + [0x2AC1]={d='on', m=0x2AC2}, + [0x2AC2]={d='on', m=0x2AC1}, + [0x2AC3]={d='on', m=0x2AC4}, + [0x2AC4]={d='on', m=0x2AC3}, + [0x2AC5]={d='on', m=0x2AC6}, + [0x2AC6]={d='on', m=0x2AC5}, + [0x2AC7]={d='on'}, + [0x2AC8]={d='on'}, + [0x2AC9]={d='on'}, + [0x2ACA]={d='on'}, + [0x2ACB]={d='on'}, + [0x2ACC]={d='on'}, + [0x2ACD]={d='on', m=0x2ACE}, + [0x2ACE]={d='on', m=0x2ACD}, + [0x2ACF]={d='on', m=0x2AD0}, + [0x2AD0]={d='on', m=0x2ACF}, + [0x2AD1]={d='on', m=0x2AD2}, + [0x2AD2]={d='on', m=0x2AD1}, + [0x2AD3]={d='on', m=0x2AD4}, + [0x2AD4]={d='on', m=0x2AD3}, + [0x2AD5]={d='on', m=0x2AD6}, + [0x2AD6]={d='on', m=0x2AD5}, + [0x2AD7]={d='on'}, + [0x2AD8]={d='on'}, + [0x2AD9]={d='on'}, + [0x2ADA]={d='on'}, + [0x2ADB]={d='on'}, + [0x2ADC]={d='on'}, + [0x2ADD]={d='on'}, + [0x2ADE]={d='on', m=0x22A6}, + [0x2ADF]={d='on'}, + [0x2AE0]={d='on'}, + [0x2AE1]={d='on'}, + [0x2AE2]={d='on'}, + [0x2AE3]={d='on', m=0x22A9}, + [0x2AE4]={d='on', m=0x22A8}, + [0x2AE5]={d='on', m=0x22AB}, + [0x2AE6]={d='on'}, + [0x2AE7]={d='on'}, + [0x2AE8]={d='on'}, + [0x2AE9]={d='on'}, + [0x2AEA]={d='on'}, + [0x2AEB]={d='on'}, + [0x2AEC]={d='on', m=0x2AED}, + [0x2AED]={d='on', m=0x2AEC}, + [0x2AEE]={d='on'}, + [0x2AEF]={d='on'}, + [0x2AF0]={d='on'}, + [0x2AF1]={d='on'}, + [0x2AF2]={d='on'}, + [0x2AF3]={d='on'}, + [0x2AF4]={d='on'}, + [0x2AF5]={d='on'}, + [0x2AF6]={d='on'}, + [0x2AF7]={d='on', m=0x2AF8}, + [0x2AF8]={d='on', m=0x2AF7}, + [0x2AF9]={d='on', m=0x2AFA}, + [0x2AFA]={d='on', m=0x2AF9}, + [0x2AFB]={d='on'}, + [0x2AFC]={d='on'}, + [0x2AFD]={d='on'}, + [0x2AFE]={d='on'}, + [0x2AFF]={d='on'}, + [0x2B00]={d='on'}, + [0x2B01]={d='on'}, + [0x2B02]={d='on'}, + [0x2B03]={d='on'}, + [0x2B04]={d='on'}, + [0x2B05]={d='on'}, + [0x2B06]={d='on'}, + [0x2B07]={d='on'}, + [0x2B08]={d='on'}, + [0x2B09]={d='on'}, + [0x2B0A]={d='on'}, + [0x2B0B]={d='on'}, + [0x2B0C]={d='on'}, + [0x2B0D]={d='on'}, + [0x2B0E]={d='on'}, + [0x2B0F]={d='on'}, + [0x2B10]={d='on'}, + [0x2B11]={d='on'}, + [0x2B12]={d='on'}, + [0x2B13]={d='on'}, + [0x2B14]={d='on'}, + [0x2B15]={d='on'}, + [0x2B16]={d='on'}, + [0x2B17]={d='on'}, + [0x2B18]={d='on'}, + [0x2B19]={d='on'}, + [0x2B1A]={d='on'}, + [0x2B1B]={d='on'}, + [0x2B1C]={d='on'}, + [0x2B1D]={d='on'}, + [0x2B1E]={d='on'}, + [0x2B1F]={d='on'}, + [0x2B20]={d='on'}, + [0x2B21]={d='on'}, + [0x2B22]={d='on'}, + [0x2B23]={d='on'}, + [0x2B24]={d='on'}, + [0x2B25]={d='on'}, + [0x2B26]={d='on'}, + [0x2B27]={d='on'}, + [0x2B28]={d='on'}, + [0x2B29]={d='on'}, + [0x2B2A]={d='on'}, + [0x2B2B]={d='on'}, + [0x2B2C]={d='on'}, + [0x2B2D]={d='on'}, + [0x2B2E]={d='on'}, + [0x2B2F]={d='on'}, + [0x2B30]={d='on'}, + [0x2B31]={d='on'}, + [0x2B32]={d='on'}, + [0x2B33]={d='on'}, + [0x2B34]={d='on'}, + [0x2B35]={d='on'}, + [0x2B36]={d='on'}, + [0x2B37]={d='on'}, + [0x2B38]={d='on'}, + [0x2B39]={d='on'}, + [0x2B3A]={d='on'}, + [0x2B3B]={d='on'}, + [0x2B3C]={d='on'}, + [0x2B3D]={d='on'}, + [0x2B3E]={d='on'}, + [0x2B3F]={d='on'}, + [0x2B40]={d='on'}, + [0x2B41]={d='on'}, + [0x2B42]={d='on'}, + [0x2B43]={d='on'}, + [0x2B44]={d='on'}, + [0x2B45]={d='on'}, + [0x2B46]={d='on'}, + [0x2B47]={d='on'}, + [0x2B48]={d='on'}, + [0x2B49]={d='on'}, + [0x2B4A]={d='on'}, + [0x2B4B]={d='on'}, + [0x2B4C]={d='on'}, + [0x2B4D]={d='on'}, + [0x2B4E]={d='on'}, + [0x2B4F]={d='on'}, + [0x2B50]={d='on'}, + [0x2B51]={d='on'}, + [0x2B52]={d='on'}, + [0x2B53]={d='on'}, + [0x2B54]={d='on'}, + [0x2B55]={d='on'}, + [0x2B56]={d='on'}, + [0x2B57]={d='on'}, + [0x2B58]={d='on'}, + [0x2B59]={d='on'}, + [0x2B5A]={d='on'}, + [0x2B5B]={d='on'}, + [0x2B5C]={d='on'}, + [0x2B5D]={d='on'}, + [0x2B5E]={d='on'}, + [0x2B5F]={d='on'}, + [0x2B60]={d='on'}, + [0x2B61]={d='on'}, + [0x2B62]={d='on'}, + [0x2B63]={d='on'}, + [0x2B64]={d='on'}, + [0x2B65]={d='on'}, + [0x2B66]={d='on'}, + [0x2B67]={d='on'}, + [0x2B68]={d='on'}, + [0x2B69]={d='on'}, + [0x2B6A]={d='on'}, + [0x2B6B]={d='on'}, + [0x2B6C]={d='on'}, + [0x2B6D]={d='on'}, + [0x2B6E]={d='on'}, + [0x2B6F]={d='on'}, + [0x2B70]={d='on'}, + [0x2B71]={d='on'}, + [0x2B72]={d='on'}, + [0x2B73]={d='on'}, + [0x2B76]={d='on'}, + [0x2B77]={d='on'}, + [0x2B78]={d='on'}, + [0x2B79]={d='on'}, + [0x2B7A]={d='on'}, + [0x2B7B]={d='on'}, + [0x2B7C]={d='on'}, + [0x2B7D]={d='on'}, + [0x2B7E]={d='on'}, + [0x2B7F]={d='on'}, + [0x2B80]={d='on'}, + [0x2B81]={d='on'}, + [0x2B82]={d='on'}, + [0x2B83]={d='on'}, + [0x2B84]={d='on'}, + [0x2B85]={d='on'}, + [0x2B86]={d='on'}, + [0x2B87]={d='on'}, + [0x2B88]={d='on'}, + [0x2B89]={d='on'}, + [0x2B8A]={d='on'}, + [0x2B8B]={d='on'}, + [0x2B8C]={d='on'}, + [0x2B8D]={d='on'}, + [0x2B8E]={d='on'}, + [0x2B8F]={d='on'}, + [0x2B90]={d='on'}, + [0x2B91]={d='on'}, + [0x2B92]={d='on'}, + [0x2B93]={d='on'}, + [0x2B94]={d='on'}, + [0x2B95]={d='on'}, + [0x2B98]={d='on'}, + [0x2B99]={d='on'}, + [0x2B9A]={d='on'}, + [0x2B9B]={d='on'}, + [0x2B9C]={d='on'}, + [0x2B9D]={d='on'}, + [0x2B9E]={d='on'}, + [0x2B9F]={d='on'}, + [0x2BA0]={d='on'}, + [0x2BA1]={d='on'}, + [0x2BA2]={d='on'}, + [0x2BA3]={d='on'}, + [0x2BA4]={d='on'}, + [0x2BA5]={d='on'}, + [0x2BA6]={d='on'}, + [0x2BA7]={d='on'}, + [0x2BA8]={d='on'}, + [0x2BA9]={d='on'}, + [0x2BAA]={d='on'}, + [0x2BAB]={d='on'}, + [0x2BAC]={d='on'}, + [0x2BAD]={d='on'}, + [0x2BAE]={d='on'}, + [0x2BAF]={d='on'}, + [0x2BB0]={d='on'}, + [0x2BB1]={d='on'}, + [0x2BB2]={d='on'}, + [0x2BB3]={d='on'}, + [0x2BB4]={d='on'}, + [0x2BB5]={d='on'}, + [0x2BB6]={d='on'}, + [0x2BB7]={d='on'}, + [0x2BB8]={d='on'}, + [0x2BB9]={d='on'}, + [0x2BBD]={d='on'}, + [0x2BBE]={d='on'}, + [0x2BBF]={d='on'}, + [0x2BC0]={d='on'}, + [0x2BC1]={d='on'}, + [0x2BC2]={d='on'}, + [0x2BC3]={d='on'}, + [0x2BC4]={d='on'}, + [0x2BC5]={d='on'}, + [0x2BC6]={d='on'}, + [0x2BC7]={d='on'}, + [0x2BC8]={d='on'}, + [0x2BCA]={d='on'}, + [0x2BCB]={d='on'}, + [0x2BCC]={d='on'}, + [0x2BCD]={d='on'}, + [0x2BCE]={d='on'}, + [0x2BCF]={d='on'}, + [0x2BD0]={d='on'}, + [0x2BD1]={d='on'}, + [0x2BEC]={d='on'}, + [0x2BED]={d='on'}, + [0x2BEE]={d='on'}, + [0x2BEF]={d='on'}, + [0x2CE5]={d='on'}, + [0x2CE6]={d='on'}, + [0x2CE7]={d='on'}, + [0x2CE8]={d='on'}, + [0x2CE9]={d='on'}, + [0x2CEA]={d='on'}, + [0x2CEF]={d='nsm'}, + [0x2CF0]={d='nsm'}, + [0x2CF1]={d='nsm'}, + [0x2CF9]={d='on'}, + [0x2CFA]={d='on'}, + [0x2CFB]={d='on'}, + [0x2CFC]={d='on'}, + [0x2CFD]={d='on'}, + [0x2CFE]={d='on'}, + [0x2CFF]={d='on'}, + [0x2D7F]={d='nsm'}, + [0x2DE0]={d='nsm'}, + [0x2DE1]={d='nsm'}, + [0x2DE2]={d='nsm'}, + [0x2DE3]={d='nsm'}, + [0x2DE4]={d='nsm'}, + [0x2DE5]={d='nsm'}, + [0x2DE6]={d='nsm'}, + [0x2DE7]={d='nsm'}, + [0x2DE8]={d='nsm'}, + [0x2DE9]={d='nsm'}, + [0x2DEA]={d='nsm'}, + [0x2DEB]={d='nsm'}, + [0x2DEC]={d='nsm'}, + [0x2DED]={d='nsm'}, + [0x2DEE]={d='nsm'}, + [0x2DEF]={d='nsm'}, + [0x2DF0]={d='nsm'}, + [0x2DF1]={d='nsm'}, + [0x2DF2]={d='nsm'}, + [0x2DF3]={d='nsm'}, + [0x2DF4]={d='nsm'}, + [0x2DF5]={d='nsm'}, + [0x2DF6]={d='nsm'}, + [0x2DF7]={d='nsm'}, + [0x2DF8]={d='nsm'}, + [0x2DF9]={d='nsm'}, + [0x2DFA]={d='nsm'}, + [0x2DFB]={d='nsm'}, + [0x2DFC]={d='nsm'}, + [0x2DFD]={d='nsm'}, + [0x2DFE]={d='nsm'}, + [0x2DFF]={d='nsm'}, + [0x2E00]={d='on'}, + [0x2E01]={d='on'}, + [0x2E02]={d='on', m=0x2E03}, + [0x2E03]={d='on', m=0x2E02}, + [0x2E04]={d='on', m=0x2E05}, + [0x2E05]={d='on', m=0x2E04}, + [0x2E06]={d='on'}, + [0x2E07]={d='on'}, + [0x2E08]={d='on'}, + [0x2E09]={d='on', m=0x2E0A}, + [0x2E0A]={d='on', m=0x2E09}, + [0x2E0B]={d='on'}, + [0x2E0C]={d='on', m=0x2E0D}, + [0x2E0D]={d='on', m=0x2E0C}, + [0x2E0E]={d='on'}, + [0x2E0F]={d='on'}, + [0x2E10]={d='on'}, + [0x2E11]={d='on'}, + [0x2E12]={d='on'}, + [0x2E13]={d='on'}, + [0x2E14]={d='on'}, + [0x2E15]={d='on'}, + [0x2E16]={d='on'}, + [0x2E17]={d='on'}, + [0x2E18]={d='on'}, + [0x2E19]={d='on'}, + [0x2E1A]={d='on'}, + [0x2E1B]={d='on'}, + [0x2E1C]={d='on', m=0x2E1D}, + [0x2E1D]={d='on', m=0x2E1C}, + [0x2E1E]={d='on'}, + [0x2E1F]={d='on'}, + [0x2E20]={d='on', m=0x2E21}, + [0x2E21]={d='on', m=0x2E20}, + [0x2E22]={d='on', m=0x2E23}, + [0x2E23]={d='on', m=0x2E22}, + [0x2E24]={d='on', m=0x2E25}, + [0x2E25]={d='on', m=0x2E24}, + [0x2E26]={d='on', m=0x2E27}, + [0x2E27]={d='on', m=0x2E26}, + [0x2E28]={d='on', m=0x2E29}, + [0x2E29]={d='on', m=0x2E28}, + [0x2E2A]={d='on'}, + [0x2E2B]={d='on'}, + [0x2E2C]={d='on'}, + [0x2E2D]={d='on'}, + [0x2E2E]={d='on'}, + [0x2E2F]={d='on'}, + [0x2E30]={d='on'}, + [0x2E31]={d='on'}, + [0x2E32]={d='on'}, + [0x2E33]={d='on'}, + [0x2E34]={d='on'}, + [0x2E35]={d='on'}, + [0x2E36]={d='on'}, + [0x2E37]={d='on'}, + [0x2E38]={d='on'}, + [0x2E39]={d='on'}, + [0x2E3A]={d='on'}, + [0x2E3B]={d='on'}, + [0x2E3C]={d='on'}, + [0x2E3D]={d='on'}, + [0x2E3E]={d='on'}, + [0x2E3F]={d='on'}, + [0x2E40]={d='on'}, + [0x2E41]={d='on'}, + [0x2E42]={d='on'}, + [0x2E43]={d='on'}, + [0x2E44]={d='on'}, + [0x2E80]={d='on'}, + [0x2E81]={d='on'}, + [0x2E82]={d='on'}, + [0x2E83]={d='on'}, + [0x2E84]={d='on'}, + [0x2E85]={d='on'}, + [0x2E86]={d='on'}, + [0x2E87]={d='on'}, + [0x2E88]={d='on'}, + [0x2E89]={d='on'}, + [0x2E8A]={d='on'}, + [0x2E8B]={d='on'}, + [0x2E8C]={d='on'}, + [0x2E8D]={d='on'}, + [0x2E8E]={d='on'}, + [0x2E8F]={d='on'}, + [0x2E90]={d='on'}, + [0x2E91]={d='on'}, + [0x2E92]={d='on'}, + [0x2E93]={d='on'}, + [0x2E94]={d='on'}, + [0x2E95]={d='on'}, + [0x2E96]={d='on'}, + [0x2E97]={d='on'}, + [0x2E98]={d='on'}, + [0x2E99]={d='on'}, + [0x2E9B]={d='on'}, + [0x2E9C]={d='on'}, + [0x2E9D]={d='on'}, + [0x2E9E]={d='on'}, + [0x2E9F]={d='on'}, + [0x2EA0]={d='on'}, + [0x2EA1]={d='on'}, + [0x2EA2]={d='on'}, + [0x2EA3]={d='on'}, + [0x2EA4]={d='on'}, + [0x2EA5]={d='on'}, + [0x2EA6]={d='on'}, + [0x2EA7]={d='on'}, + [0x2EA8]={d='on'}, + [0x2EA9]={d='on'}, + [0x2EAA]={d='on'}, + [0x2EAB]={d='on'}, + [0x2EAC]={d='on'}, + [0x2EAD]={d='on'}, + [0x2EAE]={d='on'}, + [0x2EAF]={d='on'}, + [0x2EB0]={d='on'}, + [0x2EB1]={d='on'}, + [0x2EB2]={d='on'}, + [0x2EB3]={d='on'}, + [0x2EB4]={d='on'}, + [0x2EB5]={d='on'}, + [0x2EB6]={d='on'}, + [0x2EB7]={d='on'}, + [0x2EB8]={d='on'}, + [0x2EB9]={d='on'}, + [0x2EBA]={d='on'}, + [0x2EBB]={d='on'}, + [0x2EBC]={d='on'}, + [0x2EBD]={d='on'}, + [0x2EBE]={d='on'}, + [0x2EBF]={d='on'}, + [0x2EC0]={d='on'}, + [0x2EC1]={d='on'}, + [0x2EC2]={d='on'}, + [0x2EC3]={d='on'}, + [0x2EC4]={d='on'}, + [0x2EC5]={d='on'}, + [0x2EC6]={d='on'}, + [0x2EC7]={d='on'}, + [0x2EC8]={d='on'}, + [0x2EC9]={d='on'}, + [0x2ECA]={d='on'}, + [0x2ECB]={d='on'}, + [0x2ECC]={d='on'}, + [0x2ECD]={d='on'}, + [0x2ECE]={d='on'}, + [0x2ECF]={d='on'}, + [0x2ED0]={d='on'}, + [0x2ED1]={d='on'}, + [0x2ED2]={d='on'}, + [0x2ED3]={d='on'}, + [0x2ED4]={d='on'}, + [0x2ED5]={d='on'}, + [0x2ED6]={d='on'}, + [0x2ED7]={d='on'}, + [0x2ED8]={d='on'}, + [0x2ED9]={d='on'}, + [0x2EDA]={d='on'}, + [0x2EDB]={d='on'}, + [0x2EDC]={d='on'}, + [0x2EDD]={d='on'}, + [0x2EDE]={d='on'}, + [0x2EDF]={d='on'}, + [0x2EE0]={d='on'}, + [0x2EE1]={d='on'}, + [0x2EE2]={d='on'}, + [0x2EE3]={d='on'}, + [0x2EE4]={d='on'}, + [0x2EE5]={d='on'}, + [0x2EE6]={d='on'}, + [0x2EE7]={d='on'}, + [0x2EE8]={d='on'}, + [0x2EE9]={d='on'}, + [0x2EEA]={d='on'}, + [0x2EEB]={d='on'}, + [0x2EEC]={d='on'}, + [0x2EED]={d='on'}, + [0x2EEE]={d='on'}, + [0x2EEF]={d='on'}, + [0x2EF0]={d='on'}, + [0x2EF1]={d='on'}, + [0x2EF2]={d='on'}, + [0x2EF3]={d='on'}, + [0x2F00]={d='on'}, + [0x2F01]={d='on'}, + [0x2F02]={d='on'}, + [0x2F03]={d='on'}, + [0x2F04]={d='on'}, + [0x2F05]={d='on'}, + [0x2F06]={d='on'}, + [0x2F07]={d='on'}, + [0x2F08]={d='on'}, + [0x2F09]={d='on'}, + [0x2F0A]={d='on'}, + [0x2F0B]={d='on'}, + [0x2F0C]={d='on'}, + [0x2F0D]={d='on'}, + [0x2F0E]={d='on'}, + [0x2F0F]={d='on'}, + [0x2F10]={d='on'}, + [0x2F11]={d='on'}, + [0x2F12]={d='on'}, + [0x2F13]={d='on'}, + [0x2F14]={d='on'}, + [0x2F15]={d='on'}, + [0x2F16]={d='on'}, + [0x2F17]={d='on'}, + [0x2F18]={d='on'}, + [0x2F19]={d='on'}, + [0x2F1A]={d='on'}, + [0x2F1B]={d='on'}, + [0x2F1C]={d='on'}, + [0x2F1D]={d='on'}, + [0x2F1E]={d='on'}, + [0x2F1F]={d='on'}, + [0x2F20]={d='on'}, + [0x2F21]={d='on'}, + [0x2F22]={d='on'}, + [0x2F23]={d='on'}, + [0x2F24]={d='on'}, + [0x2F25]={d='on'}, + [0x2F26]={d='on'}, + [0x2F27]={d='on'}, + [0x2F28]={d='on'}, + [0x2F29]={d='on'}, + [0x2F2A]={d='on'}, + [0x2F2B]={d='on'}, + [0x2F2C]={d='on'}, + [0x2F2D]={d='on'}, + [0x2F2E]={d='on'}, + [0x2F2F]={d='on'}, + [0x2F30]={d='on'}, + [0x2F31]={d='on'}, + [0x2F32]={d='on'}, + [0x2F33]={d='on'}, + [0x2F34]={d='on'}, + [0x2F35]={d='on'}, + [0x2F36]={d='on'}, + [0x2F37]={d='on'}, + [0x2F38]={d='on'}, + [0x2F39]={d='on'}, + [0x2F3A]={d='on'}, + [0x2F3B]={d='on'}, + [0x2F3C]={d='on'}, + [0x2F3D]={d='on'}, + [0x2F3E]={d='on'}, + [0x2F3F]={d='on'}, + [0x2F40]={d='on'}, + [0x2F41]={d='on'}, + [0x2F42]={d='on'}, + [0x2F43]={d='on'}, + [0x2F44]={d='on'}, + [0x2F45]={d='on'}, + [0x2F46]={d='on'}, + [0x2F47]={d='on'}, + [0x2F48]={d='on'}, + [0x2F49]={d='on'}, + [0x2F4A]={d='on'}, + [0x2F4B]={d='on'}, + [0x2F4C]={d='on'}, + [0x2F4D]={d='on'}, + [0x2F4E]={d='on'}, + [0x2F4F]={d='on'}, + [0x2F50]={d='on'}, + [0x2F51]={d='on'}, + [0x2F52]={d='on'}, + [0x2F53]={d='on'}, + [0x2F54]={d='on'}, + [0x2F55]={d='on'}, + [0x2F56]={d='on'}, + [0x2F57]={d='on'}, + [0x2F58]={d='on'}, + [0x2F59]={d='on'}, + [0x2F5A]={d='on'}, + [0x2F5B]={d='on'}, + [0x2F5C]={d='on'}, + [0x2F5D]={d='on'}, + [0x2F5E]={d='on'}, + [0x2F5F]={d='on'}, + [0x2F60]={d='on'}, + [0x2F61]={d='on'}, + [0x2F62]={d='on'}, + [0x2F63]={d='on'}, + [0x2F64]={d='on'}, + [0x2F65]={d='on'}, + [0x2F66]={d='on'}, + [0x2F67]={d='on'}, + [0x2F68]={d='on'}, + [0x2F69]={d='on'}, + [0x2F6A]={d='on'}, + [0x2F6B]={d='on'}, + [0x2F6C]={d='on'}, + [0x2F6D]={d='on'}, + [0x2F6E]={d='on'}, + [0x2F6F]={d='on'}, + [0x2F70]={d='on'}, + [0x2F71]={d='on'}, + [0x2F72]={d='on'}, + [0x2F73]={d='on'}, + [0x2F74]={d='on'}, + [0x2F75]={d='on'}, + [0x2F76]={d='on'}, + [0x2F77]={d='on'}, + [0x2F78]={d='on'}, + [0x2F79]={d='on'}, + [0x2F7A]={d='on'}, + [0x2F7B]={d='on'}, + [0x2F7C]={d='on'}, + [0x2F7D]={d='on'}, + [0x2F7E]={d='on'}, + [0x2F7F]={d='on'}, + [0x2F80]={d='on'}, + [0x2F81]={d='on'}, + [0x2F82]={d='on'}, + [0x2F83]={d='on'}, + [0x2F84]={d='on'}, + [0x2F85]={d='on'}, + [0x2F86]={d='on'}, + [0x2F87]={d='on'}, + [0x2F88]={d='on'}, + [0x2F89]={d='on'}, + [0x2F8A]={d='on'}, + [0x2F8B]={d='on'}, + [0x2F8C]={d='on'}, + [0x2F8D]={d='on'}, + [0x2F8E]={d='on'}, + [0x2F8F]={d='on'}, + [0x2F90]={d='on'}, + [0x2F91]={d='on'}, + [0x2F92]={d='on'}, + [0x2F93]={d='on'}, + [0x2F94]={d='on'}, + [0x2F95]={d='on'}, + [0x2F96]={d='on'}, + [0x2F97]={d='on'}, + [0x2F98]={d='on'}, + [0x2F99]={d='on'}, + [0x2F9A]={d='on'}, + [0x2F9B]={d='on'}, + [0x2F9C]={d='on'}, + [0x2F9D]={d='on'}, + [0x2F9E]={d='on'}, + [0x2F9F]={d='on'}, + [0x2FA0]={d='on'}, + [0x2FA1]={d='on'}, + [0x2FA2]={d='on'}, + [0x2FA3]={d='on'}, + [0x2FA4]={d='on'}, + [0x2FA5]={d='on'}, + [0x2FA6]={d='on'}, + [0x2FA7]={d='on'}, + [0x2FA8]={d='on'}, + [0x2FA9]={d='on'}, + [0x2FAA]={d='on'}, + [0x2FAB]={d='on'}, + [0x2FAC]={d='on'}, + [0x2FAD]={d='on'}, + [0x2FAE]={d='on'}, + [0x2FAF]={d='on'}, + [0x2FB0]={d='on'}, + [0x2FB1]={d='on'}, + [0x2FB2]={d='on'}, + [0x2FB3]={d='on'}, + [0x2FB4]={d='on'}, + [0x2FB5]={d='on'}, + [0x2FB6]={d='on'}, + [0x2FB7]={d='on'}, + [0x2FB8]={d='on'}, + [0x2FB9]={d='on'}, + [0x2FBA]={d='on'}, + [0x2FBB]={d='on'}, + [0x2FBC]={d='on'}, + [0x2FBD]={d='on'}, + [0x2FBE]={d='on'}, + [0x2FBF]={d='on'}, + [0x2FC0]={d='on'}, + [0x2FC1]={d='on'}, + [0x2FC2]={d='on'}, + [0x2FC3]={d='on'}, + [0x2FC4]={d='on'}, + [0x2FC5]={d='on'}, + [0x2FC6]={d='on'}, + [0x2FC7]={d='on'}, + [0x2FC8]={d='on'}, + [0x2FC9]={d='on'}, + [0x2FCA]={d='on'}, + [0x2FCB]={d='on'}, + [0x2FCC]={d='on'}, + [0x2FCD]={d='on'}, + [0x2FCE]={d='on'}, + [0x2FCF]={d='on'}, + [0x2FD0]={d='on'}, + [0x2FD1]={d='on'}, + [0x2FD2]={d='on'}, + [0x2FD3]={d='on'}, + [0x2FD4]={d='on'}, + [0x2FD5]={d='on'}, + [0x2FF0]={d='on'}, + [0x2FF1]={d='on'}, + [0x2FF2]={d='on'}, + [0x2FF3]={d='on'}, + [0x2FF4]={d='on'}, + [0x2FF5]={d='on'}, + [0x2FF6]={d='on'}, + [0x2FF7]={d='on'}, + [0x2FF8]={d='on'}, + [0x2FF9]={d='on'}, + [0x2FFA]={d='on'}, + [0x2FFB]={d='on'}, + [0x3000]={d='ws'}, + [0x3001]={d='on'}, + [0x3002]={d='on'}, + [0x3003]={d='on'}, + [0x3004]={d='on'}, + [0x3008]={d='on', m=0x3009}, + [0x3009]={d='on', m=0x3008}, + [0x300A]={d='on', m=0x300B}, + [0x300B]={d='on', m=0x300A}, + [0x300C]={d='on', m=0x300D}, + [0x300D]={d='on', m=0x300C}, + [0x300E]={d='on', m=0x300F}, + [0x300F]={d='on', m=0x300E}, + [0x3010]={d='on', m=0x3011}, + [0x3011]={d='on', m=0x3010}, + [0x3012]={d='on'}, + [0x3013]={d='on'}, + [0x3014]={d='on', m=0x3015}, + [0x3015]={d='on', m=0x3014}, + [0x3016]={d='on', m=0x3017}, + [0x3017]={d='on', m=0x3016}, + [0x3018]={d='on', m=0x3019}, + [0x3019]={d='on', m=0x3018}, + [0x301A]={d='on', m=0x301B}, + [0x301B]={d='on', m=0x301A}, + [0x301C]={d='on'}, + [0x301D]={d='on'}, + [0x301E]={d='on'}, + [0x301F]={d='on'}, + [0x3020]={d='on'}, + [0x302A]={d='nsm'}, + [0x302B]={d='nsm'}, + [0x302C]={d='nsm'}, + [0x302D]={d='nsm'}, + [0x3030]={d='on'}, + [0x3036]={d='on'}, + [0x3037]={d='on'}, + [0x303D]={d='on'}, + [0x303E]={d='on'}, + [0x303F]={d='on'}, + [0x3099]={d='nsm'}, + [0x309A]={d='nsm'}, + [0x309B]={d='on'}, + [0x309C]={d='on'}, + [0x30A0]={d='on'}, + [0x30FB]={d='on'}, + [0x31C0]={d='on'}, + [0x31C1]={d='on'}, + [0x31C2]={d='on'}, + [0x31C3]={d='on'}, + [0x31C4]={d='on'}, + [0x31C5]={d='on'}, + [0x31C6]={d='on'}, + [0x31C7]={d='on'}, + [0x31C8]={d='on'}, + [0x31C9]={d='on'}, + [0x31CA]={d='on'}, + [0x31CB]={d='on'}, + [0x31CC]={d='on'}, + [0x31CD]={d='on'}, + [0x31CE]={d='on'}, + [0x31CF]={d='on'}, + [0x31D0]={d='on'}, + [0x31D1]={d='on'}, + [0x31D2]={d='on'}, + [0x31D3]={d='on'}, + [0x31D4]={d='on'}, + [0x31D5]={d='on'}, + [0x31D6]={d='on'}, + [0x31D7]={d='on'}, + [0x31D8]={d='on'}, + [0x31D9]={d='on'}, + [0x31DA]={d='on'}, + [0x31DB]={d='on'}, + [0x31DC]={d='on'}, + [0x31DD]={d='on'}, + [0x31DE]={d='on'}, + [0x31DF]={d='on'}, + [0x31E0]={d='on'}, + [0x31E1]={d='on'}, + [0x31E2]={d='on'}, + [0x31E3]={d='on'}, + [0x321D]={d='on'}, + [0x321E]={d='on'}, + [0x3250]={d='on'}, + [0x3251]={d='on'}, + [0x3252]={d='on'}, + [0x3253]={d='on'}, + [0x3254]={d='on'}, + [0x3255]={d='on'}, + [0x3256]={d='on'}, + [0x3257]={d='on'}, + [0x3258]={d='on'}, + [0x3259]={d='on'}, + [0x325A]={d='on'}, + [0x325B]={d='on'}, + [0x325C]={d='on'}, + [0x325D]={d='on'}, + [0x325E]={d='on'}, + [0x325F]={d='on'}, + [0x327C]={d='on'}, + [0x327D]={d='on'}, + [0x327E]={d='on'}, + [0x32B1]={d='on'}, + [0x32B2]={d='on'}, + [0x32B3]={d='on'}, + [0x32B4]={d='on'}, + [0x32B5]={d='on'}, + [0x32B6]={d='on'}, + [0x32B7]={d='on'}, + [0x32B8]={d='on'}, + [0x32B9]={d='on'}, + [0x32BA]={d='on'}, + [0x32BB]={d='on'}, + [0x32BC]={d='on'}, + [0x32BD]={d='on'}, + [0x32BE]={d='on'}, + [0x32BF]={d='on'}, + [0x32CC]={d='on'}, + [0x32CD]={d='on'}, + [0x32CE]={d='on'}, + [0x32CF]={d='on'}, + [0x3377]={d='on'}, + [0x3378]={d='on'}, + [0x3379]={d='on'}, + [0x337A]={d='on'}, + [0x33DE]={d='on'}, + [0x33DF]={d='on'}, + [0x33FF]={d='on'}, + [0x4DC0]={d='on'}, + [0x4DC1]={d='on'}, + [0x4DC2]={d='on'}, + [0x4DC3]={d='on'}, + [0x4DC4]={d='on'}, + [0x4DC5]={d='on'}, + [0x4DC6]={d='on'}, + [0x4DC7]={d='on'}, + [0x4DC8]={d='on'}, + [0x4DC9]={d='on'}, + [0x4DCA]={d='on'}, + [0x4DCB]={d='on'}, + [0x4DCC]={d='on'}, + [0x4DCD]={d='on'}, + [0x4DCE]={d='on'}, + [0x4DCF]={d='on'}, + [0x4DD0]={d='on'}, + [0x4DD1]={d='on'}, + [0x4DD2]={d='on'}, + [0x4DD3]={d='on'}, + [0x4DD4]={d='on'}, + [0x4DD5]={d='on'}, + [0x4DD6]={d='on'}, + [0x4DD7]={d='on'}, + [0x4DD8]={d='on'}, + [0x4DD9]={d='on'}, + [0x4DDA]={d='on'}, + [0x4DDB]={d='on'}, + [0x4DDC]={d='on'}, + [0x4DDD]={d='on'}, + [0x4DDE]={d='on'}, + [0x4DDF]={d='on'}, + [0x4DE0]={d='on'}, + [0x4DE1]={d='on'}, + [0x4DE2]={d='on'}, + [0x4DE3]={d='on'}, + [0x4DE4]={d='on'}, + [0x4DE5]={d='on'}, + [0x4DE6]={d='on'}, + [0x4DE7]={d='on'}, + [0x4DE8]={d='on'}, + [0x4DE9]={d='on'}, + [0x4DEA]={d='on'}, + [0x4DEB]={d='on'}, + [0x4DEC]={d='on'}, + [0x4DED]={d='on'}, + [0x4DEE]={d='on'}, + [0x4DEF]={d='on'}, + [0x4DF0]={d='on'}, + [0x4DF1]={d='on'}, + [0x4DF2]={d='on'}, + [0x4DF3]={d='on'}, + [0x4DF4]={d='on'}, + [0x4DF5]={d='on'}, + [0x4DF6]={d='on'}, + [0x4DF7]={d='on'}, + [0x4DF8]={d='on'}, + [0x4DF9]={d='on'}, + [0x4DFA]={d='on'}, + [0x4DFB]={d='on'}, + [0x4DFC]={d='on'}, + [0x4DFD]={d='on'}, + [0x4DFE]={d='on'}, + [0x4DFF]={d='on'}, + [0xA490]={d='on'}, + [0xA491]={d='on'}, + [0xA492]={d='on'}, + [0xA493]={d='on'}, + [0xA494]={d='on'}, + [0xA495]={d='on'}, + [0xA496]={d='on'}, + [0xA497]={d='on'}, + [0xA498]={d='on'}, + [0xA499]={d='on'}, + [0xA49A]={d='on'}, + [0xA49B]={d='on'}, + [0xA49C]={d='on'}, + [0xA49D]={d='on'}, + [0xA49E]={d='on'}, + [0xA49F]={d='on'}, + [0xA4A0]={d='on'}, + [0xA4A1]={d='on'}, + [0xA4A2]={d='on'}, + [0xA4A3]={d='on'}, + [0xA4A4]={d='on'}, + [0xA4A5]={d='on'}, + [0xA4A6]={d='on'}, + [0xA4A7]={d='on'}, + [0xA4A8]={d='on'}, + [0xA4A9]={d='on'}, + [0xA4AA]={d='on'}, + [0xA4AB]={d='on'}, + [0xA4AC]={d='on'}, + [0xA4AD]={d='on'}, + [0xA4AE]={d='on'}, + [0xA4AF]={d='on'}, + [0xA4B0]={d='on'}, + [0xA4B1]={d='on'}, + [0xA4B2]={d='on'}, + [0xA4B3]={d='on'}, + [0xA4B4]={d='on'}, + [0xA4B5]={d='on'}, + [0xA4B6]={d='on'}, + [0xA4B7]={d='on'}, + [0xA4B8]={d='on'}, + [0xA4B9]={d='on'}, + [0xA4BA]={d='on'}, + [0xA4BB]={d='on'}, + [0xA4BC]={d='on'}, + [0xA4BD]={d='on'}, + [0xA4BE]={d='on'}, + [0xA4BF]={d='on'}, + [0xA4C0]={d='on'}, + [0xA4C1]={d='on'}, + [0xA4C2]={d='on'}, + [0xA4C3]={d='on'}, + [0xA4C4]={d='on'}, + [0xA4C5]={d='on'}, + [0xA4C6]={d='on'}, + [0xA60D]={d='on'}, + [0xA60E]={d='on'}, + [0xA60F]={d='on'}, + [0xA66F]={d='nsm'}, + [0xA670]={d='nsm'}, + [0xA671]={d='nsm'}, + [0xA672]={d='nsm'}, + [0xA673]={d='on'}, + [0xA674]={d='nsm'}, + [0xA675]={d='nsm'}, + [0xA676]={d='nsm'}, + [0xA677]={d='nsm'}, + [0xA678]={d='nsm'}, + [0xA679]={d='nsm'}, + [0xA67A]={d='nsm'}, + [0xA67B]={d='nsm'}, + [0xA67C]={d='nsm'}, + [0xA67D]={d='nsm'}, + [0xA67E]={d='on'}, + [0xA67F]={d='on'}, + [0xA69E]={d='nsm'}, + [0xA69F]={d='nsm'}, + [0xA6F0]={d='nsm'}, + [0xA6F1]={d='nsm'}, + [0xA700]={d='on'}, + [0xA701]={d='on'}, + [0xA702]={d='on'}, + [0xA703]={d='on'}, + [0xA704]={d='on'}, + [0xA705]={d='on'}, + [0xA706]={d='on'}, + [0xA707]={d='on'}, + [0xA708]={d='on'}, + [0xA709]={d='on'}, + [0xA70A]={d='on'}, + [0xA70B]={d='on'}, + [0xA70C]={d='on'}, + [0xA70D]={d='on'}, + [0xA70E]={d='on'}, + [0xA70F]={d='on'}, + [0xA710]={d='on'}, + [0xA711]={d='on'}, + [0xA712]={d='on'}, + [0xA713]={d='on'}, + [0xA714]={d='on'}, + [0xA715]={d='on'}, + [0xA716]={d='on'}, + [0xA717]={d='on'}, + [0xA718]={d='on'}, + [0xA719]={d='on'}, + [0xA71A]={d='on'}, + [0xA71B]={d='on'}, + [0xA71C]={d='on'}, + [0xA71D]={d='on'}, + [0xA71E]={d='on'}, + [0xA71F]={d='on'}, + [0xA720]={d='on'}, + [0xA721]={d='on'}, + [0xA788]={d='on'}, + [0xA802]={d='nsm'}, + [0xA806]={d='nsm'}, + [0xA80B]={d='nsm'}, + [0xA825]={d='nsm'}, + [0xA826]={d='nsm'}, + [0xA828]={d='on'}, + [0xA829]={d='on'}, + [0xA82A]={d='on'}, + [0xA82B]={d='on'}, + [0xA838]={d='et'}, + [0xA839]={d='et'}, + [0xA874]={d='on'}, + [0xA875]={d='on'}, + [0xA876]={d='on'}, + [0xA877]={d='on'}, + [0xA8C4]={d='nsm'}, + [0xA8C5]={d='nsm'}, + [0xA8E0]={d='nsm'}, + [0xA8E1]={d='nsm'}, + [0xA8E2]={d='nsm'}, + [0xA8E3]={d='nsm'}, + [0xA8E4]={d='nsm'}, + [0xA8E5]={d='nsm'}, + [0xA8E6]={d='nsm'}, + [0xA8E7]={d='nsm'}, + [0xA8E8]={d='nsm'}, + [0xA8E9]={d='nsm'}, + [0xA8EA]={d='nsm'}, + [0xA8EB]={d='nsm'}, + [0xA8EC]={d='nsm'}, + [0xA8ED]={d='nsm'}, + [0xA8EE]={d='nsm'}, + [0xA8EF]={d='nsm'}, + [0xA8F0]={d='nsm'}, + [0xA8F1]={d='nsm'}, + [0xA926]={d='nsm'}, + [0xA927]={d='nsm'}, + [0xA928]={d='nsm'}, + [0xA929]={d='nsm'}, + [0xA92A]={d='nsm'}, + [0xA92B]={d='nsm'}, + [0xA92C]={d='nsm'}, + [0xA92D]={d='nsm'}, + [0xA947]={d='nsm'}, + [0xA948]={d='nsm'}, + [0xA949]={d='nsm'}, + [0xA94A]={d='nsm'}, + [0xA94B]={d='nsm'}, + [0xA94C]={d='nsm'}, + [0xA94D]={d='nsm'}, + [0xA94E]={d='nsm'}, + [0xA94F]={d='nsm'}, + [0xA950]={d='nsm'}, + [0xA951]={d='nsm'}, + [0xA980]={d='nsm'}, + [0xA981]={d='nsm'}, + [0xA982]={d='nsm'}, + [0xA9B3]={d='nsm'}, + [0xA9B6]={d='nsm'}, + [0xA9B7]={d='nsm'}, + [0xA9B8]={d='nsm'}, + [0xA9B9]={d='nsm'}, + [0xA9BC]={d='nsm'}, + [0xA9E5]={d='nsm'}, + [0xAA29]={d='nsm'}, + [0xAA2A]={d='nsm'}, + [0xAA2B]={d='nsm'}, + [0xAA2C]={d='nsm'}, + [0xAA2D]={d='nsm'}, + [0xAA2E]={d='nsm'}, + [0xAA31]={d='nsm'}, + [0xAA32]={d='nsm'}, + [0xAA35]={d='nsm'}, + [0xAA36]={d='nsm'}, + [0xAA43]={d='nsm'}, + [0xAA4C]={d='nsm'}, + [0xAA7C]={d='nsm'}, + [0xAAB0]={d='nsm'}, + [0xAAB2]={d='nsm'}, + [0xAAB3]={d='nsm'}, + [0xAAB4]={d='nsm'}, + [0xAAB7]={d='nsm'}, + [0xAAB8]={d='nsm'}, + [0xAABE]={d='nsm'}, + [0xAABF]={d='nsm'}, + [0xAAC1]={d='nsm'}, + [0xAAEC]={d='nsm'}, + [0xAAED]={d='nsm'}, + [0xAAF6]={d='nsm'}, + [0xABE5]={d='nsm'}, + [0xABE8]={d='nsm'}, + [0xABED]={d='nsm'}, + [0xFB1E]={d='nsm'}, + [0xFB29]={d='es'}, + [0xFD3E]={d='on'}, + [0xFD3F]={d='on'}, + [0xFDFD]={d='on'}, + [0xFE10]={d='on'}, + [0xFE11]={d='on'}, + [0xFE12]={d='on'}, + [0xFE13]={d='on'}, + [0xFE14]={d='on'}, + [0xFE15]={d='on'}, + [0xFE16]={d='on'}, + [0xFE17]={d='on'}, + [0xFE18]={d='on'}, + [0xFE19]={d='on'}, + [0xFE20]={d='nsm'}, + [0xFE21]={d='nsm'}, + [0xFE22]={d='nsm'}, + [0xFE23]={d='nsm'}, + [0xFE24]={d='nsm'}, + [0xFE25]={d='nsm'}, + [0xFE26]={d='nsm'}, + [0xFE27]={d='nsm'}, + [0xFE28]={d='nsm'}, + [0xFE29]={d='nsm'}, + [0xFE2A]={d='nsm'}, + [0xFE2B]={d='nsm'}, + [0xFE2C]={d='nsm'}, + [0xFE2D]={d='nsm'}, + [0xFE2E]={d='nsm'}, + [0xFE2F]={d='nsm'}, + [0xFE30]={d='on'}, + [0xFE31]={d='on'}, + [0xFE32]={d='on'}, + [0xFE33]={d='on'}, + [0xFE34]={d='on'}, + [0xFE35]={d='on'}, + [0xFE36]={d='on'}, + [0xFE37]={d='on'}, + [0xFE38]={d='on'}, + [0xFE39]={d='on'}, + [0xFE3A]={d='on'}, + [0xFE3B]={d='on'}, + [0xFE3C]={d='on'}, + [0xFE3D]={d='on'}, + [0xFE3E]={d='on'}, + [0xFE3F]={d='on'}, + [0xFE40]={d='on'}, + [0xFE41]={d='on'}, + [0xFE42]={d='on'}, + [0xFE43]={d='on'}, + [0xFE44]={d='on'}, + [0xFE45]={d='on'}, + [0xFE46]={d='on'}, + [0xFE47]={d='on'}, + [0xFE48]={d='on'}, + [0xFE49]={d='on'}, + [0xFE4A]={d='on'}, + [0xFE4B]={d='on'}, + [0xFE4C]={d='on'}, + [0xFE4D]={d='on'}, + [0xFE4E]={d='on'}, + [0xFE4F]={d='on'}, + [0xFE50]={d='cs'}, + [0xFE51]={d='on'}, + [0xFE52]={d='cs'}, + [0xFE54]={d='on'}, + [0xFE55]={d='cs'}, + [0xFE56]={d='on'}, + [0xFE57]={d='on'}, + [0xFE58]={d='on'}, + [0xFE59]={d='on', m=0xFE5A}, + [0xFE5A]={d='on', m=0xFE59}, + [0xFE5B]={d='on', m=0xFE5C}, + [0xFE5C]={d='on', m=0xFE5B}, + [0xFE5D]={d='on', m=0xFE5E}, + [0xFE5E]={d='on', m=0xFE5D}, + [0xFE5F]={d='et'}, + [0xFE60]={d='on'}, + [0xFE61]={d='on'}, + [0xFE62]={d='es'}, + [0xFE63]={d='es'}, + [0xFE64]={d='on', m=0xFE65}, + [0xFE65]={d='on', m=0xFE64}, + [0xFE66]={d='on'}, + [0xFE68]={d='on'}, + [0xFE69]={d='et'}, + [0xFE6A]={d='et'}, + [0xFE6B]={d='on'}, + [0xFEFF]={d='bn'}, + [0xFF01]={d='on'}, + [0xFF02]={d='on'}, + [0xFF03]={d='et'}, + [0xFF04]={d='et'}, + [0xFF05]={d='et'}, + [0xFF06]={d='on'}, + [0xFF07]={d='on'}, + [0xFF08]={d='on', m=0xFF09}, + [0xFF09]={d='on', m=0xFF08}, + [0xFF0A]={d='on'}, + [0xFF0B]={d='es'}, + [0xFF0C]={d='cs'}, + [0xFF0D]={d='es'}, + [0xFF0E]={d='cs'}, + [0xFF0F]={d='cs'}, + [0xFF10]={d='en'}, + [0xFF11]={d='en'}, + [0xFF12]={d='en'}, + [0xFF13]={d='en'}, + [0xFF14]={d='en'}, + [0xFF15]={d='en'}, + [0xFF16]={d='en'}, + [0xFF17]={d='en'}, + [0xFF18]={d='en'}, + [0xFF19]={d='en'}, + [0xFF1A]={d='cs'}, + [0xFF1B]={d='on'}, + [0xFF1C]={d='on', m=0xFF1E}, + [0xFF1D]={d='on'}, + [0xFF1E]={d='on', m=0xFF1C}, + [0xFF1F]={d='on'}, + [0xFF20]={d='on'}, + [0xFF3B]={d='on', m=0xFF3D}, + [0xFF3C]={d='on'}, + [0xFF3D]={d='on', m=0xFF3B}, + [0xFF3E]={d='on'}, + [0xFF3F]={d='on'}, + [0xFF40]={d='on'}, + [0xFF5B]={d='on', m=0xFF5D}, + [0xFF5C]={d='on'}, + [0xFF5D]={d='on', m=0xFF5B}, + [0xFF5E]={d='on'}, + [0xFF5F]={d='on', m=0xFF60}, + [0xFF60]={d='on', m=0xFF5F}, + [0xFF61]={d='on'}, + [0xFF62]={d='on', m=0xFF63}, + [0xFF63]={d='on', m=0xFF62}, + [0xFF64]={d='on'}, + [0xFF65]={d='on'}, + [0xFFE0]={d='et'}, + [0xFFE1]={d='et'}, + [0xFFE2]={d='on'}, + [0xFFE3]={d='on'}, + [0xFFE4]={d='on'}, + [0xFFE5]={d='et'}, + [0xFFE6]={d='et'}, + [0xFFE8]={d='on'}, + [0xFFE9]={d='on'}, + [0xFFEA]={d='on'}, + [0xFFEB]={d='on'}, + [0xFFEC]={d='on'}, + [0xFFED]={d='on'}, + [0xFFEE]={d='on'}, + [0xFFF9]={d='on'}, + [0xFFFA]={d='on'}, + [0xFFFB]={d='on'}, + [0xFFFC]={d='on'}, + [0xFFFD]={d='on'}, + [0x10101]={d='on'}, + [0x10140]={d='on'}, + [0x10141]={d='on'}, + [0x10142]={d='on'}, + [0x10143]={d='on'}, + [0x10144]={d='on'}, + [0x10145]={d='on'}, + [0x10146]={d='on'}, + [0x10147]={d='on'}, + [0x10148]={d='on'}, + [0x10149]={d='on'}, + [0x1014A]={d='on'}, + [0x1014B]={d='on'}, + [0x1014C]={d='on'}, + [0x1014D]={d='on'}, + [0x1014E]={d='on'}, + [0x1014F]={d='on'}, + [0x10150]={d='on'}, + [0x10151]={d='on'}, + [0x10152]={d='on'}, + [0x10153]={d='on'}, + [0x10154]={d='on'}, + [0x10155]={d='on'}, + [0x10156]={d='on'}, + [0x10157]={d='on'}, + [0x10158]={d='on'}, + [0x10159]={d='on'}, + [0x1015A]={d='on'}, + [0x1015B]={d='on'}, + [0x1015C]={d='on'}, + [0x1015D]={d='on'}, + [0x1015E]={d='on'}, + [0x1015F]={d='on'}, + [0x10160]={d='on'}, + [0x10161]={d='on'}, + [0x10162]={d='on'}, + [0x10163]={d='on'}, + [0x10164]={d='on'}, + [0x10165]={d='on'}, + [0x10166]={d='on'}, + [0x10167]={d='on'}, + [0x10168]={d='on'}, + [0x10169]={d='on'}, + [0x1016A]={d='on'}, + [0x1016B]={d='on'}, + [0x1016C]={d='on'}, + [0x1016D]={d='on'}, + [0x1016E]={d='on'}, + [0x1016F]={d='on'}, + [0x10170]={d='on'}, + [0x10171]={d='on'}, + [0x10172]={d='on'}, + [0x10173]={d='on'}, + [0x10174]={d='on'}, + [0x10175]={d='on'}, + [0x10176]={d='on'}, + [0x10177]={d='on'}, + [0x10178]={d='on'}, + [0x10179]={d='on'}, + [0x1017A]={d='on'}, + [0x1017B]={d='on'}, + [0x1017C]={d='on'}, + [0x1017D]={d='on'}, + [0x1017E]={d='on'}, + [0x1017F]={d='on'}, + [0x10180]={d='on'}, + [0x10181]={d='on'}, + [0x10182]={d='on'}, + [0x10183]={d='on'}, + [0x10184]={d='on'}, + [0x10185]={d='on'}, + [0x10186]={d='on'}, + [0x10187]={d='on'}, + [0x10188]={d='on'}, + [0x10189]={d='on'}, + [0x1018A]={d='on'}, + [0x1018B]={d='on'}, + [0x1018C]={d='on'}, + [0x10190]={d='on'}, + [0x10191]={d='on'}, + [0x10192]={d='on'}, + [0x10193]={d='on'}, + [0x10194]={d='on'}, + [0x10195]={d='on'}, + [0x10196]={d='on'}, + [0x10197]={d='on'}, + [0x10198]={d='on'}, + [0x10199]={d='on'}, + [0x1019A]={d='on'}, + [0x1019B]={d='on'}, + [0x101A0]={d='on'}, + [0x101FD]={d='nsm'}, + [0x102E0]={d='nsm'}, + [0x102E1]={d='en'}, + [0x102E2]={d='en'}, + [0x102E3]={d='en'}, + [0x102E4]={d='en'}, + [0x102E5]={d='en'}, + [0x102E6]={d='en'}, + [0x102E7]={d='en'}, + [0x102E8]={d='en'}, + [0x102E9]={d='en'}, + [0x102EA]={d='en'}, + [0x102EB]={d='en'}, + [0x102EC]={d='en'}, + [0x102ED]={d='en'}, + [0x102EE]={d='en'}, + [0x102EF]={d='en'}, + [0x102F0]={d='en'}, + [0x102F1]={d='en'}, + [0x102F2]={d='en'}, + [0x102F3]={d='en'}, + [0x102F4]={d='en'}, + [0x102F5]={d='en'}, + [0x102F6]={d='en'}, + [0x102F7]={d='en'}, + [0x102F8]={d='en'}, + [0x102F9]={d='en'}, + [0x102FA]={d='en'}, + [0x102FB]={d='en'}, + [0x10376]={d='nsm'}, + [0x10377]={d='nsm'}, + [0x10378]={d='nsm'}, + [0x10379]={d='nsm'}, + [0x1037A]={d='nsm'}, + [0x1091F]={d='on'}, + [0x10A01]={d='nsm'}, + [0x10A02]={d='nsm'}, + [0x10A03]={d='nsm'}, + [0x10A05]={d='nsm'}, + [0x10A06]={d='nsm'}, + [0x10A0C]={d='nsm'}, + [0x10A0D]={d='nsm'}, + [0x10A0E]={d='nsm'}, + [0x10A0F]={d='nsm'}, + [0x10A38]={d='nsm'}, + [0x10A39]={d='nsm'}, + [0x10A3A]={d='nsm'}, + [0x10A3F]={d='nsm'}, + [0x10AE5]={d='nsm'}, + [0x10AE6]={d='nsm'}, + [0x10B39]={d='on'}, + [0x10B3A]={d='on'}, + [0x10B3B]={d='on'}, + [0x10B3C]={d='on'}, + [0x10B3D]={d='on'}, + [0x10B3E]={d='on'}, + [0x10B3F]={d='on'}, + [0x10C80]={d='r'}, + [0x10C81]={d='r'}, + [0x10C82]={d='r'}, + [0x10C83]={d='r'}, + [0x10C84]={d='r'}, + [0x10C85]={d='r'}, + [0x10C86]={d='r'}, + [0x10C87]={d='r'}, + [0x10C88]={d='r'}, + [0x10C89]={d='r'}, + [0x10C8A]={d='r'}, + [0x10C8B]={d='r'}, + [0x10C8C]={d='r'}, + [0x10C8D]={d='r'}, + [0x10C8E]={d='r'}, + [0x10C8F]={d='r'}, + [0x10C90]={d='r'}, + [0x10C91]={d='r'}, + [0x10C92]={d='r'}, + [0x10C93]={d='r'}, + [0x10C94]={d='r'}, + [0x10C95]={d='r'}, + [0x10C96]={d='r'}, + [0x10C97]={d='r'}, + [0x10C98]={d='r'}, + [0x10C99]={d='r'}, + [0x10C9A]={d='r'}, + [0x10C9B]={d='r'}, + [0x10C9C]={d='r'}, + [0x10C9D]={d='r'}, + [0x10C9E]={d='r'}, + [0x10C9F]={d='r'}, + [0x10CA0]={d='r'}, + [0x10CA1]={d='r'}, + [0x10CA2]={d='r'}, + [0x10CA3]={d='r'}, + [0x10CA4]={d='r'}, + [0x10CA5]={d='r'}, + [0x10CA6]={d='r'}, + [0x10CA7]={d='r'}, + [0x10CA8]={d='r'}, + [0x10CA9]={d='r'}, + [0x10CAA]={d='r'}, + [0x10CAB]={d='r'}, + [0x10CAC]={d='r'}, + [0x10CAD]={d='r'}, + [0x10CAE]={d='r'}, + [0x10CAF]={d='r'}, + [0x10CB0]={d='r'}, + [0x10CB1]={d='r'}, + [0x10CB2]={d='r'}, + [0x10CC0]={d='r'}, + [0x10CC1]={d='r'}, + [0x10CC2]={d='r'}, + [0x10CC3]={d='r'}, + [0x10CC4]={d='r'}, + [0x10CC5]={d='r'}, + [0x10CC6]={d='r'}, + [0x10CC7]={d='r'}, + [0x10CC8]={d='r'}, + [0x10CC9]={d='r'}, + [0x10CCA]={d='r'}, + [0x10CCB]={d='r'}, + [0x10CCC]={d='r'}, + [0x10CCD]={d='r'}, + [0x10CCE]={d='r'}, + [0x10CCF]={d='r'}, + [0x10CD0]={d='r'}, + [0x10CD1]={d='r'}, + [0x10CD2]={d='r'}, + [0x10CD3]={d='r'}, + [0x10CD4]={d='r'}, + [0x10CD5]={d='r'}, + [0x10CD6]={d='r'}, + [0x10CD7]={d='r'}, + [0x10CD8]={d='r'}, + [0x10CD9]={d='r'}, + [0x10CDA]={d='r'}, + [0x10CDB]={d='r'}, + [0x10CDC]={d='r'}, + [0x10CDD]={d='r'}, + [0x10CDE]={d='r'}, + [0x10CDF]={d='r'}, + [0x10CE0]={d='r'}, + [0x10CE1]={d='r'}, + [0x10CE2]={d='r'}, + [0x10CE3]={d='r'}, + [0x10CE4]={d='r'}, + [0x10CE5]={d='r'}, + [0x10CE6]={d='r'}, + [0x10CE7]={d='r'}, + [0x10CE8]={d='r'}, + [0x10CE9]={d='r'}, + [0x10CEA]={d='r'}, + [0x10CEB]={d='r'}, + [0x10CEC]={d='r'}, + [0x10CED]={d='r'}, + [0x10CEE]={d='r'}, + [0x10CEF]={d='r'}, + [0x10CF0]={d='r'}, + [0x10CF1]={d='r'}, + [0x10CF2]={d='r'}, + [0x10CFA]={d='r'}, + [0x10CFB]={d='r'}, + [0x10CFC]={d='r'}, + [0x10CFD]={d='r'}, + [0x10CFE]={d='r'}, + [0x10CFF]={d='r'}, + [0x10E60]={d='an'}, + [0x10E61]={d='an'}, + [0x10E62]={d='an'}, + [0x10E63]={d='an'}, + [0x10E64]={d='an'}, + [0x10E65]={d='an'}, + [0x10E66]={d='an'}, + [0x10E67]={d='an'}, + [0x10E68]={d='an'}, + [0x10E69]={d='an'}, + [0x10E6A]={d='an'}, + [0x10E6B]={d='an'}, + [0x10E6C]={d='an'}, + [0x10E6D]={d='an'}, + [0x10E6E]={d='an'}, + [0x10E6F]={d='an'}, + [0x10E70]={d='an'}, + [0x10E71]={d='an'}, + [0x10E72]={d='an'}, + [0x10E73]={d='an'}, + [0x10E74]={d='an'}, + [0x10E75]={d='an'}, + [0x10E76]={d='an'}, + [0x10E77]={d='an'}, + [0x10E78]={d='an'}, + [0x10E79]={d='an'}, + [0x10E7A]={d='an'}, + [0x10E7B]={d='an'}, + [0x10E7C]={d='an'}, + [0x10E7D]={d='an'}, + [0x10E7E]={d='an'}, + [0x11001]={d='nsm'}, + [0x11038]={d='nsm'}, + [0x11039]={d='nsm'}, + [0x1103A]={d='nsm'}, + [0x1103B]={d='nsm'}, + [0x1103C]={d='nsm'}, + [0x1103D]={d='nsm'}, + [0x1103E]={d='nsm'}, + [0x1103F]={d='nsm'}, + [0x11040]={d='nsm'}, + [0x11041]={d='nsm'}, + [0x11042]={d='nsm'}, + [0x11043]={d='nsm'}, + [0x11044]={d='nsm'}, + [0x11045]={d='nsm'}, + [0x11046]={d='nsm'}, + [0x11052]={d='on'}, + [0x11053]={d='on'}, + [0x11054]={d='on'}, + [0x11055]={d='on'}, + [0x11056]={d='on'}, + [0x11057]={d='on'}, + [0x11058]={d='on'}, + [0x11059]={d='on'}, + [0x1105A]={d='on'}, + [0x1105B]={d='on'}, + [0x1105C]={d='on'}, + [0x1105D]={d='on'}, + [0x1105E]={d='on'}, + [0x1105F]={d='on'}, + [0x11060]={d='on'}, + [0x11061]={d='on'}, + [0x11062]={d='on'}, + [0x11063]={d='on'}, + [0x11064]={d='on'}, + [0x11065]={d='on'}, + [0x1107F]={d='nsm'}, + [0x11080]={d='nsm'}, + [0x11081]={d='nsm'}, + [0x110B3]={d='nsm'}, + [0x110B4]={d='nsm'}, + [0x110B5]={d='nsm'}, + [0x110B6]={d='nsm'}, + [0x110B9]={d='nsm'}, + [0x110BA]={d='nsm'}, + [0x11100]={d='nsm'}, + [0x11101]={d='nsm'}, + [0x11102]={d='nsm'}, + [0x11127]={d='nsm'}, + [0x11128]={d='nsm'}, + [0x11129]={d='nsm'}, + [0x1112A]={d='nsm'}, + [0x1112B]={d='nsm'}, + [0x1112D]={d='nsm'}, + [0x1112E]={d='nsm'}, + [0x1112F]={d='nsm'}, + [0x11130]={d='nsm'}, + [0x11131]={d='nsm'}, + [0x11132]={d='nsm'}, + [0x11133]={d='nsm'}, + [0x11134]={d='nsm'}, + [0x11173]={d='nsm'}, + [0x11180]={d='nsm'}, + [0x11181]={d='nsm'}, + [0x111B6]={d='nsm'}, + [0x111B7]={d='nsm'}, + [0x111B8]={d='nsm'}, + [0x111B9]={d='nsm'}, + [0x111BA]={d='nsm'}, + [0x111BB]={d='nsm'}, + [0x111BC]={d='nsm'}, + [0x111BD]={d='nsm'}, + [0x111BE]={d='nsm'}, + [0x111CA]={d='nsm'}, + [0x111CB]={d='nsm'}, + [0x111CC]={d='nsm'}, + [0x1122F]={d='nsm'}, + [0x11230]={d='nsm'}, + [0x11231]={d='nsm'}, + [0x11234]={d='nsm'}, + [0x11236]={d='nsm'}, + [0x11237]={d='nsm'}, + [0x1123E]={d='nsm'}, + [0x112DF]={d='nsm'}, + [0x112E3]={d='nsm'}, + [0x112E4]={d='nsm'}, + [0x112E5]={d='nsm'}, + [0x112E6]={d='nsm'}, + [0x112E7]={d='nsm'}, + [0x112E8]={d='nsm'}, + [0x112E9]={d='nsm'}, + [0x112EA]={d='nsm'}, + [0x11300]={d='nsm'}, + [0x11301]={d='nsm'}, + [0x1133C]={d='nsm'}, + [0x11340]={d='nsm'}, + [0x11366]={d='nsm'}, + [0x11367]={d='nsm'}, + [0x11368]={d='nsm'}, + [0x11369]={d='nsm'}, + [0x1136A]={d='nsm'}, + [0x1136B]={d='nsm'}, + [0x1136C]={d='nsm'}, + [0x11370]={d='nsm'}, + [0x11371]={d='nsm'}, + [0x11372]={d='nsm'}, + [0x11373]={d='nsm'}, + [0x11374]={d='nsm'}, + [0x11438]={d='nsm'}, + [0x11439]={d='nsm'}, + [0x1143A]={d='nsm'}, + [0x1143B]={d='nsm'}, + [0x1143C]={d='nsm'}, + [0x1143D]={d='nsm'}, + [0x1143E]={d='nsm'}, + [0x1143F]={d='nsm'}, + [0x11442]={d='nsm'}, + [0x11443]={d='nsm'}, + [0x11444]={d='nsm'}, + [0x11446]={d='nsm'}, + [0x114B3]={d='nsm'}, + [0x114B4]={d='nsm'}, + [0x114B5]={d='nsm'}, + [0x114B6]={d='nsm'}, + [0x114B7]={d='nsm'}, + [0x114B8]={d='nsm'}, + [0x114BA]={d='nsm'}, + [0x114BF]={d='nsm'}, + [0x114C0]={d='nsm'}, + [0x114C2]={d='nsm'}, + [0x114C3]={d='nsm'}, + [0x115B2]={d='nsm'}, + [0x115B3]={d='nsm'}, + [0x115B4]={d='nsm'}, + [0x115B5]={d='nsm'}, + [0x115BC]={d='nsm'}, + [0x115BD]={d='nsm'}, + [0x115BF]={d='nsm'}, + [0x115C0]={d='nsm'}, + [0x115DC]={d='nsm'}, + [0x115DD]={d='nsm'}, + [0x11633]={d='nsm'}, + [0x11634]={d='nsm'}, + [0x11635]={d='nsm'}, + [0x11636]={d='nsm'}, + [0x11637]={d='nsm'}, + [0x11638]={d='nsm'}, + [0x11639]={d='nsm'}, + [0x1163A]={d='nsm'}, + [0x1163D]={d='nsm'}, + [0x1163F]={d='nsm'}, + [0x11640]={d='nsm'}, + [0x11660]={d='on'}, + [0x11661]={d='on'}, + [0x11662]={d='on'}, + [0x11663]={d='on'}, + [0x11664]={d='on'}, + [0x11665]={d='on'}, + [0x11666]={d='on'}, + [0x11667]={d='on'}, + [0x11668]={d='on'}, + [0x11669]={d='on'}, + [0x1166A]={d='on'}, + [0x1166B]={d='on'}, + [0x1166C]={d='on'}, + [0x116AB]={d='nsm'}, + [0x116AD]={d='nsm'}, + [0x116B0]={d='nsm'}, + [0x116B1]={d='nsm'}, + [0x116B2]={d='nsm'}, + [0x116B3]={d='nsm'}, + [0x116B4]={d='nsm'}, + [0x116B5]={d='nsm'}, + [0x116B7]={d='nsm'}, + [0x1171D]={d='nsm'}, + [0x1171E]={d='nsm'}, + [0x1171F]={d='nsm'}, + [0x11722]={d='nsm'}, + [0x11723]={d='nsm'}, + [0x11724]={d='nsm'}, + [0x11725]={d='nsm'}, + [0x11727]={d='nsm'}, + [0x11728]={d='nsm'}, + [0x11729]={d='nsm'}, + [0x1172A]={d='nsm'}, + [0x1172B]={d='nsm'}, + [0x11C30]={d='nsm'}, + [0x11C31]={d='nsm'}, + [0x11C32]={d='nsm'}, + [0x11C33]={d='nsm'}, + [0x11C34]={d='nsm'}, + [0x11C35]={d='nsm'}, + [0x11C36]={d='nsm'}, + [0x11C38]={d='nsm'}, + [0x11C39]={d='nsm'}, + [0x11C3A]={d='nsm'}, + [0x11C3B]={d='nsm'}, + [0x11C3C]={d='nsm'}, + [0x11C3D]={d='nsm'}, + [0x11C92]={d='nsm'}, + [0x11C93]={d='nsm'}, + [0x11C94]={d='nsm'}, + [0x11C95]={d='nsm'}, + [0x11C96]={d='nsm'}, + [0x11C97]={d='nsm'}, + [0x11C98]={d='nsm'}, + [0x11C99]={d='nsm'}, + [0x11C9A]={d='nsm'}, + [0x11C9B]={d='nsm'}, + [0x11C9C]={d='nsm'}, + [0x11C9D]={d='nsm'}, + [0x11C9E]={d='nsm'}, + [0x11C9F]={d='nsm'}, + [0x11CA0]={d='nsm'}, + [0x11CA1]={d='nsm'}, + [0x11CA2]={d='nsm'}, + [0x11CA3]={d='nsm'}, + [0x11CA4]={d='nsm'}, + [0x11CA5]={d='nsm'}, + [0x11CA6]={d='nsm'}, + [0x11CA7]={d='nsm'}, + [0x11CAA]={d='nsm'}, + [0x11CAB]={d='nsm'}, + [0x11CAC]={d='nsm'}, + [0x11CAD]={d='nsm'}, + [0x11CAE]={d='nsm'}, + [0x11CAF]={d='nsm'}, + [0x11CB0]={d='nsm'}, + [0x11CB2]={d='nsm'}, + [0x11CB3]={d='nsm'}, + [0x11CB5]={d='nsm'}, + [0x11CB6]={d='nsm'}, + [0x16AF0]={d='nsm'}, + [0x16AF1]={d='nsm'}, + [0x16AF2]={d='nsm'}, + [0x16AF3]={d='nsm'}, + [0x16AF4]={d='nsm'}, + [0x16B30]={d='nsm'}, + [0x16B31]={d='nsm'}, + [0x16B32]={d='nsm'}, + [0x16B33]={d='nsm'}, + [0x16B34]={d='nsm'}, + [0x16B35]={d='nsm'}, + [0x16B36]={d='nsm'}, + [0x16F8F]={d='nsm'}, + [0x16F90]={d='nsm'}, + [0x16F91]={d='nsm'}, + [0x16F92]={d='nsm'}, + [0x1BC9D]={d='nsm'}, + [0x1BC9E]={d='nsm'}, + [0x1BCA0]={d='bn'}, + [0x1BCA1]={d='bn'}, + [0x1BCA2]={d='bn'}, + [0x1BCA3]={d='bn'}, + [0x1D167]={d='nsm'}, + [0x1D168]={d='nsm'}, + [0x1D169]={d='nsm'}, + [0x1D173]={d='bn'}, + [0x1D174]={d='bn'}, + [0x1D175]={d='bn'}, + [0x1D176]={d='bn'}, + [0x1D177]={d='bn'}, + [0x1D178]={d='bn'}, + [0x1D179]={d='bn'}, + [0x1D17A]={d='bn'}, + [0x1D17B]={d='nsm'}, + [0x1D17C]={d='nsm'}, + [0x1D17D]={d='nsm'}, + [0x1D17E]={d='nsm'}, + [0x1D17F]={d='nsm'}, + [0x1D180]={d='nsm'}, + [0x1D181]={d='nsm'}, + [0x1D182]={d='nsm'}, + [0x1D185]={d='nsm'}, + [0x1D186]={d='nsm'}, + [0x1D187]={d='nsm'}, + [0x1D188]={d='nsm'}, + [0x1D189]={d='nsm'}, + [0x1D18A]={d='nsm'}, + [0x1D18B]={d='nsm'}, + [0x1D1AA]={d='nsm'}, + [0x1D1AB]={d='nsm'}, + [0x1D1AC]={d='nsm'}, + [0x1D1AD]={d='nsm'}, + [0x1D200]={d='on'}, + [0x1D201]={d='on'}, + [0x1D202]={d='on'}, + [0x1D203]={d='on'}, + [0x1D204]={d='on'}, + [0x1D205]={d='on'}, + [0x1D206]={d='on'}, + [0x1D207]={d='on'}, + [0x1D208]={d='on'}, + [0x1D209]={d='on'}, + [0x1D20A]={d='on'}, + [0x1D20B]={d='on'}, + [0x1D20C]={d='on'}, + [0x1D20D]={d='on'}, + [0x1D20E]={d='on'}, + [0x1D20F]={d='on'}, + [0x1D210]={d='on'}, + [0x1D211]={d='on'}, + [0x1D212]={d='on'}, + [0x1D213]={d='on'}, + [0x1D214]={d='on'}, + [0x1D215]={d='on'}, + [0x1D216]={d='on'}, + [0x1D217]={d='on'}, + [0x1D218]={d='on'}, + [0x1D219]={d='on'}, + [0x1D21A]={d='on'}, + [0x1D21B]={d='on'}, + [0x1D21C]={d='on'}, + [0x1D21D]={d='on'}, + [0x1D21E]={d='on'}, + [0x1D21F]={d='on'}, + [0x1D220]={d='on'}, + [0x1D221]={d='on'}, + [0x1D222]={d='on'}, + [0x1D223]={d='on'}, + [0x1D224]={d='on'}, + [0x1D225]={d='on'}, + [0x1D226]={d='on'}, + [0x1D227]={d='on'}, + [0x1D228]={d='on'}, + [0x1D229]={d='on'}, + [0x1D22A]={d='on'}, + [0x1D22B]={d='on'}, + [0x1D22C]={d='on'}, + [0x1D22D]={d='on'}, + [0x1D22E]={d='on'}, + [0x1D22F]={d='on'}, + [0x1D230]={d='on'}, + [0x1D231]={d='on'}, + [0x1D232]={d='on'}, + [0x1D233]={d='on'}, + [0x1D234]={d='on'}, + [0x1D235]={d='on'}, + [0x1D236]={d='on'}, + [0x1D237]={d='on'}, + [0x1D238]={d='on'}, + [0x1D239]={d='on'}, + [0x1D23A]={d='on'}, + [0x1D23B]={d='on'}, + [0x1D23C]={d='on'}, + [0x1D23D]={d='on'}, + [0x1D23E]={d='on'}, + [0x1D23F]={d='on'}, + [0x1D240]={d='on'}, + [0x1D241]={d='on'}, + [0x1D242]={d='nsm'}, + [0x1D243]={d='nsm'}, + [0x1D244]={d='nsm'}, + [0x1D245]={d='on'}, + [0x1D300]={d='on'}, + [0x1D301]={d='on'}, + [0x1D302]={d='on'}, + [0x1D303]={d='on'}, + [0x1D304]={d='on'}, + [0x1D305]={d='on'}, + [0x1D306]={d='on'}, + [0x1D307]={d='on'}, + [0x1D308]={d='on'}, + [0x1D309]={d='on'}, + [0x1D30A]={d='on'}, + [0x1D30B]={d='on'}, + [0x1D30C]={d='on'}, + [0x1D30D]={d='on'}, + [0x1D30E]={d='on'}, + [0x1D30F]={d='on'}, + [0x1D310]={d='on'}, + [0x1D311]={d='on'}, + [0x1D312]={d='on'}, + [0x1D313]={d='on'}, + [0x1D314]={d='on'}, + [0x1D315]={d='on'}, + [0x1D316]={d='on'}, + [0x1D317]={d='on'}, + [0x1D318]={d='on'}, + [0x1D319]={d='on'}, + [0x1D31A]={d='on'}, + [0x1D31B]={d='on'}, + [0x1D31C]={d='on'}, + [0x1D31D]={d='on'}, + [0x1D31E]={d='on'}, + [0x1D31F]={d='on'}, + [0x1D320]={d='on'}, + [0x1D321]={d='on'}, + [0x1D322]={d='on'}, + [0x1D323]={d='on'}, + [0x1D324]={d='on'}, + [0x1D325]={d='on'}, + [0x1D326]={d='on'}, + [0x1D327]={d='on'}, + [0x1D328]={d='on'}, + [0x1D329]={d='on'}, + [0x1D32A]={d='on'}, + [0x1D32B]={d='on'}, + [0x1D32C]={d='on'}, + [0x1D32D]={d='on'}, + [0x1D32E]={d='on'}, + [0x1D32F]={d='on'}, + [0x1D330]={d='on'}, + [0x1D331]={d='on'}, + [0x1D332]={d='on'}, + [0x1D333]={d='on'}, + [0x1D334]={d='on'}, + [0x1D335]={d='on'}, + [0x1D336]={d='on'}, + [0x1D337]={d='on'}, + [0x1D338]={d='on'}, + [0x1D339]={d='on'}, + [0x1D33A]={d='on'}, + [0x1D33B]={d='on'}, + [0x1D33C]={d='on'}, + [0x1D33D]={d='on'}, + [0x1D33E]={d='on'}, + [0x1D33F]={d='on'}, + [0x1D340]={d='on'}, + [0x1D341]={d='on'}, + [0x1D342]={d='on'}, + [0x1D343]={d='on'}, + [0x1D344]={d='on'}, + [0x1D345]={d='on'}, + [0x1D346]={d='on'}, + [0x1D347]={d='on'}, + [0x1D348]={d='on'}, + [0x1D349]={d='on'}, + [0x1D34A]={d='on'}, + [0x1D34B]={d='on'}, + [0x1D34C]={d='on'}, + [0x1D34D]={d='on'}, + [0x1D34E]={d='on'}, + [0x1D34F]={d='on'}, + [0x1D350]={d='on'}, + [0x1D351]={d='on'}, + [0x1D352]={d='on'}, + [0x1D353]={d='on'}, + [0x1D354]={d='on'}, + [0x1D355]={d='on'}, + [0x1D356]={d='on'}, + [0x1D6DB]={d='on'}, + [0x1D715]={d='on'}, + [0x1D74F]={d='on'}, + [0x1D789]={d='on'}, + [0x1D7C3]={d='on'}, + [0x1D7CE]={d='en'}, + [0x1D7CF]={d='en'}, + [0x1D7D0]={d='en'}, + [0x1D7D1]={d='en'}, + [0x1D7D2]={d='en'}, + [0x1D7D3]={d='en'}, + [0x1D7D4]={d='en'}, + [0x1D7D5]={d='en'}, + [0x1D7D6]={d='en'}, + [0x1D7D7]={d='en'}, + [0x1D7D8]={d='en'}, + [0x1D7D9]={d='en'}, + [0x1D7DA]={d='en'}, + [0x1D7DB]={d='en'}, + [0x1D7DC]={d='en'}, + [0x1D7DD]={d='en'}, + [0x1D7DE]={d='en'}, + [0x1D7DF]={d='en'}, + [0x1D7E0]={d='en'}, + [0x1D7E1]={d='en'}, + [0x1D7E2]={d='en'}, + [0x1D7E3]={d='en'}, + [0x1D7E4]={d='en'}, + [0x1D7E5]={d='en'}, + [0x1D7E6]={d='en'}, + [0x1D7E7]={d='en'}, + [0x1D7E8]={d='en'}, + [0x1D7E9]={d='en'}, + [0x1D7EA]={d='en'}, + [0x1D7EB]={d='en'}, + [0x1D7EC]={d='en'}, + [0x1D7ED]={d='en'}, + [0x1D7EE]={d='en'}, + [0x1D7EF]={d='en'}, + [0x1D7F0]={d='en'}, + [0x1D7F1]={d='en'}, + [0x1D7F2]={d='en'}, + [0x1D7F3]={d='en'}, + [0x1D7F4]={d='en'}, + [0x1D7F5]={d='en'}, + [0x1D7F6]={d='en'}, + [0x1D7F7]={d='en'}, + [0x1D7F8]={d='en'}, + [0x1D7F9]={d='en'}, + [0x1D7FA]={d='en'}, + [0x1D7FB]={d='en'}, + [0x1D7FC]={d='en'}, + [0x1D7FD]={d='en'}, + [0x1D7FE]={d='en'}, + [0x1D7FF]={d='en'}, + [0x1DA00]={d='nsm'}, + [0x1DA01]={d='nsm'}, + [0x1DA02]={d='nsm'}, + [0x1DA03]={d='nsm'}, + [0x1DA04]={d='nsm'}, + [0x1DA05]={d='nsm'}, + [0x1DA06]={d='nsm'}, + [0x1DA07]={d='nsm'}, + [0x1DA08]={d='nsm'}, + [0x1DA09]={d='nsm'}, + [0x1DA0A]={d='nsm'}, + [0x1DA0B]={d='nsm'}, + [0x1DA0C]={d='nsm'}, + [0x1DA0D]={d='nsm'}, + [0x1DA0E]={d='nsm'}, + [0x1DA0F]={d='nsm'}, + [0x1DA10]={d='nsm'}, + [0x1DA11]={d='nsm'}, + [0x1DA12]={d='nsm'}, + [0x1DA13]={d='nsm'}, + [0x1DA14]={d='nsm'}, + [0x1DA15]={d='nsm'}, + [0x1DA16]={d='nsm'}, + [0x1DA17]={d='nsm'}, + [0x1DA18]={d='nsm'}, + [0x1DA19]={d='nsm'}, + [0x1DA1A]={d='nsm'}, + [0x1DA1B]={d='nsm'}, + [0x1DA1C]={d='nsm'}, + [0x1DA1D]={d='nsm'}, + [0x1DA1E]={d='nsm'}, + [0x1DA1F]={d='nsm'}, + [0x1DA20]={d='nsm'}, + [0x1DA21]={d='nsm'}, + [0x1DA22]={d='nsm'}, + [0x1DA23]={d='nsm'}, + [0x1DA24]={d='nsm'}, + [0x1DA25]={d='nsm'}, + [0x1DA26]={d='nsm'}, + [0x1DA27]={d='nsm'}, + [0x1DA28]={d='nsm'}, + [0x1DA29]={d='nsm'}, + [0x1DA2A]={d='nsm'}, + [0x1DA2B]={d='nsm'}, + [0x1DA2C]={d='nsm'}, + [0x1DA2D]={d='nsm'}, + [0x1DA2E]={d='nsm'}, + [0x1DA2F]={d='nsm'}, + [0x1DA30]={d='nsm'}, + [0x1DA31]={d='nsm'}, + [0x1DA32]={d='nsm'}, + [0x1DA33]={d='nsm'}, + [0x1DA34]={d='nsm'}, + [0x1DA35]={d='nsm'}, + [0x1DA36]={d='nsm'}, + [0x1DA3B]={d='nsm'}, + [0x1DA3C]={d='nsm'}, + [0x1DA3D]={d='nsm'}, + [0x1DA3E]={d='nsm'}, + [0x1DA3F]={d='nsm'}, + [0x1DA40]={d='nsm'}, + [0x1DA41]={d='nsm'}, + [0x1DA42]={d='nsm'}, + [0x1DA43]={d='nsm'}, + [0x1DA44]={d='nsm'}, + [0x1DA45]={d='nsm'}, + [0x1DA46]={d='nsm'}, + [0x1DA47]={d='nsm'}, + [0x1DA48]={d='nsm'}, + [0x1DA49]={d='nsm'}, + [0x1DA4A]={d='nsm'}, + [0x1DA4B]={d='nsm'}, + [0x1DA4C]={d='nsm'}, + [0x1DA4D]={d='nsm'}, + [0x1DA4E]={d='nsm'}, + [0x1DA4F]={d='nsm'}, + [0x1DA50]={d='nsm'}, + [0x1DA51]={d='nsm'}, + [0x1DA52]={d='nsm'}, + [0x1DA53]={d='nsm'}, + [0x1DA54]={d='nsm'}, + [0x1DA55]={d='nsm'}, + [0x1DA56]={d='nsm'}, + [0x1DA57]={d='nsm'}, + [0x1DA58]={d='nsm'}, + [0x1DA59]={d='nsm'}, + [0x1DA5A]={d='nsm'}, + [0x1DA5B]={d='nsm'}, + [0x1DA5C]={d='nsm'}, + [0x1DA5D]={d='nsm'}, + [0x1DA5E]={d='nsm'}, + [0x1DA5F]={d='nsm'}, + [0x1DA60]={d='nsm'}, + [0x1DA61]={d='nsm'}, + [0x1DA62]={d='nsm'}, + [0x1DA63]={d='nsm'}, + [0x1DA64]={d='nsm'}, + [0x1DA65]={d='nsm'}, + [0x1DA66]={d='nsm'}, + [0x1DA67]={d='nsm'}, + [0x1DA68]={d='nsm'}, + [0x1DA69]={d='nsm'}, + [0x1DA6A]={d='nsm'}, + [0x1DA6B]={d='nsm'}, + [0x1DA6C]={d='nsm'}, + [0x1DA75]={d='nsm'}, + [0x1DA84]={d='nsm'}, + [0x1DA9B]={d='nsm'}, + [0x1DA9C]={d='nsm'}, + [0x1DA9D]={d='nsm'}, + [0x1DA9E]={d='nsm'}, + [0x1DA9F]={d='nsm'}, + [0x1DAA1]={d='nsm'}, + [0x1DAA2]={d='nsm'}, + [0x1DAA3]={d='nsm'}, + [0x1DAA4]={d='nsm'}, + [0x1DAA5]={d='nsm'}, + [0x1DAA6]={d='nsm'}, + [0x1DAA7]={d='nsm'}, + [0x1DAA8]={d='nsm'}, + [0x1DAA9]={d='nsm'}, + [0x1DAAA]={d='nsm'}, + [0x1DAAB]={d='nsm'}, + [0x1DAAC]={d='nsm'}, + [0x1DAAD]={d='nsm'}, + [0x1DAAE]={d='nsm'}, + [0x1DAAF]={d='nsm'}, + [0x1E000]={d='nsm'}, + [0x1E001]={d='nsm'}, + [0x1E002]={d='nsm'}, + [0x1E003]={d='nsm'}, + [0x1E004]={d='nsm'}, + [0x1E005]={d='nsm'}, + [0x1E006]={d='nsm'}, + [0x1E008]={d='nsm'}, + [0x1E009]={d='nsm'}, + [0x1E00A]={d='nsm'}, + [0x1E00B]={d='nsm'}, + [0x1E00C]={d='nsm'}, + [0x1E00D]={d='nsm'}, + [0x1E00E]={d='nsm'}, + [0x1E00F]={d='nsm'}, + [0x1E010]={d='nsm'}, + [0x1E011]={d='nsm'}, + [0x1E012]={d='nsm'}, + [0x1E013]={d='nsm'}, + [0x1E014]={d='nsm'}, + [0x1E015]={d='nsm'}, + [0x1E016]={d='nsm'}, + [0x1E017]={d='nsm'}, + [0x1E018]={d='nsm'}, + [0x1E01B]={d='nsm'}, + [0x1E01C]={d='nsm'}, + [0x1E01D]={d='nsm'}, + [0x1E01E]={d='nsm'}, + [0x1E01F]={d='nsm'}, + [0x1E020]={d='nsm'}, + [0x1E021]={d='nsm'}, + [0x1E023]={d='nsm'}, + [0x1E024]={d='nsm'}, + [0x1E026]={d='nsm'}, + [0x1E027]={d='nsm'}, + [0x1E028]={d='nsm'}, + [0x1E029]={d='nsm'}, + [0x1E02A]={d='nsm'}, + [0x1E8D0]={d='nsm'}, + [0x1E8D1]={d='nsm'}, + [0x1E8D2]={d='nsm'}, + [0x1E8D3]={d='nsm'}, + [0x1E8D4]={d='nsm'}, + [0x1E8D5]={d='nsm'}, + [0x1E8D6]={d='nsm'}, + [0x1E944]={d='nsm'}, + [0x1E945]={d='nsm'}, + [0x1E946]={d='nsm'}, + [0x1E947]={d='nsm'}, + [0x1E948]={d='nsm'}, + [0x1E949]={d='nsm'}, + [0x1E94A]={d='nsm'}, + [0x1EE00]={d='al'}, + [0x1EE01]={d='al'}, + [0x1EE02]={d='al'}, + [0x1EE03]={d='al'}, + [0x1EE05]={d='al'}, + [0x1EE06]={d='al'}, + [0x1EE07]={d='al'}, + [0x1EE08]={d='al'}, + [0x1EE09]={d='al'}, + [0x1EE0A]={d='al'}, + [0x1EE0B]={d='al'}, + [0x1EE0C]={d='al'}, + [0x1EE0D]={d='al'}, + [0x1EE0E]={d='al'}, + [0x1EE0F]={d='al'}, + [0x1EE10]={d='al'}, + [0x1EE11]={d='al'}, + [0x1EE12]={d='al'}, + [0x1EE13]={d='al'}, + [0x1EE14]={d='al'}, + [0x1EE15]={d='al'}, + [0x1EE16]={d='al'}, + [0x1EE17]={d='al'}, + [0x1EE18]={d='al'}, + [0x1EE19]={d='al'}, + [0x1EE1A]={d='al'}, + [0x1EE1B]={d='al'}, + [0x1EE1C]={d='al'}, + [0x1EE1D]={d='al'}, + [0x1EE1E]={d='al'}, + [0x1EE1F]={d='al'}, + [0x1EE21]={d='al'}, + [0x1EE22]={d='al'}, + [0x1EE24]={d='al'}, + [0x1EE27]={d='al'}, + [0x1EE29]={d='al'}, + [0x1EE2A]={d='al'}, + [0x1EE2B]={d='al'}, + [0x1EE2C]={d='al'}, + [0x1EE2D]={d='al'}, + [0x1EE2E]={d='al'}, + [0x1EE2F]={d='al'}, + [0x1EE30]={d='al'}, + [0x1EE31]={d='al'}, + [0x1EE32]={d='al'}, + [0x1EE34]={d='al'}, + [0x1EE35]={d='al'}, + [0x1EE36]={d='al'}, + [0x1EE37]={d='al'}, + [0x1EE39]={d='al'}, + [0x1EE3B]={d='al'}, + [0x1EE42]={d='al'}, + [0x1EE47]={d='al'}, + [0x1EE49]={d='al'}, + [0x1EE4B]={d='al'}, + [0x1EE4D]={d='al'}, + [0x1EE4E]={d='al'}, + [0x1EE4F]={d='al'}, + [0x1EE51]={d='al'}, + [0x1EE52]={d='al'}, + [0x1EE54]={d='al'}, + [0x1EE57]={d='al'}, + [0x1EE59]={d='al'}, + [0x1EE5B]={d='al'}, + [0x1EE5D]={d='al'}, + [0x1EE5F]={d='al'}, + [0x1EE61]={d='al'}, + [0x1EE62]={d='al'}, + [0x1EE64]={d='al'}, + [0x1EE67]={d='al'}, + [0x1EE68]={d='al'}, + [0x1EE69]={d='al'}, + [0x1EE6A]={d='al'}, + [0x1EE6C]={d='al'}, + [0x1EE6D]={d='al'}, + [0x1EE6E]={d='al'}, + [0x1EE6F]={d='al'}, + [0x1EE70]={d='al'}, + [0x1EE71]={d='al'}, + [0x1EE72]={d='al'}, + [0x1EE74]={d='al'}, + [0x1EE75]={d='al'}, + [0x1EE76]={d='al'}, + [0x1EE77]={d='al'}, + [0x1EE79]={d='al'}, + [0x1EE7A]={d='al'}, + [0x1EE7B]={d='al'}, + [0x1EE7C]={d='al'}, + [0x1EE7E]={d='al'}, + [0x1EE80]={d='al'}, + [0x1EE81]={d='al'}, + [0x1EE82]={d='al'}, + [0x1EE83]={d='al'}, + [0x1EE84]={d='al'}, + [0x1EE85]={d='al'}, + [0x1EE86]={d='al'}, + [0x1EE87]={d='al'}, + [0x1EE88]={d='al'}, + [0x1EE89]={d='al'}, + [0x1EE8B]={d='al'}, + [0x1EE8C]={d='al'}, + [0x1EE8D]={d='al'}, + [0x1EE8E]={d='al'}, + [0x1EE8F]={d='al'}, + [0x1EE90]={d='al'}, + [0x1EE91]={d='al'}, + [0x1EE92]={d='al'}, + [0x1EE93]={d='al'}, + [0x1EE94]={d='al'}, + [0x1EE95]={d='al'}, + [0x1EE96]={d='al'}, + [0x1EE97]={d='al'}, + [0x1EE98]={d='al'}, + [0x1EE99]={d='al'}, + [0x1EE9A]={d='al'}, + [0x1EE9B]={d='al'}, + [0x1EEA1]={d='al'}, + [0x1EEA2]={d='al'}, + [0x1EEA3]={d='al'}, + [0x1EEA5]={d='al'}, + [0x1EEA6]={d='al'}, + [0x1EEA7]={d='al'}, + [0x1EEA8]={d='al'}, + [0x1EEA9]={d='al'}, + [0x1EEAB]={d='al'}, + [0x1EEAC]={d='al'}, + [0x1EEAD]={d='al'}, + [0x1EEAE]={d='al'}, + [0x1EEAF]={d='al'}, + [0x1EEB0]={d='al'}, + [0x1EEB1]={d='al'}, + [0x1EEB2]={d='al'}, + [0x1EEB3]={d='al'}, + [0x1EEB4]={d='al'}, + [0x1EEB5]={d='al'}, + [0x1EEB6]={d='al'}, + [0x1EEB7]={d='al'}, + [0x1EEB8]={d='al'}, + [0x1EEB9]={d='al'}, + [0x1EEBA]={d='al'}, + [0x1EEBB]={d='al'}, + [0x1EEF0]={d='on'}, + [0x1EEF1]={d='on'}, + [0x1F000]={d='on'}, + [0x1F001]={d='on'}, + [0x1F002]={d='on'}, + [0x1F003]={d='on'}, + [0x1F004]={d='on'}, + [0x1F005]={d='on'}, + [0x1F006]={d='on'}, + [0x1F007]={d='on'}, + [0x1F008]={d='on'}, + [0x1F009]={d='on'}, + [0x1F00A]={d='on'}, + [0x1F00B]={d='on'}, + [0x1F00C]={d='on'}, + [0x1F00D]={d='on'}, + [0x1F00E]={d='on'}, + [0x1F00F]={d='on'}, + [0x1F010]={d='on'}, + [0x1F011]={d='on'}, + [0x1F012]={d='on'}, + [0x1F013]={d='on'}, + [0x1F014]={d='on'}, + [0x1F015]={d='on'}, + [0x1F016]={d='on'}, + [0x1F017]={d='on'}, + [0x1F018]={d='on'}, + [0x1F019]={d='on'}, + [0x1F01A]={d='on'}, + [0x1F01B]={d='on'}, + [0x1F01C]={d='on'}, + [0x1F01D]={d='on'}, + [0x1F01E]={d='on'}, + [0x1F01F]={d='on'}, + [0x1F020]={d='on'}, + [0x1F021]={d='on'}, + [0x1F022]={d='on'}, + [0x1F023]={d='on'}, + [0x1F024]={d='on'}, + [0x1F025]={d='on'}, + [0x1F026]={d='on'}, + [0x1F027]={d='on'}, + [0x1F028]={d='on'}, + [0x1F029]={d='on'}, + [0x1F02A]={d='on'}, + [0x1F02B]={d='on'}, + [0x1F030]={d='on'}, + [0x1F031]={d='on'}, + [0x1F032]={d='on'}, + [0x1F033]={d='on'}, + [0x1F034]={d='on'}, + [0x1F035]={d='on'}, + [0x1F036]={d='on'}, + [0x1F037]={d='on'}, + [0x1F038]={d='on'}, + [0x1F039]={d='on'}, + [0x1F03A]={d='on'}, + [0x1F03B]={d='on'}, + [0x1F03C]={d='on'}, + [0x1F03D]={d='on'}, + [0x1F03E]={d='on'}, + [0x1F03F]={d='on'}, + [0x1F040]={d='on'}, + [0x1F041]={d='on'}, + [0x1F042]={d='on'}, + [0x1F043]={d='on'}, + [0x1F044]={d='on'}, + [0x1F045]={d='on'}, + [0x1F046]={d='on'}, + [0x1F047]={d='on'}, + [0x1F048]={d='on'}, + [0x1F049]={d='on'}, + [0x1F04A]={d='on'}, + [0x1F04B]={d='on'}, + [0x1F04C]={d='on'}, + [0x1F04D]={d='on'}, + [0x1F04E]={d='on'}, + [0x1F04F]={d='on'}, + [0x1F050]={d='on'}, + [0x1F051]={d='on'}, + [0x1F052]={d='on'}, + [0x1F053]={d='on'}, + [0x1F054]={d='on'}, + [0x1F055]={d='on'}, + [0x1F056]={d='on'}, + [0x1F057]={d='on'}, + [0x1F058]={d='on'}, + [0x1F059]={d='on'}, + [0x1F05A]={d='on'}, + [0x1F05B]={d='on'}, + [0x1F05C]={d='on'}, + [0x1F05D]={d='on'}, + [0x1F05E]={d='on'}, + [0x1F05F]={d='on'}, + [0x1F060]={d='on'}, + [0x1F061]={d='on'}, + [0x1F062]={d='on'}, + [0x1F063]={d='on'}, + [0x1F064]={d='on'}, + [0x1F065]={d='on'}, + [0x1F066]={d='on'}, + [0x1F067]={d='on'}, + [0x1F068]={d='on'}, + [0x1F069]={d='on'}, + [0x1F06A]={d='on'}, + [0x1F06B]={d='on'}, + [0x1F06C]={d='on'}, + [0x1F06D]={d='on'}, + [0x1F06E]={d='on'}, + [0x1F06F]={d='on'}, + [0x1F070]={d='on'}, + [0x1F071]={d='on'}, + [0x1F072]={d='on'}, + [0x1F073]={d='on'}, + [0x1F074]={d='on'}, + [0x1F075]={d='on'}, + [0x1F076]={d='on'}, + [0x1F077]={d='on'}, + [0x1F078]={d='on'}, + [0x1F079]={d='on'}, + [0x1F07A]={d='on'}, + [0x1F07B]={d='on'}, + [0x1F07C]={d='on'}, + [0x1F07D]={d='on'}, + [0x1F07E]={d='on'}, + [0x1F07F]={d='on'}, + [0x1F080]={d='on'}, + [0x1F081]={d='on'}, + [0x1F082]={d='on'}, + [0x1F083]={d='on'}, + [0x1F084]={d='on'}, + [0x1F085]={d='on'}, + [0x1F086]={d='on'}, + [0x1F087]={d='on'}, + [0x1F088]={d='on'}, + [0x1F089]={d='on'}, + [0x1F08A]={d='on'}, + [0x1F08B]={d='on'}, + [0x1F08C]={d='on'}, + [0x1F08D]={d='on'}, + [0x1F08E]={d='on'}, + [0x1F08F]={d='on'}, + [0x1F090]={d='on'}, + [0x1F091]={d='on'}, + [0x1F092]={d='on'}, + [0x1F093]={d='on'}, + [0x1F0A0]={d='on'}, + [0x1F0A1]={d='on'}, + [0x1F0A2]={d='on'}, + [0x1F0A3]={d='on'}, + [0x1F0A4]={d='on'}, + [0x1F0A5]={d='on'}, + [0x1F0A6]={d='on'}, + [0x1F0A7]={d='on'}, + [0x1F0A8]={d='on'}, + [0x1F0A9]={d='on'}, + [0x1F0AA]={d='on'}, + [0x1F0AB]={d='on'}, + [0x1F0AC]={d='on'}, + [0x1F0AD]={d='on'}, + [0x1F0AE]={d='on'}, + [0x1F0B1]={d='on'}, + [0x1F0B2]={d='on'}, + [0x1F0B3]={d='on'}, + [0x1F0B4]={d='on'}, + [0x1F0B5]={d='on'}, + [0x1F0B6]={d='on'}, + [0x1F0B7]={d='on'}, + [0x1F0B8]={d='on'}, + [0x1F0B9]={d='on'}, + [0x1F0BA]={d='on'}, + [0x1F0BB]={d='on'}, + [0x1F0BC]={d='on'}, + [0x1F0BD]={d='on'}, + [0x1F0BE]={d='on'}, + [0x1F0BF]={d='on'}, + [0x1F0C1]={d='on'}, + [0x1F0C2]={d='on'}, + [0x1F0C3]={d='on'}, + [0x1F0C4]={d='on'}, + [0x1F0C5]={d='on'}, + [0x1F0C6]={d='on'}, + [0x1F0C7]={d='on'}, + [0x1F0C8]={d='on'}, + [0x1F0C9]={d='on'}, + [0x1F0CA]={d='on'}, + [0x1F0CB]={d='on'}, + [0x1F0CC]={d='on'}, + [0x1F0CD]={d='on'}, + [0x1F0CE]={d='on'}, + [0x1F0CF]={d='on'}, + [0x1F0D1]={d='on'}, + [0x1F0D2]={d='on'}, + [0x1F0D3]={d='on'}, + [0x1F0D4]={d='on'}, + [0x1F0D5]={d='on'}, + [0x1F0D6]={d='on'}, + [0x1F0D7]={d='on'}, + [0x1F0D8]={d='on'}, + [0x1F0D9]={d='on'}, + [0x1F0DA]={d='on'}, + [0x1F0DB]={d='on'}, + [0x1F0DC]={d='on'}, + [0x1F0DD]={d='on'}, + [0x1F0DE]={d='on'}, + [0x1F0DF]={d='on'}, + [0x1F0E0]={d='on'}, + [0x1F0E1]={d='on'}, + [0x1F0E2]={d='on'}, + [0x1F0E3]={d='on'}, + [0x1F0E4]={d='on'}, + [0x1F0E5]={d='on'}, + [0x1F0E6]={d='on'}, + [0x1F0E7]={d='on'}, + [0x1F0E8]={d='on'}, + [0x1F0E9]={d='on'}, + [0x1F0EA]={d='on'}, + [0x1F0EB]={d='on'}, + [0x1F0EC]={d='on'}, + [0x1F0ED]={d='on'}, + [0x1F0EE]={d='on'}, + [0x1F0EF]={d='on'}, + [0x1F0F0]={d='on'}, + [0x1F0F1]={d='on'}, + [0x1F0F2]={d='on'}, + [0x1F0F3]={d='on'}, + [0x1F0F4]={d='on'}, + [0x1F0F5]={d='on'}, + [0x1F100]={d='en'}, + [0x1F101]={d='en'}, + [0x1F102]={d='en'}, + [0x1F103]={d='en'}, + [0x1F104]={d='en'}, + [0x1F105]={d='en'}, + [0x1F106]={d='en'}, + [0x1F107]={d='en'}, + [0x1F108]={d='en'}, + [0x1F109]={d='en'}, + [0x1F10A]={d='en'}, + [0x1F10B]={d='on'}, + [0x1F10C]={d='on'}, + [0x1F16A]={d='on'}, + [0x1F16B]={d='on'}, + [0xE0001]={d='bn'}, + [0xE0020]={d='bn'}, + [0xE0021]={d='bn'}, + [0xE0022]={d='bn'}, + [0xE0023]={d='bn'}, + [0xE0024]={d='bn'}, + [0xE0025]={d='bn'}, + [0xE0026]={d='bn'}, + [0xE0027]={d='bn'}, + [0xE0028]={d='bn'}, + [0xE0029]={d='bn'}, + [0xE002A]={d='bn'}, + [0xE002B]={d='bn'}, + [0xE002C]={d='bn'}, + [0xE002D]={d='bn'}, + [0xE002E]={d='bn'}, + [0xE002F]={d='bn'}, + [0xE0030]={d='bn'}, + [0xE0031]={d='bn'}, + [0xE0032]={d='bn'}, + [0xE0033]={d='bn'}, + [0xE0034]={d='bn'}, + [0xE0035]={d='bn'}, + [0xE0036]={d='bn'}, + [0xE0037]={d='bn'}, + [0xE0038]={d='bn'}, + [0xE0039]={d='bn'}, + [0xE003A]={d='bn'}, + [0xE003B]={d='bn'}, + [0xE003C]={d='bn'}, + [0xE003D]={d='bn'}, + [0xE003E]={d='bn'}, + [0xE003F]={d='bn'}, + [0xE0040]={d='bn'}, + [0xE0041]={d='bn'}, + [0xE0042]={d='bn'}, + [0xE0043]={d='bn'}, + [0xE0044]={d='bn'}, + [0xE0045]={d='bn'}, + [0xE0046]={d='bn'}, + [0xE0047]={d='bn'}, + [0xE0048]={d='bn'}, + [0xE0049]={d='bn'}, + [0xE004A]={d='bn'}, + [0xE004B]={d='bn'}, + [0xE004C]={d='bn'}, + [0xE004D]={d='bn'}, + [0xE004E]={d='bn'}, + [0xE004F]={d='bn'}, + [0xE0050]={d='bn'}, + [0xE0051]={d='bn'}, + [0xE0052]={d='bn'}, + [0xE0053]={d='bn'}, + [0xE0054]={d='bn'}, + [0xE0055]={d='bn'}, + [0xE0056]={d='bn'}, + [0xE0057]={d='bn'}, + [0xE0058]={d='bn'}, + [0xE0059]={d='bn'}, + [0xE005A]={d='bn'}, + [0xE005B]={d='bn'}, + [0xE005C]={d='bn'}, + [0xE005D]={d='bn'}, + [0xE005E]={d='bn'}, + [0xE005F]={d='bn'}, + [0xE0060]={d='bn'}, + [0xE0061]={d='bn'}, + [0xE0062]={d='bn'}, + [0xE0063]={d='bn'}, + [0xE0064]={d='bn'}, + [0xE0065]={d='bn'}, + [0xE0066]={d='bn'}, + [0xE0067]={d='bn'}, + [0xE0068]={d='bn'}, + [0xE0069]={d='bn'}, + [0xE006A]={d='bn'}, + [0xE006B]={d='bn'}, + [0xE006C]={d='bn'}, + [0xE006D]={d='bn'}, + [0xE006E]={d='bn'}, + [0xE006F]={d='bn'}, + [0xE0070]={d='bn'}, + [0xE0071]={d='bn'}, + [0xE0072]={d='bn'}, + [0xE0073]={d='bn'}, + [0xE0074]={d='bn'}, + [0xE0075]={d='bn'}, + [0xE0076]={d='bn'}, + [0xE0077]={d='bn'}, + [0xE0078]={d='bn'}, + [0xE0079]={d='bn'}, + [0xE007A]={d='bn'}, + [0xE007B]={d='bn'}, + [0xE007C]={d='bn'}, + [0xE007D]={d='bn'}, + [0xE007E]={d='bn'}, + [0xE007F]={d='bn'} +} +%</bidi> +% \end{macrocode} +%\fi +% +% Now the |basic-r| bidi mode. One of the aims is to implement a fast +% and simple bidi algorithm, with a single loop. I managed to do it +% for R texts, with a second smaller loop for a special case. The code +% is still somewhat chaotic, but its behavior is essentially +% correct. I cannot resist copying the following text from +% \textsf{Emacs} |bidi.c| (which also attempts to implement the bidi +% algorithm with a single loop): +% +% \begin{quote} +% Arrrgh!! The UAX\#9 algorithm is too deeply entrenched in the +% assumption of batch-style processing [...]. May the fleas of a +% thousand camels infest the armpits of those who design supposedly +% general-purpose algorithms by looking at their own +% implementations, and fail to consider other possible +% implementations! +% \end{quote} +% +% Well, it took me some time to guess what the batch rules in UAX\#9 +% actually mean (in other word, \textit{what} they do and\textit{why}, +% and not only \textit{how}), but I think (or I hope) I've managed to +% understand them. +% +% In some sense, there are two bidi modes, one for numbers, and the +% other for text. Furthermore, setting just the direction in R text +% is not enough, because there are actually \textit{two} R modes (set +% explicitly in Unicode with RLM and ALM). In \babel{} the dir is set +% by a higher protocol based on the language/script, which in turn +% sets the correct dir (<l>, <r> or <al>). +% +% From UAX\#9: “Where available, markup should be used instead of the +% explicit formatting characters”. So, this simple version just +% ignores formatting characters. Actually, most of that annex is +% devoted to how to handle them. +% +% BD14-BD16 are not implemented. Unicode (and the W3C) are making a +% great effort to deal with some special problematic cases in +% “streamed” plain text. I don't think this is the way to go -- +% particular issues should be fixed by a high level interface taking +% into account the needs of the document. And here is where \luatex{} +% excels, because everything related to bidi writing is under our +% control. +% +% TODO: math mode (as weak L?) +% +% \begin{macrocode} +%<*basic-r> +Babel = Babel or {} + +require('babel-bidi.lua') + +local characters = Babel.characters +local ranges = Babel.ranges + +local DIR = node.id("dir") + +local function dir_mark(head, from, to, outer) + dir = (outer == 'r') and 'TLT' or 'TRT' -- ie, reverse + local d = node.new(DIR) + d.dir = '+' .. dir + node.insert_before(head, from, d) + d = node.new(DIR) + d.dir = '-' .. dir + node.insert_after(head, to, d) +end + +function Babel.pre_otfload_v(head) + -- head = Babel.numbers(head) + head = Babel.bidi(head, true) + return head +end + +function Babel.pre_otfload_h(head) + -- head = Babel.numbers(head) + head = Babel.bidi(head, false) + return head +end + +function Babel.bidi(head, ispar) + local first_n, last_n -- first and last char with nums + local last_es -- an auxiliary 'last' used with nums + local first_d, last_d -- first and last char in L/R block + local dir, dir_real +% \end{macrocode} +% +% Next also depends on script/lang (<al>/<r>). To be set by +% babel. |tex.pardir| is dangerous, could be (re)set but it +% should be changed only in vmode. There are two strong's -- +% |strong| = l/al/r and |strong_lr| = l/r (there must be a better +% way): +% +% \begin{macrocode} + local strong = ('TRT' == tex.pardir) and 'r' or 'l' + local strong_lr = (strong == 'l') and 'l' or 'r' + local outer = strong + + local new_dir = false + local first_dir = false + + local last_lr + + local type_n = '' + + for item in node.traverse(head) do + + -- three cases: glyph, dir, otherwise + if item.id == node.id'glyph' then + + local chardata = characters[item.char] + dir = chardata and chardata.d or nil + if not dir then + for nn, et in ipairs(ranges) do + if item.char < et[1] then + break + elseif item.char <= et[2] then + dir = et[3] + break + end + end + end + dir = dir or 'l' +% \end{macrocode} +% +% Next is based on the assumption babel sets the language AND +% switches the script with its dir. We treat a language block as +% a separate Unicode sequence. The following piece of code is +% executed at the first glyph after a `dir' node. We don't know +% the current language until then. +% +% \begin{macrocode} + if new_dir then + attr_dir = 0 + for at in node.traverse(item.attr) do + if at.number == luatexbase.registernumber'bbl@attr@dir' then + attr_dir = at.value + end + end + if attr_dir == 1 then + strong = 'r' + elseif attr_dir == 2 then + strong = 'al' + else + strong = 'l' + end + strong_lr = (strong == 'l') and 'l' or 'r' + outer = strong_lr + new_dir = false + end + + if dir == 'nsm' then dir = strong end -- W1 +% \end{macrocode} +% +% \textbf{Numbers.} The dual <al>/<r> system for R is somewhat +% cumbersome. +% +% \begin{macrocode} + dir_real = dir -- We need dir_real to set strong below + if dir == 'al' then dir = 'r' end -- W3 +% \end{macrocode} +% +% By W2, there are no <en> <et> <es> if |strong == <al>|, only +% <an>. Therefore, there are not <et en> nor <en et>, W5 can be +% ignored, and W6 applied: +% +% \begin{macrocode} + if strong == 'al' then + if dir == 'en' then dir = 'an' end -- W2 + if dir == 'et' or dir == 'es' then dir = 'on' end -- W6 + strong_lr = 'r' -- W3 + end +% \end{macrocode} +% +% Once finished the basic setup for glyphs, consider the two other +% cases: dir node and the rest. +% +% \begin{macrocode} + elseif item.id == node.id'dir' then + new_dir = true + dir = nil + else + dir = nil -- Not a char + end +% \end{macrocode} +% +% Numbers in R mode. A sequence of <en>, <et>, <an>, <es> and <cs> is +% typeset (with some rules) in L mode. We store the starting and +% ending points, and only when anything different is found (including +% nil, ie, a non-char), the textdir is set. This means you cannot +% insert, say, a whatsit, but this is what I would expect (with +% \textsf{luacolor} you may colorize some digits). Anyway, this +% behavior could be changed with a switch in the future. Note in the +% first branch only <an> is relevant if <al>. +% +% \begin{macrocode} + if dir == 'en' or dir == 'an' or dir == 'et' then + if dir ~= 'et' then + type_n = dir + end + first_n = first_n or item + last_n = last_es or item + last_es = nil + elseif dir == 'es' and last_n then -- W3+W6 + last_es = item + elseif dir == 'cs' then -- it's right - do nothing + elseif first_n then -- & if dir = any but en, et, an, es, cs, inc nil + if strong_lr == 'r' and type_n ~= '' then + dir_mark(head, first_n, last_n, 'r') + elseif strong_lr == 'l' and first_d and type_n == 'an' then + dir_mark(head, first_n, last_n, 'r') + dir_mark(head, first_d, last_d, outer) + first_d, last_d = nil, nil + elseif strong_lr == 'l' and type_n ~= '' then + last_d = last_n + end + type_n = '' + first_n, last_n = nil, nil + end +% \end{macrocode} +% +% R text in L, or L text in R. Order of |dir_ mark|'s are relevant: d +% goes outside n, and therefore it's emitted after. See |dir_mark| to +% understand why (but is the nesting actually necessary or is a flat +% dir structure enough?). Only L, R (and AL) chars are taken into +% account -- everything else, including spaces, whatsits, etc., are +% ignored: +% +% \begin{macrocode} + if dir == 'l' or dir == 'r' then + if dir ~= outer then + first_d = first_d or item + last_d = item + elseif first_d and dir ~= strong_lr then + dir_mark(head, first_d, last_d, outer) + first_d, last_d = nil, nil + end + end +% \end{macrocode} +% +% \textbf{Mirroring.} Each chunk of text in a certain language is +% considered a ``closed'' sequence. If <r on r> and <l on l>, it's +% clearly <r> and <l>, resptly, but with other combinations depends on +% outer. From all these, we select only those resolving <on> $\to$ +% <r>. At the beginning (when |last_lr| is nil) of an R text, they are +% mirrored directly. +% +% TODO - numbers in R mode are processed. It doesn't hurt, but should +% not be done. +% +% \begin{macrocode} + if dir and not last_lr and dir ~= 'l' and outer == 'r' then + item.char = characters[item.char] and + characters[item.char].m or item.char + elseif (dir or new_dir) and last_lr ~= item then + local mir = outer .. strong_lr .. (dir or outer) + if mir == 'rrr' or mir == 'lrr' or mir == 'rrl' or mir == 'rlr' then + for ch in node.traverse(node.next(last_lr)) do + if ch == item then break end + if ch.id == node.id'glyph' then + ch.char = characters[ch.char].m or ch.char + end + end + end + end +% \end{macrocode} +% +% Save some values for the next iteration. If the current node is +% `dir', open a new sequence. Since dir could be changed, strong is +% set with its real value (|dir_real|). +% +% \begin{macrocode} + if dir == 'l' or dir == 'r' then + last_lr = item + strong = dir_real -- Don't search back - best save now + strong_lr = (strong == 'l') and 'l' or 'r' + elseif new_dir then + last_lr = nil + end + end +% \end{macrocode} +% +% Mirror the last chars if they are no directed. And make sure any +% open block is closed, too. +% +% \begin{macrocode} + if last_lr and outer == 'r' then + for ch in node.traverse_id(node.id'glyph', node.next(last_lr)) do + ch.char = characters[ch.char].m or ch.char + end + end + if first_n then + dir_mark(head, first_n, last_n, outer) + end + if first_d then + dir_mark(head, first_d, last_d, outer) + end +% \end{macrocode} +% +% In boxes, the dir node could be added before the original head, so +% the actual head is the previous node. +% +% \begin{macrocode} + return node.prev(head) or head +end +%</basic-r> +% \end{macrocode} +% +% And here the Lua code for |bidi=basic|: +% +% \begin{macrocode} +%<*basic> +Babel = Babel or {} + +Babel.fontmap = Babel.fontmap or {} +Babel.fontmap[0] = {} -- l +Babel.fontmap[1] = {} -- r +Babel.fontmap[2] = {} -- al/an + +function Babel.pre_otfload_v(head) + -- head = Babel.numbers(head) + head = Babel.bidi(head, true) + return head +end + +function Babel.pre_otfload_h(head) + -- head = Babel.numbers(head) + head = Babel.bidi(head, false) + return head +end + +require('babel-bidi.lua') + +local characters = Babel.characters +local ranges = Babel.ranges + +local DIR = node.id('dir') +local GLYPH = node.id('glyph') + +local function insert_implicit(head, state, outer) + local new_state = state + if state.sim and state.eim and state.sim ~= state.eim then + dir = ((outer == 'r') and 'TLT' or 'TRT') -- ie, reverse + local d = node.new(DIR) + d.dir = '+' .. dir + node.insert_before(head, state.sim, d) + local d = node.new(DIR) + d.dir = '-' .. dir + node.insert_after(head, state.eim, d) + end + new_state.sim, new_state.eim = nil, nil + return head, new_state +end + +local function insert_numeric(head, state) + local new + local new_state = state + if state.san and state.ean and state.san ~= state.ean then + local d = node.new(DIR) + d.dir = '+TLT' + _, new = node.insert_before(head, state.san, d) + if state.san == state.sim then state.sim = new end + local d = node.new(DIR) + d.dir = '-TLT' + _, new = node.insert_after(head, state.ean, d) + if state.ean == state.eim then state.eim = new end + end + new_state.san, new_state.ean = nil, nil + return head, new_state +end + +function Babel.bidi(head, ispar) + local d -- d is used mainly for computations in a loop + local prev_d = '' + local new_d = false + + local nodes = {} + local outer_first = nil + + local has_en = false + local first_et = nil + + local ATDIR = luatexbase.registernumber'bbl@attr@dir' + + local save_outer + local temp = node.get_attribute(head, ATDIR) + if temp then + temp = temp % 3 + save_outer = (temp == 0 and 'l') or + (temp == 1 and 'r') or + (temp == 2 and 'al') + elseif ispar then + save_outer = ('TRT' == tex.pardir) and 'r' or 'l' + else + save_outer = ('TRT' == tex.textdir) and 'r' or 'l' + end + local outer = save_outer + local last = outer + -- 'al' is only taken into account in the first, current loop + if save_outer == 'al' then save_outer = 'r' end + + local fontmap = Babel.fontmap + + for item in node.traverse(head) do + + -- In what follows, #node is the last (previous) node, because the + -- current one is not added until we start processing the neutrals. + + -- three cases: glyph, dir, otherwise + if item.id == GLYPH then + + local chardata = characters[item.char] + d = chardata and chardata.d or nil + if not d then + for nn, et in ipairs(ranges) do + if item.char < et[1] then + break + elseif item.char <= et[2] then + d = et[3] + break + end + end + end + d = d or 'l' + + local temp = (d == 'l' and 0) or + (d == 'r' and 1) or + (d == 'al' and 2) or + (d == 'an' and 2) or nil + if temp and fontmap and fontmap[temp][item.font] then + item.font = fontmap[temp][item.font] + end + + if new_d then + table.insert(nodes, {nil, (outer == 'l') and 'l' or 'r', nil}) + attr_d = node.get_attribute(item, ATDIR) + attr_d = attr_d % 3 + if attr_d == 1 then + outer_first = 'r' + last = 'r' + elseif attr_d == 2 then + outer_first = 'r' + last = 'al' + else + outer_first = 'l' + last = 'l' + end + outer = last + has_en = false + first_et = nil + new_d = false + end + + elseif item.id == DIR then + d = nil + -- if node.get_attribute(item, ATDIR) ~= 10000 then + new_d = true + -- else + -- d = 'l' + -- new_d = true + -- last = 'l' + -- end + + else + d = nil + end + + -- Tengo que basarlo en un comportamiento implicito basado en la + -- manipulación del tipo en los dígitos, que de algún modo sean + -- aun números, pero no se considere W4 y ..... + -- if node.get_attribute(item, ATDIR) == 10000 then + -- d = 'r' + -- end + + -- AL <= EN/ET/ES -- W2 + W3 + W6 + if last == 'al' and d == 'en' then + d = 'an' -- W3 + elseif last == 'al' and (d == 'et' or d == 'es') then + d = 'on' -- W6 + end + + -- EN + CS/ES + EN -- W4 + if d == 'en' and #nodes >= 2 then + if (nodes[#nodes][2] == 'es' or nodes[#nodes][2] == 'cs') + and nodes[#nodes-1][2] == 'en' then + nodes[#nodes][2] = 'en' + end + end + + -- AN + CS + AN -- W4 too, because uax9 mixes both cases + if d == 'an' and #nodes >= 2 then + if (nodes[#nodes][2] == 'cs') + and nodes[#nodes-1][2] == 'an' then + nodes[#nodes][2] = 'an' + end + end + + -- ET/EN -- W5 + W7->l / W6->on + if d == 'et' then + first_et = first_et or (#nodes + 1) + elseif d == 'en' then + has_en = true + first_et = first_et or (#nodes + 1) + elseif first_et then -- d may be nil here ! + if has_en then + if last == 'l' then + temp = 'l' -- W7 + else + temp = 'en' -- W5 + end + else + temp = 'on' -- W6 + end + for e = first_et, #nodes do + if nodes[e][1].id == GLYPH then nodes[e][2] = temp end + end + first_et = nil + has_en = false + end + + if d then + if d == 'al' then + d = 'r' + last = 'al' + elseif d == 'l' or d == 'r' then + last = d + end + prev_d = d + table.insert(nodes, {item, d, outer_first}) + else + -- Not sure about the following. Looks too 'ad hoc', but it's + -- required for numbers, so that 89 19 becomes 19 89. It also + -- affects n+cs/es+n. + if prev_d == 'an' or prev_d == 'en' then + table.insert(nodes, {item, 'on', nil}) + end + end + + outer_first = nil + + end + + -- TODO -- repeated here in case EN/ET is the last node. Find a + -- better way of doing things: + if first_et then -- dir may be nil here ! + if has_en then + if last == 'l' then + temp = 'l' -- W7 + else + temp = 'en' -- W5 + end + else + temp = 'on' -- W6 + end + for e = first_et, #nodes do + if nodes[e][1].id == GLYPH then nodes[e][2] = temp end + end + end + + -- dummy node, to close things + table.insert(nodes, {nil, (outer == 'l') and 'l' or 'r', nil}) + + --------------- NEUTRAL ----------------- + + outer = save_outer + last = outer + + local first_on = nil + + for q = 1, #nodes do + local item + + local outer_first = nodes[q][3] + outer = outer_first or outer + last = outer_first or last + + local d = nodes[q][2] + if d == 'an' or d == 'en' then d = 'r' end + if d == 'cs' or d == 'et' or d == 'es' then d = 'on' end --- W6 + + if d == 'on' then + first_on = first_on or q + elseif first_on then + if last == d then + temp = d + else + temp = outer + end + for r = first_on, q - 1 do + nodes[r][2] = temp + item = nodes[r][1] -- MIRRORING + if item.id == GLYPH and temp == 'r' then + item.char = characters[item.char].m or item.char + end + end + first_on = nil + end + + if d == 'r' or d == 'l' then last = d end + end + + -------------- IMPLICIT, REORDER ---------------- + + outer = save_outer + last = outer + + local state = {} + state.has_r = false + + for q = 1, #nodes do + + local item = nodes[q][1] + + outer = nodes[q][3] or outer + + local d = nodes[q][2] + + if d == 'nsm' then d = last end -- W1 + if d == 'en' then d = 'an' end + local isdir = (d == 'r' or d == 'l') + + if outer == 'l' and d == 'an' then + state.san = state.san or item + state.ean = item + elseif state.san then + head, state = insert_numeric(head, state) + end + + if outer == 'l' then + if d == 'an' or d == 'r' then -- im -> implicit + if d == 'r' then state.has_r = true end + state.sim = state.sim or item + state.eim = item + elseif d == 'l' and state.sim and state.has_r then + head, state = insert_implicit(head, state, outer) + elseif d == 'l' then + state.sim, state.eim, state.has_r = nil, nil, false + end + else + if d == 'an' or d == 'l' then + state.sim = state.sim or item + state.eim = item + elseif d == 'r' and state.sim then + head, state = insert_implicit(head, state, outer) + elseif d == 'r' then + state.sim, state.eim = nil, nil + end + end + + if isdir then + last = d -- Don't search back - best save now + elseif d == 'on' and state.san then + state.san = state.san or item + state.ean = item + end + + end + + return node.prev(head) or head +end +%</basic> +% \end{macrocode} +% +% \section{The `nil' language} +% +% This `language' does nothing, except setting the hyphenation patterns to +% nohyphenation. +% +% For this language currently no special definitions are needed or +% available. +% +% The macro |\LdfInit| takes care of preventing that this file is +% loaded more than once, checking the category code of the +% \texttt{@} sign, etc. +% +% \begin{macrocode} +%<*nil> +\ProvidesLanguage{nil}[<@date@> <@version@> Nil language] +\LdfInit{nil}{datenil} +% \end{macrocode} +% +% When this file is read as an option, i.e. by the |\usepackage| +% command, \texttt{nil} could be an `unknown' language in which +% case we have to make it known. +% +% \begin{macrocode} +\ifx\l@nohyphenation\@undefined + \@nopatterns{nil} + \adddialect\l@nil0 +\else + \let\l@nil\l@nohyphenation +\fi +% \end{macrocode} +% +% This macro is used to store the values of the hyphenation +% parameters |\lefthyphenmin| and |\righthyphenmin|. +% +% \begin{macrocode} +\providehyphenmins{\CurrentOption}{\m@ne\m@ne} +% \end{macrocode} +% +% The next step consists of defining commands to switch to (and +% from) the `nil' language. +% \begin{macro}{\captionnil} +% \begin{macro}{\datenil} +% +% \begin{macrocode} +\let\captionsnil\@empty +\let\datenil\@empty +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% The macro |\ldf@finish| takes care of looking for a +% configuration file, setting the main language to be switched on +% at |\begin{document}| and resetting the category code of +% \texttt{@} to its original value. +% +% \begin{macrocode} +\ldf@finish{nil} +%</nil> +% \end{macrocode} +% +% +% \section{Support for Plain \TeX\ (\texttt{plain.def})} +% +% \subsection{Not renaming \file{hyphen.tex}} +% As Don Knuth has declared that the filename \file{hyphen.tex} may +% only be used to designate \emph{his} version of the american +% English hyphenation patterns, a new solution has to be found in +% order to be able to load hyphenation patterns for other languages +% in a plain-based \TeX-format. +% When asked he responded: +% \begin{quote} +% That file name is ``sacred'', and if anybody changes it they will +% cause severe upward/downward compatibility headaches. +% +% People can have a file localhyphen.tex or whatever they like, +% but they mustn't diddle with hyphen.tex (or plain.tex except to +% preload additional fonts). +% \end{quote} +% +% The files \file{bplain.tex} and \file{blplain.tex} can be used as +% replacement wrappers around \file{plain.tex} and +% \file{lplain.tex} to acheive the desired effect, based on the +% \pkg{babel} package. If you load each of them with ini\TeX, you +% will get a file called either \file{bplain.fmt} or +% \file{blplain.fmt}, which you can use as replacements for +% \file{plain.fmt} and \file{lplain.fmt}. +% +% As these files are going to be read as the first thing ini\TeX\ +% sees, we need to set some category codes just to be able to +% change the definition of |\input| +% +% \begin{macrocode} +%<*bplain|blplain> +\catcode`\{=1 % left brace is begin-group character +\catcode`\}=2 % right brace is end-group character +\catcode`\#=6 % hash mark is macro parameter character +% \end{macrocode} +% +% Now let's see if a file called \file{hyphen.cfg} can be found +% somewhere on \TeX's input path by trying to open it for +% reading... +% +% \begin{macrocode} +\openin 0 hyphen.cfg +% \end{macrocode} +% +% If the file wasn't found the following test turns out true. +% +% \begin{macrocode} +\ifeof0 +\else +% \end{macrocode} +% +% When \file{hyphen.cfg} could be opened we make sure that +% \emph{it} will be read instead of the file \file{hyphen.tex} +% which should (according to Don Knuth's ruling) contain the +% american English hyphenation patterns and nothing else. +% +% We do this by first saving the original meaning of |\input| (and +% I use a one letter control sequence for that so as not to waste +% multi-letter control sequence on this in the format). +% +% \begin{macrocode} + \let\a\input +% \end{macrocode} +% +% Then |\input| is defined to forget about its argument and load +% \file{hyphen.cfg} instead. +% +% \begin{macrocode} + \def\input #1 {% + \let\input\a + \a hyphen.cfg +% \end{macrocode} +% +% Once that's done the original meaning of |\input| can be restored +% and the definition of |\a| can be forgotten. +% +% \begin{macrocode} + \let\a\undefined + } +\fi +%</bplain|blplain> +% \end{macrocode} +% +% Now that we have made sure that \file{hyphen.cfg} will be loaded +% at the right moment it is time to load \file{plain.tex}. +% +% \begin{macrocode} +%<bplain>\a plain.tex +%<blplain>\a lplain.tex +% \end{macrocode} +% +% Finally we change the contents of |\fmtname| to indicate that +% this is \emph{not} the plain format, but a format based on plain +% with the \pkg{babel} package preloaded. +% +% \begin{macrocode} +%<bplain>\def\fmtname{babel-plain} +%<blplain>\def\fmtname{babel-lplain} +% \end{macrocode} +% +% When you are using a different format, based on plain.tex you can +% make a copy of blplain.tex, rename it and replace \file{plain.tex} +% with the name of your format file. +% +% \subsection{Emulating some \LaTeX{} features} +% +% The following code duplicates or emulates parts of \LaTeXe\ that +% are needed for \babel. +% +% \changes{bbplain-1.0s}{2012/12/21}{\cs{loadlocalcfg} not loaded in +% the format} +% +% \begin{macrocode} +%<*plain> +\def\@empty{} +\def\loadlocalcfg#1{% + \openin0#1.cfg + \ifeof0 + \closein0 + \else + \closein0 + {\immediate\write16{*************************************}% + \immediate\write16{* Local config file #1.cfg used}% + \immediate\write16{*}% + } + \input #1.cfg\relax + \fi + \@endofldf} +% \end{macrocode} +% +% \subsection{General tools} +% +% A number of \LaTeX\ macro's that are needed later on. +% +% \changes{bbplain-1.0t}{2013/04/10}{Added \cs{@expandtwoargs}} +% \changes{babel~3.9h}{2013/12/02}{Added \cs{zap@space}} +% \changes{babel~3.9k}{2014/03/22}{Added \cs{@nnil}} +% \changes{babel~3.9k}{2014/03/22}{Added \cs{@gobbletwo}} +% \changes{babel~3.9k}{2014/03/22}{Added \cs{protected@edef}} +% +% \begin{macrocode} +\long\def\@firstofone#1{#1} +\long\def\@firstoftwo#1#2{#1} +\long\def\@secondoftwo#1#2{#2} +\def\@nnil{\@nil} +\def\@gobbletwo#1#2{} +\def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} +\def\@star@or@long#1{% + \@ifstar + {\let\l@ngrel@x\relax#1}% + {\let\l@ngrel@x\long#1}} +\let\l@ngrel@x\relax +\def\@car#1#2\@nil{#1} +\def\@cdr#1#2\@nil{#2} +\let\@typeset@protect\relax +\let\protected@edef\edef +\long\def\@gobble#1{} +\edef\@backslashchar{\expandafter\@gobble\string\\} +\def\strip@prefix#1>{} +\def\g@addto@macro#1#2{{% + \toks@\expandafter{#1#2}% + \xdef#1{\the\toks@}}} +\def\@namedef#1{\expandafter\def\csname #1\endcsname} +\def\@nameuse#1{\csname #1\endcsname} +\def\@ifundefined#1{% + \expandafter\ifx\csname#1\endcsname\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\def\@expandtwoargs#1#2#3{% + \edef\reserved@a{\noexpand#1{#2}{#3}}\reserved@a} +\def\zap@space#1 #2{% + #1% + \ifx#2\@empty\else\expandafter\zap@space\fi + #2} +% \end{macrocode} +% +% \LaTeXe\ has the command |\@onlypreamble| which adds commands to +% a list of commands that are no longer needed after +% |\begin{document}|. +% +% \begin{macrocode} +\ifx\@preamblecmds\@undefined + \def\@preamblecmds{} +\fi +\def\@onlypreamble#1{% + \expandafter\gdef\expandafter\@preamblecmds\expandafter{% + \@preamblecmds\do#1}} +\@onlypreamble\@onlypreamble +% \end{macrocode} +% +% Mimick \LaTeX's |\AtBeginDocument|; for this to work the user +% needs to add |\begindocument| to his file. +% +% \begin{macrocode} +\def\begindocument{% + \@begindocumenthook + \global\let\@begindocumenthook\@undefined + \def\do##1{\global\let##1\@undefined}% + \@preamblecmds + \global\let\do\noexpand} +% \end{macrocode} +% +% \begin{macrocode} +\ifx\@begindocumenthook\@undefined + \def\@begindocumenthook{} +\fi +\@onlypreamble\@begindocumenthook +\def\AtBeginDocument{\g@addto@macro\@begindocumenthook} +% \end{macrocode} +% +% We also have to mimick \LaTeX's |\AtEndOfPackage|. Our +% replacement macro is much simpler; it stores its argument in +% |\@endofldf|. +% +% \changes{babel~3.9h}{2013/11/28}{Set \cs{bbl@opt@hyphenmap} to 0 - we +% presume hyphenmap=off in plain} +% +% \begin{macrocode} +\def\AtEndOfPackage#1{\g@addto@macro\@endofldf{#1}} +\@onlypreamble\AtEndOfPackage +\def\@endofldf{} +\@onlypreamble\@endofldf +\let\bbl@afterlang\@empty +\chardef\bbl@opt@hyphenmap\z@ +% \end{macrocode} +% +% \LaTeX\ needs to be able to switch off writing to its auxiliary +% files; plain doesn't have them by default. +% +% \begin{macrocode} +\ifx\if@filesw\@undefined + \expandafter\let\csname if@filesw\expandafter\endcsname + \csname iffalse\endcsname +\fi +% \end{macrocode} +% +% Mimick \LaTeX's commands to define control sequences. +% +% \begin{macrocode} +\def\newcommand{\@star@or@long\new@command} +\def\new@command#1{% + \@testopt{\@newcommand#1}0} +\def\@newcommand#1[#2]{% + \@ifnextchar [{\@xargdef#1[#2]}% + {\@argdef#1[#2]}} +\long\def\@argdef#1[#2]#3{% + \@yargdef#1\@ne{#2}{#3}} +\long\def\@xargdef#1[#2][#3]#4{% + \expandafter\def\expandafter#1\expandafter{% + \expandafter\@protected@testopt\expandafter #1% + \csname\string#1\expandafter\endcsname{#3}}% + \expandafter\@yargdef \csname\string#1\endcsname + \tw@{#2}{#4}} +\long\def\@yargdef#1#2#3{% + \@tempcnta#3\relax + \advance \@tempcnta \@ne + \let\@hash@\relax + \edef\reserved@a{\ifx#2\tw@ [\@hash@1]\fi}% + \@tempcntb #2% + \@whilenum\@tempcntb <\@tempcnta + \do{% + \edef\reserved@a{\reserved@a\@hash@\the\@tempcntb}% + \advance\@tempcntb \@ne}% + \let\@hash@##% + \l@ngrel@x\expandafter\def\expandafter#1\reserved@a} +\def\providecommand{\@star@or@long\provide@command} +\def\provide@command#1{% + \begingroup + \escapechar\m@ne\xdef\@gtempa{{\string#1}}% + \endgroup + \expandafter\@ifundefined\@gtempa + {\def\reserved@a{\new@command#1}}% + {\let\reserved@a\relax + \def\reserved@a{\new@command\reserved@a}}% + \reserved@a}% +% \end{macrocode} +% +% \begin{macrocode} +\def\DeclareRobustCommand{\@star@or@long\declare@robustcommand} +\def\declare@robustcommand#1{% + \edef\reserved@a{\string#1}% + \def\reserved@b{#1}% + \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}% + \edef#1{% + \ifx\reserved@a\reserved@b + \noexpand\x@protect + \noexpand#1% + \fi + \noexpand\protect + \expandafter\noexpand\csname\bbl@stripslash#1 \endcsname + }% + \expandafter\new@command\csname\bbl@stripslash#1 \endcsname +} +\def\x@protect#1{% + \ifx\protect\@typeset@protect\else + \@x@protect#1% + \fi +} +\def\@x@protect#1\fi#2#3{% + \fi\protect#1% +} +% \end{macrocode} +% +% The following little macro |\in@| is taken from \file{latex.ltx}; +% it checks whether its first argument is part of its second +% argument. It uses the boolean |\in@|; allocating a new boolean +% inside conditionally executed code is not possible, hence the +% construct with the temporary definition of |\bbl@tempa|. +% +% \changes{bbplain-1.0s}{2013/01/15}{Use \cs{bbl@tempa} as +% documented} +% +% \begin{macrocode} +\def\bbl@tempa{\csname newif\endcsname\ifin@} +\ifx\in@\@undefined + \def\in@#1#2{% + \def\in@@##1#1##2##3\in@@{% + \ifx\in@##2\in@false\else\in@true\fi}% + \in@@#2#1\in@\in@@} +\else + \let\bbl@tempa\@empty +\fi +\bbl@tempa +% \end{macrocode} +% +% \LaTeX\ has a macro to check whether a certain package was loaded +% with specific options. The command has two extra arguments which +% are code to be executed in either the true or false case. +% This is used to detect whether the document needs one of the +% accents to be activated (\Lopt{activegrave} and +% \Lopt{activeacute}). For plain \TeX\ we assume that the user +% wants them to be active by default. Therefore the only thing we +% do is execute the third argument (the code for the true case). +% +% \begin{macrocode} +\def\@ifpackagewith#1#2#3#4{#3} +% \end{macrocode} +% +% The \LaTeX\ macro |\@ifl@aded| checks whether a file was +% loaded. This functionality is not needed for plain \TeX\ but we +% need the macro to be defined as a no-op. +% +% \begin{macrocode} +\def\@ifl@aded#1#2#3#4{} +% \end{macrocode} +% +% For the following code we need to make sure that the commands +% |\newcommand| and |\providecommand| exist with some sensible +% definition. They are not fully equivalent to their \LaTeXe\ +% versions; just enough to make things work in plain~\TeX +% environments. +% +% \begin{macrocode} +\ifx\@tempcnta\@undefined + \csname newcount\endcsname\@tempcnta\relax +\fi +\ifx\@tempcntb\@undefined + \csname newcount\endcsname\@tempcntb\relax +\fi +% \end{macrocode} +% +% To prevent wasting two counters in \LaTeX$\:$2.09 (because +% counters with the same name are allocated later by it) we reset +% the counter that holds the next free counter (|\count10|). +% +% \begin{macrocode} +\ifx\bye\@undefined + \advance\count10 by -2\relax +\fi +\ifx\@ifnextchar\@undefined + \def\@ifnextchar#1#2#3{% + \let\reserved@d=#1% + \def\reserved@a{#2}\def\reserved@b{#3}% + \futurelet\@let@token\@ifnch} + \def\@ifnch{% + \ifx\@let@token\@sptoken + \let\reserved@c\@xifnch + \else + \ifx\@let@token\reserved@d + \let\reserved@c\reserved@a + \else + \let\reserved@c\reserved@b + \fi + \fi + \reserved@c} + \def\:{\let\@sptoken= } \: % this makes \@sptoken a space token + \def\:{\@xifnch} \expandafter\def\: {\futurelet\@let@token\@ifnch} +\fi +\def\@testopt#1#2{% + \@ifnextchar[{#1}{#1[#2]}} +\def\@protected@testopt#1{% + \ifx\protect\@typeset@protect + \expandafter\@testopt + \else + \@x@protect#1% + \fi} +\long\def\@whilenum#1\do #2{\ifnum #1\relax #2\relax\@iwhilenum{#1\relax + #2\relax}\fi} +\long\def\@iwhilenum#1{\ifnum #1\expandafter\@iwhilenum + \else\expandafter\@gobble\fi{#1}} +% \end{macrocode} +% +% \subsection{Encoding related macros} +% +% Code from \file{ltoutenc.dtx}, adapted for use in the plain \TeX\ +% environment. +% +% \begin{macrocode} +\def\DeclareTextCommand{% + \@dec@text@cmd\providecommand +} +\def\ProvideTextCommand{% + \@dec@text@cmd\providecommand +} +\def\DeclareTextSymbol#1#2#3{% + \@dec@text@cmd\chardef#1{#2}#3\relax +} +\def\@dec@text@cmd#1#2#3{% + \expandafter\def\expandafter#2% + \expandafter{% + \csname#3-cmd\expandafter\endcsname + \expandafter#2% + \csname#3\string#2\endcsname + }% +% \let\@ifdefinable\@rc@ifdefinable + \expandafter#1\csname#3\string#2\endcsname +} +\def\@current@cmd#1{% + \ifx\protect\@typeset@protect\else + \noexpand#1\expandafter\@gobble + \fi +} +\def\@changed@cmd#1#2{% + \ifx\protect\@typeset@protect + \expandafter\ifx\csname\cf@encoding\string#1\endcsname\relax + \expandafter\ifx\csname ?\string#1\endcsname\relax + \expandafter\def\csname ?\string#1\endcsname{% + \@changed@x@err{#1}% + }% + \fi + \global\expandafter\let + \csname\cf@encoding \string#1\expandafter\endcsname + \csname ?\string#1\endcsname + \fi + \csname\cf@encoding\string#1% + \expandafter\endcsname + \else + \noexpand#1% + \fi +} +\def\@changed@x@err#1{% + \errhelp{Your command will be ignored, type <return> to proceed}% + \errmessage{Command \protect#1 undefined in encoding \cf@encoding}} +\def\DeclareTextCommandDefault#1{% + \DeclareTextCommand#1?% +} +\def\ProvideTextCommandDefault#1{% + \ProvideTextCommand#1?% +} +\expandafter\let\csname OT1-cmd\endcsname\@current@cmd +\expandafter\let\csname?-cmd\endcsname\@changed@cmd +\def\DeclareTextAccent#1#2#3{% + \DeclareTextCommand#1{#2}[1]{\accent#3 ##1} +} +\def\DeclareTextCompositeCommand#1#2#3#4{% + \expandafter\let\expandafter\reserved@a\csname#2\string#1\endcsname + \edef\reserved@b{\string##1}% + \edef\reserved@c{% + \expandafter\@strip@args\meaning\reserved@a:-\@strip@args}% + \ifx\reserved@b\reserved@c + \expandafter\expandafter\expandafter\ifx + \expandafter\@car\reserved@a\relax\relax\@nil + \@text@composite + \else + \edef\reserved@b##1{% + \def\expandafter\noexpand + \csname#2\string#1\endcsname####1{% + \noexpand\@text@composite + \expandafter\noexpand\csname#2\string#1\endcsname + ####1\noexpand\@empty\noexpand\@text@composite + {##1}% + }% + }% + \expandafter\reserved@b\expandafter{\reserved@a{##1}}% + \fi + \expandafter\def\csname\expandafter\string\csname + #2\endcsname\string#1-\string#3\endcsname{#4} + \else + \errhelp{Your command will be ignored, type <return> to proceed}% + \errmessage{\string\DeclareTextCompositeCommand\space used on + inappropriate command \protect#1} + \fi +} +\def\@text@composite#1#2#3\@text@composite{% + \expandafter\@text@composite@x + \csname\string#1-\string#2\endcsname +} +\def\@text@composite@x#1#2{% + \ifx#1\relax + #2% + \else + #1% + \fi +} +% +\def\@strip@args#1:#2-#3\@strip@args{#2} +\def\DeclareTextComposite#1#2#3#4{% + \def\reserved@a{\DeclareTextCompositeCommand#1{#2}{#3}}% + \bgroup + \lccode`\@=#4% + \lowercase{% + \egroup + \reserved@a @% + }% +} +% +\def\UseTextSymbol#1#2{% +% \let\@curr@enc\cf@encoding +% \@use@text@encoding{#1}% + #2% +% \@use@text@encoding\@curr@enc +} +\def\UseTextAccent#1#2#3{% +% \let\@curr@enc\cf@encoding +% \@use@text@encoding{#1}% +% #2{\@use@text@encoding\@curr@enc\selectfont#3}% +% \@use@text@encoding\@curr@enc +} +\def\@use@text@encoding#1{% +% \edef\f@encoding{#1}% +% \xdef\font@name{% +% \csname\curr@fontshape/\f@size\endcsname +% }% +% \pickup@font +% \font@name +% \@@enc@update +} +\def\DeclareTextSymbolDefault#1#2{% + \DeclareTextCommandDefault#1{\UseTextSymbol{#2}#1}% +} +\def\DeclareTextAccentDefault#1#2{% + \DeclareTextCommandDefault#1{\UseTextAccent{#2}#1}% +} +\def\cf@encoding{OT1} +% \end{macrocode} +% +% Currently we only use the \LaTeXe\ method for accents for those +% that are known to be made active in \emph{some} language +% definition file. +% +% \begin{macrocode} +\DeclareTextAccent{\"}{OT1}{127} +\DeclareTextAccent{\'}{OT1}{19} +\DeclareTextAccent{\^}{OT1}{94} +\DeclareTextAccent{\`}{OT1}{18} +\DeclareTextAccent{\~}{OT1}{126} +% \end{macrocode} +% +% The following control sequences are used in \file{babel.def} +% but are not defined for \textsc{plain} \TeX. +% +% \begin{macrocode} +\DeclareTextSymbol{\textquotedblleft}{OT1}{92} +\DeclareTextSymbol{\textquotedblright}{OT1}{`\"} +\DeclareTextSymbol{\textquoteleft}{OT1}{`\`} +\DeclareTextSymbol{\textquoteright}{OT1}{`\'} +\DeclareTextSymbol{\i}{OT1}{16} +\DeclareTextSymbol{\ss}{OT1}{25} +% \end{macrocode} +% +% For a couple of languages we need the \LaTeX-control sequence +% |\scriptsize| to be available. Because plain \TeX\ doesn't have +% such a sofisticated font mechanism as \LaTeX\ has, we just |\let| +% it to |\sevenrm|. +% +% \begin{macrocode} +\ifx\scriptsize\@undefined + \let\scriptsize\sevenrm +\fi +%</plain> +% \end{macrocode} +% +% \Finale +% +\endinput +% +% Local Variables: +% mode: doctex +% coding: utf-8 +% TeX-engine: luatex +% End: |