You are on page 1of 516

A

Babel, a multilingual package for use with L TEX's



standard document classes

Johannes Braams

Kersengaarde 33

2723 BP Zoetermeer

The Netherlands

babel@braams.xs4all.nl
Printed July 6, 2008

Abstract
The standard distribution of LATEX contains a number of document
classes that are meant to be used, but also serve as examples for other
users to create their own document classes. These document classes have
become very popular among LATEX users. But it should be kept in mind
that they were designed for American tastes and typography. At one time
they contained a number of hard-wired texts. This report describes babel, a
package that makes use of the new capabilities of TEX version 3 to provide
an environment in which documents can be typeset in a language other than
US English, or in more than one language.

Contents
1 The user interface 6
1.1 Languages supported by Babel . . . . . . . . . . . . . . . . . . . . 8
1.2 Workarounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2 Changes for LATEX 2ε 9


3 Changes in Babel version 3.7 10
4 Changes in Babel version 3.6 11
5 Changes in Babel version 3.5 12
6 The interface between the core of babel and the language deni-
tion les 12
6.1 Support for active characters . . . . . . . . . . . . . . . . . . . . . 14
6.2 Support for saving macro denitions . . . . . . . . . . . . . . . . . 15
6.3 Support for extending macros . . . . . . . . . . . . . . . . . . . . . 15
6.4 Macros common to a number of languages . . . . . . . . . . . . . . 15
∗ During the development ideas from Nico Poppelier, Piet van Oostrum and many others have

been used. Bernd Raichle has provided many helpful suggestions.

1
7 Compatibility with german.sty 15
8 Compatibility with ngerman.sty 16
9 Compatibility with the french package 16
10 Identication 16
11 The Package File 17
11.1 Language options . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

12 The Kernel of Babel 21


12.1 Encoding issues (part 1) . . . . . . . . . . . . . . . . . . . . . . . . 21
12.2 Multiple languages . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
12.3 Support for active characters . . . . . . . . . . . . . . . . . . . . . 37
12.4 Shorthands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
12.5 Language attributes . . . . . . . . . . . . . . . . . . . . . . . . . . 48
12.6 Support for saving macro denitions . . . . . . . . . . . . . . . . . 51
12.7 Support for extending macros . . . . . . . . . . . . . . . . . . . . . 52
12.8 Macros common to a number of languages . . . . . . . . . . . . . . 52
12.9 Making glyphs available . . . . . . . . . . . . . . . . . . . . . . . . 53
12.10Quotation marks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
12.11Letters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
12.12Shorthands for quotation marks . . . . . . . . . . . . . . . . . . . . 56
12.13Umlauts and trema's . . . . . . . . . . . . . . . . . . . . . . . . . . 57
12.14The redenition of the style commands . . . . . . . . . . . . . . . . 58
12.14.1 Redenition of macros . . . . . . . . . . . . . . . . . . . . . 59
12.15Cross referencing macros . . . . . . . . . . . . . . . . . . . . . . . . 63
12.16marks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
12.17Encoding issues (part 2) . . . . . . . . . . . . . . . . . . . . . . . . 69
12.18Preventing clashes with other packages . . . . . . . . . . . . . . . . 69
12.18.1 ifthen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
12.18.2 varioref . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
12.18.3 hhline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
12.18.4 hyperref . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
12.18.5 General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

13 Local Language Conguration 71


14 Driver les for the documented source code 73
15 Conclusion 77
16 Acknowledgements 77
17 The Esperanto language 78
18 The Interlingua language 81
19 The Dutch language 83
20 The English language 88

2
21 The German language 92
22 The German language  new orthography 97
23 The Breton language 101
24 The Welsh language 105
25 The Irish language 107
26 The Scottish language 109
27 The Greek language 111
27.1 Typing conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
27.2 Greek numbering . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

28 The French language 120


28.1 Basic interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
28.2 Customisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
28.3 Hyphenation checks . . . . . . . . . . . . . . . . . . . . . . . . . . 124
28.4 Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
28.5 File frenchb.cfg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

29 TEXnical details 126


29.1 Initial setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
29.2 Punctuation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
29.3 French quotation marks . . . . . . . . . . . . . . . . . . . . . . . . 130
29.4 Date in French . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
29.5 Extra utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
29.6 Formatting numbers . . . . . . . . . . . . . . . . . . . . . . . . . . 136
29.7 Caption names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
29.8 French lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
29.9 French indentation of sections . . . . . . . . . . . . . . . . . . . . . 141
29.10Formatting footnotes . . . . . . . . . . . . . . . . . . . . . . . . . . 141
29.11Global layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
29.12Dots. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
29.13Setup options: keyval stu . . . . . . . . . . . . . . . . . . . . . . . 144
29.14Clean up and exit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

30 The Italian language 154


30.1 Support for etymological hyphenation . . . . . . . . . . . . . . . . 156
30.2 Facilities required by the ISO 31/XI regulations . . . . . . . . . . . 159
30.3 Accents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
30.4 Caporali or French double quotes . . . . . . . . . . . . . . . . . . . 160
30.5 Finishing commands . . . . . . . . . . . . . . . . . . . . . . . . . . 163

31 The Latin language 165


32 Latin shortcuts 169
33 Etymological hyphenation 171

3
34 The Portuguese language 173
35 The Spanish language 178
35.1 The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

36 The Catalan language 201


37 This le 209
38 The Galcian language 209
38.1 The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211

39 The Basque language 231


40 The Romanian language 235
41 The Danish language 237
42 The Icelandic language 240
42.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
42.2 TEXnical details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
42.3 Captionnames and date . . . . . . . . . . . . . . . . . . . . . . . . 242
42.4 Icelandic quotation marks . . . . . . . . . . . . . . . . . . . . . . . 243
42.5 Old Icelandic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
42.6 Formatting numbers . . . . . . . . . . . . . . . . . . . . . . . . . . 245
42.7 Extra utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

43 The Norwegian language 249


44 The Swedish language 254
45 The North Sami language 258
45.1 The code of samin.dtx . . . . . . . . . . . . . . . . . . . . . . . . 258

46 The Finnish language 260


47 The Hungarian language 263
48 The Estonian language 281
48.1 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281

49 The Albanian language 285


50 The Croatian language 288
51 The Czech Language 290
51.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
51.2 Compatibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
51.3 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291

52 The Polish language 303


53 The Serbocroatian language 309

4
54 The Slovak language 312
54.1 Compatibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
54.2 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313

55 The Slovenian language 327


56 The Russian language 330
57 The Bulgarian language 344
58 The Ukrainian language 356
59 The Lower Sorbian language 370
60 The Upper Sorbian language 372
61 The Turkish language 376
62 The Hebrew language 379
62.1 Acknowledgement . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
62.2 The docstrip modules . . . . . . . . . . . . . . . . . . . . . . . . 380
62.3 Hebrew language denitions . . . . . . . . . . . . . . . . . . . . . . 380
62.3.1 Hebrew numerals . . . . . . . . . . . . . . . . . . . . . . . . 384
62.4 Right to left support . . . . . . . . . . . . . . . . . . . . . . . . . . 391
62.4.1 Switching from LR to RL mode and back . . . . . . . . . . 391
62.4.2 Counters . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
62.4.3 Preserving logos . . . . . . . . . . . . . . . . . . . . . . . . 395
62.4.4 List environments . . . . . . . . . . . . . . . . . . . . . . . 396
62.4.5 Tables of moving stu . . . . . . . . . . . . . . . . . . . . . 396
62.4.6 Two-column mode . . . . . . . . . . . . . . . . . . . . . . . 401
62.4.7 Footnotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
62.4.8 Headings and two-side support . . . . . . . . . . . . . . . . 402
62.4.9 Postscript Porblems . . . . . . . . . . . . . . . . . . . . . . 405
62.4.10 Miscellaneous internal LATEX macros . . . . . . . . . . . . . 406
62.4.11 Bibliography and citations . . . . . . . . . . . . . . . . . . . 408
62.4.12 Additional bidirectional commands . . . . . . . . . . . . . . 410
62.5 Hebrew calendar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
62.5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . 412
62.5.2 Registers, Commands, Formatting Macros . . . . . . . . . . 413
62.5.3 Auxiliary Macros . . . . . . . . . . . . . . . . . . . . . . . . 415
62.5.4 Gregorian Part . . . . . . . . . . . . . . . . . . . . . . . . . 416
62.5.5 Hebrew Part . . . . . . . . . . . . . . . . . . . . . . . . . . 417

63 Hebrew input encodings 422


63.1 Default denitions for characters . . . . . . . . . . . . . . . . . . . 423
63.2 The SI-960 encoding . . . . . . . . . . . . . . . . . . . . . . . . . . 424
63.3 The ISO 8859-8 encoding and the MS Windows cp1255 encoding . 424
63.4 The IBM code page 862 . . . . . . . . . . . . . . . . . . . . . . . . 427

5
64 Hebrew font encodings 429
64.1 THIS SECTION IS OUT OF DATE. UPDATE DOCS TO MATCH
HE8 ENCODING . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
64.2 The docstrip modules . . . . . . . . . . . . . . . . . . . . . . . . 429
64.3 The LHEencoding denition le . . . . . . . . . . . . . . . . . . . . 430
64.4 The font denition les (in LHE encoding) . . . . . . . . . . . . . . 432
64.4.1 Hebrew default font . . . . . . . . . . . . . . . . . . . . . . 432
64.4.2 Hebrew sans-serif font . . . . . . . . . . . . . . . . . . . . . 432
64.4.3 Hebrew typewriter font . . . . . . . . . . . . . . . . . . . . 433
64.4.4 Hebrew classic font . . . . . . . . . . . . . . . . . . . . . . . 434
64.4.5 Hebrew shalom fonts . . . . . . . . . . . . . . . . . . . . . . 434
64.4.6 Hebrew frank-ruehl font . . . . . . . . . . . . . . . . . . . . 435
64.4.7 Hebrew carmel font . . . . . . . . . . . . . . . . . . . . . . 436
64.4.8 Hebrew redis font . . . . . . . . . . . . . . . . . . . . . . . . 436
64.5 The HE8encoding denition le . . . . . . . . . . . . . . . . . . . . 437
64.5.1 CHECK HERE FOR HE8 UPDATES . . . . . . . . . . . . 437
64.6 The font denition les (in HE8 encoding) . . . . . . . . . . . . . . 439
64.6.1 Hebrew default font . . . . . . . . . . . . . . . . . . . . . . 439
64.6.2 Hebrew sans-serif font . . . . . . . . . . . . . . . . . . . . . 439
64.6.3 Hebrew typewriter font . . . . . . . . . . . . . . . . . . . . 440
64.6.4 8Bit OmegaHebrew font . . . . . . . . . . . . . . . . . . . . 440
64.6.5 8Bit Aharoni font . . . . . . . . . . . . . . . . . . . . . . . 441
64.6.6 8Bit David font . . . . . . . . . . . . . . . . . . . . . . . . . 441
64.6.7 8Bit Drugulin font . . . . . . . . . . . . . . . . . . . . . . . 441
64.6.8 8Bit Ellinia font . . . . . . . . . . . . . . . . . . . . . . . . 442
64.6.9 8Bit FrankRuehl font . . . . . . . . . . . . . . . . . . . . . 442
64.6.10 8Bit KtavYad font . . . . . . . . . . . . . . . . . . . . . . . 442
64.6.11 8Bit MiriamMono font . . . . . . . . . . . . . . . . . . . . . 442
64.6.12 8Bit Nachlieli font . . . . . . . . . . . . . . . . . . . . . . . 443
64.6.13 Hebrew font switching commands . . . . . . . . . . . . . . . 443

65 Hebrew in LATEX 2.09 compatibility mode 446


65.1 The docstrip modules . . . . . . . . . . . . . . . . . . . . . . . . 446
65.2 Obsolete style les . . . . . . . . . . . . . . . . . . . . . . . . . . . 447

66 The Bahasa Indonesian language 448


67 The Bahasa Malaysia language 451
68 Not renaming hyphen.tex 454
69 Support for formats based on plainTEX 455

1 The user interface


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 nd out what the current language is.
\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, dened previously

6
by a language denition le, as its argument. It calls several macros that should
be dened in the language denition les to activate the special denitions for the
language chosen.
otherlanguage The environment otherlanguage does basically the same as \selectlanguage,
except the language change is local to the environment. This environment is re-
quired for intermixing left-to-right typesetting with right-to-left typesetting. The
language to switch to is specied as an argument to \begin{otherlanguage}.
\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 rst
argument. This command only switches the extra denitions and the hyphenation
rules for the language, not the names and dates.
otherlanguage* In the environment otherlanguage* only the typesetting is done according to
the rules of the other language, but the text-strings such as `gure', `table', etc.
are left as they were set outside this environment.
hyphenrules The environment hyphenrules can be used to select only the hyphenation
rules to be used. This can for instance be used to select `nohyphenation', pro-
vided that in language.dat the `language' nohyphenation is dened by loading
serohyph.tex.
\languagename The control sequence \languagename contains the name of the current lan-
guage.
\iflanguage If more than one language is used, it might be necessary to know which lan-
guage is active at a specic time. This can be checked by a call to \iflanguage.
This macro takes three arguments. The rst argument is the name of a language;
the second and third arguments are the actions to take if the result of the test is
true or false respectively.
\useshorthands The command \useshorthands initiates the denition of user-dened short-
hand sequences. It has one argument, the character that starts these personal
shorthands.
\defineshorthand The command \defineshorthand takes two arguments: the rst is a one-
or two-character shorthand sequence, and the second is the code the shorthand
should expand to.
\aliasshorthand The command \aliasshorthand can be used to let another character perform
the same functions as the default shorthand character. If one prefers for example to
use the character / over " in typing polish texts, this can be achieved by entering
\aliasshorthand{"}{/}. Please note that the substitute shorthand character
must have been declared in the preamble of your document, using a command
such as \useshorthands{/} in this example.
\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 specied as an option when loading
the babel package.
\shorthandon It is sometimes necessary to switch a shorthand character o temporarily, be-
\shorthandoff cause it must be used in an entirely dierent way. For this purpose, the user
commands \shorthandoff and \shorthandon are provided. They each take a
list of characters as their arguments. The command \shorthandoff sets the
\catcode for each of the characters in its argument to other (12); the command
\shorthandon sets the \catcode to active (13). Both commands only work on
`known' shorthand characters. If a character is not known to be a shorthand
character its category code will be left unchanged.
\languageattribute This is a user-level command, to be used in the preamble of a document (after

7
\usepackage[...]{babel}), that declares which attributes are to be used for a
given language. It takes two arguments: the rst is the name of the language;
the second, a (list of) attribute(s) to used. The command checks whether the
language is known in this document and whether the attribute(s) are known for
this language.

1.1 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.

Language Option(s)
Afrikaans afrikaans
Bahasa bahasa, indonesian, indon, bahasai, bahasam, malay,
meyalu
Basque basque
Breton breton
Bulgarian bulgarian
Catalan catalan
Croatian croatian
Czech czech
Danish danish
Dutch dutch
English english, USenglish, american, UKenglish, british,
canadian, australian, newzealand
Esperanto esperanto
Estonian estonian
Finnish nnish
French french, francais, canadien, acadian
Galician galician
German austrian, german, germanb, ngerman, naustrian
Greek greek, polutonikogreek
Hebrew hebrew
Hungarian magyar, hungarian
Icelandic icelandic
Interlingua interlingua
Irish Gaelic irish
Italian italian
Latin latin
Lower Sorbian lowersorbian
North Sami samin
Norwegian norsk, nynorsk
Polish polish
Portuguese portuges, portuguese, brazilian, brazil
Romanian romanian
Russian russian
Scottish Gaelic scottish

8
Language Option(s)
Spanish spanish
Slovakian slovak
Slovenian slovene
Swedish swedish
Serbian serbian
Turkish turkish
Ukrainian ukrainian
Upper Sorbian uppersorbian
Welsh welsh

For some languages babel supports the options activeacute and activegrave; for
typestting Russian texts, babel knows about the options LWN and LCY to specify
the fontencoding of the cyrillic font used. Currently only LWN is supported.

1.2 Workarounds
If you use the document class book and you use \ref inside the argument of
\chapter, LATEX will keep complaining about an undened 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.

2 Changes for LATEX 2ε


With the advent of LATEX 2ε the interface to babel in the preamble of the document
has changed. With LATEX2.09 one used to call up the babel system with a line
such as:

\documentstyle[dutch,english]{article}

which would tell LATEX that the document would be written in two languages,
Dutch and English, and that English would be the rst language in use.
The LATEX 2ε way of providing the same information is:

\documentclass{article}
\usepackage[dutch,english]{babel}

or, making dutch and english global options in order to let other packages detect
and use them:

\documentclass[dutch,english]{article}
\usepackage{babel}
\usepackage{varioref}

In this last example, the package varioref will also see the options and will
be able to use them.

9
3 Changes in Babel version 3.7
In Babel version 3.7 a number of bugs that were found in version 3.6 are xed.
Also a number of changes and additions have occurred:
• Shorthands are expandable again. The disadvantage is that one has to type
'{}a when the acute accent is used as a shorthand character. The advantage
is that a number of other problems (such as the breaking of ligatures, etc.)
have vanished.
• Two new commands, \shorthandon and \shorthandoff have been intro-
duced to enable to temporarily switch o one or more shorthands.
• Support for typesetting Greek has been enhanced. Code from the kdgreek
package (suggested by the author) was added and \greeknumeral has been
added.
• Support for typesetting Basque is now available thanks to Juan Aguirre-
gabiria.
• Support for typesetting Serbian with Latin script is now available thanks to
Dejan Muhamedagi¢ and Jankovic Slobodan.
• Support for typesetting Hebrew (and potential support for typesetting other
right-to-left written languages) is now available thanks to Rama Porrat and
Boris Lavva.
• Support for typesetting Bulgarian is now available thanks to Georgi Bosh-
nakov.
• Support for typesetting Latin is now available, thanks to Claudio Beccari
and Krzysztof Konrad ›elechowski.
• Support for typesetting North Sami is now available, thanks to Regnor
Jernsletten.
• The options canadian, canadien and acadien have been added for Canadian
English and French use.
• A language attribute has been added to the \mark... commands in order to
make sure that a Greek header line comes out right on the last page before
a language switch.
• Hyphenation pattern les are now read inside a group ; therefore any changes
a pattern le needs to make to lowercase codes, uppercase codes, and cate-
gory codes are kept local to that group. If they are needed for the language,
these changes will need to be repeated and stored in \extras...
• The concept of language attributes is introduced. It is intended to give the
user some control over the features a language-denition le provides. Its
rst use is for the Greek language, where the user can choose the πoλυτ oνκó
(Polutoniko or multi-accented) Greek way of typesetting texts. These at-
tributes will possibly nd wider use in future releases.
• The environment hyphenrules is introduced.

10
• The syntax of the le language.dat has been extended to allow (optionally)
specifying the font encoding to be used while processing the patterns le.
• The command \providehyphenmins should now be used in language de-
nition les in order to be able to keep any settings provided by the pattern
le.

4 Changes in Babel version 3.6


In Babel version 3.6 a number of bugs that were found in version 3.5 are xed.
Also a number of changes and additions have occurred:
• A new environment otherlanguage* is introduced. it only switches the `spe-
cials', but leaves the `captions' untouched.
• 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.
• Support for typesetting french texts is much enhanced; the le francais.ldf
is now replaced by frenchb.ldf which is maintained by Daniel Flipo.
• Support for typesetting the russian language is again available. The lan-
guage denition le was originally developed by Olga Lapko from CyrTUG.
The fonts needed to typeset the russian language are now part of the babel
distribution. The support is not yet up to the level which is needed according
to Olga, but this is a start.
• Support for typesetting greek texts is now also available. What is oered
in this release is a rst attempt; it will be enhanced later on by Yannis
Haralambous.
• in babel 3.6j some hooks have been added for the development of support
for Hebrew typesetting.
• Support for typesetting texts in Afrikaans (a variant of Dutch, spoken in
South Africa) has been added to dutch.ldf.
• Support for typesetting Welsh texts is now available.
• 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 char-
acter ", by issuing the command \aliasshorthand{"}{/}.
• The shorthand mechanism now deals correctly with characters that are al-
ready active.
• Shorthand characters are made active at \begin{document}, not earlier.
This is to prevent problems with other packages.
• A preambleonly command \substitutefontfamily has been added to cre-
ate .fd les on the y when the font families of the Latin text dier from
the families used for the Cyrillic or Greek parts of the text.

11
• Three new commands \LdfInit, \ldf@quit and \ldf@finish are intro-
duced that perform a number of standard tasks.

• In babel 3.6k the language Ukrainian has been added and the support for
Russian typesetting has been adapted to the package 'cyrillic' to be released
with the December 1998 release of LATEX 2ε .

5 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:

• the selection of the language is delayed until \begin{document}, which


means you must add appropriate \selectlanguage commands if you in-
clude \hyphenation lists in the preamble of your document.

• babel now has a language environment and a new command \foreignlanguage;


• 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
les `verbatim';

• A language change now also writes information in the .aux le, as the change
might also aect typesetting the table of contents. The consequence is that
an .aux le generated by a LaTeX format with babel preloaded gives errors
when read with a LaTeX format without babel; but I think this probably
doesn't occur;

• babel is now compatible with the inputenc and fontenc packages;


• the language denition les now have a new extension, ldf;
• the syntax of the le language.dat is extended to be compatible with the
french package by Bernard Gaulle;
• each language denition le looks for a conguration le which has the same
name, but the extension .cfg. It can contain any valid LATEX code.

6 The interface between the core of babel and the


language denition les
In the core of the babel system, several macros are dened for use in language
denition les. Their purpose is to make a new language known.
\addlanguage The macro \addlanguage is a non-outer version of the macro \newlanguage,
dened in plain.tex version 3.x. For older versions of plain.tex and lplain.tex
a substitute denition is used.
\adddialect The macro \adddialect can be used when two languages can (or must) use
the same hyphenation patterns. This can also be useful for languages for which
no patterns are preloaded in the format. In such cases the default behaviour of

12
the babel system is to dene this language as a `dialect' of the language for which
the patterns were loaded as \language0.
The language denition les must conform to a number of conventions, because
these les have to ll in the gaps left by the common code in babel.def, i. e.,
the denitions 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:

• Some of the language-specic denitions might be used by plain TEX users,


so the les have to be coded so that they can be read by both LATEX and
plain TEX. The current format can be checked by looking at the value of
the macro \fmtname.

• The common part of the babel system redenes a number of macros and
environments (dened previously in the document style) to put in the names
of macros that replace the previously hard-wired texts. These macros have
to be dened in the language denition les.

• The language denition les dene ve macros, used to activate and deacti-
vate the language-specic denitions. These macros are \hlang ihyphenmins,
\captionshlang i, \datehlang i, \extrashlang i and \noextrashlang i; where
hlang i is either the name of the language denition le or the name of the
LATEX option that is to be used. These macros and their functions are dis-
cussed below.

• When a language denition le is loaded, it can dene \l@hlang i to be a


dialect of \language0 when \l@hlang i is undened.

• The language denition les 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 @ sign.

\providehyphenmins The macro \providehyphenmins should be used in the language denition les
to set the \lefthyphenmin and \righthyphenmin. This macro will check whether
these parameters were provided by the hyphenation le before it takes any action.
\langhyphenmins The macro \hlang ihyphenmins is used to store the values of the \lefthyphenmin
and \righthyphenmin.
\captionslang The macro \captionshlang i denes the macros that hold the texts to replace
the original hard-wired texts.
\datelang The macro \datehlang i denes \today and
\extraslang The macro \extrashlang i contains all the extra denitions needed for a specic
language.
\noextraslang Because we want to let the user switch between languages, but we do not know
what state TEX might be in after the execution of \extrashlang i, a macro that
brings TEX into a predened state is needed. It will be no surprise that the name
of this macro is \noextrashlang i.
\bbl@declare@ttribute This is a command to be used in the language denition les for declaring
a language attribute. It takes three arguments: the name of the language, the
attribute to be dened, and the code to be executed when the attribute is to be
used.
\main@language To postpone the activation of the denitions needed for a language until the
beginning of a document, all language denition les should use \main@language

13
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.
\ProvidesLanguage The macro \ProvidesLanguage should be used to identify the language
denition les. Its syntax is similar to the syntax of the LATEX command
\ProvidesPackage.
\LdfInit The macro \LdfInit performs a couple of standard checks that must be made
at the beginning of a language denition le, such as checking the category code
of the @-sign, preventing the .ldf le from being processed twice, etc.
\ldf@quit The macro \ldf@quit does work needed if a .ldf le was processed earlier.
This includes resetting the category code of the @-sign, preparing the language to
be activated at \begin{document} time, and ending the input stream.
\ldf@finish The macro \ldf@finish does work needed at the end of each .ldf le. This
includes resetting the category code of the @-sign, loading a local conguration
le, and preparing the language to be activated at \begin{document} time.
\loadlocalcfg After processing a language denition le, LATEX can be instructed to load
a local conguration le. This le can, for instance, be used to add strings to
\captionshlang i to support local document classes. The user will be informed
that this conguration le has been loaded. This macro is called by \ldf@finish.
\substitutefontfamily This command takes three arguments, a font encoding and two font family
names. It creates a font description le for the rst font in the given encoding.
This .fd le will instruct LATEX to use a font from the second family when a font
from the rst family in the given encoding seems to be needed.

6.1 Support for active characters


In quite a number of language denition les, active characters are introduced. To
facilitate this, some support macros are provided.
\initiate@active@char The internal macro \initiate@active@char is used in language denition les
to instruct LATEX to give a character the category code `active'. When a character
has been made active it will remain that way until the end of the document. Its
denition may vary.
\bbl@activate The command \bbl@activate is used to change the way an active character
\bbl@deactivate expands. \bbl@activate `switches on' the active behaviour of the character.
\bbl@deactivate lets the active character expand to its former (mostly) non-
active self.
\declare@shorthand The macro \declare@shorthand is used to dene the various shorthands. It
takes three arguments: the name for the collection of shorthands this denition
belongs to; the character (sequence) that makes up the shorthand, i.e. ~ or "a;
and the code to be executed when the shorthand is encountered.
\bbl@add@special The TEXbook states: Plain TEX includes a macro called \dospecials that
\bbl@remove@special is essentially a set macro, representing the set of all characters that have a spe-
cial category code. [1, p. 380] It is used to set text `verbatim'. To make this
work if more characters get a special category code, you have to add this char-
acter to the macro \dospecial. LATEX adds another macro called \@sanitize
representing the same character set, but without the curly braces. The macros
\bbl@add@specialhchar i and \bbl@remove@specialhchar i add and remove the
character hchar i to these two sets.

14
6.2 Support for saving macro denitions
Language denition les may want to re dene macros that already exist. Therefor
a mechanism for saving (and restoring) the original denition of those macros is
provided. We provide two macros for this1 .
\babel@save To save the current meaning of any control sequence, the macro \babel@save
is provided. It takes one argument, hcsname i, the control sequence for which the
meaning has to be saved.
\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 hvariable i.
The eect of the preceding macros is to append a piece of code to the current
denition of \originalTeX. When \originalTeX is expanded, this code restores
the previous denition of the control sequence or the previous value of the variable.

6.3 Support for extending macros


\addto The macro \addto{hcontrol sequence i}{hTEX code i} can be used to extend the
denition of a macro. The macro need not be dened. This macro can, for
instance, be used in adding instructions to a macro like \extrasenglish.

6.4 Macros common to a number of languages


\allowhyphens In a couple of European languages compound words are used. This means that
when TEX has to hyphenate such a compound word, it only does so at the `-' that
is used in such words. To allow hyphenation in the rest of such a compound word,
the macro \allowhyphens can be used.
\set@low@box For some languages, quotes need to be lowered to the baseline. For this pur-
pose 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.
\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.
\bbl@frenchspacing The commands \bbl@frenchspacing and \bbl@nonfrenchspacing can be
\bbl@nonfrenchspacing used to properly switch French spacing on and o.

7 Compatibility with german.sty


The le german.sty has been one of the sources of inspiration for the babel sys-
tem. Because of this I wanted to include german.sty in the babel system. To
be able to do that I had to allow for one incompatibility: in the denition of the
macro \selectlanguage in german.sty the argument is used as the hnumber i
for an \ifcase. So in this case a call to \selectlanguage might look like
\selectlanguage{\german}.
In the denition of the macro \selectlanguage in babel.def the argument
is used as a part of other macronames, so a call to \selectlanguage now looks
1 This mechanism was introduced by Bernd Raichle.

15
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 german.sty have been copied into a new le,
called germanb.sty2 .
Although the babel system was developed to be used with LATEX, some of the
features implemented in the language denition les might be needed by plain
TEX users. Care has been taken that all les in the system can be processed by
plain TEX.

8 Compatibility with ngerman.sty


When used with the options ngerman or naustrian, babel will provide all features of
the package ngerman. There is however one exception: The commands for special
hyphenation of double consonants ("ff etc.) and ck ("ck), which are no longer
required with the new German orthography, are undened. With the ngerman
package, however, these commands will generate appropriate warning messages
only.

9 Compatibility with the french package


It has been reported to me that the package french by Bernard Gaulle
(gaulle@idris.fr) works together with babel. On the other hand, it seems not
to work well together with a lot of other packages. Therefore I have decided to no
longer load french.ldf by default. Instead, when you want to use the package by
Bernard Gaulle, you will have to request it specically, by passing either frenchle
or frenchpro as an option to babel.

10 Identication
The le babel.sty3 is meant for LATEX 2ε , therefor we make sure that the format
le used is the right one.

\ProvidesLanguage The identication code for each le is something that was introduced in LATEX 2ε .
When the command \ProvidesFile does not exist, a dummy denition is
provided temporarily. For use in the language denition le the command
\ProvidesLanguage is dened by babel.
10.1 h∗!packagei
10.2 \ifx\ProvidesFile\@undefined
10.3 \def\ProvidesFile#1[#2 #3 #4]{%
10.4 \wlog{File: #1 #4 #3 <#2>}%
10.5 h∗kernel & patternsi

10.6 \toks8{Babel <#3> and hyphenation patterns for }%


10.7 h/kernel & patternsi

10.8 \let\ProvidesFile\@undefined
10.9 }
2 The `b' is added to the name to distinguish the le from Partls' le.
3 The le described in this section is called babel.dtx, has version number v3.8l and was last
revised on 2008/03/16.

16
As an alternative for \ProvidesFile we dene \ProvidesLanguage here to be
used in the language denition les.
10.10 h∗kerneli
10.11 \def\ProvidesLanguage#1[#2 #3 #4]{%
10.12 \wlog{Language: #1 #4 #3 <#2>}%
10.13 }
10.14 \else

In this case we save the original denition of \ProvidesFile in \bbl@tempa and


restore it after we have stored the version of the le in \toks8.
10.15 h∗kernel & patternsi
10.16 \let\bbl@tempa\ProvidesFile
10.17 \def\ProvidesFile#1[#2 #3 #4]{%
10.18 \toks8{Babel <#3> and hyphenation patterns for }%
10.19 \bbl@tempa#1[#2 #3 #4]%
10.20 \let\ProvidesFile\bbl@tempa}
10.21 h/kernel & patternsi

When \ProvidesFile is dened we give \ProvidesLanguage a similar denition.


10.22 \def\ProvidesLanguage#1{%
10.23 \begingroup
10.24 \catcode`\ 10 %
10.25 \@makeother\/%
10.26 \@ifnextchar[%]
10.27 {\@provideslanguage{#1}}{\@provideslanguage{#1}[]}}
10.28 \def\@provideslanguage#1[#2]{%
10.29 \wlog{Language: #1 #2}%
10.30 \expandafter\xdef\csname ver@#1.ldf\endcsname{#2}%
10.31 \endgroup}
10.32 h/kerneli

10.33 \fi

10.34 h/!packagei

Identify each le that is produced from this source le.


10.35 h+packagei\ProvidesPackage{babel}
10.36 h+corei\ProvidesFile{babel.def}

10.37 h+kernel & patternsi\ProvidesFile{hyphen.cfg}

10.38 h+kernel&!patternsi\ProvidesFile{switch.def}

10.39 h+driver&!useri\ProvidesFile{babel.drv}

10.40 h+driver & useri\ProvidesFile{user.drv}

10.41 [2008/07/06 v3.8l %


10.42 h+packagei The Babel package]
10.43 h+corei Babel common definitions]
10.44 h+kerneli Babel language switching mechanism]
10.45 h+driveri]

11 The Package File


In order to make use of the features of LATEX 2ε , the babel system contains a
package le, babel.sty. This le is loaded by the \usepackage command and
denes all the language options known in the babel system. It also takes care of a
number of compatibility issues with other packages.

17
11.1 Language options
11.1 h∗packagei
11.2 \ifx\LdfInit\@undefined\input babel.def\relax\fi
For all the languages supported we need to declare an option.
11.3 \DeclareOption{acadian}{\input{frenchb.ldf}}
11.4 \DeclareOption{albanian}{\input{albanian.ldf}}

11.5 \DeclareOption{afrikaans}{\input{dutch.ldf}}

11.6 \DeclareOption{american}{\input{english.ldf}}

11.7 \DeclareOption{australian}{\input{english.ldf}}

Austrian is really a dialect of German.


11.8 \DeclareOption{austrian}{\input{germanb.ldf}}
11.9 \DeclareOption{bahasa}{\input{bahasai.ldf}}
11.10 \DeclareOption{indonesian}{\input{bahasai.ldf}}

11.11 \DeclareOption{indon}{\input{bahasai.ldf}}

11.12 \DeclareOption{bahasai}{\input{bahasai.ldf}}

11.13 \DeclareOption{malay}{\input{bahasam.ldf}}

11.14 \DeclareOption{meyalu}{\input{bahasam.ldf}}

11.15 \DeclareOption{bahasam}{\input{bahasam.ldf}}

11.16 \DeclareOption{basque}{\input{basque.ldf}}

11.17 \DeclareOption{brazil}{\input{portuges.ldf}}

11.18 \DeclareOption{brazilian}{\input{portuges.ldf}}
11.19 \DeclareOption{breton}{\input{breton.ldf}}
11.20 \DeclareOption{british}{\input{english.ldf}}
11.21 \DeclareOption{bulgarian}{\input{bulgarian.ldf}}
11.22 \DeclareOption{canadian}{\input{english.ldf}}

11.23 \DeclareOption{canadien}{\input{frenchb.ldf}}

11.24 \DeclareOption{catalan}{\input{catalan.ldf}}

11.25 \DeclareOption{croatian}{\input{croatian.ldf}}

11.26 \DeclareOption{czech}{\input{czech.ldf}}

11.27 \DeclareOption{danish}{\input{danish.ldf}}

11.28 \DeclareOption{dutch}{\input{dutch.ldf}}

11.29 \DeclareOption{english}{\input{english.ldf}}
11.30 \DeclareOption{esperanto}{\input{esperanto.ldf}}
11.31 \DeclareOption{estonian}{\input{estonian.ldf}}

11.32 \DeclareOption{finnish}{\input{finnish.ldf}}

The babel support or French used to be stored in francais.ldf; therefor the


LATEX2.09 option used to be francais. The hyphenation patterns may be loaded as
either `french' or as `francais'.
11.33 \DeclareOption{francais}{\input{frenchb.ldf}}
11.34 \DeclareOption{frenchb}{\input{frenchb.ldf}}
With LATEX 2ε we can now also use the option french and still call the le
frenchb.ldf.
11.35 \DeclareOption{french}{\input{frenchb.ldf}}%
11.36 \DeclareOption{galician}{\input{galician.ldf}}
11.37 \DeclareOption{german}{\input{germanb.ldf}}

11.38 \DeclareOption{germanb}{\input{germanb.ldf}}

11.39 \DeclareOption{greek}{\input{greek.ldf}}

11.40 \DeclareOption{polutonikogreek}{%

11.41 \input{greek.ldf}%
11.42 \languageattribute{greek}{polutoniko}}

18
11.43 \DeclareOption{hebrew}{%
11.44 \input{rlbabel.def}%
11.45 \input{hebrew.ldf}}
hungarian is just a synonym for magyar
11.46 \DeclareOption{hungarian}{\input{magyar.ldf}}
11.47 \DeclareOption{icelandic}{\input{icelandic.ldf}}
11.48 \DeclareOption{interlingua}{\input{interlingua.ldf}}

11.49 \DeclareOption{irish}{\input{irish.ldf}}

11.50 \DeclareOption{italian}{\input{italian.ldf}}

11.51 \DeclareOption{latin}{\input{latin.ldf}}

11.52 \DeclareOption{lowersorbian}{\input{lsorbian.ldf}}

11.53 %^^A\DeclareOption{kannada}{\input{kannada.ldf}}

11.54 \DeclareOption{magyar}{\input{magyar.ldf}}

11.55 %^^A\DeclareOption{nagari}{\input{nagari.ldf}}

`New' German orthography, including Austrian variant:


11.56 \DeclareOption{naustrian}{\input{ngermanb.ldf}}
11.57 \DeclareOption{newzealand}{\input{english.ldf}}
11.58 \DeclareOption{ngerman}{\input{ngermanb.ldf}}

11.59 \DeclareOption{norsk}{\input{norsk.ldf}}

11.60 \DeclareOption{samin}{\input{samin.ldf}}

For Norwegian two spelling variants are provided.


11.61 \DeclareOption{nynorsk}{\input{norsk.ldf}}
11.62 \DeclareOption{polish}{\input{polish.ldf}}
11.63 \DeclareOption{portuges}{\input{portuges.ldf}}

11.64 \DeclareOption{portuguese}{\input{portuges.ldf}}

11.65 \DeclareOption{romanian}{\input{romanian.ldf}}

11.66 \DeclareOption{russian}{\input{russianb.ldf}}

11.67 %^^A\DeclareOption{sanskrit}{\input{sanskrit.ldf}}

11.68 \DeclareOption{scottish}{\input{scottish.ldf}}

11.69 \DeclareOption{serbian}{\input{serbian.ldf}}

11.70 \DeclareOption{slovak}{\input{slovak.ldf}}

11.71 \DeclareOption{slovene}{\input{slovene.ldf}}

11.72 \DeclareOption{spanish}{\input{spanish.ldf}}

11.73 \DeclareOption{swedish}{\input{swedish.ldf}}

11.74 %^^A\DeclareOption{tamil}{\input{tamil.ldf}}

11.75 \DeclareOption{turkish}{\input{turkish.ldf}}

11.76 \DeclareOption{ukrainian}{\input{ukraineb.ldf}}

11.77 \DeclareOption{uppersorbian}{\input{usorbian.ldf}}

11.78 \DeclareOption{welsh}{\input{welsh.ldf}}

11.79 \DeclareOption{UKenglish}{\input{english.ldf}}
11.80 \DeclareOption{USenglish}{\input{english.ldf}}
For all those languages for which the option name is the same as the name of
the language specic le we specify a default option, which tries to load the le
specied. If this doesn't succeed an error is signalled.
11.81 \DeclareOption*{%
11.82 \InputIfFileExists{\CurrentOption.ldf}{}{%
11.83 \PackageError{babel}{%
11.84 Language definition file \CurrentOption.ldf not found}{%
11.85 Maybe you misspelled the language option?}}%
11.86 }
Another way to extend the list of `known' options for babel is to create the le
bblopts.cfg in which one can add option declarations.

19
11.87 \InputIfFileExists{bblopts.cfg}{%
11.88 \typeout{*************************************^^J%
11.89 * Local config file bblopts.cfg used^^J%
11.90 *}%
11.91 }{}
Apart from all the language options we also have a few options that inuence
the behaviour of language denition les.
The following options don't do anything themselves, they are just dened in
order to make it possible for language denition les to check if one of them was
specied by the user.
11.92 \DeclareOption{activeacute}{}
11.93 \DeclareOption{activegrave}{}
The next option tells babel to leave shorthand characters active at the end of
processing the package. This is 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.
11.94 \DeclareOption{KeepShorthandsActive}{}
The options have to be processed in the order in which the user specied them:
11.95 \ProcessOptions*
In order to catch the case where the user forgot to specify a language we check
whether \bbl@main@language, has become dened. If not, no language has been
loaded and an error message is displayed.
11.96 \ifx\bbl@main@language\@undefined
11.97 \PackageError{babel}{%
11.98 You haven't specified a language option}{%
11.99 You need to specify a language, either as a global
11.100 option\MessageBreak
11.101 or as an optional argument to the \string\usepackage\space
11.102 command; \MessageBreak
11.103 You shouldn't try to proceed from here, type x to quit.}
To prevent undened command errors when the user insists on continuing we load
babel.def here. He should expect more errors though.
11.104 \input{babel.def}
11.105 \fi
\substitutefontfamily The command \substitutefontfamily creates an .fd le on the y. The rst
argument is an encoding mnemonic, the second and third arguments are font
family names.
11.106 \def\substitutefontfamily#1#2#3{%
11.107 \lowercase{\immediate\openout15=#1#2.fd\relax}%
11.108 \immediate\write15{%
11.109 \string\ProvidesFile{#1#2.fd}%
11.110 [\the\year/\two@digits{\the\month}/\two@digits{\the\day}
11.111 \space generated font description file]^^J
11.112 \string\DeclareFontFamily{#1}{#2}{}^^J
11.113 \string\DeclareFontShape{#1}{#2}{m}{n}{<->ssub * #3/m/n}{}^^J
11.114 \string\DeclareFontShape{#1}{#2}{m}{it}{<->ssub * #3/m/it}{}^^J
11.115 \string\DeclareFontShape{#1}{#2}{m}{sl}{<->ssub * #3/m/sl}{}^^J
11.116 \string\DeclareFontShape{#1}{#2}{m}{sc}{<->ssub * #3/m/sc}{}^^J
11.117 \string\DeclareFontShape{#1}{#2}{b}{n}{<->ssub * #3/bx/n}{}^^J
11.118 \string\DeclareFontShape{#1}{#2}{b}{it}{<->ssub * #3/bx/it}{}^^J
11.119 \string\DeclareFontShape{#1}{#2}{b}{sl}{<->ssub * #3/bx/sl}{}^^J

20
11.120 \string\DeclareFontShape{#1}{#2}{b}{sc}{<->ssub * #3/bx/sc}{}^^J
11.121 }%
11.122 \closeout15
11.123 }
This command should only be used in the preamble of a document.
11.124 \@onlypreamble\substitutefontfamily

11.125 h/packagei

12 The Kernel of Babel


The kernel of the babel system is stored in either hyphen.cfg or switch.def and
babel.def. The le hyphen.cfg is a le that can be loaded into the format,
which is necessary when you want to be able to switch hyphenation patterns.
The le babel.def contains some TEX code that can be read in at run time.
When babel.def is loaded it checks if hyphen.cfg is in the format; if not the le
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 les. 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 le plain.def is needed.
12.1 h∗kernel | corei
12.2 \ifx\AtBeginDocument\@undefined
But we need to use the second part of plain.def (when we load it from
switch.def) which we can do by dening \adddialect.
12.3 hkernel&!patternsi \def\adddialect{}
12.4 \input plain.def\relax
12.5 \fi

12.6 h/kernel | corei

Check the presence of the command \iflanguage, if it is undened read the


le switch.def.
h∗corei
12.7

\ifx\iflanguage\@undefined
12.8

12.9 \input switch.def\relax


12.10 \fi

12.11 h/corei

12.1 Encoding issues (part 1)


The rst thing we need to do is to determine, at \begin{document}, which latin
fontencoding to use.

\latinencoding When text is being typeset in an encoding other than `latin' (OT1 or T1), it would
be nice to still have Roman numerals come out in the Latin encoding. So we rst
assume that the current encoding at the end of processing the package is the Latin
encoding.

21
12.12 h∗corei
12.13 \AtEndOfPackage{\edef\latinencoding{\cf@encoding}}
But this might be overruled with a later loading of the package fontenc. Therefor
we check at the execution of \begin{document} whether it was loaded with the
T1 option. The normal way to do this (using \@ifpackageloaded) is disabled for
this package. Now we have to revert to parsing the internal macro \@filelist
which contains all the lenames loaded.
12.14 \AtBeginDocument{%
12.15 \gdef\latinencoding{OT1}%
12.16 \ifx\cf@encoding\bbl@t@one
12.17 \xdef\latinencoding{\bbl@t@one}%
12.18 \else
12.19 \@ifl@aded{def}{t1enc}{\xdef\latinencoding{\bbl@t@one}}{}%
12.20 \fi
12.21 }

\latintext Then we can dene the command \latintext which is a declarative switch to a
latin font-encoding.
12.22 \DeclareRobustCommand{\latintext}{%
12.23 \fontencoding{\latinencoding}\selectfont
12.24 \def\encodingdefault{\latinencoding}}

\textlatin This command takes an argument which is then typeset using the requested font
encoding. In order to avoid many encoding switches it operates in a local scope.
12.25 \ifx\@undefined\DeclareTextFontCommand
12.26 \DeclareRobustCommand{\textlatin}[1]{\leavevmode{\latintext #1}}
12.27 \else

12.28 \DeclareTextFontCommand{\textlatin}{\latintext}
12.29 \fi

12.30 h/corei

We also need to redene a number of commands to ensure that the right font
encoding is used, but this can't be done before babel.def is loaded.

12.2 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 xed standard, i. e., patterns for each
language should always be loaded in the same location. It has also been suggested
to use the iso list for this purpose. Others have pointed out that the iso list
contains more than 256 languages, which have 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 le in which the person who
maintains a TEX environment has to record for which languages he has hyphen-
ation patterns and in which les these are stored4 . When hyphenation exceptions
4 This is because dierent operating systems sometimes use very dierent le-naming conven-
tions.

22
are stored in a separate le this can be indicated by naming that le after the le
with the hyphenation patterns.
This conguration le can contain empty lines and comments, as well as
lines which start with an equals (=) 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:
% 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

As the le switch.def needs to be read only once, we check whether it was
read before. If it was, the command \iflanguage is already dened, so we can
stop processing.
12.31 h∗kerneli
12.32 h∗!patternsi
12.33 \expandafter\ifx\csname iflanguage\endcsname\relax \else

12.34 \expandafter\endinput

12.35 \fi

12.36 h/!patternsi

\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.
12.37 \ifx\language\@undefined
12.38 \csname newcount\endcsname\language
12.39 \fi

\last@language Another counter is used to store the last language dened. For pre-3.0 formats an
extra counter has to be allocated,
12.40 \ifx\newlanguage\@undefined
12.41 \csname newcount\endcsname\last@language
plain TEX version 3.0 uses \count 19 for this purpose.
12.42 \else
12.43 \countdef\last@language=19
12.44 \fi

\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 dened here, because the original \newlanguage was dened to be
\outer.
For a format based on plain version 2.x, the denition of \newlanguage can
not be copied because \count 19 is used for other purposes in these formats.
Therefor \addlanguage is dened using a denition based on the macros used to
dene \newlanguage in plain TEX version 3.0.
12.45 \ifx\newlanguage\@undefined
12.46 \def\addlanguage#1{%

23
12.47 \global\advance\last@language \@ne
12.48 \ifnum\last@language<\@cclvi
12.49 \else
12.50 \errmessage{No room for a new \string\language!}%
12.51 \fi
12.52 \global\chardef#1\last@language
12.53 \wlog{\string#1 = \string\language\the\last@language}}
For formats based on plain version 3.0 the denition of \newlanguage can be
simply copied, removing \outer.
12.54 \else
12.55 \def\addlanguage{\alloc@9\language\chardef\@cclvi}
12.56 \fi

\adddialect The macro \adddialect can be used to add the name of a dialect or variant
language, for which an already dened hyphenation table can be used.
12.57 \def\adddialect#1#2{%
12.58 \global\chardef#1#2\relax
12.59 \wlog{\string#1 = a dialect from \string\language#2}}

\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 rst argument is a known language. If so, it
compares the rst argument with the value of \language. Then, depending on
the result of the comparison, it executes either the second or the third argument.

12.60 \def\iflanguage#1{%
12.61 \expandafter\ifx\csname l@#1\endcsname\relax
12.62 \@nolanerr{#1}%
12.63 \else
12.64 \bbl@afterfi{\ifnum\csname l@#1\endcsname=\language
12.65 \expandafter\@firstoftwo
12.66 \else
12.67 \expandafter\@secondoftwo
12.68 \fi}%
12.69 \fi}

\selectlanguage The macro \selectlanguage checks whether the language is already dened
before it performs its actual task, which is to update \language and activate
language-specic denitions.
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 rst 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 rst character of the \string'ed argument is the current escape char-
acter, 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

24
the argument is not a control sequence or \escapechar is set to a value outside
of the character range 0255.
If the user gives an empty argument, we provide a default argument for
\string. This argument should expand to nothing.
12.70 \edef\selectlanguage{%
12.71 \noexpand\protect
12.72 \expandafter\noexpand\csname selectlanguage \endcsname
12.73 }
Because the command \selectlanguage could be used in a moving argument it
expands to \protect\selectlanguage . Therefor, we have to make sure that a
macro \protect exists. If it doesn't it is \let to \relax.
12.74 \ifx\@undefined\protect\let\protect\relax\fi
As LATEX 2.09 writes to les expanded whereas LATEX 2ε takes care not to expand
the arguments of \write statements we need to be a bit clever about the way we
add information to .aux les. Therefor we introduce the macro \xstring which
should expand to the right amount of \string's.
12.75 \ifx\documentclass\@undefined
12.76 \def\xstring{\string\string\string}
12.77 \else

12.78 \let\xstring\string
12.79 \fi

Since version 3.5 babel writes entries to the auxiliary les in order to typeset
table of contents etc. in the correct language environment.
\bbl@pop@language But when the language change happens inside a group the end of the group
doesn't write anything to the auxiliary les. Therefor we need TEX's aftergroup
mechanism to help us. The command \aftergroup stores the token immediately
following it to be executed when the current group is closed. So we dene a
temporary control sequence \bbl@pop@language to be executed at the end of the
group. It calls \bbl@set@language with the name of the current language as its
argument.

\bbl@language@stack The previous solution works for one level of nesting groups, but as soon as
more levels are used it is no longer adequate. For that case we need to keep
track of the nested languages using a stack mechanism. This stack is called
\bbl@language@stack and initially empty.
12.80 \xdef\bbl@language@stack{}
When using a stack we need a mechanism to push an element on the stack and to
retrieve the information afterwards.
\bbl@push@language The stack is simply a list of languagenames, separated with a `+' sign; the push
\bbl@pop@language function can be simple:
12.81 \def\bbl@push@language{%
12.82 \xdef\bbl@language@stack{\languagename+\bbl@language@stack}%
12.83 }
Retrieving information from the stack is a little bit less simple, as we need to
remove the element from the stack while storing it in the macro \languagename.
For this we rst dene a helper function.

25
\bbl@pop@lang This macro stores its rst element (which is delimited by the `+'-sign) in
\languagename and stores the rest of the string (delimited by `-') in its third
argument.
12.84 \def\bbl@pop@lang#1+#2-#3{%
12.85 \def\languagename{#1}\xdef#3{#2}%
12.86 }

The reason for the somewhat weird arrangement of arguments to the helper func-
tion is the fact it is called in the following way:
12.87 \def\bbl@pop@language{%
12.88 \expandafter\bbl@pop@lang\bbl@language@stack-\bbl@language@stack
This means that before \bbl@pop@lang is executed TEX rst expands the stack,
stored in \bbl@language@stack. The result of that is that the argument string of
\bbl@pop@lang contains one or more language names, each followed by a `+'-sign
(zero language names won't occur as this macro will only be called after something
has been pushed on the stack) followed by the `-'-sign and nally the reference to
the stack.
12.89 $$
12.90 \expandafter\bbl@set@language\expandafter{\languagename}%
12.91 }
Once the name of the previous language is retrieved from the stack, it is fed to
\bbl@set@language to do the actual work of switching everything that needs
switching.

12.92 \expandafter\def\csname selectlanguage \endcsname#1{%


12.93 \bbl@push@language
12.94 \aftergroup\bbl@pop@language
12.95 \bbl@set@language{#1}}

\bbl@set@language The macro \bbl@set@language takes care of switching the language environment
and of writing entries on the auxiliary les.
12.96 \def\bbl@set@language#1{%
12.97 \edef\languagename{%
12.98 \ifnum\escapechar=\expandafter`\string#1\@empty
12.99 \else \string#1\@empty\fi}%
12.100 \select@language{\languagename}%
We also write a command to change the current language in the auxiliary les.
12.101 \if@filesw
12.102 \protected@write\@auxout{}{\string\select@language{\languagename}}%
12.103 \addtocontents{toc}{\xstring\select@language{\languagename}}%
12.104 \addtocontents{lof}{\xstring\select@language{\languagename}}%
12.105 \addtocontents{lot}{\xstring\select@language{\languagename}}%
12.106 \fi}

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-dened state.

12.107 \def\select@language#1{%
12.108 \expandafter\ifx\csname l@#1\endcsname\relax
12.109 \@nolanerr{#1}%

26
12.110 \else
12.111 \expandafter\ifx\csname date#1\endcsname\relax
12.112 \@noopterr{#1}%
12.113 \else
12.114 \bbl@patterns{\languagename}%
12.115 \originalTeX
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:
\edef\tmp{\string english}
\ifx\languagename\tmp
...
\else
...
\fi

The construction with \string is necessary because \languagename returns the


name with characters of category code 12 (other). Then we have to re dene
\originalTeX to compensate for the things that have been activated. To save
memory space for the macro denition of \originalTeX, we construct the control
sequence name for the \noextrashlang i command at denition time by expanding
the \csname primitive.
12.116 \expandafter\def\expandafter\originalTeX
12.117 \expandafter{\csname noextras#1\endcsname
12.118 \let\originalTeX\@empty}%

12.119 \languageshorthands{none}%
12.120 \babel@beginsave
Now activate the language-specic denitions. This is done by constructing
the names of three macros by concatenating three words with the argument of
\selectlanguage, and calling these macros.
12.121 \csname captions#1\endcsname
12.122 \csname date#1\endcsname
12.123 \csname extras#1\endcsname\relax
The switching of the values of \lefthyphenmin and \righthyphenmin is some-
what dierent. First we save their current values, then we check if \hlang ihyphenmins
is dened. If it is not, we set default values (2 and 3), otherwise the values in
\hlang ihyphenmins will be used.
12.124 \babel@savevariable\lefthyphenmin
12.125 \babel@savevariable\righthyphenmin
12.126 \expandafter\ifx\csname #1hyphenmins\endcsname\relax
12.127 \set@hyphenmins\tw@\thr@@\relax
12.128 \else
12.129 \expandafter\expandafter\expandafter\set@hyphenmins
12.130 \csname #1hyphenmins\endcsname\relax
12.131 \fi
12.132 \fi
12.133 \fi}

otherlanguage The otherlanguage environment can be used as an alternative to using the


\selectlanguage declarative command. When you are typesetting a document

27
which mixes left-to-right and right-to-left typesetting you have to use this envi-
ronment in order to let things work as you expect them to.
The rst thing this environment does is store the name of the language in
\languagename; it then calls \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.
12.134 \long\def\otherlanguage#1{%
12.135 \csname selectlanguage \endcsname{#1}%
12.136 \ignorespaces
12.137 }
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.
12.138 \long\def\endotherlanguage{%
12.139 \originalTeX
12.140 \global\@ignoretrue\ignorespaces
12.141 }

otherlanguage* The otherlanguage environment is meant to be used when a large part of text from
a dierent language needs to be typeset, but without changing the translation of
words such as `gure'.
This environment makes use of \foreign@language.
12.142 \expandafter\def\csname otherlanguage*\endcsname#1{%
12.143 \foreign@language{#1}%
12.144 }
At the end of the environment we need to switch o the extra denitions. The
grouping mechanism of the environment will take care of resetting the correct
hyphenation rules.
12.145 \expandafter\def\csname endotherlanguage*\endcsname{%
12.146 \csname noextras\languagename\endcsname
12.147 }

\foreignlanguage The \foreignlanguage command is another substitute for the \selectlanguage


command. This command takes two arguments, the rst argument is the name of
the language to use for typesetting the text specied in the second argument.
Unlike \selectlanguage this command doesn't switch everything, it only
switches the hyphenation rules and the extra denitions for the language specied.
It does this within a group and assumes the \extrashlang i command doesn't make
any \global changes. The coding is very similar to part of \selectlanguage.
12.148 \def\foreignlanguage{\protect\csname foreignlanguage \endcsname}
12.149 \expandafter\def\csname foreignlanguage \endcsname#1#2{%
12.150 \begingroup
12.151 \originalTeX
12.152 \foreign@language{#1}%
12.153 #2%
12.154 \csname noextras#1\endcsname
12.155 \endgroup
12.156 }

\foreign@language This macro does the work for \foreignlanguage and the otherlanguage* environ-
ment.
12.157 \def\foreign@language#1{%

28
First we need to store the name of the language and check that it is a known
language.
12.158 \def\languagename{#1}%
12.159 \expandafter\ifx\csname l@#1\endcsname\relax
12.160 \@nolanerr{#1}%
12.161 \else
If it is we can select the proper hyphenation table and switch on the extra deni-
tions for this language.
12.162 \bbl@patterns{\languagename}%
12.163 \languageshorthands{none}%
Then we set the left- and right hyphenmin variables.
12.164 \csname extras#1\endcsname
12.165 \expandafter\ifx\csname #1hyphenmins\endcsname\relax
12.166 \set@hyphenmins\tw@\thr@@\relax
12.167 \else
12.168 \expandafter\expandafter\expandafter\set@hyphenmins
12.169 \csname #1hyphenmins\endcsname\relax
12.170 \fi
12.171 \fi
12.172 }

\bbl@patterns This macro selects the hyphenation patterns by changing the \language regis-
ter. If special hyphenation patterns are available specically for the current font
encoding, use them instead of the default.
12.173 \def\bbl@patterns#1{%
12.174 \language=\expandafter\ifx\csname l@#1:\f@encoding\endcsname\relax
12.175 \csname l@#1\endcsname
12.176 \else
12.177 \csname l@#1:\f@encoding\endcsname
12.178 \fi\relax
12.179 }

hyphenrules The environment hyphenrules can be used to select just the hyphenation rules.
This environment does not change \languagename and when the hyphenation
rules specied were not loaded it has no eect.
12.180 \def\hyphenrules#1{%
12.181 \expandafter\ifx\csname l@#1\endcsname\@undefined
12.182 \@nolanerr{#1}%
12.183 \else
12.184 \bbl@patterns{#1}%
12.185 \languageshorthands{none}%
12.186 \expandafter\ifx\csname #1hyphenmins\endcsname\relax
12.187 \set@hyphenmins\tw@\thr@@\relax
12.188 \else
12.189 \expandafter\expandafter\expandafter\set@hyphenmins
12.190 \csname #1hyphenmins\endcsname\relax
12.191 \fi
12.192 \fi
12.193 }
12.194 \def\endhyphenrules{}

29
\providehyphenmins The macro \providehyphenmins should be used in the language denition les
to provide a default setting for the hyphenation parameters \lefthyphenmin and
\righthyphenmin. If the macro \hlang ihyphenmins is already dened this com-
mand has no eect.
12.195 \def\providehyphenmins#1#2{%
12.196 \expandafter\ifx\csname #1hyphenmins\endcsname\relax
12.197 \@namedef{#1hyphenmins}{#2}%
12.198 \fi}

\set@hyphenmins This macro sets the values of \lefthyphenmin and \righthyphenmin. It expects
two values as its argument.
12.199 \def\set@hyphenmins#1#2{\lefthyphenmin#1\righthyphenmin#2}

\LdfInit This macro is dened in two versions. The rst version is to be part of the `kernel'
of babel, ie. the part that is loaded in the format; the second version is dened
in babel.def. The version in the format just checks the category code of the
ampersand and then loads babel.def.
12.200 \def\LdfInit{%
12.201 \chardef\atcatcode=\catcode`\@
12.202 \catcode`\@=11\relax
12.203 \input babel.def\relax
The category code of the ampersand is restored and the macro calls itself again
with the new denition from babel.def
12.204 \catcode`\@=\atcatcode \let\atcatcode\relax
12.205 \LdfInit}
12.206 h/kerneli

The second version of this macro takes two arguments. The rst argument is the
name of the language that will be dened in the language denition le; 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
le has been processed before.
At the start of processing a language denition le we always check the category
code of the ampersand. We make sure that it is a `letter' during the processing of
the le.
12.207 h∗corei
12.208 \def\LdfInit#1#2{%
12.209 \chardef\atcatcode=\catcode`\@
12.210 \catcode`\@=11\relax
Another character that needs to have the correct category code during processing
of language denition les is the equals sign, `=', because it is sometimes used in
constructions with the \let primitive. Therefor we store its current catcode and
restore it later on.
12.211 \chardef\eqcatcode=\catcode`\=
12.212 \catcode`\==12\relax
Now we check whether we should perhaps stop the processing of this le. To do
this we rst need to check whether the second argument that is passed to \LdfInit
is a control sequence. We do that by looking at the rst 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.

30
12.213 \let\bbl@tempa\relax
12.214 \expandafter\if\expandafter\@backslashchar
12.215 \expandafter\@car\string#2\@nil
12.216 \ifx#2\@undefined
12.217 \else
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.
12.218 \def\bbl@tempa{\ldf@quit{#1}}
12.219 \fi
12.220 \else
When #2 was not a control sequence we construct one and compare it with \relax.
12.221 \expandafter\ifx\csname#2\endcsname\relax
12.222 \else
12.223 \def\bbl@tempa{\ldf@quit{#1}}
12.224 \fi
12.225 \fi
12.226 \bbl@tempa
Finally we check \originalTeX.
12.227 \ifx\originalTeX\@undefined
12.228 \let\originalTeX\@empty
12.229 \else
12.230 \originalTeX
12.231 \fi}

\ldf@quit This macro interrupts the processing of a language denition le.


12.232 \def\ldf@quit#1{%
12.233 \expandafter\main@language\expandafter{#1}%
12.234 \catcode`\@=\atcatcode \let\atcatcode\relax
12.235 \catcode`\==\eqcatcode \let\eqcatcode\relax
12.236 \endinput
12.237 }

\ldf@finish This macro takes one argument. It is the name of the language that was dened
in the language denition le.
We load the local conguration le 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.
12.238 \def\ldf@finish#1{%
12.239 \loadlocalcfg{#1}%
12.240 \expandafter\main@language\expandafter{#1}%
12.241 \catcode`\@=\atcatcode \let\atcatcode\relax
12.242 \catcode`\==\eqcatcode \let\eqcatcode\relax
12.243 }

After the preamble of the document the commands \LdfInit, \ldf@quit and
\ldf@finish are no longer needed. Therefor they are turned into warning mes-
sages in LATEX.
12.244 \@onlypreamble\LdfInit
12.245 \@onlypreamble\ldf@quit
12.246 \@onlypreamble\ldf@finish

31
\main@language This command should be used in the various language denition les. It stores its
\bbl@main@language argument in \bbl@main@language; to be used to switch to the correct language
at the beginning of the document.
12.247 \def\main@language#1{%
12.248 \def\bbl@main@language{#1}%
12.249 \let\languagename\bbl@main@language
12.250 \bbl@patterns{\languagename}%
12.251 }
The default is to use English as the main language.
12.252 \ifx\l@english\@undefined
12.253 \let\l@english\z@
12.254 \fi

12.255 \main@language{english}

We also have to make sure that some code gets executed at the beginning of the
document.
12.256 \AtBeginDocument{%
12.257 \expandafter\selectlanguage\expandafter{\bbl@main@language}}
12.258 h/corei

\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.
12.259 h∗kerneli
12.260 \ifx\originalTeX\@undefined\let\originalTeX\@empty\fi
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 undened.
12.261 \ifx\babel@beginsave\@undefined\let\babel@beginsave\relax\fi

\@nolanerr The babel package will signal an error when a documents tries to select a language
\@nopatterns that hasn't been dened 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.
\@noopterr When the package was loaded without options not everything will work as ex-
pected. An error message is issued in that case.
When the format knows about \PackageError it must be LATEX 2ε , so we can
safely use its error handling interface. Otherwise we'll have to `keep it simple'.
12.262 \ifx\PackageError\@undefined
12.263 \def\@nolanerr#1{%
12.264 \errhelp{Your command will be ignored, type <return> to proceed}%
12.265 \errmessage{You haven't defined the language #1\space yet}}
12.266 \def\@nopatterns#1{%
12.267 \message{No hyphenation patterns were loaded for}%
12.268 \message{the language `#1'}%
12.269 \message{I will use the patterns loaded for \string\language=0
12.270 instead}}
12.271 \def\@noopterr#1{%
12.272 \errmessage{The option #1 was not specified in \string\usepackage}
12.273 \errhelp{You may continue, but expect unexpected results}}
12.274 \def\@activated#1{%

32
12.275 \wlog{Package babel Info: Making #1 an active character}}
12.276 \else
12.277 \newcommand*{\@nolanerr}[1]{%
12.278 \PackageError{babel}%
12.279 {You haven't defined the language #1\space yet}%
12.280 {Your command will be ignored, type <return> to proceed}}
12.281 \newcommand*{\@nopatterns}[1]{%
12.282 \PackageWarningNoLine{babel}%
12.283 {No hyphenation patterns were loaded for\MessageBreak
12.284 the language `#1'\MessageBreak
12.285 I will use the patterns loaded for \string\language=0
12.286 instead}}
12.287 \newcommand*{\@noopterr}[1]{%
12.288 \PackageError{babel}%
12.289 {You haven't loaded the option #1\space yet}%
12.290 {You may proceed, but expect unexpected results}}
12.291 \newcommand*{\@activated}[1]{%
12.292 \PackageInfo{babel}{%
12.293 Making #1 an active character}}
12.294 \fi

The following code is meant to be read by iniTEX because it should instruct


TEX to read hyphenation patterns. To this end the docstrip option patterns
can be used to include this code in the le hyphen.cfg.
12.295 h∗patternsi

\process@line Each line in the le language.dat is processed by \process@line after it is read.
The rst thing this macro does is to check whether the line starts with =. When
the rst token of a line is an =, the macro \process@synonym is called; otherwise
the macro \process@language will continue.
12.296 \def\process@line#1#2 #3/{%
12.297 \ifx=#1
12.298 \process@synonym#2 /
12.299 \else
12.300 \process@language#1#2 #3/%
12.301 \fi
12.302 }

\process@synonym This macro takes care of the lines which start with an =. It needs an empty token
register to begin with.
12.303 \toks@{}
12.304 \def\process@synonym#1 /{%
12.305 \ifnum\last@language=\m@ne
When no languages have been loaded yet, the name following the = will be a
synonym for hyphenation register 0.
12.306 \expandafter\chardef\csname l@#1\endcsname0\relax
12.307 \wlog{\string\l@#1=\string\language0}
As no hyphenation patterns are read in yet, we can not yet set the hyphenmin
parameters. Therefor a commands to do so is stored in a token register and
executed when the rst pattern le has been processed.
12.308 \toks@\expandafter{\the\toks@

33
12.309 \expandafter\let\csname #1hyphenmins\expandafter\endcsname
12.310 \csname\languagename hyphenmins\endcsname}%
12.311 \else
Otherwise the name will be a synonym for the language loaded last.
12.312 \expandafter\chardef\csname l@#1\endcsname\last@language
12.313 \wlog{\string\l@#1=\string\language\the\last@language}
We also need to copy the hyphenmin parameters for the synonym.
12.314 \expandafter\let\csname #1hyphenmins\expandafter\endcsname
12.315 \csname\languagename hyphenmins\endcsname
12.316 \fi
12.317 }

\process@language The macro \process@language is used to process a non-empty line from the `con-
guration le'. It has three arguments, each delimited by white space. The third
argument is optional, so a / character is expected to delimit the last argument.
The rst argument is the `name' of a language; the second is the name of the
le that contains the patterns. The optional third argument is the name of a le
containing hyphenation exceptions.
The rst thing to do is call \addlanguage to allocate a pattern register and
to make that register `active'.
12.318 \def\process@language#1 #2 #3/{%
12.319 \expandafter\addlanguage\csname l@#1\endcsname
12.320 \expandafter\language\csname l@#1\endcsname
12.321 \def\languagename{#1}%
Then the `name' of the language that will be loaded now is added to the token
register \toks8. and nally the pattern le is read.
12.322 \global\toks8\expandafter{\the\toks8#1, }%
For some hyphenation patterns it is needed to load them with a specic font
encoding selected. This can be specied in the le language.dat by adding for
instance `:T1' to the name of the language. The macro \bbl@get@enc extracts
the font encoding from the language name and stores it in \bbl@hyph@enc.
12.323 \begingroup
12.324 \bbl@get@enc#1:\@@@
12.325 \ifx\bbl@hyph@enc\@empty
12.326 \else
12.327 \fontencoding{\bbl@hyph@enc}\selectfont
12.328 \fi
Some pattern les contain assignments to \lefthyphenmin and \righthyphenmin.
TEX does not keep track of these assignments. Therefor we try to detect such as-
signments and store them in the \hlang ihyphenmins macro. When no assignments
were made we provide a default setting.
12.329 \lefthyphenmin\m@ne
Some pattern les contain changes to the \lccode en \uccode arrays. Such
changes should remain local to the language; therefor we process the pattern le
in a group; the \patterns command acts globally so its eect will be remembered.

12.330 \input #2\relax

34
Now we globally store the settings of \lefthyphenmin and \righthyphenmin and
close the group.
12.331 \ifnum\lefthyphenmin=\m@ne
12.332 \else
12.333 \expandafter\xdef\csname #1hyphenmins\endcsname{%
12.334 \the\lefthyphenmin\the\righthyphenmin}%
12.335 \fi
12.336 \endgroup
If the counter \language is still equal to zero we set the hyphenmin parameters
to the values for the language loaded on pattern register 0.
12.337 \ifnum\the\language=\z@
12.338 \expandafter\ifx\csname #1hyphenmins\endcsname\relax
12.339 \set@hyphenmins\tw@\thr@@\relax
12.340 \else
12.341 \expandafter\expandafter\expandafter\set@hyphenmins
12.342 \csname #1hyphenmins\endcsname
12.343 \fi
Now execute the contents of token register zero as it may contain commands
which set the hyphenmin parameters for synonyms that were dened before the
rst pattern le is read in.
12.344 \the\toks@
12.345 \fi
Empty the token register after use.
12.346 \toks@{}%
When the hyphenation patterns have been processed we need to see if a le 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.
12.347 \def\bbl@tempa{#3}%
12.348 \ifx\bbl@tempa\@empty
12.349 \else
12.350 \ifx\bbl@tempa\space
12.351 \else
12.352 \input #3\relax
12.353 \fi
12.354 \fi
12.355 }

\bbl@get@enc The macro \bbl@get@enc extracts the font encoding from the language name and
\bbl@hyph@enc stores it in \bbl@hyph@enc. It uses delimited arguments to achieve this.
12.356 \def\bbl@get@enc#1:#2\@@@{%
First store both arguments in temporary macros,
12.357 \def\bbl@tempa{#1}%
12.358 \def\bbl@tempb{#2}%
then, if the second argument was empty, no font encoding was specied and we're
done.
12.359 \ifx\bbl@tempb\@empty
12.360 \let\bbl@hyph@enc\@empty
12.361 \else

35
But if the second argument was not empty it will now have a superuous colon
attached to it which we need to remove. This done by feeding it to \bbl@get@enc.
The string that we are after will then be in the rst argument and be stored in
\bbl@tempa.
12.362 \bbl@get@enc#2\@@@
12.363 \edef\bbl@hyph@enc{\bbl@tempa}%
12.364 \fi}

\readconfigfile The conguration le can now be opened for reading.


12.365 \openin1 = language.dat
See if the le exists, if not, use the default hyphenation le hyphen.tex. The
user will be informed about this.
12.366 \ifeof1
12.367 \message{I couldn't find the file language.dat,\space
12.368 I will try the file hyphen.tex}
12.369 \input hyphen.tex\relax
12.370 \else

Pattern registers are allocated using count register \last@language. Its initial
value is 0. The denition of the macro \newlanguage is such that it rst incre-
ments the count register and then denes the language. In order to have the rst
patterns loaded in pattern register number 0 we initialize \last@language with
the value −1.
12.371 \last@language\m@ne
We now read lines from the le until the end is found
12.372 \loop
While reading from the input, it is useful to switch o recognition of the end-
of-line character. This saves us stripping o spaces from the contents of the control
sequence.
12.373 \endlinechar\m@ne
12.374 \read1 to \bbl@line
12.375 \endlinechar`\^^M
Empty lines are skipped.
12.376 \ifx\bbl@line\@empty
12.377 \else
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.
12.378 \edef\bbl@line{\bbl@line\space/}%
12.379 \expandafter\process@line\bbl@line
12.380 \fi
Check for the end of the le. To avoid a new 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 loop...repeat TEX has to
read \if/\fi pairs. So we have to insert a `dummy' \iftrue.
12.381 \iftrue \csname fi\endcsname
12.382 \csname if\ifeof1 false\else true\fi\endcsname
12.383 \repeat

36
Reactivate the default patterns,
12.384 \language=0
12.385 \fi
and close the conguration le.
12.386 \closein1
Also remove some macros from memory
12.387 \let\process@language\@undefined
12.388 \let\process@synonym\@undefined
12.389 \let\process@line\@undefined

12.390 \let\bbl@tempa\@undefined

12.391 \let\bbl@tempb\@undefined

12.392 \let\bbl@eq@\@undefined

12.393 \let\bbl@line\@undefined

12.394 \let\bbl@get@enc\@undefined

We add a message about the fact that babel is loaded in the format and with
which language patterns to the \everyjob register.
12.395 \ifx\addto@hook\@undefined
12.396 \else
12.397 \expandafter\addto@hook\expandafter\everyjob\expandafter{%
12.398 \expandafter\typeout\expandafter{\the\toks8 loaded.}}
12.399 \fi

Here the code for iniTEX ends.


12.400 h/patternsi
12.401 h/kerneli

12.3 Support for active characters


\bbl@add@special The macro \bbl@add@special is used to add a new character (or single character
control sequence) to the macro \dospecials (and \@sanitize if LATEX is used).
To keep all changes local, we begin a new group. Then we redene the macros
\do and \@makeother to add themselves and the given character without expan-
sion.
12.402 h∗core | shorthandsi
12.403 \def\bbl@add@special#1{\begingroup
12.404 \def\do{\noexpand\do\noexpand}%
12.405 \def\@makeother{\noexpand\@makeother\noexpand}%
To add the character to the macros, we expand the original macros with the
additional character inside the redenition of the macros. Because \@sanitize
can be undened, we put the denition inside a conditional.
12.406 \edef\x{\endgroup
12.407 \def\noexpand\dospecials{\dospecials\do#1}%
12.408 \expandafter\ifx\csname @sanitize\endcsname\relax \else
12.409 \def\noexpand\@sanitize{\@sanitize\@makeother#1}%
12.410 \fi}%
The macro \x contains at this moment the following:
\endgroup\def\dospecials{old contents \dohchar i}.
If \@sanitize is dened, it contains an additional denition of this macro.
The last thing we have to do, is the expansion of \x. Then \endgroup is executed,

37
which restores the old meaning of \x, \do and \@makeother. After the group is
closed, the new denition of \dospecials (and \@sanitize) is assigned.
12.411 \x}

\bbl@remove@special 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 dene 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.
12.412 \def\bbl@remove@special#1{\begingroup
12.413 \def\x##1##2{\ifnum`#1=`##2\noexpand\@empty
12.414 \else\noexpand##1\noexpand##2\fi}%
With the help of this macro we dene \do and \make@other.
12.415 \def\do{\x\do}%
12.416 \def\@makeother{\x\@makeother}%
The rest of the work is similar to \bbl@add@special.
12.417 \edef\x{\endgroup
12.418 \def\noexpand\dospecials{\dospecials}%
12.419 \expandafter\ifx\csname @sanitize\endcsname\relax \else
12.420 \def\noexpand\@sanitize{\@sanitize}%
12.421 \fi}%
12.422 \x}

12.4 Shorthands
\initiate@active@char A language denition le 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
denes the control sequence \normal@charhchar i to expand to the character in its
`normal state' and it denes the active character to expand to \normal@charhchar i
by default (hchar i being the character to be made active). Later its denition can
be changed to expand to \active@charhchar i by calling \bbl@activate{hchar i}.
For example, to make the double quote character active one could have the
following line in a language denition le:
\initiate@active@char{"}

\bbl@afterelse Because the code that is used in the handling of active characters may need to
\bbl@afterfi look ahead, we take extra care to `throw' it over the \else and \fi parts of an
\if-statement5 . These macros will break if another \if...\fi statement appears
in one of the arguments.
12.423 \long\def\bbl@afterelse#1\else#2\fi{\fi#1}
12.424 \long\def\bbl@afterfi#1\fi{\fi#1}

5 This code is based on code presented in TUGboat vol. 12, no2, June 1991 in An expansion
Power Lemma by Sonja Maus.

38
\peek@token To prevent error messages when a shorthand, which normally takes an argument,
sees a \par, or }, or similar tokens, we need to be able to `peek' at what is coming
up next in the input stream. Depending on the category code of the token that
is seen, we need to either continue the code for the active character, or insert
the non-active version of that character in the output. The macro \peek@token
therefore takes two arguments, with which it constructs the control sequence to
expand next. It \let's \bbl@nexta and \bbl@nextb to the two possible macros.
This is necessary for \bbl@test@token to take the right decision.
12.425 %\def\peek@token#1#2{%
12.426 % \expandafter\let\expandafter\bbl@nexta\csname #1\string#2\endcsname
12.427 % \expandafter\let\expandafter\bbl@nextb
12.428 % \csname system@active\string#2\endcsname
12.429 % \futurelet\bbl@token\bbl@test@token}

\bbl@test@token When the result of peeking at the next token has yielded a token with category
`letter', `other' or `active' it is safe to proceed with evaluating the code for the
shorthand. When a token is found with any other category code proceeding is
unsafe and therefor the original shorthand character is inserted in the output. The
macro that calls \bbl@test@token needs to setup \bbl@nexta and \bbl@nextb
in order to achieve this.
12.430 %\def\bbl@test@token{%
12.431 % \let\bbl@next\bbl@nexta
12.432 % \ifcat\noexpand\bbl@token a%
12.433 % \else
12.434 % \ifcat\noexpand\bbl@token=%
12.435 % \else
12.436 % \ifcat\noexpand\bbl@token\noexpand\bbl@next
12.437 % \else
12.438 % \let\bbl@next\bbl@nextb
12.439 % \fi
12.440 % \fi
12.441 % \fi
12.442 % \bbl@next}

The macro \initiate@active@char takes all the necessary actions to make


its argument a shorthand character. The real work is performed once for each
character.
12.443 \def\initiate@active@char#1{%
12.444 \expandafter\ifx\csname active@char\string##1\endcsname\relax
12.445 \bbl@afterfi{\@initiate@active@char{#1}}%
12.446 \fi}
Note that the denition 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.
12.447 \begingroup
12.448 \catcode`\~\active
12.449 \def\x{\endgroup
12.450 \def\@initiate@active@char##1{%
If the character is already active we provide the default expansion under this
shorthand mechanism.
12.451 \ifcat\noexpand##1\noexpand~\relax

39
12.452 \@ifundefined{normal@char\string##1}{%
12.453 \expandafter\let\csname normal@char\string##1\endcsname##1%
12.454 \expandafter\gdef
12.455 \expandafter##1%
12.456 \expandafter{%
12.457 \expandafter\active@prefix\expandafter##1%
12.458 \csname normal@char\string##1\endcsname}}{}%
12.459 \else
Otherwise we write a message in the transcript le,
12.460 \@activated{##1}%
and dene \normal@charhchar i to expand to the character in its default state.
12.461 \@namedef{normal@char\string##1}{##1}%
If we are making the right quote active we need to change \pr@m@s as well.
12.462 \ifx##1'%
12.463 \let\prim@s\bbl@prim@s
Also, make sure that a single ' in math mode `does the right thing'.
12.464 \@namedef{normal@char\string##1}{%
12.465 \textormath{##1}{^\bgroup\prim@s}}%
12.466 \fi
If we are using the caret as a shorthand character special care should be taken
to make sure math still works. Therefor an extra level of expansion is introduced
with a check for math mode on the upper level.
12.467 \ifx##1^%
12.468 \gdef\bbl@act@caret{%
12.469 \ifmmode
12.470 \csname normal@char\string^\endcsname
12.471 \else
12.472 \bbl@afterfi
12.473 {\if@safe@actives
12.474 \bbl@afterelse\csname normal@char\string##1\endcsname
12.475 \else
12.476 \bbl@afterfi\csname user@active\string##1\endcsname
12.477 \fi}%
12.478 \fi}
12.479 \fi
To prevent problems with the loading of other packages after babel we reset the
catcode of the character at the end of the package.
12.480 \@ifpackagewith{babel}{KeepShorthandsActive}{}{%
12.481 \edef\bbl@tempa{\catcode`\noexpand##1\the\catcode`##1}%
12.482 \expandafter\AtEndOfPackage\expandafter{\bbl@tempa}}%
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'.
12.483 \@tempcnta=\lccode`\~
12.484 \lccode`~=`##1%
12.485 \lowercase{%
Make the character active and add it to \dospecials and \@sanitize.
12.486 \catcode`~\active
12.487 \expandafter\bbl@add@special
12.488 \csname \string##1\endcsname

40
Also re-activate it again at \begin{document}.
12.489 \AtBeginDocument{%
12.490 \catcode`##1\active
We also need to make sure that the shorthands are active during the processing
of the .aux le. Otherwise some citations may give unexpected results in the
printout when a shorthand was used in the optional argument of \bibitem for
example.
12.491 \if@filesw
12.492 \immediate\write\@mainaux{%
12.493 \string\catcode`##1\string\active}%
12.494 \fi}%
Dene the character to expand to
\active@prefix hchar i \normal@charhchar i
(where \active@charhchar i is one control sequence!).
12.495 \expandafter\gdef
12.496 \expandafter~%
12.497 \expandafter{%
12.498 \expandafter\active@prefix\expandafter##1%
12.499 \csname normal@char\string##1\endcsname}}%
12.500 \lccode`\~\@tempcnta
12.501 \fi
For the active caret we rst expand to \bbl@act@caret in order to be able to
handle math mode correctly.
12.502 \ifx##1^%
12.503 \@namedef{active@char\string##1}{\bbl@act@caret}%
12.504 \else
We dene the rst level expansion of \active@charhchar i to check the status of
the @safe@actives ag. If it is set to true we expand to the `normal' version of
this character, otherwise we call \@active@charhchar i.
12.505 \@namedef{active@char\string##1}{%
12.506 \if@safe@actives
12.507 \bbl@afterelse\csname normal@char\string##1\endcsname
12.508 \else
12.509 \bbl@afterfi\csname user@active\string##1\endcsname
12.510 \fi}%
12.511 \fi
The next level of the code checks whether a user has dened 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.
12.512 \@namedef{user@active\string##1}{%
12.513 \expandafter\ifx
12.514 \csname \user@group @sh@\string##1@\endcsname
12.515 \relax
12.516 \bbl@afterelse\bbl@sh@select\user@group##1%
12.517 {user@active@arg\string##1}{language@active\string##1}%
12.518 \else
12.519 \bbl@afterfi\csname \user@group @sh@\string##1@\endcsname
12.520 \fi}%

41
When there is also no user-level shorthand with an argument we will check whether
there is a language dened shorthand for this active character. Before the next
token is absorbed as argument we need to make sure that this is safe. Therefor
\peek@token is called to decide that.
12.521 \long\@namedef{user@active@arg\string##1}####1{%
12.522 \expandafter\ifx
12.523 \csname \user@group @sh@\string##1@\string####1@\endcsname
12.524 \relax
12.525 \bbl@afterelse
12.526 \csname language@active\string##1\endcsname####1%
12.527 \else
12.528 \bbl@afterfi
12.529 \csname \user@group @sh@\string##1@\string####1@%
12.530 \endcsname
12.531 \fi}%
In order to do the right thing when a shorthand with an argument is used by itself
at the end of the line we provide a denition for the case of an empty argument.
For that case we let the shorthand character expand to its non-active self.
12.532 \@namedef{\user@group @sh@\string##1@@}{%
12.533 \csname normal@char\string##1\endcsname}
Like the shorthands that can be dened by the user, a language denition le
can also dene shorthands with and without an argument, so we need two more
macros to check if they exist.
12.534 \@namedef{language@active\string##1}{%
12.535 \expandafter\ifx
12.536 \csname \language@group @sh@\string##1@\endcsname
12.537 \relax
12.538 \bbl@afterelse\bbl@sh@select\language@group##1%
12.539 {language@active@arg\string##1}{system@active\string##1}%
12.540 \else
12.541 \bbl@afterfi
12.542 \csname \language@group @sh@\string##1@\endcsname
12.543 \fi}%
12.544 \long\@namedef{language@active@arg\string##1}####1{%
12.545 \expandafter\ifx
12.546 \csname \language@group @sh@\string##1@\string####1@\endcsname
12.547 \relax
12.548 \bbl@afterelse
12.549 \csname system@active\string##1\endcsname####1%
12.550 \else
12.551 \bbl@afterfi
12.552 \csname \language@group @sh@\string##1@\string####1@%
12.553 \endcsname
12.554 \fi}%
And the same goes for the system level.
12.555 \@namedef{system@active\string##1}{%
12.556 \expandafter\ifx
12.557 \csname \system@group @sh@\string##1@\endcsname
12.558 \relax
12.559 \bbl@afterelse\bbl@sh@select\system@group##1%
12.560 {system@active@arg\string##1}{normal@char\string##1}%

42
12.561 \else
12.562 \bbl@afterfi\csname \system@group @sh@\string##1@\endcsname
12.563 \fi}%
When no shorthands were found the `normal' version of the active character is
inserted.
12.564 \long\@namedef{system@active@arg\string##1}####1{%
12.565 \expandafter\ifx
12.566 \csname \system@group @sh@\string##1@\string####1@\endcsname
12.567 \relax
12.568 \bbl@afterelse\csname normal@char\string##1\endcsname####1%
12.569 \else
12.570 \bbl@afterfi
12.571 \csname \system@group @sh@\string##1@\string####1@\endcsname
12.572 \fi}%
When a shorthand combination such as '' ends up in a heading TEX would see
\protect'\protect'. To prevent this from happening a shorthand needs to be
dened at user level.
12.573 \@namedef{user@sh@\string##1@\string\protect@}{%
12.574 \csname user@active\string##1\endcsname}%
12.575 }%
12.576 }\x

\bbl@sh@select This command helps the shorthand supporting macros to select how to proceed.
Note that this macro needs to be expandable as do all the shorthand macros in
order for them to work in expansion-only environments such as the argument of
\hyphenation.
This macro expects the name of a group of shorthands in its rst argument
and a shorthand character in its second argument. It will expand to either
\bbl@firstcs or \bbl@scndcs. Hence two more arguments need to follow it.

12.577 \def\bbl@sh@select#1#2{%
12.578 \expandafter\ifx\csname#1@sh@\string#2@sel\endcsname\relax
12.579 \bbl@afterelse\bbl@scndcs
12.580 \else
12.581 \bbl@afterfi\csname#1@sh@\string#2@sel\endcsname
12.582 \fi
12.583 }

\active@prefix The command \active@prefix which is used in the expansion of active charac-
ters has a function similar to \OT1-cmd in that it \protects the active character
whenever \protect is not \@typeset@protect.
12.584 \def\active@prefix#1{%
12.585 \ifx\protect\@typeset@protect
12.586 \else
When \protect is set to \@unexpandable@protect we make sure that the active
character is als not expanded by inserting \noexpand in front of it. The \@gobble
is needed to remove a token such as \activechar: (when the double colon was
the active character to be dealt with).
12.587 \ifx\protect\@unexpandable@protect
12.588 \bbl@afterelse\bbl@afterfi\noexpand#1\@gobble
12.589 \else

43
12.590 \bbl@afterfi\bbl@afterfi\protect#1\@gobble
12.591 \fi
12.592 \fi}

\if@safe@actives In some circumstances it is necessary to be able to change the expansion of an


active character on the y. For this purpose the switch @safe@actives is avail-
able. The setting of this switch should be checked in the rst level expansion of
\active@charhchar i.
12.593 \newif\if@safe@actives
12.594 \@safe@activesfalse

\bbl@restore@actives When the output routine kicks in while the active characters were made safe this
must be undone in the headers to prevent unexpected typeset results. For this
situation we dene a command to make them unsafe again.
12.595 \def\bbl@restore@actives{\if@safe@actives\@safe@activesfalse\fi}

\bbl@activate This macro takes one argument, like \initiate@active@char. The macro is used
to change the denition of an active character to expand to \active@charhchar i
instead of \normal@charhchar i.
12.596 \def\bbl@activate#1{%
12.597 \expandafter\def
12.598 \expandafter#1\expandafter{%
12.599 \expandafter\active@prefix
12.600 \expandafter#1\csname active@char\string#1\endcsname}%
12.601 }

\bbl@deactivate This macro takes one argument, like \bbl@activate. The macro doesn't
really make a character non-active; it changes its denition to expand to
\normal@charhchar i.
12.602 \def\bbl@deactivate#1{%
12.603 \expandafter\def
12.604 \expandafter#1\expandafter{%
12.605 \expandafter\active@prefix
12.606 \expandafter#1\csname normal@char\string#1\endcsname}%
12.607 }

\bbl@firstcs These macros have two arguments. They use one of their arguments to build a
\bbl@scndcs control sequence from.
12.608 \def\bbl@firstcs#1#2{\csname#1\endcsname}
12.609 \def\bbl@scndcs#1#2{\csname#2\endcsname}

\declare@shorthand The command \declare@shorthand is used to declare a shorthand on a certain


level. It takes three arguments:

1. a name for the collection of shorthands, i.e. `system', or `dutch';

2. the character (sequence) that makes up the shorthand, i.e. ~ or "a;

3. the code to be executed when the shorthand is encountered.

12.610 \def\declare@shorthand#1#2{\@decl@short{#1}#2\@nil}
12.611 \def\@decl@short#1#2#3\@nil#4{%
12.612 \def\bbl@tempa{#3}%

44
12.613 \ifx\bbl@tempa\@empty
12.614 \expandafter\let\csname #1@sh@\string#2@sel\endcsname\bbl@scndcs
12.615 \@namedef{#1@sh@\string#2@}{#4}%
12.616 \else
12.617 \expandafter\let\csname #1@sh@\string#2@sel\endcsname\bbl@firstcs
12.618 \@namedef{#1@sh@\string#2@\string#3@}{#4}%
12.619 \fi}

\textormath Some of the shorthands that will be declared by the language denition les
have to be usable in both text and mathmode. To achieve this the helper macro
\textormath is provided.
12.620 \def\textormath#1#2{%
12.621 \ifmmode
12.622 \bbl@afterelse#2%
12.623 \else
12.624 \bbl@afterfi#1%
12.625 \fi}

\user@group The current concept of `shorthands' supports three levels or groups of shorthands.
\language@group For each level the name of the level or group is stored in a macro. The default is
\system@group to have a user group; use language group `english' and have a system group called
`system'.
12.626 \def\user@group{user}
12.627 \def\language@group{english}
12.628 \def\system@group{system}

\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.
12.629 \def\useshorthands#1{%
First note that this is user level.
12.630 \def\user@group{user}%
Then initialize the character for use as a shorthand character.
12.631 \initiate@active@char{#1}%
Now that TEX has seen the character its category code is xed, but for the actions
of \bbl@activate to succeed we need it to be active. Hence the trick with the
\lccode to circumvent this.
12.632 \@tempcnta\lccode`\~
12.633 \lccode`~=`#1%
12.634 \lowercase{\catcode`~\active\bbl@activate{~}}%
12.635 \lccode`\~\@tempcnta}

\defineshorthand Currently we only support one group of user level shorthands, called `user'.
12.636 \def\defineshorthand{\declare@shorthand{user}}

\languageshorthands A user level command to change the language from which shorthands are used.
12.637 \def\languageshorthands#1{\def\language@group{#1}}

\aliasshorthand
12.638 \def\aliasshorthand#1#2{%

45
First the new shorthand needs to be initialized,
12.639 \expandafter\ifx\csname active@char\string#2\endcsname\relax
12.640 \ifx\document\@notprerr
12.641 \@notshorthand{#2}
12.642 \else
12.643 \initiate@active@char{#2}%
Then we need to use the \lccode trick to make the new shorthand behave like
the old one. Therefore we save the current \lccode of the ~-character and restore
it later. Then we \let the new shorthand character be equal to the original.
12.644 \@tempcnta\lccode`\~
12.645 \lccode`~=`#2%
12.646 \lowercase{\let~#1}%
12.647 \lccode`\~\@tempcnta
12.648 \fi
12.649 \fi
12.650 }

\@notshorthand
12.651 \def\@notshorthand#1{%
12.652 \PackageError{babel}{%
12.653 The character `\string #1' should be made
12.654 a shorthand character;\MessageBreak
12.655 add the command \string\useshorthands\string{#1\string} to
12.656 the preamble.\MessageBreak
12.657 I will ignore your instruction}{}%
12.658 }

\shorthandon The rst level denition of these macros just passes the argument on to
\shorthandoff \bbl@switch@sh, adding \@nil at the end to denote the end of the list of char-
acters.
12.659 \newcommand*\shorthandon[1]{\bbl@switch@sh{on}#1\@nil}
12.660 \newcommand*\shorthandoff[1]{\bbl@switch@sh{off}#1\@nil}

\bbl@switch@sh The macro \bbl@switch@sh takes the list of characters apart one by one and
subsequently switches the category code of the shorthand character according to
the rst argument of \bbl@switch@sh.
12.661 \def\bbl@switch@sh#1#2#3\@nil{%
But before any of this switching takes place we make sure that the character we
are dealing with is known as a shorthand character. If it is, a macro such as
\active@char" should exist.
12.662 \@ifundefined{active@char\string#2}{%
12.663 \PackageError{babel}{%
12.664 The character '\string #2' is not a shorthand character
12.665 in \languagename}{%
12.666 Maybe you made a typing mistake?\MessageBreak
12.667 I will ignore your instruction}}{%
12.668 \csname bbl@switch@sh@#1\endcsname#2}%
Now that, as the rst character in the list has been taken care of, we pass the rest
of the list back to \bbl@switch@sh.
12.669 \ifx#3\@empty\else
12.670 \bbl@afterfi\bbl@switch@sh{#1}#3\@nil
12.671 \fi}

46
\bbl@switch@sh@off All that is left to do is dene the actual switching macros. Switching o is easy,
we just set the category code to `other' (12).
12.672 \def\bbl@switch@sh@off#1{\catcode`#112\relax}

\bbl@switch@sh@on But switching the shorthand character back on is a bit more tricky. It involves
making sure that we have an active character to begin with when the macro is
being dened. It also needs the use of \lowercase and \lccode trickery to get
everything to work out as expected. And to keep things local that need to remain
local a group is opened, which is closed as soon as \x gets executed.
12.673 \begingroup
12.674 \catcode`\~\active
12.675 \def\x{\endgroup
12.676 \def\bbl@switch@sh@on##1{%
12.677 \begingroup
12.678 \lccode`~=`##1%
12.679 \lowercase{\endgroup
12.680 \catcode`~\active
12.681 }%
12.682 }%
12.683 }

The next operation makes the above denition eective.


12.684 \x
12.685 %

To prevent problems with constructs such as \char"01A when the double quote
is made active, we dene a shorthand on system level.
12.686 \declare@shorthand{system}{"}{\csname normal@char\string"\endcsname}
When the right quote is made active we need to take care of handling it cor-
rectly in mathmode. Therefore we dene a shorthand at system level to make it
expand to a non-active right quote in textmode, but expand to its original deni-
tion in mathmode. (Note that the right quote is `active' in mathmode because of
its mathcode.)
12.687 \declare@shorthand{system}{'}{%
12.688 \textormath{\csname normal@char\string'\endcsname}%
12.689 {\sp\bgroup\prim@s}}
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 dene a
shorthand at system level to make it expand to a non-active left quote.
12.690 \declare@shorthand{system}{`}{\csname normal@char\string`\endcsname}

\bbl@prim@s One of the internal macros that are involved in substituting \prime for each right
\bbl@pr@m@s quote in mathmode is \prim@s. This checks if the next character is a right quote.
When the right quote is active, the denition of this macro needs to be adapted
to look for an active right quote.
12.691 \def\bbl@prim@s{%
12.692 \prime\futurelet\@let@token\bbl@pr@m@s}
12.693 \begingroup

12.694 \catcode`\'\active\let'\relax
12.695 \def\x{\endgroup
12.696 \def\bbl@pr@m@s{%

47
12.697 \ifx'\@let@token
12.698 \expandafter\pr@@@s
12.699 \else
12.700 \ifx^\@let@token
12.701 \expandafter\expandafter\expandafter\pr@@@t
12.702 \else
12.703 \egroup
12.704 \fi
12.705 \fi}%
12.706 }
12.707 \x

12.708 h/core | shorthandsi


Normally the ~ is active and expands to \penalty\@M\ . When it is written
to the .aux le it is written expanded. To prevent that and to be able to use
the character ~ as a start character for a shorthand, it is redened here as a one
character shorthand on system level.
12.709 h∗corei
12.710 \initiate@active@char{~}
12.711 \declare@shorthand{system}{~}{\leavevmode\nobreak\ }

12.712 \bbl@activate{~}

\OT1dqpos The position of the double quote character is dierent for the OT1 and T1 encod-
\T1dqpos ings. It will later be selected using the \f@encoding macro. Therefor we dene
two macros here to store the position of the character in these encodings.
12.713 \expandafter\def\csname OT1dqpos\endcsname{127}
12.714 \expandafter\def\csname T1dqpos\endcsname{4}
When the macro \f@encoding is undened (as it is in plain TEX) we dene it here
to expand to OT1
12.715 \ifx\f@encoding\@undefined
12.716 \def\f@encoding{OT1}
12.717 \fi

12.5 Language attributes


Language attributes provide a means to give the user control over which features
of the language denition les he wants to enable.
\languageattribute The macro \languageattribute checks whether its arguments are valid and then
activates the selected language attribute.
12.718 \newcommand\languageattribute[2]{%
First check whether the language is known.
12.719 \expandafter\ifx\csname l@#1\endcsname\relax
12.720 \@nolanerr{#1}%
12.721 \else
Than process each attribute in the list.
12.722 \@for\bbl@attr:=#2\do{%
We want to make sure that each attribute is selected only once; therefor we store
the already selected attributes in \bbl@known@attribs. When that control se-
quence is not yet dened this attribute is certainly not selected before.

48
12.723 \ifx\bbl@known@attribs\@undefined
12.724 \in@false
12.725 \else
Now we need to see if the attribute occurs in the list of already selected attributes.
12.726 \edef\bbl@tempa{\noexpand\in@{,#1-\bbl@attr,}%
12.727 {,\bbl@known@attribs,}}%
12.728 \bbl@tempa
12.729 \fi
When the attribute was in the list we issue a warning; this might not be the users
intention.
12.730 \ifin@
12.731 \PackageWarning{Babel}{%
12.732 You have more than once selected the attribute
12.733 '\bbl@attr'\MessageBreak for language #1}%
12.734 \else
When we end up here the attribute is not selected before. So, we add it to the list
of selected attributes and execute the associated TEX-code.
12.735 \edef\bbl@tempa{%
12.736 \noexpand\bbl@add@list\noexpand\bbl@known@attribs{#1-\bbl@attr}}%
12.737 \bbl@tempa
12.738 \edef\bbl@tempa{#1-\bbl@attr}%
12.739 \expandafter\bbl@ifknown@ttrib\expandafter{\bbl@tempa}\bbl@attributes%
12.740 {\csname#1@attr@\bbl@attr\endcsname}%
12.741 {\@attrerr{#1}{\bbl@attr}}%
12.742 \fi
12.743 }
12.744 \fi}
This command should only be used in the preamble of a document.
12.745 \@onlypreamble\languageattribute
The error text to be issued when an unknown attribute is selected.
12.746 \newcommand*{\@attrerr}[2]{%
12.747 \PackageError{babel}%
12.748 {The attribute #2 is unknown for language #1.}%
12.749 {Your command will be ignored, type <return> to proceed}}

\bbl@declare@ttribute This command adds the new language/attribute combination to the list of known
attributes.
12.750 \def\bbl@declare@ttribute#1#2#3{%
12.751 \bbl@add@list\bbl@attributes{#1-#2}%
Then it denes a control sequence to be executed when the attribute is used in a
document. The result of this should be that the macro \extras... for the current
language is extended, otherwise the attribute will not work as its code is removed
from memory at \begin{document}.
12.752 \expandafter\def\csname#1@attr@#2\endcsname{#3}%
12.753 }

\bbl@ifattributeset This internal macro has 4 arguments. It can be used to interpret TEX code based
on whether a certain attribute was set. This command should appear inside the
argument to \AtBeginDocument because the attributes are set in the document
preamble, after babel is loaded.

49
The rst argument is the language, the second argument the attribute being
checked, and the third and fourth arguments are the true and false clauses.
12.754 \def\bbl@ifattributeset#1#2#3#4{%
First we need to nd out if any attributes were set; if not we're done.
12.755 \ifx\bbl@known@attribs\@undefined
12.756 \in@false
12.757 \else
The we need to check the list of known attributes.
12.758 \edef\bbl@tempa{\noexpand\in@{,#1-#2,}%
12.759 {,\bbl@known@attribs,}}%
12.760 \bbl@tempa
12.761 \fi
When we're this far \ifin@ has a value indicating if the attribute in question was
set or not. Just to be safe the code to be executed is `thrown over the \fi'.
12.762 \ifin@
12.763 \bbl@afterelse#3%
12.764 \else
12.765 \bbl@afterfi#4%
12.766 \fi
12.767 }

\bbl@add@list This internal macro adds its second argument to a comma separated list in its
rst argument. When the list is not dened yet (or empty), it will be initiated
12.768 \def\bbl@add@list#1#2{%
12.769 \ifx#1\@undefined
12.770 \def#1{#2}%
12.771 \else
12.772 \ifx#1\@empty
12.773 \def#1{#2}%
12.774 \else
12.775 \edef#1{#1,#2}%
12.776 \fi
12.777 \fi
12.778 }

\bbl@ifknown@ttrib An internal macro to check whether a given language/attribute is known. The


macro takes 4 arguments, the language/attribute, the attribute list, the TEX-code
to be executed when the attribute is known and the TEX-code to be executed
otherwise.
12.779 \def\bbl@ifknown@ttrib#1#2{%
We rst assume the attribute is unknown.
12.780 \let\bbl@tempa\@secondoftwo
Then we loop over the list of known attributes, trying to nd a match.
12.781 \@for\bbl@tempb:=#2\do{%
12.782 \expandafter\in@\expandafter{\expandafter,\bbl@tempb,}{,#1,}%
12.783 \ifin@
When a match is found the denition of \bbl@tempa is changed.
12.784 \let\bbl@tempa\@firstoftwo
12.785 \else
12.786 \fi}%

50
Finally we execute \bbl@tempa.
12.787 \bbl@tempa
12.788 }

\bbl@clear@ttribs This macro removes all the attribute code from LATEX's memory at \begin{document}
time (if any is present).
12.789 \def\bbl@clear@ttribs{%
12.790 \ifx\bbl@attributes\@undefined\else
12.791 \@for\bbl@tempa:=\bbl@attributes\do{%
12.792 \expandafter\bbl@clear@ttrib\bbl@tempa.
12.793 }%
12.794 \let\bbl@attributes\@undefined
12.795 \fi
12.796 }
12.797 \def\bbl@clear@ttrib#1-#2.{%

12.798 \expandafter\let\csname#1@attr@#2\endcsname\@undefined}
12.799 \AtBeginDocument{\bbl@clear@ttribs}

12.6 Support for saving macro denitions


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).
\babel@savecnt The initialization of a new save cycle: reset the counter to zero.
\babel@beginsave12.800 \def\babel@beginsave{\babel@savecnt\z@}
Before it's forgotten, allocate the counter and initialize all.
12.801 \newcount\babel@savecnt
12.802 \babel@beginsave

\babel@save The macro \babel@savehcsname i saves the current meaning of the control se-
quence hcsname i to \originalTeX6 . 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.
12.803 \def\babel@save#1{%
12.804 \expandafter\let\csname babel@\number\babel@savecnt\endcsname #1\relax
12.805 \begingroup
12.806 \toks@\expandafter{\originalTeX \let#1=}%
12.807 \edef\x{\endgroup
12.808 \def\noexpand\originalTeX{\the\toks@ \expandafter\noexpand
12.809 \csname babel@\number\babel@savecnt\endcsname\relax}}%
12.810 \x
12.811 \advance\babel@savecnt\@ne}

\babel@savevariable The macro \babel@savevariablehvariable i saves the value of the variable.


hvariable i can be anything allowed after the \the primitive.
6 \originalTeX has to be expandable, i. e. you shouldn't let it to \relax.

51
12.812 \def\babel@savevariable#1{\begingroup
12.813 \toks@\expandafter{\originalTeX #1=}%
12.814 \edef\x{\endgroup
12.815 \def\noexpand\originalTeX{\the\toks@ \the#1\relax}}%
12.816 \x}

\bbl@frenchspacing Some languages need to have \frenchspacing in eect. Others don't want that.
\bbl@nonfrenchspacing The command \bbl@frenchspacing switches it on when it isn't already in eect
and \bbl@nonfrenchspacing switches it o if necessary.
12.817 \def\bbl@frenchspacing{%
12.818 \ifnum\the\sfcode`\.=\@m
12.819 \let\bbl@nonfrenchspacing\relax
12.820 \else
12.821 \frenchspacing
12.822 \let\bbl@nonfrenchspacing\nonfrenchspacing
12.823 \fi}
12.824 \let\bbl@nonfrenchspacing\nonfrenchspacing

12.7 Support for extending macros


\addto For each language four control sequences have to be dened that control the
language-specic denitions. To be able to add something to these macro once
they have been dened the macro \addto is introduced. It takes two arguments,
a hcontrol sequence i and TEX-code to be added to the hcontrol sequence i.
If the hcontrol sequence i has not been dened before it is dened now.
12.825 \def\addto#1#2{%
12.826 \ifx#1\@undefined
12.827 \def#1{#2}%
12.828 \else
The control sequence could also expand to \relax, in which case a circular de-
nition results. The net result is a stack overow.
12.829 \ifx#1\relax
12.830 \def#1{#2}%
12.831 \else
Otherwise the replacement text for the hcontrol sequence i is expanded and stored
in a token register, together with the TEX-code to be added. Finally the hcontrol
sequence i is re dened, using the contents of the token register.
12.832 {\toks@\expandafter{#1#2}%
12.833 \xdef#1{\the\toks@}}%
12.834 \fi
12.835 \fi
12.836 }

12.8 Macros common to a number of languages


\allowhyphens This macro makes hyphenation possible. Basically its denition is nothing more
than \nobreak \hskip 0pt plus 0pt7 .
12.837 \def\bbl@t@one{T1}
7 T X begins and ends a word for hyphenation at a glue node. The penalty prevents a linebreak
E
at this glue node.

52
12.838 \def\allowhyphens{%
12.839 \ifx\cf@encoding\bbl@t@one\else\bbl@allowhyphens\fi}
12.840 \def\bbl@allowhyphens{\nobreak\hskip\z@skip}

\set@low@box The following macro is used to lower quotes to the same level as the comma. It
prepares its argument in box register 0.
12.841 \def\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}%
12.842 \dimen\z@\ht\z@ \advance\dimen\z@ -\ht\tw@%
12.843 \setbox\z@\hbox{\lower\dimen\z@ \box\z@}\ht\z@\ht\tw@ \dp\z@\dp\tw@}

\save@sf@q The macro \save@sf@q is used to save and reset the current space factor.
12.844 \def\save@sf@q #1{\leavevmode
12.845 \begingroup
12.846 \edef\@SF{\spacefactor \the\spacefactor}#1\@SF
12.847 \endgroup
12.848 }

\bbl@disc For some languages the macro \bbl@disc is used to ease the insertion of discre-
tionaries for letters that behave `abnormally' at a breakpoint.
12.849 \def\bbl@disc#1#2{%
12.850 \nobreak\discretionary{#2-}{}{#1}\allowhyphens}

12.9 Making glyphs available


The le babel.dtx8 makes a number of glyphs available that either do not exist
in the OT1 encoding and have to be `faked', or that are not accessible through
T1enc.def.

12.10 Quotation marks


\quotedblbase In the T1 encoding the opening double quote at the baseline is available as a
separate character, accessible via \quotedblbase. In the OT1 encoding it is not
available, therefor we make it available by lowering the normal open quote char-
acter to the baseline.
12.851 \ProvideTextCommand{\quotedblbase}{OT1}{%
12.852 \save@sf@q{\set@low@box{\textquotedblright\/}%
12.853 \box\z@\kern-.04em\allowhyphens}}
Make sure that when an encoding other than OT1 or T1 is used this glyph can still
be typeset.
12.854 \ProvideTextCommandDefault{\quotedblbase}{%
12.855 \UseTextSymbol{OT1}{\quotedblbase}}

\quotesinglbase We also need the single quote character at the baseline.


12.856 \ProvideTextCommand{\quotesinglbase}{OT1}{%
12.857 \save@sf@q{\set@low@box{\textquoteright\/}%
12.858 \box\z@\kern-.04em\allowhyphens}}
8 The le described in this section has version number v3.8l, and was last revised on
2008/03/16.

53
Make sure that when an encoding other than OT1 or T1 is used this glyph can still
be typeset.
12.859 \ProvideTextCommandDefault{\quotesinglbase}{%
12.860 \UseTextSymbol{OT1}{\quotesinglbase}}

\guillemotleft The guillemet characters are not available in OT1 encoding. They are faked.
\guillemotright12.861 \ProvideTextCommand{\guillemotleft}{OT1}{%
12.862 \ifmmode
12.863 \ll
12.864 \else
12.865 \save@sf@q{\nobreak
12.866 \raise.2ex\hbox{$\scriptscriptstyle\ll$}\allowhyphens}%
12.867 \fi}
12.868 \ProvideTextCommand{\guillemotright}{OT1}{%

12.869 \ifmmode
12.870 \gg
12.871 \else
12.872 \save@sf@q{\nobreak
12.873 \raise.2ex\hbox{$\scriptscriptstyle\gg$}\allowhyphens}%
12.874 \fi}
Make sure that when an encoding other than OT1 or T1 is used these glyphs can
still be typeset.
12.875 \ProvideTextCommandDefault{\guillemotleft}{%
12.876 \UseTextSymbol{OT1}{\guillemotleft}}
12.877 \ProvideTextCommandDefault{\guillemotright}{%

12.878 \UseTextSymbol{OT1}{\guillemotright}}

\guilsinglleft The single guillemets are not available in OT1 encoding. They are faked.
\guilsinglright12.879 \ProvideTextCommand{\guilsinglleft}{OT1}{%
12.880 \ifmmode
12.881 <%
12.882 \else
12.883 \save@sf@q{\nobreak
12.884 \raise.2ex\hbox{$\scriptscriptstyle<$}\allowhyphens}%
12.885 \fi}
12.886 \ProvideTextCommand{\guilsinglright}{OT1}{%

12.887 \ifmmode
12.888 >%
12.889 \else
12.890 \save@sf@q{\nobreak
12.891 \raise.2ex\hbox{$\scriptscriptstyle>$}\allowhyphens}%
12.892 \fi}
Make sure that when an encoding other than OT1 or T1 is used these glyphs can
still be typeset.
12.893 \ProvideTextCommandDefault{\guilsinglleft}{%
12.894 \UseTextSymbol{OT1}{\guilsinglleft}}
12.895 \ProvideTextCommandDefault{\guilsinglright}{%

12.896 \UseTextSymbol{OT1}{\guilsinglright}}

54
12.11 Letters
\ij The dutch language uses the letter `ij'. It is available in T1 encoded fonts, but not
\IJ in the OT1 encoded fonts. Therefor we fake it for the OT1 encoding.
12.897 \DeclareTextCommand{\ij}{OT1}{%
12.898 \allowhyphens i\kern-0.02em j\allowhyphens}
12.899 \DeclareTextCommand{\IJ}{OT1}{%

12.900 \allowhyphens I\kern-0.02em J\allowhyphens}


12.901 \DeclareTextCommand{\ij}{T1}{\char188}

12.902 \DeclareTextCommand{\IJ}{T1}{\char156}

Make sure that when an encoding other than OT1 or T1 is used these glyphs can
still be typeset.
12.903 \ProvideTextCommandDefault{\ij}{%
12.904 \UseTextSymbol{OT1}{\ij}}
12.905 \ProvideTextCommandDefault{\IJ}{%

12.906 \UseTextSymbol{OT1}{\IJ}}

\dj The croatian language needs the letters \dj and \DJ; they are available in the T1
\DJ encoding, but not in the OT1 encoding by default.
Some code to construct these glyphs for the OT1 encoding was made available
to me by Stipcevic Mario, (stipcevic@olimp.irb.hr).
12.907 \def\crrtic@{\hrule height0.1ex width0.3em}
12.908 \def\crttic@{\hrule height0.1ex width0.33em}
12.909 %

12.910 \def\ddj@{%

12.911 \setbox0\hbox{d}\dimen@=\ht0
12.912 \advance\dimen@1ex
12.913 \dimen@.45\dimen@
12.914 \dimen@ii\expandafter\rem@pt\the\fontdimen\@ne\font\dimen@
12.915 \advance\dimen@ii.5ex
12.916 \leavevmode\rlap{\raise\dimen@\hbox{\kern\dimen@ii\vbox{\crrtic@}}}}
12.917 \def\DDJ@{%

12.918 \setbox0\hbox{D}\dimen@=.55\ht0
12.919 \dimen@ii\expandafter\rem@pt\the\fontdimen\@ne\font\dimen@
12.920 \advance\dimen@ii.15ex % correction for the dash position
12.921 \advance\dimen@ii-.15\fontdimen7\font % correction for cmtt font
12.922 \dimen\thr@@\expandafter\rem@pt\the\fontdimen7\font\dimen@
12.923 \leavevmode\rlap{\raise\dimen@\hbox{\kern\dimen@ii\vbox{\crttic@}}}}
12.924 %

12.925 \DeclareTextCommand{\dj}{OT1}{\ddj@ d}

12.926 \DeclareTextCommand{\DJ}{OT1}{\DDJ@ D}

Make sure that when an encoding other than OT1 or T1 is used these glyphs can
still be typeset.
12.927 \ProvideTextCommandDefault{\dj}{%
12.928 \UseTextSymbol{OT1}{\dj}}
12.929 \ProvideTextCommandDefault{\DJ}{%

12.930 \UseTextSymbol{OT1}{\DJ}}

\SS For the T1 encoding \SS is dened and selects a specic glyph from the font, but
for other encodings it is not available. Therefor we make it available here.
12.931 \DeclareTextCommand{\SS}{OT1}{SS}
12.932 \ProvideTextCommandDefault{\SS}{\UseTextSymbol{OT1}{\SS}}

55
12.12 Shorthands for quotation marks
Shorthands are provided for a number of dierent quotation marks, which make
them usable both outside and inside mathmode.

\glq The `german' single quotes.


\grq12.933 \ProvideTextCommand{\glq}{OT1}{%
12.934 \textormath{\quotesinglbase}{\mbox{\quotesinglbase}}}
12.935 \ProvideTextCommand{\glq}{T1}{%

12.936 \textormath{\quotesinglbase}{\mbox{\quotesinglbase}}}
12.937 \ProvideTextCommandDefault{\glq}{\UseTextSymbol{OT1}\glq}

The denition of \grq depends on the fontencoding. With T1 encoding no extra


kerning is needed.
12.938 \ProvideTextCommand{\grq}{T1}{%
12.939 \textormath{\textquoteleft}{\mbox{\textquoteleft}}}
12.940 \ProvideTextCommand{\grq}{OT1}{%

12.941 \save@sf@q{\kern-.0125em%
12.942 \textormath{\textquoteleft}{\mbox{\textquoteleft}}%
12.943 \kern.07em\relax}}
12.944 \ProvideTextCommandDefault{\grq}{\UseTextSymbol{OT1}\grq}

\glqq The `german' double quotes.


\grqq12.945 \ProvideTextCommand{\glqq}{OT1}{%
12.946 \textormath{\quotedblbase}{\mbox{\quotedblbase}}}
12.947 \ProvideTextCommand{\glqq}{T1}{%

12.948 \textormath{\quotedblbase}{\mbox{\quotedblbase}}}
12.949 \ProvideTextCommandDefault{\glqq}{\UseTextSymbol{OT1}\glqq}

The denition of \grqq depends on the fontencoding. With T1 encoding no extra


kerning is needed.
12.950 \ProvideTextCommand{\grqq}{T1}{%
12.951 \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}}
12.952 \ProvideTextCommand{\grqq}{OT1}{%

12.953 \save@sf@q{\kern-.07em%
12.954 \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}%
12.955 \kern.07em\relax}}
12.956 \ProvideTextCommandDefault{\grqq}{\UseTextSymbol{OT1}\grqq}

\flq The `french' single guillemets.


\frq12.957 \ProvideTextCommand{\flq}{OT1}{%
12.958 \textormath{\guilsinglleft}{\mbox{\guilsinglleft}}}
12.959 \ProvideTextCommand{\flq}{T1}{%

12.960 \textormath{\guilsinglleft}{\mbox{\guilsinglleft}}}
12.961 \ProvideTextCommandDefault{\flq}{\UseTextSymbol{OT1}\flq}

12.962 \ProvideTextCommand{\frq}{OT1}{%
12.963 \textormath{\guilsinglright}{\mbox{\guilsinglright}}}
12.964 \ProvideTextCommand{\frq}{T1}{%

12.965 \textormath{\guilsinglright}{\mbox{\guilsinglright}}}
12.966 \ProvideTextCommandDefault{\frq}{\UseTextSymbol{OT1}\frq}

\flqq The `french' double guillemets.


\frqq12.967 \ProvideTextCommand{\flqq}{OT1}{%
12.968 \textormath{\guillemotleft}{\mbox{\guillemotleft}}}

56
12.969 \ProvideTextCommand{\flqq}{T1}{%
12.970 \textormath{\guillemotleft}{\mbox{\guillemotleft}}}
12.971 \ProvideTextCommandDefault{\flqq}{\UseTextSymbol{OT1}\flqq}

12.972 \ProvideTextCommand{\frqq}{OT1}{%
12.973 \textormath{\guillemotright}{\mbox{\guillemotright}}}
12.974 \ProvideTextCommand{\frqq}{T1}{%

12.975 \textormath{\guillemotright}{\mbox{\guillemotright}}}
12.976 \ProvideTextCommandDefault{\frqq}{\UseTextSymbol{OT1}\frqq}

12.13 Umlauts and trema's


The command \" needs to have a dierent eect for dierent 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.

\umlauthigh To be able to provide both positions of \" we provide two commands to switch
\umlautlow the positioning, the default will be \umlauthigh (the normal positioning).
12.977 \def\umlauthigh{%
12.978 \def\bbl@umlauta##1{\leavevmode\bgroup%
12.979 \expandafter\accent\csname\f@encoding dqpos\endcsname
12.980 ##1\allowhyphens\egroup}%
12.981 \let\bbl@umlaute\bbl@umlauta}
12.982 \def\umlautlow{%

12.983 \def\bbl@umlauta{\protect\lower@umlaut}}
12.984 \def\umlautelow{%

12.985 \def\bbl@umlaute{\protect\lower@umlaut}}
12.986 \umlauthigh

\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 hdimen i register.
12.987 \expandafter\ifx\csname U@D\endcsname\relax
12.988 \csname newdimen\endcsname\U@D
12.989 \fi

The following code fools TEX's make_accent procedure about the current x-height
of the font to force another placement of the umlaut character.
12.990 \def\lower@umlaut#1{%
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.
12.991 \leavevmode\bgroup
12.992 \U@D 1ex%
Then we compute the new x-height in such a way that the umlaut character is
lowered to the base character. The value of .45ex depends on the METAFONT
parameters with which the fonts were built. (Just try out, which value will look
best.)
12.993 {\setbox\z@\hbox{%
12.994 \expandafter\char\csname\f@encoding dqpos\endcsname}%
12.995 \dimen@ -.45ex\advance\dimen@\ht\z@

57
If the new x-height is too low, it is not changed.
12.996 \ifdim 1ex<\dimen@ \fontdimen5\font\dimen@ \fi}%
Finally we call the \accent primitive, reset the old x-height and insert the base
character in the argument.
12.997 \expandafter\accent\csname\f@encoding dqpos\endcsname
12.998 \fontdimen5\font\U@D #1%
12.999 \egroup}

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 denitions override the ones that are provided when the pack-
age fontenc with option OT1 is used. Therefor these declarations are postponed
until the beginning of the document.
12.1000 \AtBeginDocument{%
12.1001 \DeclareTextCompositeCommand{\"}{OT1}{a}{\bbl@umlauta{a}}%
12.1002 \DeclareTextCompositeCommand{\"}{OT1}{e}{\bbl@umlaute{e}}%
12.1003 \DeclareTextCompositeCommand{\"}{OT1}{i}{\bbl@umlaute{\i}}%
12.1004 \DeclareTextCompositeCommand{\"}{OT1}{\i}{\bbl@umlaute{\i}}%
12.1005 \DeclareTextCompositeCommand{\"}{OT1}{o}{\bbl@umlauta{o}}%
12.1006 \DeclareTextCompositeCommand{\"}{OT1}{u}{\bbl@umlauta{u}}%
12.1007 \DeclareTextCompositeCommand{\"}{OT1}{A}{\bbl@umlauta{A}}%
12.1008 \DeclareTextCompositeCommand{\"}{OT1}{E}{\bbl@umlaute{E}}%
12.1009 \DeclareTextCompositeCommand{\"}{OT1}{I}{\bbl@umlaute{I}}%
12.1010 \DeclareTextCompositeCommand{\"}{OT1}{O}{\bbl@umlauta{O}}%
12.1011 \DeclareTextCompositeCommand{\"}{OT1}{U}{\bbl@umlauta{U}}%
12.1012 }

12.14 The redenition of the style commands


The rest of the code in this le 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 denition 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.
12.1013 {\def\format{lplain}
12.1014 \ifx\fmtname\format
12.1015 \else

12.1016 \def\format{LaTeX2e}
12.1017 \ifx\fmtname\format
12.1018 \else
12.1019 \aftergroup\endinput
12.1020 \fi
12.1021 \fi}

Now that we're sure that the code is seen by LATEX only, we have to nd out
what the main (primary) document style is because we want to redene some
macros. This is only necessary for releases of LATEX dated before December 1991.
Therefor this part of the code can optionally be included in babel.def by speci-
fying the docstrip option names.
12.1022 h∗namesi

58
The standard styles can be distinguished by checking whether some macros are
dened. In table 1 an overview is given of the macros that can be used for this
purpose.

article : both the \chapter and \opening macros are unde-


ned
report and book : the \chapter macro is dened and the \opening is
undened
letter : the \chapter macro is undened and the \opening
is dened

Table 1: How to determine the main document style

The macros that have to be redened for the report and book document styles
happen to be the same, so there is no need to distinguish between those two styles.

\doc@style First a parameter \doc@style is dened to identify the current document style.
This parameter might have been dened by a document style that already uses
macros instead of hard-wired texts, such as artikel1.sty [6], so the existence of
\doc@style is checked. If this macro is undened, i. e., if the document style is
unknown and could therefore contain hard-wired texts, \doc@style is dened to
the default value `0'.
12.1023 \ifx\@undefined\doc@style
12.1024 \def\doc@style{0}%
This parameter is dened in the following if construction (see table 1):
12.1025 \ifx\@undefined\opening
12.1026 \ifx\@undefined\chapter
12.1027 \def\doc@style{1}%
12.1028 \else
12.1029 \def\doc@style{2}%
12.1030 \fi
12.1031 \else
12.1032 \def\doc@style{3}%
12.1033 \fi%
12.1034 \fi%

12.14.1 Redenition of macros


Now here comes the real work: we start to redene things and replace hard-wired
texts by macros. These redenitions should be carried out conditionally, in case
it has already been done.
For the figure and table environments we have in all styles:
12.1035 \@ifundefined{figurename}{\def\fnum@figure{\figurename{} \thefigure}}{}
12.1036 \@ifundefined{tablename}{\def\fnum@table{\tablename{} \thetable}}{}
The rest of the macros have to be treated dierently for each style. When
\doc@style still has its default value nothing needs to be done.
12.1037 \ifcase \doc@style\relax
12.1038 \or

59
This means that babel.def is read after the article style, where no \chapter
and \opening commands are dened9 .
First we have the \tableofcontents, \listoffigures and \listoftables:
12.1039 \@ifundefined{contentsname}%
12.1040 {\def\tableofcontents{\section*{\contentsname\@mkboth
12.1041 {\uppercase{\contentsname}}{\uppercase{\contentsname}}}%
12.1042 \@starttoc{toc}}}{}
12.1043

12.1044 \@ifundefined{listfigurename}%
12.1045 {\def\listoffigures{\section*{\listfigurename\@mkboth
12.1046 {\uppercase{\listfigurename}}{\uppercase{\listfigurename}}}%
12.1047 \@starttoc{lof}}}{}
12.1048

12.1049 \@ifundefined{listtablename}%
12.1050 {\def\listoftables{\section*{\listtablename\@mkboth
12.1051 {\uppercase{\listtablename}}{\uppercase{\listtablename}}}%
12.1052 \@starttoc{lot}}}{}
Then the \thebibliography and \theindex environments.
12.1053 \@ifundefined{refname}%
12.1054 {\def\thebibliography#1{\section*{\refname
12.1055 \@mkboth{\uppercase{\refname}}{\uppercase{\refname}}}%
12.1056 \list{[\arabic{enumi}]}{\settowidth\labelwidth{[#1]}%
12.1057 \leftmargin\labelwidth
12.1058 \advance\leftmargin\labelsep
12.1059 \usecounter{enumi}}%
12.1060 \def\newblock{\hskip.11em plus.33em minus.07em}%
12.1061 \sloppy\clubpenalty4000\widowpenalty\clubpenalty
12.1062 \sfcode`\.=1000\relax}}{}
12.1063

12.1064 \@ifundefined{indexname}%
12.1065 {\def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi
12.1066 \columnseprule \z@
12.1067 \columnsep 35pt\twocolumn[\section*{\indexname}]%
12.1068 \@mkboth{\uppercase{\indexname}}{\uppercase{\indexname}}%
12.1069 \thispagestyle{plain}%
12.1070 \parskip\z@ plus.3pt\parindent\z@\let\item\@idxitem}}{}
The abstract environment:
12.1071 \@ifundefined{abstractname}%
12.1072 {\def\abstract{\if@twocolumn
12.1073 \section*{\abstractname}%
12.1074 \else \small
12.1075 \begin{center}%
12.1076 {\bf \abstractname\vspace{-.5em}\vspace{\z@}}%
12.1077 \end{center}%
12.1078 \quotation
12.1079 \fi}}{}
And last but not least, the macro \part:
12.1080 \@ifundefined{partname}%
12.1081 {\def\@part[#1]#2{\ifnum \c@secnumdepth >\m@ne

9A fact that was pointed out to me by Nico Poppelier and was already used in Piet van
Oostrum's document style option nl.

60
12.1082 \refstepcounter{part}%
12.1083 \addcontentsline{toc}{part}{\thepart
12.1084 \hspace{1em}#1}\else
12.1085 \addcontentsline{toc}{part}{#1}\fi
12.1086 {\parindent\z@ \raggedright
12.1087 \ifnum \c@secnumdepth >\m@ne
12.1088 \Large \bf \partname{} \thepart
12.1089 \par \nobreak
12.1090 \fi
12.1091 \huge \bf
12.1092 #2\markboth{}{}\par}%
12.1093 \nobreak
12.1094 \vskip 3ex\@afterheading}%
12.1095 }{}
This is all that needs to be done for the article style.
12.1096 \or
The next case is formed by the two styles book and report. Basically we have
to do the same as for the article style, except now we must also change the
\chapter command.
The tables of contents, gures and tables:
12.1097 \@ifundefined{contentsname}%
12.1098 {\def\tableofcontents{\@restonecolfalse
12.1099 \if@twocolumn\@restonecoltrue\onecolumn
12.1100 \fi\chapter*{\contentsname\@mkboth
12.1101 {\uppercase{\contentsname}}{\uppercase{\contentsname}}}%
12.1102 \@starttoc{toc}%
12.1103 \csname if@restonecol\endcsname\twocolumn
12.1104 \csname fi\endcsname}}{}
12.1105

12.1106 \@ifundefined{listfigurename}%
12.1107 {\def\listoffigures{\@restonecolfalse
12.1108 \if@twocolumn\@restonecoltrue\onecolumn
12.1109 \fi\chapter*{\listfigurename\@mkboth
12.1110 {\uppercase{\listfigurename}}{\uppercase{\listfigurename}}}%
12.1111 \@starttoc{lof}%
12.1112 \csname if@restonecol\endcsname\twocolumn
12.1113 \csname fi\endcsname}}{}
12.1114

12.1115 \@ifundefined{listtablename}%
12.1116 {\def\listoftables{\@restonecolfalse
12.1117 \if@twocolumn\@restonecoltrue\onecolumn
12.1118 \fi\chapter*{\listtablename\@mkboth
12.1119 {\uppercase{\listtablename}}{\uppercase{\listtablename}}}%
12.1120 \@starttoc{lot}%
12.1121 \csname if@restonecol\endcsname\twocolumn
12.1122 \csname fi\endcsname}}{}
Again, the bibliography and index environments; notice that in this case we
use \bibname instead of \refname as in the denitions for the article style. The
reason for this is that in the article document style the term `References' is used
in the denition of \thebibliography. In the report and book document styles
the term `Bibliography' is used.

61
12.1123 \@ifundefined{bibname}%
12.1124 {\def\thebibliography#1{\chapter*{\bibname
12.1125 \@mkboth{\uppercase{\bibname}}{\uppercase{\bibname}}}%
12.1126 \list{[\arabic{enumi}]}{\settowidth\labelwidth{[#1]}%
12.1127 \leftmargin\labelwidth \advance\leftmargin\labelsep
12.1128 \usecounter{enumi}}%
12.1129 \def\newblock{\hskip.11em plus.33em minus.07em}%
12.1130 \sloppy\clubpenalty4000\widowpenalty\clubpenalty
12.1131 \sfcode`\.=1000\relax}}{}
12.1132

12.1133 \@ifundefined{indexname}%
12.1134 {\def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi
12.1135 \columnseprule \z@
12.1136 \columnsep 35pt\twocolumn[\@makeschapterhead{\indexname}]%
12.1137 \@mkboth{\uppercase{\indexname}}{\uppercase{\indexname}}%
12.1138 \thispagestyle{plain}%
12.1139 \parskip\z@ plus.3pt\parindent\z@ \let\item\@idxitem}}{}
Here is the abstract environment:
12.1140 \@ifundefined{abstractname}%
12.1141 {\def\abstract{\titlepage
12.1142 \null\vfil
12.1143 \begin{center}%
12.1144 {\bf \abstractname}%
12.1145 \end{center}}}{}
And last but not least the \chapter, \appendix and \part macros.
12.1146 \@ifundefined{chaptername}{\def\@chapapp{\chaptername}}{}
12.1147 %

12.1148 \@ifundefined{appendixname}%

12.1149 {\def\appendix{\par
12.1150 \setcounter{chapter}{0}%
12.1151 \setcounter{section}{0}%
12.1152 \def\@chapapp{\appendixname}%
12.1153 \def\thechapter{\Alph{chapter}}}}{}
12.1154 %

12.1155 \@ifundefined{partname}%

12.1156 {\def\@part[#1]#2{\ifnum \c@secnumdepth >-2\relax


12.1157 \refstepcounter{part}%
12.1158 \addcontentsline{toc}{part}{\thepart
12.1159 \hspace{1em}#1}\else
12.1160 \addcontentsline{toc}{part}{#1}\fi
12.1161 \markboth{}{}%
12.1162 {\centering
12.1163 \ifnum \c@secnumdepth >-2\relax
12.1164 \huge\bf \partname{} \thepart
12.1165 \par
12.1166 \vskip 20pt \fi
12.1167 \Huge \bf
12.1168 #1\par}\@endpart}}{}%
12.1169 \or
Now we address the case where babel.def is read after the letter style.
The letter document style denes the macro \opening and some other macros

62
that are specic to letter. This means that we have to redene 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.
12.1170 \@ifundefined{ccname}%
12.1171 {\def\cc#1{\par\noindent
12.1172 \parbox[t]{\textwidth}%
12.1173 {\@hangfrom{\rm \ccname : }\ignorespaces #1\strut}\par}}{}
12.1174

12.1175 \@ifundefined{enclname}%
12.1176 {\def\encl#1{\par\noindent
12.1177 \parbox[t]{\textwidth}%
12.1178 {\@hangfrom{\rm \enclname : }\ignorespaces #1\strut}\par}}{}
The last thing we have to do here is to redene the headings pagestyle:
12.1179 \@ifundefined{headtoname}%
12.1180 {\def\ps@headings{%
12.1181 \def\@oddhead{\sl \headtoname{} \ignorespaces\toname \hfil
12.1182 \@date \hfil \pagename{} \thepage}%
12.1183 \def\@oddfoot{}}}{}
This was the last of the four standard document styles, so if \doc@style has
another value we do nothing and just close the if construction.
12.1184 \fi
Here ends the code that can be optionally included when a version of LATEX is in
use that is dated before December 1991.
12.1185 h/namesi
12.1186 h/corei

12.15 Cross referencing macros


The LATEX book states:

The key argument is any sequence of letters, digits, and punctuation


symbols; upper- and lowercase letters are regarded as dierent.

When the above quote should still be true when a document is typeset in a lan-
guage 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 referenc-
ing 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 TEXbook [1] (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 dened as `\def\A#1{\B}' expands to the characters `macro:#1->\B' with
all category codes set to `other' or `space'.

\bbl@redefine To redene a command, we save the old meaning of the macro. Then we redene
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 redene the LATEX macros completely in case
their denitions change (they have changed in the past).

63
Because we need to redene a number of commands we dene the command
\bbl@redefine which takes care of this. It creates a new control sequence,
\org@...
12.1187 h∗core | shorthandsi
12.1188 \def\bbl@redefine#1{%
12.1189 \edef\bbl@tempa{\expandafter\@gobble\string#1}%
12.1190 \expandafter\let\csname org@\bbl@tempa\endcsname#1
12.1191 \expandafter\def\csname\bbl@tempa\endcsname}
This command should only be used in the preamble of the document.
12.1192 \@onlypreamble\bbl@redefine

\bbl@redefine@long This version of \babel@redefine can be used to redene \long commands such
as \ifthenelse.
12.1193 \def\bbl@redefine@long#1{%
12.1194 \edef\bbl@tempa{\expandafter\@gobble\string#1}%
12.1195 \expandafter\let\csname org@\bbl@tempa\endcsname#1
12.1196 \expandafter\long\expandafter\def\csname\bbl@tempa\endcsname}
12.1197 \@onlypreamble\bbl@redefine@long

\bbl@redefinerobust For commands that are redened, but which might be robust we need a slightly
more intelligent macro. A robust command foo is dened to expand to
\protect\foo . So it is necessary to check whether \foo exists.
12.1198 \def\bbl@redefinerobust#1{%
12.1199 \edef\bbl@tempa{\expandafter\@gobble\string#1}%
12.1200 \expandafter\ifx\csname \bbl@tempa\space\endcsname\relax
12.1201 \expandafter\let\csname org@\bbl@tempa\endcsname#1
12.1202 \expandafter\edef\csname\bbl@tempa\endcsname{\noexpand\protect
12.1203 \expandafter\noexpand\csname\bbl@tempa\space\endcsname}%
12.1204 \else
12.1205 \expandafter\let\csname org@\bbl@tempa\expandafter\endcsname
12.1206 \csname\bbl@tempa\space\endcsname
12.1207 \fi
The result of the code above is that the command that is being redened is always
robust afterwards. Therefor all we need to do now is dene \foo .
12.1208 \expandafter\def\csname\bbl@tempa\space\endcsname}
This command should only be used in the preamble of the document.
12.1209 \@onlypreamble\bbl@redefinerobust

\newlabel The macro \label writes a line with a \newlabel command into the .aux le to
dene labels.
12.1210 %\bbl@redefine\newlabel#1#2{%
12.1211 % \@safe@activestrue\org@newlabel{#1}{#2}\@safe@activesfalse}

\@newl@bel We need to change the denition of the LATEX-internal macro \@newl@bel. This
is needed because we need to make sure that shorthand characters expand to their
non-active version.
12.1212 \def\@newl@bel#1#2#3{%
First we open a new group to keep the changed setting of \protect local and then
we set the @safe@actives switch to true to make sure that any shorthand that
appears in any of the arguments immediately expands to its non-active self.

64
12.1213 {%
12.1214 \@safe@activestrue
12.1215 \@ifundefined{#1@#2}%
12.1216 \relax
12.1217 {%
12.1218 \gdef \@multiplelabels {%
12.1219 \@latex@warning@no@line{There were multiply-defined labels}}%
12.1220 \@latex@warning@no@line{Label `#2' multiply defined}%
12.1221 }%
12.1222 \global\@namedef{#1@#2}{#3}%
12.1223 }%
12.1224 }

\@testdef An internal LATEX macro used to test if the labels that have been written on the
.aux le 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 dier. Therefor LATEX keeps reporting that the labels may have
changed.
12.1225 \CheckCommand*\@testdef[3]{%
12.1226 \def\reserved@a{#3}%
12.1227 \expandafter \ifx \csname #1@#2\endcsname \reserved@a
12.1228 \else
12.1229 \@tempswatrue
12.1230 \fi}
Now that we made sure that \@testdef still has the same denition we can rewrite
it. First we make the shorthands `safe'.
12.1231 \def\@testdef #1#2#3{%
12.1232 \@safe@activestrue
Then we use \bbl@tempa as an `alias' for the macro that contains the label which
is being checked.
12.1233 \expandafter\let\expandafter\bbl@tempa\csname #1@#2\endcsname
Then we dene \bbl@tempb just as \@newl@bel does it.
12.1234 \def\bbl@tempb{#3}%
12.1235 \@safe@activesfalse
When the label is dened we replace the denition of \bbl@tempa by its meaning.
12.1236 \ifx\bbl@tempa\relax
12.1237 \else
12.1238 \edef\bbl@tempa{\expandafter\strip@prefix\meaning\bbl@tempa}%
12.1239 \fi
We do the same for \bbl@tempb.
12.1240 \edef\bbl@tempb{\expandafter\strip@prefix\meaning\bbl@tempb}%
If the label didn't change, \bbl@tempa and \bbl@tempb should be identical macros.
12.1241 \ifx \bbl@tempa \bbl@tempb
12.1242 \else
12.1243 \@tempswatrue
12.1244 \fi}

\ref The same holds for the macro \ref that references a label and \pageref to refer-
\pageref ence a page. So we redene \ref and \pageref. While we change these macros,

65
we make them robust as well (if they weren't already) to prevent problems if they
should become expanded at the wrong moment.
12.1245 \bbl@redefinerobust\ref#1{%
12.1246 \@safe@activestrue\org@ref{#1}\@safe@activesfalse}
12.1247 \bbl@redefinerobust\pageref#1{%

12.1248 \@safe@activestrue\org@pageref{#1}\@safe@activesfalse}

\@citex The macro used to cite from a bibliography, \cite, uses an internal macro,
\@citex. It is this internal macro that picks up the argument(s), so we rede-
ne this internal macro and leave \cite alone. The rst argument is used for
typesetting, so the shorthands need only be deactivated in the second argument.
12.1249 \bbl@redefine\@citex[#1]#2{%
12.1250 \@safe@activestrue\edef\@tempa{#2}\@safe@activesfalse
12.1251 \org@@citex[#1]{\@tempa}}
Unfortunately, the packages natbib and cite need a dierent denition of
\@citex... To begin with, natbib has a denition for \@citex with three ar-
guments... We only know that a package is loaded when \begin{document} is
executed, so we need to postpone the dierent redenition.
12.1252 \AtBeginDocument{%
12.1253 \@ifpackageloaded{natbib}{%
Notice that we use \def here instead of \bbl@redefine because \org@@citex is
already dened and we don't want to overwrite that denition (it would result in
parameter stack overow because of a circular denition).
12.1254 \def\@citex[#1][#2]#3{%
12.1255 \@safe@activestrue\edef\@tempa{#3}\@safe@activesfalse
12.1256 \org@@citex[#1][#2]{\@tempa}}%
12.1257 }{}}
The package cite has a denition of \@citex where the shorthands need to be
turned o in both arguments.
12.1258 \AtBeginDocument{%
12.1259 \@ifpackageloaded{cite}{%
12.1260 \def\@citex[#1]#2{%
12.1261 \@safe@activestrue\org@@citex[#1]{#2}\@safe@activesfalse}%
12.1262 }{}}

\nocite The macro \nocite which is used to instruct BiBTEX to extract uncited references
from the database.
12.1263 \bbl@redefine\nocite#1{%
12.1264 \@safe@activestrue\org@nocite{#1}\@safe@activesfalse}

\bibcite The macro that is used in the .aux le to dene citation labels. When packages
such as natbib or cite are not loaded its second argument is used to typeset the
citation label. In that case, this second argument can contain active characters
but is used in an environment where \@safe@activestrue is in eect. This switch
needs to be reset inside the \hbox which contains the citation label. In order to
determine during .aux le processing which denition of \bibcite is needed we
dene \bibcite in such a way that it redenes itself with the proper denition.
12.1265 \bbl@redefine\bibcite{%

66
We call \bbl@cite@choice to select the proper denition for \bibcite. This new
denition is then activated.
12.1266 \bbl@cite@choice
12.1267 \bibcite}

\bbl@bibcite The macro \bbl@bibcite holds the denition of \bibcite needed when neither
natbib nor cite is loaded.
12.1268 \def\bbl@bibcite#1#2{%
12.1269 \org@bibcite{#1}{\@safe@activesfalse#2}}

\bbl@cite@choice The macro \bbl@cite@choice determines which denition of \bibcite is needed.


12.1270 \def\bbl@cite@choice{%
First we give \bibcite its default denition.
12.1271 \global\let\bibcite\bbl@bibcite
Then, when natbib is loaded we restore the original denition of \bibcite .
12.1272 \@ifpackageloaded{natbib}{\global\let\bibcite\org@bibcite}{}%
For cite we do the same.
12.1273 \@ifpackageloaded{cite}{\global\let\bibcite\org@bibcite}{}%
Make sure this only happens once.
12.1274 \global\let\bbl@cite@choice\relax
12.1275 }
When a document is run for the rst time, no .aux le is available, and
\bibcite will not yet be properly dened. In this case, this has to happen before
the document starts.
12.1276 \AtBeginDocument{\bbl@cite@choice}

\@bibitem One of the two internal LATEX macros called by \bibitem that write the citation
label on the .aux le.
12.1277 \bbl@redefine\@bibitem#1{%
12.1278 \@safe@activestrue\org@@bibitem{#1}\@safe@activesfalse}

12.16 marks
\markright Because the output routine is asynchronous, we must pass the current language
attribute to the head lines, together with the text that is put into them. To achieve
this we need to adapt the denition of \markright and \markboth somewhat.
12.1279 \bbl@redefine\markright#1{%
First of all we temporarily store the language switching command, using an ex-
panded denition in order to get the current value of \languagename.
12.1280 \edef\bbl@tempb{\noexpand\protect
12.1281 \noexpand\foreignlanguage{\languagename}}%
Then, we check whether the argument is empty; if it is, we just make sure the
scratch token register is empty.
12.1282 \def\bbl@arg{#1}%
12.1283 \ifx\bbl@arg\@empty
12.1284 \toks@{}%
12.1285 \else

67
Next, we store the argument to \markright in the scratch token register, together
with the expansion of \bbl@tempb (containing the language switching command)
as dened before. This way these commands will not be expanded by using \edef
later on, and we make sure that the text is typeset using the correct language set-
tings. While doing so, we make sure that active characters that may end up in the
mark are not disabled by the output routine kicking in while \@safe@activestrue
is in eect.
12.1286 \expandafter\toks@\expandafter{%
12.1287 \bbl@tempb{\protect\bbl@restore@actives#1}}%
12.1288 \fi
Then we dene a temporary control sequence using \edef.
12.1289 \edef\bbl@tempa{%
When \bbl@tempa is executed, only \languagename will be expanded, because of
the way the token register was lled.
12.1290 \noexpand\org@markright{\the\toks@}}%
12.1291 \bbl@tempa
12.1292 }

\markboth The denition of \markboth is equivalent to that of \markright, except that we


\@mkboth need two token registers. The documentclasses report and book dene and set
the headings for the page. While doing so they also store a copy of \markboth in
\@mkboth. Therefor we need to check whether \@mkboth has already been set. If
so we neeed to do that again with the new denition of \makrboth.
12.1293 \ifx\@mkboth\markboth
12.1294 \def\bbl@tempc{\let\@mkboth\markboth}
12.1295 \else

12.1296 \def\bbl@tempc{}
12.1297 \fi

Now we can start the new denition of \markboth


12.1298 \bbl@redefine\markboth#1#2{%
12.1299 \edef\bbl@tempb{\noexpand\protect
12.1300 \noexpand\foreignlanguage{\languagename}}%
12.1301 \def\bbl@arg{#1}%
12.1302 \ifx\bbl@arg\@empty
12.1303 \toks@{}%
12.1304 \else
12.1305 \expandafter\toks@\expandafter{%
12.1306 \bbl@tempb{\protect\bbl@restore@actives#1}}%
12.1307 \fi
12.1308 \def\bbl@arg{#2}%
12.1309 \ifx\bbl@arg\@empty
12.1310 \toks8{}%
12.1311 \else
12.1312 \expandafter\toks8\expandafter{%
12.1313 \bbl@tempb{\protect\bbl@restore@actives#2}}%
12.1314 \fi
12.1315 \edef\bbl@tempa{%
12.1316 \noexpand\org@markboth{\the\toks@}{\the\toks8}}%
12.1317 \bbl@tempa
12.1318 }

68
and copy it to \@mkboth if necesary.
12.1319 \bbl@tempc
12.1320 h/core | shorthandsi

12.17 Encoding issues (part 2)


\TeX Because documents may use font encodings other than one of the latin encodings,
\LaTeX we make sure that the logos of TEX and LATEX always come out in the right
encoding.
12.1321 h∗corei
12.1322 \bbl@redefine\TeX{\textlatin{\org@TeX}}
12.1323 \bbl@redefine\LaTeX{\textlatin{\org@LaTeX}}

12.1324 h/corei

12.18 Preventing clashes with other packages


12.18.1 ifthen
\ifthenelse Sometimes a document writer wants to create a special eect depending on the
page a certain fragment of text appears on. This can be achieved by the following
piece of code:
\ifthenelse{\isodd{\pageref{some:label}}}
{code for odd pages}
{code for even pages}

In order for this to work the argument of \isodd needs to be fully expandable.
With the above redenition of \pageref it is not in the case of this example. To
overcome that, we add some code to the denition of \ifthenelse to make things
work.
The rst thing we need to do is check if the package ifthen is loaded. This
should be done at \begin{document} time.
12.1325 h∗packagei
12.1326 \AtBeginDocument{%
12.1327 \@ifpackageloaded{ifthen}{%
Then we can redene \ifthenelse:
12.1328 \bbl@redefine@long\ifthenelse#1#2#3{%
We want to revert the denition of \pageref to its original denition for the
duration of \ifthenelse, so we rst need to store its current meaning.
12.1329 \let\bbl@tempa\pageref
12.1330 \let\pageref\org@pageref
Then we can set the \@safe@actives switch and call the original \ifthenelse.
In order to be able to use shorthands in the second and third arguments of
\ifthenelse the resetting of the switch and the denition of \pageref happens
inside those arguments.
12.1331 \@safe@activestrue
12.1332 \org@ifthenelse{#1}{%
12.1333 \let\pageref\bbl@tempa
12.1334 \@safe@activesfalse
12.1335 #2}{%

69
12.1336 \let\pageref\bbl@tempa
12.1337 \@safe@activesfalse
12.1338 #3}%
12.1339 }%
When the package wasn't loaded we do nothing.
12.1340 }{}%
12.1341 }

12.18.2 varioref
\@@vpageref When the package varioref is in use we need to modify its internal command
\vrefpagenum \@@vpageref in order to prevent problems when an active character ends up in
\Ref the argument of \vref.
12.1342 \AtBeginDocument{%
12.1343 \@ifpackageloaded{varioref}{%
12.1344 \bbl@redefine\@@vpageref#1[#2]#3{%
12.1345 \@safe@activestrue
12.1346 \org@@@vpageref{#1}[#2]{#3}%
12.1347 \@safe@activesfalse}%
The same needs to happen for \vrefpagenum.
12.1348 \bbl@redefine\vrefpagenum#1#2{%
12.1349 \@safe@activestrue
12.1350 \org@vrefpagenum{#1}{#2}%
12.1351 \@safe@activesfalse}%
The package varioref denes \Ref to be a robust command wich uppercases
the rst character of the reference text. In order to be able to do that it needs
to access the exandable form of \ref. So we employ a little trick here. We
redene the (internal) command \Ref to call \org@ref instead of \ref. The
disadvantgage of this solution is that whenever the dernition of \Ref changes,
this denition needs to be updated as well.
12.1352 \expandafter\def\csname Ref \endcsname#1{%
12.1353 \protected@edef\@tempa{\org@ref{#1}}\expandafter\MakeUppercase\@tempa}
12.1354 }{}%
12.1355 }

12.18.3 hhline
\hhline Delaying the activation of the shorthand characters has introduced a problem with
the hhline package. The reason is that it uses the `:' character which is made
active by the french support in babel. Therefor we need to reload the package
when the `:' is an active character.
So at \begin{document} we check whether hhline is loaded.
12.1356 \AtBeginDocument{%
12.1357 \@ifpackageloaded{hhline}%
Then we check whether the expansion of \normal@char: is not equal to \relax.
12.1358 {\expandafter\ifx\csname normal@char\string:\endcsname\relax
12.1359 \else
In that case we simply reload the package. Note that this happens after the
category code of the @-sign has been changed to other, so we need to temporarily
change it to letter again.

70
12.1360 \makeatletter
12.1361 \def\@currname{hhline}\input{hhline.sty}\makeatother
12.1362 \fi}%
12.1363 {}}

12.18.4 hyperref
\pdfstringdefDisableCommands Although a number of interworking problems between babel and hyperref are
tackled by hyperref itself we need to take care of correctly handling the shorthand
characters. When they get expanded inside a bookmark a warning will appear in
the log le which can be prevented. This is done by informing hyperref that it
should the shorthands as dened on the system level rather than at the user level.
12.1364 \AtBeginDocument{%
12.1365 \@ifundefined{pdfstringdefDisableCommands}%
12.1366 {}%
12.1367 {\pdfstringdefDisableCommands{%
12.1368 \languageshorthands{system}}%
12.1369 }%
12.1370 }

12.18.5 General
\FOREIGNLANGUAGE The package fancyhdr treats the running head and fout lines somewhat dif-
ferently as the standard classes. A symptom of this is that the command
\foreignlanguage which babel adds to the marks can end up inside the ar-
gument of \MakeUppercase. To prevent unexpected results we need to dene
\FOREIGNLANGUAGE here.
12.1371 \DeclareRobustCommand{\FOREIGNLANGUAGE}[1]{%
12.1372 \lowercase{\foreignlanguage{#1}}}
12.1373 h/packagei

\nfss@catcodes LATEX's font selection scheme sometimes wants to read font denition les in the
middle of processing the document. In order to guard against any characters
having the wrong \catcodes it always calls \nfss@catcodes before loading a le.
Unfortunately, the characters " and ' are not dealt with. Therefor we have to add
them until LATEX does that herself.
12.1374 h∗core | shorthandsi
12.1375 \ifx\nfss@catcodes\@undefined
12.1376 \else

12.1377 \addto\nfss@catcodes{%
12.1378 \@makeother\'%
12.1379 \@makeother\"%
12.1380 }
12.1381 \fi

12.1382 h/core | shorthandsi

13 Local Language Conguration


\loadlocalcfg At some sites it may be necessary to add site-specic actions to a language deni-
tion le. This can be done by creating a le with the same name as the language

71
denition le, but with the extension .cfg. For instance the le norsk.cfg will
be loaded when the language denition le norsk.ldf is loaded.
13.1 h∗corei
For plain-based formats we don't want to override the denition of \loadlocalcfg
from plain.def.
13.2 \ifx\loadlocalcfg\@undefined
13.3 \def\loadlocalcfg#1{%
13.4 \InputIfFileExists{#1.cfg}
13.5 {\typeout{*************************************^^J%
13.6 * Local config file #1.cfg used^^J%
13.7 *}%
13.8 }
13.9 {}}
13.10 \fi

Just to be compatible with LATEX 2.09 we add a few more lines of code:
13.11 \ifx\@unexpandable@protect\@undefined
13.12 \def\@unexpandable@protect{\noexpand\protect\noexpand}
13.13 \long\def \protected@write#1#2#3{%
13.14 \begingroup
13.15 \let\thepage\relax
13.16 #2%
13.17 \let\protect\@unexpandable@protect
13.18 \edef\reserved@a{\write#1{#3}}%
13.19 \reserved@a
13.20 \endgroup
13.21 \if@nobreak\ifvmode\nobreak\fi\fi
13.22 }
13.23 \fi

13.24 h/corei

72
14 Driver les for the documented source code
Since babel version 3.4 all source les that are part of the babel system can be
typeset separately. But to typeset them all in one document, the le 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-specic les, you can run the le
user.drv through LATEX to get a user guide.
14.1 h∗driveri
14.2 \documentclass{ltxdoc}
14.3 \usepackage{url,t1enc,supertabular}

14.4 \usepackage[icelandic,english]{babel}

14.5 \DoNotIndex{\!,\',\,,\.,\-,\:,\;,\?,\/,\^,\`,\@M}

14.6 \DoNotIndex{\@,\@ne,\@m,\@afterheading,\@date,\@endpart}

14.7 \DoNotIndex{\@hangfrom,\@idxitem,\@makeschapterhead,\@mkboth}

14.8 \DoNotIndex{\@oddfoot,\@oddhead,\@restonecolfalse,\@restonecoltrue}

14.9 \DoNotIndex{\@starttoc,\@unused}

14.10 \DoNotIndex{\accent,\active}

14.11 \DoNotIndex{\addcontentsline,\advance,\Alph,\arabic}

14.12 \DoNotIndex{\baselineskip,\begin,\begingroup,\bf,\box,\c@secnumdepth}

14.13 \DoNotIndex{\catcode,\centering,\char,\chardef,\clubpenalty}

14.14 \DoNotIndex{\columnsep,\columnseprule,\crcr,\csname}

14.15 \DoNotIndex{\day,\def,\dimen,\discretionary,\divide,\dp,\do}

14.16 \DoNotIndex{\edef,\else,\@empty,\end,\endgroup,\endcsname,\endinput}

14.17 \DoNotIndex{\errhelp,\errmessage,\expandafter,\fi,\filedate}

14.18 \DoNotIndex{\fileversion,\fmtname,\fnum@figure,\fnum@table,\fontdimen}

14.19 \DoNotIndex{\gdef,\global}

14.20 \DoNotIndex{\hbox,\hidewidth,\hfil,\hskip,\hspace,\ht,\Huge,\huge}

14.21 \DoNotIndex{\ialign,\if@twocolumn,\ifcase,\ifcat,\ifhmode,\ifmmode}

14.22 \DoNotIndex{\ifnum,\ifx,\immediate,\ignorespaces,\input,\item}

14.23 \DoNotIndex{\kern}

14.24 \DoNotIndex{\labelsep,\Large,\large,\labelwidth,\lccode,\leftmargin}

14.25 \DoNotIndex{\lineskip,\leavevmode,\let,\list,\ll,\long,\lower}

14.26 \DoNotIndex{\m@ne,\mathchar,\mathaccent,\markboth,\month,\multiply}

14.27 \DoNotIndex{\newblock,\newbox,\newcount,\newdimen,\newif,\newwrite}

14.28 \DoNotIndex{\nobreak,\noexpand,\noindent,\null,\number}

14.29 \DoNotIndex{\onecolumn,\or}

14.30 \DoNotIndex{\p@,par, \parbox,\parindent,\parskip,\penalty}

14.31 \DoNotIndex{\protect,\ps@headings}

14.32 \DoNotIndex{\quotation}

14.33 \DoNotIndex{\raggedright,\raise,\refstepcounter,\relax,\rm,\setbox}

14.34 \DoNotIndex{\section,\setcounter,\settowidth,\scriptscriptstyle}

14.35 \DoNotIndex{\sfcode,\sl,\sloppy,\small,\space,\spacefactor,\strut}

14.36 \DoNotIndex{\string}

14.37 \DoNotIndex{\textwidth,\the,\thechapter,\thefigure,\thepage,\thepart}

14.38 \DoNotIndex{\thetable,\thispagestyle,\titlepage,\tracingmacros}

14.39 \DoNotIndex{\tw@,\twocolumn,\typeout,\uppercase,\usecounter}

14.40 \DoNotIndex{\vbox,\vfil,\vskip,\vspace,\vss}

14.41 \DoNotIndex{\widowpenalty,\write,\xdef,\year,\z@,\z@skip}

Here \dlqq is dened so that an example of "' can be given.


14.42 \makeatletter
14.43 \gdef\dlqq{{\setbox\tw@=\hbox{,}\setbox\z@=\hbox{''}%
14.44 \dimen\z@=\ht\z@ \advance\dimen\z@-\ht\tw@
14.45 \setbox\z@=\hbox{\lower\dimen\z@\box\z@}\ht\z@=\ht\tw@

73
14.46 \dp\z@=\dp\tw@ \box\z@\kern-.04em}}
The code lines are numbered within sections,
14.47 h∗!useri
14.48 \@addtoreset{CodelineNo}{section}
14.49 \renewcommand\theCodelineNo{%

14.50 \reset@font\scriptsize\thesection.\arabic{CodelineNo}}
which should also be visible in the index; hence this redenition of a macro from
doc.sty.
14.51 \renewcommand\codeline@wrindex[1]{\if@filesw
14.52 \immediate\write\@indexfile
14.53 {\string\indexentry{#1}%
14.54 {\number\c@section.\number\c@CodelineNo}}\fi}
The glossary environment is used or the change log, but its denition needs
changing for this document.
14.55 \renewenvironment{theglossary}{%
14.56 \glossary@prologue%
14.57 \GlossaryParms \let\item\@idxitem \ignorespaces}%
14.58 {}
14.59 h/!useri

14.60 \makeatother

A few shorthands used in the documentation


14.61 \font\manual=logo10 % font used for the METAFONT logo, etc.
14.62 \newcommand*\MF{{\manual META}\-{\manual FONT}}

14.63 \newcommand*\TeXhax{\TeX hax}

14.64 \newcommand*\babel{\textsf{babel}}

14.65 \newcommand*\Babel{\textsf{Babel}}

14.66 \newcommand*\m[1]{\mbox{$\langle$\it#1\/$\rangle$}}

14.67 \newcommand*\langvar{\m{lang}}

Some more denitions needed in the documentation.


14.68 %\newcommand*\note[1]{\textbf{#1}}
14.69 \newcommand*\note[1]{}

14.70 \newcommand*\bsl{\protect\bslash}

14.71 \newcommand*\Lopt[1]{\textsf{#1}}

14.72 \newcommand*\Lenv[1]{\textsf{#1}}

14.73 \newcommand*\file[1]{\texttt{#1}}

14.74 \newcommand*\cls[1]{\texttt{#1}}

14.75 \newcommand*\pkg[1]{\texttt{#1}}

14.76 \newcommand*\langdeffile[1]{%

14.77 h−useri \clearpage


14.78 \DocInput{#1}}
When a full index should be generated uncomment the line with \EnableCrossrefs.
Beware, processing may take some time. Use \DisableCrossrefs when the index
is ready.
14.79 % \EnableCrossrefs
14.80 \DisableCrossrefs
Inlude the change log.
14.81 h−useri\RecordChanges
The index should use the linenumbers of the code.
14.82 h−useri\CodelineIndex

74
Set everything in \MacroFont instead of \AltMacroFont
14.83 \setcounter{StandardModuleDepth}{1}
For the user guide we only want the description parts of all the les.
14.84 h+useri\OnlyDescription
Here starts the document
14.85 \begin{document}
14.86 \DocInput{babel.dtx}
All the language denition les.
14.87 h+useri\clearpage
14.88 \langdeffile{esperanto.dtx}

14.89 \langdeffile{interlingua.dtx}

14.90 %

14.91 \langdeffile{dutch.dtx}

14.92 \langdeffile{english.dtx}

14.93 \langdeffile{germanb.dtx}

14.94 \langdeffile{ngermanb.dtx}

14.95 %

14.96 \langdeffile{breton.dtx}

14.97 \langdeffile{welsh.dtx}

14.98 \langdeffile{irish.dtx}

14.99 \langdeffile{scottish.dtx}

14.100 %

14.101 \langdeffile{greek.dtx}

14.102 %

14.103 \langdeffile{frenchb.dtx}

14.104 \langdeffile{italian.dtx}

14.105 \langdeffile{latin.dtx}

14.106 \langdeffile{portuges.dtx}

14.107 \langdeffile{spanish.dtx}

14.108 \langdeffile{catalan.dtx}

14.109 \langdeffile{galician.dtx}

14.110 \langdeffile{basque.dtx}

14.111 \langdeffile{romanian.dtx}

14.112 %

14.113 \langdeffile{danish.dtx}

14.114 \langdeffile{icelandic.dtx}

14.115 \langdeffile{norsk.dtx}

14.116 \langdeffile{swedish.dtx}

14.117 \langdeffile{samin.dtx}

14.118 %

14.119 \langdeffile{finnish.dtx}

14.120 \langdeffile{magyar.dtx}

14.121 \langdeffile{estonian.dtx}

14.122 %

14.123 \langdeffile{albanian.dtx}

14.124 \langdeffile{croatian.dtx}

14.125 \langdeffile{czech.dtx}

14.126 \langdeffile{polish.dtx}

14.127 \langdeffile{serbian.dtx}

14.128 \langdeffile{slovak.dtx}

14.129 \langdeffile{slovene.dtx}

14.130 \langdeffile{russianb.dtx}

75
14.131 \langdeffile{bulgarian.dtx}
14.132 \langdeffile{ukraineb.dtx}
14.133 %

14.134 \langdeffile{lsorbian.dtx}

14.135 \langdeffile{usorbian.dtx}

14.136 \langdeffile{turkish.dtx}

14.137 %

14.138 \langdeffile{hebrew.dtx}

14.139 \DocInput{hebinp.dtx}

14.140 \DocInput{hebrew.fdd}

14.141 \DocInput{heb209.dtx}

14.142 \langdeffile{bahasa.dtx}

14.143 \langdeffile{bahasam.dtx}

14.144 %\langdeffile{sanskrit.dtx}

14.145 %\langdeffile{kannada.dtx}

14.146 %\langdeffile{nagari.dtx}

14.147 %\langdeffile{tamil.dtx}

14.148 \clearpage

14.149 \DocInput{bbplain.dtx}

Finally print the index and change log (not for the user guide).
14.150 h∗!useri
14.151 \clearpage
14.152 \def\filename{index}

14.153 \PrintIndex

14.154 \clearpage

14.155 \def\filename{changes}

14.156 \PrintChanges

14.157 h/!useri

14.158 \end{document}

14.159 h/driveri

76
15 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 oer the possibility of switching between languages in one
document. The basic interface consists of using one option, which is the same for
all standard document classes.
In some cases the language denition les provide macros that can be useful to
plain TEX users as well as to LATEX users. The babel system has been implemented
so that it can be used by both groups of users.

16 Acknowledgements
I would like to thank all who volunteered as β -testers for their time. I would like to
mention Julio Sanchez who supplied the option le for the Spanish language and
Maurizio Codogno who supplied the option le for the Italian language. Michel
Goossens supplied contributions for most of the other languages. Nico Poppelier
helped polish the text of the documentation and supplied parts of the macros for
the Dutch language. Paul Wackers and Werenfried Spit helped nd and repair
bugs.
During the further development of the babel system I received much help from
Bernd Raichle, for which I am grateful.

References
[1] Donald E. Knuth, The TEXbook, Addison-Wesley, 1986.

[2] Leslie Lamport, A


L TEX, A document preparation System, Addison-Wesley,
1986.

[3] K.F. Treebus. Tekstwijzer, een gids voor het grasch verwerken van tekst. SDU
Uitgeverij ('s-Gravenhage, 1988). A Dutch book on layout design and typog-
raphy.

[4] Hubert Partl, German TEX, TUGboat 9 (1988) #1, p. 7072.

[5] Leslie Lamport, in: TEXhax Digest, Volume 89, #13, 17 February 1989.

[6] Johannes Braams, Victor Eijkhout and Nico Poppelier, The development of
ATEX styles, TUGboat 10 (1989) #3, p. 401406.
national L

[7] Joachim Schrod, A


International L TEX is ready to use, TUGboat 11 (1990) #1,
p. 8790.

77
17 The Esperanto language
The le esperanto.dtx10 denes all the language-specic macros for the Es-
peranto language.
For this language the character ^ is made active. In table 2 an overview is
given of its purpose.

^c gives c with hyphenation in the rest of the word al-


lowed, this works for c, C, g, G, H, J, s, S, z, Z
^h prevents h  from becoming too tall
^j gives 
^u gives u , with hyphenation in the rest of the word
allowed
^U gives U, with hyphenation in the rest of the word
allowed
^| inserts a \discretionary{-}{}{}

Table 2: The functions of the active character for Esperanto.

The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
17.1 h∗codei
17.2 \LdfInit{esperanto}\captionsesperanto
When this le is read as an option, i.e. by the \usepackage command,
esperanto will be an `unknown' language in which case we have to make it known.
So we check for the existence of \l@esperanto to see whether we have to do some-
thing here.
17.3 \ifx\l@esperanto\@undefined
17.4 \@nopatterns{Esperanto}
17.5 \adddialect\l@esperanto0\fi
The next step consists of dening commands to switch to the Esperanto lan-
guage. The reason for this is that a user might want to switch back and forth
between languages.

\captionsesperanto The macro \captionsesperanto denes all strings used in the four standard
documentclasses provided with LATEX.
\addto\captionsesperanto{%
17.6

17.7\def\prefacename{Anta\u{u}parolo}%
17.8 \def\refname{Cita\^\j{}oj}%
17.9 \def\abstractname{Resumo}%
17.10 \def\bibname{Bibliografio}%
17.11 \def\chaptername{{\^C}apitro}%
17.12 \def\appendixname{Apendico}%
17.13 \def\contentsname{Enhavo}%
17.14 \def\listfigurename{Listo de figuroj}%
17.15 \def\listtablename{Listo de tabeloj}%
17.16 \def\indexname{Indekso}%
10 The le described in this section has version number ? and was last revised on ?. A con-
tribution was made by Ruiz-Altaba Marti (ruizaltb@cernvm.cern.ch). Code from the le
esperant.sty by Jörg Knappen (knappen@vkpmzd.kph.uni-mainz.de) was included.

78
17.17 \def\figurename{Figuro}%
17.18 \def\tablename{Tabelo}%
17.19 \def\partname{Parto}%
17.20 \def\enclname{Aldono(j)}%
17.21 \def\ccname{Kopie al}%
17.22 \def\headtoname{Al}%
17.23 \def\pagename{Pa\^go}%
17.24 \def\subjectname{Temo}%
17.25 \def\seename{vidu}% a^u: vd.
17.26 \def\alsoname{vidu anka\u{u}}% a^u vd. anka\u{u}
17.27 \def\proofname{Pruvo}%
17.28 \def\glossaryname{Glosaro}%
17.29 }

\dateesperanto The macro \dateesperanto redenes the command \today to produce Esperanto
dates.
17.30 \def\dateesperanto{%
17.31 \def\today{\number\day{--a}~de~\ifcase\month\or
17.32 januaro\or februaro\or marto\or aprilo\or majo\or junio\or
17.33 julio\or a\u{u}gusto\or septembro\or oktobro\or novembro\or
17.34 decembro\fi,\space \number\year}}

\extrasesperanto The macro \extrasesperanto performs all the extra denitions needed for the
\noextrasesperanto Esperanto language. The macro \noextrasesperanto is used to cancel the actions
of \extrasesperanto.
For Esperanto the ^ character is made active. This is done once, later on its
denition may vary.
17.35 \initiate@active@char{^}
Because the character ^ is used in math mode with quite a dierent purpose we
need to add an extra level of evaluation to the denition of the active ^. It checks
whether math mode is active; if so the shorthand mechanism is bypassed by a
direct call of \normal@char^.
17.36 \addto\extrasesperanto{\languageshorthands{esperanto}}
17.37 \addto\extrasesperanto{\bbl@activate{^}}
17.38 \addto\noextrasesperanto{\bbl@deactivate{^}}

In order to prevent problems with the active ^ we add a shorthand on system


level which expands to a `normal ^.
17.39 \declare@shorthand{system}{^}{\csname normal@char\string^\endcsname}
And here are the uses of the active ^:
17.40 \declare@shorthand{esperanto}{^c}{\^{c}\allowhyphens}
17.41 \declare@shorthand{esperanto}{^C}{\^{C}\allowhyphens}
17.42 \declare@shorthand{esperanto}{^g}{\^{g}\allowhyphens}

17.43 \declare@shorthand{esperanto}{^G}{\^{G}\allowhyphens}

17.44 \declare@shorthand{esperanto}{^h}{h\llap{\^{}}\allowhyphens}

17.45 \declare@shorthand{esperanto}{^H}{\^{H}\allowhyphens}

17.46 \declare@shorthand{esperanto}{^j}{\^{\j}\allowhyphens}

17.47 \declare@shorthand{esperanto}{^J}{\^{J}\allowhyphens}

17.48 \declare@shorthand{esperanto}{^s}{\^{s}\allowhyphens}

17.49 \declare@shorthand{esperanto}{^S}{\^{S}\allowhyphens}

17.50 \declare@shorthand{esperanto}{^u}{\u u\allowhyphens}

79
17.51 \declare@shorthand{esperanto}{^U}{\u U\allowhyphens}
17.52 \declare@shorthand{esperanto}{^|}{\discretionary{-}{}{}\allowhyphens}

\Esper In esperant.sty Jörg Knappen provides the macros \esper and \Esper that can
\esper be used instead of \alph and \Alph. These macros are available in this le as
well.
Their denition takes place in two steps. First the toplevel.
17.53 \def\esper#1{\@esper{\@nameuse{c@#1}}}
17.54 \def\Esper#1{\@Esper{\@nameuse{c@#1}}}
Then the second level.
17.55 \def\@esper#1{%
17.56 \ifcase#1\or a\or b\or c\or \^c\or d\or e\or f\or g\or \^g\or
17.57 h\or h\llap{\^{}}\or i\or j\or \^\j\or k\or l\or m\or n\or o\or
17.58 p\or r\or s\or \^s\or t\or u\or \u{u}\or v\or z\else\@ctrerr\fi}
17.59 \def\@Esper#1{%

17.60 \ifcase#1\or A\or B\or C\or \^C\or D\or E\or F\or G\or \^G\or
17.61 H\or \^H\or I\or J\or \^J\or K\or L\or M\or N\or O\or
17.62 P\or R\or S\or \^S\or T\or U\or \u{U}\or V\or Z\else\@ctrerr\fi}

\hodiau In esperant.sty Jörg Knappen provides two alternative macros for \today,
\hodiaun \hodiau and \hodiaun. The second macro produces an accusative version of
the date in Esperanto.
17.63 \addto\dateesperanto{\def\hodiau{la \today}}
17.64 \def\hodiaun{la \number\day --an~de~\ifcase\month\or
17.65 januaro\or februaro\or marto\or aprilo\or majo\or junio\or
17.66 julio\or a\u{u}gusto\or septembro\or oktobro\or novembro\or
17.67 decembro\fi, \space \number\year}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
17.68 \ldf@finish{esperanto}
17.69 h/codei

80
18 The Interlingua language
The le interlingua.dtx11 denes all the language denition macros for the
Interlingua language. This le was contributed by Peter Kleiweg, kleiweg at
let.rug.nl.
Interlingua is an auxiliary language, built from the common vocabulary of
Spanish/Portuguese, English, Italian and French, with some normalisation of
spelling. The grammar is very easy, more similar to English's than to neolatin
languages. The site http://www.interlingua.com is mostly written in interlin-
gua (as is http://interlingua.altervista.org), in case you want to read some
sample of it.
You can have a look at the grammar at http://www.geocities.com/linguablau
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
18.1 h∗codei
18.2 \LdfInit{interlingua}{captionsinterlingua}
When this le is read as an option, i.e. by the \usepackage command,
interlingua could be an `unknown' language in which case we have to make
it known. So we check for the existence of \l@interlingua to see whether we
have to do something here.
18.3 \ifx\undefined\l@interlingua
18.4 \@nopatterns{Interlingua}
18.5 \adddialect\l@interlingua0\fi
The next step consists of dening commands to switch to (and from) the In-
terlingua language.

\interlinguahyphenmins This macro is used to store the correct values of the hyphenation parameters
\lefthyphenmin and \righthyphenmin.
18.6 \providehyphenmins{interlingua}{\tw@\tw@}

\captionsinterlingua The macro \captionsinterlingua denes all strings used in the four standard
documentclasses provided with LATEX.
\def\captionsinterlingua{%
18.7

18.8\def\prefacename{Prefacio}%
18.9 \def\refname{Referentias}%
18.10 \def\abstractname{Summario}%
18.11 \def\bibname{Bibliographia}%
18.12 \def\chaptername{Capitulo}%
18.13 \def\appendixname{Appendice}%
18.14 \def\contentsname{Contento}%
18.15 \def\listfigurename{Lista de figuras}%
18.16 \def\listtablename{Lista de tabellas}%
18.17 \def\indexname{Indice}%
18.18 \def\figurename{Figura}%
18.19 \def\tablename{Tabella}%
18.20 \def\partname{Parte}%
18.21 \def\enclname{Incluso}%
18.22 \def\ccname{Copia}%
18.23 \def\headtoname{A}%
11 The le described in this section has version number v1.6 and was last revised on 2005/03/30.

81
18.24 \def\pagename{Pagina}%
18.25 \def\seename{vide}%
18.26 \def\alsoname{vide etiam}%
18.27 \def\proofname{Prova}%
18.28 \def\glossaryname{Glossario}%
18.29 }

\dateinterlingua The macro \dateinterlingua redenes the command \today to produce Inter-
lingua dates.
18.30 \def\dateinterlingua{%
18.31 \def\today{le~\number\day\space de \ifcase\month\or
18.32 januario\or februario\or martio\or april\or maio\or junio\or
18.33 julio\or augusto\or septembre\or octobre\or novembre\or
18.34 decembre\fi
18.35 \space \number\year}}

\extrasinterlingua The macro \extrasinterlingua will perform all the extra denitions needed for
\noextrasinterlingua the Interlingua language. The macro \noextrasinterlingua is used to cancel
the actions of \extrasinterlingua. For the moment these macros are empty but
they are dened for compatibility with the other language denition les.
18.36 \addto\extrasinterlingua{}
18.37 \addto\noextrasinterlingua{}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
18.38 \ldf@finish{interlingua}
18.39 h/codei

82
19 The Dutch language
The le dutch.dtx12 denes all the language-specic macros for the Dutch lan-
guage and the `Afrikaans' version13 of it.
For this language the character " is made active. In table 3 an overview is
given of its purpose. One of the reasons for this is that in the Dutch language
a word with a dieresis can be hyphenated just before the letter with the umlaut,
but the dieresis has to disappear if the word is broken between the previous letter
and the accented letter.
In [3] the quoting conventions for the Dutch language are discussed. The
preferred convention is the single-quote Anglo-American convention, i.e. `This is
a quote'. An alternative is the slightly old-fashioned Dutch method with initial
double quotes lowered to the baseline, This is a quote, which should be typed as

"`This is a quote"'.

"a \"a which hyphenates as -a; also implemented for


the other letters.
"y puts a negative kern between i and j
"Y puts a negative kern between I and J
"| disable ligature at this position.
"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"~ to produce a hyphencharcter without the following
\discretionary{}{}{}.
"" to produce an invisible `breakpoint'.
"` lowered double left quotes (see example below).
"' normal double right quotes.
\- like the old \-, but allowing hyphenation in the rest
of the word.

Table 3: The extra denitions made by dutch.ldf

19.1 % \changes{dutch-3.8a}{1996/10/04}{made check dependant on


19.2 % \cs{CurrentOption}}
19.3 %

19.4 % The macro |\LdfInit| takes care of preventing that this file is
19.5 % loaded more than once, checking the category code of the
19.6 % \texttt{@} sign, etc.
19.7 % \changes{dutch-3.8a}{1996/10/30}{Now use \cs{LdfInit} to perform

19.8 % initial checks}


19.9 % \begin{macrocode}
19.10 h∗codei

19.11 \LdfInit\CurrentOption{captions\CurrentOption}

When this le is read as an option, i.e. by the \usepackage command, dutch
could be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@dutch or l@afrikaans to see whether we have to do
something here.
12 The le described in this section has version number v3.8i, and was last revised on
2005/03/30.
13 contributed by Stoel Lombard (lombc@b31pc87.up.ac.za)

83
First we try to establish with which option we are being processed.
19.12 \def\bbl@tempa{dutch}
19.13 \ifx\CurrentOption\bbl@tempa
If it is dutch then we rst check if the Dutch hyphenation patterns wer loaded,
19.14 \ifx\l@dutch\undefined
if no we issue a warning and make dutch a `dialect' of either the hyphenation
patterns that were loaded in slot 0 or of `afrikaans' when it is available.
19.15 \@nopatterns{Dutch}
19.16 \ifx\l@afrikaans\undefined
19.17 \adddialect\l@dutch0
19.18 \else
19.19 \adddialect\l@dutch\l@afrikaans
19.20 \fi
19.21 \fi
The next step consists of dening commands to switch to (and from) the Dutch
language.

\captionsdutch The macro \captionsdutch denes all strings used in the four standard document
classes provided with LATEX.
19.22 \begingroup
19.23 \catcode`\"\active
19.24 \def\x{\endgroup
19.25 \def\captionsdutch{%
19.26 \def\prefacename{Voorwoord}%
19.27 \def\refname{Referenties}%
19.28 \def\abstractname{Samenvatting}%
19.29 \def\bibname{Bibliografie}%
19.30 \def\chaptername{Hoofdstuk}%
19.31 \def\appendixname{B"ylage}%
19.32 \def\contentsname{Inhoudsopgave}%
19.33 \def\listfigurename{L"yst van figuren}%
19.34 \def\listtablename{L"yst van tabellen}%
19.35 \def\indexname{Index}%
19.36 \def\figurename{Figuur}%
19.37 \def\tablename{Tabel}%
19.38 \def\partname{Deel}%
19.39 \def\enclname{B"ylage(n)}%
19.40 \def\ccname{cc}%
19.41 \def\headtoname{Aan}%
19.42 \def\pagename{Pagina}%
19.43 \def\seename{zie}%
19.44 \def\alsoname{zie ook}%
19.45 \def\proofname{Bew"ys}%
19.46 \def\glossaryname{Verklarende Woordenl"yst}%
19.47 }
19.48 }\x

\datedutch The macro \datedutch redenes the command \today to produce Dutch dates.

19.49 \def\datedutch{%
19.50 \def\today{\number\day~\ifcase\month\or

84
19.51 januari\or februari\or maart\or april\or mei\or juni\or
19.52 juli\or augustus\or september\or oktober\or november\or
19.53 december\fi
19.54 \space \number\year}}

When the option with which this le is being process was not dutch we assume
it was afrikaans. We perform a similar check on the availability of the hyphenation
paterns.
19.55 \else
19.56 \ifx\l@afrikaans\undefined
19.57 \@nopatterns{Afrikaans}
19.58 \ifx\l@dutch\undefined
19.59 \adddialect\l@afrikaans0
19.60 \else
19.61 \adddialect\l@afrikaans\l@dutch
19.62 \fi
19.63 \fi

\captionsafrikaans Now is the time to dene the words for `Afrikaans'.


19.64 \def\captionsafrikaans{%
19.65 \def\prefacename{Voorwoord}%
19.66 \def\refname{Verwysings}%
19.67 \def\abstractname{Samevatting}%
19.68 \def\bibname{Bibliografie}%
19.69 \def\chaptername{Hoofstuk}%
19.70 \def\appendixname{Bylae}%
19.71 \def\contentsname{Inhoudsopgawe}%
19.72 \def\listfigurename{Lys van figure}%
19.73 \def\listtablename{Lys van tabelle}%
19.74 \def\indexname{Inhoud}%
19.75 \def\figurename{Figuur}%
19.76 \def\tablename{Tabel}%
19.77 \def\partname{Deel}%
19.78 \def\enclname{Bylae(n)}%
19.79 \def\ccname{a.a.}%
19.80 \def\headtoname{Aan}%
19.81 \def\pagename{Bladsy}%
19.82 \def\seename{sien}%
19.83 \def\alsoname{sien ook}%
19.84 \def\proofname{Bewys}%
19.85 }

\dateafrikaans Here is the `Afrikaans' version of the date macro.


19.86 \def\dateafrikaans{%
19.87 \def\today{\number\day~\ifcase\month\or
19.88 Januarie\or Februarie\or Maart\or April\or Mei\or Junie\or
19.89 Julie\or Augustus\or September\or Oktober\or November\or
19.90 Desember\fi
19.91 \space \number\year}}
19.92 \fi

\extrasdutch The macros \extrasdutch and \captionsafrikaans will perform all the ex-
\extrasafrikaans tra denitions needed for the Dutch language. The macros \noextrasdutch
\noextrasdutch
\noextrasafrikaans
85
and noextrasafrikaans is used to cancel the actions of \extrasdutch and
\captionsafrikaans.
For Dutch the " character is made active. This is done once, later on its
denition may vary. Other languages in the same document may also use the "
character for shorthands; we specify that the dutch group of shorthands should
be used.
19.93 \initiate@active@char{"}
Both version of the language use the same set of shorthand denitions althoug the
`ij' is not used in Afrikaans.
19.94 \@namedef{extras\CurrentOption}{\languageshorthands{dutch}}
19.95 \expandafter\addto\csname extras\CurrentOption\endcsname{%
19.96 \bbl@activate{"}}
The `umlaut' character should be positioned lower on all vowels in Dutch texts.
19.97 \expandafter\addto\csname extras\CurrentOption\endcsname{%
19.98 \umlautlow\umlautelow}
19.99 \@namedef{noextras\CurrentOption}{%

19.100 \umlauthigh}

\dutchhyphenmins The dutch hyphenation patterns can be used with \lefthyphenmin set to 2 and
\afrikaanshyphenmins \righthyphenmin set to 3.
19.101 \providehyphenmins{\CurrentOption}{\tw@\thr@@}

\@trema In the Dutch language vowels with a trema are treated specially. If a hyphenation
occurs before a vowel-plus-trema, the trema should disappear. To be able to do
this we could rst dene the hyphenation break behaviour for the ve vowels, both
lowercase and uppercase, in terms of \discretionary. But this results in a large
\if-construct in the denition of the active ". Because we think a user should not
use " when he really means something like '' we chose not to distinguish between
vowels and consonants. Therefore we have one macro \@trema which species the
hyphenation break behaviour for all letters.
19.102 \def\@trema#1{\allowhyphens\discretionary{-}{#1}{\"{#1}}\allowhyphens}

Now we can dene the doublequote macros: the tremas,


19.103 \declare@shorthand{dutch}{"a}{\textormath{\@trema a}{\ddot a}}
19.104 \declare@shorthand{dutch}{"e}{\textormath{\@trema e}{\ddot e}}
19.105 \declare@shorthand{dutch}{"i}{\textormath

19.106 {\allowhyphens\discretionary{-}{i}{\"{\i}}\allowhyphens}%
19.107 {\ddot \imath}}
19.108 \declare@shorthand{dutch}{"o}{\textormath{\@trema o}{\ddot o}}

19.109 \declare@shorthand{dutch}{"u}{\textormath{\@trema u}{\ddot u}}

dutch quotes,
19.110 \declare@shorthand{dutch}{"`}{%
19.111 \textormath{\quotedblbase}{\mbox{\quotedblbase}}}
19.112 \declare@shorthand{dutch}{"'}{%

19.113 \textormath{\textquotedblright}{\mbox{\textquotedblright}}}
and some additional commands:
19.114 \declare@shorthand{dutch}{"-}{\nobreak-\bbl@allowhyphens}
19.115 \declare@shorthand{dutch}{"~}{\textormath{\leavevmode\hbox{-}}{-}}

86
19.116 \declare@shorthand{dutch}{"|}{%
19.117 \textormath{\discretionary{-}{}{\kern.03em}}{}}
19.118 \declare@shorthand{dutch}{""}{\hskip\z@skip}

19.119 \declare@shorthand{dutch}{"y}{\textormath{\ij{}}{\ddot y}}

19.120 \declare@shorthand{dutch}{"Y}{\textormath{\IJ{}}{\ddot Y}}

To enable hyphenation in two words, written together but separated by a slash,


as in `uitdrukking/opmerking' we dene the command "/.
19.121 \declare@shorthand{dutch}{"/}{\textormath
19.122 {\bbl@allowhyphens\discretionary{/}{}{/}\bbl@allowhyphens}{}}

\- All that is left now is the redenition of \-. The new version of \- should indicate
an extra hyphenation position, while allowing other hyphenation positions to be
generated automatically. The standard behaviour of TEX in this respect is very
unfortunate for languages such as Dutch and German, where long compound words
are quite normal and all one needs is a means to indicate an extra hyphenation
position on top of the ones that TEX can generate from the hyphenation patterns.

19.123 \expandafter\addto\csname extras\CurrentOption\endcsname{%


19.124 \babel@save\-}
19.125 \expandafter\addto\csname extras\CurrentOption\endcsname{%

19.126 \def\-{\bbl@allowhyphens\discretionary{-}{}{}\bbl@allowhyphens}}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
19.127 \ldf@finish\CurrentOption
19.128 h/codei

87
20 The English language
The le english.dtx14 denes all the language denition macros for the English
language as well as for the American and Australian version of this language. For
the Australian version the British hyphenation patterns will be used, if available,
for the Canadian variant the American patterns are selected.
For this language currently no special denitions are needed or available.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
20.1 h∗codei
20.2 \LdfInit\CurrentOption{date\CurrentOption}
When this le is read as an option, i.e. by the \usepackage command, english
could be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@english to see whether we have to do something
here.
We allow for the british english patterns to be loaded as either `british', or
`UKenglish'. When neither of those is known we try to dene \l@english as an
alias for \l@american or \l@USenglish.
20.3 \ifx\l@english\@undefined
20.4 \ifx\l@UKenglish\@undefined
20.5 \ifx\l@british\@undefined
20.6 \ifx\l@american\@undefined
20.7 \ifx\l@USenglish\@undefined
20.8 \ifx\l@canadian\@undefined
20.9 \ifx\l@australian\@undefined
20.10 \ifx\l@newzealand\@undefined
20.11 \@nopatterns{English}
20.12 \adddialect\l@english0
20.13 \else
20.14 \let\l@english\l@newzealand
20.15 \fi
20.16 \else
20.17 \let\l@english\l@australian
20.18 \fi
20.19 \else
20.20 \let\l@english\l@canadian
20.21 \fi
20.22 \else
20.23 \let\l@english\l@USenglish
20.24 \fi
20.25 \else
20.26 \let\l@english\l@american
20.27 \fi
20.28 \else
20.29 \let\l@english\l@british
20.30 \fi
20.31 \else
20.32 \let\l@english\l@UKenglish
20.33 \fi
20.34 \fi

14 The le described in this section has version number v3.3o and was last revised on
2005/03/30.

88
Because we allow `british' to be used as the babel option we need to make sure
that it will be recognised by \selectlanguage. In the code above we have made
sure that \l@english was dened. Now we want to make sure that \l@british
and \l@UKenglish are dened as well. When either of them is we make them
equal to each other, when neither is we fall back to the default, \l@english.
20.35 \ifx\l@british\@undefined
20.36 \ifx\l@UKenglish\@undefined
20.37 \adddialect\l@british\l@english
20.38 \adddialect\l@UKenglish\l@english
20.39 \else
20.40 \let\l@british\l@UKenglish
20.41 \fi
20.42 \else

20.43 \let\l@UKenglish\l@british
20.44 \fi

`American' is a version of `English' which can have its own hyphenation patterns.
The default english patterns are in fact for american english. We allow for the
patterns to be loaded as `english' `american' or `USenglish'.
20.45 \ifx\l@american\@undefined
20.46 \ifx\l@USenglish\@undefined
When the patterns are not know as `american' or `USenglish' we add a dialect.
20.47 \adddialect\l@american\l@english
20.48 \else
20.49 \let\l@american\l@USenglish
20.50 \fi
20.51 \else

Make sure that USenglish is known, even if the patterns were loaded as `american'.

20.52 \ifx\l@USenglish\@undefined
20.53 \let\l@USenglish\l@american
20.54 \fi
20.55 \fi

`Canadian' english spelling is a hybrid of British and American spelling. Al-


though so far no special `translations' have been reported we allow this le to be
loaded by the option candian as well.
20.56 \ifx\l@canadian\@undefined
20.57 \adddialect\l@canadian\l@american
20.58 \fi

`Australian' and `New Zealand' english spelling seem to be the same as British
spelling. Although so far no special `translations' have been reported we allow
this le to be loaded by the options australian and newzealand as well.
20.59 \ifx\l@australian\@undefined
20.60 \adddialect\l@australian\l@british
20.61 \fi

20.62 \ifx\l@newzealand\@undefined

20.63 \adddialect\l@newzealand\l@british
20.64 \fi

\englishhyphenmins This macro is used to store the correct values of the hyphenation parameters
\lefthyphenmin and \righthyphenmin.

89
20.65 \providehyphenmins{\CurrentOption}{\tw@\thr@@}

The next step consists of dening commands to switch to (and from) the En-
glish language.
\captionsenglish The macro \captionsenglish denes all strings used in the four standard docu-
ment classes provided with LATEX.
20.66 \@namedef{captions\CurrentOption}{%
20.67 \def\prefacename{Preface}%
20.68 \def\refname{References}%
20.69 \def\abstractname{Abstract}%
20.70 \def\bibname{Bibliography}%
20.71 \def\chaptername{Chapter}%
20.72 \def\appendixname{Appendix}%
20.73 \def\contentsname{Contents}%
20.74 \def\listfigurename{List of Figures}%
20.75 \def\listtablename{List of Tables}%
20.76 \def\indexname{Index}%
20.77 \def\figurename{Figure}%
20.78 \def\tablename{Table}%
20.79 \def\partname{Part}%
20.80 \def\enclname{encl}%
20.81 \def\ccname{cc}%
20.82 \def\headtoname{To}%
20.83 \def\pagename{Page}%
20.84 \def\seename{see}%
20.85 \def\alsoname{see also}%
20.86 \def\proofname{Proof}%
20.87 \def\glossaryname{Glossary}%
20.88 }

\dateenglish In order to dene \today correctly we need to know whether it should be `en-
glish', `australian', or `american'. We can nd this out by checking the value of
\CurrentOption.
20.89 \def\bbl@tempa{british}
20.90 \ifx\CurrentOption\bbl@tempa\def\bbl@tempb{UK}\fi
20.91 \def\bbl@tempa{UKenglish}

20.92 \ifx\CurrentOption\bbl@tempa\def\bbl@tempb{UK}\fi

20.93 \def\bbl@tempa{american}

20.94 \ifx\CurrentOption\bbl@tempa\def\bbl@tempb{US}\fi

20.95 \def\bbl@tempa{USenglish}

20.96 \ifx\CurrentOption\bbl@tempa\def\bbl@tempb{US}\fi

20.97 \def\bbl@tempa{canadian}

20.98 \ifx\CurrentOption\bbl@tempa\def\bbl@tempb{US}\fi

20.99 \def\bbl@tempa{australian}

20.100 \ifx\CurrentOption\bbl@tempa\def\bbl@tempb{AU}\fi

20.101 \def\bbl@tempa{newzealand}

20.102 \ifx\CurrentOption\bbl@tempa\def\bbl@tempb{AU}\fi

The macro \dateenglish redenes the command \today to produce English


dates.
20.103 \def\bbl@tempa{UK}
20.104 \ifx\bbl@tempa\bbl@tempb
20.105 \@namedef{date\CurrentOption}{%

90
20.106 \def\today{\ifcase\day\or
20.107 1st\or 2nd\or 3rd\or 4th\or 5th\or
20.108 6th\or 7th\or 8th\or 9th\or 10th\or
20.109 11th\or 12th\or 13th\or 14th\or 15th\or
20.110 16th\or 17th\or 18th\or 19th\or 20th\or
20.111 21st\or 22nd\or 23rd\or 24th\or 25th\or
20.112 26th\or 27th\or 28th\or 29th\or 30th\or
20.113 31st\fi~\ifcase\month\or
20.114 January\or February\or March\or April\or May\or June\or
20.115 July\or August\or September\or October\or November\or
20.116 December\fi\space \number\year}}

\dateaustralian Now, test for `australian' or `american'.


20.117 \else
The macro \dateaustralian redenes the command \today to produce Aus-
tralian resp. New Zealand dates.
20.118 \def\bbl@tempa{AU}
20.119 \ifx\bbl@tempa\bbl@tempb
20.120 \@namedef{date\CurrentOption}{%
20.121 \def\today{\number\day~\ifcase\month\or
20.122 January\or February\or March\or April\or May\or June\or
20.123 July\or August\or September\or October\or November\or
20.124 December\fi\space \number\year}}

\dateamerican The macro \dateamerican redenes the command \today to produce American
dates.
20.125 \else
20.126 \@namedef{date\CurrentOption}{%
20.127 \def\today{\ifcase\month\or
20.128 January\or February\or March\or April\or May\or June\or
20.129 July\or August\or September\or October\or November\or
20.130 December\fi \space\number\day, \number\year}}
20.131 \fi
20.132 \fi

\extrasenglish The macro \extrasenglish will perform all the extra denitions needed for the
\noextrasenglish English language. The macro \noextrasenglish is used to cancel the actions of
\extrasenglish. For the moment these macros are empty but they are dened
for compatibility with the other language denition les.
20.133 \@namedef{extras\CurrentOption}{}
20.134 \@namedef{noextras\CurrentOption}{}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
20.135 \ldf@finish\CurrentOption
20.136 h/codei

91
21 The German language
The le germanb.dtx15 denes all the language denition macros for the German
language as well as for the Austrian dialect of this language16 .
For this language the character " is made active. In table 4 an overview is given
of its purpose. One of the reasons for this is that in the German language some
character combinations change when a word is broken between the combination.
Also the vertical placement of the umlaut can be controlled this way. The quotes

"a \"a, also implemented for the other lowercase and


uppercase vowels.
"s to produce the German ÿ (like \ss{}).
"z to produce the German ÿ (like \ss{}).
"ck for ck to be hyphenated as k-k.
"ff for ff to be hyphenated as ff-f, this is also imple-
mented for l, m, n, p, r and t
"S for SS to be \uppercase{"s}.
"Z for SZ to be \uppercase{"z}.
"| disable ligature at this position.
"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"" like "-, but producing no hyphen sign (for compund
words with hyphen, e.g. x-""y).
"~ for a compound word mark without a breakpoint.
"= for a compound word mark with a breakpoint, allow-
ing hyphenation in the composing words.
"` for German left double quotes (looks like ).
"' for German right double quotes.
"< for French left double quotes (similar to <<).
"> for French right double quotes (similar to >>).

Table 4: The extra denitions made by german.ldf

in table 4 can also be typeset by using the commands in table 5.


When this le was read through the option germanb we make it behave as if
german was specied.
21.1 \def\bbl@tempa{germanb}
21.2 \ifx\CurrentOption\bbl@tempa
21.3 \def\CurrentOption{german}
21.4 \ifx\l@german\@undefined
21.5 \@nopatterns{German}
21.6 \adddialect\l@german0
21.7 \fi
21.8 \let\l@germanb\l@german
21.9 \AtBeginDocument{%
21.10 \let\captionsgermanb\captionsgerman
21.11 \let\dategermanb\dategerman
15 The le described in this section has version number v2.6m and was last revised on
2008/06/01.
16 This le is a re-implementation of Hubert Partl's german.sty version 2.5b, see [4].

92
\glqq for German left double quotes (looks like ).
\grqq for German right double quotes (looks like ).
\glq for German left single quotes (looks like ,).
\grq for German right single quotes (looks like `).
\flqq for French left double quotes (similar to <<).
\frqq for French right double quotes (similar to >>).
\flq for (French) left single quotes (similar to <).
\frq for (French) right single quotes (similar to >).
\dq the original quotes character (").

Table 5: More commands which produce quotes, dened by german.ldf

21.12 \let\extrasgermanb\extrasgerman
21.13 \let\noextrasgermanb\noextrasgerman
21.14 }
21.15 \fi
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
21.16 h∗codei
21.17 \LdfInit\CurrentOption{captions\CurrentOption}
When this le is read as an option, i.e., by the \usepackage command, german
will be an `unknown' language, so we have to make it known. So we check for the
existence of \l@german to see whether we have to do something here.
21.18 \ifx\l@german\@undefined
21.19 \@nopatterns{German}
21.20 \adddialect\l@german0
21.21 \fi

For the Austrian version of these denitions we just add another language.
21.22 \adddialect\l@austrian\l@german
The next step consists of dening commands to switch to (and from) the Ger-
man language.

\captionsgerman Either the macro \captionsgerman or the macro \captionsaustrian will dene
\captionsaustrian all strings used in the four standard document classes provided with LATEX.
21.23 \@namedef{captions\CurrentOption}{%
21.24 \def\prefacename{Vorwort}%
21.25 \def\refname{Literatur}%
21.26 \def\abstractname{Zusammenfassung}%
21.27 \def\bibname{Literaturverzeichnis}%
21.28 \def\chaptername{Kapitel}%
21.29 \def\appendixname{Anhang}%
21.30 \def\contentsname{Inhaltsverzeichnis}% % oder nur: Inhalt
21.31 \def\listfigurename{Abbildungsverzeichnis}%
21.32 \def\listtablename{Tabellenverzeichnis}%
21.33 \def\indexname{Index}%
21.34 \def\figurename{Abbildung}%
21.35 \def\tablename{Tabelle}% % oder: Tafel
21.36 \def\partname{Teil}%

93
21.37 \def\enclname{Anlage(n)}% % oder: Beilage(n)
21.38 \def\ccname{Verteiler}% % oder: Kopien an
21.39 \def\headtoname{An}%
21.40 \def\pagename{Seite}%
21.41 \def\seename{siehe}%
21.42 \def\alsoname{siehe auch}%
21.43 \def\proofname{Beweis}%
21.44 \def\glossaryname{Glossar}%
21.45 }

\dategerman The macro \dategerman redenes the command \today to produce German dates.

21.46 \def\month@german{\ifcase\month\or
21.47 Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or
21.48 Juli\or August\or September\or Oktober\or November\or Dezember\fi}
21.49 \def\dategerman{\def\today{\number\day.~\month@german

21.50 \space\number\year}}

\dateaustrian The macro \dateaustrian redenes the command \today to produce Austrian
version of the German dates.
21.51 \def\dateaustrian{\def\today{\number\day.~\ifnum1=\month
21.52 J\"anner\else \month@german\fi \space\number\year}}

\extrasgerman Either the macro \extrasgerman or the macros \extrasaustrian will per-
\extrasaustrian form all the extra denitions needed for the German language. The macro
\noextrasgerman \noextrasgerman is used to cancel the actions of \extrasgerman.
\noextrasaustrian For German (as well as for Dutch) the " character is made active. This is done
once, later on its denition may vary.
21.53 \initiate@active@char{"}
21.54 \@namedef{extras\CurrentOption}{%
21.55 \languageshorthands{german}}
21.56 \expandafter\addto\csname extras\CurrentOption\endcsname{%

21.57 \bbl@activate{"}}
Don't forget to turn the shorthands o again.
21.58 \addto\noextrasgerman{\bbl@deactivate{"}}
In order for TEX to be able to hyphenate German words which contain `ÿ'
(in the OT1 position ^^Y) we have to give the character a nonzero \lccode (see
Appendix H, the TEXbook).
21.59 \expandafter\addto\csname extras\CurrentOption\endcsname{%
21.60 \babel@savevariable{\lccode25}%
21.61 \lccode25=25}
The umlaut accent macro \" is changed to lower the umlaut dots. The rede-
nition is done with the help of \umlautlow.
21.62 \expandafter\addto\csname extras\CurrentOption\endcsname{%
21.63 \babel@save\"\umlautlow}
21.64 \@namedef{noextras\CurrentOption}{\umlauthigh}

The german hyphenation patterns can be used with \lefthyphenmin and


\righthyphenmin set to 2.
21.65 \providehyphenmins{\CurrentOption}{\tw@\tw@}

94
For German texts we need to make sure that \frenchspacing is turned on.
21.66 \expandafter\addto\csname extras\CurrentOption\endcsname{%
21.67 \bbl@frenchspacing}
21.68 \expandafter\addto\csname noextras\CurrentOption\endcsname{%

21.69 \bbl@nonfrenchspacing}

The code above is necessary because we need an extra active character. This
character is then used as indicated in table 4.
To be able to dene the function of ", we rst dene a couple of `support'
macros.

\dq We save the original double quote character in \dq to keep it available, the math
accent \" can now be typed as ".
21.70 \begingroup \catcode`\"12
21.71 \def\x{\endgroup
21.72 \def\@SS{\mathchar"7019 }
21.73 \def\dq{"}}
21.74 \x

Now we can dene the doublequote macros: the umlauts,


21.75 \declare@shorthand{german}{"a}{\textormath{\"{a}\allowhyphens}{\ddot a}}
21.76 \declare@shorthand{german}{"o}{\textormath{\"{o}\allowhyphens}{\ddot o}}
21.77 \declare@shorthand{german}{"u}{\textormath{\"{u}\allowhyphens}{\ddot u}}
21.78 \declare@shorthand{german}{"A}{\textormath{\"{A}\allowhyphens}{\ddot A}}
21.79 \declare@shorthand{german}{"O}{\textormath{\"{O}\allowhyphens}{\ddot O}}
21.80 \declare@shorthand{german}{"U}{\textormath{\"{U}\allowhyphens}{\ddot U}}
tremas,
21.81 \declare@shorthand{german}{"e}{\textormath{\"{e}}{\ddot e}}
21.82 \declare@shorthand{german}{"E}{\textormath{\"{E}}{\ddot E}}
21.83 \declare@shorthand{german}{"i}{\textormath{\"{\i}}%

21.84 {\ddot\imath}}
21.85 \declare@shorthand{german}{"I}{\textormath{\"{I}}{\ddot I}}

german es-zet (sharp s),


21.86 \declare@shorthand{german}{"s}{\textormath{\ss}{\@SS{}}}
21.87 \declare@shorthand{german}{"S}{\SS}
21.88 \declare@shorthand{german}{"z}{\textormath{\ss}{\@SS{}}}

21.89 \declare@shorthand{german}{"Z}{SZ}

german and french quotes,


21.90 \declare@shorthand{german}{"`}{\glqq}
21.91 \declare@shorthand{german}{"'}{\grqq}
21.92 \declare@shorthand{german}{"<}{\flqq}

21.93 \declare@shorthand{german}{">}{\frqq}

discretionary commands
21.94 \declare@shorthand{german}{"c}{\textormath{\bbl@disc ck}{c}}
21.95 \declare@shorthand{german}{"C}{\textormath{\bbl@disc CK}{C}}
21.96 \declare@shorthand{german}{"F}{\textormath{\bbl@disc F{FF}}{F}}
21.97 \declare@shorthand{german}{"l}{\textormath{\bbl@disc l{ll}}{l}}
21.98 \declare@shorthand{german}{"L}{\textormath{\bbl@disc L{LL}}{L}}
21.99 \declare@shorthand{german}{"m}{\textormath{\bbl@disc m{mm}}{m}}
21.100 \declare@shorthand{german}{"M}{\textormath{\bbl@disc M{MM}}{M}}
21.101 \declare@shorthand{german}{"n}{\textormath{\bbl@disc n{nn}}{n}}

95
21.102 \declare@shorthand{german}{"N}{\textormath{\bbl@disc N{NN}}{N}}
21.103 \declare@shorthand{german}{"p}{\textormath{\bbl@disc p{pp}}{p}}
21.104 \declare@shorthand{german}{"P}{\textormath{\bbl@disc P{PP}}{P}}
21.105 \declare@shorthand{german}{"r}{\textormath{\bbl@disc r{rr}}{r}}
21.106 \declare@shorthand{german}{"R}{\textormath{\bbl@disc R{RR}}{R}}
21.107 \declare@shorthand{german}{"t}{\textormath{\bbl@disc t{tt}}{t}}
21.108 \declare@shorthand{german}{"T}{\textormath{\bbl@disc T{TT}}{T}}
We need to treat "f a bit dierently in order to preserve the -ligature.
21.109 \declare@shorthand{german}{"f}{\textormath{\bbl@discff}{f}}
21.110 \def\bbl@discff{\penalty\@M
21.111 \afterassignment\bbl@insertff \let\bbl@nextff= }
21.112 \def\bbl@insertff{%

21.113 \if f\bbl@nextff


21.114 \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
21.115 {\relax\discretionary{ff-}{f}{ff}\allowhyphens}{f\bbl@nextff}}
21.116 \let\bbl@nextff=f

and some additional commands:


21.117 \declare@shorthand{german}{"-}{\nobreak\-\bbl@allowhyphens}
21.118 \declare@shorthand{german}{"|}{%
21.119 \textormath{\penalty\@M\discretionary{-}{}{\kern.03em}%
21.120 \allowhyphens}{}}
21.121 \declare@shorthand{german}{""}{\hskip\z@skip}

21.122 \declare@shorthand{german}{"~}{\textormath{\leavevmode\hbox{-}}{-}}

21.123 \declare@shorthand{german}{"=}{\penalty\@M-\hskip\z@skip}

\mdqon All that's left to do now is to dene a couple of commands for reasons of compat-
\mdqoff ibility with german.sty.
\ck21.124 \def\mdqon{\shorthandon{"}}
21.125 \def\mdqoff{\shorthandoff{"}}

21.126 \def\ck{\allowhyphens\discretionary{k-}{k}{ck}\allowhyphens}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
21.127 \ldf@finish\CurrentOption
21.128 h/codei

96
22 The German language  new orthography
The le ngermanb.dtx17 denes all the language denition macros for the German
language with the `new orthography' introduced in August 1998. This includes
also the Austrian dialect of this language.
As with the `traditional' German orthography, the character " is made active,
and the commands in table 4 can be used, except for "ck and "ff etc., which are
no longer required.
The internal language names are ngerman and naustrian.
When this le was read through the option ngermanb we make it behave as if
ngerman was specied.
22.1 \def\bbl@tempa{ngermanb}
22.2 \ifx\CurrentOption\bbl@tempa
22.3 \def\CurrentOption{ngerman}
22.4 \fi

The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
22.5 h∗codei
22.6 \LdfInit\CurrentOption{captions\CurrentOption}
When this le is read as an option, i.e., by the \usepackage command, ngerman
will be an `unknown' language, so we have to make it known. So we check for the
existence of \l@ngerman to see whether we have to do something here.
\ifx\l@ngerman\@undefined
22.7

22.8\@nopatterns{ngerman}
22.9 \adddialect\l@ngerman0
22.10 \fi

For the Austrian version of these denitions we just add another language.
22.11 \adddialect\l@naustrian\l@ngerman
The next step consists of dening commands to switch to (and from) the Ger-
man language.

\captionsngerman Either the macro \captionsngerman or the macro \captionsnaustrian will de-
\captionsnaustrian ne all strings used in the four standard document classes provided with LATEX.
22.12 \@namedef{captions\CurrentOption}{%
22.13 \def\prefacename{Vorwort}%
22.14 \def\refname{Literatur}%
22.15 \def\abstractname{Zusammenfassung}%
22.16 \def\bibname{Literaturverzeichnis}%
22.17 \def\chaptername{Kapitel}%
22.18 \def\appendixname{Anhang}%
22.19 \def\contentsname{Inhaltsverzeichnis}% % oder nur: Inhalt
22.20 \def\listfigurename{Abbildungsverzeichnis}%
22.21 \def\listtablename{Tabellenverzeichnis}%
22.22 \def\indexname{Index}%
22.23 \def\figurename{Abbildung}%
22.24 \def\tablename{Tabelle}% % oder: Tafel
22.25 \def\partname{Teil}%
17 The le described in this section has version number v2.6n and was last revised on
2008/07/06.

97
22.26 \def\enclname{Anlage(n)}% % oder: Beilage(n)
22.27 \def\ccname{Verteiler}% % oder: Kopien an
22.28 \def\headtoname{An}%
22.29 \def\pagename{Seite}%
22.30 \def\seename{siehe}%
22.31 \def\alsoname{siehe auch}%
22.32 \def\proofname{Beweis}%
22.33 \def\glossaryname{Glossar}%
22.34 }

\datengerman The macro \datengerman redenes the command \today to produce German
dates.
22.35 \def\month@ngerman{\ifcase\month\or
22.36 Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or
22.37 Juli\or August\or September\or Oktober\or November\or Dezember\fi}
22.38 \def\datengerman{\def\today{\number\day.~\month@ngerman

22.39 \space\number\year}}

\dateanustrian The macro \datenaustrian redenes the command \today to produce Austrian
version of the German dates.
22.40 \def\datenaustrian{\def\today{\number\day.~\ifnum1=\month
22.41 J\"anner\else \month@ngerman\fi \space\number\year}}

\extrasngerman Either the macro \extrasngerman or the macros \extrasnaustrian will per-
\extrasnaustrian form all the extra denitions needed for the German language. The macro
\noextrasngerman \noextrasngerman is used to cancel the actions of \extrasngerman.
\noextrasnaustrian For German (as well as for Dutch) the " character is made active. This is done
once, later on its denition may vary.
22.42 \initiate@active@char{"}
22.43 \@namedef{extras\CurrentOption}{%
22.44 \languageshorthands{ngerman}}
22.45 \expandafter\addto\csname extras\CurrentOption\endcsname{%

22.46 \bbl@activate{"}}
Don't forget to turn the shorthands o again.
22.47 \addto\noextrasngerman{\bbl@deactivate{"}}
In order for TEX to be able to hyphenate German words which contain `ÿ'
(in the OT1 position ^^Y) we have to give the character a nonzero \lccode (see
Appendix H, the TEXbook).
22.48 \expandafter\addto\csname extras\CurrentOption\endcsname{%
22.49 \babel@savevariable{\lccode25}%
22.50 \lccode25=25}
The umlaut accent macro \" is changed to lower the umlaut dots. The rede-
nition is done with the help of \umlautlow.
22.51 \expandafter\addto\csname extras\CurrentOption\endcsname{%
22.52 \babel@save\"\umlautlow}
22.53 \@namedef{noextras\CurrentOption}{\umlauthigh}

The current version of the `new' German hyphenation patterns (dehyphn.tex is


to be used with \lefthyphenmin and \righthyphenmin set to 2.
22.54 \providehyphenmins{\CurrentOption}{\tw@\tw@}

98
For German texts we need to make sure that \frenchspacing is turned on.
22.55 \expandafter\addto\csname extras\CurrentOption\endcsname{%
22.56 \bbl@frenchspacing}
22.57 \expandafter\addto\csname noextras\CurrentOption\endcsname{%

22.58 \bbl@nonfrenchspacing}

The code above is necessary because we need an extra active character. This
character is then used as indicated in table 4.
To be able to dene the function of ", we rst dene a couple of `support'
macros.

\dq We save the original double quote character in \dq to keep it available, the math
accent \" can now be typed as ".
22.59 \begingroup \catcode`\"12
22.60 \def\x{\endgroup
22.61 \def\@SS{\mathchar"7019 }
22.62 \def\dq{"}}
22.63 \x

Now we can dene the doublequote macros: the umlauts,


22.64 \declare@shorthand{ngerman}{"a}{\textormath{\"{a}\allowhyphens}{\ddot a}}
22.65 \declare@shorthand{ngerman}{"o}{\textormath{\"{o}\allowhyphens}{\ddot o}}
22.66 \declare@shorthand{ngerman}{"u}{\textormath{\"{u}\allowhyphens}{\ddot u}}
22.67 \declare@shorthand{ngerman}{"A}{\textormath{\"{A}\allowhyphens}{\ddot A}}
22.68 \declare@shorthand{ngerman}{"O}{\textormath{\"{O}\allowhyphens}{\ddot O}}
22.69 \declare@shorthand{ngerman}{"U}{\textormath{\"{U}\allowhyphens}{\ddot U}}
tremas,
22.70 \declare@shorthand{ngerman}{"e}{\textormath{\"{e}}{\ddot e}}
22.71 \declare@shorthand{ngerman}{"E}{\textormath{\"{E}}{\ddot E}}
22.72 \declare@shorthand{ngerman}{"i}{\textormath{\"{\i}}%

22.73 {\ddot\imath}}
22.74 \declare@shorthand{ngerman}{"I}{\textormath{\"{I}}{\ddot I}}

german es-zet (sharp s),


22.75 \declare@shorthand{ngerman}{"s}{\textormath{\ss}{\@SS{}}}
22.76 \declare@shorthand{ngerman}{"S}{\SS}
22.77 \declare@shorthand{ngerman}{"z}{\textormath{\ss}{\@SS{}}}

22.78 \declare@shorthand{ngerman}{"Z}{SZ}

german and french quotes,


22.79 \declare@shorthand{ngerman}{"`}{\glqq}
22.80 \declare@shorthand{ngerman}{"'}{\grqq}
22.81 \declare@shorthand{ngerman}{"<}{\flqq}

22.82 \declare@shorthand{ngerman}{">}{\frqq}

and some additional commands:


22.83 \declare@shorthand{ngerman}{"-}{\nobreak\-\bbl@allowhyphens}
22.84 \declare@shorthand{ngerman}{"|}{%
22.85 \textormath{\penalty\@M\discretionary{-}{}{\kern.03em}%
22.86 \allowhyphens}{}}
22.87 \declare@shorthand{ngerman}{""}{\hskip\z@skip}

22.88 \declare@shorthand{ngerman}{"~}{\textormath{\leavevmode\hbox{-}}{-}}

22.89 \declare@shorthand{ngerman}{"=}{\penalty\@M-\hskip\z@skip}

99
\mdqon All that's left to do now is to dene a couple of commands for reasons of compat-
\mdqoff ibility with german.sty.
22.90 \def\mdqon{\shorthandon{"}}
22.91 \def\mdqoff{\shorthandoff{"}}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
22.92 \ldf@finish\CurrentOption
22.93 h/codei

100
23 The Breton language
The le breton.dtx18 denes all the language-specic macros for the Breton lan-
guage.
There are not really typographic rules for the Breton language. It is a local
language (it's one of the celtic languages) which is spoken in Brittany (West of
France). So we have a synthesis between french typographic rules and english
typographic rules. The characters :, ;, ! and ? are made active in order to get a
whitespace automatically before these characters.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
23.1 h∗codei
23.2 \LdfInit{breton}\captionsbreton
When this le is read as an option, i.e. by the \usepackage command, breton
will be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@breton to see whether we have to do something here.
23.3 \ifx\l@breton\@undefined
23.4 \@nopatterns{Breton}
23.5 \adddialect\l@breton0\fi
The next step consists of dening commands to switch to the English language.
The reason for this is that a user might want to switch back and forth between
languages.

\captionsbreton The macro \captionsbreton denes all strings used in the four standard docu-
ment classes provided with LATEX.
\addto\captionsbreton{%
23.6

23.7\def\prefacename{Rakskrid}%
23.8 \def\refname{Daveenno\`u}%
23.9 \def\abstractname{Dvierra\~n}%
23.10 \def\bibname{Lennadurezh}%
23.11 \def\chaptername{Pennad}%
23.12 \def\appendixname{Stagadenn}%
23.13 \def\contentsname{Taolenn}%
23.14 \def\listfigurename{Listenn ar Figurenno\`u}%
23.15 \def\listtablename{Listenn an taolenno\`u}%
23.16 \def\indexname{Meneger}%
23.17 \def\figurename{Figurenn}%
23.18 \def\tablename{Taolenn}%
23.19 \def\partname{Lodenn}%
23.20 \def\enclname{Diello\`u kevret}%
23.21 \def\ccname{Eilskrid da}%
23.22 \def\headtoname{evit}
23.23 \def\pagename{Pajenn}%
23.24 \def\seename{Gwelout}%
23.25 \def\alsoname{Gwelout ivez}%
23.26 \def\proofname{Proof}% <-- needs translation
23.27 \def\glossaryname{Glossary}% <-- Needs translation
23.28 }

18 The le described in this section has version number v1.0h and was last revised on
2005/03/29.

101
\datebreton The macro \datebreton redenes the command \today to produce Breton dates.

23.29 \def\datebreton{%
23.30 \def\today{\ifnum\day=1\relax 1\/$^{\rm a\tilde{n}}$\else
23.31 \number\day\fi \space a\space viz\space\ifcase\month\or
23.32 Genver\or C'hwevrer\or Meurzh\or Ebrel\or Mae\or Mezheven\or
23.33 Gouere\or Eost\or Gwengolo\or Here\or Du\or Kerzu\fi
23.34 \space\number\year}}

\extrasbreton The macro \extrasbreton will perform all the extra denitions needed for the
\noextrasbreton Breton language. The macro \noextrasbreton is used to cancel the actions of
\extrasbreton.
The category code of the characters :, ;, ! and ? is made \active to insert
a little white space.
23.35 \initiate@active@char{:}
23.36 \initiate@active@char{;}
23.37 \initiate@active@char{!}

23.38 \initiate@active@char{?}

We specify that the breton group of shorthands should be used.


23.39 \addto\extrasbreton{\languageshorthands{breton}}
These characters are `turned on' once, later their denition may vary.
23.40 \addto\extrasbreton{%
23.41 \bbl@activate{:}\bbl@activate{;}%
23.42 \bbl@activate{!}\bbl@activate{?}}
Don't forget to turn the shorthands o again.
23.43 \addto\noextrasbreton{%
23.44 \bbl@deactivate{:}\bbl@deactivate{;}%
23.45 \bbl@deactivate{!}\bbl@deactivate{?}}
The last thing \extrasbreton needs to do is to make sure that \frenchspacing
is in eect. If this is not the case the execution of \noextrasbreton will switch
it of again.
23.46 \addto\extrasbreton{\bbl@frenchspacing}
23.47 \addto\noextrasbreton{\bbl@nonfrenchspacing}

\breton@sh@;@ We have to reduce the amount of white space before ;, : and ! when the user types
a space in front of these characters. This should only happen outside mathmode,
hence the test with \ifmmode.
23.48 \declare@shorthand{breton}{;}{%
23.49 \ifmmode
23.50 \string;\space
23.51 \else\relax
In horizontal mode we check for the presence of a `space' and replace it by a
\thinspace.
23.52 \ifhmode
23.53 \ifdim\lastskip>\z@
23.54 \unskip\penalty\@M\thinspace
23.55 \fi
23.56 \fi
23.57 \string;\space
23.58 \fi}%

102
\breton@sh@:@ Because these denitions are very similar only one is displayed in a way that the
\breton@sh@!@ denition can be easily checked.
23.59 \declare@shorthand{breton}{:}{%
23.60 \ifmmode\string:\space
23.61 \else\relax
23.62 \ifhmode
23.63 \ifdim\lastskip>\z@\unskip\penalty\@M\thinspace\fi
23.64 \fi
23.65 \string:\space
23.66 \fi}
23.67 \declare@shorthand{breton}{!}{%

23.68 \ifmmode\string!\space
23.69 \else\relax
23.70 \ifhmode
23.71 \ifdim\lastskip>\z@\unskip\penalty\@M\thinspace\fi
23.72 \fi
23.73 \string!\space
23.74 \fi}

\breton@sh@?@ For the question mark something dierent has to be done. In this case the amount
of white space that replaces the space character depends on the dimensions of the
font.
23.75 \declare@shorthand{breton}{?}{%
23.76 \ifmmode
23.77 \string?\space
23.78 \else\relax
23.79 \ifhmode
23.80 \ifdim\lastskip>\z@
23.81 \unskip
23.82 \kern\fontdimen2\font
23.83 \kern-1.4\fontdimen3\font
23.84 \fi
23.85 \fi
23.86 \string?\space
23.87 \fi}

All that is left to do now is provide the breton user with some extra utilities.
Some denitions for special characters.
23.88 \DeclareTextSymbol{\at}{OT1}{64}
23.89 \DeclareTextSymbol{\at}{T1}{64}
23.90 \DeclareTextSymbolDefault{\at}{OT1}

23.91 \DeclareTextSymbol{\boi}{OT1}{92}

23.92 \DeclareTextSymbol{\boi}{T1}{16}

23.93 \DeclareTextSymbolDefault{\boi}{OT1}

23.94 \DeclareTextSymbol{\circonflexe}{OT1}{94}

23.95 \DeclareTextSymbol{\circonflexe}{T1}{2}

23.96 \DeclareTextSymbolDefault{\circonflexe}{OT1}

23.97 \DeclareTextSymbol{\tild}{OT1}{126}

23.98 \DeclareTextSymbol{\tild}{T1}{3}

23.99 \DeclareTextSymbolDefault{\tild}{OT1}

23.100 \DeclareTextSymbol{\degre}{OT1}{23}

23.101 \DeclareTextSymbol{\degre}{T1}{6}

23.102 \DeclareTextSymbolDefault{\degre}{OT1}

103
The following macros are used in the redenition of \^ and \" to handle the
letter i.
23.103 \AtBeginDocument{%
23.104 \DeclareTextCompositeCommand{\^}{OT1}{i}{\^\i}
23.105 \DeclareTextCompositeCommand{\"}{OT1}{i}{\"\i}}
And some more macros for numbering.
23.106 \def\kentan{1\/${}^{\rm a\tilde{n}}$}
23.107 \def\eil{2\/${}^{\rm l}$}
23.108 \def\re{\/${}^{\rm re}$}

23.109 \def\trede{3\re}

23.110 \def\pevare{4\re}

23.111 \def\vet{\/${}^{\rm vet}$}

23.112 \def\pempvet{5\vet}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
23.113 \ldf@finish{breton}
23.114 h/codei

104
24 The Welsh language
The le welsh.dtx19 denes all the language denition macros for the Welsh
language.
For this language currently no special denitions are needed or available.
The macro \ldf@init takes care of preventing that this le is loaded more
than once, checking the category code of the @ sign, etc.
24.1 h∗codei
24.2 \LdfInit{welsh}{captionswelsh}
When this le is read as an option, i.e. by the \usepackage command, welsh
could be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@welsh to see whether we have to do something here.
24.3 \ifx\undefined\l@welsh
24.4 \@nopatterns{welsh}
24.5 \adddialect\l@welsh0\fi
The next step consists of dening commands to switch to (and from) the Welsh
language.

\welshhyphenmins This macro is used to store the correct values of the hyphenation parameters
\lefthyphenmin and \righthyphenmin.
24.6 \providehyphenmins{\CurrentOption}{\tw@\thr@@}

\captionswelsh The macro \captionswelsh denes all strings used in the four standard docu-
mentclasses provided with LATEX.
\def\captionswelsh{%
24.7

24.8\def\prefacename{Rhagair}%
24.9 \def\refname{Cyfeiriadau}%
24.10 \def\abstractname{Crynodeb}%
24.11 \def\bibname{Llyfryddiaeth}%
24.12 \def\chaptername{Pennod}%
24.13 \def\appendixname{Atodiad}%
24.14 \def\contentsname{Cynnwys}%
24.15 \def\listfigurename{Rhestr Ddarluniau}%
24.16 \def\listtablename{Rhestr Dablau}%
24.17 \def\indexname{Mynegai}%
24.18 \def\figurename{Darlun}%
24.19 \def\tablename{Taflen}%
24.20 \def\partname{Rhan}%
24.21 \def\enclname{amgae\"edig}%
24.22 \def\ccname{cop\"\i au}%
24.23 \def\headtoname{At}% % `at' on letters meaning `to ( a person)'
24.24 % `to (a place)' is `i' in Welsh
24.25 \def\pagename{tudalen}%
24.26 \def\seename{gweler}%
24.27 \def\alsoname{gweler hefyd}%
24.28 \def\proofname{Prawf}%
24.29 \def\glossaryname{Rhestr termau}%
24.30 }
19 The le described in this section has version number v1.0d and was last revised on
2005/03/31.

105
\datewelsh The macro \datewelsh redenes the command \today to produce welsh dates.
24.31 \def\datewelsh{%
24.32 \def\today{\ifnum\day=1\relax 1\/$^{\mathrm{a\tilde{n}}}$\else
24.33 \number\day\fi\space\ifcase\month\or
24.34 Ionawr\or Chwefror\or Mawrth\or Ebrill\or
24.35 Mai\or Mehefin\or Gorffennaf\or Awst\or
24.36 Medi\or Hydref\or Tachwedd\or Rhagfyr\fi
24.37 \space\number\year}}

\extraswelsh The macro \extraswelsh will perform all the extra denitions needed for the
\noextraswelsh welsh language. The macro \noextraswelsh is used to cancel the actions of
\extraswelsh. For the moment these macros are empty but they are dened for
compatibility with the other language denition les.
24.38 \addto\extraswelsh{}
24.39 \addto\noextraswelsh{}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
24.40 \ldf@finish{welsh}
24.41 h/codei

106
25 The Irish language
The le irish.dtx20 denes all the language denition macros for the Irish lan-
guage.
For this language currently no special denitions are needed or available.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
25.1 h∗codei
25.2 \LdfInit{irish}\captionsirish
When this le is read as an option, i.e. by the \usepackage command, irish
could be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@irish to see whether we have to do something here.
25.3 \ifx\l@irish\@undefined
25.4 \@nopatterns{irish}
25.5 \adddialect\l@irish0\fi
The next step consists of dening commands to switch to (and from) the Irish
language.

\irishhyphenmins This macro is used to store the correct values of the hyphenation parameters
\lefthyphenmin and \righthyphenmin.
25.6 \providehyphenmins{\CurrentOption}{\tw@\thr@@}

\captionsirish The macro \captionsirish denes all strings used in the four standard docu-
mentclasses provided with LATEX.
\addto\captionsirish{%
25.7

25.8\def\prefacename{R\'eamhr\'a}% <-- also "Brollach"


25.9 \def\refname{Tagairt\'{\i}}%
25.10 \def\abstractname{Achoimre}%
25.11 \def\bibname{Leabharliosta}%
25.12 \def\chaptername{Caibidil}%
25.13 \def\appendixname{Aguis\'{\i}n}%
25.14 \def\contentsname{Cl\'ar \'Abhair}%
25.15 \def\listfigurename{L\'ear\'aid\'{\i}}%
25.16 \def\listtablename{T\'abla\'{\i}}%
25.17 \def\indexname{Inn\'eacs}%
25.18 \def\figurename{L\'ear\'aid}%
25.19 \def\tablename{T\'abla}%
25.20 \def\partname{Cuid}%
25.21 \def\enclname{faoi iamh}%
25.22 \def\ccname{cc}% abrv. `c\'oip chuig'
25.23 \def\headtoname{Go}%
25.24 \def\pagename{Leathanach}%
25.25 \def\seename{f\'each}%
25.26 \def\alsoname{f\'each freisin}%
25.27 \def\proofname{Cruth\'unas}%
25.28 \def\glossaryname{Glossary}% <-- Needs translation
25.29 }
20 The le described in this section has version number v1.0h and was last revised on
2005/03/30. A contribution was made by Marion Gunn.

107
\dateirish The macro \dateirish redenes the command \today to produce Irish dates.
25.30 \def\dateirish{%
25.31 \def\today{%
25.32 \number\day\space \ifcase\month\or
25.33 Ean\'air\or Feabhra\or M\'arta\or Aibre\'an\or
25.34 Bealtaine\or Meitheamh\or I\'uil\or L\'unasa\or
25.35 Me\'an F\'omhair\or Deireadh F\'omhair\or
25.36 M\'{\i} na Samhna\or M\'{\i} na Nollag\fi
25.37 \space \number\year}}

\extrasirish The macro \extrasirish will perform all the extra denitions needed for the
\noextrasirish Irish language. The macro \noextrasirish is used to cancel the actions of
\extrasirish. For the moment these macros are empty but they are dened
for compatibility with the other language denition les.
25.38 \addto\extrasirish{}
25.39 \addto\noextrasirish{}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
25.40 \ldf@finish{irish}
25.41 h/codei

108
26 The Scottish language
The le scottish.dtx21 denes all the language denition macros for the Scottish
language.
For this language currently no special denitions are needed or available.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
26.1 h∗codei
26.2 \LdfInit{scottish}\captionsscottish
When this le is read as an option, i.e. by the \usepackage command,
scottish could be an `unknown' language in which case we have to make it
known. So we check for the existence of \l@scottish to see whether we have to
do something here.
26.3 \ifx\l@scottish\@undefined
26.4 \@nopatterns{scottish}
26.5 \adddialect\l@scottish0\fi
The next step consists of dening commands to switch to (and from) the Scottish
language.

\captionsscottish The macro \captionsscottish denes all strings used in the four standard doc-
umentclasses provided with LATEX.
\addto\captionsscottish{%
26.6

26.7\def\prefacename{Preface}% <-- needs translation


26.8 \def\refname{Iomraidh}%
26.9 \def\abstractname{Br\`{\i}gh}%
26.10 \def\bibname{Leabhraichean}%
26.11 \def\chaptername{Caibideil}%
26.12 \def\appendixname{Ath-sgr`{\i}obhadh}%
26.13 \def\contentsname{Cl\`ar-obrach}%
26.14 \def\listfigurename{Liosta Dhealbh }%
26.15 \def\listtablename{Liosta Chl\`ar}%
26.16 \def\indexname{Cl\`ar-innse}%
26.17 \def\figurename{Dealbh}%
26.18 \def\tablename{Cl\`ar}%
26.19 \def\partname{Cuid}%
26.20 \def\enclname{a-staigh}%
26.21 \def\ccname{lethbhreac gu}%
26.22 \def\headtoname{gu}%
26.23 \def\pagename{t.d.}% abrv. `taobh duilleag'
26.24 \def\seename{see}% <-- needs translation
26.25 \def\alsoname{see also}% <-- needs translation
26.26 \def\proofname{Proof}% <-- needs translation
26.27 \def\glossaryname{Glossary}% <-- Needs translation
26.28 }

\datescottish The macro \datescottish redenes the command \today to produce Scottish
dates.
26.29 \def\datescottish{%
26.30 \def\today{%
21 The le described in this section has version number v1.0g and was last revised on
2005/03/31. A contribution was made by Fraser Grant (FRASER@CERNVM).

109
26.31 \number\day\space \ifcase\month\or
26.32 am Faoilteach\or an Gearran\or am M\`art\or an Giblean\or
26.33 an C\`eitean\or an t-\`Og mhios\or an t-Iuchar\or
26.34 L\`unasdal\or an Sultuine\or an D\`amhar\or
26.35 an t-Samhainn\or an Dubhlachd\fi
26.36 \space \number\year}}

\extrasscottish The macro \extrasscottish will perform all the extra denitions needed for the
\noextrasscottish Scottish language. The macro \noextrasscottish is used to cancel the actions of
\extrasscottish. For the moment these macros are empty but they are dened
for compatibility with the other language denition les.
26.37 \addto\extrasscottish{}
26.38 \addto\noextrasscottish{}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
26.39 \ldf@finish{scottish}
26.40 h/codei

110
27 The Greek language
The le greek.dtx22 denes all the language denition macros for the Greek
language, i.e., as it used today with only one accent, and the attribute πoλυτ oνκó
(Polutoniko) for typesetting greek text with all accents. This separation arose
out of the need to simplify things, for only very few people will be really interested
to typeset polytonic Greek text.
\greektext The commands \greektext and \latintext can be used to switch to greek
\latintext or latin fonts. These are declarations.
\textgreek The commands \textgreek and \textlatin both take one argument which is
\textlatin then typeset using the requested font encoding. The command \greekol switches
\textol to the greek outline font family, while the command \textol typests a short text
in outline font. A number of extra greek characters are made available through the
added text commands \stigma, \qoppa, \sampi, \ddigamma, \Digamma, \euro,
\permill, and \vardigamma.

27.1 Typing conventions


Entering greek text can be quite dicult because of the many diacritical signs that
need to be added for various purposes. The fonts that are used to typeset Greek
make this a lot easier by oering a lot of ligatures. But in order for this to work,
some characters need to be considered as letters. These characters are <, >, ~, `,
', " and |. Therefore their \lccode is changed when Greek is in eect. In order
to let \uppercase give correct results, the \uccode of these characters is set to a
non-existing character to make them disappear. Of course not all characters are
needed when typesetting modern µoνoτ oνικó. In that case we only need the '
and " symbols which are treated in the proper way.

27.2 Greek numbering


The Greek alphabetical numbering system, like the Roman one, is still used in
everyday life for short enumerations. Unfortunately most Greeks don't know how
to write Greek numbers bigger than 20 or 30. Nevertheless, in ocial editions of
the last century and beginning of this century this numbering system was also used
for dates and numbers in the range of several thousands. Nowadays this numbering
system is primary used by the Eastern Orthodox Church and by certain scholars.
It is hence necessary to be able to typeset any Greek numeral up to 999 999. Here
are the conventions:

• There is no Greek numeral for any number less than or equal to 0.


• Numbers from 1 to 9 are denoted by letters alpha, beta, gamma, delta,
epsilon, stigma, zeta, eta, theta, followed by a mark similar to the math-
ematical symbol prime. (Nowadays instead of letter stigma the digraph
sigma tau is used for number 6. Mainly because the letter stigma is not
always available, so people opt to write down the rst two letters of its name
22 The le described in this section has version number v1.3l and was last revised on
2005/03/30. The original author is Apostolos Syropoulos (apostolo@platon.ee.duth.gr), code
from kdgreek.sty by David Kastrup dak@neuroinformatik.ruhr-uni-bochum.de was used to
enhance the support for typesetting greek texts.

111
as an alternative. In our implementation we produce the letter stigma, not
the digraph sigma tau.)
• Decades from 10 to 90 are denoted by letters iota, kappa, lambda, mu, nu,
xi, omikron, pi, qoppa, again followed by the numeric mark. The qoppa used
for this purpose has a special zig-zag form, which doesn't resemble at all the
original `q'-like qoppa.
• Hundreds from 100 to 900 are denoted by letters rho, sigma, tau, upsilon,
phi, chi, psi, omega, sampi, followed by the numeric mark.
• Any number between 1 and 999 is obtained by a group of letters denoting
the hundreds decades and units, followed by a numeric mark.
• To denote thousands one uses the same method, but this time the mark is
placed in front of the letter, and under the baseline (it is inverted by 180
degrees). When a group of letters denoting thousands is followed by a group
of letters denoting a number under 1000, then both marks are used.
\greeknumeral Using these conventions one obtains numbers up to 999 999. The command
\greeknumeral makes it possible to typeset Greek numerals. There is also an
\Greeknumeral uppercase version of this macro: \Greeknumeral.
Another system which was in wide use only in Athens, could express any
positive number. This system is implemented in package athnum.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
27.1 h∗codei
27.2 \LdfInit\CurrentOption{captions\CurrentOption}
When the option polutonikogreek was used, redene \CurrentOption to prevent
problems later on.
27.3 \gdef\CurrentOption{greek}%
When this le is read as an option, i.e. by the \usepackage command, greek
could be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@greek to see whether we have to do something here.
27.4 \ifx\l@greek\@undefined
27.5 \@nopatterns{greek}
27.6 \adddialect\l@greek0\fi
Now we declare the polutoniko language attribute.
27.7 \bbl@declare@ttribute{greek}{polutoniko}{%
This code adds the expansion of \extraspolutonikogreek to \extrasgreek and
changes the denition of \today for Greek to produce polytonic month names.
27.8 \expandafter\addto\expandafter\extrasgreek
27.9 \expandafter{\extraspolutonikogreek}%
27.10 \let\captionsgreek\captionspolutonikogreek
27.11 \let\gr@month\gr@c@month
We need to take some extra precautions in order not to break older documents
which still use the old polutonikogreek option.
27.12 \let\l@polutonikogreek\l@greek
27.13 \let\datepolutonikogreek\dategreek
27.14 \let\extraspolutonikogreek\extrasgreek

112
27.15 \let\noextraspolutonikogreek\noextrasgreek
27.16 }
Typesetting Greek texts implies that a special set of fonts needs to be used.
The current support for greek uses the cb fonts created by Claudio Beccari23 .
The cb fonts provide all sorts of font combinations. In order to use these fonts we
dene the Local GReek encoding (LGR, see the le greek.fdd). We make sure
that this encoding is known to LATEX, and if it isn't we abort.
27.17 \InputIfFileExists{lgrenc.def}{%
27.18 \message{Loading the definitions for the Greek font encoding}}{%
27.19 \errhelp{I can't find the lgrenc.def file for the Greek fonts}%
27.20 \errmessage{Since I do not know what the LGR encoding means^^J
27.21 I can't typeset Greek.^^J
27.22 I stop here, while you get a suitable lgrenc.def file}\@@end
27.23 }
Now we dene two commands that oer the possibility to switch between Greek
and Roman encodings.

\greektext The command \greektext will switch from Latin font encoding to the Greek font
encoding. This assumes that the `normal' font encoding is a Latin one. This
command is a declaration, for shorter pieces of text the command \textgreek
should be used.
27.24 \DeclareRobustCommand{\greektext}{%
27.25 \fontencoding{LGR}\selectfont
27.26 \def\encodingdefault{LGR}}

\textgreek This command takes an argument which is then typeset using the requested font
encoding. In order to avoid many encoding switches it operates in a local scope.
27.27 \DeclareRobustCommand{\textgreek}[1]{\leavevmode{\greektext #1}}

\textol A last aspect of the set of fonts provided with this version of support for typesetting
Greek texts is that it contains an outline family. In order to make it available we
dene the command \textol.
27.28 \def\outlfamily{\usefont{LGR}{cmro}{m}{n}}
27.29 \DeclareTextFontCommand{\textol}{\outlfamily}

The next step consists in dening commands to switch to (and from) the Greek
language.

\greekhyphenmins This macro is used to store the correct values of the hyphenation parameters
\lefthyphenmin and \righthyphenmin.
27.30 % Yannis Haralambous has suggested this value
27.31 \providehyphenmins{\CurrentOption}{\@ne\@ne}

\captionsgreek The macro \captionsgreek denes all strings used in the four standard document
classes provided with LATEX.
27.32 \addto\captionsgreek{%
27.33 \def\prefacename{Pr'ologos}%
27.34 \def\refname{Anafor'es}%
23 Apostolos Syropoulos wishes to thank him for his patience, collaboration, cooments and
suggestions.

113
27.35 \def\abstractname{Per'ilhyh}%
27.36 \def\bibname{Bibliograf'ia}%
27.37 \def\chaptername{Kef'alaio}%
27.38 \def\appendixname{Par'arthma}%
27.39 \def\contentsname{Perieq'omena}%
27.40 \def\listfigurename{Kat'alogos Sqhm'atwn}%
27.41 \def\listtablename{Kat'alogos Pin'akwn}%
27.42 \def\indexname{Euret'hrio}%
27.43 \def\figurename{Sq'hma}%
27.44 \def\tablename{P'inakas}%
27.45 \def\partname{M'eros}%
27.46 \def\enclname{Sunhmm'ena}%
27.47 \def\ccname{Koinopo'ihsh}%
27.48 \def\headtoname{Pros}%
27.49 \def\pagename{Sel'ida}%
27.50 \def\seename{bl'epe}%
27.51 \def\alsoname{bl'epe ep'ishs}%
27.52 \def\proofname{Ap'odeixh}%
27.53 \def\glossaryname{Glwss'ari}%
27.54 }

\captionspolutonikogreek For texts written in the πoλυτ oνκó (polytonic greek) the translations are the
same as above, but some words are spelled dierently. For now we just add extra
denitions to \captionsgreek in order to override the earlier denitions.
27.55 \let\captionspolutonikogreek\captionsgreek
27.56 \addto\captionspolutonikogreek{%
27.57 \def\refname{>Anafor`es}%
27.58 \def\indexname{E<uret'hrio}%
27.59 \def\figurename{Sq~hma}%
27.60 \def\headtoname{Pr`os}%
27.61 \def\alsoname{bl'epe >ep'ishs}%
27.62 \def\proofname{>Ap'odeixh}%
27.63 }

\gr@month The macro \dategreek redenes the command \today to produce greek dates.
\dategreek The name of the month is now produced by the macro \gr@month since it is needed
in the denition of the macro \Grtoday.
27.64 \def\gr@month{%
27.65 \ifcase\month\or
27.66 Ianouar'iou\or Febrouar'iou\or Mart'iou\or April'iou\or
27.67 Ma'"iou\or Ioun'iou\or Ioul'iou\or Augo'ustou\or
27.68 Septembr'iou\or Oktwbr'iou\or Noembr'iou\or Dekembr'iou\fi}
27.69 \def\dategreek{%

27.70 \def\today{\number\day \space \gr@month\space \number\year}}

\gr@c@greek
27.71 \def\gr@c@month{%
27.72 \ifcase\month\or >Ianouar'iou\or
27.73 Febrouar'iou\or Mart'iou\or >April'iou\or Ma"'iou\or
27.74 >Ioun'iou\or >Ioul'iou\or A>ugo'ustou\or Septembr'iou\or
27.75 >Oktwbr'iou\or Noembr'iou\or Dekembr'iou\fi}

114
\Grtoday The macro \Grtoday produces the current date, only that the month and the day
are shown as greek numerals instead of arabic as it is usually the case.
27.76 \def\Grtoday{%
27.77 \expandafter\Greeknumeral\expandafter{\the\day}\space
27.78 \gr@c@month \space
27.79 \expandafter\Greeknumeral\expandafter{\the\year}}

\extrasgreek The macro \extrasgreek will perform all the extra denitions needed for the
\noextrasgreek Greek language. The macro \noextrasgreek is used to cancel the actions of
\extrasgreek. For the moment these macros switch the fontencoding used and
the denition of the internal macros \@alph and \@Alph because in Greek we do
use the Greek numerals.
27.80 \addto\extrasgreek{\greektext}
27.81 \addto\noextrasgreek{\latintext}

\gr@ill@value When the argument of \greeknumeral has a value outside of the acceptable
bounds (0 < x < 999999) a warning will be issued (and nothing will be printed).
27.82 \def\gr@ill@value#1{%
27.83 \PackageWarning{babel}{Illegal value (#1) for greeknumeral}}

\anw@true When a a large number with three trailing zero's is to be printed those zeros and
\anw@false the numeric mark need to be discarded. As each `digit' is processed by a separate
\anw@print macro and because the processing needs to be expandable we need some helper
macros that help remember to not print the numeric mark (\anwtonos).
The command \anw@false switches the printing of the numeric mark o by
making \anw@print expand to nothing. The command \anw@true (re)enables the
printing of the numeric marc. These macro's need to be robust in order to prevent
improper expansion during writing to les or during \uppercase.
27.84 \DeclareRobustCommand\anw@false{%
27.85 \DeclareRobustCommand\anw@print{}}
27.86 \DeclareRobustCommand\anw@true{%

27.87 \DeclareRobustCommand\anw@print{\anwtonos}}
27.88 \anw@true

\greeknumeral The command \greeknumeral needs to be fully expandable in order to get the
right information in auxiliary les. Therefore we use a big \if-construction to
check the value of the argument and start the parsing at the right level.
27.89 \def\greeknumeral#1{%
If the value is negative or zero nothing is printed and a warning is issued.
27.90 \ifnum#1<\@ne\space\gr@ill@value{#1}%
27.91 \else
27.92 \ifnum#1<10\expandafter\gr@num@i\number#1%
27.93 \else
27.94 \ifnum#1<100\expandafter\gr@num@ii\number#1%
27.95 \else
We use the available shorthands for 1.000 (\@m) and 10.000 (\@M) to save a few
tokens.
27.96 \ifnum#1<\@m\expandafter\gr@num@iii\number#1%
27.97 \else
27.98 \ifnum#1<\@M\expandafter\gr@num@iv\number#1%

115
27.99 \else
27.100 \ifnum#1<100000\expandafter\gr@num@v\number#1%
27.101 \else
27.102 \ifnum#1<1000000\expandafter\gr@num@vi\number#1%
27.103 \else
If the value is too large, nothing is printed and a warning is issued.
27.104 \space\gr@ill@value{#1}%
27.105 \fi
27.106 \fi
27.107 \fi
27.108 \fi
27.109 \fi
27.110 \fi
27.111 \fi
27.112 }

\Greeknumeral The command \Greeknumeral prints uppercase greek numerals. The parsing is
performed by the macro \greeknumeral.
27.113 \def\Greeknumeral#1{%
27.114 \expandafter\MakeUppercase\expandafter{\greeknumeral{#1}}}

\greek@alph In the previous release of this language denition the commands \greek@aplh and
\greek@Alph \greek@Alph were kept just for reasons of compatibility. Here again they become
meaningful macros. They are denited in a way that even page numbering with
greek numerals is possible. Since the macros \@alph and \@Alph will lose their
original meaning while the Greek option is active, we must save their original
value. macros \@alph
27.115 \let\latin@alph\@alph
27.116 \let\latin@Alph\@Alph
Then we dene the Greek versions; the additional \expandafters are needed
in order to make sure the table of contents will be correct, e.g., when we have
appendixes.
27.117 \def\greek@alph#1{\expandafter\greeknumeral\expandafter{\the#1}}
27.118 \def\greek@Alph#1{\expandafter\Greeknumeral\expandafter{\the#1}}
Now we can set up the switching.
27.119 \addto\extrasgreek{%
27.120 \let\@alph\greek@alph
27.121 \let\@Alph\greek@Alph}
27.122 \addto\noextrasgreek{%

27.123 \let\@alph\latin@alph
27.124 \let\@Alph\latin@Alph}

\greek@roman To prevent roman numerals being typeset in greek letters we need to adopt the
\greek@Roman internal LATEX commands \@roman and \@Roman. Note that this may cause
errors where roman ends up in a situation where it needs to be expanded;
problems are known to exist with the AMS document classes.
27.125 \let\latin@roman\@roman
27.126 \let\latin@Roman\@Roman
27.127 \def\greek@roman#1{\textlatin{\latin@roman{#1}}}

27.128 \def\greek@Roman#1{\textlatin{\latin@Roman{#1}}}

27.129 \addto\extrasgreek{%

116
27.130 \let\@roman\greek@roman
27.131 \let\@Roman\greek@Roman}
27.132 \addto\noextrasgreek{%

27.133 \let\@roman\latin@roman
27.134 \let\@Roman\latin@Roman}

\greek@amp The greek fonts do not contain an ampersand, so the LATEX command \& dosn't
\ltx@amp give the expected result if we do not do something about it.
27.135 \let\ltx@amp\&
27.136 \def\greek@amp{\textlatin{\ltx@amp}}
27.137 \addto\extrasgreek{\let\&\greek@amp}

27.138 \addto\noextrasgreek{\let\&\ltx@amp}

What is left now is the denition of a set of macros to produce the various
digits.
\gr@num@i As there is no representation for 0 in this system the zeros are simply discarded.
\gr@num@ii When we have a large number with three trailing zero's also the numeric mark
\gr@num@iii is discarded. Therefore these macros need to pass the information to each other
about the (non-)translation of a zero.
27.139 \def\gr@num@i#1{%
27.140 \ifcase#1\or a\or b\or g\or d\or e\or \stigma\or z\or h\or j\fi
27.141 \ifnum#1=\z@\else\anw@true\fi\anw@print}
27.142 \def\gr@num@ii#1{%

27.143 \ifcase#1\or i\or k\or l\or m\or n\or x\or o\or p\or \qoppa\fi
27.144 \ifnum#1=\z@\else\anw@true\fi\gr@num@i}
27.145 \def\gr@num@iii#1{%

27.146 \ifcase#1\or r\or sv\or t\or u\or f\or q\or y\or w\or \sampi\fi
27.147 \ifnum#1=\z@\anw@false\else\anw@true\fi\gr@num@ii}

\gr@num@iv The rst three `digits' always have the numeric mark, except when one is discarded
\gr@num@v because it's value is zero.
\gr@num@vi27.148 \def\gr@num@iv#1{%
27.149 \ifnum#1=\z@\else\katwtonos\fi
27.150 \ifcase#1\or a\or b\or g\or d\or e\or \stigma\or z\or h\or j\fi
27.151 \gr@num@iii}
27.152 \def\gr@num@v#1{%

27.153 \ifnum#1=\z@\else\katwtonos\fi
27.154 \ifcase#1\or i\or k\or l\or m\or n\or x\or o\or p\or \qoppa\fi
27.155 \gr@num@iv}
27.156 \def\gr@num@vi#1{%

27.157 \katwtonos
27.158 \ifcase#1\or r\or sv\or t\or u\or f\or q\or y\or w\or \sampi\fi
27.159 \gr@num@v}

\greek@tilde In greek typesetting we need a number of characters with more than one accent. In
the underlying family of fonts (the cb fonts) this is solved using Knuth's ligature
mechanism. Characters we need to have ligatures with are the tilde, the acute
and grave accent characters, the rough and smooth breathings, the subscript,
and the double quote character. In text input the ~ is normaly used to produce
an unbreakable space. The command \~ normally produces a tilde accent. For
polytonic Greek we change the denition of \~ to produce the tilde character itself,
making sure it has category code 12.

117
27.160 \begingroup
27.161 \@ifundefined{active@char\string!}{}{\catcode`!=12\relax}
27.162 \catcode`\~=12
27.163 \lccode`\!=`\~
27.164 \lowercase{\def\x{\endgroup
27.165 \def\greek@tilde{!}}\x}
27.166 \addto\extraspolutonikogreek{%

27.167 \babel@save\~\let\~\greek@tilde}

In order to get correct hyphenation we need to set the lower case code of a number
of characters. The `v' character has a special usage for the cb fonts: in fact this
ligature mechanism detects the end of a word and assures that a nal sigma is
typeset with the proper sign wich is dierent from that of an initial or medial
sigma; the `v 'after an isolated sigma fools the ligature mechanism in order to
typeset σ in place of ς . Because of this we make sure its lowercase code is not
changed. For modern greek we have to deal only with ' and " and so things are
easy.
27.168 \addto\extrasgreek{%
27.169 \babel@savevariable{\lccode`v}\lccode`v=`v%
27.170 \babel@savevariable{\lccode`\'}\lccode`\'=`\'%
27.171 \babel@savevariable{\lccode`\"}\lccode`\"=`\"}
27.172 \addto\extraspolutonikogreek{%

27.173 \babel@savevariable{\lccode`\<}\lccode`\<=`\<%
27.174 \babel@savevariable{\lccode`\>}\lccode`\>=`\>%
27.175 \babel@savevariable{\lccode`\~}\lccode`\~=`\~%
27.176 \babel@savevariable{\lccode`\|}\lccode`\|=`\|%
27.177 \babel@savevariable{\lccode`\`}\lccode`\`=`\`}
And in order to get rid of all accents and breathings when a string is \uppercased
we also change a number of uppercase codes.
27.178 \addto\extrasgreek{%
27.179 \babel@savevariable{\uccode`\"}\uccode`\"=`\"%
27.180 \babel@savevariable{\uccode`\'}\uccode`\'=159} %% 159 == ^^9f
27.181 \addto\extraspolutonikogreek{%

27.182 \babel@savevariable{\uccode`\~}\uccode`\~=159%
27.183 \babel@savevariable{\uccode`\>}\uccode`\>=159%
27.184 \babel@savevariable{\uccode`\<}\uccode`\<=159%
27.185 \babel@savevariable{\uccode`\|}\uccode`\|=`\|%
27.186 \babel@savevariable{\uccode`\`}\uccode`\`=159}
For this to work we make the character ^^9f a shorthand that expands to nothing.
In order for this to work we need to make a character look like ^^9f in TEX's eyes.
The trick is to have another character and assign it a dierent lowercase code.
The execute the macros needed in a \lowercase environment. Usually the tile
~ character is used for such purposes. Before we do this we save it's original
lowercase code to restore it once we're done.
27.187 \@tempcnta=\lccode`\~
27.188 \lccode`\~=159
27.189 \lowercase{%

27.190 \initiate@active@char{~}%
27.191 \declare@shorthand{greek}{~}{}}
27.192 \lccode`\~=\@tempcnta

118
We can also make the tilde character itself expand to a tilde with category code
12 to make the typing of texts easier.
27.193 \addto\extraspolutonikogreek{\languageshorthands{greek}}%
27.194 \declare@shorthand{greek}{~}{\greek@tilde}

We now dene a few symbols which are used in the typesetting of greek nu-
merals, as well as some other symbols which are usefull, such as the υρω symbol,
etc.
27.195 \DeclareTextCommand{\anwtonos}{LGR}{\char"FE\relax}
27.196 \DeclareTextCommand{\katwtonos}{LGR}{\char"FF\relax}
27.197 \DeclareTextCommand{\qoppa}{LGR}{\char"12\relax}

27.198 \DeclareTextCommand{\stigma}{LGR}{\char"06\relax}

27.199 \DeclareTextCommand{\sampi}{LGR}{\char"1B\relax}

27.200 \DeclareTextCommand{\Digamma}{LGR}{\char"C3\relax}

27.201 \DeclareTextCommand{\ddigamma}{LGR}{\char"93\relax}

27.202 \DeclareTextCommand{\vardigamma}{LGR}{\char"07\relax}

27.203 \DeclareTextCommand{\euro}{LGR}{\char"18\relax}

27.204 \DeclareTextCommand{\permill}{LGR}{\char"19\relax}

Since the ~ cannot be used to produce an unbreakable white space we must


redene at least the commands \fnum@figure and \fnum@table so they do not
produce a ~ instead of white space.
27.205 %\def\fnum@figure{\figurename\nobreakspace\thefigure}
27.206 %\def\fnum@table{\tablename\nobreakspace\thetable}
The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
27.207 \ldf@finish{\CurrentOption}
27.208 h/codei

119
28 The French language
The le frenchb.dtx24 , denes all the language denition macros for the French
language.
Customisation for the French language is achieved following the book Lexique
des règles typographiques en usage à l'Imprimerie nationale troisième édition
(1994), ISBN-2-11-081075-0.
First version released: 1.1 (1996/05/31) as part of babel-3.6beta.
frenchb has been improved using helpful suggestions from many people,
mainly from Jacques André, Michel Bovani, Thierry Bouche, and Vincent Jalby.
Thanks to all of them!
This new version (2.x) has been designed to be used with LATEX 2ε and
PlainTEX formats only. LATEX-2.09 is no longer supported. Changes between
version 1.6 and ? are listed in subsection 28.4 p. 125.
An extensive documentation is available in French here:
http://daniel.flipo.free.fr/frenchb

28.1 Basic interface


In a multilingual document, some typographic rules are language dependent, i.e.
spaces before `double punctuation' (: ; ! ?) in French, others concern the general
layout (i.e. layout of lists, footnotes, indentation of rst paragraphs of sections)
and should apply to the whole document.
Starting with version 2.2, frenchb behaves dierently according to babel's
main language dened as the last option at babel's loading. When French is not
25

babel's main language, frenchb no longer alters the global layout of the document
(even in parts where French is the current language): the layout of lists, footnotes,
indentation of rst paragraphs of sections are not customised by frenchb.
When French is loaded as the last option of babel, frenchb makes the following
changes to the global layout, both in French and in all other languages 26 :

1. the rst paragraph of each section is indented (LATEX only);

2. the default items in itemize environment are set to `' instead of `•', and all
vertical spacing and glue is deleted; it is possible to change `' to something
else (`' for instance) using \frenchbsetup{};

3. vertical spacing in general LATEX lists is shortened;

4. footnotes are displayed à la française.

Regarding local typography, the command \selectlanguage{french} switches


to the French language27 , with the following eects:

1. French hyphenation patterns are made active;


24 The le described in this section has version number ? and was last revised on ?.
25 Its name is kept in \bbl@main@language.
26 For each item, hooks are provided to reset standard LAT X settings or to emulate the behavior
E
of former versions of frenchb (see command \frenchbsetup{}, section 28.2).
27 \selectlanguage{francais} and \selectlanguage{frenchb} are kept for backward com-
patibility but should no longer be used.

120
2. `double punctuation' (: ; ! ?) is made active28 for correct spacing in French;

3. \today prints the date in French;

4. the caption names are translated into French (LATEX only);

5. the space after \dots is removed in French.

Some commands are provided in frenchb to make typesetting easier:

1. French quotation marks can be entered using the commands \og and \fg
which work in LATEX 2ε and PlainTEX, their appearance depending on what
is available to draw them; even if you use LATEX 2ε and T1-encoding, you
should refrain from entering them as <<~French quotation marks~>>: \og
and \fg provide better horizontal spacing. \og and \fg can be used outside
French, they typeset then English quotes  and .

2. A command \up is provided to typeset superscripts like M\up{me} (abbre-


viation for Madame), 1\up{er} (for premier). Other commands are also
provided for ordinals: \ier, \iere, \iers, \ieres, \ieme, \iemes (3\iemes
prints 3es ).

3. Family names should be typeset in small capitals and never be hyphenated,


the macro \bsc (boxed small caps) does this, e.g., Leslie~\bsc{Lamport}
will produce Leslie Lamport. Note that composed names (such as Dupont-
Durant) may now be hyphenated on explicit hyphens, this diers from
frenchb v.1.x.
4. Commands \primo, \secundo, \tertio and \quarto print 1o , 2o , 3o , 4o .
\FrenchEnumerate{6} prints 6o .
5. Abbreviations for Numéro(s) and numéro(s) (No Nos no and nos ) are
obtained via the commands \No, \Nos, \no, \nos.

6. Two commands are provided to typeset the symbol for degré: \degre prints
the raw character and \degres should be used to typeset temperatures (e.g.,
 20~\degres C with an unbreakable space), or for alcohols' strengths (e.g.,
 45\degres with no space in French).

7. In math mode the comma has to be surrounded with braces to avoid a


spurious space being inserted after it, in decimal numbers for instance (see
the TEXbook p. 134). The command \DecimalMathComma makes the comma
be an ordinary character in French only (no space added); as a counterpart,
if \DecimalMathComma is active, an explicit space has to be added in lists
and intervals: $[0,\ 1]$, $(x,\ y)$. \StandardMathComma switches back
to the standard behaviour of the comma.

8. A command \nombre was provided in 1.x versions to easily format numbers


in slices of three digits separated either by a comma in English or with a
space in French; \nombre is now mapped to \numprint from numprint.sty,
see numprint.pdf for more information.
28 Actually, they are active in the whole document, only their expansions dier in French and
outside French

121
9. frenchb has been designed to take advantage of the xspace package if
present: adding \usepackage{xspace} in the preamble will force macros
like \fg, \ier, \ieme, \dots, . . . , to respect the spaces you type after them,
for instance typing `1\ier juin' will print `1er juin' (no need for a forced
space after 1\ier).

28.2 Customisation
Up to version 1.6, customisation of frenchb was achieved by entering commands in
frenchb.cfg. This possibility remains for compatibility, but should not longer be
used. Version 2.0 introduces a new command \frenchbsetup{} using the keyval
syntax which should make it easier to choose among the many options available.
The command \frenchbsetup{} is to appear in the preamble only (after loading
babel).
\frenchbsetup{ShowOptions} prints all available options to the .log le, it
is just meant as a remainder of the list of oered options. As usual with keyval
syntax, boolean options (as ShowOptions) can be entered as ShowOptions=true
or just ShowOptions, the `=true' part can be omitted.
The other options are listed below. Their default value is shown between
brackets, sometimes followed be a `*'. The `*' means that the default shown applies
when frenchb is loaded as the last option of babel babel's main language , and
is toggled otherwise:

• StandardLayout=true [false*] forces frenchb not to interfere with the


layout: no action on any kind of lists, rst paragraphs of sections are not
indented (as in English), no action on footnotes. This option replaces the
former command \StandardLayout. It can be used to avoid conicts with
classes or packages which customise lists or footnotes.

• GlobalLayoutFrench=false [true*] can be used, when French is the main


language, to emulate what prior versions of frenchb (pre-2.2) did: lists, and
rst paragraphs of sections will be displayed the standard way in other lan-
guages than French, and à la française in French. Note that the layout
of footnotes is language independent anyway (see below FrenchFootnotes
and AutoSpaceFootnotes). This option replaces the former command
\FrenchLayout.
• ReduceListSpacing=false [true*]; frenchb normally reduces the values
of the vertical spaces used in the environment list in French; setting this
option to false reverts to the standard settings of list. This option replaces
the former command \FrenchListSpacingfalse.

• CompactItemize=false [true*]; frenchb normally suppresses any vertical


space between items of itemize lists in French; setting this option to false
reverts to the standard settings of itemize lists. This option replaces the
former command \FrenchItemizeSpacingfalse.

• StandardItemLabels=true [false*] when set to true this option stops


frenchb from changing the labels in itemize lists in French.

122
• ItemLabels=\textemdash, \textbullet, \ding{43}, . . . , [\textendash*];
when StandardItemLabels=false (the default), this option enables to
choose the label used in itemize lists for all levels. The next three op-
tions do the same but each one for one level only. Note that the example
\ding{43} requires \usepackage{pifont}.
• ItemLabeli=\textemdash, \textbullet, \ding{43}, . . . ,[\textendash*]
• ItemLabelii=\textemdash, \textbullet, \ding{43}, . . . , [\textendash*]

• ItemLabeliii=\textemdash, \textbullet, \ding{43}, . . . , [\textendash*]


• ItemLabeliv=\textemdash, \textbullet, \ding{43}, . . . , [\textendash*]
• StandardLists=true [false*] forbids frenchb to customise any kind of
list. Do activate the option StandardLists when using classes or pack-
ages that customise lists too (enumitem, paralist, . . . ) to avoid con-
icts. This option is just a shorthand for ReduceListSpacing=false and
CompactItemize=false and StandardItemLabels=true.
• IndentFirst=false [true*]; frenchb normally forces indentation of the
rst paragraph of sections. When this option is set to false, the rst para-
graph of will look the same in French and in English (not indented).

• FrenchFootnotes=false [true*] reverts to the standard layout of foot-


notes. By default frenchb typesets leading numbers as `1. ' instead
of `1 ', but has no eect on footnotes numbered with symbols (as in the
\thanks command). The former commands \StandardFootnotes and
\FrenchFootnotes are still there, \StandardFootnotes can be useful when
some footnotes are numbered with letters (inside minipages for instance).

• AutoSpaceFootnotes=false [true*] ; by default frenchb adds a thin


space in the running text before the number or symbol calling the foot-
note. Making this option false reverts to the standard setting (no space
added).

• FrenchSuperscripts=false [true] ; then \up=\textsuperscript (op-


tion added in version 2.1). Should only be made false to recompile older
documents. By default \up now relies on \fup designed to produce better
looking superscripts.

• AutoSpacePunctuation=false [true]; in French, the user should input a


space before the four characters `:;!?' but as many people forget about it
(even among native French writers!), the default behaviour of frenchb is to
automatically add a \thinspace before `;' `!' `?' and a normal (unbreakable)
space before `:' (recommended by the French Imprimerie nationale). This
is convenient in most cases but can lead to addition of spurious spaces in
URLs or in MS-DOS paths. Choosing AutoSpacePunctuation=false will
ensure that a proper space will be added before `:;!?' if and only if a
(normal) space has been typed in. Those who are unsure about their typing
in this area should stick to the default option and type \string; \string:
\string! \string? instead of ; : ! ? whenever no space should be added
before them (mostly in URLs and MS-DOS paths).

123
• ThinColonSpace=true [false] changes the normal (unbreakable) space
added before the colon `:' to a thin space, so that the same amount of
space is added before any of the four double punctuation characters. The
default setting is supported by the French Imprimerie nationale.

• LowercaseSuperscripts=false [true] ; by default frenchb inhibits the


uppercasing of superscripts (for instance when they are moved to page head-
ers). Making this option false will disable this behaviour (not recom-
mended).

• PartNameFull=false [true]; when true, frenchb numbers the title of


\part{} commands as Première partie, Deuxième partie and so on. With
some classes which change the\part{} command (AMS and SMF classes do
so), you will get Première partie I, Deuxième partie II instead; when this
occurs, this option should be set to false, part titles will then be printed
as Partie I, Partie II.

• og=, fg=; when guillemets characters are available on the keyboard


(through a compose key for instance), it is nice to use them instead of typing
\og and \fg. This option tells frenchb which characters are opening and
closing French guillemets (they depend on the input encoding), then you can
type either  guillemets , or guillemets (with or without spaces), to
get properly typeset French quotes. This option requires inputenc to be
loaded with the proper encoding, it works with 8-bits encodings (latin1,
latin9, ansinew, applemac,. . . ) and multi-byte encodings (utf8 and utf8x).

28.3 Hyphenation checks


Once you have built your format, a good precaution would be to perform some
basic tests about hyphenation in French. For LATEX 2ε I suggest this:

• run the following le, with the encoding suitable for your machine (my-
encoding will be latin1 for unix machines, ansinew for PCs running Win-
dows, applemac or latin1 for Macintoshs, or utf8. . .

%%% Test file for French hyphenation.


\documentclass{article}
\usepackage[my-encoding ]{inputenc}
\usepackage[T1]{fontenc} % Use LM fonts
\usepackage{lmodern} % for French
\usepackage[frenchb]{babel}
\begin{document}
\showhyphens{signal container \'ev\'enement alg\`ebre}
\showhyphens{signal container événement algèbre}
\end{document}
• check the hyphenations proposed by TEX in your log-le; in French you
should get with both 7-bit and 8-bit encodings
si-gnal contai-ner évé-ne-ment al-gèbre.
Do not care about how accented characters are displayed in the log-le, what
matters is the position of the `-' hyphen signs only.

124
If they are all correct, your installation (probably) works ne, if one (or more) is
(are) wrong, ask a local wizard to see what's going wrong and perform the test
again (or e-mail me about what happens).
Frequent mismatches:
• you get sig-nal con-tainer, this probably means that the hyphenation
patterns you are using are for US-English, not for French;
• you get no hyphen at all in évé-ne-ment, this probably means that you
are using CM fonts and the macro \accent to produce accented charac-
ters. Using 8-bits fonts with built-in accented characters avoids this kind of
mismatch.
Options' order  Please remember that options are read in the order they ap-
pear inside the \frenchbsetup command. Someone wishing that frenchb leaves
the layout of lists and footnotes untouched but caring for indentation of rst para-
graph of sections could choose \frenchbsetup{StandardLayout,IndentFirst}
and get the expected layout. Choosing \frenchbsetup{IndentFirst,StandardLayout}
would not lead to the expected result: option IndentFirst would be overwritten
by StandardLayout.

28.4 Changes
What's new in version 2.0?
Here is the list of all changes:
• Support for LATEX-2.09 and for LATEX 2ε in compatibility mode has been
dropped. This version is meant for LATEX 2ε and Plain based formats (like
bplain). LATEX 2ε formats based on mlTEX are no longer supported either
(plenty of good 8-bits fonts are available now, so T1 encoding should be
preferred for typesetting in French). A warning is issued when OT1 encoding
is in use at the \begin{document}.
• Customisation should now be handled by command \frenchbsetup{},
frenchb.cfg (kept for compatibility) should no longer be used. See sec-
tion 28.2 for the list of available options.
• Captions in gures and table have changed in French: former abbreviations
Fig. and Tab. have been replaced by full names Figure and Table. If
this leads to formatting problems in captions, you can add the following two
commands to your preamble (after loading babel) to get the former captions
\addto\captionsfrench{\def\figurename{{\scshape Fig.}}}
\addto\captionsfrench{\def\tablename{{\scshape Tab.}}}.
• The \nombre command is now provided by the numprint package which has
to be loaded after babel with the option autolanguage if number formatting
should depend on the current language.
• The \bsc command no longer uses an \hbox to stop hyphenation of names
but a \kern0pt instead. This change enables microtype to ne tune the
length of the argument of \bsc; as a side-eect, compound names like
Dupont-Durand can now be hyphenated on explicit hyphens. You can get
back to the former behaviour of \bsc by adding

125
\renewcommand*{\bsc}[1]{\leavevmode\hbox{\scshape #1}}
to the preamble of your document.

• Footnotes are now displayed à la française for the whole document, except
with an explicit
\frenchbsetup{AutoSpaceFootnotes=false,FrenchFootnotes=false}.
Add this command if you want standard footnotes. It is still pos-
sible to revert locally to the standard layout of footnotes by adding
\StandardFootnotes (inside a minipage environment for instance).

What's new in version 2.1?


New command \fup to typeset better looking superscripts. Former command \up
is now dened as \fup, but an option \frenchbsetup{FrenchSuperscripts=false}
is provided for backward compatibility. \fup was designed using ideas from
Jacques André, Thierry Bouche and René Fritz, thanks to them!

What's new in version 2.2?


Starting with version 2.2a, frenchb alters the layout of lists, footnotes, and the
indentation of rst paragraphs of sections) only if French is the main language
(i.e. babel's last language option). The layout is global for the whole document:
lists, etc. look the same in French and in other languages, everything is typeset
à la française if French is the main language, otherwise frenchb doesn't change
anything regarding lists, footnotes, and indentation of paragraphs.

28.5 File frenchb.cfg


frenchb.cfg is now a dummy le just kept for compatibility with previous ver-
sions.
28.1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
28.2 %%%%%%%%% WARNING: THIS FILE SHOULD NO LONGER BE USED %%%%%%%%%
28.3 %% If you want to customise frenchb, please DO NOT hack into the code!

28.4 %% Do no put any code in this file either, please use the new command

28.5 %% \frenchbsetup{} with the proper options to customise frenchb.

28.6 %%

28.7 %% Add \frenchbsetup{ShowOptions} to your preamble to see the list of

28.8 %% available options and/or read the documentation.

28.9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

29 TEXnical details
29.1 Initial setup
While this le was read through the option frenchb we make it behave as if french
was specied.
29.1 \def\CurrentOption{french}
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
29.2 \LdfInit\CurrentOption\datefrench

126
\ifLaTeXe No support is provided for late LATEX-2.09: issue a warning and exit if LATEX-2.09
is in use. Plain is still supported.
\newif\ifLaTeXe
29.3

\let\bbl@tempa\relax
29.4

29.5 \ifx\magnification\@undefined

29.6 \ifx\@compatibilitytrue\@undefined
29.7 \PackageError{frenchb.ldf}
29.8 {LaTeX-2.09 format is no longer supported.\MessageBreak
29.9 Aborting here}
29.10 {Please upgrade to LaTeX2e!}
29.11 \let\bbl@tempa\endinput
29.12 \else
29.13 \LaTeXetrue
29.14 \fi
29.15 \fi

29.16 \bbl@tempa

Check if hyphenation patterns for the French language have been loaded in
language.dat; we allow for the names `french', `francais', `canadien' or `acadian'.
The latter two are both names used in Canada for variants of French that are in
use in that country.
29.17 \ifx\l@french\@undefined
29.18 \ifx\l@francais\@undefined
29.19 \ifx\l@canadien\@undefined
29.20 \ifx\l@acadian\@undefined
29.21 \@nopatterns{French}
29.22 \adddialect\l@french0
29.23 \else
29.24 \let\l@french\l@acadian
29.25 \fi
29.26 \else
29.27 \let\l@french\l@canadien
29.28 \fi
29.29 \else
29.30 \let\l@french\l@francais
29.31 \fi
29.32 \fi

Now \l@french is always dened.


The internal name for the French language is french; francais and frenchb
are synonymous for french: rst let both names use the same hyphenation pat-
terns. Later we will have to set aliases for \captionsfrench, \datefrench,
\extrasfrench and \noextrasfrench. As French uses the standard values of
\lefthyphenmin (2) and \righthyphenmin (3), no special setting is required here.
29.33 \ifx\l@francais\@undefined
29.34 \let\l@francais\l@french
29.35 \fi

29.36 \ifx\l@frenchb\@undefined

29.37 \let\l@frenchb\l@french
29.38 \fi

When this language denition le was loaded for one of the Canadian versions of
French we need to make sure that a suitable hyphenation pattern register will be

127
found by TEX.
29.39 \ifx\l@canadien\@undefined
29.40 \let\l@canadien\l@french
29.41 \fi

29.42 \ifx\l@acadian\@undefined

29.43 \let\l@acadian\l@french
29.44 \fi

This language denition can be loaded for dierent variants of the French
language. The `key' babel macros are only dened once, using `french' as the
language name, but frenchb and francais are synonymous.
29.45 \def\datefrancais{\datefrench}
29.46 \def\datefrenchb{\datefrench}
29.47 \def\extrasfrancais{\extrasfrench}

29.48 \def\extrasfrenchb{\extrasfrench}

29.49 \def\noextrasfrancais{\noextrasfrench}

29.50 \def\noextrasfrenchb{\noextrasfrench}

\extrasfrench The macro \extrasfrench will perform all the extra denitions needed for the
\noextrasfrench French language. The macro \noextrasfrench is used to cancel the actions of
\extrasfrench.
In French, characterapostrophe is a letter in expressions like l'ambulance
(French hyphenation patterns provide entries for this kind of words). This means
that the \lccode of apostrophe has to be non null in French for proper hyphen-
ation of those expressions, and has to be reset to null when exiting French.
29.51 \@namedef{extras\CurrentOption}{\lccode`\'=`\'}
29.52 \@namedef{noextras\CurrentOption}{\lccode`\'=0}

One more thing \extrasfrench needs to do is to make sure that \frenchspacing


is in eect. \noextrasfrench will switch \frenchspacing o again.
29.53 \expandafter\addto\csname extras\CurrentOption\endcsname{%
29.54 \bbl@frenchspacing}
29.55 \expandafter\addto\csname noextras\CurrentOption\endcsname{%
29.56 \bbl@nonfrenchspacing}

29.2 Punctuation
As long as no better solution is available 29 , the `double punctuation' characters
(; ! ? and :) have to be made \active for an automatic control of the amount
of space to insert before them. Before doing so, we have to save the standard
denition of \@makecaption (which includes two ':') to compare it later to its
denition at the \begin{document}.
29.57 \long\def\STD@makecaption#1#2{%
29.58 \vskip\abovecaptionskip
29.59 \sbox\@tempboxa{#1: #2}%
29.60 \ifdim \wd\@tempboxa >\hsize
29.61 #1: #2\par
29.62 \else
29.63 \global \@minipagefalse
29.64 \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
29 LuaT
EX, or pdf TEX might provide alternatives in the future. . .

128
29.65 \fi
29.66 \vskip\belowcaptionskip}%
We dene a new `if' \FBpunct@active which will be made false whenever a
better alternative will be available. The following code makes the four characters
; ! ? and : `active' and provides their denitions.
29.67 \newif\ifFBpunct@active \FBpunct@activetrue
29.68 \ifFBpunct@active
29.69 \initiate@active@char{:}
29.70 \initiate@active@char{;}
29.71 \initiate@active@char{!}
29.72 \initiate@active@char{?}
We rst tune the amount of space before ; ! ? and :. This should only happen
in horizontal mode, hence the test \ifhmode.
In horizontal mode, if a space has been typed before `;' we remove it and
put an unbreakable \thinspace instead. If no space has been typed, we add
\FDP@thinspace which will be dened, up to the user's wishes, as an automatic
added thin space, or as \@empty.
29.73 \declare@shorthand{french}{;}{%
29.74 \ifhmode
29.75 \ifdim\lastskip>\z@
29.76 \unskip\penalty\@M\thinspace
29.77 \else
29.78 \FDP@thinspace
29.79 \fi
29.80 \fi
Now we can insert a ; character.
29.81 \string;}
The next three denitions are very similar.
29.82 \declare@shorthand{french}{!}{%
29.83 \ifhmode
29.84 \ifdim\lastskip>\z@
29.85 \unskip\penalty\@M\thinspace
29.86 \else
29.87 \FDP@thinspace
29.88 \fi
29.89 \fi
29.90 \string!}
29.91 \declare@shorthand{french}{?}{%
29.92 \ifhmode
29.93 \ifdim\lastskip>\z@
29.94 \unskip\penalty\@M\thinspace
29.95 \else
29.96 \FDP@thinspace
29.97 \fi
29.98 \fi
29.99 \string?}
According to the I.N. specications, the `:' requires a normal space before it,
but some people prefer a \thinspace (just like the other three). We dene
\Fcolonspace to hold the required amount of space (user customisable).
29.100 \newcommand*{\Fcolonspace}{\space}

129
29.101 \declare@shorthand{french}{:}{%
29.102 \ifhmode
29.103 \ifdim\lastskip>\z@
29.104 \unskip\penalty\@M\Fcolonspace
29.105 \else
29.106 \FDP@colonspace
29.107 \fi
29.108 \fi
29.109 \string:}

\AutoSpaceBeforeFDP \FDP@thinspace and \FDP@space are dened as unbreakable spaces by


\NoAutoSpaceBeforeFDP \AutoSpaceBeforeFDP or as \@empty by \NoAutoSpaceBeforeFDP.
Default is \AutoSpaceBeforeFDP.
29.110 \def\AutoSpaceBeforeFDP{%
29.111 \def\FDP@thinspace{\penalty\@M\thinspace}%
29.112 \def\FDP@colonspace{\penalty\@M\Fcolonspace}}
29.113 \def\NoAutoSpaceBeforeFDP{\let\FDP@thinspace\@empty
29.114 \let\FDP@colonspace\@empty}
29.115 \AutoSpaceBeforeFDP

When the active characters appear in an environment where their French be-
haviour is not wanted they should give an `expected' result. Therefore we dene
shorthands at system level as well.
29.116 \declare@shorthand{system}{:}{\string:}
29.117 \declare@shorthand{system}{!}{\string!}
29.118 \declare@shorthand{system}{?}{\string?}
29.119 \declare@shorthand{system}{;}{\string;}
We specify that the French group of shorthands should be used.
29.120 \addto\extrasfrench{%
29.121 \languageshorthands{french}%
These characters are `turned on' once, later their denition may vary. Don't
misunderstand the following code: they keep being active all along the document,
even when leaving French.
29.122 \bbl@activate{:}\bbl@activate{;}%
29.123 \bbl@activate{!}\bbl@activate{?}%
29.124 }
29.125 \addto\noextrasfrench{%
29.126 \bbl@deactivate{:}\bbl@deactivate{;}%
29.127 \bbl@deactivate{!}\bbl@deactivate{?}}
29.128 \fi

29.3 French quotation marks


\og The top macros for quotation marks will be called \og (ouvrez guillemets) and
\fg \fg (fermez guillemets). Another option for typesetting quotes in multilingual
texts is to use the package csquotes.sty and its command \enquote.
29.129 \newcommand*{\og}{\@empty}
29.130 \newcommand*{\fg}{\@empty}

\guillemotleft LATEX users are supposed to use 8-bit output encodings (T1, LY1,. . . ) to typeset
\guillemotright French, those who still stick to OT1 should call aeguill.sty or a similar package.

130
In both cases the commands \guillemotleft and \guillemotright will print the
French opening and closing quote characters from the output font. For XeLaTeX,
\guillemotleft and \guillemotright are dened by package xunicode.sty.
We will check `AtBeginDocument' that the proper output encodings are in use
(see end of section 29.13).
We give the following denitions for Plain users only as a (poor) fall-back, they
are welcome to change them for anything better.
29.131 \ifLaTeXe
29.132 \else
29.133 \ifx\guillemotleft\@undefined
29.134 \def\guillemotleft{\leavevmode\raise0.25ex
29.135 \hbox{$\scriptscriptstyle\ll$}}
29.136 \fi
29.137 \ifx\guillemotright\@undefined
29.138 \def\guillemotright{\raise0.25ex
29.139 \hbox{$\scriptscriptstyle\gg$}}
29.140 \fi
29.141 \let\xspace\relax
29.142 \fi

The next step is to provide correct spacing after \guillemotleft and be-
fore \guillemotright: a space precedes and follows quotation marks but no
line break is allowed neither after the opening one, nor before the closing one.
\FBguill@spacing which does the spacing, has been ne tuned by Thierry
Bouche. French quotes (including spacing) are printed by \FB@og and \FB@fg,
the expansion of the top level commands \og and \og is dierent in and outside
French. We'll try to be smart to users of David Carlisle's xspace package: if this
package is loaded there will be no need for {} or \ to get a space after \fg,
otherwise \xspace will be dened as \relax (done at the end of this le).
29.143 \newcommand*{\FBguill@spacing}{\penalty\@M\hskip.8\fontdimen2\font
29.144 plus.3\fontdimen3\font
29.145 minus.8\fontdimen4\font}
29.146 \DeclareRobustCommand*{\FB@og}{\leavevmode

29.147 \guillemotleft\FBguill@spacing}
29.148 \DeclareRobustCommand*{\FB@fg}{\ifdim\lastskip>\z@\unskip\fi

29.149 \FBguill@spacing\guillemotright\xspace}
The top level denitions for French quotation marks are switched on and o
through the \extrasfrench \noextrasfrench mechanism. Outside French, \og
and \fg will typeset standard English opening and closing double quotes.
29.150 \ifLaTeXe
29.151 \def\bbl@frenchguillemets{\renewcommand*{\og}{\FB@og}%
29.152 \renewcommand*{\fg}{\FB@fg}}
29.153 \def\bbl@nonfrenchguillemets{\renewcommand*{\og}{\textquotedblleft}%
29.154 \renewcommand*{\fg}{\ifdim\lastskip>\z@\unskip\fi
29.155 \textquotedblright}}
29.156 \else

29.157 \def\bbl@frenchguillemets{\let\og\FB@og
29.158 \let\fg\FB@fg}
29.159 \def\bbl@nonfrenchguillemets{\def\og{``}%
29.160 \def\fg{\ifdim\lastskip>\z@\unskip\fi ''}}
29.161 \fi

131
29.162 \expandafter\addto\csname extras\CurrentOption\endcsname{%
29.163 \bbl@frenchguillemets}
29.164 \expandafter\addto\csname noextras\CurrentOption\endcsname{%

29.165 \bbl@nonfrenchguillemets}

29.4 Date in French


\datefrench The macro \datefrench redenes the command \today to produce French dates.
29.166 \@namedef{date\CurrentOption}{%
29.167 \def\today{{\number\day}\ifnum1=\day {\ier}\fi \space
29.168 \ifcase\month
29.169 \or janvier\or f\'evrier\or mars\or avril\or mai\or juin\or
29.170 juillet\or ao\^ut\or septembre\or octobre\or novembre\or
29.171 d\'ecembre\fi
29.172 \space \number\year}}

29.5 Extra utilities


Let's provide the French user with some extra utilities.

\up \up eases the typesetting of superscripts like `1er '. Up to version 2.0 of frenchb
\fup \up was just a shortcut for \textsuperscript in LATEX 2ε , but several users com-
plained that \textsuperscript typesets superscripts too high and too big, so we
now dene \fup as an attempt to produce better looking superscripts. \up is de-
ned as \fup but can be redened by \frenchbsetup{FrenchSuperscripts=false}
as \textsuperscript for compatibility with previous versions.
When a font has built-in superscripts, the best thing to do is to just use them,
otherwise \fup has to simulate superscripts by scaling and raising ordinary letters.
Scaling is done using package scalefnt which will be loaded at the end of babel's
loading (frenchb being an option of babel, it cannot load a package while being
read).
29.173 \newif\ifFB@poorman
29.174 \newdimen\FB@Mht
29.175 \ifLaTeXe

29.176 \AtEndOfPackage{\RequirePackage{scalefnt}}
\FB@up@fake holds the denition of fake superscripts. The scaling ratio is 0.65,
raising is computed to put the top of lower case letters (like `m') just under the
top of upper case letters (like `M'), precisely 12% down. The chosen settings look
correct for most fonts, but can be tuned by the end-user if necessary by changing
\FBsupR and \FBsupS commands.
\FB@lc is dened as \lowercase to inhibit the uppercasing of superscripts
(this may happen in page headers with the standard classes but is wrong); \FB@lc
can be redened to do nothing by option LowercaseSuperscripts=false of
\frenchbsetup{}.
29.177 \newcommand*{\FBsupR}{-0.12}
29.178 \newcommand*{\FBsupS}{0.65}
29.179 \newcommand*{\FB@lc}[1]{\lowercase{#1}}
29.180 \DeclareRobustCommand*{\FB@up@fake}[1]{%
29.181 \settoheight{\FB@Mht}{M}%
29.182 \addtolength{\FB@Mht}{\FBsupR \FB@Mht}%
29.183 \addtolength{\FB@Mht}{-\FBsupS ex}%

132
29.184 \raisebox{\FB@Mht}{\scalefont{\FBsupS}{\FB@lc{#1}}}%
29.185 }
The only packages I currently know to take advantage of real superscripts are
a) xltxtra used in conjunction with XeLaTeX and OpenType fonts having the
font feature 'VerticalPosition=Superior' (xltxtra denes \realsuperscript and
\fakesuperscript) and b) fourier (from version 1.6) when Expert Utopia fonts
are available.
\FB@up checks whether the current font is a Type1 `Expert' (or `Pro') font
with real superscripts or not (the code works currently only with fourier-1.6
but could work with any Expert Type1 font with built-in superscripts, see below),
and decides to use real or fake superscripts. It works as follows: the content of
\f@family (family name of the current font) is split by \FB@split into two pieces,
the rst three characters (`fut' for Fourier, `ppl' for Adobe's Palatino, . . . ) stored
in \FB@firstthree and the rest stored in \FB@suffix which is expected to be `x'
or `j' for expert fonts.
29.186 \def\FB@split#1#2#3#4\@nil{\def\FB@firstthree{#1#2#3}%
29.187 \def\FB@suffix{#4}}
29.188 \def\FB@x{x}
29.189 \def\FB@j{j}
29.190 \DeclareRobustCommand*{\FB@up}[1]{%
29.191 \bgroup \FB@poormantrue
29.192 \expandafter\FB@split\f@family\@nil
Then \FB@up looks for a .fd le named t1fut-sup.fd (Fourier) or t1ppl-sup.fd
(Palatino), etc. supposed to dene the subfamily (fut-sup or ppl-sup, etc.)
giving access to the built-in superscripts. If the .fd le is not found by
\IfFileExists, \FB@up falls back on fake superscripts, otherwise \FB@suffix
is checked to decide whether to use fake or real superscripts.
29.193 \edef\reserved@a{\lowercase{%
29.194 \noexpand\IfFileExists{\f@encoding\FB@firstthree -sup.fd}}}%
29.195 \reserved@a
29.196 {\ifx\FB@suffix\FB@x \FB@poormanfalse\fi
29.197 \ifx\FB@suffix\FB@j \FB@poormanfalse\fi
29.198 \ifFB@poorman \FB@up@fake{#1}%
29.199 \else \FB@up@real{#1}%
29.200 \fi}%
29.201 {\FB@up@fake{#1}}%
29.202 \egroup}
\FB@up@real just picks up the superscripts from the subfamily (and forces lower-
case).
29.203 \newcommand*{\FB@up@real}[1]{\bgroup
29.204 \fontfamily{\FB@firstthree -sup}\selectfont \FB@lc{#1}\egroup}
\fup is now dened as \FB@up unless \realsuperscript is dened (occurs with
XeLaTeX calling xltxtra.sty).
29.205 \DeclareRobustCommand*{\fup}[1]{%
29.206 \@ifundefined{realsuperscript}%
29.207 {\FB@up{#1}}%
29.208 {\bgroup\let\fakesuperscript\FB@up@fake
29.209 \realsuperscript{\FB@lc{#1}}\egroup}}
Temporary denition of up (redened `AtBeginDocument').
29.210 \newcommand*{\up}{\relax}

133
Poor man's denition of \up for Plain. In LATEX 2ε , \up will be dened as \fup
or \textsuperscript later on while processing the options of \frenchbsetup{}.
29.211 \else
29.212 \newcommand*{\up}[1]{\leavevmode\raise1ex\hbox{\sevenrm #1}}
29.213 \fi

\ieme Some handy macros for those who don't know how to abbreviate ordinals:
\ier29.214 \def\ieme{\up{\lowercase{e}}\xspace}
\iere29.215 \def\iemes{\up{\lowercase{es}}\xspace}
\iemes29.216 \def\ier{\up{\lowercase{er}}\xspace}
\iers29.217 \def\iers{\up{\lowercase{ers}}\xspace}
\ieres29.218 \def\iere{\up{\lowercase{re}}\xspace}
29.219 \def\ieres{\up{\lowercase{res}}\xspace}

\No And some more macros relying on \up for numbering, rst two support macros.
\no29.220 \newcommand*{\FrenchEnumerate}[1]{%
\Nos29.221 #1\up{\lowercase{o}}\kern+.3em}
\nos29.222 \newcommand*{\FrenchPopularEnumerate}[1]{%
\primo29.223 #1\up{\lowercase{o}})\kern+.3em}
\fprimo) Typing \primo should result in `1o ',
29.224 \def\primo{\FrenchEnumerate1}
29.225 \def\secundo{\FrenchEnumerate2}
29.226 \def\tertio{\FrenchEnumerate3}

29.227 \def\quarto{\FrenchEnumerate4}

while typing \fprimo) gives `1o ) .


29.228 \def\fprimo){\FrenchPopularEnumerate1}
29.229 \def\fsecundo){\FrenchPopularEnumerate2}
29.230 \def\ftertio){\FrenchPopularEnumerate3}

29.231 \def\fquarto){\FrenchPopularEnumerate4}

Let's provide four macros for the common abbreviations of Numéro.


29.232 \DeclareRobustCommand*{\No}{N\up{\lowercase{o}}\kern+.2em}
29.233 \DeclareRobustCommand*{\no}{n\up{\lowercase{o}}\kern+.2em}

29.234 \DeclareRobustCommand*{\Nos}{N\up{\lowercase{os}}\kern+.2em}

29.235 \DeclareRobustCommand*{\nos}{n\up{\lowercase{os}}\kern+.2em}

\bsc As family names should be written in small capitals and never be hyphenated, we
provide a command (its name comes from Boxed Small Caps) to input them easily.
Note that this command has changed with version 2 of frenchb: a \kern0pt is
used instead of \hbox because \hbox would break microtype's font expansion; as
a (positive?) side eect, composed names (such as Dupont-Durand) can now be
hyphenated on explicit hyphens. Usage: Jean~\bsc{Duchemin}.
29.236 \DeclareRobustCommand*{\bsc}[1]{\leavevmode\begingroup\kern0pt
29.237 \scshape #1\endgroup}
29.238 \ifLaTeXe\else\let\scshape\relax\fi

Some denitions for special characters. We won't dene \tilde as a Text


Symbol not to conict with the macro \tilde for math mode and use the name
\tild instead. Note that \boi may not be used in math mode, its name in math
mode is \backslash. \degre can be accessed by the command \r{} for ring
accent.

134
29.239 \ifLaTeXe
29.240 \DeclareTextSymbol{\at}{T1}{64}
29.241 \DeclareTextSymbol{\circonflexe}{T1}{94}
29.242 \DeclareTextSymbol{\tild}{T1}{126}
29.243 \DeclareTextSymbolDefault{\at}{T1}
29.244 \DeclareTextSymbolDefault{\circonflexe}{T1}
29.245 \DeclareTextSymbolDefault{\tild}{T1}
29.246 \DeclareRobustCommand*{\boi}{\textbackslash}
29.247 \DeclareRobustCommand*{\degre}{\r{}}
29.248 \else

29.249 \def\T@one{T1}
29.250 \ifx\f@encoding\T@one
29.251 \newcommand*{\degre}{\char6}
29.252 \else
29.253 \newcommand*{\degre}{\char23}
29.254 \fi
29.255 \newcommand*{\at}{\char64}
29.256 \newcommand*{\circonflexe}{\char94}
29.257 \newcommand*{\tild}{\char126}
29.258 \newcommand*{\boi}{$\backslash$}
29.259 \fi

\degres We now dene a macro \degres for typesetting the abbreviation for `degrees'
(as in `degrees Celsius'). As the bounding box of the character `degree' has very
dierent widths in CM/EC and PostScript fonts, we x the width of the bounding
box of \degres to 0.3 em, this lets the symbol `degree' stick to the preceding (e.g.,
45\degres) or following character (e.g., 20~\degres C).
If the TEX Companion fonts are available (textcomp.sty), we pick up
\textdegree from them instead of using emulating `degrees' from the \r{} accent.
Otherwise we overwrite the (poor) denition of \textdegree given in latin1.def,
applemac.def etc. (called by inputenc.sty) by our denition of \degres. We
also advice the user (once only) to use TS1-encoding.
29.260 \ifLaTeXe
29.261 \newcommand*{\degres}{\degre}
29.262 \def\Warning@degree@TSone{%
29.263 \PackageWarning{frenchb.ldf}{%
29.264 Degrees would look better in TS1-encoding:
29.265 \MessageBreak add \protect
29.266 \usepackage{textcomp} to the preamble.
29.267 \MessageBreak Degrees used}}
29.268 \AtBeginDocument{\expandafter\ifx\csname M@TS1\endcsname\relax
29.269 \DeclareRobustCommand*{\degres}{%
29.270 \leavevmode\hbox to 0.3em{\hss\degre\hss}%
29.271 \Warning@degree@TSone
29.272 \global\let\Warning@degree@TSone\relax}%
29.273 \let\textdegree\degres
29.274 \else
29.275 \DeclareRobustCommand*{\degres}{%
29.276 \hbox{\UseTextSymbol{TS1}{\textdegree}}}%
29.277 \fi}
29.278 \else

29.279 \newcommand*{\degres}{%
29.280 \leavevmode\hbox to 0.3em{\hss\degre\hss}}

135
29.281 \fi

29.6 Formatting numbers


\DecimalMathComma As mentioned in the TEXbook p. 134, the comma is of type \mathpunct in
\StandardMathComma math mode: it is automatically followed by a space. This is convenient in lists
and intervals but unpleasant when the comma is used as a decimal separator
in French: it has to be entered as {,}. \DecimalMathComma makes the comma
be an ordinary character (of type \mathord) in French only (no space added);
\StandardMathComma switches back to the standard behaviour of the comma.
29.282 \newcount\std@mcc
29.283 \newcount\dec@mcc
29.284 \std@mcc=\mathcode`\,

29.285 \dec@mcc=\std@mcc

29.286 \@tempcnta=\std@mcc

29.287 \divide\@tempcnta by "1000

29.288 \multiply\@tempcnta by "1000

29.289 \advance\dec@mcc by -\@tempcnta

29.290 \newcommand*{\DecimalMathComma}{\iflanguage{french}%

29.291 {\mathcode`\,=\dec@mcc}{}%
29.292 \addto\extrasfrench{\mathcode`\,=\dec@mcc}}
29.293 \newcommand*{\StandardMathComma}{\mathcode`\,=\std@mcc

29.294 \addto\extrasfrench{\mathcode`\,=\std@mcc}}
29.295 \expandafter\addto\csname noextras\CurrentOption\endcsname{%

29.296 \mathcode`\,=\std@mcc}
\nombre The command \nombre is now borrowed from numprint.sty for LATEX 2ε . There
is no point to maintain the former tricky code when a package is dedicated to
do the same job and more. For Plain based formats, \nombre no longer formats
numbers, it prints them as is and issues a warning about the change.
Fake command \nombre for Plain based formats, warning users of frenchb
v.1.x. of the change.
29.297 \newcommand*{\nombre}[1]{{#1}\message{%
29.298 *** \noexpand\nombre no longer formats numbers\string! ***}}%
The next denitions only make sense for LATEX 2ε . Let's cleanup and exit if
the format in Plain based.
29.299 \let\FBstop@here\relax
29.300 \def\FBclean@on@exit{\let\ifLaTeXe\@undefined
29.301 \let\LaTeXetrue\@undefined
29.302 \let\LaTeXefalse\@undefined}
29.303 \ifx\magnification\@undefined

29.304 \else

29.305 \def\FBstop@here{\let\STD@makecaption\relax
29.306 \FBclean@on@exit
29.307 \ldf@quit\CurrentOption\endinput}
29.308 \fi

29.309 \FBstop@here

What follows now is for LATEX 2ε only. We redene \nombre for LATEX 2ε . A
warning is issued at the rst call of \nombre if \numprint is not dened, suggest-
ing what to do. The package numprint is not loaded automatically by frenchb
because of possible options conict.

136
29.310 \renewcommand*{\nombre}[1]{\Warning@nombre\numprint{#1}}
29.311 \newcommand*{\Warning@nombre}{%
29.312 \@ifundefined{numprint}%
29.313 {\PackageWarning{frenchb.ldf}{%
29.314 \protect\nombre\space now relies on package numprint.sty,
29.315 \MessageBreak add \protect
29.316 \usepackage[autolanguage]{numprint}\MessageBreak
29.317 to your preamble *after* loading babel, \MessageBreak
29.318 see file numprint.pdf for other options.\MessageBreak
29.319 \protect\nombre\space called}%
29.320 \global\let\Warning@nombre\relax
29.321 \global\let\numprint\relax
29.322 }{}%
29.323 }

29.324 \newcommand*{\ThinSpaceInFrenchNumbers}{%
29.325 \PackageWarning{frenchb.ldf}{%
29.326 Type \protect\frenchbsetup{ThinSpaceInFrenchNumbers}
29.327 \MessageBreak Command \protect\ThinSpaceInFrenchNumbers\space
29.328 is no longer\MessageBreak defined in frenchb v.2,}}

29.7 Caption names


The next step consists of dening the French equivalents for the LATEX caption
names.

\captionsfrench Let's rst dene \captionsfrench which sets all strings used in the four standard
document classes provided with LATEX.
29.329 \@namedef{captions\CurrentOption}{%
29.330 \def\refname{R\'ef\'erences}%
29.331 \def\abstractname{R\'esum\'e}%
29.332 \def\bibname{Bibliographie}%
29.333 \def\prefacename{Pr\'eface}%
29.334 \def\chaptername{Chapitre}%
29.335 \def\appendixname{Annexe}%
29.336 \def\contentsname{Table des mati\`eres}%
29.337 \def\listfigurename{Table des figures}%
29.338 \def\listtablename{Liste des tableaux}%
29.339 \def\indexname{Index}%
29.340 \def\figurename{{\scshape Figure}}%
29.341 \def\tablename{{\scshape Table}}%
Première partie instead of Part I.
29.342 \def\partname{\protect\@Fpt partie}%
29.343 \def\@Fpt{{\ifcase\value{part}\or Premi\`ere\or Deuxi\`eme\or
29.344 Troisi\`eme\or Quatri\`eme\or Cinqui\`eme\or Sixi\`eme\or
29.345 Septi\`eme\or Huiti\`eme\or Neuvi\`eme\or Dixi\`eme\or Onzi\`eme\or
29.346 Douzi\`eme\or Treizi\`eme\or Quatorzi\`eme\or Quinzi\`eme\or
29.347 Seizi\`eme\or Dix-septi\`eme\or Dix-huiti\`eme\or Dix-neuvi\`eme\or
29.348 Vingti\`eme\fi}\space\def\thepart{}}%
29.349 \def\pagename{page}%
29.350 \def\seename{{\emph{voir}}}%
29.351 \def\alsoname{{\emph{voir aussi}}}%
29.352 \def\enclname{P.~J. }%

137
29.353 \def\ccname{Copie \`a }%
29.354 \def\headtoname{}%
29.355 \def\proofname{D\'emonstration}%
29.356 \def\glossaryname{Glossaire}%
29.357 }

As some users who choose frenchb or francais as option of babel, might


customise \captionsfrenchb or \captionsfrancais in the preamble, we merge
their changes at the \begin{document} when they do so. The other variants of
French (canadien, acadian) are dened by checking if the relevant option was used
and then adding one extra level of expansion.
29.358 \AtBeginDocument{\let\captions@French\captionsfrench
29.359 \@ifundefined{captionsfrenchb}%
29.360 {\let\captions@Frenchb\relax}%
29.361 {\let\captions@Frenchb\captionsfrenchb}%
29.362 \@ifundefined{captionsfrancais}%
29.363 {\let\captions@Francais\relax}%
29.364 {\let\captions@Francais\captionsfrancais}%
29.365 \def\captionsfrench{\captions@French
29.366 \captions@Francais\captions@Frenchb}%
29.367 \def\captionsfrancais{\captionsfrench}%
29.368 \def\captionsfrenchb{\captionsfrench}%
29.369 \iflanguage{french}{\captionsfrench}{}%
29.370 }
29.371 \@ifpackagewith{babel}{canadien}{%

29.372 \def\captionscanadien{\captionsfrench}%
29.373 \def\datecanadien{\datefrench}%
29.374 \def\extrascanadien{\extrasfrench}%
29.375 \def\noextrascanadien{\noextrasfrench}%
29.376 }{}
29.377 \@ifpackagewith{babel}{acadian}{%

29.378 \def\captionsacadian{\captionsfrench}%
29.379 \def\dateacadian{\datefrench}%
29.380 \def\extrasacadian{\extrasfrench}%
29.381 \def\noextrasacadian{\noextrasfrench}%
29.382 }{}

\CaptionSeparator Let's consider now captions in gures and tables. In French, captions in gures
and tables should be printed with endash (`') instead of the standard `:'.
The standard denition of \@makecaption (e.g., the one provided in article.cls,
report.cls, book.cls which is frozen for LATEX 2ε according to Frank Mittelbach),
has been saved in \STD@makecaption before making `:' active (see section 29.2).
`AtBeginDocument' we compare it to its current denition (some classes like
koma-script classes, AMS classes, ua-thesis.cls. . . change it). If they are iden-
tical, frenchb just adds a hook called \CaptionSeparator to \@makecaption,
\CaptionSeparator defaults to `: ' as in the standard \@makecaption, and will
be changed to `  ' in French. If the denitions dier, frenchb doesn't overwrite
the changes, but prints a message in the .log le.
29.383 \def\CaptionSeparator{\string:\space}
29.384 \long\def\FB@makecaption#1#2{%
29.385 \vskip\abovecaptionskip
29.386 \sbox\@tempboxa{#1\CaptionSeparator #2}%

138
29.387 \ifdim \wd\@tempboxa >\hsize
29.388 #1\CaptionSeparator #2\par
29.389 \else
29.390 \global \@minipagefalse
29.391 \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
29.392 \fi
29.393 \vskip\belowcaptionskip}
29.394 \AtBeginDocument{%

29.395 \ifx\@makecaption\STD@makecaption
29.396 \global\let\@makecaption\FB@makecaption
29.397 \else
29.398 \@ifundefined{@makecaption}{}%
29.399 {\PackageWarning{frenchb.ldf}%
29.400 {The definition of \protect\@makecaption\space
29.401 has been changed,\MessageBreak
29.402 frenchb will NOT customise it;\MessageBreak reported}%
29.403 }%
29.404 \fi
29.405 \let\FB@makecaption\relax
29.406 \let\STD@makecaption\relax
29.407 }

29.408 \expandafter\addto\csname extras\CurrentOption\endcsname{%

29.409 \def\CaptionSeparator{\space\textendash\space}}
29.410 \expandafter\addto\csname noextras\CurrentOption\endcsname{%

29.411 \def\CaptionSeparator{\string:\space}}

29.8 French lists


\listFB Vertical spacing in general lists should be shorter in French texts than the defaults
\listORI provided by LATEX. Note that the easy way, just changing values of vertical spacing
parameters when entering French and restoring them to their defaults on exit
would not work; as most lists are based on \list we will dene a variant of \list
(\listFB) to be used in French.
The amount of vertical space before and after a list is given by \topsep +
\parskip (+ \partopsep if the list starts a new paragraph). IMHO, \parskip
should be added only when the list starts a new paragraph, so I subtract \parskip
from \topsep and add it back to \partopsep; this will normally make no dierence
because \parskip's default value is 0pt, but will be noticeable when \parskip is
not null.
\endlist is not redened, but \endlistORI is provided for the users who
prefer to dene their own lists from the original command, they can code:
\begin{listORI}{}{} \end{listORI}.
29.412 \let\listORI\list
29.413 \let\endlistORI\endlist
29.414 \def\FB@listsettings{%

29.415 \setlength{\itemsep}{0.4ex plus 0.2ex minus 0.2ex}%


29.416 \setlength{\parsep}{0.4ex plus 0.2ex minus 0.2ex}%
29.417 \setlength{\topsep}{0.8ex plus 0.4ex minus 0.4ex}%
29.418 \setlength{\partopsep}{0.4ex plus 0.2ex minus 0.2ex}%
\parskip is of type `skip', its mean value only (not the glue ) should be subtracted
from \topsep and added to \partopsep, so convert \parskip to a `dimen' using
\@tempdima.

139
29.419 \@tempdima=\parskip
29.420 \addtolength{\topsep}{-\@tempdima}%
29.421 \addtolength{\partopsep}{\@tempdima}}%
29.422 \def\listFB#1#2{\listORI{#1}{\FB@listsettings #2}}%

29.423 \let\endlistFB\endlist

\itemizeFB Let's now consider French itemize lists. They dier from those provided by the
\itemizeORI standard LATEX 2ε classes:
\bbl@frenchlabelitems
\bbl@nonfrenchlabelitems • vertical spacing between items, before and after the list, should be null with
no glue added;

• the item labels of a rst level list should be vertically aligned on the para-
graph's rst character (i.e. at \parindent from the left margin);
• the `•' is never used in French itemize-lists, a long dash `' is preferred for all
levels. The item label used in French is stored in \FrenchLabelItem}, it de-
faults to `' and can be changed using \frenchbsetup{} (see section 29.13).
29.424 \newcommand*{\FrenchLabelItem}{\textendash}
29.425 \newcommand*{\Frlabelitemi}{\FrenchLabelItem}
29.426 \newcommand*{\Frlabelitemii}{\FrenchLabelItem}

29.427 \newcommand*{\Frlabelitemiii}{\FrenchLabelItem}

29.428 \newcommand*{\Frlabelitemiv}{\FrenchLabelItem}

\bbl@frenchlabelitems saves current itemize labels and changes them to their


value in French. This code should never be executed twice in a row, so we
need a new ag that will be set and reset by \bbl@nonfrenchlabelitems and
\bbl@frenchlabelitems.
29.429 \newif\ifFB@enterFrench \FB@enterFrenchtrue
29.430 \def\bbl@frenchlabelitems{%
29.431 \ifFB@enterFrench
29.432 \let\@ltiORI\labelitemi
29.433 \let\@ltiiORI\labelitemii
29.434 \let\@ltiiiORI\labelitemiii
29.435 \let\@ltivORI\labelitemiv
29.436 \let\labelitemi\Frlabelitemi
29.437 \let\labelitemii\Frlabelitemii
29.438 \let\labelitemiii\Frlabelitemiii
29.439 \let\labelitemiv\Frlabelitemiv
29.440 \FB@enterFrenchfalse
29.441 \fi
29.442 }

29.443 \let\itemizeORI\itemize

29.444 \let\enditemizeORI\enditemize

29.445 \let\enditemizeFB\enditemize

29.446 \def\itemizeFB{%

29.447 \ifnum \@itemdepth >\thr@@\@toodeep\else


29.448 \advance\@itemdepth\@ne
29.449 \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
29.450 \expandafter
29.451 \listORI
29.452 \csname\@itemitem\endcsname
29.453 {\settowidth{\labelwidth}{\csname\@itemitem\endcsname}%
29.454 \setlength{\leftmargin}{\labelwidth}%

140
29.455 \addtolength{\leftmargin}{\labelsep}%
29.456 \ifnum\@listdepth=0
29.457 \setlength{\itemindent}{\parindent}%
29.458 \else
29.459 \addtolength{\leftmargin}{\parindent}%
29.460 \fi
29.461 \setlength{\itemsep}{\z@}%
29.462 \setlength{\parsep}{\z@}%
29.463 \setlength{\topsep}{\z@}%
29.464 \setlength{\partopsep}{\z@}%
\parskip is of type `skip', its mean value only (not the glue ) should be subtracted
from \topsep and added to \partopsep, so convert \parskip to a `dimen' using
\@tempdima.
29.465 \@tempdima=\parskip
29.466 \addtolength{\topsep}{-\@tempdima}%
29.467 \addtolength{\partopsep}{\@tempdima}}%
29.468 \fi}
The user's changes in labelitems are saved when leaving French for further use
when switching back to French. This code should never be executed twice in a
row (toggle with \bbl@frenchlabelitems).
29.469 \def\bbl@nonfrenchlabelitems{%
29.470 \ifFB@enterFrench
29.471 \else
29.472 \let\Frlabelitemi\labelitemi
29.473 \let\Frlabelitemii\labelitemii
29.474 \let\Frlabelitemiii\labelitemiii
29.475 \let\Frlabelitemiv\labelitemiv
29.476 \let\labelitemi\@ltiORI
29.477 \let\labelitemii\@ltiiORI
29.478 \let\labelitemiii\@ltiiiORI
29.479 \let\labelitemiv\@ltivORI
29.480 \FB@enterFrenchtrue
29.481 \fi
29.482 }

29.9 French indentation of sections


\bbl@frenchindent In French the rst paragraph of each section should be indented, this is another
\bbl@nonfrenchindent dierence with US-English.
29.483 \let\@aifORI\@afterindentfalse
29.484 \def\bbl@frenchindent{\let\@afterindentfalse\@afterindenttrue
29.485 \@afterindenttrue}
29.486 \def\bbl@nonfrenchindent{\let\@afterindentfalse\@aifORI

29.487 \@afterindentfalse}

29.10 Formatting footnotes


The bigfoot package deeply changes the way footnotes are handled. When
bigfoot is loaded, we just warn the user that frenchb will drop the customi-
sation of footnotes.

141
The layout of footnotes is controlled by two ags \ifFBAutoSpaceFootnotes
and \ifFBFrenchFootnotes which are set by options of \frenchbsetup{} (see
section 29.13). Notice that the layout of footnotes does not depend on the current
language (just think of two footnotes on the same page looking dierent because
one was called in a French part, the other one in English!).
When \ifFBAutoSpaceFootnotes is true, \@footnotemark (whose denition
is saved at the \begin{document} in order to include any customisation that
packages might have done) is redened to add a thin space before the number or
symbol calling a footnote (any space typed in is removed rst). This has no eect
on the layout of the footnote itself.
29.488 \AtBeginDocument{\@ifpackageloaded{bigfoot}%
29.489 {\PackageWarning{frenchb.ldf}%
29.490 {bigfoot package in use.\MessageBreak
29.491 frenchb will NOT customise footnotes;\MessageBreak
29.492 reported}}%
29.493 {\let\@footnotemarkORI\@footnotemark
29.494 \def\@footnotemarkFB{\leavevmode\unskip\unkern
29.495 \,\@footnotemarkORI}%
29.496 \ifFBAutoSpaceFootnotes
29.497 \let\@footnotemark\@footnotemarkFB
29.498 \fi}%
29.499 }
We then dene \@makefntextFB, a variant of \@makefntext which is responsi-
ble for the layout of footnotes, to match the specications of the French `Imprimerie
Nationale': footnotes will be indented by \parindentFFN, numbers (if any) type-
set on the baseline (instead of superscripts) and followed by a dot and an half
quad space. Whenever symbols are used to number footnotes (as in \thanks for
instance), we switch back to the standard layout (the French layout of footnotes
is meant for footnotes numbered by Arabic or Roman digits).
The value of \parindentFFN will be redened at the \begin{document}, as
the maximum of \parindent and 1.5em unless it has been set in the preamble
(the weird value 10in is just for testing whether \parindentFFN has been set or
not).
29.500 \newdimen\parindentFFN
29.501 \parindentFFN=10in
29.502 \def\ftnISsymbol{\@fnsymbol\c@footnote}

29.503 \long\def\@makefntextFB#1{\ifx\thefootnote\ftnISsymbol

29.504 \@makefntextORI{#1}%
29.505 \else
29.506 \parindent=\parindentFFN
29.507 \rule\z@\footnotesep
29.508 \setbox\@tempboxa\hbox{\@thefnmark}%
29.509 \ifdim\wd\@tempboxa>\z@
29.510 \llap{\@thefnmark}.\kern.5em
29.511 \fi #1
29.512 \fi}%
We save the standard denition of \@makefntext at the \begin{document},
and then redene \@makefntext according to the value of ag \ifFBFrenchFootnotes
(true or false).
29.513 \AtBeginDocument{\@ifpackageloaded{bigfoot}{}%

142
29.514 {\ifdim\parindentFFN<10in
29.515 \else
29.516 \parindentFFN=\parindent
29.517 \ifdim\parindentFFN<1.5em\parindentFFN=1.5em\fi
29.518 \fi
29.519 \let\@makefntextORI\@makefntext
29.520 \long\def\@makefntext#1{%
29.521 \ifFBFrenchFootnotes
29.522 \@makefntextFB{#1}%
29.523 \else
29.524 \@makefntextORI{#1}%
29.525 \fi}%
29.526 }%
29.527 }
For compatibility reasons, we provide denitions for the commands dealing
with the layout of footnotes in frenchb version 1.6. \frenchbsetup{} (see in sec-
tion 29.13) should be preferred for setting these options. \StandardFootnotes
may still be used locally (in minipages for instance), that's why the test
\ifFBFrenchFootnotes is done inside \@makefntext.
29.528 \newcommand*{\AddThinSpaceBeforeFootnotes}{\FBAutoSpaceFootnotestrue}
29.529 \newcommand*{\FrenchFootnotes}{\FBFrenchFootnotestrue}
29.530 \newcommand*{\StandardFootnotes}{\FBFrenchFootnotesfalse}

29.11 Global layout


In multilingual documents, some typographic rules must depend on the current
language (e.g., hyphenation, typesetting of numbers, spacing before double punc-
tuation. . . ), others should, IMHO, be kept global to the document: especially the
layout of lists (see 29.8) and footnotes (see 29.10), and the indentation of the rst
paragraph of sections (see 29.9).
From version 2.2 on, if frenchb is babel's main language (i.e. last language
option at babel's loading), frenchb customises the layout (i.e. lists, indentation of
the rst paragraphs of sections and footnotes) in the whole document regardless
the current language. On the other hand, if frenchb is not babel's main language,
it leaves the layout unchanged both in French and in other languages.

\FrenchLayout The former commands \FrenchLayout and \StandardLayout are kept for com-
\StandardLayout patibility reasons but should no longer be used.
29.531 \newcommand*{\FrenchLayout}{%
29.532 \FBGlobalLayoutFrenchtrue
29.533 \PackageWarning{frenchb.ldf}%
29.534 {\protect\FrenchLayout\space is obsolete. Please use\MessageBreak
29.535 \protect\frenchbsetup{GlobalLayoutFrench} instead.}%
29.536 }

29.537 \newcommand*{\StandardLayout}{%

29.538 \FBReduceListSpacingfalse
29.539 \FBCompactItemizefalse
29.540 \FBStandardItemLabelstrue
29.541 \FBIndentFirstfalse
29.542 \FBFrenchFootnotesfalse
29.543 \FBAutoSpaceFootnotesfalse
29.544 \PackageWarning{frenchb.ldf}%

143
29.545 {\protect\StandardLayout\space is obsolete. Please use\MessageBreak
29.546 \protect\frenchbsetup{StandardLayout} instead.}%
29.547 }
29.548 \@onlypreamble\FrenchLayout
29.549 \@onlypreamble\StandardLayout

29.12 Dots. . .
\FBtextellipsis LATEX 2ε 's standard denition of \dots in text-mode is \textellipsis which
includes a \kern at the end; this space is not wanted in some cases (before a
closing brace for instance) and \kern breaks hyphenation of the next word. We
dene \FBtextellipsis for French (in LATEX 2ε only).
The \if construction in the LATEX 2ε denition of \dots doesn't allow the use
of xspace (xspace is always followed by a \fi), so we use the AMS-LATEX con-
struction of \dots; this has to be done `AtBeginDocument' not to be overwritten
when amsmath.sty is loaded after babel.
LY1 has a ready made character for \textellipsis, it should be used in
French too (pointed out by Bruno Voisin).
29.550 \DeclareTextSymbol{\FBtextellipsis}{LY1}{133}
29.551 \DeclareTextCommandDefault{\FBtextellipsis}{%
29.552 .\kern\fontdimen3\font.\kern\fontdimen3\font.\xspace}
\Mdots@ and \Tdots@ORI hold the denitions of \dots in Math and Text mode.
They default to those of amsmath-2.0, and will revert to standard LATEX denitions
`AtBeginDocument', if amsmath has not been loaded. \Mdots@ doesn't change
when switching from/to French, while \Tdots@ is \FBtextellipsis in French
and \Tdots@ORI otherwise.
29.553 \newcommand*{\Tdots@ORI}{\@xp\textellipsis}
29.554 \newcommand*{\Tdots@}{\Tdots@ORI}
29.555 \newcommand*{\Mdots@}{\@xp\mdots@}

29.556 \AtBeginDocument{\DeclareRobustCommand*{\dots}{\relax

29.557 \csname\ifmmode M\else T\fi dots@\endcsname}%


29.558 \@ifundefined{@xp}{\let\@xp\relax}{}%
29.559 \@ifundefined{mdots@}{\let\Tdots@ORI\textellipsis
29.560 \let\Mdots@\mathellipsis}{}}
29.561 \def\bbl@frenchdots{\let\Tdots@\FBtextellipsis}

29.562 \def\bbl@nonfrenchdots{\let\Tdots@\Tdots@ORI}

29.563 \expandafter\addto\csname extras\CurrentOption\endcsname{%

29.564 \bbl@frenchdots}
29.565 \expandafter\addto\csname noextras\CurrentOption\endcsname{%

29.566 \bbl@nonfrenchdots}

29.13 Setup options: keyval stu


We rst dene a collection of conditionals with their defaults (true or false).
29.567 \newif\ifFBStandardLayout \FBStandardLayouttrue
29.568 \newif\ifFBGlobalLayoutFrench \FBGlobalLayoutFrenchfalse
29.569 \newif\ifFBReduceListSpacing \FBReduceListSpacingfalse
29.570 \newif\ifFBCompactItemize \FBCompactItemizefalse
29.571 \newif\ifFBStandardItemLabels \FBStandardItemLabelstrue
29.572 \newif\ifFBStandardLists \FBStandardListstrue
29.573 \newif\ifFBIndentFirst \FBIndentFirstfalse

144
29.574 \newif\ifFBFrenchFootnotes \FBFrenchFootnotesfalse
29.575 \newif\ifFBAutoSpaceFootnotes \FBAutoSpaceFootnotesfalse
29.576 \newif\ifFBAutoSpacePunctuation \FBAutoSpacePunctuationtrue
29.577 \newif\ifFBThinColonSpace \FBThinColonSpacefalse
29.578 \newif\ifFBThinSpaceInFrenchNumbers \FBThinSpaceInFrenchNumbersfalse
29.579 \newif\ifFBFrenchSuperscripts \FBFrenchSuperscriptstrue
29.580 \newif\ifFBLowercaseSuperscripts \FBLowercaseSuperscriptstrue
29.581 \newif\ifFBPartNameFull \FBPartNameFulltrue
29.582 \newif\ifFBShowOptions \FBShowOptionsfalse
The defaults values of these ags have been set so that frenchb does not
change anything regarding the global layout. \bbl@main@language (set by the last
option of babel) controls the global layout of the document. We check the current
language `AtEndOfPackage' (it is \bbl@main@language); if it is French, the values
of some ags have to be changed to ensure a French looking layout for the whole
document (even in parts written in languages other than French); the end-user
will then be able to customise the values of all these ags with \frenchbsetup{}.
29.583 \AtEndOfPackage{%
29.584 \iflanguage{french}{\FBReduceListSpacingtrue
29.585 \FBCompactItemizetrue
29.586 \FBStandardItemLabelsfalse
29.587 \FBIndentFirsttrue
29.588 \FBFrenchFootnotestrue
29.589 \FBAutoSpaceFootnotestrue
29.590 \FBGlobalLayoutFrenchtrue}%
29.591 {}%
29.592 }

\frenchbsetup From version 2.0 on, all setup options are handled by one command \frenchbsetup
using the keyval syntax. Let's now dene this command which reads and sets the
options to be processed later (at \begin{document}) by \FBprocess@options. It
can only be called in the preamble.
29.593 \newcommand*{\frenchbsetup}[1]{%
29.594 \setkeys{FB}{#1}%
29.595 }%

29.596 \@onlypreamble\frenchbsetup

frenchb being an option of babel, it cannot load a package (keyval) while


frenchb.ldf is read, so we defer the loading of keyval and the options setup
at the end of babel's loading.
StandardLayout resets the layout in French to the standard layout dened
par the LATEX class and packages loaded. It deals with lists, indentation of rst
paragraphs of sections and footnotes. Other keys, entered after StandardLayout
in \frenchbsetup, can overrule some of the StandardLayout settings.
GlobalLayoutFrench forces the layout in French and (as far as possible) out-
side French to meet the French typographic standards.
29.597 \AtEndOfPackage{%
29.598 \RequirePackage{keyval}%
29.599 \define@key{FB}{StandardLayout}[true]%
29.600 {\csname FBStandardLayout#1\endcsname
29.601 \ifFBStandardLayout
29.602 \FBReduceListSpacingfalse
29.603 \FBCompactItemizefalse

145
29.604 \FBStandardItemLabelstrue
29.605 \FBIndentFirstfalse
29.606 \FBFrenchFootnotesfalse
29.607 \FBAutoSpaceFootnotesfalse
29.608 \FBGlobalLayoutFrenchfalse
29.609 \else
29.610 \FBReduceListSpacingtrue
29.611 \FBCompactItemizetrue
29.612 \FBStandardItemLabelsfalse
29.613 \FBIndentFirsttrue
29.614 \FBFrenchFootnotestrue
29.615 \FBAutoSpaceFootnotestrue
29.616 \fi}%
29.617 \define@key{FB}{GlobalLayoutFrench}[true]%
29.618 {\csname FBGlobalLayoutFrench#1\endcsname
29.619 \ifFBGlobalLayoutFrench
29.620 \FBReduceListSpacingtrue
29.621 \FBCompactItemizetrue
29.622 \FBStandardItemLabelsfalse
29.623 \FBIndentFirsttrue
29.624 \FBFrenchFootnotestrue
29.625 \FBAutoSpaceFootnotestrue
29.626 \fi}%
29.627 \define@key{FB}{ReduceListSpacing}[true]%
29.628 {\csname FBReduceListSpacing#1\endcsname}%
29.629 \define@key{FB}{CompactItemize}[true]%
29.630 {\csname FBCompactItemize#1\endcsname}%
29.631 \define@key{FB}{StandardItemLabels}[true]%
29.632 {\csname FBStandardItemLabels#1\endcsname}%
29.633 \define@key{FB}{ItemLabels}{%
29.634 \renewcommand*{\FrenchLabelItem}{#1}}%
29.635 \define@key{FB}{ItemLabeli}{%
29.636 \renewcommand*{\Frlabelitemi}{#1}}%
29.637 \define@key{FB}{ItemLabelii}{%
29.638 \renewcommand*{\Frlabelitemii}{#1}}%
29.639 \define@key{FB}{ItemLabeliii}{%
29.640 \renewcommand*{\Frlabelitemiii}{#1}}%
29.641 \define@key{FB}{ItemLabeliv}{%
29.642 \renewcommand*{\Frlabelitemiv}{#1}}%
29.643 \define@key{FB}{StandardLists}[true]%
29.644 {\csname FBStandardLists#1\endcsname
29.645 \ifFBStandardLists
29.646 \FBReduceListSpacingfalse
29.647 \FBCompactItemizefalse
29.648 \FBStandardItemLabelstrue
29.649 \else
29.650 \FBReduceListSpacingtrue
29.651 \FBCompactItemizetrue
29.652 \FBStandardItemLabelsfalse
29.653 \fi}%
29.654 \define@key{FB}{IndentFirst}[true]%
29.655 {\csname FBIndentFirst#1\endcsname}%
29.656 \define@key{FB}{FrenchFootnotes}[true]%
29.657 {\csname FBFrenchFootnotes#1\endcsname}%

146
29.658 \define@key{FB}{AutoSpaceFootnotes}[true]%
29.659 {\csname FBAutoSpaceFootnotes#1\endcsname}%
29.660 \define@key{FB}{AutoSpacePunctuation}[true]%
29.661 {\csname FBAutoSpacePunctuation#1\endcsname}%
29.662 \define@key{FB}{ThinColonSpace}[true]%
29.663 {\csname FBThinColonSpace#1\endcsname}%
29.664 \define@key{FB}{ThinSpaceInFrenchNumbers}[true]%
29.665 {\csname FBThinSpaceInFrenchNumbers#1\endcsname}%
29.666 \define@key{FB}{FrenchSuperscripts}[true]%
29.667 {\csname FBFrenchSuperscripts#1\endcsname}
29.668 \define@key{FB}{LowercaseSuperscripts}[true]%
29.669 {\csname FBLowercaseSuperscripts#1\endcsname}
29.670 \define@key{FB}{PartNameFull}[true]%
29.671 {\csname FBPartNameFull#1\endcsname}%
29.672 \define@key{FB}{ShowOptions}[true]%
29.673 {\csname FBShowOptions#1\endcsname}%
Inputing French quotes as single characters when they are available on the key-
board (through a compose key for instance) is more comfortable than typing
\og and \fg. The purpose of the following code is to map the French quote
characters to \og\ignorespaces and {\fg} respectively when the current lan-
guage is French, and to \guillemotleft and \guillemotright otherwise (think
of German quotes); thus correct unbreakable spaces will be added automatically
to French quotes. The quote characters typed in depend on the input encoding, it
can be single-byte (latin1, latin9, applemac,. . . ) or multi-bytes (utf-8, utf8x). We
rst check whether XeTeX is used or not, if not the package inputenc has to be
loaded before the \begin{document} with the proper coding option, so we check
if \DeclareInputText is dened.
29.674 \define@key{FB}{og}{%
29.675 \newcommand*{\FB@@og}{\iflanguage{french}%
29.676 {\FB@og\ignorespaces}{\guillemotleft}}%
29.677 \expandafter\ifx\csname XeTeXrevision\endcsname\relax
29.678 \AtBeginDocument{%
29.679 \@ifundefined{DeclareInputText}%
29.680 {\PackageWarning{frenchb.ldf}%
29.681 {Option `og' requires package inputenc.\MessageBreak}%
29.682 }%
29.683 {\@ifundefined{uc@dclc}%
if \uc@dclc is undened, utf8x is not loaded. . .
29.684 {\@ifundefined{DeclareUnicodeCharacter}%
if \DeclareUnicodeCharacter is undened, utf8 is not loaded either, we as-
sume 8-bit character input encoding. Package MULEenc.sty (from CJK) denes
\mule@def to map characters to control sequences.
29.685 {\@tempcnta`#1\relax
29.686 \@ifundefined{mule@def}%
29.687 {\DeclareInputText{\the\@tempcnta}{\FB@@og}}%
29.688 {\mule@def{11}{{\FB@@og}}}%
29.689 }%
utf8 loaded, use \DeclareUnicodeCharacter,
29.690 {\DeclareUnicodeCharacter{00AB}{\FB@@og}}%
29.691 }%

147
utf8x loaded, use \uc@dclc,
29.692 {\uc@dclc{171}{default}{\FB@@og}}%
29.693 }%
29.694 }%
XeTeX in use, the following trick for dening the active quote character is borrowed
from inputenc.dtx.
29.695 \else
29.696 \catcode`#1=\active
29.697 \bgroup
29.698 \uccode`\~`#1%
29.699 \uppercase{%
29.700 \egroup
29.701 \def~%
29.702 }{\FB@@og}%
29.703 \fi
29.704 }%
Same code for the closing quote.
29.705 \define@key{FB}{fg}{%
29.706 \newcommand*{\FB@@fg}{\iflanguage{french}%
29.707 {\FB@fg}{\guillemotright}}%
29.708 \expandafter\ifx\csname XeTeXrevision\endcsname\relax
29.709 \AtBeginDocument{%
29.710 \@ifundefined{DeclareInputText}%
29.711 {\PackageWarning{frenchb.ldf}%
29.712 {Option `fg' requires package inputenc.\MessageBreak}%
29.713 }%
29.714 {\@ifundefined{uc@dclc}%
29.715 {\@ifundefined{DeclareUnicodeCharacter}%
29.716 {\@tempcnta`#1\relax
29.717 \@ifundefined{mule@def}%
29.718 {\DeclareInputText{\the\@tempcnta}{{\FB@@fg}}}%
29.719 {\mule@def{27}{{\FB@@fg}}}%
29.720 }%
29.721 {\DeclareUnicodeCharacter{00BB}{{\FB@@fg}}}%
29.722 }%
29.723 {\uc@dclc{187}{default}{{\FB@@fg}}}%
29.724 }%
29.725 }%
29.726 \else
29.727 \catcode`#1=\active
29.728 \bgroup
29.729 \uccode`\~`#1%
29.730 \uppercase{%
29.731 \egroup
29.732 \def~%
29.733 }{{\FB@@fg}}%
29.734 \fi
29.735 }%
29.736 }

\FBprocess@options \FBprocess@options processes the options, it is called once at \begin{document}.


29.737 \newcommand*{\FBprocess@options}{%

148
Nothing has to be done here for StandardLayout and StandardLists (the in-
volved ags have already been set in \frenchbsetup{} or before (at babel's End-
OfPackage).
The next three options deal with the layout of lists in French.
ReduceListSpacing reduces the vertical spaces between list items in French
(done by changing \list to \listFB). When GlobalLayoutFrench is true the
same is done outside French.
29.738 \ifFBReduceListSpacing
29.739 \addto\extrasfrench{\let\list\listFB
29.740 \let\endlist\endlistFB}%
29.741 \addto\noextrasfrench{\ifFBGlobalLayoutFrench
29.742 \let\list\listFB
29.743 \let\endlist\endlistFB
29.744 \else
29.745 \let\list\listORI
29.746 \let\endlist\endlistORI
29.747 \fi}%
29.748 \else
29.749 \addto\extrasfrench{\let\list\listORI
29.750 \let\endlist\endlistORI}%
29.751 \addto\noextrasfrench{\let\list\listORI
29.752 \let\endlist\endlistORI}%
29.753 \fi
CompactItemize suppresses the vertical spacing between list items in French
(done by changing \itemize to \itemizeFB). When GlobalLayoutFrench is true
the same is done outside French.
29.754 \ifFBCompactItemize
29.755 \addto\extrasfrench{\let\itemize\itemizeFB
29.756 \let\enditemize\enditemizeFB}%
29.757 \addto\noextrasfrench{\ifFBGlobalLayoutFrench
29.758 \let\itemize\itemizeFB
29.759 \let\enditemize\enditemizeFB
29.760 \else
29.761 \let\itemize\itemizeORI
29.762 \let\enditemize\enditemizeORI
29.763 \fi}%
29.764 \else
29.765 \addto\extrasfrench{\let\itemize\itemizeORI
29.766 \let\enditemize\enditemizeORI}%
29.767 \addto\noextrasfrench{\let\itemize\itemizeORI
29.768 \let\enditemize\enditemizeORI}%
29.769 \fi
StandardItemLabels resets labelitems in French to their standard values set
by the LATEX class and packages loaded. When GlobalLayoutFrench is true la-
belitems are identical inside and outside French.
29.770 \ifFBStandardItemLabels
29.771 \addto\extrasfrench{\bbl@nonfrenchlabelitems}%
29.772 \addto\noextrasfrench{\bbl@nonfrenchlabelitems}%
29.773 \else
29.774 \addto\extrasfrench{\bbl@frenchlabelitems}%
29.775 \addto\noextrasfrench{\ifFBGlobalLayoutFrench
29.776 \bbl@frenchlabelitems

149
29.777 \else
29.778 \bbl@nonfrenchlabelitems
29.779 \fi}%
29.780 \fi
IndentFirst forces the rst paragraphs of sections to be indented just like the
other ones in French. When GlobalLayoutFrench is true the same is done outside
French.
29.781 \ifFBIndentFirst
29.782 \addto\extrasfrench{\bbl@frenchindent}%
29.783 \addto\noextrasfrench{\ifFBGlobalLayoutFrench
29.784 \bbl@frenchindent
29.785 \else
29.786 \bbl@nonfrenchindent
29.787 \fi}%
29.788 \else
29.789 \addto\extrasfrench{\bbl@nonfrenchindent}%
29.790 \addto\noextrasfrench{\bbl@nonfrenchindent}%
29.791 \fi
The layout of footnotes is handled at the \begin{document} depending on the
values of ags FrenchFootnotes and AutoSpaceFootnotes (see section 29.10),
nothing has to be done here for footnotes.
AutoSpacePunctuation adds an unbreakable space (in French only) before the
four active characters (:;!?) even if none has been typed before them.
29.792 \ifFBAutoSpacePunctuation
29.793 \AutoSpaceBeforeFDP
29.794 \else
29.795 \NoAutoSpaceBeforeFDP
29.796 \fi
ThinColonSpace changes the normal unbreakable space typeset in French be-
fore `:' to a thin space.
29.797 \ifFBThinColonSpace\renewcommand*{\Fcolonspace}{\thinspace}\fi
When true, ThinSpaceInFrenchNumbers redenes numprint.sty's command
\npstylefrench to set \npthousandsep to \, (thinspace) instead of ~ (de-
fault) . This option has no eect if package numprint.sty is not loaded with
`autolanguage'. As old versions of numprint.sty did not dene \npstylefrench,
we have to provide this command.
29.798 \@ifpackageloaded{numprint}%
29.799 {\ifnprt@autolanguage
29.800 \providecommand*{\npstylefrench}{}%
29.801 \ifFBThinSpaceInFrenchNumbers
29.802 \renewcommand*\npstylefrench{%
29.803 \npthousandsep{\,}%
29.804 \npdecimalsign{,}%
29.805 \npproductsign{\cdot}%
29.806 \npunitseparator{\,}%
29.807 \npdegreeseparator{}%
29.808 \nppercentseparator{\nprt@unitsep}%
29.809 }%
29.810 \else
29.811 \renewcommand*\npstylefrench{%
29.812 \npthousandsep{~}%

150
29.813 \npdecimalsign{,}%
29.814 \npproductsign{\cdot}%
29.815 \npunitseparator{\,}%
29.816 \npdegreeseparator{}%
29.817 \nppercentseparator{\nprt@unitsep}%
29.818 }%
29.819 \fi
29.820 \npaddtolanguage{french}{french}%
29.821 \fi}{}%
FrenchSuperscripts: if true \up=\fup, else \up=\textsuperscript. Any-
way \up*=\FB@up@fake. The star-form \up*{} is provided for fonts that lack
some superior letters: Adobe Jenson Pro and Utopia Expert have no g superior
for instance.
29.822 \ifFBFrenchSuperscripts
29.823 \DeclareRobustCommand*{\up}{\@ifstar{\FB@up@fake}{\fup}}%
29.824 \else
29.825 \DeclareRobustCommand*{\up}{\@ifstar{\FB@up@fake}%
29.826 {\textsuperscript}}%
29.827 \fi
LowercaseSuperscripts: if true let \FB@lc be \lowercase, else \FB@lc is
redened to do nothing.
29.828 \ifFBLowercaseSuperscripts
29.829 \else
29.830 \renewcommand*{\FB@lc}[1]{##1}%
29.831 \fi
PartNameFull: if false, redene \partname.
29.832 \ifFBPartNameFull
29.833 \else\addto\captionsfrench{\def\partname{Partie}}\fi
ShowOptions: if true, print the list of all options to the .log le.
29.834 \ifFBShowOptions
29.835 \GenericWarning{* }{%
29.836 * **** List of possible options for frenchb ****\MessageBreak
29.837 [Default values between brackets when frenchb is loaded *LAST*]%
29.838 \MessageBreak
29.839 ShowOptions=true [false]\MessageBreak
29.840 StandardLayout=true [false]\MessageBreak
29.841 GlobalLayoutFrench=false [true]\MessageBreak
29.842 StandardLists=true [false]\MessageBreak
29.843 ReduceListSpacing=false [true]\MessageBreak
29.844 CompactItemize=false [true]\MessageBreak
29.845 StandardItemLabels=true [false]\MessageBreak
29.846 ItemLabels=\textemdash, \textbullet,
29.847 \protect\ding{43},... [\textendash]\MessageBreak
29.848 ItemLabeli=\textemdash, \textbullet,
29.849 \protect\ding{43},... [\textendash]\MessageBreak
29.850 ItemLabelii=\textemdash, \textbullet,
29.851 \protect\ding{43},... [\textendash]\MessageBreak
29.852 ItemLabeliii=\textemdash, \textbullet,
29.853 \protect\ding{43},... [\textendash]\MessageBreak
29.854 ItemLabeliv=\textemdash, \textbullet,
29.855 \protect\ding{43},... [\textendash]\MessageBreak

151
29.856 IndentFirst=false [true]\MessageBreak
29.857 FrenchFootnotes=false [true]\MessageBreak
29.858 AutoSpaceFootnotes=false [true]\MessageBreak
29.859 AutoSpacePunctuation=false [true]\MessageBreak
29.860 ThinColonSpace=true [false]\MessageBreak
29.861 ThinSpaceInFrenchNumbers=true [false]\MessageBreak
29.862 FrenchSuperscripts=false [true]\MessageBreak
29.863 LowercaseSuperscripts=false [true]\MessageBreak
29.864 PartNameFull=false [true]\MessageBreak
29.865 og= <left quote character>, fg= <right quote character>
29.866 \MessageBreak
29.867 *********************************************
29.868 \MessageBreak\protect\frenchbsetup{ShowOptions}}
29.869 \fi
29.870 }

At \begin{document} we save again the denitions of the `list' and `itemize'


environments and the values of labelitems so that all changes made in the preamble
are taken into account in languages other than French and in French with the
StandardLayout option. We also have to provide an \xspace command in case
the xspace.sty package is not loaded.
29.871 \AtBeginDocument{%
29.872 \let\listORI\list
29.873 \let\endlistORI\endlist
29.874 \let\itemizeORI\itemize
29.875 \let\enditemizeORI\enditemize
29.876 \let\@ltiORI\labelitemi
29.877 \let\@ltiiORI\labelitemii
29.878 \let\@ltiiiORI\labelitemiii
29.879 \let\@ltivORI\labelitemiv
29.880 \providecommand*{\xspace}{\relax}%
Let's redene some commands in hyperref's bookmarks.
29.881 \@ifundefined{pdfstringdefDisableCommands}{}%
29.882 {\pdfstringdefDisableCommands{%
29.883 \let\up\relax
29.884 \def\ieme{e\xspace}%
29.885 \def\iemes{es\xspace}%
29.886 \def\ier{er\xspace}%
29.887 \def\iers{ers\xspace}%
29.888 \def\iere{re\xspace}%
29.889 \def\ieres{res\xspace}%
29.890 \def\FrenchEnumerate#1{#1\degre\space}%
29.891 \def\FrenchPopularEnumerate#1{#1\degre)\space}%
29.892 \def\No{N\degre\space}%
29.893 \def\no{n\degre\space}%
29.894 \def\Nos{N\degre\space}%
29.895 \def\nos{n\degre\space}%
29.896 \def\og{\guillemotleft\space}%
29.897 \def\fg{\space\guillemotright}%
29.898 \let\bsc\textsc
29.899 \let\degres\degre
29.900 }}%

152
It is time to process the options set with \frenchboptions{}. Then execute ei-
ther \extrasfrench and \captionsfrench or \noextrasfrench according to the
current language at the \begin{document} (these three commands are updated
by \FBprocess@options).
29.901 \FBprocess@options
29.902 \iflanguage{french}{\extrasfrench\captionsfrench}{\noextrasfrench}%
Some warnings are issued when output font encodings are not properly set. With
XeLaTeX, fontspec.sty and xunicode.sty should be loaded; with (pdf)LATEX,
a warning is issued when OT1 encoding is in use at the \begin{document}. Mind
that \encodingdefault is dened as `long', dening \FBOTone with \newcommand*
would fail!
29.903 \expandafter\ifx\csname XeTeXrevision\endcsname\relax
29.904 \begingroup \newcommand{\FBOTone}{OT1}%
29.905 \ifx\encodingdefault\FBOTone
29.906 \PackageWarning{frenchb.ldf}%
29.907 {OT1 encoding should not be used for French.
29.908 \MessageBreak
29.909 Add \protect\usepackage[T1]{fontenc} to the
29.910 preamble\MessageBreak of your document,}
29.911 \fi
29.912 \endgroup
29.913 \else
29.914 \@ifundefined{DeclareUTFcharacter}%
29.915 {\PackageWarning{frenchb.ldf}%
29.916 {Add \protect\usepackage{fontspec} *and*\MessageBreak
29.917 \protect\usepackage{xunicode} to the preamble\MessageBreak
29.918 of your document,}}%
29.919 {}%
29.920 \fi
29.921 }

29.14 Clean up and exit


Load frenchb.cfg (should do nothing, just for compatibility).
29.922 \loadlocalcfg{frenchb}
Final cleaning. The macro \ldf@quit takes care for setting the main language
to be switched on at \begin{document} and resetting the category code of @
to its original value. The cong le searched for has to be frenchb.cfg, and
\CurrentOption has been set to `french', so \ldf@finish\CurrentOption cannot
be used: we rst load frenchb.cfg, then call \ldf@quit\CurrentOption.
29.923 \FBclean@on@exit
29.924 \ldf@quit\CurrentOption

153
30 The Italian language
The le italian.dtx30 denes all the language-specic macros for the Italian
language.
The features of this language denition le are the following:

1. The Italian hyphenation is invoked, provided that le ithyph.tex was


loaded when the LATEX 2ε format was built; in case it was not, read the
information coming with your distribution of the TEX software, and the
babel documentation.

2. The language dependent xed words to be inserted by such commands as


\chapter, \caption, \tableofcontents, etc. are redened in accordance
with the Italian typographical practice.

3. Since Italian can be easily hyphenated and Italian practice allows to break
a word before the last two letters, hyphenation parameters have been
set accordingly, but a very high demerit value has been set in order to
avoid word breaks in the penultimate line of a paragraph. Specically the
\clubpenalty, and the \widowpenalty are set to rather high values and
\finalhyphendemerits is set to such a high value that hyphenation is pro-
hibited between the last two lines of a paragraph. In orer to make it consis-
tent, also \@clubpenalty is set to the same value; actualy the latter value
is the reset value after every sectioning command, so that after the rst
section, \clubpenalty is reset to the low default value. Thanks to Enrico
Gregorio for spotting this serious bug.

4. Some language specic shortcuts have been dened so as to allow etymolog-


ical hyphenation, specically " inserts a break point in any word boundary
that the typesetter chooses, provided it is not followed by and accented let-
ter (very unlikely in Italian, where compulsory accents fall only on the last
and ending vowel of a word, but may take place with compound words that
include foreign roots), and "| when the desired break point falls before an
accented letter.

5. The shortcut "" introduces the raised (English) opening double quotes; this
shortcut proves its usefulness when one reminds that the Italian keyboard
misses the backtick key, and the backtick on a Windows based platform may
be obtained only by pressing the Alt key while inputting the numerical code
0096; very, very annoying!

6. The shortcuts "< and "> insert the French guillemots, sometimes used in
Italian typography; with the T1 font encoding the ligatures << and >> should
insert such signs directly, but not all the virtual fonts that claim to follow
the T1 font encoding actually contain the guillemots; with the OT1 encoding
the guillemots are not available and must be faked in some way. By using
the "< and "> shortcuts (even with the T1 encoding) the necessary tests
are performed and in case the suitable glyphs are taken from other fonts
normally available with any good, modern LATEX distribution.
30 The le described in this section has version number v1.2t and was last revised on
2008/03/14. The original author is Maurizio Codogno, (mau@beatles.cselt.stet.it). It has
been largely revised by Johannes Braams and Claudio Beccari

154
7. Three new specic commands \unit, \ped, and \ap are introduced so as
to enable the correct composition of technical mathematics according to the
ISO 31/XI recommendations. \unit does not get redened if the babel pack-
age is loaded after the package units.sty whose homonymous command
plays a dierent role and follows a dierent syntax.

For this language a limited number of shortcuts has been dened, table 6,
some of which are used to overcome certain limitations of the Italian keyboard; in
section 30.3 there are other comments and hints in order to overcome some other
keyboard limitations.

" inserts a compound word mark where hyphenation


is legal; it allows etymological hyphenation which is
recommended for technical terms, chemical names
and the like; it does not work if the next character is
represented with a control sequence or is an accented
character.
"| the same as the above without the limitation on char-
acters represented with control sequences or accented
ones.
"" inserts open quotes .
"< inserts open guillemots.
"> inserts closed guillemots.
"/ equivalent to \slash

Table 6: Shortcuts for the Italian language

The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
30.1 h∗codei
30.2 \LdfInit{italian}{captionsitalian}%
When this le is read as an option, i.e. by the \usepackage command, italian
will be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@italian to see whether we have to do something
here.
30.3 \ifx\l@italian\@undefined
30.4 \@nopatterns{Italian}%
30.5 \adddialect\l@italian0\fi
The next step consists of dening commands to switch to (and from) the Italian
language.

\captionsitalian The macro \captionsitalian denes all strings used in the four standard docu-
ment classes provided with LATEX.
\addto\captionsitalian{%
30.6

30.7\def\prefacename{Prefazione}%
30.8 \def\refname{Riferimenti bibliografici}%
30.9 \def\abstractname{Sommario}%
30.10 \def\bibname{Bibliografia}%
30.11 \def\chaptername{Capitolo}%
30.12 \def\appendixname{Appendice}%

155
30.13 \def\contentsname{Indice}%
30.14 \def\listfigurename{Elenco delle figure}%
30.15 \def\listtablename{Elenco delle tabelle}%
30.16 \def\indexname{Indice analitico}%
30.17 \def\figurename{Figura}%
30.18 \def\tablename{Tabella}%
30.19 \def\partname{Parte}%
30.20 \def\enclname{Allegati}%
30.21 \def\ccname{e~p.~c.}%
30.22 \def\headtoname{Per}%
30.23 \def\pagename{Pag.}% % in Italian the abbreviation is preferred
30.24 \def\seename{vedi}%
30.25 \def\alsoname{vedi anche}%
30.26 \def\proofname{Dimostrazione}%
30.27 \def\glossaryname{Glossario}%
30.28 }%

\dateitalian The macro \dateitalian redenes the command \today to produce Italian dates.

30.29 \def\dateitalian{%
30.30 \def\today{\number\day~\ifcase\month\or
30.31 gennaio\or febbraio\or marzo\or aprile\or maggio\or giugno\or
30.32 luglio\or agosto\or settembre\or ottobre\or novembre\or
30.33 dicembre\fi\space \number\year}}%

\italianhyphenmins The italian hyphenation patterns can be used with both \lefthyphenmin and
\righthyphenmin set to 2.
30.34 \providehyphenmins{\CurrentOption}{\tw@\tw@}

\extrasitalian Lower the chance that clubs or widows occur.


\noextrasitalian30.35 \addto\extrasitalian{%
30.36 \babel@savevariable\clubpenalty
30.37 \babel@savevariable\widowpenalty
30.38 \babel@savevariable\@clubpenalty
30.39 \clubpenalty3000\widowpenalty3000\@clubpenalty\clubpenalty}%
Never ever break a word between the last two lines of a paragraph in italian
texts.
30.40 \addto\extrasitalian{%
30.41 \babel@savevariable\finalhyphendemerits
30.42 \finalhyphendemerits50000000}%
In order to enable the hyphenation of words such as nell'altezza we give the '
a non-zero lower case code. When we do that TEX nds the following hyphenation
points nel-l'al-tez-za instead of none.
30.43 \addto\extrasitalian{%
30.44 \lccode`'=`'}%
30.45 \addto\noextrasitalian{%

30.46 \lccode`'=0}%

30.1 Support for etymological hyphenation


In his article on Italian hyphenation [1] Beccari pointed out that the Italian lan-
guage gets hyphenated on a phonetic basis, although etymological hyphenation

156
is allowed; this is in contrast with what happens in Latin, for example, where
etymological hyphenation is always used. Since the patterns for both languages
would become too complicated in order to cope with etymological hyphenation,
in his paper Beccari proposed the denition of an active character `_' such that it
could insert a soft discretionary hyphen at the compound word boundary. For
several reasons that idea and the specic active character proved to be unpractical
and was abandoned.
This problem is so important with the majority of the European languages, that
babel from the very beginning developed the tradition of making the " character
active so as to perform several actions that turned useful with every language.
One of these actions consisted in dening the shortcut "| that was extensively
used in German and in many other languages in order to insert a discretionary
hyphen such that hyphenation would not be precluded in the rest of the word as
it happens with the standard TEX command \-.
Meanwhile the ec fonts with the double Cork encoding (thus formerly called
the dc fonts) have become more or less standard and are widely used by virtually
all Europeans that write languages with many special national characters; by so
doing they avoid the use of the \accent primitive which would be required with
the standard cm fonts; with the latter fonts the primitive command \accent is such
that hyphenation becomes almost impossible, in any case strongly impeached.
The ec fonts contain a special character, named compound word mark, that
occupies position 23 in the font scheme and may be input with the sequence ^^W.
Up to now, apparently, this special character has never been used in a practical
way for the typesetting of languages rich of compound words; also it has never
been inserted in the hyphenation pattern les of any language. Beccari modied
his pattern le ithyph.tex v4.8b for Italian so as to contain ve new patterns
that involve ^^W, and he tried to give the babel active character " a new shortcut
denition, so as to allow the insertion of the compound word mark in the proper
place within any word where two semantic fragments join up. With such facility
for marking the compound word boundaries, etymological hyphenation becomes
possible even if the patterns know nothing about etymology (but the typeset-
ter hopefully does!). In Italian such etymological hyphenation is desirable with
technical terms, chemical names, and the like.
Even this solution proved to be inconvenient on certain UN*X platforms, so
Beccari resorted to another approach that uses the babel active character " and
relies on the category code of the character that follows ".
30.47 \initiate@active@char{"}%
30.48 \addto\extrasitalian{\bbl@activate{"}\languageshorthands{italian}}%

\it@cwm The active character " is now dened for language italian so as to perform
dierent actions in math mode compared to text mode; specically in math mode
a double quote is inserted so as to produce a double prime sign, while in text mode
the temporary macro \it@next is dened so as to defer any further action until
the next token category code has been tested.
30.49 \declare@shorthand{italian}{"}{%
30.50 \ifmmode
30.51 \def\it@next{''}%
30.52 \else

30.53 \def\it@next{\futurelet\it@temp\it@cwm}%
30.54 \fi

157
30.55 \it@next
30.56 }%

\it@cwm The \it@next service control sequence is such that upon its execution a temporary
variable \it@temp is made equivalent to the next token in the input list without
actually removing it. Such temporary token is then tested by the macro \it@cwm
and if it is found to be a letter token, then it introduces a compound word separator
control sequence \it@allowhyphens whose expansion introduces a discretionary
hyphen and an unbreakable space; in case the token is not a letter, then it is
tested against |12 : if so a compound word separator is inserted and the | token is
removed, otherwise another test is performed so as to see if another double quote
sign follows: in this case a double open quote mark is inserted, otherwise two
other tests are performed so as to see if guillemets have to be inserted, otherwise
nothing is done. The double quote shortcut for inserting a double open quote sign
is useful for people who are inputting Italian text by means of an Italian keyboard
that unfortunately misses the grave or backtick key. By this shortcut "" becomes
equivalent to `` for inserting raised open high double quotes.
30.57 \def\it@@cwm{\nobreak\discretionary{-}{}{}\nobreak\hskip\z@skip}%
30.58 \def\it@@ocap#1{\it@ocap}\def\it@@ccap#1{\it@ccap}%
30.59 \DeclareRobustCommand*{\it@cwm}{\let\it@@next\relax

30.60 \ifcat\noexpand\it@temp a%

30.61 \def\it@@next{\it@@cwm}%
30.62 \else

30.63 \if\noexpand\it@temp \string|%


30.64 \def\it@@next{\it@@cwm\@gobble}%
30.65 \else
30.66 \if\noexpand\it@temp \string<%
30.67 \def\it@@next{\it@@ocap}%
30.68 \else
30.69 \if\noexpand\it@temp \string>%
30.70 \def\it@@next{\it@@ccap}%
30.71 \else
30.72 \if\noexpand\it@temp\string/%
30.73 \def\it@@next{\slash\@gobble}%
30.74 \else
30.75 \ifx\it@temp"%
30.76 \def\it@@next{``\@gobble}%
30.77 \fi
30.78 \fi
30.79 \fi
30.80 \fi
30.81 \fi
30.82 \fi

30.83 \it@@next}%

By this denition of " if one types macro"istruzione the possible break points
become ma-cro-istru-zio-ne, while without the " mark they would be ma-croi-stru-
zio-ne, according to the phonetic rules such that the macro prex is not taken as a
unit. A chemical name such as des"clor"fenir"amina"cloridrato is breakable
as des-clor-fe-nir-ami-na-clo-ri-dra-to instead of de-sclor-fe-ni-ra-mi-na-...
In other language description les a shortcut is dened so as to allow a break
point without actually inserting any hyphen sign; examples are given such as

158
entrada/salida; actually if one wants to allow a breakpoint after the slash, it is
much clearer to type \slash instead of / and LATEX does everything by itself;
here the shortcut "/ was introduced to stand for \slash so that one can type
input"/output and allow a line break after the slash. This shortcut works only
for the slash, since in Italian such constructs are extremely rare.
Attention: the expansion of " takes place before the actual expansion of OT1
or T1 accented sequences such as \`{a}; therefore this etymological hyphenation
facility works as it should only when the semantic word fragments do not start
with an accented letter; this in Italian is always avoidable, because compulsory
accents fall only on the last vowel, but it may be necessary to mark a compound
word where one or more components come from a foreign language and contain
diacritical marks according to the spelling rules of that language. In this case
the special shorthand "| may be used that performs exactly as " normally does,
except that the | sign is removed from the token input list: kilo"|{\"o}rsted
gets hyphenated as ki-lo-ör-sted.

30.2 Facilities required by the ISO 31/XI regulations


The ISO 31/XI regulations require that units of measure are typeset in upright
font in any circumstance, math or text, and that in text mode they are separated
from the numerical indication of the measure with an unbreakable (thin) space.
The command \unit that was dened for achieving this goal happened to conict
with the homonymous command dened by the package units.sty; we therefore
need to test if that package has already been loaded so as to avoid conicts; we
assume that if the user loads that package, s/he wants to use that package facilities
and command syntax.
The same regulations require also that super and subscripts (apices and
pedices) are in upright font, not in math italics, when they represent adjectives
or appositions to mathematical or physical variables that do not represent count-
able or measurable entities such as, for example, Vmax or Vrms for a maximum or
a root mean square voltage, compared to Vi or VT as the i-th voltage in a set,
or a voltage that depends on the thermodynamic temperature T . See [2] for a
complete description of the ISO regulations in connection with typesetting.
More rarely it happens to use superscripts that are not mathematical variables,
such as the notation AT to denote the transpose of matrix A; text superscripts are
useful also as ordinals or in old fashioned abbreviations in text mode; for example
the feminine ordinal 1a or the old fashioned obsolete abbreviation Flli for Fratelli
in company names (compare with Bros. for brothers in American English); text
subscripts are mostly used in logos.

\unit First we dene the new (internal) commands \bbl@unit, \bbl@ap, and \bbl@ped
\ap as robust ones.
\ped30.84 \@ifpackageloaded{units}{}{%
30.85 \DeclareRobustCommand*{\bbl@unit}[1]{%
30.86 \textormath{\,\mbox{#1}}{\,\mathrm{#1}}}%
30.87 }%
30.88 \DeclareRobustCommand*{\bbl@ap}[1]{%

30.89 \textormath{\textsuperscript{#1}}{^{\mathrm{#1}}}}%
30.90 \DeclareRobustCommand*{\bbl@ped}[1]{%

30.91 \textormath{$_{\mbox{\fontsize\sf@size\z@
30.92 \selectfont#1}}$}{_\mathrm{#1}}}%

159
Then we can use \let to dene the user level commands, but in case the macros
already have a dierent meaning before entering in Italian mode typesetting, we
rst memorize their meaning so as to restore them on exit.
30.93 \@ifpackageloaded{units}{}{%
30.94 \addto\extrasitalian{%
30.95 \babel@save\unit\let\unit\bbl@unit}%
30.96 }%
30.97 \addto\extrasitalian{%

30.98 \babel@save\ap\let\ap\bbl@ap
30.99 \babel@save\ped\let\ped\bbl@ped
30.100 }%

30.3 Accents
Most of the other language description les introduce a number of shortcuts for
inserting accents and other language specic diacritical marks in a more comfort-
able way compared with the lengthy standard TEX conventions. When an Italian
keyboard is being used on a Windows based platform, it exhibits such limitations
that up to now no convenient shortcuts have been developed; the reason lies in the
fact that the Italian keyboard lacks the grave accent (also known as backtick),
which is compulsory on all accented vowels except the `e', but, on the opposite, it
carries the keys with all the accented lowercase vowels; the keyboard lacks also the
tie ~ (tilde) key, while the curly braces require pressing three keys simultaneously.
The best solution Italians have found so far is to use a smart editor that accepts
shortcut denitions such that, for example, by striking "( one gets directly { on the
screen and the same sign is saved into the .tex le; the same smart editor should
be capable of translating the accented characters into the standard TEX sequences
when writing a le to disk (for the sake of le portability), and to transform the
standard TEX sequences into the corresponding signs when loading a .tex le
from disk to memory. Such smart editors do exist and can be downloaded from
the ctan archives.
For what concerns the missing backtick key, which is used also for inputting the
open quotes, it must be noticed that the shortcut "" described above completely
solves the problem for double raised open quotes; according to the traditions of
particular publishing houses, since there are no compulsory regulations on the
matter, the French guillemets may be used; in this case the T1 font encoding
solves the problem by means of its built in ligatures << and >>. But. . .

30.4 Caporali or French double quotes


Although the T1 font encoding ligatures solve the problem, there are some cir-
cumstances where even the T1 font encoding cannot be used, either because the
author/typesetter wants to use the OT1 encoding, or because s/he uses a font set
that does not comply completely with the T1 font encoding; some virtual fonts,
for example, are supposed to implement the double Cork font encoding but actu-
ally miss some glyphs; one such virtual font set is given by the ae virtual fonts,
because they are supposed to implement such double font encoding simply using
the cm fonts, of which the type 1 PostScript version exists and is freely available.
Since guillemets (in Italian caporali ) do not exist in any cm latin font, their glyphs
must be substituted with something else that approaches them.

160
Since in French typesetting guillemets are compulsory, the French language
denition le resorts to a clever font substitution; such le exploits the LATEX 2ε
font selection machinery so as to get the guillemets from the Cyrillic fonts, because
it suces to locally change the default encoding. There are several sets of Cyrillic
fonts, but the ones that obey the OT2 font encoding are generally distributed
with all recent implementations of the TEX software; they are part of the American
Mathematical Society fonts and come both as METAFONT source les and Type 1
PostScript .pfb les. The availability of such fonts should be guaranteed by the
presence of the OT2cmr.fd font description le. Actually the presence of this le
does not guarantee the completeness of your TEX implementation; should LATEX
complain about a missing Cyrillic .tfm le (that kind of le that contains the
font metric parameters) and/or about missing Cyrillic (.mf) les, then your TEX
system is incomplete and you should download such fonts from the ctan archives.
Temporarily you may issue the command \LtxSymbCaporali so as to approximate
the missing glyphs with the LATEX symbol fonts. In some case warning messages
are issued so as to inform the typesetter about the necessity of resorting to some
poor man solution.
In spite of these alternate fonts, we must avoid invoking unusual fonts if the
available encoding allows to use built in caporali. As far as I know (CB) the only
T1-encoded font families that miss the guillemets are the AE ones; we therefore
rst test if the default encoding id the T1 one and in this case if the AE families
are the default ones; in order for this to work properly it is necessary to load these
optional packages before babel. If the T1 encoding is not the default one when the
Italian language is specied, then some substitutions must be done.

\LtxSymbCaporali We dene some macros for substituting the default guillemets; rst the emulation
\it@ocap by means of the LATEX symbols; each one of these macro sets actually redenes the
\it@ccap control sequences \it@ocap and \it@ccap that are the ones eectively activated
by the shortcuts "< and ">.
30.101 \def\LtxSymbCaporali{%
30.102 \DeclareRobustCommand*{\it@ocap}{\mbox{%
30.103 \fontencoding{U}\fontfamily{lasy}\selectfont(\kern-0.20em(}%
30.104 \ignorespaces}%
30.105 \DeclareRobustCommand*{\it@ccap}{\ifdim\lastskip>\z@\unskip\fi
30.106 \mbox{%
30.107 \fontencoding{U}\fontfamily{lasy}\selectfont)\kern-0.20em)}}%
30.108 }%

Then the substitution with any specic font that contains such glyphs; it might
be the CBgreek fonts, the Cyrillic one, the super-cm ones, the lm ones, or any
other the user might prefer (the code is adapted from the one that appears in the
frenchb.ld le; thanks to Daniel Flipo). By default if the user did not select
the T1 encoding, the existence of the CBgreek fonts is tested; if they exist the
guillemets are taken from this font, and since its families are a superset of the
default CM ones and they apply also to typeset slides with the standard class
slides. If the CBgreek fonts are not found, then the existence of the Cyrillic
ones is tested, although this choice is not suited for typesetting slides; otherwise
the poor man solution of the LATEX special symbols is used. In any case the user
can force the use of the Cyrillic guillemets substitution by issuing the declaration
\CyrillicCaporali just before the \begin{document} statement; in alternative
the user can specify with

161
\CaporaliFrom{hencoding i}{hfamily i}{hopening number i}{hclosing number i}

the encoding and family of the font s/he prefers, and the slot numbers of the
opening and closing guillemets respectively. For example if the T1-encoded Latin
Modern fonts are desired the specic command should be
\CaporaliFrom{T1}{lmr}{19}{20}
These user choices might be necessary for assuring the correct typesetting with
fonts that contain the required glyphs and are available also in PostScript form so
as to use them directly with pdflatex, for example.
30.109 \def\CaporaliFrom#1#2#3#4{%
30.110 \DeclareFontEncoding{#1}{}{}%
30.111 \DeclareTextCommand{\it@ocap}{T1}{%
30.112 {\fontencoding{#1}\fontfamily{#2}\selectfont\char#3\ignorespaces}}%
30.113 \DeclareTextCommand{\it@ccap}{T1}{\ifdim\lastskip>\z@\unskip\fi%
30.114 {\fontencoding{#1}\fontfamily{#2}\selectfont\char#4}}%
30.115 \DeclareTextCommand{\it@ocap}{OT1}{%
30.116 {\fontencoding{#1}\fontfamily{#2}\selectfont\char#3\ignorespaces}}%
30.117 \DeclareTextCommand{\it@ccap}{OT1}{\ifdim\lastskip>\z@\unskip\fi%
30.118 {\fontencoding{#1}\fontfamily{#2}\selectfont\char#4}}}
Then we set a boolean variable and test the default family; if such family has a
name that starts with the letters ae then we have no built in guillemets; of course
if the AE font family is chosen after the babel package is loaded, the test does not
perform as required.
30.119 \def\get@ae#1#2#3!{\def\bbl@ae{#1#2}}%
30.120 \def\@ifT@one@noCap{\expandafter\get@ae\f@family!%
30.121 \def\bbl@temp{ae}\ifx\bbl@ae\bbl@temp\expandafter\@firstoftwo\else

30.122 \expandafter\@secondoftwo\fi}%
We set another couple of boolean variables for testing the existence of the CBgreek
or the Cyrillic fonts
30.123 \newif\if@CBgreekEncKnown
30.124 \IfFileExists{lgrcmr.fd}%
30.125 {\@CBgreekEncKnowntrue}{\@CBgreekEncKnownfalse}
30.126 \newif\if@CyrEncKnown

30.127 \IfFileExists{ot2cmr.fd}%

30.128 {\@CyrEncKnowntrue}{\@CyrEncKnownfalse}%

\CBgreekCaporali Next we dene the macros \CBgreekCaporali, \T@unoCaporali, and \CyrillicCaporali;


\CyrillicCaporali with the latter one we test the loaded class, and if it's slides nothing gets done. In
\T@unoCaporali any case each one of these declarations, if used, must be specied in the preamble.
30.129 \def\CBgreekCaporali{\@ifclassloaded{slides}{%
30.130 \IfFileExists{lgrlcmss.fd}{\DeclareFontEncoding{LGR}{}{}%
30.131 \DeclareRobustCommand*{\it@ccap}%
30.132 {\ifdim\lastskip>\z@\unskip\fi
30.133 {\fontencoding{LGR}\selectfont))}}%
30.134 \DeclareRobustCommand*{\it@ocap}%
30.135 {{\fontencoding{LGR}\selectfont((}\ignorespaces}}%
30.136 {\LtxSymbCaporali}}%
30.137 {\DeclareFontEncoding{LGR}{}{}%
30.138 \DeclareRobustCommand*{\it@ccap}%
30.139 {\ifdim\lastskip>\z@\unskip

162
30.140 \fi{\fontencoding{LGR}\selectfont))}}%
30.141 \DeclareRobustCommand*{\it@ocap}%
30.142 {{\fontencoding{LGR}\selectfont((}\ignorespaces}}%
30.143 }%
30.144 \def\CyrillicCaporali{\@ifclassloaded{slides}{\relax}%

30.145 {\DeclareFontEncoding{OT2}{}{}%
30.146 \DeclareRobustCommand*{\it@ccap}%
30.147 {\ifdim\lastskip>\z@\unskip\fi
30.148 {\fontencoding{OT2}\selectfont\char62\relax}}%
30.149 \DeclareRobustCommand*{\it@ocap}%
30.150 {{\fontencoding{OT2}\selectfont\char60\relax}\ignorespaces}}}%
30.151 \@onlypreamble{\CBgreekCaporali}\@onlypreamble{\CyrillicCaporali}%

30.152 \def\T@unoCaporali{\DeclareRobustCommand*{\it@ocap}{<<\ignorespaces}%

30.153 \DeclareRobustCommand*{\it@ccap}{\ifdim\lastskip>\z@\unskip\fi>>}}%

Now we can do some real setting; rst we start testing the encoding; if the encoding
is T1 we test if the font family is the AE one; if so, we further test for other
possibilities
30.154 \ifx\cf@encoding\bbl@t@one
30.155 \@ifT@one@noCap{%
30.156 \if@CBgreekEncKnown
30.157 \CBgreekCaporali
30.158 \else
30.159 \if@CyrEncKnown
30.160 \CyrilicCaporali
30.161 \else
30.162 \LtxSymbCaporali
30.163 \fi
30.164 \fi}%
30.165 {\T@unoCaporali}%
But if the default encoding is not the T1 one, then the substitutions must be
performed.
30.166 \else
30.167 \if@CBgreekEncKnown
30.168 \CBgreekCaporali
30.169 \else
30.170 \if@CyrEncKnown
30.171 \CyrilicCaporali
30.172 \else
30.173 \LtxSymbCaporali
30.174 \fi
30.175 \fi
30.176 \fi

30.5 Finishing commands


The macro \ldf@finish takes care of looking for a conguration le, setting the
main language to be switched on at \begin{document} and resetting the category
code of @ to its original value.
30.177 \ldf@finish{italian}%
30.178 h/codei

163
References
[1] Beccari C., Computer Aided Hyphenation for Italian and Modern Latin,
TUGboat vol. 13, n. 1, pp. 23-33 (1992).

[2] Beccari C., Typesetting mathematics for science and technology according to
ISO 31/XI, TUGboat vol. 18, n. 1, pp. 39-48 (1997).

164
31 The Latin language
The le latin.dtx31 denes all the language-specic macros for the Latin lan-
guage both in modern and medieval spelling.
For this language the \clubpenalty, \widowpenalty are set to rather high
values and \finalhyphendemerits is set to such a high value that hyphenation
is prohibited between the last two lines of a paragraph.
For this language two styles of typesetting are implemented: regular or
modern-spelling Latin, and medieval Latin. The medieval Latin specic com-
mands can be activated by means of the language attribute medieval; the me-
dieval spelling diers from the modern one by the systematic use of the lower case
`u' also where in modern spelling the letter `v' is used; when typesetting with
capital letters, on the opposite, the letter 'V' is used also in place of 'U'. Medieval
spelling also includes the ligatures \ae (æ), \oe (÷), \AE (Æ), and \OE (×) that
are not used in modern spelling, nor were used in the classical times.
Furthermore a third typesetting style withprosodicmarks is dened in order to
use special shortcuts for inserting breves and macrons when typesetting grammars,
dictionaries, teaching texts, and the like, where prosodic marks are important for
the complete information on the words or the verses. The shortcuts, listed in
table 7 and described in section 32, may interfere with other packages; therefore
by default this third style is o and no interference is introduced. If this third style
is used and interference is experienced, there are special commands for turning on
and o the specic short hand commands of this style.
For what concerns babel and typesetting with LATEX, the dierences between
the two styles of spelling reveal themselves in the strings used to name for example
the Preface that becomes Praefatio or Præfatio respectively. Hyphenation
rules are also dierent, but the hyphenation pattern le lahyph.tex takes care of
both versions of the language. Needless to say that such patterns must be loaded
in the LATEX format by running initex (or whatever the name if the initializer)
on latex.ltx.
The name strings for chapters, gures, tables, etcetera, are suggested by prof.
Raaella Tabacco, a classicist of the University of Turin, Italy, to whom we address
our warmest thanks. The names suggested by Krzysztof Konrad ›elechowski,
when dierent, are used as the names for the medieval variety, since he made a
word and spelling choice more suited for this variety.
For this language some shortcuts are dened according to table 7; all of them
are supposed to work with both spelling styles, except where the opposite is ex-
plicitly stated.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
31.1 h∗codei
31.2 \LdfInit{latin}{captionslatin}
When this le is read as an option, i.e. by the \usepackage command, latin
will be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@latin to see whether we have to do something here.
31.3 \ifx\l@latin\@undefined
31 The le described in this section has version number v2.0k and was last revised on
2008/03/21. The original author is Claudio Beccari with contributions by Krzysztof Konrad
›elechowski, (kkz@alfa.mimuw.edu.pl)

165
^i inserts the breve accent as ; valid also for the other
lowercase vowels, but it does not operate on the me-
dieval ligatures æ and ÷.
=a inserts the macron accent as a ; valid also for the
other lowercase vowels, but it does not operate on
the medieval ligatures æ and ÷.
" inserts a compound word mark where hyphenation is
legal; the next character must not be a medieval lig-
ature æ or ÷, nor an accented letter (foreign names).
"| same as above, but operates also when the next char-
acter is a medieval ligature or an accented letter.

Table 7: Shortcuts dened for the Latin language. The characters ^ and = are
active only when the language attribute withprosodicmarks has been declared,
otherwise they are disabled; see section 32 for more details.

31.4 \@nopatterns{Latin}
31.5 \adddialect\l@latin0\fi
Now we declare the medieval language attribute.
\bbl@declare@ttribute{latin}{medieval}{%
31.6

31.7\addto\captionslatin{\def\prefacename{Pr{\ae}fatio}}%
31.8 \def\november{Nouembris}%
31.9 \expandafter\addto\expandafter\extraslatin
31.10 \expandafter{\extrasmedievallatin}%
31.11 }
The third typesetting style withprosodicmarks is dened here
31.12 \bbl@declare@ttribute{latin}{withprosodicmarks}{%
31.13 \expandafter\addto\expandafter\extraslatin
31.14 \expandafter{\extraswithprosodicmarks}%
31.15 }
It must be remembered that the medieval and the withprosodicmarks styles
may be used together.
The next step consists of dening commands to switch to (and from) the Latin
language32 .

\captionslatin The macro \captionslatin denes all strings used in the four standard document
classes provided with LATEX.
31.16 \@namedef{captionslatin}{%
31.17 \def\prefacename{Praefatio}%
31.18 \def\refname{Conspectus librorum}%
31.19 \def\abstractname{Summarium}%
31.20 \def\bibname{Conspectus librorum}%
31.21 \def\chaptername{Caput}%
31.22 \def\appendixname{Additamentum}%
31.23 \def\contentsname{Index}%
31.24 \def\listfigurename{Conspectus descriptionum}%
31.25 \def\listtablename{Conspectus tabularum}%
31.26 \def\indexname{Index rerum notabilium}%
32 Most of these names were kindly suggested by Raaella Tabacco.

166
31.27 \def\figurename{Descriptio}%
31.28 \def\tablename{Tabula}%
31.29 \def\partname{Pars}%
31.30 \def\enclname{Adduntur}% Or " Additur" ? Or simply Add.?
31.31 \def\ccname{Exemplar}% Use the recipient's dative
31.32 \def\headtoname{\ignorespaces}% Use the recipient's dative
31.33 \def\pagename{Charta}%
31.34 \def\seename{cfr.}%
31.35 \def\alsoname{cfr.}% R.Tabacco never saw "cfr. atque" or similar forms
31.36 \def\proofname{Demonstratio}%
31.37 \def\glossaryname{Glossarium}%
31.38 }

In the above denitions there are some points that might change in the future or
that require a minimum of attention from the typesetter.

1. the \enclname is translated by a passive verb, that literally means (they)


are being added; if just one enclosure is joined to the document, the plural
passive is not suited any more; nevertheless a generic plural passive might be
incorrect but suited for most circumstances. On the opposite Additur, the
corresponding singular passive, might be more correct with one enclosure
and less suited in general: what about the abbreviation Add. that works
in both cases, but certainly is less elegant?

2. The \headtoname is empty and gobbles the possible following space; in prac-
tice the typesetter should use the dative of the recipient's name; since nowa-
days not all such names can be translated into Latin, they might result
indeclinable. The clever use of an appellative by the typesetter such as
Domino or Dominae might solve the problem, but the header might get
too impressive. The typesetter must make a decision on his own.

3. The same holds true for the copy recipient's name in the Cc eld of
\ccname.

\datelatin The macro \datelatin redenes the command \today to produce Latin dates;
the choice of faked small caps Latin numerals is arbitrary and may be changed in
the future. For medieval latin the spelling of `Novembris' should be Nouembris.
This is taken care of by using a control sequence which can be redened when the
attribute `medieval' is selected.
31.39 \def\datelatin{%
31.40 \def\november{Novembris}%
31.41 \def\today{%
31.42 {\check@mathfonts\fontsize\sf@size\z@\math@fontsfalse\selectfont
31.43 \uppercase\expandafter{\romannumeral\day}}~\ifcase\month\or
31.44 Ianuarii\or Februarii\or Martii\or Aprilis\or Maii\or Iunii\or
31.45 Iulii\or Augusti\or Septembris\or Octobris\or \november\or
31.46 Decembris\fi
31.47 \space{\uppercase\expandafter{\romannumeral\year}}}}

\romandate Thomas Martin Widmann (viralbus@daimi.au.dk) developed a macro originally


named \latindate (but to be renamed \romandate so as not to conict with the
standard babel conventions) that should compute and translate the current date
into a date ab urbe condita with days numbered according to the kalendae and idus;

167
for the moment this is a placeholder for Thomas' macro, waiting for a self standing
one that keeps local all the intermediate data, counters, etc. If he succeeds, here
is the place to add his macro.

\latinhyphenmins The Latin hyphenation patterns can be used with both \lefthyphenmin and
\righthyphenmin set to 2.
31.48 \providehyphenmins{\CurrentOption}{\tw@\tw@}

\extraslatin Lower the chance that clubs or widows occur.


\noextraslatin31.49 \addto\extraslatin{%
31.50 \babel@savevariable\clubpenalty
31.51 \babel@savevariable\@clubpenalty
31.52 \babel@savevariable\widowpenalty
31.53 \clubpenalty3000\@clubpenalty3000\widowpenalty3000}
Never ever break a word between the last two lines of a paragraph in latin texts.
31.54 \addto\extraslatin{%
31.55 \babel@savevariable\finalhyphendemerits
31.56 \finalhyphendemerits50000000}

With medieval Latin we need the suitable correspondence between upper case
V and lower case u, since in that spelling there is only one sign, and the u shape
is the (uncial) version of the capital V. Everything else is identical with Latin.
31.57 \addto\extrasmedievallatin{%
31.58 \babel@savevariable{\lccode`\V}%
31.59 \babel@savevariable{\uccode`\u}%
31.60 \lccode`\V=`\u \uccode`\u=`\V}

\SetLatinLigatures We need also the lccodes for æ and ÷; since they occupy dierent positions in
the OT1 TEX-fontencoding compared to the T1 one, we must save the lc- and the
uccodes for both encodings, but we specify the new lc- and uccodes separately as it
appears natural not to change encoding while typesetting the same language. The
encoding is assumed to be set before starting to use the Latin language, so that if
Latin is the default language, the font encoding must be chosen before requiring
the babel package with the latin option, in any case before any \selectlanguage
or \foreignlanguage command.
All this fuss is made in order to allow the use of the medieval ligatures æ and ÷
while typesetting with the medieval spelling; I have my doubts that the medieval
spelling should be used at all in modern books, reports, and the like; the uncial `u'
shape of the lower case `v' and the above ligatures were fancy styles of the copyists
who were able to write faster with those rounded glyphs; with typesetting there
is no question of handling a quill penn. . . Since my (CB) opinion may be wrong, I
managed to set up the instruments and it is up to the typesetter to use them or
not.
31.61 \addto\extrasmedievallatin{%
31.62 \babel@savevariable{\lccode`\^^e6}% T1 \ae
31.63 \babel@savevariable{\uccode`\^^e6}% T1 \ae
31.64 \babel@savevariable{\lccode`\^^c6}% T1 \AE
31.65 \babel@savevariable{\lccode`\^^f7}% T1 \oe
31.66 \babel@savevariable{\uccode`\^^f7}% T1 \OE
31.67 \babel@savevariable{\lccode`\^^d7}% T1 \OE
31.68 \babel@savevariable{\lccode`\^^1a}% OT1 \ae

168
31.69 \babel@savevariable{\uccode`\^^1a}% OT1 \ae
31.70 \babel@savevariable{\lccode`\^^1d}% OT1 \AE
31.71 \babel@savevariable{\lccode`\^^1b}% OT1 \oe
31.72 \babel@savevariable{\uccode`\^^1b}% OT1 \OE
31.73 \babel@savevariable{\lccode`\^^1e}% OT1 \OE
31.74 \SetLatinLigatures}
31.75 \providecommand\SetLatinLigatures{%

31.76 \def\@tempA{T1}\ifx\@tempA\f@encoding
31.77 \catcode`\^^e6=11 \lccode`\^^e6=`\^^e6 \uccode`\^^e6=`\^^c6 % \ae
31.78 \catcode`\^^c6=11 \lccode`\^^c6=`\^^e6 % \AE
31.79 \catcode`\^^f7=11 \lccode`\^^f7=`\^^f7 \uccode`\^^f7=`\^^d7 % \oe
31.80 \catcode`\^^d7=11 \lccode`\^^d7=`\^^f7 % \OE
31.81 \else
31.82 \catcode`\^^1a=11 \lccode`\^^1a=`\^^1a \uccode`\^^1a=`\^^1d % \ae
31.83 \catcode`\^^1d=11 \lccode`\^^1d=`\^^1a % \AE (^^])
31.84 \catcode`\^^1b=11 \lccode`\^^1b=`\^^1b \uccode`\^^1b=`\^^1e % \oe
31.85 \catcode`\^^1e=11 \lccode`\^^1e=`\^^1b % \OE (^^^)
31.86 \fi
31.87 \let\@tempA\@undefined
31.88 }
With the above denitions we are sure that \MakeUppercase works properly
and \MakeUppercase{C{\ae}sar} correctly `yields `CÆSAR; correspondingly
\MakeUppercase{Heluetia} correctly yields HELVETIA.

32 Latin shortcuts
For writing dictionaries or didactic texts (in modern spelling only) we dened a
third language attribute, or a third typesetting style, a couple of other active char-
acters are dened: ^ for marking a vowel with the breve sign, and = for marking a
vowel with the macro sign. Please take notice that neither the OT1 font encoding,
nor the T1 one for most vowels, contain directly the marked vowels, therefore hy-
phenation of words containing these accents may become problematic; for this
reason the above active characters not only introduce the required accent, but also
an unbreakable zero skip that in practice does not introduce a discretionary break,
but allows breaks in the rest of the word.
It must be remarked that the active characters ^ and = may have other mean-
ings in other contexts. For example the equals sign is used by the graphic ex-
tensions for specifying keyword options for handling the graphic elements to be
included in the document. At the same time, as mentioned in the previous para-
graph, diacritical marking in Latin is used only for typesetting certain kind of
documents, such as grammars and dictionaries. It is reasonable that the breve
and macron active characters are switched on and o at will, and in particular
that they are o by default if the attribute withprosodicmarks has not been set.

\ProsodicMarksOn We begin by adding to the normal typesetting style the denitions of the new
\ProsodicMarksOff commands \ProsodicMarksOn and \ProsodicMarksOff that should produce error
messages when the third style is not declared:
32.1 \addto\extraslatin{\def\ProsodicMarksOn{%
32.2 \GenericError{(latin)\@spaces\@spaces\@spaces\@spaces}%
32.3 {Latin language error: \string\ProsodicMarksOn\space
32.4 is defined by setting the\MessageBreak

169
32.5 language attribute to `withprosodicmarks'\MessageBreak
32.6 If you continue you are likely to encounter\MessageBreak
32.7 fatal errors that I can't recover}%
32.8 {See the Latin language description in the babel
32.9 documentation for explanation}{\@ehd}}}
32.10 \addto\extraslatin{\let\ProsodicMarksOff\relax}

Then we temporarily set the caret and the equals sign to active characters so
that they can receive their denitions. But rst we store their current category
codes to restore them later on.
32.11 \@tempcnta=\catcode`\=
32.12 \@tempcntb=\catcode`\^
32.13 \catcode`\= \active

32.14 \catcode`\^ \active

Now we can add the necessary declarations to the macros that are being activated
when the Latin language and its typesetting styles are declared:
32.15 \addto\extraslatin{\languageshorthands{latin}}%
32.16 \addto\extraswithprosodicmarks{\bbl@activate{^}}%
32.17 \addto\extraswithprosodicmarks{\bbl@activate{=}}%

32.18 \addto\noextraswithprosodicmarks{\bbl@deactivate{^}}%

32.19 \addto\noextraswithprosodicmarks{\bbl@deactivate{=}}%

32.20 \addto\extraswithprosodicmarks{\ProsodicMarks}

\ProsodicMarks Next we dene the dening macro for the active characters
32.21 \def\ProsodicMarks{%
32.22 \def\ProsodicMarksOn{\catcode`\^ \active\catcode`\= \active}%
32.23 \def\ProsodicMarksOff{\catcode`\^ 7\catcode`\= 12\relax}%
Notice that with the above redenitions of the commands \ProsodicMarksOn and
\ProsodicMarksOff, the operation of the newly dened shortcuts may be switched
on and o at will, so that even if a picture has to be inserted in the document by
means of the commands and keyword options of the graphicx package, it suces
to switch them o before invoking the picture including command, and switched
on again afterwards; or, even better, since the picture very likely is being inserted
within a figure environment, it suces to switch them o within the environment,
being conscious that their deactivation remains local to the environment.
32.24 \initiate@active@char{^}%
32.25 \initiate@active@char{=}%
32.26 \declare@shorthand{latin}{^a}{%
32.27 \textormath{\u{a}\bbl@allowhyphens}{\hat{a}}}%
32.28 \declare@shorthand{latin}{^e}{%
32.29 \textormath{\u{e}\bbl@allowhyphens}{\hat{e}}}%
32.30 \declare@shorthand{latin}{^i}{%
32.31 \textormath{\u{\i}\bbl@allowhyphens}{\hat{\imath}}}%
32.32 \declare@shorthand{latin}{^o}{%
32.33 \textormath{\u{o}\bbl@allowhyphens}{\hat{o}}}%
32.34 \declare@shorthand{latin}{^u}{%
32.35 \textormath{\u{u}\bbl@allowhyphens}{\hat{u}}}%
32.36 %
32.37 \declare@shorthand{latin}{=a}{%
32.38 \textormath{\={a}\bbl@allowhyphens}{\bar{a}}}%
32.39 \declare@shorthand{latin}{=e}{%
32.40 \textormath{\={e}\bbl@allowhyphens}{\bar{e}}}%

170
32.41 \declare@shorthand{latin}{=i}{%
32.42 \textormath{\={\i}\bbl@allowhyphens}{\bar{\imath}}}%
32.43 \declare@shorthand{latin}{=o}{%
32.44 \textormath{\={o}\bbl@allowhyphens}{\bar{o}}}%
32.45 \declare@shorthand{latin}{=u}{%
32.46 \textormath{\={u}\bbl@allowhyphens}{\bar{u}}}%
32.47 }
Notice that the short hand denitions are given only for lower case letters; it
would not be dicult to extend the set of denitions to upper case letters, but it
appears of very little use in view of the kind of documents where prosodic marks
are supposed to be used. Nevertheless in those rare cases when it's required to
set some uppercase letters with their prosodic marks, it is always possible to
use the standard LATEX commands such as \u{I} for typesetting I, or \={A} for

typesetting A.
Finally we restore the caret and equals sign initial default category codes.
32.48 \catcode`\= \@tempcnta
32.49 \catcode`\^ \@tempcntb
so as to avoid conicts with other packages or other babel options.

\LatinMarksOn We dene two new commands so as to switch on and o the breve and macron
\LatinMarksOff shortcuts.
32.50 \addto\extraswithprosodicmarks{\let\LatinMarksOn\ProsodicMarksOn}
32.51 \addto\extraswithprosodicmarks{\let\LatinMarksOff\ProsodicMarksOff}

It must be understood that by using the above prosodic marks, line breaking
is somewhat impeached; since such prosodic marks are used almost exclusively in
dictionaries, grammars, and poems (only in school textbooks), this shouldn't be
of any importance for what concerns the quality of typesetting.

33 Etymological hyphenation
In order to deal in a clean way with prexes and compound words to be divided
etymologically, the active character " is given a special denition so as to behave
as a discretionary break with hyphenation allowed after it. Most of the code for
dealing with the active " is already contained in the core of babel, but we are
going to use it as a single character shorthand for Latin.
33.1 \initiate@active@char{"}%
33.2 \addto\extraslatin{\bbl@activate{"}%
33.3 }

A temporary macro is dened so as to take dierent actions in math mode and


text mode: specically in the former case the macro inserts a double quote as it
should in math mode, otherwise another delayed macro comes into action.
\declare@shorthand{latin}{"}{%
33.4

33.5 \ifmmode
33.6 \def\lt@@next{''}%
33.7 \else
33.8 \def\lt@@next{\futurelet\lt@temp\lt@cwm}%
33.9 \fi
33.10 \lt@@next
33.11 }%

171
In text mode the \lt@next control sequence is such that upon its execution a
temporary variable \lt@temp is made equivalent to the next token in the input list
without actually removing it. Such temporary token is then tested by the macro
\lt@cwm and if it is found to be a letter token, then it introduces a compound
word separator control sequence \lt@allowhyphens whose expansion introduces
a discretionary hyphen and an unbreakable space; in case the token is not a letter,
the token is tested again to nd if it is the character |, in which case it is gobbled
and a discretionary break is introduced.
33.12 \def\lt@allowhyphens{\nobreak\discretionary{-}{}{}\nobreak\hskip\z@skip}
33.13 \newcommand*{\lt@cwm}{\let\lt@n@xt\relax
33.14 \ifcat\noexpand\lt@temp a%
33.15 \let\lt@n@xt\lt@allowhyphens
33.16 \else
33.17 \if\noexpand\lt@temp\string|%
33.18 \def\lt@n@xt{\lt@allowhyphens\@gobble}%
33.19 \fi
33.20 \fi
33.21 \lt@n@xt}%
Attention: the category code comparison does not work if the temporary
control sequence \lt@temp has been let equal to an implicit character, such as
\ae; therefore this etymological hyphenation facility does not work with medieval
Latin spelling when " immediately precedes a ligature. In order to overcome
this drawback the shorthand "| may be used in such cases; it behaves exactly
as ", but it does not test the implicit character control sequence. An input
such as super"|{\ae}quitas33 gets hyphenated as su-per-æqui-tas instead of
su-pe-ræ-qui-tas.
The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
33.22 \ldf@finish{latin}
33.23 h/codei

33 This word does not exist in regular Latin, and it is used just as an example.

172
34 The Portuguese language
The le portuges.dtx34 denes all the language-specic macros for the Por-
tuguese language as well as for the Brasilian version of this language.
For this language the character " is made active. In table 8 an overview is
given of its purpose.

"| disable ligature at this position.


"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"" like "-, but producing no hyphen sign (for words that
should break at some sign such as entrada/salida.
"< for French left double quotes (similar to <<).
"> for French right double quotes (similar to >>).
\- like the old \-, but allowing hyphenation in the rest
of the word.

Table 8: The extra denitions made by portuges.ldf

The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
34.1 h∗codei
34.2 \LdfInit\CurrentOption{captions\CurrentOption}
When this le is read as an option, i.e. by the \usepackage command,
portuges will be an `unknown' language in which case we have to make it known.
So we check for the existence of \l@portuges to see whether we have to do some-
thing here. Since it is possible to load this le with any of the following four
options to babel: portuges, portuguese, brazil and brazilian we also allow that the
hyphenation patterns are loaded under any of these four names. We just have to
nd out which one was used.
34.3 \ifx\l@portuges\@undefined
34.4 \ifx\l@portuguese\@undefined
34.5 \ifx\l@brazil\@undefined
34.6 \ifx\l@brazilian\@undefined
34.7 \@nopatterns{Portuguese}
34.8 \adddialect\l@portuges0
34.9 \else
34.10 \let\l@portuges\l@brazilian
34.11 \fi
34.12 \else
34.13 \let\l@portuges\l@brazil
34.14 \fi
34.15 \else
34.16 \let\l@portuges\l@portuguese
34.17 \fi
34.18 \fi

By now \l@portuges is dened. When the language denition le was loaded
under a dierent name we make sure that the hyphenation patterns can be found.
34 The le described in this section has version number v1.2q and was last revised on
2008/03/18. Contributions were made by Jose Pedro Ramalhete (JRAMALHE@CERNVM or
Jose-Pedro_Ramalhete@MACMAIL) and Arnaldo Viegas de Lima arnaldo@VNET.IBM.COM.

173
34.19 \expandafter\ifx\csname l@\CurrentOption\endcsname\relax
34.20 \expandafter\let\csname l@\CurrentOption\endcsname\l@portuges
34.21 \fi

Now we have to decide whether this language denition le was loaded for
Portuguese or Brasilian use. This can be done by checking the contents of
\CurrentOption. When it doesn't contain either `portuges' or `portuguese' we
make \bbl@tempb empty.
34.22 \def\bbl@tempa{portuguese}
34.23 \ifx\CurrentOption\bbl@tempa
34.24 \let\bbl@tempb\@empty
34.25 \else

34.26 \def\bbl@tempa{portuges}
34.27 \ifx\CurrentOption\bbl@tempa
34.28 \let\bbl@tempb\@empty
34.29 \else
34.30 \def\bbl@tempb{brazil}
34.31 \fi
34.32 \fi

34.33 \ifx\bbl@tempb\@empty

The next step consists of dening commands to switch to (and from) the Por-
tuguese language.

\captionsportuges The macro \captionsportuges denes all strings used in the four standard doc-
umentclasses provided with LATEX.
34.34 \@namedef{captions\CurrentOption}{%
34.35 \def\prefacename{Pref\'acio}%
34.36 \def\refname{Refer\^encias}%
34.37 \def\abstractname{Resumo}%
34.38 \def\bibname{Bibliografia}%
34.39 \def\chaptername{Cap\'{\i}tulo}%
34.40 \def\appendixname{Ap\^endice}%
Some discussion took place around the correct translations for `Table of Contents'
and `Index'. the translations dier for Portuguese and Brasilian based the follow-
ing history:

The whole issue is that some books without a real index at the end
misused the term `Índice' as table of contents. Then, what happens is
that some books apeared with `Índice' at the begining and a `Índice
Remissivo' at the end. Remissivo is a redundant word in this case,
but was introduced to make up the dierence. So in Brasil people
started using `Sumário' and `Índice Remissivo'. In Portugal this seems
not to be very common, therefore we chose `Índice' instead of `Índice
Remissivo'.
34.41 \def\contentsname{Conte\'udo}%
34.42 \def\listfigurename{Lista de Figuras}%
34.43 \def\listtablename{Lista de Tabelas}%
34.44 \def\indexname{\'Indice}%
34.45 \def\figurename{Figura}%
34.46 \def\tablename{Tabela}%
34.47 \def\partname{Parte}%
34.48 \def\enclname{Anexo}%

174
34.49 \def\ccname{Com c\'opia a}%
34.50 \def\headtoname{Para}%
34.51 \def\pagename{P\'agina}%
34.52 \def\seename{ver}%
34.53 \def\alsoname{ver tamb\'em}%
An alternate term for `Proof' could be `Prova'.
34.54 \def\proofname{Demonstra\c{c}\~ao}%
34.55 \def\glossaryname{Gloss\'ario}%
34.56 }

\dateportuges The macro \dateportuges redenes the command \today to produce Portuguese
dates.
34.57 \@namedef{date\CurrentOption}{%
34.58 \def\today{\number\day\space de\space\ifcase\month\or
34.59 Janeiro\or Fevereiro\or Mar\c{c}o\or Abril\or Maio\or Junho\or
34.60 Julho\or Agosto\or Setembro\or Outubro\or Novembro\or Dezembro%
34.61 \fi
34.62 \space de\space\number\year}}
34.63 \else

For the Brasilian version of these denitions we just add a dialect.


34.64 \expandafter
34.65 \adddialect\csname l@\CurrentOption\endcsname\l@portuges

\captionsbrazil The captions are dierent for both versions of the language, so we dene the
macro \captionsbrazil here.
34.66 \@namedef{captions\CurrentOption}{%
34.67 \def\prefacename{Pref\'acio}%
34.68 \def\refname{Refer\^encias}%
34.69 \def\abstractname{Resumo}%
34.70 \def\bibname{Refer\^encias Bibliogr\'aficas}%
34.71 \def\chaptername{Cap\'{\i}tulo}%
34.72 \def\appendixname{Ap\^endice}%
34.73 \def\contentsname{Sum\'ario}%
34.74 \def\listfigurename{Lista de Figuras}%
34.75 \def\listtablename{Lista de Tabelas}%
34.76 \def\indexname{\'Indice Remissivo}%
34.77 \def\figurename{Figura}%
34.78 \def\tablename{Tabela}%
34.79 \def\partname{Parte}%
34.80 \def\enclname{Anexo}%
34.81 \def\ccname{C\'opia para}%
34.82 \def\headtoname{Para}%
34.83 \def\pagename{P\'agina}%
34.84 \def\seename{veja}%
34.85 \def\alsoname{veja tamb\'em}%
34.86 \def\proofname{Demonstra\c{c}\~ao}%
34.87 \def\glossaryname{Gloss\'ario}%
34.88 }

\datebrazil The macro \datebrazil redenes the command \today to produce Brasilian
dates, for which the names of the months are not capitalized.

175
34.89 \@namedef{date\CurrentOption}{%
34.90 \def\today{\number\day\space de\space\ifcase\month\or
34.91 janeiro\or fevereiro\or mar\c{c}o\or abril\or maio\or junho\or
34.92 julho\or agosto\or setembro\or outubro\or novembro\or dezembro%
34.93 \fi
34.94 \space de\space\number\year}}
34.95 \fi

\portugeshyphenmins Set correct values for \lefthyphenmin and \righthyphenmin.


34.96 \providehyphenmins{\CurrentOption}{\tw@\thr@@}

\extrasportuges The macro \extrasportuges will perform all the extra denitions needed for the
\noextrasportuges Portuguese language. The macro \noextrasportuges is used to cancel the actions
of \extrasportuges.
For Portuguese the " character is made active. This is done once, later on
its denition may vary. Other languages in the same document may also use the
" character for shorthands; we specify that the portuguese group of shorthands
should be used.
34.97 \initiate@active@char{"}
34.98 \@namedef{extras\CurrentOption}{\languageshorthands{portuges}}
34.99 \expandafter\addto\csname extras\CurrentOption\endcsname{%

34.100 \bbl@activate{"}}
Don't forget to turn the shorthands o again.
34.101 \addto\noextrasportuges{\bbl@deactivate{"}}
First we dene access to the guillemets for quotations,
34.102 \declare@shorthand{portuges}{"<}{%
34.103 \textormath{\guillemotleft}{\mbox{\guillemotleft}}}
34.104 \declare@shorthand{portuges}{">}{%

34.105 \textormath{\guillemotright}{\mbox{\guillemotright}}}
then we dene two shorthands to be able to specify hyphenation breakpoints that
behave a little dierent from \-.
34.106 \declare@shorthand{portuges}{"-}{\nobreak-\bbl@allowhyphens}
34.107 \declare@shorthand{portuges}{""}{\hskip\z@skip}
And we want to have a shorthand for disabling a ligature.
34.108 \declare@shorthand{portuges}{"|}{%
34.109 \textormath{\discretionary{-}{}{\kern.03em}}{}}

\- All that is left now is the redenition of \-. The new version of \- should indicate
an extra hyphenation position, while allowing other hyphenation positions to be
generated automatically. The standard behaviour of TEX in this respect is very
unfortunate for languages such as Dutch and German, where long compound words
are quite normal and all one needs is a means to indicate an extra hyphenation
position on top of the ones that TEX can generate from the hyphenation patterns.
34.110 \expandafter\addto\csname extras\CurrentOption\endcsname{%
34.111 \babel@save\-}
34.112 \expandafter\addto\csname extras\CurrentOption\endcsname{%

34.113 \def\-{\allowhyphens\discretionary{-}{}{}\allowhyphens}}

176
\ord We also provide an easy way to typeset ordinals, both in the male (\ord or \ro)
\ro and the female (orda or \ra) form.
\orda34.114 \def\ord{$^{\rm o}$}
\ra34.115 \def\orda{$^{\rm a}$}
34.116 \let\ro\ord\let\ra\orda

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
34.117 \ldf@finish\CurrentOption
34.118 h/codei

177
35 The Spanish language
The le spanish.dtx35 denes all the language-specic macros for the Spanish
language.
Spanish support is implemented following mainly the guidelines given by José
Martínez de Sousa. You may get the the full documentation (more comprehensive,
but regrettably only in Spanish) by typesetting spanish.dtx directly. There are
examples and some additional features documented in the Spanish version only.
Cross-references in this section point to that document.

Features This style provides:


• Translations following the International LATEX conventions, as well as
\today.
• Shorthands listed in Table 9. Examples in subsection 3.4 are illustrative.
Notice that "~ has a special meaning in spanish dierent to other languages,
and is used mainly in linguistic contexts.

• \frenchspacing.
• In math mode, a dot followed by a digit is replaced by a decimal comma.

• Spanish ordinals and abbreviations with the \sptext{htext i} command as,


for instance, 1\sptext{er}. The preceptive dot is included.

• Accented (lím, máx, mín, mód) and spaced (arc cos, etc.) functions.
• \dotlessi is provided for use in math mode.
• A quoting environment and a related pair of shorthands << and >>. Useful
for traditional spanish multi-paragraph quoting.

• There is a small space before the percent \% sign.


• \lsc provides lowercase small caps. (See subsection 3.10.)

• Ellipsis is best typed as ... or, within a sentence, as \...

If spanish is the main language, the command \layoutspanish is added to


the main group, modifying the standard classes throughout the whole document
in the following way:

• Paragraphs are set with \indentfirst.


• Both enumerate and itemize are adapted to Spanish rules.
• Both \alph and \Alph include ñ after n.

• Symbol footmarks are one, two, three, etc., asterisks.


35 The le described in this section has version number v5.0e and was last revised on
2008/07/06. The maintainer from v4.0 on is Javier Bezos (http://www.texytipograa.com).
Previous versions were made by Julio Sánchez. The English documentation has been improved
by José Luis Rivera; thanks to him it is now a lot clearer.

178
'a Acute accented a. Works for e, i, o, u, too (both
lowercase and uppercase).
'n ñ (uppercase too).
"i ï (uppercase too).
"u ü (uppercase too).
"a "o Ordinal numbers (uppercase "A, "O too).
"er "ER Ordinal 1.er 1.er
"c ç (uppercase too).
"rr rr, but -r when hyphenated.
"y An old ligature for et (like the English &).
"- Like \-, but allowing hyphenation in the rest the
word.
"= Like -, but allowing hyphenation in the rest the
word.
"~ The hyphen is repeated at the very beginning of the
next line if the word is hyphenated at this point.
"" Like "- but producing no hyphen sign.
~- Like "- but with no break after the hyphen. Works
for en-dashes (~--) and em-dashes (~---). "+, "+-
and "+-- are synonymous.
"/ A slash slightly lowered, if necessary.
"| Disable ligatures at this point.
"< Left guillemets.
"> Right guillemets.
<< >> \begin{quoting} and \end{quoting}. (See below.)
"` and "' are synonymous.
"? "! Opening question and exlamation marks (¾½) aligned
on the baseline, useful for all-caps headings, etc.

Table 9: Extra denitions made by le spanish.ldf

• OT1 guillemets are generated with two lasy symbols instead of small \ll
and \gg.

• \roman is redened to write small caps Roman numerals, since lowercase


Roman numerals are discouraged (see below).

• There is a dot after section numbers in titles, headings, and toc.

A subset of these features is implemented for Plain TEX (accesible with the
command \input spanish.sty). Most signicantly, \lsc, the quoting environ-
ment, and features provided by \layoutspanish are missing.

Customization Beginning with version 5.0, customization is made following


two paths: via options or via commands; these options and commands override
the layout for Spanish documents at dierent levels: options are meant for use at
the preamble only, while commands may be used in the conguration le or at
document level.
Global options control the overall appearance of the document, and may be
set on the {babel} call, right after calling spanish, or shortly before the call to

179
Basic Options es-minimal es-sloppy es-noshorthands
es-noindentfirst X X
es-nosectiondot X X
es-nolists X X
es-noquoting X X X
es-notilde X X X
es-nodecimaldot X X X
es-nolayout X
es-ucroman X
es-lcroman X X

Table 10: Spanish Customization Options

{babel}, to ensure their proper loading at runtime. Thus, the following calls are
roughly equivalent:
\usepackage[...,spanish,es-nosectiondot,es-nodecimaldot,...]{babel}

\def\spanishoptions{es-nosectiondot,es-nodecimaldot}
\usepackage[...,spanish,...]{babel}

Some global options are built upon lower level options, and may be used as
shorthand for more global customizations. Table 10 gives an overview of the
global options constructed this way. Most of these options are self-explanatory:
they disable the changes made to the basic LATEX layout by spanish. es-lcroman
however, and a few others, need a bit of explanation, and they may be described
as follows:
• Traditional Spanish typography discourages the use of lowercase Roman
numerals; instead, a smallcaps variant is implemented. However, since
Makeindex seems to choke on the code implementing lowercase Roman
numerals (via the \lsc macro), two workarounds are implemented: the
es-ucroman option converts all Roman numerals to uppercase, and the
es-lcroman option turns all Roman numerals to lowercase; the former should
be preferred over the latter. Three macros control local changes to Roman
numbers: \spanishscroman, \spanishucroman, and \spanishlcroman.
• The es-preindex option calls the romanidx.sty package automatically
to x index entries in smallcaps roman form. An additional macro,
\spanishindexchars{hencap i}{hopenrange i}{hcloserange i} determines the
characters delimiting index entries. Defaults are \spanishindexchars{|}{(}{)}.
• The es-tilden option restores the old tilde ~ shorthand for ñ. This short-
hand is however strongly deprecated.
• The es-nolayout option disables layout changes in the document when
spanish is the main language. These changes aect enumerated and item-
ized lists, enumerations (alphabetic order excludes ñ), and symbolic foot-
notes.
• The es-noshorthands disables the shorthand mechanism completely: nei-
ther " nor ' nor < nor > nor ~ nor . work at all.

180
• The es-noquoting option disables the macros << and >> calling the quoting
environment; the alternative macros "` and "' are still available.

• The es-uppernames option makes uppercase versions of captions for chapter,


tablename, etc.

• The es-tabla option changes cuadro for tabla in captions.

Finally, the Spanish 5 series begins the implementation of national variations


of Spanish typography, beginning with Mexico. Thus the global options mexico
and mexico-com are adapted to practices spread in Mexico, and perhaps Central
America, the Caribbean, and some countries in South America.36
Many of the global options are implemented via macros, which may be included
in the conguration le spanish.cfg, in the preamble, after the call to babel,
and in the body of the document. These macros are the following.

• The macros \spanishdashitems and \spanishsignitems change the values


of itemized lists to a series of dashes or an alternative series of symbols,
respectively.

• The command \deactivatequoting deactivates the << and >> shorthands


if you want to use < and > in numerical comparisons and some AMSTEX
commands.

• You may kill the space in spaced operators with \unspacedoperators.


• You may kill the accents on accented operators with \unaccentedoperators.
• The command \decimalpoint resets the decimal separator to its default
(dot) value, while \spanishdecimal{hsymbol i} allows for an arbitrary de-
nition.

• \spanishplainpercent prevents the addition of a thinspace before the per-


cent sign in texts. This might be useful for parenthesized percent signs in
tables, etc.

• The macros \spanishdatedel and \spanishdatede control the if the article


is given in years (del or de).

• The macro \spanishreverseddate sets the date of the format Month Day
del Year.

• The macro \Today gives months in uppercase.


• The macros \spanishcaption change the value of the caption automatically
(no need to add an \addto).

• The command \spanishdeactivate{hcharacters i} disables the shorthand


characters listed in the argument. Elegible characters are the set .'"~<>.
These shorthand characters may be globally deactivated for Spanish adding
this command to \shorthandsspanish.
36 The main dierence is that mexico disables the decimaldot mechanism, while mexico-com
keeps it enabled; both change the quoting environment, disabling the use of guillemets.

181
\lquoti "<
\rquoti ">
\lquotii ``
\rquotii ''
\lquotiii `
\rquotiii '

Table 11: Default quoting signs set for the quoting environment.

• Extras are divided in groups controlled by the commands \textspanish,


\mathspanish, \shorthandsspanish y \layoutspanish; their values may
be cancelled typing \renewcommand{hcommand i}{}, or changed at will
(check the Spanish documentation or the code for details).

• The command \spanishoperators{hoperators i} denes command names


for operators in Spanish. There is no standard name for some of them,
so they may be created or changed at will. For instance, the com-
mand \renewcommand{\spanishoperators}{arc\,ctg m\acute{i}n} cre-
ates commands for these functions. The command \, adds thinspaces at the
appropriate places for spaced operators (like \arcctg in this case), and the
command \acute{hletter i} adds an accent to the letter included in the def-
inition (thus, m\acute{i}n denes the accented function \min (mín); please
notice that \dotlessi is not necessary).

• The commands \lquoti{hstring i} \rquoti{hstring i} \lquotii{hstring i}


\rquotii{hstring i} \lquotiii{hstring i} \rquotiii{hstring i} set the quot-
ing signs in the quoting environment, nested from outside in. They may be
\renewed at will. Default values are shown in table 11.
• The command \selectspanish* is obsolete: if spanish is the main
language, all its features are available right after loading babel. The
es-delayed option is provided to restore the previous behavior and macros
for backwards compatibility.

35.1 The Code


This le provides denition for both LATEX 2ε and non LATEX 2ε formats.
35.1 h∗codei
35.2 \ProvidesLanguage{spanish.ldf}
35.3 [2008/07/06 v5.0e Spanish support from the babel system]
35.4 \LdfInit{spanish}\captionsspanish

35.5

35.6 \edef\es@savedcatcodes{%
35.7 \catcode`\noexpand\~=\the\catcode`\~
35.8 \catcode`\noexpand\"=\the\catcode`\"}
35.9 \catcode`\~=\active

35.10 \catcode`\"=12

35.11

35.12 \ifx\undefined\l@spanish
35.13 \@nopatterns{Spanish}
35.14 \adddialect\l@spanish0

182
35.15 \fi
35.16

35.17 \def\es@sdef#1{\babel@save#1\def#1}
35.18

35.19 \@ifundefined{documentclass}
35.20 {\let\ifes@latex\iffalse}
35.21 {\let\ifes@latex\iftrue}
Package options for spanish. To avoid error messages dummy options are
created on the y when neccessary.
35.22 \ifes@latex
35.23

35.24 \@ifundefined{spanishoptions}{}
35.25 {\PassOptionsToPackage{\spanishoptions}{babel}}
35.26

35.27 \def\es@genoption#1#2#3{%
35.28 \DeclareOption{#1}{}%
35.29 \@ifpackagewith{babel}{#1}%
35.30 {\def\es@a{#1}%
35.31 \expandafter\let\expandafter\es@b\csname opt@babel.sty\endcsname
35.32 \addto\es@b{,#2}%
35.33 \expandafter\let\csname opt@babel.sty\endcsname\es@b
35.34 \AtEndOfPackage{#3}}%
35.35 {}}
35.36

35.37 \es@genoption{es-minimal}
35.38 {es-ucroman,es-noindentfirst,es-nosectiondot,es-nolists,%
35.39 es-noquoting,es-notilde,es-nodecimaldot}
35.40 {\spanishplainpercent
35.41 \let\es@operators\relax}
35.42 \es@genoption{es-sloppy}

35.43 {es-nolayout,es-noshorthands}{}
35.44 \es@genoption{es-noshorthands}

35.45 {es-noquoting,es-nodecimaldot,es-notilde}{}
35.46 \es@genoption{mexico}

35.47 {mexico-com,es-nodecimaldot}{}
35.48 \es@genoption{mexico-com}

35.49 {es-tabla,es-noquoting}
35.50 {\def\lquoti{``}\def\rquoti{''}%
35.51 \def\lquotii{`}\def\rquotii{'}%
35.52 \def\lquotiii{\guillemotleft{}}%
35.53 \def\rquotiii{\guillemotright{}}}
35.54

35.55 \def\es@ifoption#1#2#3{%
35.56 \DeclareOption{es-#1}{}%
35.57 \@ifpackagewith{babel}{es-#1}{#2}{#3}}%
35.58

35.59 \def\es@optlayout#1#2{\es@ifoption{#1}{}{\addto\layoutspanish{#2}}}
35.60

35.61 \else
35.62

35.63 \def\es@ifoption#1#2#3{\@namedef{spanish#1}{#2}}
35.64

35.65 \fi

183
35.66

35.67 \let\es@uclc\@secondoftwo
35.68 \es@ifoption{uppernames}{\let\es@uclc\@firstoftwo}{}
35.69

35.70 \def\es@tablename{Ccuadro}
35.71 \es@ifoption{tabla}{\def\es@tablename{Ttabla}}{}
35.72 \es@ifoption{cuadro}{\def\es@tablename{Ccuadro}}{}

Captions follow a two step schema, so that, say, \refname is dened as


\spanishrefname which in turn contains the string to be printed. The nal de-
nition of \captionsspanish is built below.
35.73 \def\captionsspanish{%
35.74 \es@a{preface}{Prefacio}%
35.75 \es@a{ref}{Referencias}%
35.76 \es@a{abstract}{Resumen}%
35.77 \es@a{bib}{Bibliograf\'{\i}a}%
35.78 \es@a{chapter}{Cap\'{\i}tulo}%
35.79 \es@a{appendix}{Ap\'{e}ndice}%
35.80 \es@a{listfigure}{\'{I}ndice de \es@uclc Ffiguras}%
35.81 \es@a{listtable}{\'{I}ndice de \expandafter\es@uclc\es@tablename s}%
35.82 \es@a{index}{\'{I}ndice \es@uclc Aalfab\'{e}tico}%
35.83 \es@a{figure}{Figura}%
35.84 \es@a{table}{\expandafter\@firstoftwo\es@tablename}%
35.85 \es@a{part}{Parte}%
35.86 \es@a{encl}{Adjunto}%
35.87 \es@a{cc}{Copia a}%
35.88 \es@a{headto}{A}%
35.89 \es@a{page}{p\'{a}gina}%
35.90 \es@a{see}{v\'{e}ase}%
35.91 \es@a{also}{v\'{e}ase tambi\'{e}n}%
35.92 \es@a{proof}{Demostraci\'{o}n}%
35.93 \es@a{glossary}{Glosario}%
35.94 \@ifundefined{chapter}
35.95 {\es@a{contents}{\'Indice}}%
35.96 {\es@a{contents}{\'Indice \es@uclc Ggeneral}}}
35.97

35.98 \def\es@a#1{\@namedef{spanish#1name}}
35.99 \captionsspanish
35.100 \def\es@a#1#2{%

35.101 \def\expandafter\noexpand\csname#1name\endcsname
35.102 {\expandafter\noexpand\csname spanish#1name\endcsname}}
35.103 \edef\captionsspanish{\captionsspanish}

Now two macros for dates (upper and lowercase).


35.104 \def\es@month#1{%
35.105 \expandafter#1\ifcase\month\or Eenero\or Ffebrero\or
35.106 Mmarzo\or Aabril\or Mmayo\or Jjunio\or Jjulio\or Aagosto\or
35.107 Sseptiembre\or Ooctubre\or Nnoviembre\or Ddiciembre\fi}
35.108

35.109 \def\es@today#1{%
35.110 \ifcase\es@datefmt
35.111 \the\day~de \es@month#1%
35.112 \else
35.113 \es@month#1~\the\day

184
35.114 \fi
35.115 \ de\ifnum\year>1999\es@yearl\fi~\the\year}
35.116

35.117 \def\datespanish{%
35.118 \def\today{\es@today\@secondoftwo}%
35.119 \def\Today{\es@today\@firstoftwo}}
35.120 \newcount\es@datefmt

35.121 \def\spanishreverseddate{\es@datefmt\@ne}

35.122 \def\spanishdatedel{\def\es@yearl{l}}

35.123 \def\spanishdatede{\let\es@yearl\@empty}

35.124 \spanishdatede

The basic macros to select the language in the preamble or the cong le. Use
of \selectlanguage should be avoided at this early stage because the active chars
are not yet active. \selectspanish makes them active.
35.125 \def\selectspanish{%
35.126 \def\selectspanish{%
35.127 \def\selectspanish{%
35.128 \PackageWarning{spanish}{Extra \string\selectspanish ignored}}%
35.129 \es@select}}
35.130 \@onlypreamble\selectspanish

35.131 \def\es@select{%

35.132 \let\es@select\@undefined
35.133 \selectlanguage{spanish}}
35.134

35.135 \let\es@shlist\@empty
Instead of joining all the extras directly in \extrasspanish, we subdivide them
in three further groups.
35.136 \def\extrasspanish{%
35.137 \textspanish
35.138 \mathspanish
35.139 \ifx\shorthandsspanish\@empty
35.140 \expandafter\spanishdeactivate\expandafter{\es@shlist}%
35.141 \languageshorthands{none}%
35.142 \else
35.143 \shorthandsspanish
35.144 \fi}
35.145 \def\noextrasspanish{%

35.146 \ifx\textspanish\@empty\else
35.147 \notextspanish
35.148 \fi
35.149 \ifx\mathspanish\@empty\else
35.150 \nomathspanish
35.151 \fi
35.152 \ifx\shorthandsspanish\@empty\else
35.153 \noshorthandsspanish
35.154 \fi
35.155 \csname es@restorelist\endcsname}
35.156

35.157 \addto\textspanish{\es@sdef\sptext{\protect\es@sptext}}
35.158

35.159 \def\es@orddot{.}

185
The denition of \sptext is more elaborated than that of \textsuperscript.
With uppercase superscript text the scriptscriptsize is used. The mandatory dot
is already included. There are two versions, depending on the format.
35.160 \ifes@latex
35.161 \def\es@sptext#1{%
35.162 {\es@orddot
35.163 \setbox\z@\hbox{8}\dimen@\ht\z@
35.164 \csname S@\f@size\endcsname
35.165 \edef\@tempa{\def\noexpand\@tempc{#1}%
35.166 \lowercase{\def\noexpand\@tempb{#1}}}\@tempa
35.167 \ifx\@tempb\@tempc
35.168 \fontsize\sf@size\z@
35.169 \selectfont
35.170 \advance\dimen@-1.15ex
35.171 \else
35.172 \fontsize\ssf@size\z@
35.173 \selectfont
35.174 \advance\dimen@-1.5ex
35.175 \fi
35.176 \math@fontsfalse\raise\dimen@\hbox{#1}}}
35.177 \else

35.178 \let\sptextfont\rm
35.179 \def\es@sptext#1{%
35.180 {\es@orddot
35.181 \setbox\z@\hbox{8}\dimen@\ht\z@
35.182 \edef\@tempa{\def\noexpand\@tempc{#1}%
35.183 \lowercase{\def\noexpand\@tempb{#1}}}\@tempa
35.184 \ifx\@tempb\@tempc
35.185 \advance\dimen@-0.75ex
35.186 \raise\dimen@\hbox{$\scriptstyle\sptextfont#1$}%
35.187 \else
35.188 \advance\dimen@-0.8ex
35.189 \raise\dimen@\hbox{$\scriptscriptstyle\sptextfont#1$}%
35.190 \fi}}
35.191 \fi

Now, lowercase small caps. First, we test if there are actual small caps for the
current font. If not, faked small caps are used. The \selectfont in \es@lsc could
seem redundant, but it's not. An intermediate macro allows using an optimized
variant for Roman numerals.
35.192 \ifes@latex
35.193 \addto\textspanish{\es@sdef\lsc{\protect\es@lsc}}
35.194 \def\es@lsc{\es@xlsc\MakeUppercase\MakeLowercase}
35.195 \def\es@xlsc#1#2#3{%
35.196 \leavevmode
35.197 \hbox{%
35.198 \scshape\selectfont
35.199 \expandafter\ifx\csname\f@encoding/\f@family/\f@series
35.200 /n/\f@size\expandafter\endcsname
35.201 \csname\curr@fontshape/\f@size\endcsname
35.202 \csname S@\f@size\endcsname
35.203 \fontsize\sf@size\z@\selectfont
35.204 \PackageWarning{spanish}{Replacing `\curr@fontshape' by

186
35.205 \MessageBreak faked small caps}%
35.206 #1{#3}%
35.207 \else
35.208 #2{#3}%
35.209 \fi}}
35.210 \fi
The quoting environment. This part is not available in Plain. Overriding the
default \everypar is a bit tricky.
35.211 \newif\ifes@listquot
35.212

35.213 \ifes@latex
35.214 \csname newtoks\endcsname\es@quottoks
35.215 \csname newcount\endcsname\es@quotdepth
35.216 \newenvironment{quoting}
35.217 {\leavevmode
35.218 \advance\es@quotdepth\@ne
35.219 \csname lquot\romannumeral\es@quotdepth\endcsname%
35.220 \ifnum\es@quotdepth=\@ne
35.221 \es@listquotfalse
35.222 \let\es@quotpar\everypar
35.223 \let\everypar\es@quottoks
35.224 \everypar\expandafter{\the\es@quotpar}%
35.225 \es@quotpar{\the\everypar
35.226 \ifes@listquot\global\es@listquotfalse\else\es@quotcont\fi}%
35.227 \fi
35.228 \toks@\expandafter{\es@quotcont}%
35.229 \edef\es@quotcont{\the\toks@
35.230 \expandafter\noexpand
35.231 \csname rquot\romannumeral\es@quotdepth\endcsname}}
35.232 {\csname rquot\romannumeral\es@quotdepth\endcsname}
35.233 \def\lquoti{\guillemotleft{}}
35.234 \def\rquoti{\guillemotright{}}
35.235 \def\lquotii{``}
35.236 \def\rquotii{''}
35.237 \def\lquotiii{`}
35.238 \def\rquotiii{'}
35.239 \let\es@quotcont\@empty
If there is a margin par inside quoting, we don't add the quotes. \es@listqout
stores the quotes to be used before item labels; otherwise they could appear after
the labels.
35.240 \addto\@marginparreset{\let\es@quotcont\@empty}
35.241 \DeclareRobustCommand\es@listquot{%
35.242 \csname rquot\romannumeral\es@quotdepth\endcsname
35.243 \global\es@listquottrue}
35.244 \fi

Now, the \frenchspacing, followed by \... and \%.


35.245 \addto\textspanish{\bbl@frenchspacing}
35.246 \addto\notextspanish{\bbl@nonfrenchspacing}
35.247 \addto\textspanish{%

35.248 \let\es@save@dot\.%
35.249 \es@sdef\.{\@ifnextchar.{\es@dots}{\es@save@dot}}}

187
35.250 \def\es@dots..{\leavevmode\hbox{...}\spacefactor\@M}
35.251 \def\es@sppercent{\unskip\textormath{$\m@th\,$}{\,}}
35.252 \def\spanishplainpercent{\let\es@sppercent\@empty}

35.253 \addto\textspanish{%

35.254 \let\percentsign\%%
35.255 \es@sdef\%{\es@sppercent\percentsign{}}}
We follow with the math group. It's not easy to add an accent to an operator.
The diculty is that we must avoid using text (that is, \mbox) because we have no
control on font and size, and at time we should access \i, which is a text command
forbidden in math mode. \dotlessi must be converted to uppercase if necessary
in LATEX 2ε . There are two versions, depending on the format.
35.256 \addto\mathspanish{\es@sdef\dotlessi{\protect\es@dotlessi}}
35.257 \let\nomathspanish\relax
35.258

35.259 \ifes@latex
35.260 \def\es@texti{\i}
35.261 \addto\@uclclist{\dotlessi\es@texti}
35.262 \fi

35.263

35.264 \ifes@latex
35.265 \def\es@dotlessi{%
35.266 \ifmmode
35.267 {\ifnum\mathgroup=\m@ne
35.268 \imath
35.269 \else
35.270 \count@\escapechar \escapechar=\m@ne
35.271 \expandafter\expandafter\expandafter
35.272 \split@name\expandafter\string\the\textfont\mathgroup\@nil
35.273 \escapechar=\count@
35.274 \@ifundefined{\f@encoding\string\i}%
35.275 {\edef\f@encoding{\string?}}{}%
35.276 \expandafter\count@\the\csname\f@encoding\string\i\endcsname
35.277 \advance\count@"7000
35.278 \mathchar\count@
35.279 \fi}%
35.280 \else
35.281 \i
35.282 \fi}
35.283 \else

35.284 \def\es@dotlessi{\textormath{\i}{\mathchar"7010}}
35.285 \fi

35.286

35.287 \def\accentedoperators{%
35.288 \def\es@op@ac##1{\acute{\if i##1\dotlessi\else##1\fi}}}
35.289 \def\unaccentedoperators{%

35.290 \def\es@op@ac##1{##1}}
35.291 \accentedoperators

35.292 \def\spacedoperators{\let\es@op@sp\,}

35.293 \def\unspacedoperators{\let\es@op@sp\@empty}

35.294 \spacedoperators

35.295 \addto\mathspanish{\es@operators}

35.296

35.297 \ifes@latex\else

188
35.298 \let\operator@font\rm
35.299 \fi
The operators are stored in \es@operators, which in turn is included in the
math group. Since \operator@font is dened in LATEX 2ε only, we dened in the
plain variant.
35.300 \def\es@operators{%
35.301 \es@sdef\bmod{\nonscript\mskip-\medmuskip\mkern5mu
35.302 \mathbin{\operator@font m\es@op@ac od}\penalty900\mkern5mu
35.303 \nonscript\mskip-\medmuskip}%
35.304 \@ifundefined{@amsmath@err}%
35.305 {\es@sdef\pmod##11{\allowbreak\mkern18mu
35.306 ({\operator@font m\es@op@ac od}\,\,##11)}}%
35.307 {\es@sdef\mod##1{\allowbreak\if@display\mkern18mu
35.308 \else\mkern12mu\fi{\operator@font m\es@op@ac od}\,\,##1}%
35.309 \es@sdef\pmod##1{\pod{{\operator@font m\es@op@ac od}%
35.310 \mkern6mu##1}}}%
35.311 \def\es@a##1 {%
35.312 \if^##1^% empty? continue
35.313 \bbl@afterelse
35.314 \es@a
35.315 \else
35.316 \bbl@afterfi
35.317 {\if&##1% &? finish
35.318 \else
35.319 \bbl@afterfi
35.320 \begingroup
35.321 \let\,\@empty % ignore when def'ing name
35.322 \let\acute\@firstofone % id
35.323 \edef\es@b{\expandafter\noexpand\csname##1\endcsname}%
35.324 \def\,{\noexpand\es@op@sp}%
35.325 \def\acute{\noexpand\es@op@ac}%
35.326 \edef\es@a{\endgroup
35.327 \noexpand\es@sdef\expandafter\noexpand\es@b{%
35.328 \mathop{\noexpand\operator@font##1}\es@c}}%
35.329 \es@a % restores itself
35.330 \es@a
35.331 \fi}%
35.332 \fi}%
35.333 \let\es@b\spanishoperators
35.334 \addto\es@b{ }%
35.335 \let\es@c\@empty
35.336 \expandafter\es@a\es@b l\acute{i}m l\acute{i}m\,sup
35.337 l\acute{i}m\,inf m\acute{a}x \acute{i}nf m\acute{i}n & %
35.338 \def\es@c{\nolimits}%
35.339 \expandafter\es@a\es@b sen tg arc\,sen arc\,cos arc\,tg & }
35.340 \def\spanishoperators{cotg cosec senh tgh }

Now comes the text shorthands. They are grouped in \shorthandsspanish


and this style performs some operations before the babel shortands are called. The
aims are to allow espression like $a^{x'}$ and to deactivate shorthands by making
them of category `other.' After providing a \'i shorthand, the new macros are
dened.
35.341 \DeclareTextCompositeCommand{\'}{OT1}{i}{\@tabacckludge'{\i}}

189
35.342

35.343 \def\es@set@shorthand#1{%
35.344 \expandafter\edef\csname es@savecat\string#1\endcsname
35.345 {\the\catcode`#1}%
35.346 \initiate@active@char{#1}%
35.347 \catcode`#1=\csname es@savecat\string#1\endcsname\relax
35.348 \if.#1\else
35.349 \addto\es@restorelist{\es@restore{#1}}%
35.350 \addto\es@select{\shorthandon{#1}}%
35.351 \addto\shorthandsspanish{\es@activate{#1}}%
35.352 \addto\es@shlist{#1}%
35.353 \fi}
35.354

35.355 \def\es@use@shorthand{%
35.356 \ifx\thepage\relax
35.357 \bbl@afterelse
35.358 \string
35.359 \else
35.360 \bbl@afterfi
35.361 {\ifx\protect\@unexpandable@protect
35.362 \bbl@afterelse
35.363 \noexpand
35.364 \else
35.365 \bbl@afterfi
35.366 \es@use@sh
35.367 \fi}%
35.368 \fi}
35.369

35.370 \def\es@use@sh#1{%
35.371 \if@safe@actives
35.372 \bbl@afterelse
35.373 \string#1%
35.374 \else%
35.375 \bbl@afterfi
35.376 \textormath
35.377 {\csname active@char\string#1\endcsname}%
35.378 {\csname normal@char\string#1\endcsname}%
35.379 \fi}
35.380

35.381 \gdef\es@activate#1{%
35.382 \begingroup
35.383 \lccode`\~=`#1
35.384 \lowercase{%
35.385 \endgroup
35.386 \def~{\es@use@shorthand~}}}
35.387

35.388 \def\spanishdeactivate#1{%
35.389 \@tfor\@tempa:=#1\do{\expandafter\es@spdeactivate\@tempa}}
35.390

35.391 \def\es@spdeactivate#1{%
35.392 \if.#1%
35.393 \mathcode`\.=\es@period@code
35.394 \else
35.395 \begingroup

190
35.396 \lccode`\~=`#1
35.397 \lowercase{%
35.398 \endgroup
35.399 \expandafter\let\expandafter~%
35.400 \csname normal@char\string#1\endcsname}%
35.401 \catcode`#1=\csname es@savecat\string#1\endcsname\relax
35.402 \fi}
\es@restore is used in the list \es@restorelist, which in turn restores all
shorthands as dened by babel. The latter macros also has \es@quoting.
35.403 \def\es@restore#1{%
35.404 \shorthandon{#1}%
35.405 \begingroup
35.406 \lccode`\~=`#1
35.407 \lowercase{%
35.408 \endgroup
35.409 \bbl@deactivate{~}}}
To selectively dene the shorthands we have a couple of macros, which denes
a certain combination if the rst character has been activated as a shorthand. The
second one is intended for a few shorthands with an alternative form.
35.410 \def\es@declare#1{%
35.411 \@ifundefined{es@savecat\expandafter\string\@firstoftwo#1}%
35.412 {\@gobble}%
35.413 {\declare@shorthand{spanish}{#1}}}
35.414 \def\es@declarealt#1#2#3{%

35.415 \es@declare{#1}{#3}%
35.416 \es@declare{#2}{#3}}
35.417

35.418 \ifes@latex\else
35.419 \def\@tabacckludge#1{\csname\string#1\endcsname}
35.420 \fi

35.421

35.422 \@ifundefined{add@accent}{\def\add@accent#1#2{\accent#1 #2}}{}


Instead of redening \', we redene the internal macro for the OT1 encoding.
35.423 \ifes@latex
35.424 \def\es@accent#1#2#3{%
35.425 \expandafter\@text@composite
35.426 \csname OT1\string#1\endcsname#3\@empty\@text@composite
35.427 {\bbl@allowhyphens\add@accent{#2}{#3}\bbl@allowhyphens
35.428 \setbox\@tempboxa\hbox{#3%
35.429 \global\mathchardef\accent@spacefactor\spacefactor}%
35.430 \spacefactor\accent@spacefactor}}
35.431 \else

35.432 \def\es@accent#1#2#3{%
35.433 \bbl@allowhyphens\add@accent{#2}{#3}\bbl@allowhyphens
35.434 \spacefactor\sfcode`#3 }
35.435 \fi

35.436

35.437 \addto\shorthandsspanish{\languageshorthands{spanish}}%
35.438 \es@ifoption{noshorthands}{}{\es@set@shorthand{"}}
We override the default " of babel, intended for german.

191
35.439 \def\es@umlaut#1{%
35.440 \bbl@allowhyphens\add@accent{127}#1\bbl@allowhyphens
35.441 \spacefactor\sfcode`#1 }
35.442

35.443 \addto\shorthandsspanish{%
35.444 \babel@save\bbl@umlauta
35.445 \let\bbl@umlauta\es@umlaut}
35.446 \let\noshorthandsspanish\relax

35.447

35.448 \ifes@latex
35.449 \addto\shorthandsspanish{%
35.450 \expandafter\es@sdef\csname OT1\string\~\endcsname{\es@accent\~{126}}%
35.451 \expandafter\es@sdef\csname OT1\string\'\endcsname{\es@accent\'{19}}}
35.452 \else

35.453 \addto\shorthandsspanish{%

35.454 \es@sdef\~{\es@accent\~{126}}%
35.455 \es@sdef\'#1{\if#1i\es@accent\'{19}\i\else\es@accent\'{19}{#1}\fi}}
35.456 \fi

35.457

35.458 \def\es@sptext@r#1#2{\es@sptext{#1#2}}
35.459 \es@declare{"a}{\sptext{a}}
35.460 \es@declare{"A}{\sptext{A}}

35.461 \es@declare{"o}{\sptext{o}}

35.462 \es@declare{"O}{\sptext{O}}

35.463 \es@declare{"e}{\protect\es@sptext@r{e}}

35.464 \es@declare{"E}{\protect\es@sptext@r{E}}

35.465 \es@declare{"u}{\"u}

35.466 \es@declare{"U}{\"U}

35.467 \es@declare{"i}{\"{\i}}

35.468 \es@declare{"I}{\"I}

35.469 \es@declare{"c}{\c{c}}

35.470 \es@declare{"C}{\c{C}}

35.471 \es@declare{"<}{\guillemotleft{}}

35.472 \es@declare{">}{\guillemotright{}}

35.473 \def\es@chf{\char\hyphenchar\font}

35.474 \es@declare{"-}{\bbl@allowhyphens\-\bbl@allowhyphens}

35.475 \es@declare{"=}{\bbl@allowhyphens\es@chf\hskip\z@skip}

35.476 \es@declare{"~}

35.477 {\bbl@allowhyphens
35.478 \discretionary{\es@chf}{\es@chf}{\es@chf}%
35.479 \bbl@allowhyphens}
35.480 \es@declare{"r}

35.481 {\bbl@allowhyphens
35.482 \discretionary{\es@chf}{}{r}%
35.483 \bbl@allowhyphens}
35.484 \es@declare{"R}

35.485 {\bbl@allowhyphens
35.486 \discretionary{\es@chf}{}{R}%
35.487 \bbl@allowhyphens}
35.488 \es@declare{"y}

35.489 {\@ifundefined{scalebox}%
35.490 {\ensuremath{\tau}}%
35.491 {\raisebox{1ex}{\scalebox{-1}{\resizebox{.45em}{1ex}{2}}}}}
35.492 \es@declare{""}{\hskip\z@skip}

192
35.493 \es@declare{"/}
35.494 {\setbox\z@\hbox{/}%
35.495 \dimen@\ht\z@
35.496 \advance\dimen@-1ex
35.497 \advance\dimen@\dp\z@
35.498 \dimen@.31\dimen@
35.499 \advance\dimen@-\dp\z@
35.500 \ifdim\dimen@>0pt
35.501 \kern.01em\lower\dimen@\box\z@\kern.03em
35.502 \else
35.503 \box\z@
35.504 \fi}
35.505 \es@declare{"?}

35.506 {\setbox\z@\hbox{?`}%
35.507 \leavevmode\raise\dp\z@\box\z@}
35.508 \es@declare{"!}

35.509 {\setbox\z@\hbox{!`}%
35.510 \leavevmode\raise\dp\z@\box\z@}
35.511

35.512 \def\spanishdecimal#1{\def\es@decimal{{#1}}}
35.513 \def\decimalcomma{\spanishdecimal{,}}
35.514 \def\decimalpoint{\spanishdecimal{.}}

35.515 \decimalcomma

35.516 \es@ifoption{nodecimaldot}{}

35.517 {\AtBeginDocument{\bgroup\@fileswfalse}%
35.518 \es@set@shorthand{.}%
35.519 \AtBeginDocument{\egroup}%
35.520 \@namedef{normal@char\string.}{%
35.521 \@ifnextchar\egroup
35.522 {\mathchar\es@period@code\relax}%
35.523 {\csname active@char\string.\endcsname}}%
35.524 \declare@shorthand{system}{.}{\mathchar\es@period@code\relax}%
35.525 \addto\shorthandsspanish{%
35.526 \mathchardef\es@period@code\the\mathcode`\.%
35.527 \babel@savevariable{\mathcode`\.}%
35.528 \mathcode`\.="8000 %
35.529 \es@activate{.}}%
35.530 \def\es@a#1{\es@declare{.#1}{\es@decimal#1}}%
35.531 \es@a1\es@a2\es@a3\es@a4\es@a5\es@a6\es@a7\es@a8\es@a9\es@a0}
35.532

35.533 \es@ifoption{notilde}{}{\es@set@shorthand{~}}
35.534 \def\deactivatetilden{%
35.535 \expandafter\let\csname spanish@sh@\string~@n@\endcsname\relax
35.536 \expandafter\let\csname spanish@sh@\string~@N@\endcsname\relax}
35.537 \es@ifoption{tilden}

35.538 {\es@declare{~n}{\~n}%
35.539 \es@declare{~N}{\~N}}
35.540 {\let\deactivatetilden\relax}
35.541 \es@declarealt{~-}{"+}{%

35.542 \leavevmode
35.543 \bgroup
35.544 \let\@sptoken\es@dashes % Changes \@ifnextchar behaviour
35.545 \@ifnextchar-%
35.546 {\es@dashes}%

193
35.547 {\hbox{\es@chf}\egroup}}
35.548 \def\es@dashes-{%
35.549 \@ifnextchar-%
35.550 {\bbl@allowhyphens\hbox{---}\bbl@allowhyphens\egroup\@gobble}%
35.551 {\bbl@allowhyphens\hbox{--}\bbl@allowhyphens\egroup}}
35.552

35.553 \es@ifoption{noquoting}%
35.554 {\let\es@quoting\relax
35.555 \let\activatequoting\relax
35.556 \let\deactivatequoting\relax}
35.557 {\@ifundefined{XML@catcodes}%
35.558 {\es@set@shorthand{<}%
35.559 \es@set@shorthand{>}%
35.560 \declare@shorthand{system}{<}{\csname normal@char\string<\endcsname}%
35.561 \declare@shorthand{system}{>}{\csname normal@char\string>\endcsname}%
35.562 \addto\es@restorelist{\es@quoting}%
35.563 \addto\es@select{\es@quoting}%
35.564 \ifes@latex
35.565 \AtBeginDocument{%
35.566 \es@quoting
35.567 \if@filesw
35.568 \immediate\write\@mainaux{\string\@nameuse{es@quoting}}%
35.569 \fi}%
35.570 \fi
35.571 \def\activatequoting{%
35.572 \shorthandon{<>}%
35.573 \let\es@quoting\activatequoting}%
35.574 \def\deactivatequoting{%
35.575 \shorthandoff{<>}%
35.576 \let\es@quoting\deactivatequoting}}{}}
35.577

35.578 \es@declarealt{<<}{"`}{\begin{quoting}}
35.579 \es@declarealt{>>}{"'}{\end{quoting}}
Acute accent shorthands are stored in a macro. If activeacute was set as an
option it's executed. If not is not deleted for a possible later use in the cfg le.
In non LATEX 2ε formats is always executed.
35.580 \begingroup
35.581 \catcode`\'=12
35.582 \gdef\es@activeacute{%

35.583 \es@set@shorthand{'}%
35.584 \def\es@a##1{\es@declare{'##1}{\@tabacckludge'##1}}%
35.585 \es@a a\es@a e\es@a i\es@a o\es@a u%
35.586 \es@a A\es@a E\es@a I\es@a O\es@a U%
35.587 \es@declare{'n}{\~n}%
35.588 \es@declare{'N}{\~N}%
35.589 \es@declare{''}{\textquotedblright}%
But spanish allows two category codes for ', so both should be taken into
account in \bbl@pr@m@s.
35.590 \let\es@pr@m@s\bbl@pr@m@s
35.591 \def\bbl@pr@m@s{%
35.592 \ifx'\@let@token
35.593 \bbl@afterelse

194
35.594 \pr@@@s
35.595 \else
35.596 \bbl@afterfi
35.597 \es@pr@m@s
35.598 \fi}%
35.599 \let\es@activeacute\relax}
35.600 \endgroup

35.601

35.602 \ifes@latex
35.603 \@ifpackagewith{babel}{activeacute}{\es@activeacute}{}
35.604 \else

35.605 \es@activeacute
35.606 \fi

And the customization. By default these macros only store the values and do
nothing.
35.607 \def\es@enumerate#1#2#3#4{\def\es@enum{{#1}{#2}{#3}{#4}}}
35.608 \def\es@itemize#1#2#3#4{\def\es@item{{#1}{#2}{#3}{#4}}}
35.609

35.610 \ifes@latex
35.611 \es@enumerate{1.}{a)}{1)}{a$'$}
35.612 \def\spanishdashitems{\es@itemize{---}{---}{---}{---}}

35.613 \def\spanishsymbitems{%

35.614 \es@itemize
35.615 {\leavevmode\hbox to 1.2ex
35.616 {\hss\vrule height .9ex width .7ex depth -.2ex\hss}}%
35.617 {\textbullet}%
35.618 {$\m@th\circ$}%
35.619 {$\m@th\diamond$}}
35.620 \def\spanishsignitems{%

35.621 \es@itemize{\textbullet}%
35.622 {$\m@th\circ$}%
35.623 {$\m@th\diamond$}%
35.624 {$\m@th\triangleright$}}
35.625 \spanishsymbitems

35.626 \def\es@enumdef#1#2#3\@@{%

35.627 \if#21%
35.628 \@namedef{theenum#1}{\arabic{enum#1}}%
35.629 \else\if#2a%
35.630 \@namedef{theenum#1}{\emph{\alph{enum#1}}}%
35.631 \else\if#2A%
35.632 \@namedef{theenum#1}{\Alph{enum#1}}%
35.633 \else\if#2i%
35.634 \@namedef{theenum#1}{\roman{enum#1}}%
35.635 \else\if#2I%
35.636 \@namedef{theenum#1}{\Roman{enum#1}}%
35.637 \else\if#2o%
35.638 \@namedef{theenum#1}{\arabic{enum#1}\sptext{o}}%
35.639 \fi\fi\fi\fi\fi\fi
35.640 \toks@\expandafter{\csname theenum#1\endcsname}%
35.641 \expandafter\edef\csname labelenum#1\endcsname
35.642 {\noexpand\es@listquot\the\toks@#3}}
35.643 \def\es@guillemot#1#2{%

35.644 \ifmmode#1%

195
35.645 \else
35.646 \save@sf@q{\penalty\@M
35.647 \leavevmode\hbox{\usefont{U}{lasy}{m}{n}%
35.648 \char#2 \kern-0.19em\char#2 }}%
35.649 \fi}
35.650 \def\layoutspanish{%

35.651 \let\layoutspanish\@empty
35.652 \DeclareTextCommand{\guillemotleft}{OT1}{\es@guillemot\ll{40}}%
35.653 \DeclareTextCommand{\guillemotright}{OT1}{\es@guillemot\gg{41}}%
35.654 \def\@fnsymbol##1%
35.655 {\ifcase##1\or*\or**\or***\or****\or
35.656 *****\or******\else\@ctrerr\fi}%
35.657 \def\@alph##1%
35.658 {\ifcase##1\or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or
35.659 k\or l\or m\or n\or \~n\or o\or p\or q\or r\or s\or t\or u\or v\or
35.660 w\or x\or y\or z\else\@ctrerr\fi}%
35.661 \def\@Alph##1%
35.662 {\ifcase##1\or A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or
35.663 K\or L\or M\or N\or \~N\or O\or P\or Q\or R\or S\or T\or U\or V\or
35.664 W\or X\or Y\or Z\else\@ctrerr\fi}}
35.665

35.666 \es@optlayout{nolists}{%
35.667 \def\es@enumerate#1#2#3#4{%
35.668 \es@enumdef{i}#1\@empty\@empty\@@
35.669 \es@enumdef{ii}#2\@empty\@empty\@@
35.670 \es@enumdef{iii}#3\@empty\@empty\@@
35.671 \es@enumdef{iv}#4\@empty\@empty\@@}%
35.672 \def\es@itemize#1#2#3#4{%
35.673 \def\labelitemi{\es@listquot#1}%
35.674 \def\labelitemii{\es@listquot#2}%
35.675 \def\labelitemiii{\es@listquot#3}%
35.676 \def\labelitemiv{\es@listquot#4}}%
35.677 \def\p@enumii{\theenumi}%
35.678 \def\p@enumiii{\p@enumii\theenumii}%
35.679 \def\p@enumiv{\p@enumiii\theenumiii}%
35.680 \expandafter\es@enumerate\es@enum
35.681 \expandafter\es@itemize\es@item}
35.682 \let\esromanindex\@secondoftwo

35.683 \es@ifoption{ucroman}

35.684 {\def\es@romandef{%
35.685 \def\esromanindex##1##2{##1{\uppercase{##2}}}%
35.686 \def\@roman{\@Roman}}}
35.687 {\def\es@romandef{%
35.688 \def\esromanindex##1##2{##1{\protect\es@roman{##2}}}%
35.689 \def\@roman##1{\es@roman{\number##1}}%
35.690 \def\es@roman##1{\es@scroman{\romannumeral##1}}%
35.691 \DeclareRobustCommand\es@scroman{\es@xlsc\uppercase\@firstofone}}}
35.692 \es@optlayout{lcroman}{\es@romandef}

35.693 \newcommand\spanishlcroman{\def\@roman##1{\romannumeral##1}}

35.694 \newcommand\spanishucroman{\def\@roman{\@Roman}}

35.695 \newcommand\spanishscroman{\def\@roman##1{\es@roman{\romannumeral##1}}}

35.696 \es@optlayout{noindentfirst}{%

35.697 \let\@afterindentfalse\@afterindenttrue
35.698 \@afterindenttrue}

196
35.699 \es@optlayout{nosectiondot}{%
35.700 \def\@seccntformat#1{\csname the#1\endcsname.\quad}%
35.701 \def\numberline#1{\hb@xt@\@tempdima{#1\if&#1&\else.\fi\hfil}}}
35.702 \es@ifoption{nolayout}{\let\layoutspanish\relax}{}

35.703 \es@ifoption{sloppy}{\let\textspanish\relax\let\mathspanish\relax}{}

35.704 \es@ifoption{delayed}{}{\def\es@layoutspanish{\layoutspanish}}

35.705 \es@ifoption{preindex}{\AtEndOfPackage{\RequirePackage{romanidx}}}{}

We need to execute the following code when babel has been run, in order to
see if spanish is the main language.
35.706 \AtEndOfPackage{%
35.707 \let\es@activeacute\@undefined
35.708 \def\bbl@tempa{spanish}%

35.709 \ifx\bbl@main@language\bbl@tempa

35.710 \@nameuse{es@layoutspanish}%
35.711 \addto\es@select{%
35.712 \@ifstar{\PackageError{spanish}%
35.713 {Old syntax--use es-nolayout}%
35.714 {If you don't want changes in layout\MessageBreak
35.715 use the es-nolayout package option}}%
35.716 {}}%
35.717 \AtBeginDocument{\layoutspanish}%
35.718 \fi

35.719 \selectspanish}

35.720 \fi

After restoring the catcode of ~ and setting the minimal values for hyphenation,
the .ldf is nished.
35.721 \es@savedcatcodes
35.722 \providehyphenmins{\CurrentOption}{\tw@\tw@}
35.723 \ifes@latex\else

35.724 \es@select
35.725 \fi

35.726 \ldf@finish{spanish}

35.727 \csname activatequoting\endcsname

35.728 h/codei

That's all in the main le.


The spanish option writes a macro in the page eld of MakeIndex in entries
with small caps number, and they are rejected. This program is a preprocessor
which moves this macro to the entry eld. It can be called from the main document
as a package or with the package option es-preindex.
35.729 h∗indexesi
35.730 \makeatletter
35.731

35.732 \@ifundefined{es@idxfile}
35.733 {\def\spanishindexchars#1#2#3{%
35.734 \edef\es@encap{`\expandafter\noexpand\csname\string#1\endcsname}%
35.735 \edef\es@openrange{`\expandafter\noexpand\csname\string#2\endcsname}%
35.736 \edef\es@closerange{`\expandafter\noexpand\csname\string#3\endcsname}}%
35.737 \spanishindexchars{|}{(}{)}%
35.738 \ifx\documentclass\@twoclasseserror
35.739 \edef\es@idxfile{\jobname}%
35.740 \AtEndDocument{%

197
35.741 \addto\@defaultsubs{%
35.742 \immediate\closeout\@indexfile
35.743 \input{romanidx.sty}}}%
35.744 \expandafter\endinput
35.745 \fi}{}
35.746

35.747 \newcount\es@converted
35.748 \newcount\es@processed
35.749

35.750 \def\es@split@file#1.#2\@@{#1}
35.751 \def\es@split@ext#1.#2\@@{#2}
35.752

35.753 \@ifundefined{es@idxfile}
35.754 {\typein[\answer]{^^JArchivo que convertir^^J%
35.755 (extension por omision .idx):}}
35.756 {\let\answer\es@idxfile}
35.757

35.758 \@expandtwoargs\in@{.}{\answer}
35.759 \ifin@
35.760 \edef\es@input@file{\expandafter\es@split@file\answer\@@}
35.761 \edef\es@input@ext{\expandafter\es@split@ext\answer\@@}
35.762 \else

35.763 \edef\es@input@file{\answer}
35.764 \def\es@input@ext{idx}
35.765 \fi

35.766

35.767 \@ifundefined{es@idxfile}
35.768 {\typein[\answer]{^^JArchivo de destino^^J%
35.769 (archivo por omision: \es@input@file.eix,^^J%
35.770 extension por omision .eix):}}
35.771 {\let\answer\es@idxfile}
35.772 \ifx\answer\@empty

35.773 \edef\es@output{\es@input@file.eix}
35.774 \else

35.775 \@expandtwoargs\in@{.}{\answer}
35.776 \ifin@
35.777 \edef\es@output{\answer}
35.778 \else
35.779 \edef\es@output{\answer.eix}
35.780 \fi
35.781 \fi

35.782

35.783 \@ifundefined{es@idxfile}
35.784 {\typein[\answer]{%
35.785 ^^J?Se ha usado algun esquema especial de controles^^J%
35.786 de MakeIndex para encap, open_range o close_range?^^J%
35.787 [s/n] (n por omision)}}
35.788 {\def\answer{n}}
35.789

35.790 \if s\answer


35.791 \typein[\answer]{^^JCaracter para 'encap'^^J%
35.792 (\string| por omision)}
35.793 \ifx\answer\@empty\else
35.794 \edef\es@encap{%

198
35.795 `\expandafter\noexpand\csname\expandafter\string\answer\endcsname}
35.796 \fi
35.797 \typein[\answer]{^^JCaracter para 'open_range'^^J%
35.798 (\string( por omision)}
35.799 \ifx\answer\@empty\else
35.800 \edef\es@openrange{%
35.801 `\expandafter\noexpand\csname\expandafter\string\answer\endcsname}
35.802 \fi
35.803 \typein[\answer]{^^JCaracter para 'close_range'^^J%
35.804 (\string) por omision)}
35.805 \ifx\answer\@empty\else
35.806 \edef\es@closerange{%
35.807 `\expandafter\noexpand\csname\expandafter\string\answer\endcsname}
35.808 \fi
35.809 \fi

35.810

35.811 \newwrite\es@indexfile
35.812 \immediate\openout\es@indexfile=\es@output
35.813

35.814 \newif\ifes@encapsulated
35.815

35.816 \def\es@roman#1{#1}
35.817 \edef\es@slash{\expandafter\@gobble\string\\}
35.818

35.819 \def\indexentry{%
35.820 \begingroup
35.821 \@sanitize
35.822 \es@indexentry}
35.823

35.824 \begingroup
35.825

35.826 \catcode`\|=12 \lccode`\|=\es@encap\relax


35.827 \catcode`\(=12 \lccode`\(=\es@openrange\relax
35.828 \catcode`\)=12 \lccode`\)=\es@closerange\relax

35.829

35.830 \lowercase{
35.831 \gdef\es@indexentry#1{%
35.832 \endgroup
35.833 \advance\es@processed\@ne
35.834 \es@encapsulatedfalse
35.835 \es@bar@idx#1|\@@
35.836 \es@idxentry}%
35.837 }

35.838

35.839 \lowercase{
35.840 \gdef\es@idxentry#1{%
35.841 \in@{\es@roman}{#1}%
35.842 \ifin@
35.843 \advance\es@converted\@ne
35.844 \immediate\write\es@indexfile{%
35.845 \string\indexentry{\es@b|\ifes@encapsulated\es@p\fi esromanindex%
35.846 {\ifx\es@a\@empty\else\es@slash\es@a\fi}}{#1}}%
35.847 \else
35.848 \immediate\write\es@indexfile{%

199
35.849 \string\indexentry{\es@b\ifes@encapsulated|\es@p\es@a\fi}{#1}}%
35.850 \fi}
35.851 }
35.852

35.853 \lowercase{
35.854 \gdef\es@bar@idx#1|#2\@@{%
35.855 \def\es@b{#1}\def\es@a{#2}%
35.856 \ifx\es@a\@empty\else\es@encapsulatedtrue\es@bar@eat#2\fi}
35.857 }

35.858

35.859 \lowercase{
35.860 \gdef\es@bar@eat#1#2|{\def\es@p{#1}\def\es@a{#2}%
35.861 \edef\es@t{(}\ifx\es@t\es@p
35.862 \else\edef\es@t{)}\ifx\es@t\es@p
35.863 \else
35.864 \edef\es@a{\es@p\es@a}\let\es@p\@empty%
35.865 \fi\fi}
35.866 }

35.867

35.868 \endgroup
35.869

35.870 \input \es@input@file.\es@input@ext


35.871

35.872 \immediate\closeout\es@indexfile
35.873

35.874 \typeout{*****************}
35.875 \typeout{Se ha procesado: \es@input@file.\es@input@ext }
35.876 \typeout{Lineas leidas: \the\es@processed}

35.877 \typeout{Lineas convertidas: \the\es@converted}

35.878 \typeout{Resultado en: \es@output}

35.879 \ifnum\es@converted>\z@

35.880 \typeout{Genere el indice a partir de ese archivo}


35.881 \else

35.882 \typeout{No se ha convertido nada. Se puede generar}


35.883 \typeout{el .ind directamente de \es@input@file.\es@input@ext}
35.884 \fi

35.885 \typeout{*****************}

35.886

35.887 \@ifundefined{es@sdef}{\@@end}{}
35.888

35.889 \endinput
35.890 h/indexesi

200
36 The Catalan language
The le catalan.dtx37 denes all the language-specic macro's for the Catalan
language.
For this language only the double quote character (") is made active by default.
In table 12 an overview is given of the new macros dened and the new meanings
of ". Additionally to that, the user can explicitly activate the acute accent or
apostrophe (') and/or the grave accent (`) characters by using the activeacute and
activegrave options. In that case, the denitions shown in table 13 also become
available38 .

\l.l geminated-l digraph (similar to l·l). \L.L produces


the uppercase version.
\lgem geminated-l digraph (similar to l·l). \Lgem produces
the uppercase version.
\up Macro to help typing raised ordinals, like 1er. Takes
one argument.
\- like the old \-, but allowing hyphenation in the rest
of the word.
"i i with diaeresis, allowing hyphenation in the rest of
the word. Valid for the following vowels: i, u (both
lowercase and uppercase).
"c c-cedilla (ç). Valid for both uppercase and lowercase
c.
"l geminated-l digraph (similar to l·l). Valid for both
uppercase and lowercase l.
"< French left double quotes (similar to <<).
"> French right double quotes (similar to >>).
"- explicit hyphen sign, allowing hyphenation in the rest
of the word.
"| disable ligature at this position.

Table 12: Extra denitions made by le catalan.ldf (activated by default)

'e acute accented a, allowing hyphenation in the rest of


the word. Valid for the following vowels: e, i, o, u
(both lowercase and uppercase).
`a grave accented a, allowing hyphenation in the rest
of the word. Valid for the following vowels: a, e, o
(both lowercase and uppercase).

Table 13: Extra denitions made by le catalan.ldf (activated only when using
the options activeacute and activegrave)

These active accents characters behave according to their original denitions


37 The le described in this section has version number v2.2p and was last revised on
2005/03/29.
38 Please note that if the acute accent character is active, it is necessary to take special care of
coding apostrophes in a way which cannot be confounded with accents. Therefore, it is necessary
to type l'{}estri instead of l'estri.

201
if not followed by one of the characters indicated in that table.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
36.1 h∗codei
36.2 \LdfInit{catalan}\captionscatalan
When this le is read as an option, i.e. by the \usepackage command, catalan
could be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@catalan to see whether we have to do something
here.
36.3 \ifx\l@catalan\@undefined
36.4 \@nopatterns{Catalan}
36.5 \adddialect\l@catalan0
36.6 \fi

The next step consists of dening commands to switch to (and from) the Cata-
lan language.

\catalanhyphenmins This macro is used to store the correct values of the hyphenation parameters
\lefthyphenmin and \righthyphenmin.
36.7 \providehyphenmins{catalan}{\tw@\tw@}

\captionscatalan The macro \captionscatalan denes all strings used in the four standard docu-
mentclasses provided with LATEX.
\addto\captionscatalan{%
36.8

36.9\def\prefacename{Pr\`oleg}%
36.10 \def\refname{Refer\`encies}%
36.11 \def\abstractname{Resum}%
36.12 \def\bibname{Bibliografia}%
36.13 \def\chaptername{Cap\'{\i}tol}%
36.14 \def\appendixname{Ap\`endix}%
36.15 \def\contentsname{\'Index}%
36.16 \def\listfigurename{\'Index de figures}%
36.17 \def\listtablename{\'Index de taules}%
36.18 \def\indexname{\'Index alfab\`etic}%
36.19 \def\figurename{Figura}%
36.20 \def\tablename{Taula}%
36.21 \def\partname{Part}%
36.22 \def\enclname{Adjunt}%
36.23 \def\ccname{C\`opies a}%
36.24 \def\headtoname{A}%
36.25 \def\pagename{P\`agina}%
36.26 \def\seename{Vegeu}%
36.27 \def\alsoname{Vegeu tamb\'e}%
36.28 \def\proofname{Demostraci\'o}%
36.29 \def\glossaryname{Glossari}%
36.30 }

\datecatalan The macro \datecatalan redenes the command \today to produce Catalan
dates. Months are written in lowercase39 .
36.31 \def\datecatalan{%
39 This seems to be the common practice. See for example: E. Coromina, El 9 Nou: Manual
de redacció i estil, Ed. Eumo, Vic, 1993

202
36.32 \def\today{\number\day~\ifcase\month\or
36.33 de gener\or de febrer\or de mar\c{c}\or d'abril\or de maig\or
36.34 de juny\or de juliol\or d'agost\or de setembre\or d'octubre\or
36.35 de novembre\or de desembre\fi
36.36 \space de~\number\year}}

\extrascatalan The macro \extrascatalan will perform all the extra denitions needed for the
\noextrascatalan Catalan language. The macro \noextrascatalan is used to cancel the actions of
\extrascatalan.
To improve hyphenation we give the grave character (') a non-zero lower case
code; when we do that TEX will nd more breakpoints in words that contain this
character in its rôle as apostrophe.
36.37 \addto\extrascatalan{%
36.38 \lccode`'=`'}
36.39 \addto\noextrascatalan{%

36.40 \lccode`'=0}
For Catalan, some characters are made active or are redened. In particular,
the " character receives a new meaning; this can also happen for the ' character
and the ` character when the options activegrave and/or activeacute are specied.
36.41 \addto\extrascatalan{\languageshorthands{catalan}}
36.42 \initiate@active@char{"}
36.43 \addto\extrascatalan{\bbl@activate{"}}

Because the grave character is being used in constructs such as \catcode``=\active


it needs to have it's original category code when the auxiliary le is being read.
Note that this le is read twice, once at the beginning of the document; then there
is no problem; but the second time it is read at the end of the document to check
whether any labels changes. It's this second time round that the actived grave
character leads to error messages.
36.44 \@ifpackagewith{babel}{activegrave}{%
36.45 \AtBeginDocument{%
36.46 \if@filesw\immediate\write\@auxout{\catcode096=12}\fi}
36.47 \initiate@active@char{`}%
36.48 }{}
36.49 \@ifpackagewith{babel}{activegrave}{%

36.50 \addto\extrascatalan{\bbl@activate{`}}%
36.51 }{}
36.52 \@ifpackagewith{babel}{activeacute}{%

36.53 \initiate@active@char{'}%
36.54 }{}
36.55 \@ifpackagewith{babel}{activeacute}{%

36.56 \addto\extrascatalan{\bbl@activate{'}}%
36.57 }{}
Now make sure that the characters that have been turned into shorthanfd char-
acters expand to `normal' characters outside the catalan environment.
36.58 \addto\noextrascatalan{\bbl@deactivate{"}}
36.59 \@ifpackagewith{babel}{activegrave}{%
36.60 \addto\noextrascatalan{\bbl@deactivate{`}}}{}
36.61 \@ifpackagewith{babel}{activeacute}{%

36.62 \addto\noextrascatalan{\bbl@deactivate{'}}}{}

203
Apart from the active characters some other macros get a new denition.
Therefore we store the current ones to be able to restore them later. When their
current meanings are saved, we can safely redene them.
We provide new denitions for the accent macros when one or both of the
options activegrave or activeacute were specied.
36.63 \addto\extrascatalan{%
36.64 \babel@save\"%
36.65 \def\"{\protect\@umlaut}}%
36.66 \@ifpackagewith{babel}{activegrave}{%

36.67 \babel@save\`%
36.68 \addto\extrascatalan{\def\`{\protect\@grave}}
36.69 }{}
36.70 \@ifpackagewith{babel}{activeacute}{%

36.71 \babel@save\'%
36.72 \addto\extrascatalan{\def\'{\protect\@acute}}
36.73 }{}

All the code above is necessary because we need a few extra active characters.
These characters are then used as indicated in tables 12 and 13.

\dieresis The original denition of \" is stored as \dieresis, because the denition of
\textacute \" might not be the default plain TEX one. If the user uses PostScript fonts
\textgrave with the Adobe font encoding the " character is not in the same position as in
Knuth's font encoding. In this case \" will not be dened as \accent"7F 1, but
as \accent'310 #1. Something similar happens when using fonts that follow the
Cork encoding. For this reason we save the denition of \" and use that in the
denition of other macros. We do likewise for \`, and \'.
36.74 \let\dieresis\"
36.75 \@ifpackagewith{babel}{activegrave}{\let\textgrave\`}{}
36.76 \@ifpackagewith{babel}{activeacute}{\let\textacute\'}{}

\@umlaut We check the encoding and if not using T1, we make the accents expand but
\@acute enabling hyphenation beyond the accent. If this is the case, not all break positions
\@grave will be found in words that contain accents, but this is a limitation in TEX. An
unsolved problem here is that the encoding can change at any time. The denitions
below are made in such a way that a change between two 256-char encodings
are supported, but changes between a 128-char and a 256-char encoding are not
properly supported. We check if T1 is in use. If not, we will give a warning and
proceed redening the accent macros so that TEX at least nds the breaks that
are not too close to the accent. The warning will only be printed to the log le.
36.77 \ifx\DeclareFontShape\@undefined
36.78 \wlog{Warning: You are using an old LaTeX}
36.79 \wlog{Some word breaks will not be found.}
36.80 \def\@umlaut#1{\allowhyphens\dieresis{#1}\allowhyphens}
36.81 \@ifpackagewith{babel}{activeacute}{%
36.82 \def\@acute#1{\allowhyphens\textacute{#1}\allowhyphens}}{}
36.83 \@ifpackagewith{babel}{activegrave}{%
36.84 \def\@grave#1{\allowhyphens\textgrave{#1}\allowhyphens}}{}
36.85 \else

36.86 \ifx\f@encoding\bbl@t@one
36.87 \let\@umlaut\dieresis
36.88 \@ifpackagewith{babel}{activeacute}{%

204
36.89 \let\@acute\textacute}{}
36.90 \@ifpackagewith{babel}{activegrave}{%
36.91 \let\@grave\textgrave}{}
36.92 \else
36.93 \wlog{Warning: You are using encoding \f@encoding\space
36.94 instead of T1.}
36.95 \wlog{Some word breaks will not be found.}
36.96 \def\@umlaut#1{\allowhyphens\dieresis{#1}\allowhyphens}
36.97 \@ifpackagewith{babel}{activeacute}{%
36.98 \def\@acute#1{\allowhyphens\textacute{#1}\allowhyphens}}{}
36.99 \@ifpackagewith{babel}{activegrave}{%
36.100 \def\@grave#1{\allowhyphens\textgrave{#1}\allowhyphens}}{}
36.101 \fi
36.102 \fi

If the user setup has extended fonts, the Ferguson macros are required to be
dened. We check for their existance and, if dened, expand to whatever they are
dened to. For instance, \'a would check for the existance of a \@ac@a macro. It
is assumed to expand to the code of the accented letter. If it is not dened, we
assume that no extended codes are available and expand to the original denition
but enabling hyphenation beyond the accent. This is as best as we can do. It is
better if you have extended fonts or ML-TEX because the hyphenation algorithm
can work on the whole word. The following macros are directly derived from
ML-TEX.40

Now we can dene our shorthands: the diaeresis and ela geminada support,
36.103 \declare@shorthand{catalan}{"i}{\textormath{\@umlaut\i}{\ddot\imath}}
36.104 \declare@shorthand{catalan}{"l}{\lgem{}}
36.105 \declare@shorthand{catalan}{"u}{\textormath{\@umlaut u}{\ddot u}}

36.106 \declare@shorthand{catalan}{"I}{\textormath{\@umlaut I}{\ddot I}}

36.107 \declare@shorthand{catalan}{"L}{\Lgem{}}

36.108 \declare@shorthand{catalan}{"U}{\textormath{\@umlaut U}{\ddot U}}

cedille,
36.109 \declare@shorthand{catalan}{"c}{\textormath{\c c}{^{\prime} c}}
36.110 \declare@shorthand{catalan}{"C}{\textormath{\c C}{^{\prime} C}}
`french' quote characters,
36.111 \declare@shorthand{catalan}{"<}{%
36.112 \textormath{\guillemotleft}{\mbox{\guillemotleft}}}
36.113 \declare@shorthand{catalan}{">}{%

36.114 \textormath{\guillemotright}{\mbox{\guillemotright}}}
grave accents,
36.115 \@ifpackagewith{babel}{activegrave}{%
36.116 \declare@shorthand{catalan}{`a}{\textormath{\@grave a}{\grave a}}
36.117 \declare@shorthand{catalan}{`e}{\textormath{\@grave e}{\grave e}}
36.118 \declare@shorthand{catalan}{`o}{\textormath{\@grave o}{\grave o}}
40 A problem is perceived here with these macros when used in a multilingual environment
where extended hyphenation patterns are available for some but not all languages. Assume that
no extended patterns exist at some site for French and that french.sty would adopt this scheme
too. In that case, 'e in French would produce the combined accented letter, but hyphenation
around it would be suppressed. Both language options would need an independent method to
know whether they have extended patterns available. The precise impact of this problem and
the possible solutions are under study.

205
36.119 \declare@shorthand{catalan}{`A}{\textormath{\@grave A}{\grave A}}
36.120 \declare@shorthand{catalan}{`E}{\textormath{\@grave E}{\grave E}}
36.121 \declare@shorthand{catalan}{`O}{\textormath{\@grave O}{\grave O}}
36.122 \declare@shorthand{catalan}{``}{\textquotedblleft}%''
36.123 }{}
acute accents,
36.124 \@ifpackagewith{babel}{activeacute}{%
36.125 \declare@shorthand{catalan}{'a}{\textormath{\@acute a}{^{\prime} a}}
36.126 \declare@shorthand{catalan}{'e}{\textormath{\@acute e}{^{\prime} e}}
36.127 \declare@shorthand{catalan}{'i}{\textormath{\@acute\i{}}{^{\prime} i}}
36.128 \declare@shorthand{catalan}{'o}{\textormath{\@acute o}{^{\prime} o}}
36.129 \declare@shorthand{catalan}{'u}{\textormath{\@acute u}{^{\prime} u}}
36.130 \declare@shorthand{catalan}{'A}{\textormath{\@acute A}{^{\prime} A}}
36.131 \declare@shorthand{catalan}{'E}{\textormath{\@acute E}{^{\prime} E}}
36.132 \declare@shorthand{catalan}{'I}{\textormath{\@acute I}{^{\prime} I}}
36.133 \declare@shorthand{catalan}{'O}{\textormath{\@acute O}{^{\prime} O}}
36.134 \declare@shorthand{catalan}{'U}{\textormath{\@acute U}{^{\prime} U}}
36.135 \declare@shorthand{catalan}{'|}{%
36.136 \textormath{\csname normal@char\string'\endcsname}{^{\prime}}}
the acute accent,
36.137 \declare@shorthand{catalan}{''}{%
36.138 \textormath{\textquotedblright}{\sp\bgroup\prim@s'}}
36.139 }{}
and nally, some support denitions
36.140 \declare@shorthand{catalan}{"-}{\nobreak-\bbl@allowhyphens}
36.141 \declare@shorthand{catalan}{"|}{%
36.142 \textormath{\nobreak\discretionary{-}{}{\kern.03em}%
36.143 \allowhyphens}{}}

\- All that is left now is the redenition of \-. The new version of \- should in-
dicate an extra hyphenation position, while allowing other hyphenation positions
to be generated automatically. The standard behaviour of TEX in this respect
is unfortunate for Catalan but not as much as for Dutch or German, where long
compound words are quite normal and all one needs is a means to indicate an
extra hyphenation position on top of the ones that TEX can generate from the
hyphenation patterns. However, the average length of words in Catalan makes
this desirable and so it is kept here.
36.144 \addto\extrascatalan{%
36.145 \babel@save{\-}%
36.146 \def\-{\bbl@allowhyphens\discretionary{-}{}{}\bbl@allowhyphens}}

\lgem Here we dene a macro for typing the catalan ela geminada (geminated l). The
\Lgem macros \lgem and \Lgem have been chosen for its lowercase and uppercase repre-
sentation, respectively41 .
The code used in the actual macro used is a combination of the one proposed by
Feruglio and Fuster42 and the proposal43 from Valiente presented at the TEX Users
41 The macro names \ll and \LL were not taken because of the fact that \ll is already used
in mathematical mode.
42 G. Valiente and R. Fuster, Typesetting Catalan Texts with TEX, TUGboat (3), 1993.14
43 G. Valiente, Modern Catalan Typographical Conventions, TUGboat 16
(3), 1995.

206
Group Annual Meeting in 1995. This last proposal has not been fully implemented
due to its limitation to CM fonts.
36.147 \newdimen\leftllkern \newdimen\rightllkern \newdimen\raiselldim
36.148 \def\lgem{%
36.149 \ifmmode
36.150 \csname normal@char\string"\endcsname l%
36.151 \else
36.152 \leftllkern=0pt\rightllkern=0pt\raiselldim=0pt%
36.153 \setbox0\hbox{l}\setbox1\hbox{l\/}\setbox2\hbox{.}%
36.154 \advance\raiselldim by \the\fontdimen5\the\font
36.155 \advance\raiselldim by -\ht2%
36.156 \leftllkern=-.25\wd0%
36.157 \advance\leftllkern by \wd1%
36.158 \advance\leftllkern by -\wd0%
36.159 \rightllkern=-.25\wd0%
36.160 \advance\rightllkern by -\wd1%
36.161 \advance\rightllkern by \wd0%
36.162 \allowhyphens\discretionary{l-}{l}%
36.163 {\hbox{l}\kern\leftllkern\raise\raiselldim\hbox{.}%
36.164 \kern\rightllkern\hbox{l}}\allowhyphens
36.165 \fi
36.166 }
36.167 \def\Lgem{%

36.168 \ifmmode
36.169 \csname normal@char\string"\endcsname L%
36.170 \else
36.171 \leftllkern=0pt\rightllkern=0pt\raiselldim=0pt%
36.172 \setbox0\hbox{L}\setbox1\hbox{L\/}\setbox2\hbox{.}%
36.173 \advance\raiselldim by .5\ht0%
36.174 \advance\raiselldim by -.5\ht2%
36.175 \leftllkern=-.125\wd0%
36.176 \advance\leftllkern by \wd1%
36.177 \advance\leftllkern by -\wd0%
36.178 \rightllkern=-\wd0%
36.179 \divide\rightllkern by 6%
36.180 \advance\rightllkern by -\wd1%
36.181 \advance\rightllkern by \wd0%
36.182 \allowhyphens\discretionary{L-}{L}%
36.183 {\hbox{L}\kern\leftllkern\raise\raiselldim\hbox{.}%
36.184 \kern\rightllkern\hbox{L}}\allowhyphens
36.185 \fi
36.186 }

\l.l It seems to be the most natural way of entering the ela geminda to use the
\L.L sequences \l.l and \L.L. These are not really macro's by themselves but the
macros \l and \L with delimited arguments. Therefor we dene two macros
that check if the next character is a period. If not the polish l will be typeset,
otherwise a ela geminada will be typeset and the next two tokens will be `eaten'.

36.187 \AtBeginDocument{%
36.188 \let\lslash\l
36.189 \let\Lslash\L
36.190 \DeclareRobustCommand\l{\@ifnextchar.\bbl@l\lslash}

207
36.191 \DeclareRobustCommand\L{\@ifnextchar.\bbl@L\Lslash}}
36.192 \def\bbl@l#1#2{\lgem}
36.193 \def\bbl@L#1#2{\Lgem}

\up A macro for typesetting things like 1er as proposed by Raymon Seroul44 .
36.194 \DeclareRobustCommand*{\up}[1]{\textsuperscript{#1}}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
36.195 \ldf@finish{catalan}
36.196 h/codei

44 This macro has been borrowed from francais.dtx

208
37 This le
This le denes all the language-specic macros for the Galician language. The le
galician.dtx was translated in January 2007 by Javier A. Múgica from spanish.dtx.
It was given the version number 4.3, based on the version for spanish.dtx at those
times, that was 4.2b. The original author from v4.0 to 4.2b was Javier Bezos.
Previous versions were written by Julio Sánchez.
I decided to make tabula rasa of all \changes logs. Only changes from spanish
4.2b to galician 4.3 and thereafter are documented. The change history for the
original spanish.dtx can be found in that le.

38 The Galcian language


Custumization is made following mainly the books on the subject by José Martínez
de Sousa and Xosé Feixó Cid. By typesetting galician.dtx directly you will
get the full documentation (regrettably is in Galician only, but it is pretty long).
References in this part refers to that document. There are several aditional features
documented in the Galician version only.
This style provides:
• Translations following the International LATEX conventions, as well as
\today.
• Shorthands listed in Table 14. Examples in subsection 3.4 are illustrative.
Note that "~ has a special meaning in galician dierent to other languages,
and is used mainly in linguistic contexts.
• \deactivatetilden deactivates the ~n and ~N shorthands.
• In math mode a dot followed by a digit is replaced by a decimal comma.
• Galicians ordinals and abbeviations with \sptext as, for instance, 1\sptext{o}.
The preceptive dot is included.
• Accented functions: lím, máx, mín, mód. You may globally omit the accents
with \unaccentedoperators. Spaced functions: arc cos, etc. You may glob-
ally kill that space with \unspacedoperators. \dotlessi is provided for
use in math mode.
• A quoting environment and a related pair of shorthands << and >>. The
command \deactivatequoting deactivates these shorthand in case you
want to use < and > in some AMS commands and numerical comparisons.
• The command \selectgalician selects the galician language and its
shorthands. (Intended for the preamble.)
• \frenchspacing is used.
• \dots is redened. It is now equal to typing tree points in a row (it preserves
the space following).
• There is a small space before \%.
• \msc provides lowercase small caps. (See subsection 3.10.)

209
'a acute accented a. Also for: e, i, o, u (both lowercase
and uppercase).
'n ñ (also uppercase).
~n ñ (also uppercase). Deprecated.
"u ü (also uppercase).
"i ï (also uppercase).
"a Ordinal numbers (also "A, "o, "O).
"rr rr, but -r when hyphenated
"- Like \-, but allowing hyphenation in the rest the
word.
"= Like -, but allowing hyphenation in the rest the
word.
"~ The hyphen is repeated at the very beginning of the
next line if the word is hyphenated at this point.
"" Like "- but producing no hyphen sign.
~- Like - but with no break after the hyphen. Also for:
en-dashes (~--) and em-dashes (~---).
"/ A slash slightly lowered, if necessary.
"| disable ligatures at this point.
<< Left guillemets.
>> Right guillemets.
"< \begin{quoting}. (See text.)
"> \end{quoting}. (See text.)

Table 14: Extra denitions made by le galician.ldf

Just in case galician is the main language, the group \layoutgalician is


activated, which modies the standard classes through the whole document (it
cannot be deactivated) in the following way:

• Both enumerate and itemize are adapted to Galician rules.


• Both \alph and \Alph include ñ after n.

• Symbol footmarks are one, two, three, etc., asteriscs.


• OT1 guillemets are generated with two lasy symbols instead of small \ll
and \gg.

• \roman is redened to write small caps roman numerals, since lowercase


roman numerals are not allowed. However, MakeIndex rejects entries con-
taining pages in that format. The .idx le must be preprocessed if the
document has this kind of entries with the provided romanidx.tex tool
just TEX it and follow the instructions.

• There is a dot after section numbers in titles and toc.


This group is ignored if you write \selectgalician* in the preamble.
Some additional commands are provided to be used in the galician.cfg le:

• With \gl@activeacute acute accents are always active, overriding the de-
fault babel behaviour.

210
• \gl@enumerate sets the labels to be used by enumerate. The same applies
to \gl@itemize and itemize.

• \gl@operators stores the operator commands. All of them are canceled


with

\let\gl@operators\relax

The commands \deactivatequoting, \deactivatetilden and \selectgalician


may be used in this le, too.
A subset of these commands is provided for use in Plain TEX (with \input galician.sty).

38.1 The Code


This le provides denition for both LATEX 2ε and non LATEX 2ε formats.
Identify the ldf le.
38.1 h∗codei
38.2 \ProvidesLanguage{galician.ldf}
38.3 [2008/07/06 v4.3c Galician support from the babel system]
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc. When this le is read as
an option, i.e. by the \usepackage command, galician will be an `unknown'
language in which case we have to make it known. So we check for the existence
of \l@galician to see whether we have to do something here.
38.4 \LdfInit{galician}\captionsgalician
38.5 \ifx\undefined\l@galician
38.6 \@nopatterns{Galician}
38.7 \adddialect\l@galician0
38.8 \fi

We dene some tools which will be used in that style le: (1) we make sure
that ~ is active, (2) \gl@delayed delays the expansion of the code in conditionals
(in fact, quite similar to \bbl@afterfi).
38.9 \edef\gl@savedcatcodes{%
38.10 \catcode`\noexpand\~=\the\catcode`\~
38.11 \catcode`\noexpand\"=\the\catcode`\"}
38.12 \catcode`\~=\active

38.13 \catcode`\"=12

38.14 \long\def\gl@delayed#1\then#2\else#3\fi{%

38.15 #1%
38.16 \expandafter\@firstoftwo
38.17 \else
38.18 \expandafter\@secondoftwo
38.19 \fi
38.20 {#2}{#3}}
Two tests are introduced. The rst one tells us if the format is LATEX 2ε , and
the second one if the format is Plain or any other. If both are false, the format is
LATEX2.09.
38.21 \gl@delayed
38.22 \expandafter\ifx\csname documentclass\endcsname\relax\then
38.23 \let\ifes@LaTeXe\iffalse
38.24 \else

211
38.25 \let\ifes@LaTeXe\iftrue
38.26 \fi
38.27 \gl@delayed

38.28 \expandafter\ifx\csname newenvironment\endcsname\relax\then

38.29 \let\ifes@plain\iftrue
38.30 \else

38.31 \let\ifes@plain\iffalse
38.32 \fi

Translations for captions.


38.33 \addto\captionsgalician{%
38.34 \def\prefacename{Prefacio}%
38.35 \def\refname{Referencias}%
38.36 \def\abstractname{Resumo}%
38.37 \def\bibname{Bibliograf\'{\i}a}%
38.38 \def\chaptername{Cap\'{\i}tulo}%
38.39 \def\appendixname{Ap\'endice}%
38.40 \def\listfigurename{\'Indice de figuras}%
38.41 \def\listtablename{\'Indice de cadros}%
38.42 \def\indexname{\'Indice alfab\'etico}%
38.43 \def\figurename{Figura}%
38.44 \def\tablename{Cadro}%
38.45 \def\partname{Parte}%
38.46 \def\enclname{Adxunto}%
38.47 \def\ccname{Copia a}%
38.48 \def\headtoname{A}%
38.49 \def\pagename{P\'axina}%
38.50 \def\seename{v\'exase}%
38.51 \def\alsoname{v\'exase tam\'en}%
38.52 \def\proofname{Demostraci\'on}%
38.53 \def\glossaryname{Glosario}}
38.54

38.55 \expandafter\ifx\csname chapter\endcsname\relax


38.56 \addto\captionsgalician{\def\contentsname{\'Indice}}
38.57 \else

38.58 \addto\captionsgalician{\def\contentsname{\'Indice xeral}}


38.59 \fi

And the date.


38.60 \def\dategalician{%
38.61 \def\today{\the\day~de \ifcase\month\or xaneiro\or febreiro\or
38.62 marzo\or abril\or maio\or xu\~no\or xullo\or agosto\or
38.63 setembro\or outubro\or novembro\or decembro\fi
38.64 \ \ifnum\year>1999\gl@yearl\else de\fi~\the\year}}
38.65 \def\galiciandatedo{\def\gl@yearl{do}}

38.66 \def\galiciandatede{\def\gl@yearl{de}}

38.67 \galiciandatedo

The basic macros to select the language, in the preamble or the cong le.
Use of \selectlanguage should be avoided at this early stage because the active
chars are not yet active. \selectgalician makes them active.
38.68 \def\selectgalician{%
38.69 \def\selectgalician{%
38.70 \def\selectgalician{%
38.71 \PackageWarning{galician}{Extra \string\selectgalician ignored}}%
38.72 \gl@select}}

212
38.73

38.74 \@onlypreamble\selectgalician
38.75

38.76 \def\gl@select{%
38.77 \let\gl@select\@undefined
38.78 \selectlanguage{galician}%
38.79 \catcode`\"\active\catcode`\~=\active}
Instead of joining all the extras directly in \extrasgalician, we subdivide
them in three further groups.
38.80 \def\extrasgalician{%
38.81 \textgalician
38.82 \mathgalician
38.83 \ifx\shorthandsgalician\@empty
38.84 \galiciandeactivate{."'~<>}%
38.85 \languageshorthands{none}%
38.86 \else
38.87 \shorthandsgalician
38.88 \fi}
38.89 \def\noextrasgalician{%

38.90 \ifx\textgalician\@empty\else
38.91 \notextgalician
38.92 \fi
38.93 \ifx\mathgalician\@empty\else
38.94 \nomathgalician
38.95 \fi
38.96 \ifx\shorthandsgalician\@empty\else
38.97 \noshorthandsgalician
38.98 \fi
38.99 \gl@reviveshorthands}
And the rst of these sub-groups is dened.
38.100 \addto\textgalician{%
38.101 \babel@save\sptext
38.102 \def\sptext{\protect\gl@sptext}}
The denition of \sptext is more elaborated than that of \textsuperscript.
With uppercase superscript text the scriptscriptsize is used. The mandatory dot
is already included. There are two versions, depending on the format.
38.103 \ifes@LaTeXe %<<<<<<
38.104 \newcommand\gl@sptext[1]{%
38.105 {.\setbox\z@\hbox{8}\dimen@\ht\z@
38.106 \csname S@\f@size\endcsname
38.107 \edef\@tempa{\def\noexpand\@tempc{#1}%
38.108 \lowercase{\def\noexpand\@tempb{#1}}}\@tempa
38.109 \ifx\@tempb\@tempc
38.110 \fontsize\sf@size\z@
38.111 \selectfont
38.112 \advance\dimen@-1.15ex
38.113 \else
38.114 \fontsize\ssf@size\z@
38.115 \selectfont
38.116 \advance\dimen@-1.5ex
38.117 \fi
38.118 \math@fontsfalse\raise\dimen@\hbox{#1}}}
38.119 \else %<<<<<<

213
38.120 \let\sptextfont\rm
38.121 \newcommand\gl@sptext[1]{%
38.122 {.\setbox\z@\hbox{8}\dimen@\ht\z@
38.123 \edef\@tempa{\def\noexpand\@tempc{#1}%
38.124 \lowercase{\def\noexpand\@tempb{#1}}}\@tempa
38.125 \ifx\@tempb\@tempc
38.126 \advance\dimen@-0.75ex
38.127 \raise\dimen@\hbox{$\scriptstyle\sptextfont#1$}%
38.128 \else
38.129 \advance\dimen@-0.8ex
38.130 \raise\dimen@\hbox{$\scriptscriptstyle\sptextfont#1$}%
38.131 \fi}}
38.132 \fi %<<<<<<
Now, lowercase small caps. First, we test if there are actual small caps for
the current font. If not, faked small caps are used. \msc tries a slightly larger
font. Javier B. wrote: The \selectfont in \gl@lsc could seem redundant, but
it's not. I cannot see how it can't be redundant (it is the last thing executed by
\scshape), but I keep it.
38.133 \ifes@LaTeXe %<<<<<<
38.134 \addto\textgalician{%
38.135 \babel@save\lsc
38.136 \def\lsc{\protect\gl@lsc}
38.137 \babel@save\msc
38.138 \def\msc{\protect\gl@msc}}
38.139

38.140 \def\gl@@msc{\expandafter\@tempdima\f@size pt \divide\@tempdima by 200 \multiply\@temp


38.141 \edef\f@size{\strip@pt\@tempdima}\selectfont}
38.142 \def\gl@msc{\let\gl@do@msc\gl@@msc\lsc}
38.143 \let\gl@do@msc\relax
38.144

38.145 \def\gl@lsc#1{%
38.146 \leavevmode
38.147 \hbox{\gl@do@msc\scshape\selectfont
38.148 \expandafter\ifx\csname\f@encoding/\f@family/\f@series
38.149 /n/\f@size\expandafter\endcsname
38.150 \csname\curr@fontshape/\f@size\endcsname
38.151 \csname S@\f@size\endcsname
38.152 \fontsize\sf@size\z@\selectfont
38.153 \PackageInfo{galician}{Replacing undefined sc font\MessageBreak
38.154 shape by faked small caps}%
38.155 \MakeUppercase{#1}%
38.156 \else
38.157 \MakeLowercase{#1}%
38.158 \fi}\let\gl@do@msc\relax}
38.159 \fi %<<<<<<
The quoting environment. This part is not available in Plain, hence the test.
Overriding the default \everypar is a bit tricky.
38.160 \newif\ifgl@listquot
38.161

38.162 \ifes@plain\else %<<<<<<


38.163 \csname newtoks\endcsname\gl@quottoks
38.164 \csname newcount\endcsname\gl@quotdepth
38.165

214
38.166 \ifx\quoting\c@undefined\def\next{\let\next\relax\newenvironment}
38.167 \else\def\next{\PackageInfo{galician}{Redefining quoting}\let\next\relax\renewenvironm
38.168 \fi
38.169 \next{quoting}
38.170 {\leavevmode
38.171 \advance\gl@quotdepth1
38.172 \csname lquot\romannumeral\gl@quotdepth\endcsname%
38.173 \ifnum\gl@quotdepth=\@ne
38.174 \gl@listquotfalse
38.175 \let\gl@quotpar\everypar
38.176 \let\everypar\gl@quottoks
38.177 \everypar\expandafter{\the\gl@quotpar}%
38.178 \gl@quotpar{\the\everypar
38.179 \ifgl@listquot\global\gl@listquotfalse\else\gl@quotcont\fi}%
38.180 \fi
38.181 \toks@\expandafter{\gl@quotcont}%
38.182 \edef\gl@quotcont{\the\toks@
38.183 \expandafter\noexpand
38.184 \csname rquot\romannumeral\gl@quotdepth\endcsname}}
38.185 {\csname rquot\romannumeral\gl@quotdepth\endcsname}
38.186

38.187 \def\lquoti{\guillemotleft{}}
38.188 \def\rquoti{\guillemotright{}}
38.189 \def\lquotii{``}
38.190 \def\rquotii{''}
38.191 \def\lquotiii{`}
38.192 \def\rquotiii{'}
38.193

38.194 \let\gl@quotcont\@empty
If there is a margin par inside quoting, we don't add the quotes. \gl@listqout
stores the quotes to be used before item labels; otherwise they could appear after
the labels.
38.195 \addto\@marginparreset{\let\gl@quotcont\@empty}
38.196

38.197 \def\gl@listquot{%
38.198 \csname rquot\romannumeral\gl@quotdepth\endcsname
38.199 \global\gl@listquottrue}
38.200 \fi %<<<<<<
Now, the \frenchspacing, followed by \...dots and \% Instead of redening
\ldots and \cdots, we redene \ldotp and \cdotp, so that this is compatible
with amsmath. In LaTeX we also redene \textellipsis, and for plain or other
we redene \dots.
38.201 \addto\textgalician{\bbl@frenchspacing}
38.202 \addto\notextgalician{\bbl@nonfrenchspacing}
38.203

38.204 \mathchardef\gl@cdot="0201
38.205 \ifes@LaTeXe %<<<<<<
38.206 \addto\textgalician{%

38.207 \babel@save\textellipsis
38.208 \babel@save\ldotp
38.209 \babel@save\cdotp%
38.210 \def\textellipsis{\hbox{...}\spacefactor\sfcode`.{} }%
38.211 \mathchardef\ldotp="013A%

215
38.212 \mathchardef\cdotp="0201%
38.213 }
38.214 \else %<<<<<<
38.215 \addto\textgalician{%

38.216 \babel@save\dots
38.217 \babel@save\ldotp
38.218 \babel@save\cdotp
38.219 \mathchardef\ldotp="013A%
38.220 \mathchardef\cdotp="0201%
38.221 \def\dots{\ifmmode\ldots\else...\spacefactor\sfcode`.{} \fi}%
38.222 }

38.223 \fi %<<<<<<


38.224

38.225 \ifes@LaTeXe %<<<<<<


38.226 \addto\textgalician{%
38.227 \let\percentsign\%%
38.228 \babel@save\%%
38.229 \def\%{\unskip\,\percentsign{}}}
38.230 \else

38.231 \addto\textgalician{%
38.232 \let\percentsign\%%
38.233 \babel@save\%%
38.234 \def\%{\unskip\ifmmode\,\else$\m@th\,$\fi\percentsign{}}}
38.235 \fi

We follow with the math group. It's not easy to add an accent in an operator.
The diculty is that we must avoid using text (that is, \mbox) because we have no
control on font and size, and at time we should access \i, which is a text command
forbidden in math mode. \dotlessi must be converted to uppercase if necessary
in LATEX 2ε . There are two versions, depending on the format.
38.236 \addto\mathgalician{%
38.237 \babel@save\dotlessi
38.238 \def\dotlessi{\protect\gl@dotlessi}}
38.239

38.240 \let\nomathgalician\relax %% Unused, but called


38.241

38.242 \ifes@LaTeXe %<<<<<<


38.243 \def\gl@texti{\i}
38.244 \addto\@uclclist{\dotlessi\gl@texti}
38.245 \fi %<<<<<<
38.246

38.247 \ifes@LaTeXe %<<<<<<


38.248 \def\gl@dotlessi{%
38.249 \ifmmode
38.250 {\ifnum\mathgroup=\m@ne
38.251 \imath
38.252 \else
38.253 \count@\escapechar \escapechar=\m@ne
38.254 \expandafter\expandafter\expandafter
38.255 \split@name\expandafter\string\the\textfont\mathgroup\@nil
38.256 \escapechar=\count@
38.257 \@ifundefined{\f@encoding\string\i}%
38.258 {\edef\f@encoding{\string?}}{}%
38.259 \expandafter\count@\the\csname\f@encoding\string\i\endcsname

216
38.260 \advance\count@"7000
38.261 \mathchar\count@
38.262 \fi}%
38.263 \else
38.264 \i
38.265 \fi}
38.266 \else %<<<<<<
38.267 \def\gl@dotlessi{%
38.268 \ifmmode
38.269 \mathchar"7010
38.270 \else
38.271 \i
38.272 \fi}
38.273 \fi %<<<<<<
The switches for accents and spaces in math.
38.274 \def\accentedoperators{%
38.275 \def\gl@op@ac##1{\acute{##1}}%
38.276 \def\gl@op@i{\acute{\dotlessi}}}
38.277 \def\unaccentedoperators{%

38.278 \def\gl@op@ac##1{##1}%
38.279 \def\gl@op@i{i}}
38.280 \accentedoperators

38.281

38.282 \def\spacedoperators{\let\gl@op@sp\,}
38.283 \def\unspacedoperators{\let\gl@op@sp\@empty}
38.284 \unspacedoperators

The operators are stored in \gl@operators, which in turn is included in the


math group. Since \operator@font is dened in LATEX 2ε only, we need to dene
them in the plain variant.
38.285 \addto\mathgalician{%
38.286 \gl@operators}
38.287

38.288 \ifes@LaTeXe\else %<<<<<<


38.289 \let\operator@font\rm
38.290 \def\@empty{}
38.291 \fi %<<<<<<
38.292

38.293 \def\gl@operators{%
38.294 \babel@save\lim \def\lim{\mathop{\operator@font l\protect\gl@op@i m}}%
38.295 \babel@save\limsup \def\limsup{\mathop{\operator@font l\gl@op@i m\,sup}}%
38.296 \babel@save\liminf \def\liminf{\mathop{\operator@font l\gl@op@i m\,inf}}%
38.297 \babel@save\max \def\max{\mathop{\operator@font m\gl@op@ac ax}}%
38.298 \babel@save\inf \def\inf{\mathop{\operator@font \protect\gl@op@i nf}}%
38.299 \babel@save\min \def\min{\mathop{\operator@font m\protect\gl@op@i n}}%
38.300 \babel@save\bmod
38.301 \def\bmod{%
38.302 \nonscript\mskip-\medmuskip\mkern5mu%
38.303 \mathbin{\operator@font m\gl@op@ac od}\penalty900\mkern5mu%
38.304 \nonscript\mskip-\medmuskip}%
38.305 \babel@save\pmod
38.306 \def\pmod##1{%
38.307 \allowbreak\mkern18mu({\operator@font m\gl@op@ac od}\,\,##1)}%
38.308 \def\gl@a##1 {%

217
38.309 \gl@delayed
38.310 \if^##1^\then % is it empty? do nothing and continue
38.311 \gl@a
38.312 \else
38.313 \gl@delayed
38.314 \if&##1\then % is it &? do nothing and finish
38.315 \else
38.316 \begingroup
38.317 \let\,\@empty % \, is ignored when def'ing the macro name
38.318 \let\acute\@firstofone % same
38.319 \edef\gl@b{\expandafter\noexpand\csname##1\endcsname}%
38.320 \def\,{\noexpand\gl@op@sp}%
38.321 \def\acute####1{%
38.322 \if i####1%
38.323 \noexpand\gl@op@i
38.324 \else
38.325 \noexpand\gl@op@ac####1%
38.326 \fi}%
38.327 \edef\gl@a{\endgroup
38.328 \noexpand\babel@save\expandafter\noexpand\gl@b
38.329 \def\expandafter\noexpand\gl@b{%
38.330 \mathop{\noexpand\operator@font##1}\nolimits}}%
38.331 \gl@a % It restores itself
38.332 \gl@a
38.333 \fi
38.334 \fi}%
38.335 \let\gl@b\galicianoperators
38.336 \addto\gl@b{ }%
38.337 \expandafter\gl@a\gl@b sen tx cosec arc\,sen arc\,cos arc\,tx senh & %\, will be set to \gl@
38.338 %
38.339 \babel@save\sin \let\sin\sen
38.340 \babel@save\arcsin \let\arcsin\arcsen
38.341 \babel@save\sinh \let\sinh\senh
38.342 }
38.343

38.344 \def\galicianoperators{cotx txh}


Now comes the text shorthands. They are grouped in \shorthandsgalician
and this style performs some operations before the babel shortands are called.
The goals are to allow espression like $a^{x'}$ and to deactivate the shorthands
making them of category `other'. After providing a \'i shorthand, the new macros
are dened.
38.345 \DeclareTextCompositeCommand{\'}{OT1}{i}{\@tabacckludge'{\i}}
38.346

38.347 \def\gl@set@shorthand#1{%
38.348 \expandafter\edef\csname gl@savecat\string#1\endcsname
38.349 {\the\catcode`#1}%
38.350 \initiate@active@char{#1}%
38.351 \catcode`#1=\csname gl@savecat\string#1\endcsname\relax
38.352 \expandafter\let\csname gl@math\string#1\expandafter\endcsname
38.353 \csname normal@char\string#1\endcsname}
38.354

38.355 \def\gl@use@shorthand{%
38.356 \gl@delayed

218
38.357 \ifx\thepage\relax\then
38.358 \string
38.359 \else{%
38.360 \gl@delayed
38.361 \ifx\protect\@unexpandable@protect\then
38.362 \noexpand
38.363 \else
38.364 \gl@use@sh
38.365 \fi}%
38.366 \fi}
38.367

38.368 \def\gl@text@sh#1{\csname active@char\string#1\endcsname}


38.369 \def\gl@math@sh#1{\csname gl@math\string#1\endcsname}
38.370

38.371 \def\gl@use@sh{%
38.372 \gl@delayed
38.373 \if@safe@actives\then
38.374 \string
38.375 \else{%
38.376 \gl@delayed
38.377 \ifmmode\then
38.378 \gl@math@sh
38.379 \else
38.380 \gl@text@sh
38.381 \fi}%
38.382 \fi}
38.383

38.384 \gdef\gl@activate#1{%
38.385 \begingroup
38.386 \lccode`\~=`#1
38.387 \lowercase{%
38.388 \endgroup
38.389 \def~{\gl@use@shorthand~}}}
38.390

38.391 \def\galiciandeactivate#1{%
38.392 \@tfor\@tempa:=#1\do{\expandafter\gl@spdeactivate\@tempa}}
38.393

38.394 \def\gl@spdeactivate#1{%
38.395 \if.#1%
38.396 \mathcode`\.=\gl@period@code
38.397 \else
38.398 \begingroup
38.399 \lccode`\~=`#1
38.400 \lowercase{%
38.401 \endgroup
38.402 \expandafter\let\expandafter~%
38.403 \csname normal@char\string#1\endcsname}%
38.404 \catcode`#1\csname gl@savecat\string#1\endcsname\relax
38.405 \fi}
38.406

38.407 \def\gl@reviveshorthands{%
38.408 \gl@restore{"}\gl@restore{~}%
38.409 \gl@restore{<}\gl@restore{>}%
38.410 \gl@quoting}

219
38.411

38.412 \def\gl@restore#1{%
38.413 \catcode`#1=\active
38.414 \begingroup
38.415 \lccode`\~=`#1
38.416 \lowercase{%
38.417 \endgroup
38.418 \bbl@deactivate{~}}}
But galician allows two category codes for ', so both should be taken into
account in \bbl@pr@m@s.
38.419 \begingroup
38.420 \catcode`\'=12
38.421 \lccode`~=`' \lccode`'=`'

38.422 \lowercase{%

38.423 \gdef\bbl@pr@m@s{%

38.424 \gl@delayed
38.425 \ifx~\@let@token\then
38.426 \pr@@@s
38.427 \else
38.428 {\gl@delayed
38.429 \ifx'\@let@token\then
38.430 \pr@@@s
38.431 \else
38.432 {\gl@delayed
38.433 \ifx^\@let@token\then
38.434 \pr@@@t
38.435 \else
38.436 \egroup
38.437 \fi}%
38.438 \fi}%
38.439 \fi}}
38.440 \endgroup

38.441 \expandafter\ifx\csname @tabacckludge\endcsname\relax


38.442 \let\gl@tak\a
38.443 \else

38.444 \let\gl@tak\@tabacckludge
38.445 \fi

38.446

38.447 \ifes@LaTeXe %<<<<<<


38.448 \def\@tabacckludge#1{\expandafter\gl@tak\string#1}
38.449 \let\a\@tabacckludge
38.450 \else\ifes@plain %<<<<<<

38.451 \def\@tabacckludge#1{\csname\string#1\endcsname}
38.452 \else %<<<<<<
38.453 \def\@tabacckludge#1{\csname a\string#1\endcsname}
38.454 \fi\fi %<<<<<<
38.455

38.456 \expandafter\ifx\csname add@accent\endcsname\relax


38.457 \def\add@accent#1#2{\accent#1 #2}
38.458 \fi

Instead of redening \', we redene the internal macro for the OT1 encoding.
38.459 \ifes@LaTeXe %<<<<<<
38.460 \def\gl@accent#1#2#3{%

220
38.461 \expandafter\@text@composite
38.462 \csname OT1\string#1\endcsname#3\@empty\@text@composite
38.463 {\bbl@allowhyphens\add@accent{#2}{#3}\bbl@allowhyphens
38.464 \setbox\@tempboxa\hbox{#3%
38.465 \global\mathchardef\accent@spacefactor\spacefactor}%
38.466 \spacefactor\accent@spacefactor}}
38.467 \else %<<<<<<
38.468 \def\gl@accent#1#2#3{%
38.469 \bbl@allowhyphens\add@accent{#2}{#3}\bbl@allowhyphens
38.470 \spacefactor\sfcode`#3 }
38.471 \fi %<<<<<<
The shorthands are activated in the aux le. Now, we begin the shorthands
group.
38.472 \addto\shorthandsgalician{\languageshorthands{galician}}
38.473 \let\noshorthandsgalician\relax
First, decimal comma.
38.474 \def\galiciandecimal#1{\def\gl@decimal{{#1}}}
38.475 \def\decimalcomma{\galiciandecimal{,}}

38.476 \def\decimalpoint{\galiciandecimal{.}}

38.477 \decimalcomma

38.478

38.479 \gl@set@shorthand{.}
38.480

38.481 \@namedef{gl@math\string.}{%
38.482 \@ifnextchar\egroup
38.483 {\mathchar\gl@period@code\relax}%
38.484 {\gl@text@sh.}}
38.485

38.486 \declare@shorthand{system}{.}{\mathchar\gl@period@code\relax}
38.487 \addto\shorthandsgalician{%
38.488 \mathchardef\gl@period@code\the\mathcode`\.%
38.489 \babel@savevariable{\mathcode`\.}%
38.490 \mathcode`\.="8000 %
38.491 \gl@activate{.}}
38.492

38.493 \AtBeginDocument{%
38.494 \catcode`\.=12
38.495 \if@filesw
38.496 \immediate\write\@mainaux{%
38.497 \string\catcode`\string\.=12}%
38.498 \fi}
38.499

38.500 \declare@shorthand{galician}{.1}{\gl@decimal1}
38.501 \declare@shorthand{galician}{.2}{\gl@decimal2}
38.502 \declare@shorthand{galician}{.3}{\gl@decimal3}

38.503 \declare@shorthand{galician}{.4}{\gl@decimal4}

38.504 \declare@shorthand{galician}{.5}{\gl@decimal5}

38.505 \declare@shorthand{galician}{.6}{\gl@decimal6}

38.506 \declare@shorthand{galician}{.7}{\gl@decimal7}

38.507 \declare@shorthand{galician}{.8}{\gl@decimal8}

38.508 \declare@shorthand{galician}{.9}{\gl@decimal9}

38.509 \declare@shorthand{galician}{.0}{\gl@decimal0}

Now accents and tools

221
38.510 \gl@set@shorthand{"}
38.511 \def\gl@umlaut#1{%
38.512 \bbl@allowhyphens\add@accent{127}#1\bbl@allowhyphens
38.513 \spacefactor\sfcode`#1 }
We override the default " of babel, intended for german.
38.514 \ifes@LaTeXe %<<<<<<
38.515 \addto\shorthandsgalician{%
38.516 \gl@activate{"}%
38.517 \gl@activate{~}%
38.518 \babel@save\bbl@umlauta
38.519 \let\bbl@umlauta\gl@umlaut
38.520 \expandafter\babel@save\csname OT1\string\~\endcsname
38.521 \expandafter\def\csname OT1\string\~\endcsname{\gl@accent\~{126}}%
38.522 \expandafter\babel@save\csname OT1\string\'\endcsname
38.523 \expandafter\def\csname OT1\string\'\endcsname{\gl@accent\'{19}}}
38.524 \else %<<<<<<
38.525 \addto\shorthandsgalician{%
38.526 \gl@activate{"}%
38.527 \gl@activate{~}%
38.528 \babel@save\bbl@umlauta
38.529 \let\bbl@umlauta\gl@umlaut
38.530 \babel@save\~%
38.531 \def\~{\gl@accent\~{126}}%
38.532 \babel@save\'%
38.533 \def\'#1{\if#1i\gl@accent\'{19}\i\else\gl@accent\'{19}{#1}\fi}}
38.534 \fi %<<<<<<
38.535 \declare@shorthand{galician}{"a}{\protect\gl@sptext{a}}
38.536 \declare@shorthand{galician}{"A}{\protect\gl@sptext{A}}
38.537 \declare@shorthand{galician}{"o}{\protect\gl@sptext{o}}

38.538 \declare@shorthand{galician}{"O}{\protect\gl@sptext{O}}

38.539

38.540 \declare@shorthand{galician}{"u}{\"u}
38.541 \declare@shorthand{galician}{"U}{\"U}
38.542 \declare@shorthand{galician}{"i}{\"i}

38.543 \declare@shorthand{galician}{"I}{\"I}

38.544

38.545 \declare@shorthand{galician}{"<}{\begin{quoting}}
38.546 \declare@shorthand{galician}{">}{\end{quoting}}
38.547 \declare@shorthand{galician}{"-}{\bbl@allowhyphens\-\bbl@allowhyphens}

38.548 \declare@shorthand{galician}{"=}%

38.549 {\bbl@allowhyphens\char\hyphenchar\font\hskip\z@skip}
38.550 \declare@shorthand{galician}{"~}

38.551 {\bbl@allowhyphens\discretionary{\char\hyphenchar\font}%
38.552 {\char\hyphenchar\font}{\char\hyphenchar\font}\bbl@allowhyphens}
38.553 \declare@shorthand{galician}{"r}

38.554 {\bbl@allowhyphens\discretionary{\char\hyphenchar\font}%
38.555 {}{r}\bbl@allowhyphens}
38.556 \declare@shorthand{galician}{"R}

38.557 {\bbl@allowhyphens\discretionary{\char\hyphenchar\font}%
38.558 {}{R}\bbl@allowhyphens}
38.559 \declare@shorthand{galician}{""}{\hskip\z@skip}

38.560 \declare@shorthand{galician}{"/}

38.561 {\setbox\z@\hbox{/}%

222
38.562 \dimen@\ht\z@
38.563 \advance\dimen@-1ex
38.564 \advance\dimen@\dp\z@
38.565 \dimen@.31\dimen@
38.566 \advance\dimen@-\dp\z@
38.567 \ifdim\dimen@>0pt
38.568 \kern.01em\lower\dimen@\box\z@\kern.03em
38.569 \else
38.570 \box\z@
38.571 \fi}
38.572 \declare@shorthand{galician}{"?}

38.573 {\setbox\z@\hbox{?`}%
38.574 \leavevmode\raise\dp\z@\box\z@}
38.575 \declare@shorthand{galician}{"!}

38.576 {\setbox\z@\hbox{!`}%
38.577 \leavevmode\raise\dp\z@\box\z@}
38.578

38.579 \gl@set@shorthand{~}
38.580 \declare@shorthand{galician}{~n}{\~n}
38.581 \declare@shorthand{galician}{~N}{\~N}

38.582 \declare@shorthand{galician}{~-}{%

38.583 \leavevmode
38.584 \bgroup
38.585 \let\@sptoken\gl@dashes % This assignation changes the
38.586 \@ifnextchar-% \@ifnextchar behaviour
38.587 {\gl@dashes}%
38.588 {\hbox{\char\hyphenchar\font}\egroup}}
38.589 \def\gl@dashes-{%

38.590 \@ifnextchar-%
38.591 {\bbl@allowhyphens\hbox{---}\bbl@allowhyphens\egroup\@gobble}%
38.592 {\bbl@allowhyphens\hbox{--}\bbl@allowhyphens\egroup}}
38.593

38.594 \def\deactivatetilden{%
38.595 \expandafter\let\csname galician@sh@\string~@n@\endcsname\relax
38.596 \expandafter\let\csname galician@sh@\string~@N@\endcsname\relax}
The shorthands for quoting.
38.597 \expandafter\ifx\csname XML@catcodes\endcsname\relax
38.598 \addto\gl@select{%
38.599 \catcode`\<\active\catcode`\>=\active
38.600 \gl@quoting}
38.601

38.602 \gl@set@shorthand{<}
38.603 \gl@set@shorthand{>}
38.604

38.605 \declare@shorthand{system}{<}{\csname normal@char\string<\endcsname}


38.606 \declare@shorthand{system}{>}{\csname normal@char\string>\endcsname}
38.607

38.608 \addto\shorthandsgalician{%
38.609 \gl@activate{<}%
38.610 \gl@activate{>}}
38.611 \ifes@LaTeXe %<<<<<<
38.612 \AtBeginDocument{%
38.613 \gl@quoting

223
38.614 \if@filesw
38.615 \immediate\write\@mainaux{\string\gl@quoting}%
38.616 \fi}%
38.617 \fi %<<<<<<
38.618

38.619 \def\activatequoting{%
38.620 \catcode`>=\active \catcode`<=\active
38.621 \let\gl@quoting\activatequoting}
38.622 \def\deactivatequoting{%
38.623 \catcode`>=12 \catcode`<=12
38.624 \let\gl@quoting\deactivatequoting}
38.625

38.626 \declare@shorthand{galician}{<<}{\guillemotleft{}}
38.627 \declare@shorthand{galician}{>>}{\guillemotright{}}
38.628 \fi

38.629

38.630 \let\gl@quoting\relax
38.631 \let\deactivatequoting\relax
38.632 \let\activatequoting\relax

The acute accents are stored in a macro. If activeacute was set as an option
it's executed. If not is not deleted for a possible later use in the cfg le. In non
LATEX 2ε formats is always executed.
38.633 \def\gl@activeacute{%
38.634 \gl@set@shorthand{'}%
38.635 \addto\shorthandsgalician{\gl@activate{'}}%
38.636 \addto\gl@reviveshorthands{\gl@restore{'}}%
38.637 \addto\gl@select{\catcode`'=\active}%
38.638 \declare@shorthand{galician}{'a}{\@tabacckludge'a}%
38.639 \declare@shorthand{galician}{'A}{\@tabacckludge'A}%
38.640 \declare@shorthand{galician}{'e}{\@tabacckludge'e}%
38.641 \declare@shorthand{galician}{'E}{\@tabacckludge'E}%
38.642 \declare@shorthand{galician}{'i}{\@tabacckludge'i}%
38.643 \declare@shorthand{galician}{'I}{\@tabacckludge'I}%
38.644 \declare@shorthand{galician}{'o}{\@tabacckludge'o}%
38.645 \declare@shorthand{galician}{'O}{\@tabacckludge'O}%
38.646 \declare@shorthand{galician}{'u}{\@tabacckludge'u}%
38.647 \declare@shorthand{galician}{'U}{\@tabacckludge'U}%
38.648 \declare@shorthand{galician}{'n}{\~n}%
38.649 \declare@shorthand{galician}{'N}{\~N}%
38.650 \declare@shorthand{galician}{''}{\textquotedblright}%
38.651 \let\gl@activeacute\relax}
38.652

38.653 \ifes@LaTeXe %<<<<<<


38.654 \@ifpackagewith{babel}{activeacute}{\gl@activeacute}{}
38.655 \else %<<<<<<
38.656 \gl@activeacute
38.657 \fi %<<<<<<%
And the customization. By default these macros only store the values and do
nothing.
38.658 \def\gl@enumerate#1#2#3#4{%
38.659 \def\gl@enum{{#1}{#2}{#3}{#4}}}
38.660

38.661 \def\gl@itemize#1#2#3#4{%

224
38.662 \def\gl@item{{#1}{#2}{#3}{#4}}}
The part formerly in the .lld le comes here. It performs layout adaptation
of LATEX to orthodox Galician rules.
38.663 \ifes@LaTeXe %<<<<<<
38.664

38.665 \gl@enumerate{1.}{a)}{1)}{a$'$}
38.666 \def\galiciandashitems{\gl@itemize{---}{---}{---}{---}}
38.667 \def\galiciansymbitems{%

38.668 \gl@itemize
38.669 {\leavevmode\hbox to 1.2ex
38.670 {\hss\vrule height .9ex width .7ex depth -.2ex\hss}}%
38.671 {\textbullet}%
38.672 {$\m@th\circ$}%
38.673 {$\m@th\diamond$}}
38.674 \def\galiciansignitems{%

38.675 \gl@itemize
38.676 {\textbullet}%
38.677 {$\m@th\circ$}%
38.678 {$\m@th\diamond$}%
38.679 {$\m@th\triangleright$}}
38.680 \galiciansymbitems

38.681

38.682 \def\gl@enumdef#1#2#3\@@{%
38.683 \if#21%
38.684 \@namedef{theenum#1}{\arabic{enum#1}}%
38.685 \else\if#2a%
38.686 \@namedef{theenum#1}{\emph{\alph{enum#1}}}%
38.687 \else\if#2A%
38.688 \@namedef{theenum#1}{\Alph{enum#1}}%
38.689 \else\if#2i%
38.690 \@namedef{theenum#1}{\roman{enum#1}}%
38.691 \else\if#2I%
38.692 \@namedef{theenum#1}{\Roman{enum#1}}%
38.693 \else\if#2o%
38.694 \@namedef{theenum#1}{\arabic{enum#1}\protect\gl@sptext{o}}%
38.695 \fi\fi\fi\fi\fi\fi
38.696 \toks@\expandafter{\csname theenum#1\endcsname}
38.697 \expandafter\edef\csname labelenum#1\endcsname
38.698 {\noexpand\gl@listquot\the\toks@#3}}
38.699

38.700 \addto\layoutgalician{%
38.701 \def\gl@enumerate##1##2##3##4{%
38.702 \gl@enumdef{i}##1\@empty\@empty\@@
38.703 \gl@enumdef{ii}##2\@empty\@empty\@@
38.704 \gl@enumdef{iii}##3\@empty\@empty\@@
38.705 \gl@enumdef{iv}##4\@empty\@empty\@@}%
38.706 \def\gl@itemize##1##2##3##4{%
38.707 \def\labelitemi{\gl@listquot##1}%
38.708 \def\labelitemii{\gl@listquot##2}%
38.709 \def\labelitemiii{\gl@listquot##3}%
38.710 \def\labelitemiv{\gl@listquot##4}}%
38.711 \def\p@enumii{\theenumi}%
38.712 \def\p@enumiii{\theenumi\theenumii}%
38.713 \def\p@enumiv{\p@enumiii\theenumiii}%

225
38.714 \expandafter\gl@enumerate\gl@enum
38.715 \expandafter\gl@itemize\gl@item
38.716 \DeclareTextCommand{\guillemotleft}{OT1}{%
38.717 \ifmmode\ll
38.718 \else
38.719 \save@sf@q{\penalty\@M
38.720 \leavevmode\hbox{\usefont{U}{lasy}{m}{n}%
38.721 \char40 \kern-0.19em\char40 }}%
38.722 \fi}%
38.723 \DeclareTextCommand{\guillemotright}{OT1}{%
38.724 \ifmmode\gg
38.725 \else
38.726 \save@sf@q{\penalty\@M
38.727 \leavevmode\hbox{\usefont{U}{lasy}{m}{n}%
38.728 \char41 \kern-0.19em\char41 }}%
38.729 \fi}%
38.730 \def\@fnsymbol##1%
38.731 {\ifcase##1\or*\or**\or***\or****\or
38.732 *****\or******\else\@ctrerr\fi}%
38.733 \def\@alph##1%
38.734 {\ifcase##1\or a\or b\or c\or d\or e\or f\or g\or h\or i\or
38.735 l\or m\or n\or \~n\or o\or p\or q\or r\or s\or t\or u\or v\or
38.736 x\or z\else\@ctrerr\fi}%
38.737 \def\@Alph##1%
38.738 {\ifcase##1\or A\or B\or C\or D\or E\or F\or G\or H\or I\or
38.739 L\or M\or N\or \~N\or O\or P\or Q\or R\or S\or T\or U\or V\or
38.740 X\or Z\else\@ctrerr\fi}%
38.741 \let\@afterindentfalse\@afterindenttrue
38.742 \@afterindenttrue
38.743 \def\@seccntformat##1{\csname the##1\endcsname.\quad}%
38.744 \def\numberline##1{\hb@xt@\@tempdima{##1\if&##1&\else.\fi\hfil}}%
38.745 \def\@roman##1{\protect\gl@roman{\number##1}}%
38.746 \def\gl@roman##1{\protect\gl@msc{\romannumeral##1}}%
38.747 \def\glromanindex##1##2{##1{\protect\gl@msc{##2}}}}
We need to execute the following code when babel has been run, in order to
see if galician is the main language.
38.748 \AtEndOfPackage{%
38.749 \let\gl@activeacute\@undefined
38.750 \def\bbl@tempa{galician}%
38.751 \ifx\bbl@main@language\bbl@tempa
38.752 \AtBeginDocument{\layoutgalician}%
38.753 \addto\gl@select{%
38.754 \@ifstar{\let\layoutgalician\relax}%
38.755 {\layoutgalician\let\layoutgalician\relax}}%
38.756 \fi
38.757 \selectgalician}
38.758

38.759 \fi %<<<<<<


After restoring the catcode of ~ and setting the minimal values for hyphenation,
the .ldf is nished.
38.760 \gl@savedcatcodes
38.761

38.762 \providehyphenmins{\CurrentOption}{\tw@\tw@}

226
38.763

38.764 \ifes@LaTeXe %<<<<<<


38.765 \ldf@finish{galician}
38.766 \else %<<<<<<
38.767 \gl@select
38.768 \ldf@finish{galician}
38.769 \csname activatequoting\endcsname
38.770 \fi %<<<<<<
38.771

38.772 h/codei
That's all in the main le. Now the le with custom-bib macros.
38.773 h∗bblbsti
38.774 \def\bbland{e}
38.775 \def\bbleditors{directores} \def\bbleds{dirs.\@}
38.776 \def\bbleditor{director} \def\bbled{dir.\@}
38.777 \def\bbledby{dirixido por}

38.778 \def\bbledition{edici\'on} \def\bbledn{ed.\@}


38.779 \def\bbletal{e outros}

38.780 \def\bblvolume{volumen} \def\bblvol{vol.\@}


38.781 \def\bblof{de}

38.782 \def\bblnumber{n\'umero} \def\bblno{n\sptext{o}}


38.783 \def\bblin{en}

38.784 \def\bblpages{p\'axinas} \def\bblpp{p\'axs.\@}


38.785 \def\bblpage{p\'axina} \def\bblp{p\'ax.\@}
38.786 \def\bblchapter{cap\'itulo} \def\bblchap{cap.\@}
38.787 \def\bbltechreport{informe t\'ecnico}

38.788 \def\bbltechrep{inf.\@ t\'ec.\@}

38.789 \def\bblmthesis{proxecto de fin de carreira}

38.790 \def\bblphdthesis{tesis doutoral}

38.791 \def\bblfirst {primeira} \def\bblfirsto {1\sptext{a}}


38.792 \def\bblsecond{segunda} \def\bblsecondo{2\sptext{a}}
38.793 \def\bblthird {terceira} \def\bblthirdo {3\sptext{a}}
38.794 \def\bblfourth{cuarta} \def\bblfourtho{4\sptext{a}}
38.795 \def\bblfifth {quinta} \def\bblfiftho {5\sptext{a}}
38.796 \def\bblth{\sptext{a}}

38.797 \let\bblst\bblth \let\bblnd\bblth \let\bblrd\bblth


38.798 \def\bbljan{xaneiro} \def\bblfeb{febreiro} \def\bblmar{marzo}
38.799 \def\bblapr{abril} \def\bblmay{maio} \def\bbljun{xu\~no}
38.800 \def\bbljul{xullo} \def\bblaug{agosto} \def\bblsep{setembro}
38.801 \def\bbloct{outubro}\def\bblnov{novembro}\def\bbldec{decembro}

38.802 h/bblbsti

The galician option writes a macro in the page eld of MakeIndex in entries
with medium caps number, and they are rejected. This program is a preprocessor
which moves this macro to the entry eld.
38.803 h∗indexgli
38.804 \makeatletter
38.805

38.806 \newcount\gl@converted
38.807 \newcount\gl@processed
38.808

38.809 \def\gl@encap{`\|}
38.810 \def\gl@openrange{`\(}
38.811 \def\gl@closerange{`\)}

227
38.812

38.813 \def\gl@split@file#1.#2\@@{#1}
38.814 \def\gl@split@ext#1.#2\@@{#2}
38.815

38.816 \typein[\answer]{^^JArchivo que convertir^^J%


38.817 (extension por omision .idx):}
38.818

38.819 \@expandtwoargs\in@{.}{\answer}
38.820 \ifin@
38.821 \edef\gl@input@file{\expandafter\gl@split@file\answer\@@}
38.822 \edef\gl@input@ext{\expandafter\gl@split@ext\answer\@@}
38.823 \else

38.824 \edef\gl@input@file{\answer}
38.825 \def\gl@input@ext{idx}
38.826 \fi

38.827

38.828 \typein[\answer]{^^JArquivo de destino^^J%


38.829 (arquivo por omision: \gl@input@file.eix,^^J%
38.830 extension por omision .eix):}
38.831 \ifx\answer\@empty

38.832 \edef\gl@output{\gl@input@file.eix}
38.833 \else

38.834 \@expandtwoargs\in@{.}{\answer}
38.835 \ifin@
38.836 \edef\gl@output{\answer}
38.837 \else
38.838 \edef\gl@output{\answer.eix}
38.839 \fi
38.840 \fi

38.841

38.842 \typein[\answer]{%
38.843 ^^J?Usouse algun esquema especial de controles^^J%
38.844 de MakeIndex para encap, open_range ou close_range?^^J%
38.845 [s/n] (n por omision)}
38.846

38.847 \if s\answer


38.848 \typein[\answer]{^^JCaracter para 'encap'^^J%
38.849 (\string| por omision)}
38.850 \ifx\answer\@empty\else
38.851 \edef\gl@encap{%
38.852 `\expandafter\noexpand\csname\expandafter\string\answer\endcsname}
38.853 \fi
38.854 \typein[\answer]{^^JCaracter para 'open_range'^^J%
38.855 (\string( por omision)}
38.856 \ifx\answer\@empty\else
38.857 \edef\gl@openrange{%
38.858 `\expandafter\noexpand\csname\expandafter\string\answer\endcsname}
38.859 \fi
38.860 \typein[\answer]{^^JCaracter para 'close_range'^^J%
38.861 (\string) por omision)}
38.862 \ifx\answer\@empty\else
38.863 \edef\gl@closerange{%
38.864 `\expandafter\noexpand\csname\expandafter\string\answer\endcsname}
38.865 \fi

228
38.866 \fi
38.867

38.868 \newwrite\gl@indexfile
38.869 \immediate\openout\gl@indexfile=\gl@output
38.870

38.871 \newif\ifgl@encapsulated
38.872

38.873 \def\gl@roman#1{\romannumeral#1 }
38.874 \edef\gl@slash{\expandafter\@gobble\string\\}
38.875

38.876 \def\indexentry{%
38.877 \begingroup
38.878 \@sanitize
38.879 \gl@indexentry}
38.880

38.881 \begingroup
38.882

38.883 \catcode`\|=12 \lccode`\|=\gl@encap\relax


38.884 \catcode`\(=12 \lccode`\(=\gl@openrange\relax
38.885 \catcode`\)=12 \lccode`\)=\gl@closerange\relax

38.886

38.887 \lowercase{
38.888 \gdef\gl@indexentry#1{%
38.889 \endgroup
38.890 \advance\gl@processed\@ne
38.891 \gl@encapsulatedfalse
38.892 \gl@bar@idx#1|\@@
38.893 \gl@idxentry}%
38.894 }

38.895

38.896 \lowercase{
38.897 \gdef\gl@idxentry#1{%
38.898 \in@{\gl@roman}{#1}%
38.899 \ifin@
38.900 \advance\gl@converted\@ne
38.901 \immediate\write\gl@indexfile{%
38.902 \string\indexentry{\gl@b|\ifgl@encapsulated\gl@p\fi glromanindex%
38.903 {\ifx\gl@a\@empty\else\gl@slash\gl@a\fi}}{#1}}%
38.904 \else
38.905 \immediate\write\gl@indexfile{%
38.906 \string\indexentry{\gl@b\ifgl@encapsulated|\gl@p\gl@a\fi}{#1}}%
38.907 \fi}
38.908 }

38.909

38.910 \lowercase{
38.911 \gdef\gl@bar@idx#1|#2\@@{%
38.912 \def\gl@b{#1}\def\gl@a{#2}%
38.913 \ifx\gl@a\@empty\else\gl@encapsulatedtrue\gl@bar@eat#2\fi}
38.914 }

38.915

38.916 \lowercase{
38.917 \gdef\gl@bar@eat#1#2|{\def\gl@p{#1}\def\gl@a{#2}%
38.918 \edef\gl@t{(}\ifx\gl@t\gl@p
38.919 \else\edef\gl@t{)}\ifx\gl@t\gl@p

229
38.920 \else
38.921 \edef\gl@a{\gl@p\gl@a}\let\gl@p\@empty%
38.922 \fi\fi}
38.923 }
38.924

38.925 \endgroup
38.926

38.927 \input \gl@input@file.\gl@input@ext


38.928

38.929 \immediate\closeout\gl@indexfile
38.930

38.931 \typeout{*****************}
38.932 \typeout{procesouse: \gl@input@file.\gl@input@ext }
38.933 \typeout{Li'nas lidas: \the\gl@processed}

38.934 \typeout{Li'nas convertidas: \the\gl@converted}

38.935 \typeout{Resultado en: \gl@output}

38.936 \ifnum\gl@converted>\z@

38.937 \typeout{Xenere o 'indice a partir deste arquivo}


38.938 \else

38.939 \typeout{Non se realizou ning'un tipo de conversi'on}


38.940 \typeout{P'odese xenerar o arquivo directamente^^J%
38.941 de \gl@input@file.\gl@input@ext}
38.942 \fi

38.943 \typeout{*****************}

38.944 \@@end

38.945 h/indexgli

230
39 The Basque language
The le basque.dtx45 denes all the language denition macro's for the Basque
language.
For this language the characters ~ and " are made active. In table 15 an
overview is given of their purpose. These active accent characters behave according

"| disable ligature at this position.


"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
\- like the old \-, but allowing hyphenation in the rest
of the word.
"< for French left double quotes (similar to <<).
"> for French right double quotes (similar to >>).
~n a n with tilde. Works for uppercase too.

Table 15: The extra denitions made by basque.ldf

to their original denitions if not followed by one of the characters indicated in


that table.
This option includes support for working with extended, 8-bit fonts, if available.
Support is based on providing an appropriate denition for the accent macros on
entry to the Basque language. This is automatically done by LATEX 2ε or NFSS2.
If T1 encoding is chosen, and provided that adequate hyphenation patterns46 are
available. The easiest way to use the new encoding with LATEX 2ε is to load the
package t1enc with \usepackage. This must be done before loading babel.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
39.1 h∗codei
39.2 \LdfInit{basque}\captionsbasque
When this le is read as an option, i.e. by the \usepackage command, basque
could be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@basque to see whether we have to do something here.
39.3 \ifx\l@basque\@undefined
39.4 \@nopatterns{Basque}
39.5 \adddialect\l@basque0
39.6 \fi

The next step consists of dening commands to switch to (and from) the Basque
language.

\captionsbasque The macro \captionsbasque denes all strings used in the four standard docu-
mentclasses provided with LATEX.
39.7 \addto\captionsbasque{%
39.8 \def\prefacename{Hitzaurrea}%
39.9 \def\refname{Erreferentziak}%
45 The le described in this section has version number v1.0f and was last revised on 2005/03/29.
The original author is Juan M. Aguirregabiria, (wtpagagj@lg.ehu.es) and is based on the Spanish
le by Julio Sánchez, (jsanchez@gmv.es).
46 One tp.lc.ehu.es
source for such patterns is the archive at that can be accessed by anony-
mous FTP or in http://tp.lc.ehu.es/jma/basque.html

231
39.10 \def\abstractname{Laburpena}%
39.11 \def\bibname{Bibliografia}%
39.12 \def\chaptername{Kapitulua}%
39.13 \def\appendixname{Eranskina}%
39.14 \def\contentsname{Gaien Aurkibidea}%
39.15 \def\listfigurename{Irudien Zerrenda}%
39.16 \def\listtablename{Taulen Zerrenda}%
39.17 \def\indexname{Kontzeptuen Aurkibidea}%
39.18 \def\figurename{Irudia}%
39.19 \def\tablename{Taula}%
39.20 \def\partname{Atala}%
39.21 \def\enclname{Erantsia}%
39.22 \def\ccname{Kopia}%
39.23 \def\headtoname{Nori}%
39.24 \def\pagename{Orria}%
39.25 \def\seename{Ikusi}%
39.26 \def\alsoname{Ikusi, halaber}%
39.27 \def\proofname{Frogapena}%
39.28 \def\glossaryname{Glosarioa}%
39.29 }%
\datebasque The macro \datebasque redenes the command \today to produce Basque
39.30 \def\datebasque{%
39.31 \def\today{\number\year.eko\space\ifcase\month\or
39.32 urtarrilaren\or otsailaren\or martxoaren\or apirilaren\or
39.33 maiatzaren\or ekainaren\or uztailaren\or abuztuaren\or
39.34 irailaren\or urriaren\or azaroaren\or
39.35 abenduaren\fi~\number\day}}
\extrasbasque The macro \extrasbasque will perform all the extra denitions needed for the
\noextrasbasque Basque language. The macro \noextrasbasque is used to cancel the actions of
\extrasbasque. For Basque, some characters are made active or are redened. In
particular, the " character and the ~ character receive new meanings. Therefore
these characters have to be treated as `special' characters.
39.36 \addto\extrasbasque{\languageshorthands{basque}}
39.37 \initiate@active@char{"}
39.38 \initiate@active@char{~}

39.39 \addto\extrasbasque{%

39.40 \bbl@activate{"}%
39.41 \bbl@activate{~}}
Don't forget to turn the shorthands o again.
39.42 \addto\noextrasbasque{
39.43 \bbl@deactivate{"}\bbl@deactivate{~}}
Apart from the active characters some other macros get a new denition.
Therefore we store the current one to be able to restore them later.
39.44 \addto\extrasbasque{%
39.45 \babel@save\"%
39.46 \babel@save\~%
39.47 \def\"{\protect\@umlaut}%
39.48 \def\~{\protect\@tilde}}
\basquehyphenmins Basque hyphenation uses \lefthyphenmin and \righthyphenmin both set to 2.
39.49 \providehyphenmins{\CurrentOption}{\tw@\tw@}

232
\dieresia The original denition of \" is stored as \dieresia, because the we do not know
\texttilde what is its denition, since it depends on the encoding we are using or on special
macros that the user might have loaded. The expansion of the macro might use
the TEX \accent primitive using some particular accent that the font provides
or might check if a combined accent exists in the font. These two cases happen
with respectively OT1 and T1 encodings. For this reason we save the denition of
\" and use that in the denition of other macros. We do likewise for \' and \~.
The present coding of this option le is incorrect in that it can break when the
encoding changes. We do not use \tilde as the macro name because it is already
dened as \mathaccent.
39.50 \let\dieresia\"
39.51 \let\texttilde\~

\@umlaut We check the encoding and if not using T1, we make the accents expand but
\@tilde enabling hyphenation beyond the accent. If this is the case, not all break positions
will be found in words that contain accents, but this is a limitation in TEX. An
unsolved problem here is that the encoding can change at any time. The denitions
below are made in such a way that a change between two 256-char encodings
are supported, but changes between a 128-char and a 256-char encoding are not
properly supported. We check if T1 is in use. If not, we will give a warning and
proceed redening the accent macros so that TEX at least nds the breaks that
are not too close to the accent. The warning will only be printed to the log le.
39.52 \ifx\DeclareFontShape\@undefined
39.53 \wlog{Warning: You are using an old LaTeX}
39.54 \wlog{Some word breaks will not be found.}
39.55 \def\@umlaut#1{\allowhyphens\dieresia{#1}\allowhyphens}
39.56 \def\@tilde#1{\allowhyphens\texttilde{#1}\allowhyphens}
39.57 \else

39.58 \edef\bbl@next{T1}
39.59 \ifx\f@encoding\bbl@next
39.60 \let\@umlaut\dieresia
39.61 \let\@tilde\texttilde
39.62 \else
39.63 \wlog{Warning: You are using encoding \f@encoding\space
39.64 instead of T1.}
39.65 \wlog{Some word breaks will not be found.}
39.66 \def\@umlaut#1{\allowhyphens\dieresia{#1}\allowhyphens}
39.67 \def\@tilde#1{\allowhyphens\texttilde{#1}\allowhyphens}
39.68 \fi
39.69 \fi

Now we can dene our shorthands: the french quotes,


39.70 \declare@shorthand{basque}{"<}{%
39.71 \textormath{\guillemotleft}{\mbox{\guillemotleft}}}
39.72 \declare@shorthand{basque}{">}{%

39.73 \textormath{\guillemotright}{\mbox{\guillemotright}}}
ordinals47 ,
39.74 \declare@shorthand{basque}{''}{%
39.75 \textormath{\textquotedblright}{\sp\bgroup\prim@s'}}
47 The code for the ordinals was taken from the answer provided by Raymond Chen
(raymond@math.berkeley.edu) to a question by Joseph Gil (yogi@cs.ubc.ca) in comp.text.tex.

233
tildes,
39.76 \declare@shorthand{basque}{~n}{\textormath{\~n}{\@tilde n}}
39.77 \declare@shorthand{basque}{~N}{\textormath{\~N}{\@tilde N}}
and some additional commands.
The shorthand "- should be used in places where a word contains an explictit
hyphenation character. According to the Academy of the Basque language, when
a word break occurs at an explicit hyphen it must appear both at the end of the
rst line and at the beginning of the second line.
39.78 \declare@shorthand{basque}{"-}{%
39.79 \nobreak\discretionary{-}{-}{-}\bbl@allowhyphens}
39.80 \declare@shorthand{basque}{"|}{%

39.81 \textormath{\nobreak\discretionary{-}{}{\kern.03em}%
39.82 \allowhyphens}{}}
The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
39.83 \ldf@finish{basque}
39.84 h/codei

234
40 The Romanian language
The le romanian.dtx48 denes all the language-specic macros for the Romanian
language.
For this language currently no special denitions are needed or available.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
40.1 h∗codei
40.2 \LdfInit{romanian}\captionsromanian
When this le is read as an option, i.e. by the \usepackage command,
romanian will be an `unknown' language in which case we have to make it known.
So we check for the existence of \l@romanian to see whether we have to do some-
thing here.
40.3 \ifx\l@romanian\@undefined
40.4 \@nopatterns{Romanian}
40.5 \adddialect\l@romanian0\fi
The next step consists of dening commands to switch to (and from) the Ro-
manian language.

\captionsromanian The macro \captionsromanian denes all strings used in the four standard doc-
umentclasses provided with LATEX.
ls
40.6

\addto\captionsromanian{%
40.7

40.8 \def\prefacename{Prefa\c{t}\u{a}}%
40.9 \def\refname{Bibliografie}%
40.10 \def\abstractname{Rezumat}%
40.11 \def\bibname{Bibliografie}%
40.12 \def\chaptername{Capitolul}%
40.13 \def\appendixname{Anexa}%
40.14 \def\contentsname{Cuprins}%
40.15 \def\listfigurename{List\u{a} de figuri}%
40.16 \def\listtablename{List\u{a} de tabele}%
40.17 \def\indexname{Glosar}%
40.18 \def\figurename{Figura}% % sau Plan\c{s}a
40.19 \def\tablename{Tabela}%
40.20 \def\partname{Partea}%
40.21 \def\enclname{Anex\u{a}}% % sau Anexe
40.22 \def\ccname{Copie}%
40.23 \def\headtoname{Pentru}%
40.24 \def\pagename{Pagina}%
40.25 \def\seename{Vezi}%
40.26 \def\alsoname{Vezi de asemenea}%
40.27 \def\proofname{Demonstra\c{t}ie} %
40.28 \def\glossaryname{Glosar}%
40.29 }%

\dateromanian The macro \dateromanian redenes the command \today to produce Romanian
dates.
40.30 \def\dateromanian{%
48 The le described in this section has version number v1.2l and was last revised on 2005/03/31.
A contribution was made by Umstatter Horst (hhu@cernvm.cern.ch).

235
40.31 \def\today{\number\day~\ifcase\month\or
40.32 ianuarie\or februarie\or martie\or aprilie\or mai\or
40.33 iunie\or iulie\or august\or septembrie\or octombrie\or
40.34 noiembrie\or decembrie\fi
40.35 \space \number\year}}

\extrasromanian The macro \extrasromanian will perform all the extra denitions needed for the
\noextrasromanian Romanian language. The macro \noextrasromanian is used to cancel the actions
of \extrasromanian For the moment these macros are empty but they are dened
for compatibility with the other language denition les.
40.36 \addto\extrasromanian{}
40.37 \addto\noextrasromanian{}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
40.38 \ldf@finish{romanian}
40.39 h/codei

236
41 The Danish language
The le danish.dtx49 denes all the language denition macros for the Danish
language.
For this language the character " is made active. In table 16 an overview is
given of its purpose.

"| disable ligature at this position.


"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"" like "-, but producing no hyphen sign (for words that
should break at some sign such as entrada/salida.
"` lowered double left quotes (looks like )
"' normal double right quotes
"< for French left double quotes (similar to <<).
"> for French right double quotes (similar to >>).
\- like the old \-, but allowing hyphenation in the rest
of the word.

Table 16: The extra denitions made by danish.ldf

The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
41.1 h∗codei
41.2 \LdfInit{danish}\captionsdanish
When this le is read as an option, i.e. by the \usepackage command, danish
will be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@danish to see whether we have to do something here.
41.3 \ifx\l@danish\@undefined
41.4 \@nopatterns{Danish}
41.5 \adddialect\l@danish0\fi

\englishhyphenmins This macro is used to store the correct values of the hyphenation parameters
\lefthyphenmin and \righthyphenmin.
41.6 \providehyphenmins{\CurrentOption}{\tw@\tw@}

The next step consists of dening commands to switch to (and from) the Danish
language.

\captionsdanish The macro \captionsdanish denes all strings used in the four standard docu-
mentclasses provided with LATEX.
\addto\captionsdanish{%
41.7

41.8\def\prefacename{Forord}%
41.9 \def\refname{Litteratur}%
41.10 \def\abstractname{Resum\'e}%
41.11 \def\bibname{Litteratur}%
41.12 \def\chaptername{Kapitel}%
41.13 \def\appendixname{Bilag}%
41.14 \def\contentsname{Indhold}%
49 The le described in this section has version number v1.3q and was last revised on
2008/07/06. A contribution was made by Henning Larsen (larsen@cernvm.cern.ch)

237
41.15 \def\listfigurename{Figurer}%
41.16 \def\listtablename{Tabeller}%
41.17 \def\indexname{Indeks}%
41.18 \def\figurename{Figur}%
41.19 \def\tablename{Tabel}%
41.20 \def\partname{Del}%
41.21 \def\enclname{Vedlagt}%
41.22 \def\ccname{Kopi til}% or Kopi sendt til
41.23 \def\headtoname{Til}% in letter
41.24 \def\pagename{Side}%
41.25 \def\seename{Se}%
41.26 \def\alsoname{Se ogs{\aa}}%
41.27 \def\proofname{Bevis}%
41.28 \def\glossaryname{Gloseliste}%
41.29 }%

\datedanish The macro \datedanish redenes the command \today to produce Danish dates.

41.30 \def\datedanish{%
41.31 \def\today{\number\day.~\ifcase\month\or
41.32 januar\or februar\or marts\or april\or maj\or juni\or
41.33 juli\or august\or september\or oktober\or november\or december\fi
41.34 \space\number\year}}

\extrasdanish The macro \extrasdanish will perform all the extra denitions needed for the
\noextrasdanish Danish language. The macro \noextrasdanish is used to cancel the actions of
\extrasdanish.
Danish typesetting requires \frenchspacing to be in eect.
41.35 \addto\extrasdanish{\bbl@frenchspacing}
41.36 \addto\noextrasdanish{\bbl@nonfrenchspacing}
For Danish the " character is made active. This is done once, later on its
denition may vary. Other languages in the same document may also use the "
character for shorthands; we specify that the danish group of shorthands should
be used.
41.37 \initiate@active@char{"}
41.38 \addto\extrasdanish{\languageshorthands{danish}}
41.39 \addto\extrasdanish{\bbl@activate{"}}

Don't forget to turn the shorthands o again.


41.40 \addto\noextrasdanish{\bbl@deactivate{"}}
First we dene access to the low opening double quote and guillemets for
quotations,
41.41 \declare@shorthand{danish}{"`}{%
41.42 \textormath{\quotedblbase}{\mbox{\quotedblbase}}}
41.43 \declare@shorthand{danish}{"'}{%

41.44 \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}}
41.45 \declare@shorthand{danish}{"<}{%

41.46 \textormath{\guillemotleft}{\mbox{\guillemotleft}}}
41.47 \declare@shorthand{danish}{">}{%

41.48 \textormath{\guillemotright}{\mbox{\guillemotright}}}

238
then we dene commands to be able to specify hyphenation breakpoints that
behave a little dierent from \-.
41.49 \declare@shorthand{danish}{"-}{\nobreak-\bbl@allowhyphens}
41.50 \declare@shorthand{danish}{""}{\hskip\z@skip}
41.51 \declare@shorthand{danish}{"~}{\textormath{\leavevmode\hbox{-}}{-}}

41.52 \declare@shorthand{danish}{"=}{\nobreak-\hskip\z@skip}

And we want to have a shorthand for disabling a ligature.


41.53 \declare@shorthand{danish}{"|}{%
41.54 \textormath{\discretionary{-}{}{\kern.03em}}{}}
To enable hyphenation in two words, written together but separated by a slash,
as in `uitdrukking/opmerking' we dene the command "/.
41.55 \declare@shorthand{dutch}{"/}{\textormath
41.56 {\bbl@allowhyphens\discretionary{/}{}{/}\bbl@allowhyphens}{}}

\- All that is left now is the redenition of \-. The new version of \- should indicate
an extra hyphenation position, while allowing other hyphenation positions to be
generated automatically. The standard behaviour of TEX in this respect is very
unfortunate for languages such as Dutch and German, where long compound words
are quite normal and all one needs is a means to indicate an extra hyphenation
position on top of the ones that TEX can generate from the hyphenation patterns.
41.57 \expandafter\addto\csname extras\CurrentOption\endcsname{%
41.58 \babel@save\-}
41.59 \expandafter\addto\csname extras\CurrentOption\endcsname{%

41.60 \def\-{\bbl@allowhyphens\discretionary{-}{}{}\bbl@allowhyphens}}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
41.61 \ldf@finish{danish}
41.62 h/codei

239
42 The Icelandic language
42.1 Overview
The le iceland.dtx50 denes all the language denition macros for the Icelandic
language
Customization for the Icelandic language was made following several ocial
and semiocial publications [2, 3, 1, 6, 5]. These publications do not always agree
and we indicate those instances.
For this language the character " is made active. In table 17 an overview is
given of its purpose. The shorthands in table 17 can also be typeset by using the

"| disable ligature at this position.


"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"" like "-, but producing no hyphen sign (for compund
words with hyphen, e.g. x-""y).
"~ for a compound word mark without a breakpoint.
"= for a compound word mark with a breakpoint, allow-
ing hyphenation in the composing words.
"` for Icelandic left double quotes (looks like ).
"' for Icelandic right double quotes.
"> for Icelandic `french' left double quotes (similar to
>>).
"< for Icelandic `french' right double quotes (similar to
<<).
"o for old Icelandic o
"O for old Icelandic O
"ó for old Icelandic ó
"Ó for old Icelandic Ó
"e for old Icelandic e
"E for old Icelandic E
"é for old Icelandic é
"É for old Icelandic É
\tala for typesetting numbers
\grada for the `degree' symbol
\gradur for `degrees', e.g. 5 C
\upp for textsuperscript

Table 17: The shorthands and extra denitions made by icelandic.ldf

commands in table 18.

References
[1] Alþingi. Reglur um frágang þingskjala og prentun umræðna, 1988.

[2] Auglýsing um greinarmerkjasetningu. Stj.tíð B, nr. 133/1974, 1974.


50 The le described in this section has version number ? and was last revised on ?.

240
\ilqq for Icelandic left double quotes (looks like ).
\irqq for Icelandic right double quotes (looks like ).
\ilq for Icelandic left single quotes (looks like ,).
\irq for Icelandic right single quotes (looks like `).
\iflqq for Icelandic `french' left double quotes (similar to
>>).
\ifrqq for Icelandic `french' right double quotes (similar to
<<).
\ifrq for Icelandic `french' right single quotes (similar to
<).
\iflq for Icelandic `french' left single quotes (similar to >).
\dq the original quotes character (").
\oob for old Icelandic o
\Oob for old Icelandic O
\ooob for old Icelandic ó
\OOob for old Icelandic Ó
\eob for old Icelandic e
\Eob for old Icelandic E
\eeob for old Icelandic é
\EEob for old Icelandic É

Table 18: Commands which produce quotes and old Icelandic diacritics, dened
by icelandic.ldf

[3] Auglýsing um breyting auglýsingu nr. 132/1974 um íslenska stafsetningu.


Stj.tíð B, nr. 261/1977, 1977.

[4] Einar Haugen, editor. First Grammatical Treatise. Longman, London, 2 edi-
tion, 1972.

[5] Staðlaráð Íslands og Fagráð í upplýsingatækni, Reykjavík. Forstaðall FS


130:1997, 1997.

[6] STRÍ Staðlaráð Íslands. SI - kerð, 2 edition, 1994.

42.2 TEXnical details


When this le was read through the option icelandic we make it behave as if
icelandic was specied.
42.1 \def\bbl@tempa{icelandic}
42.2 \ifx\CurrentOption\bbl@tempa
42.3 \def\CurrentOption{icelandic}
42.4 \fi

The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
42.5 h∗codei
42.6 \LdfInit\CurrentOption{captions\CurrentOption}
When this le is read as an option, i.e., by the \usepackage command,
icelandic will be an `unknown' language, so we have to make it known. So we

241
check for the existence of \l@icelandic to see whether we have to do something
here.
\ifx\l@icelandic\@undefined
42.7

42.8\@nopatterns{Icelandic}
42.9 \adddialect\l@icelandic0
42.10 \fi

\if@Two@E We will need a new `if' : \if@Two@E is true if and only if LATEX 2ε is running not in
compatibility mode. It is used in the denitions of the command \tala and \upp.
The denition is somewhat complicated, due to the fact that \if@compatibility
is not recognized as a \if in LATEX-2.09 based formats.
42.11 \newif\if@Two@E \@Two@Etrue
42.12 \def\@FI@{\fi}
42.13 \ifx\@compatibilitytrue\@undefined

42.14 \@Two@Efalse \def\@FI@{\relax}


42.15 \else

42.16 \if@compatibility \@Two@Efalse \fi


42.17 \@FI@

\extrasicelandic The macro \extrasicelandic will perform all the extra denitions needed for the
\noextrasicelandic Icelandic language. The macro \noextrasicelandic is used to cancel the actions
of \extrasicelandic.
For Icelandic the " character is made active. This is done once, later on its
denition may vary.
42.18 \initiate@active@char{"}
42.19 \@namedef{extras\CurrentOption}{%
42.20 \languageshorthands{icelandic}}
42.21 \expandafter\addto\csname extras\CurrentOption\endcsname{%

42.22 \bbl@activate{"}}
Don't forget to turn the shorthands o again.
42.23 \addto\noextrasicelandic{\bbl@deactivate{"}}
The icelandic hyphenation patterns can be used with \lefthyphenmin and
\righthyphenmin set to 2.
42.24 \providehyphenmins{\CurrentOption}{\tw@\tw@}

The code above is necessary because we need an extra active character. This
character is then used as indicated in table 18.
To be able to dene the function of ", we rst dene a couple of `support'
macros.

42.3 Captionnames and date


The next step consists of dening the Icelandic equivalents for the LATEX caption-
names.

\captionsicelandic The macro \captionsicelandic will dene all strings used used in the four stan-
dard document classes provided with LATEX.
42.25 \@namedef{captions\CurrentOption}{%
42.26 \def\prefacename{Form\'{a}li}%
42.27 \def\refname{Heimildir}%
42.28 \def\abstractname{\'{U}tdr\'{a}ttur}%

242
42.29 \def\bibname{Heimildir}%
42.30 \def\chaptername{Kafli}%
42.31 \def\appendixname{Vi{\dh}auki}%
42.32 \def\contentsname{Efnisyfirlit}%
42.33 \def\listfigurename{Myndaskr\'{a}}%
42.34 \def\listtablename{T\"{o}fluskr\'{a}}%
42.35 \def\indexname{Atri{\dh}isor{\dh}askr\'{a}}%
42.36 \def\figurename{Mynd}%
42.37 \def\tablename{Tafla}%
42.38 \def\partname{Hluti}%
42.39 \def\enclname{Hj\'{a}lagt}%
42.40 \def\ccname{Samrit}%
42.41 \def\headtoname{Til:}% in letter
42.42 \def\pagename{Bla{\dh}s\'{\i}{\dh}a}%
42.43 \def\seename{Sj\'{a}}%
42.44 \def\alsoname{Sj\'{a} einnig}%
42.45 \def\proofname{S\"{o}nnun}%
42.46 \def\glossaryname{Or{\dh}alisti}%
42.47 }

\dateicelandic The macro \dateicelandic redenes the command \today to produce Icelandic
dates.
42.48 \def\dateicelandic{%
42.49 \def\today{\number\day.~\ifcase\month\or
42.50 jan\'{u}ar\or febr\'{u}ar\or mars\or apr\'{\i}l\or ma\'{\i}\or
42.51 j\'{u}n\'{\i}\or j\'{u}l\'{\i}\or \'{a}g\'{u}st\or september\or
42.52 okt\'{o}ber\or n\'{o}vember\or desember\fi
42.53 \space\number\year}}

42.4 Icelandic quotation marks


\dq We save the original double quote character in \dq to keep it available, the math
accent \" can now be typed as ".
42.54 \begingroup \catcode`\"12
42.55 \def\x{\endgroup
42.56 \def\@SS{\mathchar"7019 }
42.57 \def\dq{"}}
42.58 \x

Now we can dene the icelandic and icelandic `french' quotes. The icelandic
`french' guillemets are the reverse of french guillemets. We dene single icelandic
`french' quotes for compatibility. Shorthands are provided for a number of dierent
quotation marks, which make them useable both outside and inside mathmode.
42.59 \let\ilq\grq
42.60 \let\irq\grq
42.61 \let\iflq\frq

42.62 \let\ifrq\flq

42.63 \let\ilqq\glqq

42.64 \let\irqq\grqq

42.65 \let\iflqq\frqq

42.66 \let\ifrqq\flqq

42.67 \declare@shorthand{icelandic}{"`}{\glqq}

243
42.68 \declare@shorthand{icelandic}{"'}{\grqq}
42.69 \declare@shorthand{icelandic}{">}{\frqq}
42.70 \declare@shorthand{icelandic}{"<}{\flqq}

and some additional commands:


42.71 \declare@shorthand{icelandic}{"-}{\nobreak\-\bbl@allowhyphens}
42.72 \declare@shorthand{icelandic}{"|}{%
42.73 \textormath{\nobreak\discretionary{-}{}{\kern.03em}%
42.74 \bbl@allowhyphens}{}}
42.75 \declare@shorthand{icelandic}{""}{\hskip\z@skip}

42.76 \declare@shorthand{icelandic}{"~}{\textormath{\leavevmode\hbox{-}}{-}}

42.77 \declare@shorthand{icelandic}{"=}{\nobreak-\hskip\z@skip}

42.5 Old Icelandic


In old Icelandic some letters have special diacritical marks, described for example
in First Grammatical Treatise [4, 5]. We provide these in the T1 encoding with
the `ogonek'. The ogonek is placed with the letters `o', and `O', `ó' and `Ó', `e'
and `E', and `é' and `É'. Shorthands are provided for these as well.
The following code by Leszek Holenderski lifted from polish.dtx is designed
to position the diacritics correctly for every font in every size. These macros need
a few extra dimension variables.
42.78 \newdimen\pl@left
42.79 \newdimen\pl@down
42.80 \newdimen\pl@right

42.81 \newdimen\pl@temp

\sob The macro \sob is used to put the `ogonek' in the right place.
42.82 \def\sob#1#2#3#4#5{%parameters: letter and fractions hl,ho,vl,vo
42.83 \setbox0\hbox{#1}\setbox1\hbox{\k{}}\setbox2\hbox{p}%
42.84 \pl@right=#2\wd0 \advance\pl@right by-#3\wd1
42.85 \pl@down=#5\ht1 \advance\pl@down by-#4\ht0
42.86 \pl@left=\pl@right \advance\pl@left by\wd1
42.87 \pl@temp=-\pl@down \advance\pl@temp by\dp2 \dp1=\pl@temp
42.88 \leavevmode
42.89 \kern\pl@right\lower\pl@down\box1\kern-\pl@left #1}

\oob
\Oob42.90 \DeclareTextCommand{\oob}{T1}{\sob {o}{.85}{0}{.04}{0}}
\ooob42.91 \DeclareTextCommand{\Oob}{T1}{\sob {O}{.7}{0}{0}{0}}
\OOob42.92 \DeclareTextCommand{\ooob}{T1}{\sob {ó}{.85}{0}{.04}{0}}
\eob42.93 \DeclareTextCommand{\OOob}{T1}{\sob {Ó}{.7}{0}{0}{0}}
\Eob42.94 \DeclareTextCommand{\eob}{T1}{\sob {e}{1}{0}{.04}{0}}
\eeob42.95 \DeclareTextCommand{\Eob}{T1}{\sob {E}{1}{0}{.04}{0}}
\EEob42.96 \DeclareTextCommand{\eeob}{T1}{\sob {é}{1}{0}{.04}{0}}
42.97 \DeclareTextCommand{\EEob}{T1}{\sob {É}{1}{0}{.04}{0}}

42.98 \declare@shorthand{icelandic}{"o}{\oob}
42.99 \declare@shorthand{icelandic}{"O}{\Oob}
42.100 \declare@shorthand{icelandic}{"ó}{\ooob}

42.101 \declare@shorthand{icelandic}{"Ó}{\OOob}

42.102 \declare@shorthand{icelandic}{"e}{\eob}

42.103 \declare@shorthand{icelandic}{"E}{\Eob}

244
42.104 \declare@shorthand{icelandic}{"é}{\eeob}
42.105 \declare@shorthand{icelandic}{"É}{\EEob}

42.6 Formatting numbers


This section is lifted from frenchb.dtx by D. Flipo. In English the decimal
part starts with a point and thousands should be separated by a comma: an
approximation of 1000π should be inputed as $3{,}141.592{,}653$ in math-
mode and as 3,141.592,653 in text.
In Icelandic the decimal part starts with a comma and thousands should be
separated by a space [1] or by a period [5]; we have the space. The above ap-
proximation of 1000π should be inputed as $3\;141{,}592\;653$ in math-mode
and as something like 3~141,592~653 in text. Braces are mandatory around the
comma in math-mode, the reason is mentioned in the TEXbook p. 134: the comma
is of type \mathpunct (thus normally followed by a space) while the point is of
type \mathord (no space added).
Thierry Bouche suggested that a second type of comma, of type \mathord
would be useful in math-mode, and proposed to introduce a command (named
\decimalsep in this package), the expansion of which would depend on the current
language.
Vincent Jalby suggested a command \nombre to conveniently typeset numbers:
inputting \nombre{3141,592653} either in text or in math-mode will format this
number properly according to the current language (Icelandic or non-Icelandic).
We use \nombre to dene command \tala in Icelandic.
\tala accepts an optional argument which happens to be useful with the
extension `dcolumn', it species the decimal separator used in the source code :
\newcolumntype{d}{D{,}{\decimalsep}{-1}}
\begin{tabular}{d}\hline
3,14 \\
\tala[,]{123,4567} \\
\tala[,]{9876,543}\\\hline
\end{tabular}
will print a column of numbers aligned on the decimal point (comma or point
depending on the current language), each slice of 3 digits being separated by a
space or a comma according to the current language.

\decimalsep We need a internal denition, valid in both text and math-mode, for the comma
\thousandsep (\@comma@) and another one for the unbreakable xed length space (no glue) used
in Icelandic (\f@thousandsep).
The commands \decimalsep and \thousandsep get default denitions (for
the English language) when icelandic is loaded; these denitions will be updated
when the current language is switched to or from Icelandic.
42.106 \mathchardef\m@comma="013B \def\@comma@{\ifmmode\m@comma\else,\fi}
42.107 \def\f@thousandsep{\ifmmode\mskip5.5mu\else\penalty\@M\kern.3em\fi}
42.108 \newcommand{\decimalsep}{.} \newcommand{\thousandsep}{\@comma@}
42.109 \expandafter\addto\csname extras\CurrentOption\endcsname{%

42.110 \def\decimalsep{\@comma@}%
42.111 \def\thousandsep{\f@thousandsep}}
42.112 \expandafter\addto\csname noextras\CurrentOption\endcsname{%

42.113 \def\decimalsep{.}%
42.114 \def\thousandsep{\@comma@}}

245
\tala The decimal separator used when inputing a number with \tala has to be a
comma. \tala splits the inputed number into two parts: what comes before the
rst comma will be formatted by \@integerpart while the rest (if not empty) will
be formatted by \@decimalpart. Both parts, once formatted separately will be
merged together with between them, either the decimal separator \decimalsep
or (in LATEX 2ε only ) the optional argument of \tala.
42.115 \if@Two@E
42.116 \newcommand{\tala}[2][\decimalsep]{%
42.117 \def\@decimalsep{#1}\@tala#2\@empty,\@empty,\@nil}
42.118 \else

42.119 \newcommand{\tala}[1]{%
42.120 \def\@decimalsep{\decimalsep}\@tala#1\@empty,\@empty,\@nil}
42.121 \fi

42.122 \def\@tala#1,#2,#3\@nil{%

42.123 \ifx\@empty#2%
42.124 \@integerpart{#1}%
42.125 \else
42.126 \@integerpart{#1}\@decimalsep\@decimalpart{#2}%
42.127 \fi}
The easiest bit is the decimal part: We attempt to read the rst four digits of the
decimal part, if it has less than 4 digits, we just have to print them, otherwise
\thousandsep has to be appended after the third digit, and the algorithm is
applied recursively to the rest of the decimal part.
42.128 \def\@decimalpart#1{\@@decimalpart#1\@empty\@empty\@empty}
42.129 \def\@@decimalpart#1#2#3#4{#1#2#3%
42.130 \ifx\@empty#4%
42.131 \else
42.132 \thousandsep\expandafter\@@decimalpart\expandafter#4%
42.133 \fi}
Formatting the integer part is more dicult because the slices of 3 digits start
from the bottom while the number is read from the top! This (tricky) code is
borrowed from David Carlisle's comma.sty.
42.134 \def\@integerpart#1{\@@integerpart{}#1\@empty\@empty\@empty}
42.135 \def\@@integerpart#1#2#3#4{%
42.136 \ifx\@empty#2%
42.137 \@addthousandsep#1\relax
42.138 \else
42.139 \ifx\@empty#3%
42.140 \@addthousandsep\@empty\@empty#1#2\relax
42.141 \else
42.142 \ifx\@empty#4%
42.143 \@addthousandsep\@empty#1#2#3\relax
42.144 \else
42.145 \@@integerpartafterfi{#1#2#3#4}%
42.146 \fi
42.147 \fi
42.148 \fi}
42.149 \def\@@integerpartafterfi#1\fi\fi\fi{\fi\fi\fi\@@integerpart{#1}}

42.150 \def\@addthousandsep#1#2#3#4{#1#2#3%

42.151 \if#4\relax
42.152 \else

246
42.153 \thousandsep\expandafter\@addthousandsep\expandafter#4%
42.154 \fi}

42.7 Extra utilities


We now provide the Icelandic user with some extra utilities.

\upp \upp is for typesetting superscripts. \upp relies on


\upp@size The internal macro \upp@size holds the size at which the superscript will be
typeset. The reason for this is that we have to specify it dierently for dierent
formats.
42.155 \ifx\sevenrm\@undefined
42.156 \ifx\@ptsize\@undefined
42.157 \let\upp@size\small
42.158 \else
42.159 \ifx\selectfont\@undefined
In this case the format is the original LATEX-2.09:
42.160 \ifcase\@ptsize
42.161 \let\upp@size\ixpt\or
42.162 \let\upp@size\xpt\or
42.163 \let\upp@size\xipt
42.164 \fi
When \selectfont is dened we probably have NFSS available:
42.165 \else
42.166 \ifcase\@ptsize
42.167 \def\upp@size{\fontsize\@ixpt{10pt}\selectfont}\or
42.168 \def\upp@size{\fontsize\@xpt{11pt}\selectfont}\or
42.169 \def\upp@size{\fontsize\@xipt{12pt}\selectfont}
42.170 \fi
42.171 \fi
42.172 \fi
42.173 \else

If we end up here it must be a plain based TEX format, so:


42.174 \let\upp@size\sevenrm
42.175 \fi
Now we can dene \upp. When LATEX 2ε runs in compatibility mode (LATEX-2.09
emulation), \textsuperscript is also dened, but does no good job, so we give
two dierent denitions for \upp using \if@Two@E.
42.176 \if@Two@E
42.177 \DeclareRobustCommand*{\upp}[1]{\textsuperscript{#1}}
42.178 \else

42.179 \DeclareRobustCommand*{\upp}[1]{%
42.180 \leavevmode\raise1ex\hbox{\upp@size#1}}
42.181 \fi

Some denitions for special characters. \grada needs a special treatment: it


is \char6 in T1-encoding and \char23 in OT1-encoding.
42.182 \ifx\fmtname\LaTeXeFmtName
42.183 \DeclareTextSymbol{\grada}{T1}{6}
42.184 \DeclareTextSymbol{\grada}{OT1}{23}

247
42.185 \else
42.186 \def\T@one{T1}
42.187 \ifx\f@encoding\T@one
42.188 \newcommand{\grada}{\char6}
42.189 \else
42.190 \newcommand{\grada}{\char23}
42.191 \fi
42.192 \fi

\gradur Macro for typesetting the abbreviation for `degrees' (as in `degrees Celsius'). As
the bounding box of the character `degree' has very dierent widths in CMR/DC
and PostScript fonts, we x the width of the bounding box of \gradur to 0.3 em,
this lets the symbol `degree' stick to the preceding (e.g., 45\gradur) or following
character (e.g., 20~\gradur C).
42.193 \DeclareRobustCommand*{\gradur}{%
42.194 \leavevmode\hbox to 0.3em{\hss\grada\hss}}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
42.195 \ldf@finish\CurrentOption
42.196 h/codei

248
43 The Norwegian language
The le norsk.dtx51 denes all the language denition macros for the Norwegian
language as well as for an alternative variant `nynorsk' of this language.
For this language the character " is made active. In table 19 an overview is
given of its purpose.

"ff for ff to be hyphenated as ff-f, this is also implemented


for b, d, f, g, l, m, n, p, r, s, and t. (o"ppussing)
"ee Hyphenate "ee as \'e-e. (komit"een)
"- an explicit hyphen sign, allowing hyphenation in the
composing words. Use this for compound words when
the hyphenation patterns fail to hyphenate properly.
(alpin"-anlegg)
"| Like "-, but inserts 0.03em space. Use it if the compound
point is spanned by a ligature. (hoff"|intriger)
"" Like "-, but producing no hyphen sign. (i""g\aa{}r)
"~ Like -, but allows no hyphenation at all. (E"~cup)
"= Like -, but allowing hyphenation in the composing words.
(marksistisk"=leninistisk)
"< for French left double quotes (similar to <<).
"> for French right double quotes (similar to >>).

Table 19: The extra denitions made by norsk.sty

Rune Kleveland distributes a Norwegian dictionary for ispell (570000 words).


It can be found at http://www.uio.no/~runekl/dictionary.html.
This dictionary supports the spellings spi"sslede for `spisslede' (hyphenated
spiss-slede) and other such words, and also suggest the spelling spi"sslede for
`spisslede' and `spissslede'.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
43.1 h∗codei
43.2 \LdfInit\CurrentOption{captions\CurrentOption}
When this le is read as an option, i.e. by the \usepackage command, norsk
will be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@norsk to see whether we have to do something here.
43.3 \ifx\l@norsk\@undefined
43.4 \@nopatterns{Norsk}
43.5 \adddialect\l@norsk0\fi

\norskhyphenmins Some sets of Norwegian hyphenation patterns can be used with \lefthyphenmin
set to 1 and \righthyphenmin set to 2, but the most common set nohyph.tex
can't. So we use \lefthyphenmin=2 by default.
43.6 \providehyphenmins{\CurrentOption}{\tw@\tw@}
51 The le described in this section has version number v2.0h and was last revised on
2005/03/30. Contributions were made by Haavard Helstrup (HAAVARD@CERNVM) and Alv Kjetil
Holme (HOLMEA@CERNVM); the `nynorsk' variant has been supplied by Per Steinar Iversen
iversen@vxcern.cern.ch) and Terje Engeset Petterst (TERJEEP@VSFYS1.FI.UIB.NO); the short-
hand denitions were provided by Rune Kleveland (runekl@math.uio.no).

249
Now we have to decide which version of the captions should be made available.
This can be done by checking the contents of \CurrentOption.
43.7 \def\bbl@tempa{norsk}
43.8 \ifx\CurrentOption\bbl@tempa
The next step consists of dening commands to switch to (and from) the Nor-
wegian language.

\captionsnorsk The macro \captionsnorsk denes all strings used in the four standard docu-
mentclasses provided with LATEX.
43.9\def\captionsnorsk{%
43.10 \def\prefacename{Forord}%
43.11 \def\refname{Referanser}%
43.12 \def\abstractname{Sammendrag}%
43.13 \def\bibname{Bibliografi}% or Litteraturoversikt
43.14 % or Litteratur or Referanser
43.15 \def\chaptername{Kapittel}%
43.16 \def\appendixname{Tillegg}% or Appendiks
43.17 \def\contentsname{Innhold}%
43.18 \def\listfigurename{Figurer}% or Figurliste
43.19 \def\listtablename{Tabeller}% or Tabelliste
43.20 \def\indexname{Register}%
43.21 \def\figurename{Figur}%
43.22 \def\tablename{Tabell}%
43.23 \def\partname{Del}%
43.24 \def\enclname{Vedlegg}%
43.25 \def\ccname{Kopi sendt}%
43.26 \def\headtoname{Til}% in letter
43.27 \def\pagename{Side}%
43.28 \def\seename{Se}%
43.29 \def\alsoname{Se ogs\aa{}}%
43.30 \def\proofname{Bevis}%
43.31 \def\glossaryname{Ordliste}%
43.32 }
43.33 \else

For the `nynorsk' version of these denitions we just add a dialect.


43.34 \adddialect\l@nynorsk\l@norsk

\captionsnynorsk The macro \captionsnynorsk denes all strings used in the four standard docu-
mentclasses provided with LATEX, but using a dierent spelling than in the com-
mand \captionsnorsk.
43.35 \def\captionsnynorsk{%
43.36 \def\prefacename{Forord}%
43.37 \def\refname{Referansar}%
43.38 \def\abstractname{Samandrag}%
43.39 \def\bibname{Litteratur}% or Litteraturoversyn
43.40 % or Referansar
43.41 \def\chaptername{Kapittel}%
43.42 \def\appendixname{Tillegg}% or Appendiks
43.43 \def\contentsname{Innhald}%
43.44 \def\listfigurename{Figurar}% or Figurliste
43.45 \def\listtablename{Tabellar}% or Tabelliste
43.46 \def\indexname{Register}%

250
43.47 \def\figurename{Figur}%
43.48 \def\tablename{Tabell}%
43.49 \def\partname{Del}%
43.50 \def\enclname{Vedlegg}%
43.51 \def\ccname{Kopi til}%
43.52 \def\headtoname{Til}% in letter
43.53 \def\pagename{Side}%
43.54 \def\seename{Sj\aa{}}%
43.55 \def\alsoname{Sj\aa{} \`{o}g}%
43.56 \def\proofname{Bevis}%
43.57 \def\glossaryname{Ordliste}%
43.58 }
43.59 \fi

\datenorsk The macro \datenorsk redenes the command \today to produce Norwegian
dates.
43.60 \@namedef{date\CurrentOption}{%
43.61 \def\today{\number\day.~\ifcase\month\or
43.62 januar\or februar\or mars\or april\or mai\or juni\or
43.63 juli\or august\or september\or oktober\or november\or desember
43.64 \fi
43.65 \space\number\year}}

\extrasnorsk The macro \extrasnorsk will perform all the extra denitions needed for the
\extrasnynorsk Norwegian language. The macro \noextrasnorsk is used to cancel the actions of
\extrasnorsk.
Norwegian typesetting requires \frencspacing to be in eect.
43.66 \@namedef{extras\CurrentOption}{\bbl@frenchspacing}
43.67 \@namedef{noextras\CurrentOption}{\bbl@nonfrenchspacing}

For Norsk the " character is made active. This is done once, later on its
denition may vary.
43.68 \initiate@active@char{"}
43.69 \expandafter\addto\csname extras\CurrentOption\endcsname{%
43.70 \languageshorthands{norsk}}
43.71 \expandafter\addto\csname extras\CurrentOption\endcsname{%

43.72 \bbl@activate{"}}
Don't forget to turn the shorthands o again.
43.73 \expandafter\addto\csname noextras\CurrentOption\endcsname{%
43.74 \bbl@deactivate{"}}
The code above is necessary because we need to dene a number of shorthand
commands. These sharthand commands are then used as indicated in table 19.
To be able to dene the function of ", we rst dene a couple of `support'
macros.

\dq We save the original double quote character in \dq to keep it available, the math
accent \" can now be typed as ".
43.75 \begingroup \catcode`\"12
43.76 \def\x{\endgroup
43.77 \def\@SS{\mathchar"7019 }
43.78 \def\dq{"}}
43.79 \x

251
Now we can dene the discretionary shorthand commands. The number of
words where such hyphenation is required is for each character
b d f g k l n p r s t
4 4 15 3 43 30 8 12 1 33 35
taken from a list of 83000 ispell-roots.
43.80 \declare@shorthand{norsk}{"b}{\textormath{\bbl@disc b{bb}}{b}}
43.81 \declare@shorthand{norsk}{"B}{\textormath{\bbl@disc B{BB}}{B}}
43.82 \declare@shorthand{norsk}{"d}{\textormath{\bbl@disc d{dd}}{d}}
43.83 \declare@shorthand{norsk}{"D}{\textormath{\bbl@disc D{DD}}{D}}
43.84 \declare@shorthand{norsk}{"e}{\textormath{\bbl@disc e{\'e}}{}}
43.85 \declare@shorthand{norsk}{"E}{\textormath{\bbl@disc E{\'E}}{}}
43.86 \declare@shorthand{norsk}{"F}{\textormath{\bbl@disc F{FF}}{F}}
43.87 \declare@shorthand{norsk}{"g}{\textormath{\bbl@disc g{gg}}{g}}
43.88 \declare@shorthand{norsk}{"G}{\textormath{\bbl@disc G{GG}}{G}}
43.89 \declare@shorthand{norsk}{"k}{\textormath{\bbl@disc k{kk}}{k}}
43.90 \declare@shorthand{norsk}{"K}{\textormath{\bbl@disc K{KK}}{K}}
43.91 \declare@shorthand{norsk}{"l}{\textormath{\bbl@disc l{ll}}{l}}
43.92 \declare@shorthand{norsk}{"L}{\textormath{\bbl@disc L{LL}}{L}}
43.93 \declare@shorthand{norsk}{"n}{\textormath{\bbl@disc n{nn}}{n}}
43.94 \declare@shorthand{norsk}{"N}{\textormath{\bbl@disc N{NN}}{N}}
43.95 \declare@shorthand{norsk}{"p}{\textormath{\bbl@disc p{pp}}{p}}
43.96 \declare@shorthand{norsk}{"P}{\textormath{\bbl@disc P{PP}}{P}}
43.97 \declare@shorthand{norsk}{"r}{\textormath{\bbl@disc r{rr}}{r}}
43.98 \declare@shorthand{norsk}{"R}{\textormath{\bbl@disc R{RR}}{R}}
43.99 \declare@shorthand{norsk}{"s}{\textormath{\bbl@disc s{ss}}{s}}
43.100 \declare@shorthand{norsk}{"S}{\textormath{\bbl@disc S{SS}}{S}}
43.101 \declare@shorthand{norsk}{"t}{\textormath{\bbl@disc t{tt}}{t}}
43.102 \declare@shorthand{norsk}{"T}{\textormath{\bbl@disc T{TT}}{T}}
We need to treat "f a bit dierently in order to preserve the -ligature.
43.103 \declare@shorthand{norsk}{"f}{\textormath{\bbl@discff}{f}}
43.104 \def\bbl@discff{\penalty\@M
43.105 \afterassignment\bbl@insertff \let\bbl@nextff= }
43.106 \def\bbl@insertff{%

43.107 \if f\bbl@nextff


43.108 \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
43.109 {\relax\discretionary{ff-}{f}{ff}\allowhyphens}{f\bbl@nextff}}
43.110 \let\bbl@nextff=f

We now dene the French double quotes and some commands concerning hyphen-
ation:
43.111 \declare@shorthand{norsk}{"<}{\flqq}
43.112 \declare@shorthand{norsk}{">}{\frqq}
43.113 \declare@shorthand{norsk}{"-}{\penalty\@M\-\bbl@allowhyphens}

43.114 \declare@shorthand{norsk}{"|}{%

43.115 \textormath{\penalty\@M\discretionary{-}{}{\kern.03em}%
43.116 \allowhyphens}{}}
43.117 \declare@shorthand{norsk}{""}{\hskip\z@skip}

43.118 \declare@shorthand{norsk}{"~}{\textormath{\leavevmode\hbox{-}}{-}}

43.119 \declare@shorthand{norsk}{"=}{\penalty\@M-\hskip\z@skip}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.

252
43.120 \ldf@finish\CurrentOption
43.121 h/codei

253
44 The Swedish language
The le swedish.dtx52 denes all the language-specic macros for the Swedish
language. This le has borrowed heavily from finnish.dtx and germanb.dtx.
For this language the character " is made active. In table 20 an overview is
given of its purpose. The vertical placement of the "umlaut" in some letters can
be controlled this way.

"a Gives ä, also implemented for "A, "o and "O.


"w, "W gives å and Å.
"ff for ff to be hyphenated as ff-f. Used for com-
pound words, such as stra"ffånge, which should
be hyphenated as straff-fånge. This is also imple-
mented for b, d, f, g, l, m, n, p, r, s, and t.
"| disable ligature at this position. This should be used
for compound words, such as  stra"ffinrättning,
which should not have the ligature .
"- an explicit hyphen sign, allowing hyphenation in the
rest of the word, such as e. g. in x"-axeln.
"" like "-, but producing no hyphen sign (for words that
should break at some sign such as och/""eller).
"~ for an explicit hyphen without a breakpoint; useful
for expressions such as 2"~3 veckor where no line-
break is desirable.
"= an explicit hyphen sign allowing subsequent hyphen-
ation, for expressions such as studiebidrag och
-lån.
\- like the old \-, but allowing hyphenation in the rest
of the word.

Table 20: The extra denitions made by swedish.sty

Two variations for formatting of dates are added. \datesymd makes \today
output dates formatted as YYYY-MM-DD, which is commonly used in Sweden
today. \datesdmy formats the date as D/M YYYY, which is also very common
in Sweden. These commands should be issued after \begindocument.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
44.1 h∗codei
44.2 \LdfInit{swedish}\captionsswedish
When this le is read as an option, i.e. by the \usepackage command, swedish
will be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@swedish to see whether we have to do something
here.
44.3 \ifx\l@swedish\@undefined
44.4 \@nopatterns{Swedish}
52 The le described in this section has version number v2.3d and was last revised on
2005/03/31. Contributions were made by Sten Hellman (HELLMAN@CERNVM.CERN.CH) and Erik
Östhols (erik_osthols@yahoo.com).

254
44.5 \adddialect\l@swedish0\fi
The next step consists of dening commands to switch to the Swedish language.
The reason for this is that a user might want to switch back and forth between
languages.
\captionsswedish The macro \captionsswedish denes all strings used in the four standard docu-
mentclasses provided with LATEX.
\addto\captionsswedish{%
44.6

44.7\def\prefacename{F\"orord}%
44.8 \def\refname{Referenser}%
44.9 \def\abstractname{Sammanfattning}%
44.10 \def\bibname{Litteraturf\"orteckning}%
44.11 \def\chaptername{Kapitel}%
44.12 \def\appendixname{Bilaga}%
44.13 \def\contentsname{Inneh\csname aa\endcsname ll}%
44.14 \def\listfigurename{Figurer}%
44.15 \def\listtablename{Tabeller}%
44.16 \def\indexname{Sakregister}%
44.17 \def\figurename{Figur}%
44.18 \def\tablename{Tabell}%
44.19 \def\partname{Del}%
44.20 \def\enclname{Bil.}%
44.21 \def\ccname{Kopia f\"or k\"annedom}%
44.22 \def\headtoname{Till}% in letter
44.23 \def\pagename{Sida}%
44.24 \def\seename{se}%
44.25 \def\alsoname{se \"aven}%
44.26 \def\proofname{Bevis}%
44.27 \def\glossaryname{Ordlista}%
44.28 }%
\dateswedish The macro \dateswedish redenes the command \today to produce Swedish
dates.
44.29 \def\dateswedish{%
44.30 \def\today{%
44.31 \number\day~\ifcase\month\or
44.32 januari\or februari\or mars\or april\or maj\or juni\or
44.33 juli\or augusti\or september\or oktober\or november\or
44.34 december\fi
44.35 \space\number\year}}
\datesymd The macro \datesymd redenes the command \today to produce dates in the
format YYYY-MM-DD, common in Sweden.
44.36 \def\datesymd{%
44.37 \def\today{\number\year-\two@digits\month-\two@digits\day}%
44.38 }
\datesdmy The macro \datesdmy redenes the command \today to produce Swedish dates
in the format DD/MM YYYY, also common in Sweden.
44.39 \def\datesdmy{%
44.40 \def\today{\number\day/\number\month\space\number\year}%
44.41 }

255
\swedishhyphenmins The swedish hyphenation patterns can be used with \lefthyphenmin set to 2 and
\righthyphenmin set to 2.
44.42 \providehyphenmins{swedish}{\tw@\tw@}

\extrasswedish The macro \extrasswedish performs all the extra denitions needed for the
\noextrasswedish Swedish language. The macro \noextrasswedish is used to cancel the actions
of \extrasswedish.
For Swedish texts \frenchspacing should be in eect. We make sure this is
the case and reset it if necessary.
44.43 \addto\extrasswedish{\bbl@frenchspacing}
44.44 \addto\noextrasswedish{\bbl@nonfrenchspacing}
For Swedish the " character is made active. This is done once, later on its
denition may vary.
44.45 \initiate@active@char{"}
44.46 \addto\extrasswedish{\languageshorthands{swedish}}
44.47 \addto\extrasswedish{\bbl@activate{"}}

Don't forget to turn the shorthands o again.


44.48 \addto\noextrasswedish{\bbl@deactivate{"}}
The umlaut accent macro \" is changed to lower the umlaut dots. The rede-
nition is done with the help of \umlautlow.
44.49 \addto\extrasswedish{\babel@save\"\umlautlow}
44.50 \addto\noextrasswedish{\umlauthigh}

The code above is necessary because we need an extra active character. This
character is then used as indicated in table 20.
To be able to dene the function of ", we rst dene a couple of `support'
macros.

\dq We save the original double quote character in \dq to keep it available, the math
accent \" can now be typed as ".
44.51 \begingroup \catcode`\"12
44.52 \def\x{\endgroup
44.53 \def\@SS{\mathchar"7019 }
44.54 \def\dq{"}}
44.55 \x

Now we can dene the doublequote macros: the umlauts and å.


44.56 \declare@shorthand{swedish}{"w}{\textormath{{\aa}\allowhyphens}{\ddot w}}
44.57 \declare@shorthand{swedish}{"a}{\textormath{\"{a}\allowhyphens}{\ddot a}}
44.58 \declare@shorthand{swedish}{"o}{\textormath{\"{o}\allowhyphens}{\ddot o}}
44.59 \declare@shorthand{swedish}{"W}{\textormath{{\AA}\allowhyphens}{\ddot W}}
44.60 \declare@shorthand{swedish}{"A}{\textormath{\"{A}\allowhyphens}{\ddot A}}
44.61 \declare@shorthand{swedish}{"O}{\textormath{\"{O}\allowhyphens}{\ddot O}}
discretionary commands
44.62 \declare@shorthand{swedish}{"b}{\textormath{\bbl@disc b{bb}}{b}}
44.63 \declare@shorthand{swedish}{"B}{\textormath{\bbl@disc B{BB}}{B}}
44.64 \declare@shorthand{swedish}{"d}{\textormath{\bbl@disc d{dd}}{d}}
44.65 \declare@shorthand{swedish}{"D}{\textormath{\bbl@disc D{DD}}{D}}
44.66 \declare@shorthand{swedish}{"f}{\textormath{\bbl@disc f{ff}}{f}}

256
44.67 \declare@shorthand{swedish}{"F}{\textormath{\bbl@disc F{FF}}{F}}
44.68 \declare@shorthand{swedish}{"g}{\textormath{\bbl@disc g{gg}}{g}}
44.69 \declare@shorthand{swedish}{"G}{\textormath{\bbl@disc G{GG}}{G}}
44.70 \declare@shorthand{swedish}{"l}{\textormath{\bbl@disc l{ll}}{l}}
44.71 \declare@shorthand{swedish}{"L}{\textormath{\bbl@disc L{LL}}{L}}
44.72 \declare@shorthand{swedish}{"m}{\textormath{\bbl@disc m{mm}}{m}}
44.73 \declare@shorthand{swedish}{"M}{\textormath{\bbl@disc M{MM}}{M}}
44.74 \declare@shorthand{swedish}{"n}{\textormath{\bbl@disc n{nn}}{n}}
44.75 \declare@shorthand{swedish}{"N}{\textormath{\bbl@disc N{NN}}{N}}
44.76 \declare@shorthand{swedish}{"p}{\textormath{\bbl@disc p{pp}}{p}}
44.77 \declare@shorthand{swedish}{"P}{\textormath{\bbl@disc P{PP}}{P}}
44.78 \declare@shorthand{swedish}{"r}{\textormath{\bbl@disc r{rr}}{r}}
44.79 \declare@shorthand{swedish}{"R}{\textormath{\bbl@disc R{RR}}{R}}
44.80 \declare@shorthand{swedish}{"s}{\textormath{\bbl@disc s{ss}}{s}}
44.81 \declare@shorthand{swedish}{"S}{\textormath{\bbl@disc S{SS}}{S}}
44.82 \declare@shorthand{swedish}{"t}{\textormath{\bbl@disc t{tt}}{t}}
44.83 \declare@shorthand{swedish}{"T}{\textormath{\bbl@disc T{TT}}{T}}
and some additional commands:
44.84 \declare@shorthand{swedish}{"-}{\nobreak-\bbl@allowhyphens}
44.85 \declare@shorthand{swedish}{"|}{%
44.86 \textormath{\nobreak\discretionary{-}{}{\kern.03em}%
44.87 \bbl@allowhyphens}{}}
44.88 \declare@shorthand{swedish}{""}{\hskip\z@skip}

44.89 \declare@shorthand{swedish}{"~}{%

44.90 \textormath{\leavevmode\hbox{-}\bbl@allowhyphens}{-}}
44.91 \declare@shorthand{swedish}{"=}{\hbox{-}\allowhyphens}

\- Redenition of \-. The new version of \- should indicate an extra hyphenation


position, while allowing other hyphenation positions to be generated automatically.
The standard behaviour of TEX in this respect is very unfortunate for languages
such as Dutch, Finnish, German and Swedish, where long compound words are
quite normal and all one needs is a means to indicate an extra hyphenation position
on top of the ones that TEX can generate from the hyphenation patterns.
44.92 \addto\extrasswedish{\babel@save\-}
44.93 \addto\extrasswedish{\def\-{\allowhyphens
44.94 \discretionary{-}{}{}\allowhyphens}}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
44.95 \ldf@finish{swedish}
44.96 h/codei

257
45 The North Sami language
The le samin.dtx53 denes all the language denition macros for the North Sami
language.
Several Sami dialects/languages are spoken in Finland, Norway, Sweden and
on the Kola Peninsula (Russia). The alphabets dier, so there will eventually be a
need for more .dtx les for e.g. Lule and South Sami. Hence the name samin.dtx
(and not sami.dtx or the like) in the North Sami case.
There are currently no hyphenation patterns available for the North Sami
language, but you might consider using the patterns for Finnish (fi8hyph.tex),
Norwegian (nohyph.tex) or Swedish (sehyph.tex). Add a line for the samin
language to the language.dat le, and rebuild the LATEX format le. See the
documentation for your LATEX distribution.
A note on writing North Sami in LATEX: The TI encoding and EC fonts do not
include the T WITH STROKE letter, which you will need a workaround for. My
suggestion is to place the lines
\newcommand{\tx}{\mbox{t\hspace{-.35em}-}}
\newcommand{\txx}{\mbox{T\hspace{-.5em}-}}
in the preamble of your documents. They dene the commands
\txx{} for LATIN CAPITAL LETTER T WITH STROKE and
\tx{} for LATIN SMALL LETTER T WITH STROKE.

45.1 The code of samin.dtx


The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
45.1 h∗codei
45.2 \LdfInit{samin}{captionssamin}
When this le is read as an option, i.e. by the \usepackage command, samin
could be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@samin to see whether we have to do something here.
45.3 \ifx\undefined\l@samin
45.4 \@nopatterns{Samin}
45.5 \adddialect\l@samin0\fi
The next step consists of dening commands to switch to (and from) the North
Sami language.

\saminhyphenmins This macro is used to store the correct values of the hyphenation parameters
\lefthyphenmin and \righthyphenmin.
45.6 \providehyphenmins{samin}{\tw@\tw@}

\captionssamin The macro \captionssamin denes all strings used in the four standard docu-
mentclasses provided with LATEX.
\def\captionssamin{%
45.7

45.8\def\prefacename{Ovdas\'atni}%
45.9 \def\refname{\v Cujuhusat}%
45.10 \def\abstractname{\v Coahkk\'aigeassu}%
53 The le described in this section has version number v1.0c and was last revised on
2004/02/20. It was written by Regnor Jernsletten, (Regnor.Jernsletten@sami.uit.no) or
(Regnor.Jernsletten@eunet.no).

258
45.11 \def\bibname{Girjj\'ala\v svuohta}%
45.12 \def\chaptername{Kapihttal}%
45.13 \def\appendixname{\v Cuovus}%
45.14 \def\contentsname{Sisdoallu}%
45.15 \def\listfigurename{Govvosat}%
45.16 \def\listtablename{Tabeallat}%
45.17 \def\indexname{Registtar}%
45.18 \def\figurename{Govus}%
45.19 \def\tablename{Tabealla}%
45.20 \def\partname{Oassi}%
45.21 \def\enclname{Mielddus}%
45.22 \def\ccname{Kopia s\'addejuvvon}%
45.23 \def\headtoname{Vuost\'aiv\'aldi}%
45.24 \def\pagename{Siidu}%
45.25 \def\seename{geah\v ca}%
45.26 \def\alsoname{geah\v ca maidd\'ai}%
45.27 \def\proofname{Duo\dj{}a\v stus}%
45.28 \def\glossaryname{S\'atnelistu}%
45.29 }%

\datesamin The macro \datesamin redenes the command \today to produce North Sami
dates.
45.30 \def\datesamin{%
45.31 \def\today{\ifcase\month\or
45.32 o\dj{}\dj{}ajagem\'anu\or
45.33 guovvam\'anu\or
45.34 njuk\v cam\'anu\or
45.35 cuo\ng{}om\'anu\or
45.36 miessem\'anu\or
45.37 geassem\'anu\or
45.38 suoidnem\'anu\or
45.39 borgem\'anu\or
45.40 \v cak\v cam\'anu\or
45.41 golggotm\'anu\or
45.42 sk\'abmam\'anu\or
45.43 juovlam\'anu\fi
45.44 \space\number\day.~b.\space\number\year}%
45.45 }%

\extrassamin The macro \extrassamin will perform all the extra denitions needed for the
\noextrassamin North Sami language. The macro \noextrassamin is used to cancel the actions
of \extrassamin. For the moment these macros are empty but they are dened
for compatibility with the other language denition les.
45.46 \addto\extrassamin{}
45.47 \addto\noextrassamin{}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
45.48 \ldf@finish{samin}
45.49 h/codei

259
46 The Finnish language
The le finnish.dtx54 denes all the language denition macros for the Finnish
language.
For this language the character " is made active. In table 21 an overview is
given of its purpose.

"| disable ligature at this position.


"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"= an explicit hyphen sign for expressions such as
pakastekaapit ja -arkut.
"" like "-, but producing no hyphen sign (for words that
should break at some sign such as entrada/salida.
"` lowered double left quotes (looks like )
"' normal double right quotes
"< for French left double quotes (similar to <<).
"> for French right double quotes (similar to >>).
\- like the old \-, but allowing hyphenation in the rest
of the word.

Table 21: The extra denitions made by finnish.ldf

The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
46.1 h∗codei
46.2 \LdfInit{finnish}\captionsfinnish
When this le is read as an option, i.e. by the \usepackage command, finnish
will be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@finnish to see whether we have to do something
here.
46.3 \ifx\l@finnish\@undefined
46.4 \@nopatterns{Finnish}
46.5 \adddialect\l@finnish0\fi
The next step consists of dening commands to switch to the Finnish language.
The reason for this is that a user might want to switch back and forth between
languages.

\captionsfinnish The macro \captionsfinnish denes all strings used in the four standard docu-
mentclasses provided with LATEX.
\addto\captionsfinnish{%
46.6

46.7\def\prefacename{Esipuhe}%
46.8 \def\refname{Viitteet}%
46.9 \def\abstractname{Tiivistelm\"a}
46.10 \def\bibname{Kirjallisuutta}%
46.11 \def\chaptername{Luku}%
46.12 \def\appendixname{Liite}%
54 The le described in this section has version number v1.3q and was last revised on
2007/10/20. A contribution was made by Mikko KANERVA (KANERVA@CERNVM) and Keranen
Reino (KERANEN@CERNVM).

260
46.13 \def\contentsname{Sis\"alt\"o}% /* Could be "Sis\"allys" as well */
46.14 \def\listfigurename{Kuvat}%
46.15 \def\listtablename{Taulukot}%
46.16 \def\indexname{Hakemisto}%
46.17 \def\figurename{Kuva}%
46.18 \def\tablename{Taulukko}%
46.19 \def\partname{Osa}%
46.20 \def\enclname{Liitteet}%
46.21 \def\ccname{Jakelu}%
46.22 \def\headtoname{Vastaanottaja}%
46.23 \def\pagename{Sivu}%
46.24 \def\seename{katso}%
46.25 \def\alsoname{katso my\"os}%
46.26 \def\proofname{Todistus}%
46.27 \def\glossaryname{Sanasto}%
46.28 }%

\datefinnish The macro \datefinnish redenes the command \today to produce Finnish
dates.
46.29 \def\datefinnish{%
46.30 \def\today{\number\day.~\ifcase\month\or
46.31 tammikuuta\or helmikuuta\or maaliskuuta\or huhtikuuta\or
46.32 toukokuuta\or kes\"akuuta\or hein\"akuuta\or elokuuta\or
46.33 syyskuuta\or lokakuuta\or marraskuuta\or joulukuuta\fi
46.34 \space\number\year}}

\extrasfinnish Finnish has many long words (some of them compound, some not). For this
\noextrasfinnish reason hyphenation is very often the only solution in line breaking. For this reason
the values of \hyphenpenalty, \exhyphenpenalty and \doublehyphendemerits
should be decreased. (In one of the manuals of style Matti Rintala noticed a
paragraph with ten lines, eight of which ended in a hyphen!)
Matti Rintala noticed that with these changes TEX handles Finnish very well,
although sometimes the values of \tolerance and \emergencystretch must be
increased. However, I don't think changing these values in finnish.ldf is appro-
priate, as the looseness of the font (and the line width) aect the correct choice
of these parameters.
46.35 \addto\extrasfinnish{%
46.36 \babel@savevariable\hyphenpenalty\hyphenpenalty=30%
46.37 \babel@savevariable\exhyphenpenalty\exhyphenpenalty=30%
46.38 \babel@savevariable\doublehyphendemerits\doublehyphendemerits=5000%
46.39 \babel@savevariable\finalhyphendemerits\finalhyphendemerits=5000%
46.40 }
46.41 \addto\noextrasfinnish{}

Another thing \extrasfinnish needs to do is to ensure that \frenchspacing


is in eect. If this is not the case the execution of \noextrasfinnish will switch
it of again.
46.42 \addto\extrasfinnish{\bbl@frenchspacing}
46.43 \addto\noextrasfinnish{\bbl@nonfrenchspacing}
For Finnish the " character is made active. This is done once, later on its
denition may vary. Other languages in the same document may also use the "
character for shorthands; we specify that the nnish group of shorthands should
be used.

261
46.44 \initiate@active@char{"}
46.45 \addto\extrasfinnish{\languageshorthands{finnish}}
Don't forget to turn the shorthands o again.
46.46 \addto\extrasfinnish{\bbl@activate{"}}
46.47 \addto\noextrasfinnish{\bbl@deactivate{"}}
The `umlaut' character should be positioned lower on all vowels in Finnish
texts.
46.48 \addto\extrasfinnish{\umlautlow\umlautelow}
46.49 \addto\noextrasfinnish{\umlauthigh}
First we dene access to the low opening double quote and guillemets for
quotations,
46.50 \declare@shorthand{finnish}{"`}{%
46.51 \textormath{\quotedblbase}{\mbox{\quotedblbase}}}
46.52 \declare@shorthand{finnish}{"'}{%

46.53 \textormath{\textquotedblright}{\mbox{\textquotedblright}}}
46.54 \declare@shorthand{finnish}{"<}{%

46.55 \textormath{\guillemotleft}{\mbox{\guillemotleft}}}
46.56 \declare@shorthand{finnish}{">}{%

46.57 \textormath{\guillemotright}{\mbox{\guillemotright}}}
then we dene two shorthands to be able to specify hyphenation breakpoints that
behave a little dierent from \-.
46.58 \declare@shorthand{finnish}{"-}{\nobreak-\bbl@allowhyphens}
46.59 \declare@shorthand{finnish}{""}{\hskip\z@skip}
46.60 \declare@shorthand{finnish}{"=}{\hbox{-}\bbl@allowhyphens}

And we want to have a shorthand for disabling a ligature.


46.61 \declare@shorthand{finnish}{"|}{%
46.62 \textormath{\discretionary{-}{}{\kern.03em}}{}}

\- All that is left now is the redenition of \-. The new version of \- should in-
dicate an extra hyphenation position, while allowing other hyphenation positions
to be generated automatically. The standard behaviour of TEX in this respect is
very unfortunate for languages such as Dutch, Finnish and German, where long
compound words are quite normal and all one needs is a means to indicate an
extra hyphenation position on top of the ones that TEX can generate from the
hyphenation patterns.
46.63 \addto\extrasfinnish{\babel@save\-}
46.64 \addto\extrasfinnish{\def\-{\bbl@allowhyphens
46.65 \discretionary{-}{}{}\bbl@allowhyphens}}

\finishhyphenmins The nnish hyphenation patterns can be used with \lefthyphenmin set to 2 and
\righthyphenmin set to 2.
46.66 \providehyphenmins{\CurrentOption}{\tw@\tw@}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
46.67 \ldf@finish{finnish}
46.68 h/codei

262
47 The Hungarian language
The le option magyar.dtx denes all the language denition macros for the
Hungarian language.
The babel support for the Hungarian language until le version 1.3i was essen-
tially changing the English document elements to Hungarian ones, but because of
the dierences between these too languages this was actually unusable (`Part I'
was transferred to `Rész I' which is not usable instead of `I. rész'). To enhance the
typesetting facilities for Hungarian the following should be considered:
• In Hungarian documents there is a period after the part, section, subsection
etc. numbers.
• In the part, chapter, appendix name the number (or letter) goes before the
name, so `Part I' translates to `I. rész'.
• The same is true with captions (`Table 2.1' goes to `2.1. táblázat').
• There is a period after the caption name instead of a colon. (`Table 2.1:'
goes to `2.1. táblázat.')
• There is a period at the end of the title in a run-in head (when afterskip<0
in \@startsection).
• Special hyphenation rules must be applied for the so-called long double con-
sonants (ccs, ssz,. . . ).
• The opening quotation mark is like the German one (the closing is the same
as in English).
• In Hungarian gure, table, etc. referencing a denite article is also incor-
porated. The Hungarian denite articles behave like the English indenite
ones (`a/an'). `a' is used for words beginning with a consonant and `az' goes
for a vowel. Since some numbers begin with a vowel some others with a
consonant some commands should be provided for automatic denite article
generation.
Until le version 1.3i55 the special typesetting rules of the Hungarian language
mentioned above were not taken into consideration. This version (v1.4j)56 enables
babel to typeset `good-looking' Hungarian texts.
\ontoday The \ontoday command works like \today but produces a slightly dierent
date format used in expressions such as `on February 10th'.
\Az The commands \Az#1 and \az#1 write the correct denite article for the ar-
gument and the argument itself (separated with a ~). The star-forms (\Az* and
\az*) produce the article only.
\Azr \Azr#1 and \azr#1 treat the argument as a label so expand it then write the
denite article for \r@#1, a non-breakable space then the label expansion. The
star-forms do not print the label expansion. \Azr(#1 and \azr(#1 are used for
equation referencing with the syntax \azr(label ).
\Aref There are two aliases \Aref and \aref for \Azr and \azr, respectively.
55 That le was last revised on 1996/12/23 with a contribution by the next authors: Attila
Koppányi (attila@cernvm.cern.ch), Árpád Bíró (JZP1104@HUSZEG11.bitnet), István Hamecz
(hami@ursus.bke.hu) and Dezs® Horváth (horvath@pisa.infn.it).
56 It was written by József Bérces (jozsi@docs4.mht.bme.hu) with some help from Ferenc Wettl
(wettl@math.bme.hu) and an idea from David Carlisle (david@dcarlisle.demon.co.uk).

263
shortcut explanation example
`` same as \glqq in babel, or ``id\'ezet''−→idézet''
\quotedblbase in T1 (open-
ing quotation mark, like )
`c, `C ccs is hyphenated as cs-cs lo`ccsan−→locs-csan
`d, `D ddz is hyphenated as dz-dz e`ddz\"unk−→edz-dzünk
`g, `G ggy is hyphenated as gy-gy po`ggy\'asz−→pogy-gyász
`l, `L lly is hyphenated as ly-ly Kod\'a`llyal−→Kodály-lyal
`n, `N nny is hyphenated as ny-ny me`nnyei−→meny-nyei
`s, `S ssz is hyphenated as sz-sz vi`ssza−→visz-sza
`t, `T tty is hyphenated as ty-ty po`ttyan−→poty-tyan
`z, `Z zzs is hyphenated as zs-zs ri`zzsel−→rizs-zsel

Table 22: The shortcuts dened in magyar.ldf

During the preparation of a document it is not known in general, if the code


`a~\ref{label }' or the code `az~\ref{label }' is the grammatically correct one.
Writing `\aref{label }' instead of the previous ones solves the problem.
\Azp \Azp#1 and \azp#1 also treat the argument as a label but use the label's page
for denite article determination. There are star-forms giving only the denite
article without the page number.
\Apageref There are aliases \Apageref and \apageref for \Azp and \azp, respec-
tively. The code \apageref{label } is equivalent either to a~\pageref{label } or
to az~\pageref{label }.
\Azc \Azc and \azc work like the \cite command but (of course) they insert the
denite article. There can be several comma separated cite labels and in that
case the denite article is given for the rst one. They accept \cite's optional
argument. There are star-forms giving the denite article only.
\Acite There are aliases \Acite and \acite for \Azc and \azc, respectively.
For this language the character ` is made active. Table 22 shows the shortcuts.
The main reason for the activation of the ` character is to handle the special
hyphenation of the long double consonants.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
47.1 h∗codei
47.2 \LdfInit{magyar}{caption\CurrentOption}
When this le is read as an option, i.e. by the \usepackage command, magyar
will be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@magyar or \l@hungarian to see whether we have to
do something here.
47.3 \ifx\l@magyar\@undefined
47.4 \ifx\l@hungarian\@undefined
47.5 \@nopatterns{Magyar}
47.6 \adddialect\l@magyar0
47.7 \else
47.8 \let\l@magyar\l@hungarian
47.9 \fi
47.10 \fi

264
The statement above makes sure that \l@magyar is always dened; if \l@hungarian
is still undened we make it equal to \l@magyar.
47.11 \ifx\l@hungarian\@undefined
47.12 \let\l@hungarian\l@magyar
47.13 \fi

The next step consists of dening commands to switch to (and from) the Hun-
garian language.

\captionsmagyar The macro \captionsmagyar denes all strings used in the four standard docu-
ment classes provided with LATEX.
47.14 \@namedef{captions\CurrentOption}{%
47.15 \def\prefacename{El\H osz\'o}%
For the list of references at the end of an article we have a choice between two
words, `Referenciák' (a Hungarian version of the English word) and `Hivatkozások'.
The latter seems to be in more widespread use.
47.16 \def\refname{Hivatkoz\'asok}%
If you have a document with a summary instead of an abstract you might want
to replace the word `Kivonat' with `Összefoglaló'.
47.17 \def\abstractname{Kivonat}%
The Hungarian version of `Bibliography' is `Bibliográa', but a more natural word
to use is `Irodalomjegyzék'.
47.18 \def\bibname{Irodalomjegyz\'ek}%
47.19 \def\chaptername{fejezet}%
47.20 \def\appendixname{F\"uggel\'ek}%
47.21 \def\contentsname{Tartalomjegyz\'ek}%
47.22 \def\listfigurename{\'Abr\'ak jegyz\'eke}%
47.23 \def\listtablename{T\'abl\'azatok jegyz\'eke}%
47.24 \def\indexname{T\'argymutat\'o}%
47.25 \def\figurename{\'abra}%
47.26 \def\tablename{t\'abl\'azat}%
47.27 \def\partname{r\'esz}%
47.28 \def\enclname{Mell\'eklet}%
47.29 \def\ccname{K\"orlev\'el--c\'\i mzettek}%
47.30 \def\headtoname{C\'\i mzett}%
47.31 \def\pagename{oldal}%
47.32 \def\seename{l\'asd}%
47.33 \def\alsoname{l\'asd m\'eg}%
Besides the Hungarian word for Proof, `Bizonyítás' we can also name Corollary
(Következmény), Theorem (Tétel) and Lemma (Lemma).
47.34 \def\proofname{Bizony\'\i t\'as}%
47.35 \def\glossaryname{Sz\'ojegyz\'ek}%
47.36 }%

\datemagyar The macro \datemagyar redenes the command \today to produce Hungarian
dates.
47.37 \@namedef{date\CurrentOption}{%
47.38 \def\today{%
47.39 \number\year.\nobreakspace\ifcase\month\or
47.40 janu\'ar\or febru\'ar\or m\'arcius\or
47.41 \'aprilis\or m\'ajus\or j\'unius\or

265
47.42 j\'ulius\or augusztus\or szeptember\or
47.43 okt\'ober\or november\or december\fi
47.44 \space\number\day.}}

\ondatemagyar The macro \ondatemagyar produces Hungarian dates which have the meaning `on
this day '. It does not redene the command \today.
47.45 \@namedef{ondate\CurrentOption}{%
47.46 \number\year.\nobreakspace\ifcase\month\or
47.47 janu\'ar\or febru\'ar\or m\'arcius\or
47.48 \'aprilis\or m\'ajus\or j\'unius\or
47.49 j\'ulius\or augusztus\or szeptember\or
47.50 okt\'ober\or november\or december\fi
47.51 \space\ifcase\day\or
47.52 1-j\'en\or 2-\'an\or 3-\'an\or 4-\'en\or 5-\'en\or
47.53 6-\'an\or 7-\'en\or 8-\'an\or 9-\'en\or 10-\'en\or
47.54 11-\'en\or 12-\'en\or 13-\'an\or 14-\'en\or 15-\'en\or
47.55 16-\'an\or 17-\'en\or 18-\'an\or 19-\'en\or 20-\'an\or
47.56 21-\'en\or 22-\'en\or 23-\'an\or 24-\'en\or 25-\'en\or
47.57 26-\'an\or 27-\'en\or 28-\'an\or 29-\'en\or 30-\'an\or
47.58 31-\'en\fi}

\extrasmagyar The macro \extrasmagyar will perform all the extra denitions needed for the
\noextrasmagyar Hungarian language. The macro \noextrasmagyar is used to cancel the actions
of \extrasmagyar.
47.59 \@namedef{extras\CurrentOption}{%
47.60 \expandafter\let\expandafter\ontoday
47.61 \csname ondate\CurrentOption\endcsname}
47.62 \@namedef{noextras\CurrentOption}{\let\ontoday\@undefined}

Now we redene some commands included into latex.ltx. The original form
of a command is always saved with \babel@save and the changes are added to
\extrasmagyar. This ensures that the Hungarian version of a macro is alive only
if the Hungarian language is active.

\fnum@figure In gure and table captions the order of the gure/table number and \figurename
\fnum@table /\tablename must be changed. To achieve this \fnum@figure and \fnum@table
are redened and added to \extrasmagyar.
47.63 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.64 \babel@save\fnum@figure
47.65 \def\fnum@figure{\thefigure.\nobreakspace\figurename}}
47.66 \expandafter\addto\csname extras\CurrentOption\endcsname{%

47.67 \babel@save\fnum@table
47.68 \def\fnum@table{\thetable.\nobreakspace\tablename}}

\@makecaption The colon in a gure/table caption must be replaced by a dot by redening


\@makecaption.
47.69 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.70 \babel@save\@makecaption
47.71 \def\@makecaption#1#2{%
47.72 \vskip\abovecaptionskip
47.73 \sbox\@tempboxa{#1. #2}%
47.74 \ifdim \wd\@tempboxa >\hsize
47.75 {#1. #2\csname par\endcsname}

266
47.76 \else
47.77 \global \@minipagefalse
47.78 \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
47.79 \fi
47.80 \vskip\belowcaptionskip}}

\@caption There should be a dot after the gure/table number in lof/lot, so \@caption is
redened.
47.81 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.82 \babel@save\@caption
47.83 \long\def\@caption#1[#2]#3{%
47.84 \csname par\endcsname
47.85 \addcontentsline{\csname ext@#1\endcsname}{#1}%
47.86 {\protect\numberline{\csname the#1\endcsname.}{\ignorespaces #2}}%
47.87 \begingroup
47.88 \@parboxrestore
47.89 \if@minipage
47.90 \@setminipage
47.91 \fi
47.92 \normalsize
47.93 \@makecaption{\csname fnum@#1\endcsname}%
47.94 {\ignorespaces #3}\csname par\endcsname
47.95 \endgroup}}

\@seccntformat In order to have a dot after the section number \@seccntformat is redened.
47.96 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.97 \babel@save\@seccntformat
47.98 \def\@seccntformat#1{\csname the#1\endcsname.\quad}}

\@sect Alas, \@sect must also be redened to have that dot in toc too. On the other
hand, we include a dot after a run-in head.
47.99 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.100 \babel@save\@sect
47.101 \def\@sect#1#2#3#4#5#6[#7]#8{%
47.102 \ifnum #2>\c@secnumdepth
47.103 \let\@svsec\@empty
47.104 \else
47.105 \refstepcounter{#1}%
47.106 \protected@edef\@svsec{\@seccntformat{#1}\relax}%
47.107 \fi
47.108 \@tempskipa #5\relax
47.109 \ifdim \@tempskipa>\z@
47.110 \begingroup
47.111 #6{%
47.112 \@hangfrom{\hskip #3\relax\@svsec}%
47.113 \interlinepenalty \@M #8\@@par}%
47.114 \endgroup
47.115 \csname #1mark\endcsname{#7}%
47.116 \addcontentsline{toc}{#1}{%
47.117 \ifnum #2>\c@secnumdepth \else
47.118 \protect\numberline{\csname the#1\endcsname.}%
47.119 \fi
47.120 #7}%
47.121 \else

267
47.122 \def\@svsechd{%
47.123 #6{\hskip #3\relax
47.124 \@svsec #8.}%
47.125 \csname #1mark\endcsname{#7}%
47.126 \addcontentsline{toc}{#1}{%
47.127 \ifnum #2>\c@secnumdepth \else
47.128 \protect\numberline{\csname the#1\endcsname.}%
47.129 \fi
47.130 #7}}%
47.131 \fi
47.132 \@xsect{#5}}}

\@ssect In order to have that dot after a run-in head when the star form of the sectioning
commands is used, we have to redene \@ssect.
47.133 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.134 \babel@save\@ssect
47.135 \def\@ssect#1#2#3#4#5{%
47.136 \@tempskipa #3\relax
47.137 \ifdim \@tempskipa>\z@
47.138 \begingroup
47.139 #4{%
47.140 \@hangfrom{\hskip #1}%
47.141 \interlinepenalty \@M #5\@@par}%
47.142 \endgroup
47.143 \else
47.144 \def\@svsechd{#4{\hskip #1\relax #5.}}%
47.145 \fi
47.146 \@xsect{#3}}}

\@begintheorem Order changing and dot insertion in theorem by redening \@begintheorem and
\@opargbegintheorem \@opargbegintheorem.
47.147 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.148 \babel@save\@begintheorem
47.149 \def\@begintheorem#1#2{\trivlist
47.150 \item[\hskip \labelsep{\bfseries #2.\ #1.}]\itshape}%
47.151 \babel@save\@opargbegintheorem
47.152 \def\@opargbegintheorem#1#2#3{\trivlist
47.153 \item[\hskip \labelsep{\bfseries #2.\ #1\ (#3).}]\itshape}}

The next step is to redene some macros included into the class les. It is
determined which class le is loaded then the original form of the macro is saved
and the changes are added to \extrasmagyar.
First we check if the book.cls is loaded.
47.154 \@ifclassloaded{book}{%

\ps@headings The look of the headings is changed: we have to insert some dots and change the
order of chapter number and \chaptername.
47.155 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.156 \babel@save\ps@headings}
47.157 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.158 \if@twoside
47.159 \def\ps@headings{%
47.160 \let\@oddfoot\@empty\let\@evenfoot\@empty

268
47.161 \def\@evenhead{\thepage\hfil\slshape\leftmark}%
47.162 \def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
47.163 \let\@mkboth\markboth
47.164 \def\chaptermark##1{%
47.165 \markboth {\MakeUppercase{%
47.166 \ifnum \c@secnumdepth >\m@ne
47.167 \if@mainmatter
47.168 \thechapter. \@chapapp. \ %
47.169 \fi
47.170 \fi
47.171 ##1}}{}}%
47.172 \def\sectionmark##1{%
47.173 \markright {\MakeUppercase{%
47.174 \ifnum \c@secnumdepth >\z@
47.175 \thesection. \ %
47.176 \fi
47.177 ##1}}}}%
47.178 \else
47.179 \def\ps@headings{%
47.180 \let\@oddfoot\@empty
47.181 \def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
47.182 \let\@mkboth\markboth
47.183 \def\chaptermark##1{%
47.184 \markright {\MakeUppercase{%
47.185 \ifnum \c@secnumdepth >\m@ne
47.186 \if@mainmatter
47.187 \thechapter. \@chapapp. \ %
47.188 \fi
47.189 \fi
47.190 ##1}}}}%
47.191 \fi}

\@part At the beginning of a part we need eg. `I. rész' instead of `Part I' (in toc too). To
achieve this \@part is redened.
47.192 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.193 \babel@save\@part
47.194 \def\@part[#1]#2{%
47.195 \ifnum \c@secnumdepth >-2\relax
47.196 \refstepcounter{part}%
47.197 \addcontentsline{toc}{part}{\thepart.\hspace{1em}#1}%
47.198 \else
47.199 \addcontentsline{toc}{part}{#1}%
47.200 \fi
47.201 \markboth{}{}%
47.202 {\centering
47.203 \interlinepenalty \@M
47.204 \normalfont
47.205 \ifnum \c@secnumdepth >-2\relax
47.206 \huge\bfseries \thepart.\nobreakspace\partname
47.207 \csname par\endcsname
47.208 \vskip 20\p@
47.209 \fi
47.210 \Huge \bfseries #2\csname par\endcsname}%
47.211 \@endpart}}

269
\@chapter The same changes are made to chapter. First the screen typeout and the toc are
changed by redening \@chapter.
47.212 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.213 \babel@save\@chapter
47.214 \def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
47.215 \if@mainmatter
47.216 \refstepcounter{chapter}%
47.217 \typeout{\thechapter.\space\@chapapp.}%
47.218 \addcontentsline{toc}{chapter}%
47.219 {\protect\numberline{\thechapter.}#1}%
47.220 \else
47.221 \addcontentsline{toc}{chapter}{#1}%
47.222 \fi
47.223 \else
47.224 \addcontentsline{toc}{chapter}{#1}%
47.225 \fi
47.226 \chaptermark{#1}%
47.227 \addtocontents{lof}{\protect\addvspace{10\p@}}%
47.228 \addtocontents{lot}{\protect\addvspace{10\p@}}%
47.229 \if@twocolumn
47.230 \@topnewpage[\@makechapterhead{#2}]%
47.231 \else
47.232 \@makechapterhead{#2}%
47.233 \@afterheading
47.234 \fi}}

\@makechapterhead Then the look of the chapter-start is modied by redening \@makechapterhead.


47.235 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.236 \babel@save\@makechapterhead
47.237 \def\@makechapterhead#1{%
47.238 \vspace*{50\p@}%
47.239 {\parindent \z@ \raggedright \normalfont
47.240 \ifnum \c@secnumdepth >\m@ne
47.241 \if@mainmatter
47.242 \huge\bfseries \thechapter.\nobreakspace\@chapapp{}
47.243 \csname par\endcsname\nobreak
47.244 \vskip 20\p@
47.245 \fi
47.246 \fi
47.247 \interlinepenalty\@M
47.248 \Huge \bfseries #1\csname par\endcsname\nobreak
47.249 \vskip 40\p@
47.250 }}}%

This the end of the book class modication.


47.251 }{}
Now we check if report.cls is loaded.
47.252 \@ifclassloaded{report}{%

\ps@headings First the headings are modied just in case of the book class.
47.253 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.254 \babel@save\ps@headings}
47.255 \expandafter\addto\csname extras\CurrentOption\endcsname{%

270
47.256 \if@twoside
47.257 \def\ps@headings{%
47.258 \let\@oddfoot\@empty\let\@evenfoot\@empty
47.259 \def\@evenhead{\thepage\hfil\slshape\leftmark}%
47.260 \def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
47.261 \let\@mkboth\markboth
47.262 \def\chaptermark##1{%
47.263 \markboth {\MakeUppercase{%
47.264 \ifnum \c@secnumdepth >\m@ne
47.265 \thechapter. \@chapapp. \ %
47.266 \fi
47.267 ##1}}{}}%
47.268 \def\sectionmark##1{%
47.269 \markright {\MakeUppercase{%
47.270 \ifnum \c@secnumdepth >\z@
47.271 \thesection. \ %
47.272 \fi
47.273 ##1}}}}%
47.274 \else
47.275 \def\ps@headings{%
47.276 \let\@oddfoot\@empty
47.277 \def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
47.278 \let\@mkboth\markboth
47.279 \def\chaptermark##1{%
47.280 \markright {\MakeUppercase{%
47.281 \ifnum \c@secnumdepth >\m@ne
47.282 \thechapter. \@chapapp. \ %
47.283 \fi
47.284 ##1}}}}%
47.285 \fi}

\@chapter Chapter-start modication with \@chapter


47.286 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.287 \babel@save\@chapter
47.288 \def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
47.289 \refstepcounter{chapter}%
47.290 \typeout{\thechapter.\space\@chapapp.}%
47.291 \addcontentsline{toc}{chapter}%
47.292 {\protect\numberline{\thechapter.}#1}%
47.293 \else
47.294 \addcontentsline{toc}{chapter}{#1}%
47.295 \fi
47.296 \chaptermark{#1}%
47.297 \addtocontents{lof}{\protect\addvspace{10\p@}}%
47.298 \addtocontents{lot}{\protect\addvspace{10\p@}}%
47.299 \if@twocolumn
47.300 \@topnewpage[\@makechapterhead{#2}]%
47.301 \else
47.302 \@makechapterhead{#2}%
47.303 \@afterheading
47.304 \fi}}

\@makechapterhead and \@makechapterhead.


47.305 \expandafter\addto\csname extras\CurrentOption\endcsname{%

271
47.306 \babel@save\@makechapterhead
47.307 \def\@makechapterhead#1{%
47.308 \vspace*{50\p@}%
47.309 {\parindent \z@ \raggedright \normalfont
47.310 \ifnum \c@secnumdepth >\m@ne
47.311 \huge\bfseries \thechapter.\nobreakspace\@chapapp{}
47.312 \csname par\endcsname\nobreak
47.313 \vskip 20\p@
47.314 \fi
47.315 \interlinepenalty\@M
47.316 \Huge \bfseries #1\csname par\endcsname\nobreak
47.317 \vskip 40\p@
47.318 }}}%

End of report class modication.


47.319 }{}
Checking if article.cls is loaded.
47.320 \@ifclassloaded{article}{%

\ps@headings Changing headings by redening \ps@headings.


47.321 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.322 \babel@save\ps@headings}
47.323 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.324 \if@twoside
47.325 \def\ps@headings{%
47.326 \let\@oddfoot\@empty\let\@evenfoot\@empty
47.327 \def\@evenhead{\thepage\hfil\slshape\leftmark}%
47.328 \def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
47.329 \let\@mkboth\markboth
47.330 \def\sectionmark##1{%
47.331 \markboth {\MakeUppercase{%
47.332 \ifnum \c@secnumdepth >\z@
47.333 \thesection.\quad
47.334 \fi
47.335 ##1}}{}}%
47.336 \def\subsectionmark##1{%
47.337 \markright {%
47.338 \ifnum \c@secnumdepth >\@ne
47.339 \thesubsection.\quad
47.340 \fi
47.341 ##1}}}%
47.342 \else
47.343 \def\ps@headings{%
47.344 \let\@oddfoot\@empty
47.345 \def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
47.346 \let\@mkboth\markboth
47.347 \def\sectionmark##1{%
47.348 \markright {\MakeUppercase{%
47.349 \ifnum \c@secnumdepth >\m@ne
47.350 \thesection.\quad
47.351 \fi
47.352 ##1}}}}%
47.353 \fi}%

272
No more necessary changes specic to the article class.
47.354 }{}
And now this is the turn of letter.cls.
47.355 \@ifclassloaded{letter}{%

\ps@headings In the headings the page number must be followed by a dot and then \pagename.
47.356 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.357 \babel@save\ps@headings}
47.358 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.359 \if@twoside
47.360 \def\ps@headings{%
47.361 \let\@oddfoot\@empty\let\@evenfoot\@empty
47.362 \def\@oddhead{\slshape\headtoname{:} \ignorespaces\toname
47.363 \hfil \@date
47.364 \hfil \thepage.\nobreakspace\pagename}%
47.365 \let\@evenhead\@oddhead}
47.366 \else
47.367 \def\ps@headings{%
47.368 \let\@oddfoot\@empty
47.369 \def\@oddhead{\slshape\headtoname{:} \ignorespaces\toname
47.370 \hfil \@date
47.371 \hfil \thepage.\nobreakspace\pagename}}
47.372 \fi}%

End of letter class.


47.373 }{}
After making the changes to the LATEX macros we dene some new ones to
handle the problem with denite articles.
\az \az is a user-level command which decides if the next character is a star. \@az is
called for \az* and \az@ for \az.
47.374 \def\az{a\@ifstar{\@az}{\az@}}

\Az \Az is used at the beginning of a sentence. Otherwise it behaves the same as \az.
47.375 \def\Az{A\@ifstar{\@az}{\az@}}

\az@ \az@ is called if there is no star after \az or \Az. It calls \@az and writes #1
separating with a non-breakable space.
47.376 \def\az@#1{\@az{#1}\nobreakspace#1}

\@az This macro calls \hun@tempadef to remove the accents from the argument then
calls \@@az that determines if a `z' should be written after a/A (written by
\az/\Az).
47.377 \def\@az#1{%
47.378 \hun@tempadef{relax}{relax}{#1}%
47.379 \edef\@tempb{\noexpand\@@az\@tempa\hbox!}%
47.380 \@tempb}

\hun@tempadef The macro \hun@tempadef has three tasks:


• Accent removal. Accented letters confuse \@@az, the main denite article
determinator macro, so they must be changed to their non-accented coun-
terparts. Special letters must also be changed, eg. ÷ → o.

273
• Labels must be expanded.
• To handle Roman numerals correctly, commands starting with \hun@ are
dened for labels containing Roman numbers with the Roman numerals
replaced by their Arabic representation. This macro can check if there is a
\hun@ command.
There are three arguments:
1. The primary command that should be expanded if it exists. This is usually
the \hun@ command for a label.
2. The secondary command which is used if the rst one is \relax. This is
usually the original LATEX command for a label.
3. This is used if the rst two is \relax. For this one no expansion is carried
out but the accents are still removed and special letters are changed.

47.381 \def\hun@tempadef#1#2#3{%
47.382 \begingroup
47.383 \def\@safe@activesfalse{}%
47.384 \def\setbox ##1{}% to get rid of accents and special letters
47.385 \def\hbox ##1{}%
47.386 \def\accent ##1 ##2{##2}%
47.387 \def\add@accent ##1##2{##2}%
47.388 \def\@text@composite@x ##1##2{##2}%
47.389 \def\i{i}\def\j{j}%
47.390 \def\ae{a}\def\AE{A}\def\oe{o}\def\OE{O}%
47.391 \def\ss{s}\def\L{L}%
47.392 \def\d{}\def\b{}\def\c{}\def\t{}%
47.393 \expandafter\ifx\csname #1\endcsname\relax
47.394 \expandafter\ifx\csname #2\endcsname\relax
47.395 \xdef\@tempa{#3}%
47.396 \else
47.397 \xdef\@tempa{\csname #2\endcsname}%
47.398 \fi
47.399 \else
47.400 \xdef\@tempa{\csname #1\endcsname}%
47.401 \fi
47.402 \endgroup}

The following macros are used to determine the denite article for a label's
expansion.
\aref \aref is an alias for \azr.
47.403 \def\aref{\azr}

\Aref \Aref is an alias for \Azr.


47.404 \def\Aref{\Azr}

\azr \azr calls \@azr if the next character is a star, otherwise it calls \azr@.
47.405 \def\azr{a\@ifstar{\@azr}{\azr@}}

\Azr \Azr is the same as \azr except that it writes `A' instead of `a'.
47.406 \def\Azr{A\@ifstar{\@azr}{\azr@}}

274
\azr@ \azr@ decides if the next character is ( and in that case it calls \azr@@@ which
writes an extra ( for equation referencing. Otherwise \azr@@ is called.
47.407 \def\azr@{\@ifnextchar ({\azr@@@}{\azr@@}}

\azr@@ Calls \@azr then writes the label's expansion preceded by a non-breakable space.
47.408 \def\azr@@#1{\@azr{#1}\nobreakspace\ref{#1}}

\azr@@@ Same as \azr@@ but inserts a ( between the non-breakable space and the label
expansion.
47.409 \def\azr@@@(#1{\@azr{#1}\nobreakspace(\ref{#1}}

\@azr Calls \hun@tempadef to choose between the label's \hun@ or original LATEX com-
mand and to expand it with accent removal and special letter substitution. Then
calls \@@az, the core macro of denite article handling.
47.410 \def\@azr#1{%
47.411 \hun@tempadef{hun@r@#1}{r@#1}{}%
47.412 \ifx\@tempa\empty
47.413 \else
47.414 \edef\@tempb{\noexpand\@@az\expandafter\@firstoftwo\@tempa\hbox!}%
47.415 \@tempb
47.416 \fi
47.417 }

The following commands are used to generate the denite article for the page
number of a label.
\apageref \apageref is an alias for \azp.
47.418 \def\apageref{\azp}

\Apageref \Apageref is an alias for \Azp.


47.419 \def\Apageref{\Azp}

\azp Checks if the next character is * and calls \@azp or \azp@.


47.420 \def\azp{a\@ifstar{\@azp}{\azp@}}

\Azp Same as \azp except that it writes `A' instead of `a'.


47.421 \def\Azp{A\@ifstar{\@azp}{\azp@}}

\azp@ Calls \@azp then writes the label's page preceded by a non-breakable space.
47.422 \def\azp@#1{\@azp{#1}\nobreakspace\pageref{#1}}

\@azp Calls \hun@tempadef then takes the label's page and passes it to \@@az.
47.423 \def\@azp#1{%
47.424 \hun@tempadef{hun@r@#1}{r@#1}{}%
47.425 \ifx\@tempa\empty
47.426 \else
47.427 \edef\@tempb{\noexpand\@@az\expandafter\@secondoftwo\@tempa\hbox!}%
47.428 \@tempb
47.429 \fi
47.430 }

The following macros are used to give the denite article to citations.

275
\acite This is an alias for \azc.
47.431 \def\acite{\azc}

\Acite This is an alias for \Azc.


47.432 \def\Acite{\Azc}

\azc Checks if the next character is a star and calls \@azc or \azc@.
47.433 \def\azc{a\@ifstar{\@azc}{\azc@}}

\Azc Same as \azc but used at the beginning of sentences.


47.434 \def\Azc{A\@ifstar{\@azc}{\azc@}}

\azc@ If there is no star we accept an optional argument, just like the \cite command.
47.435 \def\azc@{\@ifnextchar [{\azc@@}{\azc@@[]}}

\azc@@ First calls \@azc then \cite.


47.436 \def\azc@@[#1]#2{%
47.437 \@azc{#2}\nobreakspace\def\@tempa{#1}%
47.438 \ifx\@tempa\@empty\cite{#2}\else\cite[#1]{#2}\fi}

\@azc This is an auxiliary macro to get the rst cite label from a comma-separated list.
47.439 \def\@azc#1{\@@azc#1,\hbox!}

\@@azc This one uses only the rst argument, that is the rst element of the comma-
separated list of cite labels. Calls \hun@tempadef to expand the cite label with
accent removal and special letter replacement. Then \@@az, the core macro, is
called.
47.440 \def\@@azc#1,#2\hbox#3!{%
47.441 \hun@tempadef{hun@b@#1}{b@#1}{}%
47.442 \ifx\@tempa\empty
47.443 \else
47.444 \edef\@tempb{\noexpand\@@az\@tempa\hbox!}%
47.445 \@tempb
47.446 \fi}

\hun@number@lehgth This macro is used to count the number of digits in its argument until a non-digit
character is found or the end of the argument is reached. It must be called as
\hun@number@lehgtharg \hbox\hbox! and \count@ must be zeroed. It is called
by \@@az.
47.447 \def\hun@number@lehgth#1#2\hbox#3!{%
47.448 \ifcat\noexpand#11%
47.449 \ifnum\expandafter`\csname#1\endcsname>47
47.450 \ifnum\expandafter`\csname#1\endcsname<58
47.451 \advance\count@ by \@ne
47.452 \hun@number@lehgth#2\hbox\hbox!\fi\fi\fi}

\hun@alph@lehgth This is used to count the number of letters until a non-letter is found or the end of
the argument is reached. It must be called as \hun@alph@lehgtharg \hbox\hbox!
and \count@ must be set to zero. It is called by \@@az@string.
47.453 \def\hun@alph@lehgth#1#2\hbox#3!{%
47.454 \ifcat\noexpand#1A%
47.455 \advance\count@ by \@ne
47.456 \hun@alph@lehgth#2\hbox\hbox!\fi}

276
\@@az@string This macro is called by \@@az if the argument begins with a letter. The task of
\@@az@string is to determine if the argument starts with a vowel and in that
case \let\@tempa\@tempb. After checking if the rst letter is A, E, I, O, or U,
\hun@alph@lehgth is called to determine the length of the argument. If it gives
1 (that is the argument is a single-letter one or the second character is not letter)
then the letters L, M, N, R, S, X, and Y are also considered as a vowel since their
Hungarian pronounced name starts with a vowel.
47.457 \def\@@az@string#1#2{%
47.458 \ifx#1A%
47.459 \let\@tempa\@tempb
47.460 \else\ifx#1E%
47.461 \let\@tempa\@tempb
47.462 \else\ifx#1I%
47.463 \let\@tempa\@tempb
47.464 \else\ifx#1O%
47.465 \let\@tempa\@tempb
47.466 \else\ifx#1U%
47.467 \let\@tempa\@tempb
47.468 \fi\fi\fi\fi\fi
47.469 \ifx\@tempa\@tempb
47.470 \else
47.471 \count@\z@
47.472 \hun@alph@lehgth#1#2\hbox\hbox!%
47.473 \ifnum\count@=\@ne
47.474 \ifx#1F%
47.475 \let\@tempa\@tempb
47.476 \else\ifx#1L%
47.477 \let\@tempa\@tempb
47.478 \else\ifx#1M%
47.479 \let\@tempa\@tempb
47.480 \else\ifx#1N%
47.481 \let\@tempa\@tempb
47.482 \else\ifx#1R%
47.483 \let\@tempa\@tempb
47.484 \else\ifx#1S%
47.485 \let\@tempa\@tempb
47.486 \else\ifx#1X%
47.487 \let\@tempa\@tempb
47.488 \else\ifx#1Y%
47.489 \let\@tempa\@tempb
47.490 \fi\fi\fi\fi\fi\fi\fi\fi
47.491 \fi
47.492 \fi}

\@@az This macro is the core of denite article handling. It determines if the argument
needs `az' or `a' denite article by setting \@tempa to `z' or \@empty. It sets
\@tempa to `z' if
• the rst character of the argument is 5; or
• the rst character of the argument is 1 and the length of the number
(mod 3) = 1 (oneegy, thousandezer, millionegymillió,. . . ); or
• the rst character of the argument is a, A, e, E, i, I, o, O, u, or U; or

277
• the rst character of the argument is l, L, m, M, n, N, r, R, s, S, x, X, y, or Y
and the length of the argument is 1 or the second character is a non-letter.

At the end it calls \@tempa, that is, it either typesets a `z' or nothing.
47.493 \def\@@az#1#2\hbox#3!{%
47.494 \let\@tempa\@empty
47.495 \def\@tempb{z}%
47.496 \uppercase{%
47.497 \ifx5#1%
47.498 \let\@tempa\@tempb
47.499 \else\ifx1#1%
47.500 \count@\@ne
47.501 \hun@number@lehgth#2\hbox\hbox!%
47.502 \loop
47.503 \ifnum\count@>\thr@@
47.504 \advance\count@-\thr@@
47.505 \repeat
47.506 \ifnum\count@=\@ne
47.507 \let\@tempa\@tempb
47.508 \fi
47.509 \else
47.510 \@@az@string{#1}{#2}%
47.511 \fi\fi
47.512 }%
47.513 \@tempa}

\refstepcounter \refstepcounter must be redened in order to keep \@currentlabel unex-


panded. This is necessary to enable the \label command to write a \hunnewlabel
command to the aux le with the Roman numerals substituted by their Arabic
representations. Of course, the original denition of \refstepcounter is saved
and restored if the Hungarian language is switched o.
47.514 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.515 \babel@save\refstepcounter
47.516 \def\refstepcounter#1{\stepcounter{#1}%
47.517 \def\@currentlabel{\csname p@#1\endcsname\csname the#1\endcsname}}%
47.518 }

\label \label is redened to write another line into the aux le: \hunnewlabel{ }{ }
where the Roman numerals are replaced their Arabic representations. The original
denition of \label is saved into \old@label and it is also called by \label. On
leaving the Hungarian typesetting mode \label's original is restored since it is
added to \noextrasmagyar.
47.519 \expandafter\addto\csname extras\CurrentOption\endcsname{%
47.520 \let\old@label\label
47.521 \def\label#1{\@bsphack
47.522 \old@label{#1}%
47.523 \begingroup
47.524 \let\romannumeral\number
47.525 \def\@roman##1{\number ##1}%
47.526 \def\@Roman##1{\number ##1}%
47.527 {\toks0={\noexpand\noexpand\noexpand\number}%
47.528 \def\number##1{\the\toks0 ##1}\xdef\tempb@{\thepage}}%
47.529 \edef\@tempa##1{\noexpand\protected@write\@auxout{}%

278
47.530 {\noexpand\string\noexpand\hunnewlabel
47.531 {##1}{{\@currentlabel}{\tempb@}}}}%
47.532 \@tempa{#1}%
47.533 \endgroup
47.534 \@esphack}%
47.535 }
47.536 \expandafter\addto\csname noextras\CurrentOption\endcsname{%
47.537 \let\label\old@label
47.538 }

\hunnewlabel Finally, \hunnewlabel is dened. It checks if the label's expansion (#2) diers
from that one given in the \newlabel command. If yes (that is, the label con-
tains some Roman numerals), it denes the macro \hun@r@label, otherwise it does
nothing.
47.539 \def\hunnewlabel#1#2{%
47.540 \def\@tempa{#2}%
47.541 \expandafter\ifx\csname r@#1\endcsname\@tempa
47.542 \relax% \message{No need for def: #1}%
47.543 \else
47.544 \global\expandafter\let\csname hun@r@#1\endcsname\@tempa%
47.545 \fi
47.546 }

For Hungarian the ` character is made active.


47.547 \AtBeginDocument{%
47.548 \if@filesw\immediate\write\@auxout{\catcode096=12}\fi}
47.549 \initiate@active@char{`}

47.550 \expandafter\addto\csname extras\CurrentOption\endcsname{%

47.551 \languageshorthands{magyar}%
47.552 \bbl@activate{`}}
47.553 \expandafter\addto\csname noextras\CurrentOption\endcsname{%

47.554 \bbl@deactivate{`}}
The character sequence `` is declared as a shorthand in order to produce the
opening quotation sign appropriate for Hungarian.
47.555 \declare@shorthand{magyar}{``}{\glqq}
In Hungarian there are some long double consonants which must be hyphenated
specially. For all these long double consonants (except dzzs, that is extremely
very-very rare) a shortcut is dened.
47.556 \declare@shorthand{magyar}{`c}{\textormath{\bbl@disc{c}{cs}}{c}}
47.557 \declare@shorthand{magyar}{`C}{\textormath{\bbl@disc{C}{CS}}{C}}
47.558 \declare@shorthand{magyar}{`d}{\textormath{\bbl@disc{d}{dz}}{d}}

47.559 \declare@shorthand{magyar}{`D}{\textormath{\bbl@disc{D}{DZ}}{D}}

47.560 \declare@shorthand{magyar}{`g}{\textormath{\bbl@disc{g}{gy}}{g}}

47.561 \declare@shorthand{magyar}{`G}{\textormath{\bbl@disc{G}{GY}}{G}}

47.562 \declare@shorthand{magyar}{`l}{\textormath{\bbl@disc{l}{ly}}{l}}

47.563 \declare@shorthand{magyar}{`L}{\textormath{\bbl@disc{L}{LY}}{L}}

47.564 \declare@shorthand{magyar}{`n}{\textormath{\bbl@disc{n}{ny}}{n}}

47.565 \declare@shorthand{magyar}{`N}{\textormath{\bbl@disc{N}{NY}}{N}}

47.566 \declare@shorthand{magyar}{`s}{\textormath{\bbl@disc{s}{sz}}{s}}

47.567 \declare@shorthand{magyar}{`S}{\textormath{\bbl@disc{S}{SZ}}{S}}

47.568 \declare@shorthand{magyar}{`t}{\textormath{\bbl@disc{t}{ty}}{t}}

47.569 \declare@shorthand{magyar}{`T}{\textormath{\bbl@disc{T}{TY}}{T}}

279
47.570 \declare@shorthand{magyar}{`z}{\textormath{\bbl@disc{z}{zs}}{z}}
47.571 \declare@shorthand{magyar}{`Z}{\textormath{\bbl@disc{Z}{ZS}}{Z}}
The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
47.572 \ldf@finish\CurrentOption
47.573 h/codei

280
48 The Estonian language
The le estonian.dtx57 denes the language denition macro's for the Estonian
language.
This le was written as part of the TWGML project, and borrows heavily from
the babel German and Spanish language les germanb.ldf and spanish.ldf.
Estonian has the same umlauts as German (ä, ö, ü), but in addition to this,
we have also õ, and two recent characters ² and º, so we need at least two active
characters. We shall use " and ~ to type Estonian accents on ASCII keyboards
(in the 7-bit character world). Their use is given in table 23. These active accent

~o \~o, (and uppercase);


"a \"a, (and uppercase);
"o \"o, (and uppercase);
"u \"u, (and uppercase);
~s \v s, (and uppercase);
~z \v z, (and uppercase);
"| disable ligature at this position;
"- an explicit hyphen sign, allowing hyphenation in the
rest of the word;
\- like the old \-, but allowing hyphenation in the rest
of the word;
"` for Estonian low left double quotes (same as Ger-
man);
"' for Estonian right double quotes;
"< for French left double quotes (also rather popular)
"> for French right double quotes.

Table 23: The extra denitions made by estonian.ldf

characters behave according to their original denitions if not followed by one of


the characters indicated in that table; the original quote character can be typed
using the macro \dq.
We support also the T1 output encoding (and Cork-encoded text input). You
can choose the T1 encoding by the command \usepackage[T1]{fontenc}. This
package must be loaded before babel. As the standard Estonian hyphenation le
eehyph.tex is in the Cork encoding, choosing this encoding will give you better
hyphenation.
As mentioned in the Spanish style le, it may happen that some packages
fail (usually in a \message). In this case you should change the order of the
\usepackage declarations or the order of the style options in \documentclass.

48.1 Implementation
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
48.1 h∗codei
57 The le described in this section has version number v1.0h and was last revised on
2005/03/30. The original author is Enn Saar, (saar@aai.ee).

281
48.2 \LdfInit{estonian}\captionsestonian
If Estonian is not included in the format le (does not have hyphenation pat-
terns), we shall use English hyphenation.
48.3 \ifx\l@estonian\@undefined
48.4 \@nopatterns{Estonian}
48.5 \adddialect\l@estonian0
48.6 \fi

Now come the commands to switch to (and from) Estonian.


\captionsestonian The macro \captionsestonian denes all strings used in the four standard doc-
umentclasses provided with LATEX.
\addto\captionsestonian{%
48.7

48.8\def\prefacename{Sissejuhatus}%
48.9 \def\refname{Viited}%
48.10 \def\bibname{Kirjandus}%
48.11 \def\appendixname{Lisa}%
48.12 \def\contentsname{Sisukord}%
48.13 \def\listfigurename{Joonised}%
48.14 \def\listtablename{Tabelid}%
48.15 \def\indexname{Indeks}%
48.16 \def\figurename{Joonis}%
48.17 \def\tablename{Tabel}%
48.18 \def\partname{Osa}%
48.19 \def\enclname{Lisa(d)}%
48.20 \def\ccname{Koopia(d)}%
48.21 \def\headtoname{}%
48.22 \def\pagename{Lk.}%
48.23 \def\seename{vt.}%
48.24 \def\alsoname{vt. ka}%
48.25 \def\proofname{Korrektuur}%
48.26 \def\glossaryname{Glossary}% <-- Needs translation
48.27 }
These captions contain accented characters.
48.28 \begingroup \catcode`\"\active
48.29 \def\x{\endgroup

48.30 \addto\captionsestonian{%

48.31 \def\abstractname{Kokkuv~ote}%
48.32 \def\chaptername{Peat"ukk}}}
48.33 \x

\dateestonian The macro \dateestonian redenes the command \today to produce Estonian
dates.
48.34 \begingroup \catcode`\"\active
48.35 \def\x{\endgroup
48.36 \def\month@estonian{\ifcase\month\or
48.37 jaanuar\or veebruar\or m"arts\or aprill\or mai\or juuni\or
48.38 juuli\or august\or september\or oktoober\or november\or
48.39 detsember\fi}}
48.40 \x

48.41 \def\dateestonian{%

48.42 \def\today{\number\day.\space\month@estonian
48.43 \space\number\year.\space a.}}

282
\extrasestonian The macro \extrasestonian will perform all the extra denitions needed for
\noextrasestonian Estonian. The macro \noextrasestonian is used to cancel the actions of
\extrasestonian. For Estonian, " is made active and has to be treated as `special'
(~ is active already).
48.44 \initiate@active@char{"}
48.45 \initiate@active@char{~}
48.46 \addto\extrasestonian{\languageshorthands{estonian}}

48.47 \addto\extrasestonian{\bbl@activate{"}\bbl@activate{~}}

Store the original macros, and redene accents.


48.48 \addto\extrasestonian{\babel@save\"\umlautlow\babel@save\~\tildelow}
Estonian does not use extra spaces after sentences.
48.49 \addto\extrasestonian{\bbl@frenchspacing}
48.50 \addto\noextrasestonian{\bbl@nonfrenchspacing}

\estonianhyphenmins For Estonian, \lefthyphenmin and \righthyphenmin are both 2.


48.51 \providehyphenmins{\CurrentOption}{\tw@\tw@}

\tildelow The standard TEX accents are too high for Estonian typography, we have to lower
\gentilde them (following the babel German style). For a detailed explanation see the le
\newtilde glyphs.dtx.
\newcheck48.52 \def\tildelow{\def\~{\protect\gentilde}}
48.53 \def\gentilde#1{\if#1o\newtilde{#1}\else\if#1O\newtilde{#1}%
48.54 \else\newcheck{#1}%
48.55 \fi\fi}
48.56 \def\newtilde#1{\leavevmode\allowhyphens

48.57 {\U@D 1ex%


48.58 {\setbox\z@\hbox{\char126}\dimen@ -.45ex\advance\dimen@\ht\z@
48.59 \ifdim 1ex<\dimen@ \fontdimen5\font\dimen@ \fi}%
48.60 \accent126\fontdimen5\font\U@D #1}\allowhyphens}
48.61 \def\newcheck#1{\leavevmode\allowhyphens

48.62 {\U@D 1ex%


48.63 {\setbox\z@\hbox{\char20}\dimen@ -.45ex\advance\dimen@\ht\z@
48.64 \ifdim 1ex<\dimen@ \fontdimen5\font\dimen@ \fi}%
48.65 \accent20\fontdimen5\font\U@D #1}\allowhyphens}

We save the double quote character in \dq, and tilde in \til, and store the
original denitions of \" and \~ as \dieresis and \texttilde.
48.66 \begingroup \catcode`\"12
48.67 \edef\x{\endgroup
48.68 \def\noexpand\dq{"}
48.69 \def\noexpand\til{~}}
48.70 \x

48.71 \let\dieresis\"

48.72 \let\texttilde\~

This part follows closely spanish.ldf. We check the encoding and if it is T1,
we have to tell TEX about our redened accents.
48.73 \ifx\f@encoding\bbl@t@one
48.74 \let\@umlaut\dieresis
48.75 \let\@tilde\texttilde

283
48.76 \DeclareTextComposite{\~}{T1}{s}{178}
48.77 \DeclareTextComposite{\~}{T1}{S}{146}
48.78 \DeclareTextComposite{\~}{T1}{z}{186}
48.79 \DeclareTextComposite{\~}{T1}{Z}{154}
48.80 \DeclareTextComposite{\"}{T1}{'}{17}
48.81 \DeclareTextComposite{\"}{T1}{`}{18}
48.82 \DeclareTextComposite{\"}{T1}{<}{19}
48.83 \DeclareTextComposite{\"}{T1}{>}{20}
If the encoding diers from T1, we expand the accents, enabling hyphenation
beyond the accent. In this case TEX will not nd all possible breaks, and we have
to warn people.
48.84 \else
48.85 \wlog{Warning: Hyphenation would work better for the T1 encoding.}
48.86 \let\@umlaut\newumlaut
48.87 \let\@tilde\gentilde
48.88 \fi

Now we dene the shorthands.


48.89 \declare@shorthand{estonian}{"a}{\textormath{\"{a}}{\ddot a}}
48.90 \declare@shorthand{estonian}{"A}{\textormath{\"{A}}{\ddot A}}
48.91 \declare@shorthand{estonian}{"o}{\textormath{\"{o}}{\ddot o}}
48.92 \declare@shorthand{estonian}{"O}{\textormath{\"{O}}{\ddot O}}
48.93 \declare@shorthand{estonian}{"u}{\textormath{\"{u}}{\ddot u}}
48.94 \declare@shorthand{estonian}{"U}{\textormath{\"{U}}{\ddot U}}
german and french quotes,
48.95 \declare@shorthand{estonian}{"`}{%
48.96 \textormath{\quotedblbase}{\mbox{\quotedblbase}}}
48.97 \declare@shorthand{estonian}{"'}{%

48.98 \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}}
48.99 \declare@shorthand{estonian}{"<}{%

48.100 \textormath{\guillemotleft}{\mbox{\guillemotleft}}}
48.101 \declare@shorthand{estonian}{">}{%

48.102 \textormath{\guillemotright}{\mbox{\guillemotright}}}
48.103 \declare@shorthand{estonian}{~o}{\textormath{\@tilde o}{\tilde o}}
48.104 \declare@shorthand{estonian}{~O}{\textormath{\@tilde O}{\tilde O}}
48.105 \declare@shorthand{estonian}{~s}{\textormath{\@tilde s}{\check s}}
48.106 \declare@shorthand{estonian}{~S}{\textormath{\@tilde S}{\check S}}
48.107 \declare@shorthand{estonian}{~z}{\textormath{\@tilde z}{\check z}}
48.108 \declare@shorthand{estonian}{~Z}{\textormath{\@tilde Z}{\check Z}}
and some additional commands:
48.109 \declare@shorthand{estonian}{"-}{\nobreak\-\bbl@allowhyphens}
48.110 \declare@shorthand{estonian}{"|}{%
48.111 \textormath{\nobreak\discretionary{-}{}{\kern.03em}%
48.112 \allowhyphens}{}}
48.113 \declare@shorthand{estonian}{""}{\dq}

48.114 \declare@shorthand{estonian}{~~}{\til}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
48.115 \ldf@finish{estonian}
48.116 h/codei

284
49 The Albanian language
The le albanian.dtx58 denes all the language denition macros for the Alba-
nian language.
Albanian is written in a latin script, but it has 36 letters, 9 which are diletters
(dh, gj, ll, nj, rr, sh, th, xh, zh), and two extra special characters.
For this language the character " is made active. In table 24 an overview is
given of its purpose.

"c \"c, also implemented for the uppercase


"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"| disable ligature at this position
"" like "-, but producing no hyphen sign (for compund
words with hyphen, e.g. x-""y).
"` for Albanian left double quotes (looks like ).
"' for Albanian right double quotes.
"< for French left double quotes (similar to <<).
"> for French right double quotes (similar to >>).

Table 24: The extra denitions made by albanian.ldf

Apart from dening shorthands we need to make sure that the rst paragraph
of each section is intended. Furthermore the following new math operators are
dened (\tg, \ctg, \arctg, \arcctg, \sh, \ch, \th, \cth, \arsh, \arch, \arth,
\arcth, \Prob, \Expect, \Variance).
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
49.1 h∗codei
49.2 \LdfInit{albanian}\captionsalbanian
When this le is read as an option, i.e. by the \usepackage command,
albanian will be an `unknown' language in which case we have to make it known.
So we check for the existence of \l@albanian to see whether we have to do some-
thing here.
49.3 \ifx\l@albanian\@undefined
49.4 \@nopatterns{Albanian}
49.5 \adddialect\l@albanian0\fi
The next step consists of dening commands to switch to (and from) the Al-
banian language.

\captionsalbanian The macro \captionsalbanian denes all strings used in the four standard doc-
umentclasses provided with LATEX.
\addto\captionsalbanian{%
49.6

49.7\def\prefacename{Parathenia}%
49.8 \def\refname{Referencat}%
49.9 \def\abstractname{P\"ermbledhja}%
49.10 \def\bibname{Bibliografia}%
49.11 \def\chaptername{Kapitulli}%
58 The le described in this section has version number v1.0c and was last revised on 2007/10/20

285
49.12 \def\appendixname{Shtesa}%
49.13 \def\contentsname{P\"ermbajta}%
49.14 \def\listfigurename{Figurat}%
49.15 \def\listtablename{Tabelat}%
49.16 \def\indexname{Indeksi}%
49.17 \def\figurename{Figura}%
49.18 \def\tablename{Tabela}%
49.19 \def\partname{Pjesa}%
49.20 \def\enclname{Lidhja}%
49.21 \def\ccname{Kopja}%
49.22 \def\headtoname{P\"er}%
49.23 \def\pagename{Faqe}%
49.24 \def\seename{shiko}%
49.25 \def\alsoname{shiko dhe}%
49.26 \def\proofname{V\"ertetim}%
49.27 \def\glossaryname{P\"erhasja e Fjal\"eve}%
49.28 }%

\datealbanian The macro \datealbanian redenes the command \today to produce Albanian
dates.
49.29 \def\datealbanian{%
49.30 \def\today{\number\day~\ifcase\month\or
49.31 Janar\or Shkurt\or Mars\or Prill\or Maj\or
49.32 Qershor\or Korrik\or Gusht\or Shtator\or Tetor\or N\"entor\or
49.33 Dhjetor\fi \space \number\year}}

\extrasalbanian The macro \extrasalbanian will perform all the extra denitions needed for the
\noextrasalbanian Albanian language. The macro \noextrasalbanian is used to cancel the actions
of \extrasalbanian.
For Albanian the " character is made active. This is done once, later on its
denition may vary. Other languages in the same document may also use the "
character for shorthands; we specify that the albanian group of shorthands should
be used.
49.34 \initiate@active@char{"}
49.35 \addto\extrasalbanian{\languageshorthands{albanian}}
49.36 \addto\extrasalbanian{\bbl@activate{"}}

Don't forget to turn the shorthands o again.


49.37 \addto\noextrasalbanian{\bbl@deactivate{"}}
First we dene shorthands to facilitate the occurence of letters such as £.
49.38 \declare@shorthand{albanian}{"c}{\textormath{\v c}{\check c}}
49.39 \declare@shorthand{albanian}{"e}{\textormath{\v e}{\check e}}
49.40 \declare@shorthand{albanian}{"C}{\textormath{\v C}{\check C}}
49.41 \declare@shorthand{albanian}{"E}{\textormath{\v E}{\check E}}
Then we dene access to two forms of quotation marks, similar to the german
and french quotation marks.
49.42 \declare@shorthand{albanian}{"`}{%
49.43 \textormath{\quotedblbase{}}{\mbox{\quotedblbase}}}
49.44 \declare@shorthand{albanian}{"'}{%

49.45 \textormath{\textquotedblleft{}}{\mbox{\textquotedblleft}}}
49.46 \declare@shorthand{albanian}{"<}{%

49.47 \textormath{\guillemotleft{}}{\mbox{\guillemotleft}}}

286
49.48 \declare@shorthand{albanian}{">}{%
49.49 \textormath{\guillemotright{}}{\mbox{\guillemotright}}}
then we dene two shorthands to be able to specify hyphenation breakpoints that
behave a little dierent from \-.
49.50 \declare@shorthand{albanian}{"-}{\nobreak-\bbl@allowhyphens}
49.51 \declare@shorthand{albanian}{""}{\hskip\z@skip}
And we want to have a shorthand for disabling a ligature.
49.52 \declare@shorthand{albanian}{"|}{%
49.53 \textormath{\discretionary{-}{}{\kern.03em}}{}}

\bbl@frenchindent In albanian the rst paragraph of each section should be indented. Add this code
\bbl@nonfrenchindent only in LATEX.
49.54 \ifx\fmtname plain \else
49.55 \let\@aifORI\@afterindentfalse
49.56 \def\bbl@frenchindent{\let\@afterindentfalse\@afterindenttrue
49.57 \@afterindenttrue}
49.58 \def\bbl@nonfrenchindent{\let\@afterindentfalse\@aifORI
49.59 \@afterindentfalse}
49.60 \addto\extrasalbanian{\bbl@frenchindent}
49.61 \addto\noextrasalbanian{\bbl@nonfrenchindent}
49.62 \fi

\mathalbanian Some math functions in Albanian math books have other names: e.g. sinh in
Albanian is written as sh etc. So we dene a number of new math operators.
49.63 \def\sh{\mathop{\operator@font sh}\nolimits} % same as \sinh
49.64 \def\ch{\mathop{\operator@font ch}\nolimits} % same as \cosh
49.65 \def\th{\mathop{\operator@font th}\nolimits} % same as \tanh

49.66 \def\cth{\mathop{\operator@font cth}\nolimits} % same as \coth

49.67 \def\arsh{\mathop{\operator@font arsh}\nolimits}

49.68 \def\arch{\mathop{\operator@font arch}\nolimits}

49.69 \def\arth{\mathop{\operator@font arth}\nolimits}

49.70 \def\arcth{\mathop{\operator@font arcth}\nolimits}

49.71 \def\tg{\mathop{\operator@font tg}\nolimits} % same as \tan

49.72 \def\ctg{\mathop{\operator@font ctg}\nolimits} % same as \cot

49.73 \def\arctg{\mathop{\operator@font arctg}\nolimits} % same as \arctan

49.74 \def\arcctg{\mathop{\operator@font arcctg}\nolimits}

49.75 \def\Prob{\mathop{\mathsf P\hskip0pt}\nolimits}

49.76 \def\Expect{\mathop{\mathsf E\hskip0pt}\nolimits}

49.77 \def\Variance{\mathop{\mathsf D\hskip0pt}\nolimits}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
49.78 \ldf@finish{albanian}
49.79 h/codei

287
50 The Croatian language
The le croatian.dtx59 denes all the language denition macros for the Croatian
language.
For this language currently no special denitions are needed or available.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
50.1 h∗codei
50.2 \LdfInit{croatian}\captionscroatian
When this le is read as an option, i.e. by the \usepackage command,
croatian will be an `unknown' language in which case we have to make it known.
So we check for the existence of \l@croatian to see whether we have to do some-
thing here.
50.3 \ifx\l@croatian\@undefined
50.4 \@nopatterns{Croatian}
50.5 \adddialect\l@croatian0\fi
The next step consists of dening commands to switch to (and from) the Croa-
tian language.

\captionscroatian The macro \captionscroatian denes all strings used in the four standard doc-
umentclasses provided with LATEX.
\addto\captionscroatian{%
50.6

50.7\def\prefacename{Predgovor}%
50.8 \def\refname{Literatura}%
50.9 \def\abstractname{Sa\v{z}etak}%
50.10 \def\bibname{Bibliografija}%
50.11 \def\chaptername{Poglavlje}%
50.12 \def\appendixname{Dodatak}%
50.13 \def\contentsname{Sadr\v{z}aj}%
50.14 \def\listfigurename{Popis slika}%
50.15 \def\listtablename{Popis tablica}%
50.16 \def\indexname{Indeks}%
50.17 \def\figurename{Slika}%
50.18 \def\tablename{Tablica}%
50.19 \def\partname{Dio}%
50.20 \def\enclname{Prilozi}%
50.21 \def\ccname{Kopije}%
50.22 \def\headtoname{Prima}%
50.23 \def\pagename{Stranica}%
50.24 \def\seename{Vidjeti}%
50.25 \def\alsoname{Vidjeti i}%
50.26 \def\proofname{Dokaz}%
50.27 \def\glossaryname{Kazalo}%
50.28 }%

\datecroatian The macro \datecroatian redenes the command \today to produce Croatian
dates.
50.29 \def\datecroatian{%
50.30 \def\today{\number\day.~\ifcase\month\or
59 The le described in this section has version number v1.3l and was last revised on 2005/03/29.
A contribution was made by Alan Pai¢ (paica@cernvm.cern.ch).

288
50.31 sije\v{c}nja\or velja\v{c}e\or o\v{z}ujka\or travnja\or svibnja\or
50.32 lipnja\or srpnja\or kolovoza\or rujna\or listopada\or studenog\or
50.33 prosinca\fi \space \number\year.}}

\extrascroatian The macro \extrascroatian will perform all the extra denitions needed for the
\noextrascroatian Croatian language. The macro \noextrascroatian is used to cancel the actions of
\extrascroatian. For the moment these macros are empty but they are dened
for compatibility with the other language denition les.
50.34 \addto\extrascroatian{}
50.35 \addto\noextrascroatian{}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
50.36 \ldf@finish{croatian}
50.37 h/codei

289
51 The Czech Language
The le czech.dtx60 denes all the language denition macros for the Czech
language. It is meant as a replacement of CSLATEX, the most-widely used standard
for typesetting Czech documents in LATEX.

51.1 Usage
For this language \frenchspacing is set.
Additionally, two macros are dened \q and \w for easy access to two accents
are dened.
The command \q is used with the letters (t, d, l, and L) and adds a ' to them
to simulate a `hook' that should be there. The result looks like t'. The command
\w is used to put the ring-accent which appears in ångstrøm over the letters u and
U.

51.2 Compatibility
Great care has been taken to ensure backward compatibility with CSLATEX. In
particular, documents which load this le with \usepackage{czech} should pro-
duce identical output with no modications to the source. Additionally, all the
CSLATEX options are recognized:

IL2, T1, OT1


These options set the default font encoding. Please note that their
use is deprecated. You should use the fontenc package to select font
encoding.
split, nosplit
These options control whether hyphenated words are automatically split
according to Czech typesetting rules. With the split option je-li is
hyphenated as je-/-li. The nosplit option disables this behavior.
The use of this option is strongly discouraged, as it breaks too many
common thingshyphens cannot be used in labels, negative arguments
to TEX primitives will not work in horizontal mode (use \minus as a
workaround), and there are a few other peculiarities with using this
mode.
nocaptions
This option was used in CSLATEX to set up Czech/Slovak typesetting
rules, but leave the original captions and dates. The recommended way
to achieve this is to use English as the main language of the document
and use the environment otherlanguage* for Czech text.

olduv There are two version of \uv. The older one allows the use of \verb
inside the quotes but breaks any respective kerning with the quotes (like
that in CS fonts). The newer one honors the kerning in the font but does
not allow \verb inside the quotes.
60 The le described in this section has version number v3.1a and was last revised on
2008/07/06. It was rewritten by Petr Tesa°ík (babel@tesarici.cz).

290
The new version is used by default in LATEX 2ε and the old version is
used with plain TEX. You may use olduv to override the default in
LATEX 2ε .

cstex This option was used to include the commands \csprimeson and
\csprimesoff. Since these commands are always included now, it has
been removed and the empty denition lasts for compatibility.

51.3 Implementation
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
51.1 h∗codei
51.2 \LdfInit\CurrentOption{date\CurrentOption}
When this le is read as an option, i.e. by the \usepackage command, czech
might be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@czech to see whether we have to do something here.
51.3 \ifx\l@czech\@undefined
51.4 \@nopatterns{Czech}
51.5 \adddialect\l@czech0\fi
We need to dene these macros early in the process.
51.6 \def\cs@iltw@{IL2}
51.7 \newif\ifcs@splithyphens
51.8 \cs@splithyphensfalse

If Babel is not loaded, we provide compatibility with CSLATEX. However, if


macro \@ifpackageloaded is not dened, we assume to be loaded from plain
and provide compatibility with csplain. Of course, this does not work well with
LATEX 2.09, but I doubt anyone will ever want to use this le with LATEX 2.09.
51.9 \ifx\@ifpackageloaded\@undefined
51.10 \let\cs@compat@plain\relax
51.11 \message{csplain compatibility mode}
51.12 \else

51.13 \@ifpackageloaded{babel}{}{%
51.14 \let\cs@compat@latex\relax
51.15 \message{cslatex compatibility mode}}
51.16 \fi

51.17 \ifx\cs@compat@latex\relax

51.18 \ProvidesPackage{czech}[2008/07/06 v3.1a CSTeX Czech style]


Declare CSLATEX options (see also the descriptions on page 290).
51.19 \DeclareOption{IL2}{\def\encodingdefault{IL2}}
51.20 \DeclareOption {T1}{\def\encodingdefault {T1}}
51.21 \DeclareOption{OT1}{\def\encodingdefault{OT1}}
51.22 \DeclareOption{nosplit}{\cs@splithyphensfalse}
51.23 \DeclareOption{split}{\cs@splithyphenstrue}
51.24 \DeclareOption{nocaptions}{\let\cs@nocaptions=\relax}
51.25 \DeclareOption{olduv}{\let\cs@olduv=\relax}
51.26 \DeclareOption{cstex}{\relax}

291
Make IL2 encoding the default. This can be overriden with the other font
encoding options.
51.27 \ExecuteOptions{\cs@iltw@}
Now, process the user-supplied options.
51.28 \ProcessOptions
Standard LATEX 2ε does not include the IL2 encoding in the format. The
encoding can be loaded later using the fontenc package, but CSLATEX included IL2
by default. This means existing documents for CSLATEX do not load that package,
so load the encoding ourselves in compatibility mode.
51.29 \ifx\encodingdefault\cs@iltw@
51.30 \input il2enc.def
51.31 \fi
Restore the denition of \CurrentOption, clobbered by processing the options.
51.32 \def\CurrentOption{czech}
51.33 \fi
The next step consists of dening commands to switch to (and from) the Czech
language.

\captionsczech The macro \captionsczech denes all strings used in the four standard docu-
mentclasses provided with LATEX.
51.34 \@namedef{captions\CurrentOption}{%
51.35 \def\prefacename{P\v{r}edmluva}%
51.36 \def\refname{Reference}%
51.37 \def\abstractname{Abstrakt}%
51.38 \def\bibname{Literatura}%
51.39 \def\chaptername{Kapitola}%
51.40 \def\appendixname{P\v{r}\'{\i}loha}%
51.41 \def\contentsname{Obsah}%
51.42 \def\listfigurename{Seznam obr\'azk\r{u}}%
51.43 \def\listtablename{Seznam tabulek}%
51.44 \def\indexname{Rejst\v{r}\'{\i}k}%
51.45 \def\figurename{Obr\'azek}%
51.46 \def\tablename{Tabulka}%
51.47 \def\partname{\v{C}\'ast}%
51.48 \def\enclname{P\v{r}\'{\i}loha}%
51.49 \def\ccname{Na v\v{e}dom\'{\i}}%
51.50 \def\headtoname{Komu}%
51.51 \def\pagename{Strana}%
51.52 \def\seename{viz}%
51.53 \def\alsoname{viz tak\'e}%
51.54 \def\proofname{D\r{u}kaz}%
51.55 \def\glossaryname{Slovn\'{\i}k}%
51.56 }%

\dateczech The macro \dateczech redenes the command \today to produce Czech dates.
CSLATEX allows line break between the day and the month. However, this
behavior has been agreed upon to be a bad thing by the csTeX mailing list in
December 2005 and has not been adopted.
51.57 \@namedef{date\CurrentOption}{%
51.58 \def\today{\number\day.~\ifcase\month\or ledna\or \'unora\or

292
51.59 b\v{r}ezna\or dubna\or kv\v{e}tna\or \v{c}ervna\or \v{c}ervence\or
51.60 srpna\or z\'a\v{r}\'\i\or \v{r}\'{\i}jna\or listopadu\or
51.61 prosince\fi \space\number\year}}

\extrasczech The macro \extrasczech will perform all the extra denitions needed for the
\noextrasczech Czech language. The macro \noextrasczech is used to cancel the actions of
\extrasczech. This means saving the meaning of two one-letter control sequences
before dening them.
For Czech texts \frenchspacing should be in eect. Language group for
shorthands is also set here.
51.62 \expandafter\addto\csname extras\CurrentOption\endcsname{%
51.63 \bbl@frenchspacing
51.64 \languageshorthands{czech}}
51.65 \expandafter\addto\csname noextras\CurrentOption\endcsname{%

51.66 \bbl@nonfrenchspacing}
51.67 \expandafter\addto\csname extras\CurrentOption\endcsname{%
51.68 \babel@save\q\let\q\v
51.69 \babel@save\w\let\w\r}

\sq We save the original single and double quote characters in \sq and \dq to make
\dq them available later.
51.70 \begingroup\catcode`\"=12\catcode`\'=12
51.71 \def\x{\endgroup
51.72 \def\sq{'}
51.73 \def\dq{"}}
51.74 \x

This macro is used to store the correct values of the hyphenation parameters
\lefthyphenmin and \righthyphenmin.
51.75 \providehyphenmins{\CurrentOption}{\tw@\thr@@}

\v LATEX's normal \v accent places a caron over the letter that follows it (
o). This is
not what we want for the letters d, t, l and L; for those the accent should change
shape. This is acheived by the following.
51.76 \AtBeginDocument{%
51.77 \DeclareTextCompositeCommand{\v}{OT1}{t}{%
51.78 t\kern-.23em\raise.24ex\hbox{'}}
51.79 \DeclareTextCompositeCommand{\v}{OT1}{d}{%
51.80 d\kern-.13em\raise.24ex\hbox{'}}
51.81 \DeclareTextCompositeCommand{\v}{OT1}{l}{\lcaron{}}
51.82 \DeclareTextCompositeCommand{\v}{OT1}{L}{\Lcaron{}}}

\lcaron For the letters l and L we want to disinguish between normal fonts and monospaced
\Lcaron fonts.
51.83 \def\lcaron{%
51.84 \setbox0\hbox{M}\setbox\tw@\hbox{i}%
51.85 \ifdim\wd0>\wd\tw@\relax
51.86 l\kern-.13em\raise.24ex\hbox{'}\kern-.11em%
51.87 \else
51.88 l\raise.45ex\hbox to\z@{\kern-.35em '\hss}%
51.89 \fi}
51.90 \def\Lcaron{%

293
51.91 \setbox0\hbox{M}\setbox\tw@\hbox{i}%
51.92 \ifdim\wd0>\wd\tw@\relax
51.93 L\raise.24ex\hbox to\z@{\kern-.28em'\hss}%
51.94 \else
51.95 L\raise.45ex\hbox to\z@{\kern-.40em '\hss}%
51.96 \fi}

Initialize active quotes. CSLATEX provides a way of converting English-style


quotes into Czech-style ones. Both single and double quotes are aected, i.e.
``text'' is converted to something like ,,text`` and `text' is converted to
,text`. This conversion can be switched on and o with \csprimeson and
\csprimesoff.61
These quotes present various troubles, e.g. the kerning is broken, apostrophes
are converted to closing single quote, some primitives are broken (most notably
the \catcode`\hchar i syntax will not work any more), and writing them to .aux
les cannot be handled correctly. For these reasons, these commands are only
available in CSLATEX compatibility mode.
51.97 \ifx\cs@compat@latex\relax
51.98 \let\cs@ltxprim@s\prim@s
51.99 \def\csprimeson{%
51.100 \catcode`\`\active \catcode`\'\active \let\prim@s\bbl@prim@s}
51.101 \def\csprimesoff{%
51.102 \catcode`\`12 \catcode`\'12 \let\prim@s\cs@ltxprim@s}
51.103 \begingroup\catcode`\`\active
51.104 \def\x{\endgroup
51.105 \def`{\futurelet\cs@next\cs@openquote}
51.106 \def\cs@openquote{%
51.107 \ifx`\cs@next \expandafter\cs@opendq
51.108 \else \expandafter\clq
51.109 \fi}%
51.110 }\x
51.111 \begingroup\catcode`\'\active
51.112 \def\x{\endgroup
51.113 \def'{\textormath{\futurelet\cs@next\cs@closequote}
51.114 {^\bgroup\prim@s}}
51.115 \def\cs@closequote{%
51.116 \ifx'\cs@next \expandafter\cs@closedq
51.117 \else \expandafter\crq
51.118 \fi}%
51.119 }\x
51.120 \def\cs@opendq{\clqq\let\cs@next= }
51.121 \def\cs@closedq{\crqq\let\cs@next= }
The way I recommend for typesetting quotes in Czech documents is to use
shorthands similar to those used in German.
51.122 \else
51.123 \initiate@active@char{"}
51.124 \expandafter\addto\csname extras\CurrentOption\endcsname{%
51.125 \bbl@activate{"}}
51.126 \expandafter\addto\csname noextras\CurrentOption\endcsname{%
51.127 \bbl@deactivate{"}}
61 By the way, the names of these macros are misleading, because the handling of primes in
math mode is rather marginal, the most important thing being the handling of quotes. . .

294
51.128 \declare@shorthand{czech}{"`}{\clqq}
51.129 \declare@shorthand{czech}{"'}{\crqq}
51.130 \declare@shorthand{czech}{"<}{\flqq}
51.131 \declare@shorthand{czech}{">}{\frqq}
51.132 \declare@shorthand{czech}{"=}{\cs@splithyphen}
51.133 \fi

\clqq This is the CS opening quote, which is similar to the German quote (\glqq) but
the kerning is dierent.
For the OT1 encoding, the quote is constructed from the right double quote
(i.e. the Opening quotes character) by moving it down to the baseline and
shifting it to the right, or to the left if italic correction is positive.
For T1, the German Opening quotes is used. It is moved to the right and
the total width is enlarged. This is done in an attempt to minimize the dierence
between the OT1 and T1 versions.
51.134 \ProvideTextCommand{\clqq}{OT1}{%
51.135 \set@low@box{\textquotedblright}%
51.136 \setbox\@ne=\hbox{l\/}\dimen\@ne=\wd\@ne
51.137 \setbox\@ne=\hbox{l}\advance\dimen\@ne-\wd\@ne
51.138 \leavevmode
51.139 \ifdim\dimen\@ne>\z@\kern-.1em\box\z@\kern.1em
51.140 \else\kern.1em\box\z@\kern-.1em\fi\allowhyphens}
51.141 \ProvideTextCommand{\clqq}{T1}

51.142 {\kern.1em\quotedblbase\kern-.0158em\relax}
51.143 \ProvideTextCommandDefault{\clqq}{\UseTextSymbol{OT1}\clqq}

\crqq For OT1, the CS closing quote is basically the same as \grqq, only the
\textormath macro is not used, because as far as I know, \grqq does not work
in math mode anyway.
For T1, the character is slightly wider and shifted to the right to match its
OT1 counterpart.
51.144 \ProvideTextCommand{\crqq}{OT1}
51.145 {\save@sf@q{\nobreak\kern-.07em\textquotedblleft\kern.07em}}
51.146 \ProvideTextCommand{\crqq}{T1}

51.147 {\save@sf@q{\nobreak\kern.06em\textquotedblleft\kern.024em}}
51.148 \ProvideTextCommandDefault{\crqq}{\UseTextSymbol{OT1}\crqq}

\clq Single CS quotes are similar to double quotes (see the discussion above).
\crq51.149 \ProvideTextCommand{\clq}{OT1}
51.150 {\set@low@box{\textquoteright}\box\z@\kern.04em\allowhyphens}
51.151 \ProvideTextCommand{\clq}{T1}
51.152 {\quotesinglbase\kern-.0428em\relax}
51.153 \ProvideTextCommandDefault{\clq}{\UseTextSymbol{OT1}\clq}

51.154 \ProvideTextCommand{\crq}{OT1}

51.155 {\save@sf@q{\nobreak\textquoteleft\kern.17em}}
51.156 \ProvideTextCommand{\crq}{T1}

51.157 {\save@sf@q{\nobreak\textquoteleft\kern.17em}}
51.158 \ProvideTextCommandDefault{\crq}{\UseTextSymbol{OT1}\crq}

\uv There are two versions of \uv. The older one opens a group and uses \aftergroup
to typeset the closing quotes. This version allows using \verb inside the quotes,
because the enclosed text is not passed as an argument, but unfortunately it breaks

295
any kerning with the quotes. Although the kerning with the opening quote could
be xed, the kerning with the closing quote cannot.
The newer version is dened as a command with one parameter. It preserves
kerning but since the quoted text is passed as an argument, it cannot contain
\verb.
Decide which version of \uv should be used. For sake of compatibility, we use
the older version with plain TEX and the newer version with LATEX 2ε .
51.159 \ifx\cs@compat@plain\@undefined\else\let\cs@olduv=\relax\fi
51.160 \ifx\cs@olduv\@undefined
51.161 \DeclareRobustCommand\uv[1]{{\leavevmode\clqq#1\crqq}}
51.162 \else

51.163 \DeclareRobustCommand\uv{\bgroup\aftergroup\closequotes
51.164 \leavevmode\clqq\let\cs@next=}
51.165 \def\closequotes{\unskip\crqq\relax}
51.166 \fi

\cs@wordlen Declare a counter to hold the length of the word after the hyphen.
51.167 \newcount\cs@wordlen

\cs@hyphen Store the original hyphen in a macro. Ditto for the ligatures.
\cs@endash51.168 \begingroup\catcode`\-12
\cs@emdash51.169 \def\x{\endgroup
51.170 \def\cs@hyphen{-}
51.171 \def\cs@endash{--}
51.172 \def\cs@emdash{---}

\cs@boxhyphen Provide a non-breakable hyphen to be used when a compound word is too short
to be split, i.e. the second part is shorter than \righthyphenmin.
51.173 \def\cs@boxhyphen{\hbox{-}}

\cs@splithyphen The macro \cs@splithyphen inserts a split hyphen, while allowing both parts of
the compound word to be hyphenated at other places too.
51.174 \def\cs@splithyphen{\kern\z@
51.175 \discretionary{-}{\char\hyphenchar\the\font}{-}\nobreak\hskip\z@}
51.176 }\x

- To minimize the eects of activating the hyphen character, the active denition
expands to the non-active character in all cases where hyphenation cannot occur,
i.e. if not typesetting (check \protect), not in horizontal mode, or in inner
horizontal mode.
51.177 \initiate@active@char{-}
51.178 \declare@shorthand{czech}{-}{%
51.179 \ifx\protect\@typeset@protect
51.180 \ifhmode
51.181 \ifinner
51.182 \bbl@afterelse\bbl@afterelse\bbl@afterelse\cs@hyphen
51.183 \else
51.184 \bbl@afterfi\bbl@afterelse\bbl@afterelse\cs@firsthyphen
51.185 \fi
51.186 \else
51.187 \bbl@afterfi\bbl@afterelse\cs@hyphen

296
51.188 \fi
51.189 \else
51.190 \bbl@afterfi\cs@hyphen
51.191 \fi}

\cs@firsthyphen If we encounter a hyphen, check whether it is followed by a second or a third


\cs@firsthyph@n hyphen and if so, insert the corresponding ligature.
\cs@secondhyphen If we don't nd a hyphen, the token found will be placed in \cs@token for
\cs@secondhyph@n further analysis, and it will also stay in the input.
51.192 \begingroup\catcode`\-\active
51.193 \def\x{\endgroup
51.194 \def\cs@firsthyphen{\futurelet\cs@token\cs@firsthyph@n}
51.195 \def\cs@firsthyph@n{%
51.196 \ifx -\cs@token
51.197 \bbl@afterelse\cs@secondhyphen
51.198 \else
51.199 \bbl@afterfi\cs@checkhyphen
51.200 \fi}
51.201 \def\cs@secondhyphen ##1{%
51.202 \futurelet\cs@token\cs@secondhyph@n}
51.203 \def\cs@secondhyph@n{%
51.204 \ifx -\cs@token
51.205 \bbl@afterelse\cs@emdash\@gobble
51.206 \else
51.207 \bbl@afterfi\cs@endash
51.208 \fi}
51.209 }\x

\cs@checkhyphen Check that hyphenation is enabled, and if so, start analyzing the rest of the
word, i.e. initialize \cs@word and \cs@wordlen and start processing input with
\cs@scanword.
51.210 \def\cs@checkhyphen{%
51.211 \ifnum\expandafter\hyphenchar\the\font=`\-
51.212 \def\cs@word{}\cs@wordlen\z@
51.213 \bbl@afterelse\cs@scanword
51.214 \else
51.215 \cs@hyphen
51.216 \fi}

\cs@scanword Each token is rst analyzed with \cs@scanword, which expands the token and
\cs@continuescan passes the rst token of the result to \cs@gett@ken. If the expanded token is not
\cs@gettoken identical to the unexpanded one, presume that it might be expanded further and
\cs@gett@ken pass it back to \cs@scanword until you get an unexpandable token. Then analyze
it in \cs@examinetoken.
The \cs@continuescan macro does the same thing as \cs@scanword, but it
does not require the rst token to be in \cs@token already.
51.217 \def\cs@scanword{\let\cs@lasttoken= \cs@token\expandafter\cs@gettoken}
51.218 \def\cs@continuescan{\let\cs@lasttoken\@undefined\expandafter\cs@gettoken}
51.219 \def\cs@gettoken{\futurelet\cs@token\cs@gett@ken}

51.220 \def\cs@gett@ken{%

51.221 \ifx\cs@token\cs@lasttoken \def\cs@next{\cs@examinetoken}%


51.222 \else \def\cs@next{\cs@scanword}%
51.223 \fi \cs@next}

297
cs@examinetoken Examine the token in \cs@token:

• If it is a letter (catcode 11) or other (catcode 12), add it to \cs@word with


\cs@addparam.
• If it is the \char primitive, add it with \cs@expandchar.

• If the token starts or ends a group, ignore it with \cs@ignoretoken.


• Otherwise analyze the meaning of the token with \cs@checkchardef to
detect primitives dened with \chardef.

51.224 \def\cs@examinetoken{%
51.225 \ifcat A\cs@token
51.226 \def\cs@next{\cs@addparam}%
51.227 \else\ifcat 0\cs@token
51.228 \def\cs@next{\cs@addparam}%
51.229 \else\ifx\char\cs@token
51.230 \def\cs@next{\afterassignment\cs@expandchar\let\cs@token= }%
51.231 \else\ifx\bgroup\cs@token
51.232 \def\cs@next{\cs@ignoretoken\bgroup}%
51.233 \else\ifx\egroup\cs@token
51.234 \def\cs@next{\cs@ignoretoken\egroup}%
51.235 \else\ifx\begingroup\cs@token
51.236 \def\cs@next{\cs@ignoretoken\begingroup}%
51.237 \else\ifx\endgroup\cs@token
51.238 \def\cs@next{\cs@ignoretoken\endgroup}%
51.239 \else
51.240 \def\cs@next{\expandafter\expandafter\expandafter\cs@checkchardef
51.241 \expandafter\meaning\expandafter\cs@token\string\char\end}%
51.242 \fi\fi\fi\fi\fi\fi\fi\cs@next}

\cs@checkchardef Check the meaning of a token and if it is a primitive dened with \chardef, pass
it to \\@examinechar as if it were a \char sequence. Otherwise, there are no
more word characters, so do the nal actions in \cs@nosplit.
51.243 \expandafter\def\expandafter\cs@checkchardef
51.244 \expandafter#\expandafter1\string\char#2\end{%
51.245 \def\cs@token{#1}%
51.246 \ifx\cs@token\@empty
51.247 \def\cs@next{\afterassignment\cs@examinechar\let\cs@token= }%
51.248 \else
51.249 \def\cs@next{\cs@nosplit}%
51.250 \fi \cs@next}

\cs@ignoretoken Add a token to \cs@word but do not update the \cs@wordlen counter. This is
mainly useful for group starting and ending primitives, which need to be preserved,
but do not aect the word boundary.
51.251 \def\cs@ignoretoken#1{%
51.252 \edef\cs@word{\cs@word#1}%
51.253 \afterassignment\cs@continuescan\let\cs@token= }

cs@addparam Add a token to \cs@word and check its lccode. Note that this macro can only be
used for tokens which can be passed as a parameter.

298
51.254 \def\cs@addparam#1{%
51.255 \edef\cs@word{\cs@word#1}%
51.256 \cs@checkcode{\lccode`#1}}

\cs@expandchar Add a \char sequence to \cs@word and check its lccode. The charcode is rst
\cs@examinechar parsed in \cs@expandchar and then the resulting \chardef-dened sequence is
analyzed in \cs@examinechar.
51.257 \def\cs@expandchar{\afterassignment\cs@examinechar\chardef\cs@token=}
51.258 \def\cs@examinechar{%
51.259 \edef\cs@word{\cs@word\char\the\cs@token\space}%
51.260 \cs@checkcode{\lccode\cs@token}}

\cs@checkcode Check the lccode of a character. If it is zero, it does not count to the current
word, so nish it with \cs@nosplit. Otherwise update the \cs@wordlen counter
and go on scanning the word with \cs@continuescan. When enough characters
are gathered in \cs@word to allow word break, insert the split hyphen and nish.
51.261 \def\cs@checkcode#1{%
51.262 \ifnum0=#1
51.263 \def\cs@next{\cs@nosplit}%
51.264 \else
51.265 \advance\cs@wordlen\@ne
51.266 \ifnum\righthyphenmin>\the\cs@wordlen
51.267 \def\cs@next{\cs@continuescan}%
51.268 \else
51.269 \cs@splithyphen
51.270 \def\cs@next{\cs@word}%
51.271 \fi
51.272 \fi \cs@next}

\cs@nosplit Insert a non-breakable hyphen followed by the saved word.


51.273 \def\cs@nosplit{\cs@boxhyphen\cs@word}

\cs@hyphen The \minus sequence can be used where the active hyphen does not work, e.g. in
arguments to TEX primitives in outer horizontal mode.
51.274 \let\minus\cs@hyphen

\standardhyphens These macros control whether split hyphens are allowed in Czech and/or Slovak
\splithyphens texts. You may use them in any language, but the split hyphen is only activated
for Czech and Slovak.
51.275 \def\standardhyphens{\cs@splithyphensfalse\cs@deactivatehyphens}
51.276 \def\splithyphens{\cs@splithyphenstrue\cs@activatehyphens}

\cs@splitattr Now we declare the split language attribute. This is similar to the split package
option of cslatex, but it only aects Czech, not Slovak.
51.277 \def\cs@splitattr{\babel@save\ifcs@splithyphens\splithyphens}
51.278 \bbl@declare@ttribute{czech}{split}{%
51.279 \addto\extrasczech{\cs@splitattr}}

\cs@activatehyphens These macros are dened as \relax by default to prevent activating/deactivating


\cs@deactivatehyphens the hyphen character. They are redened when the language is switched to
Czech/Slovak. At that moment the hyphen is also activated if split hyphens were
requested with \splithyphens.

299
When the language is de-activated, de-activate the hyphen and restore the
bogus denitions of these macros.
51.280 \let\cs@activatehyphens\relax
51.281 \let\cs@deactivatehyphens\relax
51.282 \expandafter\addto\csname extras\CurrentOption\endcsname{%

51.283 \def\cs@activatehyphens{\bbl@activate{-}}%
51.284 \def\cs@deactivatehyphens{\bbl@deactivate{-}}%
51.285 \ifcs@splithyphens\cs@activatehyphens\fi}
51.286 \expandafter\addto\csname noextras\CurrentOption\endcsname{%

51.287 \cs@deactivatehyphens
51.288 \let\cs@activatehyphens\relax
51.289 \let\cs@deactivatehyphens\relax}

\cs@looseness One of the most common situations where an active hyphen will not work properly
\looseness is the \looseness primitive. Change its denition so that it deactivates the
hyphen if needed.
51.290 \let\cs@looseness\looseness
51.291 \def\looseness{%
51.292 \ifcs@splithyphens
51.293 \cs@deactivatehyphens\afterassignment\cs@activatehyphens \fi
51.294 \cs@looseness}

\cs@selectlanguage Specifying the nocaptions option means that captions and dates are not rede-
\cs@main@language ned by default, but they can be switched on later with \captionsczech and/or
\dateczech.
We mimic this behavior by redening \selectlanguage. This macro is called
once at the beginning of the document to set the main language of the document.
If this is \cs@main@language, it disables the macros for setting captions and date.
In any case, it restores the original denition of \selectlanguage and expands
it.
The denition of \selectlanguage can be shared between Czech and Slovak;
the actual language is stored in \cs@main@language.
51.295 \ifx\cs@nocaptions\@undefined\else
51.296 \edef\cs@main@language{\CurrentOption}
51.297 \ifx\cs@origselect\@undefined
51.298 \let\cs@origselect=\selectlanguage
51.299 \def\selectlanguage{%
51.300 \let\selectlanguage\cs@origselect
51.301 \ifx\bbl@main@language\cs@main@language
51.302 \expandafter\cs@selectlanguage
51.303 \else
51.304 \expandafter\selectlanguage
51.305 \fi}
51.306 \def\cs@selectlanguage{%
51.307 \cs@tempdisable{captions}%
51.308 \cs@tempdisable{date}%
51.309 \selectlanguage}

\cs@tempdisable \cs@tempdisable disables a language setup macro temporarily, i.e. the macro
with the name of h#1 i\bbl@main@language just restores the original denition
and purges the saved macro from memory.
51.310 \def\cs@tempdisable#1{%

300
51.311 \def\@tempa{cs@#1}%
51.312 \def\@tempb{#1\bbl@main@language}%
51.313 \expandafter\expandafter\expandafter\let
51.314 \expandafter \csname\expandafter \@tempa \expandafter\endcsname
51.315 \csname \@tempb \endcsname
51.316 \expandafter\edef\csname \@tempb \endcsname{%
51.317 \let \expandafter\noexpand \csname \@tempb \endcsname
51.318 \expandafter\noexpand \csname \@tempa \endcsname
51.319 \let \expandafter\noexpand\csname \@tempa \endcsname
51.320 \noexpand\@undefined}}

These macros are not needed, once the initialization is over.


51.321 \@onlypreamble\cs@main@language
51.322 \@onlypreamble\cs@origselect
51.323 \@onlypreamble\cs@selectlanguage
51.324 \@onlypreamble\cs@tempdisable
51.325 \fi
51.326 \fi

The encoding of mathematical fonts should be changed to IL2. This allows to


use accented letter in some font families. Besides, documents do not use CM fonts
if there are equivalents in CS-fonts, so there is no need to have both bitmaps of
CM-font and CS-font.
\@font@warning and \@font@info are temporarily redened to avoid annoy-
ing font warnings.
51.327 \ifx\cs@compat@plain\@undefined
51.328 \ifx\cs@check@enc\@undefined\else
51.329 \def\cs@check@enc{
51.330 \ifx\encodingdefault\cs@iltw@
51.331 \let\cs@warn\@font@warning \let\@font@warning\@gobble
51.332 \let\cs@info\@font@info \let\@font@info\@gobble
51.333 \SetSymbolFont{operators}{normal}{\cs@iltw@}{cmr}{m}{n}
51.334 \SetSymbolFont{operators}{bold}{\cs@iltw@}{cmr}{bx}{n}
51.335 \SetMathAlphabet\mathbf{normal}{\cs@iltw@}{cmr}{bx}{n}
51.336 \SetMathAlphabet\mathit{normal}{\cs@iltw@}{cmr}{m}{it}
51.337 \SetMathAlphabet\mathrm{normal}{\cs@iltw@}{cmr}{m}{n}
51.338 \SetMathAlphabet\mathsf{normal}{\cs@iltw@}{cmss}{m}{n}
51.339 \SetMathAlphabet\mathtt{normal}{\cs@iltw@}{cmtt}{m}{n}
51.340 \SetMathAlphabet\mathbf{bold}{\cs@iltw@}{cmr}{bx}{n}
51.341 \SetMathAlphabet\mathit{bold}{\cs@iltw@}{cmr}{bx}{it}
51.342 \SetMathAlphabet\mathrm{bold}{\cs@iltw@}{cmr}{bx}{n}
51.343 \SetMathAlphabet\mathsf{bold}{\cs@iltw@}{cmss}{bx}{n}
51.344 \SetMathAlphabet\mathtt{bold}{\cs@iltw@}{cmtt}{m}{n}
51.345 \let\@font@warning\cs@warn \let\cs@warn\@undefined
51.346 \let\@font@info\cs@info \let\cs@info\@undefined
51.347 \fi
51.348 \let\cs@check@enc\@undefined}
51.349 \AtBeginDocument{\cs@check@enc}
51.350 \fi

51.351 \fi

cs@undoiltw@ The thing is that LATEX 2ε core only supports the T1 encoding and does not
bother changing the uc/lc/sfcodes when encoding is switched. :( However, the IL2

301
encoding does change these codes, so if encoding is switched back from IL2, we
must also undo the eect of this change to be compatible with LATEX 2ε . OK, this
is not the rightTM solution but it works. Cheers to Petr Ol²ák.
51.352 \def\cs@undoiltw@{%
51.353 \uccode158=208 \lccode158=158 \sfcode158=1000
51.354 \sfcode159=1000
51.355 \uccode165=133 \lccode165=165 \sfcode165=1000
51.356 \uccode169=137 \lccode169=169 \sfcode169=1000
51.357 \uccode171=139 \lccode171=171 \sfcode171=1000
51.358 \uccode174=142 \lccode174=174 \sfcode174=1000
51.359 \uccode181=149
51.360 \uccode185=153
51.361 \uccode187=155
51.362 \uccode190=0 \lccode190=0
51.363 \uccode254=222 \lccode254=254 \sfcode254=1000
51.364 \uccode255=223 \lccode255=255 \sfcode255=1000}

@@enc@update Redene the LATEX 2ε internal function \@@enc@update to change the encodings
correctly.
51.365 \ifx\cs@enc@update\@undefined
51.366 \ifx\@@enc@update\@undefined\else
51.367 \let\cs@enc@update\@@enc@update
51.368 \def\@@enc@update{\ifx\cf@encoding\cs@iltw@\cs@undoiltw@\fi
51.369 \cs@enc@update
51.370 \expandafter\ifnum\csname l@\languagename\endcsname=\the\language
51.371 \expandafter\ifx
51.372 \csname l@\languagename:\f@encoding\endcsname\relax
51.373 \else
51.374 \expandafter\expandafter\expandafter\let
51.375 \expandafter\csname
51.376 \expandafter l\expandafter @\expandafter\languagename
51.377 \expandafter\endcsname\csname l@\languagename:\f@encoding\endcsname
51.378 \fi
51.379 \language=\csname l@\languagename\endcsname\relax
51.380 \fi}
51.381 \fi\fi

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
51.382 \ldf@finish\CurrentOption
51.383 h/codei

302
52 The Polish language
The le polish.dtx62 denes all the language-specic macros for the Polish lan-
guage.
For this language the character " is made active. In table 25 an overview is
given of its purpose.

"a or \aob, for tailed-a (like a )


"A or \Aob, for tailed-A (like A )
"e or \eob, for tailed-e (like e )
"E or \Eob, for tailed-E (like E )
"c or \'c, for accented c (like ¢), same with uppercase
letters and n,o,s
"l or \lpb{}, for l with stroke (like ª)
"L or \Lpb{}, for L with stroke (like Š)
"r or \zkb{}, for pointed z (like »), cf. pronounciation
"R or \Zkb{}, for pointed Z (like ›)
"z or \'z, for accented z
"Z or \'Z, for accented Z
"| disable ligature at this position.
"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"" like "-, but producing no hyphen sign (for compund
words with hyphen, e.g. x-""y).
"` for German left double quotes (looks like ).
"' for German right double quotes.
"< for French left double quotes (similar to <<).
"> for French right double quotes (similar to >>).

Table 25: The extra denitions made by polish.sty

The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
52.1 h∗codei
52.2 \LdfInit{polish}\captionspolish
When this le is read as an option, i.e. by the \usepackage command, polish
could be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@polish to see whether we have to do something here.
52.3 \ifx\l@polish\@undefined
52.4 \@nopatterns{Polish}
52.5 \adddialect\l@polish0\fi
The next step consists of dening commands to switch to (and from) the Polish
language.

\captionspolish The macro \captionspolish denes all strings used in the four standard docu-
mentclasses provided with LATEX.
52.6 \addto\captionspolish{%
62 The le described in this section has version number v1.2l and was last revised on 2005/03/31.

303
52.7 \def\prefacename{Przedmowa}%
52.8 \def\refname{Literatura}%
52.9 \def\abstractname{Streszczenie}%
52.10 \def\bibname{Bibliografia}%
52.11 \def\chaptername{Rozdzia\l}%
52.12 \def\appendixname{Dodatek}%
52.13 \def\contentsname{Spis tre\'sci}%
52.14 \def\listfigurename{Spis rysunk\'ow}%
52.15 \def\listtablename{Spis tablic}%
52.16 \def\indexname{Indeks}%
52.17 \def\figurename{Rysunek}%
52.18 \def\tablename{Tablica}%
52.19 \def\partname{Cz\eob{}\'s\'c}%
52.20 \def\enclname{Za\l\aob{}cznik}%
52.21 \def\ccname{Kopie:}%
52.22 \def\headtoname{Do}%
52.23 \def\pagename{Strona}%
52.24 \def\seename{Por\'ownaj}%
52.25 \def\alsoname{Por\'ownaj tak\.ze}%
52.26 \def\proofname{Dow\'od}%
52.27 \def\glossaryname{Glossary}% <-- Needs translation
52.28 }

\datepolish The macro \datepolish redenes the command \today to produce Polish dates.

52.29 \def\datepolish{%
52.30 \def\today{\number\day~\ifcase\month\or
52.31 stycznia\or lutego\or marca\or kwietnia\or maja\or czerwca\or lipca\or
52.32 sierpnia\or wrze\'snia\or pa\'zdziernika\or listopada\or grudnia\fi
52.33 \space\number\year}%
52.34 }

\extraspolish The macro \extraspolish will perform all the extra denitions needed for the
\noextraspolish Polish language. The macro \noextraspolish is used to cancel the actions of
\extraspolish.
For Polish the " character is made active. This is done once, later on its
denition may vary. Other languages in the same document may also use the "
character for shorthands; we specify that the polish group of shorthands should
be used.
52.35 \initiate@active@char{"}
52.36 \addto\extraspolish{\languageshorthands{polish}}
52.37 \addto\extraspolish{\bbl@activate{"}}

Don't forget to turn the shorthands o again.


52.38 \addto\noextraspolish{\bbl@deactivate{"}}

The code above is necessary because we need an extra active character. This
character is then used as indicated in table 25.
If you have problems at the end of a word with a linebreak, use the other version
without hyphenation tricks. Some TeX wizard may produce a better solution with
forcasting another token to decide whether the character after the double quote is
the last in a word. Do it and let us know.

304
In Polish texts some letters get special diacritical marks. Leszek Holenderski
designed the following code to position the diacritics correctly for every font in
every size. These macros need a few extra dimension variables.
52.39 \newdimen\pl@left
52.40 \newdimen\pl@down
52.41 \newdimen\pl@right

52.42 \newdimen\pl@temp

\sob The macro \sob is used to put the `ogonek' in the right place.
52.43 \def\sob#1#2#3#4#5{%parameters: letter and fractions hl,ho,vl,vo
52.44 \setbox0\hbox{#1}\setbox1\hbox{$_\mathchar'454$}\setbox2\hbox{p}%
52.45 \pl@right=#2\wd0 \advance\pl@right by-#3\wd1
52.46 \pl@down=#5\ht1 \advance\pl@down by-#4\ht0
52.47 \pl@left=\pl@right \advance\pl@left by\wd1
52.48 \pl@temp=-\pl@down \advance\pl@temp by\dp2 \dp1=\pl@temp
52.49 \leavevmode
52.50 \kern\pl@right\lower\pl@down\box1\kern-\pl@left #1}

\aob The ogonek is placed with the letters `a', `A', `e', and `E'.
\Aob52.51 \DeclareTextCommand{\aob}{OT1}{\sob a{.66}{.20}{0}{.90}}
\eob52.52 \DeclareTextCommand{\Aob}{OT1}{\sob A{.80}{.50}{0}{.90}}
\Eob52.53 \DeclareTextCommand{\eob}{OT1}{\sob e{.50}{.35}{0}{.93}}
52.54 \DeclareTextCommand{\Eob}{OT1}{\sob E{.60}{.35}{0}{.90}}

For the 'new' T1 encoding we can provide simpler denitions.


52.55 \DeclareTextCommand{\aob}{T1}{\k a}
52.56 \DeclareTextCommand{\Aob}{T1}{\k A}
52.57 \DeclareTextCommand{\eob}{T1}{\k e}
52.58 \DeclareTextCommand{\Eob}{T1}{\k E}
Construct the characters by default from the OT1 encoding.
52.59 \ProvideTextCommandDefault{\aob}{\UseTextSymbol{OT1}{\aob}}
52.60 \ProvideTextCommandDefault{\Aob}{\UseTextSymbol{OT1}{\Aob}}
52.61 \ProvideTextCommandDefault{\eob}{\UseTextSymbol{OT1}{\eob}}

52.62 \ProvideTextCommandDefault{\Eob}{\UseTextSymbol{OT1}{\Eob}}

\spb The macro \spb is used to put the `poprzeczka' in the right place.
52.63 \def\spb#1#2#3#4#5{%
52.64 \setbox0\hbox{#1}\setbox1\hbox{\char'023}%
52.65 \pl@right=#2\wd0 \advance\pl@right by-#3\wd1
52.66 \pl@down=#5\ht1 \advance\pl@down by-#4\ht0
52.67 \pl@left=\pl@right \advance\pl@left by\wd1
52.68 \ht1=\pl@down \dp1=-\pl@down
52.69 \leavevmode
52.70 \kern\pl@right\lower\pl@down\box1\kern-\pl@left #1}

\skb The macro \skb is used to put the `kropka' in the right place.
52.71 \def\skb#1#2#3#4#5{%
52.72 \setbox0\hbox{#1}\setbox1\hbox{\char'056}%
52.73 \pl@right=#2\wd0 \advance\pl@right by-#3\wd1
52.74 \pl@down=#5\ht1 \advance\pl@down by-#4\ht0
52.75 \pl@left=\pl@right \advance\pl@left by\wd1
52.76 \leavevmode
52.77 \kern\pl@right\lower\pl@down\box1\kern-\pl@left #1}

305
\textpl For the `poprzeczka' and the `kropka' in text fonts we don't need any special
coding, but we can (almost) use what is already available.
52.78 \def\textpl{%
52.79 \def\lpb{\plll}%
52.80 \def\Lpb{\pLLL}%
52.81 \def\zkb{\.z}%
52.82 \def\Zkb{\.Z}}
Initially we assume that typesetting is done with text fonts.
52.83 \textpl
52.84 \let\lll=\l \let\LLL=\L
52.85 \def\plll{\lll}
52.86 \def\pLLL{\LLL}

\telepl But for the `teletype' font in `OT1' encoding we have to take some special actions,
involving the macros dened above.
52.87 \def\telepl{%
52.88 \def\lpb{\spb l{.45}{.5}{.4}{.8}}%
52.89 \def\Lpb{\spb L{.23}{.5}{.4}{.8}}%
52.90 \def\zkb{\skb z{.5}{.5}{1.2}{0}}%
52.91 \def\Zkb{\skb Z{.5}{.5}{1.1}{0}}}
To activate these codes the font changing commands as they are dened in
LATEX are modied. The same is done for plain TEX's font changing commands.
When \selectfont is undened the current format is spposed to be either
plain (based) or LATEX 2.09.
52.92 \ifx\selectfont\@undefined
52.93 \ifx\prm\@undefined \addto\rm{\textpl}\else \addto\prm{\textpl}\fi
52.94 \ifx\pit\@undefined \addto\it{\textpl}\else \addto\pit{\textpl}\fi
52.95 \ifx\pbf\@undefined \addto\bf{\textpl}\else \addto\pbf{\textpl}\fi
52.96 \ifx\psl\@undefined \addto\sl{\textpl}\else \addto\psl{\textpl}\fi
52.97 \ifx\psf\@undefined \else \addto\psf{\textpl}\fi
52.98 \ifx\psc\@undefined \else \addto\psc{\textpl}\fi
52.99 \ifx\ptt\@undefined \addto\tt{\telepl}\else \addto\ptt{\telepl}\fi
52.100 \else

When \selectfont exists we assume LATEX 2ε .


52.101 \expandafter\addto\csname selectfont \endcsname{%
52.102 \csname\f@encoding @pl\endcsname}
52.103 \fi

Currently we support the OT1 and T1 encodings. For T1 we don't have to make a
dierence between typewriter fonts and other fonts, they all have the same glyphs.
52.104 \expandafter\let\csname T1@pl\endcsname\textpl
For OT1 we need to check the current font family, stored in \f@family. Un-
fortunately we need a hack as \ttdefault is dened as a \long macro, while
\f@family is not.
52.105 \expandafter\def\csname OT1@pl\endcsname{%
52.106 \long\edef\curr@family{\f@family}%
52.107 \ifx\curr@family\ttdefault
52.108 \telepl
52.109 \else
52.110 \textpl
52.111 \fi}

306
\dq We save the original double quote character in \dq to keep it available, the math
accent \" can now be typed as ".
52.112 \begingroup \catcode`\"12
52.113 \def\x{\endgroup
52.114 \def\dq{"}}
52.115 \x

Now we can dene the doublequote macros for diacritics,


52.116 \declare@shorthand{polish}{"a}{\textormath{\aob}{\ddot a}}
52.117 \declare@shorthand{polish}{"A}{\textormath{\Aob}{\ddot A}}
52.118 \declare@shorthand{polish}{"c}{\textormath{\'c}{\acute c}}
52.119 \declare@shorthand{polish}{"C}{\textormath{\'C}{\acute C}}
52.120 \declare@shorthand{polish}{"e}{\textormath{\eob}{\ddot e}}
52.121 \declare@shorthand{polish}{"E}{\textormath{\Eob}{\ddot E}}
52.122 \declare@shorthand{polish}{"l}{\textormath{\lpb}{\ddot l}}
52.123 \declare@shorthand{polish}{"L}{\textormath{\Lpb}{\ddot L}}
52.124 \declare@shorthand{polish}{"n}{\textormath{\'n}{\acute n}}
52.125 \declare@shorthand{polish}{"N}{\textormath{\'N}{\acute N}}
52.126 \declare@shorthand{polish}{"o}{\textormath{\'o}{\acute o}}
52.127 \declare@shorthand{polish}{"O}{\textormath{\'O}{\acute O}}
52.128 \declare@shorthand{polish}{"s}{\textormath{\'s}{\acute s}}
52.129 \declare@shorthand{polish}{"S}{\textormath{\'S}{\acute S}}

\polishrz The command \polishrz denes the shorthands "r, "z and "x to produce pointed
\polishzx z, accented z and "x. This is the default as these shorthands were dened by this
language denition le for quite some time.
52.130 \newcommand*{\polishrz}{%
52.131 \declare@shorthand{polish}{"r}{\textormath{\zkb}{\ddot r}}%
52.132 \declare@shorthand{polish}{"R}{\textormath{\Zkb}{\ddot R}}%
52.133 \declare@shorthand{polish}{"z}{\textormath{\'z}{\acute z}}%
52.134 \declare@shorthand{polish}{"Z}{\textormath{\'Z}{\acute Z}}%
52.135 \declare@shorthand{polish}{"x}{\dq x}%
52.136 \declare@shorthand{polish}{"X}{\dq X}%
52.137 }
52.138 \polishrz

The command \polishzx switches to a dierent set of shorthands, "z, "x and "r
to produce pointed z, accented z and "r; a dierent shorthand notation also in
use.
52.139 \newcommand*{\polishzx}{%
52.140 \declare@shorthand{polish}{"z}{\textormath{\zkb}{\ddot z}}%
52.141 \declare@shorthand{polish}{"Z}{\textormath{\Zkb}{\ddot Z}}%
52.142 \declare@shorthand{polish}{"x}{\textormath{\'z}{\acute x}}%
52.143 \declare@shorthand{polish}{"X}{\textormath{\'Z}{\acute X}}%
52.144 \declare@shorthand{polish}{"r}{\dq r}%
52.145 \declare@shorthand{polish}{"R}{\dq R}%
52.146 }

Then we dene access to two forms of quotation marks, similar to the german
and french quotation marks.
52.147 \declare@shorthand{polish}{"`}{%
52.148 \textormath{\quotedblbase}{\mbox{\quotedblbase}}}
52.149 \declare@shorthand{polish}{"'}{%

307
52.150 \textormath{\textquotedblright}{\mbox{\textquotedblright}}}
52.151 \declare@shorthand{polish}{"<}{%
52.152 \textormath{\guillemotleft}{\mbox{\guillemotleft}}}
52.153 \declare@shorthand{polish}{">}{%

52.154 \textormath{\guillemotright}{\mbox{\guillemotright}}}
then we dene two shorthands to be able to specify hyphenation breakpoints that
behavew a little dierent from \-.
52.155 \declare@shorthand{polish}{"-}{\nobreak-\bbl@allowhyphens}
52.156 \declare@shorthand{polish}{""}{\hskip\z@skip}
And we want to have a shorthand for disabling a ligature.
52.157 \declare@shorthand{polish}{"|}{%
52.158 \textormath{\discretionary{-}{}{\kern.03em}}{}}

\mdqon All that's left to do now is to dene a couple of commands for reasons of compat-
\mdqoff ibility with polish.tex.
52.159 \def\mdqon{\shorthandon{"}}
52.160 \def\mdqoff{\shorthandoff{"}}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
52.161 \ldf@finish{polish}
52.162 h/codei

308
53 The Serbocroatian language
The le serbian.dtx63 denes all the language denition macros for the Serbian
language, typeset in a latin script. In a future version support for typesetting in
a cyrillic script may be added.
For this language the character " is made active. In table 26 an overview is
given of its purpose. One of the reasons for this is that in the Serbian language
some special characters are used.

"c \"c, also implemented for the lowercase and upper-


case s and z.
"d \dj, also implemented for "D
"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"| disable ligature at this position
"" like "-, but producing no hyphen sign (for compund
words with hyphen, e.g. x-""y).
"` for Serbian left double quotes (looks like ).
"' for Serbian right double quotes.
"< for French left double quotes (similar to <<).
"> for French right double quotes (similar to >>).

Table 26: The extra denitions made by serbian.ldf

Apart from dening shorthands we need to make sure taht the rst paragraph
of each section is intended. Furthermore the following new math operators are
dened (\tg, \ctg, \arctg, \arcctg, \sh, \ch, \th, \cth, \arsh, \arch, \arth,
\arcth, \Prob, \Expect, \Variance).
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
53.1 h∗codei
53.2 \LdfInit{serbian}\captionsserbian
When this le is read as an option, i.e. by the \usepackage command, serbian
will be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@serbian to see whether we have to do something
here.
53.3 \ifx\l@serbian\@undefined
53.4 \@nopatterns{Serbian}
53.5 \adddialect\l@serbian0\fi
The next step consists of dening commands to switch to (and from) the Ser-
bocroatian language.

\captionsserbian The macro \captionsserbian denes all strings used in the four standard docu-
mentclasses provided with LATEX.
53.6 \addto\captionsserbian{%
53.7 \def\prefacename{Predgovor}%
53.8 \def\refname{Literatura}%
63 The le described in this section has version number v1.0d and was last revised on
2005/03/31. A contribution was made by Dejan Muhamedagi¢ (dejan@yunix.com).

309
53.9 \def\abstractname{Sa\v{z}etak}%
53.10 \def\bibname{Bibliografija}%
53.11 \def\chaptername{Glava}%
53.12 \def\appendixname{Dodatak}%
53.13 \def\contentsname{Sadr\v{z}aj}%
53.14 \def\listfigurename{Slike}%
53.15 \def\listtablename{Tabele}%
53.16 \def\indexname{Indeks}%
53.17 \def\figurename{Slika}%
53.18 \def\tablename{Tabela}%
53.19 \def\partname{Deo}%
53.20 \def\enclname{Prilozi}%
53.21 \def\ccname{Kopije}%
53.22 \def\headtoname{Prima}%
53.23 \def\pagename{Strana}%
53.24 \def\seename{Vidi}%
53.25 \def\alsoname{Vidi tako\dj e}%
53.26 \def\proofname{Dokaz}%
53.27 \def\glossaryname{Glossary}% <-- Needs translation
53.28 }%

\dateserbian The macro \dateserbian redenes the command \today to produce Serbocroat-
ian dates.
53.29 \def\dateserbian{%
53.30 \def\today{\number\day .~\ifcase\month\or
53.31 januar\or februar\or mart\or april\or maj\or
53.32 juni\or juli\or avgust\or septembar\or oktobar\or novembar\or
53.33 decembar\fi \space \number\year}}

\extrasserbian The macro \extrasserbian will perform all the extra denitions needed for the
\noextrasserbian Serbocroatian language. The macro \noextrasserbian is used to cancel the ac-
tions of \extrasserbian.
For Serbian the " character is made active. This is done once, later on its
denition may vary. Other languages in the same document may also use the "
character for shorthands; we specify that the serbian group of shorthands should
be used.
53.34 \initiate@active@char{"}
53.35 \addto\extrasserbian{\languageshorthands{serbian}}
53.36 \addto\extrasserbian{\bbl@activate{"}}

Don't forget to turn the shorthands o again.


53.37 \addto\noextrasserbian{\bbl@deactivate{"}}
First we dene shorthands to facilitate the occurence of letters such as £.
53.38 \declare@shorthand{serbian}{"c}{\textormath{\v c}{\check c}}
53.39 \declare@shorthand{serbian}{"d}{\textormath{\dj}{\dj}}%%
53.40 \declare@shorthand{serbian}{"s}{\textormath{\v s}{\check s}}
53.41 \declare@shorthand{serbian}{"z}{\textormath{\v z}{\check z}}
53.42 \declare@shorthand{serbian}{"C}{\textormath{\v C}{\check C}}
53.43 \declare@shorthand{serbian}{"D}{\textormath{\DJ}{\DJ}}%%

53.44 \declare@shorthand{serbian}{"S}{\textormath{\v S}{\check S}}


53.45 \declare@shorthand{serbian}{"Z}{\textormath{\v Z}{\check Z}}

310
Then we dene access to two forms of quotation marks, similar to the german
and french quotation marks.
53.46 \declare@shorthand{serbian}{"`}{%
53.47 \textormath{\quotedblbase{}}{\mbox{\quotedblbase}}}
53.48 \declare@shorthand{serbian}{"'}{%

53.49 \textormath{\textquotedblleft{}}{\mbox{\textquotedblleft}}}
53.50 \declare@shorthand{serbian}{"<}{%

53.51 \textormath{\guillemotleft{}}{\mbox{\guillemotleft}}}
53.52 \declare@shorthand{serbian}{">}{%

53.53 \textormath{\guillemotright{}}{\mbox{\guillemotright}}}
then we dene two shorthands to be able to specify hyphenation breakpoints that
behave a little dierent from \-.
53.54 \declare@shorthand{serbian}{"-}{\nobreak-\bbl@allowhyphens}
53.55 \declare@shorthand{serbian}{""}{\hskip\z@skip}
And we want to have a shorthand for disabling a ligature.
53.56 \declare@shorthand{serbian}{"|}{%
53.57 \textormath{\discretionary{-}{}{\kern.03em}}{}}
\bbl@frenchindent In Serbian the rst paragraph of each section should be indented. Add this code
\bbl@nonfrenchindent only in LATEX.
53.58 \ifx\fmtname plain \else
53.59 \let\@aifORI\@afterindentfalse
53.60 \def\bbl@frenchindent{\let\@afterindentfalse\@afterindenttrue
53.61 \@afterindenttrue}
53.62 \def\bbl@nonfrenchindent{\let\@afterindentfalse\@aifORI
53.63 \@afterindentfalse}
53.64 \addto\extrasserbian{\bbl@frenchindent}
53.65 \addto\noextrasserbian{\bbl@nonfrenchindent}
53.66 \fi

\mathserbian Some math functions in Serbian math books have other names: e.g. sinh in
Serbian is written as sh etc. So we dene a number of new math operators.
53.67 \def\sh{\mathop{\operator@font sh}\nolimits} % same as \sinh
53.68 \def\ch{\mathop{\operator@font ch}\nolimits} % same as \cosh
53.69 \def\th{\mathop{\operator@font th}\nolimits} % same as \tanh

53.70 \def\cth{\mathop{\operator@font cth}\nolimits} % same as \coth

53.71 \def\arsh{\mathop{\operator@font arsh}\nolimits}

53.72 \def\arch{\mathop{\operator@font arch}\nolimits}

53.73 \def\arth{\mathop{\operator@font arth}\nolimits}

53.74 \def\arcth{\mathop{\operator@font arcth}\nolimits}

53.75 \def\tg{\mathop{\operator@font tg}\nolimits} % same as \tan

53.76 \def\ctg{\mathop{\operator@font ctg}\nolimits} % same as \cot

53.77 \def\arctg{\mathop{\operator@font arctg}\nolimits} % same as \arctan

53.78 \def\arcctg{\mathop{\operator@font arcctg}\nolimits}

53.79 \def\Prob{\mathop{\mathsf P\hskip0pt}\nolimits}

53.80 \def\Expect{\mathop{\mathsf E\hskip0pt}\nolimits}

53.81 \def\Variance{\mathop{\mathsf D\hskip0pt}\nolimits}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
53.82 \ldf@finish{serbian}
53.83 h/codei

311
54 The Slovak language
The le slovak.dtx64 denes all the language-specic macros for the Slovak lan-
guage.
For this language the macro \q is dened. It was used with the letters (t, d, l,
and L) and adds a ' to them to simulate a `hook' that should be there. The result
looks like t'. Since the the T1 font encoding has the corresponding characters it
is mapped to \v. Therefore we recommend using T1 font encoding. If you don't
want to use this encoding, please, feel free to redene \q in your le. I think babel
will honour this ;-).
For this language the characters ", ' and ^ are made active. In table 27 an
overview is given of its purpose. Also the vertical placement of the umlaut can be
controlled this way.

"a \"a, also implemented for the other lowercase and


uppercase vowels.
^d \q d, also implemented for l, t and L.
^c \v c, also implemented for C, D, N, n, T, Z and z.
^o \^o, also implemented for O.
'a \'a, also implemented for the other lowercase and
uppercase l, r, y and vowels.
"| disable ligature at this position.
"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"" like "-, but producing no hyphen sign (for compund
words with hyphen, e.g. x-""y).
"~ for a compound word mark without a breakpoint.
"= for a compound word mark with a breakpoint, allow-
ing hyphenation in the composing words.
"` for German left double quotes (looks like ).
"' for German right double quotes.
"< for French left double quotes (similar to <<).
"> for French right double quotes (similar to >>).

Table 27: The extra denitions made by slovak.ldf

The quotes in table 27 can also be typeset by using the commands in table 28.

54.1 Compatibility
Great care has been taken to ensure backward compatibility with CSLATEX. In par-
ticular, documents which load this le with \usepackage{slovak} should produce
identical output with no modications to the source. Additionally, all the CSLATEX
options are recognized:
64 The le described in this section has version number v3.1a and was last revised on
2008/07/06. It was originally written by Jana Chlebikova (chlebik@euromath.dk) and modi-
ed by Tobias Schlemmer (Tobias.Schlemmer@web.de). It was then rewritten by Petr Tesa°ík
(babel@tesarici.cz).

312
\glqq for German left double quotes (looks like ).
\grqq for German right double quotes (looks like ).
\glq for German left single quotes (looks like ,).
\grq for German right single quotes (looks like `).
\flqq for French left double quotes (similar to <<).
\frqq for French right double quotes (similar to >>).
\flq for (French) left single quotes (similar to <).
\frq for (French) right single quotes (similar to >).
\dq the original quotes character (").
\sq the original single quote (').

Table 28: More commands which produce quotes, dened by slovak.ldf

IL2, T1, OT1


These options set the default font encoding. Please note that their
use is deprecated. You should use the fontenc package to select font
encoding.
split, nosplit
These options control whether hyphenated words are automatically split
according to Slovak typesetting rules. With the split option je-li is
hyphenated as je-/-li. The nosplit option disables this behavior.
The use of this option is strongly discouraged, as it breaks too many
common thingshyphens cannot be used in labels, negative arguments
to TEX primitives will not work in horizontal mode (use \minus as a
workaround), and there are a few other peculiarities with using this
mode.
nocaptions
This option was used in CSLATEX to set up Czech/Slovak typesetting
rules, but leave the original captions and dates. The recommended way
to achieve this is to use English as the main language of the document
and use the environment otherlanguage* for Czech text.
olduv There are two version of \uv. The older one allows the use of \verb
inside the quotes but breaks any respective kerning with the quotes (like
that in CS fonts). The newer one honors the kerning in the font but does
not allow \verb inside the quotes.
The new version is used by default in LATEX 2ε and the old version is
used with plain TEX. You may use olduv to override the default in
LATEX 2ε .
cstex This option was used to include the commands \csprimeson and
\csprimesoff. Since these commands are always included now, it has
been removed and the empty denition lasts for compatibility.

54.2 Implementation
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.

313
54.1 h∗codei
54.2 \LdfInit\CurrentOption{date\CurrentOption}
When this le is read as an option, i.e. by the \usepackage command, slovak
will be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@slovak to see whether we have to do something here.
54.3 \ifx\l@slovak\@undefined
54.4 \@nopatterns{Slovak}
54.5 \adddialect\l@slovak0\fi
We need to dene these macros early in the process.
54.6 \def\cs@iltw@{IL2}
54.7 \newif\ifcs@splithyphens
54.8 \cs@splithyphensfalse

If Babel is not loaded, we provide compatibility with CSLATEX. However, if


macro \@ifpackageloaded is not dened, we assume to be loaded from plain
and provide compatibility with csplain. Of course, this does not work well with
LATEX 2.09, but I doubt anyone will ever want to use this le with LATEX 2.09.
54.9 \ifx\@ifpackageloaded\@undefined
54.10 \let\cs@compat@plain\relax
54.11 \message{csplain compatibility mode}
54.12 \else

54.13 \@ifpackageloaded{babel}{}{%
54.14 \let\cs@compat@latex\relax
54.15 \message{cslatex compatibility mode}}
54.16 \fi

54.17 \ifx\cs@compat@latex\relax

54.18 \ProvidesPackage{slovak}[2008/07/06 v3.1a CSTeX Slovak style]


Declare CSLATEX options (see also the descriptions on page 312).
54.19 \DeclareOption{IL2}{\def\encodingdefault{IL2}}
54.20 \DeclareOption {T1}{\def\encodingdefault {T1}}
54.21 \DeclareOption{OT1}{\def\encodingdefault{OT1}}
54.22 \DeclareOption{nosplit}{\cs@splithyphensfalse}
54.23 \DeclareOption{split}{\cs@splithyphenstrue}
54.24 \DeclareOption{nocaptions}{\let\cs@nocaptions=\relax}
54.25 \DeclareOption{olduv}{\let\cs@olduv=\relax}
54.26 \DeclareOption{cstex}{\relax}
Make IL2 encoding the default. This can be overriden with the other font
encoding options.
54.27 \ExecuteOptions{\cs@iltw@}
Now, process the user-supplied options.
54.28 \ProcessOptions
Standard LATEX 2ε does not include the IL2 encoding in the format. The
encoding can be loaded later using the fontenc package, but CSLATEX included IL2
by default. This means existing documents for CSLATEX do not load that package,
so load the encoding ourselves in compatibility mode.
54.29 \ifx\encodingdefault\cs@iltw@
54.30 \input il2enc.def
54.31 \fi

314
Restore the denition of \CurrentOption, clobbered by processing the options.
54.32 \def\CurrentOption{slovak}
54.33 \fi
The next step consists of dening commands to switch to (and from) the Slovak
language.

\captionsslovak The macro \captionsslovak denes all strings used in the four standard docu-
mentclasses provided with LATEX.
54.34 \@namedef{captions\CurrentOption}{%
54.35 \def\prefacename{Predhovor}%
54.36 \def\refname{Literat\'ura}%
54.37 \def\abstractname{Abstrakt}%
54.38 \def\bibname{Literat\'ura}%
54.39 \def\chaptername{Kapitola}%
54.40 \def\appendixname{Dodatok}%
54.41 \def\contentsname{Obsah}%
54.42 \def\listfigurename{Zoznam obr\'azkov}%
54.43 \def\listtablename{Zoznam tabuliek}%
54.44 \def\indexname{Register}%
54.45 \def\figurename{Obr.}%
54.46 \def\tablename{Tabu\v{l}ka}%
54.47 \def\partname{\v{C}as\v{t}}%
54.48 \def\enclname{Pr\'{\i}loha}%
54.49 \def\ccname{cc.}%
54.50 \def\headtoname{Pre}%
54.51 \def\pagename{Str.}%
54.52 \def\seename{vi\v{d}}%
54.53 \def\alsoname{vi\v{d} tie\v{z}}%
54.54 \def\proofname{D\^okaz}%
54.55 \def\glossaryname{Slovn\'{\i}k}%
54.56 }%

\dateslovak The macro \dateslovak redenes the command \today to produce Slovak dates.

54.57 \@namedef{date\CurrentOption}{%
54.58 \def\today{\number\day.~\ifcase\month\or
54.59 janu\'ara\or febru\'ara\or marca\or apr\'{\i}la\or m\'aja\or
54.60 j\'una\or j\'ula\or augusta\or septembra\or okt\'obra\or
54.61 novembra\or decembra\fi
54.62 \space \number\year}}

\extrasslovak The macro \extrasslovak will perform all the extra denitions needed for the
\noextrasslovak Slovak language. The macro \noextrasslovak is used to cancel the actions of
\extrasslovak.
For Slovak texts \frenchspacing should be in eect. Language group for
shorthands is also set here.
54.63 \expandafter\addto\csname extras\CurrentOption\endcsname{%
54.64 \bbl@frenchspacing
54.65 \languageshorthands{slovak}}
54.66 \expandafter\addto\csname noextras\CurrentOption\endcsname{%

54.67 \bbl@nonfrenchspacing}

315
54.68 \expandafter\addto\csname extras\CurrentOption\endcsname{%
54.69 \babel@save\q\let\q\v}
For Slovak three characters are used to dene shorthands, they need to be
made active.
54.70 \ifx\cs@compat@latex\relax\else
54.71 \initiate@active@char{^}
54.72 \addto\extrasslovak{\bbl@activate{^}}
54.73 \addto\noextrasslovak{\bbl@deactivate{^}}
54.74 \initiate@active@char{"}
54.75 \addto\extrasslovak{\bbl@activate{"}\umlautlow}
54.76 \addto\noextrasslovak{\bbl@deactivate{"}\umlauthigh}
54.77 \initiate@active@char{'}
54.78 \@ifpackagewith{babel}{activeacute}{%
54.79 \addto\extrasslovak{\bbl@activate{'}}
54.80 \addto\noextrasslovak{\bbl@deactivate{'}}%
54.81 }{}
54.82 \fi

\sq We save the original single and double quote characters in \sq and \dq to make
\dq them available later. The math accent \" can now be typed as ".
54.83 \begingroup\catcode`\"=12\catcode`\'=12
54.84 \def\x{\endgroup
54.85 \def\sq{'}
54.86 \def\dq{"}}
54.87 \x

The slovak hyphenation patterns should be used with \lefthyphenmin set to 2


and \righthyphenmin set to 3.
54.88 \providehyphenmins{\CurrentOption}{\tw@\thr@@}
In order to prevent problems with the active ^ we add a shorthand on system
level which expands to a `normal ^.
54.89 \ifx\cs@compat@latex\relax\else
54.90 \declare@shorthand{system}{^}{\csname normal@char\string^\endcsname}
Now we can dene the doublequote macros: the umlauts,
54.91 \declare@shorthand{slovak}{"a}{\textormath{\"{a}\allowhyphens}{\ddot a}}
54.92 \declare@shorthand{slovak}{"o}{\textormath{\"{o}\allowhyphens}{\ddot o}}
54.93 \declare@shorthand{slovak}{"u}{\textormath{\"{u}\allowhyphens}{\ddot u}}
54.94 \declare@shorthand{slovak}{"A}{\textormath{\"{A}\allowhyphens}{\ddot A}}
54.95 \declare@shorthand{slovak}{"O}{\textormath{\"{O}\allowhyphens}{\ddot O}}
54.96 \declare@shorthand{slovak}{"U}{\textormath{\"{U}\allowhyphens}{\ddot U}}
tremas,
54.97 \declare@shorthand{slovak}{"e}{\textormath{\"{e}\allowhyphens}{\ddot e}}
54.98 \declare@shorthand{slovak}{"E}{\textormath{\"{E}\allowhyphens}{\ddot E}}
54.99 \declare@shorthand{slovak}{"i}{\textormath{\"{\i}\allowhyphens}%
54.100 {\ddot\imath}}
54.101 \declare@shorthand{slovak}{"I}{\textormath{\"{I}\allowhyphens}{\ddot I}}
other slovak characters
54.102 \declare@shorthand{slovak}{^c}{\textormath{\v{c}\allowhyphens}{\check{c}}}
54.103 \declare@shorthand{slovak}{^d}{\textormath{\q{d}\allowhyphens}{\check{d}}}
54.104 \declare@shorthand{slovak}{^l}{\textormath{\q{l}\allowhyphens}{\check{l}}}

316
54.105 \declare@shorthand{slovak}{^n}{\textormath{\v{n}\allowhyphens}{\check{n}}}
54.106 \declare@shorthand{slovak}{^o}{\textormath{\^{o}\allowhyphens}{\hat{o}}}
54.107 \declare@shorthand{slovak}{^s}{\textormath{\v{s}\allowhyphens}{\check{s}}}
54.108 \declare@shorthand{slovak}{^t}{\textormath{\q{t}\allowhyphens}{\check{t}}}
54.109 \declare@shorthand{slovak}{^z}{\textormath{\v{z}\allowhyphens}{\check{z}}}
54.110 \declare@shorthand{slovak}{^C}{\textormath{\v{C}\allowhyphens}{\check{C}}}
54.111 \declare@shorthand{slovak}{^D}{\textormath{\v{D}\allowhyphens}{\check{D}}}
54.112 \declare@shorthand{slovak}{^L}{\textormath{\q{L}\allowhyphens}{\check{L}}}
54.113 \declare@shorthand{slovak}{^N}{\textormath{\v{N}\allowhyphens}{\check{N}}}
54.114 \declare@shorthand{slovak}{^O}{\textormath{\^{O}\allowhyphens}{\hat{O}}}
54.115 \declare@shorthand{slovak}{^S}{\textormath{\v{S}\allowhyphens}{\check{S}}}
54.116 \declare@shorthand{slovak}{^T}{\textormath{\v{T}\allowhyphens}{\check{T}}}
54.117 \declare@shorthand{slovak}{^Z}{\textormath{\v{Z}\allowhyphens}{\check{Z}}}
acute accents,
54.118 \@ifpackagewith{babel}{activeacute}{%
54.119 \declare@shorthand{slovak}{'a}{\textormath{\'a\allowhyphens}{^{\prime}a}}
54.120 \declare@shorthand{slovak}{'e}{\textormath{\'e\allowhyphens}{^{\prime}e}}
54.121 \declare@shorthand{slovak}{'i}{\textormath{\'\i{}\allowhyphens}{^{\prime}i}}
54.122 \declare@shorthand{slovak}{'l}{\textormath{\'l\allowhyphens}{^{\prime}l}}
54.123 \declare@shorthand{slovak}{'o}{\textormath{\'o\allowhyphens}{^{\prime}o}}
54.124 \declare@shorthand{slovak}{'r}{\textormath{\'r\allowhyphens}{^{\prime}r}}
54.125 \declare@shorthand{slovak}{'u}{\textormath{\'u\allowhyphens}{^{\prime}u}}
54.126 \declare@shorthand{slovak}{'y}{\textormath{\'y\allowhyphens}{^{\prime}y}}
54.127 \declare@shorthand{slovak}{'A}{\textormath{\'A\allowhyphens}{^{\prime}A}}
54.128 \declare@shorthand{slovak}{'E}{\textormath{\'E\allowhyphens}{^{\prime}E}}
54.129 \declare@shorthand{slovak}{'I}{\textormath{\'I\allowhyphens}{^{\prime}I}}
54.130 \declare@shorthand{slovak}{'L}{\textormath{\'L\allowhyphens}{^{\prime}l}}
54.131 \declare@shorthand{slovak}{'O}{\textormath{\'O\allowhyphens}{^{\prime}O}}
54.132 \declare@shorthand{slovak}{'R}{\textormath{\'R\allowhyphens}{^{\prime}R}}
54.133 \declare@shorthand{slovak}{'U}{\textormath{\'U\allowhyphens}{^{\prime}U}}
54.134 \declare@shorthand{slovak}{'Y}{\textormath{\'Y\allowhyphens}{^{\prime}Y}}
54.135 \declare@shorthand{slovak}{''}{%
54.136 \textormath{\textquotedblright}{\sp\bgroup\prim@s'}}
54.137 }{}
54.138

and some additional commands:


54.139 \declare@shorthand{slovak}{"-}{\nobreak\-\bbl@allowhyphens}
54.140 \declare@shorthand{slovak}{"|}{%
54.141 \textormath{\penalty\@M\discretionary{-}{}{\kern.03em}%
54.142 \bbl@allowhyphens}{}}
54.143 \declare@shorthand{slovak}{""}{\hskip\z@skip}
54.144 \declare@shorthand{slovak}{"~}{\textormath{\leavevmode\hbox{-}}{-}}
54.145 \declare@shorthand{slovak}{"=}{\cs@splithyphen}
54.146 \fi

\v LATEX's normal \v accent places a caron over the letter that follows it (
o). This is
not what we want for the letters d, t, l and L; for those the accent should change
shape. This is acheived by the following.
54.147 \AtBeginDocument{%
54.148 \DeclareTextCompositeCommand{\v}{OT1}{t}{%
54.149 t\kern-.23em\raise.24ex\hbox{'}}
54.150 \DeclareTextCompositeCommand{\v}{OT1}{d}{%
54.151 d\kern-.13em\raise.24ex\hbox{'}}

317
54.152 \DeclareTextCompositeCommand{\v}{OT1}{l}{\lcaron{}}
54.153 \DeclareTextCompositeCommand{\v}{OT1}{L}{\Lcaron{}}}

\lcaron For the letters l and L we want to disinguish between normal fonts and monospaced
\Lcaron fonts.
54.154 \def\lcaron{%
54.155 \setbox0\hbox{M}\setbox\tw@\hbox{i}%
54.156 \ifdim\wd0>\wd\tw@\relax
54.157 l\kern-.13em\raise.24ex\hbox{'}\kern-.11em%
54.158 \else
54.159 l\raise.45ex\hbox to\z@{\kern-.35em '\hss}%
54.160 \fi}
54.161 \def\Lcaron{%

54.162 \setbox0\hbox{M}\setbox\tw@\hbox{i}%
54.163 \ifdim\wd0>\wd\tw@\relax
54.164 L\raise.24ex\hbox to\z@{\kern-.28em'\hss}%
54.165 \else
54.166 L\raise.45ex\hbox to\z@{\kern-.40em '\hss}%
54.167 \fi}

Initialize active quotes. CSLATEX provides a way of converting English-style


quotes into Slovak-style ones. Both single and double quotes are aected, i.e.
``text'' is converted to something like ,,text`` and `text' is converted to
,text`. This conversion can be switched on and o with \csprimeson and
\csprimesoff.65
These quotes present various troubles, e.g. the kerning is broken, apostrophes
are converted to closing single quote, some primitives are broken (most notably
the \catcode`\hchar i syntax will not work any more), and writing them to .aux
les cannot be handled correctly. For these reasons, these commands are only
available in CSLATEX compatibility mode.
54.168 \ifx\cs@compat@latex\relax
54.169 \let\cs@ltxprim@s\prim@s
54.170 \def\csprimeson{%
54.171 \catcode``\active \catcode`'\active \let\prim@s\bbl@prim@s}
54.172 \def\csprimesoff{%
54.173 \catcode``12 \catcode`'12 \let\prim@s\cs@ltxprim@s}
54.174 \begingroup\catcode``\active
54.175 \def\x{\endgroup
54.176 \def`{\futurelet\cs@next\cs@openquote}
54.177 \def\cs@openquote{%
54.178 \ifx`\cs@next \expandafter\cs@opendq
54.179 \else \expandafter\clq
54.180 \fi}%
54.181 }\x
54.182 \begingroup\catcode`'\active
54.183 \def\x{\endgroup
54.184 \def'{\textormath{\futurelet\cs@next\cs@closequote}
54.185 {^\bgroup\prim@s}}
54.186 \def\cs@closequote{%
54.187 \ifx'\cs@next \expandafter\cs@closedq
65 By the way, the names of these macros are misleading, because the handling of primes in
math mode is rather marginal, the most important thing being the handling of quotes. . .

318
54.188 \else \expandafter\crq
54.189 \fi}%
54.190 }\x
54.191 \def\cs@opendq{\clqq\let\cs@next= }
54.192 \def\cs@closedq{\crqq\let\cs@next= }
The way I recommend for typesetting quotes in Slovak documents is to use
shorthands similar to those used in German.
54.193 \else
54.194 \declare@shorthand{slovak}{"`}{\clqq}
54.195 \declare@shorthand{slovak}{"'}{\crqq}
54.196 \declare@shorthand{slovak}{"<}{\flqq}
54.197 \declare@shorthand{slovak}{">}{\frqq}
54.198 \fi

\clqq This is the CS opening quote, which is similar to the German quote (\glqq) but
the kerning is dierent.
For the OT1 encoding, the quote is constructed from the right double quote
(i.e. the Opening quotes character) by moving it down to the baseline and
shifting it to the right, or to the left if italic correction is positive.
For T1, the German Opening quotes is used. It is moved to the right and
the total width is enlarged. This is done in an attempt to minimize the dierence
between the OT1 and T1 versions.
54.199 \ProvideTextCommand{\clqq}{OT1}{%
54.200 \set@low@box{\textquotedblright}%
54.201 \setbox\@ne=\hbox{l\/}\dimen\@ne=\wd\@ne
54.202 \setbox\@ne=\hbox{l}\advance\dimen\@ne-\wd\@ne
54.203 \leavevmode
54.204 \ifdim\dimen\@ne>\z@\kern-.1em\box\z@\kern.1em
54.205 \else\kern.1em\box\z@\kern-.1em\fi\allowhyphens}
54.206 \ProvideTextCommand{\clqq}{T1}

54.207 {\kern.1em\quotedblbase\kern-.0158em\relax}
54.208 \ProvideTextCommandDefault{\clqq}{\UseTextSymbol{OT1}\clqq}

\crqq For OT1, the CS closing quote is basically the same as \grqq, only the
\textormath macro is not used, because as far as I know, \grqq does not work
in math mode anyway.
For T1, the character is slightly wider and shifted to the right to match its
OT1 counterpart.
54.209 \ProvideTextCommand{\crqq}{OT1}
54.210 {\save@sf@q{\nobreak\kern-.07em\textquotedblleft\kern.07em}}
54.211 \ProvideTextCommand{\crqq}{T1}

54.212 {\save@sf@q{\nobreak\kern.06em\textquotedblleft\kern.024em}}
54.213 \ProvideTextCommandDefault{\crqq}{\UseTextSymbol{OT1}\crqq}

\clq Single CS quotes are similar to double quotes (see the discussion above).
\crq54.214 \ProvideTextCommand{\clq}{OT1}
54.215 {\set@low@box{\textquoteright}\box\z@\kern.04em\allowhyphens}
54.216 \ProvideTextCommand{\clq}{T1}
54.217 {\quotesinglbase\kern-.0428em\relax}
54.218 \ProvideTextCommandDefault{\clq}{\UseTextSymbol{OT1}\clq}

54.219 \ProvideTextCommand{\crq}{OT1}

319
54.220 {\save@sf@q{\nobreak\textquoteleft\kern.17em}}
54.221 \ProvideTextCommand{\crq}{T1}
54.222 {\save@sf@q{\nobreak\textquoteleft\kern.17em}}
54.223 \ProvideTextCommandDefault{\crq}{\UseTextSymbol{OT1}\crq}

\uv There are two versions of \uv. The older one opens a group and uses \aftergroup
to typeset the closing quotes. This version allows using \verb inside the quotes,
because the enclosed text is not passed as an argument, but unfortunately it breaks
any kerning with the quotes. Although the kerning with the opening quote could
be xed, the kerning with the closing quote cannot.
The newer version is dened as a command with one parameter. It preserves
kerning but since the quoted text is passed as an argument, it cannot contain
\verb.
Decide which version of \uv should be used. For sake of compatibility, we use
the older version with plain TEX and the newer version with LATEX 2ε .
54.224 \ifx\cs@compat@plain\@undefined\else\let\cs@olduv=\relax\fi
54.225 \ifx\cs@olduv\@undefined
54.226 \DeclareRobustCommand\uv[1]{{\leavevmode\clqq#1\crqq}}
54.227 \else

54.228 \DeclareRobustCommand\uv{\bgroup\aftergroup\closequotes
54.229 \leavevmode\clqq\let\cs@next=}
54.230 \def\closequotes{\unskip\crqq\relax}
54.231 \fi

\cs@wordlen Declare a counter to hold the length of the word after the hyphen.
54.232 \newcount\cs@wordlen

\cs@hyphen Store the original hyphen in a macro. Ditto for the ligatures.
\cs@endash54.233 \begingroup\catcode`\-12
\cs@emdash54.234 \def\x{\endgroup
54.235 \def\cs@hyphen{-}
54.236 \def\cs@endash{--}
54.237 \def\cs@emdash{---}

\cs@boxhyphen Provide a non-breakable hyphen to be used when a compound word is too short
to be split, i.e. the second part is shorter than \righthyphenmin.
54.238 \def\cs@boxhyphen{\hbox{-}}

\cs@splithyphen The macro \cs@splithyphen inserts a split hyphen, while allowing both parts of
the compound word to be hyphenated at other places too.
54.239 \def\cs@splithyphen{\kern\z@
54.240 \discretionary{-}{\char\hyphenchar\the\font}{-}\nobreak\hskip\z@}
54.241 }\x

- To minimize the eects of activating the hyphen character, the active denition
expands to the non-active character in all cases where hyphenation cannot occur,
i.e. if not typesetting (check \protect), not in horizontal mode, or in inner
horizontal mode.
54.242 \initiate@active@char{-}
54.243 \declare@shorthand{slovak}{-}{%
54.244 \ifx\protect\@typeset@protect

320
54.245 \ifhmode
54.246 \ifinner
54.247 \bbl@afterelse\bbl@afterelse\bbl@afterelse\cs@hyphen
54.248 \else
54.249 \bbl@afterfi\bbl@afterelse\bbl@afterelse\cs@firsthyphen
54.250 \fi
54.251 \else
54.252 \bbl@afterfi\bbl@afterelse\cs@hyphen
54.253 \fi
54.254 \else
54.255 \bbl@afterfi\cs@hyphen
54.256 \fi}

\cs@firsthyphen If we encounter a hyphen, check whether it is followed by a second or a third


\cs@firsthyph@n hyphen and if so, insert the corresponding ligature.
\cs@secondhyphen If we don't nd a hyphen, the token found will be placed in \cs@token for
\cs@secondhyph@n further analysis, and it will also stay in the input.
54.257 \begingroup\catcode`\-\active
54.258 \def\x{\endgroup
54.259 \def\cs@firsthyphen{\futurelet\cs@token\cs@firsthyph@n}
54.260 \def\cs@firsthyph@n{%
54.261 \ifx -\cs@token
54.262 \bbl@afterelse\cs@secondhyphen
54.263 \else
54.264 \bbl@afterfi\cs@checkhyphen
54.265 \fi}
54.266 \def\cs@secondhyphen ##1{%
54.267 \futurelet\cs@token\cs@secondhyph@n}
54.268 \def\cs@secondhyph@n{%
54.269 \ifx -\cs@token
54.270 \bbl@afterelse\cs@emdash\@gobble
54.271 \else
54.272 \bbl@afterfi\cs@endash
54.273 \fi}
54.274 }\x

\cs@checkhyphen Check that hyphenation is enabled, and if so, start analyzing the rest of the
word, i.e. initialize \cs@word and \cs@wordlen and start processing input with
\cs@scanword.
54.275 \def\cs@checkhyphen{%
54.276 \ifnum\expandafter\hyphenchar\the\font=`\-
54.277 \def\cs@word{}\cs@wordlen\z@
54.278 \bbl@afterelse\cs@scanword
54.279 \else
54.280 \cs@hyphen
54.281 \fi}

\cs@scanword Each token is rst analyzed with \cs@scanword, which expands the token and
\cs@continuescan passes the rst token of the result to \cs@gett@ken. If the expanded token is not
\cs@gettoken identical to the unexpanded one, presume that it might be expanded further and
\cs@gett@ken pass it back to \cs@scanword until you get an unexpandable token. Then analyze
it in \cs@examinetoken.

321
The \cs@continuescan macro does the same thing as \cs@scanword, but it
does not require the rst token to be in \cs@token already.
54.282 \def\cs@scanword{\let\cs@lasttoken= \cs@token\expandafter\cs@gettoken}
54.283 \def\cs@continuescan{\let\cs@lasttoken\@undefined\expandafter\cs@gettoken}
54.284 \def\cs@gettoken{\futurelet\cs@token\cs@gett@ken}

54.285 \def\cs@gett@ken{%

54.286 \ifx\cs@token\cs@lasttoken \def\cs@next{\cs@examinetoken}%


54.287 \else \def\cs@next{\cs@scanword}%
54.288 \fi \cs@next}

cs@examinetoken Examine the token in \cs@token:

• If it is a letter (catcode 11) or other (catcode 12), add it to \cs@word with


\cs@addparam.
• If it is the \char primitive, add it with \cs@expandchar.
• If the token starts or ends a group, ignore it with \cs@ignoretoken.
• Otherwise analyze the meaning of the token with \cs@checkchardef to
detect primitives dened with \chardef.

54.289 \def\cs@examinetoken{%
54.290 \ifcat A\cs@token
54.291 \def\cs@next{\cs@addparam}%
54.292 \else\ifcat 0\cs@token
54.293 \def\cs@next{\cs@addparam}%
54.294 \else\ifx\char\cs@token
54.295 \def\cs@next{\afterassignment\cs@expandchar\let\cs@token= }%
54.296 \else\ifx\bgroup\cs@token
54.297 \def\cs@next{\cs@ignoretoken\bgroup}%
54.298 \else\ifx\egroup\cs@token
54.299 \def\cs@next{\cs@ignoretoken\egroup}%
54.300 \else\ifx\begingroup\cs@token
54.301 \def\cs@next{\cs@ignoretoken\begingroup}%
54.302 \else\ifx\endgroup\cs@token
54.303 \def\cs@next{\cs@ignoretoken\endgroup}%
54.304 \else
54.305 \def\cs@next{\expandafter\expandafter\expandafter\cs@checkchardef
54.306 \expandafter\meaning\expandafter\cs@token\string\char\end}%
54.307 \fi\fi\fi\fi\fi\fi\fi\cs@next}

\cs@checkchardef Check the meaning of a token and if it is a primitive dened with \chardef, pass
it to \\@examinechar as if it were a \char sequence. Otherwise, there are no
more word characters, so do the nal actions in \cs@nosplit.
54.308 \expandafter\def\expandafter\cs@checkchardef
54.309 \expandafter#\expandafter1\string\char#2\end{%
54.310 \def\cs@token{#1}%
54.311 \ifx\cs@token\@empty
54.312 \def\cs@next{\afterassignment\cs@examinechar\let\cs@token= }%
54.313 \else
54.314 \def\cs@next{\cs@nosplit}%
54.315 \fi \cs@next}

322
\cs@ignoretoken Add a token to \cs@word but do not update the \cs@wordlen counter. This is
mainly useful for group starting and ending primitives, which need to be preserved,
but do not aect the word boundary.
54.316 \def\cs@ignoretoken#1{%
54.317 \edef\cs@word{\cs@word#1}%
54.318 \afterassignment\cs@continuescan\let\cs@token= }

cs@addparam Add a token to \cs@word and check its lccode. Note that this macro can only be
used for tokens which can be passed as a parameter.
54.319 \def\cs@addparam#1{%
54.320 \edef\cs@word{\cs@word#1}%
54.321 \cs@checkcode{\lccode`#1}}

\cs@expandchar Add a \char sequence to \cs@word and check its lccode. The charcode is rst
\cs@examinechar parsed in \cs@expandchar and then the resulting \chardef-dened sequence is
analyzed in \cs@examinechar.
54.322 \def\cs@expandchar{\afterassignment\cs@examinechar\chardef\cs@token=}
54.323 \def\cs@examinechar{%
54.324 \edef\cs@word{\cs@word\char\the\cs@token\space}%
54.325 \cs@checkcode{\lccode\cs@token}}

\cs@checkcode Check the lccode of a character. If it is zero, it does not count to the current
word, so nish it with \cs@nosplit. Otherwise update the \cs@wordlen counter
and go on scanning the word with \cs@continuescan. When enough characters
are gathered in \cs@word to allow word break, insert the split hyphen and nish.
54.326 \def\cs@checkcode#1{%
54.327 \ifnum0=#1
54.328 \def\cs@next{\cs@nosplit}%
54.329 \else
54.330 \advance\cs@wordlen\@ne
54.331 \ifnum\righthyphenmin>\the\cs@wordlen
54.332 \def\cs@next{\cs@continuescan}%
54.333 \else
54.334 \cs@splithyphen
54.335 \def\cs@next{\cs@word}%
54.336 \fi
54.337 \fi \cs@next}

\cs@nosplit Insert a non-breakable hyphen followed by the saved word.


54.338 \def\cs@nosplit{\cs@boxhyphen\cs@word}

\cs@hyphen The \minus sequence can be used where the active hyphen does not work, e.g. in
arguments to TEX primitives in outer horizontal mode.
54.339 \let\minus\cs@hyphen

\standardhyphens These macros control whether split hyphens are allowed in Czech and/or Slovak
\splithyphens texts. You may use them in any language, but the split hyphen is only activated
for Czech and Slovak.
54.340 \def\standardhyphens{\cs@splithyphensfalse\cs@deactivatehyphens}
54.341 \def\splithyphens{\cs@splithyphenstrue\cs@activatehyphens}

323
\cs@splitattr Now we declare the split language attribute. This is similar to the split package
option of cslatex, but it only aects Slovak, not Czech.
54.342 \def\cs@splitattr{\babel@save\ifcs@splithyphens\splithyphens}
54.343 \bbl@declare@ttribute{slovak}{split}{%
54.344 \addto\extrasslovak{\cs@splitattr}}

\cs@activatehyphens These macros are dened as \relax by default to prevent activating/deactivating


\cs@deactivatehyphens the hyphen character. They are redened when the language is switched to
Czech/Slovak. At that moment the hyphen is also activated if split hyphens were
requested with \splithyphens.
When the language is de-activated, de-activate the hyphen and restore the
bogus denitions of these macros.
54.345 \let\cs@activatehyphens\relax
54.346 \let\cs@deactivatehyphens\relax
54.347 \expandafter\addto\csname extras\CurrentOption\endcsname{%

54.348 \def\cs@activatehyphens{\bbl@activate{-}}%
54.349 \def\cs@deactivatehyphens{\bbl@deactivate{-}}%
54.350 \ifcs@splithyphens\cs@activatehyphens\fi}
54.351 \expandafter\addto\csname noextras\CurrentOption\endcsname{%

54.352 \cs@deactivatehyphens
54.353 \let\cs@activatehyphens\relax
54.354 \let\cs@deactivatehyphens\relax}

\cs@looseness One of the most common situations where an active hyphen will not work properly
\looseness is the \looseness primitive. Change its denition so that it deactivates the
hyphen if needed.
54.355 \let\cs@looseness\looseness
54.356 \def\looseness{%
54.357 \ifcs@splithyphens
54.358 \cs@deactivatehyphens\afterassignment\cs@activatehyphens \fi
54.359 \cs@looseness}

\cs@selectlanguage Specifying the nocaptions option means that captions and dates are not rede-
\cs@main@language ned by default, but they can be switched on later with \captionsslovak and/or
\dateslovak.
We mimic this behavior by redening \selectlanguage. This macro is called
once at the beginning of the document to set the main language of the document.
If this is \cs@main@language, it disables the macros for setting captions and date.
In any case, it restores the original denition of \selectlanguage and expands
it.
The denition of \selectlanguage can be shared between Czech and Slovak;
the actual language is stored in \cs@main@language.
54.360 \ifx\cs@nocaptions\@undefined\else
54.361 \edef\cs@main@language{\CurrentOption}
54.362 \ifx\cs@origselect\@undefined
54.363 \let\cs@origselect=\selectlanguage
54.364 \def\selectlanguage{%
54.365 \let\selectlanguage\cs@origselect
54.366 \ifx\bbl@main@language\cs@main@language
54.367 \expandafter\cs@selectlanguage
54.368 \else

324
54.369 \expandafter\selectlanguage
54.370 \fi}
54.371 \def\cs@selectlanguage{%
54.372 \cs@tempdisable{captions}%
54.373 \cs@tempdisable{date}%
54.374 \selectlanguage}

\cs@tempdisable \cs@tempdisable disables a language setup macro temporarily, i.e. the macro
with the name of h#1 i\bbl@main@language just restores the original denition
and purges the saved macro from memory.
54.375 \def\cs@tempdisable#1{%
54.376 \def\@tempa{cs@#1}%
54.377 \def\@tempb{#1\bbl@main@language}%
54.378 \expandafter\expandafter\expandafter\let
54.379 \expandafter \csname\expandafter \@tempa \expandafter\endcsname
54.380 \csname \@tempb \endcsname
54.381 \expandafter\edef\csname \@tempb \endcsname{%
54.382 \let \expandafter\noexpand \csname \@tempb \endcsname
54.383 \expandafter\noexpand \csname \@tempa \endcsname
54.384 \let \expandafter\noexpand\csname \@tempa \endcsname
54.385 \noexpand\@undefined}}

These macros are not needed, once the initialization is over.


54.386 \@onlypreamble\cs@main@language
54.387 \@onlypreamble\cs@origselect
54.388 \@onlypreamble\cs@selectlanguage
54.389 \@onlypreamble\cs@tempdisable
54.390 \fi
54.391 \fi

The encoding of mathematical fonts should be changed to IL2. This allows to


use accented letter in some font families. Besides, documents do not use CM fonts
if there are equivalents in CS-fonts, so there is no need to have both bitmaps of
CM-font and CS-font.
\@font@warning and \@font@info are temporarily redened to avoid annoy-
ing font warnings.
54.392 \ifx\cs@compat@plain\@undefined
54.393 \ifx\cs@check@enc\@undefined\else
54.394 \def\cs@check@enc{
54.395 \ifx\encodingdefault\cs@iltw@
54.396 \let\cs@warn\@font@warning \let\@font@warning\@gobble
54.397 \let\cs@info\@font@info \let\@font@info\@gobble
54.398 \SetSymbolFont{operators}{normal}{\cs@iltw@}{cmr}{m}{n}
54.399 \SetSymbolFont{operators}{bold}{\cs@iltw@}{cmr}{bx}{n}
54.400 \SetMathAlphabet\mathbf{normal}{\cs@iltw@}{cmr}{bx}{n}
54.401 \SetMathAlphabet\mathit{normal}{\cs@iltw@}{cmr}{m}{it}
54.402 \SetMathAlphabet\mathrm{normal}{\cs@iltw@}{cmr}{m}{n}
54.403 \SetMathAlphabet\mathsf{normal}{\cs@iltw@}{cmss}{m}{n}
54.404 \SetMathAlphabet\mathtt{normal}{\cs@iltw@}{cmtt}{m}{n}
54.405 \SetMathAlphabet\mathbf{bold}{\cs@iltw@}{cmr}{bx}{n}
54.406 \SetMathAlphabet\mathit{bold}{\cs@iltw@}{cmr}{bx}{it}
54.407 \SetMathAlphabet\mathrm{bold}{\cs@iltw@}{cmr}{bx}{n}
54.408 \SetMathAlphabet\mathsf{bold}{\cs@iltw@}{cmss}{bx}{n}

325
54.409 \SetMathAlphabet\mathtt{bold}{\cs@iltw@}{cmtt}{m}{n}
54.410 \let\@font@warning\cs@warn \let\cs@warn\@undefined
54.411 \let\@font@info\cs@info \let\cs@info\@undefined
54.412 \fi
54.413 \let\cs@check@enc\@undefined}
54.414 \AtBeginDocument{\cs@check@enc}
54.415 \fi

54.416 \fi

cs@undoiltw@ The thing is that LATEX 2ε core only supports the T1 encoding and does not
bother changing the uc/lc/sfcodes when encoding is switched. :( However, the IL2
encoding does change these codes, so if encoding is switched back from IL2, we
must also undo the eect of this change to be compatible with LATEX 2ε . OK, this
is not the rightTM solution but it works. Cheers to Petr Ol²ák.
54.417 \def\cs@undoiltw@{%
54.418 \uccode158=208 \lccode158=158 \sfcode158=1000
54.419 \sfcode159=1000
54.420 \uccode165=133 \lccode165=165 \sfcode165=1000
54.421 \uccode169=137 \lccode169=169 \sfcode169=1000
54.422 \uccode171=139 \lccode171=171 \sfcode171=1000
54.423 \uccode174=142 \lccode174=174 \sfcode174=1000
54.424 \uccode181=149
54.425 \uccode185=153
54.426 \uccode187=155
54.427 \uccode190=0 \lccode190=0
54.428 \uccode254=222 \lccode254=254 \sfcode254=1000
54.429 \uccode255=223 \lccode255=255 \sfcode255=1000}

@@enc@update Redene the LATEX 2ε internal function \@@enc@update to change the encodings
correctly.
54.430 \ifx\cs@enc@update\@undefined
54.431 \ifx\@@enc@update\@undefined\else
54.432 \let\cs@enc@update\@@enc@update
54.433 \def\@@enc@update{\ifx\cf@encoding\cs@iltw@\cs@undoiltw@\fi
54.434 \cs@enc@update
54.435 \expandafter\ifnum\csname l@\languagename\endcsname=\the\language
54.436 \expandafter\ifx
54.437 \csname l@\languagename:\f@encoding\endcsname\relax
54.438 \else
54.439 \expandafter\expandafter\expandafter\let
54.440 \expandafter\csname
54.441 \expandafter l\expandafter @\expandafter\languagename
54.442 \expandafter\endcsname\csname l@\languagename:\f@encoding\endcsname
54.443 \fi
54.444 \language=\csname l@\languagename\endcsname\relax
54.445 \fi}
54.446 \fi\fi

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
54.447 \ldf@finish\CurrentOption
54.448 h/codei

326
55 The Slovenian language
The le slovene.dtx66 denes all the language-specic macros for the Slovenian
language.
For this language the character " is made active. In table 29 an overview is
given of its purpose. One of the reasons for this is that in the Slovene language
some special characters are used.

"c \"c, also implemented for the lowercase and upper-


case s and z.
"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"" like "-, but producing no hyphen sign (for compund
words with hyphen, e.g. x-""y).
"` for Slovene left double quotes (looks like ).
"' for Slovene right double quotes.
"< for French left double quotes (similar to <<).
"> for French right double quotes (similar to >>).

Table 29: The extra denitions made by slovene.ldf

The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
55.1 h∗codei
55.2 \LdfInit{slovene}\captionsslovene
When this le is read as an option, i.e. by the \usepackage command, slovene
will be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@slovene to see whether we have to do something
here.
55.3 \ifx\l@slovene\@undefined
55.4 \@nopatterns{Slovene}
55.5 \adddialect\l@slovene0\fi
The next step consists of dening commands to switch to the Slovenian lan-
guage. The reason for this is that a user might want to switch back and forth
between languages.

\captionsslovene The macro \captionsslovene denes all strings used in the four standard docu-
mentclasses provided with LATEX.
\addto\captionsslovene{%
55.6

55.7\def\prefacename{Predgovor}%
55.8 \def\refname{Literatura}%
55.9 \def\abstractname{Povzetek}%
55.10 \def\bibname{Literatura}%
55.11 \def\chaptername{Poglavje}%
55.12 \def\appendixname{Dodatek}%
55.13 \def\contentsname{Kazalo}%
66 The le described in this section has version number v1.2m and was last revised on
2005/03/31. Contributions were made by Danilo Zavrtanik, University of Ljubljana (YU) and
Leon šlajpah (leon.zlajpah@ijs.si).

327
55.14 \def\listfigurename{Slike}%
55.15 \def\listtablename{Tabele}%
55.16 \def\indexname{Stvarno kazalo}% used to be Indeks
55.17 \def\figurename{Slika}%
55.18 \def\tablename{Tabela}%
55.19 \def\partname{Del}%
55.20 \def\enclname{Priloge}%
55.21 \def\ccname{Kopije}%
55.22 \def\headtoname{Prejme}%
55.23 \def\pagename{Stran}%
55.24 \def\seename{glej}%
55.25 \def\alsoname{glej tudi}%
55.26 \def\proofname{Dokaz}%
55.27 \def\glossaryname{Glossary}% <-- Needs translation
55.28 }%

\dateslovene The macro \dateslovene redenes the command \today to produce Slovenian
dates.
55.29 \def\dateslovene{%
55.30 \def\today{\number\day.~\ifcase\month\or
55.31 januar\or februar\or marec\or april\or maj\or junij\or
55.32 julij\or avgust\or september\or oktober\or november\or december\fi
55.33 \space \number\year}}

\extrasslovene The macro \extrasslovene performs all the extra denitions needed for the Slove-
\noextrasslovene nian language. The macro \noextrasslovene is used to cancel the actions of
\extrasslovene.
For Slovene the " character is made active. This is done once, later on its
denition may vary. Other languages in the same document may also use the "
character for shorthands; we specify that the slovenian group of shorthands should
be used.
55.34 \initiate@active@char{"}
55.35 \addto\extrasslovene{\languageshorthands{slovene}}
55.36 \addto\extrasslovene{\bbl@activate{"}}

Don't forget to turn the shorthands o again.


55.37 \addto\noextrasslovene{\bbl@deactivate{"}}
First we dene shorthands to facilitate the occurence of letters such as £.
55.38 \declare@shorthand{slovene}{"c}{\textormath{\v c}{\check c}}
55.39 \declare@shorthand{slovene}{"s}{\textormath{\v s}{\check s}}
55.40 \declare@shorthand{slovene}{"z}{\textormath{\v z}{\check z}}
55.41 \declare@shorthand{slovene}{"C}{\textormath{\v C}{\check C}}
55.42 \declare@shorthand{slovene}{"S}{\textormath{\v S}{\check S}}
55.43 \declare@shorthand{slovene}{"Z}{\textormath{\v Z}{\check Z}}
Then we dene access to two forms of quotation marks, similar to the german
and french quotation marks.
55.44 \declare@shorthand{slovene}{"`}{%
55.45 \textormath{\quotedblbase}{\mbox{\quotedblbase}}}
55.46 \declare@shorthand{slovene}{"'}{%

55.47 \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}}
55.48 \declare@shorthand{slovene}{"<}{%

55.49 \textormath{\guillemotleft}{\mbox{\guillemotleft}}}

328
55.50 \declare@shorthand{slovene}{">}{%
55.51 \textormath{\guillemotright}{\mbox{\guillemotright}}}
then we dene two shorthands to be able to specify hyphenation breakpoints that
behavew a little dierent from \-.
55.52 \declare@shorthand{slovene}{"-}{\nobreak-\bbl@allowhyphens}
55.53 \declare@shorthand{slovene}{""}{\hskip\z@skip}
And we want to have a shorthand for disabling a ligature.
55.54 \declare@shorthand{slovene}{"|}{%
55.55 \textormath{\discretionary{-}{}{\kern.03em}}{}}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
55.56 \ldf@finish{slovene}
55.57 h/codei

329
56 The Russian language
The le russianb.dtx67 denes all the language-specic macros for the Russian
language. It needs the le cyrcod for success documentation with Russian encod-
ings (see below).
For this language the character " is made active. In table 30 an overview is
given of its purpose.

"| disable ligature at this position.


"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"--- Cyrillic emdash in plain text.
"--~ Cyrillic emdash in compound names (surnames).
"--* Cyrillic emdash for denoting direct speech.
"" like "-, but producing no hyphen sign (for compund
words with hyphen, e.g. x-""y or some other signs
as disable/enable).
"~ for a compound word mark without a breakpoint.
"= for a compound word mark with a breakpoint, allow-
ing hyphenation in the composing words.
", thinspace for initials with a breakpoint in following
surname.
"` for German left double quotes (looks like ,,).
"' for German right double quotes (looks like ).
"< for French left double quotes (looks like <<).
"> for French right double quotes (looks like >>).

Table 30: The extra denitions made by russianb

The quotes in table 30 can also be typeset by using the commands in table 31.

\cdash--- Cyrillic emdash in plain text.


\cdash--~ Cyrillic emdash in compound names (surnames).
\cdash--* Cyrillic emdash for denoting direct speech.
\glqq for German left double quotes (looks like ,,).
\grqq for German right double quotes (looks like ).
\flqq for French left double quotes (looks like <<).
\frqq for French right double quotes (looks like >>).
\dq the original quotes character (").

Table 31: More commands which produce quotes, dened by babel

The French quotes are also available as ligatures `<<' and `>>' in 8-bit Cyrillic
font encodings (LCY, X2, T2*) and as `<' and `>' characters in 7-bit Cyrillic font
encodings (OT2 and LWN).
67 The le described in this section has version number ? and was last revised on ?. This le was
german.sty, which has some denitions for Russian.
initially derived from the original version of
ATEX 2.09), russian.sty version v2.5c
Later the denitions from russian.sty version 1.0b (for L
ATEX 2ε ) and francais.sty version 4.5c and germanb.sty version 2.5c were added.
(for L

330
The quotation marks traditionally used in Russian were borrowed from other
languages (e.g., French and German) so they keep their original names.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
56.1 h∗codei
56.2 \LdfInit{russian}{captionsrussian}
When this le is read as an option, i.e., by the \usepackage command,
russianb will be an `unknown' language, in which case we have to make it known.
So we check for the existence of \l@russian to see whether we have to do some-
thing here.
56.3 \ifx\l@russian\@undefined
56.4 \@nopatterns{Russian}
56.5 \adddialect\l@russian0
56.6 \fi

\latinencoding We need to know the encoding for text that is supposed to be which is active at
the end of the babel package. If the fontenc package is loaded later, then. . . too
bad!
56.7 \let\latinencoding\cf@encoding
The user may choose between dierent available Cyrillic encodingse.g., X2,
LCY, or LWN. Hopefully, X2 will eventually replace the two latter encodings (LCY
and LWN). If the user wants to use another font encoding than the default (T2A),
he has to load the corresponding le before russianb.sty. This may be done in
the following way:
% override the default X2 encoding used in Babel
\usepackage[LCY,OT1]{fontenc}
\usepackage[english,russian]{babel}

Note: for the Russian language, the T2A encoding is better than X2, because
X2 does not contain Latin letters, and users should be very careful to switch the
language every time they want to typeset a Latin word inside a Russian phrase or
vice versa.
We parse the \cdp@list containing the encodings known to LATEX in the order
they were loaded. We set the \cyrillicencoding to the last loaded encoding in
the list of supported Cyrillic encodings: OT2, LWN, LCY, X2, T2C, T2B, T2A, if any.
\def\reserved@a#1#2{%
56.8

56.9 \edef\reserved@b{#1}%
56.10 \edef\reserved@c{#2}%
56.11 \ifx\reserved@b\reserved@c
56.12 \let\cyrillicencoding\reserved@c
56.13 \fi}
56.14 \def\cdp@elt#1#2#3#4{%

56.15 \reserved@a{#1}{OT2}%
56.16 \reserved@a{#1}{LWN}%
56.17 \reserved@a{#1}{LCY}%
56.18 \reserved@a{#1}{X2}%
56.19 \reserved@a{#1}{T2C}%
56.20 \reserved@a{#1}{T2B}%
56.21 \reserved@a{#1}{T2A}}
56.22 \cdp@list

331
Now, if \cyrillicencoding is undened, then the user did not load any of
supported encodings. So, we have to set \cyrillicencoding to some default
value. We test the presence of the encoding denition les in the order from
less preferable to more preferable encodings. We use the lowercase names (i.e.,
lcyenc.def instead of LCYenc.def).
56.23 \ifx\cyrillicencoding\undefined
56.24 \IfFileExists{ot2enc.def}{\def\cyrillicencoding{OT2}}\relax
56.25 \IfFileExists{lwnenc.def}{\def\cyrillicencoding{LWN}}\relax
56.26 \IfFileExists{lcyenc.def}{\def\cyrillicencoding{LCY}}\relax
56.27 \IfFileExists{x2enc.def}{\def\cyrillicencoding{X2}}\relax
56.28 \IfFileExists{t2cenc.def}{\def\cyrillicencoding{T2C}}\relax
56.29 \IfFileExists{t2benc.def}{\def\cyrillicencoding{T2B}}\relax
56.30 \IfFileExists{t2aenc.def}{\def\cyrillicencoding{T2A}}\relax
If \cyrillicencoding is still undened, then the user seems not to have a
properly installed distribution. A fatal error.
56.31 \ifx\cyrillicencoding\undefined
56.32 \PackageError{babel}%
56.33 {No Cyrillic encoding definition files were found}%
56.34 {Your installation is incomplete.\MessageBreak
56.35 You need at least one of the following files:\MessageBreak
56.36 \space\space
56.37 x2enc.def, t2aenc.def, t2benc.def, t2cenc.def,\MessageBreak
56.38 \space\space
56.39 lcyenc.def, lwnenc.def, ot2enc.def.}%
56.40 \else
We avoid \usepackage[\cyrillicencoding]{fontenc} because we don't
want to force the switch of \encodingdefault.
56.41 \lowercase
56.42 \expandafter{\expandafter\input\cyrillicencoding enc.def\relax}%
56.43 \fi
56.44 \fi

\PackageInfo{babel}
{Using `\cyrillicencoding' as a default Cyrillic encoding}%

56.45 \DeclareRobustCommand{\Russian}{%
56.46 \fontencoding\cyrillicencoding\selectfont
56.47 \let\encodingdefault\cyrillicencoding
56.48 \expandafter\set@hyphenmins\russianhyphenmins
56.49 \language\l@russian}%
56.50 \DeclareRobustCommand{\English}{%

56.51 \fontencoding\latinencoding\selectfont
56.52 \let\encodingdefault\latinencoding
56.53 \expandafter\set@hyphenmins\englishhyphenmins
56.54 \language\l@english}%
56.55 \let\Rus\Russian

56.56 \let\Eng\English

56.57 \let\cyrillictext\Russian

56.58 \let\cyr\Russian

Since the X2 encoding does not contain Latin letters, we should make some
redenitions of LATEX macros which implicitly produce Latin letters.

332
56.59 \expandafter\ifx\csname T@X2\endcsname\relax\else
We put \latinencoding in braces to avoid problems with \@alph inside mini-
pages (e.g., footnotes inside minipages) where \@alph is expanded and we get for
example `\fontencoding OT1' (\fontencoding is robust).
56.60 \def\@alph#1{{\fontencoding{\latinencoding}\selectfont
56.61 \ifcase#1\or
56.62 a\or b\or c\or d\or e\or f\or g\or h\or
56.63 i\or j\or k\or l\or m\or n\or o\or p\or
56.64 q\or r\or s\or t\or u\or v\or w\or x\or
56.65 y\or z\else\@ctrerr\fi}}%
56.66 \def\@Alph#1{{\fontencoding{\latinencoding}\selectfont
56.67 \ifcase#1\or
56.68 A\or B\or C\or D\or E\or F\or G\or H\or
56.69 I\or J\or K\or L\or M\or N\or O\or P\or
56.70 Q\or R\or S\or T\or U\or V\or W\or X\or
56.71 Y\or Z\else\@ctrerr\fi}}%
Unfortunately, the commands \AA and \aa are not encoding dependent in
LATEX (unlike e.g., \oe or \DH). They are dened as \r{A} and \r{a}. This leads
to unpredictable results when the font encoding does not contain the Latin letters
`A' and `a' (like X2).
56.72 \DeclareTextSymbolDefault{\AA}{OT1}
56.73 \DeclareTextSymbolDefault{\aa}{OT1}
56.74 \DeclareTextCommand{\aa}{OT1}{\r a}
56.75 \DeclareTextCommand{\AA}{OT1}{\r A}
56.76 \fi

The following block redenes the character class of uppercase Greek letters
and some accents, if it is equal to 7 (variable family), to avoid incorrect results if
the font encoding in some math family does not contain these characters in places
of OT1 encoding. The code was taken from amsmath.dtx. See comments and
further explanation there.
56.77 % \begingroup\catcode`\"=12
56.78 % % uppercase greek letters:
56.79 % \def\@tempa#1{\expandafter\@tempb\meaning#1\relax\relax\relax\relax
56.80 % "0000\@nil#1}
56.81 % \def\@tempb#1"#2#3#4#5#6\@nil#7{%
56.82 % \ifnum"#2=7 \count@"1#3#4#5\relax
56.83 % \ifnum\count@<"1000 \else \global\mathchardef#7="0#3#4#5\relax \fi
56.84 % \fi}
56.85 % \@tempa\Gamma\@tempa\Delta\@tempa\Theta\@tempa\Lambda\@tempa\Xi
56.86 % \@tempa\Pi\@tempa\Sigma\@tempa\Upsilon\@tempa\Phi\@tempa\Psi
56.87 % \@tempa\Omega
56.88 % % some accents:
56.89 % \def\@tempa#1#2\@nil{\def\@tempc{#1}}\def\@tempb{\mathaccent}
56.90 % \expandafter\@tempa\hat\relax\relax\@nil
56.91 % \ifx\@tempb\@tempc
56.92 % \def\@tempa#1\@nil{#1}%
56.93 % \def\@tempb#1{\afterassignment\@tempa\mathchardef\@tempc=}%
56.94 % \def\do#1"#2{}
56.95 % \def\@tempd#1{\expandafter\@tempb#1\@nil
56.96 % \ifnum\@tempc>"FFF
56.97 % \xdef#1{\mathaccent"\expandafter\do\meaning\@tempc\space}%

333
56.98 % \fi}
56.99 % \@tempd\hat\@tempd\check\@tempd\tilde\@tempd\acute\@tempd\grave
56.100 % \@tempd\dot\@tempd\ddot\@tempd\breve\@tempd\bar
56.101 % \fi

56.102 % \endgroup

The user should use the inputenc package when any 8-bit Cyrillic font encod-
ing is used, selecting one of the Cyrillic input encodings. We do not assume any
default input encoding, so the user should explicitly call the inputenc package
by \usepackage{inputenc}. We also removed \AtBeginDocument, so inputenc
should be used before babel.
56.103 \@ifpackageloaded{inputenc}{}{%
56.104 \def\reserved@a{LWN}%
56.105 \ifx\reserved@a\cyrillicencoding\else
56.106 \def\reserved@a{OT2}%
56.107 \ifx\reserved@a\cyrillicencoding\else
56.108 \PackageWarning{babel}%
56.109 {No input encoding specified for Russian language}
56.110 \fi\fi}
Now we dene two commands that oer the possibility to switch between
Cyrillic and Roman encodings.

\cyrillictext The command \cyrillictext will switch from Latin font encoding to the Cyrillic
\latintext font encoding, the command \latintext switches back. This assumes that the
`normal' font encoding is a Latin one. These commands are declarations, for
shorter peaces of text the commands \textlatin and \textcyrillic can be
used.
56.111 %\DeclareRobustCommand{\latintext}{%
56.112 % \fontencoding{\latinencoding}\selectfont
56.113 % \def\encodingdefault{\latinencoding}}
56.114 \let\lat\latintext

\textcyrillic These commands take an argument which is then typeset using the requested font
\textlatin encoding.
56.115 \DeclareTextFontCommand{\textcyrillic}{\cyrillictext}
56.116 %\DeclareTextFontCommand{\textlatin}{\latintext}

We make the TEX


56.117 %\ifx\ltxTeX\undefined\let\ltxTeX\TeX\fi
56.118 %\ProvideTextCommandDefault{\TeX}{\textlatin{\ltxTeX}}
and LATEX logos encoding independent.
56.119 %\ifx\ltxLaTeX\undefined\let\ltxLaTeX\LaTeX\fi
56.120 %\ProvideTextCommandDefault{\LaTeX}{\textlatin{\ltxLaTeX}}
The next step consists of dening commands to switch to (and from) the Rus-
sian language.

\captionsrussian The macro \captionsrussian denes all strings used in the four standard doc-
ument classes provided with LATEX. The two commands \cyr and \lat activate
Cyrillic resp. Latin encoding.
56.121 \addto\captionsrussian{%
56.122 % FIXME: Where is the \prefacename used?

334
56.123 \def\prefacename{%
56.124 {\cyr\CYRP\cyrr\cyre\cyrd\cyri\cyrs\cyrl\cyro\cyrv\cyri\cyre}}%
56.125 % {\cyr\CYRV\cyrv\cyre\cyrd\cyre\cyrn\cyri\cyre}}%
56.126 \def\refname{%
56.127 {\cyr\CYRS\cyrp\cyri\cyrs\cyro\cyrk
56.128 \ \cyrl\cyri\cyrt\cyre\cyrr\cyra\cyrt\cyru\cyrr\cyrery}}%
56.129 % \def\refname{%
56.130 % {\cyr\CYRL\cyri\cyrt\cyre\cyrr\cyra\cyrt\cyru\cyrr\cyra}}%
56.131 \def\abstractname{%
56.132 {\cyr\CYRA\cyrn\cyrn\cyro\cyrt\cyra\cyrc\cyri\cyrya}}%
56.133 \def\bibname{%
56.134 {\cyr\CYRL\cyri\cyrt\cyre\cyrr\cyra\cyrt\cyru\cyrr\cyra}}%
56.135 % \def\bibname{%
56.136 % {\cyr\CYRB\cyri\cyrb\cyrl\cyri\cyro
56.137 % \cyrg\cyrr\cyra\cyrf\cyri\cyrya}}%
56.138 % for reports according to GOST:
56.139 % \def\bibname{%
56.140 % {\cyr\CYRS\cyrp\cyri\cyrs\cyro\cyrk
56.141 % \ \cyri\cyrs\cyrp\cyro\cyrl\cyrsftsn\cyrz\cyro\cyrv\cyra\cyrn
56.142 % \cyrn\cyrery\cyrh\ \cyri\cyrs\cyrt\cyro\cyrch\cyrn\cyri
56.143 % \cyrk\cyro\cyrv}}%
56.144 \def\chaptername{{\cyr\CYRG\cyrl\cyra\cyrv\cyra}}%
56.145 % \@ifundefined{chapter}{}{%
56.146 % \def\chaptername{{\cyr\CYRG\cyrl\cyra\cyrv\cyra}}}%
56.147 \def\appendixname{%
56.148 {\cyr\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}}%
There are two names for the Table of Contents that are used in Russian pub-
lications. For books (and reports) the second variant is appropriate, but for pro-
ceedings the rst variant is preferred:
56.149 \@ifundefined{thechapter}%
56.150 {\def\contentsname{%
56.151 {\cyr\CYRS\cyro\cyrd\cyre\cyrr\cyrzh\cyra\cyrn\cyri\cyre}}}%
56.152 {\def\contentsname{%
56.153 {\cyr\CYRO\cyrg\cyrl\cyra\cyrv\cyrl\cyre\cyrn\cyri\cyre}}}%
56.154 \def\listfigurename{%
56.155 {\cyr\CYRS\cyrp\cyri\cyrs\cyro\cyrk
56.156 \ \cyri\cyrl\cyrl\cyryu\cyrs\cyrt\cyrr\cyra\cyrc\cyri\cyrishrt}}%
56.157 % \def\listfigurename{%

56.158 % {\cyr\CYRS\cyrp\cyri\cyrs\cyro\cyrk
56.159 % \ \cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyro\cyrv}}%
56.160 \def\listtablename{%
56.161 {\cyr\CYRS\cyrp\cyri\cyrs\cyro\cyrk
56.162 \ \cyrt\cyra\cyrb\cyrl\cyri\cyrc}}%
56.163 \def\indexname{%
56.164 {\cyr\CYRP\cyrr\cyre\cyrd\cyrm\cyre\cyrt\cyrn\cyrery\cyrishrt
56.165 \ \cyru\cyrk\cyra\cyrz\cyra\cyrt\cyre\cyrl\cyrsftsn}}%
56.166 \def\authorname{%
56.167 {\cyr\CYRI\cyrm\cyre\cyrn\cyrn\cyro\cyrishrt
56.168 \ \cyru\cyrk\cyra\cyrz\cyra\cyrt\cyre\cyrl\cyrsftsn}}%
56.169 \def\figurename{{\cyr\CYRR\cyri\cyrs.}}%
56.170 \def\tablename{{\cyr\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}}%
56.171 \def\partname{{\cyr\CYRCH\cyra\cyrs\cyrt\cyrsftsn}}%
56.172 \def\enclname{{\cyr\cyrv\cyrk\cyrl.}}%

335
56.173 \def\ccname{{\cyr\cyri\cyrs\cyrh.}}%
56.174 % \def\ccname{{\cyr\cyri\cyrz}}%
56.175 \def\headtoname{{\cyr\cyrv\cyrh.}}%
56.176 % \def\headtoname{{\cyr\cyrv}}%

56.177 \def\pagename{{\cyr\cyrs.}}%
56.178 % \def\pagename{{\cyr\cyrs\cyrt\cyrr.}}%

56.179 \def\seename{{\cyr\cyrs\cyrm.}}%
56.180 \def\alsoname{{\cyr\cyrs\cyrm.\ \cyrt\cyra\cyrk\cyrzh\cyre}}%
56.181 \def\proofname{{\cyr\CYRD\cyro\cyrk\cyra\cyrz\cyra\cyrt
56.182 \cyre\cyrl\cyrsftsn\cyrs\cyrt\cyrv\cyro}}%
56.183 \def\glossaryname{Glossary}% <-- Needs translation
56.184 }

\daterussian The macro \daterussian redenes the command \today to produce Russian
dates.
56.185 \def\daterussian{%
56.186 \def\today{\number\day~\ifcase\month\or
56.187 \cyrya\cyrn\cyrv\cyra\cyrr\cyrya\or
56.188 \cyrf\cyre\cyrv\cyrr\cyra\cyrl\cyrya\or
56.189 \cyrm\cyra\cyrr\cyrt\cyra\or
56.190 \cyra\cyrp\cyrr\cyre\cyrl\cyrya\or
56.191 \cyrm\cyra\cyrya\or
56.192 \cyri\cyryu\cyrn\cyrya\or
56.193 \cyri\cyryu\cyrl\cyrya\or
56.194 \cyra\cyrv\cyrg\cyru\cyrs\cyrt\cyra\or
56.195 \cyrs\cyre\cyrn\cyrt\cyrya\cyrb\cyrr\cyrya\or
56.196 \cyro\cyrk\cyrt\cyrya\cyrb\cyrr\cyrya\or
56.197 \cyrn\cyro\cyrya\cyrb\cyrr\cyrya\or
56.198 \cyrd\cyre\cyrk\cyra\cyrb\cyrr\cyrya\fi
56.199 \ \number\year~\cyrg.}}

\extrasrussian The macro \extrasrussian will perform all the extra denitions needed for the
Russian language. The macro \noextrasrussian is used to cancel the actions of
\extrasrussian.
The rst action we dene is to switch on the selected Cyrillic encoding whenever
we enter `russian'.
56.200 \addto\extrasrussian{\cyrillictext}
When the encoding denition le was processed by LATEX the current font
encoding is stored in \latinencoding, assuming that LATEX uses T1 or OT1 as
default. Therefore we switch back to \latinencoding whenever the Russian lan-
guage is no longer `active'.
56.201 \addto\noextrasrussian{\latintext}

\verbatim@font In order to get both Latin and Cyrillic letters in verbatim text we need to change
the denition of an internal LATEX command somewhat:
56.202 %\def\verbatim@font{%
56.203 % \let\encodingdefault\latinencoding
56.204 % \normalfont\ttfamily
56.205 % \expandafter\def\csname\cyrillicencoding-cmd\endcsname##1##2{%
56.206 % \ifx\protect\@typeset@protect
56.207 % \begingroup\UseTextSymbol\cyrillicencoding##1\endgroup
56.208 % \else\noexpand##1\fi}}

336
The category code of the characters `:', `;', `!', and `?' is made \active to
insert a little white space.
For Russian (as well as for German) the " character also is made active.
Note: It is very questionable whether the Russian typesetting tradition re-
quires additional spacing before those punctuation signs. Therefore, we make the
corresponding code optional. If you need it, then dene the frenchpunct docstrip
option in babel.ins.
Borrowed from french. Some users dislike automatic insertion of a space before
`double punctuation', and prefer to decide themselves whether a space should be
added or not; so a hook \NoAutoSpaceBeforeFDP is provided: if this command is
added (in le russianb.cfg, or anywhere in a document) russianb will respect
your typing, and introduce a suitable space before `double punctuation' if and
only if a space is typed in the source le before those signs.
The command \AutoSpaceBeforeFDP switches back to the default behavior of
russianb.
56.209 h∗frenchpuncti
56.210 \initiate@active@char{:}
56.211 \initiate@active@char{;}

56.212 h/frenchpuncti

56.213 h∗frenchpunct | spanishligsi

56.214 \initiate@active@char{!}

56.215 \initiate@active@char{?}

56.216 h/frenchpunct | spanishligsi

56.217 \initiate@active@char{"}

The code above is necessary because we need extra active characters. The
character " is used as indicated in table 30.
We specify that the Russian group of shorthands should be used.
56.218 \addto\extrasrussian{\languageshorthands{russian}}
These characters are `turned on' once, later their denition may vary.
56.219 \addto\extrasrussian{%
56.220 hfrenchpuncti \bbl@activate{:}\bbl@activate{;}%
56.221 hfrenchpunct | spanishligsi \bbl@activate{!}\bbl@activate{?}%
56.222 \bbl@activate{"}}
56.223 \addto\noextrasrussian{%

56.224 hfrenchpuncti \bbl@deactivate{:}\bbl@deactivate{;}%


56.225 hfrenchpunct | spanishligsi \bbl@deactivate{!}\bbl@deactivate{?}%
56.226 \bbl@deactivate{"}}
The X2 and T2* encodings do not contain spanish_shriek and spanish_query
symbols; as a consequence, the ligatures `?`' and `!`' do not work with them (these
characters are useless for Cyrillic texts anyway). But we dene the shorthands to
emulate these ligatures (optionally).
We do not use \latinencoding here (but instead explicitly use OT1) because
the user may choose T2A to be the primary encoding, but it does not contain these
characters.
56.227 h∗spanishligsi
56.228 \declare@shorthand{russian}{?`}{\UseTextSymbol{OT1}\textquestiondown}
56.229 \declare@shorthand{russian}{!`}{\UseTextSymbol{OT1}\textexclamdown}

56.230 h/spanishligsi

337
\russian@sh@;@ We have to reduce the amount of white space before ;, : and !. This should only
\russian@sh@:@ happen in horizontal mode, hence the test with \ifhmode.
\russian@sh@!@56.231 h∗frenchpuncti
\russian@sh@?@56.232 \declare@shorthand{russian}{;}{%
56.233 \ifhmode
In horizontal mode we check for the presence of a `space', `unskip' if it exists
and place a 0.1em kerning.
56.234 \ifdim\lastskip>\z@
56.235 \unskip\nobreak\kern.1em
56.236 \else
If no space has been typed, we add \FDP@thinspace which will be dened, up to
the user's wishes, as an automatic added thinspace, or as \@empty.
56.237 \FDP@thinspace
56.238 \fi
56.239 \fi
Now we can insert a `;' character.
56.240 \string;}
The other denitions are very similar.
56.241 \declare@shorthand{russian}{:}{%
56.242 \ifhmode
56.243 \ifdim\lastskip>\z@
56.244 \unskip\nobreak\kern.1em
56.245 \else
56.246 \FDP@thinspace
56.247 \fi
56.248 \fi
56.249 \string:}
56.250 \declare@shorthand{russian}{!}{%
56.251 \ifhmode
56.252 \ifdim\lastskip>\z@
56.253 \unskip\nobreak\kern.1em
56.254 \else
56.255 \FDP@thinspace
56.256 \fi
56.257 \fi
56.258 \string!}
56.259 \declare@shorthand{russian}{?}{%
56.260 \ifhmode
56.261 \ifdim\lastskip>\z@
56.262 \unskip\nobreak\kern.1em
56.263 \else
56.264 \FDP@thinspace
56.265 \fi
56.266 \fi
56.267 \string?}

338
\AutoSpaceBeforeFDP \FDP@thinspace is dened as unbreakable spaces if \AutoSpaceBeforeFDP is
\NoAutoSpaceBeforeFDP activated or as \@empty if \NoAutoSpaceBeforeFDP is in use. The default is
\FDP@thinspace \AutoSpaceBeforeFDP.
56.268 \def\AutoSpaceBeforeFDP{%
56.269 \def\FDP@thinspace{\nobreak\kern.1em}}
56.270 \def\NoAutoSpaceBeforeFDP{\let\FDP@thinspace\@empty}

56.271 \AutoSpaceBeforeFDP

\FDPon The next macros allow to switch on/o activeness of double punctuation signs.
\FDPoff56.272 \def\FDPon{\bbl@activate{:}%
56.273 \bbl@activate{;}%
56.274 \bbl@activate{?}%
56.275 \bbl@activate{!}}
56.276 \def\FDPoff{\bbl@deactivate{:}%

56.277 \bbl@deactivate{;}%
56.278 \bbl@deactivate{?}%
56.279 \bbl@deactivate{!}}

\system@sh@:@ When the active characters appear in an environment where their Russian be-
\system@sh@!@ haviour is not wanted they should give an `expected' result. Therefore we dene
\system@sh@?@ shorthands at system level as well.
\system@sh@;@56.280 \declare@shorthand{system}{:}{\string:}
56.281 \declare@shorthand{system}{;}{\string;}
56.282 h/frenchpuncti
56.283 h∗frenchpunct&!spanishligsi

56.284 \declare@shorthand{system}{!}{\string!}

56.285 \declare@shorthand{system}{?}{\string?}

56.286 h/frenchpunct&!spanishligsi

To be able to dene the function of `"', we rst dene a couple of `support'


macros.

\dq We save the original double quote character in \dq to keep it available, the math
accent \" can now be typed as `"'.
56.287 \begingroup \catcode`\"12
56.288 \def\reserved@a{\endgroup
56.289 \def\@SS{\mathchar"7019 }
56.290 \def\dq{"}}
56.291 \reserved@a

Now we can dene the doublequote macros: german and french quotes. We
use denitions of these quotes made in babel.sty. The french quotes are contained
in the T2* encodings.
56.292 \declare@shorthand{russian}{"`}{\glqq}
56.293 \declare@shorthand{russian}{"'}{\grqq}
56.294 \declare@shorthand{russian}{"<}{\flqq}

56.295 \declare@shorthand{russian}{">}{\frqq}

Some additional commands:


56.296 \declare@shorthand{russian}{""}{\hskip\z@skip}
56.297 \declare@shorthand{russian}{"~}{\textormath{\leavevmode\hbox{-}}{-}}
56.298 \declare@shorthand{russian}{"=}{\nobreak-\hskip\z@skip}

339
56.299 \declare@shorthand{russian}{"|}{%
56.300 \textormath{\nobreak\discretionary{-}{}{\kern.03em}%
56.301 \allowhyphens}{}}
The next two macros for "- and "--- are somewhat dierent. We must check
whether the second token is a hyphen character:
56.302 \declare@shorthand{russian}{"-}{%
If the next token is `-', we typeset an emdash, otherwise a hyphen sign:
56.303 \def\russian@sh@tmp{%
56.304 \if\russian@sh@next-\expandafter\russian@sh@emdash
56.305 \else\expandafter\russian@sh@hyphen\fi
56.306 }%
TEX looks for the next token after the rst `-': the meaning of this token is
written to \russian@sh@next and \russian@sh@tmp is called.
56.307 \futurelet\russian@sh@next\russian@sh@tmp}
Here are the denitions of hyphen and emdash. First the hyphen:
56.308 \def\russian@sh@hyphen{%
56.309 \nobreak\-\bbl@allowhyphens}
For the emdash denition, there are the two parameters: we must `eat' two
last hyphen signs of our emdash. . . :
56.310 \def\russian@sh@emdash#1#2{\cdash-#1#2}

\cdash . . . these two parameters are useful for another macro: \cdash:
56.311 %\ifx\cdash\undefined % should be defined earlier
56.312 \def\cdash#1#2#3{\def\tempx@{#3}%
56.313 \def\tempa@{-}\def\tempb@{~}\def\tempc@{*}%

56.314 \ifx\tempx@\tempa@\@Acdash\else
56.315 \ifx\tempx@\tempb@\@Bcdash\else
56.316 \ifx\tempx@\tempc@\@Ccdash\else
56.317 \errmessage{Wrong usage of cdash}\fi\fi\fi}
second parameter (or third for \cdash) shows what kind of emdash to create in
next step
"--- ordinary (plain) Cyrillic emdash inside text: an unbreakable thinspace will
be inserted before only in case of a space before the dash (it is necessary
for dashes after display maths formulae: there could be lists, enumerations
etc. started with  where a is ... i.e., the dash starts a line). (Firstly
there were planned rather soft rules for user: he may put a space before
the dash or not. But it is dicult to place this thinspace automatically,
i.e., by checking modes because after display formulae TEX uses horizontal
mode. Maybe there is a misunderstanding? Maybe there is another way?)
After a dash a breakable thinspace is always placed;
56.318 % What is more grammatically: .2em or .2\fontdimen6\font ?
56.319 \def\@Acdash{\ifdim\lastskip>\z@\unskip\nobreak\hskip.2em\fi
56.320 \cyrdash\hskip.2em\ignorespaces}%

"--~ emdash in compound names or surnames (like MendeleevKlapeiron); this


dash has no space characters around; after the dash some space is added
\exhyphenalty

340
56.321 \def\@Bcdash{\leavevmode\ifdim\lastskip>\z@\unskip\fi
56.322 \nobreak\cyrdash\penalty\exhyphenpenalty\hskip\z@skip\ignorespaces}%

"--* for denoting direct speech (a space like \enskip must follow the emdash);
56.323 \def\@Ccdash{\leavevmode
56.324 \nobreak\cyrdash\nobreak\hskip.35em\ignorespaces}%
56.325 %\fi

\cyrdash Finally the macro for body of the Cyrillic emdash. The \cyrdash macro will
be dened in case this macro hasn't been dened in a fontenc le. For T2* fonts,
cyrdash will be placed in the code of the English emdash thus it uses ligature ---.
56.326 % Is there an IF necessary?
56.327 \ifx\cyrdash\undefined
56.328 \def\cyrdash{\hbox to.8em{--\hss--}}
56.329 \fi

Here a really new macroto place thinspace between initials. This macro used
instead of \, allows hyphenation in the following surname.
56.330 \declare@shorthand{russian}{",}{\nobreak\hskip.2em\ignorespaces}

\mdqon All that's left to do now is to dene a couple of commands for ".
\mdqoff56.331 \def\mdqon{\bbl@activate{"}}
56.332 \def\mdqoff{\bbl@deactivate{"}}

The Russian hyphenation patterns can be used with \lefthyphenmin and


\righthyphenmin set to 2.
56.333 \providehyphenmins{\CurrentOption}{\tw@\tw@}
56.334 % temporary hack:
56.335 \ifx\englishhyphenmins\undefined

56.336 \def\englishhyphenmins{\tw@\thr@@}
56.337 \fi

Now the action \extrasrussian has to execute is to make sure that the
command \frenchspacing is in eect. If this is not the case the execution of
\noextrasrussian will switch it o again.
56.338 \addto\extrasrussian{\bbl@frenchspacing}
56.339 \addto\noextrasrussian{\bbl@nonfrenchspacing}

Next we add a new enumeration style for Russian manuscripts with Cyrillic
letters, and later on we dene some math operator names in accordance with
Russian typesetting traditions.

\Asbuk We begin by dening \Asbuk which works like \Alph, but produces (uppercase)
Cyrillic letters intead of Latin ones. The letters YO, ISHRT, HRDSN, ERY, and
SFTSN are skipped, as usual for such enumeration.
56.340 \def\Asbuk#1{\expandafter\@Asbuk\csname c@#1\endcsname}
56.341 \def\@Asbuk#1{\ifcase#1\or
56.342 \CYRA\or\CYRB\or\CYRV\or\CYRG\or\CYRD\or\CYRE\or\CYRZH\or
56.343 \CYRZ\or\CYRI\or\CYRK\or\CYRL\or\CYRM\or\CYRN\or\CYRO\or
56.344 \CYRP\or\CYRR\or\CYRS\or\CYRT\or\CYRU\or\CYRF\or\CYRH\or
56.345 \CYRC\or\CYRCH\or\CYRSH\or\CYRSHCH\or\CYREREV\or\CYRYU\or
56.346 \CYRYA\else\@ctrerr\fi}

341
\asbuk The macro \asbuk is similar to \alph; it produces lowercase Russian letters.
56.347 \def\asbuk#1{\expandafter\@asbuk\csname c@#1\endcsname}
56.348 \def\@asbuk#1{\ifcase#1\or
56.349 \cyra\or\cyrb\or\cyrv\or\cyrg\or\cyrd\or\cyre\or\cyrzh\or
56.350 \cyrz\or\cyri\or\cyrk\or\cyrl\or\cyrm\or\cyrn\or\cyro\or
56.351 \cyrp\or\cyrr\or\cyrs\or\cyrt\or\cyru\or\cyrf\or\cyrh\or
56.352 \cyrc\or\cyrch\or\cyrsh\or\cyrshch\or\cyrerev\or\cyryu\or
56.353 \cyrya\else\@ctrerr\fi}

Set up default Cyrillic math alphabets. To use Cyrillic letters in math mode
user should load the textmath package before loading fontenc package (or babel).
Note, that by default Cyrillic letters are taken from upright font in math mode
(unlike Latin letters).
56.354 %\RequirePackage{textmath}
56.355 \@ifundefined{sym\cyrillicencoding letters}{}{%
56.356 \SetSymbolFont{\cyrillicencoding letters}{bold}\cyrillicencoding

56.357 \rmdefault\bfdefault\updefault
56.358 \DeclareSymbolFontAlphabet\cyrmathrm{\cyrillicencoding letters}

And we need a few commands to be able to switch to dierent variants.


56.359 \DeclareMathAlphabet\cyrmathbf\cyrillicencoding
56.360 \rmdefault\bfdefault\updefault
56.361 \DeclareMathAlphabet\cyrmathsf\cyrillicencoding

56.362 \sfdefault\mddefault\updefault
56.363 \DeclareMathAlphabet\cyrmathit\cyrillicencoding

56.364 \rmdefault\mddefault\itdefault
56.365 \DeclareMathAlphabet\cyrmathtt\cyrillicencoding

56.366 \ttdefault\mddefault\updefault
56.367 %

56.368 \SetMathAlphabet\cyrmathsf{bold}\cyrillicencoding

56.369 \sfdefault\bfdefault\updefault
56.370 \SetMathAlphabet\cyrmathit{bold}\cyrillicencoding

56.371 \rmdefault\bfdefault\itdefault
56.372 }

Some math functions in Russian math books have other names: e.g., sinh in
Russian is written as sh etc. So we dene a number of new math operators.
\sinh:
56.373 \def\sh{\mathop{\operator@font sh}\nolimits}
\cosh:
56.374 \def\ch{\mathop{\operator@font ch}\nolimits}
\tan:
56.375 \def\tg{\mathop{\operator@font tg}\nolimits}
\arctan:
56.376 \def\arctg{\mathop{\operator@font arctg}\nolimits}
arcctg:
56.377 \def\arcctg{\mathop{\operator@font arcctg}\nolimits}
The following macro conicts with \th dened in Latin 1 encoding:
\tanh:
56.378 \addto\extrasrussian{%
56.379 \babel@save{\th}%

342
56.380 \let\ltx@th\th
56.381 \def\th{\textormath{\ltx@th}%
56.382 {\mathop{\operator@font th}\nolimits}}%
56.383 }
\cot:
56.384 \def\ctg{\mathop{\operator@font ctg}\nolimits}
\coth:
56.385 \def\cth{\mathop{\operator@font cth}\nolimits}
\csc:
56.386 \def\cosec{\mathop{\operator@font cosec}\nolimits}
And nally some other Russian mathematical symbols:
56.387 \def\Prob{\mathop{\kern\z@\mathsf{P}}\nolimits}
56.388 \def\Variance{\mathop{\kern\z@\mathsf{D}}\nolimits}
56.389 \def\nod{\mathop{\cyrmathrm{\cyrn.\cyro.\cyrd.}}\nolimits}

56.390 \def\nok{\mathop{\cyrmathrm{\cyrn.\cyro.\cyrk.}}\nolimits}

56.391 \def\NOD{\mathop{\cyrmathrm{\CYRN\CYRO\CYRD}}\nolimits}

56.392 \def\NOK{\mathop{\cyrmathrm{\CYRN\CYRO\CYRK}}\nolimits}

56.393 \def\Proj{\mathop{\cyrmathrm{\CYRP\cyrr}}\nolimits}

This is for compatibility with older Russian packages.


56.394 \DeclareRobustCommand{\No}{%
56.395 \ifmmode{\nfss@text{\textnumero}}\else\textnumero\fi}
The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
56.396 \ldf@finish{russian}
56.397 h/codei

343
57 The Bulgarian language
The le bulgarian.dtx68 provides the language-specic macros for the Bulgarian
language.
Users should take note of the vaious cyrillic dashes available now (see below).
These should remove many causes of headache. Also, although by default the Bul-
garian quotation marks will appear automatically when typesetting in Bulgarian,
it is better to use the new commands \"' and \"' which explicitly typeset them.
Note: automatic switch to Bulgarian quotation is withdrawn for the moment and
may not be reintroduced at all.
For this language the character " is made active. In table 32 an overview is
given of its purpose.

"| disable ligature at this position.


"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"--- Cyrillic emdash in plain text.
"--~ Cyrillic emdash in compound names (surnames).
"--* Cyrillic emdash for denoting direct speech.
"" like "-, but producing no hyphen sign (for compound
words with hyphen, e.g. x-""y or some other signs
as disable/enable).
"~ for a compound word mark without a breakpoint.
"= for a compound word mark with a breakpoint, allow-
ing hyphenation in the composing words.
", thinspace for initials with a breakpoint in following
surname.
"` for German left double quotes (looks like ,,).
"' for German right double quotes (looks like ).
"< for French left double quotes (looks like <<).
"> for French right double quotes (looks like >>).

Table 32: The extra denitions made bybulgarian

The quotes in table 32 can also be typeset by using the commands in table 33.
The French quotes are also available as ligatures `<<' and `>>' in 8-bit Cyrillic
font encodings (LCY, X2, T2*) and as `<' and `>' characters in 7-bit Cyrillic font
encodings (OT2 and LWN).
The quotation marks traditionally used in Bulgarian were borrowed from Ger-
man o they keep their original names. French quotation marks may be seen as
well in older books.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
57.1 h∗codei
57.2 \LdfInit{bulgarian}{captionsbulgarian}
68 The le described in this section has version number ? and was last revised on ?. This le
was initially derived from the August-1998 version of russianb.dtx.
It is (reasonably) backward compatible with the 1994/1996 (non-babel) bulgarian style (bul-
garia.sty) by Georgi Boshnakovles prepared for that style should compile successfully (with
vastly improved appearance due to usage of standard fonts).

344
\cdash--- Cyrillic emdash in plain text.
\cdash--~ Cyrillic emdash in compound names (surnames).
\cdash--* Cyrillic emdash for denoting direct speech.
\glqq for German left double quotes (looks like,,).
\grqq for German right double quotes (looks like ).
\flqq for French left double quotes (looks like <<).
\frqq for French right double quotes (looks like >>).
\dq the original quotes character (").

Table 33: More commands which produce quotes, dened by babel

When this le is read as an option, i.e., by the \usepackage command,


bulgarian will be an `unknown' language, in which case we have to make it
known. So we check for the existence of \l@bulgarian to see whether we have to
do something here.
57.3 \ifx\l@bulgarian\@undefined
57.4 \@nopatterns{Bulgarian}
57.5 \adddialect\l@bulgarian0
57.6 \fi

\latinencoding We need to know the encoding for text that is supposed to be which is active at
the end of the babel package. If the fontenc package is loaded later, then . . . too
bad!
57.7 \let\latinencoding\cf@encoding

The user may choose between dierent available Cyrillic encodingse.g., X2,
LCY, or LWN. If the user wants to use a font encoding other than the default (T2A),
he has to load the corresponding le before bulgarian.sty. This may be done in
the following way:

\usepackage[LCY,OT1]{fontenc} %overwrite the default encoding;


\usepackage[english,bulgarian]{babel}

Note: most people would prefer the T2A to X2, because X2 does not contain
Latin letters, and users should be very careful to switch the language every time
they want to typeset a Latin word inside a Bulgarian phrase or vice versa. On
the other hand, switching the language is a good practice anyway. With a decent
text processing program it does not involve more work than switching between the
Bulgarian and English keyboard. Moreover that the far most common disruption
occurs as a result of forgetting to switch back to cyrillic keyboard.
We parse the \cdp@list containing the encodings known to LATEX in the order
they were loaded. We set the \cyrillicencoding to the last loaded encoding in
the list of supported Cyrillic encodings: OT2, LWN, LCY, X2, T2C, T2B, T2A, if any.
\def\reserved@a#1#2{%
57.8

57.9 \edef\reserved@b{#1}%
57.10 \edef\reserved@c{#2}%
57.11 \ifx\reserved@b\reserved@c
57.12 \let\cyrillicencoding\reserved@c
57.13 \fi}

345
57.14 \def\cdp@elt#1#2#3#4{%
57.15 \reserved@a{#1}{OT2}%
57.16 \reserved@a{#1}{LWN}%
57.17 \reserved@a{#1}{LCY}%
57.18 \reserved@a{#1}{X2}%
57.19 \reserved@a{#1}{T2C}%
57.20 \reserved@a{#1}{T2B}%
57.21 \reserved@a{#1}{T2A}}
57.22 \cdp@list

Now, if \cyrillicencoding is undened, then the user did not load any of
supported encodings. So, we have to set \cyrillicencoding to some default
value. We test the presence of the encoding denition les in the order from
less preferable to more preferable encodings. We use the lowercase names (i.e.,
lcyenc.def instead of LCYenc.def).
57.23 \ifx\cyrillicencoding\undefined
57.24 \IfFileExists{ot2enc.def}{\def\cyrillicencoding{OT2}}\relax
57.25 \IfFileExists{lwnenc.def}{\def\cyrillicencoding{LWN}}\relax
57.26 \IfFileExists{lcyenc.def}{\def\cyrillicencoding{LCY}}\relax
57.27 \IfFileExists{x2enc.def}{\def\cyrillicencoding{X2}}\relax
57.28 \IfFileExists{t2cenc.def}{\def\cyrillicencoding{T2C}}\relax
57.29 \IfFileExists{t2benc.def}{\def\cyrillicencoding{T2B}}\relax
57.30 \IfFileExists{t2aenc.def}{\def\cyrillicencoding{T2A}}\relax
If \cyrillicencoding is still undened, then the user seems not to have a
properly installed distribution. A fatal error.
57.31 \ifx\cyrillicencoding\undefined
57.32 \PackageError{babel}%
57.33 {No Cyrillic encoding definition files were found}%
57.34 {Your installation is incomplete. \MessageBreak
57.35 You need at least one of the following files: \MessageBreak
57.36 \space\space
57.37 x2enc.def, t2aenc.def, t2benc.def, t2cenc.def, \MessageBreak
57.38 \space\space
57.39 lcyenc.def, lwnenc.def, ot2enc.def.}%
57.40 \else
We avoid \usepackage[\cyrillicencoding]{fontenc} because we don't
want to force the switch of \encodingdefault.
57.41 \lowercase
57.42 \expandafter{\expandafter\input\cyrillicencoding enc.def\relax}%
57.43 \fi
57.44 \fi

\PackageInfo{babel}
{Using `\cyrillicencoding' as a default Cyrillic encoding}%

57.45 \DeclareRobustCommand{\Bulgarian}{%
57.46 \fontencoding\cyrillicencoding\selectfont
57.47 \let\encodingdefault\cyrillicencoding
57.48 \expandafter\set@hyphenmins\bulgarianhyphenmins
57.49 \language\l@bulgarian}
57.50 \DeclareRobustCommand{\English}{%

346
57.51 \fontencoding\latinencoding\selectfont
57.52 \let\encodingdefault\latinencoding
57.53 \expandafter\set@hyphenmins\englishhyphenmins
57.54 \language\l@english}
57.55 \let\Bul\Bulgarian

57.56 \let\Bg\Bulgarian

57.57 \let\cyrillictext\Bulgarian

57.58 \let\cyr\Bulgarian

57.59 \let\Eng\English

57.60 \def\selectenglanguage{\selectlanguage{english}}

57.61 \def\selectbglanguage{\selectlanguage{bulgarian}}

Since the X2 encoding does not contain Latin letters,we should make some
redenitions of LATEX macros which implicitly produce Latin letters.
57.62 \expandafter\ifx\csname T@X2\endcsname\relax\else
We put \latinencoding in braces to avoid problems with \@alph inside mini-
pages (e.g., footnotes inside minipages) where \@alph is expanded and we get for
example `\fontencoding OT1' (\fontencoding is robust).
57.63 \def\@Alph@eng#1{{\fontencoding{\latinencoding}\selectfont
57.64 \ifcase#1\or A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or
57.65 K\or L\or M\or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or
57.66 X\or Y\or Z\else \@ctrerr\fi}}%
57.67 \def\@alph@eng#1{{\fontencoding{\latinencoding}\selectfont
57.68 \ifcase#1\or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or
57.69 k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or
57.70 x\or y\or z\else \@ctrerr\fi}}%
57.71 \let\@Alph\@Alph@eng
57.72 \let\@alph\@alph@eng
Unfortunately, the commands \AA and \aa are not encoding dependent in
LATEX (unlike e.g., \oe or \DH). They are dened as \r{A} and \r{a}. This leads
to unpredictable results when the font encoding does not contain the Latin letters
`A' and `a' (like X2).
57.73 \DeclareTextSymbolDefault{\AA}{OT1}
57.74 \DeclareTextSymbolDefault{\aa}{OT1}
57.75 \DeclareTextCommand{\AA}{OT1}{\r A}
57.76 \DeclareTextCommand{\aa}{OT1}{\r a}
57.77 \fi

The following block redenes the character class of uppercase Greek letters
and some accents, if it is equal to 7 (variable family), to avoid incorrect results if
the font encoding in some math family does not contain these characters in places
of OT1 encoding. The code was taken from amsmath.dtx. See comments and
further explanation there.
57.78 \begingroup\catcode`\"=12
57.79 % uppercase greek letters:
57.80 \def\@tempa#1{\expandafter\@tempb\meaning#1\relax\relax\relax\relax

57.81 "0000\@nil#1}
57.82 \def\@tempb#1"#2#3#4#5#6\@nil#7{%

57.83 \ifnum"#2=7 \count@"1#3#4#5\relax

57.84 \ifnum\count@<"1000 \else \global\mathchardef#7="0#3#4#5\relax \fi

57.85 \fi}

347
57.86 \@tempa\Gamma\@tempa\Delta\@tempa\Theta\@tempa\Lambda\@tempa\Xi
57.87 \@tempa\Pi\@tempa\Sigma\@tempa\Upsilon\@tempa\Phi\@tempa\Psi
57.88 \@tempa\Omega

57.89 % some accents:

57.90 \def\@tempa#1#2\@nil{\def\@tempc{#1}}\def\@tempb{\mathaccent}

57.91 \expandafter\@tempa\hat\relax\relax\@nil

57.92 \ifx\@tempb\@tempc

57.93 \def\@tempa#1\@nil{#1}%

57.94 \def\@tempb#1{\afterassignment\@tempa\mathchardef\@tempc=}%

57.95 \def\do#1"#2{}

57.96 \def\@tempd#1{\expandafter\@tempb#1\@nil

57.97 \ifnum\@tempc>"FFF
57.98 \xdef#1{\mathaccent"\expandafter\do\meaning\@tempc\space}%
57.99 \fi}
57.100 \@tempd\hat\@tempd\check\@tempd\tilde\@tempd\acute\@tempd\grave

57.101 \@tempd\dot\@tempd\ddot\@tempd\breve\@tempd\bar

57.102 \fi

57.103 \endgroup

The user should use the inputenc package when any 8-bit Cyrillic font encod-
ing is used, selecting one of the Cyrillic input encodings. We do not assume any
default input encoding, so the user should explicitly call the inputenc package
by \usepackage{inputenc}. We also removed \AtBeginDocument, so inputenc
should be used before babel.
57.104 \@ifpackageloaded{inputenc}{}{%
57.105 \def\reserved@a{LWN}%
57.106 \ifx\reserved@a\cyrillicencoding\else

57.107 \def\reserved@a{OT2}%

57.108 \ifx\reserved@a\cyrillicencoding\else

57.109 \PackageWarning{babel}%

57.110 {No input encoding specified for Bulgarian language}\fi\fi}

Now we dene two commands that oer the possibility to switch between
Cyrillic and Roman encodings.

\cyrillictext The command \cyrillictext will switch from Latin font encoding to the Cyrillic
\latintext font encoding, the command \latintext switches back. This assumes that the
`normal' font encoding is a Latin one. These commands are declarations, for
shorter peaces of text the commands \textlatin and \textcyrillic can be
used.
We comment out \latintext since it is dened in the core of babel (babel.def).
We add the shorthand \lat for \latintext. Note that \cyrillictext has been
dened above.
57.111 % \DeclareRobustCommand{\latintext}{%
57.112 % \fontencoding{\latinencoding}\selectfont
57.113 % \def\encodingdefault{\latinencoding}}
57.114 \let\lat\latintext

\textcyrillic These commands take an argument which is then typeset using the requested font
\textlatin encoding. \textlatin is commented out since it is dened in the core of babel.
(It is dened there with \DeclareRobustCommand instead.)
57.115 \DeclareTextFontCommand{\textcyrillic}{\cyrillictext}
57.116 % \DeclareTextFontCommand{\textlatin}{\latintext}

348
The next step consists of dening commands to switch to (and from) the Bul-
garian language.
\captionsbulgarian The macro \captionsbulgarian denes all strings used in the four standard
document classes provided with LATEX. The two commands \cyr and \lat activate
Cyrillic resp. Latin encoding.
57.117 \addto\captionsbulgarian{%
57.118 \def\prefacename{%
57.119 {\cyr\CYRP\cyrr\cyre\cyrd\cyrg\cyro\cyrv\cyro\cyrr}}%
57.120 \def\refname{%
57.121 {\cyr\CYRL\cyri\cyrt\cyre\cyrr\cyra\cyrt\cyru\cyrr\cyra}}%
57.122 \def\abstractname{%
57.123 {\cyr\CYRA\cyrb\cyrs\cyrt\cyrr\cyra\cyrk\cyrt}}%
57.124 \def\bibname{%
57.125 {\cyr\CYRB\cyri\cyrb\cyrl\cyri\cyro\cyrg\cyrr\cyra\cyrf\cyri\cyrya}}%
57.126 \def\chaptername{%
57.127 {\cyr\CYRG\cyrl\cyra\cyrv\cyra}}%
57.128 \def\appendixname{%
57.129 {\cyr\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}}%
57.130 \def\contentsname{%
57.131 {\cyr\CYRS\cyrhrdsn\cyrd\cyrhrdsn\cyrr\cyrzh\cyra\cyrn\cyri\cyre}}%
57.132 \def\listfigurename{%
57.133 {\cyr\CYRS\cyrp\cyri\cyrs\cyrhrdsn\cyrk\ \cyrn\cyra\ \cyrf\cyri\cyrg\cyru\cyrr\cyri\cyrt\c
57.134 \def\listtablename{%
57.135 {\cyr\CYRS\cyrp\cyri\cyrs\cyrhrdsn\cyrk\ \cyrn\cyra\ \cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyri\c
57.136 \def\indexname{%
57.137 {\cyr\CYRA\cyrz\cyrb\cyru\cyrch\cyre\cyrn\ \cyru\cyrk\cyra\cyrz\cyra\cyrt\cyre\cyrl}}%
57.138 \def\authorname{%
57.139 {\cyr\CYRI\cyrm\cyre\cyrn\cyre\cyrn\ \cyru\cyrk\cyra\cyrz\cyra\cyrt\cyre\cyrl}}%
57.140 \def\figurename{%
57.141 {\cyr\CYRF\cyri\cyrg\cyru\cyrr\cyra}}%
57.142 \def\tablename{%
57.143 {\cyr\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}}%
57.144 \def\partname{%
57.145 {\cyr\CYRCH\cyra\cyrs\cyrt}}%
57.146 \def\enclname{%
57.147 {\cyr\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}}%
57.148 \def\ccname{%
57.149 {\cyr\cyrk\cyro\cyrp\cyri\cyrya}}%
57.150 \def\headtoname{%
57.151 {\cyr\CYRZ\cyra}}%
57.152 \def\pagename{%
57.153 {\cyr\CYRS\cyrt\cyrr.}}%
57.154 \def\seename{%
57.155 {\cyr\cyrv\cyrzh.}}%
57.156 \def\alsoname{%
57.157 {\cyr\cyrv\cyrzh.\ \cyrs\cyrhrdsn\cyrshch\cyro\ \cyri}}%
57.158 \def\proofname{Proof}% <-- Needs translation
57.159 \def\glossaryname{Glossary}% <-- Needs translation
57.160 }

\datebulgarian The macro \datebulgarian redenes the command \today to produce Bulgarian
dates. It also provides the command \todayRoman which produces the date with
the month in capital roman numerals, a popular format for dates in Bulgarian.

349
57.161 \def\datebulgarian{%
57.162 \def\month@bulgarian{\ifcase\month\or
57.163 \cyrya\cyrn\cyru\cyra\cyrr\cyri\or
57.164 \cyrf\cyre\cyrv\cyrr\cyru\cyra\cyrr\cyri\or
57.165 \cyrm\cyra\cyrr\cyrt\or
57.166 \cyra\cyrp\cyrr\cyri\cyrl\or
57.167 \cyrm\cyra\cyrishrt\or
57.168 \cyryu\cyrn\cyri\or
57.169 \cyryu\cyrl\cyri\or
57.170 \cyra\cyrv\cyrg\cyru\cyrs\cyrt\or
57.171 \cyrs\cyre\cyrp\cyrt\cyre\cyrm\cyrv\cyrr\cyri\or
57.172 \cyro\cyrk\cyrt\cyro\cyrm\cyrv\cyrr\cyri\or
57.173 \cyrn\cyro\cyre\cyrm\cyrv\cyrr\cyri\or
57.174 \cyrd\cyre\cyrk\cyre\cyrm\cyrv\cyrr\cyri\fi}%
57.175 \def\month@Roman{\expandafter\@Roman\month}%
57.176 \def\today{\number\day~\month@bulgarian\ \number\year~\cyrg.}%
57.177 \def\todayRoman{\number\day.\,\month@Roman.\,\number\year~\cyrg.}%
57.178 }

\todayRoman The month is often written with roman numbers in Bulgarian dates. Here we
dene date in this format:
57.179 \def\Romannumeral#1{\uppercase\expandafter{\romannumeral #1}}
57.180 \def\todayRoman{\number\day.\Romannumeral{\month}.\number\year~\cyrg.}

\extrasbulgarian The macro \extrasbulgarian will perform all the extra denitions needed for
the Bulgarian language. The macro \noextrasbulgarian is used to cancel the
actions of \extrasbulgarian.
The rst action we dene is to switch on the selected Cyrillic encoding whenever
we enter `bulgarian'.
57.181 \addto\extrasbulgarian{\cyrillictext}
When the encoding denition le was processed by LATEX the current font
encoding is stored in \latinencoding, assuming that LATEX uses T1 or OT1 as
default. Therefore we switch back to \latinencoding whenever the Bulgarian
language is no longer `active'.
57.182 \addto\noextrasbulgarian{\latintext}
For Bulgarian the " character also is made active.
57.183 \initiate@active@char{"}
The code above is necessary because we need extra active characters. The
character " is used as indicated in table 32. We specify that the Bulgarian group
of shorthands should be used.
57.184 \addto\extrasbulgarian{\languageshorthands{bulgarian}}
These characters are `turned on' once, later their denition may vary.
57.185 \addto\extrasbulgarian{%
57.186 \bbl@activate{"}}
57.187 \addto\noextrasbulgarian{%

57.188 \bbl@deactivate{"}}

350
The X2 and T2* encodings do not contain spanish_shriek and spanish_query
symbols; as a consequence, the ligatures `?`' and `!`' do not work with them (these
characters are useless for Cyrillic texts anyway). But we dene the shorthands to
emulate these ligatures (optionally).
We do not use \latinencoding here (but instead explicitly use OT1) because
the user may choose T2A to be the primary encoding, but it does not contain these
characters.
57.189 h∗spanishligsi
57.190 \declare@shorthand{bulgarian}{?`}{\UseTextSymbol{OT1}\textquestiondown}
57.191 \declare@shorthand{bulgarian}{!`}{\UseTextSymbol{OT1}\textexclamdown}

57.192 h/spanishligsi

To be able to dene the function of `"', we rst dene a couple of `support'


macros.

\dq We save the original double quote character in \dq to keep it available, the math
accent \"can now be typed as `"'.
57.193 \begingroup \catcode`\"12
57.194 \def\reserved@a{\endgroup
57.195 \def\@SS{\mathchar"7019}
57.196 \def\dq{"}}
57.197 \reserved@a

Now we can dene the doublequote macros: german and french quotes. We
use denitions of these quotes made in babel.sty. The french quotes are contained
in the T2* encodings.
57.198 \declare@shorthand{bulgarian}{"`}{\glqq}
57.199 \declare@shorthand{bulgarian}{"'}{\grqq}
57.200 \declare@shorthand{bulgarian}{"<}{\flqq}

57.201 \declare@shorthand{bulgarian}{">}{\frqq}

Some additional commands:


57.202 \declare@shorthand{bulgarian}{""}{\hskip\z@skip}
57.203 \declare@shorthand{bulgarian}{"~}{\textormath{\leavevmode\hbox{-}}{-}}
57.204 \declare@shorthand{bulgarian}{"=}{\nobreak-\hskip\z@skip}

57.205 \declare@shorthand{bulgarian}{"|}{%

57.206 \textormath{\nobreak\discretionary{-}{}{\kern.03em}%

57.207 \allowhyphens}{}}

The next two macros for "- and "--- are somewhat dierent. We must check
whether the second token is a hyphen character:
57.208 \declare@shorthand{bulgarian}{"-}{%
If the next token is `-', we typeset an emdash, otherwise a hyphen sign:
57.209 \def\bulgarian@sh@tmp{%
57.210 \if\bulgarian@sh@next-\expandafter\bulgarian@sh@emdash
57.211 \else\expandafter\bulgarian@sh@hyphen\fi
57.212 }%
TEX looks for the next token after the rst `-': the meaning of this token is
written to \bulgarian@sh@next and \bulgarian@sh@tmp is called.
57.213 \futurelet\bulgarian@sh@next\bulgarian@sh@tmp}

351
Here are the denitions of hyphen and emdash. First the hyphen:
57.214 \def\bulgarian@sh@hyphen{\nobreak\-\bbl@allowhyphens}
For the emdash denition, there are the two parameters: we must `eat' two
last hyphen signs of our emdash . . . :
57.215 \def\bulgarian@sh@emdash#1#2{\cdash-#1#2}

\cdash . . . these two parameters are useful for another macro: \cdash:
57.216 \ifx\cdash\undefined % should be defined earlier
57.217 \def\cdash#1#2#3{\def\tempx@{#3}%
57.218 \def\tempa@{-}\def\tempb@{~}\def\tempc@{*}%

57.219 \ifx\tempx@\tempa@\@Acdash\else
57.220 \ifx\tempx@\tempb@\@Bcdash\else
57.221 \ifx\tempx@\tempc@\@Ccdash\else
57.222 \errmessage{Wrong usage of cdash}\fi\fi\fi}
second parameter (or third for \cdash) shows what kind of emdash to create
in next step
"--- ordinary (plain) Cyrillic emdash inside text: an unbreakable thinspace will
be inserted before only in case of a space before the dash (it is necessary
for dashes after display maths formulae: there could be lists, enumerations
etc. started with where a is ... i.e., the dash starts a line). (Firstly
there were planned rather soft rules for user:he may put a space before
the dash or not. But it is dicult to place this thinspace automatically,
i.e., by checking modes because after display formulae TEX uses horizontal
mode. Maybe there is a misunderstanding? Maybe there is another way?)
After a dash a breakable thinspace is always placed;
57.223 % What is more grammatically: .2em or .2\fontdimen6\font?
57.224 \def\@Acdash{\ifdim\lastskip>\z@\unskip\nobreak\hskip.2em\fi
57.225 \cyrdash\hskip.2em\ignorespaces}%

"--~ emdash in compound names or surnames (like MendeleevKlapeiron); this


dash has no space characters around; after the dash some space is added
\exhyphenalty
57.226 \def\@Bcdash{\leavevmode\ifdim\lastskip>\z@\unskip\fi
57.227 \nobreak\cyrdash\penalty\exhyphenpenalty\hskip\z@skip\ignorespaces}%

"--* for denoting direct speech (a space like \enskip must follow the emdash);

57.228 \def\@Ccdash{\leavevmode
57.229 \nobreak\cyrdash\nobreak\hskip.35em\ignorespaces}%
57.230 %\fi

\cyrdash Finally the macro for body of the Cyrillic emdash. The \cyrdash macro will
be dened in case this macro hasn't been dened in a fontenc le. For T2*fonts,
cyrdash will be placed in the code of the English emdash thus it uses ligature ---.
57.231 % Is there an IF necessary?
57.232 \ifx\cyrdash\undefined
57.233 \def\cyrdash{\hbox to.8em{--\hss--}}

57.234 \fi

352
Here a really new macroto place thinspace between initials. This macro used
instead of \, allows hyphenation in the following surname.
57.235 \declare@shorthand{bulgarian}{",}{\nobreak\hskip.2em\ignorespaces}
The Bulgarian hyphenation patterns can be used with \lefthyphenmin and
\righthyphenmin set to 2.
57.236 \providehyphenmins{\CurrentOption}{\tw@\tw@}
57.237 \fi
Now the action \extrasbulgarian has to execute is to make sure that the
command \frenchspacing is in eect. If this is not the case the execution of
\noextrasbulgarian will switch it o again.
57.238 \addto\extrasbulgarian{\bbl@frenchspacing}
57.239 \addto\noextrasbulgarian{\bbl@nonfrenchspacing}
Make the double quotes produce the traditional quotes used in Bulgarian texts
(these are the German quotes).
57.240 % \initiate@active@char{`}
57.241 % \initiate@active@char{'}
57.242 % \addto\extrasbulgarian{%
57.243 % \bbl@activate{`}}
57.244 % \addto\extrasbulgarian{%
57.245 % \bbl@activate{'}}
57.246 % \addto\noextrasbulgarian{%
57.247 % \bbl@deactivate{`}}
57.248 % \addto\noextrasbulgarian{%
57.249 % \bbl@deactivate{'}}
57.250 % \def\mlron{\bbl@activate{`}\bbl@activate{'}}
57.251 % \def\mlroff{\bbl@deactivate{`}\bbl@deactivate{'}}
57.252 % \declare@shorthand{bulgarian}{``}{\glqq}
57.253 % \declare@shorthand{bulgarian}{''}{\grqq}

Next we add a new enumeration style for Bulgarian manuscripts with Cyril-
lic letters,and later on we dene some math operator names in accordance with
Bulgarian typesetting traditions.

\@Alph@bul We begin by dening \@Alph@bul which works like \@Alph, but produces (up-
percase) Cyrillic letters intead of Latin ones. The letters ISHRT, HRDSN and
SFTSN are skipped, as usual for such enumeration.
57.254 \def\enumBul{\let\@Alph\@Alph@bul \let\@alph\@alph@bul}
57.255 \def\enumEng{\let\@Alph\@Alph@eng \let\@alph\@alph@eng}
57.256 \def\enumLat{\let\@Alph\@Alph@eng \let\@alph\@alph@eng}

57.257 \addto\extrasbulgarian{\enumBul}

57.258 \addto\noextrasbulgarian{\enumLat}

57.259 \def\@Alph@bul#1{%

57.260 \ifcase#1\or
57.261 \CYRA\or \CYRB\or \CYRV\or \CYRG\or \CYRD\or \CYRE\or \CYRZH\or
57.262 \CYRZ\or \CYRI\or \CYRK\or \CYRL\or \CYRM\or \CYRN\or \CYRO\or
57.263 \CYRP\or \CYRR\or \CYRS\or \CYRT\or \CYRU\or \CYRF\or \CYRH\or
57.264 \CYRC\or \CYRCH\or \CYRSH\or \CYRSHCH\or \CYRYU\or \CYRYA\else
57.265 \@ctrerr\fi
57.266 }
57.267 \def\@Alph@eng#1{%

353
57.268 \ifcase#1\or
57.269 A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M\or
57.270 N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else
57.271 \@ctrerr\fi
57.272 }

\@alph@bul The macro \@alph@bul is similar to \@Alph@bul; it produces lowercase Bulgarian


letters.
57.273 \def\@alph@bul#1{%
57.274 \ifcase#1\or
57.275 \cyra\or \cyrb\or \cyrv\or \cyrg\or \cyrd\or \cyre\or \cyrzh\or
57.276 \cyrz\or \cyri\or \cyrk\or \cyrl\or \cyrm\or \cyrn\or \cyro\or
57.277 \cyrp\or \cyrr\or \cyrs\or \cyrt\or \cyru\or \cyrf\or \cyrh\or
57.278 \cyrc\or \cyrch\or \cyrsh\or \cyrshch\or \cyryu\or \cyrya\else
57.279 \@ctrerr\fi
57.280 }
57.281 \def\@alph@eng#1{%

57.282 \ifcase#1\or
57.283 a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m\or
57.284 n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else
57.285 \@ctrerr\fi
57.286 }

Set up default Cyrillic math alphabets. To use Cyrillic letters in math mode
user should load the textmath package before loading fontenc package (or babel).
Note,that by default Cyrillic letters are taken from upright font in math mode
(unlike Latin letters).
57.287 %\RequirePackage{textmath}
57.288 \@ifundefined{sym\cyrillicencoding letters}{}{%
57.289 \SetSymbolFont{\cyrillicencoding letters}{bold}\cyrillicencoding

57.290 \rmdefault\bfdefault\updefault
57.291 \DeclareSymbolFontAlphabet\cyrmathrm{\cyrillicencoding letters}

And we need a few commands to be able to switch to dierent variants.


57.292 \DeclareMathAlphabet\cyrmathbf\cyrillicencoding
57.293 \rmdefault\bfdefault\updefault
57.294 \DeclareMathAlphabet\cyrmathsf\cyrillicencoding

57.295 \sfdefault\mddefault\updefault
57.296 \DeclareMathAlphabet\cyrmathit\cyrillicencoding

57.297 \rmdefault\mddefault\itdefault
57.298 \DeclareMathAlphabet\cyrmathtt\cyrillicencoding

57.299 \ttdefault\mddefault\updefault
57.300 \SetMathAlphabet\cyrmathsf{bold}\cyrillicencoding

57.301 \sfdefault\bfdefault\updefault
57.302 \SetMathAlphabet\cyrmathit{bold}\cyrillicencoding

57.303 \rmdefault\bfdefault\itdefault
57.304 }

Some math functions in Bulgarian math books have other names: e.g., sinh
in Bulgarian is written as sh etc. So we dene a number of new math operators.
\sinh:
57.305 \def\sh{\mathop{\operator@font sh}\nolimits}

354
\cosh:
57.306 \def\ch{\mathop{\operator@font ch}\nolimits}
\tan:
57.307 \def\tg{\mathop{\operator@font tg}\nolimits}
\arctan:
57.308 \def\arctg{\mathop{\operator@font arctg}\nolimits}
\arccot:
57.309 \def\arcctg{\mathop{\operator@font arcctg}\nolimits}
The following macro conicts with \th dened in Latin 1 encoding: \tanh:
57.310 \addto\extrasrussian{%
57.311 \babel@save{\th}%
57.312 \let\ltx@th\th
57.313 \def\th{\textormath{\ltx@th}%
57.314 {\mathop{\operator@font th}\nolimits}}%
57.315 }
\cot:
57.316 \def\ctg{\mathop{\operator@font ctg}\nolimits}
\coth:
57.317 \def\cth{\mathop{\operator@font cth}\nolimits}
\csc:
57.318 \def\cosec{\mathop{\operator@font cosec}\nolimits}
This is for compatibility with older Bulgarian packages.
57.319 \DeclareRobustCommand{\No}{%
57.320 \ifmmode{\nfss@text{\textnumero}}\else\textnumero\fi}
The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
57.321 \ldf@finish{bulgarian}
57.322 h/codei

355
58 The Ukrainian language
The le ukraineb.dtx69 denes all the language-specic macros for the Ukrainian
language. It needs the le cyrcod for success documentation with Ukrainian
encodings (see below).
For this language the character " is made active. In table 34 an overview is
given of its purpose.

"| disable ligature at this position.


"- an explicit hyphen sign, allowing hyphenation in the
rest of the word.
"--- Cyrillic emdash in plain text.
"--~ Cyrillic emdash in compound names (surnames).
"--* Cyrillic emdash for denoting direct speech.
"" like "-, but producing no hyphen sign (for compund
words with hyphen, e.g. x-""y or some other signs
as disable/enable).
"~ for a compound word mark without a breakpoint.
"= for a compound word mark with a breakpoint, allow-
ing hyphenation in the composing words.
", thinspace for initials with a breakpoint in following
surname.
"` for German left double quotes (looks like ,,).
"' for German right double quotes (looks like ).
"< for French left double quotes (looks like <<).
"> for French right double quotes (looks like >>).

Table 34: The extra denitions made by ukraineb

The quotes in table 34 (see, also table 30) can also be typeset by using the
commands in table 35 (see, also table 31).

\cdash--- Cyrillic emdash in plain text.


\cdash--~ Cyrillic emdash in compound names (surnames).
\cdash--* Cyrillic emdash for denoting direct speech.
\glqq for German left double quotes (looks like ,,).
\grqq for German right double quotes (looks like ).
\flqq for French left double quotes (looks like <<).
\frqq for French right double quotes (looks like >>).
\dq the original quotes character (").

Table 35: More commands which produce quotes, dened by babel

The French quotes are also available as ligatures `<<' and `>>' in 8-bit Cyrillic
font encodings (LCY, X2, T2*) and as `<' and `>' characters in 7-bit Cyrillic font
encodings (OT2 and LWN).
69 The le described in this section has version number ?. This le was derived from the
russianb.dtx version 1.1g.

356
The quotation marks traditionally used in Ukrainian and Russian languages
were borrowed from other languages (e.g. French and German) so they keep their
original names.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
58.1 h∗codei
58.2 \LdfInit{ukrainian}{captionsukrainian}
When this le is read as an option, i.e., by the \usepackage command,
ukraineb will be an `unknown' language, in which case we have to make it known.
So we check for the existence of \l@ukrainian to see whether we have to do some-
thing here.
58.3 \ifx\l@ukrainian\@undefined
58.4 \@nopatterns{Ukrainian}
58.5 \adddialect\l@ukrainian0
58.6 \fi

\latinencoding We need to know the encoding for text that is supposed to be which is active at
the end of the babel package. If the fontenc package is loaded later, then. . . too
bad!
58.7 \let\latinencoding\cf@encoding

The user may choose between dierent available Cyrillic encodingse.g., X2,
LCY, or LWN. Hopefully, X2 will eventually replace the two latter encodings (LCY
and LWN). If the user wants to use another font encoding than the default (T2A),
he has to load the corresponding le before ukraineb.sty. This may be done in
the following way:
% override the default X2 encoding used in Babel
\usepackage[LCY,OT1]{fontenc}
\usepackage[english,ukrainian]{babel}

Note: for the Ukrainian language, the T2A encoding is better than X2, because
X2 does not contain Latin letters, and users should be very careful to switch the
language every time they want to typeset a Latin word inside a Ukrainian phrase
or vice versa.
We parse the \cdp@list containing the encodings known to LATEX in the order
they were loaded. We set the \cyrillicencoding to the last loaded encoding in
the list of supported Cyrillic encodings: OT2, LWN, LCY, X2, T2C, T2B, T2A, if any.
\def\reserved@a#1#2{%
58.8

58.9 \edef\reserved@b{#1}%
58.10 \edef\reserved@c{#2}%
58.11 \ifx\reserved@b\reserved@c
58.12 \let\cyrillicencoding\reserved@c
58.13 \fi}
58.14 \def\cdp@elt#1#2#3#4{%

58.15 \reserved@a{#1}{OT2}%
58.16 \reserved@a{#1}{LWN}%
58.17 \reserved@a{#1}{LCY}%
58.18 \reserved@a{#1}{X2}%
58.19 \reserved@a{#1}{T2C}%
58.20 \reserved@a{#1}{T2B}%

357
58.21 \reserved@a{#1}{T2A}}
58.22 \cdp@list
Now, if \cyrillicencoding is undened, then the user did not load any of
supported encodings. So, we have to set \cyrillicencoding to some default
value. We test the presence of the encoding denition les in the order from
less preferable to more preferable encodings. We use the lowercase names (i.e.,
lcyenc.def instead of LCYenc.def).
58.23 \ifx\cyrillicencoding\undefined
58.24 \IfFileExists{ot2enc.def}{\def\cyrillicencoding{OT2}}\relax
58.25 \IfFileExists{lwnenc.def}{\def\cyrillicencoding{LWN}}\relax
58.26 \IfFileExists{lcyenc.def}{\def\cyrillicencoding{LCY}}\relax
58.27 \IfFileExists{x2enc.def}{\def\cyrillicencoding{X2}}\relax
58.28 \IfFileExists{t2cenc.def}{\def\cyrillicencoding{T2C}}\relax
58.29 \IfFileExists{t2benc.def}{\def\cyrillicencoding{T2B}}\relax
58.30 \IfFileExists{t2aenc.def}{\def\cyrillicencoding{T2A}}\relax
If \cyrillicencoding is still undened, then the user seems not to have a
properly installed distribution. A fatal error.
58.31 \ifx\cyrillicencoding\undefined
58.32 \PackageError{babel}%
58.33 {No Cyrillic encoding definition files were found}%
58.34 {Your installation is incomplete.\MessageBreak
58.35 You need at least one of the following files:\MessageBreak
58.36 \space\space
58.37 x2enc.def, t2aenc.def, t2benc.def, t2cenc.def,\MessageBreak
58.38 \space\space
58.39 lcyenc.def, lwnenc.def, ot2enc.def.}%
58.40 \else
We avoid \usepackage[\cyrillicencoding]{fontenc} because we don't
want to force the switch of \encodingdefault.
58.41 \lowercase
58.42 \expandafter{\expandafter\input\cyrillicencoding enc.def\relax}%
58.43 \fi
58.44 \fi

\PackageInfo{babel}
{Using `\cyrillicencoding' as a default Cyrillic encoding}%

58.45 \DeclareRobustCommand{\Ukrainian}{%
58.46 \fontencoding\cyrillicencoding\selectfont
58.47 \let\encodingdefault\cyrillicencoding
58.48 \expandafter\set@hyphenmins\ukrainianhyphenmins
58.49 \language\l@ukrainian}%
58.50 \DeclareRobustCommand{\English}{%

58.51 \fontencoding\latinencoding\selectfont
58.52 \let\encodingdefault\latinencoding
58.53 \expandafter\set@hyphenmins\englishhyphenmins
58.54 \language\l@english}%
58.55 \let\Ukr\Ukrainian

58.56 \let\Eng\English

58.57 \let\cyrillictext\Ukrainian

58.58 \let\cyr\Ukrainian

358
Since the X2 encoding does not contain Latin letters, we should make some
redenitions of LATEX macros which implicitly produce Latin letters.
58.59 \expandafter\ifx\csname T@X2\endcsname\relax\else
We put \latinencoding in braces to avoid problems with \@alph inside mini-
pages (e.g., footnotes inside minipages) where \@alph is expanded and we get for
example `\fontencoding OT1' (\fontencoding is robust).
58.60 \def\@alph#1{{\fontencoding{\latinencoding}\selectfont
58.61 \ifcase#1\or
58.62 a\or b\or c\or d\or e\or f\or g\or h\or
58.63 i\or j\or k\or l\or m\or n\or o\or p\or
58.64 q\or r\or s\or t\or u\or v\or w\or x\or
58.65 y\or z\else\@ctrerr\fi}}%
58.66 \def\@Alph#1{{\fontencoding{\latinencoding}\selectfont
58.67 \ifcase#1\or
58.68 A\or B\or C\or D\or E\or F\or G\or H\or
58.69 I\or J\or K\or L\or M\or N\or O\or P\or
58.70 Q\or R\or S\or T\or U\or V\or W\or X\or
58.71 Y\or Z\else\@ctrerr\fi}}%
Unfortunately, the commands \AA and \aa are not encoding dependent in
LATEX (unlike e.g., \oe or \DH). They are dened as \r{A} and \r{a}. This leads
to unpredictable results when the font encoding does not contain the Latin letters
`A' and `a' (like X2).
58.72 \DeclareTextSymbolDefault{\AA}{OT1}
58.73 \DeclareTextSymbolDefault{\aa}{OT1}
58.74 \DeclareTextCommand{\aa}{OT1}{\r a}
58.75 \DeclareTextCommand{\AA}{OT1}{\r A}
58.76 \fi

The following block redenes the character class of uppercase Greek letters
and some accents, if it is equal to 7 (variable family), to avoid incorrect results if
the font encoding in some math family does not contain these characters in places
of OT1 encoding. The code was taken from amsmath.dtx. See comments and
further explanation there.
58.77 % \begingroup\catcode`\"=12
58.78 % % uppercase greek letters:
58.79 % \def\@tempa#1{\expandafter\@tempb\meaning#1\relax\relax\relax\relax
58.80 % "0000\@nil#1}
58.81 % \def\@tempb#1"#2#3#4#5#6\@nil#7{%
58.82 % \ifnum"#2=7 \count@"1#3#4#5\relax
58.83 % \ifnum\count@<"1000 \else \global\mathchardef#7="0#3#4#5\relax \fi
58.84 % \fi}
58.85 % \@tempa\Gamma\@tempa\Delta\@tempa\Theta\@tempa\Lambda\@tempa\Xi
58.86 % \@tempa\Pi\@tempa\Sigma\@tempa\Upsilon\@tempa\Phi\@tempa\Psi
58.87 % \@tempa\Omega
58.88 % % some accents:
58.89 % \def\@tempa#1#2\@nil{\def\@tempc{#1}}\def\@tempb{\mathaccent}
58.90 % \expandafter\@tempa\hat\relax\relax\@nil
58.91 % \ifx\@tempb\@tempc
58.92 % \def\@tempa#1\@nil{#1}%
58.93 % \def\@tempb#1{\afterassignment\@tempa\mathchardef\@tempc=}%
58.94 % \def\do#1"#2{}

359
58.95 % \def\@tempd#1{\expandafter\@tempb#1\@nil
58.96 % \ifnum\@tempc>"FFF
58.97 % \xdef#1{\mathaccent"\expandafter\do\meaning\@tempc\space}%
58.98 % \fi}
58.99 % \@tempd\hat\@tempd\check\@tempd\tilde\@tempd\acute\@tempd\grave
58.100 % \@tempd\dot\@tempd\ddot\@tempd\breve\@tempd\bar
58.101 % \fi

58.102 % \endgroup

The user must use the inputenc package when any 8-bit Cyrillic font encoding
is used, selecting one of the Cyrillic input encodings. We do not assume any
default input encoding, so the user should explicitly call the inputenc package
by \usepackage{inputenc}. We also removed \AtBeginDocument, so inputenc
should be used before babel.
58.103 \@ifpackageloaded{inputenc}{}{%
58.104 \def\reserved@a{LWN}%
58.105 \ifx\reserved@a\cyrillicencoding\else
58.106 \def\reserved@a{OT2}%
58.107 \ifx\reserved@a\cyrillicencoding\else
58.108 \PackageWarning{babel}%
58.109 {No input encoding specified for Ukrainian language}
58.110 \fi\fi}
Now we dene two commands that oer the possibility to switch between
Cyrillic and Roman encodings.
\cyrillictext The command \cyrillictext will switch from Latin font encoding to the Cyrillic
\latintext font encoding, the command \latintext switches back. This assumes that the
`normal' font encoding is a Latin one. These commands are declarations, for
shorter peaces of text the commands \textlatin and \textcyrillic can be
used.
58.111 %\DeclareRobustCommand{\latintext}{%
58.112 % \fontencoding{\latinencoding}\selectfont
58.113 % \def\encodingdefault{\latinencoding}}
58.114 \let\lat\latintext

\textcyrillic These commands take an argument which is then typeset using the requested font
\textlatin encoding.
58.115 \DeclareTextFontCommand{\textcyrillic}{\cyrillictext}
58.116 %\DeclareTextFontCommand{\textlatin}{\latintext}

We make the TEX


58.117 %\ifx\ltxTeX\undefined\let\ltxTeX\TeX\fi
58.118 %\ProvideTextCommandDefault{\TeX}{\textlatin{\ltxTeX}}

and LATEX logos encoding independent.


58.119 %\ifx\ltxLaTeX\undefined\let\ltxLaTeX\LaTeX\fi
58.120 %\ProvideTextCommandDefault{\LaTeX}{\textlatin{\ltxLaTeX}}
The next step consists of dening commands to switch to (and from) the
Ukrainian language.
\captionsukrainian The macro \captionsukrainian denes all strings used in the four standard
document classes provided with LATEX. The two commands \cyr and \lat activate
Cyrillic resp. Latin encoding.

360
58.121 \addto\captionsukrainian{%
58.122 \def\prefacename{{\cyr\CYRV\cyrs\cyrt\cyru\cyrp}}%
58.123 % \def\prefacename{{\cyr\CYRP\cyre\cyrr\cyre\cyrd\cyrm\cyro\cyrv\cyra}}%

58.124 \def\refname{%
58.125 {\cyr\CYRL\cyrii\cyrt\cyre\cyrr\cyra\cyrt\cyru\cyrr\cyra}}%
58.126 % \def\refname{%
58.127 % {\cyr\CYRP\cyre\cyrr\cyre\cyrl\cyrii\cyrk
58.128 % \ \cyrp\cyro\cyrs\cyri\cyrl\cyra\cyrn\cyrsftsn}}%
58.129 \def\abstractname{%
58.130 {\cyr\CYRA\cyrn\cyro\cyrt\cyra\cyrc\cyrii\cyrya}}%
58.131 % \def\abstractname{{\cyr\CYRR\cyre\cyrf\cyre\cyrr\cyra\cyrt}}%
58.132 \def\bibname{%
58.133 {\cyr\CYRB\cyrii\cyrb\cyrl\cyrii\cyro\cyrgup\cyrr\cyra\cyrf\cyrii\cyrya}}%
58.134 % \def\bibname{{\cyr\CYRL\cyrii\cyrt\cyre\cyrr\cyra\cyrt\cyru\cyrr\cyra}}%

58.135 \def\chaptername{{\cyr\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}}%
58.136 % \def\chaptername{{\cyr\CYRG\cyrl\cyra\cyrv\cyra}}%
58.137 \def\appendixname{{\cyr\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}}%
58.138 \def\contentsname{{\cyr\CYRZ\cyrm\cyrii\cyrs\cyrt}}%
58.139 \def\listfigurename{{\cyr\CYRP\cyre\cyrr\cyre\cyrl\cyrii\cyrk
58.140 \ \cyrii\cyrl\cyryu\cyrs\cyrt\cyrr\cyra\cyrc\cyrii\cyrishrt}}%
58.141 \def\listtablename{{\cyr\CYRP\cyre\cyrr\cyre\cyrl\cyrii\cyrk
58.142 \ \cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrsftsn}}%
58.143 \def\indexname{{\cyr\CYRP\cyro\cyrk\cyra\cyrzh\cyrch\cyri\cyrk}}%
58.144 \def\authorname{{\cyr\CYRII\cyrm\cyre\cyrn\cyrn\cyri\cyrishrt
58.145 \ \cyrp\cyro\cyrk\cyra\cyrzh\cyrch\cyri\cyrk}}%
58.146 \def\figurename{{\cyr\CYRR\cyri\cyrs.}}%
58.147 % \def\figurename{\cyr\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}}%
58.148 \def\tablename{{\cyr\CYRT\cyra\cyrb\cyrl.}}%
58.149 % \def\tablename{\cyr\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}}%
58.150 \def\partname{{\cyr\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}}%
58.151 \def\enclname{{\cyr\cyrv\cyrk\cyrl\cyra\cyrd\cyrk\cyra}}%
58.152 \def\ccname{{\cyr\cyrk\cyro\cyrp\cyrii\cyrya}}%
58.153 \def\headtoname{{\cyr\CYRD\cyro}}%
58.154 \def\pagename{{\cyr\cyrs.}}%
58.155 % \def\pagename{{\cyr\cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyra}}%
58.156 \def\seename{{\cyr\cyrd\cyri\cyrv.}}%
58.157 \def\alsoname{{\cyr\cyrd\cyri\cyrv.\ \cyrt\cyra\cyrk\cyro\cyrzh}}
58.158 \def\proofname{{\cyr\CYRD\cyro\cyrv\cyre\cyrd\cyre\cyrn\cyrn\cyrya}}%
58.159 \def\glossaryname{{\cyr\CYRS\cyrl\cyro\cyrv\cyrn\cyri\cyrk\ %
58.160 \cyrt\cyre\cyrr\cyrm\cyrii\cyrn\cyrii\cyrv}}%
58.161 }

\dateukrainian The macro \dateukrainian redenes the command \today to produce Ukrainian
dates.
58.162 \def\dateukrainian{%
58.163 \def\today{\number\day~\ifcase\month\or
58.164 \cyrs\cyrii\cyrch\cyrn\cyrya\or
58.165 \cyrl\cyryu\cyrt\cyro\cyrg\cyro\or
58.166 \cyrb\cyre\cyrr\cyre\cyrz\cyrn\cyrya\or
58.167 \cyrk\cyrv\cyrii\cyrt\cyrn\cyrya\or
58.168 \cyrt\cyrr\cyra\cyrv\cyrn\cyrya\or
58.169 \cyrch\cyre\cyrr\cyrv\cyrn\cyrya\or
58.170 \cyrl\cyri\cyrp\cyrn\cyrya\or
58.171 \cyrs\cyre\cyrr\cyrp\cyrn\cyrya\or

361
58.172 \cyrv\cyre\cyrr\cyre\cyrs\cyrn\cyrya\or
58.173 \cyrzh\cyro\cyrv\cyrt\cyrn\cyrya\or
58.174 \cyrl\cyri\cyrs\cyrt\cyro\cyrp\cyra\cyrd\cyra\or
58.175 \cyrg\cyrr\cyru\cyrd\cyrn\cyrya\fi
58.176 \space\number\year~\cyrr.}}

\extrasukrainian The macro \extrasukrainian will perform all the extra denitions needed for
the Ukrainian language. The macro \noextrasukrainian is used to cancel the
actions of \extrasukrainian.
The rst action we dene is to switch on the selected Cyrillic encoding whenever
we enter `ukrainian'.
58.177 \addto\extrasukrainian{\cyrillictext}
When the encoding denition le was processed by LATEX the current font
encoding is stored in \latinencoding, assuming that LATEX uses T1 or OT1 as
default. Therefore we switch back to \latinencoding whenever the Ukrainian
language is no longer `active'.
58.178 \addto\noextrasukrainian{\latintext}
Next we must allow hyphenation in the Ukrainian words with apostrophe
whenever we enter `ukrainian'. This solution was proposed by Vladimir Volovich
<vvv@vvv.vsu.ru>
58.179 \addto\extrasukrainian{\lccode`\'=`\'}
58.180 \addto\noextrasukrainian{\lccode`\'=0}

\verbatim@font In order to get both Latin and Cyrillic letters in verbatim text we need to change
the denition of an internal LATEX command somewhat:
58.181 %\def\verbatim@font{%
58.182 % \let\encodingdefault\latinencoding
58.183 % \normalfont\ttfamily
58.184 % \expandafter\def\csname\cyrillicencoding-cmd\endcsname##1##2{%
58.185 % \ifx\protect\@typeset@protect
58.186 % \begingroup\UseTextSymbol\cyrillicencoding##1\endgroup
58.187 % \else\noexpand##1\fi}}

The category code of the characters `:', `;', `!', and `?' is made \active to
insert a little white space.
For Ukrainian (as well as for Russian and German) the " character also is made
active.
Note: It is very questionable whether the Russian typesetting tradition re-
quires additional spacing before those punctuation signs. Therefore, we make the
corresponding code optional. If you need it, then dene the frenchpunct docstrip
option in babel.ins.
Borrowed from french. Some users dislike automatic insertion of a space before
`double punctuation', and prefer to decide themselves whether a space should be
added or not; so a hook \NoAutoSpaceBeforeFDP is provided: if this command is
added (in le ukraineb.cfg, or anywhere in a document) ukraineb will respect
your typing, and introduce a suitable space before `double punctuation' if and
only if a space is typed in the source le before those signs.
The command \AutoSpaceBeforeFDP switches back to the default behavior of
ukraineb.

362
58.188 h∗frenchpuncti
58.189 \initiate@active@char{:}
58.190 \initiate@active@char{;}

58.191 h/frenchpuncti

58.192 h∗frenchpunct | spanishligsi

58.193 \initiate@active@char{!}

58.194 \initiate@active@char{?}

58.195 h/frenchpunct | spanishligsi

58.196 \initiate@active@char{"}

The code above is necessary because we need extra active characters. The
character " is used as indicated in table 34.
We specify that the Ukrainian group of shorthands should be used.
58.197 \addto\extrasukrainian{\languageshorthands{ukrainian}}
These characters are `turned on' once, later their denition may vary.
58.198 \addto\extrasukrainian{%
58.199 hfrenchpuncti \bbl@activate{:}\bbl@activate{;}%
58.200 hfrenchpunct | spanishligsi \bbl@activate{!}\bbl@activate{?}%
58.201 \bbl@activate{"}}
58.202 \addto\noextrasukrainian{%

58.203 hfrenchpuncti \bbl@deactivate{:}\bbl@deactivate{;}%


58.204 hfrenchpunct | spanishligsi \bbl@deactivate{!}\bbl@deactivate{?}%
58.205 \bbl@deactivate{"}}
The X2 and T2* encodings do not contain spanish_shriek and spanish_query
symbols; as a consequence, the ligatures `?`' and `!`' do not work with them (these
characters are useless for Cyrillic texts anyway). But we dene the shorthands to
emulate these ligatures (optionally).
We do not use \latinencoding here (but instead explicitly use OT1) because
the user may choose T2A to be the primary encoding, but it does not contain these
characters.
58.206 h∗spanishligsi
58.207 \declare@shorthand{ukrainian}{?`}{\UseTextSymbol{OT1}\textquestiondown}
58.208 \declare@shorthand{ukrainian}{!`}{\UseTextSymbol{OT1}\textexclamdown}

58.209 h/spanishligsi

\ukrainian@sh@;@ We have to reduce the amount of white space before ;, : and !. This should only
\ukrainian@sh@:@ happen in horizontal mode, hence the test with \ifhmode.
\ukrainian@sh@!@58.210 h∗frenchpuncti
\ukrainian@sh@?@58.211 \declare@shorthand{ukrainian}{;}{%
58.212 \ifhmode
In horizontal mode we check for the presence of a `space', `unskip' if it exists
and place a 0.1em kerning.
58.213 \ifdim\lastskip>\z@
58.214 \unskip\nobreak\kern.1em
58.215 \else
If no space has been typed, we add \FDP@thinspace which will be dened, up to
the user's wishes, as an automatic added thinspace, or as \@empty.
58.216 \FDP@thinspace
58.217 \fi
58.218 \fi

363
Now we can insert a `;' character.
58.219 \string;}
The other denitions are very similar.
58.220 \declare@shorthand{ukrainian}{:}{%
58.221 \ifhmode
58.222 \ifdim\lastskip>\z@
58.223 \unskip\nobreak\kern.1em
58.224 \else
58.225 \FDP@thinspace
58.226 \fi
58.227 \fi
58.228 \string:}
58.229 \declare@shorthand{ukrainian}{!}{%
58.230 \ifhmode
58.231 \ifdim\lastskip>\z@
58.232 \unskip\nobreak\kern.1em
58.233 \else
58.234 \FDP@thinspace
58.235 \fi
58.236 \fi
58.237 \string!}
58.238 \declare@shorthand{ukrainian}{?}{%
58.239 \ifhmode
58.240 \ifdim\lastskip>\z@
58.241 \unskip\nobreak\kern.1em
58.242 \else
58.243 \FDP@thinspace
58.244 \fi
58.245 \fi
58.246 \string?}

\AutoSpaceBeforeFDP \FDP@thinspace is dened as unbreakable spaces if \AutoSpaceBeforeFDP is


\NoAutoSpaceBeforeFDP activated or as \@empty if \NoAutoSpaceBeforeFDP is in use. The default is
\FDP@thinspace \AutoSpaceBeforeFDP.
58.247 \def\AutoSpaceBeforeFDP{%
58.248 \def\FDP@thinspace{\nobreak\kern.1em}}
58.249 \def\NoAutoSpaceBeforeFDP{\let\FDP@thinspace\@empty}

58.250 \AutoSpaceBeforeFDP

\FDPon The next macros allow to switch on/o activeness of double punctuation signs.
\FDPoff58.251 \def\FDPon{\bbl@activate{:}%
58.252 \bbl@activate{;}%
58.253 \bbl@activate{?}%
58.254 \bbl@activate{!}}
58.255 \def\FDPoff{\bbl@deactivate{:}%

58.256 \bbl@deactivate{;}%
58.257 \bbl@deactivate{?}%
58.258 \bbl@deactivate{!}}

\system@sh@:@ When the active characters appear in an environment where their Ukrainian be-
\system@sh@!@ haviour is not wanted they should give an `expected' result. Therefore we dene
\system@sh@?@ shorthands at system level as well.
\system@sh@;@

364
58.259 \declare@shorthand{system}{:}{\string:}
58.260 \declare@shorthand{system}{;}{\string;}
58.261 h/frenchpuncti

58.262 h∗frenchpunct&!spanishligsi

58.263 \declare@shorthand{system}{!}{\string!}

58.264 \declare@shorthand{system}{?}{\string?}

58.265 h/frenchpunct&!spanishligsi

To be able to dene the function of `"', we rst dene a couple of `support'


macros.

\dq We save the original double quote character in \dq to keep it available, the math
accent \" can now be typed as `"'.
58.266 \begingroup \catcode`\"12
58.267 \def\reserved@a{\endgroup
58.268 \def\@SS{\mathchar"7019 }
58.269 \def\dq{"}}
58.270 \reserved@a

Now we can dene the doublequote macros: german and french quotes. We
use denitions of these quotes made in babel.sty. The french quotes are contained
in the T2* encodings.
58.271 \declare@shorthand{ukrainian}{"`}{\glqq}
58.272 \declare@shorthand{ukrainian}{"'}{\grqq}
58.273 \declare@shorthand{ukrainian}{"<}{\flqq}

58.274 \declare@shorthand{ukrainian}{">}{\frqq}

Some additional commands:


58.275 \declare@shorthand{ukrainian}{""}{\hskip\z@skip}
58.276 \declare@shorthand{ukrainian}{"~}{\textormath{\leavevmode\hbox{-}}{-}}
58.277 \declare@shorthand{ukrainian}{"=}{\nobreak-\hskip\z@skip}

58.278 \declare@shorthand{ukrainian}{"|}{%

58.279 \textormath{\nobreak\discretionary{-}{}{\kern.03em}%
58.280 \allowhyphens}{}}
The next two macros for "- and "--- are somewhat dierent. We must check
whether the second token is a hyphen character:
58.281 \declare@shorthand{ukrainian}{"-}{%
If the next token is `-', we typeset an emdash, otherwise a hyphen sign:
58.282 \def\ukrainian@sh@tmp{%
58.283 \if\ukrainian@sh@next-\expandafter\ukrainian@sh@emdash
58.284 \else\expandafter\ukrainian@sh@hyphen\fi
58.285 }%
TEX looks for the next token after the rst `-': the meaning of this token is
written to \ukrainian@sh@next and \ukrainian@sh@tmp is called.
58.286 \futurelet\ukrainian@sh@next\ukrainian@sh@tmp}
Here are the denitions of hyphen and emdash. First the hyphen:
58.287 \def\ukrainian@sh@hyphen{%
58.288 \nobreak\-\bbl@allowhyphens}

365
For the emdash denition, there are the two parameters: we must `eat' two
last hyphen signs of our emdash. . . :
58.289 \def\ukrainian@sh@emdash#1#2{\cdash-#1#2}

\cdash . . . these two parameters are useful for another macro: \cdash:
58.290 %\ifx\cdash\undefined % should be defined earlier
58.291 \def\cdash#1#2#3{\def\tempx@{#3}%
58.292 \def\tempa@{-}\def\tempb@{~}\def\tempc@{*}%

58.293 \ifx\tempx@\tempa@\@Acdash\else
58.294 \ifx\tempx@\tempb@\@Bcdash\else
58.295 \ifx\tempx@\tempc@\@Ccdash\else
58.296 \errmessage{Wrong usage of cdash}\fi\fi\fi}
second parameter (or third for \cdash) shows what kind of emdash to create in
next step
"--- ordinary (plain) Cyrillic emdash inside text: an unbreakable thinspace will
be inserted before only in case of a space before the dash (it is necessary
for dashes after display maths formulae: there could be lists, enumerations
etc. started with  where a is ... i.e., the dash starts a line). (Firstly
there were planned rather soft rules for user: he may put a space before
the dash or not. But it is dicult to place this thinspace automatically,
i.e., by checking modes because after display formulae TEX uses horizontal
mode. Maybe there is a misunderstanding? Maybe there is another way?)
After a dash a breakable thinspace is always placed;
58.297 % What is more grammatically: .2em or .2\fontdimen6\font ?
58.298 \def\@Acdash{\ifdim\lastskip>\z@\unskip\nobreak\hskip.2em\fi
58.299 \cyrdash\hskip.2em\ignorespaces}%

"--~ emdash in compound names or surnames (like MendeleevKlapeiron); this


dash has no space characters around; after the dash some space is added
\exhyphenalty
58.300 \def\@Bcdash{\leavevmode\ifdim\lastskip>\z@\unskip\fi
58.301 \nobreak\cyrdash\penalty\exhyphenpenalty\hskip\z@skip\ignorespaces}%

"--* for denoting direct speech (a space like \enskip must follow the emdash);
58.302 \def\@Ccdash{\leavevmode
58.303 \nobreak\cyrdash\nobreak\hskip.35em\ignorespaces}%
58.304 %\fi

\cyrdash Finally the macro for body of the Cyrillic emdash. The \cyrdash macro will
be dened in case this macro hasn't been dened in a fontenc le. For T2* fonts,
cyrdash will be placed in the code of the English emdash thus it uses ligature ---.
58.305 % Is there an IF necessary?
58.306 \ifx\cyrdash\undefined
58.307 \def\cyrdash{\hbox to.8em{--\hss--}}
58.308 \fi

Here a really new macroto place thinspace between initials. This macro used
instead of \, allows hyphenation in the following surname.
58.309 \declare@shorthand{ukrainian}{",}{\nobreak\hskip.2em\ignorespaces}

366
\mdqon All that's left to do now is to dene a couple of commands for ".
\mdqoff58.310 \def\mdqon{\bbl@activate{"}}
58.311 \def\mdqoff{\bbl@deactivate{"}}

The Ukrainian hyphenation patterns can be used with \lefthyphenmin and


\righthyphenmin set to 2.
58.312 \providehyphenmins{\CurrentOption}{\tw@\tw@}
58.313 % temporary hack:
58.314 \ifx\englishhyphenmins\undefined

58.315 \def\englishhyphenmins{\tw@\thr@@}
58.316 \fi

Now the action \extrasukrainian has to execute is to make sure that the
command \frenchspacing is in eect. If this is not the case the execution of
\noextrasukrainian will switch it o again.
58.317 \addto\extrasukrainian{\bbl@frenchspacing}
58.318 \addto\noextrasukrainian{\bbl@nonfrenchspacing}

Next we add a new enumeration style for Ukrainian manuscripts with Cyrillic
letters, and later on we dene some math operator names in accordance with
Ukrainian and Russian typesetting traditions.

\Asbuk We begin by dening \Asbuk which works like \Alph, but produces (uppercase)
Cyrillic letters intead of Latin ones. The letters CYRGUP, and SFTSN are
skipped, as usual for such enumeration.
58.319 \def\Asbuk#1{\expandafter\@Asbuk\csname c@#1\endcsname}
58.320 \def\@Asbuk#1{\ifcase#1\or
58.321 \CYRA\or\CYRB\or\CYRV\or\CYRG\or\CYRD\or\CYRE\or\CYRIE\or
58.322 \CYRZH\or\CYRZ\or\CYRI\or\CYRII\or\CYRYI\or\CYRISHRT\or
58.323 \CYRK\or\CYRL\or\CYRM\or\CYRN\or\CYRO\or\CYRP\or\CYRR\or
58.324 \CYRS\or\CYRT\or\CYRU\or\CYRF\or\CYRH\or\CYRC\or\CYRCH\or
58.325 \CYRSH\or\CYRSHCH\or\CYRYU\or\CYRYA\else\@ctrerr\fi}

\asbuk The macro \asbuk is similar to \alph; it produces lowercase Ukrainian letters.
58.326 \def\asbuk#1{\expandafter\@asbuk\csname c@#1\endcsname}
58.327 \def\@asbuk#1{\ifcase#1\or
58.328 \cyra\or\cyrb\or\cyrv\or\cyrg\or\cyrd\or\cyre\or\cyrie\or
58.329 \cyrzh\or\cyrz\or\cyri\or\cyrii\or\cyryi\or\cyrishrt\or
58.330 \cyrk\or\cyrl\or\cyrm\or\cyrn\or\cyro\or\cyrp\or\cyrr\or
58.331 \cyrs\or\cyrt\or\cyru\or\cyrf\or\cyrh\or\cyrc\or\cyrch\or
58.332 \cyrsh\or\cyrshch\or\cyryu\or\cyrya\else\@ctrerr\fi}

Set up default Cyrillic math alphabets. The math groups for cyrillic letters are
dened in the encoding denition les. First, declare a new alphabet for symbols,
\cyrmathrm, based on the symbol font for Cyrillic letters dened in the encoding
denition le. Note, that by default Cyrillic letters are taken from upright font in
math mode (unlike Latin letters).
58.333 %\RequirePackage{textmath}
58.334 \@ifundefined{sym\cyrillicencoding letters}{}{%
58.335 \SetSymbolFont{\cyrillicencoding letters}{bold}\cyrillicencoding

58.336 \rmdefault\bfdefault\updefault
58.337 \DeclareSymbolFontAlphabet\cyrmathrm{\cyrillicencoding letters}

367
And we need a few commands to be able to switch to dierent variants.
58.338 \DeclareMathAlphabet\cyrmathbf\cyrillicencoding
58.339 \rmdefault\bfdefault\updefault
58.340 \DeclareMathAlphabet\cyrmathsf\cyrillicencoding

58.341 \sfdefault\mddefault\updefault
58.342 \DeclareMathAlphabet\cyrmathit\cyrillicencoding

58.343 \rmdefault\mddefault\itdefault
58.344 \DeclareMathAlphabet\cyrmathtt\cyrillicencoding

58.345 \ttdefault\mddefault\updefault
58.346 %

58.347 \SetMathAlphabet\cyrmathsf{bold}\cyrillicencoding

58.348 \sfdefault\bfdefault\updefault
58.349 \SetMathAlphabet\cyrmathit{bold}\cyrillicencoding

58.350 \rmdefault\bfdefault\itdefault
58.351 }

Some math functions in Ukrainian and Russian math books have other names:
e.g., sinh in Russian is written as sh etc. So we dene a number of new math
operators.
\sinh:
58.352 \def\sh{\mathop{\operator@font sh}\nolimits}
\cosh:
58.353 \def\ch{\mathop{\operator@font ch}\nolimits}
\tan:
58.354 \def\tg{\mathop{\operator@font tg}\nolimits}
\arctan:
58.355 \def\arctg{\mathop{\operator@font arctg}\nolimits}
arcctg:
58.356 \def\arcctg{\mathop{\operator@font arcctg}\nolimits}
The following macro conicts with \th dened in Latin 1 encoding:
\tanh:
58.357 \addto\extrasrussian{%
58.358 \babel@save{\th}%
58.359 \let\ltx@th\th
58.360 \def\th{\textormath{\ltx@th}%
58.361 {\mathop{\operator@font th}\nolimits}}%
58.362 }
\cot:
58.363 \def\ctg{\mathop{\operator@font ctg}\nolimits}
\coth:
58.364 \def\cth{\mathop{\operator@font cth}\nolimits}
\csc:
58.365 \def\cosec{\mathop{\operator@font cosec}\nolimits}
And nally some other Ukrainian and Russian mathematical symbols:
58.366 \def\Prob{\mathop{\kern\z@\mathsf{P}}\nolimits}
58.367 \def\Variance{\mathop{\kern\z@\mathsf{D}}\nolimits}

58.368 \def\nsd{\mathop{\cyrmathrm{\cyrn.\cyrs.\cyrd.}}\nolimits}

58.369 \def\nsk{\mathop{\cyrmathrm{\cyrn.\cyrs.\cyrk.}}\nolimits}

368
58.370 \def\NSD{\mathop{\cyrmathrm{\CYRN\CYRS\CYRD}}\nolimits}
58.371 \def\NSK{\mathop{\cyrmathrm{\CYRN\CYRS\CYRK}}\nolimits}
58.372 \def\nod{\mathop{\cyrmathrm{\cyrn.\cyro.\cyrd.}}\nolimits} % ??????
58.373 \def\nok{\mathop{\cyrmathrm{\cyrn.\cyro.\cyrk.}}\nolimits} % ??????
58.374 \def\NOD{\mathop{\cyrmathrm{\CYRN\CYRO\CYRD}}\nolimits} % ??????
58.375 \def\NOK{\mathop{\cyrmathrm{\CYRN\CYRO\CYRK}}\nolimits} % ??????
58.376 \def\Proj{\mathop{\cyrmathrm{\CYRP\cyrr}}\nolimits}

This is for compatibility with older Ukrainian packages.


58.377 \DeclareRobustCommand{\No}{%
58.378 \ifmmode{\nfss@text{\textnumero}}\else\textnumero\fi}
The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
58.379 \ldf@finish{ukrainian}
58.380 h/codei

369
59 The Lower Sorbian language
The le lsorbian.dtx70 It denes all the language-specic macros for Lower Sor-
bian.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
59.1 h∗codei
59.2 \LdfInit\CurrentOption{date\CurrentOption}
When this le is read as an option, i.e. by the \usepackage command,
lsorbian will be an `unknown' language, in which case we have to make it known.
So we check for the existence of \l@lsorbian to see whether we have to do some-
thing here. As babel also knwos the option lowersorbian we have to check that as
well.
\ifx\l@lowersorbian\@undefined
59.3

59.4\ifx\l@lsorbian\@undefined
59.5 \@nopatterns{Lsorbian}
59.6 \adddialect\l@lsorbian\z@
59.7 \let\l@lowersorbian\l@lsorbian
59.8 \else
59.9 \let\l@lowersorbian\l@lsorbian
59.10 \fi
59.11 \else

59.12 \let\l@lsorbian\l@lowersorbian
59.13 \fi

The next step consists of dening commands to switch to (and from) the Lower
Sorbian language.

\captionslsorbian The macro \captionslsorbian denes all strings used in the four standard doc-
umentclasses provided with LATEX.
59.14 \@namedef{captions\CurrentOption}{%
59.15 \def\prefacename{Zawod}%
59.16 \def\refname{Referency}%
59.17 \def\abstractname{Abstrakt}%
59.18 \def\bibname{Literatura}%
59.19 \def\chaptername{Kapitl}%
59.20 \def\appendixname{Dodawki}%
59.21 \def\contentsname{Wop\'simje\'se}%
59.22 \def\listfigurename{Zapis wobrazow}%
59.23 \def\listtablename{Zapis tabulkow}%
59.24 \def\indexname{Indeks}%
59.25 \def\figurename{Wobraz}%
59.26 \def\tablename{Tabulka}%
59.27 \def\partname{\'Z\v el}%
59.28 \def\enclname{P\'si\l oga}%
59.29 \def\ccname{CC}%
59.30 \def\headtoname{Komu}%
59.31 \def\pagename{Strona}%
59.32 \def\seename{gl.}%
59.33 \def\alsoname{gl.~teke}%
70 The le described in this section has version number v1.0g and was last revised on
2008/03/17. It was written by Eduard Werner (edi@kaihh.hanse.de).

370
59.34 \def\proofname{Proof}% <-- needs translation
59.35 \def\glossaryname{Glossary}% <-- Needs translation
59.36 }%

\newdatelsorbian The macro \newdatelsorbian redenes the command \today to produce Lower
Sorbian dates.
59.37 \@namedef{newdate\CurrentOption}{%
59.38 \def\today{\number\day.~\ifcase\month\or
59.39 januara\or februara\or m\v erca\or apryla\or maja\or
59.40 junija\or julija\or awgusta\or septembra\or oktobra\or
59.41 nowembra\or decembra\fi
59.42 \space \number\year}}

\olddatelsorbian The macro \olddatelsorbian redenes the command \today to produce old-style
Lower Sorbian dates.
59.43 \@namedef{olddate\CurrentOption}{%
59.44 \def\today{\number\day.~\ifcase\month\or
59.45 wjelikego ro\v zka\or
59.46 ma\l ego ro\v zka\or
59.47 nal\v etnika\or
59.48 jat\v sownika\or
59.49 ro\v zownika\or
59.50 sma\v znika\or
59.51 pra\v znika\or
59.52 \v znje\'nca\or
59.53 po\v znje\'nca\or
59.54 winowca\or
59.55 nazymnika\or
59.56 godownika\fi \space \number\year}}

The default will be the new-style dates.


59.57 \expandafter\let\csname date\CurrentOption\expandafter\endcsname
59.58 \csname newdate\CurrentOption\endcsname

\extraslsorbian The macro \extraslsorbian will perform all the extra denitions needed for the
\noextraslsorbian lsorbian language. The macro \noextraslsorbian is used to cancel the actions of
\extraslsorbian. For the moment these macros are empty but they are dened
for compatibility with the other language denition les.
59.59 \@namedef{extras\CurrentOption}{}
59.60 \@namedef{noextras\CurrentOption}{}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
59.61 \ldf@finish\CurrentOption
59.62 h/codei

371
60 The Upper Sorbian language
The le usorbian.dtx71 It denes all the language-specic macros for Upper
Sorbian.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
60.1 h∗codei
60.2 \LdfInit\CurrentOption{date\CurrentOption}
When this le is read as an option, i.e. by the \usepackage command,
usorbian will be an `unknown' language, in which case we have to make it known.
So we check for the existence of \l@usorbian to see whether we have to do some-
thing here. As babel also knwos the option uppersorbian we have to check that as
well.
\ifx\l@uppersorbian\@undefined
60.3

60.4\ifx\l@usorbian\@undefined
60.5 \@nopatterns{Usorbian}
60.6 \adddialect\l@usorbian\z@
60.7 \let\l@uppersorbian\l@usorbian
60.8 \else
60.9 \let\l@uppersorbian\l@usorbian
60.10 \fi
60.11 \else

60.12 \let\l@usorbian\l@uppersorbian
60.13 \fi

The next step consists of dening commands to switch to (and from) the Upper
Sorbian language.

\captionsusorbian The macro \captionsusorbian denes all strings used in the four standard doc-
umentclasses provided with LATEX.
60.14 \@namedef{captions\CurrentOption}{%
60.15 \def\prefacename{Zawod}%
60.16 \def\refname{Referency}%
60.17 \def\abstractname{Abstrakt}%
60.18 \def\bibname{Literatura}%
60.19 \def\chaptername{Kapitl}%
60.20 \def\appendixname{Dodawki}%
60.21 \def\contentsname{Wobsah}%
60.22 \def\listfigurename{Zapis wobrazow}%
60.23 \def\listtablename{Zapis tabulkow}%
60.24 \def\indexname{Indeks}%
60.25 \def\figurename{Wobraz}%
60.26 \def\tablename{Tabulka}%
60.27 \def\partname{D\'z\v el}%
60.28 \def\enclname{P\v r\l oha}%
60.29 \def\ccname{CC}%
60.30 \def\headtoname{Komu}%
60.31 \def\pagename{Strona}%
60.32 \def\seename{hl.}%
60.33 \def\alsoname{hl.~te\v z}
71 The le described in this section has version number v1.0k and was last revised on
2008/03/17. It was written by Eduard Werner (edi@kaihh.hanse.de).

372
60.34 \def\proofname{Proof}% <-- needs translation
60.35 \def\glossaryname{Glossary}% <-- Needs translation
60.36 }%

\newdateusorbian The macro \newdateusorbian redenes the command \today to produce Upper
Sorbian dates.
60.37 \@namedef{newdate\CurrentOption}{%
60.38 \def\today{\number\day.~\ifcase\month\or
60.39 januara\or februara\or m\v erca\or apryla\or meje\or junija\or
60.40 julija\or awgusta\or septembra\or oktobra\or
60.41 nowembra\or decembra\fi
60.42 \space \number\year}}

\olddateusorbian The macro \olddateusorbian redenes the command \today to produce old-style
Upper Sorbian dates.
60.43 \@namedef{olddate\CurrentOption}{%
60.44 \def\today{\number\day.~\ifcase\month\or
60.45 wulkeho r\'o\v zka\or ma\l eho r\'o\v zka\or nal\v etnika\or
60.46 jutrownika\or r\'o\v zownika\or sma\v znika\or pra\v znika\or
60.47 \v znjenca\or po\v znjenca\or winowca\or nazymnika\or
60.48 hodownika\fi \space \number\year}}

The default will be the new-style dates.


60.49 \expandafter\let\csname date\CurrentOption\expandafter\endcsname
60.50 \csname newdate\CurrentOption\endcsname

\extrasusorbian The macro \extrasusorbian will perform all the extra denitions needed for
the Upper Sorbian language. It's pirated from germanb.sty. The macro
\noextrasusorbian is used to cancel the actions of \extrasusorbian.
Because for Upper Sorbian (as well as for Dutch) the " character is made
active. This is done once, later on its denition may vary.
60.51 \initiate@active@char{"}
60.52 \@namedef{extras\CurrentOption}{\languageshorthands{usorbian}}
60.53 \expandafter\addto\csname extras\CurrentOption\endcsname{%

60.54 \bbl@activate{"}}
Don't forget to turn the shorthands o again.
60.55 \expandafter\addto\csname extras\CurrentOption\endcsname{%
60.56 \bbl@deactivate{"}}
In order for TEX to be able to hyphenate German Upper Sorbian words which
contain `ÿ' we have to give the character a nonzero \lccode (see Appendix H, the
TEXbook). As some of the other language denitions turn the character ^ into a
shorthand we need to make sure that it has it's orginial denition here.
60.57 \begingroup \catcode`\^7
60.58 \def\x{\endgroup
60.59 \expandafter\addto\csname extras\CurrentOption\endcsname{%
60.60 \babel@savevariable{\lccode`\^^Y}%
60.61 \lccode`\^^Y`\^^Y}}
60.62 \x

The umlaut accent macro \" is changed to lower the umlaut dots. The redenition
is done with the help of \umlautlow.
60.63 \expandafter\addto\csname extras\CurrentOption\endcsname{%

373
60.64 \babel@save\"\umlautlow}
60.65 \expandafter\addto\csname noextras\CurrentOption\endcsname{%
60.66 \umlauthigh}
The Upper Sorbian hyphenation patterns can be used with \lefthyphenmin and
\righthyphenmin set to 2.
60.67 \providehyphenmins{\CurrentOption}{\tw@\tw@}

\dq We save the original double quote character in \dq to keep it available, the math
accent \" can now be typed as ". Also we store the original meaning of the
command \" for future use.
60.68 \begingroup \catcode`\"12
60.69 \def\x{\endgroup
60.70 \def\@SS{\mathchar"7019 }
60.71 \def\dq{"}}
60.72 \x

Now we can dene the doublequote macros: the umlauts,


60.73 \declare@shorthand{usorbian}{"a}{\textormath{\"{a}}{\ddot a}}
60.74 \declare@shorthand{usorbian}{"o}{\textormath{\"{o}}{\ddot o}}
60.75 \declare@shorthand{usorbian}{"u}{\textormath{\"{u}}{\ddot u}}
60.76 \declare@shorthand{usorbian}{"A}{\textormath{\"{A}}{\ddot A}}
60.77 \declare@shorthand{usorbian}{"O}{\textormath{\"{O}}{\ddot O}}
60.78 \declare@shorthand{usorbian}{"U}{\textormath{\"{U}}{\ddot U}}
tremas,
60.79 \declare@shorthand{usorbian}{"e}{\textormath{\"{e}}{\ddot e}}
60.80 \declare@shorthand{usorbian}{"E}{\textormath{\"{E}}{\ddot E}}
60.81 \declare@shorthand{usorbian}{"i}{\textormath{\"{\i}}{\ddot\imath}}

60.82 \declare@shorthand{usorbian}{"I}{\textormath{\"{I}}{\ddot I}}

usorbian es-zet (sharp s),


60.83 \declare@shorthand{usorbian}{"s}{\textormath{\ss{}}{\@SS{}}}
60.84 \declare@shorthand{usorbian}{"S}{SS}
german and french quotes,
60.85 \declare@shorthand{usorbian}{"`}{%
60.86 \textormath{\quotedblbase}{\mbox{\quotedblbase}}}
60.87 \declare@shorthand{usorbian}{"'}{%

60.88 \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}}
60.89 \declare@shorthand{usorbian}{"<}{%

60.90 \textormath{\guillemotleft}{\mbox{\guillemotleft}}}
60.91 \declare@shorthand{usorbian}{">}{%

60.92 \textormath{\guillemotright}{\mbox{\guillemotright}}}
discretionary commands
60.93 \declare@shorthand{usorbian}{"c}{\textormath{\bbl@disc ck}{c}}
60.94 \declare@shorthand{usorbian}{"C}{\textormath{\bbl@disc CK}{C}}
60.95 \declare@shorthand{usorbian}{"f}{\textormath{\bbl@disc f{ff}}{f}}
60.96 \declare@shorthand{usorbian}{"F}{\textormath{\bbl@disc F{FF}}{F}}
60.97 \declare@shorthand{usorbian}{"l}{\textormath{\bbl@disc l{ll}}{l}}
60.98 \declare@shorthand{usorbian}{"L}{\textormath{\bbl@disc L{LL}}{L}}
60.99 \declare@shorthand{usorbian}{"m}{\textormath{\bbl@disc m{mm}}{m}}
60.100 \declare@shorthand{usorbian}{"M}{\textormath{\bbl@disc M{MM}}{M}}
60.101 \declare@shorthand{usorbian}{"n}{\textormath{\bbl@disc n{nn}}{n}}

374
60.102 \declare@shorthand{usorbian}{"N}{\textormath{\bbl@disc N{NN}}{N}}
60.103 \declare@shorthand{usorbian}{"p}{\textormath{\bbl@disc p{pp}}{p}}
60.104 \declare@shorthand{usorbian}{"P}{\textormath{\bbl@disc P{PP}}{P}}
60.105 \declare@shorthand{usorbian}{"t}{\textormath{\bbl@disc t{tt}}{t}}
60.106 \declare@shorthand{usorbian}{"T}{\textormath{\bbl@disc T{TT}}{T}}
and some additional commands:
60.107 \declare@shorthand{usorbian}{"-}{\nobreak\-\bbl@allowhyphens}
60.108 \declare@shorthand{usorbian}{"|}{%
60.109 \textormath{\nobreak\discretionary{-}{}{\kern.03em}%
60.110 \allowhyphens}{}}
60.111 \declare@shorthand{usorbian}{""}{\hskip\z@skip}

\mdqon All that's left to do now is to dene a couple of commands for reasons of compat-
\mdqoff ibility with german.sty.
\ck60.112 \def\mdqon{\shorthandon{"}}
60.113 \def\mdqoff{\shorthandoff{"}}

60.114 \def\ck{\allowhyphens\discretionary{k-}{k}{ck}\allowhyphens}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
60.115 \ldf@finish\CurrentOption
60.116 h/codei

375
61 The Turkish language
The le turkish.dtx72 denes all the language denition macros for the Turkish
language73 .
Turkish typographic rules specify that a little `white space' should be added
before the characters `:', `!' and `='. In order to insert this white space automat-
ically these characters are made `active'. Also \frenhspacing is set.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
61.1 h∗codei
61.2 \LdfInit{turkish}\captionsturkish
When this le is read as an option, i.e. by the \usepackage command, turkish
could be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@turkish to see whether we have to do something
here.
61.3 \ifx\l@turkish\@undefined
61.4 \@nopatterns{Turkish}
61.5 \adddialect\l@turkish0\fi
The next step consists of dening commands to switch to (and from) the Turk-
ish language.

\captionsturkish The macro \captionsturkish denes all strings used in the four standard docu-
mentclasses provided with LATEX.
\addto\captionsturkish{%
61.6

61.7 \def\prefacename{\"Ons\"oz}%
61.8 \def\refname{Kaynaklar}%
61.9 \def\abstractname{\"Ozet}%
61.10 \def\bibname{Kaynak\c ca}%
61.11 \def\chaptername{B\"ol\"um}%
61.12 \def\appendixname{Ek}%
61.13 \def\contentsname{\.I\c cindekiler}%
61.14 \def\listfigurename{\c Sekil Listesi}%
61.15 \def\listtablename{Tablo Listesi}%
61.16 \def\indexname{Dizin}%
61.17 \def\figurename{\c Sekil}%
61.18 \def\tablename{Tablo}%
61.19 \def\partname{K\i s\i m}%
61.20 \def\enclname{\.Ili\c sik}%
61.21 \def\ccname{Di\u ger Al\i c\i lar}%
61.22 \def\headtoname{Al\i c\i}%
61.23 \def\pagename{Sayfa}%
61.24 \def\subjectname{\.Ilgili}%
61.25 \def\seename{bkz.}%
61.26 \def\alsoname{ayr\i ca bkz.}%
61.27 \def\proofname{Kan\i t}%
61.28 \def\glossaryname{Glossary}% <-- Needs translation
61.29 }%

72 The le described in this section has version number v1.2m and was last revised on
2005/03/31.
73 Mustafa Burc, z6001@rziris01.rrz.uni-hamburg.de provided the code for this le. It is
based on the work by Pierre Mackay; Turgut Uyar, uyar@cs.itu.edu.tr supplied additional
translations in version 1.2j and later

376
\dateturkish The macro \dateturkish redenes the command \today to produce Turkish
dates.
61.30 \def\dateturkish{%
61.31 \def\today{\number\day~\ifcase\month\or
61.32 Ocak\or \c Subat\or Mart\or Nisan\or May\i{}s\or Haziran\or
61.33 Temmuz\or A\u gustos\or Eyl\"ul\or Ekim\or Kas\i{}m\or
61.34 Aral\i{}k\fi
61.35 \space\number\year}}

\extrasturkish The macro \extrasturkish will perform all the extra denitions needed for the
\noextrasturkish Turkish language. The macro \noextrasturkish is used to cancel the actions of
\extrasturkish.
Turkish typographic rules specify that a little `white space' should be added
before the characters `:', `!' and `='. In order to insert this white space automat-
ically these characters are made \active, so they have to be treated in a special
way.
61.36 \initiate@active@char{:}
61.37 \initiate@active@char{!}
61.38 \initiate@active@char{=}

We specify that the turkish group of shorthands should be used.


61.39 \addto\extrasturkish{\languageshorthands{turkish}}
These characters are `turned on' once, later their denition may vary.
61.40 \addto\extrasturkish{%
61.41 \bbl@activate{:}\bbl@activate{!}\bbl@activate{=}}
For Turkish texts \frenchspacing should be in eect. We make sure this is
the case and reset it if necessary.
61.42 \addto\extrasturkish{\bbl@frenchspacing}
61.43 \addto\noextrasturkish{\bbl@nonfrenchspacing}

\turkish@sh@!@ The denitions for the three active characters were made using intermediate
\turkish@sh@=@ macros. These are dened now. The insertion of extra `white space' should only
\turkish@sh@:@ happen outside math mode, hence the check \ifmmode in the macros.
61.44 \declare@shorthand{turkish}{:}{%
61.45 \ifmmode
61.46 \string:%
61.47 \else\relax
61.48 \ifhmode
61.49 \ifdim\lastskip>\z@
61.50 \unskip\penalty\@M\thinspace
61.51 \fi
61.52 \fi
61.53 \string:%
61.54 \fi}
61.55 \declare@shorthand{turkish}{!}{%

61.56 \ifmmode
61.57 \string!%
61.58 \else\relax
61.59 \ifhmode
61.60 \ifdim\lastskip>\z@
61.61 \unskip\penalty\@M\thinspace
61.62 \fi

377
61.63 \fi
61.64 \string!%
61.65 \fi}
61.66 \declare@shorthand{turkish}{=}{%

61.67 \ifmmode
61.68 \string=%
61.69 \else\relax
61.70 \ifhmode
61.71 \ifdim\lastskip>\z@
61.72 \unskip\kern\fontdimen2\font
61.73 \kern-1.4\fontdimen3\font
61.74 \fi
61.75 \fi
61.76 \string=%
61.77 \fi}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
61.78 \ldf@finish{turkish}
61.79 h/codei

378
62 The Hebrew language
The le hebrew.dtx74 provides the following packages and les for Hebrew lan-
guage support:

hebrew.ldf le denes all the language-specic macros for the Hebrew language.
rlbabel.def le is used by hebrew.ldf for bidirectional versions of the major
LATEX commands and environments. It is designed to be used with other
right-to-left languages, not only with Hebrew.

hebcal.sty package denes a set of macros for computing Hebrew date from
Gregorian one.

Additional Hebrew input and font encoding denition les that should be in-
cluded and used with hebrew.ldf are:

hebinp.dtx provides Hebrew input encodings, such as ISO 8859-8, MS Windows


codepage 1255 or IBM PC codepage 862 (see Section 63 on page 422).

hebrew.fdd contains Hebrew font encodings, related font denition les and
hebfont package that provides Hebrew font switching commands (see Sec-
tion 64 on page 429 for further details).

LATEX 2.09 compatibility les are included with heb209.dtx and gives possibil-
ity to compile existing LATEX 2.09 Hebrew documents with small (if any) changes
(see Section 65 on page 446 for details).
Finally, optional document class hebtech may be useful for writing theses and
dissertations in both Hebrew and English (and any other languages included with
babel). It designed to meet requirements of the Graduate School of the Technion
 Israel Institute of Technology.
As of version 2.3e hebtech is no longer distributed together with heblatex. It
should be part of a new "hebclasses" package

62.1 Acknowledgement
The following people have contributed to Hebrew package in one way or another,
knowingly or unknowingly. In alphabetical order: Irina Abramovici, Yaniv Bar-
gury, Yael Dubinsky, Sergio Fogel, Dan Haran, Rama Porrat, Michail Rozman,
Alon Ziv.
Tatiana Samoilov and Vitaly Surazhsky found a number of serious bugs in
preliminary version of Hebrew package.
A number of other people have contributed comments and information. Specic
contributions are acknowledged within the document.
I want to thank my wife, Vita, and son, Mishka, for their innite love and
patience.
If you made a contribution and I haven't mentioned it, don't worry, it was an
accident. I'm sorry. Just tell me and I will add you to the next version.
74 The Hebrew language support les described in this section have version number v2.3h and
were last revised on 2005/03/30.

379
62.2 The docstrip modules
The following modules are used in the implementation to direct docstrip in
generating external les:
driver produce a documentation driver le
hebrew produce Hebrew language support le
rightleft create right-to-left support le
calendar create Hebrew calendar package
A typical docstrip command le would then have entries like:
\generateFile{hebrew.ldf}{t}{\from{hebrew.dtx}{hebrew}}

62.3 Hebrew language denitions


The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
62.1 h∗hebrewi
62.2 \LdfInit{hebrew}{captionshebrew}
When this le is read as an option, i.e., by the \usepackage command, hebrew
will be an `unknown' language, in which case we have to make it known. So we
check for the existence of \l@hebrew to see whether we have to do something here.
62.3 \ifx\l@hebrew\@undefined
62.4 \@nopatterns{Hebrew}%
62.5 \adddialect\l@hebrew0
62.6 \fi

\hebrewencoding FIX DOCS REGARDING 8BIT


Typesetting Hebrew texts implies that a special input and output encoding
needs to be used. Generally, the user may choose between dierent available
Hebrew encodings provided. The current support for Hebrew uses all available
fonts from the Hebrew University of Jerusalem encoded in `old-code' 7-bit encoding
also known as Israeli Standard SI-960. We dene for these fonts the Local Hebrew
Encoding LHE (see the le hebrew.fdd for more details), and the LHE encoding
denition le should be loaded by default.
Other fonts are available in windows-cp1255 (a superset of ISO-8859-8 with
nikud). For those, the encoding HE8 should be used. Such fonts are, e.g., windows'
TrueType fonts (once cnverted to Type1 or MetaFont) and IBM's Type1 fonts.
However, if an user wants to use another font encoding, for example, cyrillic
encoding T2 and extended latin encoding T1,  he/she has to load the corre-
sponding le before the hebrew package. This may be done in the following way:

\usepackage[LHE,T2,T1]{fontenc}
\usepackage[hebrew,russian,english]{babel}
We make sure that the LHE encoding is known to LATEX at end of this package.
Also note that if you want to use the encoding HE8 , you should dene the
following in your document, before loading babel :

\def\HeblatexEncoding{HE8}
\def\HeblatexEncodingFile{he8enc}

380
\providecommand{\HeblatexEncoding}{LHE}%
62.7

\providecommand{\HeblatexEncodingFile}{lheenc}%
62.8

62.9 \newcommand{\heblatex@set@encoding}[2]{

62.10 }

62.11 \AtEndOfPackage{%

62.12 \@ifpackageloaded{fontenc}{%
62.13 \@ifl@aded{def}{%
62.14 \HeblatexEncodingFile}{\def\hebrewencoding{\HeblatexEncoding}}{}%
62.15 }{%
62.16 \input{\HeblatexEncodingFile.def}%
62.17 \def\hebrewencoding{\HeblatexEncoding}%
62.18 }}

We also need to load inputenc package with one of the Hebrew input encodings.
By default, we set up the 8859-8 codepage. If an user wants to use many input
encodings in the same document, for example, the MS Windows Hebrew codepage
cp1255 and the standard IBM PC Russian codepage cp866, he/she has to load
the corresponding le before the hebrew package too. This may be done in the
following way:
\usepackage[cp1255,cp866]{inputenc}
\usepackage[hebrew,russian,english]{babel}
An user can switch input encodings in the document using the command
\inputencoding, for example, to use the cp1255:
\inputencoding{cp1255}
62.19 \AtEndOfPackage{%
62.20 \@ifpackageloaded{inputenc}{}{\RequirePackage[8859-8]{inputenc}}}
The next step consists of dening commands to switch to (and from) the He-
brew language.

\hebrewhyphenmins This macro is used to store the correct values of the hyphenation parameters
\lefthyphenmin and \righthyphenmin. They are set to 2.
62.21 \providehyphenmins{\CurrentOption}{\tw@\tw@}

\captionshebrew The macro \captionshebrew replaces all captions used in the four standard doc-
ument classes provided with LATEX 2ε with their Hebrew equivalents.
62.22 \addto\captionshebrew{%
62.23 \def\prefacename{\@ensure@R{\hebmem\hebbet\hebvav\hebalef}}%
62.24 \def\refname{\@ensure@R{\hebresh\hebshin\hebyod\hebmem\hebtav\ %
62.25 \hebmem\hebqof\hebvav\hebresh\hebvav\hebtav}}%
62.26 \def\abstractname{\@ensure@R{\hebtav\hebqof\hebtsadi\hebyod\hebresh}}%
62.27 \def\bibname{\@ensure@R{\hebbet\hebyod\hebbet\heblamed\hebyod\hebvav%
62.28 \hebgimel\hebresh\hebpe\hebyod\hebhe}}%
62.29 \def\chaptername{\@ensure@R{\hebpe\hebresh\hebqof}}%
62.30 \def\appendixname{\@ensure@R{\hebnun\hebsamekh\hebpe\hebhet}}%
62.31 \def\contentsname{\@ensure@R{%
62.32 \hebtav\hebvav\hebkaf\hebfinalnun\ %
62.33 \hebayin\hebnun\hebyod\hebyod\hebnun\hebyod\hebfinalmem}}%
62.34 \def\listfigurename{\@ensure@R{%
62.35 \hebresh\hebshin\hebyod\hebmem\hebtav\ %
62.36 \hebalef\hebyod\hebvav\hebresh\hebyod\hebfinalmem}}%

381
62.37 \def\listtablename{\@ensure@R{%
62.38 \hebresh\hebshin\hebyod\hebmem\hebtav\
62.39 \hebtet\hebbet\heblamed\hebalef\hebvav\hebtav}}%
62.40 \def\indexname{\@ensure@R{\hebmem\hebpe\hebtav\hebhet}}%
62.41 \def\figurename{\@ensure@R{\hebalef\hebyod\hebvav\hebresh}}%
62.42 \def\tablename{\@ensure@R{\hebtet\hebbet\heblamed\hebhe}}%
62.43 \def\partname{\@ensure@R{\hebhet\heblamed\hebqof}}%
62.44 \def\enclname{\@ensure@R{\hebresh\hebtsadi"\hebbet}}%
62.45 \def\ccname{\@ensure@R{\hebhe\hebayin\hebtav\hebqof\hebyod%
62.46 \hebfinalmem}}%
62.47 \def\headtoname{\@ensure@R{\hebalef\heblamed}}%
62.48 \def\pagename{\@ensure@R{\hebayin\hebmem\hebvav\hebdalet}}%
62.49 \def\psname{\@ensure@R{\hebnun.\hebbet.}}%
62.50 \def\seename{\@ensure@R{\hebresh\hebalef\hebhe}}%
62.51 \def\alsoname{\@ensure@R{\hebresh\hebalef\hebhe \hebgimel%
62.52 \hebmemesof}}%
62.53 \def\proofname{\@ensure@R{\hebhe\hebvav\hebkaf\hebhet\hebhe}}
62.54 \def\glossaryname{\@ensure@L{Glossary}}% <-- Needs translation
62.55 }

\slidelabel Here we x the macro slidelabel of the seminar package. Note that this still
won't work well enough when overlays will be involved
62.56 \@ifclassloaded{seminar}{%
62.57 \def\slidelabel{\bf \if@rl\R{\hebshin\hebqof\hebfinalpe{} \theslide}%
62.58 \else\L{Slide \theslide}%
62.59 \fi}%
62.60 }{}

Here we provide an user with translation of Gregorian dates to Hebrew. In


addition, the hebcal package can be used to create Hebrew calendar dates.

\hebmonth The macro \hebmonth{month } produces month names in Hebrew.


62.61 \def\hebmonth#1{%
62.62 \ifcase#1\or \hebyod\hebnun\hebvav\hebalef\hebresh\or %
62.63 \hebpe\hebbet\hebresh\hebvav\hebalef\hebresh\or %
62.64 \hebmem\hebresh\hebfinaltsadi\or %
62.65 \hebalef\hebpe\hebresh\hebyod\heblamed\or %
62.66 \hebmem\hebalef\hebyod\or \hebyod\hebvav\hebnun\hebyod\or %
62.67 \hebyod\hebvav\heblamed\hebyod\or %
62.68 \hebalef\hebvav\hebgimel\hebvav\hebsamekh\hebtet\or %
62.69 \hebsamekh\hebpe\hebtet\hebmem\hebbet\hebresh\or %
62.70 \hebalef\hebvav\hebqof\hebtet\hebvav\hebbet\hebresh\or %
62.71 \hebnun\hebvav\hebbet\hebmem\hebbet\hebresh\or %
62.72 \hebdalet\hebtsadi\hebmem\hebbet\hebresh\fi}

\hebdate The macro \hebdate{day }{month }{year } translates a given Gregorian date to
Hebrew.
62.73 \def\hebdate#1#2#3{%
62.74 \beginR\beginL\number#1\endL\ \hebbet\hebmonth{#2}
62.75 \beginL\number#3\endL\endR}

\hebday The macro \hebday will replace \today command when in Hebrew mode.
62.76 \def\hebday{\hebdate{\day}{\month}{\year}}

382
\datehebrew The macro \datehebrew redenes the command \today to produce Gregorian
dates in Hebrew. It uses the macro \hebday.
62.77 \def\datehebrew{\let\today=\hebday}

The macro \extrashebrew will perform all the extra denitions needed for the
Hebrew language. The macro \noextrashebrew is used to cancel the actions of
\extrashebrew.

\extrashebrew We switch font encoding to Hebrew and direction to right-to-left. We can-


not use the regular language switching commands (for example, \sethebrew
and \unsethebrew or \selectlanguage{hebrew}), when in restricted horizon-
tal mode, because it will result in unbalanced \beginR or \beginL primitives.
Instead, in TEX's restricted horizontal mode, the \L{latin text } and \R{hebrew
text }, or \embox{latin text } and \hmbox{hebrew text } should be used.
Hence, we use \beginR and \beginL switching commands only when not in
restricted horizontal mode.
62.78 \addto\extrashebrew{%
62.79 \tohebrew%
62.80 \ifhmode\ifinner\else\beginR\fi\fi}

\noextrashebrew The macro \noextrashebrew is used to cancel the actions of \extrashebrew. We


switch back to the previous font encoding and restore left-to-right direction.
62.81 \addto\noextrashebrew{%
62.82 \fromhebrew%
62.83 \ifhmode\ifinner\else\beginL\fi\fi}

Generally, we can switch to- and from- Hebrew by means of standard babel-
dened commands, for example,

\selectlanguage{hebrew}
or

\begin{otherlanguage}{hebrew}
some Hebrew text
\end{otherlanguage}
Now we dene two additional commands that oer the possibility to switch to
and from Hebrew language. These commands are backward compatible with the
previous versions of hebrew.sty.

\sethebrew The command \sethebrew will switch from the current font encoding to the he-
\unsethebrew brew font encoding, and from the current direction of text to the right-to-left
mode. The command \unsethebrew switches back.
Both commands use standard right-to-left switching macros \setrllanguage{
r2l language name } and \unsetrllanguage{r2l language name }, that dened in
the rlbabel.def le.
62.84 \def\sethebrew{\setrllanguage{hebrew}}
62.85 \def\unsethebrew{\unsetrllanguage{hebrew}}

\hebrewtext The following two commands are obsolete and work only in LATEX2.09 compatibil-
\nohebrewtext ity mode. They are synonyms of \sethebrew and \unsethebrew dened above.

383
62.86 \if@compatibility
62.87 \let\hebrewtext=\sethebrew
62.88 \let\nohebrewtext=\unsethebrew
62.89 \fi

\tohebrew These two commands change only the current font encoding to- and from- He-
\fromhebrew brew encoding. Their implementation uses \@torl{language name } and \@fromrl
macros dened in rlbabel.def le. Both commands may be useful only for pack-
age and class writers, not for regular users.
62.90 \def\tohebrew{\@torl{hebrew}}%
62.91 \def\fromhebrew{\@fromrl}

\@hebrew Sometimes we need to preserve Hebrew mode without knowing in which environ-
ment we are located now. For these cases, the \@hebrew{hebrew text } macro will
be useful. Not that this macro is similar to the \@number and \@latin macros
dened in rlbabel.def le.
62.92 \def\@@hebrew#1{\beginR{{\tohebrew#1}}\endR}
62.93 \def\@hebrew{\protect\@@hebrew}

62.3.1 Hebrew numerals


We provide commands to print numbers in the traditional notation using Hebrew
letters. We need commands that print a Hebrew number from a decimal input, as
well as commands to print the value of a counter as a Hebrew number.
\if@gim@apost Hebrew numbers can be written in various styles: with or without apostrophes,
\if@gim@final and with the letters kaf, mem, nun, pe, tsadi as either nal or initial forms when
they are the last letters in the sequence. We provide two ags to set the style
options.
62.94 \newif\if@gim@apost % whether we print apostrophes
62.95 \newif\if@gim@final % whether we use final or initial letters

\hebrewnumeral The commands that print a Hebrew number must specify the style locally: relying
\Hebrewnumeral on a global style option could cause a counter to print in an inconsistent manner
\Hebrewnumeralfinal for instance, page numbers might appear in dierent styles if the global style option
changed mid-way through a document. The commands only allow three of the four
possible ag combinations (I do not know of a use that requires the combination
of nal letters and no apostrophes RA).
Each command sets the style ags and calls \@hebrew@numeral. Double braces
are used in order to protect the values of \@tempcnta and \@tempcntb, which are
changed by this call; they also keep the ag assignments local (this is not important
because the global values are never used).
62.96 \newcommand*{\hebrewnumeral}[1] % no apostrophe, no final letters
62.97 {{\@gim@finalfalse\@gim@apostfalse\@hebrew@numeral{#1}}}
62.98 \newcommand*{\Hebrewnumeral}[1] % apostrophe, no final letters
62.99 {{\@gim@finalfalse\@gim@aposttrue\@hebrew@numeral{#1}}}
62.100 \newcommand*{\Hebrewnumeralfinal}[1] % apostrophe, final letters

62.101 {{\@gim@finaltrue\@gim@aposttrue\@hebrew@numeral{#1}}}

\alph Counter-printing commands are based on the above commands. The natural name
\@alph for the counter-printing commands is \alph, because Hebrew numerals are the only
\Alph way to represent numbers with Hebrew letters (kaf always means 20, never 11).
\@Alph
\Alphfinal
384
\@Alphfinal
Hebrew has no uppercase letters, hence no need for the familiar meaning of \Alph;
we therefore dene \alph to print counters as Hebrew numerals without apostro-
phes, and \Alph to print with apostrophes. A third form, \Alphfinal, is provided
to print with apostrophes and nal letters, as is required for Hebrew year designa-
tors. The commands \alph and \Alph are dened in latex.ltx, and we only need
to redene the internal commands \@alph and \@Alph; for \Alphfinal we need
to provide both a wrapper and an internal command. The counter printing com-
mands are made semi-robust: without the \protect, commands like \theenumii
break (I'm not quite clear on why this happens, RA); at the same time, we cannot
make the commands too robust (e.g. with \DeclareRobustCommand) because this
would enter the command name rather than its value into les like .aux, .toc
etc. The old meanings of meaning of \@alph and \@Alph are saved upon entering
Hebrew mode and restored upon exiting it.
62.102 \addto\extrashebrew{%
62.103 \let\saved@alph=\@alph%
62.104 \let\saved@Alph=\@Alph%
62.105 \renewcommand*{\@alph}[1]{\protect\hebrewnumeral{\number#1}}%
62.106 \renewcommand*{\@Alph}[1]{\protect\Hebrewnumeral{\number#1}}%
62.107 \def\Alphfinal#1{\expandafter\@Alphfinal\csname c@#1\endcsname}%
62.108 \providecommand*{\@Alphfinal}[1]{\protect\Hebrewnumeralfinal{\number#1}}}
62.109 \addto\noextrashebrew{%

62.110 \let\@alph=\saved@alph%
62.111 \let\@Alph=\saved@Alph}
Note that \alph (without apostrophes) is already the appropriate choice for the
second-level enumerate label, and \Alph (with apostrophes) is an appropriate
choice for appendix; however, the default LATEX labels need to be redened for
appropriate cross-referencing, see below. LATEX default class les specify \Alph
for the fourth-level enumerate level, this should probably be changed. Also, the
way labels get ushed left by default looks inappropriate for Hebrew numerals, so
we should redene \labelenumii as well as \labelenumiv (presently not imple-
mented).

\theenumii Cross-references to counter labels need to be printed according to the language


\theenumiv environment in which a label was issued, not the environment in which it is called:
\label for example, a label (1b) issued in a Latin environment should be referred to as (1b)
in a Hebrew text, and label (2dalet) issued in a Hebrew environment should be
referred to as (2dalet) in a Latin text. This was the unanimous opinion in a poll
sent to the IvriTEX list. We therefore redene \theenumii and \theenumiv, so
that an explicit language instruction gets written to the .aux le.
62.112 \renewcommand{\theenumii}
62.113 {\if@rl\protect\hebrewnumeral{\number\c@enumii}%
62.114 \else\protect\L{\protect\@@alph{\number\c@enumii}}\fi}
62.115 \renewcommand{\theenumiv}

62.116 {\if@rl\protect\Hebrewnumeral{\number\c@enumiv}%
62.117 \else\protect\L{\protect\@@Alph{\number\c@enumiv}}\fi}
We also need to control for the font and direction in which a counter label is
printed. Direction is straightforward: a Latin label like (1b) should be written
left-to-right when called in a Hebrew text, and a Hebrew label like (2dalet) should
be written right-to-left when called in a Latin text. The font question is more
delicate, because we should decide whether the numerals should be typeset in

385
the font of the language enviroment in which the label was issued, or that of the
environment in which it is called.
• A purely numeric label like (23) looks best if it is set in the font of the
surrounding language.
• But a mixed alphanumeric label like (1b) lookes weird if the `1' is taken
from the Hebrew font; likewise, (2dalet) looks weird if the `2' is taken from
a Latin font.
• Finally, mixing the two possibilities is worst, because a single Hebrew sen-
tence referring to examples (1b) and (2) would take the `1' from the Latin
font and the `2' from the Hebrew font, and this looks really awful. (It is also
very hard to implement).
In light of the conicting considerations it seems like there's no perfect solution.
I have chosen to implement the top option, where numerals are taken from the
font of the surrounding language, because it seems to me that reference to purely
numeric labels is the most common, so this gives a good solution to the majority
of cases and a mediocre solution to the minority.
We redene the \label command which writes to the .aux le. Depending on
the language environment we issue appropriate \beginR/L· · ·\endR/L commands
to control the direction without aecting the font. Since these commands do not
aect the value of \if@rl, we cannot use the macro \@brackets to determine
the correct brackets to be used with \p@enumiii; instead, we let the language
environment determine an explicit denition.
62.118 \def\label#1{\@bsphack
62.119 \if@rl
62.120 \def\p@enumiii{\p@enumii)\theenumii(}%
62.121 \protected@write\@auxout{}%
62.122 {\string\newlabel{#1}{{\beginR\@currentlabel\endR}{\thepage}}}%
62.123 \else
62.124 \def\p@enumiii{\p@enumii(\theenumii)}%
62.125 \protected@write\@auxout{}%
62.126 {\string\newlabel{#1}{{\beginL\@currentlabel\endL}{\thepage}}}%
62.127 \fi
62.128 \@esphack}
NOTE: it appears that the denition of \label is language-independent and thus
belongs in rlbabel.def, but this is not the case. The decision to typeset label
numerals in the font of the surrounding language is reasonable for Hebrew, be-
cause mixed-font (1b) and (2dalet) are somewhat acceptable. The same may not
be acceptable for Arabic, whose numeral glyphs are radically dierent from those
in the Latin fonts. The decision about the direction may also be dierent for Ara-
bic, which is more right-to-left oriented than Hebrew (two examples: dates like
15/6/2003 are written left-to-right in Hebrew but right-to-left in Arabic; equa-
tions like 1 + 2 = 3 are written left-to-right in Hebrew but right-to-left in Arabic
elementary school textbooks using Arabic numeral glyphs). My personal hunch is
that a label like (1b) in an Arabic text would be typeset left-to-right if the `1' is
a Western glyph, but right-to-left if the `1' is an Arabic glyph. But this is just a
guess, I'd have to ask Arab typesetters to nd the correct answer. RA.
\appendix The following code provides for the proper printing of appendix numbers in tables
of contents. Section and chapter headings are normally bilingual: regardless of

386
the text language, the author supplies each section/chapter with two headings
one for the Hebrew table of contents and one for the Latin table of contents. It
makes sense that the label should be a Latin letter in the Latin table of contents
and a Hebrew letter in the Hebrew table of contents. The denition is similar to
that of \theenumii and \theenumiv above, but additional \protect commands
ensure that the entire condition is written the .aux le. The appendix number
will therefore be typeset according to the environment in which it is used rather
than issued: a Hebrew number (with apostrophes) in a Hebrew environment and
a Latin capital letter in a Latin environment (the command \@@Alph is set in
rlbabel.def to hold the default meaning of LATEX [latin] \@Alph, regardless of
the mode in which it is issued). The net result is that the second appendix will
be marked with `B' in the Latin table of contents and with `bet' in the Hebrew
table of contents; the mark in the main text will depend on the language of the
appendix itself.
62.129 \@ifclassloaded{letter}{}{%
62.130 \@ifclassloaded{slides}{}{%
62.131 \let\@@appendix=\appendix%
62.132 \@ifclassloaded{article}{%
62.133 \renewcommand\appendix{\@@appendix%
62.134 \renewcommand\thesection
62.135 {\protect\if@rl\protect\Hebrewnumeral{\number\c@section}%
62.136 \protect\else\@@Alph\c@section\protect\fi}}}
62.137 {\renewcommand\appendix{\@@appendix%
62.138 \renewcommand\thechapter
62.139 {\protect\if@rl\protect\Hebrewnumeral{\number\c@chapter}%
62.140 \protect\else\@@Alph\c@chapter\protect\fi}}}}}
QUESTION: is this also the appropriate way to refer to an appendix in the text,
or should we retain the original label the same way we did with enumerate labels?
ANOTHER QUESTION: are similar redenitions needed for other counters that
generate texts in bilingual lists like .lof/.fol and .lot/.tol? RA.

\@hebrew@numeral The command \@hebrew@numeral prints a Hebrew number. The groups of thou-
sands, millions, billions are separated by apostrophes and typeset without apostro-
phes or nal letters; the remainder (under 1000) is typeset conventionally, with the
selected styles for apostrophes and nal letters. The function calls on \gim@no@mil
to typeset each three-digit block. The algorithm is recursive, but the maximum re-
cursion depth is 4 because TEX only allows numbers up to 231 − 1 = 2,147,483,647.
The typesetting routine is wrapped in \@hebrew in order to ensure that numbers
are always typeset in Hebrew mode.
Initialize: \@tempcnta holds the value, \@tempcntb is used for calculations.
62.141 \newcommand*{\@hebrew@numeral}[1]
62.142 {\@hebrew{\@tempcnta=#1\@tempcntb=#1\relax
62.143 \divide\@tempcntb by 1000
If we're under 1000, call \gim@nomil
62.144 \ifnum\@tempcntb=0\gim@nomil\@tempcnta\relax
If we're above 1000 then force no apostrophe and no nal letter styles for the
value above 1000, recur for the value above 1000, add an apostrophe, and call
\gim@nomil for the remainder.
62.145 \else{\@gim@apostfalse\@gim@finalfalse\@hebrew@numeral\@tempcntb}'%
62.146 \multiply\@tempcntb by 1000\relax

387
62.147 \advance\@tempcnta by -\@tempcntb\relax
62.148 \gim@nomil\@tempcnta\relax
62.149 \fi
62.150 }}
NOTE: is it the case that 15,000 and 16,000 are written as yod-he and yod-vav,
rather than tet-vav and tet-zayin? This vaguely rings a bell, but I'm not certain.
If this is the case, then the current behavior is incorrect and should be changed.
RA.

\gim@nomil The command \gim@nomil typesets an integer between 0 and 999 (for 0 it typesets
nothing). The code has been modied from the old hebcal.sty (appropriate
creditsBoris Lavva and Michail Rozman ?). \@tempcnta holds the total value
that remains to be typeset. At each stage we nd the highest valued letter that is
less than or equal to \@tempcnta, and call on \gim@print to subtract this value
and print the letter.
Initialize: \@tempcnta holds the value, there is no previous letter.
62.151 \newcommand*{\gim@nomil}[1]{\@tempcnta=#1\@gim@prevfalse
Find the hundreds digit.
62.152 \@tempcntb=\@tempcnta\divide\@tempcntb by 100\relax % hundreds digit
62.153 \ifcase\@tempcntb % print nothing if no hundreds
62.154 \or\gim@print{100}{\hebqof}%
62.155 \or\gim@print{200}{\hebresh}%
62.156 \or\gim@print{300}{\hebshin}%
62.157 \or\gim@print{400}{\hebtav}%
62.158 \or\hebtav\@gim@prevtrue\gim@print{500}{\hebqof}%
62.159 \or\hebtav\@gim@prevtrue\gim@print{600}{\hebresh}%
62.160 \or\hebtav\@gim@prevtrue\gim@print{700}{\hebshin}%
62.161 \or\hebtav\@gim@prevtrue\gim@print{800}{\hebtav}%
62.162 \or\hebtav\@gim@prevtrue\hebtav\gim@print{900}{\hebqof}%
62.163 \fi
Find the tens digit. The numbers 15 and 16 are traditionally printed as tet-vav
(9 + 6) and tet-zayin (9 + 7) to avoid spelling the Lord's name.
62.164 \@tempcntb=\@tempcnta\divide\@tempcntb by 10\relax % tens digit
62.165 \ifcase\@tempcntb % print nothing if no tens
62.166 \or % number between 10 and 19
62.167 \ifnum\@tempcnta = 16 \gim@print {9}{\hebtet}% tet-zayin
62.168 \else\ifnum\@tempcnta = 15 \gim@print {9}{\hebtet}% tet-vav
62.169 \else \gim@print{10}{\hebyod}%
62.170 \fi % \@tempcnta = 15
62.171 \fi % \@tempcnta = 16
Initial or nal forms are selected according to the current style option; \gim@print
will force a non-nal letter in non-nal position by means of a local style change.
62.172 \or\gim@print{20}{\if@gim@final\hebfinalkaf\else\hebkaf\fi}%
62.173 \or\gim@print{30}{\heblamed}%
62.174 \or\gim@print{40}{\if@gim@final\hebfinalmem\else\hebmem\fi}%
62.175 \or\gim@print{50}{\if@gim@final\hebfinalnun\else\hebnun\fi}%
62.176 \or\gim@print{60}{\hebsamekh}%
62.177 \or\gim@print{70}{\hebayin}%
62.178 \or\gim@print{80}{\if@gim@final\hebfinalpe\else\hebpe\fi}%
62.179 \or\gim@print{90}{\if@gim@final\hebfinaltsadi\else\hebtsadi\fi}%
62.180 \fi

388
Print the ones digit.
62.181 \ifcase\@tempcnta % print nothing if no ones
62.182 \or\gim@print{1}{\hebalef}%
62.183 \or\gim@print{2}{\hebbet}%
62.184 \or\gim@print{3}{\hebgimel}%
62.185 \or\gim@print{4}{\hebdalet}%
62.186 \or\gim@print{5}{\hebhe}%
62.187 \or\gim@print{6}{\hebvav}%
62.188 \or\gim@print{7}{\hebzayin}%
62.189 \or\gim@print{8}{\hebhet}%
62.190 \or\gim@print{9}{\hebtet}%
62.191 \fi
62.192 }

\gim@print The actual printing routine typesets a digit with the appropriate apostrophes:
\if@gim@prev if a number sequence consists of a single letter then it is followed by a single
apostrophe, and if it consists of more than one letter then a double apostrophe is
inserted before the last letter. We typeset the letters one at a time, keeping a ag
that tells us if any previous letters had been typeset.
62.193 \newif\if@gim@prev % flag if a previous letter has been typeset
For each letter, we rst subtract its value from the total. Then,

• if the result is zero then this is the last letter; we check the ag to see if this
is the only letter and print it with the appropriate apostrophe;

• if the result is not zero then there remain additional letters to be typeset;
we print without an apostrophe and set the `previous letter' ag.

\@tempcnta holds the total value that remains to be typeset. We rst deduct the
letter's value from \@tempcnta, so \@tempcnta is zero if and only if this is the
last letter.
62.194 \newcommand*{\gim@print}[2]{% #2 is a letter, #1 is its value.
62.195 \advance\@tempcnta by -#1\relax% deduct the value from the remainder
If this is the last letter, we print with the appropriate apostrophe (depending
on the style option): if there is a preceding letter, print "x if the style calls for
apostrophes, x if it doesn't; otherwise, this is the only letter: print x' if the style
calls for apostrophes, x if it doesn't.
62.196 \ifnum\@tempcnta=0% if this is the last letter
62.197 \if@gim@prev\if@gim@apost"\fi#2%
62.198 \else#2\if@gim@apost'\fi\fi%
If this is not the last letter: print a non-nal form (by forcing a local style option)
and set the `previous letter' ag.
62.199 \else{\@gim@finalfalse#2}\@gim@prevtrue\fi}

\hebr The older Hebrew counter commands \hebr and \gim are retained in order to
\gim keep older documents from breaking. They are set to be equivalent to \alph, and
their use is deprecated. Note that \hebr gives dierent results than it had in the
pastit now typesets 11 as yod-alef rather than kaf.
62.200 \let\hebr=\alph
62.201 \let\gim=\alph

389
For backward compatibility with `older' hebrew.sty packages, we dene He-
brew equivalents of some useful LATEX commands. Note, however, that 8-bit
macros dened in Hebrew are no longer supported.
62.202 \def\hebcopy{\protect\R{\hebhe\hebayin\hebtav\hebqof}}
62.203 \def\hebincl{\protect\R{\hebresh\hebtsadi"\hebbet}}
62.204 \def\hebpage{\protect\R{\hebayin\hebmem\hebvav\hebdalet}}

62.205 \def\hebto{\protect\R{\hebayin\hebdalet}}

\hadgesh produce poor man's bold (heavy printout), when used with normal
font glyphs. It is advisable to use bold font (for example, Dead Sea ) instead of
this macro.
62.206 \def\hadgesh#1{\leavevmode\setbox0=\hbox{#1}%
62.207 \kern-.025em\copy0\kern-\wd0
62.208 \kern.05em\copy0\kern-\wd0
62.209 \kern-.025em\raise.0433em\box0 }
\piska and \piskapiska sometimes used in `older' hebrew sources, and should
not be used in LATEX 2ε .
62.210 \if@compatibility
62.211 \def\piska#1{\item{#1}\hangindent=-\hangindent}
62.212 \def\piskapiska#1{\itemitem{#1}\hangindent=-\hangindent}
62.213 \fi

The following commands are simply synonyms for the standard ones, provided
with LATEX 2ε .
62.214 \let\makafgadol=\textendash
62.215 \let\makafanak=\textemdash
62.216 \let\geresh=\textquoteright

62.217 \let\opengeresh=\textquoteright

62.218 \let\closegeresh=\textquoteleft

62.219 \let\openquote=\textquotedblright

62.220 \let\closequote=\textquotedblleft

62.221 \let\leftquotation=\textquotedblright

62.222 \let\rightquotation=\textquotedblleft

We need to ensure that Hebrew is used as the default right-to-left language


at \begin{document}. The mechanism of dening the \@rllanguagename is
the same as in babel's \languagename: the last right-to-left language in the
\usepackage{babel} line is set as the default right-to-left language at document
beginning.
For example, the following code:
\usepackage[russian,hebrew,arabic,greek,english]{babel}
will set the Arabic language as the default right-to-left language and the English
language as the default language. As a result, the commands \L{} and \embox{}
will use English and \R{} and \hmbox{} will use Arabic by default. These defaults
can be changed with the next \sethebrew or \selectlanguage{language name }
command.
62.223 \AtBeginDocument{\def\@rllanguagename{hebrew}}
The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
62.224 \ldf@finish{hebrew}
62.225 h/hebrewi

390
62.4 Right to left support
This le rlbabel.def denes necessary bidirectional macro support for LATEX 2ε .
It is designed for use not only with Hebrew, but with any Right-to-Left languages,
supported by babel. The macros provided in this le are language and encoding
independent.
Right-to-left languages will use TEX extensions, namely TEX primitives
\beginL, \endL and \beginR, \endR, currently implemented only in ε-TEX and
in TEX--XET.
If ε-TEX is used, we should switch it to the enhanced mode:
62.226 h∗rightlefti
62.227 \ifx\TeXXeTstate\undefined\else%
62.228 \TeXXeTstate=1
62.229 \fi

Note, that ε-TEX's format le should be created for extended mode. Mode can
be checked by running ε-TEX on some TEX le, for example:

This is e-TeX, Version 3.14159-1.1 (Web2c 7.0)


entering extended mode
The second line should be entering extended mode.
We check if user uses Right-to-Left enabled engine instead of regular Knuth's
TEX:
62.230 \ifx\beginL\@undefined%
62.231 \newlinechar`\^^J
62.232 \typeout{^^JTo avoid this error message,^^J%
62.233 run TeX--XeT or e-TeX engine instead of regular TeX.^^J}
62.234 \errmessage{Right-to-Left Support Error: use TeX--XeT or e-TeX
62.235 engine}%
62.236 \fi

62.4.1 Switching from LR to RL mode and back


\@torl and \@fromrl are called each time the horizontal direction changes.
They do all that is necessary besides changing the direction. Currently their
task is to change the encoding information and mode (condition \if@rl). They
should not normally be called by users: user-level macros, such as \sethebrew
and \unsethebrew, as well as babel's \selectlanguage are dened in language-
denition les and should be used to change default language (and direction).
Local direction changing commands (for small pieces of text): \L{}, \R{},
\embox{} and \hmbox{} are dened below in this le in language-independent
manner.

\if@rl rltrue means that the main mode is currently Right-to-Left.


rlfalse means that the main mode is currently Left-to-Right.
62.237 \newif\if@rl

\if@rlmain This is the main direction of the document. Unlike \if@rl it is set once and never
changes.

rltrue means that the document is Right-to-Left.


rlfalse means that the document is Left-to-Right.

391
Practically \if@rlmain is set according to the value of \if@rl in the beginning
of the run.
62.238 \AtBeginDocument{% Here we set the main document direction
62.239 \newif\if@rlmain%
62.240 \if@rl% e.g: if the options to babel were [english,hebrew]
62.241 \@rlmaintrue%
62.242 \else% e.g: if the options to babel were [hebrew,english]
62.243 \@rlmainfalse%
62.244 \fi%
62.245 }

\@torl Switches current direction to Right-to-Left: saves current Left-to-Right en-


coding in \lr@encodingdefault, sets required Right-to-Left language name in
\@rllanguagename (similar to babel's \languagename) and changes derection.
The Right-to-Left language encoding should be dened in .ldf le as special
macro created by concatenation of the language name and string encoding, for
example, for Hebrew it will be \hebrewencoding.
62.246 \DeclareRobustCommand{\@torl}[1]{%
62.247 \if@rl\else%
62.248 \let\lr@encodingdefault=\encodingdefault%
62.249 \fi%
62.250 \def\@rllanguagename{#1}%
62.251 \def\encodingdefault{\csname#1encoding\endcsname}%
62.252 \fontencoding{\encodingdefault}%
62.253 \selectfont%
62.254 \@rltrue}

\@fromrl Opposite to \@torl, switches current direction to Left-to-Right: restores saved


Left-to-Right encoding (\lr@encodingdefault) and changes direction.
62.255 \DeclareRobustCommand{\@fromrl}{%
62.256 \if@rl%
62.257 \let\encodingdefault=\lr@encodingdefault%
62.258 \fi%
62.259 \fontencoding{\encodingdefault}%
62.260 \selectfont%
62.261 \@rlfalse}

\selectlanguage This standard babel's macro should be redened to support bidirectional tables.
We divide \selectlanguage implementation to two parts, and the rst part calls
the second \@@selectlanguage.
62.262 \expandafter\def\csname selectlanguage \endcsname#1{%
62.263 \edef\languagename{%
62.264 \ifnum\escapechar=\expandafter`\string#1\@empty
62.265 \else \string#1\@empty\fi}%
62.266 \@@selectlanguage{\languagename}}

\@@selectlanguage This new internal macro redenes a nal part of the standard babel's \select-
language implementation.
Standard LATEX provides us with 3 tables: Table of Contents (.toc), List of
Figures (.lof), and List of Tables (.lot). In multi-lingual texts mixing Left-to-
Right languages with Right-to-Left ones, the use of various directions in one table
results in very ugly output. Therefore, these 3 standard tables will be used now

392
only for Left-to-Right languages, and we will add 3 Right-to-Left tables (their
extensions are simply reversed ones): RL Table of Contents (.cot), RL List of
Figures (.fol), and RL List of Tables (.lof).
62.267 \def\@@selectlanguage#1{%
62.268 \select@language{#1}%
62.269 \if@filesw
62.270 \protected@write\@auxout{}{\string\select@language{#1}}%
62.271 \if@rl%
62.272 \addtocontents{cot}{\xstring\select@language{#1}}%
62.273 \addtocontents{fol}{\xstring\select@language{#1}}%
62.274 \addtocontents{tol}{\xstring\select@language{#1}}%
62.275 \else%
62.276 \addtocontents{toc}{\xstring\select@language{#1}}%
62.277 \addtocontents{lof}{\xstring\select@language{#1}}%
62.278 \addtocontents{lot}{\xstring\select@language{#1}}%
62.279 \fi%
62.280 \fi}

\setrllanguage The \setrllanguage and \unsetrllanguage pair of macros is proved to very


\unsetrllanguage useful in bilingual texts, for example, in Hebrew-English texts. The language-
specic commands, for example, \sethebrew and \unsethebrew use these macros
as basis.
Implementation saves and restores other language in \other@languagename
variable, and uses internal macro \@@selectlanguage, dened above, to switch
between languages.
62.281 \let\other@languagename=\languagename
62.282 \DeclareRobustCommand{\setrllanguage}[1]{%
62.283 \if@rl\else%
62.284 \let\other@languagename=\languagename%
62.285 \fi%
62.286 \def\languagename{#1}%
62.287 \@@selectlanguage{\languagename}}
62.288 \DeclareRobustCommand{\unsetrllanguage}[1]{%
62.289 \if@rl%
62.290 \let\languagename=\other@languagename%
62.291 \fi
62.292 \@@selectlanguage{\languagename}}

\L Macros for changing direction, originally taken from TUGboat. Usage: \L{Left to
\R Right text } and \R{Right to Left text }. Numbers should also be enclosed in \L{},
\HeblatexRedefineL as in \L{123}.
Note, that these macros do not receive language name as parameter. Instead,
the saved \@rllanguagename will be used. We assume that each Right-to-Left
language denes \tolanguagename and \fromlanguagename macros in language
denition le, for example, for Hebrew: \tohebrew and \fromhebrew macros in
hebrew.ldf le.
The macros \L and \R include `protect' to to make them robust and allow use,
for example, in tables.
Due to the fact that some packages have dierent denitions for \L the macro
\HeblatexRedefineL is provided to overide them. This may be required with
hyperref, for instance.

393
62.293 \let\next=\
62.294 \def\HeblatexRedefineL{%
62.295 \def\L{\protect\pL}%
62.296 }

62.297 \HeblatexRedefineL

62.298 \def\pL{\protect\afterassignment\moreL \let\next= }

62.299 \def\moreL{\bracetext \aftergroup\endL \beginL\csname

62.300 from\@rllanguagename\endcsname}
62.301 \def\R{\protect\pR}
62.302 \def\pR{\protect\afterassignment\moreR \let\next= }
62.303 \def\moreR{\bracetext \aftergroup\endR \beginR\csname

62.304 to\@rllanguagename\endcsname}
62.305 \def\bracetext{\ifcat\next{\else\ifcat\next}\fi

62.306 \errmessage{Missing left brace has been substituted}\fi \bgroup}


62.307 \everydisplay{\if@rl\aftergroup\beginR\fi }

\@ensure@R Two small internal macros, a-la \ensuremath


\@ensure@L62.308 \def\@ensure@R#1{\if@rl#1\else\R{#1}\fi}
62.309 \def\@ensure@L#1{\if@rl\L{#1}\else#1\fi}

Take care of Right-to-Left indentation in every paragraph. Originally,


\noindent was redened for right-to-left by Yaniv Bargury, then the implemen-
tation was rewritten by Alon Ziv using an idea by Chris Rowley: \noindent now
works unmodied.
62.310 \def\rl@everypar{\if@rl{\setbox\z@\lastbox\beginR\usebox\z@}\fi}
62.311 \let\o@everypar=\everypar
62.312 \def\everypar#1{\o@everypar{\rl@everypar#1}}

\hmbox Useful vbox commands. All text in math formulas is best enclosed in these: LR
\embox text in \embox and RL text in \hmbox. \mbox{} is useless for both cases, since
it typesets in Left-to-Right even for Right-to-Left languages (additions by Yaniv
Bargury).
62.313 \newcommand{\hmbox}[1]{\mbox{\R{#1}}}
62.314 \newcommand{\embox}[1]{\mbox{\L{#1}}}

\@brackets When in Right-to-Left mode, brackets should be swapped. This macro receives 3
parameters: left bracket, content, right bracket. Brackets can be square brackets,
braces, or parentheses.
62.315 \def\@brackets#1#2#3{\protect\if@rl #3#2#1\protect\else
62.316 #1#2#3\protect\fi}

\@number \@number preserves numbers direction from Left to Right. \@latin in addition
\@latin switches current encoding to the latin.
62.317 \def\@@number#1{\ifmmode\else\beginL\fi#1\ifmmode\else\endL\fi}
62.318 \def\@@latin#1{\@@number{{\@fromrl#1}}}
62.319 \def\@number{\protect\@@number}

62.320 \def\@latin{\protect\@@latin}

62.4.2 Counters
To make counter references work in Right to Left text, we need to surround their
original denitions with an \@number{. . . } or \@latin{. . . }. Note, that language-
specic counters, such as \hebr or \gim are provided with language denition le.

394
We start with saving the original denitions:
62.321 \let\@@arabic=\@arabic
62.322 \let\@@roman=\@roman
62.323 \let\@@Roman=\@Roman

62.324 \let\@@alph=\@alph

62.325 \let\@@Alph=\@Alph

\@arabic Arabic and roman numbers should be from Left to Right. In addition, roman
\@roman numerals, both lower- and upper-case should be in latin encoding.
\@Roman62.326 \def\@arabic#1{\@number{\@@arabic#1}}
62.327 \def\@roman#1{\@latin{\@@roman#1}}

62.328 \def\@Roman#1{\@latin{\@@Roman#1}}

\arabicnorl This macro preserves the original denition of \arabic (overrides the overriding
of \@arabic)
62.329 \def\arabicnorl#1{\expandafter\@@arabic\csname c@#1\endcsname}
\make@lr In Right to Left documents all counters dened in the standard document
classes article, report and book provided with LATEX 2ε , such as \thesection,
\thefigure, \theequation should be typed as numbers from left to right. To
ensure direction, we use the following \make@lr{counter } macro:
62.330 \def\make@lr#1{\begingroup
62.331 \toks@=\expandafter{#1}%
62.332 \edef\x{\endgroup
62.333 \def\noexpand#1{\noexpand\@number{\the\toks@}}}%
62.334 \x}
62.335 \@ifclassloaded{letter}{}{%
62.336 \@ifclassloaded{slides}{}{%
62.337 \make@lr\thesection
62.338 \make@lr\thesubsection
62.339 \make@lr\thesubsubsection
62.340 \make@lr\theparagraph
62.341 \make@lr\thesubparagraph
62.342 \make@lr\thefigure
62.343 \make@lr\thetable
62.344 }
62.345 \make@lr\theequation
62.346 }

62.4.3 Preserving logos


Preserve TEX, LATEX and LATEX 2ε logos.
\TeX
62.347 \let\@@TeX\TeX
62.348 \def\TeX{\@latin{\@@TeX}}
\LaTeX
62.349 \let\@@LaTeX\LaTeX
62.350 \def\LaTeX{\@latin{\@@LaTeX}}
\LaTeXe
62.351 \let\@@LaTeXe\LaTeXe
62.352 \def\LaTeXe{\@latin{\@@LaTeXe}}

395
62.4.4 List environments
List environments in Right-to-Left languages, are ticked and indented from the
right instead of from the left. All the denitions that caused indentation are
revised for Right-to-Left languages. LATEX keeps track on the indentation with
the \leftmargin and \rightmargin values.

list Thus we need to override the denition of the \list macro: when in RTL mode,
the right margins are the begining of the line.
62.353 \def\list#1#2{%
62.354 \ifnum \@listdepth >5\relax
62.355 \@toodeep
62.356 \else
62.357 \global\advance\@listdepth\@ne
62.358 \fi
62.359 \rightmargin\z@
62.360 \listparindent\z@
62.361 \itemindent\z@
62.362 \csname @list\romannumeral\the\@listdepth\endcsname
62.363 \def\@itemlabel{#1}%
62.364 \let\makelabel\@mklab
62.365 \@nmbrlistfalse
62.366 #2\relax
62.367 \@trivlist
62.368 \parskip\parsep
62.369 \parindent\listparindent
62.370 \advance\linewidth -\rightmargin
62.371 \advance\linewidth -\leftmargin
The only change in the macro is the \if@rl case:
62.372 \if@rl
62.373 \advance\@totalleftmargin \rightmargin
62.374 \else
62.375 \advance\@totalleftmargin \leftmargin
62.376 \fi
62.377 \parshape \@ne \@totalleftmargin \linewidth
62.378 \ignorespaces}

\labelenumii The \labelenumii and \p@enumiii commands use parentheses. They are revised
\p@enumiii to work Right-to-Left with the help of \@brackets macro dened above.
62.379 \def\labelenumii{\@brackets(\theenumii)}
62.380 \def\p@enumiii{\p@enumii\@brackets(\theenumii)}

62.4.5 Tables of moving stu


Tables of moving arguments: table of contents (toc), list of gures (lof) and list
of tables (lot) are handles here. These three default LATEX tables will be used
now exclusively for Left to Right stu.
Three additional Right-to-Left tables: RL table of contents (cot), RL list of
gures (fol), and RL list of tables (tol) are added. These three tables will be
used exclusively for Right to Left stu.

396
\@tableofcontents We dene 3 new macros similar to the standard LATEX tables, but with one pa-
\@listoffigures rameter  table le extension. These macros will help us to dene our additional
\@listoftables tables below.
62.381 \@ifclassloaded{letter}{}{% other
62.382 \@ifclassloaded{slides}{}{% other
62.383 \@ifclassloaded{article}{% article
62.384 \newcommand\@tableofcontents[1]{%
62.385 \section*{\contentsname\@mkboth%
62.386 {\MakeUppercase\contentsname}%
62.387 {\MakeUppercase\contentsname}}%
62.388 \@starttoc{#1}}
62.389 \newcommand\@listoffigures[1]{%
62.390 \section*{\listfigurename\@mkboth%
62.391 {\MakeUppercase\listfigurename}%
62.392 {\MakeUppercase\listfigurename}}%
62.393 \@starttoc{#1}}
62.394 \newcommand\@listoftables[1]{%
62.395 \section*{\listtablename\@mkboth%
62.396 {\MakeUppercase\listtablename}%
62.397 {\MakeUppercase\listtablename}}%
62.398 \@starttoc{#1}}}%
62.399 {% else report or book
62.400 \newcommand\@tableofcontents[1]{%
62.401 \@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn%
62.402 \fi\chapter*{\contentsname\@mkboth%
62.403 {\MakeUppercase\contentsname}%
62.404 {\MakeUppercase\contentsname}}%
62.405 \@starttoc{#1}\if@restonecol\twocolumn\fi}
62.406 \newcommand\@listoffigures[1]{%
62.407 \@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn%
62.408 \fi\chapter*{\listfigurename\@mkboth%
62.409 {\MakeUppercase\listfigurename}%
62.410 {\MakeUppercase\listfigurename}}%
62.411 \@starttoc{#1}\if@restonecol\twocolumn\fi}
62.412 \newcommand\@listoftables[1]{%
62.413 \if@twocolumn\@restonecoltrue\onecolumn\else\@restonecolfalse\fi%
62.414 \chapter*{\listtablename\@mkboth%
62.415 {\MakeUppercase\listtablename}%
62.416 {\MakeUppercase\listtablename}}%
62.417 \@starttoc{#1}\if@restonecol\twocolumn\fi}}%

\lrtableofcontents Left-to-Right tables are called now \lrxxx and dened with the aid of three macros
\lrlistoffigures dened above (extensions toc, lof, and lot).
\lrlistoftables62.418 \newcommand\lrtableofcontents{\@tableofcontents{toc}}%
62.419 \newcommand\lrlistoffigures{\@listoffigures{lof}}%
62.420 \newcommand\lrlistoftables{\@listoftables{lot}}%

\rltableofcontents Right-to-Left tables will be called \rlxxx and dened with the aid of three macros
\rllistoffigures dened above (extensions cot, fol, and tol).
\rllistoftables62.421 \newcommand\rltableofcontents{\@tableofcontents{cot}}%
62.422 \newcommand\rllistoffigures{\@listoffigures{fol}}%
62.423 \newcommand\rllistoftables{\@listoftables{tol}}%

397
\tableofcontents Let \xxx be \rlxxx if the current direction is Right-to-Left and \lrxxx if it is
\listoffigures Left-to-Right.
\listoftables62.424 \renewcommand\tableofcontents{\if@rl\rltableofcontents%
62.425 \else\lrtableofcontents\fi}
62.426 \renewcommand\listoffigures{\if@rl\rllistoffigures%
62.427 \else\lrlistoffigures\fi}
62.428 \renewcommand\listoftables{\if@rl\rllistoftables%
62.429 \else\lrlistoftables\fi}}}
\@dottedtocline The following makes problems when making a Right-to-Left tables, since it uses
\leftskip and \rightskip which are both mode dependent.
62.430 \def\@dottedtocline#1#2#3#4#5{%
62.431 \ifnum #1>\c@tocdepth \else
62.432 \vskip \z@ \@plus.2\p@
62.433 {\if@rl\rightskip\else\leftskip\fi #2\relax
62.434 \if@rl\leftskip\else\rightskip\fi \@tocrmarg \parfillskip
62.435 -\if@rl\leftskip\else\rightskip\fi
62.436 \parindent #2\relax\@afterindenttrue
62.437 \interlinepenalty\@M
62.438 \leavevmode
62.439 \@tempdima #3\relax
62.440 \advance\if@rl\rightskip\else\leftskip\fi \@tempdima
62.441 \null\nobreak\hskip -\if@rl\rightskip\else\leftskip\fi
62.442 {#4}\nobreak
62.443 \leaders\hbox{$\m@th
62.444 \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
62.445 mu$}\hfill
62.446 \nobreak
62.447 \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor \beginL#5\endL}%
62.448 \par}%
62.449 \fi}
\l@part This standard macro was redened for table of contents since it uses \rightskip
which is mode dependent.
62.450 \@ifclassloaded{letter}{}{% other
62.451 \@ifclassloaded{slides}{}{% other
62.452 \renewcommand*\l@part[2]{%

62.453 \ifnum \c@tocdepth >-2\relax


62.454 \addpenalty{-\@highpenalty}%
62.455 \addvspace{2.25em \@plus\p@}%
62.456 \begingroup
62.457 \setlength\@tempdima{3em}%
62.458 \parindent \z@ \if@rl\leftskip\else\rightskip\fi \@pnumwidth
62.459 \parfillskip -\@pnumwidth
62.460 {\leavevmode
62.461 \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss#2}}\par
62.462 \nobreak
62.463 \global\@nobreaktrue
62.464 \everypar{\global\@nobreakfalse\everypar{}}%
62.465 \endgroup
62.466 \fi}}}
\@part Part is redened to support new Right-to-Left table of contents (cot) as well as
the Left-to-Right one (toc).

398
62.467 \@ifclassloaded{article}{% article class
62.468 \def\@part[#1]#2{%
62.469 \ifnum \c@secnumdepth >\m@ne
62.470 \refstepcounter{part}%
62.471 \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
62.472 \addcontentsline{cot}{part}{\thepart\hspace{1em}#1}%
62.473 \else
62.474 \addcontentsline{toc}{part}{#1}%
62.475 \addcontentsline{cot}{part}{#1}%
62.476 \fi
62.477 {\parindent \z@ \raggedright
62.478 \interlinepenalty \@M
62.479 \normalfont
62.480 \ifnum \c@secnumdepth >\m@ne
62.481 \Large\bfseries \partname~\thepart
62.482 \par\nobreak
62.483 \fi
62.484 \huge \bfseries #2%
62.485 \markboth{}{}\par}%
62.486 \nobreak
62.487 \vskip 3ex
62.488 \@afterheading}%
62.489 }{% report and book classes

62.490 \def\@part[#1]#2{%
62.491 \ifnum \c@secnumdepth >-2\relax
62.492 \refstepcounter{part}%
62.493 \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
62.494 \addcontentsline{cot}{part}{\thepart\hspace{1em}#1}%
62.495 \else
62.496 \addcontentsline{toc}{part}{#1}%
62.497 \addcontentsline{cot}{part}{#1}%
62.498 \fi
62.499 \markboth{}{}%
62.500 {\centering
62.501 \interlinepenalty \@M
62.502 \normalfont
62.503 \ifnum \c@secnumdepth >-2\relax
62.504 \huge\bfseries \partname~\thepart
62.505 \par
62.506 \vskip 20\p@
62.507 \fi
62.508 \Huge \bfseries #2\par}%
62.509 \@endpart}}

\@sect Section was redened from the latex.ltx le. It is changed to support both
Left-to-Right (toc) and Right-to-Left (cot) table of contents simultaneously.
62.510 \def\@sect#1#2#3#4#5#6[#7]#8{%
62.511 \ifnum #2>\c@secnumdepth
62.512 \let\@svsec\@empty
62.513 \else
62.514 \refstepcounter{#1}%
62.515 \protected@edef\@svsec{\@seccntformat{#1}\relax}%
62.516 \fi
62.517 \@tempskipa #5\relax

399
62.518 \ifdim \@tempskipa>\z@
62.519 \begingroup
62.520 #6{%
62.521 \@hangfrom{\hskip #3\relax\@svsec}%
62.522 \interlinepenalty \@M #8\@@par}%
62.523 \endgroup
62.524 \csname #1mark\endcsname{#7}%
62.525 \addcontentsline{toc}{#1}{%
62.526 \ifnum #2>\c@secnumdepth \else
62.527 \protect\numberline{\csname the#1\endcsname}%
62.528 \fi
62.529 #7}%
62.530 \addcontentsline{cot}{#1}{%
62.531 \ifnum #2>\c@secnumdepth \else
62.532 \protect\numberline{\csname the#1\endcsname}%
62.533 \fi
62.534 #7}%
62.535 \else
62.536 \def\@svsechd{%
62.537 #6{\hskip #3\relax
62.538 \@svsec #8}%
62.539 \csname #1mark\endcsname{#7}%
62.540 \addcontentsline{toc}{#1}{%
62.541 \ifnum #2>\c@secnumdepth \else
62.542 \protect\numberline{\csname the#1\endcsname}%
62.543 \fi
62.544 #7}%
62.545 \addcontentsline{cot}{#1}{%
62.546 \ifnum #2>\c@secnumdepth \else
62.547 \protect\numberline{\csname the#1\endcsname}%
62.548 \fi
62.549 #7}}%
62.550 \fi
62.551 \@xsect{#5}}

\@caption Caption was redened from the latex.ltx le. It is changed to support Left-to-
Right list of gures and list of tables (lof and lot) as well as new Right-to-Left
lists (fol and tol) simultaneously.
62.552 \long\def\@caption#1[#2]#3{%
62.553 \par
62.554 \addcontentsline{\csname ext@#1\endcsname}{#1}%
62.555 {\protect\numberline{\csname the#1\endcsname}%
62.556 {\ignorespaces #2}}%
62.557 \def\@fignm{figure}
62.558 \ifx#1\@fignm\addcontentsline{fol}{#1}%
62.559 {\protect\numberline{\csname the#1\endcsname}%
62.560 {\ignorespaces #2}}\fi%
62.561 \def\@tblnm{table}
62.562 \ifx#1\@tblnm\addcontentsline{tol}{#1}%
62.563 {\protect\numberline{\csname the#1\endcsname}%
62.564 {\ignorespaces #2}}\fi%
62.565 \begingroup
62.566 \@parboxrestore
62.567 \if@minipage

400
62.568 \@setminipage
62.569 \fi
62.570 \normalsize
62.571 \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
62.572 \endgroup}

\l@chapter This standard macro was redened for table of contents since it uses \rightskip
which is mode dependent.
62.573 \@ifclassloaded{letter}{}{%
62.574 \@ifclassloaded{slides}{}{%
62.575 \@ifclassloaded{article}{}{%
62.576 \renewcommand*\l@chapter[2]{%
62.577 \ifnum \c@tocdepth >\m@ne
62.578 \addpenalty{-\@highpenalty}%
62.579 \vskip 1.0em \@plus\p@
62.580 \setlength\@tempdima{1.5em}%
62.581 \begingroup
62.582 \parindent \z@ \if@rl\leftskip\else\rightskip\fi \@pnumwidth
62.583 \parfillskip -\@pnumwidth
62.584 \leavevmode \bfseries
62.585 \advance\if@rl\rightskip\else\leftskip\fi\@tempdima
62.586 \hskip -\if@rl\rightskip\else\leftskip\fi
62.587 #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss#2}\par
62.588 \penalty\@highpenalty
62.589 \endgroup
62.590 \fi}}}}

\l@section The toc entry for section did not work in article style. Also it does not print dots,
\l@subsection which is funny when most of your work is divided into sections.
\l@subsubsection It was revised to use \@dottedtocline as in report.sty (by Yaniv Bargury)
\l@paragraph and was updated later for all kinds of sections (by Boris Lavva).
\l@subparagraph62.591 \@ifclassloaded{article}{%
62.592 \renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.3em}}

62.593 \renewcommand*\l@subsection{\@dottedtocline{2}{3.8em}{3.2em}}

62.594 \renewcommand*\l@subsubsection{\@dottedtocline{3}{7.0em}{4.1em}}

62.595 \renewcommand*\l@paragraph{\@dottedtocline{4}{10em}{5em}}

62.596 \renewcommand*\l@subparagraph{\@dottedtocline{5}{12em}{6em}}}{}

62.4.6 Two-column mode


This is the support of twocolumn option for the standard LATEX 2ε classes.
The following code was originally borrowed from the ArabTEX package, le
latexext.sty, copyright by Klaus Lagally, Institut fuer Informatik, Universitaet
Stuttgart. It was updated for this package by Boris Lavva.

\@outputdblcol First column is \@leftcolumn will be shown at the right side, Second column is
\set@outputdblcol \@outputbox will be shown at the left side.
rl@outputdblcol \set@outputdblcol IS CURRENTLY DISABLED. TODO: REMOVE IT
[tzafrir]
62.597 \let\@@outputdblcol\@outputdblcol
62.598 %\def\set@outputdblcol{%
62.599 % \if@rl\renewcommand{\@outputdblcol}{\rl@outputdblcol}%
62.600 % \else\renewcommand{\@outputdblcol}{\@@outputdblcol}\fi}

401
62.601 \renewcommand{\@outputdblcol}{%
62.602 \if@rlmain%
62.603 \rl@outputdblcol%
62.604 \else%
62.605 \@@outputdblcol%
62.606 \fi%
62.607 }

62.608 \newcommand{\rl@outputdblcol}{%

62.609 \if@firstcolumn
62.610 \global \@firstcolumnfalse
62.611 \global \setbox\@leftcolumn \box\@outputbox
62.612 \else
62.613 \global \@firstcolumntrue
62.614 \setbox\@outputbox \vbox {\hb@xt@\textwidth {%
62.615 \hskip\columnwidth%
62.616 \hfil\vrule\@width\columnseprule\hfil
62.617 \hb@xt@\columnwidth {%
62.618 \box\@leftcolumn \hss}%
62.619 \hb@xt@\columnwidth {%
62.620 \hskip-\textwidth%
62.621 \box\@outputbox \hss}%
62.622 \hskip\columnsep%
62.623 \hskip\columnwidth}}%
62.624 \@combinedblfloats
62.625 \@outputpage
62.626 \begingroup
62.627 \@dblfloatplacement
62.628 \@startdblcolumn
62.629 \@whilesw\if@fcolmade \fi
62.630 {\@outputpage
62.631 \@startdblcolumn}%
62.632 \endgroup
62.633 \fi}

62.4.7 Footnotes
\footnoterule The Right-to-Left footnote rule is simply reversed default Left-to-Right one. Foot-
notes can be used in RL or LR main modes, but changing mode while a footnote
is pending is still unsolved.
62.634 \let\@@footnoterule=\footnoterule
62.635 \def\footnoterule{\if@rl\hb@xt@\hsize{\hss\vbox{\@@footnoterule}}%
62.636 \else\@@footnoterule\fi}

62.4.8 Headings and two-side support


When using headings or myheadings modes, we have to ensure that the language
and direction of heading is the same as the whole chapter/part of the document.
This is implementing by setting special variable \headlanguage when starting
new chapter/part.
In addition, when selecting the twoside option (default in book document
class), the LR and RL modes need to be set properly for things on the heading
and footing. This is done here too.

402
ps@headings First, we will support the standard letter class:
ps@myheadings62.637 \@ifclassloaded{letter}{%
headeven62.638 \def\headodd{\protect\if@rl\beginR\fi\headtoname{}
headodd62.639 \ignorespaces\toname
62.640 \hfil \@date
62.641 \hfil \pagename{} \thepage\protect\if@rl\endR\fi}
62.642 \if@twoside
62.643 \def\ps@headings{%
62.644 \let\@oddfoot\@empty\let\@evenfoot\@empty
62.645 \def\@oddhead{\select@language{\headlanguage}\headodd}
62.646 \let\@evenhead\@oddhead}
62.647 \else
62.648 \def\ps@headings{%
62.649 \let\@oddfoot\@empty
62.650 \def\@oddhead{\select@language{\headlanguage}\headodd}}
62.651 \fi
62.652 \def\headfirst{\protect\if@rl\beginR\fi\fromlocation \hfill %
62.653 \telephonenum\protect\if@rl\endR\fi}
62.654 \def\ps@firstpage{%
62.655 \let\@oddhead\@empty
62.656 \def\@oddfoot{\raisebox{-45\p@}[\z@]{%
62.657 \hb@xt@\textwidth{\hspace*{100\p@}%
62.658 \ifcase \@ptsize\relax
62.659 \normalsize
62.660 \or
62.661 \small
62.662 \or
62.663 \footnotesize
62.664 \fi
62.665 \select@language{\headlanguage}\headfirst}}\hss}}
62.666 %

62.667 \renewcommand{\opening}[1]{%
62.668 \let\headlanguage=\languagename%
62.669 \ifx\@empty\fromaddress%
62.670 \thispagestyle{firstpage}%
62.671 {\raggedleft\@date\par}%
62.672 \else % home address
62.673 \thispagestyle{empty}%
62.674 {\raggedleft
62.675 \if@rl\begin{tabular}{@{\beginR\csname%
62.676 to\@rllanguagename\endcsname}r@{\endR}}\ignorespaces
62.677 \fromaddress \\*[2\parskip]%
62.678 \@date \end{tabular}\par%
62.679 \else\begin{tabular}{l}\ignorespaces
62.680 \fromaddress \\*[2\parskip]%
62.681 \@date \end{tabular}\par%
62.682 \fi}%
62.683 \fi
62.684 \vspace{2\parskip}%
62.685 {\raggedright \toname \\ \toaddress \par}%
62.686 \vspace{2\parskip}%
62.687 #1\par\nobreak}
62.688 }

Then, the article, report and book document classes are supported. Note, that

403
in one-sided mode \markright was changed to \markboth.
62.689 {% article, report, book
62.690 \def\headeven{\protect\if@rl\beginR\thepage\hfil\rightmark\endR
62.691 \protect\else\thepage\hfil{\slshape\leftmark}
62.692 \protect\fi}
62.693 \def\headodd{\protect\if@rl\beginR\leftmark\hfil\thepage\endR
62.694 \protect\else{\slshape\rightmark}\hfil\thepage
62.695 \protect\fi}
62.696 \@ifclassloaded{article}{% article
62.697 \if@twoside % two-sided
62.698 \def\ps@headings{%
62.699 \let\@oddfoot\@empty\let\@evenfoot\@empty
62.700 \def\@evenhead{\select@language{\headlanguage}\headeven}%
62.701 \def\@oddhead{\select@language{\headlanguage}\headodd}%
62.702 \let\@mkboth\markboth
62.703 \def\sectionmark##1{%
62.704 \markboth {\MakeUppercase{%
62.705 \ifnum \c@secnumdepth >\z@
62.706 \thesection\quad
62.707 \fi
62.708 ##1}}{}}%
62.709 \def\subsectionmark##1{%
62.710 \markright{%
62.711 \ifnum \c@secnumdepth >\@ne
62.712 \thesubsection\quad
62.713 \fi
62.714 ##1}}}
62.715 \else % one-sided
62.716 \def\ps@headings{%
62.717 \let\@oddfoot\@empty
62.718 \def\@oddhead{\headodd}%
62.719 \let\@mkboth\markboth
62.720 \def\sectionmark##1{%
62.721 \markboth{\MakeUppercase{%
62.722 \ifnum \c@secnumdepth >\m@ne
62.723 \thesection\quad
62.724 \fi
62.725 ##1}}{\MakeUppercase{%
62.726 \ifnum \c@secnumdepth >\m@ne
62.727 \thesection\quad
62.728 \fi
62.729 ##1}}}}
62.730 \fi
62.731 %

62.732 \def\ps@myheadings{%
62.733 \let\@oddfoot\@empty\let\@evenfoot\@empty
62.734 \def\@evenhead{\select@language{\headlanguage}\headeven}%
62.735 \def\@oddhead{\select@language{\headlanguage}\headodd}%
62.736 \let\@mkboth\@gobbletwo
62.737 \let\sectionmark\@gobble
62.738 \let\subsectionmark\@gobble
62.739 }}{% report and book
62.740 \if@twoside % two-sided
62.741 \def\ps@headings{%

404
62.742 \let\@oddfoot\@empty\let\@evenfoot\@empty
62.743 \def\@evenhead{\select@language{\headlanguage}\headeven}
62.744 \def\@oddhead{\select@language{\headlanguage}\headodd}
62.745 \let\@mkboth\markboth
62.746 \def\chaptermark##1{%
62.747 \markboth{\MakeUppercase{%
62.748 \ifnum \c@secnumdepth >\m@ne
62.749 \@chapapp\ \thechapter. \ %
62.750 \fi
62.751 ##1}}{}}%
62.752 \def\sectionmark##1{%
62.753 \markright {\MakeUppercase{%
62.754 \ifnum \c@secnumdepth >\z@
62.755 \thesection. \ %
62.756 \fi
62.757 ##1}}}}
62.758 \else % one-sided
62.759 \def\ps@headings{%
62.760 \let\@oddfoot\@empty
62.761 \def\@oddhead{\select@language{\headlanguage}\headodd}
62.762 \let\@mkboth\markboth
62.763 \def\chaptermark##1{%
62.764 \markboth{\MakeUppercase{%
62.765 \ifnum \c@secnumdepth >\m@ne
62.766 \@chapapp\ \thechapter. \ %
62.767 \fi
62.768 ##1}}{\MakeUppercase{%
62.769 \ifnum \c@secnumdepth >\m@ne
62.770 \@chapapp\ \thechapter. \ %
62.771 \fi
62.772 ##1}}}}
62.773 \fi
62.774 \def\ps@myheadings{%
62.775 \let\@oddfoot\@empty\let\@evenfoot\@empty
62.776 \def\@evenhead{\select@language{\headlanguage}\headeven}%
62.777 \def\@oddhead{\select@language{\headlanguage}\headodd}%
62.778 \let\@mkboth\@gobbletwo
62.779 \let\chaptermark\@gobble
62.780 \let\sectionmark\@gobble
62.781 }}}

62.4.9 Postscript Porblems


Any command that is implemented by PostScript directives, e.g commands from
the ps-tricks package, needs to be xed, because the PostScript directives are being
interpeted after the document has been converted by TEXto visual Hebrew (DVI,
PostScript and PDF have visual Hebrew).
For instance: Suppose you wrote in your document:
\textcolor{cyan}{some ltr text}
This would be interpeted by TEXto something like:
[postscript:make color cyan]some LTR text[postscript:make color black]
However, with the bidirectionality support we get:
\textcolor{cyan}{\hebalef\hebbet}

405
Translated to:
[postscript:make color black]{bet}{alef}[postscript:make color cyan]
While we want:
[postscript:make color cyan]{bet}{alef}[postscript:make color black]
The following code will probably work at least with code that stays in the same
line:
@textcolor
62.782 \AtBeginDocument{%
62.783 %I assume that \@textcolor is only defined by the package color
62.784 \ifx\@textcolor\@undefined\else%
62.785 % If that macro was defined before the beginning of the document,
62.786 % that is: the package was loaded: redefine it with bidi support
62.787 \def\@textcolor#1#2#3{%
62.788 \if@rl%
62.789 \beginL\protect\leavevmode{\color#1{#2}\beginR#3\endR}\endL%
62.790 \else%
62.791 \protect\leavevmode{\color#1{#2}#3}%
62.792 \fi%
62.793 }%
62.794 \fi%
62.795 }

62.796 % \end{macrocode}

62.797 % \end{macro}

62.798 % \begin{macro}{\thetrueSlideCounter}

62.799 % This macro probably needs to be overriden for when using |prosper|,
62.800 % (waiting for feedback. Tzafrir)
62.801 % \begin{macrocode}
62.802 \@ifclassloaded{prosper}{%

62.803 \def\thetrueSlideCounter{\arabicnorl{trueSlideCounter}}
62.804 }{}

62.4.10 Miscellaneous internal LATEX macros


\raggedright \raggedright was changed from latex.ltx le to support Right-to-Left mode,
\raggedleft because of the bug in its implementation.
62.805 \def\raggedright{%
62.806 \let\\\@centercr
62.807 \leftskip\z@skip\rightskip\@flushglue
62.808 \parindent\z@\parfillskip\z@skip}
Swap meanings of \raggedright and \raggedleft in Right-to-Left mode.
62.809 \let\@@raggedleft=\raggedleft
62.810 \let\@@raggedright=\raggedright
62.811 \renewcommand\raggedleft{\if@rl\@@raggedright%

62.812 \else\@@raggedleft\fi}
62.813 \renewcommand\raggedright{\if@rl\@@raggedleft%

62.814 \else\@@raggedright\fi}

\author \author is inserted with tabular environment, and will be used in restricted
horizontal mode. Therefore we have to add explicit direction change command
when in Right-to-Left mode.
62.815 \let\@@author=\author
62.816 \renewcommand{\author}[1]{\@@author{\if@rl\beginR #1\endR\else #1\fi}}

406
\MakeUppercase There are no uppercase and lowercase letters in most Right-to-Left languages,
\MakeLowercase therefore we should redene \MakeUppercase and \MakeLowercase LATEX 2ε com-
mands.
62.817 \let\@@MakeUppercase=\MakeUppercase
62.818 \def\MakeUppercase#1{\if@rl#1\else\@@MakeUppercase{#1}\fi}
62.819 \let\@@MakeLowercase=\MakeLowercase

62.820 \def\MakeLowercase#1{\if@rl#1\else\@@MakeLowercase{#1}\fi}

\underline We should explicitly use \L and \R commands in \underlined text.


62.821 \let\@@@underline=\underline
62.822 \def\underline#1{\@@@underline{\if@rl\R{#1}\else #1\fi}}

\undertext was added for LATEX2.09 compatibility mode.


62.823 \if@compatibility
62.824 \let\undertext=\underline
62.825 \fi

\@xnthm The following has been inserted to correct the appearance of the number in
\@opargbegintheorem \newtheorem to reorder theorem number components. A similar correction in
the denition of \@opargbegintheorem was added too.
62.826 \def\@xnthm#1#2[#3]{%
62.827 \expandafter\@ifdefinable\csname #1\endcsname
62.828 {\@definecounter{#1}\@addtoreset{#1}{#3}%
62.829 \expandafter\xdef\csname the#1\endcsname{\noexpand\@number
62.830 {\expandafter\noexpand\csname the#3\endcsname \@thmcountersep
62.831 \@thmcounter{#1}}}%
62.832 \global\@namedef{#1}{\@thm{#1}{#2}}%
62.833 \global\@namedef{end#1}{\@endtheorem}}}
62.834 %

62.835 \def\@opargbegintheorem#1#2#3{%

62.836 \trivlist
62.837 \item[\hskip \labelsep{\bfseries #1\ #2\
62.838 \@brackets({#3})}]\itshape}

\@chapter The following was added for pretty printing of the chapter numbers, for supporting
\@schapter Right-to-Left tables (cot, fol, and tol), to save \headlanguage for use in running
headers, and to start two-column mode depending on chapter's main language.
62.839 \@ifclassloaded{article}{}{%
62.840 % For pretty priniting
62.841 \def\@@chapapp{Chapter}
62.842 \def\@@thechapter{\@@arabic\c@chapter}
62.843 \def\@chapter[#1]#2{%
62.844 \let\headlanguage=\languagename%
62.845 %\set@outputdblcol%
62.846 \ifnum \c@secnumdepth >\m@ne
62.847 \refstepcounter{chapter}%
62.848 \typeout{\@@chapapp\space\@@thechapter.}%
62.849 \addcontentsline{toc}{chapter}%
62.850 {\protect\numberline{\thechapter}#1}
62.851 \addcontentsline{cot}{chapter}%
62.852 {\protect\numberline{\thechapter}#1}
62.853 \else
62.854 \addcontentsline{toc}{chapter}{#1}%

407
62.855 \addcontentsline{cot}{chapter}{#1}%
62.856 \fi
62.857 \chaptermark{#1}
62.858 \addtocontents{lof}{\protect\addvspace{10\p@}}%
62.859 \addtocontents{fol}{\protect\addvspace{10\p@}}%
62.860 \addtocontents{lot}{\protect\addvspace{10\p@}}%
62.861 \addtocontents{tol}{\protect\addvspace{10\p@}}%
62.862 \if@twocolumn
62.863 \@topnewpage[\@makechapterhead{#2}]%
62.864 \else
62.865 \@makechapterhead{#2}%
62.866 \@afterheading
62.867 \fi}
62.868 %
62.869 \def\@schapter#1{%
62.870 \let\headlanguage=\languagename%
62.871 %\set@outputdblcol%
62.872 \if@twocolumn
62.873 \@topnewpage[\@makeschapterhead{#1}]%
62.874 \else
62.875 \@makeschapterhead{#1}%
62.876 \@afterheading
62.877 \fi}}

\appendix Changed mainly for pretty printing of appendix numbers, and to start two-column
mode with the right language (if needed).
62.878 \@ifclassloaded{letter}{}{% other
62.879 \@ifclassloaded{slides}{}{% other
62.880 \@ifclassloaded{article}{% article
62.881 \renewcommand\appendix{\par
62.882 \setcounter{section}{0}%
62.883 \setcounter{subsection}{0}%
62.884 \renewcommand\thesection{\@Alph\c@section}}
62.885 }{% report and book
62.886 \renewcommand\appendix{\par
62.887 %\set@outputdblcol%
62.888 \setcounter{chapter}{0}%
62.889 \setcounter{section}{0}%
62.890 \renewcommand\@chapapp{\appendixname}%
62.891 % For pretty priniting
62.892 \def\@@chapapp{Appendix}%
62.893 \def\@@thechapter{\@@Alph\c@chapter}
62.894 \renewcommand\thechapter{\@Alph\c@chapter}}}}}

62.4.11 Bibliography and citations


\@cite Citations are produced by the macro \@cite{LABEL}{NOTE }. Both the citation
\@biblabel label and the note is typeset in the current direction. We have to use \@brackets
\@lbibitem macro in \@cite and \@biblabel macros. In addition, when using alpha or similar
bibliography style, the \@lbibitem is used and have to be update to support bot
Right-to-Left and Left-to-Right citations.
62.895 \def\@cite#1#2{\@brackets[{#1\if@tempswa , #2\fi}]}
62.896 \def\@biblabel#1{\@brackets[{#1}]}

408
62.897 \def\@lbibitem[#1]#2{\item[\@biblabel{#1}\hfill]\if@filesw
62.898 {\let\protect\noexpand
62.899 \immediate
62.900 \if@rl\write\@auxout{\string\bibcite{#2}{\R{#1}}}%
62.901 \else\write\@auxout{\string\bibcite{#2}{\L{#1}}}\fi%
62.902 }\fi\ignorespaces}

thebibliography Use \rightmargin instead of \leftmargin when in RL mode.


62.903 \@ifclassloaded{letter}{}{% other
62.904 \@ifclassloaded{slides}{}{% other
62.905 \@ifclassloaded{article}{%

62.906 \renewenvironment{thebibliography}[1]
62.907 {\section*{\refname\@mkboth%
62.908 {\MakeUppercase\refname}%
62.909 {\MakeUppercase\refname}}%
62.910 \list{\@biblabel{\@arabic\c@enumiv}}%
62.911 {\settowidth\labelwidth{\@biblabel{#1}}%
62.912 \if@rl\leftmargin\else\rightmargin\fi\labelwidth
62.913 \advance\if@rl\leftmargin\else\rightmargin\fi\labelsep
62.914 \@openbib@code
62.915 \usecounter{enumiv}%
62.916 \let\p@enumiv\@empty
62.917 \renewcommand\theenumiv{\@arabic\c@enumiv}}%
62.918 \sloppy
62.919 \clubpenalty4000
62.920 \@clubpenalty \clubpenalty
62.921 \widowpenalty4000%
62.922 \sfcode`\.\@m}
62.923 {\def\@noitemerr
62.924 {\@latex@warning{Empty `thebibliography' environment}}%
62.925 \endlist}}%
62.926 {\renewenvironment{thebibliography}[1]{%

62.927 \chapter*{\bibname\@mkboth%
62.928 {\MakeUppercase\bibname}%
62.929 {\MakeUppercase\bibname}}%
62.930 \list{\@biblabel{\@arabic\c@enumiv}}%
62.931 {\settowidth\labelwidth{\@biblabel{#1}}%
62.932 \if@rl\leftmargin\else\rightmargin\fi\labelwidth
62.933 \advance\if@rl\leftmargin\else\rightmargin\fi\labelsep
62.934 \@openbib@code
62.935 \usecounter{enumiv}%
62.936 \let\p@enumiv\@empty
62.937 \renewcommand\theenumiv{\@arabic\c@enumiv}}%
62.938 \sloppy
62.939 \clubpenalty4000
62.940 \@clubpenalty \clubpenalty
62.941 \widowpenalty4000%
62.942 \sfcode`\.\@m}
62.943 {\def\@noitemerr
62.944 {\@latex@warning{Empty `thebibliography' environment}}%
62.945 \endlist}}}}

\@verbatim All kinds of verbs (\verb,\verb*,verbatim and verbatim*) now can be used in
Right-to-Left mode. Errors in latin mode solved too.

409
62.946 \def\@verbatim{%
62.947 \let\do\@makeother \dospecials%
62.948 \obeylines \verbatim@font \@noligs}

\@makecaption Captions are set always centered. This allows us to use bilingual captions, for
example: \caption{\R{RLtext} \\ \L{LRtext}}, which will be formatted as:
Right to left caption here (RLtext)
Left to right caption here (LRtext)
See also \bcaption command below.
62.949 \long\def\@makecaption#1#2{%
62.950 \vskip\abovecaptionskip%
62.951 \begin{center}%
62.952 #1: #2%
62.953 \end{center} \par%
62.954 \vskip\belowcaptionskip}

62.4.12 Additional bidirectional commands


• Section headings are typeset with the default global direction.
• Text in section headings in the reverse language do not have to be protected
for the reection command, as in: \protect\L{Latin Text }, because \L and
\R are robust now.
• Table of contents, list of gures and list of tables should be typeset with
the \tableofcontents, \listoffigures and \listoftables commands
respectively.

• The above tables will be typeset in the main direction (and language) in
eect where the above commands are placed.

• Only 2 tables of each kind are supported: one for Right-to-Left and another
for Left-to-Right directions.

How to include line to both tables? One has to use bidirectional sectioning
commands as following:

1. Use the \bxxx version of the sectioning commands in the text instead of
the \xxx version (xxx is one of: part, chapter, section, subsection,
subsubsection, caption).
2. Syntax of the \bxxx command is \bxxx {RL text }{LR text }. Both arguments
are typeset in proper direction by default (no need to change direction for
the text inside).

3. The section header inside the document will be typeset in the global direction
in eect at the time. i.e. The {RL text } will be typeset if Right-to-Left mode
is in eect and {LR text } otherwise.

\bpart
62.955 \newcommand{\bpart}[2]{\part{\protect\if@rl%
62.956 #1 \protect\else #2 \protect\fi}}

410
\bchapter
62.957 \newcommand{\bchapter}[2]{\chapter{\protect\if@rl%
62.958 #1 \protect\else #2 \protect\fi}}

\bsection
62.959 \newcommand{\bsection}[2]{\section{\protect\if@rl%
62.960 #1 \protect\else #2 \protect\fi}}

\bsubsection
62.961 \newcommand{\bsubsection}[2]{\subsection{\protect\if@rl%
62.962 #1 \protect\else #2 \protect\fi}}

\bsubsubsection
62.963 \newcommand{\bsubsubsection}[2]{\subsubsection{\protect\if@rl%
62.964 #1 \protect\else #2 \protect\fi}}

\bcaption
62.965 \newcommand{\bcaption}[2]{%
62.966 \caption[\protect\if@rl \R{#1}\protect\else \L{#2}\protect\fi]{%
62.967 \if@rl\R{#1}\protect\\ \L{#2}
62.968 \else\L{#2}\protect\\ \R{#1}\fi}}

The following denition is a modied version of \bchapter, meant as a bilin-


gual twin for \chapter* and \section* (added by Irina Abramovici).

\bchapternn
62.969 \newcommand{\bchapternn}[2]{\chapter*{\protect\if@rl%
62.970 #1 \protect\else #2 \protect\fi}}

\bsectionnn
62.971 \newcommand{\bsectionnn}[2]{\section*{\protect\if@rl%
62.972 #1 \protect\else #2 \protect\fi}}

Finally, at end of babel package, the \headlanguage and two-column mode


will be initialized according to the current language.
62.973 \AtEndOfPackage{\rlAtEndOfPackage}
62.974 %
62.975 \def\rlAtEndOfPackage{%

62.976 \global\let\headlanguage=\languagename%\set@outputdblcol%
62.977 }

62.978 h/rightlefti

62.5 Hebrew calendar


The original version of the package hebcal.sty75 for TEX and LATEX2.09, entitled
TEX & LATEX macros for computing Hebrew date from Gregorian one was created
by Michail Rozman, misha@iop.tartu.ew.su76
75 The following description of hebcal package is based on the comments included with original
source by the author, Michail Rozman.
76 Please direct any comments, bug reports, questions, etc. about the package to this address.

411
Released: Tammuz 12, 5751June 24, 1991
Corrected: Shebat 10, 5752January 15, 1992 by Rama Porrat
Corrected: Adar II 5, 5752March 10, 1992 by Misha
Corrected: Tebeth, 5756January 1996 Dan Haran
(haran@math.tau.ac.il)
The package was adjusted for babel and LATEX 2ε by Boris Lavva.
Changes to the printing routine (only) by Ron Artstein, June 1, 2003.
This package should be included after the babel with hebrew option, as fol-
lowing:

\documentclass[. . . ]{. . . }
\usepackage[hebrew,. . . ,other languages , . . . ]{babel}
\usepackage{hebcal}
Two main user-level commands are provided by this package:
\Hebrewtoday Computes today's Hebrew date and prints it. If we are presently in Hebrew
mode, the date will be printed in Hebrew, otherwise  in English (like Shebat 10,
5752).
\Hebrewdate Computes the Hebrew date from the given Gregorian date and prints it. If we
are presently in Hebrew mode, the date will be printed in Hebrew, otherwise 
in English (like Shebat 10, 5752). An example of usage is shown below:

\newcount\hd \newcount\hm \newcount\hy


\hd=10 \hm=3 \hy=1992
\Hebrewdate{\hd}{\hm}{\hy}
full The package option full sets the ag \@full@hebrew@year, which causes
years from the current millenium to be printed with the thousands digit (he-
tav-shin-samekh-gimel). Without this option, thousands are not printed for the
current millenium. NOTE: should this be a command option rather than a package
option? RA.

62.5.1 Introduction
The Hebrew calendar is inherently complicated: it is lunisolar  each year starts
close to the autumn equinox, but each month must strictly start at a new moon.
Thus Hebrew calendar must be harmonized simultaneously with both lunar and
solar events. In addition, for reasons of the religious practice, the year cannot
start on Sunday, Wednesday or Friday.
For the full description of Hebrew calendar and for the list of references see:

Nachum Dershowitz and Edward M. Reingold, Calendarical Calcu-


lations , SoftwarePract.Exper., vol. 20 (9), pp.899928 (September
1990).

C translation of LISP programs from the above article available from Mr. Wayne
Geiser, geiser%pictel@uunet.uu.net.
The 4th distribution (July 1989) of hdate/hcal (Hebrew calendar programs
similar to UNIX date/cal) by Mr. Amos Shapir, amos@shum.huji.ac.il, contains
short and very clear description of algorithms.

412
62.5.2 Registers, Commands, Formatting Macros
The command \Hebrewtoday produces today's date for Hebrew calendar. It is
similar to the standard LATEX 2ε command \today. In addition three numerical
registers \Hebrewday, \Hebrewmonth and \Hebrewyear are set. For setting this
registers without producing of date string command \Hebrewsetreg can be used.
The command \Hebrewdate{Gday }{Gmonth }{Gyear } produces Hebrew cal-
endar date corresponding to Gregorian date Gday.Gmonth.Gyear. Three numeri-
cal registers \Hebrewday, \Hebrewmonth and \Hebrewyear are set.
For converting arbitrary Gregorian date Gday.Gmonth.Gyear to Hebrew date
Hday.Hmonth.Hyear without producing date string the command:
\HebrewFromGregorian{Gday }{Gmonth }{ Gyear }{Hday }{Hmonth }{Hyear }

can be used.
62.979 h∗calendari
62.980 \newif\if@full@hebrew@year
62.981 \@full@hebrew@yearfalse

62.982 \DeclareOption{full}{\@full@hebrew@yeartrue}

62.983 \ProcessOptions

62.984 \newcount\Hebrewday \newcount\Hebrewmonth \newcount\Hebrewyear

\Hebrewdate Hebrew calendar date corresponding to Gregorian date Gday.Gmonth.Gyear. If


Hebrew (right-to-left) fonts & macros are not loaded, we have to use English
format.
62.985 \def\Hebrewdate#1#2#3{%
62.986 \HebrewFromGregorian{#1}{#2}{#3}
62.987 {\Hebrewday}{\Hebrewmonth}{\Hebrewyear}%
62.988 \ifundefined{if@rl}%
62.989 \FormatForEnglish{\Hebrewday}{\Hebrewmonth}{\Hebrewyear}%
62.990 \else%
62.991 \FormatDate{\Hebrewday}{\Hebrewmonth}{\Hebrewyear}%
62.992 \fi}

\Hebrewtoday Today's date in Hebrew calendar.


62.993 \def\Hebrewtoday{\Hebrewdate{\day}{\month}{\year}}
62.994 \let\hebrewtoday=\Hebrewtoday

\Hebrewsetreg Set registers: today's date in hebrew calendar.


62.995 \def\Hebrewsetreg{%
62.996 \HebrewFromGregorian{\day}{\month}{\year}
62.997 {\Hebrewday}{\Hebrewmonth}{\Hebrewyear}}

\FormatDate Prints a Hebrew calendar date Hebrewday.Hebrewmonth.Hebrewyear.


62.998 \def\FormatDate#1#2#3{%
62.999 \if@rl%
62.1000 \FormatForHebrew{#1}{#2}{#3}%
62.1001 \else%
62.1002 \FormatForEnglish{#1}{#2}{#3}
62.1003 \fi}

To prepare another language version of Hebrew calendar commands, one should


change or add commands here.
We start with Hebrew language macros.

413
\HebrewYearName Prints Hebrew year as a Hebrew number. Disambiguates strings by adding lamed-
pe-gimel to years of the rst Jewish millenium and to years divisible by 1000.
Suppresses the thousands digit in the current millenium unless the package option
full is selected. NOTE: should this be provided as a command option rather
than a package option? RA.
62.1004 \def\HebrewYearName#1{{%
62.1005 \@tempcnta=#1\divide\@tempcnta by 1000\multiply\@tempcnta by 1000
62.1006 \ifnum#1=\@tempcnta\relax % divisible by 1000: disambiguate
62.1007 \Hebrewnumeralfinal{#1}\ )\heblamed\hebpe"\hebgimel(%
62.1008 \else % not divisible by 1000
62.1009 \ifnum#1<1000\relax % first millennium: disambiguate
62.1010 \Hebrewnumeralfinal{#1}\ )\heblamed\hebpe"\hebgimel(%
62.1011 \else
62.1012 \ifnum#1<5000
62.1013 \Hebrewnumeralfinal{#1}%
62.1014 \else
62.1015 \ifnum#1<6000 % current millenium, print without thousands
62.1016 \@tempcnta=#1\relax
62.1017 \if@full@hebrew@year\else\advance\@tempcnta by -5000\fi
62.1018 \Hebrewnumeralfinal{\@tempcnta}%
62.1019 \else % #1>6000
62.1020 \Hebrewnumeralfinal{#1}%
62.1021 \fi
62.1022 \fi
62.1023 \fi
62.1024 \fi}}

\HebrewMonthName The macro \HebrewMonthName{month }{year } returns the name of month in the
`year'.
62.1025 \def\HebrewMonthName#1#2{%
62.1026 \ifnum #1 = 7 %
62.1027 \CheckLeapHebrewYear{#2}%
62.1028 \if@HebrewLeap \hebalef\hebdalet\hebresh\ \hebbet'%
62.1029 \else \hebalef\hebdalet\hebresh%
62.1030 \fi%
62.1031 \else%
62.1032 \ifcase#1%
62.1033 % nothing for 0
62.1034 \or\hebtav\hebshin\hebresh\hebyod%
62.1035 \or\hebhet\hebshin\hebvav\hebfinalnun%
62.1036 \or\hebkaf\hebsamekh\heblamed\hebvav%
62.1037 \or\hebtet\hebbet\hebtav%
62.1038 \or\hebshin\hebbet\hebtet%
62.1039 \or\hebalef\hebdalet\hebresh\ \hebalef'%
62.1040 \or\hebalef\hebdalet\hebresh\ \hebbet'%
62.1041 \or\hebnun\hebyod\hebsamekh\hebfinalnun%
62.1042 \or\hebalef\hebyod\hebyod\hebresh%
62.1043 \or\hebsamekh\hebyod\hebvav\hebfinalnun%
62.1044 \or\hebtav\hebmem\hebvav\hebzayin%
62.1045 \or\hebalef\hebbet%
62.1046 \or\hebalef\heblamed\hebvav\heblamed%
62.1047 \fi%
62.1048 \fi}

414
\HebrewDayName Name of day in Hebrew letters (gimatria).
62.1049 \def\HebrewDayName#1{\Hebrewnumeral{#1}}

\FormatForHebrew The macro \FormatForHebrew{hday }{hmonth }{hyear } returns the formatted


Hebrew date in Hebrew language.
62.1050 \def\FormatForHebrew#1#2#3{%
62.1051 \HebrewDayName{#1}~\hebbet\HebrewMonthName{#2}{#3},~%
62.1052 \HebrewYearName{#3}}

We continue with two English language macros for Hebrew calendar.


\HebrewMonthNameInEnglish The macro \HebrewMonthNameInEnglish{month }{ year } is similar to \Hebrew-
MonthName described above. It returns the name of month in the Hebrew `year'
in English.
62.1053 \def\HebrewMonthNameInEnglish#1#2{%
62.1054 \ifnum #1 = 7%
62.1055 \CheckLeapHebrewYear{#2}%
62.1056 \if@HebrewLeap Adar II\else Adar\fi%
62.1057 \else%
62.1058 \ifcase #1%
62.1059 % nothing for 0
62.1060 \or Tishrei%
62.1061 \or Heshvan%
62.1062 \or Kislev%
62.1063 \or Tebeth%
62.1064 \or Shebat%
62.1065 \or Adar I%
62.1066 \or Adar II%
62.1067 \or Nisan%
62.1068 \or Iyar%
62.1069 \or Sivan%
62.1070 \or Tammuz%
62.1071 \or Av%
62.1072 \or Elul%
62.1073 \fi
62.1074 \fi}

\FormatForEnglish The macro \FormatForEnglish{hday }{hmonth }{hyear } is similar to \Format-


ForHebrew macro described above and returns the formatted Hebrew date in En-
glish.
62.1075 \def\FormatForEnglish#1#2#3{%
62.1076 \HebrewMonthNameInEnglish{#2}{#3} \number#1,\ \number#3}

62.5.3 Auxiliary Macros


62.1077 \newcount\@common
\Remainder \Remainder{a }{b }{c } calculates c = a%b == a − b × a
b
62.1078 \def\Remainder#1#2#3{%
62.1079 #3 = #1% % c = a
62.1080 \divide #3 by #2% % c = a/b
62.1081 \multiply #3 by -#2% % c = -b(a/b)
62.1082 \advance #3 by #1}% % c = a - b(a/b)

415
62.1083 \newif\if@Divisible

\CheckIfDivisible \CheckIfDivisible{a }{b } sets \@Divisibletrue if a%b == 0


62.1084 \def\CheckIfDivisible#1#2{%
62.1085 {%
62.1086 \countdef\tmp = 0% \tmp == \count0 - temporary variable
62.1087 \Remainder{#1}{#2}{\tmp}%
62.1088 \ifnum \tmp = 0%
62.1089 \global\@Divisibletrue%
62.1090 \else%
62.1091 \global\@Divisiblefalse%
62.1092 \fi}}

\ifundefined From the TEXbook, ex. 7.7:


\ifundefined{command }<true text>\else<false text>\fi
62.1093 \def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax}

62.5.4 Gregorian Part


62.1094 \newif\if@GregorianLeap
\IfGregorianLeap Conditional which is true if Gregorian `year' is a leap year: ((year%4 == 0) ∧
(year%100 6= 0)) ∨ (year%400 == 0)
62.1095 \def\IfGregorianLeap#1{%
62.1096 \CheckIfDivisible{#1}{4}%
62.1097 \if@Divisible%
62.1098 \CheckIfDivisible{#1}{100}%
62.1099 \if@Divisible%
62.1100 \CheckIfDivisible{#1}{400}%
62.1101 \if@Divisible%
62.1102 \@GregorianLeaptrue%
62.1103 \else%
62.1104 \@GregorianLeapfalse%
62.1105 \fi%
62.1106 \else%
62.1107 \@GregorianLeaptrue%
62.1108 \fi%
62.1109 \else%
62.1110 \@GregorianLeapfalse%
62.1111 \fi%
62.1112 \if@GregorianLeap}

\GregorianDaysInPriorMonths The macro \GregorianDaysInPriorMonths{month }{year }{days } calculates the


number of days in months prior to `month' in the `year'.
62.1113 \def\GregorianDaysInPriorMonths#1#2#3{%
62.1114 {%
62.1115 #3 = \ifcase #1%
62.1116 0 \or% % no month number 0
62.1117 0 \or%
62.1118 31 \or%
62.1119 59 \or%
62.1120 90 \or%
62.1121 120 \or%

416
62.1122 151 \or%
62.1123 181 \or%
62.1124 212 \or%
62.1125 243 \or%
62.1126 273 \or%
62.1127 304 \or%
62.1128 334%
62.1129 \fi%
62.1130 \IfGregorianLeap{#2}%
62.1131 \ifnum #1 > 2% % if month after February
62.1132 \advance #3 by 1% % add leap day
62.1133 \fi%
62.1134 \fi%
62.1135 \global\@common = #3}%
62.1136 #3 = \@common}

\GregorianDaysInPriorYears The macro \GregorianDaysInPriorYears{year }{days } calculates the number of


days in years prior to the `year'.
62.1137 \def\GregorianDaysInPriorYears#1#2{%
62.1138 {%
62.1139 \countdef\tmpc = 4% % \tmpc==\count4
62.1140 \countdef\tmpb = 2% % \tmpb==\count2
62.1141 \tmpb = #1% %
62.1142 \advance \tmpb by -1% %
62.1143 \tmpc = \tmpb% % \tmpc = \tmpb = year-1
62.1144 \multiply \tmpc by 365% % Days in prior years =
62.1145 #2 = \tmpc% % = 365*(year-1) ...
62.1146 \tmpc = \tmpb% %
62.1147 \divide \tmpc by 4% % \tmpc = (year-1)/4
62.1148 \advance #2 by \tmpc% % ... plus Julian leap days ...
62.1149 \tmpc = \tmpb% %
62.1150 \divide \tmpc by 100% % \tmpc = (year-1)/100
62.1151 \advance #2 by -\tmpc% % ... minus century years ...
62.1152 \tmpc = \tmpb% %
62.1153 \divide \tmpc by 400% % \tmpc = (year-1)/400
62.1154 \advance #2 by \tmpc% % ... plus 4-century years.
62.1155 \global\@common = #2}%
62.1156 #2 = \@common}

\AbsoluteFromGregorian The macro \AbsoluteFromGregorian{day }{month }{year }{absdate } calculates


the absolute date (days since 01.01.0001) from Gregorian date day.month.year.
62.1157 \def\AbsoluteFromGregorian#1#2#3#4{%
62.1158 {%
62.1159 \countdef\tmpd = 0% % \tmpd==\count0
62.1160 #4 = #1% % days so far this month
62.1161 \GregorianDaysInPriorMonths{#2}{#3}{\tmpd}%
62.1162 \advance #4 by \tmpd% % add days in prior months
62.1163 \GregorianDaysInPriorYears{#3}{\tmpd}%
62.1164 \advance #4 by \tmpd% % add days in prior years
62.1165 \global\@common = #4}%
62.1166 #4 = \@common}

62.5.5 Hebrew Part

417
62.1167 \newif\if@HebrewLeap
\CheckLeapHebrewYear Set \@HebrewLeaptrue if Hebrew `year' is a leap year, i.e. if (1 + 7 × year)%19 < 7
then true else false
62.1168 \def\CheckLeapHebrewYear#1{%
62.1169 {%
62.1170 \countdef\tmpa = 0% % \tmpa==\count0
62.1171 \countdef\tmpb = 1% % \tmpb==\count1
62.1172 %

62.1173 \tmpa = #1%


62.1174 \multiply \tmpa by 7%
62.1175 \advance \tmpa by 1%
62.1176 \Remainder{\tmpa}{19}{\tmpb}%
62.1177 \ifnum \tmpb < 7% % \tmpb = (7*year+1)%19
62.1178 \global\@HebrewLeaptrue%
62.1179 \else%
62.1180 \global\@HebrewLeapfalse%
62.1181 \fi}}

\HebrewElapsedMonths The macro \HebrewElapsedMonths{year }{months } determines the number of


months elapsed from the Sunday prior to the start of the Hebrew calendar to
the mean conjunction of Tishri of Hebrew `year'.
62.1182 \def\HebrewElapsedMonths#1#2{%
62.1183 {%
62.1184 \countdef\tmpa = 0% % \tmpa==\count0
62.1185 \countdef\tmpb = 1% % \tmpb==\count1
62.1186 \countdef\tmpc = 2% % \tmpc==\count2
62.1187 %

62.1188 \tmpa = #1% %


62.1189 \advance \tmpa by -1% %
62.1190 #2 = \tmpa% % #2 = \tmpa = year-1
62.1191 \divide #2 by 19% % Number of complete Meton cycles
62.1192 \multiply #2 by 235% % #2 = 235*((year-1)/19)
62.1193 %

62.1194 \Remainder{\tmpa}{19}{\tmpb}% \tmpa = years%19-years this cycle


62.1195 \tmpc = \tmpb% %
62.1196 \multiply \tmpb by 12% %
62.1197 \advance #2 by \tmpb% % add regular months this cycle
62.1198 %

62.1199 \multiply \tmpc by 7% %


62.1200 \advance \tmpc by 1% %
62.1201 \divide \tmpc by 19% % \tmpc = (1+7*((year-1)%19))/19 -
62.1202 % % number of leap months this cycle
62.1203 \advance #2 by \tmpc% % add leap months
62.1204 %

62.1205 \global\@common = #2}%


62.1206 #2 = \@common}

\HebrewElapsedDays The macro \HebrewElapsedDays{year }{days } determines the number of days


elapsed from the Sunday prior to the start of the Hebrew calendar to the mean
conjunction of Tishri of Hebrew `year'.
62.1207 \def\HebrewElapsedDays#1#2{%
62.1208 {%
62.1209 \countdef\tmpa = 0% % \tmpa==\count0

418
62.1210 \countdef\tmpb = 1% % \tmpb==\count1
62.1211 \countdef\tmpc = 2% % \tmpc==\count2
62.1212 %
62.1213 \HebrewElapsedMonths{#1}{#2}%
62.1214 \tmpa = #2% %
62.1215 \multiply \tmpa by 13753% %
62.1216 \advance \tmpa by 5604% % \tmpa=MonthsElapsed*13758 + 5604
62.1217 \Remainder{\tmpa}{25920}{\tmpc}% \tmpc == ConjunctionParts
62.1218 \divide \tmpa by 25920%
62.1219 %
62.1220 \multiply #2 by 29%
62.1221 \advance #2 by 1%
62.1222 \advance #2 by \tmpa% % #2 = 1 + MonthsElapsed*29 +
62.1223 % % PartsElapsed/25920
62.1224 \Remainder{#2}{7}{\tmpa}% % \tmpa == DayOfWeek
62.1225 \ifnum \tmpc < 19440%
62.1226 \ifnum \tmpc < 9924%
62.1227 \else% % New moon at 9 h. 204 p. or later
62.1228 \ifnum \tmpa = 2% % on Tuesday ...
62.1229 \CheckLeapHebrewYear{#1}% of a common year
62.1230 \if@HebrewLeap%
62.1231 \else%
62.1232 \advance #2 by 1%
62.1233 \fi%
62.1234 \fi%
62.1235 \fi%
62.1236 \ifnum \tmpc < 16789%
62.1237 \else% % New moon at 15 h. 589 p. or later
62.1238 \ifnum \tmpa = 1% % on Monday ...
62.1239 \advance #1 by -1%
62.1240 \CheckLeapHebrewYear{#1}% at the end of leap year
62.1241 \if@HebrewLeap%
62.1242 \advance #2 by 1%
62.1243 \fi%
62.1244 \fi%
62.1245 \fi%
62.1246 \else%
62.1247 \advance #2 by 1% % new moon at or after midday
62.1248 \fi%
62.1249 %
62.1250 \Remainder{#2}{7}{\tmpa}% % \tmpa == DayOfWeek
62.1251 \ifnum \tmpa = 0% % if Sunday ...
62.1252 \advance #2 by 1%
62.1253 \else% %
62.1254 \ifnum \tmpa = 3% % Wednesday ...
62.1255 \advance #2 by 1%
62.1256 \else%
62.1257 \ifnum \tmpa = 5% % or Friday
62.1258 \advance #2 by 1%
62.1259 \fi%
62.1260 \fi%
62.1261 \fi%
62.1262 \global\@common = #2}%
62.1263 #2 = \@common}

419
\DaysInHebrewYear The macro \DaysInHebrewYear{year }{days } calculates the number of days in
Hebrew `year'.
62.1264 \def\DaysInHebrewYear#1#2{%
62.1265 {%
62.1266 \countdef\tmpe = 12% % \tmpe==\count12
62.1267 %

62.1268 \HebrewElapsedDays{#1}{\tmpe}%
62.1269 \advance #1 by 1%
62.1270 \HebrewElapsedDays{#1}{#2}%
62.1271 \advance #2 by -\tmpe%
62.1272 \global\@common = #2}%
62.1273 #2 = \@common}

\HebrewDaysInPriorMonths The macro \HebrewDaysInPriorMonths{month }{year }{days } calculates the nu-


mber of days in months prior to `month' in the `year'.
62.1274 \def\HebrewDaysInPriorMonths#1#2#3{%
62.1275 {%
62.1276 \countdef\tmpf= 14% % \tmpf==\count14
62.1277 %

62.1278 #3 = \ifcase #1% % Days in prior month of regular year


62.1279 0 \or% % no month number 0
62.1280 0 \or% % Tishri
62.1281 30 \or% % Heshvan
62.1282 59 \or% % Kislev
62.1283 89 \or% % Tebeth
62.1284 118 \or% % Shebat
62.1285 148 \or% % Adar I
62.1286 148 \or% % Adar II
62.1287 177 \or% % Nisan
62.1288 207 \or% % Iyar
62.1289 236 \or% % Sivan
62.1290 266 \or% % Tammuz
62.1291 295 \or% % Av
62.1292 325 \or% % Elul
62.1293 400% % Dummy
62.1294 \fi%
62.1295 \CheckLeapHebrewYear{#2}%
62.1296 \if@HebrewLeap% % in leap year
62.1297 \ifnum #1 > 6% % if month after Adar I
62.1298 \advance #3 by 30% % add 30 days
62.1299 \fi%
62.1300 \fi%
62.1301 \DaysInHebrewYear{#2}{\tmpf}%
62.1302 \ifnum #1 > 3%
62.1303 \ifnum \tmpf = 353% %
62.1304 \advance #3 by -1% %
62.1305 \fi% % Short Kislev
62.1306 \ifnum \tmpf = 383% %
62.1307 \advance #3 by -1% %
62.1308 \fi% %
62.1309 \fi%
62.1310 %

62.1311 \ifnum #1 > 2%


62.1312 \ifnum \tmpf = 355% %

420
62.1313 \advance #3 by 1% %
62.1314 \fi% % Long Heshvan
62.1315 \ifnum \tmpf = 385% %
62.1316 \advance #3 by 1% %
62.1317 \fi% %
62.1318 \fi%
62.1319 \global\@common = #3}%
62.1320 #3 = \@common}

\AbsoluteFromHebrew The macro \AbsoluteFromHebrew{day }{month }{year }{absdate } calculates the


absolute date of Hebrew date day.month.year.
62.1321 \def\AbsoluteFromHebrew#1#2#3#4{%
62.1322 {%
62.1323 #4 = #1%
62.1324 \HebrewDaysInPriorMonths{#2}{#3}{#1}%
62.1325 \advance #4 by #1% % Add days in prior months this year
62.1326 \HebrewElapsedDays{#3}{#1}%
62.1327 \advance #4 by #1% % Add days in prior years
62.1328 \advance #4 by -1373429% % Subtract days before Gregorian
62.1329 \global\@common = #4}% % 01.01.0001
62.1330 #4 = \@common}

\HebrewFromGregorian The macro \HebrewFromGregorian{Gday }{Gmonth }{Gyear }{Hday }{Hmonth }-


{Hyear } evaluates Hebrew date Hday, Hmonth, Hyear from Gregorian date Gday,
Gmonth, Gyear.
62.1331 \def\HebrewFromGregorian#1#2#3#4#5#6{%
62.1332 {%
62.1333 \countdef\tmpx= 17% % \tmpx==\count17
62.1334 \countdef\tmpy= 18% % \tmpy==\count18
62.1335 \countdef\tmpz= 19% % \tmpz==\count19
62.1336 %

62.1337 #6 = #3% %
62.1338 \global\advance #6 by 3761% approximation from above
62.1339 \AbsoluteFromGregorian{#1}{#2}{#3}{#4}%
62.1340 \tmpz = 1 \tmpy = 1%
62.1341 \AbsoluteFromHebrew{\tmpz}{\tmpy}{#6}{\tmpx}%
62.1342 \ifnum \tmpx > #4% %
62.1343 \global\advance #6 by -1% Hyear = Gyear + 3760
62.1344 \AbsoluteFromHebrew{\tmpz}{\tmpy}{#6}{\tmpx}%
62.1345 \fi% %
62.1346 \advance #4 by -\tmpx% % Days in this year
62.1347 \advance #4 by 1% %
62.1348 #5 = #4% %
62.1349 \divide #5 by 30% % Approximation for month from below
62.1350 \loop% % Search for month
62.1351 \HebrewDaysInPriorMonths{#5}{#6}{\tmpx}%
62.1352 \ifnum \tmpx < #4%
62.1353 \advance #5 by 1%
62.1354 \tmpy = \tmpx%
62.1355 \repeat%
62.1356 \global\advance #5 by -1%
62.1357 \global\advance #4 by -\tmpy}}
62.1358 h/calendari

421
63 Hebrew input encodings
Hebrew input encodings dened in le hebinp.dtx77 should be used with
inputenc LATEX 2ε package. This package allows the user to specify an input
encoding from this le (for example, ISO Hebrew/Latin 8859-8, IBM Hebrew
codepage 862 or MS Windows Hebrew codepage 1255) by saying:
\usepackage[encoding name ]{inputenc}

The encoding can also be selected in the document with:


\inputencoding{encoding name }

The only practical use of this command within a document is when using text
from several documents to build up a composite work such as a volume of journal
articles. Therefore this command will be used only in vertical mode.
The encodings provided by this package are:
• si960 7-bit Hebrew encoding for the range 32127. This encoding also
known as old-code and dened by Israeli Standard SI-960.
• 8859-8 ISO 8859-8 Hebrew/Latin encoding commonly used in UNIX sys-
tems. This encoding also known as new-code and includes hebrew letters
in positions starting from 224.
• cp862 IBM 862 code page commonly used by DOS on IBM-compatible per-
sonal computers. This encoding also known as pc-code and includes hebrew
letters in positions starting from 128.
• cp1255 MS Windows 1255 (hebrew) code page which is similar to 8859-8.
In addition to hebrew letters, this encoding contains also hebrew vowels and
dots (nikud).
Each encoding has an associated .def le, for example 8859-8.def which denes
the behaviour of each input character, using the commands:
\DeclareInputText{slot }{text }
\DeclareInputMath{slot }{math }
This denes the input character slot to be the text material or math material
respectively. For example, 8859-8.def denes slots "EA (letter hebalef) and "B5
(µ) by saying:
\DeclareInputText{224}{\hebalef}
\DeclareInputMath{181}{\mu}
Note that the commands should be robust, and should not be dependent on the
output encoding. The same slot should not have both a text and a math declara-
tion for it. (This restriction may be removed in future releases of inputenc).
The .def le may also dene commands using the declarations:
\providecommand or \ProvideTextCommandDefault. For example, 8859-8.def
denes:
\ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}}
\DeclareInputText{188}{\textonequarter}
77 The les described in this section have version number v1.1b and were last revised on
2004/02/20.

422
The use of the `provide' forms here will ensure that a better denition will not
be over-written; their use is recommended since, in general, the best dention
depends on the fonts available.
See the documentation in inputenc.dtx for details of how to declare input
denitions for various encodings.

63.1 Default denitions for characters


First, we insert a \makeatletter at the beginning of all .def les to use @ symbol
in the macros' names.
63.1 h−driveri\makeatletter
Some input characters map to internal functions which are not in either the
T1 or OT1 font encoding. For this reason default denitions are provided in the
encoding le: these will be used unless some other output encoding is used which
supports those glyphs. In some cases this default dention has to be simply an
error message.
Note that this works reasonably well only because the encoding les for both
OT1 and T1 are loaded in the standard LaTeX format.
63.2 h∗8859 − 8 | cp862 | cp1255i
63.3 \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}}
63.4 \ProvideTextCommandDefault{\textonehalf}{\ensuremath{\frac12}}

63.5 \ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}}

63.6 h/8859 − 8 | cp862 | cp1255i

63.7 h∗8859 − 8 | cp1255i

63.8 \ProvideTextCommandDefault{\textthreequarters}{\ensuremath{\frac34}}

63.9 h/8859 − 8 | cp1255i

63.10 h∗cp862 | cp1255i

63.11 \ProvideTextCommandDefault{\textflorin}{\textit{f}}

63.12 h/cp862 | cp1255i

63.13 h∗cp862i

63.14 \ProvideTextCommandDefault{\textpeseta}{Pt}

63.15 h/cp862i

The name \textblacksquare is derived from the AMS symbol name since
Adobe seem not to want this symbol. The default denition, as a rule, makes no
claim to being a good design.
63.16 h∗cp862i
63.17 \ProvideTextCommandDefault{\textblacksquare}
63.18 {\vrule \@width .3em \@height .4em \@depth -.1em\relax}
63.19 h/cp862i

Some commands can't be faked, so we have them generate an error message.


63.20 h∗8859 − 8 | cp862 | cp1255i
63.21 \ProvideTextCommandDefault{\textcent}
63.22 {\TextSymbolUnavailable\textcent}
63.23 \ProvideTextCommandDefault{\textyen}

63.24 {\TextSymbolUnavailable\textyen}
63.25 h/8859 − 8 | cp862 | cp1255i

63.26 h∗8859 − 8i

63.27 \ProvideTextCommandDefault{\textcurrency}

63.28 {\TextSymbolUnavailable\textcurrency}
63.29 h/8859 − 8i

423
63.30 h∗cp1255i
63.31 \ProvideTextCommandDefault{\newsheqel}
63.32 {\TextSymbolUnavailable\newsheqel}
63.33 h/cp1255i

63.34 h∗8859 − 8 | cp1255i

63.35 \ProvideTextCommandDefault{\textbrokenbar}

63.36 {\TextSymbolUnavailable\textbrokenbar}
63.37 h/8859 − 8 | cp1255i

63.38 h∗cp1255i

63.39 \ProvideTextCommandDefault{\textperthousand}

63.40 {\TextSymbolUnavailable\textperthousand}
63.41 h/cp1255i

Characters that are supposed to be used only in math will be dened by


\providecommand because LATEX 2ε assumes that the font encoding for math fonts
is static.
63.42 h∗8859 − 8 | cp1255i
63.43 \providecommand{\mathonesuperior}{{^1}}
63.44 \providecommand{\maththreesuperior}{{^3}}

63.45 h/8859 − 8 | cp1255i

63.46 h∗8859 − 8 | cp862 | cp1255i

63.47 \providecommand{\mathtwosuperior}{{^2}}

63.48 h/8859 − 8 | cp862 | cp1255i

63.49 h∗cp862i

63.50 \providecommand{\mathordmasculine}{{^o}}

63.51 \providecommand{\mathordfeminine}{{^a}}

63.52 h/cp862i

63.2 The SI-960 encoding


The SI-960 or old-code encoding only allows characters in the range 32127, so
we only need to provide an empty si960.def le.

63.3 The ISO 8859-8 encoding and the MS Windows cp1255


encoding
The 8859-8.def encoding le denes the characters in the ISO 8859-8 encoding.
The MS Windows Hebrew character set incorporates the Hebrew letter reper-
toire of ISO 8859-8, and uses the same code points (starting from 224). It has also
some important additions in the 128159 and 190224 ranges.
63.53 h∗cp1255i
63.54 \DeclareInputText{130}{\quotesinglbase}
63.55 \DeclareInputText{131}{\textflorin}

63.56 \DeclareInputText{132}{\quotedblbase}

63.57 \DeclareInputText{133}{\dots}

63.58 \DeclareInputText{134}{\dag}

63.59 \DeclareInputText{135}{\ddag}

63.60 \DeclareInputText{136}{\^{}}

63.61 \DeclareInputText{137}{\textperthousand}

63.62 \DeclareInputText{139}{\guilsinglleft}

63.63 \DeclareInputText{145}{\textquoteleft}

63.64 \DeclareInputText{146}{\textquoteright}

63.65 \DeclareInputText{147}{\textquotedblleft}

424
63.66 \DeclareInputText{148}{\textquotedblright}
63.67 \DeclareInputText{149}{\textbullet}
63.68 \DeclareInputText{150}{\textendash}

63.69 \DeclareInputText{151}{\textemdash}

63.70 \DeclareInputText{152}{\~{}}

63.71 \DeclareInputText{153}{\texttrademark}

63.72 \DeclareInputText{155}{\guilsinglright}

63.73 h/cp1255i

63.74 h∗8859 − 8 | cp1255i


63.75 \DeclareInputText{160}{\nobreakspace}
63.76 \DeclareInputText{162}{\textcent}

63.77 \DeclareInputText{163}{\pounds}

63.78 h+8859 − 8i\DeclareInputText{164}{\textcurrency}

63.79 h+cp1255i\DeclareInputText{164}{\newsheqel}

63.80 \DeclareInputText{165}{\textyen}

63.81 \DeclareInputText{166}{\textbrokenbar}

63.82 \DeclareInputText{167}{\S}

63.83 \DeclareInputText{168}{\"{}}

63.84 \DeclareInputText{169}{\textcopyright}

63.85 h+8859 − 8i\DeclareInputMath{170}{\times}

63.86 \DeclareInputText{171}{\guillemotleft}

63.87 \DeclareInputMath{172}{\lnot}

63.88 \DeclareInputText{173}{\-}

63.89 \DeclareInputText{174}{\textregistered}

63.90 \DeclareInputText{175}{\@tabacckludge={}}

63.91 \DeclareInputText{176}{\textdegree}

63.92 \DeclareInputMath{177}{\pm}

63.93 \DeclareInputMath{178}{\mathtwosuperior}

63.94 \DeclareInputMath{179}{\maththreesuperior}

63.95 \DeclareInputText{180}{\@tabacckludge'{}}

63.96 \DeclareInputMath{181}{\mu}

63.97 \DeclareInputText{182}{\P}

63.98 \DeclareInputText{183}{\textperiodcentered}

63.99 h+8859 − 8i\DeclareInputText{184}{\c\ }

63.100 \DeclareInputMath{185}{\mathonesuperior}

63.101 h+8859 − 8i\DeclareInputMath{186}{\div}

63.102 \DeclareInputText{187}{\guillemotright}

63.103 \DeclareInputText{188}{\textonequarter}

63.104 \DeclareInputText{189}{\textonehalf}

63.105 \DeclareInputText{190}{\textthreequarters}

63.106 h/8859 − 8 | cp1255i

Hebrew vowels and dots (nikud) are included only to MS Windows cp1255
page and start from the position 192.
63.107 h∗cp1255i
63.108 \DeclareInputText{192}{\hebsheva}
63.109 \DeclareInputText{193}{\hebhatafsegol}

63.110 \DeclareInputText{194}{\hebhatafpatah}

63.111 \DeclareInputText{195}{\hebhatafqamats}

63.112 \DeclareInputText{196}{\hebhiriq}

63.113 \DeclareInputText{197}{\hebtsere}

63.114 \DeclareInputText{198}{\hebsegol}

63.115 \DeclareInputText{199}{\hebpatah}

63.116 \DeclareInputText{200}{\hebqamats}

425
63.117 \DeclareInputText{201}{\hebholam}
63.118 \DeclareInputText{203}{\hebqubuts}
63.119 \DeclareInputText{204}{\hebdagesh}

63.120 \DeclareInputText{205}{\hebmeteg}

63.121 \DeclareInputText{206}{\hebmaqaf}

63.122 \DeclareInputText{207}{\hebrafe}

63.123 \DeclareInputText{208}{\hebpaseq}

63.124 \DeclareInputText{209}{\hebshindot}

63.125 \DeclareInputText{210}{\hebsindot}

63.126 \DeclareInputText{211}{\hebsofpasuq}

63.127 \DeclareInputText{212}{\hebdoublevav}

63.128 \DeclareInputText{213}{\hebvavyod}

63.129 \DeclareInputText{214}{\hebdoubleyod}

63.130 h/cp1255i

Hebrew letters start from the position 224 in both encodings.


63.131 h∗8859 − 8 | cp1255i
63.132 \DeclareInputText{224}{\hebalef}

63.133 \DeclareInputText{225}{\hebbet}

63.134 \DeclareInputText{226}{\hebgimel}

63.135 \DeclareInputText{227}{\hebdalet}

63.136 \DeclareInputText{228}{\hebhe}

63.137 \DeclareInputText{229}{\hebvav}

63.138 \DeclareInputText{230}{\hebzayin}

63.139 \DeclareInputText{231}{\hebhet}

63.140 \DeclareInputText{232}{\hebtet}

63.141 \DeclareInputText{233}{\hebyod}

63.142 \DeclareInputText{234}{\hebfinalkaf}

63.143 \DeclareInputText{235}{\hebkaf}

63.144 \DeclareInputText{236}{\heblamed}

63.145 \DeclareInputText{237}{\hebfinalmem}

63.146 \DeclareInputText{238}{\hebmem}

63.147 \DeclareInputText{239}{\hebfinalnun}

63.148 \DeclareInputText{240}{\hebnun}

63.149 \DeclareInputText{241}{\hebsamekh}

63.150 \DeclareInputText{242}{\hebayin}

63.151 \DeclareInputText{243}{\hebfinalpe}

63.152 \DeclareInputText{244}{\hebpe}

63.153 \DeclareInputText{245}{\hebfinaltsadi}

63.154 \DeclareInputText{246}{\hebtsadi}

63.155 \DeclareInputText{247}{\hebqof}

63.156 \DeclareInputText{248}{\hebresh}

63.157 \DeclareInputText{249}{\hebshin}

63.158 \DeclareInputText{250}{\hebtav}

63.159 h/8859 − 8 | cp1255i

Special symbols which dene the direction of symbols explicitly. Currently,


they are not used in LATEX.
63.160 h∗cp1255i
63.161 \DeclareInputText{253}{\lefttorightmark}
63.162 \DeclareInputText{254}{\righttoleftmark}

63.163 h/cp1255i

426
63.4 The IBM code page 862
The cp862.def encoding le denes the characters in the IBM codepage 862
encoding. The DOS graphics `letters' and a few other positions are ignored (left
undened).
Hebrew letters start from the position 128.
63.164 h∗cp862i
63.165 \DeclareInputText{128}{\hebalef}
63.166 \DeclareInputText{129}{\hebbet}

63.167 \DeclareInputText{130}{\hebgimel}

63.168 \DeclareInputText{131}{\hebdalet}

63.169 \DeclareInputText{132}{\hebhe}

63.170 \DeclareInputText{133}{\hebvav}

63.171 \DeclareInputText{134}{\hebzayin}

63.172 \DeclareInputText{135}{\hebhet}

63.173 \DeclareInputText{136}{\hebtet}

63.174 \DeclareInputText{137}{\hebyod}

63.175 \DeclareInputText{138}{\hebfinalkaf}

63.176 \DeclareInputText{139}{\hebkaf}

63.177 \DeclareInputText{140}{\heblamed}

63.178 \DeclareInputText{141}{\hebfinalmem}

63.179 \DeclareInputText{142}{\hebmem}

63.180 \DeclareInputText{143}{\hebfinalnun}

63.181 \DeclareInputText{144}{\hebnun}

63.182 \DeclareInputText{145}{\hebsamekh}

63.183 \DeclareInputText{146}{\hebayin}

63.184 \DeclareInputText{147}{\hebfinalpe}

63.185 \DeclareInputText{148}{\hebpe}

63.186 \DeclareInputText{149}{\hebfinaltsadi}

63.187 \DeclareInputText{150}{\hebtsadi}

63.188 \DeclareInputText{151}{\hebqof}

63.189 \DeclareInputText{152}{\hebresh}

63.190 \DeclareInputText{153}{\hebshin}

63.191 \DeclareInputText{154}{\hebtav}

63.192 \DeclareInputText{155}{\textcent}
63.193 \DeclareInputText{156}{\pounds}
63.194 \DeclareInputText{157}{\textyen}

63.195 \DeclareInputText{158}{\textpeseta}

63.196 \DeclareInputText{159}{\textflorin}

63.197 \DeclareInputText{160}{\@tabacckludge'a}

63.198 \DeclareInputText{161}{\@tabacckludge'\i}

63.199 \DeclareInputText{162}{\@tabacckludge'o}

63.200 \DeclareInputText{163}{\@tabacckludge'u}

63.201 \DeclareInputText{164}{\~n}

63.202 \DeclareInputText{165}{\~N}

63.203 \DeclareInputMath{166}{\mathordfeminine}

63.204 \DeclareInputMath{167}{\mathordmasculine}

63.205 \DeclareInputText{168}{\textquestiondown}

63.206 \DeclareInputMath{170}{\lnot}

63.207 \DeclareInputText{171}{\textonehalf}

63.208 \DeclareInputText{172}{\textonequarter}

63.209 \DeclareInputText{173}{\textexclamdown}

63.210 \DeclareInputText{174}{\guillemotleft}

63.211 \DeclareInputText{175}{\guillemotright}

427
63.212 \DeclareInputMath{224}{\alpha}
63.213 \DeclareInputText{225}{\ss}
63.214 \DeclareInputMath{226}{\Gamma}

63.215 \DeclareInputMath{227}{\pi}

63.216 \DeclareInputMath{228}{\Sigma}

63.217 \DeclareInputMath{229}{\sigma}

63.218 \DeclareInputMath{230}{\mu}

63.219 \DeclareInputMath{231}{\tau}

63.220 \DeclareInputMath{232}{\Phi}

63.221 \DeclareInputMath{233}{\Theta}

63.222 \DeclareInputMath{234}{\Omega}

63.223 \DeclareInputMath{235}{\delta}

63.224 \DeclareInputMath{236}{\infty}

63.225 \DeclareInputMath{237}{\phi}

63.226 \DeclareInputMath{238}{\varepsilon}

63.227 \DeclareInputMath{239}{\cap}

63.228 \DeclareInputMath{240}{\equiv}

63.229 \DeclareInputMath{241}{\pm}

63.230 \DeclareInputMath{242}{\ge}

63.231 \DeclareInputMath{243}{\le}

63.232 \DeclareInputMath{246}{\div}

63.233 \DeclareInputMath{247}{\approx}

63.234 \DeclareInputText{248}{\textdegree}

63.235 \DeclareInputText{249}{\textperiodcentered}

63.236 \DeclareInputText{250}{\textbullet}

63.237 \DeclareInputMath{251}{\surd}

63.238 \DeclareInputMath{252}{\mathnsuperior}

63.239 \DeclareInputMath{253}{\mathtwosuperior}

63.240 \DeclareInputText{254}{\textblacksquare}

63.241 \DeclareInputText{255}{\nobreakspace}

63.242 h/cp862i

\DisableNikud A utility macro to ignore any nikud character that may appear in the input. This
allows you to ignore cp1255 nikud characters that happened to appear in the input.
63.243 h∗8859 − 8i
63.244 \newcommand{\DisableNikud}{%
63.245 \DeclareInputText{192}{}%
63.246 \DeclareInputText{193}{}%
63.247 \DeclareInputText{194}{}%
63.248 \DeclareInputText{195}{}%
63.249 \DeclareInputText{196}{}%
63.250 \DeclareInputText{197}{}%
63.251 \DeclareInputText{198}{}%
63.252 \DeclareInputText{199}{}%
63.253 \DeclareInputText{200}{}%
63.254 \DeclareInputText{201}{}%
63.255 \DeclareInputText{203}{}%
63.256 \DeclareInputText{204}{}%
63.257 \DeclareInputText{205}{}%
63.258 \DeclareInputText{206}{}%
63.259 \DeclareInputText{207}{}%
63.260 \DeclareInputText{208}{}%
63.261 \DeclareInputText{209}{}%
63.262 \DeclareInputText{210}{}%

428
63.263 \DeclareInputText{211}{}%
63.264 \DeclareInputText{212}{}%
63.265 \DeclareInputText{213}{}%
63.266 \DeclareInputText{214}{}%
63.267 }
63.268 h/8859 − 8i
Finally, we reset the category code of the @ sign at the end of all .def les.
63.269 h−driveri\makeatother

64 Hebrew font encodings


Don't forget to update the docs...

64.1 THIS SECTION IS OUT OF DATE. UPDATE DOCS


TO MATCH HE8 ENCODING
The le hebrew.fdd78 contains the Local Hebrew Encoding (LHE) denition, the
external font information needed to use the Hebrew 7-bit fonts (old code fonts)
and hebfont package that provides Hebrew font switching commands.
Using this le as an input, lheenc.def encoding denition le, all .fd les
(font denition les) and font switching package for available Hebrew fonts are
generated. We chose to use 7-bit encoding as default font encoding, because:

1. There are many 7-bit encoded Hebrew fonts available, more then for any
other encoding.

2. Available TEX Hebrew fonts do not include latin alphabet, and we can safely
map Hebrew glyphs to the ASCII positions (0  127).

Current denition of the LHE encoding supports only Hebrew letters (\hebalef
\hebtav), but not Hebrew points, such as \hebdagesh, \hebqamats, \hebpatah,
\hebshindot, etc. We are working now on such addition.

64.2 The docstrip modules


The following modules are used in the implementation to direct docstrip in
generating external les:
78 The les described in this section have version number v1.2c and were last revised on
2005/05/20.

429
driver produce a documentation driver le
HE8enc produce the encoding denition for CodePage 1255 (HE8)
HE8cmr make Hebrew default font in HE8
HE8cmss make Hebrew sans-serif font in HE8
HE8cmtt make Hebrew typewriter font in HE8
HE8OmegaHebrew Hebrew font from the Omega project (by ???)
HE8aharoni Hebrew sans-serif font (Culmus)
HE8david Hebrew serif font (Culmus)
HE8drugulin Hebrew old serif font (Culmus)
HE8ellinia Hebrew isans-serif font (Culmus)
HE8frankruehl Hebrew serif font (Culmus)
HE8KtavYad Hebrew handwriting font (Culmus)
HE8MiriamMono Hebrew monospaced font
HE8Nachlieli Hebrew sans-serif font (Culmus)
HE8CourierShalom Hebrew Shalom (Courier) font (by IBM)
HE8HelveticaNarkissTam Hebrew NarkisTam (Helvetica) (by Zvi Narkis)
HE8TimesNarkissim Hebrew Narkissim (Times) (by Zvi Narkis)
HE8mfdavid Hebrew David font (by ???)
HE8mrank Hebrew Frank-Ruehl font (by ??)
HE8mrankthick Hebrew Frank-Ruehl (thick) font (by ??)
HE8mrankthin Hebrew Frank-Ruehl (thin) font (by ??)
HE8mfmiriam Hebrew Miriam font (by ???)
HE8mfmiriamwide Hebrew Miriam (wide) font (by ???)
HE8mfnarkistam Hebrew Narkis Tam font (by ???)
LHEenc produce the encoding denition for Local Hebrew Encoding (LHE)
LHEcmr make Hebrew default font in LHE
LHEcmss make Hebrew sans-serif font in LHE
LHEcmtt make Hebrew typewriter font in LHE
LHEclas make Hebrew classic font (by Joel M. Homan) in LHE
LHEshold make Hebrew shalom old font (by Jonathan Brecher) in LHE
LHEshscr make Hebrew shalom script font (by Jonathan Brecher) in LHE
LHEshstk make Hebrew shalom stick font (by Jonathan Brecher) in LHE
LHEfr make Hebrew frank-ruehl font in LHE
LHEcrml make Hebrew carmel font (by Dr. Samy Zafrany) in LHE
LHEredis make Hebrew redis font (by Prof. Jacques J. Goldberg) in LHE
nowarn option for font denition les, that used
to produce silent font substitutions without giving warnings
hebfont create Hebrew font switching commands package
A typical docstrip command le would then have entries like:
\generateFile{lhecmr.fd}{t}{\from{hebrew.fdd}{LHEcmr,nowarn}}

64.3 The LHEencoding denition le


The Hebrew font encoding LHE is based upon the old-code encoding also known as
the Israeli Standard SI-960. Many Hebrew TEX fonts from the Hebrew University
of Jerusalem are encoded in this encoding. It only uses the lower 128 positions of
the font table. As local encoding its name start with the letter `L'.

430
First we dene the Local Hebrew Encoding; specify a default for the font
substitution process for the LHE encoding and supply a font to be used when all
else fails.
64.1 h∗LHEenci
64.2 \DeclareFontEncoding{LHE}{}{}
64.3 \DeclareFontSubstitution{LHE}{cmr}{m}{n}

64.4 \DeclareErrorFont{LHE}{cmr}{m}{n}{10}

64.5 h/LHEenci

Then we dene a few commands in the LHE encoding.


64.6 h∗LHEenci
64.7 \ProvideTextCommand{\textcopyright}{LHE}{\textcircled{\@latin{c}}}
64.8 \ProvideTextCommand{\textregistered}{LHE}{\textcircled{\scshape%

64.9 \@latin{r}}}
64.10 \ProvideTextCommand{\texttrademark}{LHE}{\textsuperscript{\@latin{TM}}}

64.11 h/LHEenci

Because not everyone can input Hebrew input text directly from the keyboard
we need to dene control sequences for all the Hebrew glyphs in the fonts. In
addition, we want to support many input encodings for Hebrew and to keep the
language denition le (hebrew.ldf) independent of the encoding. Therefore, we
exploit the standard LATEX 2ε font encoding mechanism to dene control sequences
for all the Hebrew glyphs in the fonts in encoding-specic way. The language
denition le uses only the control sequences and doesn't need to check the current
font or input encoding.
In the LHE encoding (7-bit encoding) all the Hebrew glyphes reside in the lower
half of the font. Currently, only the Hebrew letters are supported. They use the
same positions as the latin small letters in ASCII encoding and the position of `.
The symbol ` (glyph 96) is used by Hebrew letter Alef, so we need to dene its
lccode to allow hyphenation. All other letters retain the same lccodes as their
latin counterparts.
64.12 h+LHEenci\lccode``=``
Hebrew letters occupy the positions 96122 in LHE encoding:
64.13 h∗LHEenci
64.14 \DeclareTextSymbol{\hebalef}{LHE}{96}
64.15 \DeclareTextSymbol{\hebbet}{LHE}{97}

64.16 \DeclareTextSymbol{\hebgimel}{LHE}{98}

64.17 \DeclareTextSymbol{\hebdalet}{LHE}{99}

64.18 \DeclareTextSymbol{\hebhe}{LHE}{100}

64.19 \DeclareTextSymbol{\hebvav}{LHE}{101}

64.20 \DeclareTextSymbol{\hebzayin}{LHE}{102}

64.21 \DeclareTextSymbol{\hebhet}{LHE}{103}

64.22 \DeclareTextSymbol{\hebtet}{LHE}{104}

64.23 \DeclareTextSymbol{\hebyod}{LHE}{105}

64.24 \DeclareTextSymbol{\hebfinalkaf}{LHE}{106}

64.25 \DeclareTextSymbol{\hebkaf}{LHE}{107}

64.26 \DeclareTextSymbol{\heblamed}{LHE}{108}

64.27 \DeclareTextSymbol{\hebfinalmem}{LHE}{109}

64.28 \DeclareTextSymbol{\hebmem}{LHE}{110}

64.29 \DeclareTextSymbol{\hebfinalnun}{LHE}{111}

64.30 \DeclareTextSymbol{\hebnun}{LHE}{112}

64.31 \DeclareTextSymbol{\hebsamekh}{LHE}{113}

431
64.32 \DeclareTextSymbol{\hebayin}{LHE}{114}
64.33 \DeclareTextSymbol{\hebfinalpe}{LHE}{115}
64.34 \DeclareTextSymbol{\hebpe}{LHE}{116}

64.35 \DeclareTextSymbol{\hebfinaltsadi}{LHE}{117}

64.36 \DeclareTextSymbol{\hebtsadi}{LHE}{118}

64.37 \DeclareTextSymbol{\hebqof}{LHE}{119}

64.38 \DeclareTextSymbol{\hebresh}{LHE}{120}

64.39 \DeclareTextSymbol{\hebshin}{LHE}{121}

64.40 \DeclareTextSymbol{\hebtav}{LHE}{122}

64.41 h/LHEenci

Letter \hebsin is dened as a synonym of \hebshin:


64.42 h+LHEenci\let\hebsin=\hebshin

64.4 The font denition les (in LHE encoding)


64.4.1 Hebrew default font
It uses Jerusalem font for regular font, Old Jaa font for italic shape and small-
caps, Dead Sea font for bold face, and Tel-Aviv for bold-italic
64.43 h∗LHEcmri
64.44 \DeclareFontFamily{LHE}{cmr}{\hyphenchar\font45}
64.45 \DeclareFontShape{LHE}{cmr}{m}{n}

64.46 {<-> jerus10 }{}


64.47 %%%%%%% Italicized shape

64.48 \DeclareFontShape{LHE}{cmr}{m}{it}

64.49 {<-> oldjaf10 }{}


64.50 \DeclareFontShape{LHE}{cmr}{m}{sl}

64.51 {<-> oldjaf10 }{}


64.52 \DeclareFontShape{LHE}{cmr}{m}{sc}

64.53 {<-> oldjaf10 }{}


64.54 %%%%%%% Bold extended series

64.55 \DeclareFontShape{LHE}{cmr}{bx}{n}

64.56 {<-> deads10 }{}


64.57 \DeclareFontShape{LHE}{cmr}{b}{n}

64.58 {<-> deads10 }{}


64.59 %%%%%%% Bold extended (Italic) series
64.60 \DeclareFontShape{LHE}{cmr}{bx}{sl}

64.61 {<-> telav10 }{}


64.62 \DeclareFontShape{LHE}{cmr}{bx}{it}

64.63 {<-> telav10 }{}


64.64 h/LHEcmri

64.4.2 Hebrew sans-serif font


We use Tel Aviv font for the Sans family. Old Jaa font is used for italic shape
and Dead Sea used for bold face.
64.65 h∗LHEcmssi
64.66 \DeclareFontFamily{LHE}{cmss}{\hyphenchar\font45}
64.67 \DeclareFontShape{LHE}{cmss}{m}{n}

64.68 {<-> telav10 }{}


64.69 %%%%%%% Font/shape undefined, therefore substituted

64.70 \DeclareFontShape{LHE}{cmss}{m}{sc}

64.71 h−nowarni {<->sub * cmss/m/n}{}

432
64.72 h+nowarni {<->ssub * cmss/m/n}{}
64.73 %%%%%%% Italicized shape
64.74 \DeclareFontShape{LHE}{cmss}{m}{it}

64.75 {<-> oldjaf10 }{}


64.76 %%%%%%% Font/shape undefined, therefore substituted
64.77 \DeclareFontShape{LHE}{cmss}{m}{sl}

64.78 h−nowarni {<->sub * cmss/m/it}{}


64.79 h+nowarni {<->ssub * cmss/m/it}{}
64.80 %%%%%%% Bold extended series

64.81 \DeclareFontShape{LHE}{cmss}{bx}{n}

64.82 {<-> deads10 }{}


64.83 %%%%%%% Font/shape undefined, therefore substituted
64.84 \DeclareFontShape{LHE}{cmss}{b}{n}

64.85 h−nowarni {<->sub * cmss/bx/n}{}


64.86 h+nowarni {<->ssub * cmss/bx/n}{}
64.87 %%%%%%% Font/shape undefined, therefore substituted
64.88 \DeclareFontShape{LHE}{cmss}{bx}{sl}

64.89 h−nowarni {<->sub * cmss/bx/n}{}


64.90 h+nowarni {<->ssub * cmss/bx/n}{}
64.91 %%%%%%% Font/shape undefined, therefore substituted
64.92 \DeclareFontShape{LHE}{cmss}{bx}{it}

64.93 h−nowarni {<->sub * cmss/bx/n}{}


64.94 h+nowarni {<->ssub * cmss/bx/n}{}
64.95 h/LHEcmssi

64.4.3 Hebrew typewriter font


We use Tel Aviv font as the typewriter font. Old Jaa font is used for italic shape
and Dead Sea used for bold face.
64.96 h∗LHEcmtti
64.97 \DeclareFontFamily{LHE}{cmtt}{\hyphenchar \font\m@ne}
64.98 \DeclareFontShape{LHE}{cmtt}{m}{n}

64.99 {<-> telav10 }{}


64.100 %%%%%%% Font/shape undefined, therefore substituted

64.101 \DeclareFontShape{LHE}{cmtt}{m}{sc}

64.102 h−nowarni {<->sub * cmtt/m/n}{}


64.103 h+nowarni {<->ssub * cmtt/m/n}{}
64.104 %%%%%%% Italicized shape

64.105 \DeclareFontShape{LHE}{cmtt}{m}{it}

64.106 {<-> oldjaf10 }{}


64.107 %%%%%%% Font/shape undefined, therefore substituted

64.108 \DeclareFontShape{LHE}{cmtt}{m}{sl}

64.109 h−nowarni {<->sub * cmtt/m/it}{}


64.110 h+nowarni {<->ssub * cmtt/m/it}{}
64.111 %%%%%%% Bold extended series

64.112 \DeclareFontShape{LHE}{cmtt}{bx}{n}

64.113 {<-> deads10 }{}


64.114 %%%%%%% Font/shape undefined, therefore substituted

64.115 \DeclareFontShape{LHE}{cmtt}{bx}{it}

64.116 h−nowarni {<->sub * cmtt/bx/n}{}


64.117 h+nowarni {<->ssub * cmtt/bx/n}{}
64.118 h/LHEcmtti

433
64.4.4 Hebrew classic font
Hclassic and hcaption fonts are distributed freely from CTAN sites and copy-
righted by Joel M. Homan, of 19 Hillcrest Lane, Rye, NY 10580 USA, e-mail:
72700.402@compuserve.com.
Hclassic is a modernized Classical Hebrew font (in the same way that Knuth's
cmr family is a modernized Roman font  but his fonts are much nicer). Hcaption
is a slanted version of hclassic font. Both fonts contain all of the Hebrew conso-
nants, the (rarely used) ligature alef-lamed and two versions of the letter ayin for
use with and without vowels. Hclassic also contains all of the vowels found in
Hebrew, a symbol for meteg, and dots for use as a dagesh and for dierentiating
shin and sin letters.
Currently, only the Hebrew consonants (hebalef  hebtav ) from these fonts
are supported by LATEX 2ε , however one can use vowels and dots directly with
Plain TEX macros. We are working on generic vowels and dots support for
LATEX 2ε .
64.119 h∗LHEclasi
64.120 \DeclareFontFamily{LHE}{clas}{}
64.121 \DeclareFontShape{LHE}{clas}{m}{n}

64.122 {<-> s * [0.83345] hclassic }{}


64.123 %%%%%%% Font/shape undefined, therefore substituted

64.124 \DeclareFontShape{LHE}{clas}{m}{sc}

64.125 h−nowarni {<->sub * clas/m/n}{}


64.126 h+nowarni {<->ssub * clas/m/n}{}
64.127 %%%%%%% Slanted shape

64.128 \DeclareFontShape{LHE}{clas}{m}{sl}

64.129 {<-> s * [0.69389] hcaption }{}


64.130 %%%%%%% Font/shape undefined, therefore substituted

64.131 \DeclareFontShape{LHE}{clas}{m}{it}

64.132 h−nowarni {<->sub * clas/m/sl}{}


64.133 h+nowarni {<->ssub * clas/m/sl}{}
64.134 h/LHEclasi

64.4.5 Hebrew shalom fonts


All three shalom fonts (ShalomScript10, ShalomStick10 and ShalomOldStyle10 )
have been created by Jonathan Brecher, of 9 Skyview Road, Lexington, MA 02173-
1112 USA, e-mail: brecher@husc.harvard.edu.
All shalom fonts have been written in PostScript via Fontographer on a
Mac. The fonts have been converted to METAFONT by Rama Porrat (e-mail:
rama@cc.huji.ac.il), using the utility typo, a font editor + converter between
font formats (a commercial product). ShalomScript10.mf is the METAFONT
equivalent of ShalomScript.ps, ShalomStick10.mf came from ShalomStick.ps
and ShalomOldStyle10.mf originated in ShalomOldStyle.ps.
The fonts dier in the letters' style. ShalomScript10 contains hand writing
Hebrew letters; ShalomStick10 contains sans-serif letters, and ShalomOldStyle10
contains old style letters. All three fonts contain vowels and dots (nikud). While
converting to METAFONT, letters and symbols within the fonts have been arranged
so as to get a usable font for writing Hebrew documents in TEX or LATEX, with as
well as without vowels.
Currently, only the Hebrew consonants (hebalef  hebtav ) from these fonts

434
are supported by LATEX 2ε , however one can use vowels and dots directly with
Plain TEX macros. We are working on generic vowels and dots support for
LATEX 2ε .
64.135 h∗LHEsholdi
64.136 \DeclareFontFamily{LHE}{shold}{}
64.137 \DeclareFontShape{LHE}{shold}{m}{n}

64.138 {<-> shold10 }{}


64.139 h/LHEsholdi

64.140 h∗LHEshscri

64.141 \DeclareFontFamily{LHE}{shscr}{}

64.142 \DeclareFontShape{LHE}{shscr}{m}{n}

64.143 {<-> shscr10 }{}


64.144 h/LHEshscri

64.145 h∗LHEshstki

64.146 \DeclareFontFamily{LHE}{shstk}{}

64.147 \DeclareFontShape{LHE}{shstk}{m}{n}

64.148 {<-> shstk10 }{}


64.149 h/LHEshstki

64.4.6 Hebrew frank-ruehl font


Frank Ruehl font was written in METAFONT and includes three shapes: regular,
bold extaneded and slanted.
64.150 h∗LHEfri
64.151 \DeclareFontFamily{LHE}{fr}{}
64.152 \DeclareFontShape{LHE}{fr}{m}{n}

64.153 {<-> fr }{}


64.154 %%%%%%% Font/shape undefined, therefore substituted
64.155 \DeclareFontShape{LHE}{fr}{m}{sc}

64.156 h−nowarni {<->sub * fr/m/n}{}


64.157 h+nowarni {<->ssub * fr/m/n}{}
64.158 %%%%%%% Slanted shape

64.159 \DeclareFontShape{LHE}{fr}{m}{sl}

64.160 {<-> frsl }{}


64.161 %%%%%%% Font/shape undefined, therefore substituted
64.162 \DeclareFontShape{LHE}{fr}{m}{it}

64.163 h−nowarni {<->sub * fr/m/sl}{}


64.164 h+nowarni {<->ssub * fr/m/sl}{}
64.165 %%%%%%% Bold extended series

64.166 \DeclareFontShape{LHE}{fr}{bx}{n}

64.167 {<-> frbx }{}


64.168 %%%%%%% Font/shape undefined, therefore substituted
64.169 \DeclareFontShape{LHE}{fr}{b}{n}

64.170 h−nowarni {<->sub * fr/bx/n}{}


64.171 h+nowarni {<->ssub * fr/bx/n}{}
64.172 %%%%%%% Font/shape undefined, therefore substituted
64.173 \DeclareFontShape{LHE}{fr}{bx}{sl}

64.174 h−nowarni {<->sub * fr/bx/n}{}


64.175 h+nowarni {<->ssub * fr/bx/n}{}
64.176 %%%%%%% Font/shape undefined, therefore substituted
64.177 \DeclareFontShape{LHE}{fr}{bx}{it}

64.178 h−nowarni {<->sub * fr/bx/n}{}


64.179 h+nowarni {<->ssub * fr/bx/n}{}

435
64.180 h/LHEfri

64.4.7 Hebrew carmel font


Carmel font includes regular and slanted shapes. It was created by Dr. Samy
Zafrany of the Technion, Haifa, Israel with the intention of making nice fonts for
headers and emphasized text.
64.181 h∗LHEcrmli
64.182 \DeclareFontFamily{LHE}{crml}{}
64.183 \DeclareFontShape{LHE}{crml}{m}{n}

64.184 {<-> crml10 }{}


64.185 %%%%%%% Font/shape undefined, therefore substituted

64.186 \DeclareFontShape{LHE}{crml}{m}{sc}

64.187 h−nowarni {<->sub * crml/m/n}{}


64.188 h+nowarni {<->ssub * crml/m/n}{}
64.189 %%%%%%% Slanted shape

64.190 \DeclareFontShape{LHE}{crml}{m}{sl}

64.191 {<-> crmlsl10 }{}


64.192 %%%%%%% Font/shape undefined, therefore substituted

64.193 \DeclareFontShape{LHE}{crml}{m}{it}

64.194 h−nowarni {<->sub * crml/m/sl}{}


64.195 h+nowarni {<->ssub * crml/m/sl}{}
64.196 h/LHEcrmli

64.4.8 Hebrew redis font


Redis font has been created by Prof. Jacques J. Goldberg of the Technion. Haifa,
Israel. The font is available in regular, slanted and bold extanded shapes. This
font contains a full set of Hebrew letters in a sans-serif vectorized style, and
selected punctuation.
64.197 h∗LHEredisi
64.198 \DeclareFontFamily{LHE}{redis}{}
64.199 \DeclareFontShape{LHE}{redis}{m}{n}{%

64.200 <5> <6> redis7


64.201 <7> <8> <9> <10> <12> gen * redis
64.202 <10.95> redis10
64.203 <14.4> redis12
64.204 <17.28> <20.74> <24.88> redis17}{}
64.205 %%%%%%% Font/shape undefined, therefore substituted

64.206 \DeclareFontShape{LHE}{redis}{m}{sc}

64.207 h−nowarni {<->sub * redis/m/n}{}


64.208 h+nowarni {<->ssub * redis/m/n}{}
64.209 %%%%%%% Slanted shape

64.210 \DeclareFontShape{LHE}{redis}{m}{sl}{%

64.211 <5> <6> <7> rediss8


64.212 <8> <9> <10> <12> gen * rediss
64.213 <10.95> rediss10
64.214 <14.4> <17.28> <20.74> <24.88> rediss12}{}
64.215 %%%%%%% Font/shape undefined, therefore substituted

64.216 \DeclareFontShape{LHE}{redis}{m}{it}

64.217 h−nowarni {<->sub * redis/m/sl}{}


64.218 h+nowarni {<->ssub * redis/m/sl}{}
64.219 %%%%%%% Bold extended series

436
64.220 \DeclareFontShape{LHE}{redis}{bx}{n}{%
64.221 <5> <6> <7> <8> <9> <10> <10.95> <12>
64.222 <14.4> <17.28> <20.74> <24.88> redisb10}{}
64.223 %%%%%%% Font/shape undefined, therefore substituted

64.224 \DeclareFontShape{LHE}{redis}{b}{n}

64.225 h−nowarni {<->sub * redis/bx/n}{}


64.226 h+nowarni {<->ssub * redis/bx/n}{}
64.227 %%%%%%% Font/shape undefined, therefore substituted

64.228 \DeclareFontShape{LHE}{redis}{bx}{sl}

64.229 h−nowarni {<->sub * redis/bx/n}{}


64.230 h+nowarni {<->ssub * redis/bx/n}{}
64.231 %%%%%%% Font/shape undefined, therefore substituted

64.232 \DeclareFontShape{LHE}{redis}{bx}{it}

64.233 h−nowarni {<->sub * redis/bx/n}{}


64.234 h+nowarni {<->ssub * redis/bx/n}{}
64.235 h/LHEredisi

64.5 The HE8encoding denition le


The Hebrew font encoding HE8 is based upon an extention by Microsoft to the
ISO-8859-8 standard. This is an 8bit encoding. The extentions include hebrew
points (Nikud).
First we dene the Codepage 1255; specify a default for the font substitution
process for the HE8 encoding and supply a font to be used when all else fails.
64.236 h∗HE8enci
64.237 \DeclareFontEncoding{HE8}{}{}
64.238 \DeclareFontSubstitution{HE8}{cmr}{m}{n}

64.239 \DeclareErrorFont{HE8}{cmr}{m}{n}{10}

64.240 h/HE8enci

Then we dene a few commands in the HE8 encoding.


64.241 h∗HE8enci
64.242 \ProvideTextCommand{\textcopyright}{HE8}{\textcircled{\@latin{c}}}
64.243 \ProvideTextCommand{\textregistered}{HE8}{\textcircled{\scshape%

64.244 \@latin{r}}}
64.245 \ProvideTextCommand{\texttrademark}{HE8}{\textsuperscript{\@latin{TM}}}

64.246 h/HE8enci

64.5.1 CHECK HERE FOR HE8 UPDATES


Because not everyone can input Hebrew input text directly from the keyboard we
need to dene control sequences for all the Hebrew glyphs in the fonts. In addition,
we want to support many input encodings for Hebrew and to keep the language
denition le (hebrew.ldf) independent of the encoding. Therefore, we exploit
the standard LATEX 2ε font encoding mechanism to dene control sequences for all
the Hebrew glyphs in the fonts in encoding-specic way. The language denition
le uses only the control sequences and doesn't need to check the current font or
input encoding.
In the LHE encoding (7-bit encoding) all the Hebrew glyphes reside in the lower
half of the font. Currently, only the Hebrew letters are supported. They use the
same positions as the latin small letters in ASCII encoding and the position of `.
Some general symbols:

437
64.247 h∗HE8enci
64.248 \ProvideTextCommand{\textcopyright}{HE8}{\textcircled{\@latin{c}}}
64.249 \ProvideTextCommand{\textregistered}{HE8}{\textcircled{\scshape%

64.250 \@latin{r}}}
64.251 \ProvideTextCommand{\texttrademark}{HE8}{\textsuperscript{\@latin{TM}}}

64.252 h/HE8enci

The hebrew points:


64.253 h∗HE8enci
64.254 \DeclareTextSymbol{\sheva}{HE8}{192}

64.255 \DeclareTextSymbol{\hatafsegol}{HE8}{193}

64.256 \DeclareTextSymbol{\hatafpatah}{HE8}{194}

64.257 \DeclareTextSymbol{\hatafqamats}{HE8}{195}

64.258 \DeclareTextSymbol{\hiriq}{HE8}{196}

64.259 \DeclareTextSymbol{\tsere}{HE8}{197}

64.260 \DeclareTextSymbol{\segol}{HE8}{198}

64.261 \DeclareTextSymbol{\patah}{HE8}{199}

64.262 \DeclareTextSymbol{\qamats}{HE8}{200}

64.263 \DeclareTextSymbol{\holam}{HE8}{201}

64.264 \DeclareTextSymbol{\qubuts}{HE8}{203}

64.265 \DeclareTextSymbol{\dagesh}{HE8}{204}

64.266 \DeclareTextSymbol{\meteg}{HE8}{205}

64.267 \DeclareTextSymbol{\maqaf}{HE8}{206}

64.268 \DeclareTextSymbol{\rafe}{HE8}{207}

64.269 \DeclareTextSymbol{\paseq}{HE8}{208}

64.270 \DeclareTextSymbol{\shindot}{HE8}{209}

64.271 \DeclareTextSymbol{\sindot}{HE8}{210}

64.272 \DeclareTextSymbol{\sofpasuq}{HE8}{211}

64.273 \DeclareTextSymbol{\doublevav}{HE8}{212}

64.274 \DeclareTextSymbol{\vavyod}{HE8}{213}

64.275 \DeclareTextSymbol{\doubleyod}{HE8}{214}

64.276 h/HE8enci

Hebrew letters occupy the positions 224250 in HE8 encoding [WHAT ABOUT
OTHER MARKS]:
64.277 h∗HE8enci
64.278 % \lccode``=`` % probably not needed (Tzafrir)
64.279 \DeclareTextSymbol{\hebalef}{HE8}{224}

64.280 \DeclareTextSymbol{\hebbet}{HE8}{225}

64.281 \DeclareTextSymbol{\hebgimel}{HE8}{226}

64.282 \DeclareTextSymbol{\hebdalet}{HE8}{227}

64.283 \DeclareTextSymbol{\hebhe}{HE8}{228}

64.284 \DeclareTextSymbol{\hebvav}{HE8}{229}

64.285 \DeclareTextSymbol{\hebzayin}{HE8}{230}

64.286 \DeclareTextSymbol{\hebhet}{HE8}{231}

64.287 \DeclareTextSymbol{\hebtet}{HE8}{232}

64.288 \DeclareTextSymbol{\hebyod}{HE8}{233}

64.289 \DeclareTextSymbol{\hebfinalkaf}{HE8}{234}

64.290 \DeclareTextSymbol{\hebkaf}{HE8}{235}

64.291 \DeclareTextSymbol{\heblamed}{HE8}{236}

64.292 \DeclareTextSymbol{\hebfinalmem}{HE8}{237}

64.293 \DeclareTextSymbol{\hebmem}{HE8}{238}

64.294 \DeclareTextSymbol{\hebfinalnun}{HE8}{239}

64.295 \DeclareTextSymbol{\hebnun}{HE8}{240}

64.296 \DeclareTextSymbol{\hebsamekh}{HE8}{241}

438
64.297 \DeclareTextSymbol{\hebayin}{HE8}{242}
64.298 \DeclareTextSymbol{\hebfinalpe}{HE8}{243}
64.299 \DeclareTextSymbol{\hebpe}{HE8}{244}

64.300 \DeclareTextSymbol{\hebfinaltsadi}{HE8}{245}

64.301 \DeclareTextSymbol{\hebtsadi}{HE8}{246}

64.302 \DeclareTextSymbol{\hebqof}{HE8}{247}

64.303 \DeclareTextSymbol{\hebresh}{HE8}{248}

64.304 \DeclareTextSymbol{\hebshin}{HE8}{249}

64.305 \DeclareTextSymbol{\hebtav}{HE8}{250}

64.306 h/HE8enci

Letter \hebsin is dened as a synonym of \hebshin:


64.307 h+HE8enci\let\hebsin=\hebshin

64.6 The font denition les (in HE8 encoding)


64.6.1 Hebrew default font
It uses OmegaHebrew font for regular font, Old Jaa font for italic shape and
small-caps, Dead Sea font for bold face, and Tel-Aviv for bold-italic
64.308 h∗HE8cmri
64.309 \DeclareFontFamily{HE8}{cmr}{\hyphenchar\font45}
64.310 \DeclareFontShape{HE8}{cmr}{m}{n}

64.311 {<-> david }{}


64.312 %%%%%%% Italicized shape

64.313 \DeclareFontShape{HE8}{cmr}{m}{it}

64.314 {<-> davidi }{}


64.315 \DeclareFontShape{HE8}{cmr}{m}{sl}

64.316 {<-> davidi }{}


64.317 \DeclareFontShape{HE8}{cmr}{m}{sc}

64.318 {<-> david }{}


64.319 %%%%%%% Bold extended series

64.320 \DeclareFontShape{HE8}{cmr}{bx}{n}

64.321 {<-> davidb }{}


64.322 \DeclareFontShape{HE8}{cmr}{b}{n}

64.323 {<-> davidb }{}


64.324 %%%%%%% Bold extended (Italic) series
64.325 \DeclareFontShape{HE8}{cmr}{bx}{sl}

64.326 {<-> davidbi }{}


64.327 \DeclareFontShape{HE8}{cmr}{bx}{it}

64.328 {<-> davidbi }{}


64.329 h/HE8cmri

64.6.2 Hebrew sans-serif font


Until we have a real sans-serif font in this distribution, this le will remain a copy
of the roman fonts denitons above.
64.330 h∗HE8cmssi
64.331 \DeclareFontFamily{HE8}{cmss}{\hyphenchar\font45}
64.332 \DeclareFontShape{HE8}{cmss}{m}{n}

64.333 {<-> nachlieli }{}


64.334 %%%%%%% Italicized shape

64.335 \DeclareFontShape{HE8}{cmss}{m}{it}

64.336 {<-> nachlieli }{}

439
64.337 \DeclareFontShape{HE8}{cmss}{m}{sl}
64.338 {<-> nachlieli }{}
64.339 \DeclareFontShape{HE8}{cmss}{m}{sc}

64.340 {<-> nachlieli }{}


64.341 %%%%%%% Bold extended series

64.342 \DeclareFontShape{HE8}{cmss}{bx}{n}

64.343 {<-> nachlieli }{}


64.344 \DeclareFontShape{HE8}{cmss}{b}{n}

64.345 {<-> nachlieli }{}


64.346 %%%%%%% Bold extended (Italic) series
64.347 \DeclareFontShape{HE8}{cmss}{bx}{sl}

64.348 {<-> nachlieli }{}


64.349 \DeclareFontShape{HE8}{cmss}{bx}{it}

64.350 {<-> nachlieli }{}


64.351 h/HE8cmssi

64.6.3 Hebrew typewriter font


Until we have a real sans-serif font in this distribution, this le will remain a copy
of the roman fonts denitons above.
64.352 h∗HE8cmtti
64.353 \DeclareFontFamily{HE8}{cmtt}{\hyphenchar\font45}
64.354 \DeclareFontShape{HE8}{cmtt}{m}{n}

64.355 {<-> miriam }{}


64.356 %%%%%%% Italicized shape

64.357 \DeclareFontShape{HE8}{cmtt}{m}{it}

64.358 {<-> miriam }{}


64.359 \DeclareFontShape{HE8}{cmtt}{m}{sl}

64.360 {<-> miriam }{}


64.361 \DeclareFontShape{HE8}{cmtt}{m}{sc}

64.362 {<-> miriam }{}


64.363 %%%%%%% Bold extended series

64.364 \DeclareFontShape{HE8}{cmtt}{bx}{n}

64.365 {<-> miriam }{}


64.366 \DeclareFontShape{HE8}{cmtt}{b}{n}

64.367 {<-> miriam }{}


64.368 %%%%%%% Bold extended (Italic) series
64.369 \DeclareFontShape{HE8}{cmtt}{bx}{sl}

64.370 {<-> miriam }{}


64.371 \DeclareFontShape{HE8}{cmtt}{bx}{it}

64.372 {<-> miriam }{}


64.373 h/HE8cmtti

64.6.4 8Bit OmegaHebrew font


OmegaHebrew is a serif hebrew font created by the omega project [FILL IN CRED-
ITS] [FILL IN GENERAL SHAPE DESCRIPTION] shapes: [FILL IN]
64.374 h∗HE8OmegaHebrewi
64.375 \def\OmegaHebrewscale{0.9}
64.376 \DeclareFontFamily{HE8}{OmegaHebrew}{\hyphenchar\font45}

64.377 \DeclareFontShape{HE8}{OmegaHebrew}{m}{n}{<-> [\OmegaHebrewscale] OmegaHebrew }{}

64.378 %\endinput % is it needed [tzafrir]

64.379 h/HE8OmegaHebrewi

440
64.6.5 8Bit Aharoni font
Aharoni is a serif hebrew font created by the omega project [FILL IN CREDITS]
[FILL IN GENERAL SHAPE DESCRIPTION] shapes: [FILL IN]
64.380 h∗HE8aharonii
64.381 \def\Aharoniscale{1.0}
64.382 \DeclareFontFamily{HE8}{aharoni}{\hyphenchar\font45}

64.383 \DeclareFontShape{HE8}{aharoni}{m}{n} {<-> [\Aharoniscale] aharoni}{}


64.384 \DeclareFontShape{HE8}{aharoni}{m}{it} {<-> [\Aharoniscale] aharonii}{}
64.385 \DeclareFontShape{HE8}{aharoni}{m}{sl} {<-> [\Aharoniscale] aharonii}{}
64.386 \DeclareFontShape{HE8}{aharoni}{b}{n} {<-> [\Aharoniscale] aharonib}{}
64.387 \DeclareFontShape{HE8}{aharoni}{bx}{n} {<-> [\Aharoniscale] aharonib}{}
64.388 \DeclareFontShape{HE8}{aharoni}{bx}{it} {<-> [\Aharoniscale] aharonibi}{}
64.389

64.390 %\endinput % is it needed [tzafrir]


64.391 h/HE8aharonii

64.6.6 8Bit David font


David is a serif hebrew font created by the omega project [FILL IN CREDITS]
[FILL IN GENERAL SHAPE DESCRIPTION] shapes: [FILL IN]
64.392 h∗HE8davidi
64.393 \def\Davidscale{1.0}
64.394 \DeclareFontFamily{HE8}{david}{\hyphenchar\font45}

64.395

64.396 \DeclareFontShape{HE8}{david}{m}{n} {<-> [\Davidscale] david}{}


64.397 \DeclareFontShape{HE8}{david}{m}{it} {<-> [\Davidscale] davidi}{}
64.398 \DeclareFontShape{HE8}{david}{m}{sl} {<-> [\Davidscale] davidi}{}
64.399 \DeclareFontShape{HE8}{david}{b}{n} {<-> [\Davidscale] davidb}{}
64.400 \DeclareFontShape{HE8}{david}{bx}{n} {<-> [\Davidscale] davidb}{}
64.401 \DeclareFontShape{HE8}{david}{bx}{it} {<-> [\Davidscale] davidbi}{}
64.402

64.403

64.404 %\endinput % is it needed [tzafrir]


64.405 h/HE8davidi

64.6.7 8Bit Drugulin font


Drugulin is a serif hebrew font created by the omega project [FILL IN CREDITS]
[FILL IN GENERAL SHAPE DESCRIPTION] shapes: [FILL IN]
64.406 h∗HE8drugulini
64.407 \def\Drugulinscale{1.0}
64.408 \DeclareFontFamily{HE8}{drugulin}{\hyphenchar\font45}

64.409 \DeclareFontShape{HE8}{drugulin}{m}{n} {<-> [\Drugulinscale] drugulinb}{}


64.410 \DeclareFontShape{HE8}{drugulin}{m}{it} {<-> [\Drugulinscale] drugulinbi}{}
64.411 \DeclareFontShape{HE8}{drugulin}{m}{sl} {<-> [\Drugulinscale] drugulinbi}{}
64.412 \DeclareFontShape{HE8}{drugulin}{b}{n} {<-> [\Drugulinscale] drugulinb}{}
64.413 \DeclareFontShape{HE8}{drugulin}{bx}{n} {<-> [\Drugulinscale] drugulinb}{}
64.414 \DeclareFontShape{HE8}{drugulin}{bx}{it} {<-> [\Drugulinscale] drugulinbi}{}
64.415 %\endinput % is it needed [tzafrir]

64.416 h/HE8drugulini

441
64.6.8 8Bit Ellinia font
Elliniais a sans-serif hebrew font created by the omega project [FILL IN CRED-
ITS] [FILL IN GENERAL SHAPE DESCRIPTION] shapes: [FILL IN]
64.417 h∗HE8elliniai
64.418 \def\Elliniascale{1.0}
64.419 \DeclareFontFamily{HE8}{ellinia}{\hyphenchar\font45}

64.420 \DeclareFontShape{HE8}{ellinia}{m}{n} {<-> [\Elliniascale] ellinia}{}


64.421 \DeclareFontShape{HE8}{ellinia}{m}{it} {<-> [\Elliniascale] elliniai}{}
64.422 \DeclareFontShape{HE8}{ellinia}{m}{sl} {<-> [\Elliniascale] elliniai}{}
64.423 \DeclareFontShape{HE8}{ellinia}{b}{n} {<-> [\Elliniascale] elliniab}{}
64.424 \DeclareFontShape{HE8}{ellinia}{bx}{n} {<-> [\Elliniascale] elliniab}{}
64.425 \DeclareFontShape{HE8}{ellinia}{bx}{it} {<-> [\Elliniascale] elliniabi}{}
64.426 %\endinput % is it needed [tzafrir]

64.427 h/HE8elliniai

64.6.9 8Bit FrankRuehl font


FrankRuehl is a serif hebrew font created by the omega project [FILL IN CRED-
ITS] [FILL IN GENERAL SHAPE DESCRIPTION] shapes: [FILL IN]
64.428 h∗HE8frankruehli
64.429 \def\FrankRuehlscale{1.0}
64.430 \DeclareFontFamily{HE8}{frank}{\hyphenchar\font45}

64.431 \DeclareFontShape{HE8}{frank}{m}{n} {<-> [\FrankRuehlscale] frank}{}


64.432 \DeclareFontShape{HE8}{frank}{m}{it} {<-> [\FrankRuehlscale] franki}{}
64.433 \DeclareFontShape{HE8}{frank}{m}{sl} {<-> [\FrankRuehlscale] franki}{}
64.434 \DeclareFontShape{HE8}{frank}{b}{n} {<-> [\FrankRuehlscale] frankb}{}
64.435 \DeclareFontShape{HE8}{frank}{bx}{n} {<-> [\FrankRuehlscale] frankb}{}
64.436 \DeclareFontShape{HE8}{frank}{bx}{it} {<-> [\FrankRuehlscale] frankbi}{}
64.437 %\endinput % is it needed [tzafrir]

64.438 h/HE8frankruehli

64.6.10 8Bit KtavYad font


KtavYad is a serif hebrew font created by the omega project [FILL IN CREDITS]
[FILL IN GENERAL SHAPE DESCRIPTION] shapes: [FILL IN]
64.439 h∗HE8yadi
64.440 \def\KtavYadscale{1.0}
64.441 \DeclareFontFamily{HE8}{yad}{\hyphenchar\font45}

64.442 \DeclareFontShape{HE8}{yad}{m}{n} {<-> [\KtavYadscale] yadi}{}

64.443 \DeclareFontShape{HE8}{yad}{m}{it} {<-> [\KtavYadscale] yadi}{}

64.444 \DeclareFontShape{HE8}{yad}{m}{sl} {<-> [\KtavYadscale] yadi}{}

64.445 \DeclareFontShape{HE8}{yad}{b}{n} {<-> [\KtavYadscale] yadbi}{}

64.446 \DeclareFontShape{HE8}{yad}{bx}{n} {<-> [\KtavYadscale] yadbi}{}

64.447 \DeclareFontShape{HE8}{yad}{bx}{it} {<-> [\KtavYadscale] yadbi}{}

64.448 %\endinput % is it needed [tzafrir]

64.449 h/HE8yadi

64.6.11 8Bit MiriamMono font


MiriamMono is a serif hebrew font created by the omega project [FILL IN CRED-
ITS] [FILL IN GENERAL SHAPE DESCRIPTION] shapes: [FILL IN]

442
64.450 h∗HE8miriami
64.451 \def\MiriamMonoscale{1.0}
64.452 \DeclareFontFamily{HE8}{miriam}{\hyphenchar\font45}

64.453 \DeclareFontShape{HE8}{miriam}{m}{n} {<-> [\MiriamMonoscale] miriam}{}


64.454 \DeclareFontShape{HE8}{miriam}{m}{it} {<-> [\MiriamMonoscale] miriami}{}
64.455 \DeclareFontShape{HE8}{miriam}{m}{sl} {<-> [\MiriamMonoscale] miriami}{}
64.456 \DeclareFontShape{HE8}{miriam}{b}{n} {<-> [\MiriamMonoscale] miriamb}{}
64.457 \DeclareFontShape{HE8}{miriam}{bx}{n} {<-> [\MiriamMonoscale] miriamb}{}
64.458 \DeclareFontShape{HE8}{miriam}{bx}{it} {<-> [\MiriamMonoscale] miriambi}{}
64.459

64.460 %\endinput % is it needed [tzafrir]


64.461 h/HE8miriami

64.6.12 8Bit Nachlieli font


Nachlieliis a serif hebrew font created by the omega project [FILL IN CREDITS]
[FILL IN GENERAL SHAPE DESCRIPTION] shapes: [FILL IN]
64.462 h∗HE8nachlielii
64.463 \def\Nachlieliscale{1.0}
64.464 \DeclareFontFamily{HE8}{nachlieli}{\hyphenchar\font45}

64.465 \DeclareFontShape{HE8}{nachlieli}{m}{n} {<-> [\Nachlieliscale] nachlieli}{}


64.466 \DeclareFontShape{HE8}{nachlieli}{m}{it} {<-> [\Nachlieliscale] nachlielii}{}
64.467 \DeclareFontShape{HE8}{nachlieli}{m}{sl} {<-> [\Nachlieliscale] nachlielii}{}
64.468 \DeclareFontShape{HE8}{nachlieli}{b}{n} {<-> [\Nachlieliscale] nachlielib}{}
64.469 \DeclareFontShape{HE8}{nachlieli}{bx}{n} {<-> [\Nachlieliscale] nachlielib}{}
64.470 \DeclareFontShape{HE8}{nachlieli}{bx}{it} {<-> [\Nachlieliscale] nachlielibi}{}
64.471 %\endinput % is it needed [tzafrir]

64.472 h/HE8nachlielii

64.6.13 Hebrew font switching commands


The hebfont package denes a number of high-level commands (all starting with
\text.. similar to the standard LATEX 2ε font-change commands, for example
\textbf) that have one argument and typeset this argument in the requested
way. These commands are dened for all available Hebrew fonts dened above
and change only font parameters but not direction.
For example, to use Hebrew Classic font family, the following sequence of
commands should be included in a LATEX 2ε document:

\sethebrew
\textclas{Hebrew text printed with Classic fonts}
or to use Hebrew with Classic fonts locally:

\R{\textclas{Hebrew text printed with Classic fonts}}


We declare LATEX 2ε font commands, e.g. \textjm{. . . } for all available fonts.
Table 36 shows the meanings of all these new high-level commands.

\textjm Switches to Jerusalem font which is default regular Hebrew font (roman family).
Commands \textrm{. . . } and old-style {\rm . . . } will produce the same result.
64.473 h∗hebfonti
64.474 \def\ivritex@tmp{HE8}

443
Command Corresponds to Font family

\textjm{..} \rmfamily Jerusalem font


\textds{..} \bfseries Dead Sea font
\textoj{..} \itshape Old Jaa font
\slshape
\emph
\textta{..} \sffamily Tel-Aviv font
\ttfamily
\textcrml{..} \fontfamily{crml} Carmel fonts
\textfr{..} \fontfamily{fr} Frank-Ruehl fonts
\textredis{..} \fontfamily{redis} Redis fonts
\textclas{..} \fontfamily{redis} Classic fonts
\textshold{..} \fontfamily{shold} Shalom Old Style font
\textshscr{..} \fontfamily{shscr} Shalom Script font
\textshstk{..} \fontfamily{shstk} Shalom Stick font

Table 36: Hebrew font-change commands with arguments

The font change commands provided here all start with \text.. to
emphasize that they are for use in normal text and to be easily mem-
orable.

64.475 \ifx\ivritex@tmp\HeblatexEncoding %
64.476 % compatibility with hebfonts:
64.477 \DeclareTextFontCommand{\textjm}{\rmfamily\selectfont}
64.478 \DeclareTextFontCommand{\textds}{\bfseries\selectfont}
64.479 \DeclareTextFontCommand{\textoj}{\itshape\selectfont}
64.480 \DeclareTextFontCommand{\textta}{\sffamily\selectfont}
64.481

64.482 % an attempt to give some replacements to the original hebfonts:


64.483 %
64.484 \DeclareTextFontCommand{\textcrml}{\fontfamily{david}\selectfont}
64.485 \DeclareTextFontCommand{\textfr}{\fontfamily{frank}\selectfont}
64.486 \DeclareTextFontCommand{\textredis}{\fontfamily{aharoni}\selectfont}
64.487 \DeclareTextFontCommand{\textclas}{\fontfamily{drugulin}\selectfont}
64.488 \DeclareTextFontCommand{\textshold}{\fontfamily{frank}\selectfont}
64.489 \DeclareTextFontCommand{\textshscr}{\fontfamily{yad}\selectfont}
64.490 \DeclareTextFontCommand{\textshstk}{\fontfamily{aharoni}\selectfont}
64.491 % note that redis is larger than shstk
64.492

64.493

64.494 \DeclareTextFontCommand{\textaha}{\fontfamily{aharoni}\selectfont}
64.495 \DeclareTextFontCommand{\textdav}{\fontfamily{david}\selectfont}
64.496 \DeclareTextFontCommand{\textdru}{\fontfamily{drugulin}\selectfont}
64.497 \DeclareTextFontCommand{\textel} {\fontfamily{ellinia}\selectfont}
64.498 % \textfr is already declared above
64.499 \DeclareTextFontCommand{\textmir}{\fontfamily{miriam}\selectfont}
64.500 \DeclareTextFontCommand{\textna} {\fontfamily{nachlieli}\selectfont}
64.501 % is this necessary:

444
64.502 \DeclareTextFontCommand{\textyad} {\fontfamily{yad}\selectfont}
64.503

64.504 \else%
64.505 \DeclareTextFontCommand{\textjm}{\rmfamily\selectfont}

\textds Switches to Dead Sea font which is default bold font in Hebrew. Commands
\textbf{. . . } and old-style {\bf . . . } will produce the same result.
64.506 \DeclareTextFontCommand{\textds}{\bfseries\selectfont}

\textoj Switches to Old Jaa font which is default italic font in Hebrew. Commands
\textit{. . . }, \textsl{. . . }, \emph{. . . } and old-style {\it . . . } or {\em . . . }
will produce the same result.
64.507 \DeclareTextFontCommand{\textoj}{\itshape\selectfont}

\textta Switches to Tel-Aviv font which is default sans-serif font in Hebrew. Commands
\textsf{. . . }, \texttt{. . . } and old-style {\sf . . . } or {\tt . . . } will produce
the same result (because sans-serif is used as typewriter font when in Hebrew
mode).
64.508 \DeclareTextFontCommand{\textta}{\sffamily\selectfont}

\textcrml Switches to Carmel font. Regular and slanted variants of carmel font will be used..
64.509 \DeclareTextFontCommand{\textcrml}{\fontfamily{crml}\selectfont}

\textfr Switches to Frank-Ruehl font family. Regular, bold and slanted frank ruehl fonts
will be used.
64.510 \DeclareTextFontCommand{\textfr}{\fontfamily{fr}\selectfont}

\textredis Switches to Redis font family. Regular, bold and slanted redis fonts of various
sizes will be used.
64.511 \DeclareTextFontCommand{\textredis}{\fontfamily{redis}\selectfont}

\textclas Switches to Classic font family. The normal font will be hclassic and slanted 
hcaption.
64.512 \DeclareTextFontCommand{\textclas}{\fontfamily{clas}\selectfont}

\textshold Switches to Shalom Old Style font.


64.513 \DeclareTextFontCommand{\textshold}{\fontfamily{shold}\selectfont}

\textshscr Switches to Shalom Script font.


64.514 \DeclareTextFontCommand{\textshscr}{\fontfamily{shscr}\selectfont}

\textshstk Switches to Shalom Stick font.


64.515 \DeclareTextFontCommand{\textshstk}{\fontfamily{shstk}\selectfont}
64.516 \fi

Finally, for backward compatibility with LATEX2.09. four old font commands,
e.g. {\jm . . . } are dened too (see Table 37).
64.517 \if@compatibility
64.518 \DeclareOldFontCommand{\jm}{\normalfont\rmfamily\selectfont}%
64.519 {\@nomath\jm}
64.520 \DeclareOldFontCommand{\ds}{\normalfont\bfseries\selectfont}%
64.521 {\@nomath\ds}

445
Old font command Font name Comment

{\jm ..} Jerusalem default regular (roman) font


{\ds ..} Dead Sea default bold font
{\oj ..} Old Jaa default italic and slanted font
used also to emphasize text
{\ta ..} Tel-Aviv default sans-serif and typewriter font

Table 37: Hebrew old font-change commands for compatibility mode

64.522 \DeclareOldFontCommand{\oj}{\normalfont\itshape\selectfont}%
64.523 {\@nomath\oj}
64.524 \DeclareOldFontCommand{\ta}{\normalfont\sffamily\selectfont}%
64.525 {\@nomath\ta}
64.526 \fi

64.527 h/hebfonti

65 Hebrew in LATEX 2.09 compatibility mode


\documentstyle command in the preamble of LATEX document indicates that it
is a LATEX 2.09 document, and should be processed in compatibility mode. In such
documents, one of the following three Hebrew style options can be included:

1. hebrew_newcode indicates that document will use UNIX ISO 8859-8 or Win-
dows cp1255 input encoding, i.e. Alef letter will be represented as 224.

2. hebrew_p indicates that document is encoded with IBM PC cp862 encoding,


i.e. Alef letter will be represented as 128.

3. hebrew_oldcode indicates that document uses old 7-bit encoding, as dened


in Israeli Standard 960, i.e. Alef is character number 96.

Note, that other hebrew-related styles, such as hebcal can be included after the
abovenamed Hebrew style option, for example:

\documentstyle[12pt,hebrew_p,hebcal]{report}.
Any Hebrew document which compiled under LATEX 2.09 should compile under
compatibility mode, unless it uses low-level commands such as \tenrm.

65.1 The docstrip modules


The following modules are used in the implementation to direct docstrip in
generating the external les:
newcode produce hebrew_newcode.sty
pccode produce hebrew_p.sty
oldcode produce hebrew_oldcode.sty

446
65.2 Obsolete style les
For each of the Hebrew LATEX 2.09 Hebrew styles, we produce a le which uses
correct input encoding and calls babel with Hebrew and English language op-
tions. This means that any styles which say \input hebrew_newcode.sty or
\documentstyle[. . . hebrew_newcode. . . ]{. . . } should still work.
65.1 h∗newcode | pccode | oldcodei
65.2 \NeedsTeXFormat{LaTeX2e}
65.3 h/newcode | pccode | oldcodei

65.4 h∗newcodei
65.5 \@obsoletefile{hebrew.sty}{hebrew_newcode.sty}
65.6 \RequirePackage[8859-8]{inputenc}

65.7 h/newcodei

65.8 h∗pccodei

65.9 \@obsoletefile{hebrew.sty}{hebrew_p.sty}

65.10 \RequirePackage[cp862]{inputenc}

65.11 h/pccodei

65.12 h∗oldcodei

65.13 \@obsoletefile{hebrew.sty}{hebrew_oldcode.sty}

65.14 \RequirePackage[si960]{inputenc}

65.15 h/oldcodei

65.16 h∗newcode | pccode | oldcodei


65.17 \RequirePackage[english,hebrew]{babel}
65.18 h/newcode | pccode | oldcodei

447
66 The Bahasa Indonesian language
The le bahasa.dtx79 denes all the language denition macros for the Bahasa
Indonesia / Bahasa Melayu language. Bahasa just means `language' in Bahasa
Indonesia / Bahasa Melayu. Since both national versions of the language use the
same writing, although diering in pronounciation, this le can be used for both
languages.
For this language currently no special denitions are needed or available.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
66.1 h∗codei
66.2 \LdfInit\CurrentOption{date\CurrentOption}
When this le is read as an option, i.e. by the \usepackage command, bahasa
could be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@bahasa to see whether we have to do something here.
For both Bahasa Indonesia and Bahasa Malaysia the same set of hyphenation
patterns can be used which are available in the le inhyph.tex. However it could
be loaded using any of the possible Babel options fot the Indonesian and Malaysian
languase. So rst we try to nd out whether this is the case.
66.3 \ifx\l@bahasa\@undefined
66.4 \ifx\l@bahasai\@undefined
66.5 \ifx\l@indon\@undefined
66.6 \ifx\l@indonesian\@undefined
66.7 \ifx\l@bahasam\@undefined
66.8 \ifx\l@malay\@undefined
66.9 \ifx\l@meyalu\@undefined
66.10 \@nopatterns{Bahasa Indonesia}
66.11 \adddialect\l@bahasa0\relax
66.12 \else
66.13 \let\l@bahasa\l@meyalu
66.14 \fi
66.15 \else
66.16 \let\l@bahasa\l@malay
66.17 \fi
66.18 \else
66.19 \let\l@bahasa\l@bahasam
66.20 \fi
66.21 \else
66.22 \let\l@bahasa\l@indonesian
66.23 \fi
66.24 \else
66.25 \let\l@bahasa\l@indon
66.26 \fi
66.27 \else
66.28 \let\l@bahasa\l@bahasai
66.29 \fi
66.30 \fi

Now that we are sure the \l@bahasa has some valid denition we need to make
sure that a name to access the hyphenation patterns, corresponding to the option
used, is available.
79 The le described in this section has version number v1.0l and was last revised on 2008/03/15.

448
66.31 \expandafter\expandafter\expandafter\let
66.32 \expandafter\csname
66.33 \expandafter l\expandafter @\CurrentOption\endcsname
66.34 \l@bahasa
The next step consists of dening commands to switch to (and from) the Ba-
hasa language.

\captionsbahasa The macro \captionsbahasa denes all strings used in the four standard docu-
mentclasses provided with LATEX.
66.35 \@namedef{captions\CurrentOption}{%
66.36 \def\prefacename{Pendahuluan}%
66.37 \def\refname{Pustaka}%
66.38 \def\abstractname{Ringkasan}% (sometime it's called 'intisari'
66.39 % or 'ikhtisar')
66.40 \def\bibname{Bibliografi}%
66.41 \def\chaptername{Bab}%
66.42 \def\appendixname{Lampiran}%
66.43 \def\contentsname{Daftar Isi}%
66.44 \def\listfigurename{Daftar Gambar}%
66.45 \def\listtablename{Daftar Tabel}%
66.46 \def\indexname{Indeks}%
66.47 \def\figurename{Gambar}%
66.48 \def\tablename{Tabel}%
66.49 \def\partname{Bagian}%
66.50 % Subject: Subyek
66.51 % From: Dari
66.52 \def\enclname{Lampiran}%
66.53 \def\ccname{cc}%
66.54 \def\headtoname{Kepada}%
66.55 \def\pagename{Halaman}%
66.56 % Notes (Endnotes): Catatan
66.57 \def\seename{lihat}%
66.58 \def\alsoname{lihat juga}%
66.59 \def\proofname{Bukti}%
66.60 \def\glossaryname{Daftar Istilah}%
66.61 }

\datebahasa The macro \datebahasa redenes the command \today to produce Bahasa In-
donesian dates.
66.62 \@namedef{date\CurrentOption}{%
66.63 \def\today{\number\day~\ifcase\month\or
66.64 Januari\or Pebruari\or Maret\or April\or Mei\or Juni\or
66.65 Juli\or Agustus\or September\or Oktober\or Nopember\or Desember\fi
66.66 \space \number\year}}

\extrasbahasa The macro \extrasbahasa will perform all the extra denitions needed for the
\noextrasbahasa Bahasa language. The macro \extrasbahasa is used to cancel the actions of
\extrasbahasa. For the moment these macros are empty but they are dened for
compatibility with the other language denition les.
66.67 \@namedef{extras\CurrentOption}{}
66.68 \@namedef{noextras\CurrentOption}{}

449
\bahasahyphenmins The bahasa hyphenation patterns should be used with \lefthyphenmin set to 2
and \righthyphenmin set to 2.
66.69 \providehyphenmins{\CurrentOption}{\tw@\tw@}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
66.70 \ldf@finish{\CurrentOption}
66.71 h/codei

450
67 The Bahasa Malaysia language
The le bahasam.dtx80 denes all the language denition macros for the Bahasa
Malaysia language. Bahasa just means `language' in Bahasa Malaysia. A number
of terms dier from those used in bahasa indonesia.
For this language currently no special denitions are needed or available.
The macro \LdfInit takes care of preventing that this le is loaded more than
once, checking the category code of the @ sign, etc.
67.1 h∗codei
67.2 \LdfInit\CurrentOption{date\CurrentOption}
When this le is read as an option, i.e. by the \usepackage command, bahasa
could be an `unknown' language in which case we have to make it known. So we
check for the existence of \l@bahasa to see whether we have to do something here.
For both Bahasa Malaysia and Bahasa Indonesia the same set of hyphenation
patterns can be used which are available in the le inhyph.tex. However it could
be loaded using any of the possible Babel options fot the Malaysian and Indonesian
languase. So rst we try to nd out whether this is the case.
67.3 \ifx\l@malay\@undefined
67.4 \ifx\l@meyalu\@undefined
67.5 \ifx\l@bahasam\@undefined
67.6 \ifx\l@bahasa\@undefined
67.7 \ifx\l@bahasai\@undefined
67.8 \ifx\l@indon\@undefined
67.9 \ifx\l@indonesian\@undefined
67.10 \@nopatterns{Bahasa Malaysia}
67.11 \adddialect\l@malay0\relax
67.12 \else
67.13 \let\l@malay\l@indonesian
67.14 \fi
67.15 \else
67.16 \let\l@malay\l@indon
67.17 \fi
67.18 \else
67.19 \let\l@malay\l@bahasai
67.20 \fi
67.21 \else
67.22 \let\l@malay\l@bahasa
67.23 \fi
67.24 \else
67.25 \let\l@malay\l@bahasam
67.26 \fi
67.27 \else
67.28 \let\l@malay\l@meyalu
67.29 \fi
67.30 \fi

Now that we are sure the \l@malay has some valid denition we need to make
sure that a name to access the hyphenation patterns, corresponding to the option
used, is available.
67.31 \expandafter\expandafter\expandafter\let
80 The le described in this section has version number v1.0k and was last revised on
2008/01/27.

451
67.32 \expandafter\csname
67.33 \expandafter l\expandafter @\CurrentOption\endcsname
67.34 \l@malay
The next step consists of dening commands to switch to (and from) the Ba-
hasa language.
\captionsbahasam The macro \captionsbahasam denes all strings used in the four standard docu-
mentclasses provided with LATEX.
67.35 \@namedef{captions\CurrentOption}{%
67.36 \def\prefacename{Prakata}%
67.37 \def\refname{Rujukan}%
67.38 \def\abstractname{Abstrak}% (sometime it's called 'intisari'
67.39 % or 'ikhtisar')
67.40 \def\bibname{Bibliografi}%
67.41 \def\chaptername{Bab}%
67.42 \def\appendixname{Lampiran}%
67.43 \def\contentsname{Kandungan}%
67.44 \def\listfigurename{Senarai Gambar}%
67.45 \def\listtablename{Senarai Jadual}%
67.46 \def\indexname{Indeks}%
67.47 \def\figurename{Gambar}%
67.48 \def\tablename{Jadual}%
67.49 \def\partname{Bahagian}%
67.50 % Subject: Perkara
67.51 % From: Dari
67.52 \def\enclname{Lampiran}%
67.53 \def\ccname{sk}% (short form for 'Salinan Kepada')
67.54 \def\headtoname{Kepada}%
67.55 \def\pagename{Halaman}%
67.56 % Notes (Endnotes): Catatan
67.57 \def\seename{sila rujuk}%
67.58 \def\alsoname{rujuk juga}%
67.59 \def\proofname{Bukti}%
67.60 \def\glossaryname{Istilah}%
67.61 }

\datebahasam The macro \datebahasam redenes the command \today to produce Bahasa
Malaysian dates.
67.62 \@namedef{date\CurrentOption}{%
67.63 \def\today{\number\day~\ifcase\month\or
67.64 Januari\or Februari\or Mac\or April\or Mei\or Jun\or
67.65 Julai\or Ogos\or September\or Oktober\or November\or Disember\fi
67.66 \space \number\year}}

\extrasbahasam The macro \extrasbahasa will perform all the extra denitions needed for the
\noextrasbahasam Bahasa language. The macro \extrasbahasa is used to cancel the actions of
\extrasbahasa. For the moment these macros are empty but they are dened for
compatibility with the other language denition les.
67.67 \@namedef{extras\CurrentOption}{}
67.68 \@namedef{noextras\CurrentOption}{}

\bahasamhyphenmins The bahasam hyphenation patterns should be used with \lefthyphenmin set to 2
and \righthyphenmin set to 2.

452
67.69 \providehyphenmins{\CurrentOption}{\tw@\tw@}

The macro \ldf@finish takes care of looking for a conguration le, setting
the main language to be switched on at \begin{document} and resetting the
category code of @ to its original value.
67.70 \ldf@finish{\CurrentOption}
67.71 h/codei

453
68 Not renaming hyphen.tex
As Don Knuth has declared that the lename hyphen.tex may only be used to
designate his version of the american English hyphenation patterns, a new solution
has to be found in order to be able to load hyphenation patterns for other languages
in a plain-based TEX-format. When asked he responded:

That le name is "sacred", and if anybody changes it they will cause
severe upward/downward compatibility headaches.
People can have a le localhyphen.tex or whatever they like, but they
mustn't diddle with hyphen.tex (or plain.tex except to preload addi-
tional fonts).

The les bplain.tex and blplain.tex can be used as replacement wrappers


around plain.tex and lplain.tex to acheive the desired eect, based on the
babel package. If you load each of them with iniTEX, you will get a le called either
bplain.fmt or blplain.fmt, which you can use as replacements for plain.fmt
and lplain.fmt.
As these les are going to be read as the rst thing iniTEX sees, we need to set
some category codes just to be able to change the denition of \input
68.1 h∗bplain | blplaini
68.2 \catcode`\{=1 % left brace is begin-group character
68.3 \catcode`\}=2 % right brace is end-group character

68.4 \catcode`\#=6 % hash mark is macro parameter character

Now let's see if a le called hyphen.cfg can be found somewhere on TEX's input
path by trying to open it for reading...
68.5 \openin 0 hyphen.cfg
If the le wasn't found the following test turns out true.
68.6 \ifeof0
68.7 \else
When hyphen.cfg could be opened we make sure that it will be read instead of
the le hyphen.tex which should (according to Don Knuth's ruling) contain the
american English hyphenation patterns and nothing else.
We do this by rst saving the original meaning of \input (and I use a one
letter control sequence for that so as not to waste multi-letter control sequence on
this in the format).
68.8 \let\a\input
Then \input is dened to forget about its argument and load hyphen.cfg instead.
68.9 \def\input #1 {%
68.10 \let\input\a
68.11 \a hyphen.cfg
Once that's done the original meaning of \input can be restored and the denition
of \a can be forgotten.
68.12 \let\a\undefined
68.13 }
68.14 \fi

68.15 h/bplain | blplaini

454
Now that we have made sure that hyphen.cfg will be loaded at the right moment
it is time to load plain.tex.
68.16 hbplaini\a plain.tex
68.17 hblplaini\a lplain.tex
Finally we change the contents of \fmtname to indicate that this is not the plain
format, but a format based on plain with the babel package preloaded.
68.18 hbplaini\def\fmtname{babel-plain}
68.19 hblplaini\def\fmtname{babel-lplain}
When you are using a dierent format, based on plain.tex you can make a copy
of blplain.tex, rename it and replace plain.tex with the name of your format le.

69 Support for formats based on plainTEX


The following code duplicates or emulates parts of LATEX 2ε that are needed for
babel.
69.1 h∗codei
69.2 \ifx\adddialect\@undefined
When \adddialect is still undened we are making a format. In that case only
the rst part of this le is needed.
69.3 \def\@empty{}
We need to dene \loadlocalcfg for plain users as the LATEX denition uses
\InputIfFileExists.
69.4 \def\loadlocalcfg#1{%
69.5 \openin0#1.cfg
69.6 \ifeof0
69.7 \closein0
69.8 \else
69.9 \closein0
69.10 {\immediate\write16{*************************************}%
69.11 \immediate\write16{* Local config file #1.cfg used}%
69.12 \immediate\write16{*}%
69.13 }
69.14 \input #1.cfg\relax
69.15 \fi
We have to execute \@endofldf in this case
69.16 \@endofldf
69.17 }
We want to add a message to the message LATEX 2.09 puts in the \everyjob
register. This could be done by the following code:
\let\orgeveryjob\everyjob
\def\everyjob#1{%
\orgeveryjob{#1}%
\orgeveryjob\expandafter{\the\orgeveryjob\immediate\write16{%
hyphenation patterns for \the\loaded@patterns loaded.}}%
\let\everyjob\orgeveryjob\let\orgeveryjob\@undefined}

455
The code above redenes the control sequence \everyjob in order to be able to
add something to the current contents of the register. This is necessary because
the processing of hyphenation patterns happens long before LATEX lls the register.
There are some problems with this approach though.
• When someone wants to use several hyphenation patterns with SLiTEX the
above scheme won't work. The reason is that SLiTEX overwrites the contents
of the \everyjob register with its own message.
• Plain TEX does not use the \everyjob register so the message would not be
displayed.
To circumvent this a `dirty trick' can be used. As this code is only processed
when creating a new format le there is one command that is sure to be used,
\dump. Therefore the original \dump is saved in \org@dump and a new denition
is supplied.
69.18 \let\orig@dump=\dump
69.19 \def\dump{%
To make sure that LATEX 2.09 executes the \@begindocumenthook we would want
to alter \begin{document}, but as this done too often already, we add the new
code at the front of \@preamblecmds. But we can only do that after it has been
dened, so we add this piece of code to \dump.
69.20 \ifx\@ztryfc\@undefined
69.21 \else
69.22 \toks0=\expandafter{\@preamblecmds}
69.23 \edef\@preamblecmds{\noexpand\@begindocumenthook\the\toks0}
69.24 \def\@begindocumenthook{}
69.25 \fi
This new denition starts by adding an instruction to write a message on the
terminal and in the transcript le to inform the user of the preloaded hyphenation
patterns.
69.26 \everyjob\expandafter{\the\everyjob%
69.27 \immediate\write16{\the\toks8 loaded.}}%
Then everything is restored to the old situation and the format is dumped.
69.28 \let\dump\orig@dump\let\orig@dump\@undefined\dump}
69.29 \expandafter\endinput
69.30 \fi

The rest of this le is not processed by iniTEX but during the normal document
run. A number of LATEX macro's that are needed later on.
69.31 \long\def\@firstofone#1{#1}
69.32 \long\def\@firstoftwo#1#2{#1}
69.33 \long\def\@secondoftwo#1#2{#2}

69.34 \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}

69.35 \def\@star@or@long#1{%

69.36 \@ifstar
69.37 {\let\l@ngrel@x\relax#1}%
69.38 {\let\l@ngrel@x\long#1}}
69.39 \let\l@ngrel@x\relax

69.40 \def\@car#1#2\@nil{#1}

69.41 \def\@cdr#1#2\@nil{#2}

69.42 \let\@typeset@protect\relax

456
69.43 \long\def\@gobble#1{}
69.44 \edef\@backslashchar{\expandafter\@gobble\string\\}
69.45 \def\strip@prefix#1>{}

69.46 \def\g@addto@macro#1#2{{%

69.47 \toks@\expandafter{#1#2}%
69.48 \xdef#1{\the\toks@}}}
69.49 \def\@namedef#1{\expandafter\def\csname #1\endcsname}

69.50 \def\@ifundefined#1{%

69.51 \expandafter\ifx\csname#1\endcsname\relax
69.52 \expandafter\@firstoftwo
69.53 \else
69.54 \expandafter\@secondoftwo
69.55 \fi}
LATEX 2ε has the command \@onlypreamble which adds commands to a list of
commands that are no longer needed after \begin{document}.
69.56 \ifx\@preamblecmds\@undefined
69.57 \def\@preamblecmds{}
69.58 \fi

69.59 \def\@onlypreamble#1{%

69.60 \expandafter\gdef\expandafter\@preamblecmds\expandafter{%
69.61 \@preamblecmds\do#1}}
69.62 \@onlypreamble\@onlypreamble

Mimick LATEX's \AtBeginDocument; for this to work the user needs to add
\begindocument to his le.
69.63 \def\begindocument{%
69.64 \@begindocumenthook
69.65 \global\let\@begindocumenthook\@undefined
69.66 \def\do##1{\global\let ##1\@undefined}%
69.67 \@preamblecmds
69.68 \global\let\do\noexpand
69.69 }

69.70 \ifx\@begindocumenthook\@undefined
69.71 \def\@begindocumenthook{}
69.72 \fi

69.73 \@onlypreamble\@begindocumenthook

69.74 \def\AtBeginDocument{\g@addto@macro\@begindocumenthook}

We also have to mimick LATEX's \AtEndOfPackage. Our replacement macro is


much simpler; it stores its argument in \@endofldf.
69.75 \def\AtEndOfPackage#1{\g@addto@macro\@endofldf{#1}}
69.76 \@onlypreamble\AtEndOfPackage
69.77 \def\@endofldf{}

69.78 \@onlypreamble\@endofldf

LATEX needs to be able to switch o writing to its auxiliary les; plain doesn't
have them by default.
69.79 \ifx\if@filesw\@undefined
69.80 \expandafter\let\csname if@filesw\expandafter\endcsname
69.81 \csname iffalse\endcsname
69.82 \fi

Mimick LATEX's commands to dene control sequences.


69.83 \def\newcommand{\@star@or@long\new@command}

457
69.84 \def\new@command#1{%
69.85 \@testopt{\@newcommand#1}0}
69.86 \def\@newcommand#1[#2]{%

69.87 \@ifnextchar [{\@xargdef#1[#2]}%


69.88 {\@argdef#1[#2]}}
69.89 \long\def\@argdef#1[#2]#3{%

69.90 \@yargdef#1\@ne{#2}{#3}}
69.91 \long\def\@xargdef#1[#2][#3]#4{%

69.92 \expandafter\def\expandafter#1\expandafter{%
69.93 \expandafter\@protected@testopt\expandafter #1%
69.94 \csname\string#1\expandafter\endcsname{#3}}%
69.95 \expandafter\@yargdef \csname\string#1\endcsname
69.96 \tw@{#2}{#4}}
69.97 \long\def\@yargdef#1#2#3{%

69.98 \@tempcnta#3\relax
69.99 \advance \@tempcnta \@ne
69.100 \let\@hash@\relax
69.101 \edef\reserved@a{\ifx#2\tw@ [\@hash@1]\fi}%
69.102 \@tempcntb #2%
69.103 \@whilenum\@tempcntb <\@tempcnta
69.104 \do{%
69.105 \edef\reserved@a{\reserved@a\@hash@\the\@tempcntb}%
69.106 \advance\@tempcntb \@ne}%
69.107 \let\@hash@##%
69.108 \l@ngrel@x\expandafter\def\expandafter#1\reserved@a}
69.109 \let\providecommand\newcommand

69.110 \def\DeclareRobustCommand{\@star@or@long\declare@robustcommand}
69.111 \def\declare@robustcommand#1{%
69.112 \edef\reserved@a{\string#1}%
69.113 \def\reserved@b{#1}%
69.114 \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}%
69.115 \edef#1{%
69.116 \ifx\reserved@a\reserved@b
69.117 \noexpand\x@protect
69.118 \noexpand#1%
69.119 \fi
69.120 \noexpand\protect
69.121 \expandafter\noexpand\csname
69.122 \expandafter\@gobble\string#1 \endcsname
69.123 }%
69.124 \expandafter\new@command\csname
69.125 \expandafter\@gobble\string#1 \endcsname
69.126 }

69.127 \def\x@protect#1{%

69.128 \ifx\protect\@typeset@protect\else
69.129 \@x@protect#1%
69.130 \fi
69.131 }

69.132 \def\@x@protect#1\fi#2#3{%

69.133 \fi\protect#1%
69.134 }

The following little macro \in@ is taken from latex.ltx; it checks whether its
rst argument is part of its second argument. It uses the boolean \in@; allocating a

458
new boolean inside conditionally executed code is not possible, hence the construct
with the temporary denition of \bbl@tempa.
69.135 \def\bbl@tmpa{\csname newif\endcsname\ifin@}
69.136 \ifx\in@\@undefined
69.137 \def\in@#1#2{%
69.138 \def\in@@##1#1##2##3\in@@{%
69.139 \ifx\in@##2\in@false\else\in@true\fi}%
69.140 \in@@#2#1\in@\in@@}
69.141 \else

69.142 \let\bbl@tmpa\@empty
69.143 \fi

69.144 \bbl@tmpa

LATEX has a macro to check whether a certain package was loaded with specic
options. The command has two extra arguments which are code to be executed in
either the true or false case. This is used to detect whether the document needs
one of the accents to be activated (activegrave and activeacute). For plain TEX we
assume that the user wants them to be active by default. Therefore the only thing
we do is execute the third argument (the code for the true case).
69.145 \def\@ifpackagewith#1#2#3#4{%
69.146 #3}
The LATEX macro \@ifl@aded checks whether a le was loaded. This functionality
is not needed for plain TEX but we need the macro to be dened as a no-op.
69.147 \def\@ifl@aded#1#2#3#4{}
For the following code we need to make sure that the commands \newcommand
and \providecommand exist with some sensible denition. They are not fully
equivalent to their LATEX 2ε versions; just enough to make things work in
plain TEXenvironments.
69.148 \ifx\@tempcnta\@undefined
69.149 \csname newcount\endcsname\@tempcnta\relax
69.150 \fi

69.151 \ifx\@tempcntb\@undefined

69.152 \csname newcount\endcsname\@tempcntb\relax


69.153 \fi

To prevent wasting two counters in LATEX 2.09 (because counters with the same
name are allocated later by it) we reset the counter that holds the next free counter
(\count10).
69.154 \ifx\bye\@undefined
69.155 \advance\count10 by -2\relax
69.156 \fi

69.157 \ifx\@ifnextchar\@undefined

69.158 \def\@ifnextchar#1#2#3{%
69.159 \let\reserved@d=#1%
69.160 \def\reserved@a{#2}\def\reserved@b{#3}%
69.161 \futurelet\@let@token\@ifnch}
69.162 \def\@ifnch{%
69.163 \ifx\@let@token\@sptoken
69.164 \let\reserved@c\@xifnch
69.165 \else
69.166 \ifx\@let@token\reserved@d
69.167 \let\reserved@c\reserved@a

459
69.168 \else
69.169 \let\reserved@c\reserved@b
69.170 \fi
69.171 \fi
69.172 \reserved@c}
69.173 \def\:{\let\@sptoken= } \: % this makes \@sptoken a space token
69.174 \def\:{\@xifnch} \expandafter\def\: {\futurelet\@let@token\@ifnch}
69.175 \fi

69.176 \def\@testopt#1#2{%

69.177 \@ifnextchar[{#1}{#1[#2]}}
69.178 \def\@protected@testopt#1{%%

69.179 \ifx\protect\@typeset@protect
69.180 \expandafter\@testopt
69.181 \else
69.182 \@x@protect#1%
69.183 \fi}
69.184 \long\def\@whilenum#1\do #2{\ifnum #1\relax #2\relax\@iwhilenum{#1\relax

69.185 #2\relax}\fi}
69.186 \long\def\@iwhilenum#1{\ifnum #1\expandafter\@iwhilenum

69.187 \else\expandafter\@gobble\fi{#1}}
Code from ltoutenc.dtx, adapted for use in the plain TEX environment.
69.188 \def\DeclareTextCommand{%
69.189 \@dec@text@cmd\providecommand
69.190 }

69.191 \def\ProvideTextCommand{%

69.192 \@dec@text@cmd\providecommand
69.193 }

69.194 \def\DeclareTextSymbol#1#2#3{%

69.195 \@dec@text@cmd\chardef#1{#2}#3\relax
69.196 }

69.197 \def\@dec@text@cmd#1#2#3{%

69.198 \expandafter\def\expandafter#2%
69.199 \expandafter{%
69.200 \csname#3-cmd\expandafter\endcsname
69.201 \expandafter#2%
69.202 \csname#3\string#2\endcsname
69.203 }%
69.204 % \let\@ifdefinable\@rc@ifdefinable
69.205 \expandafter#1\csname#3\string#2\endcsname
69.206 }

69.207 \def\@current@cmd#1{%

69.208 \ifx\protect\@typeset@protect\else
69.209 \noexpand#1\expandafter\@gobble
69.210 \fi
69.211 }

69.212 \def\@changed@cmd#1#2{%

69.213 \ifx\protect\@typeset@protect
69.214 \expandafter\ifx\csname\cf@encoding\string#1\endcsname\relax
69.215 \expandafter\ifx\csname ?\string#1\endcsname\relax
69.216 \expandafter\def\csname ?\string#1\endcsname{%
69.217 \@changed@x@err{#1}%
69.218 }%
69.219 \fi
69.220 \global\expandafter\let

460
69.221 \csname\cf@encoding \string#1\expandafter\endcsname
69.222 \csname ?\string#1\endcsname
69.223 \fi
69.224 \csname\cf@encoding\string#1%
69.225 \expandafter\endcsname
69.226 \else
69.227 \noexpand#1%
69.228 \fi
69.229 }
69.230 \def\@changed@x@err#1{%
69.231 \errhelp{Your command will be ignored, type <return> to proceed}%
69.232 \errmessage{Command \protect#1 undefined in encoding \cf@encoding}}
69.233 \def\DeclareTextCommandDefault#1{%

69.234 \DeclareTextCommand#1?%
69.235 }

69.236 \def\ProvideTextCommandDefault#1{%

69.237 \ProvideTextCommand#1?%
69.238 }

69.239 \expandafter\let\csname OT1-cmd\endcsname\@current@cmd

69.240 \expandafter\let\csname?-cmd\endcsname\@changed@cmd

69.241 \def\DeclareTextAccent#1#2#3{%

69.242 \DeclareTextCommand#1{#2}[1]{\accent#3 ##1}


69.243 }

69.244 \def\DeclareTextCompositeCommand#1#2#3#4{%

69.245 \expandafter\let\expandafter\reserved@a\csname#2\string#1\endcsname
69.246 \edef\reserved@b{\string##1}%
69.247 \edef\reserved@c{%
69.248 \expandafter\@strip@args\meaning\reserved@a:-\@strip@args}%
69.249 \ifx\reserved@b\reserved@c
69.250 \expandafter\expandafter\expandafter\ifx
69.251 \expandafter\@car\reserved@a\relax\relax\@nil
69.252 \@text@composite
69.253 \else
69.254 \edef\reserved@b##1{%
69.255 \def\expandafter\noexpand
69.256 \csname#2\string#1\endcsname####1{%
69.257 \noexpand\@text@composite
69.258 \expandafter\noexpand\csname#2\string#1\endcsname
69.259 ####1\noexpand\@empty\noexpand\@text@composite
69.260 {##1}%
69.261 }%
69.262 }%
69.263 \expandafter\reserved@b\expandafter{\reserved@a{##1}}%
69.264 \fi
69.265 \expandafter\def\csname\expandafter\string\csname
69.266 #2\endcsname\string#1-\string#3\endcsname{#4}
69.267 \else
69.268 \errhelp{Your command will be ignored, type <return> to proceed}%
69.269 \errmessage{\string\DeclareTextCompositeCommand\space used on
69.270 inappropriate command \protect#1}
69.271 \fi
69.272 }

69.273 \def\@text@composite#1#2#3\@text@composite{%

69.274 \expandafter\@text@composite@x

461
69.275 \csname\string#1-\string#2\endcsname
69.276 }
69.277 \def\@text@composite@x#1#2{%

69.278 \ifx#1\relax
69.279 #2%
69.280 \else
69.281 #1%
69.282 \fi
69.283 }

69.284 %

69.285 \def\@strip@args#1:#2-#3\@strip@args{#2}

69.286 \def\DeclareTextComposite#1#2#3#4{%

69.287 \def\reserved@a{\DeclareTextCompositeCommand#1{#2}{#3}}%
69.288 \bgroup
69.289 \lccode`\@=#4%
69.290 \lowercase{%
69.291 \egroup
69.292 \reserved@a @%
69.293 }%
69.294 }

69.295 %

69.296 \def\UseTextSymbol#1#2{%

69.297 % \let\@curr@enc\cf@encoding
69.298 % \@use@text@encoding{#1}%
69.299 #2%
69.300 % \@use@text@encoding\@curr@enc
69.301 }

69.302 \def\UseTextAccent#1#2#3{%

69.303 % \let\@curr@enc\cf@encoding
69.304 % \@use@text@encoding{#1}%
69.305 % #2{\@use@text@encoding\@curr@enc\selectfont#3}%
69.306 % \@use@text@encoding\@curr@enc
69.307 }

69.308 \def\@use@text@encoding#1{%

69.309 % \edef\f@encoding{#1}%
69.310 % \xdef\font@name{%
69.311 % \csname\curr@fontshape/\f@size\endcsname
69.312 % }%
69.313 % \pickup@font
69.314 % \font@name
69.315 % \@@enc@update
69.316 }

69.317 \def\DeclareTextSymbolDefault#1#2{%

69.318 \DeclareTextCommandDefault#1{\UseTextSymbol{#2}#1}%
69.319 }

69.320 \def\DeclareTextAccentDefault#1#2{%

69.321 \DeclareTextCommandDefault#1{\UseTextAccent{#2}#1}%
69.322 }

69.323 \def\cf@encoding{OT1}

Currently we only use the LATEX 2ε method for accents for those that are known
to be made active in some language denition le.
69.324 \DeclareTextAccent{\"}{OT1}{127}
69.325 \DeclareTextAccent{\'}{OT1}{19}

462
69.326 \DeclareTextAccent{\^}{OT1}{94}
69.327 \DeclareTextAccent{\`}{OT1}{18}
69.328 \DeclareTextAccent{\~}{OT1}{126}

The following control sequences are used in babel.def but are not dened for
plain TEX.
69.329 \DeclareTextSymbol{\textquotedblleft}{OT1}{92}
69.330 \DeclareTextSymbol{\textquotedblright}{OT1}{`\"}
69.331 \DeclareTextSymbol{\textquoteleft}{OT1}{`\`}

69.332 \DeclareTextSymbol{\textquoteright}{OT1}{`\'}

69.333 \DeclareTextSymbol{\i}{OT1}{16}

69.334 \DeclareTextSymbol{\ss}{OT1}{25}

For a couple of languages we need the LATEX-control sequence \scriptsize to be


available. Because plain TEX doesn't have such a sosticated font mechanism as
LATEX has, we just \let it to \sevenrm.
69.335 \ifx\scriptsize\@undefined
69.336 \let\scriptsize\sevenrm
69.337 \fi

69.338 h/codei

463
Index
Numbers written in italic refer to the page where the corresponding entry is de-
scribed; numbers underlined refer to the code line of the denition; numbers in
roman refer to the code lines where the entry is used.

Symbols \@mkboth . . . . . . 12.1293 \aob . . . . . . . . . . . 52.51


\- . . . 19.123, 34.110, \@newl@bel . . . . 12.1212 \ap . . . . . . . . . . . 30.84
36.144, 41.57, \@nolanerr . . . . 12.262 \Apageref . . 47.419, 262
44.92, 46.63, \@noopterr . . . . 12.262 \apageref . . . . . 47.418
51.177, 54.242 \@nopatterns . . . 12.262 \appendix 62.129, 62.878
\@@az . . . . . . . . . 47.493 \@notshorthand . 12.651 \arabicnorl . . . . 62.329
\@@az@string . . . 47.457 \@number . . . . . . 62.317 \Aref . . . . . . 47.404, 261
\@@azc . . . . . . . . 47.440 \@opargbegintheorem \aref . . . . . . . . . 47.403
\@@enc@update . . . . . ... 47.147, 62.826 \Asbuk . . . 56.340, 58.319
. . . 51.365, 54.430 \@outputdblcol . 62.597 \asbuk . . . 56.347, 58.326
\@@selectlanguage 62.267 \@part . . . 47.192, 62.467 \author . . . . . . . 62.815
\@@vpageref . . . . 12.1342 \@roman . . . . . . . 62.326 \AutoSpaceBeforeFDP
\@Alph . . . . . . . . 62.102 \@schapter . . . . 62.839 . . . . . . 29.110,
\@Alph@bul . . . . 57.254 \@seccntformat . . 47.96 56.268, 58.247
\@Alphfinal . . . . 62.102 \@sect . . . . 47.99, 62.510 \Az . . . . . . . 47.375, 261
\@Roman . . . . . . . 62.326 \@ssect . . . . . . . 47.133 \az . . . . . . . . . . 47.374
\@acute . . . . . . . . 36.77 \@tableofcontents 62.381 \az@ . . . . . . . . . . 47.376
\@alph . . . . . . . . 62.102 \@testdef . . . . . 12.1225 \Azc . . . . . . . 47.434, 262
\@alph@bul . . . . 57.273 \@textcolor . . . . 62.782 \azc . . . . . . . . . . 47.433
\@arabic . . . . . . 62.326 \@tilde . . . . . . . . 39.52 \azc@ . . . . . . . . . 47.435
\@az . . . . . . . . . . 47.377 \@torl . . . . . . . . 62.246 \azc@@ . . . . . . . . 47.436
\@azc . . . . . . . . . 47.439 \@trema . . . . . . . 19.102 \Azp . . . . . . . 47.421, 262
\@azp . . . . . . . . . 47.423 \@umlaut . . 36.77, 39.52 \azp . . . . . . . . . . 47.420
\@azr . . . . . . . . . 47.410 \@verbatim . . . . 62.946 \azp@ . . . . . . . . . 47.422
\@begintheorem . 47.147 \@xnthm . . . . . . . 62.826 \Azr . . . . . . . 47.406, 261
\@bibitem . . . . . 12.1277 \azr . . . . . . . . . . 47.405
\@biblabel . . . . 62.895 A \azr@ . . . . . . . . . 47.407
\@brackets . . . . 62.315 \AbsoluteFromGregorian \azr@@ . . . . . . . . 47.408
\@caption . 47.81, 62.552 ........ 62.1157 \azr@@@ . . . . . . . 47.409
\@chapter . . 47.212, \AbsoluteFromHebrew
47.286, 62.839 ........ 62.1321 B
\@cite . . . . . . . . 62.895 \Acite . . . . . 47.432, 262 \babel@beginsave 12.800
\@citex . . . . . . . 12.1249 \acite . . . . . . . . 47.431 \babel@save . . 12.803, 13
\@dottedtocline 62.430 \active@prefix . 12.584 \babel@savecnt . 12.800
\@ensure@L . . . . 62.308 \adddialect . . . 10, 12.57 \babel@savevariable
\@ensure@R . . . . 62.308 \addlanguage . . 10, 12.45 . . . . . . 12.812, 13
\@fromrl . . . . . . 62.255 \addto . . . . . . 12.825, 13 \bahasahyphenmins 66.69
\@grave . . . . . . . . 36.77 \afrikaanshyphenmins \bahasamhyphenmins 67.69
\@hebrew . . . . . . . 62.92 . . . . . . . . . 19.101 \basquehyphenmins 39.49
\@hebrew@numeral 62.141 \aliasshorthand 5, 12.638 \bbl@activate 12, 12.596
\@latin . . . . . . . 62.317 \allowhyphens 12.837, 13 \bbl@add@list . . 12.768
\@lbibitem . . . . 62.895 \Alph . . . . . . . . . 62.102 \bbl@add@special . .
\@listoffigures 62.381 \alph . . . . . . . . . 62.102 . . . . . . 12, 12.402
\@listoftables . 62.381 \Alphfinal . . . . 62.102 \bbl@afterelse . 12.423
\@makecaption . . . . . \anw@false . . . . . 27.84 \bbl@afterfi . . . 12.423
. . . . 47.69, 62.949 \anw@print . . . . . 27.84 \bbl@bibcite . . . 12.1268
\@makechapterhead . \anw@true . . . . . . 27.84 \bbl@cite@choice 12.1270
. . . 47.235, 47.305 \Aob . . . . . . . . . . . 52.51 \bbl@clear@ttribs 12.789

464
\bbl@deactivate . . . \bchapternn . . . . 62.969 \captionsportuges 34.34
. . . . . . 12, 12.602 \bibcite . . . . . . 12.1265 \captionsromanian 40.6
\bbl@declare@ttribute \bpart . . . . . . . . 62.955 \captionsrussian 56.121
. . . . . . 11, 12.750 \breton@sh@:@ . . . 23.59 \captionssamin . . . 45.7
\bbl@disc . . . . . 12.849 \breton@sh@;@ . . . 23.48 \captionsscottish 26.6
\bbl@firstcs . . . 12.608 \breton@sh@?@ . . . 23.75 \captionsserbian . 53.6
\bbl@frenchindent . \breton@sh@@ . . . . 23.59 \captionsslovak . 54.34
29.483, 49.54, 53.58 \bsc . . . . . . . . . . 29.236 \captionsslovene . 55.6
\bbl@frenchlabelitems \bsection . . . . . 62.959 \captionsswedish . 44.6
. . . . . . . . . 29.424 \bsectionnn . . . . 62.971 \captionsturkish . 61.6
\bbl@frenchspacing . \bsubsection . . . 62.961 \captionsukrainian .
. . . . . . 12.817, 13 \bsubsubsection 62.963 . . . . . . . . . 58.121
\bbl@get@enc . . . 12.356 \captionsusorbian 60.14
\bbl@hyph@enc . . 12.356 C \captionswelsh . . . 24.7
\bbl@ifattributeset \captionsafrikaans 19.64
\catalanhyphenmins 36.7
. . . . . . . . . 12.754 \captionsalbanian 49.6
\CBgreekCaporali 30.129
\bbl@ifknown@ttrib . \captionsaustrian 21.23
\cdash . . . . . 56.311,
. . . . . . . . . 12.779 \captionsbahasa . 66.35
57.216, 58.290
\bbl@language@stack \captionsbahasam 67.35
\CheckIfDivisible .
. . . . . . . . . . 12.80 \captionsbasque . . 39.7
........ 62.1084
\bbl@main@language . \captionsbrazil . 34.66
\CheckLeapHebrewYear
. . . . . . . . . 12.247 \captionsbreton . . 23.6
........ 62.1168
\bbl@nonfrenchindent \captionsbulgarian .
29.483, 49.54, 53.58 . . . . . . . . . 57.117
\ck . . . . . 21.124, 60.112
\bbl@nonfrenchlabelitems \captionscatalan . 36.8 \clq . . . . . 51.149, 54.214
. . . . . . . . . 29.424 \captionscroatian 50.6 \clqq . . . . 51.134, 54.199
\bbl@nonfrenchspacing \captionsczech . . 51.34 \crq . . . . . 51.149, 54.214
. . . . . . 12.817, 13 \captionsdanish . . 41.7 \crqq . . . . 51.144, 54.209
\bbl@patterns . . 12.173 \captionsdutch . . 19.22 \cs@activatehyphens
\bbl@pop@lang . . . 12.84 \captionsenglish 20.66 ... 51.280, 54.345
\bbl@pop@language . \CaptionSeparator 29.383 \cs@addparam . . . . . .
. . . . . 12.80, 12.81 \captionsesperanto 17.6 ... 51.254, 54.319
\bbl@pr@m@s . . . . 12.691 \captionsestonian 48.7 \cs@boxhyphen . . . . .
\bbl@prim@s . . . . 12.691 \captionsfinnish . 46.6 ... 51.173, 54.238
\bbl@push@language 12.81 \captionsfrench 29.329 \cs@checkchardef . .
\bbl@redefine . . 12.1187 \captionsgerman . 21.23 ... 51.243, 54.308
\bbl@redefine@long . \captionsgreek . . 27.32 \cs@checkcode . . . . .
........ 12.1193 \captionshebrew . 62.22 ... 51.261, 54.326
\bbl@redefinerobust \captionsicelandic 42.25 \cs@checkhyphen . . .
........ 12.1198 \captionsinterlingua ... 51.210, 54.275
\bbl@remove@special . . . . . . . . . . . 18.7 \cs@continuescan . .
. . . . . . 12, 12.412 \captionsirish . . . 25.7 ... 51.217, 54.282
\bbl@restore@actives \captionsitalian . 30.6 \cs@deactivatehyphens
. . . . . . . . . 12.595 \captionslang . . . . . 11 ... 51.280, 54.345
\bbl@scndcs . . . . 12.608 \captionslatin . . 31.16 \cs@emdash 51.168, 54.233
\bbl@set@language 12.96 \captionslsorbian 59.14 \cs@endash 51.168, 54.233
\bbl@sh@select . 12.577 \captionsmagyar . 47.14 \cs@examinechar . . .
\bbl@switch@sh . 12.661 \captionsnaustrian 22.12 ... 51.257, 54.322
\bbl@switch@sh@off . \captionsngerman 22.12 \cs@examinetoken . .
. . . . . . . . . 12.672 \captionsnorsk . . . 43.9 ... 51.224, 54.289
\bbl@switch@sh@on 12.673 \captionsnynorsk 43.35 \cs@expandchar . . . .
\bbl@test@token 12.430 \captionspolish . . 52.6 ... 51.257, 54.322
\bcaption . . . . . 62.965 \captionspolutonikogreek \cs@firsthyph@n . . .
\bchapter . . . . . 62.957 . . . . . . . . . . 27.55 ... 51.192, 54.257

465
\cs@firsthyphen . . . \datecatalan . . . . 36.31 44.51, 51.70,
... 51.192, 54.257 \datecroatian . . . 50.29 52.112,54.83,
\cs@gett@ken . . . . . . \dateczech . . . . . 51.57 56.287,
57.193,
. . . 51.217, 54.282 \datedanish . . . . . 41.30 58.266, 60.68
\cs@gettoken . . . . . . \datedutch . . . . . 19.49 \dutchhyphenmins 19.101
. . . 51.217, 54.282 \dateenglish . . . . 20.89
\cs@hyphen . . . . . . . \dateesperanto . . 17.30 E
51.168, 51.274, \dateestonian . . . 48.34 \EEob . . . . . . . . . . 42.90
54.233, 54.339 \datefinnish . . . . 46.29 \eeob . . . . . . . . . . 42.90
\cs@ignoretoken . . . \datefrench . . . . 29.166 \embox . . . . . . . . 62.313
. . . 51.251, 54.316 \dategerman . . . . . 21.46 \englishhyphenmins .
\cs@looseness . . . . . \dategreek . . . . . 27.64 . . . . . . 20.65, 41.6
. . . 51.290, 54.355 \datehebrew . . . . . 62.77 environments:
\cs@main@language . \dateicelandic . . 42.48 hyphenrules 5, 12.180
. . . 51.295, 54.360 \dateinterlingua 18.30 otherlanguage . .
\cs@nosplit . . . . . . . \dateirish . . . . . 25.30 . . . . . . . 5, 12.134
. . . 51.273, 54.338 \dateitalian . . . . 30.29 otherlanguage* .
\cs@scanword . . . . . . \datelang . . . . . . . . 11 . . . . . . . 5, 12.142
. . . 51.217, 54.282 \datelatin . . . . . 31.39 thebibliography
\cs@secondhyph@n . . \datemagyar . . . . . 47.37 . . . . . . . . . 62.903
. . . 51.192, 54.257 \datengerman . . . . 22.35 \Eob . . . . . . 42.90, 52.51
\cs@secondhyphen . . \datenorsk . . . . . 43.60 \eob . . . . . . 42.90, 52.51
. . . 51.192, 54.257 \datepolish . . . . . 52.29 \Esper . . . . . . . . . 17.53
\cs@selectlanguage . \dateportuges . . . 34.57 \esper . . . . . . . . . 17.53
. . . 51.295, 54.360 \dateromanian . . . 40.30 \estonianhyphenmins
\cs@splitattr . . . . . \daterussian . . . 56.185 . . . . . . . . . . 48.51
. . . 51.277, 54.342 \datesamin . . . . . 45.30 \extrasafrikaans 19.93
\cs@splithyphen . . . \datescottish . . . 26.29 \extrasalbanian . 49.34
. . . 51.174, 54.239 \datesdmy . . . . . . 44.39 \extrasaustrian . 21.53
\cs@tempdisable . . . \dateserbian . . . . 53.29 \extrasbahasa . . . 66.67
. . . 51.310, 54.375 \dateslovak . . . . . 54.57 \extrasbahasam . . 67.67
\cs@undoiltw@ . . . . . \dateslovene . . . . 55.29 \extrasbasque . . . 39.36
. . . 51.352, 54.417 \dateswedish . . . . 44.29 \extrasbreton . . . 23.35
\cs@wordlen . . . . . . . \datesymd . . . . . . 44.36 \extrasbulgarian 57.181
. . . 51.167, 54.232 \dateturkish . . . . 61.30 \extrascatalan . . 36.37
\cyrdash . . . 56.326, \dateukrainian . 58.162 \extrascroatian . 50.34
57.231, 58.305 \datewelsh . . . . . 24.31 \extrasczech . . . . 51.62
\CyrillicCaporali 30.129 \DaysInHebrewYear . \extrasdanish . . . 41.35
\cyrillictext 56.111, . . . . . . . . 62.1264 \extrasdutch . . . . 19.93
57.111, 58.111 \DecimalMathComma 29.282 \extrasenglish . 20.133
\decimalsep . . . . 42.106 \extrasesperanto 17.35
D \declare@shorthand . \extrasestonian . 48.44
\dateafrikaans . . 19.86 . . . . . . 12, 12.610 \extrasfinnish . . 46.35
\datealbanian . . . 49.29 \defineshorthand . . \extrasfrench . . . 29.51
\dateamerican . . 20.125 . . . . . . . 5, 12.636 \extrasgerman . . . 21.53
\dateanustrian . . 22.40 \degres . . . . . . . 29.260 \extrasgreek . . . . 27.80
\dateaustralian 20.117 \dieresia . . . . . . 39.50 \extrashebrew . . . 62.78
\dateaustrian . . . 21.51 \dieresis . . . . . . 36.74 \extrasicelandic 42.18
\datebahasa . . . . . 66.62 \DisableNikud . . 63.243 \extrasinterlingua 18.36
\datebahasam . . . . 67.62 \DJ . . . . . . . . . . 12.907 \extrasirish . . . . 25.38
\datebasque . . . . . 39.30 \dj . . . . . . . . . . 12.907 \extrasitalian . . 30.35
\datebrazil . . . . . 34.89 \doc@style . . . . 12.1023 \extraslang . . . . . . . 11
\datebreton . . . . . 23.29 \dq . . . 21.70, 22.59, \extraslatin . . . . 31.49
\datebulgarian . 57.161 42.54, 43.75, \extraslsorbian . 59.59

466
\extrasmagyar . . . 47.59 \gim . . . . . . . . . . 62.200 \HebrewElapsedMonths
\extrasnaustrian 22.42 \gim@nomil . . . . 62.151 . . . . . . . . 62.1182
\extrasngerman . . 22.42 \gim@print . . . . 62.193 \hebrewencoding . . 62.7
\extrasnorsk . . . . 43.66 \glq . . . . . . . . . . 12.933 \HebrewFromGregorian
\extrasnynorsk . . 43.66 \glqq . . . . . . . . . 12.945 . . . . . . . . 62.1331
\extraspolish . . . 52.35 \gr@c@greek . . . . . 27.71 \hebrewhyphenmins 62.21
\extrasportuges . 34.97 \gr@ill@value . . . 27.82 \HebrewMonthName 62.1025
\extrasromanian . 40.36 \gr@month . . . . . . 27.64 \HebrewMonthNameInEnglish
\extrasrussian . 56.200 \gr@num@i . . . . . 27.139 . . . . . . . . 62.1053
\extrassamin . . . . 45.46 \gr@num@ii . . . . 27.139 \Hebrewnumeral . . 62.96
\extrasscottish . 26.37 \gr@num@iii . . . . 27.139 \hebrewnumeral . . 62.96
\extrasserbian . . 53.34 \gr@num@iv . . . . 27.148 \Hebrewnumeralfinal
\extrasslovak . . . 54.63 \gr@num@v . . . . . 27.148 . . . . . . . . . . 62.96
\extrasslovene . . 55.34 \gr@num@vi . . . . 27.148 \Hebrewsetreg . . 62.995
\extrasswedish . . 44.43 \gradur . . . . . . . 42.193 \hebrewtext . . . . . 62.86
\extrasturkish . . 61.36 \greek@Alph . . . . 27.115 \Hebrewtoday 62.993, 410
\extrasukrainian 58.177 \greek@alph . . . . 27.115 \HebrewYearName 62.1004
\extrasusorbian . 60.51 \greek@amp . . . . 27.135 \hhline . . . . . . . 12.1356
\extraswelsh . . . . 24.38 \greek@Roman . . . 27.125 \hmbox . . . . . . . . 62.313
\greek@roman . . . 27.125 \hodiau . . . . . . . . 17.63
F \greek@tilde . . . 27.160 \hodiaun . . . . . . . 17.63
\FBprocess@options . \greekhyphenmins 27.30 \hun@alph@lehgth 47.453
. . . . . . . . . 29.737 \Greeknumeral 27.113, 110 \hun@number@lehgth .
\FBtextellipsis 29.550 \greeknumeral 27.89, 110 . . . . . . . . . 47.447
\FDP@thinspace . . . . \greektext . 27.24, 109 \hun@tempadef . . 47.381
... 56.268, 58.247 \GregorianDaysInPriorMonths \hunnewlabel . . . 47.539
\FDPoff . . 56.272, 58.251 . . . . . . . . 62.1113 hyphenrules (environ-
\FDPon . . . 56.272, 58.251 \GregorianDaysInPriorYears ment) . . 5, 12.180
\fg . . . . . . . . . . 29.129 ........ 62.1137
\finishhyphenmins 46.66 \grq . . . . . . . . .
. 12.933 I
\flq . . . . . . . . . . 12.957 \grqq . . . . . . . .
. 12.945 \ieme . . . . . . . . . 29.214
\flqq . . . . . . . . . 12.967 \Grtoday . . . . .. . 27.76 \iemes . . . . . . . . 29.214
\fnum@figure . . . . 47.63 \guillemotleft .... \ier . . . . . . . . . . 29.214
\fnum@table . . . . . 47.63 . . . 12.861, 29.131 \iere . . . . . . . . . 29.214
\footnoterule . . 62.634 \guillemotright . . . \ieres . . . . . . . . 29.214
\foreign@language 12.157 . . . 12.861, 29.131 \iers . . . . . . . . . 29.214
\FOREIGNLANGUAGE 12.1371 \guilsinglleft . 12.879 \if@gim@apost . . . 62.94
\foreignlanguage . . \guilsinglright 12.879 \if@gim@final . . . 62.94
. . . . . . . 5, 12.148 \if@gim@prev . . . 62.193
\FormatDate . . . . 62.998 H \if@rl . . . . . . . . 62.237
\FormatForEnglish . \headeven . . . . . 62.637 \if@rlmain . . . . 62.238
........ 62.1075 \headodd . . . . . . 62.637 \if@safe@actives 12.593
\FormatForHebrew 62.1050 \hebdate . . . . . . . 62.73 \if@Two@E . . . . . . 42.11
\fprimo) . . . . . . 29.220 \hebday . . . . . . . . 62.76 \IfGregorianLeap 62.1095
\frenchbsetup . . 29.593 \HeblatexRedefineL . \iflanguage . . . 5, 12.60
\FrenchLayout . . 29.531 . . . . . . . . . 62.293 \ifLaTeXe . . . . . . . 29.3
\fromhebrew . . . . . 62.90 \hebmonth . . . . . . 62.61 \ifthenelse . . . . 12.1325
\frq . . . . . . . . . . 12.957 \hebr . . . . . . . . . 62.200 \ifundefined . . . 62.1093
\frqq . . . . . . . . . 12.967 \Hebrewdate . 62.985, 410 \IJ . . . . . . . . . . 12.897
\full . . . . . . . . . . . 410 \HebrewDayName . 62.1049 \ij . . . . . . . . . . 12.897
\fup . . . . . . . . . . 29.173 \HebrewDaysInPriorMonths \initiate@active@char
. . . . . . . . 62.1274 . . . . . . 12, 12.423
G \HebrewElapsedDays . \interlinguahyphenmins
\gentilde . . . . . . 48.52 ........ 62.1207 . . . . . . . . . . . 18.6

467
\irishhyphenmins . 25.6 \lower@umlaut . . 12.987 \noextrasgerman . 21.53
\it@ccap . . . . . . 30.101 \lrlistoffigures 62.418 \noextrasgreek . . 27.80
\it@cwm . . . 30.49, 30.57 \lrlistoftables 62.418 \noextrashebrew . 62.81
\it@ocap . . . . . . 30.101 \lrtableofcontents . \noextrasicelandic 42.18
\italianhyphenmins 30.34 . . . . . . . . . 62.418 \noextrasinterlingua
\itemizeFB . . . . 29.424 \ltx@amp . . . . . . 27.135 . . . . . . . . . . 18.36
\itemizeORI . . . . 29.424 \LtxSymbCaporali 30.101 \noextrasirish . . 25.38
\noextrasitalian 30.35
L M \noextraslang . . . . . 11
\L . . . . . . . . . . . 62.293 \main@language 11, 12.247 \noextraslatin . . 31.49
\L.L . . . . . . . . . . 36.187 \make@lr . . . . . . 62.330 \noextraslsorbian 59.59
\l.l . . . . . . . . . . 36.187 \MakeLowercase . 62.817 \noextrasmagyar . 47.59
\l@chapter . . . . 62.573 \MakeUppercase . 62.817 \noextrasnaustrian 22.42
\l@paragraph . . . 62.591 \markboth . . . . . 12.1293 \noextrasngerman 22.42
\l@part . . . . . . . 62.450 \markright . . . . 12.1279 \noextraspolish . 52.35
\l@section . . . . 62.591 \mathalbanian . . . 49.63 \noextrasportuges 34.97
\l@subparagraph 62.591 \mathserbian . . . . 53.67 \noextrasromanian 40.36
\l@subsection . . 62.591 \mdqoff 21.124, 22.90, \noextrassamin . . 45.46
\l@subsubsection 62.591 52.159, 56.331,
\noextrasscottish 26.37
\label . . . 47.519, 62.112 58.310, 60.112
\noextrasserbian 53.34
\labelenumii . . . 62.379 \mdqon 21.124, 22.90,
\noextrasslovak . 54.63
\langhyphenmins . . . 11 52.159, 56.331,
\noextrasslovene 55.34
\language . . . . . . 12.37 58.310, 60.112
\noextrasswedish 44.43
\language@group 12.626
\languageattribute . N \noextrasturkish
\noextraswelsh . . 24.38
61.36
. . . . . . . 6, 12.718 \newcheck . . . . . . 48.52
\languagename . . . . . . 5 \newdatelsorbian 59.37 \nohebrewtext . . . 62.86
\languageshorthands \newdateusorbian 60.37 \nombre . . . . . . . 29.297
. . . . . . . 5, 12.637 \newlabel . . . . . 12.1210 \norskhyphenmins . 43.6
\last@language . . 12.40 \newtilde . . . . . . 48.52 \Nos . . . . . . . . . . 29.220
\LaTeX . . 12.1321, 62.349 \nfss@catcodes . 12.1374 \nos . . . . . . . . . . 29.220
\LaTeXe . . . . . . . 62.351 \No . . . . . . . . . . 29.220
\latinencoding 12.12, \no . . . . . . . . . . 29.220 O
56.7, 57.7, 58.7 \NoAutoSpaceBeforeFDP \og . . . . . . . . . . 29.129
\latinhyphenmins 31.48 . . . . . . 29.110, \olddatelsorbian 59.43
\LatinMarksOff . . 32.50 56.268, 58.247 \olddateusorbian 60.43
\LatinMarksOn . . . 32.50 \nocite . . . . . . . 12.1263 \ondatemagyar . . . 47.45
\latintext . . . . . . . \noextrasafrikaans 19.93 \ontoday . . . . . . . . 261
. 12.22, 56.111, \noextrasalbanian 49.34 \Oob . . . . . . . . . . . 42.90
57.111, 58.111, 109 \noextrasaustrian 21.53 \oob . . . . . . . . . . . 42.90
\Lcaron . . . 51.83, 54.154 \noextrasbahasa . 66.67 \OOob . . . . . . . . . . 42.90
\lcaron . . . 51.83, 54.154 \noextrasbahasam 67.67 \ooob . . . . . . . . . . 42.90
\ldf@finish . . 12, 12.238 \noextrasbasque . 39.36 \ord . . . . . . . . . . 34.114
\ldf@quit . . . 12, 12.232 \noextrasbreton . 23.35 \orda . . . . . . . . . 34.114
\LdfInit . . . . 12, 12.200 \noextrascatalan 36.37 \originalTeX . . . 12.259
\Lgem . . . . . . . . . 36.147 \noextrascroatian 50.34 \OT1dqpos . . . . . 12.713
\lgem . . . . . . . . . 36.147 \noextrasczech . . 51.62 otherlanguage (envi-
\list . . . . . . . . . 62.353 \noextrasdanish . 41.35 ronment) 5, 12.134
\listFB . . . . . . . 29.412 \noextrasdutch . . 19.93 otherlanguage* (envi-
\listoffigures . 62.424 \noextrasenglish 20.133 ronment) 5, 12.142
\listoftables . . 62.424 \noextrasesperanto 17.35
\listORI . . . . . . 29.412 \noextrasestonian 48.44 P
\loadlocalcfg . 12, 13.1 \noextrasfinnish 46.35 \p@enumiii . . . . 62.379
\looseness 51.290, 54.355 \noextrasfrench . 29.51 \pageref . . . . . . 12.1245

468
\pdfstringdefDisableCommands \save@sf@q . . 12.844, 13 \textgreek . 27.27, 109
. . . . . . . . 12.1364 \selectlanguage . . . \textjm . . . . . . . 64.473
\ped . . . . . . . . . . . 30.84 . . 5, 12.70, 62.262 \textlatin . . . . . . .
\peek@token . . . . 12.425 \set@hyphenmins 12.199 . 12.25, 56.115,
\polishrz . . . . . 52.130 \set@low@box . 12.841, 13 57.115, 58.115, 109
\polishzx . . . . . 52.130 \set@outputdblcol 62.597 \textoj . . . . . . . 64.507
\portugeshyphenmins \sethebrew . . . . . 62.84 \textol . . . . 27.28, 109
. . . . . . . . . . 34.96 \SetLatinLigatures 31.61 \textormath . . . . 12.620
\primo . . . . . . . . 29.220 \setrllanguage . 62.281 \textpl . . . . . . . . 52.78
\process@language 12.318 \shorthandoff . 5, 12.659 \textredis . . . . 64.511
\process@line . . 12.296 \shorthandon . . 5, 12.659 \textshold . . . . 64.513
\process@synonym 12.303 \skb . . . . . . . . . . . 52.71 \textshscr . . . . 64.514
\ProsodicMarks . . 32.21 \slidelabel . . . . . 62.56 \textshstk . . . . 64.515
\ProsodicMarksOff 32.1 \sob . . . . . . 42.82, 52.43 \textta . . . . . . . 64.508
\ProsodicMarksOn . 32.1 \spb . . . . . . . . . . . 52.63 \texttilde . . . . . 39.50
\providehyphenmins . \splithyphens . . . . . thebibliography (envi-
. . . . . . 11, 12.195 . . . 51.275, 54.340 ronment) . 62.903
\ProvidesLanguage . \sq . . . . . . 51.70, 54.83 \theenumii . . . . 62.112
. . . . . . . . 10.1, 12 \SS . . . . . . . . . . 12.931 \theenumiv . . . . 62.112
\ps@headings 47.155, \standardhyphens . . \thousandsep . . . 42.106
47.253,
47.321, ... 51.275, 54.340 \tildelow . . . . . . 48.52
47.356, 62.637 \StandardLayout 29.531 \todayRoman . . . . 57.179
\ps@myheadings . 62.637 \StandardMathComma . \tohebrew . . . . . . 62.90
. . . . . . . . . 29.282 \turkish@sh@:@ . . 61.44
Q \substitutefontfamily \turkish@sh@@ . . . 61.44
\quotedblbase . . 12.851 . . . . . . 11.106, 12
\quotesinglbase 12.856 \swedishhyphenmins 44.42 U
\system@group . . 12.626 \ukrainian@sh@:@ 58.210
R \system@sh@:@ . . . . . \ukrainian@sh@;@ 58.210
\R . . . . . . . . . . . 62.293 ... 56.280, 58.259 \ukrainian@sh@?@ 58.210
\ra . . . . . . . . . . 34.114 \system@sh@;@ . . . . . \ukrainian@sh@@ 58.210
\raggedleft . . . . 62.805 ... 56.280, 58.259 \umlauthigh . . . . 12.977
\raggedright . . . 62.805 \system@sh@?@ . . . . . \umlautlow . . . . 12.977
\readconfigfile 12.365 ... 56.280, 58.259 \underline . . . . 62.821
\Ref . . . . . . . . . . 12.1342 \system@sh@@ . . . . . . \unit . . . . . . . . . . 30.84
\ref . . . . . . . . . . 12.1245 ... 56.280, 58.259 \unsethebrew . . . . 62.84
\refstepcounter 47.514 \unsetrllanguage 62.281
\Remainder . . . . 62.1078 T \up . . . . . 29.173, 36.194
\rl@outputdblcol 62.597 \T1dqpos . . . . . . 12.713 \upp . . . . . . . . . . 42.155
\rllistoffigures 62.421 \T@unoCaporali . 30.129 \upp@size . . . . . 42.155
\rllistoftables 62.421 \tableofcontents 62.424 \user@group . . . . 12.626
\rltableofcontents . \tala . . . . . . . . . 42.115 \useshorthands 5, 12.629
......... 62.421 \telepl . . . . . . . . 52.87 \uv . . . . . 51.159, 54.224
\ro . . . . . . . . .
. 34.114 \TeX . . . . 12.1321, 62.347
\romandate . . . .. 31.48 \textacute . . . . . 36.74 V
\russian@sh@:@ . 56.231 \textclas . . . . . 64.512 \v . . . . . . . 51.76, 54.147
\russian@sh@;@ . 56.231 \textcrml . . . . . 64.509 \verbatim@font . . . .
\russian@sh@?@ . 56.231 \textcyrillic 56.115, ... 56.202, 58.181
\russian@sh@@ . . 56.231 57.115, 58.115 \vrefpagenum . . . 12.1342
\textds . . . . . . . 64.506
S \textfr . . . . . . . 64.510 W
\saminhyphenmins . 45.6 \textgrave . . . . . 36.74 \welshhyphenmins . 24.6

469
Change History
3.0
\clqq: Added \leavevmode to allow an opening quote at the beginning of a
paragraph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293, 317

albanian-1.0a
General: Started rst version of the le . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
albanian-1.0b
General: A number of corrections in the translations from Adi Zaimi . . . . . . 283
albanian-1.0c
General: Small documentation x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283

babel 2.0a
General: Added text about german.sty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
babel 2.0b
General: Changed order of code to prevent plain TEXfrom seeing all of it . . . . . 1
babel 2.1
General: Modied user interface, \langTeX no longer necessary . . . . . . . . . . . . 1
babel 2.1a
General: Incorporated Nico's comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
babel 2.1b
General: rename \language to \current@language . . . . . . . . . . . . . . . . . . . . . 1
babel 2.1c
General: abstract for report xed, missing }, found by Nicolas Brouard . . . . . . 1
babel 2.1d
General: Missing right brace in denition of abstract environment, found by
Werenfried Spit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
babel 2.1e
General: Incorporated more comments from Nico . . . . . . . . . . . . . . . . . . . . . . 1
babel 2.2
General: Renamed \newlanguage to \addlanguage . . . . . . . . . . . . . . . . . . . . . 1
babel 2.2a
General: Modied the documentation somewhat . . . . . . . . . . . . . . . . . . . . . . . 1
babel 3.0
General: Moved part of the code to hyphen.doc in preparation for TEX 3.0 . . . . 1
babel 3.0a
General: Updated comments in various places . . . . . . . . . . . . . . . . . . . . . . . . . 1
\iflanguage: Added \@bsphack and \@esphack . . . . . . . . . . . . . . . . . . . . . . 22
\selectlanguage: Added \@bsphack and \@esphack . . . . . . . . . . . . . . . . . . . 24
Replaced \gdef with \def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
babel 3.0b
General: Removed some problems in change log . . . . . . . . . . . . . . . . . . . . . . . 1
babel 3.0c
General: Renamed babel.sty and latexhax.sty to .com . . . . . . . . . . . . . . . . . 1
\iflanguage: Added comment character after #2 . . . . . . . . . . . . . . . . . . . . . 22
\selectlanguage: Made \selectlanguage robust . . . . . . . . . . . . . . . . . . . . . 23
babel 3.0d
\@noopterr: Added a percent sign to remove unwanted white space . . . . . . . . 30
General: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
\doc@style: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . 57
\iflanguage: Removed space hacks and use of \@ifundefined . . . . . . . . . . . 22
Removed superuous \expandafter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
\process@language: Added the collection of pattern names. . . . . . . . . . . . . . 32

470
Reinserted \expandafter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Removed superuous \expandafter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
\selectlanguage: Removed space hacks and use of \@ifundefined . . . . . . . . 24
Removed superuous \expandafter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
babel 3.1
General: Added the support for active characters and for extending a macro . . . 1
Removed denition of \if@restonecol . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Removed the need for latexhax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
\addto: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
\readconfigfile: Removed the extra if control sequence . . . . . . . . . . . . . . . 34
Removed use of \toks0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
\selectlanguage: \originalTeX should only be executed once . . . . . . . . . . . 25
babel 3.2
General: Some Changes by br . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
\adddialect: Added \relax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
\addlanguage: Added a %, removed by . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
\babel@beginsave: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
\babel@save: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
\babel@savecnt: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
\babel@savevariable: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
\bbl@add@special: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
\bbl@remove@special: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
\iflanguage: Rephrased \ifnum test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
\selectlanguage: Modied to allow arguments that start with an escape char-
acter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
babel 3.2a
General: Fixups of the code and documentation . . . . . . . . . . . . . . . . . . . . . . . 1
\originalTeX: Set \originalTeX to \empty, because it should be expandable. 30
\readconfigfile: Free macro space for \process@language . . . . . . . . . . . . . 35
\selectlanguage: Added \relax as rst command to stop an expansion if
\protect is empty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Added three \expandafters to save macro space for \originalTeX . . . . . . . 25
Moved denition of \originalTeX before \extrashlang i . . . . . . . . . . . . . . 25
Set \originalTeX to \empty, because it should be expandable. . . . . . . . . . . 25
Simplied the modication to allow the use in a \write command . . . . . . . 23
babel 3.2b
\allowhyphens: Moved macro from language denition les . . . . . . . . . . . . . . 50
\save@sf@q: Moved macro from language denition les . . . . . . . . . . . . . . . . 51
\set@low@box: Moved macro from language denition les . . . . . . . . . . . . . . . 51
babel 3.2c
\babel@save: missing backslash led to errors when executing \originalTeX . . 49
babel 3.2d
\babel@save: saving in \babel@i and restoring from \@babel@i doesn't work
very well... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
babel 3.2e
General: Added slovak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
babel 3.3
General: \headpagename should be \pagename . . . . . . . . . . . . . . . . . . . . . . . . 61
Added catalan and galician . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Added turkish . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Included driver le, and prepared for distribution . . . . . . . . . . . . . . . . . . . . 1
babel 3.4
General: Added bahasa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Added language denition le for bahasa . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

471
Updated for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
\addto: Changed to use toks register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
babel 3.4b
General: Added a small driver to be able to process just this le . . . . . . . . . . . 1
Use the ltxdoc class instead of article . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
babel 3.4c
General: lhyphen.cfg has become lthyphen.cfg . . . . . . . . . . . . . . . . . . . . . . . . 15
babel 3.4e
\@nolanerr: Use \PackageError in LATEX 2ε mode . . . . . . . . . . . . . . . . . . . . 30
\@nopatterns: Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
\process@language: Added code to detect assignments to left- and righthyphen-
min in the patternle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
\ProvidesLanguage: Redid the identication code, provided dummy denition of
\ProvidesFile for plain TEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
babel 3.4g
\@testdef: Moved the \def inside the macrocode environment . . . . . . . . . . . 63
babel 3.5a
\@noopterr: Added \@activated to log active characters . . . . . . . . . . . . . . . . 30
General: Added a system shorthand for the right quote . . . . . . . . . . . . . . . . . 45
Added breton, irish, scottish . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Changed extension of language denition les to ldf . . . . . . . . . . . . . . . . . 16
Provided common code to handle the active double quote . . . . . . . . . . . . . . 1
Replaced 16 system shorthands to deal with hex numbers by one . . . . . . . . 45
\bbl@activate: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
\bbl@deactivate: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
\bbl@main@language: Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
\bbl@pr@m@s: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
\bbl@set@language: write the language change to the auxiliary les . . . . . . . . 24
\initiate@active@char: Added a check for right quote and adapt \pr@m@s if
necessary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
\main@language: Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
babel 3.5b
General: Added brazilian as alternative for brazil . . . . . . . . . . . . . . . . . . . . . . 16
Added lsorbian, usorbian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Added the estonian option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
lthyphen.cfg has become hyphen.cfg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
\initiate@active@char: Renamed macro . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
\pageref: Made \ref and \pageref robust (PR1353) . . . . . . . . . . . . . . . . . . 64
\process@language: Added optional reading of le with hyphenation exceptions 33
\process@line: added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
\process@synonym: added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
\readconfigfile: Now add a \space and a / character . . . . . . . . . . . . . . . . . 34
\selectlanguage: Added an extra level of expansion to separate the switching
mechanism from writing to aux les . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Addedd default setting of hyphenmin parameters . . . . . . . . . . . . . . . . . . . . 25
Changed the name of the internal macro to \selectlanguage . . . . . . . . . . 23
Separated the setting of the hyphenmin values . . . . . . . . . . . . . . . . . . . . . . 25
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
\selectlanguage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
babel 3.5c
\@noopterr: Added missing closing brace . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
General: Changed the order of including the language les somewhat (PR1652) 73

472
corrected a few typos (PR1652) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Repaired a typo (itlaic, PR1652) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
babel 3.5d
General: Added british as an alternative for english with a preference for british
hyphenation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Added options to inuence behaviour of active acute and grave accents . . . . 18
Load french.ldf when it is found instead of frenchb.ldf . . . . . . . . . . . . . 16
Load language denition les after the check for the hyphenation patterns . 16
Merged glyphs.dtx into this le . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
\active@prefix: \@protected@cmd has vanished from ltoutenc.dtx . . . . . . . 41
\declare@shorthand: Make a `note' when a shorthand with an argument is de-
ned. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
\foreignlanguage: Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
\initiate@active@char: Skip the language-level active char with argument if no
shorthands with arguments were dened . . . . . . . . . . . . . . . . . . . . . . . . . 40
Skip the user-level active char with argument if no shorthands with arguments
were dened . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
\loadlocalcfg: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
\pageref: use a dierent control sequence while making \ref and \pageref ro-
bust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
otherlanguage: environment added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
babel 3.5e
otherlanguage: changed name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
babel 3.5f
\@bibitem: Now use \bbl@redefine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
\@citex: Now use \bbl@redefine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
\@testdef: Complete rewrite of this macro as the same character ended up with
dierent category codes in the labels that are being compared. Now use
\meaning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Now use \bbl@redefine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Use \strip@prefix only on \bbl@tempa when it is not \relax . . . . . . . . . . 63
General: Added a system shorthand for the left quote . . . . . . . . . . . . . . . . . . 45
Added the greek option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
No need to reset the category code of the tilde as \initiate@active@char now
correctly deals with active characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Now use the le frenchb.ldf from Daniel Flipo for french support . . . . . . . 16
repaired a typo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
replaced \tmp, \bbl@tmp and \bbl@temp with \bbl@tempa . . . . . . . . . . . . . . 1
\aliasshorthand: New command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
\bbl@disc: Macro moved from language denition les . . . . . . . . . . . . . . . . . 51
\bbl@redefine: Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
\bbl@redefinerobust: Dene \*foo instead of \foo . . . . . . . . . . . . . . . . . . . 62
Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
\bbl@set@language: Now also dene \languagename at this level . . . . . . . . . . 24
\bbl@test@token: macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
\bibcite: Now use \bbl@redefine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
\DJ: New denition of \dj, see PR 2058 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
\frq: corrected spelling of \quilsingl... . . . . . . . . . . . . . . . . . . . . . . . . . . 54
now use \textormath in these denitions . . . . . . . . . . . . . . . . . . . . . . . . . 54
\frqq: corrected spelling of \quillemot... . . . . . . . . . . . . . . . . . . . . . . . . . . 54
now use \textormath in these denitions . . . . . . . . . . . . . . . . . . . . . . . . . 54
\initiate@active@char: Deal correctly with already active characters, provide
top level expansion and dene all lower level expansion macros outside of the
\else branch. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

473
restore the \lccode of the tie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Restore the category code of a shorthand char at end of package . . . . . . . . 38
store the \lccode of the tie before changing it . . . . . . . . . . . . . . . . . . . . . . 38
use \peek@token to check whether it is safe to proceed . . . . . . . . . . . . . 40, 41
\lower@umlaut: Added a \allowhyphens . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
removed \allowhyphens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
\newlabel: Now use \bbl@redefine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
\nocite: Now use \bbl@redefine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
\pageref: Now use \bbl@redefinerobust . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
redene \*ref if it exists instead of \ref . . . . . . . . . . . . . . . . . . . . . . . . . . 64
redene \setref instead of \ref and \pageref in LATEX 2ε . . . . . . . . . . . . . 64
Reverse the previous change as it inhibits the use of active characters in labels 64
\peek@token: macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
\process@language: Use \empty instead of \@empty as the latter is unknown in
plain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
\ProvidesLanguage: Need to temporarily change the denition of \ProvidesFile
for December 1995 release . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Store version in \fileversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
\readconfigfile: Moved the ddling with \dump to bbplain.dtx as it is no
longer needed for LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
\selectlanguage: Added a missing percent character . . . . . . . . . . . . . . . . . . 23
Moved check for escape character one level down in the expansion . . . . . . . 23
otherlanguage*: environment added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
babel 3.5g
General: Added denition of \Babel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Added greek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Added option afrikaans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Removed the use of \patterns@loaded altogether . . . . . . . . . . . . . . . . . . . 31
replaced \undefined with \@undefined to be consistent with LATEX . . . . . . . 1
\ifthenelse: Redenition of \ifthenelse added to circumvent problems with
\pageref in the argument of \isodd . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
\initiate@active@char: Top level expansion of \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 . . . . . . . . . . . . . . . . . 37
\nfss@catcodes: Need to add the double quote and acute characters to \nfss@catcodes
to prevent problems when reading in .fd les . . . . . . . . . . . . . . . . . . . . . . 69
\process@line: Simplied code, removing \bbl@eq@ . . . . . . . . . . . . . . . . . . . 31
\ProvidesLanguage: Save a few csnames; use \bbl@tempa instead of \ProvidesFile
and store message in \toks8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
babel 3.6a
\@@vpageref: Redenition of \@@vpageref added to circumvent problems with
active : in the argument of \vref when varioref is used . . . . . . . . . . . . . 68
General: Added welsh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Removed \babel@core@loaded, no longer needed with the advent of \LdfInit 19
\ldf@finish: Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
\ldf@quit: Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
\LdfInit: Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
\main@language: \main@language now also sets \languagename and \l@languagename
for use by other packages in the preamble of a document . . . . . . . . . . . . . . 30
\selectlanguage: Check for the existence of \date... instead of \l@... . . . 24
babel 3.6b
\addto: Also check if control sequence expands to \relax . . . . . . . . . . . . . . . 50
babel 3.6c
General: When \LdfInit is undened we need to load babel.def from babel.sty 16

474
\bbl@main@language: When hyphen.cfg is not loaded in the format \l@english
might not be dened; assume english is language 0 . . . . . . . . . . . . . . . . . . 30
babel 3.6d
\foreign@language: Added \relax to prevent disappearance of the rst token
after this command. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
New macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
set the language shorthands to `none' before switching on the extras . . . . . . 27
\foreignlanguage: Introduced \foreign@language . . . . . . . . . . . . . . . . . . . . 26
\selectlanguage: set the language shorthands to `none' before switching on the
extras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
otherlanguage*: Introduced \foreign@language . . . . . . . . . . . . . . . . . . . . . 26
babel 3.6e
General: Added option frenchb an alias for francais . . . . . . . . . . . . . . . . . . . . 16
Added options UKenglish and USenglish . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
babel 3.6f
General: Added option KeepShorthandsActive . . . . . . . . . . . . . . . . . . . . . . . . . 18
\bbl@redefine@long: Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
\ifthenelse: \ifthenelse needs to be long . . . . . . . . . . . . . . . . . . . . . . . . . 67
\initiate@active@char: Made restoring of the category code of shorthand char-
acters optional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
babel 3.6h
\readconfigfile: Added a couple of \expandafters to copy the contents of
\toks8 into \everyjob instead of the reference . . . . . . . . . . . . . . . . . . . . . 35
babel 3.6i
\@newl@bel: Now redene \@newl@bel instead of \@lbibitem and \newlabel . 62
\@testdef: \@safe@activesfalse is now part of the label denition . . . . . . . 63
Make sure that shorthands don't get expanded at the wrong moment. . . . . 63
General: Added basque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Added default option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Added the Basque option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Added the ukrainian option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Added the possibility to have a bblopts.cfg le with option declarations. . 17
\bbl@afterfi: Made \bbl@afterelse and \bbl@afterfi \long . . . . . . . . . . . 36
\bbl@test@token: renamed \bbl@token to \bbl@test@token to prevent a clash
with ArabTEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
\declare@shorthand: Make it possible to distinguish the constructed control se-
quences for the case with argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
\ifthenelse: Now reset the @safe@actives switch inside the 2nd and 3rd argu-
ments of \ifthenelse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
\initiate@active@char: Make shorthands active during .aux le processing . 39
Remove the use of \peek@token again . . . . . . . . . . . . . . . . . . . . . . . . . . 40, 41
Remove the use of \peek@token again and make the \...active@arg... com-
mands \long . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
\latinencoding: Macro added, moved from .ldf les . . . . . . . . . . . . . . . . . . 19
\latintext: Macro added, moved from .ldf les . . . . . . . . . . . . . . . . . . . . . 20
\markright: Added redenition of \mark... commands . . . . . . . . . . . . . . . . 65
\peek@token: Renamed \test@token to \bbl@test@token to prevent a clash with
ArabTEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
\system@group: Have a user group called `user' by default . . . . . . . . . . . . . . . 43
\textlatin: Macro added, moved from .ldf les . . . . . . . . . . . . . . . . . . . . . 20
babel 3.6k
\latinencoding: Use T1 encoding when it is a known encoding . . . . . . . . . . . 20

475
babel 3.6l
General: Don't load babel.def now, but rather dene \LdfInit temporarily in
order to load babel.def at the right time, preventing problems with the
temporary denition of \bbl@redefine . . . . . . . . . . . . . . . . . . . . . . . . . . 16
babel 3.6m
\latinencoding: Can't use \@ifpackageloaded need to parse \@filelist . . . 20
babel 3.6n
\latinencoding: Added a check for `manual' selection of T1 encoding, without
loading fontenc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
moved checking for fontenc right to the top of babel.sty . . . . . . . . . . . . . . 20
babel 3.6o
General: Moved the rest of the font encoding related denitions to their original
place . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
babel 3.6p
General: Added the ngerman and naustrian options . . . . . . . . . . . . . . . . . . . . 17
babel 3.6q
\latinencoding: Better solution then parsing \@filelist, use \@ifl@aded . . 20
babel 3.6r
General: We do
need to load babel.def right now as \ProvidesLanguage needs
to be dened before the .ldf les are read and the reason for for 3.6l has
been removed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
babel 3.6s
\bibcite: Need to determine `online' which denition of \bibcite is needed . 64
babel 3.6u
\latinencoding: Moved this code to babel.def . . . . . . . . . . . . . . . . . . . . . . 20
babel 3.6v
\bbl@bibcite: Macro \bbl@bibcite added . . . . . . . . . . . . . . . . . . . . . . . . . . 65
\bbl@cite@choice: Macro \bbl@cite@choice added . . . . . . . . . . . . . . . . . . . 65
\bibcite: Also check for cite it can't handle \@safe@activesfalse in its second
argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
babel 3.7a
\@newl@bel: Call \@safe@activestrue directly . . . . . . . . . . . . . . . . . . . . . . . 62
\@testdef: Removed \@safe@activesfalse from the label denition . . . . . . . 63
General: Added icelandic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Added the hebrew option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Added the icelandic option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Added the polutonikogreek option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
No longer dene the control sequence \KeepShorthandsActive . . . . . . . . . . 18
Now need packages t1enc and supertabular to be loaded; the documentation
for icelandic needs its .ldf le to be present . . . . . . . . . . . . . . . . . . . . . . 71
\allowhyphens: Make \allowhyphens a no-op for T1 fontencoding . . . . . . . . . 50
\bbl@switch@sh: Added command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
\foreignlanguage: Added executing \originalTeX . . . . . . . . . . . . . . . . . . . . 26
\grq: Make the denition of \grq dependent on the font encoding . . . . . . . . . 54
\grqq: Make the denition of \grqq dependent on the font encoding . . . . . . . 54
\iflanguage: Now evaluate the \ifnum test after the \fi from the \ifx test and
use \@firstoftwo and \@secondoftwo . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
\initiate@active@char: Commented out peek@token and \test@token as short-
hands are made expandable again . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Use \@ifpackagewith to determine whether shorthand characters need to re-
main active . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
\LaTeX: Make TEX and LATEX logos encoding-independent . . . . . . . . . . . . . . . 67
\process@language: Read pattern les in a group . . . . . . . . . . . . . . . . . . . . . 32

476
\ProvidesLanguage: Added macro to prevent problems with unexpected \ProvidesFile
in plain formats because of babel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Removed superuous braces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
\shorthandoff: Added command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
\shorthandon: Added command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
babel 3.7b
General: Added Latin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Added the latin option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
\iflanguage: Slight enhancement: added braces around rst argument of
\bbl@afterfi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
babel 3.7c
General: Added an error message for when no language option was specied . . 18
Added hebrew and serbian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Added support for language attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Added ukrainian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
dene \adddialect before loading plain.def here . . . . . . . . . . . . . . . . . . . 19
No longer us a redenition of an internal macro, just check \bbl@main@language
and load babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Removed redenition of \@roman and \@Roman . . . . . . . . . . . . . . . . . . . . . . 67
set the correct language attribute for polutoniko greek . . . . . . . . . . . . . . . . 16
\initiate@active@char: Only execute \initiate@active@char once for each
character . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
\markright: Avoid expanding the arguments by storing them in token registers 65
Removed the use of \head@lang (PR 2990) . . . . . . . . . . . . . . . . . . . . . . . . 65
\process@language: Added the execution of the contents of \toks@ . . . . . . . . 33
Also store \languagename for possible later use in \process@synonym . . . . . 32
need to set hyphenmin values globally . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Only set hyphenmin values when the pattern le changed them . . . . . . . . . 33
Set \lefthyphenmin to \m@ne inside the group; explicitly set the hyphenmin
parameters for language 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
\process@line: added an extra argument in order to prevent a trailing space
from becoming part of the control sequence when dening a synonym (PR
2851) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
\process@synonym: Now also store hyphenmin parameters for language syn-
onyms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Use a token register to temporarily store a command to set hyphenmin param-
eters for the synonym which is dened before the rst pattern le is processed 31
babel 3.7d
General: Fixed a few typos in \changes entries which made typesetting the code
impossible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
\initiate@active@char: Make sure the active character doesn't get expanded
more then once by the \edef by adding \expandafter\strip@prefix\meaning
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
babel 3.7e
General: Added missing hebrew les . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
\bbl@clear@ttribs: When \bbl@attributes is undened this should be a no-op 49
\initiate@active@char: pass the argument on with braces in order to prevent
it from breaking up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
previous change was rubbish; use \let instead of \edef . . . . . . . . . . . . . . . 37
hyphenrules: Added environment hyphenrules . . . . . . . . . . . . . . . . . . . . . . . 27
babel 3.7f
General: Added bulgarian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Added samin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Added the bulgarian option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

477
Added the samin option ...................................... 17
\bbl@get@enc: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
\bbl@ifattributeset: macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
\bbl@prim@s: Need to redene \prim@s as well as plain TEX's denition uses
\next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
\bbl@set@language: Macro \bbl@set@language introduced . . . . . . . . . . . . . . 24
\ifthenelse: \pageref needs to have its babel denition reinstated in the second
and third arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
\initiate@active@char: Added an extra shorthand combination on user level to
catch an interfering \protect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Insert a check for math mode in the denition of \normal@char' . . . . . . . . 38
Introduced an extra level of expansion in the denition of an active caret . . 38
Make an exception for the active caret which needs an extra level of expansion 39
remove the braces again . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
The redenition needs to take place one level higher, \prim@s needs to be
redened. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
\process@language: Allow for the encoding to be used as part of the language
name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
\providehyphenmins: added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
\save@sf@q: PR3119, don't start a paragraph in a local group . . . . . . . . . . . . 51
\selectlanguage: Use \aftergroup to keep the language grouping correct in
auxiliary les PR3091 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
babel 3.7g
\@citex: The shorthands need to be deactivated for the second argument of
\@citex only. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
General: Added option acadian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Added option canadian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Added option canadien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
\initiate@active@char: use \textormath to get rid of the \fi (PR 3266) . . . 38
babel 3.7h
General: Added a number of missing comment characters which caused spurious
white space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
babel 3.7j
General: only load frenchb.ldf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
\bbl@pop@language: Introduce the language stack mechanism . . . . . . . . . . . . 23
Now use the language stack mechanism . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
\FOREIGNLANGUAGE: Dene \FOREIGNLANGUAGE unconditionally . . . . . . . . . . . . 69
\substitutefontfamily: create le with lowercase name . . . . . . . . . . . . . . . . 18
\textlatin: added \leavevmode to prevent a paragraph starting inside the group 20
otherlanguage: rely on \selectlanguage to keep track of the nesting . . . . . 26
\useshorthands: The change from 11/112001 was incomplete . . . . . . . . . . . . 43
When TEX has seen a character its category code is xed; need to use a `stand-
in' for the call of \bbl@activate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
babel 3.7k
\textlatin: Use \DeclareTextFontComand . . . . . . . . . . . . . . . . . . . . . . . . . . 20
babel 3.7m
\@mkboth: added \bbl@restore@actives to the mark . . . . . . . . . . . . . . . . . . 66
\@noopterr: Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
General: Added the interlingua option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
\bbl@pop@language: Removed the superuous empty denition of \bbl@pop@language
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
\bbl@restore@actives: New macro added . . . . . . . . . . . . . . . . . . . . . . . . . . 42
\markright: added \bbl@restore@actives to the mark . . . . . . . . . . . . . . . . . 65
\selectlanguage: Check for the existence of both \l@... and \date... . . . . 24

478
babel 3.7o
\active@prefix: Added handling of the situation where \protect is set to
\@unexpandable@protect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
\ldf@finish: Also restore the category code of the equals sign . . . . . . . . . . . 29
\ldf@quit: Also restore the category code of the equals sign . . . . . . . . . . . . . 29
\LdfInit: make sure the equals sign has its default category code . . . . . . . . . 28
\vrefpagenum: Added redenition of \vrefpagenum which deals with ranges of
pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
babel 3.8a
General: Added interlingua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Also load package url . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
babel 3.8b
\bbl@sh@select: Added command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
\declare@shorthand: We need to support shorthands with and without argument
in dierent groups; added the name of the group to the storage macro . . . . 42
\frq: Made \flq and \frq fontencoding dependent . . . . . . . . . . . . . . . . . . . . 54
\frqq: Made \flqq and \frqq fontencoding dependent . . . . . . . . . . . . . . . . . 54
\grq: Made \glq fontencoding dependent as well . . . . . . . . . . . . . . . . . . . . . 54
\grqq: Made \grqq fontencoding dependent as well . . . . . . . . . . . . . . . . . . . . 54
\hhline: added \string to prevent unwanted expansion of the colon . . . . . . . 68
\initiate@active@char: Now use \bbl@sh@select . . . . . . . . . . . . . . . . . . 39, 40
babel 3.8c
\@mkboth: No need to add anything to an empty mark, prevented this by checking
the contents of the arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
General: Added option australian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Added the newzealand option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
\markright: No need to add anything to an empty mark; prevented this by
checking the contents of the argument . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
babel 3.8e
General: Many enhancements to the text by Andrew Young . . . . . . . . . . . . . . . 1
babel 3.8f
\@mkboth: Make the denition independent of the original denition; expand
\languagename before passing it into the token registers . . . . . . . . . . . . . . 66
\markright: Make the denition independent of the original denition; expand
\languagename before passing it into the token registers . . . . . . . . . . . . . . 65
babel 3.8g
\Ref: We also need to adapt \Ref which needs to be able to uppercase the rst
letter of the expansion of \ref . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
babel 3.8h
General: added malay, meyaluy and bahasam for the Bahasa Malaysia support . 16
Added albanian and bahasam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Added option albanian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
added synonyms indonesian, indon and bahasai for the original bahasa (indone-
sia) support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
babel 3.8j
\@mkboth: Added setting of \@mkboth (PR 3826) . . . . . . . . . . . . . . . . . . . . . . 66
\bbl@switch@sh@on: Added a group in order to protect the current lowercase
code of the tilde (PR 3851) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
\pdfstringdefDisableCommands: Inform hyperref to use shorthands at system
level (PR4006) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
hyphenrules: Also set the hyphenmin paramters to the correct value (PR3997) 27
babel 3.8l
\bbl@main@language: Use \bbl@patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
\bbl@patterns: Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

479
\foreign@language: use \bbl@patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
\selectlanguage: Use \bbl@patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
hyphenrules: Use \bbl@patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
bahasa-0.9c
General: Now use \@patterns to produce the warning . . . . . . . . . . . . . . 446, 449
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446, 449
bahasa-1.0b
\captionsbahasa: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . . 447
\captionsbahasam: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . 450
bahasa-1.0d
General: Replaced \undefined with \@undefined and \empty with \@empty for
consistency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446, 449
\captionsbahasa: Replaced `Proof' by `Bukti' (PR2214) . . . . . . . . . . . . . . . 447
\captionsbahasam: Replaced `Proof' by `Bukti' (PR2214) . . . . . . . . . . . . . . 450
bahasa-1.0e
General: Moved the denition of \atcatcode right to the beginning. . . . 446, 449
Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . 448, 451
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . 446, 449
\bahasahyphenmins: use \bahasahyphenmins to store the correct values . . . . 448
\bahasamhyphenmins: use \bahasamhyphenmins to store the correct values . . 450
bahasa-1.0f
\datebahasa: Use \edef to dene \today . . . . . . . . . . . . . . . . . . . . . . . . . . 447
\datebahasam: Use \edef to dene \today . . . . . . . . . . . . . . . . . . . . . . . . . 450
bahasa-1.0g
\datebahasa: Februari should be spelled as Pebruari . . . . . . . . . . . . . . . . . . 447
\datebahasam: Februari should be spelled as Pebruari . . . . . . . . . . . . . . . . . 450
bahasa-1.0h
\bahasahyphenmins: Now use \providehyphenmins to provide a default value 448
\bahasamhyphenmins: Now use \providehyphenmins to provide a default value 450
\captionsbahasa: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . 447
\captionsbahasam: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . 450
bahasa-1.0i
\captionsbahasa: Inserted translation for Glossary . . . . . . . . . . . . . . . . . . . 447
\captionsbahasam: Inserted translation for Glossary . . . . . . . . . . . . . . . . . . 450
bahasa-v1.0k
General: Make it possible that this le is loaded by variuos options . . . . . . . 446
bahasam-0.9f
General: A number of changes to make this specic to Bahasa Mayasia . . . . 449
bahasam-1.0k
\captionsbahasam: Inserted changes from Awangku Merali . . . . . . . . . . . . . 450
\datebahasam: Februari restored to BM spelling; see Collins Kamus Dwibahasa
2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
bahasam-v1.0j
General: Make it possible that this le is loaded by variuos options . . . . . . . 449
bahasa 1.0f
\datebahasa: use \def instead of \edef to save memory . . . . . . . . . . . . . . . 447
\datebahasam: use \def instead of \edef to save memory . . . . . . . . . . . . . . 450
basque-1.0b
General: Removed empty groups after guillemot characters . . . . . . . . . . . . . 231
\datebasque: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 230
basque-1.0c
\datebasque: xed typo in April's name . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

480
basque-1.0d
\noextrasbasque: Deactivate shorthands ouside of Basque ............. 230
basque-1.0e
\basquehyphenmins: Now use \providehyphenmins to provide a default value 230
\captionsbasque: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . 229
basque-1.0f
General: Changed url's for the patterns le . . . . . . . . . . . . . . . . . . . . . . . . . 229
\captionsbasque: Added translation for Glossary . . . . . . . . . . . . . . . . . . . . 229
bbplain-0.1
General: Added redenition of \dump to add a message to \everyjob . . . . . . 453
bbplain-1.0c
General: Add execution of \@begindocumenthook to \@preamblecmds . . . . . . 454
Added denition of \loadlocalcfg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Moved the \dump code here from babel.dtx . . . . . . . . . . . . . . . . . . . . . . 453
bbplain-1.0d
General: Also reset category codes after loading the conguration le as \AtEndOfPackage
is undened in this case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
bbplain-1.0e
General: Added the \newcommand code . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
Provide a more complete emulation of \DeclareRobustCommand and \newcommand
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
bbplain-1.0f
General: added \@empty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Added \textquotedblright and \textquoteright . . . . . . . . . . . . . . . . . 461
Added denition of \scriptsize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Consistently use \@undefined instead of \undefined . . . . . . . . . . . . . . . . 453
Use \toks8 instead of \patterns@loaded . . . . . . . . . . . . . . . . . . . . . . . . 454
bbplain-1.0g
General: Added \ss and \i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
bbplain-1.0h
General: Only load the necessary parts into the format, let this le be read agian
by babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
bbplain-1.0i
General: \document is not a LATEX2.09-only command; AMSTEXdenes it too;
now use \@ztryfc to detect LATEX2.09 . . . . . . . . . . . . . . . . . . . . . . . . . . 454
bbplain-1.0j
General: \@begindocumenthook might already be dened . . . . . . . . . . . . . . . 455
Add the denition of \@begindocumenthook to the LATEX2.09 format . . . . 454
bbplain-1.0k
General: \newcount is an \outer command, can't use it inside an \if construct 457
missing \@undefined added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
bbplain-1.0l
General: Mixed up the denition of \@tempcntb . . . . . . . . . . . . . . . . . . . . . 457
bbplain-1.0m
General: Set \if@filesw to \iffalse only for plain TEX . . . . . . . . . . . . . . . 455
bbplain-1.0n
General: Added \@secondoftwo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
Added the source for the format wrapper les . . . . . . . . . . . . . . . . . . . . . 452
Repaired typo and added missing \endcsname . . . . . . . . . . . . . . . . . . . . . 455
bbplain-1.0o
General: Added denition of \in@ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
bbplain-1.0p
General: Added \@ifl@aded as a no-op . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457

481
bbplain-1.0q
General: Added \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
bbplain-1.0r
General: Added \textquotedblleft and \textquoteleft . . . . . . . . . . . . . . 461
breton-1.0
General: First release . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
breton-1.0b
\captionsbreton: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . . . 99
\noextrasbreton: Use the new mechanism for dealing with active chars . . . . 100
breton-1.0c
General: Postpone the \DeclareTextCompositeCommands untill \AtBeginDocument
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
breton-1.0e
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 102
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . . 99
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 99
breton-1.0f
\datebreton: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 100
breton-1.0g
\noextrasbreton: Deactivate shorthands ouside of Breton . . . . . . . . . . . . . . 100
breton-1.0h
\captionsbreton: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
bulgarian-0.99
General: This is a prerelease version of this le. Features needing further testing
are removed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
bulgarian-1.0b
\extrasbulgarian: Now use \providehyphenmins to provide a default value 351
bulgarian-1.0c
General: Added missing closing brace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
\dq: repaired typo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
bulgarian-1.0d
General: Change denition of \th only for this language . . . . . . . . . . . . . . . 353
bulgarian-1.0e
\cdash: Two occurences of \emp were changed into tab followed by emp . . . . 350

catalan-1.1
\captionscatalan: \headpagename should be \pagename . . . . . . . . . . . . . . . 200
catalan-2.0
General: Removed code to load latexhax.com . . . . . . . . . . . . . . . . . . . . . . . 200
\captionscatalan: Added some names . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
\extrascatalan: Macro completely rewritten . . . . . . . . . . . . . . . . . . . . . . . 201
\noextrascatalan: Macro completely rewritten . . . . . . . . . . . . . . . . . . . . . 201
catalan-2.0b
General: Incorporated the changes from spanish.sty . . . . . . . . . . . . . . . . . 199
catalan-2.1
General: Update for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
catalan-2.1d
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 200
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
\captionscatalan: Added a few missing translations . . . . . . . . . . . . . . . . . 200
\textacute: Renamed from \acute as that is a \mathaccent . . . . . . . . . . . . 202

482
catalan-2.2a
General: All the code to deal with active characters is now in babel.def . . . 203
\extrascatalan: Handling of active characters completely rewritten . . . . . . 201
\noextrascatalan: All the code for handling active characters is now moved to
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
catalan-2.2b
General: Changed mathmode denition of acute shorthands to expand to a single
prime followed by the next character in the input . . . . . . . . . . . . . . . . . . 204
Made the activation of the grave and acute accents optional . . . . . . . . . . . 199
\captionscatalan: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . 200
\datecatalan: Month names in lowercase . . . . . . . . . . . . . . . . . . . . . . . . . . 200
\Lgem: Added support for typing the catalan ela geminada with the macros
\lgem and \Lgem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
\noextrascatalan: Make activating the accent characters optional . . . . . . . . 201
\up: Added denition of macro \up, which can be used to type ordinals . . . . 206
catalan-2.2c
General: Added '' as an axtra shorthand, removed 'n as a shorthand . . . . . . 204
Added shorthands for guillemets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
cedile now produced by double quote shorthand . . . . . . . . . . . . . . . . . . . 203
Removed the use of the tilde for catalan . . . . . . . . . . . . . . . . . . . . . . . . . 199
catalan-2.2d
\captionscatalan: added translation of Proof . . . . . . . . . . . . . . . . . . . . . . 200
Translations revised . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
catalan-2.2e
General: Added `` as an axtra shorthand . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Added vertical bar as argument to active acute . . . . . . . . . . . . . . . . . . . . 204
\L.L: Added redenition of \l and \L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
\noextrascatalan: Need to split up the \@ifpackagewith statements . . . . . 201
Now give the apostrophe a lowercase code . . . . . . . . . . . . . . . . . . . . . . . . 201
\up: Now use \textsuperscript and make \up robust . . . . . . . . . . . . . . . . 206
catalan-2.2f
General: Replaced \undefined with \@undefined and \empty with \@empty for
consistency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
\Lgem: Added a check for math mode as the use of \lgem and \Lgem in math
mode is not sensible. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
catalan-2.2g
General: Moved the denition of \atcatcode right to the beginning. . . . . . . 199
Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 200
catalan-2.2h
\noextrascatalan: Added some comment signs to prevent unwanted spaces in
the output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
catalan-2.2i
General: Removed empty groups after guillemot characters . . . . . . . . . . . . . 203
\datecatalan: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 200
catalan-2.2k
General: A wrong \changes entry made typesetting impossible . . . . . . . . . . 199
catalan-2.2l
\noextrascatalan: Don't forget do deactivate the shorthands . . . . . . . . . . . 201
Make sure that the grave accent has catcode 12 before it is made \active . 201
catalan-2.2m
\captionscatalan: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . 200

483
catalan-2.2n
\catalanhyphenmins: Set the hyphenation parameters both to two as required
by cahyph.tex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
catalan-2.2o
\L.L: Postpone the redenition of \l and \L until begin document to prevent
overwriting by fontenc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
catalan-2.2p
\captionscatalan: Inserted translation for Glossary . . . . . . . . . . . . . . . . . . 200
changes-1.0f
General: The hyphen char needs to appear at the beginning of the line as well. 232
croatian-1.0a
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . 286
croatian-1.0b
General: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . 286
croatian-1.0c
General: Removed some typos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
croatian-1.1
General: Added a warning when no hyphenation patterns were loaded. . . . . . 286
Brought up-to-date with babel 3.2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
\captionscroatian: Added \seename, \alsoname and \prefacename . . . . . . 286
croatian-1.2
\captionscroatian: \headpagename should be \pagename . . . . . . . . . . . . . . 286
croatian-1.3
General: Update for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
croatian-1.3d
\captionscroatian: Added a few translations . . . . . . . . . . . . . . . . . . . . . . . 286
croatian-1.3e
\captionscroatian: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . 286
croatian-1.3f
\captionscroatian: Added translation of Proof . . . . . . . . . . . . . . . . . . . . . 286
\datecroatian: in croatian language, the genitive for the name of the month has
to be used . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
croatian-1.3g
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 287
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 286
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 286
croatian-1.3h
\datecroatian: sijev{c}nja should be seij\v{c}nja and there should be a
period after the year . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
croatian-1.3i
\captionscroatian: Replaced some of the translations with `better' words . . 286
\datecroatian: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . 286
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 286
croatian-1.3j
\datecroatian: changed \od into \or . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
croatian-1.3k
\captionscroatian: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . 286
croatian-1.3l
\captionscroatian: Inserted translation for Glossary . . . . . . . . . . . . . . . . . 286
czech-1.0a
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . . . 288
czech-1.0b
General: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . 289

484
czech-1.1
General: Added a warning when no hyphenation patterns were loaded. . . . . . 289
Brought up-to-date with babel 3.2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
\captionsczech: Added \seename, \alsoname and \prefacename . . . . . . . . . 290
czech-1.1a
\noextrasczech: Removed typo, \q was restored twice, once too many. . . . . 291
czech-1.2
General: Included some features from Kasal's czech.sty . . . . . . . . . . . . . . . . 288
czech-1.3
General: Update for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
czech-1.3d
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 289
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
czech-1.3e
\noextrasczech: now use \bbl@frenchspacing and \bbl@nonfrenchspacing 291
Use LATEX's \v and \r accent commands . . . . . . . . . . . . . . . . . . . . . . . . . 291
czech-1.3f
\captionsczech: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . . . 290
czech-1.3g
\captionsczech: Fixed two errors and provided translation for `proof' . . . . . 290
czech-1.3h
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 300
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 289
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 288
czech-1.3i
\dateczech: Use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 290
czech-1.3j
\captionsczech: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
czech-1.3k
\captionsczech: Added translation for Glossary . . . . . . . . . . . . . . . . . . . . . 290
czech-3.0
General: Added default for setting hyphenmin parameters. Values taken from
CSLATEX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Implemented the functionality of CSLATEX's czech.sty. The version number was
bumped to 3.0 to minimize confusion by being higher than the last version of
CSLATEX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
\captionsczech: Updated some translations. Former translations were: `Do-
datek' for \appendixname and `Index' for \indexname. Also removed spurious
colon at the end of \ccname. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
czech-3.1
\cs@emdash: ensure correct catcode for the saved hyphen . . . . . . . . . . . . . . . 294
\cs@splitattr: attribute added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
\noextrasczech: move \languageshorthands here, so that the language group
is always initialized correctly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
\splithyphens: activate with split hyphens and deactivate with standard hy-
phens, not vice versa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297

danish-1.0a
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . 235
danish-1.0b
General: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . 235

485
danish-1.1
General: Added a warning when no hyphenation patterns were loaded. . . . . . 235
Brought up-to-date with babel 3.2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
\captionsdanish: Added \seename, \alsoname and \prefacename . . . . . . . . 235
danish-1.2
\captionsdanish: \headpagename should be \pagename . . . . . . . . . . . . . . . . 235
danish-1.2b
\captionsdanish: Added a few translations . . . . . . . . . . . . . . . . . . . . . . . . 235
danish-1.3
General: Update for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
danish-1.3a
\datedanish: Added `.' to denition of \today . . . . . . . . . . . . . . . . . . . . . . 236
danish-1.3c
\captionsdanish: Included some revisions from Peter Busk Larsen . . . . . . . 235
danish-1.3f
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 235
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
danish-1.3g
General: Added the active double quote character as suggested by Peter Busk
Laursen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
danish-1.3h
\captionsdanish: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . . 235
\extrasdanish: Added \bbl@frenchspacing . . . . . . . . . . . . . . . . . . . . . . . . 236
\noextrasdanish: Added \bbl@nonfrenchspacing . . . . . . . . . . . . . . . . . . . 236
danish-1.3i
\captionsdanish: Added translation of `Proof' . . . . . . . . . . . . . . . . . . . . . . 235
danish-1.3j
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 237
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 235
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 235
\extrasdanish: Added denition of "~ and "= . . . . . . . . . . . . . . . . . . . . . . 237
Changed denition of "' to print  instead of  . . . . . . . . . . . . . . . . . . . . 236
danish-1.3k
\datedanish: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 236
\extrasdanish: Removed empty groups after double quote and guillemot char-
acters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
danish-1.3m
\extrasdanish: Deactivate shorthands ouside of Danish . . . . . . . . . . . . . . . 236
danish-1.3n
\captionsdanish: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . 235
danish-1.3o
\captionsdanish: Added translation of `Glossary' . . . . . . . . . . . . . . . . . . . . 235
danish-1.3p
\englishhyphenmins: Added default for setting of hyphenmin parameters . . 235
danish-1.3q
\-: Added redenition of \- from dutch.ldf . . . . . . . . . . . . . . . . . . . . . . . . 237
\englishhyphenmins: Set lefthyphenmin to two . . . . . . . . . . . . . . . . . . . . . 235
\extrasdanish: Added denition of "/ from dutch.ldf . . . . . . . . . . . . . . . . 237
dutch-2.0a
General: Added checking of format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

486
dutch-2.0b
General: Added extrasdutch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
dutch-2.0c
General: Added grqq macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
dutch-2.1
General: reect change to version 2.1 in babel and changes in german v2.3 . . . 81
dutch-2.1a
General: Incorporated Nico's comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
dutch-2.1b
General: Incorporated more comments by Nico . . . . . . . . . . . . . . . . . . . . . . . 81
dutch-2.1c
General: Fixed some typos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
dutch-2.2
General: Fixed problem with the use of " in moving arguments while " is active 81
dutch-2.3
\@trema: \dieresis instead of \accent127 . . . . . . . . . . . . . . . . . . . . . . . . . . 84
General: \dieresis instead of \accent127 . . . . . . . . . . . . . . . . . . . . . . . . . . 84
When using PostScript fonts with the Adobe font-encoding, the dieresis-accent
is located elsewhere, modied code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
\noextrasafrikaans: Added \dieresis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
dutch-2.3a
General: Modied the documentation somewhat . . . . . . . . . . . . . . . . . . . . . . 81
dutch-3.0
General: Modied for babel 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Now use \adddialect if language undened . . . . . . . . . . . . . . . . . . . . . . . 82
dutch-3.0a
General: Removed some problems in change log . . . . . . . . . . . . . . . . . . . . . . 81
dutch-3.0b
\extrasafrikaans: added some comment chars to prevent white space . . . . . . 83
\noextrasafrikaans: added some comment chars to prevent white space . . . . 83
dutch-3.1
General: Removed bug found by van der Meer . . . . . . . . . . . . . . . . . . . . . . . 81
dutch-3.1a
\captionsdutch: \pagename should be \headpagename . . . . . . . . . . . . . . . . . 82
Removed \global denitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
\datedutch: Removed \global denitions . . . . . . . . . . . . . . . . . . . . . . . . . . 82
\extrasafrikaans: Removed \global denitions . . . . . . . . . . . . . . . . . . . . . 83
\noextrasafrikaans: Removed \global denitions . . . . . . . . . . . . . . . . . . . . 83
dutch-3.2
General: added case for "y and "Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
\extrasafrikaans: Save all redened macros . . . . . . . . . . . . . . . . . . . . . . . . 83
\noextrasafrikaans: Try to restore everything to its former state . . . . . . . . . 83
dutch-3.2a
General: Added reset of catcode of @ before \endinput. . . . . . . . . . . . . . . . . 81
Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
dutch-3.2b
General: removed typo (allowhpyhens) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
dutch-3.2c
General: Removed code to load latexhax.com . . . . . . . . . . . . . . . . . . . . . . . . 81
removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81, 82
dutch-3.3
General: Rewritten parts of the code to use the new features of babel version 3.1 81
\extrasafrikaans: Macro complete rewritten . . . . . . . . . . . . . . . . . . . . . . . . 83
\noextrasafrikaans: Macro complete rewritten . . . . . . . . . . . . . . . . . . . . . . 83

487
dutch-3.3a
\@trema: renamed \@umlaut to \@trema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
General: Added \save@sf@q macro from germanb and rewrote all quote macros
to use it . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Moved code to the beginning of the le and added \selectlanguage call . . 81
\captionsdutch: added \seename and \alsoname . . . . . . . . . . . . . . . . . . . . . 82
dutch-3.3b
General: Added warning, if no dutch patterns loaded . . . . . . . . . . . . . . . . . . . 82
\captionsdutch: added \prefacename . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
\extrasafrikaans: modied handling of \dospecials and \@sanitize . . . . . 83
\noextrasafrikaans: modied handling of \dospecials and \@sanitize . . . . 83
dutch-3.4b
General: moved denition of \allowhyphens, \set@low@box and \save@sf@q to
babel.com . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
dutch-3.5
\captionsdutch: \headpagename should be \pagename . . . . . . . . . . . . . . . . . 82
dutch-3.6
General: Update or LaTeX2e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
dutch-3.6c
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . . 82
Removed the use of \filedate, moved identication after the loading of ba-
bel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
dutch-3.7a
General: Moved identication code to the top of the le . . . . . . . . . . . . . . . . . 81
Moved the denition of \ij and \IJ to glyphs.def . . . . . . . . . . . . . . . . . . 84
moved the denition of the double quote character at the baseline to
glyhps.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Now use \Declaredqdutch to dene the functions of the active double quote 84
Removed \dlqq, \@dlqq, \drqq, \@drqq and \dieresis . . . . . . . . . . . . . . . 84
Rewrote the code with respect to the active double quote character . . . . . . 81
The support macros for the active double quote have been moved to babel.def 84
Use \ddot instead of \@MATHUMLAUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Use more general mechanism of \declare@shorthand . . . . . . . . . . . . . . . . 84
\afrikaanshyphenmins: use \dutchhyphenmins to store the correct values . . . 84
\IJ: Changed the kerning in the faked ij to match the dc-version of it . . . . . . 53
dutch-3.7b
General: Added "" shorthand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
dutch-3.7c
\captionsdutch: We need the " to be active while dening \captionsdutch . . 82
dutch-3.7d
\captionsdutch: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . . . . 82
dutch-3.7f
General: Replaced \undefined with \@undefined and \empty with \@empty for
consistency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
dutch-3.8a
General: Merged in the denitions for `afrikaans' . . . . . . . . . . . . . . . . . . . . . . 81
Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
this needs a more complicated check as `afrikaans' may or may not have its
own hyphenation patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
\noextrasafrikaans: Made all denitions dependant on \CurrentOption . . . . 83
dutch-3.8b
\captionsdutch: Use Bew"ys instead of Bewijs . . . . . . . . . . . . . . . . . . . . . . . 82
dutch-3.8c
General: Added the " shorthand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

488
dutch-3.8e
General: Added a shorthand with the slash character . . . . . . . . . . . . . . . . . . . 85
Forgot to replace `german' by `dutch' when copying denition for " . . . . . . 84
Removed empty groups after double quote characters . . . . . . . . . . . . . . . . 84
\dateafrikaans: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . 83
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . . 83
\datedutch: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . . 82
dutch-3.8h
\afrikaanshyphenmins: Now use \providehyphenmins to provide a default value 84
\captionsdutch: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
dutch-3.8i
\-: \- should use \bbl@allowhyphens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
General: "/ should use \bbl@allowhyphens . . . . . . . . . . . . . . . . . . . . . . . . . . 85

english-2.0a
General: Added checking of format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
english-2.1
General: Reect changes in babel 2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
english-2.1a
General: Incorporated Nico's comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
english-2.1b
General: merged USenglish.sty into this le . . . . . . . . . . . . . . . . . . . . . . . . 86
english-2.1c
General: xed typo in denition for american language found by Werenfried Spit
(nspit@fys.ruu.nl) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
english-2.1d
General: Fixed some typos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
english-3.0
General: Modied for babel 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Now use \adddialect for american . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Now use \adddialect if language undened . . . . . . . . . . . . . . . . . . . . . . . 86
english-3.0a
General: Removed bug found by van der Meer . . . . . . . . . . . . . . . . . . . . . . . 86
english-3.0b
General: Removed \global denitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
\captionsenglish: \pagename should be \headpagename . . . . . . . . . . . . . . . . 88
Removed \global denitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
\dateamerican: Removed \global denitions . . . . . . . . . . . . . . . . . . . . . . . . 89
\dateenglish: Removed \global denitions . . . . . . . . . . . . . . . . . . . . . . . . . 88
english-3.0c
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . . 86
english-3.0d
General: removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
english-3.1
General: Rewrote parts of the code to use the new features of babel version 3.1 86
english-3.1a
\captionsenglish: added \seename and \alsoname . . . . . . . . . . . . . . . . . . . 88
english-3.1b
\captionsenglish: added \prefacename . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
english-3.2
\captionsenglish: \headpagename should be \pagename . . . . . . . . . . . . . . . . 88
english-3.3
General: Update or LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

489
english-3.3c
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . . 86
Removed the use of \filedate and moved the identication after the loading
of babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
english-3.3d
General: Only dene american as a dialect when no separate patterns have been
loaded . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
english-3.3e
\captionsenglish: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . . 88
english-3.3g
General: Allow british as the name of the UK patterns . . . . . . . . . . . . . . . . . 86
Allow USenglish as the name of the american patterns . . . . . . . . . . . . . . . . 87
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
\captionsenglish: Construct control sequence on the y . . . . . . . . . . . . . . . 88
\dateenglish: Construct control sequence on the y . . . . . . . . . . . . . . . . . . . 88
\noextrasenglish: Construct control sequences on the y . . . . . . . . . . . . . . . 89
english-3.3h
General: Moved the denition of \atcatcode right to the beginning. . . . . . . . 86
Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . . 86
english-3.3i
\dateamerican: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . . 89
\dateenglish: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . . 88
english-3.3j
General: Also allow american english hyphenation patterns to be used for `english' 86
Ensure that \l@USenglish is alway dened . . . . . . . . . . . . . . . . . . . . . . . . 87
\captionsenglish: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . 88
\dateenglish: Make sure that the value of \today is correct for both options
`american' and `USenglish' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
english-3.3k
General: Added support for canadian . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86, 87
english-3.3l
General: Added missing backslash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
english-3.3m
\englishhyphenmins: Added default for setting of hyphenmin parameters . . . 87
english-3.3n
General: Added support for australian and newzealand . . . . . . . . . . . . . . . 86, 87
\dateaustralian: Add australian date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
\dateenglish: Added support for `Australian' and `Newzealand' . . . . . . . . . . 88
english-3.3o
General: Make sure that british patterns are used if they were loaded . . . . . . . 87
\dateenglish: Explicitly choose the UK form of date . . . . . . . . . . . . . . . . . . 88
esperant0-1.4o
\noextrasesperanto: Moved the check for math to babel.def . . . . . . . . . . . . . 77
esperanto-1.0a
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . . 76
esperanto-1.0b
General: Removed use of \makeatletter . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
esperanto-1.1
General: Added a warning when no hyphenation patterns were loaded. . . . . . . 76
Brought up-to-date with babel 3.2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

490
\captionsesperanto: Added \seename, \alsoname and \prefacename . . . . . . 76
esperanto-1.2
General: Included code from esperant.sty . . . . . . . . . . . . . . . . . . . . . . . . . . 76
esperanto-1.3
\captionsesperanto: \headpagename should be \pagename . . . . . . . . . . . . . . 76
Repaired a number of mistakes, indicated by D. Ederveen . . . . . . . . . . . . . 76
\dateesperanto: Removed the capitals from \today . . . . . . . . . . . . . . . . . . . 77
esperanto-1.4a
General: Updated for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
\captionsesperanto: added missing closing brace . . . . . . . . . . . . . . . . . . . . . 76
esperanto-1.4d
General: Removed the use of \filedate, moved Identication after loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Use \@nopatterns for the warning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
esperanto-1.4e
General: Moved identication code to the top of the le . . . . . . . . . . . . . . . . . 76
esperanto-1.4f
General: Corrected typos (PR1652) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
esperanto-1.4g
\captionsesperanto: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . 76
esperanto-1.4h
General: Added a few shorthands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
esperanto-1.4i
General: Moved the denition of \atcatcode right to the beginning. . . . . . . . 76
Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . . 76
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
\captionsesperanto: Replaced `Proof' by `Pruvo' PR 2207 . . . . . . . . . . . . . . 76
esperanto-1.4j
General: xed typo in table caption (funtion instead of function) . . . . . . . . . . 76
esperanto-1.4k
\dateesperanto: Removed Rthe use of \edef again . . . . . . . . . . . . . . . . . . . 77
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . . 77
esperanto-1.4l
General: Added a shorthand denition on system level . . . . . . . . . . . . . . . . . . 77
esperanto-1.4n
\noextrasesperanto: Added a check for math mode to the denition of the short-
hand character . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
esperanto-1.4p
\captionsesperanto: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . 76
esperanto-1.4q
\captionsesperanto: Added translation for Glossary . . . . . . . . . . . . . . . . . . 76
\esper: Removed the extra level of expansion for more than ve items, as was
done in LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
esperanto-1.4t
\esper: Added the missing `r' in these macros . . . . . . . . . . . . . . . . . . . . . . . . 78
estonian-1.0b
General: corrected typos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
estonian-1.0c
\captionsestonian: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . 280
estonian-1.0d
General: The second argument was missing in the denition of some of the double-
quote shorthands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282

491
\captionsestonian: Added translation of `Proof' . . . . . . . . . . . . . . . . . . . . 280
\noextrasestonian: Removed the code that changes category, lower case, uper
case and space factor codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
estonian-1.0e
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 282
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 279
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 279
estonian-1.0f
General: Removed empty groups after double quote and guillemot characters 282
\dateestonian: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . 280
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 280
estonian-1.0g
General: use \bbl@t@one instead of \bbl@next . . . . . . . . . . . . . . . . . . . . . . 281
estonian-1.0h
\captionsestonian: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . 280
\estonianhyphenmins: Now use \providehyphenmins to provide a default value 281

nnish-1.0a
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . 258
nnish-1.0b
General: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . 258
nnish-1.1
General: Added a warning when no hyphenation patterns were loaded. . . . . . 258
Brought up-to-date with babel 3.2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
\captionsfinnish: \headpagename should be \pagename . . . . . . . . . . . . . . . 258
Added \seename, \alsoname and \prefacename . . . . . . . . . . . . . . . . . . . . 258
nnish-1.1.2
\captionsfinnish: Added translations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
nnish-1.2
General: Update for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
nnish-1.3c
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 258
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
nnish-1.3d
General: Removed a few references to babel.com . . . . . . . . . . . . . . . . . . . . . 258
nnish-1.3e
\datefinnish: Added a`.' after the number of the day . . . . . . . . . . . . . . . . . 259
nnish-1.3f
\finishhyphenmins: use \finnishhyphenmins to store the correct values . . . 260
\noextrasfinnish: Added the setting of \frenchspacing . . . . . . . . . . . . . . 259
Added the setting of more hyphenation parameters, according to PR1027 . 259
nnish-1.3g
\-: Added change of \- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
\captionsfinnish: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . 258
\noextrasfinnish: Added the active double quote . . . . . . . . . . . . . . . . . . . 259
nnish-1.3h
\captionsfinnish: Added nnish word for `Proof' . . . . . . . . . . . . . . . . . . . 258
nnish-1.3i
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 260
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 258
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 258

492
nnish-1.3k
\datefinnish: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 259
\noextrasfinnish: Removed empty groups after double quote and guillemot
characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
nnish-1.3m
\noextrasfinnish: Added misisng closing brace . . . . . . . . . . . . . . . . . . . . . 260
nnish-1.3n
\-: \allowhyphens should have been \bbl@allowhyphens . . . . . . . . . . . . . . 260
\captionsfinnish: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . 258
\finishhyphenmins: Now use \providehyphenmins to provide a default value 260
\noextrasfinnish: Deactive shorthands ouside of Finnish . . . . . . . . . . . . . . 260
nnish-1.3o
\captionsfinnish: Provided translation for Glossary . . . . . . . . . . . . . . . . . 258
nnish-1.3p
\noextrasfinnish: "= should also use \bbl@allowhyphens . . . . . . . . . . . . . 260
nnish-1.3q
General: Small documentation x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258

galician 4.3
General: \... is removed and instead \dots and \dots are changed, by redening
\ldotc, \dotc and \textellipsis or \dots . . . . . . . . . . . . . . . . . . . . . . 213
\sin, \arcsin and \sinh are set to produce the same as \sen, \arcsen and
\senh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Added \msc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
cosec and senh moved from \galicianoperators to the main group . . . . . 215
Removed the shorthand for ç. It existed in medieval galician-portuguese, but
that does not seem a reason to be included here. . . . . . . . . . . . . . . . . . . 209
Removed the shorthands "er and "ER, they don't exist in galician. . . . . . . 220
Removed the Spanish et sign. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Set the default to \unspacedoperators . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Set the default to do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
german-2.6l
General: Making germanb behave like german needs some more work besides
dening \CurrentOption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
germanb-1.0a
General: Incorporated Nico's comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
germanb-1.0b
General: xed typo in denition for austrian language found by Werenfried Spit
nspit@fys.ruu.nl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
germanb-1.0c
General: Fixed some typos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
germanb-1.1
General: When using PostScript fonts with the Adobe fontencoding, the dieresis-
accent is located elsewhere, modied code . . . . . . . . . . . . . . . . . . . . . . . . 90
\noextrasaustrian: Added \dieresis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
germanb-1.1a
General: Modied the documentation somewhat . . . . . . . . . . . . . . . . . . . . . . 90
germanb-2.0
General: Modied for babel 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Now use \adddialect for austrian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Now use \adddialect if language undened . . . . . . . . . . . . . . . . . . . . . . . 91
germanb-2.0a
General: Removed some problems in change log . . . . . . . . . . . . . . . . . . . . . . 90

493
germanb-2.0b
\extrasaustrian: added some comment chars to prevent white space . . . . . . 92
\noextrasaustrian: added some comment chars to prevent white space . . . . . 92
germanb-2.1
General: Removed bug found by van der Meer . . . . . . . . . . . . . . . . . . . . . . . 90
germanb-2.2
General: Removed global assignments, brought uptodate with german.tex v2.3d 90
\captionsaustrian: \pagename should be \headpagename . . . . . . . . . . . . . . . 91
Removed \global denitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
\extrasaustrian: Save all redened macros . . . . . . . . . . . . . . . . . . . . . . . . . 92
\noextrasaustrian: Try to restore everything to its former state . . . . . . . . . . 92
germanb-2.2a
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . . 90
germanb-2.2d
General: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
germanb-2.3
General: Rewritten parts of the code to use the new features of babel version 3.1 90
germanb-2.3e
General: Added \save@sf@q macro and rewrote all quote macros to use it . . . 93
Added warning, if no german patterns loaded . . . . . . . . . . . . . . . . . . . . . . 91
Brought up-to-date with german.tex v2.3e (plus some bug xes) [br] . . . . . 90
\captionsaustrian: Added \prefacename, \seename and \alsoname . . . . . . . 91
\dategerman: Added \month@german . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
germanb-2.3h
General: moved denition of \allowhyphens, \set@low@box and \save@sf@q to
babel.com . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
germanb-2.4
\captionsaustrian: \headpagename should be \pagename . . . . . . . . . . . . . . . 91
germanb-2.5
General: Update or LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
germanb-2.5c
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . . 91
Removed the use of \filedate and moved the identication after the loading
of babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
germanb-2.6a
General: \umlautlow and \umlauthigh moved to glyphs.dtx, as well as \newumlaut
(now \lower@umlaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Moved all quotation characters to glyphs.dtx . . . . . . . . . . . . . . . . . . . . . . 93
Moved the identication to the top of the le . . . . . . . . . . . . . . . . . . . . . . 90
Rewrote the code that handles the active double quote character . . . . . . . . 90
Use \ddot instead of \@MATHUMLAUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
\noextrasaustrian: All the code to handle the active double quote has been
moved to babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Removeed \3 as it is no longer in german.ldf . . . . . . . . . . . . . . . . . . . . . . 92
use \germanhyphenmins to store the correct values . . . . . . . . . . . . . . . . . . . 92
germanb-2.6b
\captionsaustrian: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . 91
germanb-2.6c
General: added the \allowhyphens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Moved \german@dq@disc to babel.def, calling it \bbl@disc . . . . . . . . . . . . . 93
\noextrasaustrian: Use decimal number instead of hat-notation as the hat may
be activated . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
germanb-2.6d
General: Moved the denition of \atcatcode right to the beginning. . . . . . . . 90

494
Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . . 91
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
\captionsaustrian: Construct control sequence on the y . . . . . . . . . . . . . . 91
\noextrasaustrian: Construct control sequence \extrasgerman or \extrasaustrian
on the y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
germanb-2.6f
General: Copied the coding for "f from german.dtx version 2.5d . . . . . . . . . . 94
use \SS instead of SS, removed braces after \ss . . . . . . . . . . . . . . . . . . . . . 93
\ck: Now use \shorthandon and \shorthandoff . . . . . . . . . . . . . . . . . . . . . . 94
\dateaustrian: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . . 92
\dategerman: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . . 92
germanb-2.6i
\noextrasaustrian: Deactivate shorthands ouside of German . . . . . . . . . . . . 92
germanb-2.6j
\captionsaustrian: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . 91
\noextrasaustrian: Now use \providehyphenmins to provide a default value 92
germanb-2.6k
\noextrasaustrian: Turn frenchspacing on, as in german.sty . . . . . . . . . . . . 93
germanb-2.6m
General: Correted a typo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
greek-1.0b
General: Moved the denition of \atcatcode right to the beginning . . . . . . . 109
Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 110
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
\textgreek: Added a level of braces to keep encoding change local . . . . . . . . 111
greek-1.0c
\greek@tilde: Added command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
greek-1.1
\Grtoday: Added macro \Grtoday . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
greek-1.1a
\dategreek: Fixed typo, Oktwbr'iou instead of Oktobr'iou . . . . . . . . . . . . 112
\greek@Alph: removed two superuous @'s which made \@alph undened . . 114
greek-1.1b
\noextrasgreek: Added setting of \uccodes (after kdgreek.sty) . . . . . . . . . 116
Added shorthand for \char255 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Made tilde expand to a tilde with \catcode 12 . . . . . . . . . . . . . . . . . . . . 117
greek-1.1c
General: Added a couple of symbols, needed for \greeknumeral . . . . . . . . . . 117
\noextrasgreek: xed two typos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
greek-1.1d
\dategreek: Macro \gr@month now produces the name of the month . . . . . . 112
greek-1.1e
General: Added caption name for proof . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Most symbols are removed and are now dened in package grsymb . . . . . . 117
\gr@month: Macro added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
\noextrasgreek: Added lowercase code for v . . . . . . . . . . . . . . . . . . . . . . . 116
Added uppercase code for special letter v. Uppercase code for accents is now
9f, instead of ff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

495
Shorthand is changed. Active character is now \char159 . . . . . . . . . . . . . 116
greek-1.2
General: Added caption names for \polutonikogreek . . . . . . . . . . . . . . . . . 112
Classical Greek is now a dialect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
\gr@c@greek: Added macro \datepolutonikogreek . . . . . . . . . . . . . . . . . . . 112
Added macro \gr@cl@month . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
\noextrasgreek: Added lowercase codes for modern greek . . . . . . . . . . . . 116
Added uppercase codes for modern Greek. The old codes are now for Polu-
toniko Greek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Denitions for modern Greek are now the denitions of Polutoniko Greek 116
greek-1.2a
General: lename lgrenc.def now lowercase . . . . . . . . . . . . . . . . . . . . . . . . 111
\dategreek: Use \edef to dene \today . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
\noextrasgreek: Need shorthand to exist for monotoniko Greek, not polu-
toniko Greek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
greek-1.2b
General: Classical Greek is now called Polutoniko Greek. The previous name
was at least misleading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
\dategreek: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
\gr@num@iii: No longer use \ in the expansion of the \gr@num@x macros as they
ned to be expandable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
greek-1.2c
General: Package grsymb has been eliminated because the CB fonts v2.0 do not
inlcude certain symbols and so the remaining symbol denitions have been
moved here . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
This version conforms to version 2.0 of the CB fonts and consequently we added
a few new symbol-producing commands . . . . . . . . . . . . . . . . . . . . . . . . . 109
greek-1.2e
\greek@Roman: Moved redenition of \@roman back to the language specic le 114
greek-1.2f
\ltx@amp: Now switch the denition of \& from \extrasgreek . . . . . . . . . . . 115
greek-1.3a
General: polutoniko is now an attribute to Greek, no longer a `dialect' . . . . . 109
\gr@c@greek: removed macro \datepolutonikogreek . . . . . . . . . . . . . . . . . 112
greek-1.3b
\greeknumeral: Added \expandafter and \number (PR3000) in order to make a
counter an acceptable argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
greek-1.3c
\ltx@amp: Added a missing opening brace . . . . . . . . . . . . . . . . . . . . . . . . . . 115
greek-1.3d
General: Fixed typo, bl'epe ep'ishc instead of bl'pe ep'ishc . . . . . . 111, 112
\greek@Roman: \@roman and \@Roman need to be added to \extraspolutonikogreek
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
greek-1.3e
\greek@Roman: \@roman and \@Roman need not be in \extraspolutonikogreek
when they are already in \extrasgreek . . . . . . . . . . . . . . . . . . . . . . . . . 114
\noextrasgreek: \extrasgreek and \extraspolutonikogreek should be com-
plementary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
greek-1.3f
General: Added some code to make older documents work . . . . . . . . . . . . . . 110
greek-1.3g
General: \noextraspolutonikogreek was missing . . . . . . . . . . . . . . . . . . . . 110
greek-1.3h
\captionsgreek: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

496
\greekhyphenmins: Now use \providehyphenmins to provide a default value 111
greek-1.3i
\captionsgreek: The nal sigma in all names appears as `s' instead of `c'. . . 111
\noextrasgreek: uc code of `v' is switched to V so that mixed text appears
correctly in headers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
greek-1.3j
\noextrasgreek: Because other languages might make the caret active, we can't
use the double caret notation here . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Ues the tilde as an alias for character 159 . . . . . . . . . . . . . . . . . . . . . . . . 116
greek-1.3k
\greek@tilde: Make sure the character `' is not active during the denition of
\greek@tilde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
\textgreek: Added \leavevmode as was done with \latintext . . . . . . . . . . 111
greek-1.3l
General: Commented these lines out as this change has made it into LATEX itself. 117

heb209 1.0a
General: Initial version. Provides hebrew_newcode, hebrew_oldcode and he-
brew_p style les for LATEX 2.09 (by Boris Lavva) . . . . . . . . . . . . . . . . . 444
hebfdd-1.0a
General: Initial version. Supports only 7-bit LHE font encoding and all available
Hebrew TEX fonts (by Boris Lavva) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
hebfdd-1.0b
General: xed lhecmr.fd to use oldjaf10 for a slanted font available Hebrew TEX
fonts (by Tzafrir Cohen) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
hebfdd-1.1a
General: Adding 8-bit HE8 fonts. Note that most of them cannot be distributed
with hebLATEX (by Tzafrir Cohen) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
hebfdd-1.2a
General: Adding congurations for the Culmus fonts, currently 0.90 (by Tzafrir
Cohen) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
hebfdd-1.2b
General: Reinstated the test whether LHE or HE8 is to be used . . . . . . . . . . 427
hebinp 1.0a
General: Initial version. Provides 8859-8, cp862, cp1255, and old 7-bit input
encodings (by Boris Lavva) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
hebinp 1.1
General: Renamed hebrew letters: \alef to \hebalef etc. (by Tzafrir Cohen) 419
hebinp 1.1a
General: Renamed CP1255 nikud \patah to \hebpatah etc. Added the macro
\DisableNikud - may not be a good idea (by Tzafrir Cohen) . . . . . . . . . . 419
hebrew-1.2c
General: Typo's in the docstrip guards made HE8nachlieli.fd unusable . . . . . 427
hebrew-2.0b
\captionshebrew: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . 379
hebrew-2.3h
\hebrewencoding: Make LHE the default encoding for compatibility reasons 379
hebrew 0.1
General: Preliminary LATEX Hebrew option (by Sergio Fogel) . . . . . . . . . . . . 377
hebrew 0.2
General: Corrections and additions (by Rama Porrat) . . . . . . . . . . . . . . . . . 377
hebrew 0.6
General: Additions (by Yael Dubinsky) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377

497
hebrew 1.2
General: Bilingual tables, penalties, documentation and more changes (by Yaniv
Bargury) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 1.30
General: Font selection, various (by Alon Ziv) . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 1.31
General: Bug xes (by Alon Ziv) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 1.32
General: Made font-change command for numbers `\protect'ed (by Alon Ziv) 377
hebrew 1.33
General: Made \refstepcounter work using \@ltor (by Alon Ziv) . . . . . . . . 377
hebrew 1.34
General: Moved font loading to another le. Added \mainsec. Made all text
strings be produced by control codes (similar to LATEX2.09 Mar '92). Fixed
\noindent (by Alon Ziv) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 1.35
General: Moved the texts to a le selected by the current encoding (by Alon Ziv) 377
hebrew 1.36
General: Use TEX tricks to redene \theXXXX without keeping old denitions.
Use only \@eng for direction/font change (removed \@ltor). Switched from
use of \mainsec to code taken from babel system (by Alon Ziv) . . . . . . . . 377
hebrew 1.37
General: Use \add@around in dening font size commands. Small bug xes (by
Alon Ziv) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 1.38
General: \everypar changed so that \noindent works unmodied (by Alon Ziv,
thanks to Chris Rowley) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 1.39
General: Redened primitive sectioning commands. Changed \include so it nds
.h, .xet, and .ltx les (no extension needed). Reinstated use of \@ltor (by
Alon Ziv) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 1.40
General: Added the \@brackets hack (by Alon Ziv) . . . . . . . . . . . . . . . . . . 377
hebrew 1.41
General: Reworked towards using NFSS2. Changed some macro names to be more
logical: renamed \@ltor to \@number, \@eng to \@latin, and (in hebrew.ldf)
\@heb to \@hebrew (by Alon Ziv) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 1.42
General: Made list environments work better. Fixed thebibliography environment
(by Alon Ziv) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 2.0a
General: Completely rewritten for LATEX 2ε and babel support. Various input and
font encodings (with NFSS2) are supported too. The original hebrew.sty is
divided to a number of packages and denition les for better readability
and extensibility. Added some user- and code-level documentation inside the
.dtx and .fdd les, and LATEX-driven installation with hebrew.ins (by Boris
Lavva) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 2.0b
\hebrewhyphenmins: Now use \providehyphenmins to provide a default value 379
hebrew 2.1
General: corrections from Sivan Toledo: sender name in letter, and section name
in headings. (by Tzafrir Cohen) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377

498
hebrew 2.2
General: renamed hebrew letters to heb* (e.g.: alef renamed to hebalef) (by
Tzafrir Cohen) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 2.3
General: added several \@ifclassloaded{slides} to allow the use of the slides
class. (by Tzafrir Cohen) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 2.3a
General: The documentation should now be built ne (broken since at least 2.1,
and probably 2.0) (by Tzafrir Cohen) . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 2.3b
General: minor clean-ups. The documentation builds now with no warnings. Also
removed \R from the caption macro (added in 2.1) Added internal \@ensure@L
and \@ensure@R (Is there a real need for them? Maybe should they be ex-
posed?) (by Tzafrir Cohen) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 2.3c
General: a temporary x to the \gim macro. Should be replaced by stu from
hebcal. (by Tzafrir Cohen) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 2.3d
General: Initial support for the prosper class. Added \arabicnorl . (by Tzafrir
Cohen) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
hebrew 2.3e
General: Removing hebtech from this distriution (not relevant to babel), added
\HeblatexEncoding. some docs cleanup (by Tzafrir Cohen) . . . . . . . . . . . 377
hebrew 2.3f
General: redened \list instead of redening every environment that uses it.
some pscolor handling, removed HeblatexEncoding (don't use 2.3e) (by Tzafrir
Cohen) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377

icelandic-1.1
General: Added denitions for old icelandic. . . . . . . . . . . . . . . . . . . . . . . . . 242
icelandic-1.1a
General: Added denitions for formatting numbers in Icelandic and some extra
utilities. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
icelandic-1.1b
General: Added references to various publications used . . . . . . . . . . . . . . . . 243
icelandic-1.1c
General: Removed code already present in babel.def . . . . . . . . . . . . . . . . . 238
\dateicelandic: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . 241
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 241
icelandic-1.1e
\noextrasicelandic: Deactivate shorthands ouside of Icelandic . . . . . . . . . . 240
icelandic-1.1f
\captionsicelandic: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . 240
\noextrasicelandic: Now use \providehyphenmins to provide a default value 240
icelandic-1.1g
\captionsicelandic: Added translation for Glossary . . . . . . . . . . . . . . . . . 240
Only use 7-bit ASCII characters in order to keep the texts input encoding
independant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
irish-1.0b
General: Corrected typo (PR1652) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
irish-1.0c
\captionsirish: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . . . 105
irish-1.0e
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 106

499
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 105
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 105
irish-1.0f
\captionsirish: Added missing translations provided in PR 2719 . . . . . . . . 105
\dateirish: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 106
\irishhyphenmins: Added denition of \hyphenmins . . . . . . . . . . . . . . . . . . 105
irish-1.0h
\captionsirish: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
\irishhyphenmins: Now use \providehyphenmins to provide a default value 105
italian-0.99
General: First version, from english.doc . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
italian-1.0
General: Modied for babel 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Now use \adddialect if language undened . . . . . . . . . . . . . . . . . . . . . . 153
italian-1.0a
General: removed typo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
italian-1.0b
General: Removed bug found by van der Meer . . . . . . . . . . . . . . . . . . . . . . 152
italian-1.0c
\captionsitalian: \pagename should be \headpagename . . . . . . . . . . . . . . . 153
Removed \global denitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
\dateitalian: Removed \global denitions . . . . . . . . . . . . . . . . . . . . . . . . 154
italian-1.0d
\captionsitalian: `contiene' substitued by `Allegati' as suggested by Marco
Bozzo (BOZZO@CERNVM). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
italian-1.0e
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . 152
italian-1.0h
General: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . 153
italian-1.1
General: Added a warning when no hyphenation patterns were loaded. . . . . . 153
Brought up-to-date with babel 3.2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
\captionsitalian: \headpagename should be \pagename . . . . . . . . . . . . . . . 153
Added \seename, \alsoname and \prefacename . . . . . . . . . . . . . . . . . . . . 153
italian-1.2
General: Update for LaTeXe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
italian-1.2b
\captionsitalian: Changed some of the words following suggestions from Clau-
dio Beccari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
\italianhyphenmins: Added setting of left and righthyphenmin according to
Claudio Beccari's suggestion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
\noextrasitalian: Added setting of club- and widowpenalty . . . . . . . . . . . . 154
Added setting of nalhyphendemerits . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
italian-1.2e
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 153
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
italian-1.2f
General: Updated for babel 3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
italian-1.2g
\captionsitalian: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . 153

500
italian-1.2h
\captionsitalian: Added translation of `Proof' . . . . . . . . . . . . . . . . . . . . . 153
\noextrasitalian: Now give the apostrophe a lowercase code . . . . . . . . . . . 154
italian-1.2i
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 161
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 153
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 152
italian-1.2j
General: Added braces around second arg of \LdfInit . . . . . . . . . . . . . . . . 153
italian-1.2l
General: Added \unit, \ap, and \ped macros . . . . . . . . . . . . . . . . . . . . . . . 152
Added useful macros for fullling ISO 31/XI regulations . . . . . . . . . . . . . 157
\noextrasitalian: Changed example begl'italiani (obsolete spelling) with an-
other, nell'altezza, that behaves the same way . . . . . . . . . . . . . . . . . . . 154
italian-1.2m
General: Added support for etymological hyphenation . . . . . . . . . . . . . . . . . 152
Support for etymological hyphenation . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
\italianhyphenmins: Now use \providehyphenmins to provide a default value 154
italian-1.2n
General: Added several commands for the caporali double quotes and for simpli-
fying the accented vowel input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Completely modied etymological hyphenation facility . . . . . . . . . . . . . . . 152
Completely new etymological hyphenation facility . . . . . . . . . . . . . . . . . . 155
italian-1.2o
General: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
italian-1.2p
General: Removed redenition of \add@acc since its functionality has been intro-
duced into the kernel of LaTeX 2001/06/01 . . . . . . . . . . . . . . . . . . 152, 158
italian-1.2q
General: Added test for avoiding conict with package units.sty; adjusted caporali
functionality, since the previous one did not work with the standard (although
obsolete) slides class le . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Redened the caporali machinery so as to avoid incompatibilities with the
slides class, as there are no Cyrillic slides fonts as there are for Latins script 158
\ped: Added testing for avoiding conicts with the units.sty package . . . . . . 157
italian-1.2r
\it@cwm: Added \nobreak to \it@@cwm and corrected \it@next . . . . . . . . . . 156
italian-1.2s
General: Corrected email of CB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
italian-1.2t
\noextrasitalian: Added \@clubpenalty to the italian specic settings, other-
wise any sectioning command restores it to the default value valid for english
and most other languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

latin-0.99
General: Added shortcuts for breve, macron, and etymological hyphenation (CB) 163
First version, from italian.dtx (CB) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
latin-1.2
General: Added suggestions from Krzysztof Konrad ›elechowski (CB) . . . . . 163
latin-2.0
General: Completely new etymological hyphenation (CB) . . . . . . . . . . . . . . 163
latin-2.0a
General: Revised by JB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163

501
\latinhyphenmins: Now use \providehyphenmins to provide a default value 166
latin-2.0b
General: Simplied shortcuts for etymological hyphenation; modied breve and
macro shortcuts; language attribute medieval declared . . . . . . . . . . . . . . 163
latin-2.0c
General: Restored caret and equals sign category codes before exiting . . . . . 163
latin-2.0d
General: Restored caret and equals sign category codes before exiting . . . . . 163
latin-2.0e
General: Introduced the language attribute `withprosodicmarks'; modied use of
breve and macron shortcuts in order to avoid possible conicts with other
packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
latin-2.0f
\datelatin: Added a comment character to prevent unwanted space . . . . . . 165
latin-2.0g
General: Added a \nobreak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
\LatinMarksOff: Added two commands . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
\ProsodicMarks: changed \allowhyphens to \bbl@allowhyphens . . . . . . . . . 168
latin-2.0h
\LatinMarksOff: Added missing backslash . . . . . . . . . . . . . . . . . . . . . . . . . 169
Removed the setting of \LatinMarksOff from \extraslatin . . . . . . . . . . 169
latin-2.0i
General: Corrected the \@clubpenalty problem . . . . . . . . . . . . . . . . . . . . . 163
latin-2.0j
General: Added a missing comment char and a missing closing brace . . . . . . 163
latin-2.0k
\LatinMarksOff: Set the \LatinMarks... commands equal to the \ProsodicMarks..
commands for compatibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
\ProsodicMarks: Restore category codes rather then return them to their TEX
default values. And do that outside of the command denition . . . . . . . . 169
Use \active instead of 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
\ProsodicMarksOff: Save current category codes of equals sign and caret in order
to restore them later . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
lsorbian-0.1
General: First version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
lsorbian-1.0b
\captionslsorbian: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . 368
lsorbian-1.0d
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 369
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 368
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 368
lsorbian-1.0e
\newdatelsorbian: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . 369
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 369
lsorbian-1.0f
\captionslsorbian: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . 368
lsorbian-1.0g
General: Make this work for more than one option name . . . . . . . . . . . . . . . 369
Make this work for more than one option name. . . . . . . . . . . . . . . . . . . . 369
This le can be loaded under more than one name. . . . . . . . . . . . . . . . . . 368
\captionslsorbian: Make this work for more than one option name. . . . . . . 368
\newdatelsorbian: Make this work for more than one option name. . . . . . . . 369
\olddatelsorbian: Make this work for more than one option name. . . . . . . . 369

502
magyar-1.0a
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . 261
magyar-1.0b
General: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . 262
magyar-1.1
General: Added a warning when no hyphenation patterns were loaded. . . . . . 262
Brought up-to-date with babel 3.2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
\captionsmagyar: \headpagename should be \pagename . . . . . . . . . . . . . . . . 263
Added \seename, \alsoname and \prefacename . . . . . . . . . . . . . . . . . . . . 263
magyar-1.1c
\captionsmagyar: Added translations, xed typos . . . . . . . . . . . . . . . . . . . . 263
\ondatemagyar: The date number should not be followed by a dot. . . . . . . . 264
magyar-1.1d
General: Further spelling corrections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
\datemagyar: Rewritten to produce the correct date format . . . . . . . . . . . . . 263
\ondatemagyar: Renamed from \datemagyar; nolonger redenes \today. . . . 264
magyar-1.1e
General: Still more spelling corrections . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
magyar-1.2
General: Update for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
magyar-1.3c
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 262
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
magyar-1.3e
\captionsmagyar: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . . 263
magyar-1.3f
\captionsmagyar: translated Proof and replaced some translations . . . . . . . 263
magyar-1.3g
General: Replaced \undefined with \@undefined and \empty with \@empty for
consistency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
magyar-1.3h
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 278
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 262
magyar-1.4a
General: order inverting in headings/titles/captions; denite article handling; ac-
tive char for special hyphenation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
\captionsmagyar: the initial letter of fejezet, táblázat, rész, lásd changed to
lowercase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
\datemagyar: Use \number\day instead of \ifcase construct . . . . . . . . . . . . 263
magyar-1.4b
\captionsmagyar: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . 263
magyar-1.4c
General: Make sure that the grave accent has catcode 12 before it is made \active 277
magyar-1.4d
General: Corrected checksum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
The \else clause got outside of the \if statement, breaking the Hungarian
support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
magyar-1.4f
\hun@tempadef: Added \def\safe@activesfalse as a x for PR3426 . . . . . . 272
magyar-1.4g
General: Further change to make it work when neither \l@magyar nor \l@hugarian
are dened . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262

503
magyar-1.4h
\captionsmagyar: Inserted translation for Glossary . . . . . . . . . . . . . . . . . . . 263
magyar-1.4i
\fnum@table: Use \nobreakspace instead of tilde . . . . . . . . . . . . . . . . . . . . 264
magyar-1.4j
General: Added missing comment characters in the redenitions of \ps@headings
to prevent spurious spaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261

ngermab-v2.6n
\captionsnaustrian: Corrected typo \captionnsgerman . . . . . . . . . . . . . . . . 95
ngermanb-2.6f
General: Renamed from germanb.ldf; language names changed from german and
austrian to ngerman and naustrian. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
ngermanb-2.6j
\noextrasnaustrian: Deactivate shorthands ouside of German . . . . . . . . . . . 96
ngermanb-2.6k
\captionsnaustrian: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . 95
\noextrasnaustrian: Now use \providehyphenmins to provide a default value 96
ngermanb-2.6m
\noextrasnaustrian: Turn frenchspacing on, as in german.sty . . . . . . . . . . . 97
norks-2.0h
\captionsnynorsk: Changed \ccname and \alsoname . . . . . . . . . . . . . . . . . 248
norsk-1.0a
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . 247
norsk-1.0c
General: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . 247
norsk-1.1a
General: Added a warning when no hyphenation patterns were loaded. . . . . . 247
Brought up-to-date with babel 3.2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
\captionsnorsk: Added \seename, \alsoname and \prefacename . . . . . . . . . 248
\captionsnynorsk: Added \seename, \alsoname and \prefacename . . . . . . . 248
norsk-1.1b
\captionsnorsk: \headpagename should be \pagename . . . . . . . . . . . . . . . . 248
\captionsnynorsk: \headpagename should be \pagename . . . . . . . . . . . . . . . 248
norsk-1.1c
General: Added a couple of translations (from Per Norman Oma, TeX@itk.unit.no)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
norsk-1.2a
General: Update for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
norsk-1.2d
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 247
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
norsk-1.2f
\captionsnorsk: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . . . 248
\norskhyphenmins: Added setting of hyphenmin parameters . . . . . . . . . . . . 247
norsk-1.2g
\captionsnorsk: Replaced `Proof' by its translation . . . . . . . . . . . . . . . . . . 248
\captionsnynorsk: Replaced `Proof' by its translation . . . . . . . . . . . . . . . . 248
norsk-1.2h
General: Moved the denition of \atcatcode right to the beginning. . . . . . . 247
Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 247

504
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
norsk-1.2i
\datenorsk: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 249
norsk-2.0a
General: Describe the use of double quote as active character . . . . . . . . . . . . 247
Made double quote character active . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
\norskhyphenmins: Changed setting of hyphenmin parameters to 2 2 . . . . . . 247
norsk-2.0b
General: added the french double quotes . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Copied the coding for "f from germanb.dtx version 2.6g . . . . . . . . . . . . . 250
norsk-2.0c
General: Deactivate shorthands ouside of Norsk . . . . . . . . . . . . . . . . . . . . . 249
norsk-2.0d
General: Shorthands are the same for both spelling variants, no need to use
\CurrentOption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Use \bbl@allowhyphens in "- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
norsk-2.0e
\captionsnorsk: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
\captionsnynorsk: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . 248
\norskhyphenmins: Now use \providehyphenmins to provide a default value 247
norsk-2.0g
\captionsnorsk: Replaced `Glossary' by its translation . . . . . . . . . . . . . . . . 248
\captionsnynorsk: Replaced `Glossary' by its translation . . . . . . . . . . . . . . 248

polish-1.0a
\textpl: Initially execute `textpl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
polish-1.1c
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 301
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
polish-1.1d
General: The dqmacro for C used \'c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
polish-1.2a
General: Don't modify \rm and friends for LATEX 2ε , take \selectfont instead 304
polish-1.2b
\captionspolish: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . . 301
polish-1.2d
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 306
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 301
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 301
\Eob: Use the constructed version of the characters only in OT1; use proper
characters in T1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
\skb: \skb is meant to be used in horizontal mode; so leave vertical mode if
necessary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
\sob: This macro is meant to be used in horizontal mode; so leave vertical mode
if necessary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
\spb: \spb is meant to be used in horizontal mode; so leave vertical mode if
necessary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
polish-1.2e
General: Removed empty groups after double quote and guillemot characters 305

505
polish-1.2f
\captionspolish: Added translation for Proof and changed translation of Con-
tents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
\datepolish: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 302
\mdqoff: Now use \shorthandon and \shorthandoff . . . . . . . . . . . . . . . . . . 306
polish-1.2h
\noextraspolish: Deactivate shorthands ouside of Polish . . . . . . . . . . . . . . 302
polish-1.2i
\captionspolish: \bibname and \refname were swapped . . . . . . . . . . . . . . 301
Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
\datepolish: A missing comment character caused an unwanted space character
in the output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
polish-1.2j
\polishzx: Added support for two notationstyles for kropka and accented z . 305
polish-1.2k
\polishzx: Fixed a typo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
polish-1.2l
General: Changed closing quote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
portuges-1.0a
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . 171
portuges-1.0b
General: Removed use of cs@ifundened . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
portuges-1.1
General: Added a warning when no hyphenation patterns were loaded. . . . . . 171
Brought up-to-date with babel 3.2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
\captionsportuges: \headpagename should be \pagename . . . . . . . . . . . . . . 172
Added \seename, \alsoname and \prefacename . . . . . . . . . . . . . . . . . . . . 172
portuges-1.2
General: Update for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
portuges-1.2d
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 171
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
portuges-1.2e
\captionsportuges: Added a few missing translations . . . . . . . . . . . . . . . . . 172
portuges-1.2g
General: Enhanced support for brasilian . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
\captionsbrazil: The captions for brasilian and portuguese are dierent now 173
\extrasportuges: Added the denition of some " shorthands . . . . . . . . . . . 174
\ord: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
\orda: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
\portugeshyphenmins: Added setting of hyphenmin values . . . . . . . . . . . . . 174
\ra: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
\ro: Added macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
portuges-1.2h
\captionsportuges: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . 172
portuges-1.2i
\captionsbrazil: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . . 173
\captionsportuges: Substituted `Prova' for `Proof' . . . . . . . . . . . . . . . . . . 172
portuges-1.2j
General: Moved the denition of \atcatcode right to the beginning. . . . . . . 171
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 171
ow use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175

506
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
portuges-1.2k
\datebrazil: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 173
\dateportuges: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . 173
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 173
\noextrasportuges: Removed empty groups after guillemot characters . . . . 174
portuges-1.2m
\captionsbrazil: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . 173
\captionsportuges: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . 173
\noextrasportuges: Deactivate shorthands ouside of Basque . . . . . . . . . . . . 174
\portugeshyphenmins: Now use \providehyphenmins to provide a default value 174
portuges-1.2n
\datebrazil: Removed spurious space after dezembro . . . . . . . . . . . . . . . . . 173
\dateportuges: Removed spurious space after Dezembro . . . . . . . . . . . . . . . 173
portuges-1.2o
\portugeshyphenmins: Set \righthyphenmin to 3 if not provided by the pattern
le. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
portuges-1.2p
\captionsportuges: Substituted `Glossário' for `Glossary' . . . . . . . . . . . . . . 173
portuges-1.2q
\captionsbrazil: Substituted `Glossário' for `Glossary' . . . . . . . . . . . . . . . . 173

romanian-1.0a
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . . . 233
romanian-1.0b
General: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . 233
romanian-1.1
General: Added a warning when no hyphenation patterns were loaded. . . . . . 233
Brought up-to-date with babel 3.2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
\captionsromanian: \headpagename should be \pagename . . . . . . . . . . . . . . 233
Added \seename, \alsoname and \prefacename . . . . . . . . . . . . . . . . . . . . 233
Translation errors found by Robert Juhasz xed . . . . . . . . . . . . . . . . . . . 233
\dateromanian: Translation errors found by Robert Juhasz xed . . . . . . . . . 233
romanian-1.2
General: Update for LaTeX2e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
romanian-1.2d
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 233
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
romanian-1.2e
General: Updated for babel release 3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
romanian-1.2f
\captionsromanian: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . 233
romanian-1.2g
\captionsromanian: Added translation of `Proof' . . . . . . . . . . . . . . . . . . . . 233
romanian-1.2h
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 234
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 233
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 233
romanian-1.2i
\dateromanian: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . 233

507
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 233
romanian-1.2k
\captionsromanian: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . 233
romanian-1.2l
\captionsromanian: Added translation for Glossary . . . . . . . . . . . . . . . . . . 233
russianb-1.1a
\extrasrussian: Use \ddot instead of \@MATHUMLAUT . . . . . . . . . . . . . . . . . 337
use \russianhyphenmins to store the correct values . . . . . . . . . . . . . . . . . 339
Use the new mechanism for dealing with active characters . . . . . . . . . . . . 335
\russian@sh@?@: Use new \DefineActiveNoArg . . . . . . . . . . . . . . . . . . . . . 336
Use the more general mechanism of \declare@shorthand . . . . . . . . . . . . . 336
\system@sh@;@: Added system level shorthands . . . . . . . . . . . . . . . . . . . . . . 337
russianb-1.1b
\extrasrussian: Added switch to LWN encoding . . . . . . . . . . . . . . . . . . . . . 334
\russian@sh@?@: Updated to reect the latest french denitions . . . . . . . . . 336
\verbatim@font: Added changing of \verbatim@font . . . . . . . . . . . . . . . . . 334
russianb-1.1c
General: Replaced \undefined with \@undefined and \empty with \@empty for
consistency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
russianb-1.1d
General: Moved the denition of \atcatcode right to the beginning. . . . . . . 328
Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 329
russianb-1.1e
General: Added closing brace to second argument of \LdfInit . . . . . . . . . . . 329
russianb-1.1f
General: Added denitions of Cyrillic emdash stu and thinspace . . . . . . . . . 328
\extrasrussian: Add commands for switch on/o doublequote activeness. Bor-
rowed from german. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Add macro for thinspace between initials . . . . . . . . . . . . . . . . . . . . . . . . . 339
Added a hook to insert space or not before `double punctuation' (from frenchb).
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335, 336
Rearranging of cyrillic emdash stu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
\FDPoff: One more chance to avoid spaces before double punctuation . . . . . 337
\russian@sh@?@: changed to kern.1em (space bit thinner) . . . . . . . . . . . . . . 336
Added a hook to insert space or not before `double punctuation' (from frenchb).
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
russianb-1.1k
General: replaced all \penalty\@M with \nobreak . . . . . . . . . . . . . . . . . . . . 328
russianb-1.1l
General: Made not using inputenc a warning instead of an error . . . . . . . . . . 332
russianb-1.1m
\captionsrussian: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . 334
\extrasrussian: Now use \providehyphenmins to provide a default value . . 339
russianb-1.1n
General: As this code generates a textfont 7 error it is commented out for now. 331
russianb-1.1o
\latintext: \latintext is already dened by the core of babel . . . . . . . . . . 332
\textlatin: \textlatin already dened by the core of babel . . . . . . . . . . . . 332
russianb-1.1q
General: Change denition of \th only for this language . . . . . . . . . . . . . . . 340
russianb-1.1r
\extrasrussian: Removed the commanet character before the next code line, see
R3669 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339

508
samin-1.0b
\captionssamin: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
\saminhyphenmins: use \providehyphenmins . . . . . . . . . . . . . . . . . . . . . . . 256
samin-1.0c
\captionssamin: Provided the translation for glossary . . . . . . . . . . . . . . . . . 256
scottish-1.0b
General: Corrected typos (PR1652) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
scottish-1.0c
\captionsscottish: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . 107
scottish-1.0d
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 108
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 107
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 107
scottish-1.0e
\datescottish: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . 107
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 107
scottish-1.0g
\captionsscottish: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . 107
serbian-1.0b
General: Added suggestions for shorthands and so on from Jankovic Slobodan 307
\noextrasserbian: Introduced the active " . . . . . . . . . . . . . . . . . . . . . . . . . 308
serbian-1.0c
\noextrasserbian: Deactivate shorthands ouside of Serbian . . . . . . . . . . . . 308
serbian-1.0d
\captionsserbian: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . 307
\noextrasserbian: Changed denition of "- to be the same as for other lan-
guages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
slovak-1.0
General: First version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
slovak-1.2
General: Update for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
slovak-1.2b
General: Added setting of left- and righthyphenmin . . . . . . . . . . . . . . . . . . . 314
slovak-1.2d
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 312
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
slovak-1.2e
General: Now use \slovakhyphenmins . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
\noextrasslovak: Use LATEX's \v accent command . . . . . . . . . . . . . . . . . . . 314
slovak-1.2g
\captionsslovak: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . . 313
slovak-1.2i
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 324
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 311
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 310
slovak-1.2j
\dateslovak: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 313
slovak-1.2k
\captionsslovak: Repaired a few spelling mistakes . . . . . . . . . . . . . . . . . . . 313
\dateslovak: Repaired a spelling mistake . . . . . . . . . . . . . . . . . . . . . . . . . . 313

509
slovak-1.2l
General: Now use \providehyphenmins to provide a default value . . . . . . . . 314
\captionsslovak: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . 313
slovak-1.3a
General: Added contributed shorthand denitions . . . . . . . . . . . . . . . . . . . . 310
\noextrasslovak: Make three characters available for shorthands . . . . . . . . 314
slovak-3.0
General: Changed default \righthyphenmin to 3 characters. . . . . . . . . . . . . 314
Implemented the functionality of CSLATEX's slovak.sty. The version number was
bumped to 3.0 to minimize confusion by being higher than the last version of
CSLATEX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
\captionsslovak: Updated some translations. Former translations were: `Úvod'
for \prefacename, `Referencie' for \refname, `Index' for \indexname, `Obrá-
zok' for \figurename, `Prílohy' for \enclname, `CC' for \ccname, `Komu' for
\headtoname, `Strana' for \pagename . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
\noextrasslovak: now use \bbl@frenchspacing and \bbl@nonfrenchspacing 313
slovak-3.1
\cs@emdash: ensure correct catcode for the saved hyphen . . . . . . . . . . . . . . . 318
\cs@splitattr: attribute added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
\noextrasslovak: move \languageshorthands here, so that the language group
is always initialized correctly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
\splithyphens: activate with split hyphens and deactivate with standard hy-
phens, not vice versa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
slovene-1.0a
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . . . 325
slovene-1.0b
General: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . 325
slovene-1.1
General: Added a warning when no hyphenation patterns were loaded. . . . . . 325
Brought up-to-date with babel 3.2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
\captionsslovene: \headpagename should be \pagename . . . . . . . . . . . . . . . 325
Added \seename, \alsoname and \prefacename . . . . . . . . . . . . . . . . . . . . 325
slovene-1.2
General: Update for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
slovene-1.2b
\captionsslovene: Added extra translations from Josef Leydold, leydold@statrix2.wu-wien.ac.at
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
slovene-1.2d
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 325
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
slovene-1.2f
\noextrasslovene: Introduced the active " . . . . . . . . . . . . . . . . . . . . . . . . . 326
slovene-1.2g
\captionsslovene: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . 325
slovene-1.2h
\captionsslovene: Added translation of `Proof' . . . . . . . . . . . . . . . . . . . . . 325
slovene-1.2i
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 327
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 325
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 325
Replaced `Slovanian' with correct `Slovenian' . . . . . . . . . . . . . . . . . . . . . . 325
\noextrasslovene: removed shorthand for "L as it is not needed for slovenian 326

510
slovene-1.2j
\dateslovene: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 326
\noextrasslovene: Removed empty groups after double quote and guillemot
characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
slovene-1.2l
\noextrasslovene: Deactivate shorthands ouside of Slovene . . . . . . . . . . . . 326
slovene-1.2m
\captionsslovene: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . 325
spanish-5.0e
General: Two acutes in a row should be turned into a double right quote . . . 192
spanish 5.0a
General: Reimplemented in full, which some parts rewritten from scratch. Added
the es- mechanism and the mexico option. Many bug xes. . . . . . . . . . . . 180
spanish 5.0d
General: Fixed two bugs: misplaced subscripts with lim and the like; problem
with \roman and hyperref. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
swedish-1.0a
General: Renamed babel.sty in babel.com . . . . . . . . . . . . . . . . . . . . . . . . 252
swedish-1.0b
\captionsswedish: added denition for \enclname . . . . . . . . . . . . . . . . . . . 253
made denition of \refname pluralis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
removed type in denition of \contentsname . . . . . . . . . . . . . . . . . . . . . . 253
swedish-1.0c
General: Removed use of \@ifundefined . . . . . . . . . . . . . . . . . . . . . . . . . . 252
swedish-1.1
General: Added a warning when no hyphenation patterns were loaded. . . . . . 252
Brought up-to-date with babel 3.2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
\captionsswedish: \headpagename should be \pagename . . . . . . . . . . . . . . . 253
Added \seename, \alsoname and \prefacename . . . . . . . . . . . . . . . . . . . . 253
swedish-1.1b
\captionsswedish: Added translations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
swedish-1.2
General: Update for LaTeX2e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
swedish-1.3d
General: Now use \@nopatterns to producew the warning . . . . . . . . . . . . . . 252
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
\captionsswedish: Changed \aa to \csname aa\endcsname, to make \uppercase
do the right thing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
swedish-1.3e
General: Update for release 3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
\captionsswedish: Changed \alsoname from `se också' . . . . . . . . . . . . . . . 253
\extrasswedish: Added \bbl@frenchspacing . . . . . . . . . . . . . . . . . . . . . . . 254
\noextrasswedish: Added \bbl@nonfrenchspacing . . . . . . . . . . . . . . . . . . 254
\swedishhyphenmins: use \swedishhyphenmins to store the correct values . . 254
swedish-1.3f
\captionsswedish: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . 253
swedish-1.3g
\captionsswedish: Replaced `Proof' by its translation . . . . . . . . . . . . . . . . 253
swedish-2.0
General: Introduced active double quote . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
\noextrasswedish: Added active double quote character . . . . . . . . . . . . . . . 254

511
swedish-2.1
General: Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . 255
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 252
Replaced \undefined with \@undefined and \empty with \@empty for consis-
tency with LATEX, moved the denition of \atcatcode right to the beginning. 252
swedish-2.2
\dateswedish: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 253
swedish-2.2b
\noextrasswedish: Deactivate shorthands ouside of Swedish . . . . . . . . . . . . 254
swedish-2.3a
General: added \allowhyphens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
changed denition of "=, \- and " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
\captionsswedish: Added full stop after Bil . . . . . . . . . . . . . . . . . . . . . . 253
\datesdmy: Command added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
\datesymd: Command added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
swedish-2.3b
\captionsswedish: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . 253
swedish-2.3c
\captionsswedish: Provided translation for Glossary . . . . . . . . . . . . . . . . . 253
swedish-2.3d
General: Fixed a \changes entry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252

turkish-1.1
\captionsturkish: \headpagename should be \pagename . . . . . . . . . . . . . . . 374
turkish-1.2
General: Update for LATEX 2ε . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
turkish-1.2b
\captionsturkish: Added braces behind \i in strings . . . . . . . . . . . . . . . . . 374
\dateturkish: Added braces behind \i in strings . . . . . . . . . . . . . . . . . . . . 375
turkish-1.2c
General: Now use \@nopatterns to produce the warning . . . . . . . . . . . . . . . 374
Removed the use of \filedate and moved identication after the loading of
babel.def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
turkish-1.2d
\dateturkish: removed extra closing brace, \mont should be \month . . . . . . 375
\turkish@sh@:@: Added missing \def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
turkish-1.2e
\extrasturkish: Completely rewrote macro . . . . . . . . . . . . . . . . . . . . . . . . 375
\noextrasturkish: now use \bbl@frenchspacing and \bbl@nonfrenchspacing 375
\turkish@sh@:@: Use the new mechanism of \declare@shorthand . . . . . . . . 375
turkish-1.2f
\captionsturkish: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . . 374
turkish-1.2h
General: Replaced \undefined with \@undefined and \empty with \@empty for
consistency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
turkish-1.2i
General: Moved the denition of \atcatcode right to the beginning. . . . . . . 374
Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
ow use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . . 374
turkish-1.2j
\captionsturkish: Added and modied translations . . . . . . . . . . . . . . . . . . 374
\dateturkish: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 375

512
turkish-1.2k
\captionsturkish: Incorporated some more corrections ............... 374
turkish-1.2l
\dateturkish: removed dot from the date format . . . . . . . . . . . . . . . . . . . . 375
turkish-1.2m
\captionsturkish: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . 374

ukraineb-1.1d
\captionsukrainian: replace \CYRUKRI with \CYRII in \authorname . . . . . . 358
ukraineb-1.1e
General: replaced all \penalty\@M with \nobreak . . . . . . . . . . . . . . . . . . . . 354
ukraineb-1.1f
General: Made not using inputenc a warning instead of an error . . . . . . . . . . 358
ukraineb-1.1g
\captionsukrainian: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . 358
\extrasukrainian: Now use \providehyphenmins to provide a default value 365
ukraineb-1.1h
\captionsukrainian: Added translation for `Glossary' . . . . . . . . . . . . . . . . 358
ukraineb-1.1i
General: As this code generates a textfont 7 error it is commented out for now. 357
ukraineb-1.1j
\latintext: \latintext is already dened by the core of babel . . . . . . . . . . 358
\textlatin: \latintext is already dened by the core of babel . . . . . . . . . . 358
ukraineb-1.1k
General: Change denition of \th only for this language . . . . . . . . . . . . . . . 366
usorbian-0.1
General: First version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
usorbian-0.1b
General: Made it possible to run through LATEX; added \MF and removed extra
\endmacro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
usorbian-0.1c
\captionsusorbian: Removed two typos (Kapitel and Dodatki) . . . . . . . . . . 370
usorbian-1.0a
General: Removed stu that has been moved to babel.def . . . . . . . . . . . . . 372
usorbian-1.0b
\captionsusorbian: Added \proofname for AMS-LATEX . . . . . . . . . . . . . . . 370
usorbian-1.0c
General: Now use \bbl@disc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
usorbian-1.0d
General: Replaced \undefined with \@undefined and \empty with \@empty for
consistency with LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
usorbian-1.0e
General: Moved the denition of \atcatcode right to the beginning. . . . . . . 370
Now use \ldf@finish to wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Now use \LdfInit to perform initial checks . . . . . . . . . . . . . . . . . . . . . . . 370
usorbian-1.0f
General: Removed empty groups after double quote and guillemot characters 372
usorbian-1.0g
\ck: Now use \shorthandon and \shorthandoff . . . . . . . . . . . . . . . . . . . . . 373
\newdateusorbian: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . 371
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 371
\olddateusorbian: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . 371
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 371

513
usorbian-1.0h
\extrasusorbian: Deactivate shorthands ouside of Upper Sorbian . . . . . . . . 371
usorbian-1.0i
\captionsusorbian: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . 370
\extrasusorbian: Now use \providehyphenmins to provide a default value . 372
usorbian-1.0j
General: Check for the option lowersorbian . . . . . . . . . . . . . . . . . . .... ... 370
Make this work for more than one option name . . . . . . . . . . . . . .... 371, 373
This le can be loaded under more than one name. . . . . . . . . . . .... ... 370
\captionsusorbian: Make this work for more than one option name ... ... 370
\extrasusorbian: Make this work for more than one option name . .... ... 371
\newdateusorbian: Make this work for more than one option name .... ... 371
\olddateusorbian: Make this work for more than one option name .... ... 371
usorbian-1.0k
\extrasusorbian: Make sure the caret has the right \catcdoe . . . . ....... 371

v2.0
General: \parindentFFN not changed if already dened (required by JA for cah-
gut.cls). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Added warning for OT1 encoding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
AtBeginDocument, save again the denitions of the `list' and `itemize' envi-
ronments and the values of labelitems. As of frenchb v.1.6, `ORI' values were
set when reading frenchb.ldf, later changes were ignored. . . . . . . . . . . . . . 150
Footnotes are now printed by default `à la française' for the whole document. 139
New command \frenchbsetup added for global customisation. . . . . . . . . . 142
\bsc: \hbox dropped, replaced by \kern0pt. . . . . . . . . . . . . . . . . . . . . . . . . 132
\captionsfrench: `Fig.' changed to `Figure' and `Tab.' to `Table'. . . . . . . . . 135
Set \CaptionSeparator in \extrasfrench now instead of \captionsfrench
because it has to be reset when leaving French. . . . . . . . . . . . . . . . . . . . 135
\datefrench: 2 '\relax' added in \today's denition. . . . . . . . . . . . . . . . . . 130
\FBtextellipsis: Added special case for LY1 encoding, see bug report from
Bruno Voisin (2004/05/18). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
\nombre: \nombre requires now numprint.sty. . . . . . . . . . . . . . . . . . . . . . . . 134
v2.0b
General: Footnotes: Just do nothing (except warning) when the bigfoot package
is loaded. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
v2.0c
General: \ThinSpaceInFrenchNumbers added for compatibility with frenchb-1.x. 135
Option ThinSpaceInFrenchNumbers added. . . . . . . . . . . . . . . . . . . . . . . . 142
There is no need to dene here numprint's command \npstylefrench, it will
be redened `AtBeginDocument' by \FBprocess@options. . . . . . . . . . . . 135
v2.0d
General: Options og and fg changed: limit the denition to French so that quote
characters can be used in German. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
v2.0e
General: New option: StandardLists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
v2.0f
General: StandardLayout option had no eect on lists. Test moved to \FBprocess@options.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Two typos corrected in option StandardLists: [false] → [true] and Standard-
Layout → StandardLists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
v2.0g
General: Revert previous change to StandardLayout. This option must set
the three ags \FBReduceListSpacingfalse, \FBCompactItemizefalse, and

514
\FBStandardItemLabeltrue instead of \FBStandardListstrue, so that later
options can still change their value before executing \FBprocess@options.
Same thing for option StandardLists. . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
\StandardLayout: Flag \ifFBStandardLayout not checked by \FBprocess@options,
low-level ags have to be set one by one. . . . . . . . . . . . . . . . . . . . . . . . . 141
v2.1a
General: Command \fup added to produce better superscripts than \textsuperscript.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
New option: FrenchSuperscripts to dene \up as \fup or as \textsuperscript.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
New option: LowercaseSuperscripts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
\datefrench: \today changed (correction in 2.0 was wrong: \today was printed
without spaces in toc). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
v2.1b
General: Disable some commands in bookmarks. . . . . . . . . . . . . . . . . . . . . . 150
\fup: Command \fup changed to use real superscripts from fourier v. 1.6. . . 130
v2.1c
General: Added commands \Nos and \nos. . . . . . . . . . . . . . . . . . . . . . . . . . 132
\degres: Provide a temporary denition (hyperref safe) of \degres in case it has
to be expanded in the preamble (by beamer's \title command for instance). 133
\up: Provide a temporary denition (hyperref safe) of \up in case it has to be
expanded in the preamble (by beamer's \title command for instance). . . 130
v2.1d
General: Argument of \ProvidesLanguage changed above from `french' to
`frenchb' (otherwise \listfiles prints no date/version information). The real
name of current language (french) as to be corrected before calling \LdfInit. 124
Avoid warning  \end occurred when \ifx ... incomplete with LaTeX-2.09. 125
v2.2a
General: The global layout of the document is no longer changed when frenchb
is not the last option of babel (\bbl@main@language). Suggested by Ulrike
Fischer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Values of ags \ifFBReduceListSpacing, \ifFBCompactItemize, \ifFBStandardItemLabels,
\ifFBIndentFirst, \ifFBFrenchFootnotes, \ifFBAutoSpaceFootnotes changed:
default now means `StandardLayout', it will be changed to `FrenchLayout'
AtEndOfPackage only if french is \bbl@main@language. . . . . . . . . . . . . . 142
When frenchb is babel's last option, French becomes the document's main
language, so GlobalLayoutFrench applies. . . . . . . . . . . . . . . . . . . . . . . . . 142
\fup: \newif and \newdimen moved before \ifLaTeXe to avoid an error with
plainTeX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
v3.8a
\lower@umlaut: Use \leavevmode\bgroup to prevent problems when this com-
mand occurs in vertical mode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
\umlauthigh: Use \leavevmode\bgroup to prevent problems when this command
occurs in vertical mode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
v3.8d
\@notshorthand: Error message added . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

welsh-1.0b
\datewelsh: use \def instead of \edef . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Use \edef to dene \today to save memory . . . . . . . . . . . . . . . . . . . . . . 104
welsh-1.0c
\captionswelsh: Added \glossaryname . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
\welshhyphenmins: Now use \providehyphenmins to provide a default value 103

515
welsh-1.0d
\captionswelsh: Provided the translation for Glossary . . . . . . . . . . . . . . . . 103
\datewelsh: removed `a viz' from the denition of \today . . . . . . . . . . . . . . 104

516

You might also like