% \iffalse meta-comment % % Copyright 1989-2008 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 Johannes Braams. % % The list of all files belonging to the Babel system is % given in the file `manifest.bbl. See also `legal.bbl' for additional % information. % % 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{3865} %% % \def\filename{babel.dtx} % \let\thisfilename\filename % %\iffalse % \changes{babel~3.5g}{1996/10/10}{We need at least \LaTeX\ from % December 1994} % \changes{babel~3.6k}{1999/03/18}{We need at least \LaTeX\ from % June 1998} % \begin{macrocode} %<+package>\NeedsTeXFormat{LaTeX2e}[2005/12/01] % \end{macrocode} % %% File 'babel.dtx' %\fi %%\ProvidesFile{babel.dtx}[2008/03/16 v3.8l The Babel package] %\iffalse % % Babel DOCUMENT-STYLE option for LaTeX version 2.09 or plain TeX; %% Babel package for LaTeX2e. % %% Copyright (C) 1989 -- 2008 by Johannes Braams, %% TeXniek %% all rights reserved. % %% Please report errors to: J.L. Braams %% babel at braams.xs4all.nl %<*filedriver> \documentclass{ltxdoc} \usepackage{supertabular} \font\manual=logo10 % font used for the METAFONT logo, etc. \newcommand*\MF{{\manual META}\-{\manual FONT}} \newcommand*\TeXhax{\TeX hax} \newcommand*\babel{\textsf{babel}} \newcommand*\Babel{\textsf{Babel}} \newcommand*\m[1]{\mbox{$\langle$\it#1\/$\rangle$}} \newcommand*\langvar{\m{lang}} \newcommand*\note[1]{} \newcommand*\bsl{\protect\bslash} \newcommand*\Lopt[1]{\textsf{#1}} \newcommand*\Lenv[1]{\textsf{#1}} \newcommand*\file[1]{\texttt{#1}} \newcommand*\cls[1]{\texttt{#1}} \newcommand*\pkg[1]{\texttt{#1}} \begin{document} \DocInput{babel.dtx} \end{document} % % \changes{babel~3.7a}{1997/04/16}{Make multiple loading of % \file{babel.def} impossible} % \begin{macrocode} %<*core> \ifx\bbl@afterfi\@undefined \else \bbl@afterfi\endinput \fi % % \end{macrocode} %<*dtx> \ProvidesFile{babel.dtx} % %\fi % % \GetFileInfo{babel.dtx} % % \changes{babel~2.0a}{1990/04/02}{Added text about \file{german.sty}} % \changes{babel~2.0b}{1990/04/18}{Changed order of code to prevent % plain \TeX from seeing all of it} % \changes{babel~2.1}{1990/04/24}{Modified user interface, % \cs{langTeX} no longer necessary} % \changes{babel~2.1a}{1990/05/01}{Incorporated Nico's comments} % \changes{babel~2.1b}{1990/05/01}{rename \cs{language} to % \cs{current@language}} % \changes{babel~2.1c}{1990/05/22}{abstract for report fixed, missing % \texttt{\}}, found by Nicolas Brouard} % \changes{babel~2.1d}{1990/07/04}{Missing right brace in definition of % abstract environment, found by Werenfried Spit} % \changes{babel~2.1e}{1990/07/16}{Incorporated more comments from % Nico} % \changes{babel~2.2}{1990/07/17}{Renamed \cs{newlanguage} to % \cs{addlanguage}} % \changes{babel~2.2a}{1990/08/27}{Modified the documentation % somewhat} % \changes{babel~3.0}{1991/04/23}{Moved part of the code to hyphen.doc % in preparation for \TeX~3.0} % \changes{babel~3.0a}{1991/05/21}{Updated comments in various places} % \changes{babel~3.0b}{1991/05/25}{Removed some problems in change log} % \changes{babel~3.0c}{1991/07/15}{Renamed \file{babel.sty} and % \file{latexhax.sty} to \file{.com}} % \changes{babel~3.1}{1991/10/31}{Added the support for active % characters and for extending a macro} % \changes{babel~3.1}{1991/11/05}{Removed the need for % \file{latexhax}} % \changes{babel~3.2}{1991/11/10}{Some Changes by br} % \changes{babel~3.2a}{1992/02/15}{Fixups of the code and % documentation} % \changes{babel~3.3}{1993/07/06}{Included driver file, and prepared % for distribution} % \changes{babel~3.4}{1994/01/30}{Updated for \LaTeXe} % \changes{babel~3.4}{1994/02/28}{Added language definition file for % bahasa} % \changes{babel~3.4b}{1994/05/18}{Added a small driver to be able to % process just this file} % \changes{babel~3.5a}{1995/02/03}{Provided common code to handle the % active double quote} % \changes{babel~3.5c}{1995/06/14}{corrected a few typos (PR1652)} % \changes{babel~3.5d}{1995/07/02}{Merged glyphs.dtx into this file} % \changes{babel~3.5f}{1995/07/13}{repaired a typo} % \changes{babel~3.5f}{1996/01/09}{replaced \cs{tmp}, \cs{bbl@tmp} and % \cs{bbl@temp} with \cs{bbl@tempa}} % \changes{babel~3.5g}{1996/07/09}{replaced \cs{undefined} with % \cs{@undefined} to be consistent with \LaTeX} % \changes{babel~3.7d}{1999/05/05}{Fixed a few typos in \cs{changes} % entries which made typesetting the code impossible} % \changes{babel~3.7h}{2001/03/01}{Added a number of missing comment % characters which caused spurious white space} % \changes{babel~3.8e}{2005/03/24}{Many enhancements to the text by % Andrew Young} % % \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\\ % \texttt{babel\char64 braams.xs4all.nl}} % % \date{Printed \today} % % \maketitle % % \begin{abstract} % 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 contained a % number of hard-wired texts. This report describes \babel{}, a % package that makes use of the new capabilities of \TeX\ version 3 % to provide an environment in which documents can be typeset in % a language other than US English, or in more than one language. % \end{abstract} % % \tableofcontents % % \section{The user interface}\label{U-I} % % The user interface of this package is quite simple. It consists % of a set of commands that switch from one language to another, and % a set of commands that deal with shorthands. It is also possible % to find out what the current language is. % % \DescribeMacro{\selectlanguage} % 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. % % \DescribeEnv{otherlanguage} % The environment \Lenv{otherlanguage} does basically the same as % |\selectlanguage|, except the language change is local to the % environment. This environment is required for intermixing % left-to-right typesetting with right-to-left typesetting. % The language to switch to is specified as an % argument to |\begin{otherlanguage}|. % % \DescribeMacro{\foreignlanguage} % 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 argument. This command only switches % the extra definitions and the hyphenation rules for the language, % \emph{not} the names and dates. % % \DescribeEnv{otherlanguage*} % In the environment \Lenv{otherlanguage*} only the typesetting % is done according to the rules of the other language, but the % text-strings such as `figure', `table', etc. are left as they % were set outside this environment. % % \DescribeEnv{hyphenrules} % The environment \Lenv{hyphenrules} can be used to select % \emph{only} the hyphenation rules to be used. This can for % instance be used to select `nohyphenation', provided that in % \file{language.dat} the `language' nohyphenation is defined by % loading \file{serohyph.tex}. % % \DescribeMacro{\languagename} % The control sequence |\languagename| contains the name of the % current language. % % \DescribeMacro{\iflanguage} % 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|. 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 \texttt{true} or \texttt{false} respectively. % % \DescribeMacro{\useshorthands} % The command |\useshorthands| initiates the definition of % user-defined shorthand sequences. It has one argument, the % character that starts these personal shorthands. % % \DescribeMacro{\defineshorthand} % 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. % % \DescribeMacro{\aliasshorthand} % 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{"}{/}|. \emph{Please note} that the substitute % shorthand character must have been declared in the preamble of % your document, using a command such as |\useshorthands{/}| in this % example. % % \DescribeMacro{\languageshorthands} % The command |\languageshorthands| can be used to switch the % shorthands on the language level. It takes one argument, the % name of a language. Note that for this to work the language % should have been specified as an option when loading the \babel\ % package. % % \DescribeMacro{\shorthandon} % \DescribeMacro{\shorthandoff} % 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. % % \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 used. % The command checks whether the language is known in this document % and whether the attribute(s) are known for this language. % % \subsection{Languages supported by \Babel} % % In the following table all the languages supported by \Babel\ are % listed, together with the names of the options with which you can % load \babel\ for each language. % % \begin{center} % \tablehead{Language & Option(s)\\\hline} % \tabletail{\hline} % \begin{supertabular}{l p{8cm}} % Afrikaans & afrikaans\\ % Bahasa & bahasa, indonesian, indon, bahasai, % bahasam, malay, meyalu\\ % Basque & basque\\ % Breton & breton\\ % Bulgarian & bulgarian\\ % Catalan & catalan\\ % Croatian & croatian\\ % Czech & czech\\ % Danish & danish\\ % Dutch & dutch\\ % English & english, USenglish, american, UKenglish, % british, canadian, australian, newzealand\\ % Esperanto & esperanto\\ % Estonian & estonian\\ % Finnish & finnish\\ % French & french, francais, canadien, acadian\\ % Galician & galician\\ % German & austrian, german, germanb, ngerman, naustrian\\ % Greek & greek, polutonikogreek \\ % Hebrew & hebrew \\ % Hungarian & magyar, hungarian\\ % Icelandic & icelandic \\ % Interlingua & interlingua \\ % Irish Gaelic & irish\\ % Italian & italian\\ %^^A Kannada & kannada \\ % Latin & latin \\ % Lower Sorbian & lowersorbian\\ %^^A Devnagari & nagari \\ % North Sami & samin \\ % Norwegian & norsk, nynorsk\\ % Polish & polish\\ % Portuguese & portuges, portuguese, brazilian, brazil\\ % Romanian & romanian\\ % Russian & russian\\ %^^A Sanskrit & sanskrit\\ % Scottish Gaelic & scottish\\ % Spanish & spanish\\ % Slovakian & slovak\\ % Slovenian & slovene\\ % Swedish & swedish\\ % Serbian & serbian\\ %^^A Tamil & tamil \\ % Turkish & turkish\\ % Ukrainian & ukrainian\\ % Upper Sorbian & uppersorbian\\ % Welsh & welsh\\ % \end{supertabular} % \end{center} % % For some languages \babel\ supports the options % \Lopt{activeacute} and \Lopt{activegrave}; for typestting Russian % texts, \babel\ knows about the options \Lopt{LWN} and \Lopt{LCY} % to specify the fontencoding of the cyrillic font used. Currently % only \Lopt{LWN} is supported. % % \subsection{Workarounds} % % If you use the document class \cls{book} \emph{and} you use % |\ref| inside the argument of |\chapter|, % \LaTeX\ will keep complaining about an undefined % label. The reason is that the argument of |\ref| is passed through % |\uppercase| at some time during processing. To prevent such % problems, you could revert to using uppercase labels, or you can % use |\lowercase{\ref{foo}}| inside the argument of |\chapter|. % % \section{Changes for \LaTeXe} % % With the advent of \LaTeXe\ the interface to \babel\ in the % preamble of the document has changed. With \LaTeX2.09 one used to % call up the \babel\ system with a line such as: % %\begin{verbatim} %\documentstyle[dutch,english]{article} %\end{verbatim} % % which 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. % % The \LaTeXe\ way of providing the same information is: % %\begin{verbatim} %\documentclass{article} %\usepackage[dutch,english]{babel} %\end{verbatim} % % or, making \Lopt{dutch} and \Lopt{english} global options in % order to let other packages detect and use them: % %\begin{verbatim} %\documentclass[dutch,english]{article} %\usepackage{babel} %\usepackage{varioref} %\end{verbatim} % % In this last example, the package \texttt{varioref} will also see % the options and will be able to use them. % % \section{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. %^^A \item Support for typesetting Sanskrit in transliteration is now %^^A available, thanks to Jun Takashima. %^^A \item Support for typesetting Kannada, Devnagari and Tamil is now %^^A available thanks to Jun Takashima. % \item Support for typesetting Greek has been enhanced. Code from % the \pkg{kdgreek} package (suggested by the author) was added % and |\greeknumeral| has been added. % \item Support for typesetting Basque is now available thanks to % Juan Aguirregabiria. % \item Support for typesetting Serbian with Latin script is now % available thanks to Dejan Muhamedagi\'{c} and Jankovic % Slobodan. % \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 Support for typesetting Bulgarian is now available thanks to % Georgi Boshnakov. % \item Support for typesetting Latin is now available, thanks to % Claudio Beccari and Krzysztof Konrad \.Zelechowski. % \item Support for typesetting North Sami is now available, thanks % to Regnor Jernsletten. % \item The options \Lopt{canadian}, \Lopt{canadien} and % \Lopt{acadien} have been added for Canadian English and French % use. % \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 $\pi o\lambda\upsilon\tau o\nu\kappa\acute{o}$ % (``Polutoniko'' or multi-accented) Greek way of typesetting % texts. These attributes will possibly find wider use in future % releases. % \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} % % \section{Changes in \Babel\ version 3.6} % % In \Babel\ version 3.6 a number of bugs that were found in % version~3.5 are fixed. Also a number of changes and additions % have occurred: % \begin{itemize} % \item A new environment \Lenv{otherlanguage*} is introduced. it % only switches the `specials', but leaves the `captions' % untouched. % \item The shorthands are no longer fully expandable. Some % problems could only be solved by peeking at the token following % an active character. The advantage is that |'{}a| works as % expected for languages that have the |'| active. % \item Support for typesetting french texts is much enhanced; the % file \file{francais.ldf} is now replaced by \file{frenchb.ldf} % which is maintained by Daniel Flipo. % \item Support for typesetting the russian language is again % available. The language definition file was originally % developed by Olga Lapko from CyrTUG. The fonts needed to % typeset the russian language are now part of the \babel\ % distribution. The support is not yet up to the level which is % needed according to Olga, but this is a start. % \item Support for typesetting greek texts is now also % available. What is offered in this release is a first attempt; % it will be enhanced later on by Yannis Haralambous. % \item in \babel\ 3.6j some hooks have been added for the % development of support for Hebrew typesetting. % \item Support for typesetting texts in Afrikaans (a variant of % Dutch, spoken in South Africa) has been added to % \file{dutch.ldf}. % \item Support for typesetting Welsh texts is now available. % \item A new command |\aliasshorthand| is introduced. It seems % that in Poland various conventions are used to type the % necessary Polish letters. It is now possible to use the % character~|/| as a shorthand character instead of the % character~|"|, by issuing the command |\aliasshorthand{"}{/}|. % \item The shorthand mechanism now deals correctly with characters % that are already active. % \item Shorthand characters are made active at |\begin{document}|, % not earlier. This is to prevent problems with other packages. % \item A \emph{preambleonly} command |\substitutefontfamily| has % been added to create \file{.fd} files on the fly when the font % families of the Latin text differ from the families used for % the Cyrillic or Greek parts of the text. % \item Three new commands |\LdfInit|, |\ldf@quit| and % |\ldf@finish| are introduced that perform a number of standard % tasks. % \item In babel 3.6k the language Ukrainian has been added and the % support for Russian typesetting has been adapted to the package % 'cyrillic' to be released with the December 1998 release of % \LaTeXe. % \end{itemize} % % \section{Changes in \Babel\ version 3.5} % % In \Babel\ version 3.5 a lot of changes have been made when % compared with the previous release. Here is a list of the most % important ones: % \begin{itemize} % \item the selection of the language is delayed until % |\begin{document}|, which means you must % add appropriate |\selectlanguage| commands if you include % |\hyphenation| lists in the preamble of your document. % \item \babel\ now has a \Lenv{language} environment and a new % command |\foreignlanguage|; % \item the way active characters are dealt with is completely % changed. They are called `shorthands'; one can have three % levels of shorthands: on the user level, the language level, and % on `system level'. A consequence of the new way of handling % active characters is that they are now written to auxiliary % files `verbatim'; % \item A language change now also writes information in the % \file{.aux} file, as the change might also affect typesetting % the table of contents. The consequence is that an .aux file % generated by a LaTeX format with babel preloaded gives errors % when read with a LaTeX format without babel; but I think this % probably doesn't occur; % \item \babel\ is now compatible with the \pkg{inputenc} and % \pkg{fontenc} packages; % \item the language definition files now have a new extension, % \file{ldf}; % \item the syntax of the file \file{language.dat} is extended to % be compatible with the \pkg{french} package by Bernard Gaulle; % \item each language definition file looks for a configuration % file which has the same name, but the extension \file{.cfg}. It % can contain any valid \LaTeX\ code. % \end{itemize} % % \section{The interface between the core of \babel{} and the language % definition files} % % 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. % % \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. % % \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 behaviour of the \babel{} system is to % define this language as a `dialect' of the language for which the % patterns were loaded as |\language0|. % % The language definition files 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 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; 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. % % \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 The language definition files can be read in the preamble of % the document, but also in the middle of document processing. This % means that they have to function independently of the current % |\catcode| of the \texttt{@}~sign. % \end{itemize} % % \DescribeMacro{\providehyphenmins} % The macro |\providehyphenmins| should be used in the language % definition files to set the |\lefthyphenmin| and % |\righthyphenmin|. This macro will check whether these parameters % were provided by the hyphenation file before it takes any action. % % \DescribeMacro{\langhyphenmins} % The macro |\|\langvar|hyphenmins| is used to store the values of % the |\lefthyphenmin| and |\righthyphenmin|. % % \DescribeMacro{\captionslang} % The macro |\captions|\langvar\ defines the macros that % hold the texts to replace the original hard-wired texts. % % \DescribeMacro{\datelang} % The macro |\date|\langvar\ defines |\today| and % % \DescribeMacro{\extraslang} % The macro |\extras|\langvar\ contains all the extra definitions % needed for a specific language. % % \DescribeMacro{\noextraslang} % 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} % 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{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 % behaviour 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. % % \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. Therefor 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. This macro can, for instance, be used % in adding instructions to a macro like |\extrasenglish|. % % \subsection{Macros common to a number of languages} % % \DescribeMacro{\allowhyphens} % In a couple of European 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 % |\allowhyphens| can be used. % % \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. % % \section{Compatibility with \file{german.sty}}\label{l-h} % % The file \file{german.sty} has been % one of the sources of inspiration for the \babel{} % system. Because of this I wanted to include \file{german.sty} in % the \babel{} system. To be able to do that I had to allow for % one incompatibility: in the definition of the macro % |\selectlanguage| in \file{german.sty} the argument is used as the % {$\langle \it number \rangle$} for an |\ifcase|. So in this case % a call to |\selectlanguage| might look like % |\selectlanguage{\german}|. % % In the definition of the macro |\selectlanguage| in % \file{babel.def} the argument is used as a part of other % macronames, so a call to |\selectlanguage| now looks like % |\selectlanguage{german}|. Notice the absence of the escape % character. As of version~3.1a of \babel{} both syntaxes are % allowed. % % All other features of the original \file{german.sty} have been % copied into a new file, called \file{germanb.sty}\footnote{The % `b' is added to the name to distinguish the file from Partls' % file.}. % % Although the \babel{} system was developed to be used with % \LaTeX, some of the features implemented in the language % definition files might be needed by plain \TeX\ users. Care has % been taken that all files in the system can be processed by plain % \TeX. % % \section{Compatibility with \file{ngerman.sty}} % % When used with the options \Lopt{ngerman} or \Lopt{naustrian}, % \babel{} will provide all features of the package \pkg{ngerman}. % There is however one exception: The commands for special % hyphenation of double consonants (|"ff| etc.) and ck (|"ck|), % which are no longer required with the new German orthography, are % undefined. With the \pkg{ngerman} package, however, these % commands will generate appropriate warning messages only. % % \section{Compatibility with the \pkg{french} package} % % It has been reported to me that the package \pkg{french} by % Bernard Gaulle (\texttt{gaulle@idris.fr}) works % together with \babel. On the other hand, it seems \emph{not} to % work well together with a lot of other packages. Therefore I have % decided to no longer load \file{french.ldf} by default. Instead, % when you want to use the package by Bernard Gaulle, you will have % to request it specifically, by passing either \Lopt{frenchle} or % \Lopt{frenchpro} as an option to \babel. % %\StopEventually{% % \clearpage % \let\filename\thisfilename % \section{Conclusion} % % A system of document options has been presented that enable the % user of \LaTeX\ to adapt the standard document classes of \LaTeX\ % to the language he or she prefers to use. These options offer the % possibility of switching between languages in one document. The % basic interface consists of using one option, which is the same % for \emph{all} standard document classes. % % In some cases the language definition files provide macros that % can be useful to plain \TeX\ users as well as to \LaTeX\ users. % The \babel{} system has been implemented so that it % can be used by both groups of users. % % \section{Acknowledgements} % % I would like to thank all who volunteered as $\beta$-testers for % their time. I would like to mention Julio Sanchez who supplied % the option file for the Spanish language and Maurizio Codogno who % supplied the option file for the Italian language. 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{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). A Dutch book on layout % design and typography. % \bibitem{HP} Hubert Partl, % \emph{German \TeX}, \emph{TUGboat} 9 (1988) \#1, p.~70--72. % \bibitem{LLth} Leslie Lamport, % in: \TeXhax\ 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{ilatex} Joachim Schrod, % \emph{International \LaTeX\ is ready to use}, % \emph{TUGboat} 11 (1990) \#1, p.~87--90. % \end{thebibliography} % } % % \section{Identification} % % The file \file{babel.sty}\footnote{The file described in this % section is called \texttt{\filename}, has version % number~\fileversion\ and was last revised on~\filedate.} is meant % for \LaTeXe, therefor we make sure that the format file used is % the right one. % % \begin{macro}{\ProvidesLanguage} % \changes{babel~3.7a}{1997/03/18}{Added macro to prevent problems % with unexpected \cs{ProvidesFile} in plain formats because of % \babel.} % 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. % \changes{babel~3.4e}{1994/06/24}{Redid the identification code, % provided dummy definition of \cs{ProvidesFile} for plain \TeX} % \changes{babel~3.5f}{1995/07/26}{Store version in \cs{fileversion}} % \changes{babel~3.5f}{1995/12/18}{Need to temporarily change the % definition of \cs{ProvidesFile} for December 1995 release} % \changes{babel~3.5g}{1996/07/09}{Save a few csnames; use % \cs{bbl@tempa} instead of \cs{\@ProvidesFile} and store message % in \cs{toks8}} % \begin{macrocode} %<*!package> \ifx\ProvidesFile\@undefined \def\ProvidesFile#1[#2 #3 #4]{% \wlog{File: #1 #4 #3 <#2>}% %<*kernel&patterns> \toks8{Babel <#3> and hyphenation patterns for }% % \let\ProvidesFile\@undefined } % \end{macrocode} % As an alternative for |\ProvidesFile| we define % |\ProvidesLanguage| here to be used in the language definition % files. % \begin{macrocode} %<*kernel> \def\ProvidesLanguage#1[#2 #3 #4]{% \wlog{Language: #1 #4 #3 <#2>}% } \else % \end{macrocode} % In this case we save the original definition of |\ProvidesFile| in % |\bbl@tempa| and restore it after we have stored the version of % the file in |\toks8|. % \changes{babel~3.7a}{1997/11/04}{Removed superfluous braces} % \begin{macrocode} %<*kernel&patterns> \let\bbl@tempa\ProvidesFile \def\ProvidesFile#1[#2 #3 #4]{% \toks8{Babel <#3> and hyphenation patterns for }% \bbl@tempa#1[#2 #3 #4]% \let\ProvidesFile\bbl@tempa} % % \end{macrocode} % When |\ProvidesFile| is defined we give |\ProvidesLanguage| a % similar definition. % \begin{macrocode} \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} % % Identify each file that is produced from this source file. % \changes{babel~3.4c}{1995/04/28}{lhyphen.cfg has become % lthyphen.cfg} % \changes{babel~3.5b}{1995/01/25}{lthyphen.cfg has become hyphen.cfg} % \begin{macrocode} %<+package>\ProvidesPackage{babel} %<+core>\ProvidesFile{babel.def} %<+kernel&patterns>\ProvidesFile{hyphen.cfg} %<+kernel&!patterns>\ProvidesFile{switch.def} %<+driver&!user>\ProvidesFile{babel.drv} %<+driver&user>\ProvidesFile{user.drv} [2008/07/06 v3.8l % %<+package> The Babel package] %<+core> Babel common definitions] %<+kernel> Babel language switching mechanism] %<+driver>] % \end{macrocode} % % \section{The Package File} % % 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 known in the \babel\ system. It also takes care % of a number of compatibility issues with other packages. % % \subsection{Language options} % % \changes{babel~3.6c}{1997/01/05}{When \cs{LdfInit} is undefined we % need to load \file{babel.def} from \file{babel.sty}} % \changes{babel~3.6l}{1999/04/03}{Don't load \file{babel.def} now, % but rather define \cs{LdfInit} temporarily in order to load % \file{babel.def} at the right time, preventing problems with the % temporary definition of \cs{bbl@redefine}} % \changes{babel~3.6r}{1999/04/12}{We \textbf{do} need to load % \file{babel.def} right now as \cs{ProvidesLanguage} needs to be % defined before the \file{.ldf} files are read and the reason for % for 3.6l has been removed} % \begin{macrocode} %<*package> \ifx\LdfInit\@undefined\input babel.def\relax\fi % \end{macrocode} % % For all the languages supported we need to declare an option. % \changes{babel~3.5a}{1995/03/14}{Changed extension of language % definition files to \texttt{ldf}} % \changes{babel~3.5d}{1995/07/02}{Load language definition files % \emph{after} the check for the hyphenation patterns} % \changes{babel~3.5g}{1996/10/04}{Added option \Lopt{afrikaans}} % \changes{babel~3.7g}{2001/02/09}{Added option \Lopt{acadian}} % \changes{babel~3.8c}{2004/06/12}{Added option \Lopt{australian}} % \changes{babel~3.8h}{2005/11/23}{Added option \Lopt{albanian}} % \begin{macrocode} \DeclareOption{acadian}{\input{frenchb.ldf}} \DeclareOption{albanian}{\input{albanian.ldf}} \DeclareOption{afrikaans}{\input{dutch.ldf}} \DeclareOption{american}{\input{english.ldf}} \DeclareOption{australian}{\input{english.ldf}} % \end{macrocode} % Austrian is really a dialect of German. % \changes{babel~3.6i}{1997/02/20}{Added the \Lopt{Basque} option} % \begin{macrocode} \DeclareOption{austrian}{\input{germanb.ldf}} % \end{macrocode} % \changes{babel~3.8h}{2005/11/23}{added synonyms \Lopt{indonesian}, % \Lopt{indon} and \Lopt{bahasai} for the original bahasa % (indonesia) support} % \changes{babel~3.8h}{2005/11/23}{added \Lopt{malay}, \Lopt{meyaluy} % and \Lopt{bahasam} for the Bahasa Malaysia support} % \begin{macrocode} \DeclareOption{bahasa}{\input{bahasai.ldf}} \DeclareOption{indonesian}{\input{bahasai.ldf}} \DeclareOption{indon}{\input{bahasai.ldf}} \DeclareOption{bahasai}{\input{bahasai.ldf}} \DeclareOption{malay}{\input{bahasam.ldf}} \DeclareOption{meyalu}{\input{bahasam.ldf}} \DeclareOption{bahasam}{\input{bahasam.ldf}} \DeclareOption{basque}{\input{basque.ldf}} \DeclareOption{brazil}{\input{portuges.ldf}} % \end{macrocode} % \changes{babel~3.5b}{1995/05/25}{Added \Lopt{brazilian} as % alternative for \Lopt{brazil}} % \begin{macrocode} \DeclareOption{brazilian}{\input{portuges.ldf}} \DeclareOption{breton}{\input{breton.ldf}} % \end{macrocode} % \changes{babel~3.5d}{1995/07/02}{Added \Lopt{british} as an % alternative for \Lopt{english} with a preference for british % hyphenation} % \changes{babel~3.7f}{2000/09/21}{Added the \Lopt{bulgarian} option} % \changes{babel~3.7g}{2001/02/07}{Added option \Lopt{canadian}} % \changes{babel~3.7g}{2001/02/09}{Added option \Lopt{canadien}} % \begin{macrocode} \DeclareOption{british}{\input{english.ldf}} \DeclareOption{bulgarian}{\input{bulgarian.ldf}} \DeclareOption{canadian}{\input{english.ldf}} \DeclareOption{canadien}{\input{frenchb.ldf}} \DeclareOption{catalan}{\input{catalan.ldf}} \DeclareOption{croatian}{\input{croatian.ldf}} \DeclareOption{czech}{\input{czech.ldf}} \DeclareOption{danish}{\input{danish.ldf}} \DeclareOption{dutch}{\input{dutch.ldf}} % \end{macrocode} % \changes{babel~3.5b}{1995/06/06}{Added the \Lopt{estonian} option} % \begin{macrocode} \DeclareOption{english}{\input{english.ldf}} \DeclareOption{esperanto}{\input{esperanto.ldf}} \DeclareOption{estonian}{\input{estonian.ldf}} \DeclareOption{finnish}{\input{finnish.ldf}} % \end{macrocode} % The \babel\ support or French used to be stored in % \file{francais.ldf}; therefor the \LaTeX2.09 option used to be % \Lopt{francais}. The hyphenation patterns may be loaded as either % `french' or as `francais'. % \changes{babel~3.5f}{1996/01/10}{Now use the file \file{frenchb.ldf} % from Daniel Flipo for french support} % \changes{babel~3.6e}{1997/01/08}{Added option \Lopt{frenchb} an % alias for \Lopt{francais}} % \begin{macrocode} \DeclareOption{francais}{\input{frenchb.ldf}} \DeclareOption{frenchb}{\input{frenchb.ldf}} % \end{macrocode} % With \LaTeXe\ we can now also use the option \Lopt{french} and % still call the file \file{frenchb.ldf}. % \changes{babel~3.5d}{1995/07/02}{Load \file{french.ldf} when it is % found instead of \file{frenchb.ldf}} % \changes{babel~3.7j}{2003/06/07}{\emph{only} load % \file{frenchb.ldf}} % \begin{macrocode} \DeclareOption{french}{\input{frenchb.ldf}}% \DeclareOption{galician}{\input{galician.ldf}} \DeclareOption{german}{\input{germanb.ldf}} \DeclareOption{germanb}{\input{germanb.ldf}} % \end{macrocode} % \changes{babel~3.5f}{1996/05/31}{Added the \Lopt{greek} option} % \changes{babel~3.7a}{1997/11/13}{Added the \Lopt{polutonikogreek} % option} % \changes{babel~3.7c}{1999/04/22}{set the correct language attribute % for polutoniko greek} % \begin{macrocode} \DeclareOption{greek}{\input{greek.ldf}} \DeclareOption{polutonikogreek}{% \input{greek.ldf}% \languageattribute{greek}{polutoniko}} % \end{macrocode} % \changes{babel~3.7a}{1998/03/27}{Added the \Lopt{hebrew} option} % \begin{macrocode} \DeclareOption{hebrew}{% \input{rlbabel.def}% \input{hebrew.ldf}} % \end{macrocode} % \Lopt{hungarian} is just a synonym for \Lopt{magyar} %^^A \changes{babel~3.6i}{1997/02/21}{Added the \Lopt{kannada} option} % \changes{babel~3.7a}{1997/05/21}{Added the \Lopt{icelandic} option} %^^A \changes{babel~3.7a}{1998/03/30}{{Added the \Lopt{nagari} option} % \changes{babel~3.7b}{1998/06/25}{Added the \Lopt{latin} option} % \changes{babel~3.7m}{2003/11/13}{Added the \Lopt{interlingua} % option} % \begin{macrocode} \DeclareOption{hungarian}{\input{magyar.ldf}} \DeclareOption{icelandic}{\input{icelandic.ldf}} \DeclareOption{interlingua}{\input{interlingua.ldf}} \DeclareOption{irish}{\input{irish.ldf}} \DeclareOption{italian}{\input{italian.ldf}} \DeclareOption{latin}{\input{latin.ldf}} \DeclareOption{lowersorbian}{\input{lsorbian.ldf}} %^^A\DeclareOption{kannada}{\input{kannada.ldf}} \DeclareOption{magyar}{\input{magyar.ldf}} %^^A\DeclareOption{nagari}{\input{nagari.ldf}} % \end{macrocode} % `New' German orthography, including Austrian variant: % \changes{babel~3.6p}{1999/04/10}{Added the \Lopt{ngerman} and % \Lopt{naustrian} options} % \changes{babel~3.7f}{2000/09/26}{Added the \Lopt{samin} option} % \changes{babel~3.8c}{2004/06/12}{Added the \Lopt{newzealand} option} % \begin{macrocode} \DeclareOption{naustrian}{\input{ngermanb.ldf}} \DeclareOption{newzealand}{\input{english.ldf}} \DeclareOption{ngerman}{\input{ngermanb.ldf}} \DeclareOption{norsk}{\input{norsk.ldf}} \DeclareOption{samin}{\input{samin.ldf}} % \end{macrocode} % For Norwegian two spelling variants are provided. % \begin{macrocode} \DeclareOption{nynorsk}{\input{norsk.ldf}} \DeclareOption{polish}{\input{polish.ldf}} \DeclareOption{portuges}{\input{portuges.ldf}} \DeclareOption{portuguese}{\input{portuges.ldf}} \DeclareOption{romanian}{\input{romanian.ldf}} \DeclareOption{russian}{\input{russianb.ldf}} % \end{macrocode} %^^A \changes{babel~3.7a}{1997/02/07}{Added the \Lopt{sanskrit} option} % \changes{babel~3.6i}{1997/02/21}{Added the \Lopt{ukrainian} option} %^^A \changes{babel~3.7a}{1998/03/30}{Added the \Lopt{tamil} option} % \begin{macrocode} %^^A\DeclareOption{sanskrit}{\input{sanskrit.ldf}} \DeclareOption{scottish}{\input{scottish.ldf}} \DeclareOption{serbian}{\input{serbian.ldf}} \DeclareOption{slovak}{\input{slovak.ldf}} \DeclareOption{slovene}{\input{slovene.ldf}} \DeclareOption{spanish}{\input{spanish.ldf}} \DeclareOption{swedish}{\input{swedish.ldf}} %^^A\DeclareOption{tamil}{\input{tamil.ldf}} \DeclareOption{turkish}{\input{turkish.ldf}} \DeclareOption{ukrainian}{\input{ukraineb.ldf}} \DeclareOption{uppersorbian}{\input{usorbian.ldf}} \DeclareOption{welsh}{\input{welsh.ldf}} % \end{macrocode} % \changes{babel~3.6e}{1997/01/08}{Added options \Lopt{UKenglish} and % \Lopt{USenglish}} % \begin{macrocode} \DeclareOption{UKenglish}{\input{english.ldf}} \DeclareOption{USenglish}{\input{english.ldf}} % \end{macrocode} % % For all those languages for which the option name is the same as % the name of the language specific file we specify a default % option, which tries to load the file specified. If this doesn't % succeed an error is signalled. % \changes{babel~3.6i}{1997/03/12}{Added default option} % \begin{macrocode} \DeclareOption*{% \InputIfFileExists{\CurrentOption.ldf}{}{% \PackageError{babel}{% Language definition file \CurrentOption.ldf not found}{% Maybe you misspelled the language option?}}% } % \end{macrocode} % Another way to extend the list of `known' options for \babel\ is % to create the file \file{bblopts.cfg} in which one can add % option declarations. % \changes{babel~3.6i}{1997/03/15}{Added the possibility to have a % \file{bblopts.cfg} file with option declarations.} % \begin{macrocode} \InputIfFileExists{bblopts.cfg}{% \typeout{*************************************^^J% * Local config file bblopts.cfg used^^J% *}% }{} % \end{macrocode} % % Apart from all the language options we also have a few options % that influence the behaviour of language definition files. % % The following options don't do anything themselves, they are just % defined in order to make it possible for language definition % files to check if one of them was specified by the user. % \changes{babel~3.5d}{1995/07/04}{Added options to influence % behaviour of active acute and grave accents} % \begin{macrocode} \DeclareOption{activeacute}{} \DeclareOption{activegrave}{} % \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.6f}{1997/01/14}{Added option % \Lopt{KeepShorthandsActive}} % \changes{babel~3.7a}{1997/03/21}{No longer define the control % sequence \cs{KeepShorthandsActive}} % \begin{macrocode} \DeclareOption{KeepShorthandsActive}{} % \end{macrocode} % % The options have to be processed in the order in which the user % specified them: % \begin{macrocode} \ProcessOptions* % \end{macrocode} % \changes{babel~3.7c}{1999/03/13}{Added an error message for when no % language option was specified} % 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.7c}{1999/04/09}{No longer us a redefinition of an % internal macro, just check \cs{bbl@main@language} and load % \file{babel.def}} % \begin{macrocode} \ifx\bbl@main@language\@undefined \PackageError{babel}{% You haven't specified a language option}{% You need to specify a language, either as a global option\MessageBreak or as an optional argument to the \string\usepackage\space command; \MessageBreak You shouldn't try to proceed from here, type x to quit.} % \end{macrocode} % To prevent undefined command errors when the user insists on % continuing we load \file{babel.def} here. He should expect more % errors though. % \begin{macrocode} \input{babel.def} \fi % \end{macrocode} % % \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. % \changes{babel~3.7j}{2003/06/15}{create file with lowercase name} % \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} % % \begin{macrocode} % % \end{macrocode} % % \section{The Kernel of Babel} % % The kernel of the \babel\ system is stored in either % \file{hyphen.cfg} or \file{switch.def} and \file{babel.def}. 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. The file \file{babel.def} contains some % \TeX\ code that can be read in at run time. When \file{babel.def} % is loaded it checks if \file{hyphen.cfg} is in the format; if % not the file \file{switch.def} is loaded. % % 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. % % When the command |\AtBeginDocument| doesn't exist we assume that % we are dealing with a plain-based format. In that case the file % \file{plain.def} is needed. % % \begin{macrocode} %<*kernel|core> \ifx\AtBeginDocument\@undefined % \end{macrocode} % But we need to use the second part of \file{plain.def} (when we % load it from \file{switch.def}) which we can do by defining % |\adddialect|. % \changes{babel~3.7c}{1999/04/20}{define \cs{adddialect} before % loading \file{plain.def} here} % \begin{macrocode} % \def\adddialect{} \input plain.def\relax \fi % % \end{macrocode} % % Check the presence of the command |\iflanguage|, if it is % undefined read the file \file{switch.def}. % \changes{babel~3.0d}{1991/10/29}{Removed use of \cs{@ifundefined}} % \begin{macrocode} %<*core> \ifx\iflanguage\@undefined \input switch.def\relax \fi % % \end{macrocode} % \changes{babel~3.6a}{1996/11/02}{Removed \cs{babel@core@loaded}, no % longer needed with the advent of \cs{LdfInit}} % % \subsection{Encoding issues (part 1)} % % The first thing we need to do is to determine, at % |\begin{document}|, which latin fontencoding to use. % % \begin{macro}{\latinencoding} % \changes{babel~3.6i}{1997/03/15}{Macro added, moved from % \file{.ldf} files} % 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} %<*core> \AtEndOfPackage{\edef\latinencoding{\cf@encoding}} % \end{macrocode} % But this might be overruled with a later loading of the package % \pkg{fontenc}. Therefor 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.6k}{1999/03/15}{Use T1 encoding when it is a known % encoding} % \changes{babel~3.6m}{1999/04/06}{Can't use \cs{@ifpackageloaded} % need to parse \cs{@filelist}} % \changes{babel~3.6n}{1999/04/07}{moved checking for fontenc right to % the top of \file{babel.sty}} % \changes{babel~3.6n}{1999/04/07}{Added a check for `manual' selection % of \texttt{T1} encoding, without loading \pkg{fontenc}} % \changes{babel~3.6q}{1999/04/12}{Better solution then parsing % \cs{@filelist}, use \cs{@ifl@aded}} % \changes{babel~3.6u}{1999/04/20}{Moved this code to % \file{babel.def}} % \begin{macrocode} \AtBeginDocument{% \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} % \changes{babel~3.6i}{1997/03/15}{Macro added, moved from % \file{.ldf} files} % Then we can define the command |\latintext| which is a % declarative switch to a latin font-encoding. % \begin{macrocode} \DeclareRobustCommand{\latintext}{% \fontencoding{\latinencoding}\selectfont \def\encodingdefault{\latinencoding}} % \end{macrocode} % \end{macro} % % \begin{macro}{\textlatin} % \changes{babel~3.6i}{1997/03/15}{Macro added, moved from % \file{.ldf} files} % \changes{babel~3.7j}{2003/03/19}{added \cs{leavevmode} to prevent a % paragraph starting \emph{inside} the group} % \changes{babel~3.7k}{2003/10/12}{Use \cs{DeclareTextFontComand}} % 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} % % We also need to redefine a number of commands to ensure that the % right font encoding is used, but this can't be done before % \file{babel.def} is loaded. % \changes{babel~3.6o}{1999/04/07}{Moved the rest of the font encoding % related definitions to their original place} % % \subsection{Multiple languages} % % With \TeX\ version~3.0 it has become possible to load hyphenation % patterns for more than one language. This means that some extra % administration has to be taken care of. The user has to know for % which languages patterns have been loaded, and what values of % |\language| have been used. % % Some discussion has been going on in the \TeX\ world about how to % use |\language|. Some have suggested to set a fixed standard, % i.\,e., patterns for each language should \emph{always} be loaded % in the same location. It has also been suggested to use the % \textsc{iso} list for this purpose. Others have pointed out that % the \textsc{iso} list contains more than 256~languages, which % have \emph{not} been numbered consecutively. % % I think the best way to use |\language|, is to use it % dynamically. This code implements an algorithm to do so. It uses % an external file in which 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. % % This ``configuration 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} % % As the file \file{switch.def} needs to be read only once, we % check whether it was read before. If it was, the command % |\iflanguage| is already defined, so we can stop processing. % \begin{macrocode} %<*kernel> %<*!patterns> \expandafter\ifx\csname iflanguage\endcsname\relax \else \expandafter\endinput \fi % % \end{macrocode} % % \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. % \begin{macrocode} \ifx\language\@undefined \csname newcount\endcsname\language \fi % \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{macrocode} \ifx\newlanguage\@undefined \csname newcount\endcsname\last@language % \end{macrocode} % plain \TeX\ version 3.0 uses |\count 19| for this purpose. % \begin{macrocode} \else \countdef\last@language=19 \fi % \end{macrocode} % \end{macro} % % \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. Therefor |\addlanguage| is % defined using a definition based on the macros used to define % |\newlanguage| in plain \TeX\ version~3.0. % \changes{babel~3.2}{1991/11/11}{Added a \texttt{\%}, removed % \texttt{by}} % \begin{macrocode} \ifx\newlanguage\@undefined \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}} % \end{macrocode} % % For formats based on plain version~3.0 the definition of % |\newlanguage| can be simply copied, removing |\outer|. % % \begin{macrocode} \else \def\addlanguage{\alloc@9\language\chardef\@cclvi} \fi % \end{macrocode} % \end{macro} % % \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. % \changes{babel~3.2}{1991/11/11}{Added \cs{relax}} % \begin{macrocode} \def\adddialect#1#2{% \global\chardef#1#2\relax \wlog{\string#1 = a dialect from \string\language#2}} % \end{macrocode} % \end{macro} % % \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. % \changes{babel~3.0a}{1991/05/29}{Added \cs{@bsphack} and % \cs{@esphack}} % \changes{babel~3.0c}{1991/07/21}{Added comment character after % \texttt{\#2}} % \changes{babel~3.0d}{1991/08/08}{Removed superfluous % \cs{expandafter}} % \changes{babel~3.0d}{1991/10/07}{Removed space hacks and use of % \cs{@ifundefined}} % \changes{babel~3.2}{1991/11/11}{Rephrased \cs{ifnum} test} % \changes{babel~3.7a}{1998/06/10}{Now evaluate the \cs{ifnum} test % \emph{after} the \cs{fi} from the \cs{ifx} test and use % \cs{@firstoftwo} and \cs{@secondoftwo}} % \changes{babel~3.7b}{1998/06/29}{Slight enhancement: added braces % around first argument of \cs{bbl@afterfi}} % \begin{macrocode} \def\iflanguage#1{% \expandafter\ifx\csname l@#1\endcsname\relax \@nolanerr{#1}% \else \bbl@afterfi{\ifnum\csname l@#1\endcsname=\language \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi}% \fi} % \end{macrocode} % \end{macro} % % \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.0c}{1991/06/06}{Made \cs{selectlanguage} % robust} % \changes{babel~3.2}{1991/11/11}{Modified to allow arguments that % start with an escape character} % \changes{babel~3.2a}{1991/11/17}{Simplified the modification to % allow the use in a \cs{write} command} % \changes{babel~3.5b}{1995/05/13}{Store the name of the current % language in a control sequence instead of passing the whole macro % construct to strip the escape character in the argument of % \cs{selectlanguage }.} % \changes{babel~3.5f}{1995/08/30}{Added a missing percent character} % \changes{babel~3.5f}{1995/11/16}{Moved check for escape character % one level down in the expansion} % \begin{macrocode} \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 =. % Therefor, 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. Therefor 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} % % \changes{babel~3.5b}{1995/03/04}{Changed the name of the internal % macro to \cs{selectlanguage }.} % \changes{babel~3.5b}{1995/03/05}{Added an extra level of expansion to % separate the switching mechanism from writing to aux files} % \changes{babel~3.7f}{2000/09/25}{Use \cs{aftergroup} to keep the % language grouping correct in auxiliary files {PR3091}} % 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. Therefor 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. % % \changes{babel~3.7j}{2003/03/18}{Introduce the language stack % mechanism} % \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} \xdef\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{% \def\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: % \begin{macrocode} \def\bbl@pop@language{% \expandafter\bbl@pop@lang\bbl@language@stack-\bbl@language@stack % \end{macrocode} % 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}$$ \expandafter\bbl@set@language\expandafter{\languagename}% } % \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} % % \changes{babel~3.7j}{2003/03/18}{Now use the language stack mechanism} % \begin{macrocode} \expandafter\def\csname selectlanguage \endcsname#1{% \bbl@push@language \aftergroup\bbl@pop@language \bbl@set@language{#1}} % \end{macrocode} % \changes{babel~3.7m}{2003/11/12}{Removed the superfluous empty % definition of \cs{bbl@pop@language}} % \end{macro} % % \begin{macro}{\bbl@set@language} % \changes{babel~3.5f}{1995/11/16}{Now also define \cs{languagename} % at this level} % \changes{babel~3.7f}{2000/09/25}{Macro \cs{bbl@set@language} % introduced} % The macro |\bbl@set@language| takes care of switching the language % environment \emph{and} of writing entries on the auxiliary files. % \begin{macrocode} \def\bbl@set@language#1{% \edef\languagename{% \ifnum\escapechar=\expandafter`\string#1\@empty \else \string#1\@empty\fi}% \select@language{\languagename}% % \end{macrocode} % We also write a command to change the current language in the % auxiliary files. % \changes{babel~3.5a}{1995/02/17}{write the language change to the % auxiliary files} % \begin{macrocode} \if@filesw \protected@write\@auxout{}{\string\select@language{\languagename}}% \addtocontents{toc}{\xstring\select@language{\languagename}}% \addtocontents{lof}{\xstring\select@language{\languagename}}% \addtocontents{lot}{\xstring\select@language{\languagename}}% \fi} % \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.0a}{1991/05/29}{Added \cs{@bsphack} and % \cs{@esphack}} % \changes{babel~3.0d}{1991/08/08}{Removed superfluous % \cs{expandafter}} % \changes{babel~3.0d}{1991/10/07}{Removed space hacks and use of % \cs{@ifundefined}} % \changes{babel~3.2a}{1991/11/17}{Added \cs{relax} as first command % to stop an expansion if \cs{protect} is empty} % \changes{babel~3.6a}{1996/11/07}{Check for the existence of % \cs{date...} instead of \cs{l@...}} % \changes{babel~3.7m}{2003/11/16}{Check for the existence of both % \cs{l@...} and \cs{date...}} % \changes{babel~3.8l}{2008/07/06}{Use \cs{bbl@patterns}} % \begin{macrocode} \def\select@language#1{% \expandafter\ifx\csname l@#1\endcsname\relax \@nolanerr{#1}% \else \expandafter\ifx\csname date#1\endcsname\relax \@noopterr{#1}% \else \bbl@patterns{\languagename}% \originalTeX % \end{macrocode} % The name of the language is stored in the control sequence % |\languagename|. The contents of this control sequence could be % tested in the following way: % \begin{verbatim} % \edef\tmp{\string english} % \ifx\languagename\tmp % ... % \else % ... % \fi % \end{verbatim} % The construction with |\string| is necessary because % |\languagename| returns the name with characters of category code % \texttt{12} (other). 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. % \changes{babel~3.0a}{1991/06/06}{Replaced \cs{gdef} with \cs{def}} % \changes{babel~3.1}{1991/10/31}{\cs{originalTeX} should only be % executed once} % \changes{babel~3.2a}{1991/11/17}{Added three \cs{expandafter}s % to save macro space for \cs{originalTeX}} % \changes{babel~3.2a}{1991/11/20}{Moved definition of % \cs{originalTeX} before \cs{extras\langvar}} % \changes{babel~3.2a}{1991/11/24}{Set \cs{originalTeX} to % \cs{empty}, because it should be expandable.} % \begin{macrocode} \expandafter\def\expandafter\originalTeX \expandafter{\csname noextras#1\endcsname \let\originalTeX\@empty}% % \end{macrocode} % \changes{babel~3.6d}{1997/01/07}{set the language shorthands to % `none' before switching on the extras} % \begin{macrocode} \languageshorthands{none}% \babel@beginsave % \end{macrocode} % 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. % \changes{babel~3.5b}{1995/05/13}{Separated the setting of the % hyphenmin values} % \begin{macrocode} \csname captions#1\endcsname \csname date#1\endcsname \csname extras#1\endcsname\relax % \end{macrocode} % 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.5b}{1995/06/05}{Addedd default setting of hyphenmin % parameters} % \begin{macrocode} \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 \fi \fi} % \end{macrocode} % \end{macro} % % \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 first thing this environment does is store the name of the % language in |\languagename|; it then calls % \verb*=\selectlanguage = to switch on everything that is needed for % this language The |\ignorespaces| command is necessary to hide % the environment when it is entered in horizontal mode. % \changes{babel~3.5d}{1995/06/22}{environment added} % \changes{babel~3.5e}{1995/07/07}{changed name} % \changes{babel~3.7j}{2003/03/18}{rely on \cs{selectlanguage } to % keep track of the nesting} % \begin{macrocode} \long\def\otherlanguage#1{% \csname selectlanguage \endcsname{#1}% \ignorespaces } % \end{macrocode} % The |\endotherlanguage| part of the environment calls % |\originalTeX| to restore (most of) the settings and tries to % hide itself when it is called in horizontal mode. % \begin{macrocode} \long\def\endotherlanguage{% \originalTeX \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|. % \changes{babel~3.5f}{1996/05/29}{environment added} % \changes{babel~3.6d}{1997/01/07}{Introduced \cs{foreign@language}} % \begin{macrocode} \expandafter\def\csname otherlanguage*\endcsname#1{% \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. % \begin{macrocode} \expandafter\def\csname endotherlanguage*\endcsname{% \csname noextras\languagename\endcsname } % \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|. % \changes{babel~3.5d}{1995/06/22}{Macro added} % \changes{babel~3.6d}{1997/01/07}{Introduced \cs{foreign@language}} % \changes{babel~3.7a}{1998/03/12}{Added executing \cs{originalTeX}} % \begin{macrocode} \def\foreignlanguage{\protect\csname foreignlanguage \endcsname} \expandafter\def\csname foreignlanguage \endcsname#1#2{% \begingroup \originalTeX \foreign@language{#1}% #2% \csname noextras#1\endcsname \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\foreign@language} % \changes{babel~3.6d}{1997/01/07}{New macro} % This macro does the work for |\foreignlanguage| and the % \Lenv{otherlanguage*} environment. % \begin{macrocode} \def\foreign@language#1{% % \end{macrocode} % First we need to store the name of the language and check that it % is a known language. % \begin{macrocode} \def\languagename{#1}% \expandafter\ifx\csname l@#1\endcsname\relax \@nolanerr{#1}% \else % \end{macrocode} % If it is we can select the proper hyphenation table and switch on % the extra definitions for this language. % \changes{babel~3.6d}{1997/01/07}{set the language shorthands to % `none' before switching on the extras} % \changes{babel~3.8l}{2008/07/06}{use \cs{bbl@patterns}} % \begin{macrocode} \bbl@patterns{\languagename}% \languageshorthands{none}% % \end{macrocode} % Then we set the left- and right hyphenmin variables. % \changes{babel~3.6d}{1997/01/07}{Added \cs{relax} to prevent % disappearance of the first token after this command.} % \begin{macrocode} \csname extras#1\endcsname \expandafter\ifx\csname #1hyphenmins\endcsname\relax \set@hyphenmins\tw@\thr@@\relax \else \expandafter\expandafter\expandafter\set@hyphenmins \csname #1hyphenmins\endcsname\relax \fi \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@patterns} % \changes{babel~3.8l}{2008/07/06}{Macro added} % 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. % \begin{macrocode} \def\bbl@patterns#1{% \language=\expandafter\ifx\csname l@#1:\f@encoding\endcsname\relax \csname l@#1\endcsname \else \csname l@#1:\f@encoding\endcsname \fi\relax } % \end{macrocode} % \end{macro} % % \begin{environment}{hyphenrules} % \changes{babel~3.7e}{2000/01/28}{Added 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. % \changes{babel~3.8j}{2008/03/16}{Also set the hyphenmin paramters to % the correct value (PR3997)} % \changes{babel~3.8l}{2008/07/06}{Use \cs{bbl@patterns}} % \begin{macrocode} \def\hyphenrules#1{% \expandafter\ifx\csname l@#1\endcsname\@undefined \@nolanerr{#1}% \else \bbl@patterns{#1}% \languageshorthands{none}% \expandafter\ifx\csname #1hyphenmins\endcsname\relax \set@hyphenmins\tw@\thr@@\relax \else \expandafter\expandafter\expandafter\set@hyphenmins \csname #1hyphenmins\endcsname\relax \fi \fi } \def\endhyphenrules{} % \end{macrocode} % \end{environment} % % \begin{macro}{\providehyphenmins} % \changes{babel~3.7f}{2000/02/18}{added macro} % 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\righthyphenmin#2} % \end{macrocode} % \end{macro} % % \begin{macro}{\LdfInit} % \changes{babel~3.6a}{1996/10/16}{Macro added} % 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}. % \begin{macrocode} \def\LdfInit{% \chardef\atcatcode=\catcode`\@ \catcode`\@=11\relax \input babel.def\relax % \end{macrocode} % The category code of the ampersand is restored and the macro % calls itself again with the new definition from % \file{babel.def} % \begin{macrocode} \catcode`\@=\atcatcode \let\atcatcode\relax \LdfInit} % % \end{macrocode} % The second version of this 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 ampersand. We make sure that it is % a `letter' during the processing of the file. % \begin{macrocode} %<*core> \def\LdfInit#1#2{% \chardef\atcatcode=\catcode`\@ \catcode`\@=11\relax % \end{macrocode} % 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. Therefor we store its current catcode and % restore it later on. % \changes{babel~3.7o}{2003/11/26}{make sure the equals sign has its % default category code} % \begin{macrocode} \chardef\eqcatcode=\catcode`\= \catcode`\==12\relax % \end{macrocode} % 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|. % \begin{macrocode} \let\bbl@tempa\relax \expandafter\if\expandafter\@backslashchar \expandafter\@car\string#2\@nil \ifx#2\@undefined \else % \end{macrocode} % If so, we call |\ldf@quit| (but after the end of this |\if| % construction) to set the main language, restore the category code % of the @-sign and call |\endinput|. % \begin{macrocode} \def\bbl@tempa{\ldf@quit{#1}} \fi \else % \end{macrocode} % When |#2| was \emph{not} a control sequence we construct one and % compare it with |\relax|. % \begin{macrocode} \expandafter\ifx\csname#2\endcsname\relax \else \def\bbl@tempa{\ldf@quit{#1}} \fi \fi \bbl@tempa % \end{macrocode} % Finally we check |\originalTeX|. % \begin{macrocode} \ifx\originalTeX\@undefined \let\originalTeX\@empty \else \originalTeX \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\ldf@quit} % \changes{babel~3.6a}{1996/10/29}{Macro added} % This macro interrupts the processing of a language definition file. % \changes{babel~3.7o}{2003/11/26}{Also restore the category code of % the equals sign} % \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} % \changes{babel~3.6a}{1996/10/16}{Macro added} % 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.7o}{2003/11/26}{Also restore the category code of % the equals sign} % \begin{macrocode} \def\ldf@finish#1{% \loadlocalcfg{#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. Therefor % they are turned into warning messages in \LaTeX. % \begin{macrocode} \@onlypreamble\LdfInit \@onlypreamble\ldf@quit \@onlypreamble\ldf@finish % \end{macrocode} % % \begin{macro}{\main@language} % \changes{babel~3.5a}{1995/02/17}{Macro added} % \changes{babel~3.6a}{1996/10/16}{\cs{main@language} now also sets % \cs{languagename} and \cs{l@languagename} for use by other % packages in the preamble of a document} % \begin{macro}{\bbl@main@language} % \changes{babel~3.5a}{1995/02/17}{Macro added} % 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} % The default is to use English as the main language. % \changes{babel~3.6c}{1997/01/05}{When \file{hyphen.cfg} is not % loaded in the format \cs{l@english} might not be defined; assume % english is language 0} % \begin{macrocode} \ifx\l@english\@undefined \let\l@english\z@ \fi \main@language{english} % \end{macrocode} % We also have to make sure that some code gets executed at the % beginning of the document. % \begin{macrocode} \AtBeginDocument{% \expandafter\selectlanguage\expandafter{\bbl@main@language}} % % \end{macrocode} % \end{macro} % \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|. % \changes{babel~3.2a}{1991/11/24}{Set \cs{originalTeX} to % \cs{empty}, because it should be expandable.} % \begin{macrocode} %<*kernel> \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} % % \begin{macro}{\@nolanerr} % \changes{babel~3.4e}{1994/06/25}{Use \cs{PackageError} in \LaTeXe\ % mode} % \begin{macro}{\@nopatterns} % \changes{babel~3.4e}{1994/06/25}{Macro added} % 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} % \changes{babel~3.7m}{2003/11/16}{Macro added} % 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.0d}{1991/10/07}{Added a percent sign to remove % unwanted white space} % \changes{babel~3.5a}{1995/02/15}{Added \cs{@activated} to log active % characters} % \changes{babel~3.5c}{1995/06/19}{Added missing closing brace} % \begin{macrocode} \ifx\PackageError\@undefined \def\@nolanerr#1{% \errhelp{Your command will be ignored, type to proceed}% \errmessage{You haven't defined the language #1\space yet}} \def\@nopatterns#1{% \message{No hyphenation patterns were loaded for}% \message{the language `#1'}% \message{I will use the patterns loaded for \string\language=0 instead}} \def\@noopterr#1{% \errmessage{The option #1 was not specified in \string\usepackage} \errhelp{You may continue, but expect unexpected results}} \def\@activated#1{% \wlog{Package babel Info: Making #1 an active character}} \else \newcommand*{\@nolanerr}[1]{% \PackageError{babel}% {You haven't defined the language #1\space yet}% {Your command will be ignored, type to proceed}} \newcommand*{\@nopatterns}[1]{% \PackageWarningNoLine{babel}% {No hyphenation patterns were loaded for\MessageBreak the language `#1'\MessageBreak I will use the patterns loaded for \string\language=0 instead}} \newcommand*{\@noopterr}[1]{% \PackageError{babel}% {You haven't loaded the option #1\space yet}% {You may proceed, but expect unexpected results}} \newcommand*{\@activated}[1]{% \PackageInfo{babel}{% Making #1 an active character}} \fi % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % 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}. % \begin{macrocode} %<*patterns> % \end{macrocode} % % \changes{babel~3.5g}{1996/07/09}{Removed the use of % \cs{patterns@loaded} altogether} % % \begin{macro}{\process@line} % \changes{babel~3.5b}{1995/04/28}{added macro} % 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.5g}{1996/07/09}{Simplified code, removing % \cs{bbl@eq@}} % \changes{babel~3.7c}{1999/04/09}{added an extra argument in order to % prevent a trailing space from becoming part of the control % sequence when defining a synonym (PR 2851)} % \begin{macrocode} \def\process@line#1#2 #3/{% \ifx=#1 \process@synonym#2 / \else \process@language#1#2 #3/% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\process@synonym} % \changes{babel~3.5b}{1995/04/28}{added macro} % This macro takes care of the lines which start with an % \texttt{=}. It needs an empty token register to begin with. % \begin{macrocode} \toks@{} \def\process@synonym#1 /{% \ifnum\last@language=\m@ne % \end{macrocode} % When no languages have been loaded yet, the name following the % \texttt{=} will be a synonym for hyphenation register 0. % \begin{macrocode} \expandafter\chardef\csname l@#1\endcsname0\relax \wlog{\string\l@#1=\string\language0} % \end{macrocode} % As no hyphenation patterns are read in yet, we can not yet set % the hyphenmin parameters. Therefor a commands to do so is stored % in a token register and executed when the first pattern file has % been processed. % \changes{babel~3.7c}{1999/04/27}{Use a token register to temporarily % store a command to set hyphenmin parameters for the synonym which % is defined \emph{before} the first pattern file is processed} % \begin{macrocode} \toks@\expandafter{\the\toks@ \expandafter\let\csname #1hyphenmins\expandafter\endcsname \csname\languagename hyphenmins\endcsname}% \else % \end{macrocode} % Otherwise the name will be a synonym for the language loaded last. % \begin{macrocode} \expandafter\chardef\csname l@#1\endcsname\last@language \wlog{\string\l@#1=\string\language\the\last@language} % \end{macrocode} % We also need to copy the hyphenmin parameters for the synonym. % \changes{babel~3.7c}{1999/04/22}{Now also store hyphenmin parameters % for language synonyms} % \begin{macrocode} \expandafter\let\csname #1hyphenmins\expandafter\endcsname \csname\languagename hyphenmins\endcsname \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 third argument is optional, % so a |/| character is expected to delimit the last % argument. 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'. % \changes{babel~3.0d}{1991/08/08}{Removed superfluous % \cs{expandafter}} % \changes{babel~3.0d}{1991/08/21}{Reinserted \cs{expandafter}} % \changes{babel~3.0d}{1991/10/27}{Added the collection of pattern % names.} % \changes{babel~3.7c}{1999/04/22}{Also store \cs{languagename} for % possible later use in \cs{process@synonym}} % \begin{macrocode} \def\process@language#1 #2 #3/{% \expandafter\addlanguage\csname l@#1\endcsname \expandafter\language\csname l@#1\endcsname \def\languagename{#1}% % \end{macrocode} % 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. % \begin{macrocode} \global\toks8\expandafter{\the\toks8#1, }% % \end{macrocode} % \changes{babel~3.7f}{2000/02/18}{Allow for the encoding to be used % as part of the language name} % 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|. % \begin{macrocode} \begingroup \bbl@get@enc#1:\@@@ \ifx\bbl@hyph@enc\@empty \else \fontencoding{\bbl@hyph@enc}\selectfont \fi % \end{macrocode} % % \changes{babel~3.4e}{1994/06/24}{Added code to detect assignments to % left- and righthyphenmin in the patternfile.} % Some pattern files contain assignments to |\lefthyphenmin| and % |\righthyphenmin|. \TeX\ does not keep track of these % assignments. Therefor we try to detect such assignments and % store them in the |\|\langvar|hyphenmins| macro. When no % assignments were made we provide a default setting. % \begin{macrocode} \lefthyphenmin\m@ne % \end{macrocode} % Some pattern files contain changes to the |\lccode| en |\uccode| % arrays. Such changes should remain local to the language; % therefor we process the pattern file in a group; the |\patterns| % command acts globally so its effect will be remembered. % \changes{babel~3.7a}{1998/03/27}{Read pattern files in a group} % \changes{babel~3.7c}{1999/04/05}{need to set hyphenmin values % globally} % \changes{babel~3.7c}{1999/04/22}{Set \cs{lefthyphenmin} to \cs{m@ne} % \emph{inside} the group; explicitly set the hyphenmin parameters % for language 0} % \begin{macrocode} \input #2\relax % \end{macrocode} % Now we globally store the settings of |\lefthyphenmin| and % |\righthyphenmin| and close the group. % \changes{babel~3.7c}{1999/04/25}{Only set hyphenmin values when the % pattern file changed them} % \begin{macrocode} \ifnum\lefthyphenmin=\m@ne \else \expandafter\xdef\csname #1hyphenmins\endcsname{% \the\lefthyphenmin\the\righthyphenmin}% \fi \endgroup % \end{macrocode} % If the counter |\language| is still equal to zero we set the % hyphenmin parameters to the values for the language loaded on % pattern register 0. % \begin{macrocode} \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 % \end{macrocode} % Now execute the contents of token register zero as it may % contain commands which set the hyphenmin parameters for synonyms % that were defined before the first pattern file is read in. % \changes{babel~3.7c}{1999/04/27}{Added the execution of the contents % of \cs{toks@}} % \begin{macrocode} \the\toks@ \fi % \end{macrocode} % Empty the token register after use. % \begin{macrocode} \toks@{}% % \end{macrocode} % 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. % \changes{babel~3.5b}{1995/04/28}{Added optional reading of file with % hyphenation exceptions} % \changes{babel~3.5f}{1995/07/25}{Use \cs{empty} instead of % \cs{@empty} as the latter is unknown in plain} % \begin{macrocode} \def\bbl@tempa{#3}% \ifx\bbl@tempa\@empty \else \ifx\bbl@tempa\space \else \input #3\relax \fi \fi } % \end{macrocode} % % \begin{macro}{\bbl@get@enc} % \changes{babel~3.7f}{2000/02/18}{Added macro} % \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\@@@{% % \end{macrocode} % First store both arguments in temporary macros, % \begin{macrocode} \def\bbl@tempa{#1}% \def\bbl@tempb{#2}% % \end{macrocode} % then, if the second argument was empty, no font encoding was % specified and we're done. % \begin{macrocode} \ifx\bbl@tempb\@empty \let\bbl@hyph@enc\@empty \else % \end{macrocode} % But if the second argument was \emph{not} empty it will now have % a superfluous colon attached to it which we need to remove. This % done by feeding it to |\bbl@get@enc|. The string that we are % after will then be in the first argument and be stored in % |\bbl@tempa|. % \begin{macrocode} \bbl@get@enc#2\@@@ \edef\bbl@hyph@enc{\bbl@tempa}% \fi} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \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} \ifeof1 \message{I couldn't find the file language.dat,\space I will try the file hyphen.tex} \input hyphen.tex\relax \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$. % % \changes{babel~3.1}{1991/05/21}{Removed use of \cs{toks0}} % \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} % % Empty lines are skipped. % \begin{macrocode} \ifx\bbl@line\@empty \else % \end{macrocode} % % Now we add a space and a |/| character to the end of % |\bbl@line|. This is needed to be able to recognize the third, % optional, argument of |\process@language| later on. % \changes{babel~3.5b}{1995/04/28}{Now add a \cs{space} and a / % character} % \begin{macrocode} \edef\bbl@line{\bbl@line\space/}% \expandafter\process@line\bbl@line \fi % \end{macrocode} % % Check for the end of the file. To avoid a new \texttt{if} % control sequence we create the necessary |\iftrue| or |\iffalse| % with the help of |\csname|. But there is one complication with % this approach: when skipping the \texttt{loop...repeat} \TeX\ has % to read |\if|/|\fi| pairs. So we have to insert a `dummy' % |\iftrue|. % \changes{babel~3.1}{1991/10/31}{Removed the extra \texttt{if} % control sequence} % \begin{macrocode} \iftrue \csname fi\endcsname \csname if\ifeof1 false\else true\fi\endcsname \repeat % \end{macrocode} % % Reactivate the default patterns, % \begin{macrocode} \language=0 \fi % \end{macrocode} % and close the configuration file. % \changes{babel~3.2a}{1991/11/20}{Free macro space for % \cs{process@language}} % \begin{macrocode} \closein1 % \end{macrocode} % Also remove some macros from memory % \begin{macrocode} \let\process@language\@undefined \let\process@synonym\@undefined \let\process@line\@undefined \let\bbl@tempa\@undefined \let\bbl@tempb\@undefined \let\bbl@eq@\@undefined \let\bbl@line\@undefined \let\bbl@get@enc\@undefined % \end{macrocode} % % \changes{babel~3.5f}{1995/11/08}{Moved the fiddling with \cs{dump} % to \file{bbplain.dtx} as it is no longer needed for \LaTeX} % 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.6h}{1997/01/23}{Added a couple of \cs{expandafter}s % to copy the contents of \cs{toks8} into \cs{everyjob} instead of % the reference} % \begin{macrocode} \ifx\addto@hook\@undefined \else \expandafter\addto@hook\expandafter\everyjob\expandafter{% \expandafter\typeout\expandafter{\the\toks8 loaded.}} \fi % \end{macrocode} % Here the code for ini\TeX\ ends. % \begin{macrocode} % % % \end{macrocode} % \end{macro} % % \subsection{Support for active characters} % % \begin{macro}{\bbl@add@special} % \changes{babel~3.2}{1991/11/10}{Added macro} % 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). % % To keep all changes local, we begin a new group. Then we % redefine the macros |\do| and |\@makeother| to add themselves and % the given character without expansion. % \begin{macrocode} %<*core|shorthands> \def\bbl@add@special#1{\begingroup \def\do{\noexpand\do\noexpand}% \def\@makeother{\noexpand\@makeother\noexpand}% % \end{macrocode} % To add the character to the macros, we expand the original macros % with the additional character inside the redefinition of the % macros. Because |\@sanitize| can be undefined, we put the % definition inside a conditional. % \begin{macrocode} \edef\x{\endgroup \def\noexpand\dospecials{\dospecials\do#1}% \expandafter\ifx\csname @sanitize\endcsname\relax \else \def\noexpand\@sanitize{\@sanitize\@makeother#1}% \fi}% % \end{macrocode} % The macro |\x| contains at this moment the following:\\ % |\endgroup\def\dospecials{|\textit{old contents}% % |\do|\meta{char}|}|.\\ % If |\@sanitize| is defined, it contains an additional definition % of this macro. The last thing we have to do, is the expansion of % |\x|. Then |\endgroup| is executed, which restores the old % meaning of |\x|, |\do| and |\@makeother|. After the group is % closed, the new definition of |\dospecials| (and |\@sanitize|) is % assigned. % \begin{macrocode} \x} % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@remove@special} % \changes{babel~3.2}{1991/11/10}{Added macro} % The companion of the former macro is |\bbl@remove@special|. It % is used to remove a character from the set macros |\dospecials| % and |\@sanitize|. % % To keep all changes local, we begin a new group. Then we define % a help macro |\x|, which expands to empty if the characters % match, otherwise it expands to its nonexpandable input. Because % \TeX\ inserts a |\relax|, if the corresponding |\else| or |\fi| % is scanned before the comparison is evaluated, we provide a `stop % sign' which should expand to nothing. % \begin{macrocode} \def\bbl@remove@special#1{\begingroup \def\x##1##2{\ifnum`#1=`##2\noexpand\@empty \else\noexpand##1\noexpand##2\fi}% % \end{macrocode} % With the help of this macro we define |\do| and |\make@other|. % \begin{macrocode} \def\do{\x\do}% \def\@makeother{\x\@makeother}% % \end{macrocode} % The rest of the work is similar to |\bbl@add@special|. % \begin{macrocode} \edef\x{\endgroup \def\noexpand\dospecials{\dospecials}% \expandafter\ifx\csname @sanitize\endcsname\relax \else \def\noexpand\@sanitize{\@sanitize}% \fi}% \x} % \end{macrocode} % \end{macro} % % \subsection{Shorthands} % % \begin{macro}{\initiate@active@char} % \changes{babel~3.5a}{1995/02/11}{Added macro} % \changes{babel~3.5b}{1995/03/03}{Renamed macro} % 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 the following line in a language definition file: % \begin{verbatim} % \initiate@active@char{"} % \end{verbatim} % % \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. % \changes{babel~3.6i}{1997/02/20}{Made \cs{bbl@afterelse} and % \cs{bbl@afterfi} \cs{long}} % \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} % % \changes{babel~3.7a}{1997/02/23}{Commented out \c{peek@token} and % \cs{test@token} as shorthands are made expandable again} % % \begin{macro}{\peek@token} % \changes{babel~3.5f}{1995/12/06}{macro added} % \changes{babel~3.6i}{1998/03/10}{Renamed \cs{test@token} to % \cs{bbl@test@token} to prevent a clash with Arab\TeX} % To prevent error messages when a shorthand, which % normally takes an argument, sees a |\par|, or |}|, or similar % tokens, we need to be able to `peek' at what is coming up next in % the input stream. Depending on the category code of the token % that is seen, we need to either continue the code for the active % character, or insert the non-active version of that character in % the output. The macro |\peek@token| therefore takes two % arguments, with which it constructs the control sequence to % expand next. It |\let|'s |\bbl@nexta| and |\bbl@nextb| to the two % possible macros. This is necessary for |\bbl@test@token| to take % the right decision. % \begin{macrocode} %\def\peek@token#1#2{% % \expandafter\let\expandafter\bbl@nexta\csname #1\string#2\endcsname % \expandafter\let\expandafter\bbl@nextb % \csname system@active\string#2\endcsname % \futurelet\bbl@token\bbl@test@token} % \end{macrocode} % % \begin{macro}{\bbl@test@token} % \changes{babel~3.5f}{1995/12/06}{macro added} % \changes{babel~3.6i}{1998/03/10}{renamed \cs{bbl@token} to % \cs{bbl@test@token} to prevent a clash with Arab\TeX} % When the result of peeking at the next token has yielded a token % with category `letter', `other' or `active' it is safe to proceed % with evaluating the code for the shorthand. When a token is found % with any other category code proceeding is unsafe and therefor % the original shorthand character is inserted in the output. The % macro that calls |\bbl@test@token| needs to setup |\bbl@nexta| % and |\bbl@nextb| in order to achieve this. % \begin{macrocode} %\def\bbl@test@token{% % \let\bbl@next\bbl@nexta % \ifcat\noexpand\bbl@token a% % \else % \ifcat\noexpand\bbl@token=% % \else % \ifcat\noexpand\bbl@token\noexpand\bbl@next % \else % \let\bbl@next\bbl@nextb % \fi % \fi % \fi % \bbl@next} % \end{macrocode} % \end{macro} % \end{macro} % %^^A %^^A Tekens met mathcode >"8000 zorgen voor problemen. %^^A hier kan op getest worden door ze catcode13 te geven %^^A en te vragen of er een undefined macro ontstaat: %^^A \ifx#1\undefined{matchcode<"8000}\else get active definition %^^A using \let \fi %^^A % 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.7c}{1999/04/30}{Only execute % \cs{initiate@active@char} once for each character} % \begin{macrocode} \def\initiate@active@char#1{% \expandafter\ifx\csname active@char\string##1\endcsname\relax \bbl@afterfi{\@initiate@active@char{#1}}% \fi} % \end{macrocode} % Note that the definition of |\@initiate@active@char| needs an % active character, for this the |~| is used. Some of the changes % we need, do not have to become available later on, so we do it % inside a group. % \begin{macrocode} \begingroup \catcode`\~\active \def\x{\endgroup \def\@initiate@active@char##1{% % \end{macrocode} % If the character is already active we provide the default % expansion under this shorthand mechanism. % \changes{babel~3.5f}{1996/01/09}{Deal correctly with already active % characters, provide top level expansion and define all lower % level expansion macros outside of the \cs{else} branch.} % \changes{babel~3.5g}{1996/08/13}{Top level expansion of % \cs{normal@char char} where char is already active, should be the % expansion of the active character, not the active character % itself as this causes an endless loop} % \changes{babel~3.7d}{1999/08/19}{Make sure the active character % doesn't get expanded more then once by the \cs{edef} by adding % \cs{expandafter}\cs{strip@prefix}\cs{meaning}} % \changes{babel~3.7e}{1999/09/06}{previous change was rubbish; use % \cs{let} instead of \cs{edef}} % \begin{macrocode} \ifcat\noexpand##1\noexpand~\relax \@ifundefined{normal@char\string##1}{% \expandafter\let\csname normal@char\string##1\endcsname##1% \expandafter\gdef \expandafter##1% \expandafter{% \expandafter\active@prefix\expandafter##1% \csname normal@char\string##1\endcsname}}{}% \else % \end{macrocode} % Otherwise we write a message in the transcript file, % \begin{macrocode} \@activated{##1}% % \end{macrocode} % and define |\normal@char|\m{char} to expand to the character in % its default state. % \begin{macrocode} \@namedef{normal@char\string##1}{##1}% % \end{macrocode} % If we are making the right quote active we need to change % |\pr@m@s| as well. % \changes{babel~3.5a}{1995/03/10}{Added a check for right quote and % adapt \cs{pr@m@s} if necessary} % \changes{babel~3.7f}{1999/12/18}{The redefinition needs to take % place one level higher, \cs{prim@s} needs to be redefined.} % \begin{macrocode} \ifx##1'% \let\prim@s\bbl@prim@s % \end{macrocode} % Also, make sure that a single |'| in math mode `does the right % thing'. % \changes{babel~3.7f}{1999/12/18}{Insert a check for math mode in the % definition of \cs{normal@char'}} % \changes{babel~3.7g}{2000/10/02}{use \cs{textormath} to get rid of % the \cs{fi} (PR 3266)} % \begin{macrocode} \@namedef{normal@char\string##1}{% \textormath{##1}{^\bgroup\prim@s}}% \fi % \end{macrocode} % If we are using the caret as a shorthand character special care % should be taken to make sure math still works. Therefor an extra % level of expansion is introduced with a check for math mode on % the upper level. % \changes{babel~3.7f}{1999/12/18}{Introduced an extra level of % expansion in the definition of an active caret} % \begin{macrocode} \ifx##1^% \gdef\bbl@act@caret{% \ifmmode \csname normal@char\string^\endcsname \else \bbl@afterfi {\if@safe@actives \bbl@afterelse\csname normal@char\string##1\endcsname \else \bbl@afterfi\csname user@active\string##1\endcsname \fi}% \fi} \fi % \end{macrocode} % To prevent problems with the loading of other packages after % \babel\ we reset the catcode of the character at the end of the % package. % \changes{babel~3.5f}{1995/12/01}{Restore the category code of a % shorthand char at end of package} % \changes{babel~3.6f}{1997/01/14}{Made restoring of the category code % of shorthand characters optional} % \changes{babel~3.7a}{1997/03/21}{Use \cs{@ifpackagewith} to % determine whether shorthand characters need to remain active} % \begin{macrocode} \@ifpackagewith{babel}{KeepShorthandsActive}{}{% \edef\bbl@tempa{\catcode`\noexpand##1\the\catcode`##1}% \expandafter\AtEndOfPackage\expandafter{\bbl@tempa}}% % \end{macrocode} % Now we set the lowercase code of the |~| equal to that of the % character to be made active and execute the rest of the code % inside a |\lowercase| `environment'. % \changes{babel~3.5f}{1996/01/25}{store the \cs{lccode} of the tie % before changing it} % \begin{macrocode} \@tempcnta=\lccode`\~ \lccode`~=`##1% \lowercase{% % \end{macrocode} % Make the character active and add it to |\dospecials| and % |\@sanitize|. % \begin{macrocode} \catcode`~\active \expandafter\bbl@add@special \csname \string##1\endcsname % \end{macrocode} % Also re-activate it again at |\begin{document}|. % \begin{macrocode} \AtBeginDocument{% \catcode`##1\active % \end{macrocode} % 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. % \changes{babel~3.6i}{1997/03/01}{Make shorthands active during % \file{.aux} file processing} % \begin{macrocode} \if@filesw \immediate\write\@mainaux{% \string\catcode`##1\string\active}% \fi}% % \end{macrocode} % Define the character to expand to % \begin{center} % |\active@prefix| \m{char} |\normal@char|\m{char} % \end{center} % (where |\active@char|\m{char} is \emph{one} control sequence!). % \changes{babel~3.5f}{1996/01/25}{restore the \cs{lccode} of the tie} % \begin{macrocode} \expandafter\gdef \expandafter~% \expandafter{% \expandafter\active@prefix\expandafter##1% \csname normal@char\string##1\endcsname}}% \lccode`\~\@tempcnta \fi % \end{macrocode} % For the active caret we first expand to |\bbl@act@caret| in order % to be able to handle math mode correctly. % \changes{babel~3.7f}{2000/09/25}{Make an exception for the active % caret which needs an extra level of expansion} % \begin{macrocode} \ifx##1^% \@namedef{active@char\string##1}{\bbl@act@caret}% \else % \end{macrocode} % 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 |\@active@char|\m{char}. % \begin{macrocode} \@namedef{active@char\string##1}{% \if@safe@actives \bbl@afterelse\csname normal@char\string##1\endcsname \else \bbl@afterfi\csname user@active\string##1\endcsname \fi}% \fi % \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.5d}{1995/07/02}{Skip the user-level active char % with argument if no shorthands with arguments were defined} % \changes{babel~3.8b}{2004/04/19}{Now use \cs{bbl@sh@select}} % \begin{macrocode} \@namedef{user@active\string##1}{% \expandafter\ifx \csname \user@group @sh@\string##1@\endcsname \relax \bbl@afterelse\bbl@sh@select\user@group##1% {user@active@arg\string##1}{language@active\string##1}% \else \bbl@afterfi\csname \user@group @sh@\string##1@\endcsname \fi}% % \end{macrocode} % When there is also no user-level shorthand with an argument we % will check whether there is a language defined shorthand for % this active character. Before the next token is absorbed as % argument we need to make sure that this is safe. Therefor % |\peek@token| is called to decide that. % \changes{babel~3.5f}{1995/12/07}{use \cs{peek@token} to check whether % it is safe to proceed} % \changes{babel~3.6i}{1997/02/20}{Remove the use of \cs{peek@token} % again and make the \cs{...active@arg...} commands \cs{long}} % \changes{babel~3.7e}{1999/09/24}{pass the argument on with braces in % order to prevent it from breaking up} % \changes{babel~3.7f}{2000/02/18}{remove the braces again} % \begin{macrocode} \long\@namedef{user@active@arg\string##1}####1{% \expandafter\ifx \csname \user@group @sh@\string##1@\string####1@\endcsname \relax \bbl@afterelse \csname language@active\string##1\endcsname####1% \else \bbl@afterfi \csname \user@group @sh@\string##1@\string####1@% \endcsname \fi}% % \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. % \begin{macrocode} \@namedef{\user@group @sh@\string##1@@}{% \csname normal@char\string##1\endcsname} % \end{macrocode} % % Like the shorthands that can be defined by the user, a language % definition file can also define shorthands with and without an % argument, so we need two more macros to check if they exist. % \changes{babel~3.5d}{1995/07/02}{Skip the language-level active char % with argument if no shorthands with arguments were defined} % \changes{babel~3.8b}{2004/04/19}{Now use \cs{bbl@sh@select}} % \begin{macrocode} \@namedef{language@active\string##1}{% \expandafter\ifx \csname \language@group @sh@\string##1@\endcsname \relax \bbl@afterelse\bbl@sh@select\language@group##1% {language@active@arg\string##1}{system@active\string##1}% \else \bbl@afterfi \csname \language@group @sh@\string##1@\endcsname \fi}% % \end{macrocode} % \changes{babel~3.5f}{1995/12/07}{use \cs{peek@token} to check whether % it is safe to proceed} % \changes{babel~3.6i}{1997/02/20}{Remove the use of \cs{peek@token} % again} % \changes{babel~3.7e}{1999/09/24}{pass the argument on with braces in % order to prevent it from breaking up} % \changes{babel~3.7f}{2000/02/18}{remove the braces again} % \begin{macrocode} \long\@namedef{language@active@arg\string##1}####1{% \expandafter\ifx \csname \language@group @sh@\string##1@\string####1@\endcsname \relax \bbl@afterelse \csname system@active\string##1\endcsname####1% \else \bbl@afterfi \csname \language@group @sh@\string##1@\string####1@% \endcsname \fi}% % \end{macrocode} % And the same goes for the system level. % \changes{babel~3.8b}{2004/04/19}{Now use \cs{bbl@sh@select}} % \begin{macrocode} \@namedef{system@active\string##1}{% \expandafter\ifx \csname \system@group @sh@\string##1@\endcsname \relax \bbl@afterelse\bbl@sh@select\system@group##1% {system@active@arg\string##1}{normal@char\string##1}% \else \bbl@afterfi\csname \system@group @sh@\string##1@\endcsname \fi}% % \end{macrocode} % When no shorthands were