% \iffalse meta-comment
%
% Copyright 1989-2005 Johannes L. Braams and any individual authors
% listed elsewhere in this file.  All rights reserved.
% 
% This file is part of the Babel system.
% --------------------------------------
% 
% It may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
% 
% This work has the LPPL maintenance status "maintained".
% 
% The Current Maintainer of this work is Johannes Braams.
% 
% The list of all files belonging to the Babel system is
% given in the file `manifest.bbl. See also `legal.bbl' for additional
% information.
% 
% The list of derived (unpacked) files belonging to the distribution
% and covered by LPPL is defined by the unpacking scripts (with
% extension .ins) which are part of the distribution.
% \fi
% \CheckSum{795}
%
% \iffalse
%<*dtx>
\ProvidesFile{bbplain.dtx}
       [2004/02/19 v1.0r Babel support for plain-based formats]
%</dtx>
%
%% File `bbplain.dtx'
%% Babel package for LaTeX version 2e
%% Copyright (C) 1989 - 2004
%%           by Johannes Braams
%
%% Please report errors to: J.L. Braams
%%                          babel at braams.cistron.nl
%
%    This file is part of the babel system, it provides the source
%    code for the extra definitions needed to be able to use babel
%    with a plain-based format.
%<*filedriver>
\documentclass{ltxdoc}
\font\manual=logo10 % font used for the METAFONT logo, etc.
\newcommand*\MF{{\manual META}\-{\manual FONT}}
\newcommand*{\babel}{\textsf{babel}}
\newcommand*{\langvar}{$\langle \it lang \rangle$}
\newcommand*{\note}[1]{}
\newcommand*{\pkg}[1]{\textsf{#1}}
\newcommand*{\Lopt}[1]{\textsf{#1}}
\newcommand*{\file}[1]{\texttt{#1}}
\begin{document}
 \DocInput{bbplain.dtx}
\end{document}
%</filedriver>
% \fi
%
% \GetFileInfo{bbplain.dtx}
% \StopEventually{}
% \changes{bbplain-1.0n}{1998/06/08}{Added the source for the format
%    wrapper files} 
%
%  \section{Not renaming \file{hyphen.tex}}
%    As Don Knuth has declared that the filename \file{hyphen.tex} may
%    only be used to designate \emph{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:
%    \begin{quote}
%      That file name is "sacred", and if anybody changes it they will
%      cause severe upward/downward compatibility headaches.
%
%      People can have a file localhyphen.tex or whatever they like,
%      but they mustn't diddle with hyphen.tex (or plain.tex except to
%      preload additional fonts). 
%    \end{quote}
%
%    The files \file{bplain.tex} and \file{blplain.tex} can be used as
%    replacement wrappers around \file{plain.tex} and
%    \file{lplain.tex} to acheive the desired effect, based on the
%    \pkg{babel} package. If you load each of them with ini\TeX, you
%    will get a file called either \file{bplain.fmt} or
%    \file{blplain.fmt}, which you can use as replacements for
%    \file{plain.fmt} and \file{lplain.fmt}.
%
%    As these files are going to be read as the first thing ini\TeX\
%    sees, we need to set some category codes just to be able to
%    change the definition of |\input|
%    \begin{macrocode}
%<*bplain|blplain>
\catcode`\{=1 % left brace is begin-group character
\catcode`\}=2 % right brace is end-group character
\catcode`\#=6 % hash mark is macro parameter character
%    \end{macrocode}
%    Now let's see if a file called \file{hyphen.cfg} can be found
%    somewhere on \TeX's input path by trying to open it for
%    reading... 
%    \begin{macrocode}
\openin 0 hyphen.cfg
%    \end{macrocode}
%    If the file wasn't found the following test turns out true.
%    \begin{macrocode}
\ifeof0
\else
%    \end{macrocode}
%    When \file{hyphen.cfg} could be opened we make sure that
%    \emph{it} will be read instead of the file \file{hyphen.tex}
%    which should (according to Don Knuth's ruling) contain the
%    american English hyphenation patterns and nothing else.
%
%    We do this by first 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).
%    \begin{macrocode}
  \let\a\input
%    \end{macrocode}
%    Then |\input| is defined to forget about its argument and load
%    \file{hyphen.cfg} instead.
%    \begin{macrocode}
  \def\input #1 {%
    \let\input\a
    \a hyphen.cfg
%    \end{macrocode}
%    Once that's done the original meaning of |\input| can be restored
%    and the definition of |\a| can be forgotten.
%    \begin{macrocode}
    \let\a\undefined
  }
