% $Id: deutsch.doc,v 1.4 1995/07/30 13:23:56 schrod Exp $
%----------------------------------------------------------------------
% Written by Joachim Schrod <schrod@iti.informatik.th-darmstadt.de>.
% This file is distributed without any copyright restriction.

%
% deutsch.doc  --  typeset German documents with plain TeX.
%
% [TeX in MAKEPROG]
% (history at end)


%%%%
%%%%
%%%% These TeX macros were documented with the documentation system
%%%% MAKEPROG and automatically converted to the current form.
%%%% If you have MAKEPROG available you may transform it back to
%%%% the original input: Remove every occurence of three percents
%%%% and one optional blank from the beginning of a line and remove
%%%% every line which starts with four percents.  The following lex
%%%% program will do this:
%%%%
%%%%	%%
%%%%
%%%%	^%%%\ ?   ;
%%%%	^%%%%.*\n ;
%%%%
%%%%	If you just want to print the documentation you may fetch
%%%% the archive print-makeprog.tar.Z from ftp.th-darmstadt.de (directory
%%%% pub/tex/latex). It contains *all* used styles -- but beware, they
%%%% may not be in a documented form...
%%%%
%%%%
%%% \input progdoc

%%% \input names.sty
%%% \def\babel{{\sf babel}}



%%% \title{Typesetting German Documents with Plain \TeX{}}



%%% \chap Introduction.

%%% There are several defencies of plain \TeX{} if used for German
%%% documents:

%%% \item{---} Mappings of national characters (`umlauts' and `sharp~s')
%%% to macros or to other character codes (if special fonts are available)
%%% are missing.

%%% \item{---} \TeX{} produces lots of overfull hboxes for German texts.
%%% That's because the words there are usually longer than English ones.
%%% Furthermore we have to use much more hyphenation for German texts than
%%% for English ones, narrow typesetting is more important than few
%%% hyphenations.  In particular, words with umlauts are not hyphenated
%%% often anyhow, even with the `multiple-word' approach from |german.sty|.

%%% \item{---} It is typographic usage that between compound words
%%% ligatures are not built. Plain~\TeX{} has no easy, readable way to
%%% provide this.

%%% \noindent This file does the according definitions. They are quite
%%% often only a kludge. But it is hard to make the restrictions
%%% disappear, sometimes it is even impossible within the current
%%% implementation of \TeX{}---and there will never be any other
%%% implementation. So we must live with these kludges.


%%% \sect Of course, there is more to German typesetting.  Hyphenation,
%%% also for words with umlauts and sharp~s, etc.  This basic
%%% functionality is supplied by the \babel{} system and DANTE's
%%% |german.sty|, we have to load the appropriate module.

%%% There's one problem, though. \babel{}~3.5 defines
%%% |\DeclareTextSymbol|, a symbol used by |german.sty| to decide if it
%%% shall use NFSS code to access symbols. But that usage will lead to an
%%% endless recursion, because some text symbols are defined by
%%% themselves. I don't know if that problem is caused by \babel{}'s code
%%% or by its usage in |german.sty| -- turning it off seems to be an
%%% appropriate fix.

%%% \beginprog
\let\DeclareTextSymbol\undefined
\input german.sty
%%% \endprog


%%% \sect But before we start we declare some shorthands for category
%%% codes. By declaring the at sign~(`|@|') as well as the
%%% underscore~`(|_|)' as letters we can use them in our macros. (I
%%% agree with D.~Knuth that |\identifier_several_words_long| is more
%%% readable than |\IdentifierSeveralWordsLong| and in every case better
%%% than |\p@@@s|.) With the at sign we can use the ``private'' Plain
%%% macros and with the underscore we can make our own macros more
%%% readable. But as we have to restore these category codes at the end
%%% of this macro file we store their former values in control
%%% sequences. This method is better than to use
%%% a group because not all macros have to be defined global this way.

%%% \beginprog
\ifx \CatEscape\undefined
    \chardef\CatEscape=0
    \chardef\CatOpen=1
    \chardef\CatClose=2
    \chardef\CatIgnore=9
    \chardef\CatLetter=11
    \chardef\CatOther=12
    \chardef\CatActive=13               % \active of plain.tex
    \chardef\CatInvalid=15

    \chardef\CatAtCode=\catcode`\@
    \chardef\CatUsCode=\catcode`\_
\fi

\catcode`\@=\CatLetter                  % top level macro file
\catcode`\_=\CatLetter
%%% \endprog


%%% \sect Let's identify this macro file against the user and in the Log file.

%%% \beginprog
\begingroup
    \catcode`\$=\CatIgnore
    \catcode`\:=\CatIgnore
    \message{Support for German documents, $Revision: 1.4 $}
\endgroup
%%% \endprog



%%% \chap National Characters.

%%% By default no extended characters are available, except those defined
%%% below.  I.e., we start to treat all characters from |"7F| to |"FF| as
%%% invalid characters.

%%% \beginprog
\count@="7F
\loop
    \catcode \the\count@ = \CatInvalid
    \advance\count@ by 1
  \ifnum \count@ < "100
\repeat
%%% \endprog


%%% \sect We provide a command for the definition of non-ASCII characters:
%%% |\ExtendChar|. A sample definition of an ``Umlaut-a''~(\"a) in the
%%% extended code of an IBM~PC (hex code~|"84|) is:
%%% $$
%%%     |\ExtendChar\^^84: {^^84}{\"a}|
%%% $$
%%% First the hex code is given as a control sequence, followed by a
%%% colon. Afterwards come two parameters, the first is again the hex
%%% code, the second is the token list which should be used instead of the
%%% hex code.

%%% The macro definition is rather easy, we just have to make the
%%% respective character active and bind it to it's new meaning.

%%% \beginprog
\def\ExtendChar #1:{%
    \catcode`#1 \CatActive
    \extend_char
    }
