% \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 found the `normal' version of the active % character is inserted. % \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} % \begin{macrocode} \long\@namedef{system@active@arg\string##1}####1{% \expandafter\ifx \csname \system@group @sh@\string##1@\string####1@\endcsname \relax \bbl@afterelse\csname normal@char\string##1\endcsname####1% \else \bbl@afterfi \csname \system@group @sh@\string##1@\string####1@\endcsname \fi}% % \end{macrocode} % When a shorthand combination such as |''| ends up in a heading % \TeX\ would see |\protect'\protect'|. To prevent this from % happening a shorthand needs to be defined at user level. % \changes{babel~3.7f}{1999/12/09}{Added an extra shorthand % combination on user level to catch an interfering \cs{protect}} % \begin{macrocode} \@namedef{user@sh@\string##1@\string\protect@}{% \csname user@active\string##1\endcsname}% }% }\x % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@sh@select} % This command helps the shorthand supporting macros to select how % to proceed. Note that this macro needs to be expandable as do all % the shorthand macros in order for them to work in expansion-only % environments such as the argument of |\hyphenation|. % % This macro expects the name of a group of shorthands in its first % argument and a shorthand character in its second argument. It % will expand to either |\bbl@firstcs| or |\bbl@scndcs|. Hence two % more arguments need to follow it. % \changes{babel~3.8b}{2004/04/19}{Added command} % \begin{macrocode} \def\bbl@sh@select#1#2{% \expandafter\ifx\csname#1@sh@\string#2@sel\endcsname\relax \bbl@afterelse\bbl@scndcs \else \bbl@afterfi\csname#1@sh@\string#2@sel\endcsname \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\active@prefix} % The command |\active@prefix| which is used in the expansion of % active characters has a function similar to |\OT1-cmd| in that it % |\protect|s the active character whenever |\protect| is % \emph{not} |\@typeset@protect|. % \changes{babel~3.5d}{1995/07/02}{\cs{@protected@cmd} has vanished % from \file{ltoutenc.dtx}} % \changes{babel~3.7o}{2003/11/17}{Added handling of the situation % where \cs{protect} is set to \cs{@unexpandable@protect}} % \begin{macrocode} \def\active@prefix#1{% \ifx\protect\@typeset@protect \else % \end{macrocode} % When |\protect| is set to |\@unexpandable@protect| we make sure % that the active character is als \emph{not} expanded by inserting % |\noexpand| in front of it. The |\@gobble| is needed to remove % a token such as |\activechar:| (when the double colon was the % active character to be dealt with). % \begin{macrocode} \ifx\protect\@unexpandable@protect \bbl@afterelse\bbl@afterfi\noexpand#1\@gobble \else \bbl@afterfi\bbl@afterfi\protect#1\@gobble \fi \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\if@safe@actives} % In some circumstances it is necessary to be able to change the % expansion of an active character on the fly. For this purpose the % switch |@safe@actives| is available. The setting of this switch % should be checked in the first level expansion of % |\active@char|\m{char}. % \begin{macrocode} \newif\if@safe@actives \@safe@activesfalse % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@restore@actives} % \changes{babel~3.7m}{2003/11/15}{New macro added} % When the output routine kicks in while the % active characters were made ``safe'' this must be undone in % the headers to prevent unexpected typeset results. For this % situation we define a command to make them ``unsafe'' again. % \begin{macrocode} \def\bbl@restore@actives{\if@safe@actives\@safe@activesfalse\fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@activate} % \changes{babel~3.5a}{1995/02/11}{Added macro} % % This macro takes one argument, like |\initiate@active@char|. The % macro is used to change the definition of an active character to % expand to |\active@char|\m{char} instead of % |\normal@char|\m{char}. % \begin{macrocode} \def\bbl@activate#1{% \expandafter\def \expandafter#1\expandafter{% \expandafter\active@prefix \expandafter#1\csname active@char\string#1\endcsname}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@deactivate} % \changes{babel~3.5a}{1995/02/11}{Added macro} % This macro takes one argument, like |\bbl@activate|. The macro % doesn't really make a character non-active; it changes its % definition to expand to |\normal@char|\m{char}. % \begin{macrocode} \def\bbl@deactivate#1{% \expandafter\def \expandafter#1\expandafter{% \expandafter\active@prefix \expandafter#1\csname normal@char\string#1\endcsname}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@firstcs} % \begin{macro}{\bbl@scndcs} % These macros have two arguments. They use one of their arguments % to build a control sequence from. % \begin{macrocode} \def\bbl@firstcs#1#2{\csname#1\endcsname} \def\bbl@scndcs#1#2{\csname#2\endcsname} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\declare@shorthand} % The command |\declare@shorthand| is used to declare a shorthand % on a certain level. It takes three arguments: % \begin{enumerate} % \item a name for the collection of shorthands, i.e. `system', or % `dutch'; % \item the character (sequence) that makes up the shorthand, % i.e. |~| or |"a|; % \item the code to be executed when the shorthand is encountered. % \end{enumerate} % \changes{babel~3.5d}{1995/07/02}{Make a `note' when a shorthand with % an argument is defined.} % \changes{babel~3.6i}{1997/02/23}{Make it possible to distinguish the % constructed control sequences for the case with argument} % \changes{babel~3.8b}{2004/04/19}{We need to support shorthands with % and without argument in different groups; added the name of the % group to the storage macro} % \begin{macrocode} \def\declare@shorthand#1#2{\@decl@short{#1}#2\@nil} \def\@decl@short#1#2#3\@nil#4{% \def\bbl@tempa{#3}% \ifx\bbl@tempa\@empty \expandafter\let\csname #1@sh@\string#2@sel\endcsname\bbl@scndcs \@namedef{#1@sh@\string#2@}{#4}% \else \expandafter\let\csname #1@sh@\string#2@sel\endcsname\bbl@firstcs \@namedef{#1@sh@\string#2@\string#3@}{#4}% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\textormath} % Some of the shorthands that will be declared by the language % definition files have to be usable in both text and mathmode. To % achieve this the helper macro |\textormath| is provided. % \begin{macrocode} \def\textormath#1#2{% \ifmmode \bbl@afterelse#2% \else \bbl@afterfi#1% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\user@group} % \begin{macro}{\language@group} % \begin{macro}{\system@group} % The current concept of `shorthands' supports three levels or % groups of shorthands. For each level the name of the level or % group is stored in a macro. The default is to have a user group; % use language group `english' and have a system group called % `system'. % \changes{babel~3.6i}{1997/02/24}{Have a user group called `user' by % default} % \begin{macrocode} \def\user@group{user} \def\language@group{english} \def\system@group{system} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\useshorthands} % This is the user level command to tell \LaTeX\ that user level % shorthands will be used in the document. It takes one argument, % the character that starts a shorthand. % \changes{babel~3.7j}{2001/11/11}{When \TeX\ has seen a character % its category code is fixed; need to use a `stand-in' for the % call of \cs{bbl@activate}} % \begin{macrocode} \def\useshorthands#1{% % \end{macrocode} % First note that this is user level. % \begin{macrocode} \def\user@group{user}% % \end{macrocode} % Then initialize the character for use as a shorthand character. % \begin{macrocode} \initiate@active@char{#1}% % \end{macrocode} % Now that \TeX\ has seen the character its category code is % fixed, but for the actions of |\bbl@activate| to succeed we need % it to be active. Hence the trick with the |\lccode| to circumvent % this. % \changes{babel~3.7j}{2003/09/11}{The change from 11/112001 was % incomplete} % \begin{macrocode} \@tempcnta\lccode`\~ \lccode`~=`#1% \lowercase{\catcode`~\active\bbl@activate{~}}% \lccode`\~\@tempcnta} % \end{macrocode} % \end{macro} % % \begin{macro}{\defineshorthand} % Currently we only support one group of user level shorthands, % called `user'. % \begin{macrocode} \def\defineshorthand{\declare@shorthand{user}} % \end{macrocode} % \end{macro} % % \begin{macro}{\languageshorthands} % A user level command to change the language from which shorthands % are used. % \begin{macrocode} \def\languageshorthands#1{\def\language@group{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\aliasshorthand} % \changes{babel~3.5f}{1996/01/25}{New command} % \begin{macrocode} \def\aliasshorthand#1#2{% % \end{macrocode} % First the new shorthand needs to be initialized, % \begin{macrocode} \expandafter\ifx\csname active@char\string#2\endcsname\relax \ifx\document\@notprerr \@notshorthand{#2} \else \initiate@active@char{#2}% % \end{macrocode} % Then we need to use the |\lccode| trick to make the new shorthand % behave like the old one. Therefore we save the current |\lccode| % of the |~|-character and restore it later. Then we |\let| the new % shorthand character be equal to the original. % \begin{macrocode} \@tempcnta\lccode`\~ \lccode`~=`#2% \lowercase{\let~#1}% \lccode`\~\@tempcnta \fi \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\@notshorthand} % \changes{v3.8d}{2004/11/20}{Error message added} % % \begin{macrocode} \def\@notshorthand#1{% \PackageError{babel}{% The character `\string #1' should be made a shorthand character;\MessageBreak add the command \string\useshorthands\string{#1\string} to the preamble.\MessageBreak I will ignore your instruction}{}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\shorthandon} % \changes{babel~3.7a}{1998/06/07}{Added command} % \begin{macro}{\shorthandoff} % \changes{babel~3.7a}{1998/06/07}{Added command} % The first level definition of these macros just passes the % argument on to |\bbl@switch@sh|, adding |\@nil| at the end to % denote the end of the list of characters. % \begin{macrocode} \newcommand*\shorthandon[1]{\bbl@switch@sh{on}#1\@nil} \newcommand*\shorthandoff[1]{\bbl@switch@sh{off}#1\@nil} % \end{macrocode} % % \begin{macro}{\bbl@switch@sh} % \changes{babel~3.7a}{1998/06/07}{Added command} % The macro |\bbl@switch@sh| takes the list of characters apart one % by one and subsequently switches the category code of the % shorthand character according to the first argument of % |\bbl@switch@sh|. % \begin{macrocode} \def\bbl@switch@sh#1#2#3\@nil{% % \end{macrocode} % But before any of this switching takes place we make sure that % the character we are dealing with is known as a shorthand % character. If it is, a macro such as |\active@char"| should % exist. % \begin{macrocode} \@ifundefined{active@char\string#2}{% \PackageError{babel}{% The character '\string #2' is not a shorthand character in \languagename}{% Maybe you made a typing mistake?\MessageBreak I will ignore your instruction}}{% \csname bbl@switch@sh@#1\endcsname#2}% % \end{macrocode} % Now that, as the first character in the list has been taken care % of, we pass the rest of the list back to |\bbl@switch@sh|. % \begin{macrocode} \ifx#3\@empty\else \bbl@afterfi\bbl@switch@sh{#1}#3\@nil \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@switch@sh@off} % All that is left to do is define the actual switching % macros. Switching off is easy, we just set the category code to % `other' (12). % \begin{macrocode} \def\bbl@switch@sh@off#1{\catcode`#112\relax} % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@switch@sh@on} % But switching the shorthand character back on is a bit more % tricky. It involves making sure that we have an active character % to begin with when the macro is being defined. It also needs the % use of |\lowercase| and |\lccode| trickery to get everything to % work out as expected. And to keep things local that need to % remain local a group is opened, which is closed as soon as |\x| % gets executed. % \changes{babel~3.8j}{2008/03/21}{Added a group in order to protect % the current lowercase code of the tilde (PR 3851)} % \begin{macrocode} \begingroup \catcode`\~\active \def\x{\endgroup \def\bbl@switch@sh@on##1{% \begingroup \lccode`~=`##1% \lowercase{\endgroup \catcode`~\active }% }% } % \end{macrocode} % \end{macro} % The next operation makes the above definition effective. % \begin{macrocode} \x % % \end{macrocode} % \end{macro} % \end{macro} % % To prevent problems with constructs such as |\char"01A| when the % double quote is made active, we define a shorthand on % system level. % \changes{babel~3.5a}{1995/03/10}{Replaced 16 system shorthands to % deal with hex numbers by one} % \begin{macrocode} \declare@shorthand{system}{"}{\csname normal@char\string"\endcsname} % \end{macrocode} % % When the right quote is made active we need to take care of % handling it correctly in mathmode. Therefore we define a % shorthand at system level to make it expand to a non-active right % quote in textmode, but expand to its original definition in % mathmode. (Note that the right quote is `active' in mathmode % because of its mathcode.) % \changes{babel~3.5a}{1995/03/10}{Added a system shorthand for the % right quote} % \begin{macrocode} \declare@shorthand{system}{'}{% \textormath{\csname normal@char\string'\endcsname}% {\sp\bgroup\prim@s}} % \end{macrocode} % % When the left quote is made active we need to take care of % handling it correctly when it is followed by for instance an open % brace token. Therefore we define a shorthand at system level to % make it expand to a non-active left quote. % \changes{babel~3.5f}{1996/03/06}{Added a system shorthand for the % left quote} % \begin{macrocode} \declare@shorthand{system}{`}{\csname normal@char\string`\endcsname} % \end{macrocode} % % \begin{macro}{\bbl@prim@s} % \changes{babel~3.7f}{1999/12/01}{Need to redefine \cs{prim@s} as % well as plain \TeX's definition uses \cs{next}} % \begin{macro}{\bbl@pr@m@s} % \changes{babel~3.5a}{1995/03/10}{Added macro} % One of the internal macros that are involved in substituting % |\prime| for each right quote in mathmode is |\prim@s|. This % checks if the next character is a right quote. When the right % quote is active, the definition of this macro needs to be adapted % to look for an active right quote. % \begin{macrocode} \def\bbl@prim@s{% \prime\futurelet\@let@token\bbl@pr@m@s} \begingroup \catcode`\'\active\let'\relax \def\x{\endgroup \def\bbl@pr@m@s{% \ifx'\@let@token \expandafter\pr@@@s \else \ifx^\@let@token \expandafter\expandafter\expandafter\pr@@@t \else \egroup \fi \fi}% } \x % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macrocode} % % \end{macrocode} % % Normally the |~| is active and expands to \verb*=\penalty\@M\ =. % When it is written to the \file{.aux} file it is written % expanded. To prevent that and to be able to use the character |~| % as a start character for a shorthand, it is redefined here as a % one character shorthand on system level. % \changes{babel~3.5f}{1996/04/02}{No need to reset the category code % of the tilde as \cs{initiate@active@char} now correctly deals % with active characters} % \begin{macrocode} %<*core> \initiate@active@char{~} \declare@shorthand{system}{~}{\leavevmode\nobreak\ } \bbl@activate{~} % \end{macrocode} % % \begin{macro}{\OT1dqpos} % \begin{macro}{\T1dqpos} % The position of the double quote character is different for the % OT1 and T1 encodings. It will later be selected using the % |\f@encoding| macro. Therefor we define two macros here to store % the position of the character in these encodings. % \begin{macrocode} \expandafter\def\csname OT1dqpos\endcsname{127} \expandafter\def\csname T1dqpos\endcsname{4} % \end{macrocode} % When the macro |\f@encoding| is undefined (as it is in plain % \TeX) we define it here to expand to \texttt{OT1} % \begin{macrocode} \ifx\f@encoding\@undefined \def\f@encoding{OT1} \fi % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{Language attributes} % % Language attributes provide a means to give the user control over % which features of the language definition files he wants to % enable. % \changes{babel~3.7c}{1998/07/02}{Added support for language % attributes} % \begin{macro}{\languageattribute} % The macro |\languageattribute| checks whether its arguments are % valid and then activates the selected language attribute. % \begin{macrocode} \newcommand\languageattribute[2]{% % \end{macrocode} % First check whether the language is known. % \begin{macrocode} \expandafter\ifx\csname l@#1\endcsname\relax \@nolanerr{#1}% \else % \end{macrocode} % Than process each attribute in the list. % \begin{macrocode} \@for\bbl@attr:=#2\do{% % \end{macrocode} % We want to make sure that each attribute is selected only once; % therefor we store the already selected attributes in % |\bbl@known@attribs|. When that control sequence is not yet % defined this attribute is certainly not selected before. % \begin{macrocode} \ifx\bbl@known@attribs\@undefined \in@false \else % \end{macrocode} % Now we need to see if the attribute occurs in the list of % already selected attributes. % \begin{macrocode} \edef\bbl@tempa{\noexpand\in@{,#1-\bbl@attr,}% {,\bbl@known@attribs,}}% \bbl@tempa \fi % \end{macrocode} % When the attribute was in the list we issue a warning; this might % not be the users intention. % \begin{macrocode} \ifin@ \PackageWarning{Babel}{% You have more than once selected the attribute '\bbl@attr'\MessageBreak for language #1}% \else % \end{macrocode} % When we end up here the attribute is not selected before. So, we % add it to the list of selected attributes and execute the % associated \TeX-code. % \begin{macrocode} \edef\bbl@tempa{% \noexpand\bbl@add@list\noexpand\bbl@known@attribs{#1-\bbl@attr}}% \bbl@tempa \edef\bbl@tempa{#1-\bbl@attr}% \expandafter\bbl@ifknown@ttrib\expandafter{\bbl@tempa}\bbl@attributes% {\csname#1@attr@\bbl@attr\endcsname}% {\@attrerr{#1}{\bbl@attr}}% \fi } \fi} % \end{macrocode} % This command should only be used in the preamble of a document. % \begin{macrocode} \@onlypreamble\languageattribute % \end{macrocode} % The error text to be issued when an unknown attribute is % selected. % \begin{macrocode} \newcommand*{\@attrerr}[2]{% \PackageError{babel}% {The attribute #2 is unknown for language #1.}% {Your command will be ignored, type to proceed}} % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@declare@ttribute} % This command adds the new language/attribute combination to the % list of known attributes. % \begin{macrocode} \def\bbl@declare@ttribute#1#2#3{% \bbl@add@list\bbl@attributes{#1-#2}% % \end{macrocode} % Then it defines a control sequence to be executed when the % attribute is used in a document. The result of this should be % that the macro |\extras...| for the current language is extended, % otherwise the attribute will not work as its code is removed from % memory at |\begin{document}|. % \begin{macrocode} \expandafter\def\csname#1@attr@#2\endcsname{#3}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@ifattributeset} % \changes{babel~3.7f}{2000/02/12}{macro added} % This internal macro has 4 arguments. It can be used to interpret % \TeX\ code based on whether a certain attribute was set. This % command should appear inside the argument to |\AtBeginDocument| % because the attributes are set in the document preamble, % \emph{after} \babel\ is loaded. % % The first argument is the language, the second argument the % attribute being checked, and the third and fourth arguments are % the true and false clauses. % \begin{macrocode} \def\bbl@ifattributeset#1#2#3#4{% % \end{macrocode} % First we need to find out if any attributes were set; if not % we're done. % \begin{macrocode} \ifx\bbl@known@attribs\@undefined \in@false \else % \end{macrocode} % The we need to check the list of known attributes. % \begin{macrocode} \edef\bbl@tempa{\noexpand\in@{,#1-#2,}% {,\bbl@known@attribs,}}% \bbl@tempa \fi % \end{macrocode} % When we're this far |\ifin@| has a value indicating if the % attribute in question was set or not. Just to be safe the code to % be executed is `thrown over the |\fi|'. % \begin{macrocode} \ifin@ \bbl@afterelse#3% \else \bbl@afterfi#4% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@add@list} % This internal macro adds its second argument to a comma % separated list in its first argument. When the list is not % defined yet (or empty), it will be initiated % \begin{macrocode} \def\bbl@add@list#1#2{% \ifx#1\@undefined \def#1{#2}% \else \ifx#1\@empty \def#1{#2}% \else \edef#1{#1,#2}% \fi \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@ifknown@ttrib} % An internal macro to check whether a given language/attribute is % known. The macro takes 4 arguments, the language/attribute, the % attribute list, the \TeX-code to be executed when the attribute % is known and the \TeX-code to be executed otherwise. % \begin{macrocode} \def\bbl@ifknown@ttrib#1#2{% % \end{macrocode} % We first assume the attribute is unknown. % \begin{macrocode} \let\bbl@tempa\@secondoftwo % \end{macrocode} % Then we loop over the list of known attributes, trying to find a % match. % \begin{macrocode} \@for\bbl@tempb:=#2\do{% \expandafter\in@\expandafter{\expandafter,\bbl@tempb,}{,#1,}% \ifin@ % \end{macrocode} % When a match is found the definition of |\bbl@tempa| is changed. % \begin{macrocode} \let\bbl@tempa\@firstoftwo \else \fi}% % \end{macrocode} % Finally we execute |\bbl@tempa|. % \begin{macrocode} \bbl@tempa } % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@clear@ttribs} % This macro removes all the attribute code from \LaTeX's memory at % |\begin{document}| time (if any is present). % \changes{babel~3.7e}{1999/09/24}{When \cs{bbl@attributes} is % undefined this should be a no-op} % \begin{macrocode} \def\bbl@clear@ttribs{% \ifx\bbl@attributes\@undefined\else \@for\bbl@tempa:=\bbl@attributes\do{% \expandafter\bbl@clear@ttrib\bbl@tempa. }% \let\bbl@attributes\@undefined \fi } \def\bbl@clear@ttrib#1-#2.{% \expandafter\let\csname#1@attr@#2\endcsname\@undefined} \AtBeginDocument{\bbl@clear@ttribs} % \end{macrocode} % \end{macro} % % \subsection{Support for saving macro definitions} % % To save the meaning of control sequences using |\babel@save|, we % use temporary control sequences. To save hash table entries for % these control sequences, we don't use the name of the control % sequence to be saved to construct the temporary name. Instead we % simply use the value of a counter, which is reset to zero each % time we begin to save new values. This works well because we % release the saved meanings before we begin to save a new set of % control sequence meanings (see |\selectlanguage| and % |\originalTeX|). % % \begin{macro}{\babel@savecnt} % \changes{babel~3.2}{1991/11/10}{Added macro} % \begin{macro}{\babel@beginsave} % \changes{babel~3.2}{1991/11/10}{Added macro} % The initialization of a new save cycle: reset the counter to % zero. % \begin{macrocode} \def\babel@beginsave{\babel@savecnt\z@} % \end{macrocode} % Before it's forgotten, allocate the counter and initialize all. % \begin{macrocode} \newcount\babel@savecnt \babel@beginsave % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\babel@save} % \changes{babel~3.2}{1991/11/10}{Added macro} % The macro |\babel@save|\meta{csname} saves the current meaning of % the control sequence \meta{csname} to % |\originalTeX|\footnote{\cs{originalTeX} has to be % expandable, i.\,e.\ you shouldn't let it to \cs{relax}.}. % To do this, we let the current meaning to a temporary control % sequence, the restore commands are appended to |\originalTeX| and % the counter is incremented. % \changes{babel~3.2c}{1992/03/17}{missing backslash led to errors % when executing \cs{originalTeX}} % \changes{babel~3.2d}{1992/07/02}{saving in \cs{babel@i} and % restoring from \cs{@babel@i} doesn't work very well...} % \begin{macrocode} \def\babel@save#1{% \expandafter\let\csname babel@\number\babel@savecnt\endcsname #1\relax \begingroup \toks@\expandafter{\originalTeX \let#1=}% \edef\x{\endgroup \def\noexpand\originalTeX{\the\toks@ \expandafter\noexpand \csname babel@\number\babel@savecnt\endcsname\relax}}% \x \advance\babel@savecnt\@ne} % \end{macrocode} % \end{macro} % % \begin{macro}{\babel@savevariable} % \changes{babel~3.2}{1991/11/10}{Added macro} % The macro |\babel@savevariable|\meta{variable} saves the value of % the variable. \meta{variable} can be anything allowed after the % |\the| primitive. % \begin{macrocode} \def\babel@savevariable#1{\begingroup \toks@\expandafter{\originalTeX #1=}% \edef\x{\endgroup \def\noexpand\originalTeX{\the\toks@ \the#1\relax}}% \x} % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@frenchspacing} % \begin{macro}{\bbl@nonfrenchspacing} % Some languages need to have |\frenchspacing| in effect. Others % don't want that. The command |\bbl@frenchspacing| switches it on % when it isn't already in effect and |\bbl@nonfrenchspacing| % switches it off if necessary. % \begin{macrocode} \def\bbl@frenchspacing{% \ifnum\the\sfcode`\.=\@m \let\bbl@nonfrenchspacing\relax \else \frenchspacing \let\bbl@nonfrenchspacing\nonfrenchspacing \fi} \let\bbl@nonfrenchspacing\nonfrenchspacing % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{Support for extending macros} % % \begin{macro}{\addto} % For each language four control sequences have to be defined that % control the language-specific definitions. To be able to add % something to these macro once they have been defined the macro % |\addto| is introduced. It takes two arguments, a \meta{control % sequence} and \TeX-code to be added to the \meta{control % sequence}. % % If the \meta{control sequence} has not been defined before it is % defined now. % \changes{babel~3.1}{1991/11/05}{Added macro} % \changes{babel~3.4}{1994/02/04}{Changed to use toks register} % \changes{babel~3.6b}{1996/12/30}{Also check if control sequence % expands to \cs{relax}} % \begin{macrocode} \def\addto#1#2{% \ifx#1\@undefined \def#1{#2}% \else % \end{macrocode} % The control sequence could also expand to |\relax|, in which case % a circular definition results. The net result is a stack overflow. % \begin{macrocode} \ifx#1\relax \def#1{#2}% \else % \end{macrocode} % Otherwise the replacement text for the \meta{control sequence} is % expanded and stored in a token register, together with the % \TeX-code to be added. Finally the \meta{control sequence} is % \emph{re}defined, using the contents of the token register. % \begin{macrocode} {\toks@\expandafter{#1#2}% \xdef#1{\the\toks@}}% \fi \fi } % \end{macrocode} % \end{macro} % % \subsection{Macros common to a number of languages} % % \begin{macro}{\allowhyphens} % \changes{babel~3.2b}{1992/02/16}{Moved macro from language % definition files} % \changes{babel~3.7a}{1998/03/12}{Make \cs{allowhyphens} a no-op for % T1 fontencoding} % This macro makes hyphenation possible. Basically its definition % is nothing more than |\nobreak| |\hskip| \texttt{0pt plus % 0pt}\footnote{\TeX\ begins and ends a word for hyphenation at a % glue node. The penalty prevents a linebreak at this glue node.}. % \begin{macrocode} \def\bbl@t@one{T1} \def\allowhyphens{% \ifx\cf@encoding\bbl@t@one\else\bbl@allowhyphens\fi} \def\bbl@allowhyphens{\nobreak\hskip\z@skip} % \end{macrocode} % \end{macro} % % \begin{macro}{\set@low@box} % \changes{babel~3.2b}{1992/02/16}{Moved macro from language % definition files} % The following macro is used to lower quotes to the same level as % the comma. It prepares its argument in box register~0. % \begin{macrocode} \def\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}% \dimen\z@\ht\z@ \advance\dimen\z@ -\ht\tw@% \setbox\z@\hbox{\lower\dimen\z@ \box\z@}\ht\z@\ht\tw@ \dp\z@\dp\tw@} % \end{macrocode} % \end{macro} % % \begin{macro}{\save@sf@q} % \changes{babel~3.2b}{1992/02/16}{Moved macro from language % definition files} % The macro |\save@sf@q| is used to save and reset the current % space factor. % \changes{babel~3.7f}{2000/09/19}{PR3119, don't start a paragraph in % a local group} % \begin{macrocode} \def\save@sf@q #1{\leavevmode \begingroup \edef\@SF{\spacefactor \the\spacefactor}#1\@SF \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@disc} % \changes{babel~3.5f}{1996/01/24}{Macro moved from language % definition files} % For some languages the macro |\bbl@disc| is used to ease the % insertion of discretionaries for letters that behave `abnormally' % at a breakpoint. % \begin{macrocode} \def\bbl@disc#1#2{% \nobreak\discretionary{#2-}{}{#1}\allowhyphens} % \end{macrocode} % \end{macro} % % \changes{babel~3.5c}{1995/06/14}{Repaired a typo (itlaic, PR1652)} % % \subsection{Making glyphs available} % % The file \file{\filename}\footnote{The file described in this % section has version number \fileversion, and was last revised on % \filedate.} makes a number of glyphs available that either do not % exist in the \texttt{OT1} encoding and have to be `faked', or % that are not accessible through \file{T1enc.def}. % % \subsection{Quotation marks} % % \begin{macro}{\quotedblbase} % In the \texttt{T1} encoding the opening double quote at the % baseline is available as a separate character, accessible via % |\quotedblbase|. In the \texttt{OT1} encoding it is not % available, therefor we make it available by lowering the normal % open quote character to the baseline. % \begin{macrocode} \ProvideTextCommand{\quotedblbase}{OT1}{% \save@sf@q{\set@low@box{\textquotedblright\/}% \box\z@\kern-.04em\allowhyphens}} % \end{macrocode} % Make sure that when an encoding other than \texttt{OT1} or % \texttt{T1} is used this glyph can still be typeset. % \begin{macrocode} \ProvideTextCommandDefault{\quotedblbase}{% \UseTextSymbol{OT1}{\quotedblbase}} % \end{macrocode} % \end{macro} % % \begin{macro}{\quotesinglbase} % We also need the single quote character at the baseline. % \begin{macrocode} \ProvideTextCommand{\quotesinglbase}{OT1}{% \save@sf@q{\set@low@box{\textquoteright\/}% \box\z@\kern-.04em\allowhyphens}} % \end{macrocode} % Make sure that when an encoding other than \texttt{OT1} or % \texttt{T1} is used this glyph can still be typeset. % \begin{macrocode} \ProvideTextCommandDefault{\quotesinglbase}{% \UseTextSymbol{OT1}{\quotesinglbase}} % \end{macrocode} % \end{macro} % % \begin{macro}{\guillemotleft} % \begin{macro}{\guillemotright} % The guillemet characters are not available in \texttt{OT1} % encoding. They are faked. % \begin{macrocode} \ProvideTextCommand{\guillemotleft}{OT1}{% \ifmmode \ll \else \save@sf@q{\nobreak \raise.2ex\hbox{$\scriptscriptstyle\ll$}\allowhyphens}% \fi} \ProvideTextCommand{\guillemotright}{OT1}{% \ifmmode \gg \else \save@sf@q{\nobreak \raise.2ex\hbox{$\scriptscriptstyle\gg$}\allowhyphens}% \fi} % \end{macrocode} % Make sure that when an encoding other than \texttt{OT1} or % \texttt{T1} is used these glyphs can still be typeset. % \begin{macrocode} \ProvideTextCommandDefault{\guillemotleft}{% \UseTextSymbol{OT1}{\guillemotleft}} \ProvideTextCommandDefault{\guillemotright}{% \UseTextSymbol{OT1}{\guillemotright}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\guilsinglleft} % \begin{macro}{\guilsinglright} % The single guillemets are not available in \texttt{OT1} % encoding. They are faked. % \begin{macrocode} \ProvideTextCommand{\guilsinglleft}{OT1}{% \ifmmode <% \else \save@sf@q{\nobreak \raise.2ex\hbox{$\scriptscriptstyle<$}\allowhyphens}% \fi} \ProvideTextCommand{\guilsinglright}{OT1}{% \ifmmode >% \else \save@sf@q{\nobreak \raise.2ex\hbox{$\scriptscriptstyle>$}\allowhyphens}% \fi} % \end{macrocode} % Make sure that when an encoding other than \texttt{OT1} or % \texttt{T1} is used these glyphs can still be typeset. % \begin{macrocode} \ProvideTextCommandDefault{\guilsinglleft}{% \UseTextSymbol{OT1}{\guilsinglleft}} \ProvideTextCommandDefault{\guilsinglright}{% \UseTextSymbol{OT1}{\guilsinglright}} % \end{macrocode} % \end{macro} % \end{macro} % % % \subsection{Letters} % % \begin{macro}{\ij} % \begin{macro}{\IJ} % The dutch language uses the letter `ij'. It is available in % \texttt{T1} encoded fonts, but not in the \texttt{OT1} encoded % fonts. Therefor we fake it for the \texttt{OT1} encoding. % \changes{dutch-3.7a}{1995/02/04}{Changed the kerning in the faked ij % to match the dc-version of it} % \begin{macrocode} \DeclareTextCommand{\ij}{OT1}{% \allowhyphens i\kern-0.02em j\allowhyphens} \DeclareTextCommand{\IJ}{OT1}{% \allowhyphens I\kern-0.02em J\allowhyphens} \DeclareTextCommand{\ij}{T1}{\char188} \DeclareTextCommand{\IJ}{T1}{\char156} % \end{macrocode} % Make sure that when an encoding other than \texttt{OT1} or % \texttt{T1} is used these glyphs can still be typeset. % \begin{macrocode} \ProvideTextCommandDefault{\ij}{% \UseTextSymbol{OT1}{\ij}} \ProvideTextCommandDefault{\IJ}{% \UseTextSymbol{OT1}{\IJ}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\dj} % \begin{macro}{\DJ} % The croatian language needs the letters |\dj| and |\DJ|; they are % available in the \texttt{T1} encoding, but not in the % \texttt{OT1} encoding by default. % % Some code to construct these glyphs for the \texttt{OT1} encoding % was made available to me by Stipcevic Mario, % (\texttt{stipcevic@olimp.irb.hr}). % \changes{babel~3.5f}{1996/03/28}{New definition of \cs{dj}, see PR % 2058} % \begin{macrocode} \def\crrtic@{\hrule height0.1ex width0.3em} \def\crttic@{\hrule height0.1ex width0.33em} % \def\ddj@{% \setbox0\hbox{d}\dimen@=\ht0 \advance\dimen@1ex \dimen@.45\dimen@ \dimen@ii\expandafter\rem@pt\the\fontdimen\@ne\font\dimen@ \advance\dimen@ii.5ex \leavevmode\rlap{\raise\dimen@\hbox{\kern\dimen@ii\vbox{\crrtic@}}}} \def\DDJ@{% \setbox0\hbox{D}\dimen@=.55\ht0 \dimen@ii\expandafter\rem@pt\the\fontdimen\@ne\font\dimen@ \advance\dimen@ii.15ex % correction for the dash position \advance\dimen@ii-.15\fontdimen7\font % correction for cmtt font \dimen\thr@@\expandafter\rem@pt\the\fontdimen7\font\dimen@ \leavevmode\rlap{\raise\dimen@\hbox{\kern\dimen@ii\vbox{\crttic@}}}} % \DeclareTextCommand{\dj}{OT1}{\ddj@ d} \DeclareTextCommand{\DJ}{OT1}{\DDJ@ D} % \end{macrocode} % Make sure that when an encoding other than \texttt{OT1} or % \texttt{T1} is used these glyphs can still be typeset. % \begin{macrocode} \ProvideTextCommandDefault{\dj}{% \UseTextSymbol{OT1}{\dj}} \ProvideTextCommandDefault{\DJ}{% \UseTextSymbol{OT1}{\DJ}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\SS} % For the \texttt{T1} encoding |\SS| is defined and selects a % specific glyph from the font, but for other encodings it is not % available. Therefor we make it available here. % \begin{macrocode} \DeclareTextCommand{\SS}{OT1}{SS} \ProvideTextCommandDefault{\SS}{\UseTextSymbol{OT1}{\SS}} % \end{macrocode} % \end{macro} % % \subsection{Shorthands for quotation marks} % % Shorthands are provided for a number of different quotation % marks, which make them usable both outside and inside mathmode. % % \begin{macro}{\glq} % \begin{macro}{\grq} % \changes{babel~3.7a}{1997/04/25}{Make the definition of \cs{grq} % dependent on the font encoding} % \changes{babel~3.8b}{2004/05/02}{Made \cs{glq} fontencoding % dependent as well} % The `german' single quotes. % \begin{macrocode} \ProvideTextCommand{\glq}{OT1}{% \textormath{\quotesinglbase}{\mbox{\quotesinglbase}}} \ProvideTextCommand{\glq}{T1}{% \textormath{\quotesinglbase}{\mbox{\quotesinglbase}}} \ProvideTextCommandDefault{\glq}{\UseTextSymbol{OT1}\glq} % \end{macrocode} % The definition of |\grq| depends on the fontencoding. With % \texttt{T1} encoding no extra kerning is needed. % \begin{macrocode} \ProvideTextCommand{\grq}{T1}{% \textormath{\textquoteleft}{\mbox{\textquoteleft}}} \ProvideTextCommand{\grq}{OT1}{% \save@sf@q{\kern-.0125em% \textormath{\textquoteleft}{\mbox{\textquoteleft}}% \kern.07em\relax}} \ProvideTextCommandDefault{\grq}{\UseTextSymbol{OT1}\grq} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\glqq} % \begin{macro}{\grqq} % \changes{babel~3.7a}{1997/04/25}{Make the definition of \cs{grqq} % dependent on the font encoding} % \changes{babel~3.8b}{2004/05/02}{Made \cs{grqq} fontencoding % dependent as well} % The `german' double quotes. % \begin{macrocode} \ProvideTextCommand{\glqq}{OT1}{% \textormath{\quotedblbase}{\mbox{\quotedblbase}}} \ProvideTextCommand{\glqq}{T1}{% \textormath{\quotedblbase}{\mbox{\quotedblbase}}} \ProvideTextCommandDefault{\glqq}{\UseTextSymbol{OT1}\glqq} % \end{macrocode} % The definition of |\grqq| depends on the fontencoding. With % \texttt{T1} encoding no extra kerning is needed. % \begin{macrocode} \ProvideTextCommand{\grqq}{T1}{% \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}} \ProvideTextCommand{\grqq}{OT1}{% \save@sf@q{\kern-.07em% \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}% \kern.07em\relax}} \ProvideTextCommandDefault{\grqq}{\UseTextSymbol{OT1}\grqq} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\flq} % \begin{macro}{\frq} % \changes{babel~3.5f}{1995/08/07}{corrected spelling of % \cs{quilsingl...}} % \changes{babel~3.5f}{1995/09/05}{now use \cs{textormath} in these % definitions} % \changes{babel~3.8b}{2004/05/02}{Made \cs{flq} and \cs{frq} % fontencoding dependent} % The `french' single guillemets. % \begin{macrocode} \ProvideTextCommand{\flq}{OT1}{% \textormath{\guilsinglleft}{\mbox{\guilsinglleft}}} \ProvideTextCommand{\flq}{T1}{% \textormath{\guilsinglleft}{\mbox{\guilsinglleft}}} \ProvideTextCommandDefault{\flq}{\UseTextSymbol{OT1}\flq} % \end{macrocode} % % \begin{macrocode} \ProvideTextCommand{\frq}{OT1}{% \textormath{\guilsinglright}{\mbox{\guilsinglright}}} \ProvideTextCommand{\frq}{T1}{% \textormath{\guilsinglright}{\mbox{\guilsinglright}}} \ProvideTextCommandDefault{\frq}{\UseTextSymbol{OT1}\frq} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\flqq} % \begin{macro}{\frqq} % \changes{babel~3.5f}{1995/08/07}{corrected spelling of % \cs{quillemot...}} % \changes{babel~3.5f}{1995/09/05}{now use \cs{textormath} in these % definitions} % \changes{babel~3.8b}{2004/05/02}{Made \cs{flqq} and \cs{frqq} % fontencoding dependent} % The `french' double guillemets. % \begin{macrocode} \ProvideTextCommand{\flqq}{OT1}{% \textormath{\guillemotleft}{\mbox{\guillemotleft}}} \ProvideTextCommand{\flqq}{T1}{% \textormath{\guillemotleft}{\mbox{\guillemotleft}}} \ProvideTextCommandDefault{\flqq}{\UseTextSymbol{OT1}\flqq} % \end{macrocode} % % \begin{macrocode} \ProvideTextCommand{\frqq}{OT1}{% \textormath{\guillemotright}{\mbox{\guillemotright}}} \ProvideTextCommand{\frqq}{T1}{% \textormath{\guillemotright}{\mbox{\guillemotright}}} \ProvideTextCommandDefault{\frqq}{\UseTextSymbol{OT1}\frqq} % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{Umlauts and trema's} % % The command |\"| needs to have a different effect for different % languages. For German for instance, the `umlaut' should be % positioned lower than the default position for placing it over % the letters a, o, u, A, O and U. When placed over an e, i, E or I % it can retain its normal position. For Dutch the same glyph is % always placed in the lower position. % % \begin{macro}{\umlauthigh} % \changes{v3.8a}{2004/02/19}{Use \cs{leavevmode}\cs{bgroup} to % prevent problems when this command occurs in vertical mode.} % \begin{macro}{\umlautlow} % To be able to provide both positions of |\"| we provide two % commands to switch the positioning, the default will be % |\umlauthigh| (the normal positioning). % \begin{macrocode} \def\umlauthigh{% \def\bbl@umlauta##1{\leavevmode\bgroup% \expandafter\accent\csname\f@encoding dqpos\endcsname ##1\allowhyphens\egroup}% \let\bbl@umlaute\bbl@umlauta} \def\umlautlow{% \def\bbl@umlauta{\protect\lower@umlaut}} \def\umlautelow{% \def\bbl@umlaute{\protect\lower@umlaut}} \umlauthigh % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\lower@umlaut} % The command |\lower@umlaut| is used to position the |\"| closer % the the letter. % % We want the umlaut character lowered, nearer to the letter. To do % this we need an extra \meta{dimen} register. % \begin{macrocode} \expandafter\ifx\csname U@D\endcsname\relax \csname newdimen\endcsname\U@D \fi % \end{macrocode} % The following code fools \TeX's \texttt{make\_accent} procedure % about the current x-height of the font to force another placement % of the umlaut character. % \begin{macrocode} \def\lower@umlaut#1{% % \end{macrocode} % First we have to save the current x-height of the font, because % we'll change this font dimension and this is always done % globally. % \changes{v3.8a}{2004/02/19}{Use \cs{leavevmode}\cs{bgroup} to % prevent problems when this command occurs in vertical mode.} % \begin{macrocode} \leavevmode\bgroup \U@D 1ex% % \end{macrocode} % Then we compute the new x-height in such a way that the umlaut % character is lowered to the base character. The value of % \texttt{.45ex} depends on the \MF\ parameters with which the % fonts were built. (Just try out, which value will look best.) % \begin{macrocode} {\setbox\z@\hbox{% \expandafter\char\csname\f@encoding dqpos\endcsname}% \dimen@ -.45ex\advance\dimen@\ht\z@ % \end{macrocode} % If the new x-height is too low, it is not changed. % \begin{macrocode} \ifdim 1ex<\dimen@ \fontdimen5\font\dimen@ \fi}% % \end{macrocode} % Finally we call the |\accent| primitive, reset the old x-height % and insert the base character in the argument. % \changes{babel~3.5f}{1996/04/02}{Added a \cs{allowhyphens}} % \changes{babel~3.5f}{1996/06/25}{removed \cs{allowhyphens}} % \begin{macrocode} \expandafter\accent\csname\f@encoding dqpos\endcsname \fontdimen5\font\U@D #1% \egroup} % \end{macrocode} % \end{macro} % % For all vowels we declare |\"| to be a composite command which % uses |\bbl@umlauta| or |\bbl@umlaute| to position the umlaut % character. We need to be sure that these definitions override the % ones that are provided when the package \pkg{fontenc} with % option \Lopt{OT1} is used. Therefor these declarations are % postponed until the beginning of the document. % \begin{macrocode} \AtBeginDocument{% \DeclareTextCompositeCommand{\"}{OT1}{a}{\bbl@umlauta{a}}% \DeclareTextCompositeCommand{\"}{OT1}{e}{\bbl@umlaute{e}}% \DeclareTextCompositeCommand{\"}{OT1}{i}{\bbl@umlaute{\i}}% \DeclareTextCompositeCommand{\"}{OT1}{\i}{\bbl@umlaute{\i}}% \DeclareTextCompositeCommand{\"}{OT1}{o}{\bbl@umlauta{o}}% \DeclareTextCompositeCommand{\"}{OT1}{u}{\bbl@umlauta{u}}% \DeclareTextCompositeCommand{\"}{OT1}{A}{\bbl@umlauta{A}}% \DeclareTextCompositeCommand{\"}{OT1}{E}{\bbl@umlaute{E}}% \DeclareTextCompositeCommand{\"}{OT1}{I}{\bbl@umlaute{I}}% \DeclareTextCompositeCommand{\"}{OT1}{O}{\bbl@umlauta{O}}% \DeclareTextCompositeCommand{\"}{OT1}{U}{\bbl@umlauta{U}}% } % \end{macrocode} % % \subsection{The redefinition of the style commands} % % The rest of the code in this file can only be processed by % \LaTeX, so we check the current format. If it is plain \TeX, % processing should stop here. But, because of the need to limit % the scope of the definition of |\format|, a macro that is used % locally in the following |\if|~statement, this comparison is done % inside a group. To prevent \TeX\ from complaining about an % unclosed group, the processing of the command |\endinput| is % deferred until after the group is closed. This is accomplished by % the command |\aftergroup|. % \begin{macrocode} {\def\format{lplain} \ifx\fmtname\format \else \def\format{LaTeX2e} \ifx\fmtname\format \else \aftergroup\endinput \fi \fi} % \end{macrocode} % % Now that we're sure that the code is seen by \LaTeX\ only, we % have to find out what the main (primary) document style is % because we want to redefine some macros. This is only necessary % for releases of \LaTeX\ dated before December~1991. Therefor % this part of the code can optionally be included in % \file{babel.def} by specifying the \texttt{docstrip} option % \texttt{names}. % \begin{macrocode} %<*names> % \end{macrocode} % % The standard styles can be distinguished by checking whether some % macros are defined. In table~\ref{styles} an overview is given of % the macros that can be used for this purpose. % \begin{table}[htb] % \begin{center} % \DeleteShortVerb{\|} % \begin{tabular}{|lcp{8cm}|} % \hline % article & : & both the \verb+\chapter+ and \verb+\opening+ % macros are undefined\\ % report and book & : & the \verb+\chapter+ macro is defined and % the \verb+\opening+ is undefined\\ % letter & : & the \verb+\chapter+ macro is undefined and % the \verb+\opening+ is defined\\ % \hline % \end{tabular} % \caption{How to determine the main document style}\label{styles} % \MakeShortVerb{\|} % \end{center} % \end{table} % % \noindent The macros that have to be redefined for the % \texttt{report} and \texttt{book} document styles happen to be % the same, so there is no need to distinguish between those two % styles. % % \begin{macro}{\doc@style} % First a parameter |\doc@style| is defined to identify the current % document style. This parameter might have been defined by a % document style that already uses macros instead of hard-wired % texts, such as \file{artikel1.sty}~\cite{BEP}, so the existence of % |\doc@style| is checked. If this macro is undefined, i.\,e., if % the document style is unknown and could therefore contain % hard-wired texts, |\doc@style| is defined to the default % value~`0'. % \changes{babel~3.0d}{1991/10/29}{Removed use of \cs{@ifundefined}} % \begin{macrocode} \ifx\@undefined\doc@style \def\doc@style{0}% % \end{macrocode} % This parameter is defined in the following \texttt{if} % construction (see table~\ref{styles}): % % \begin{macrocode} \ifx\@undefined\opening \ifx\@undefined\chapter \def\doc@style{1}% \else \def\doc@style{2}% \fi \else \def\doc@style{3}% \fi% \fi% % \end{macrocode} % \end{macro} % % \changes{babel~3.1}{1991/11/05}{Removed definition of % \cs{if@restonecol}} % % \subsubsection{Redefinition of macros} % % Now here comes the real work: we start to redefine things and % replace hard-wired texts by macros. These redefinitions should be % carried out conditionally, in case it has already been done. % % For the \texttt{figure} and \texttt{table} environments we have % in all styles: % \begin{macrocode} \@ifundefined{figurename}{\def\fnum@figure{\figurename{} \thefigure}}{} \@ifundefined{tablename}{\def\fnum@table{\tablename{} \thetable}}{} % \end{macrocode} % % The rest of the macros have to be treated differently for each % style. When |\doc@style| still has its default value nothing % needs to be done. % \begin{macrocode} \ifcase \doc@style\relax \or % \end{macrocode} % % This means that \file{babel.def} is read after the % \texttt{article} style, where no |\chapter| and |\opening| % commands are defined\footnote{A fact that was pointed out to me % by Nico Poppelier and was already used in Piet van Oostrum's % document style option~\texttt{nl}.}. % % First we have the |\tableofcontents|, % |\listoffigures| and |\listoftables|: % \begin{macrocode} \@ifundefined{contentsname}% {\def\tableofcontents{\section*{\contentsname\@mkboth {\uppercase{\contentsname}}{\uppercase{\contentsname}}}% \@starttoc{toc}}}{} \@ifundefined{listfigurename}% {\def\listoffigures{\section*{\listfigurename\@mkboth {\uppercase{\listfigurename}}{\uppercase{\listfigurename}}}% \@starttoc{lof}}}{} \@ifundefined{listtablename}% {\def\listoftables{\section*{\listtablename\@mkboth {\uppercase{\listtablename}}{\uppercase{\listtablename}}}% \@starttoc{lot}}}{} % \end{macrocode} % % Then the |\thebibliography| and |\theindex| environments. % % \begin{macrocode} \@ifundefined{refname}% {\def\thebibliography#1{\section*{\refname \@mkboth{\uppercase{\refname}}{\uppercase{\refname}}}% \list{[\arabic{enumi}]}{\settowidth\labelwidth{[#1]}% \leftmargin\labelwidth \advance\leftmargin\labelsep \usecounter{enumi}}% \def\newblock{\hskip.11em plus.33em minus.07em}% \sloppy\clubpenalty4000\widowpenalty\clubpenalty \sfcode`\.=1000\relax}}{} \@ifundefined{indexname}% {\def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi \columnseprule \z@ \columnsep 35pt\twocolumn[\section*{\indexname}]% \@mkboth{\uppercase{\indexname}}{\uppercase{\indexname}}% \thispagestyle{plain}% \parskip\z@ plus.3pt\parindent\z@\let\item\@idxitem}}{} % \end{macrocode} % % The |abstract| environment: % % \begin{macrocode} \@ifundefined{abstractname}% {\def\abstract{\if@twocolumn \section*{\abstractname}% \else \small \begin{center}% {\bf \abstractname\vspace{-.5em}\vspace{\z@}}% \end{center}% \quotation \fi}}{} % \end{macrocode} % % And last but not least, the macro |\part|: % % \begin{macrocode} \@ifundefined{partname}% {\def\@part[#1]#2{\ifnum \c@secnumdepth >\m@ne \refstepcounter{part}% \addcontentsline{toc}{part}{\thepart \hspace{1em}#1}\else \addcontentsline{toc}{part}{#1}\fi {\parindent\z@ \raggedright \ifnum \c@secnumdepth >\m@ne \Large \bf \partname{} \thepart \par \nobreak \fi \huge \bf #2\markboth{}{}\par}% \nobreak \vskip 3ex\@afterheading}% }{} % \end{macrocode} % % This is all that needs to be done for the \texttt{article} style. % % \begin{macrocode} \or % \end{macrocode} % % The next case is formed by the two styles \texttt{book} and % \texttt{report}. Basically we have to do the same as for the % \texttt{article} style, except now we must also change the % |\chapter| command. % % The tables of contents, figures and tables: % \begin{macrocode} \@ifundefined{contentsname}% {\def\tableofcontents{\@restonecolfalse \if@twocolumn\@restonecoltrue\onecolumn \fi\chapter*{\contentsname\@mkboth {\uppercase{\contentsname}}{\uppercase{\contentsname}}}% \@starttoc{toc}% \csname if@restonecol\endcsname\twocolumn \csname fi\endcsname}}{} \@ifundefined{listfigurename}% {\def\listoffigures{\@restonecolfalse \if@twocolumn\@restonecoltrue\onecolumn \fi\chapter*{\listfigurename\@mkboth {\uppercase{\listfigurename}}{\uppercase{\listfigurename}}}% \@starttoc{lof}% \csname if@restonecol\endcsname\twocolumn \csname fi\endcsname}}{} \@ifundefined{listtablename}% {\def\listoftables{\@restonecolfalse \if@twocolumn\@restonecoltrue\onecolumn \fi\chapter*{\listtablename\@mkboth {\uppercase{\listtablename}}{\uppercase{\listtablename}}}% \@starttoc{lot}% \csname if@restonecol\endcsname\twocolumn \csname fi\endcsname}}{} % \end{macrocode} % % Again, the |bibliography| and |index| environments; notice that % in this case we use |\bibname| instead of |\refname| as in the % definitions for the \texttt{article} style. The reason for this % is that in the \texttt{article} document style the term % `References' is used in the definition of |\thebibliography|. In % the \texttt{report} and \texttt{book} document styles the term % `Bibliography' is used. % \begin{macrocode} \@ifundefined{bibname}% {\def\thebibliography#1{\chapter*{\bibname \@mkboth{\uppercase{\bibname}}{\uppercase{\bibname}}}% \list{[\arabic{enumi}]}{\settowidth\labelwidth{[#1]}% \leftmargin\labelwidth \advance\leftmargin\labelsep \usecounter{enumi}}% \def\newblock{\hskip.11em plus.33em minus.07em}% \sloppy\clubpenalty4000\widowpenalty\clubpenalty \sfcode`\.=1000\relax}}{} \@ifundefined{indexname}% {\def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi \columnseprule \z@ \columnsep 35pt\twocolumn[\@makeschapterhead{\indexname}]% \@mkboth{\uppercase{\indexname}}{\uppercase{\indexname}}% \thispagestyle{plain}% \parskip\z@ plus.3pt\parindent\z@ \let\item\@idxitem}}{} % \end{macrocode} % % Here is the |abstract| environment: % \begin{macrocode} \@ifundefined{abstractname}% {\def\abstract{\titlepage \null\vfil \begin{center}% {\bf \abstractname}% \end{center}}}{} % \end{macrocode} % % And last but not least the |\chapter|, |\appendix| and % |\part| macros. % \begin{macrocode} \@ifundefined{chaptername}{\def\@chapapp{\chaptername}}{} % \@ifundefined{appendixname}% {\def\appendix{\par \setcounter{chapter}{0}% \setcounter{section}{0}% \def\@chapapp{\appendixname}% \def\thechapter{\Alph{chapter}}}}{} % \@ifundefined{partname}% {\def\@part[#1]#2{\ifnum \c@secnumdepth >-2\relax \refstepcounter{part}% \addcontentsline{toc}{part}{\thepart \hspace{1em}#1}\else \addcontentsline{toc}{part}{#1}\fi \markboth{}{}% {\centering \ifnum \c@secnumdepth >-2\relax \huge\bf \partname{} \thepart \par \vskip 20pt \fi \Huge \bf #1\par}\@endpart}}{}% % \end{macrocode} % % \begin{macrocode} \or % \end{macrocode} % % Now we address the case where \file{babel.def} is read after the % \texttt{letter} style. The \texttt{letter} document style % defines the macro |\opening| and some other macros that are % specific to \texttt{letter}. This means that we have to redefine % other macros, compared to the previous two cases. % % First two macros for the material at the end of a letter, the % |\cc| and |\encl| macros. % \begin{macrocode} \@ifundefined{ccname}% {\def\cc#1{\par\noindent \parbox[t]{\textwidth}% {\@hangfrom{\rm \ccname : }\ignorespaces #1\strut}\par}}{} \@ifundefined{enclname}% {\def\encl#1{\par\noindent \parbox[t]{\textwidth}% {\@hangfrom{\rm \enclname : }\ignorespaces #1\strut}\par}}{} % \end{macrocode} % % The last thing we have to do here is to redefine the % \texttt{headings} pagestyle: % \changes{babel~3.3}{1993/07/11}{\cs{headpagename} should be % \cs{pagename}} % \begin{macrocode} \@ifundefined{headtoname}% {\def\ps@headings{% \def\@oddhead{\sl \headtoname{} \ignorespaces\toname \hfil \@date \hfil \pagename{} \thepage}% \def\@oddfoot{}}}{} % \end{macrocode} % % This was the last of the four standard document styles, so if % |\doc@style| has another value we do nothing and just close the % \texttt{if} construction. % \begin{macrocode} \fi % \end{macrocode} % Here ends the code that can be optionally included when a version % of \LaTeX\ is in use that is dated \emph{before} December~1991. % \begin{macrocode} % % % \end{macrocode} % % \subsection{Cross referencing macros} % % The \LaTeX\ book states: % \begin{quote} % The \emph{key} argument is any sequence of letters, digits, and % punctuation symbols; upper- and lowercase letters are regarded as % different. % \end{quote} % When the above quote should still be true when a document is % typeset in a language that has active characters, special care % has to be taken of the category codes of these characters when % they appear in an argument of the cross referencing macros. % % When a cross referencing command processes its argument, all % tokens in this argument should be character tokens with category % `letter' or `other'. % % The only way to accomplish this in most cases is to use the trick % described in the \TeX book~\cite{DEK} (Appendix~D, page~382). % The primitive |\meaning| applied to a token expands to the % current meaning of this token. For example, `|\meaning\A|' with % |\A| defined as `|\def\A#1{\B}|' expands to the characters % `|macro:#1->\B|' with all category codes set to `other' or % `space'. % % \begin{macro}{\bbl@redefine} % \changes{babel~3.5f}{1995/11/15}{Macro added} % To redefine a command, we save the old meaning of the macro. % Then we redefine it to call the original macro with the % `sanitized' argument. The reason why we do it this way is that % we don't want to redefine the \LaTeX\ macros completely in case % their definitions change (they have changed in the past). % % Because we need to redefine a number of commands we define the % command |\bbl@redefine| which takes care of this. It creates a % new control sequence, |\org@...| % \begin{macrocode} %<*core|shorthands> \def\bbl@redefine#1{% \edef\bbl@tempa{\expandafter\@gobble\string#1}% \expandafter\let\csname org@\bbl@tempa\endcsname#1 \expandafter\def\csname\bbl@tempa\endcsname} % \end{macrocode} % % This command should only be used in the preamble of the document. % \begin{macrocode} \@onlypreamble\bbl@redefine % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@redefine@long} % \changes{babel~3.6f}{1997/01/14}{Macro added} % This version of |\babel@redefine| can be used to redefine |\long| % commands such as |\ifthenelse|. % \begin{macrocode} \def\bbl@redefine@long#1{% \edef\bbl@tempa{\expandafter\@gobble\string#1}% \expandafter\let\csname org@\bbl@tempa\endcsname#1 \expandafter\long\expandafter\def\csname\bbl@tempa\endcsname} \@onlypreamble\bbl@redefine@long % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@redefinerobust} % \changes{babel~3.5f}{1995/11/15}{Macro added} % For commands that are redefined, but which \textit{might} be % robust we need a slightly more intelligent macro. A robust % command |foo| is defined to expand to |\protect|\verb*|\foo |. So % it is necessary to check whether \verb*|\foo | exists. % \begin{macrocode} \def\bbl@redefinerobust#1{% \edef\bbl@tempa{\expandafter\@gobble\string#1}% \expandafter\ifx\csname \bbl@tempa\space\endcsname\relax \expandafter\let\csname org@\bbl@tempa\endcsname#1 \expandafter\edef\csname\bbl@tempa\endcsname{\noexpand\protect \expandafter\noexpand\csname\bbl@tempa\space\endcsname}% \else \expandafter\let\csname org@\bbl@tempa\expandafter\endcsname \csname\bbl@tempa\space\endcsname \fi % \end{macrocode} % The result of the code above is that the command that is being % redefined is always robust afterwards. Therefor all we need to do % now is define \verb*|\foo |. % \changes{babel~3.5f}{1996/04/09}{Define \cs*{foo } instead of % \cs{foo}} % \begin{macrocode} \expandafter\def\csname\bbl@tempa\space\endcsname} % \end{macrocode} % % This command should only be used in the preamble of the document. % \begin{macrocode} \@onlypreamble\bbl@redefinerobust % \end{macrocode} % \end{macro} % % \begin{macro}{\newlabel} % \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}} % The macro |\label| writes a line with a |\newlabel| command % into the |.aux| file to define labels. % \begin{macrocode} %\bbl@redefine\newlabel#1#2{% % \@safe@activestrue\org@newlabel{#1}{#2}\@safe@activesfalse} % \end{macrocode} % \end{macro} % % \begin{macro}{\@newl@bel} % \changes{babel~3.6i}{1997/03/01}{Now redefine \cs{@newl@bel} instead % of \cs{@lbibitem} and \cs{newlabel}} % We need to change the definition of the \LaTeX-internal macro % |\@newl@bel|. This is needed because we need to make sure that % shorthand characters expand to their non-active version. % %^^A The following lines commented out in preparation for a change %^^A in the LaTeX definition of \@enwl@bel... JLB 2000/10/01 %^^A %^^A To play it safe when redefining a \LaTeX-internal command we %^^A first check whether its definition didn't change. %^^A \begin{macrocode} %^^A\CheckCommand*\@newl@bel[3]{% %^^A \@ifundefined{#1@#2}% %^^A \relax %^^A {\gdef \@multiplelabels {% %^^A \@latex@warning@no@line{There were multiply-defined labels}}% %^^A \@latex@warning@no@line{Label `#2' multiply defined}}% %^^A \global\@namedef{#1@#2}{#3}} %^^A \end{macrocode} %^^A Then we give the new definition. % \begin{macrocode} \def\@newl@bel#1#2#3{% % \end{macrocode} % First we open a new group to keep the changed setting of % |\protect| local and then we set the |@safe@actives| switch to % true to make sure that any shorthand that appears in any of the % arguments immediately expands to its non-active self. % \changes{babel~3.7a}{1997/12/19}{Call \cs{@safe@activestrue} % directly} % \begin{macrocode} {% \@safe@activestrue \@ifundefined{#1@#2}% \relax {% \gdef \@multiplelabels {% \@latex@warning@no@line{There were multiply-defined labels}}% \@latex@warning@no@line{Label `#2' multiply defined}% }% \global\@namedef{#1@#2}{#3}% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@testdef} % An internal \LaTeX\ macro used to test if the labels that have % been written on the |.aux| file have changed. It is called by % the |\enddocument| macro. This macro needs to be completely % rewritten, using |\meaning|. The reason for this is that in some % cases the expansion of |\#1@#2| contains the same characters as % the |#3|; but the character codes differ. Therefor \LaTeX\ keeps % reporting that the labels may have changed. % \changes{babel~3.4g}{1994/08/30}{Moved the \cs{def} inside the % macrocode environment} % \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}} % \changes{babel~3.5f}{1996/01/09}{Complete rewrite of this macro as % the same character ended up with different category codes in the % labels that are being compared. Now use \cs{meaning}} % \changes{babel~3.5f}{1996/01/16}{Use \cs{strip@prefix} only on % \cs{bbl@tempa} when it is not \cs{relax}} % \changes{babel~3.6i}{1997/02/28}{Make sure that shorthands don't get % expanded at the wrong moment.} % \changes{babel~3.6i}{1997/03/01}{\cs{@safe@activesfalse} is now % part of the label definition} % \changes{babel~3.7a}{1998/03/13}{Removed \cs{@safe@activesfalse} % from the label definition} % \begin{macrocode} \CheckCommand*\@testdef[3]{% \def\reserved@a{#3}% \expandafter \ifx \csname #1@#2\endcsname \reserved@a \else \@tempswatrue \fi} % \end{macrocode} % Now that we made sure that |\@testdef| still has the same % definition we can rewrite it. First we make the shorthands % `safe'. % \begin{macrocode} \def\@testdef #1#2#3{% \@safe@activestrue % \end{macrocode} % Then we use |\bbl@tempa| as an `alias' for the macro that % contains the label which is being checked. % \begin{macrocode} \expandafter\let\expandafter\bbl@tempa\csname #1@#2\endcsname % \end{macrocode} % Then we define |\bbl@tempb| just as |\@newl@bel| does it. % \begin{macrocode} \def\bbl@tempb{#3}% \@safe@activesfalse % \end{macrocode} % When the label is defined we replace the definition of % |\bbl@tempa| by its meaning. % \begin{macrocode} \ifx\bbl@tempa\relax \else \edef\bbl@tempa{\expandafter\strip@prefix\meaning\bbl@tempa}% \fi % \end{macrocode} % We do the same for |\bbl@tempb|. % \begin{macrocode} \edef\bbl@tempb{\expandafter\strip@prefix\meaning\bbl@tempb}% % \end{macrocode} % If the label didn't change, |\bbl@tempa| and |\bbl@tempb| should % be identical macros. % \begin{macrocode} \ifx \bbl@tempa \bbl@tempb \else \@tempswatrue \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\ref} % \begin{macro}{\pageref} % The same holds for the macro |\ref| that references a label % and |\pageref| to reference a page. So we redefine |\ref| and % |\pageref|. While we change these macros, we make them robust as % well (if they weren't already) to prevent problems if they should % become expanded at the wrong moment. % \changes{babel~3.5b}{1995/03/07}{Made \cs{ref} and \cs{pageref} % robust (PR1353)} % \changes{babel~3.5d}{1995/07/04}{use a different control sequence % while making \cs{ref} and \cs{pageref} robust} % \changes{babel~3.5f}{1995/11/06}{redefine \cs*{ref } if it exists % instead of \cs{ref}} % \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefinerobust}} % \changes{babel~3.5f}{1996/01/19}{redefine \cs{\@setref} instead of % \cs{ref} and \cs{pageref} in \LaTeXe.} % \changes{babel~3.5f}{1996/01/21}{Reverse the previous change as it % inhibits the use of active characters in labels} % \begin{macrocode} \bbl@redefinerobust\ref#1{% \@safe@activestrue\org@ref{#1}\@safe@activesfalse} \bbl@redefinerobust\pageref#1{% \@safe@activestrue\org@pageref{#1}\@safe@activesfalse} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\@citex} % \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}} % The macro used to cite from a bibliography, |\cite|, uses an % internal macro, |\@citex|. % It is this internal macro that picks up the argument(s), % so we redefine this internal macro and leave |\cite| alone. The % first argument is used for typesetting, so the shorthands need % only be deactivated in the second argument. % \changes{babel~3.7g}{2000/10/01}{The shorthands need to be % deactivated for the second argument of \cs{@citex} only.} % \begin{macrocode} \bbl@redefine\@citex[#1]#2{% \@safe@activestrue\edef\@tempa{#2}\@safe@activesfalse \org@@citex[#1]{\@tempa}} % \end{macrocode} % Unfortunately, the packages \pkg{natbib} and \pkg{cite} need a % different definition of |\@citex|... % To begin with, \pkg{natbib} has a definition for |\@citex| with % \emph{three} arguments... We only know that a package is loaded % when |\begin{document}| is executed, so we need to postpone the % different redefinition. % \begin{macrocode} \AtBeginDocument{% \@ifpackageloaded{natbib}{% % \end{macrocode} % Notice that we use |\def| here instead of |\bbl@redefine| because % |\org@@citex| is already defined and we don't want to overwrite % that definition (it would result in parameter stack overflow % because of a circular definition). % \begin{macrocode} \def\@citex[#1][#2]#3{% \@safe@activestrue\edef\@tempa{#3}\@safe@activesfalse \org@@citex[#1][#2]{\@tempa}}% }{}} % \end{macrocode} % The package \pkg{cite} has a definition of |\@citex| where the % shorthands need to be turned off in both arguments. % \begin{macrocode} \AtBeginDocument{% \@ifpackageloaded{cite}{% \def\@citex[#1]#2{% \@safe@activestrue\org@@citex[#1]{#2}\@safe@activesfalse}% }{}} % \end{macrocode} % \end{macro} % % \begin{macro}{\nocite} % \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}} % The macro |\nocite| which is used to instruct BiB\TeX\ to % extract uncited references from the database. % \begin{macrocode} \bbl@redefine\nocite#1{% \@safe@activestrue\org@nocite{#1}\@safe@activesfalse} % \end{macrocode} % \end{macro} % % \begin{macro}{\bibcite} % \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}} % The macro that is used in the |.aux| file to define citation % labels. When packages such as \pkg{natbib} or \pkg{cite} are not % loaded its second argument is used to typeset the citation % label. In that case, this second argument can contain active % characters but is used in an environment where % |\@safe@activestrue| is in effect. This switch needs to be reset % inside the |\hbox| which contains the citation label. In order to % determine during \file{.aux} file processing which definition of % |\bibcite| is needed we define |\bibcite| in such a way that it % redefines itself with the proper definition. % \changes{babel~3.6s}{1999/04/13}{Need to determine `online' which % definition of \cs{bibcite} is needed} % \changes{babel~3.6v}{1999/04/21}{Also check for \pkg{cite} it can't % handle \cs{@safe@activesfalse} in its second argument} % \begin{macrocode} \bbl@redefine\bibcite{% % \end{macrocode} % We call |\bbl@cite@choice| to select the proper definition for % |\bibcite|. This new definition is then activated. % \begin{macrocode} \bbl@cite@choice \bibcite} % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@bibcite} % \changes{babel~3.6v}{1999/04/21}{Macro \cs{bbl@bibcite} added} % The macro |\bbl@bibcite| holds the definition of |\bibcite| % needed when neither \pkg{natbib} nor \pkg{cite} is loaded. % \begin{macrocode} \def\bbl@bibcite#1#2{% \org@bibcite{#1}{\@safe@activesfalse#2}} % \end{macrocode} % \end{macro} % % \begin{macro}{\bbl@cite@choice} % \changes{babel~3.6v}{1999/04/21}{Macro \cs{bbl@cite@choice} added} % The macro |\bbl@cite@choice| determines which definition of % |\bibcite| is needed. % \begin{macrocode} \def\bbl@cite@choice{% % \end{macrocode} % First we give |\bibcite| its default definition. % \begin{macrocode} \global\let\bibcite\bbl@bibcite % \end{macrocode} % Then, when \pkg{natbib} is loaded we restore the original % definition of |\bibcite| . % \begin{macrocode} \@ifpackageloaded{natbib}{\global\let\bibcite\org@bibcite}{}% % \end{macrocode} % For \pkg{cite} we do the same. % \begin{macrocode} \@ifpackageloaded{cite}{\global\let\bibcite\org@bibcite}{}% % \end{macrocode} % Make sure this only happens once. % \begin{macrocode} \global\let\bbl@cite@choice\relax } % \end{macrocode} % % When a document is run for the first time, no \file{.aux} file is % available, and |\bibcite| will not yet be properly defined. In % this case, this has to happen before the document starts. % \begin{macrocode} \AtBeginDocument{\bbl@cite@choice} % \end{macrocode} % \end{macro} % % \begin{macro}{\@bibitem} % \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}} % One of the two internal \LaTeX\ macros called by |\bibitem| % that write the citation label on the |.aux| file. % \begin{macrocode} \bbl@redefine\@bibitem#1{% \@safe@activestrue\org@@bibitem{#1}\@safe@activesfalse} % \end{macrocode} % \end{macro} % % \subsection{marks} % % \begin{macro}{\markright} % \changes{babel~3.6i}{1997/03/15}{Added redefinition of \cs{mark...} % commands} % Because the output routine is asynchronous, we must % pass the current language attribute to the head lines, together % with the text that is put into them. To achieve this we need to % adapt the definition of |\markright| and |\markboth| somewhat. % \changes{babel~3.7c}{1999/04/08}{Removed the use of \cs{head@lang} % (PR 2990)} % \changes{babel~3.7c}{1999/04/09}{Avoid expanding the arguments by % storing them in token registers} % \changes{babel~3.7m}{2003/11/15}{added \cs{bbl@restore@actives} to % the mark} % \changes{babel~3.8c}{2004/05/26}{No need to add \emph{anything} to % an empty mark; prevented this by checking the contents of the % argument} % \changes{babel~3.8f}{2005/05/15}{Make the definition independent of % the original definition; expand \cs{languagename} before passing % it into the token registers} % \begin{macrocode} \bbl@redefine\markright#1{% % \end{macrocode} % First of all we temporarily store the language switching command, % using an expanded definition in order to get the current value of % |\languagename|. % \begin{macrocode} \edef\bbl@tempb{\noexpand\protect \noexpand\foreignlanguage{\languagename}}% % \end{macrocode} % Then, we check whether the argument is empty; if it is, we % just make sure the scratch token register is empty. % \begin{macrocode} \def\bbl@arg{#1}% \ifx\bbl@arg\@empty \toks@{}% \else % \end{macrocode} % Next, we store the argument to |\markright| in the scratch token % register, together with the expansion of |\bbl@tempb| (containing % the language switching command) as defined before. This way % these commands will not be expanded by using |\edef| later % on, and we make sure that the text is typeset using the % correct language settings. While doing so, we make sure that % active characters that may end up in the mark are not disabled by % the output routine kicking in while \cs{@safe@activestrue} is in % effect. % \begin{macrocode} \expandafter\toks@\expandafter{% \bbl@tempb{\protect\bbl@restore@actives#1}}% \fi % \end{macrocode} % Then we define a temporary control sequence using |\edef|. % \begin{macrocode} \edef\bbl@tempa{% % \end{macrocode} % When |\bbl@tempa| is executed, only |\languagename| will be % expanded, because of the way the token register was filled. % \begin{macrocode} \noexpand\org@markright{\the\toks@}}% \bbl@tempa } % \end{macrocode} % \end{macro} % % \begin{macro}{\markboth} % \begin{macro}{\@mkboth} % The definition of |\markboth| is equivalent to that of % |\markright|, except that we need two token registers. The % documentclasses \cls{report} and \cls{book} define and set the % headings for the page. While doing so they also store a copy of % |\markboth| in |\@mkboth|. Therefor we need to check whether % |\@mkboth| has already been set. If so we neeed to do that again % with the new definition of |\makrboth|. % \changes{babel~3.7m}{2003/11/15}{added \cs{bbl@restore@actives} to % the mark} % \changes{babel~3.8c}{2004/05/26}{No need to add \emph{anything} to % an empty mark, prevented this by checking the contents of the % arguments} % \changes{babel~3.8f}{2005/05/15}{Make the definition independent of % the original definition; expand \cs{languagename} before passing % it into the token registers} % \changes{babel~3.8j}{2008/03/21}{Added setting of \cs{@mkboth} (PR % 3826)} % \begin{macrocode} \ifx\@mkboth\markboth \def\bbl@tempc{\let\@mkboth\markboth} \else \def\bbl@tempc{} \fi % \end{macrocode} % Now we can start the new definition of |\markboth| % \begin{macrocode} \bbl@redefine\markboth#1#2{% \edef\bbl@tempb{\noexpand\protect \noexpand\foreignlanguage{\languagename}}% \def\bbl@arg{#1}% \ifx\bbl@arg\@empty \toks@{}% \else \expandafter\toks@\expandafter{% \bbl@tempb{\protect\bbl@restore@actives#1}}% \fi \def\bbl@arg{#2}% \ifx\bbl@arg\@empty \toks8{}% \else \expandafter\toks8\expandafter{% \bbl@tempb{\protect\bbl@restore@actives#2}}% \fi \edef\bbl@tempa{% \noexpand\org@markboth{\the\toks@}{\the\toks8}}% \bbl@tempa } % \end{macrocode} % and copy it to |\@mkboth| if necesary. % \begin{macrocode} \bbl@tempc % % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{Encoding issues (part 2)} % % \changes{babel~3.7c}{1999/04/16}{Removed redefinition of \cs{@roman} % and \cs{@Roman}} % % \begin{macro}{\TeX} % \begin{macro}{\LaTeX} % \changes{babel~3.7a}{1998/03/12}{Make \TeX\ and \LaTeX\ logos % encoding-independent} % Because documents may use font encodings other than one of the % latin encodings, we make sure that the logos of \TeX\ and % \LaTeX\ always come out in the right encoding. % \begin{macrocode} %<*core> \bbl@redefine\TeX{\textlatin{\org@TeX}} \bbl@redefine\LaTeX{\textlatin{\org@LaTeX}} % % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{Preventing clashes with other packages} % % \subsubsection{\pkg{ifthen}} % % \begin{macro}{\ifthenelse} % \changes{babel~3.5g}{1996/08/11}{Redefinition of \cs{ifthenelse} % added to circumvent problems with \cs{pageref} in the argument of % \cs{isodd}} % Sometimes a document writer wants to create a special effect % depending on the page a certain fragment of text appears on. This % can be achieved by the following piece of code: % \begin{verbatim} % \ifthenelse{\isodd{\pageref{some:label}}} % {code for odd pages} % {code for even pages} % \end{verbatim} % In order for this to work the argument of |\isodd| needs to be % fully expandable. With the above redefinition of |\pageref| it is % not in the case of this example. To overcome that, we add some % code to the definition of |\ifthenelse| to make things work. % % The first thing we need to do is check if the package % \pkg{ifthen} is loaded. This should be done at |\begin{document}| % time. % \begin{macrocode} %<*package> \AtBeginDocument{% \@ifpackageloaded{ifthen}{% % \end{macrocode} % Then we can redefine |\ifthenelse|: % \changes{babel~3.6f}{1997/01/14}{\cs{ifthenelse} needs to be long} % \begin{macrocode} \bbl@redefine@long\ifthenelse#1#2#3{% % \end{macrocode} % We want to revert the definition of |\pageref| to its original % definition for the duration of |\ifthenelse|, so we first need to % store its current meaning. % \begin{macrocode} \let\bbl@tempa\pageref \let\pageref\org@pageref % \end{macrocode} % Then we can set the |\@safe@actives| switch and call the original % |\ifthenelse|. In order to be able to use shorthands in the % second and third arguments of |\ifthenelse| the resetting of the % switch \emph{and} the definition of |\pageref| happens inside % those arguments. % \changes{babel~3.6i}{1997/02/25}{Now reset the @safe@actives switch % inside the 2nd and 3rd arguments of \cs{ifthenelse}} % \changes{babel~3.7f}{2000/06/29}{\cs{pageref} needs to have its % babel definition reinstated in the second and third arguments} % \begin{macrocode} \@safe@activestrue \org@ifthenelse{#1}{% \let\pageref\bbl@tempa \@safe@activesfalse #2}{% \let\pageref\bbl@tempa \@safe@activesfalse #3}% }% % \end{macrocode} % When the package wasn't loaded we do nothing. % \begin{macrocode} }{}% } % \end{macrocode} % \end{macro} % % \subsubsection{\pkg{varioref}} % % \begin{macro}{\@@vpageref} % \changes{babel~3.6a}{1996/10/29}{Redefinition of \cs{@@vpageref} % added to circumvent problems with active \texttt{:} in the % argument of \cs{vref} when \pkg{varioref} is used} % \begin{macro}{\vrefpagenum} % \changes{babel~3.7o}{2003/11/18}{Added redefinition of % \cs{vrefpagenum} which deals with ranges of pages} % \begin{macro}{\Ref} % \changes{babel~3.8g}{2005/05/21}{We also need to adapt \cs{Ref} % which needs to be able to uppercase the first letter of the % expansion of \cs{ref}} % When the package varioref is in use we need to modify its % internal command |\@@vpageref| in order to prevent problems when % an active character ends up in the argument of |\vref|. % \begin{macrocode} \AtBeginDocument{% \@ifpackageloaded{varioref}{% \bbl@redefine\@@vpageref#1[#2]#3{% \@safe@activestrue \org@@@vpageref{#1}[#2]{#3}% \@safe@activesfalse}% % \end{macrocode} % The same needs to happen for |\vrefpagenum|. % \begin{macrocode} \bbl@redefine\vrefpagenum#1#2{% \@safe@activestrue \org@vrefpagenum{#1}{#2}% \@safe@activesfalse}% % \end{macrocode} % The package \pkg{varioref} defines |\Ref| to be a robust command % wich uppercases the first character of the reference text. In % order to be able to do that it needs to access the exandable form % of |\ref|. So we employ a little trick here. We redefine the % (internal) command \verb*|\Ref | to call |\org@ref| instead of % |\ref|. The disadvantgage of this solution is that whenever the % derfinition of |\Ref| changes, this definition needs to be updated % as well. % \begin{macrocode} \expandafter\def\csname Ref \endcsname#1{% \protected@edef\@tempa{\org@ref{#1}}\expandafter\MakeUppercase\@tempa} }{}% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{\pkg{hhline}} % % \begin{macro}{\hhline} % Delaying the activation of the shorthand characters has introduced % a problem with the \pkg{hhline} package. The reason is that it % uses the `:' character which is made active by the french support % in \babel. Therefor we need to \emph{reload} the package when % the `:' is an active character. % % So at |\begin{document}| we check whether \pkg{hhline} is loaded. % \begin{macrocode} \AtBeginDocument{% \@ifpackageloaded{hhline}% % \end{macrocode} % Then we check whether the expansion of |\normal@char:| is not % equal to |\relax|. % \changes{babel~3.8b}{2004/04/19}{added \cs{string} to prevent % unwanted expansion of the colon} % \begin{macrocode} {\expandafter\ifx\csname normal@char\string:\endcsname\relax \else % \end{macrocode} % In that case we simply reload the package. Note that this happens % \emph{after} the category code of the @-sign has been changed to % other, so we need to temporarily change it to letter again. % \begin{macrocode} \makeatletter \def\@currname{hhline}\input{hhline.sty}\makeatother \fi}% {}} % \end{macrocode} % \end{macro} % % \subsubsection{\pkg{hyperref}} % % \begin{macro}{\pdfstringdefDisableCommands} % \changes{babel~3.8j}{2008/03/16}{Inform \pkg{hyperref} to use % shorthands at system level (PR4006)} % Although a number of interworking problems between \pkg{babel} % and \pkg{hyperref} are tackled by \pkg{hyperref} itself we need % to take care of correctly handling the shorthand characters. % When they get expanded inside a bookmark a warning will appear in % the log file which can be prevented. This is done by informing % \pkg{hyperref} that it should the shorthands as defined on the % system level rather than at the user level. % % \begin{macrocode} \AtBeginDocument{% \@ifundefined{pdfstringdefDisableCommands}% {}% {\pdfstringdefDisableCommands{% \languageshorthands{system}}% }% } % \end{macrocode} % \end{macro} % % % \subsubsection{General} % % \begin{macro}{\FOREIGNLANGUAGE} % The package \pkg{fancyhdr} treats the running head and fout lines % somewhat differently as the standard classes. A symptom of this is % that the command |\foreignlanguage| which \babel\ adds to the % marks can end up inside the argument of |\MakeUppercase|. To % prevent unexpected results we need to define |\FOREIGNLANGUAGE| % here. % \changes{babel~3.7j}{2003/05/23}{Define \cs{FOREIGNLANGUAGE} % unconditionally} % \begin{macrocode} \DeclareRobustCommand{\FOREIGNLANGUAGE}[1]{% \lowercase{\foreignlanguage{#1}}} % % \end{macrocode} % \end{macro} % % \begin{macro}{\nfss@catcodes} % \changes{babel~3.5g}{1996/08/18}{Need to add the double quote and % acute characters to \cs{nfss@catcodes} to prevent problems when % reading in .fd files} % \LaTeX's font selection scheme sometimes wants to read font % definition files in the middle of processing the document. In % order to guard against any characters having the wrong % |\catcode|s it always calls |\nfss@catcodes| before loading a % file. Unfortunately, the characters |"| and |'| are not dealt % with. Therefor we have to add them until \LaTeX\ does that % herself. % \begin{macrocode} %<*core|shorthands> \ifx\nfss@catcodes\@undefined \else \addto\nfss@catcodes{% \@makeother\'% \@makeother\"% } \fi % \end{macrocode} % \end{macro} % % \begin{macrocode} % % \end{macrocode} % % \section{Local Language Configuration} % % \begin{macro}{\loadlocalcfg} % At some sites it may be necessary to add site-specific actions to % a language definition file. This can be done by creating a file % with the same name as the language definition file, but with the % extension \file{.cfg}. For instance the file \file{norsk.cfg} % will be loaded when the language definition file \file{norsk.ldf} % is loaded. % % \changes{babel~3.5d}{1995/06/22}{Added macro} % \begin{macrocode} %<*core> % \end{macrocode} % For plain-based formats we don't want to override the definition % of |\loadlocalcfg| from \file{plain.def}. % \begin{macrocode} \ifx\loadlocalcfg\@undefined \def\loadlocalcfg#1{% \InputIfFileExists{#1.cfg} {\typeout{*************************************^^J% * Local config file #1.cfg used^^J% *}% } {}} \fi % \end{macrocode} % Just to be compatible with \LaTeX$\:$2.09 we add a few more lines % of code: % \begin{macrocode} \ifx\@unexpandable@protect\@undefined \def\@unexpandable@protect{\noexpand\protect\noexpand} \long\def \protected@write#1#2#3{% \begingroup \let\thepage\relax #2% \let\protect\@unexpandable@protect \edef\reserved@a{\write#1{#3}}% \reserved@a \endgroup \if@nobreak\ifvmode\nobreak\fi\fi } \fi % % \end{macrocode} % \end{macro} % % % \clearpage % \section{Driver files for the documented source code} % % Since \babel\ version 3.4 all source files that are part of the % \babel\ system can be typeset separately. But to typeset % them all in one document, the file \file{babel.drv} can be used. % If you only want the information on how to use the \babel\ system % and what goodies are provided by the language-specific files, you % can run the file \file{user.drv} through \LaTeX\ to get a user % guide. % % \changes{babel~3.4b}{1994/05/18}{Use the ltxdoc class instead of % article} % \changes{babel~3.7a}{1997/05/21}{Now need packages t1enc and % supertabular to be loaded; the documentation for icelandic needs % its \file{.ldf} file to be present} % \changes{babel~3.8a}{2004/02/20}{Also load package url} % \begin{macrocode} %<*driver> \documentclass{ltxdoc} \usepackage{url,t1enc,supertabular} \usepackage[icelandic,english]{babel} \DoNotIndex{\!,\',\,,\.,\-,\:,\;,\?,\/,\^,\`,\@M} \DoNotIndex{\@,\@ne,\@m,\@afterheading,\@date,\@endpart} \DoNotIndex{\@hangfrom,\@idxitem,\@makeschapterhead,\@mkboth} \DoNotIndex{\@oddfoot,\@oddhead,\@restonecolfalse,\@restonecoltrue} \DoNotIndex{\@starttoc,\@unused} \DoNotIndex{\accent,\active} \DoNotIndex{\addcontentsline,\advance,\Alph,\arabic} \DoNotIndex{\baselineskip,\begin,\begingroup,\bf,\box,\c@secnumdepth} \DoNotIndex{\catcode,\centering,\char,\chardef,\clubpenalty} \DoNotIndex{\columnsep,\columnseprule,\crcr,\csname} \DoNotIndex{\day,\def,\dimen,\discretionary,\divide,\dp,\do} \DoNotIndex{\edef,\else,\@empty,\end,\endgroup,\endcsname,\endinput} \DoNotIndex{\errhelp,\errmessage,\expandafter,\fi,\filedate} \DoNotIndex{\fileversion,\fmtname,\fnum@figure,\fnum@table,\fontdimen} \DoNotIndex{\gdef,\global} \DoNotIndex{\hbox,\hidewidth,\hfil,\hskip,\hspace,\ht,\Huge,\huge} \DoNotIndex{\ialign,\if@twocolumn,\ifcase,\ifcat,\ifhmode,\ifmmode} \DoNotIndex{\ifnum,\ifx,\immediate,\ignorespaces,\input,\item} \DoNotIndex{\kern} \DoNotIndex{\labelsep,\Large,\large,\labelwidth,\lccode,\leftmargin} \DoNotIndex{\lineskip,\leavevmode,\let,\list,\ll,\long,\lower} \DoNotIndex{\m@ne,\mathchar,\mathaccent,\markboth,\month,\multiply} \DoNotIndex{\newblock,\newbox,\newcount,\newdimen,\newif,\newwrite} \DoNotIndex{\nobreak,\noexpand,\noindent,\null,\number} \DoNotIndex{\onecolumn,\or} \DoNotIndex{\p@,par, \parbox,\parindent,\parskip,\penalty} \DoNotIndex{\protect,\ps@headings} \DoNotIndex{\quotation} \DoNotIndex{\raggedright,\raise,\refstepcounter,\relax,\rm,\setbox} \DoNotIndex{\section,\setcounter,\settowidth,\scriptscriptstyle} \DoNotIndex{\sfcode,\sl,\sloppy,\small,\space,\spacefactor,\strut} \DoNotIndex{\string} \DoNotIndex{\textwidth,\the,\thechapter,\thefigure,\thepage,\thepart} \DoNotIndex{\thetable,\thispagestyle,\titlepage,\tracingmacros} \DoNotIndex{\tw@,\twocolumn,\typeout,\uppercase,\usecounter} \DoNotIndex{\vbox,\vfil,\vskip,\vspace,\vss} \DoNotIndex{\widowpenalty,\write,\xdef,\year,\z@,\z@skip} % \end{macrocode} % % Here |\dlqq| is defined so that an example of |"'| can be % given. % \begin{macrocode} \makeatletter \gdef\dlqq{{\setbox\tw@=\hbox{,}\setbox\z@=\hbox{''}% \dimen\z@=\ht\z@ \advance\dimen\z@-\ht\tw@ \setbox\z@=\hbox{\lower\dimen\z@\box\z@}\ht\z@=\ht\tw@ \dp\z@=\dp\tw@ \box\z@\kern-.04em}} % \end{macrocode} % % The code lines are numbered within sections, % \begin{macrocode} %<*!user> \@addtoreset{CodelineNo}{section} \renewcommand\theCodelineNo{% \reset@font\scriptsize\thesection.\arabic{CodelineNo}} % \end{macrocode} % which should also be visible in the index; hence this % redefinition of a macro from \file{doc.sty}. % \begin{macrocode} \renewcommand\codeline@wrindex[1]{\if@filesw \immediate\write\@indexfile {\string\indexentry{#1}% {\number\c@section.\number\c@CodelineNo}}\fi} % \end{macrocode} % % The glossary environment is used or the change log, but its % definition needs changing for this document. % \begin{macrocode} \renewenvironment{theglossary}{% \glossary@prologue% \GlossaryParms \let\item\@idxitem \ignorespaces}% {} % \makeatother % \end{macrocode} % % A few shorthands used in the documentation % \changes{babel~3.5g}{1996/07/06}{Added definition of \cs{Babel}} % \begin{macrocode} \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}} % \end{macrocode} % % Some more definitions needed in the documentation. % \begin{macrocode} %\newcommand*\note[1]{\textbf{#1}} \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}} \newcommand*\langdeffile[1]{% %<-user> \clearpage \DocInput{#1}} % \end{macrocode} % % When a full index should be generated uncomment the line with % |\EnableCrossrefs|. Beware, processing may take some time. % Use |\DisableCrossrefs| when the index is ready. % \begin{macrocode} % \EnableCrossrefs \DisableCrossrefs % \end{macrocode} % % Inlude the change log. % \begin{macrocode} %<-user>\RecordChanges % \end{macrocode} % The index should use the linenumbers of the code. % \begin{macrocode} %<-user>\CodelineIndex % \end{macrocode} % % Set everything in |\MacroFont| instead of |\AltMacroFont| % \begin{macrocode} \setcounter{StandardModuleDepth}{1} % \end{macrocode} % % For the user guide we only want the description parts of all the % files. % \begin{macrocode} %<+user>\OnlyDescription % \end{macrocode} % Here starts the document % \begin{macrocode} \begin{document} \DocInput{babel.dtx} % \end{macrocode} % % All the language definition files. % \changes{babel~3.2e}{1992/07/07}{Added slovak} % \changes{babel~3.3}{1993/07/11}{Added catalan and galician} % \changes{babel~3.3}{1993/07/11}{Added turkish} % \changes{babel~3.4}{1994/02/28}{Added bahasa} % \changes{babel~3.5a}{1995/02/16}{Added breton, irish, scottish} % \changes{babel~3.5b}{1995/05/19}{Added lsorbian, usorbian} % \changes{babel~3.5c}{1995/06/14}{Changed the order of including the % language files somewhat (PR1652)} % \changes{babel~3.5g}{1996/07/06}{Added greek} % \changes{babel~3.6a}{1996/12/14}{Added welsh} %^^A \changes{babel~3.6i}{1997/02/07}{Added sanskrit} % \changes{babel~3.6i}{1997/02/22}{Added basque} ^^A% \changes{babel~3.6i}{1997/02/22}{Added kannada} % \changes{babel~3.7a}{1997/05/21}{Added icelandic} % \changes{babel~3.7b}{1998/06/25}{Added Latin} % \changes{babel~3.7c}{1999/03/09}{Added ukrainian} % \changes{babel~3.7c}{1999/05/09}{Added hebrew and serbian} % \changes{babel~3.7e}{1999/11/22}{Added missing hebrew files} % \changes{babel~3.7f}{2000/09/21}{Added bulgarian} % \changes{babel~3.7f}{2000/09/26}{Added samin} % \changes{babel~3.8a}{2004/02/20}{Added interlingua} % \changes{babel~3.8h}{2005/11/23}{Added albanian and bahasam} % \begin{macrocode} %<+user>\clearpage \langdeffile{esperanto.dtx} \langdeffile{interlingua.dtx} % \langdeffile{dutch.dtx} \langdeffile{english.dtx} \langdeffile{germanb.dtx} \langdeffile{ngermanb.dtx} % \langdeffile{breton.dtx} \langdeffile{welsh.dtx} \langdeffile{irish.dtx} \langdeffile{scottish.dtx} % \langdeffile{greek.dtx} % \langdeffile{frenchb.dtx} \langdeffile{italian.dtx} \langdeffile{latin.dtx} \langdeffile{portuges.dtx} \langdeffile{spanish.dtx} \langdeffile{catalan.dtx} \langdeffile{galician.dtx} \langdeffile{basque.dtx} \langdeffile{romanian.dtx} % \langdeffile{danish.dtx} \langdeffile{icelandic.dtx} \langdeffile{norsk.dtx} \langdeffile{swedish.dtx} \langdeffile{samin.dtx} % \langdeffile{finnish.dtx} \langdeffile{magyar.dtx} \langdeffile{estonian.dtx} % \langdeffile{albanian.dtx} \langdeffile{croatian.dtx} \langdeffile{czech.dtx} \langdeffile{polish.dtx} \langdeffile{serbian.dtx} \langdeffile{slovak.dtx} \langdeffile{slovene.dtx} \langdeffile{russianb.dtx} \langdeffile{bulgarian.dtx} \langdeffile{ukraineb.dtx} % \langdeffile{lsorbian.dtx} \langdeffile{usorbian.dtx} \langdeffile{turkish.dtx} % \langdeffile{hebrew.dtx} \DocInput{hebinp.dtx} \DocInput{hebrew.fdd} \DocInput{heb209.dtx} \langdeffile{bahasa.dtx} \langdeffile{bahasam.dtx} %\langdeffile{sanskrit.dtx} %\langdeffile{kannada.dtx} %\langdeffile{nagari.dtx} %\langdeffile{tamil.dtx} \clearpage \DocInput{bbplain.dtx} % \end{macrocode} % Finally print the index and change log (not for the user guide). % \begin{macrocode} %<*!user> \clearpage \def\filename{index} \PrintIndex \clearpage \def\filename{changes} \PrintChanges % \end{document} % % \end{macrocode} % % \Finale % %% %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} \endinput