\fi
%</bplain|blplain>
%    \end{macrocode}
%    Now that we have made sure that \file{hyphen.cfg} will be loaded
%    at the right moment it is time to load \file{plain.tex}.
%    \begin{macrocode}
%<bplain>\a plain.tex
%<blplain>\a lplain.tex
%    \end{macrocode}
%    Finally we change the contents of |\fmtname| to indicate that
%    this is \emph{not} the plain format, but a format based on plain
%    with the \pkg{babel} package preloaded.
%    \begin{macrocode}
%<bplain>\def\fmtname{babel-plain}
%<blplain>\def\fmtname{babel-lplain}
%    \end{macrocode}
%
%    When you are using a different format, based on plain.tex you can
%    make a copy of blplain.tex, rename it and replace \file{plain.tex}
%    with the name of your format file.
%
%  \section{Support for formats based on \textsc{plain}\TeX}
%
%    The following code duplicates or emulates parts of \LaTeXe\ that
%    are needed for \babel.
%
% \changes{bbplain-1.0f}{1996/07/09}{Consistently use \cs{@undefined}
%    instead of \cs{undefined}} 
% \changes{bbplain-1.0f}{1996/07/09}{added \cs{@empty}}
% \changes{bbplain-1.0h}{1996/10/07}{Only load the necessary parts
%    into the format, let this file be read agian by babel.def} 
%    \begin{macrocode}
%<*code>
\ifx\adddialect\@undefined
%    \end{macrocode}
%    When |\adddialect| is still undefined we are making a
%    format. In that case only the first part of this file is needed. 
%    \begin{macrocode}
  \def\@empty{}
%    \end{macrocode}
%    We need to define |\loadlocalcfg| for plain users as the
%    \LaTeX\ definition uses |\InputIfFileExists|.
% \changes{bbplain-1.0c}{1995/07/26}{Added definition of
%    \cs{loadlocalcfg}}
% \changes{bbplain-1.0d}{1996/01/08}{Also reset category codes after
%    loading the configuration file as \cs{AtEndOfPackage} is
%    undefined in this case} 
%    \begin{macrocode}
  \def\loadlocalcfg#1{%
    \openin0#1.cfg
    \ifeof0
      \closein0
    \else
      \closein0
      {\immediate\write16{*************************************}%
       \immediate\write16{* Local config file #1.cfg used}%
       \immediate\write16{*}%
       }
      \input #1.cfg\relax
    \fi
%    \end{macrocode}
%    We have to execute \cs{@endofldf} in this case
%    \begin{macrocode}
    \@endofldf
    }
%    \end{macrocode}
%
% \changes{bbplain-1.0c}{1995/11/08}{Moved the \cs{dump} code here from
%    \file{babel.dtx}}
%
% \changes{bbplain-0.1}{1991/10/31}{Added redefinition of \cs{dump} to
%    add a message to \cs{everyjob}}
%    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: 
%    \begin{verbatim}
%    \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}
%    \end{verbatim}
%    The code above redefines the control sequence \cs{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\ fills the
%    register.\\
%    There are some problems with this approach though.
%  \begin{itemize}
%    \item 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.
%    \item Plain \TeX\ does not use the |\everyjob| register so the
%    message would not be displayed.
%  \end{itemize}
%    To circumvent this a `dirty trick' can be used. As this code is
%    only processed when creating a new format file there is one
%    command that is sure to be used, |\dump|. Therefore the original
%    |\dump| is saved in |\org@dump| and a new definition is supplied.
%    \begin{macrocode}
  \let\orig@dump=\dump
  \def\dump{%
%    \end{macrocode}
%    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 defined, so we add this piece of code to |\dump|.
% \changes{bbplain-1.0c}{1995/11/19}{Add execution of
%    \cs{@begindocumenthook} to \cs{@preamblecmds}} 
% \changes{bbplain-1.0i}{1997/01/02}{\cs{document} is not a
%    \LaTeX2.09-only command; AMS\TeX defines it too; now use
%    \cs{@ztryfc} to detect \LaTeX2.09} 
% \changes{bbplain-1.0j}{1997/01/07}{Add the definition of
%    \cs{@begindocumenthook} to the \LaTeX2.09 format} 
%    \begin{macrocode}
    \ifx\@ztryfc\@undefined
    \else
      \toks0=\expandafter{\@preamblecmds}
      \edef\@preamblecmds{\noexpand\@begindocumenthook\the\toks0}
      \def\@begindocumenthook{}
    \fi
%    \end{macrocode}
%    This new definition starts by adding an instruction to write a
%    message on the terminal and in the transcript file to inform the
%    user of the preloaded hyphenation patterns.
% \changes{bbplain-1.0f}{1996/07/09}{Use \cs{toks8} instead of
%    \cs{patterns@loaded}} 
%    \begin{macrocode}
    \everyjob\expandafter{\the\everyjob%
      \immediate\write16{\the\toks8 loaded.}}%
%    \end{macrocode}
%    Then everything is restored to the old situation and the format
%    is dumped.
%    \begin{macrocode}
    \let\dump\orig@dump\let\orig@dump\@undefined\dump}
  \expandafter\endinput
\fi
%    \end{macrocode}
%    The rest of this file is not processed by ini\TeX\ but during the
%    normal document run.
%    A number of \LaTeX\ macro's that are needed later on.
% \changes{bbplain-1.0n}{1998/06/10}{Added \cs{@secondoftwo}}
% \changes{bbplain-1.0q}{1999/09/16}{Added \cs{@ifundefined}}
%    \begin{macrocode}
\long\def\@firstofone#1{#1}
\long\def\@firstoftwo#1#2{#1}
\long\def\@secondoftwo#1#2{#2}
\def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}
\def\@star@or@long#1{%
  \@ifstar
  {\let\l@ngrel@x\relax#1}%
  {\let\l@ngrel@x\long#1}}
\let\l@ngrel@x\relax
\def\@car#1#2\@nil{#1}
\def\@cdr#1#2\@nil{#2}
\let\@typeset@protect\relax
\long\def\@gobble#1{}
\edef\@backslashchar{\expandafter\@gobble\string\\}
\def\strip@prefix#1>{}
\def\g@addto@macro#1#2{{%
    \toks@\expandafter{#1#2}%
    \xdef#1{\the\toks@}}}
\def\@namedef#1{\expandafter\def\csname #1\endcsname}
\def\@ifundefined#1{%
  \expandafter\ifx\csname#1\endcsname\relax
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
%    \end{macrocode}
%    \LaTeXe\ has the command |\@onlypreamble| which adds commands to
%    a list of commands that are no longer needed after
%    |\begin{document}|.
%    \begin{macrocode}
\ifx\@preamblecmds\@undefined
  \def\@preamblecmds{}
\fi
\def\@onlypreamble#1{%
  \expandafter\gdef\expandafter\@preamblecmds\expandafter{%
    \@preamblecmds\do#1}}
\@onlypreamble\@onlypreamble
%    \end{macrocode}
%    Mimick \LaTeX's |\AtBeginDocument|; for this to work the user
%    needs to add |\begindocument| to his file.
%    \begin{macrocode}
\def\begindocument{%
  \@begindocumenthook
  \global\let\@begindocumenthook\@undefined
  \def\do##1{\global\let ##1\@undefined}%
  \@preamblecmds
  \global\let\do\noexpand
  }
%    \end{macrocode}
%    
% \changes{bbplain-1.0j}{1997/01/07}{\cs{@begindocumenthook} might
%    already be defined} 
% \changes{bbplain-1.0k}{1997/01/14}{missing \cs{@undefined} added}
%    \begin{macrocode}
\ifx\@begindocumenthook\@undefined
  \def\@begindocumenthook{}
\fi
\@onlypreamble\@begindocumenthook
\def\AtBeginDocument{\g@addto@macro\@begindocumenthook}
%    \end{macrocode}
%    We also have to mimick \LaTeX's |\AtEndOfPackage|. Our
%    replacement macro is much simpler; it stores its argument in
%    |\@endofldf|.
%    \begin{macrocode}
\def\AtEndOfPackage#1{\g@addto@macro\@endofldf{#1}}
\@onlypreamble\AtEndOfPackage
\def\@endofldf{}
\@onlypreamble\@endofldf
%    \end{macrocode}
%    \LaTeX\ needs to be able to switch off writing to its auxiliary
%    files; plain doesn't have them by default.
%  \changes{bbplain-1.0m}{1997/04/28}{Set \cs{if@filesw} to 
%    \cs{iffalse} only for plain \TeX}
% \changes{bbplain-1.0n}{1997/09/11}{Repaired typo and added missing
%    \cs{endcsname}}
%    \begin{macrocode}
\ifx\if@filesw\@undefined
  \expandafter\let\csname if@filesw\expandafter\endcsname
    \csname iffalse\endcsname
\fi
%    \end{macrocode}
%    Mimick \LaTeX's commands to define control sequences.
% \changes{bbplain-1.0e}{1996/02/22}{Provide a more complete emulation
%    of \cs{DeclareRobustCommand} and \cs{newcommand}} 
%    \begin{macrocode}
\def\newcommand{\@star@or@long\new@command}
\def\new@command#1{%
  \@testopt{\@newcommand#1}0}
\def\@newcommand#1[#2]{%
  \@ifnextchar [{\@xargdef#1[#2]}%
                {\@argdef#1[#2]}}
\long\def\@argdef#1[#2]#3{%
  \@yargdef#1\@ne{#2}{#3}}
\long\def\@xargdef#1[#2][#3]#4{%
  \expandafter\def\expandafter#1\expandafter{%
    \expandafter\@protected@testopt\expandafter #1%
    \csname\string#1\expandafter\endcsname{#3}}%
  \expandafter\@yargdef \csname\string#1\endcsname
  \tw@{#2}{#4}}
\long\def\@yargdef#1#2#3{%
  \@tempcnta#3\relax
  \advance \@tempcnta \@ne
  \let\@hash@\relax
  \edef\reserved@a{\ifx#2\tw@ [\@hash@1]\fi}%
  \@tempcntb #2%
  \@whilenum\@tempcntb <\@tempcnta
  \do{%
    \edef\reserved@a{\reserved@a\@hash@\the\@tempcntb}%
    \advance\@tempcntb \@ne}%
  \let\@hash@##%
  \l@ngrel@x\expandafter\def\expandafter#1\reserved@a}
\let\providecommand\newcommand
%    \end{macrocode}
%    
%    \begin{macrocode}
\def\DeclareRobustCommand{\@star@or@long\declare@robustcommand}
\def\declare@robustcommand#1{%
   \edef\reserved@a{\string#1}%
   \def\reserved@b{#1}%
   \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}%
   \edef#1{%
      \ifx\reserved@a\reserved@b
         \noexpand\x@protect
         \noexpand#1%
      \fi
      \noexpand\protect
      \expandafter\noexpand\csname
         \expandafter\@gobble\string#1 \endcsname
   }%
   \expandafter\new@command\csname
      \expandafter\@gobble\string#1 \endcsname
}
\def\x@protect#1{%
   \ifx\protect\@typeset@protect\else
      \@x@protect#1%
   \fi
}
\def\@x@protect#1\fi#2#3{%
   \fi\protect#1%
}
%    \end{macrocode}
%
%    The following little macro |\in@| is taken from latex.ltx; it
%    checks whether its first argument is part of its second
%    argument. It uses the boolean |\in@|; allocating a new boolean
%    inside conditionally executed code is not possible, hence the
%    construct with the temporary definition of |\bbl@tempa|.
% \changes{bbplain-1.0o}{1998/07/02}{Added definition of \cs{in@}}
%    \begin{macrocode}
\def\bbl@tmpa{\csname newif\endcsname\ifin@}
\ifx\in@\@undefined
  \def\in@#1#2{%
    \def\in@@##1#1##2##3\in@@{%
      \ifx\in@##2\in@false\else\in@true\fi}%
    \in@@#2#1\in@\in@@}
\else
  \let\bbl@tmpa\@empty
\fi
\bbl@tmpa
%    \end{macrocode}
%
%    \LaTeX\ has a macro to check whether a certain package was loaded
%    with specific 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 (\Lopt{activegrave} and
%    \Lopt{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).
% 
%    \begin{macrocode}
\def\@ifpackagewith#1#2#3#4{%
  #3}
%    \end{macrocode}
%    The \LaTeX\ macro |\@ifl@aded| checks whether a file was
%    loaded. This functionality is not needed for plain \TeX\ but we
%    need the macro to be defined as a no-op.
% \changes{bbplain-1.0p}{1999/04/27}{Added \cs{@ifl@aded} as a no-op}
%    \begin{macrocode}
\def\@ifl@aded#1#2#3#4{}
%    \end{macrocode}
%
% \changes{bbplain-1.0e}{1996/01/15}{Added the \cs{newcommand} code}
%    For the following code we need to make sure that the commands
%    |\newcommand| and |\providecommand| exist with some sensible
%    definition. They are not fully equivalent to their \LaTeXe\
%    versions; just enough to make things work in plain~\TeX
%    environments.
%
% \changes{bbplain-1.0k}{1997/01/14}{\cs{newcount} is an \cs{outer}
%    command, can't use it inside an \cs{if} construct} 
% \changes{bbplain-1.0l}{1997/01/19}{Mixed up the definition of 
%    \cs{@tempcntb}}
%    \begin{macrocode}
\ifx\@tempcnta\@undefined
  \csname newcount\endcsname\@tempcnta\relax
\fi
\ifx\@tempcntb\@undefined
  \csname newcount\endcsname\@tempcntb\relax
\fi
%    \end{macrocode}
%    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|).
%    \begin{macrocode}
\ifx\bye\@undefined
 \advance\count10 by -2\relax
\fi
\ifx\@ifnextchar\@undefined
  \def\@ifnextchar#1#2#3{%
    \let\reserved@d=#1%
    \def\reserved@a{#2}\def\reserved@b{#3}%
    \futurelet\@let@token\@ifnch}
  \def\@ifnch{%
    \ifx\@let@token\@sptoken
      \let\reserved@c\@xifnch
    \else
      \ifx\@let@token\reserved@d
        \let\reserved@c\reserved@a
      \else
        \let\reserved@c\reserved@b
      \fi
    \fi
    \reserved@c}
  \def\:{\let\@sptoken= } \:  % this makes \@sptoken a space token
  \def\:{\@xifnch} \expandafter\def\: {\futurelet\@let@token\@ifnch}
\fi
\def\@testopt#1#2{%
  \@ifnextchar[{#1}{#1[#2]}}
\def\@protected@testopt#1{%%
  \ifx\protect\@typeset@protect
    \expandafter\@testopt
  \else
    \@x@protect#1%
  \fi}
\long\def\@whilenum#1\do #2{\ifnum #1\relax #2\relax\@iwhilenum{#1\relax
     #2\relax}\fi}
\long\def\@iwhilenum#1{\ifnum #1\expandafter\@iwhilenum
         \else\expandafter\@gobble\fi{#1}}
%    \end{macrocode}
%    Code from \file{ltoutenc.dtx}, adapted for use in the plain \TeX\
%    environment. 
%    \begin{macrocode}
\def\DeclareTextCommand{%
   \@dec@text@cmd\providecommand
}
\def\ProvideTextCommand{%
   \@dec@text@cmd\providecommand
}
\def\DeclareTextSymbol#1#2#3{%
   \@dec@text@cmd\chardef#1{#2}#3\relax
}
\def\@dec@text@cmd#1#2#3{%
   \expandafter\def\expandafter#2%
      \expandafter{%
         \csname#3-cmd\expandafter\endcsname
         \expandafter#2%
         \csname#3\string#2\endcsname
      }%
%   \let\@ifdefinable\@rc@ifdefinable
   \expandafter#1\csname#3\string#2\endcsname
}
\def\@current@cmd#1{%
  \ifx\protect\@typeset@protect\else
      \noexpand#1\expandafter\@gobble
  \fi
}
\def\@changed@cmd#1#2{%
   \ifx\protect\@typeset@protect
      \expandafter\ifx\csname\cf@encoding\string#1\endcsname\relax
         \expandafter\ifx\csname ?\string#1\endcsname\relax
            \expandafter\def\csname ?\string#1\endcsname{%
               \@changed@x@err{#1}%
            }%
         \fi
         \global\expandafter\let
           \csname\cf@encoding \string#1\expandafter\endcsname
           \csname ?\string#1\endcsname
      \fi
      \csname\cf@encoding\string#1%
        \expandafter\endcsname
   \else
      \noexpand#1%
   \fi
}
\def\@changed@x@err#1{%
    \errhelp{Your command will be ignored, type <return> to proceed}%
    \errmessage{Command \protect#1 undefined in encoding \cf@encoding}}
\def\DeclareTextCommandDefault#1{%
   \DeclareTextCommand#1?%
}
\def\ProvideTextCommandDefault#1{%
   \ProvideTextCommand#1?%
}
\expandafter\let\csname OT1-cmd\endcsname\@current@cmd
\expandafter\let\csname?-cmd\endcsname\@changed@cmd
\def\DeclareTextAccent#1#2#3{%
  \DeclareTextCommand#1{#2}[1]{\accent#3 ##1}
}
\def\DeclareTextCompositeCommand#1#2#3#4{%
   \expandafter\let\expandafter\reserved@a\csname#2\string#1\endcsname
   \edef\reserved@b{\string##1}%
   \edef\reserved@c{%
     \expandafter\@strip@args\meaning\reserved@a:-\@strip@args}%
   \ifx\reserved@b\reserved@c
      \expandafter\expandafter\expandafter\ifx
         \expandafter\@car\reserved@a\relax\relax\@nil
         \@text@composite
      \else
         \edef\reserved@b##1{%
            \def\expandafter\noexpand
               \csname#2\string#1\endcsname####1{%
               \noexpand\@text@composite
                  \expandafter\noexpand\csname#2\string#1\endcsname
                  ####1\noexpand\@empty\noexpand\@text@composite
                  {##1}%
            }%
         }%
         \expandafter\reserved@b\expandafter{\reserved@a{##1}}%
      \fi
      \expandafter\def\csname\expandafter\string\csname
         #2\endcsname\string#1-\string#3\endcsname{#4}
   \else
     \errhelp{Your command will be ignored, type <return> to proceed}%
     \errmessage{\string\DeclareTextCompositeCommand\space used on
         inappropriate command \protect#1}
   \fi
}
\def\@text@composite#1#2#3\@text@composite{%
   \expandafter\@text@composite@x
      \csname\string#1-\string#2\endcsname
}
\def\@text@composite@x#1#2{%
   \ifx#1\relax
      #2%
   \else
      #1%
   \fi
}
%
\def\@strip@args#1:#2-#3\@strip@args{#2}
\def\DeclareTextComposite#1#2#3#4{%
   \def\reserved@a{\DeclareTextCompositeCommand#1{#2}{#3}}%
   \bgroup
      \lccode`\@=#4%
      \lowercase{%
   \egroup
      \reserved@a @%
   }%
}
%
\def\UseTextSymbol#1#2{%
%   \let\@curr@enc\cf@encoding
%   \@use@text@encoding{#1}%
   #2%
%   \@use@text@encoding\@curr@enc
}
\def\UseTextAccent#1#2#3{%
%   \let\@curr@enc\cf@encoding
%   \@use@text@encoding{#1}%
%   #2{\@use@text@encoding\@curr@enc\selectfont#3}%
%   \@use@text@encoding\@curr@enc
}
\def\@use@text@encoding#1{%
%   \edef\f@encoding{#1}%
%   \xdef\font@name{%
%      \csname\curr@fontshape/\f@size\endcsname
%   }%
%   \pickup@font
%   \font@name
%   \@@enc@update
}
\def\DeclareTextSymbolDefault#1#2{%
   \DeclareTextCommandDefault#1{\UseTextSymbol{#2}#1}%
}
\def\DeclareTextAccentDefault#1#2{%
   \DeclareTextCommandDefault#1{\UseTextAccent{#2}#1}%
}
\def\cf@encoding{OT1}
%    \end{macrocode}
%    Currently we only use the \LaTeXe\ method for accents for those
%    that are known to be made active in \emph{some} language
%    definition file.
%    \begin{macrocode}
\DeclareTextAccent{\"}{OT1}{127}
\DeclareTextAccent{\'}{OT1}{19}
\DeclareTextAccent{\^}{OT1}{94}
\DeclareTextAccent{\`}{OT1}{18}
\DeclareTextAccent{\~}{OT1}{126}
%    \end{macrocode}
%    The following control sequences are used in \file{babel.def}
%    but are not defined for \textsc{plain} \TeX.
% \changes{bbplain-1.0f}{1996/07/10}{Added \cs{textquotedblright} and
%    \cs{textquoteright}} 
% \changes{bbplain-1.0g}{1996/08/15}{Added \cs{ss} and \cs{i}}
% \changes{bbplain-1.0r}{2000/10/02}{Added \cs{textquotedblleft} and
%    \cs{textquoteleft}} 
%    \begin{macrocode}
\DeclareTextSymbol{\textquotedblleft}{OT1}{92}
\DeclareTextSymbol{\textquotedblright}{OT1}{`\"}
\DeclareTextSymbol{\textquoteleft}{OT1}{`\`}
\DeclareTextSymbol{\textquoteright}{OT1}{`\'}
\DeclareTextSymbol{\i}{OT1}{16}
\DeclareTextSymbol{\ss}{OT1}{25}
%    \end{macrocode}
%    For a couple of languages we need the \LaTeX-control sequence
%    |\scriptsize| to be available. Because plain \TeX\ doesn't have
%    such a sofisticated font mechanism as \LaTeX\ has, we just |\let|
%    it to |\sevenrm|.
% \changes{bbplain-1.0f}{1996/07/10}{Added definition of
%    \cs{scriptsize}} 
%    \begin{macrocode}
\ifx\scriptsize\@undefined
  \let\scriptsize\sevenrm
\fi
%</code>
%    \end{macrocode}
%
\endinput
%%
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