\def\extend_char #1#2{%
    \def #1{#2}%
    }
%%% \endprog


%%% \sect Now we can define some replacements.

%%% The braces after the control sequences are needed when characters from
%%% the extended character set are written to an auxiliary file and read
%%% in later. During the |\write| they are expanded and following white
%%% space would be gobbled if the braces would not be there.

%%% \beginprog
% ISO-Latin-1
\ExtendChar\^^c4: {^^c4}{\"A}
\ExtendChar\^^d6: {^^d6}{\"O}
\ExtendChar\^^dc: {^^dc}{\"U}
\ExtendChar\^^df: {^^df}{\ss{}}
\ExtendChar\^^e4: {^^e4}{\"a}
\ExtendChar\^^f6: {^^f6}{\"o}
\ExtendChar\^^fc: {^^fc}{\"u}

% IBM PC (code page 850)
\ExtendChar\^^81: {^^81}{\"u}
\ExtendChar\^^84: {^^84}{\"a}
\ExtendChar\^^8e: {^^8e}{\"A}
\ExtendChar\^^94: {^^94}{\"o}
\ExtendChar\^^99: {^^99}{\"O}
\ExtendChar\^^9a: {^^9a}{\"U}
\ExtendChar\^^e1: {^^e1}{\ss{}} % actually \beta, used as \ss in Germany

% Atari ST (like IBM PC, but with a real `sharp~s')
\ExtendChar\^^9e: {^^9e}{\ss{}}
%%% \endprog



%%% \chap Paragraph Breaking.

%%% As outlined in the introduction, we allow longer interword spaces.  A
%%% line now may have a badness up to 2500, over 1500 a warning is to be
%%% given. Furthermore the penalties for hyphenation are lowered because a
%%% narrow typesetting is preferred against few hyphenations.

%%% These values are still experimental and should be tuned.

%%% As |german.sty| uses \babel{} compatible structure, the german
%%% language hook is a good place to store such definitions. But to
%%% use \babel{}'s convenient macros, too, we have to assure that it's
%%% kernel code is loaded first.

%%% \beginprog
\ifx \babel@core@loaded\undefined
    \input babel.def
\fi
\addto\extrasgerman{%
    \babel@savevariable\tolerance
    \babel@savevariable\hbadness
    \babel@savevariable\doublehyphendemerits
    \babel@savevariable\finalhyphendemerits
    \babel@savevariable\adjdemerits
    \tolerance 2500  \hbadness 1500
    \doublehyphendemerits 50000
    \finalhyphendemerits 25000
    \adjdemerits 50000
    }
%%% \endprog


%%% \sect In some languages ligatures should not appear between compound
%%% words. We use {\tt \string\|\/} to mark those places. This is only
%%% done within text mode, in math mode {\tt \string\|\/} is still
%%% `$\|$'. But it is sure that one can always hyphenate between compound
%%% words, so we insert |\-|. To allow the hyphenation in other parts of
%%% the word though, we use |\allowhyphens| again.

%%% \beginprog
\def\|{%                % break open a ligature (if not in math mode)
    \relax
    \ifmmode  \Vert
    \else  \allowhyphens\-\allowhyphens
    \fi
    }
%%% \endprog


%%% \sect Don't use the dreaded `double quote special meaning' stuff of
%%% |german.sty|. And use original umlauts. Already in M\"unster I voted
%%% against it\dots

%%% \beginprog
\addto\extrasgerman{%
    \mdqoff
    \umlautlow
    }
%%% \endprog


%%% \sect Define |\SwitchtoLanguage| for upward compatibility.  It does
%%% not really do the same, the old definition was more similar to
%%% |\selectlanguage|.  But other languages have to be declared
%%% explicitely, that's not done by this macro file.  So we just want to
%%% make old documents processable.

%%% \beginprog
\def\SwitchtoLanguage#1{\language \csname l@#1\endcsname}
%%% \endprog


%%% \sect We are finished; switch to german language (to enable the new
%%% extras defined above), restore the catcodes and prevent from following
%%% garbage.

%%% \beginprog
\selectlanguage{german}

\catcode`\@=\CatAtCode
\catcode`\_=\CatUsCode

\endinput
%%% \endprog


%%% %% \sect {\it Acknowledgements:}\quad I would like to thank XXX


%%% \bye

%%% 
%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% %
%%% % $Log: deutsch.doc,v $
%%% % Revision 1.4  1995/07/30  13:23:56  schrod
%%% %     Discard babel definition of \DeclareTextCommand before including
%%% % german.sty, they are incompatible.
%%% %
%%% % Revision 1.3  1995/07/29  17:58:24  schrod
%%% %     Use german.sty, not germanb.sty. (babel 3.5 is not functional for
%%% % plain TeX any more.) But we still want to use babel's macros, we have
%%% % to load it's kernel for that.
%%% %
%%% % Revision 1.2  1995/03/13  23:18:10  schrod
%%% %     Started to manage this package with CVS. Made minor code cleanup.
%%% %
%%% % Revision 1.1  1994/10/16  16:57:30  schrod
%%% %     Merged macros from local.tex, codes.tex, and language.tex.  This
%%% % new file is mainly there to provide upward compatibility for our old
%%% % documents.
%%% %
%%% %
%%% %
%%% % pre-CVS Version History:
%%% %
%%% % DATE     WHO REMARKS
%%% % 91-01-18 js  set all extended characters to code invalid
%%% % 90-12-23 js  added the definition of \ExtendChar for usage in codes.tex.
%%% % 90-10-06 js  renamed from dlocal to local, it's now international,
%%% %              adapted to TeX 3:
%%% %                 included codes.tex and langdef.tex if they exist,
%%% %                 assumed that language.tex is already loaded,
%%% %                 defined German parameters as a language hook,
%%% %              removed first \allowhyphens in \uml@ut,
%%% %              documented it with MAKEPROG.
%%% % 89-10-27 js  was reworked for ILaTeX
%%% % 89-05-31 js  defined \| as a separator for ligatures in text mode
%%% % 87-10-01 js  introduced \protect,
%%% %              set parameters for German page makeup
%%% % 87-??-?? kg  first release
%%% %
%%% % kg: Klaus Guntermann <gunterma@<schrod@iti.informatik.th-darmstadt.de>
%%% % js: Joachim Schrod <schrod@iti.informatik.th-darmstadt.de>


%%% 
%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Local Variables:
%%% mode: plain-TeX
%%% TeX-master: t
%%% TeX-brace-indent-level: 4
%%% End: