% \iffalse meta-comment % % Copyright 1989-1996 Johannes L. Braams and any individual authors % listed elsewhere in this file. All rights reserved. % % For further copyright information see any other copyright notices in % this file. % % This file is part of the Babel system release 3.6. % -------------------------------------------------- % This system is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. % % For error reports concerning UNCHANGED versions of this file no % more than one year old, see bugs.txt. % % Please do not request updates from me directly. Primary % distribution is through the CTAN archives. % % % IMPORTANT COPYRIGHT NOTICE: % % You are NOT ALLOWED to distribute this file alone. % % You are allowed to distribute this file under the condition that it % is distributed together with all the files listed in manifest.txt. % % If you receive only some of these files from someone, complain! % % Permission is granted to copy this file to another file with a % clearly different name and to customize the declarations in that % copy to serve the needs of your installation, provided that you % comply with the conditions in the file legal.txt from the LaTeX2e % distribution. % % However, NO PERMISSION is granted to produce or to distribute a % modified version of this file under its original name. % % You are NOT ALLOWED to change this file. % % % \fi % \CheckSum{2912} %%%\iffalse %%% @LaTeX-file{ %%% author = "Johannes L. Braams", %%% version = "3.6h", %%% date = "23 January 1997", %%% time = "23:49:49 MET", %%% filename = "babel.dtx", %%% address = "Kooienswater 62 %%% The Netherlands", %%% telephone = "(3179) 352 28 19", %%% FAX = "(3170) 343 23 95", %%% checksum = "20446 4113 18260 157597", %%% email = "JLBraams@cistron.nl (Internet)", %%% codetable = "ISO/ASCII", %%% keywords = "babel", %%% supported = "yes", %%% docstring = "This file, babel.dtx contains the core of %%% the babel system as it was described in %%% TuGboat Volume 12 no 2 and Volume 14 no 1. %%% %%% The checksum field above contains a CRC-16 %%% checksum as the first value, followed by the %%% equivalent of the standard UNIX wc (word %%% count) utility output of lines, words, and %%% characters. This is produced by Robert %%% Solovay's checksum utility.", %%% } %%% \fi %% % \def\filename{babel.dtx} % \let\thisfilename\filename % %\iffalse % \changes{babel~3.5g}{1996/10/10}{We need at least \LaTeX\ from % december 1994} % \begin{macrocode} %<+package>\NeedsTeXFormat{LaTeX2e}[1994/12/01] % \end{macrocode} % %<*dtx> \ProvidesFile{babel.dtx} % %\fi %\ProvidesFile{babel.dtx}[1997/01/23 v3.6h The Babel package] %\iffalse % % Babel DOCUMENT-STYLE option for LaTeX version 2.09 or plain TeX; % Babel package for LaTeX2e. % %% Copyright (C) 1989 -- 1997 by Johannes Braams, %% TeXniek %% all rights reserved. % %% Please report errors to: J.L. Braams %% JLBraams@cistron.nl %<*filedriver> \documentclass{ltxdoc} \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*\file[1]{\texttt{#1}} \newcommand*\cls[1]{\texttt{#1}} \newcommand*\pkg[1]{\texttt{#1}} \begin{document} \DocInput{babel.dtx} \end{document} % %\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 dsitribution} % \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} % % \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\\ % Kooienswater 62\\ % 2715 AJ Zoetermeer\\ % The Netherlands\\ % \texttt{JLBraams@cistron.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 non-american language or in more than one language. % \end{abstract} % % \begin{multicols}{2} % \tableofcontents % \end{multicols} % % \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 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 \textsf{otherlanguage} does basically the same as % |\selectlanguage|, except the language change is local to the % environment. For mixing left-to-right typesetting with % right-to-left typesetting the use of this environment is a % prerequisite. 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 \textsf{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. % % \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 which starts these personal shorthands. % % \DescribeMacro\defineshorthand % The command |\defineshorthand| takes two arguments, the first of % which is a one or two character sequence, the second argument 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 acheived by entering % |\aliasshorthand{"}{/}|. % % \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. % % \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} % \begin{tabular}{l p{8cm}} % Afrikaans & afrikaans\\ % Bahasa & bahasa\\ % Breton & breton\\ % Catalan & catalan\\ % Croatian & croatian\\ % Czech & czech\\ % Danish & danish\\ % Dutch & dutch\\ % English & english, USenglish, american, UKenglish, british\\ % Esperanto & esperanto\\ % Estonian & estonian\\ % Finnish & finnish\\ % French & french, francais\\ % Galician & galician\\ % German & austrian, german, germanb\\ % Greek & greek \\ % Hungarian & magyar, hungarian\\ % Irish Gaelic & irish\\ % Italian & italian\\ % Lower Sorbian & lowersorbian\\ % Norwegian & norsk, nynorsk\\ % Polish & polish\\ % Portuguese & portuges, portuguese, brazilian, brazil\\ % Romanian & romanian\\ % Russian & russian\\ % Scottish Gaelic & scottish\\ % Spanish & spanish\\ % Slovakian & slovak\\ % Slovenian & slovene\\ % Swedish & swedish\\ % Turkish & turkish\\ % Upper Sorbian & uppersorbian\\ % Welsh & welsh % \end{tabular} % \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} % % When you use the document class \cls{book} \emph{and} you use % |\ref| inside the argument of |\chapter| you will experience the % problem that \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 doument 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.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 occured: % \begin{itemize} % \item A new environment \textsf{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 languange definition file was originally % developped 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 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 comands |\LdfInit|, |\ldf@quit| and % |\ldf@finish| are introduced that perform a number of standard % tasks. % \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 untill % |\begin{document}|, this has the consequence that you need to % add appropriate |\selectlanguage| commands if you include % |\hyphenation| lists in the preamble of your document. % \item \babel\ now has a \textsf{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 % problaly 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 cantain 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 two macros are defined that % are to be used 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 in the case where two % languages can (or have to) use the same hyphenation % patterns. This can alos be useful when a user wants to use a % language for which no patterns are preloaded in the format. In % such a case 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 have to conform to a number of % conventions. The reason for this is that 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 such that they % can be read by \LaTeX\ as well as by 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 languagedefinition 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\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 offer the user the possibility to switch % between languages and we do not know in what state \TeX\ might be % 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\main@language % To postpone the activation of the definitions needed for a % language untill 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\LdfInit % The macro |\LdfInit| performs a couple of standard checks that % have to be made at the beginning of a language definition file, % such as checking the category code of the @-sign, preventing that % the \file{.ldf} file is processed twice, etc. % % \DescribeMacro\ldf@quit % The macro |\ldf@quit| performs a couple of tasks that need to be % taken care of when a \file{.ldf} file was processed % earlier. These tasks include the resetting of 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| performs a couple of tasks that need to be % taken care of at the end of each \file{.ldf} file. These tasks % include the resetting of the category code of the @-sign, the % loading of a local configuration file and preparing the language % to be activated at |\begin{document}| time. % % \DescribeMacro\loadlocalcfg % At the end of the processing of 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\ in order to support local document % classes. The user will be informed of the fact that this % configuration file is loaded. This macro is called by % |\finish@ldf|. % % \DescribeMacro\subsitutefontfamily % 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 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 untill the end of then 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@deactive| 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.i.\ |~| 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. Therefore a mechanism for saving (and restoring) % the original definition of those macros is provided. We provide % two macros for this\footnote{This mechanism was introduced by % Bernd Raichle.}. % % \DescribeMacro{\babel@save} To save the current meaning of any % control sequence the macro |\babel@save| is provided. It takes % one argument, \meta{csname}, the control sequence for which the % meaning has to be saved. % % \DescribeMacro{\babel@savevariable} A second macro is provided to % save the current value of a variable. In this context anything % that is allowed after the |\the| primitive is considered to be a % variable. The macro takes one argument, the \meta{variable}. % % The effect of the aforementioned macros is that a piece of code % is appended 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 that 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 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. % % Therefore, \babel{} will first search for the file % \file{french.ldf} when you give it the option \Lopt{french}; then % it will try to load \file{frenchb.ldf}. When you give \babel{} % the option \Lopt{francais} it will only look for % \file{frenchb.ldf}. % %\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 to switch between languages in one document. The % basic interface consists of using ones option, which is the same % for \emph{all} standard document classes. % % In some cases the language definition files provide macros that % can be of use to plain \TeX\ users as well as to \LaTeX\ users. % The \babel{} system has been implemented in such a way 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 polishing the text of the documentation and % supplied parts of the macros for the Dutch language. Paul % Wackers and Werenfried Spit helped finding and repairing 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 februari 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, therefore we make sure that the format file used is % the right one. % % The identification code for each file is something that was % introduced in \LaTeXe. When the command |\ProvidesFile| does not % exist, v3.6 dummy definition is provided. % \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{#4 #3 <#2>}% % \toks8{Babel <#3> and hyphenation patterns for }% } %<*kernel&patterns> \else % \end{macrocode} % In this case we save the orginal definition of |\ProvidesFile| in % |\bbl@tempa| and restore it after we have stored the version of % the file in |\toks8|. % \begin{macrocode} \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} % \fi % % \end{macrocode} % 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} [1997/01/23 v3.6h %<+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 new features of \LaTeXe, a new file % is introdued to the \babel\ system, \file{babel.sty}. This file % is loaded by the |\usepackage| command and defines all the % language options known in the \babel\ system. % % 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 for `afrikaans'} % \changes{babel~3.6c}{1997/01/05}{When \cs{LdfInit} is undefined we % need to load \file{babel.def} from \file{babel.sty}} % \begin{macrocode} %<*package> \ifx\LdfInit\undefined\input{babel.def}\fi \DeclareOption{afrikaans}{\input{dutch.ldf}} \DeclareOption{american}{\input{english.ldf}} % \end{macrocode} % Austrian is really a dialect of German. % \begin{macrocode} \DeclareOption{austrian}{\input{germanb.ldf}} \DeclareOption{bahasa}{\input{bahasa.ldf}} \DeclareOption{brazil}{\input{portuges.ldf}} % \end{macrocode} % \changes{babel~3.5b}{1995/05/25}{Added brazilian as alternative for % brazil} % \begin{macrocode} \DeclareOption{brazilian}{\input{portuges.ldf}} \DeclareOption{breton}{\input{breton.ldf}} % \end{macrocode} % \changes{babel~3.5d}{1995/07/02}{Added british as an alternative for % `english' with a preference for british hyphenation} % \begin{macrocode} \DeclareOption{british}{\input{english.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 estonian option} % \begin{macrocode} \DeclareOption{english}{\input{english.ldf}} \DeclareOption{esperanto}{\input{esperant.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}; therefore 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 frenchb from % Daniel Flipo for french support} % \changes{babel~3.6e}{1997/01/08}{Added option `frenchb' as an alias % for `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{francais.ldf}. % \changes{babel~3.5d}{1995/07/02}{Load \file{french.ldf} when it is % found instead of \file{frenchb.ldf}} % \begin{macrocode} \IfFileExists{french.ldf}{% \DeclareOption{french}{\input{french.ldf}}% }{% \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} % \begin{macrocode} \DeclareOption{greek}{\input{greek.ldf}} % \end{macrocode} % \Lopt{hungarian} is just a synonym for \Lopt{magyar} % \begin{macrocode} \DeclareOption{hungarian}{\input{magyar.ldf}} \DeclareOption{irish}{\input{irish.ldf}} \DeclareOption{italian}{\input{italian.ldf}} \DeclareOption{lowersorbian}{\input{lsorbian.ldf}} \DeclareOption{magyar}{\input{magyar.ldf}} \DeclareOption{norsk}{\input{norsk.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}} \DeclareOption{scottish}{\input{scottish.ldf}} \DeclareOption{slovak}{\input{slovak.ldf}} \DeclareOption{slovene}{\input{slovene.ldf}} \DeclareOption{spanish}{\input{spanish.ldf}} \DeclareOption{swedish}{\input{swedish.ldf}} \DeclareOption{turkish}{\input{turkish.ldf}} \DeclareOption{uppersorbian}{\input{usorbian.ldf}} \DeclareOption{welsh}{\input{welsh.ldf}} % \end{macrocode} % \changes{babel~3.6e}{1997/01/08}{Added options `UKenglish' and % `USenglish'} % \begin{macrocode} \DeclareOption{UKenglish}{\input{english.ldf}} \DeclareOption{USenglish}{\input{english.ldf}} % \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 % \textsf{KeepShorthandsActive}} % \begin{macrocode} \DeclareOption{KeepShorthandsActive}{% \def\KeepShorthandsActive{}} % \end{macrocode} % % The options have to be processed in the order in which the user % specified them: % \begin{macrocode} \ProcessOptions* % \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. % \begin{macrocode} \def\substitutefontfamily#1#2#3{% \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 \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 whith the advent of \cs{LdfInit}} % % \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 filenaming 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. Therefore |\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}{Refrased \cs{ifnum} test} % \begin{macrocode} \def\iflanguage#1#2#3{% \expandafter\ifx\csname l@#1\endcsname\relax \@nolanerr{#1}% \else \ifnum\csname l@#1\endcsname=\language #2% \else#3\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 =. % Therefore, we have to make sure that a macro |\protect| exists. % If it doesn't it is |\let| to |\relax|. % \begin{macrocode} \ifx\@undefined\protect\let\protect\relax\fi % \end{macrocode} % As \LaTeX$\:$2.09 writes to files \textit{expanded} whereas % \LaTeXe\ takes care \textit{not} to expand the arguments of % |\write| statements we need to be a bit clever about the way we % add information to \file{.aux} files. Therefore we introduce the % macro |\xstring| which should expand to the right amount of % |\string|'s. % \begin{macrocode} \ifx\documentclass\@undefined \def\xstring{\string\string\string} \else \let\xstring\string \fi % \end{macrocode} % % \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.5f}{1995/11/16}{Now also define \cs{languagename} % at this level} % \begin{macrocode} \expandafter\def\csname selectlanguage \endcsname#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} % % 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@...}} % \begin{macrocode} \def\select@language#1{% \expandafter\ifx\csname date#1\endcsname\relax \@nolanerr{#1}% \else \language=\csname l@#1\endcsname\relax \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}{Seperated 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 somewhart 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 \lefthyphenmin\tw@\righthyphenmin\thr@@\relax \else \expandafter\expandafter\expandafter\set@hyphenmins \csname #1hyphenmins\endcsname\relax \fi \fi} % \end{macrocode} % \end{macro} % % \begin{environment}{otherlanguage} % The \textsf{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} % \begin{macrocode} \long\def\otherlanguage#1{% \def\languagename{#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 \textsf{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}} % \begin{macrocode} \def\foreignlanguage{\protect\csname foreignlanguage \endcsname} \expandafter\def\csname foreignlanguage \endcsname#1#2{% \begingroup \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 % \textsf{otherlanguage*} environment. % \begin{macrocode} \def\foreign@language#1{% % 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} % \begin{macrocode} \language=\csname l@#1\endcsname\relax \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 % disapearance of the first token after this command.} % \begin{macrocode} \csname extras#1\endcsname \expandafter\ifx\csname #1hyphenmins\endcsname\relax \lefthyphenmin\tw@\righthyphenmin\thr@@\relax \else \expandafter\expandafter\expandafter\set@hyphenmins \csname #1hyphenmins\endcsname\relax \fi \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 categary 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} % 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 |\orginalTeX|. % \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. % \begin{macrocode} \def\ldf@quit#1{% \expandafter\main@language\expandafter{#1}% \catcode`\@=\atcatcode \let\atcatcode\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. % \begin{macrocode} \def\ldf@finish#1{% \loadlocalcfg{#1} \expandafter\main@language\expandafter{#1}% \catcode`\@=\atcatcode \let\atcatcode\relax } % \end{macrocode} % \end{macro} % % After the preamble of the document the commands |\LdfInit|, % |\ldf@quit| and |\ldf@finish| are no longer needed. Therefore % they are turned into warning messages in \LaTeX. % \begin{macrocode} \@onlypreamble\LdfInit \@onlypreamble\ldf@quit \@onlypreamble\ldf@finish % \end{macrocode} % % \begin{macro}{\main@language} % \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. % \begin{macrocode} \def\main@language#1{% \def\bbl@main@language{#1}% \let\languagename\bbl@main@language \language=\csname l@\languagename\endcsname\relax } % \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. % % 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\@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*{\@activated}[1]{% \PackageInfo{babel}{% Making #1 an active character}} \fi % \end{macrocode} % \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 wether 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@}} % \begin{macrocode} \def\process@line#1#2/{% \ifx=#1 \process@synonym#2/ \else \process@language#1#2/% \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{=}. % \begin{macrocode} \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\global \expandafter\chardef\csname l@#1\endcsname0\relax \wlog{\string\l@#1=\string\language0} \else % \end{macrocode} % Otherwise the name will be a synonym for the language loaded last. % \begin{macrocode} \expandafter\global \expandafter\chardef\csname l@#1\endcsname\last@language \wlog{\string\l@#1=\string\language\the\last@language} \fi } % \end{macrocode} % \end{macro} % % % \begin{macro}{\process@language} % The macro |\process@language| is used to process a non-empty line % from the `configuration file'. It has three arguments, each % delimited by white space. The third argument is optional, % therfore 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.} % \begin{macrocode} \def\process@language#1 #2 #3/{% \expandafter\addlanguage\csname l@#1\endcsname \expandafter\language\csname l@#1\endcsname % \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.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. Therefore we try to detect such assignments and % store them in the |\|\langvar|hyphenmins| macro. When no % assignments were made we provide a default setting. % \begin{macrocode} \lefthyphenmin\m@ne \input #2\relax \ifnum\lefthyphenmin=\m@ne \lefthyphenmin\tw@ \righthyphenmin\thr@@ \fi % \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} % Finally we store the settings of |\lefthyphenmin| and % |\righthyphenmin|. % \begin{macrocode} \expandafter\edef\csname #1hyphenmins\endcsname{% \the\lefthyphenmin\the\righthyphenmin}} % \end{macrocode} % \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 controlsequence. % % \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 % \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 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.}. % \begin{macrocode} \def\bbl@afterelse#1\else#2\fi{\fi#1} \def\bbl@afterfi#1\fi{\fi#1} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\peek@token} % \changes{babel~3.5f}{1995/12/06}{macro added} % In order 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 macro's. This is necessary for |\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\test@token} % \end{macrocode} % % \begin{macro}{test@token} % \changes{babel~3.5f}{1995/12/06}{macro added} % When the result of peeking at the next token has yeilded 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 therefore % the orginal shorthand character is inserted in the output. The % macro that calls |\test@token| needs to setup |\bbl@nexta| and % |\bbl@nextb| in order to achieve this. % \begin{macrocode} \def\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} % % 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 correclty with already active % characters, provide top level expansion and define all lower % level expansion macro's 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} % \begin{macrocode} \ifcat\noexpand##1\noexpand~\relax \expandafter\edef\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} % \begin{macrocode} \ifx##1'% \let\pr@m@s\bbl@pr@m@s \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} % \begin{macrocode} \ifx\KeepShorthandsActive\@undefined \edef\bbl@tempa{\catcode`\noexpand##1\the\catcode`##1} \expandafter\AtEndOfPackage\expandafter{\bbl@tempa}% \fi % \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} % 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} % 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}% % \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} % \begin{macrocode} \@namedef{user@active\string##1}{% \expandafter\ifx \csname \user@group @sh@\string##1@\endcsname \relax \bbl@afterelse\csname @sh@\string##1@sel\endcsname {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. Therefore % |\peek@token| is called to decide that. % \changes{babel~3.5f}{1995/12/07}{use \cs{peek@token} to check wheter % it is safe to proceed} % \begin{macrocode} \@namedef{user@active@arg\string##1}{% \peek@token{@user@active@arg}{##1}} \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} % 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} % \begin{macrocode} \@namedef{language@active\string##1}{% \expandafter\ifx \csname \language@group @sh@\string##1@\endcsname \relax \bbl@afterelse\csname @sh@\string##1@sel\endcsname {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 wheter % it is safe to proceed} % \begin{macrocode} \@namedef{language@active@arg\string##1}{% \peek@token{@language@active@arg}{##1}} \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. % \begin{macrocode} \@namedef{system@active\string##1}{% \expandafter\ifx \csname \system@group @sh@\string##1@\endcsname \relax \bbl@afterelse\csname @sh@\string##1@sel\endcsname {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 wheter % it is safe to proceed} % \begin{macrocode} \@namedef{system@active@arg\string##1}{% \peek@token{@system@active@arg}{##1}} \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}% }% }\x % \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}} % \begin{macrocode} \def\active@prefix#1{% \ifx\protect\@typeset@protect \else \bbl@afterfi\protect#1\@gobble \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\if@safe@actives} % In some circumstances it is necessary to be able to change the % expansion of an active character on the fly. For this purpose the % switch |@safe@actives| is available. This 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@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@ctivate|. 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.} % \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 @sh@\string#2@sel\endcsname\bbl@scndcs \else \expandafter\let\csname @sh@\string#2@sel\endcsname\bbl@firstcs \fi \@namedef{#1@sh@\string#2\string#3@}{#4}} % \end{macrocode} % \end{macro} % % \begin{macro}{\textormath} % Some of the shorthands that will be declared by the language % definition files have to be useable 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 no user group; % use language group `english' and have a system group called % `system'. % \begin{macrocode} \def\user@group{} \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. % \begin{macrocode} \def\useshorthands#1{% \def\user@group{user}% \initiate@active@char{#1}% \bbl@activate{#1}} % \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} % Because we deal with active characters here we need to use the % |\lccode| trick. Therefore we save the current |\lccode| of the % |~|-character and restore it later. Then we make the new % character active and |\let| it be equal to the original. % \begin{macrocode} \def\aliasshorthand#1#2{% \@tempcnta\lccode`\~ \lccode`~=`#2% \lowercase{\catcode`~\active\let~#1\catcode`#112\relax}% \lccode`\~\@tempcnta} % \end{macrocode} % \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@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 |\pr@m@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} \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} % % 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. % \begin{macrocode} % \changes{babel~3.5f}{1996/04/02}{No need to reset the category code % ofg the tilde as \cs{initiate@active@char now cooreclty deals % with active characters} %<*core> \initiate@active@char{~} \declare@shorthand{system}{~}{\penalty\@M\ } \bbl@activate{~} % \end{macrocode} % % \begin{macro}{\OT1dqpos} % \begin{macro}{\T1dqpos} % The position of the double quote character is different for the % OT1 and T1 encodings. It will later be selected using the % |\f@encoding| macro. Therefore we define two macros here to store % the position of the character in these encodings. % \begin{macrocode} \expandafter\def\csname OT1dqpos\endcsname{127} \expandafter\def\csname T1dqpos\endcsname{4} % \end{macrocode} % When the macor |\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{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} % 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\allowhyphens{\penalty\@M \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. % \begin{macrocode} \def\save@sf@q#1{{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else \let\@SF\@empty \fi \leavevmode #1\@SF}} % \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{% \penalty\@M\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, therefore we make it available by lowering the normal % open quote character to the baseline. % \begin{macrocode} \ProvideTextCommand{\quotedblbase}{OT1}{% \save@sf@q{\set@low@box{\textquotedblright\/}% \box\z@\kern-.04em\allowhyphens}} % \end{macrocode} % Make sure that when an encoding other then \texttt{OT1} ot % \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 then \texttt{OT1} ot % \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 guillemot characters are not available in \texttt{OT1} % encoding. They are faked. % \begin{macrocode} \ProvideTextCommand{\guillemotleft}{OT1}{% \ifmmode \ll \else \save@sf@q{\penalty\@M \raise.2ex\hbox{$\scriptscriptstyle\ll$}\allowhyphens}% \fi} \ProvideTextCommand{\guillemotright}{OT1}{% \ifmmode \gg \else \save@sf@q{\penalty\@M \raise.2ex\hbox{$\scriptscriptstyle\gg$}\allowhyphens}% \fi} % \end{macrocode} % Make sure that when an encoding other then \texttt{OT1} ot % \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 guillemots are not available in \texttt{OT1} % encoding. They are faked. % \begin{macrocode} \ProvideTextCommand{\guilsinglleft}{OT1}{% \ifmmode <% \else \save@sf@q{\penalty\@M \raise.2ex\hbox{$\scriptscriptstyle<$}\allowhyphens}% \fi} \ProvideTextCommand{\guilsinglright}{OT1}{% \ifmmode >% \else \save@sf@q{\penalty\@M \raise.2ex\hbox{$\scriptscriptstyle>$}\allowhyphens}% \fi} % \end{macrocode} % Make sure that when an encoding other then \texttt{OT1} ot % \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. Therefore 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 then \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 then \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} % % \subsection{Shorthands for quotation marks} % % Shorthands are provided for a number of different quotation % marks, which make them useable both outside and inside mathmode. % % \begin{macro}{\glq} % \begin{macro}{\grq} % \changes{babel~3.5f}{1995/09/05}{now use \cs{textormath} in these % definitions} % \changes{babel~3.5f}{1995/09/05}{Added kerning to german right % quote} % The `german' single quotes. % \begin{macrocode} \DeclareRobustCommand{\glq}{% \textormath{\quotesinglbase}{\mbox{\quotesinglbase}}} \DeclareRobustCommand{\grq}{% \textormath{\kern-.0125em\textquoteleft\kern.07em}% {\mbox{\textquoteleft}}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\glqq} % \begin{macro}{\grqq} % \changes{babel~3.5f}{1995/09/05}{now use \cs{textormath} in these % definitions} % \changes{babel~3.5f}{1995/09/05}{Added kerning to german right % quote} % The `german' double quotes. % \begin{macrocode} \DeclareRobustCommand{\glqq}{% \textormath{\quotedblbase}{\mbox{\quotedblbase}}} \DeclareRobustCommand{\grqq}{% \textormath{\save@sf@q{\kern-.07em\textquotedblleft\kern.07em}}% {\mbox{\textquotedblleft}}% } % \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} % The `french' single guillemets. % \begin{macrocode} \DeclareRobustCommand{\flq}{% \textormath{\guilsinglleft}{\mbox{\guilsinglleft}}} \DeclareRobustCommand{\frq}{% \textormath{\guilsinglright}{\mbox{\guilsinglright}}} % \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} % The `french' double quillemets. % \begin{macrocode} \DeclareRobustCommand{\flqq}{% \textormath{\guillemotleft}{\mbox{\guillemotleft}}} \DeclareRobustCommand{\frqq}{% \textormath{\guillemotright}{\mbox{\guillemotright}}} % \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} % \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{{% \expandafter\accent\csname\f@encoding dqpos\endcsname ##1\allowhyphens}}% \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. % \begin{macrocode} {\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}} % \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 \textsf{fontenc} with % option \textsf{OT1} is used. Therefore 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. Therefore % 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). % % Bacsuse 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| van 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. Therefore all we nee 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}{\@testdef} % An internal \LaTeX\ macro used to test if the labels that have % been written on the |.aux| file have changed. It is called by % the |\enddocument| macro. This macro needs to be completely % rewritten, using |\meaning|. The reason for this is that in some % cases the expansion of |\#1@#2| contains the same characters as % the |#3|; but the character codes differ. Therefore \LaTeX\ keeps % reporting that the labels may have changed. % \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}} % \begin{macrocode} \def\@testdef #1#2#3{% \expandafter\let\expandafter\bbl@tempa\csname #1@#2\endcsname \def\bbl@tempb{#3}% \ifx\bbl@tempa\relax\else \edef\bbl@tempa{\expandafter\strip@prefix\meaning\bbl@tempa}\fi \edef\bbl@tempb{\expandafter\strip@prefix\meaning\bbl@tempb}% \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{def}} % \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, % so we redefine this internal macro and leave |\cite| alone. % \begin{macrocode} \bbl@redefine\@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. % \begin{macrocode} %\bbl@redefine\bibcite#1#2{% % \@safe@activestrue\org@bibcite{#1}{#2}\@safe@activesfalse} % \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} % % \begin{macro}{\@lbibitem} % \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}} % The other of the two internal \LaTeX\ macros called by |\bibitem| % that write the citation label on the |.aux| file. % \begin{macrocode} \bbl@redefine\@lbibitem[#1]#2{% \@safe@activestrue\org@@lbibitem[#1]{#2}\@safe@activesfalse} % % \end{macrocode} % \end{macro} % % \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 acheived by the following peice 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{focument}| % 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 orginal % 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|. % \begin{macrocode} \@safe@activestrue\org@ifthenelse{#1}{#2}{#3}% \@safe@activesfalse % \end{macrocode} % Now we need to re-install the stored definition of |\pageref|. % \begin{macrocode} \let\pageref\bbl@tempa }% % \end{macrocode} % When the package wasn't loaded we do nothing. % \begin{macrocode} }{}% } % \end{macrocode} % \end{macro} % % \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} % 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@redefinerobust\@@vpageref#1[#2]#3{% \@safe@activestrue \org@@@vpageref{#1}[#2]{#3}% \@safe@activesfalse}% }{}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\hhline} % Dealying the activation of the shorthand charactes has introduced % a problem with the \pkg{hhline} package. The reason is that it % uses the `:' character which is made active by the french support % in \babel. Therefore we need to \emph{reload} the package when % the `:' is an active character. % % So at |\begin{document}| we check whether \pkg{hhline} is loaded. % \begin{macrocode} \AtBeginDocument{% \@ifpackageloaded{hhline} % \end{macrocode} % Then we check whether the expansion of |\normal@char:| is not % equal to |\relax|. % \begin{macrocode} {\expandafter\ifx\csname normal@char:\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} % % \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. Therefore we have to add them untill \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 defintion 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 in order 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 spcific 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} % \begin{macrocode} %<*driver> \documentclass{ltxdoc} \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*\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 % |\EnableCrossres|. 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 somwhat (PR1652)} % \changes{babel~3.5g}{1996/07/06}{Added greek} % \changes{babel~3.6a}{1996/12/14}{Added welsh} % \begin{macrocode} %<+user>\clearpage \langdeffile{esperant.dtx} \langdeffile{dutch.dtx} \langdeffile{english.dtx} \langdeffile{germanb.dtx} % \langdeffile{breton.dtx} \langdeffile{welsh.dtx} \langdeffile{irish.dtx} \langdeffile{scottish.dtx} % \langdeffile{greek.dtx} % \langdeffile{frenchb.dtx} \langdeffile{italian.dtx} \langdeffile{portuges.dtx} \langdeffile{spanish.dtx} \langdeffile{catalan.dtx} \langdeffile{galician.dtx} \langdeffile{romanian.dtx} % \langdeffile{danish.dtx} \langdeffile{norsk.dtx} \langdeffile{swedish.dtx} % \langdeffile{finnish.dtx} \langdeffile{magyar.dtx} \langdeffile{estonian.dtx} % \langdeffile{croatian.dtx} \langdeffile{czech.dtx} \langdeffile{polish.dtx} \langdeffile{slovak.dtx} \langdeffile{slovene.dtx} \langdeffile{russianb.dtx} % \langdeffile{lsorbian.dtx} \langdeffile{usorbian.dtx} \langdeffile{turkish.dtx} % \langdeffile{bahasa.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