% A documentation for LANG package (in Czech language, sorry)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% February 2004                                   Petr Olsak

%\headline={\hfil See the ofsdoce.tex for English version 
%           of this documentation.\global\headline={\hfil}}

\magnification\magstephalf

\hoffset=4pc
\voffset=1pc
\hsize=31.6pc
\vsize=49pc
\raggedbottom
\parindent=15pt
\emergencystretch=2em

\font\smallbf=csb10 at7pt
\font\smalltt=cstt8
\font\titulfont=\fontname\tenbf\space scaled\magstep4
\font\bigbf=\fontname\tenbf\space scaled\magstep1
\font\bigtt=\fontname\tentt\space scaled\magstep1

\def\Red{}
\def\Black{}
\def\Blue{}
\def\Green{}
\def\beglink#1{}
\def\endlink{}
\def\aimlink#1{}

\ifx\pdfoutput\undefined\else   %%%% pdfTeX is used %%%%%%%%%%
\ifnum\pdfoutput>0    

\ifx \pdfstartlink\undefined %%% PDFTeX version <= 13
   \let\pdfstartlink=\pdfannotlink
\fi

\def\beglink#1{%          % Za��tek textu odkazu, #1 je kl�� odkazu
   \Green \pdfstartlink height9pt depth3pt 
     attr{/Border[0 0 0]} goto name{#1}\relax}
\def\endlink{\pdfendlink\Black}  

\def\aimlink#1{%          % M�sto c�le odkazu, #1 je kl�� odkazu
   \expandafter\ifx \csname aim:#1\endcsname \relax
      \expandafter\gdef \csname aim:#1\endcsname {}%
      \vbox to0pt{\vss\hbox{\pdfdest name{#1} fith}\kern15pt}%
   \fi
}
\def\pdfsetcmykcolor#1{\special{PDF:#1 k}}
\def\Red{\leavevmode\pdfsetcmykcolor{0.1 0.9 0.9 0}}
\def\Black{\leavevmode\pdfsetcmykcolor{0 0 0 1}}
\def\Green{\leavevmode\pdfsetcmykcolor{0.9 0.1 0.9 .3}}
\def\Blue{\leavevmode\pdfsetcmykcolor{0.9 0.9 0.1 0}}

\pdfcompresslevel=9
\pdfinfo{/Author (Petr Olsak)
         /CreationDate (Ferbuary 2004) 
         /ModDate (April 2004)
         /Creator (TeX)
         /Producer (pdfTeX)
         /Title (LANG: Olsak's multi language system)
         /Subject (Documentation)
         /Keywords (TeX, fonts)
}

\fi\fi %%%%%%%%%%%%%%%%%%%%%%%%%%%% End of pdfTeX macros %%%%%

\newcount\secnum \newcount\subsecnum

\def\sec #1\par{\ifnum\secnum>0 \goodbreak\fi\removelastskip
   \vskip2\baselineskip
   \subsecnum=0 \advance\secnum by1
   \noindent{\bigbf\let\tt=\bigtt\llap{\the\secnum.\quad}#1}\par\nobreak\medskip}
\def\subsec #1\par{\removelastskip\bigskip
   \advance\subsecnum by1   
   \noindent{\bf \llap{\aimlink{\the\secnum.\the\subsecnum}%
      \the\secnum.\the\subsecnum.\quad}#1}\par\nobreak\medskip}
\def\title #1\par{\vglue2\baselineskip 
   \line{\hss\titulfont #1}\vskip2\baselineskip}
\def\author #1\par{\noindent{\bigbf#1}\medskip}

\def\LaTeX{La\TeX}

\catcode`<=13
\def<#1>{\hbox{$\langle$\it#1\/$\rangle$}}
\def\,{\thinspace}
\let\levaskoba=<

{\obeyspaces \gdef\activespace{\obeyspaces\let =\ }}
\def\setverb{\def\do##1{\catcode`##1=12}\dospecials}
\def\begtt{\medskip\bgroup \setverb \catcode`@=0 \activespace
   \parindent=0pt \catcode`\"=12
   \def\par##1{\endgraf\ifx##1\par\leavevmode\fi ##1}
   \obeylines \startverb}
{\catcode`\|=0 \catcode`\\=12
|gdef|startverb#1\endtt{|tt#1|egroup|medskip|testpar}}
\long\def\testpar#1{\ifx\par#1\else\noindent\fi#1}

\catcode`"=13
\def"{\hbox\bgroup\setverb\activespace\tt\readverb}
\def\readverb #1"{#1\egroup}

\def\begitems{\medskip\bgroup \catcode`*=13 }
{\catcode`*=13 \gdef*{\item{$\bullet$}}}
\def\enditems{\medskip\egroup}

\newwrite\indout
\immediate\openout\indout=\jobname.ind
\def\inl[#1]{\strut
   \write\indout{\noexpand\indexentry{#1}{\the\pageno}}%
   \vadjust{\vbox to0pt{\vss
   \hbox to\hsize{\llap{{\aimlink{#1}\smalltt\Blue\char`\\ #1%
      \ifx\extratext\empty\else\space\extratext\fi\Black}%
      \kern2pt\quad}\strut\hfil}%
   \hrule height0pt}}\def\extratext{}}
\def\inll[#1 #2]{\def\extratext{#2}\inl[#1]}
\def\indexentry #1#2{\expandafter \ifx \csname ind:#1\endcsname \relax
      \expandafter \def \csname ind:#1\endcsname {#2}%
   \else 
      \expandafter \edef \csname ind:#1\endcsname {%
          \csname ind:#1\endcsname, #2}%
   \fi
}
\def\extratext{}  
\def\pg[#1]{\csname ind:#1\endcsname}

\chardef\back=`\\

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\noindent\llap{\tt Apr. 2004}

\title LANG: multi-language support for plain
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\author Petr Ol\v s\'ak

The babel package has a some limits which are unacceptable for me.
Thus I have made my own macro package for multi-language support.
This package loads hyphenation patterns for each declared language and
for each font encoding supported by this language. The declaration
files and language style-files are more clear than in babel and LaTeX
style files.

The LANG package co-operates with OFS package (Olsak's font system)
for plain\TeX{} (see "ofsdoce.tex" for more information). You need the
version OFS Apr.~2004 or newer.

I plan to made the INEC package which will control the input to font
encoding transformation (see "inecdoce.tex"). The packages LANG, IENC
and OFS with the Knuth's macro "plain.tex" give to plain\TeX{} users
an effective tool for font managing, language managing and encoding
mapping. They are more powerful than the corresponding macro packages
known in \LaTeX: babel, inputenc and nfss. 

I don't plan to support the LANG package to \LaTeX{} because I am not
\LaTeX{} user. But the authors of \LaTeX{} packages can adopt the
ideas from my package to new version of babel, nfss etc. (may be 
for \LaTeX{}3). Because the multiencoding support for each
language is missing in current babel we need to manage a separate
format with name cslatex. After incorporating of multiencoding support  
to babel package we can remove the cslatex format because all
functionalities of cslatex will be supported by (still not existing new)
babel system. 


\sec The user interface
%%%%%%%%%%%%%%%%%%%%%%%

\subsec Language switching
%%%%%%%%%%%%%%%%%%%%%%%%%%

The language or font encoding or both can be switched by\inl[setlang]

\begtt
\setlang[<lang-abrreviation>/<encoding>]
\endtt
%
If some parameter is empty then the current value of this paramater is
used.

The language declarations and its connections to encodings and style
files are stored in "langdef.tex" declaration file.
A list of font encodings in which the
language-alphabet is accesible is declared for each language. 
Each encoding is connected to a default
font family which is certainly encoded in this encoding.

The "\setlang" command reads the style file of given language
(if this file was not read already) and checks if the given encoding
is listed in accesible language encodings. If not then the encoding is
reset to default encoding of given language and warning is printed.
Next, the "\setlang" sets the hyphenation patterns for given language
and encoding and checks if the encoding is registered for current font
family (in OFS). If not then the default font family for this encoding
is used and warning is printed. The step by step description of the
"\setlang" behavior is documented in section ...

You can use the ``language switchers'' "\english", "\ukenglish", 
"\czech", "\french", "\german", etc. instead of "\setlang" command.
These language switchers are defined by default as
"\setlang[<lang-abrreviation>/]".

The list of all declared languages including more information about
them is available by the command "\showlangs".\inl[showlangs]
This command prints the list of languages to terminal and log file in
the form similar as following:

\bgroup \catcode`<=12
\begtt
LANG language    style-file   encodings<num.of.hyphen.table>
------------------------------------------------------------
en   \english    lang-en.tex  8t<0> 8z<0> 6a<0>
de   \german     lang-de.tex  8t<1> 8z<1>
de2  \germannew  lang-de.tex  8t<2> 8z<2>
fr   \french     lang-fr.tex  8t<?> 8z<?>
cz   \czech      lang-cz.tex  8t<3> 8z<4>
sk   \slovak     lang-sk.tex  8t<5> 8z<6>
pl   \polish     lang-pl.tex  8t<?> 8z<?>
ru   \russian    lang-ru.tex  6a<7> 6c<7> 6t<7> 6k<8> 6y<?>
\endtt \par \egroup

The first column prints the <lang-abbreviation> which is used in
"\setlang" parameter. Second column lists the  language switchers
and third column names the language style files.
Next, the list of available encodings for given language is printed.
The encoding names conform to the document about font names~[1].
For example, "8t" is encoding concluded in Cork in 1992 (\LaTeX{}
names it as T1 encoding). The number of hypenation patterns table 
is printed in {\tt\char`<..>}. This number is allocated automatically during
ini\TeX{} and its real value is not interesting for user. But you can
see that some encodings share the same hypenation patterns table
because the language alphabet is encoded by the same way it such font
encodings. 

Some languague/enconding have the empty hyphenation table
(printed by {\tt\char`\<=>}). The words are never hyphenated 
in such language/enconding. On the other hand, the 
symbol~{\tt\char`\<?>} means that the hyphenation patterns table was
not loaded during ini\TeX{}. We can disable some hyphenation patterns
loading in ini\TeX{} because of the \TeX{} memory is limited. 

The short information about language is available by
"\langinfo"\inl[langinfo] command after you switched to the choosen
language. For example

\begtt
\setlang[de2/]\message{\langinfo}
\endtt
vyp��e:
\begtt
German language with hyphenation table adapted to new orthography.
\endtt
%
More information is available by "\printlangdoc" command (see section ...).

If you try to run "\setlang" of language/encoding where hyphenation
patterns table is unavailable then you get:

\vbox{
\begtt
LANG (l...): WARNING. Hyphen table [<jazyk>/<k�dov�n�>] was not loaded.
    I use "\defaulthyphentable=255" instead of given table.
    Modify \loadpatterns parameters in langdef.tex and 
    run iniTeX again if you need given table exactly.
\endtt
\relax}

It means that "\defaulthyphentable"\inl[defaulthyphentable]
is used instead given hyphenation patterns table.
This \TeX{} register is set to 255 by default (it means the empty
hyphenation table). You can reset this register to another value by 
"\hyphentable"\inl[hyphentable] command:

\begtt
\defaulthyphentable=\hyphentable[en/8t]
\endtt
%
The "\defaulthyphentable" is set to hyphenation table of the english
language in "8t" encoding in this example.

You can use "\langusage"\inl[langusage] command to print the basic
usage of the LANG package. This is similar as OFS's "\fontusage"
command.

Don't use the direct access to "\fotenc"\inl[fotenc] macro
by "\def\fotenc{<encoding>}". The "\setlang[/<encoding>]" does such
work and moreower, it controls the consistency of font encoding with hyphenation
patterns, "\lccode" settings etc.

If you change font encoding by "\setlang" command and if IENC package
is used then the reencoding tables are reinicialized automatically.
On the other hands if you don't use IENC package then you need to set
the input to font encoding mapping by the hand.

\subsec Initialisation and default settings
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

You have to load LANG package during format generation by
ini\TeX{} because hyphenation patterns are loadable only in
this state. The hyphenation patterns tables mentioned in
"\loadpatterns" parameters in "langdef.tex" file will be loaded into
format. The example of LANG usage is in "oktex.ini" file. 

The default behavior (after OFS and LANG packages loaded) is very similar to
the "plain.tex" macro. More exactly: you cannot find out any
differnece between "plain.tex" and format where LANG and OFS are 
used if you do not use the command "\setlang" or "\setfonts" command.
After first usage of "\setlang", some "plain.tex" macros (which
depends on encoding, "\ae" or "\v" for example) are 
re-defined by OFS and LANG.

The default encoding is "8t" and default font family is "CMRoman".
It means that if the "\setfonts[/]" is used in first time then
"CMRoman" in "8t" is initialised. This family is implemented as well
known ECfonts.

The default language is "none". This special ``language'' does not
load any style file and does not initialises any hyphenation table.
It accepts all encodings which are registered in LANG package.
If you use "\setlang[/<encoding>]" in the first time then the language
is set as "none" and only <encoding> is set.

The first occurence of "\setlang" in your document has a special
function: If the parameter <encoding> is empty and <lan-abbreviation>
is nonempty then <encoding> is set by default encoding of given
language. For example "\setlang[cz/]" sets the encoding to "8z"
because this is default encoding of Czech language. The next commands
"\setlang" with empty <encoding> parameter respects the current
encoding if it tis possible. 

The default encoding of "none" language is "8t". It means that
"\setlang[/]" used in the first time in your document sets "none" in
"8t" encoding. If the next command is "\setlang[cz/]" (for example)
then the Czech language will be used in "8t" encoding, not in its
default encoding "8z".

The "\setlang" settings are local in your document. There is an
exeption of this rule: the first occurence of "\setlang" redefines the
plain's encoding-dependent macros globally. If you use this
command in group then after group the "none" in "8t" encoding is set
automatically.

Sorry, the text is not fully translated...


\subsec Pou�it� stylov�ch soubor�
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Stylov� soubor se p�i prvn�m p�epnut� do vybran�ho jazyka na�te
automaticky. V~n�m jsou obvykle p�ipravena makra, kter�
usnad�uj� sazbu v dan�m jazyku. U�ivatel si m��e vytisknout
dokumentaci k dan�mu stylov�mu souboru pomoc� p�epnut� do vybran�ho
jazyka a n�sledn�m spu�t�n� p��kazu "\printlangdoc".\inl[printlangdoc]
Nap��klad "\setlang[de2/]\printlangdoc" vytiskne (do "dvi")
dokumentaci k pou�it� stylov�ho souboru n�meck�ho jazyka.

Ve stylov�m souboru se obvykle definuj� pomoc� "\langdef"\inl[langdef]
makra, kter� jsou z�visl� na aktu�ln� zvolen�m jazyku. Nap��klad
makro "\today" se v r�zn�ch stylov�ch souborech definuje r�zn�, ale
jejich definice se vz�jemn� nep�ekr�vaj�. Je-li aktu�ln� angli�tina,
vytiskne "\today" dne�n� datum v angli�tin�, zat�mco p�i aktu�ln�
�e�tin� bude "\today" tisknout dne�n� datum �esky. Podrobn�ji 
o~"\langdef" viz sekci ...

Ka�d� stylov� soubor definuje (z�visle na zvolen�m jazyku) makro
"\langinit",\inl[langinit] 
ve kter�m prob�h� inicializace dan�ho jazyka. V tomto
makru b�v� obvykle nastaveno "\lefthyphenmin" a "\righthyphenmin"
pro dan� jazyk. D�le se zde nastavuje "\fenchspacing" nebo jin�
mezerov�n�. P��kaz "\langinit" se spust� automaticky v�dy 
p�i nastaven� jazyka pomoc� "\setlang".
P�i�azen� v p��kazu "\langinit" jsou lok�ln�.
Ve stylov�m souboru se nav�c zajist�,
aby se nastaven� z "\langinit" vr�tila do p�vodn�ho stavu (podle
plain\TeX{}u), pokud se jazyk opust� tak, �e se spust� "\setlang" jin�ho jazyka.

Ka�d� stylov� soubor by m�l definovat makro "\langphrases"\inl[langphrases]
(z�visl� na zvolen�m jazyku), jeho�
spu�t�n�m se definuj� makra "\abstractname", "\appendixname",
"\bibname", "\ccname", "\chaptername", "\contentsname", "\enclname",
"\figurename", "\headpagename", "\headtoname", "\indexname",
"\listfigurename", "\listtablename", "\partname", "\prefacename",
"\proofname", "\seename", "\alsoseename", "\refname", "\tablename",
tak, �e expanduj� na odpov�daj�c� fr�ze podle aktu�ln�ho jazyka. Tato
makra sama o sob� nejsou z�visl� na aktu�ln�m jazyku, ale p�i p�echodu
do nov�ho jazyka je mus�me p�edefinovat op�tovn�m spu�t�n�m makra
"\langphrases". D�vod tohoto chov�n� je prost�: v dokumentu m��eme
docela �asto p�ep�nat mezi jazyky, ale texty v z�hlav�, texty pro
n�zvy kapitol apod. nech�me v jedin�m zvolen�m jazyku, kter�
pova�ujeme pro tento dokument za hlavn�. Pro tento hlavn� jazyk pak
spust�me "\langphrases" a d�le z�st�vaj� tyto fr�ze nem�nn�.
{\emergencystretch=4em \hbadness=8133 \par}

Ka�d� stylov� soubor tak� definuje makro "\langinfo" (jak bylo
uk�z�no v p�edchoz� sekci ...). 

Stylov� soubory by nem�ly samy od sebe inicializovat ��dn� aktivn� znaky, ale
pomoc� (na jazyku z�visl�m) p��kazu "\activechar<znak>"\inl[activechar]
mohou umo�nit u�ivateli nastavit zvolen� znaky jako aktivn� a vyu��t
jejich p�eddefinovan� funkce ze stylov�ho souboru. Nap��klad styl
pro �e�tinu umo�n� nastavit aktivn� znak \clqq"-"\crqq, aby se tento znak choval jako 
"\discretionary{-}{-}{-}". U�ivatel ale mus� explicitn� tuto vlastnost
znaku \clqq"-"\crqq{} inicializovat p��kazem "\activechar-". 
Pokud ale u�ivatel pou�ije
nap�. "\activechar-" p�i aktu�ln� angli�tin�, dostane na termin�l
pouze varov�n�, �e stylov� soubor pro angli�tinu nepodporuje aktivn� znak
\clqq"-"\crqq{} a znak z�stane neaktivn�.
Konstrukce \clqq"\czech \activechar-"\crqq{} se tedy podob� \LaTeX{}ov�mu
\clqq"\usepackage[split]{czech}"\crqq.

Stylov� soubor pro �e�tinu "lang-cz.tex" umo��uje tak� nastavit 
aktivn� znak pro po��ta�ov� uvozovky ("\activechar"{\tt\char`\"}). To zp�sob�,
�e {\tt\char`\"text mezi po��ta�ov�mi uvozovkami\char`\"} bude nahrazen 
\uv{textem mezi skute�n�mi �esk�mi uvozovkami}. Je jenom na u�ivateli,
zda si tuto vlastnost aktivuje pomoc� "\activechar" nebo ne.
P�ehled v�ech p�eddefinovan�ch aktivn�ch znak� dan�ho stylov�ho
souboru lze z�skat tiskem dokumentace k~jazyku pomoc� "\printlangdoc".

Nastaven� zvolen�ho znaku jako aktivn�ho je lok�ln� uvnit� skupiny,
ale pokud opust�me jazyk p�epnut�m do jin�ho jazyka (nikoli opu�t�n�m
skupiny), z�st�v� znak aktivn� nad�le a m� po��d funkci, kterou z�skal
v dob� jeho aktivace p��kazem "\activechar". Pokud to nen� ��douc�,
mus� u�ivatel deaktivovat znak manu�ln� nap��klad pomoc�
"\catcode`<znak>=12" 
(m��e pou��t zkratku "\deactivechar<znak>"\inl[deactivechar]), 
nebo mus� znak opakovan� aktivovat v kontextu
nov�ho jazyka p��kazem "\activechar<znak>".

U�ivatel si m��e zajistit deaktivaci znaku po opu�t�n� jazyka
automaticky makrem "\afterlang{<p��kazy>}".\inl[afterlang] 
V takov�m p��pad� se
<p��kazy> spust� p�i opu�t�n� jazyka p�epnut�m do jin�ho jazyka.
Makro "\afterlang" je mo�n� v~r�mci jednoho jazyka pou��t opakovan�. 
V~takov�m p��pad� se <p��kazy> kumuluj� do z�sobn�ku, tj. p�i
opu�t�n� jazyka se vykon�vaj� v opa�n�m po�ad�, ne� byly pou�it�m
maker "\afterlang" do z�sobn�ku vlo�eny. Pokud je jazyk ukon�en koncem
skupiny (tj. nikoli p�epnut�m do jin�ho jazyka), z�sobn�k se ru�� 
a v�bec se neprovede.

P��klad pou�it� maker "\activechar" a "\afterlang" je uveden 
v n�sleduj�c� sekci~... Je tam uk�zka mo�n�ho p�edefinov�n� p�ep�na�e 
"\czech".

V mnoha jazyc�ch se pou��v� sada dvojic znak� jako tzv.~zkratky (shorthands),
umo��uj�c� p��stup ke speci�ln�m znak�m nebo jin�m vlastnostem jazyka.
Nap��klad N�mci pou��vaj�~{\tt\char`"u} jako zkratku za \"u,
{\tt\char`"s} je zkratka za \ss{} atd. Pol�ci
zase pro zm�nu maj� speci�ln� znaky uvozeny b�n�m lom�tkem~"/".  Aby
toto za�alo fungovat, mus� u�ivatel nastavit prvn� znak z dvojice znak�
jako aktivn�. Je-li ve v�ech pou�it�ch jazyc�ch tento znak definov�n
stejn� jako:

\begtt
LANG (l...): `<znak>' is activated as expandable double-char prefix
\endtt
%
pak jej sta�� aktivovat p��kazem "\activechar" v kontextu jedin�ho jazyka
(tj. nen� pot�eba jej znovu opakovan� aktivovat v ostatn�ch jazyc�ch).
P�itom zkratky z�st�vaj� z�visl� na aktu�ln�m jazyku, tj. nap��klad 
v~n�m�in� expanduje {\tt\char`"u} na \"u zat�mco v~ma�ar�tin� na \H u.
Na druhou stranu v �e�tin� n�m po takov� aktivaci nahrazov�n�
palcov�ch uvozovek skute�n� �esk�mi fungovat nebude, proto�e v �esk�m
stylov�m souboru nen� tabulka dvojic s prefixem {\tt\char`"} v�bec 
deklarov�na. Tento znak bude tedy v �e�tin� expandovat jen na sv�j 
neaktivn� prot�j�ek.

Stylov� soubor m��e deklarovat k~pou�it�mu jazyku n�kolik
n��e��. Pozn�me to tak, �e makro "\whichdialect"\inl[whichdialect]
expanduje po p�epnut� do zkouman�ho jazyka na slovo \uv{default}. Pokud
nejsou n��e�� pro jazyk deklarov�na, expanduje "\whichdialect" na
slovo \uv{none}. Zvolen�m jin�ho n��e�� tam, kde jsou n��e��
deklarov�na, zp�sob� m�rnou zm�nu chov�n� n�kter�ch maker (nap�.
makra "\today" nebo "\langphrases").

Pokud jsou n��e�� pro aktu�ln� jazyk deklarov�na, je mo�no p�epnout do
jin�ho n��e�� ne� \uv{default} pomoc� p��kazu
"\setdialect[<n��e��>]"\inl[setdialect]. P�i op�tovn�m p�epnut� do
tohoto jazyka pomoc� "\setlang" se znovu inicializuje n��e��
"\default" a je nutno znovu pou��t "\setdialect".
Seznam v�ech dosa�iteln�ch n��e�� z�sk�me jednak p��kazem
"\printlangdoc" a d�le tak� p��kazem "\setdialect[]", kter� ulo�� do
makra "\tmpc" v�echna deklarovan� n��e�� aktu�ln�ho jazyka odd�len� mezerou.


\subsec P�edefinov�n� p�ep�na�� jazyka
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

K p�ep�na��m jazyka "\english", "\czech", "\german" atd. se u�ivatel
m��e chovat \uv{neuctiv�} a p�ed jejich pou�it�m si je m��e definovat
podle sv� pot�eby. Implicitn� definice t�chto p�ep�na�� obsahuj� jen vol�n�
"\setlang[<jazyk>/]" s~pr�zdn�m parametrem pro k�dov�n�. Takov�
p�ep�na� se sna�� zachovat p�vodn� nastaven� k�dov�n�, pokud to je
mo�n�. P�i prvn�m v�skytu tohoto p��kazu se nastav� v�choz� k�dov�n�
dan�ho jazyka.

Typick� p��klad na p�edefinov�n� p�ep�na�e je volba jin�ho ne�
v�choz�ho n��e��:
"\def\jazyk{\setlang[<zkratka>/]\setdialect[<n��e��>]}",
nebo volba jin�ho ne� v�choz�ho k�dov�n�:
"\def\jazyk{\setlang[<zkratka>/<k�dov�n�>]".

Pokud nap��klad chceme pro �e�tinu pou��t EC fonty, kter� jsou
k�dovan� v~"8t", a nav�c vyu��t aktivn� znak \clqq"-"\crqq{}, kter�
se bude p�i d�len� slov rozpadat automaticky na dva spojovn�ky,
pak se vyplat� definovat:

\begtt
\def\czech{\setlang[cz/8t]\activechar-\afterlang{\deactivechar-}}
\endtt

Je pot�eba si rozmyslet, kter� jazyky v dokumentu budeme pou��vat,
jak� pro n� zvol�me k�dov�n� a podle toho definovat p�ep�na�e.
V p�ep�na��ch m��e nap��klad za "\setlang" okam�it� n�sledovat
"\setfonts", pomoc� kter�ho d�v�me najevo, v jak� rodin� font� si
p�ejmeme (nap��klad mongol�tinu) tisknout. Rovn� zde m��e
b�t inicializace n�kter�ch maker specifick�ch pro zvolen� jazyk.
V�e z�le�� na volb� u�ivatele.

Nevhodn� p��klad: pou�ijeme "\def\czech{\setlang[cz/8t]}", ale nech�me
implicitn� hodnotu p�ep�na�e "\slovak" a za�neme po pou�it� p�ep�na�e 
"\slovak" ps�t slovensky. V tomto jazyku z�stane v�choz�
k�dov�n� font� "8z". Pak p�epneme do �e�tiny p��kazem "\czech" a zpracov�v�me
�e�tinu v k�dov�n� "8t". Nyn� ale pozor: pokud znovu p�epneme do
sloven�tiny pomoc� "\slovak", m�me u� tento jazyk v k�dov�n� "8t",
proto�e implicitn� p�ep�na� ct� aktu�ln� k�dov�n�. To mo�n� nen� to,
co jsme pot�ebovali.

Jin� p��klad: p��eme anglicky v k�dov�n� "8t" (po pou�it� p�ep�na�e
"\english") a p�epneme do ru�tiny pomoc� "\russian". V tomto jazyce
nen� mo�n� z�stat u k�dov�n� "8t", proto�e rusk� abeceda v n�m nen�
zahrnuta. LANG tedy vyp��e varov�n� a p�epne do k�dov�n� "6a"
(v�choz� k�dov�n� ru�tiny). Po op�tovn�m p�epnut� pomoc� "\english" m�me sice
znovu angli�tinu, ale fonty z�st�vaj� v kodov�n� "6a" a nevracej� se
do k�dov�n� "8t", proto�e anglick� abeceda je v k�dov�n� "6a"
zahrnuta. Je pot�eba si rozmyslet, zda to je pro danou �lohu
��douc� chov�n�. Pokud bychom pozd�ji v anglick�m textu cht�li p�epnout
pomoc� "\setfonts" do jin�ho fontu, kter� nen� dostupn� v~k�dov�n�
"6a", ohl�s� OFS chybu. Tato chyba je p�itom jen d�sledkem d��v�j��ho
p�echodn�ho p�epnut� do ru�tiny.

Pozn�mka: pokud do ru�tiny v p�edchoz�m p��klad� p�epneme jen uvnit�
skupiny pomoc� "{\russian rusk� text} anglick� text", v��e uveden�
probl�m nenast�v�. Po ukon�en� skupiny se toti� k�dov�n� font� vrac� do
stavu p�ed zah�jen�m skupiny, tj.~v~na�em p��klad� se vrac�
do o�ek�van�ho k�dov�n� "8t".



\sec Jak je to ud�l�no, aneb pohled do hloubky
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsec Deklarace v souboru "langdef.tex"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Pomoc� skupiny p��kaz� "\declareenc"\inl[declareenc]
je v souboru "langdef.tex"
deklarov�na mno�ina k�dov�n� font�, se kterou budeme d�le pracovat:

\begtt
\declareenc <k�dov�n�><mezera><Rodina><mezera>
\endtt

P��kaz deklaruje k�dov�n� a p�i�ad� mu v�choz� rodinu font�.
Zkontroluje, zda existuje soubor "ofs-<k�dov�n�>.tex", zda
existuje v�choz� rodina a zda je tato rodina v~OFS pro dan� k�dov�n�
registrovan�. Pokud n�co z toho nen� spln�no, ohl�s� chybu
a <k�dov�n�> nedeklaruje.

N�sleduje skupina p��kaz� "\declarelang",\inl[declarelang]
kter� deklaruj� jednotliv� jazyky:

{\catcode`!=0
\begtt
\declarelang \<p�ep�na�> <zkratka-jazyka> <stylov�-soubor> <seznam-k�dov�n�> ;
\endtt
\relax}
%
Jednotliv� parametry jsou odd�leny mezerou. Pokud <stylov�-soubor>
neexistuje, p��kaz ohl�s� chybu a ukon�� �innost.
Jinak provede:

\begtt
\def\<p�ep�na�>{\setlang[<zkratka-jazyka>/]
\endtt
%
a ulo�� si do pam�ti jm�no <stylov�ho-souboru>. 
D�le zkontroluje, zda jsou v�echna k�dov�n� ze <seznamu-k�dov�n�> deklarovan�.
Nedeklarovan� k�dov�n� ignoruje a nap��e o tom varov�n�.
Pokud po odstran�n� nedeklarovan�ch k�dov�n� v seznamu ��dn� k�dov�n�
nezbyde, jazyk z�st�v� nedeklarov�n.

Jednotliv� k�dov�n� jsou v <seznamu-k�dov�n�> odd�lov�na mezerou
a p�ed ukon�ovac�m st�edn�kem je tak� mezera.
Prvn� k�dov�n� se st�v� v�choz�m k�dov�n�m jazyka a nesm� mu p�edch�zet
samotn� rovn�tko. Pokud n�kter�mu n�sleduj�c�mu k�dov�n� p�edch�z�
samotn� rovn�tko, znamen� to, �e pro p�epnut� do tohoto k�dov�n� 
vysta��me se stejn�mi vzory d�len� slov jako pro 
p�edchoz� k�dov�n�. Ini\TeX{} tedy nebude na��tat nov� vzory. 
Jin�mi slovy: abeceda jazyka je v~tomto k�dov�n� stejn� jako v p�edchoz�m.

P�ed k�dov�n�m m��e tak� p�edch�zet hranat� z�vorka a rovn�tko ve tvaru:

\begtt
[<jin�-jazyk>/<k�dov�n�>]=<nov�-k�dov�n�>
\endtt
%
V takov�m p��pad� je pro <nov�-k�dov�n�> pou�ita stejn� tabulka vzor�
d�len� slov, jako pro "[<jin�-jazyk>/<k�dov�n�>]". D�le�it�: v parametrech
"\loadpatterns" mus� b�t tabulky vzor� d�len� slov pro <jin�-jazyk> zavedeny
d��ve, ne� pro pr�v� deklarovan� jazyk, jinak z�st�v� <nov�-k�dov�n�>
s~pr�zdnou tabulkou. 

M�sto "[<jin�-jazyk>/<k�dov�n�>]=" m��e b�t uvedeno jen "[]=", co�
znamen�, �e <nov� k�dov�n�> bude m�t pr�zdnou tabulku vzor� d�len�, 
kterou LANG rezervuje pod ��slem 255.

P��kaz "\loadpatterns"\inl[loadpatterns]
na�te vzory d�len� vyjmenovan�ch jazyk�. 

\begtt
\loadpatterns <seznam-zkratek-jazyk�> ;
\endtt

Zkratky jazyk� jsou odd�leny mezerami a p�ed ukon�ovac�m st�edn�kem
mus� b�t tak� mezera. Za zkratkou jazyka m��e
n�sledovat "{<aktu�ln�-seznam-k�dov�n�>}" odd�len� od p�edchoz� i
n�sleduj�c� zkratky jazyka mezerou. Jestli�e za zkratkou jazyka nen�
uveden "{<aktu�ln�-seznam-k�dov�n�>}", pak se na�tou vzory d�len� pro
v�echna k�dov�n� ze <seznamu-k�dov�n�>. Pokud ale za zkratkou
n�sleduje "{<aktu�ln�-seznam-k�dov�n�>}", na�tou se vzory d�len� podle
tohoto aktu�ln�ho seznamu. P�edpokl�d� se, �e aktu�ln� seznam k�dov�n�
je podmno�inou seznamu k�dov�n� a �e jej pou�ijeme v p��pad�, kdy
chceme na��st men�� po�et tabulek vzor� d�len�, proto�e �et��me pam�t�
\TeX{}u. V~<aktu�ln�m-seznamu-k�dov�n�> je mo�no pou��t stejn�ch
syntaktick�ch pravidel (s~rovn�tky a hranat�mi z�vorkami), jako bylo
vysv�tleno v��e pro <seznam-k�dov�n�> u p��kazu "\declarelang".

P��kaz "\loadpatterns" p�esn� d�l� toto:

\begitems
* Zalo�� novou skupinu ("\bgroup")
* Pro ka�d� jazyk ze <seznamu-zkratek-jazyk�> projde <seznam-k�dov�n�>
  dan�ho jazyka (resp. <aktu�ln�-seznam-k�dov�n�>, pokud je za
  zkratkou jazyka uveden).
  Ka�d� takto vytvo�en� dvojici <jazyk>/<k�dov�n�> p�id�l� tabulku
  vzor� d�len� slov zp�sobem popsan�m n��e.
* Ukon�� skupinu ("\egroup")
\enditems

\noindent
Pro ka�dou dvojici <jazyk>/<k�dov�n�> d�l� "\loadpatterns" toto:

\begitems
* Je-li k�dov�n� ozna�eno samotn�m rovn�tkem, p�id�l� dvojici <jazyk>/<k�dov�n�>
  tabulku vzor� d�len� z p�edchoz� dvojice a �innost pro tuto dvojici 
  <jazyk>/<k�dov�n�> kon��. 
* Jestli�e <k�dov�n�> bylo deklarov�no pomoc� z�pisu "[...]=<k�dov�n�>", pak p�id�l�
  dvojici <jazyk>/<k�dov�n�> tabulku, kter� je vyzna�ena v hranat�
  z�vorce. �innost pro tuto dvojici <jakyk>/<k�dov�n�> kon��.
* Pokud byla pro danou dvojici <jazyk>/<k�dov�n�> u� tabulka vzor� d�len� p�id�lena,
  vyp��e varov�n� a vzory d�len� znovu nena��t�.
* Zalo�� dal�� skupinu ("\begingroup").
* Nastav� "\fotenc" podle <k�dov�n�>.
* P�e�te soubor "hyph-<lang>.tex". Tam se p�edpokl�d� deklarace
  "\patterns" a p��padn� "\hyphenation". Pokud nejsme v ini\TeX{}u,
  p��kaz "\patterns" ohl�s� chybu.
* Ukon�� skupinu ("\endgroup")
* Dvojici <jazyk>/<k�dov�n�> p�id�l� st�vaj�c� hodnotu "\language".
* Zv�t�� "\language" o jedni�ku a p�ech�z� na dal�� dvojici <jazyk>/<k�dov�n�>.
\enditems
  
Skute�nost, �e jsou p��kazy "\patterns" a "\hyphenation" uvnit� skupin,
n�m nevad�, proto�e jejich p�i�azen� je glob�ln�. 

Soubory "hyph-<lang>.tex" by m�ly obsahovat p��kaz\inl[declarehyphentable]

\begtt
\declarehyphentable[<jazyk>/<k�dov�n�>]
\endtt
%
kter� podle aktu�ln� hodnoty "\fotenc" m��e p�ed skute�n�m na�ten�m
"\patterns" zav�st konverzn� tabulku. Pro r�zn� "\fotenc" se tedy
nastav� r�zn� konverzn� tabulky, tak�e opakovan�m na�ten�m stejn�ho
souboru "hyph-<lang>.tex" dost�v�me pro r�zn� "\fotenc" r�zn� vzory
d�len�. O~to �lo. Podrobn�ji se o t�to v�ci zmi�uji
v~sekci..., kde je seznam doporu�en�, jak by m�l soubor
"hyph-<jazyk>.tex" vypadat.

P��kaz "\loadpatterns" je mo�n� pou��t opakovan� k na�ten� vzor�
d�len� dal��ch jazyk�. Nap��klad v souboru "langdef.tex"
m��eme na��st jen vzory d�len� \uv{z�kladn�ch jazyk�}, zat�mco 
v n�jak�m extern�m souboru, kter� generuje nap��klad instala�n� program, m��eme
pou��t "\loadpatterns" se seznamem dal��ch jazyk�. Tyto jazyky si
u�ivatel nap��klad vybral v instala�n�m programu pomoc� n�jak�ho
klikac�ho rozhran�. 


\subsec P��kaz {\tt\char`\\setlang}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Nyn� podrobn� pop��eme, co d�l� p��kaz 
"\setlang[<jazyk>/<k�dov�n�>]"\inl[setlang]

\begitems
* Je-li n�jak� parametr pr�zdn�, dopln� jej akt�ln� hodnotou
  jazyka (resp. k�dov�n�).
* Je-li nov� <jazyk> shodn� se st�vaj�c�m a z�rove� nov� <k�dov�n�>
  shodn� se st�vaj�c�m, ned�l� nic a kon��. V�jimkou z tohoto pravidla
  je prvn� spu�t�n� "\setlang", kter� v�dy provede nastaven� jazyka
  a k�dov�n� (p�i pr�zdn�ch parametrech pou�ije jazyk "none" a
  k�dov�n� "8t").
* Pokud je <jazyk> nedeklarovan�, vyp��e chybov� hl�en� a kon��.
* Je-li <k�dov�n�> nedeklarovan� nebo nen� uvedeno 
  v~<seznamu-k�dov�n�> pro dan� jazyk,
  vyp��e varov�n� a nastav� v�choz� na defaultn� k�dov�n�
  dan�ho jazyka.
* Jestli�e do�lo ke zm�n� k�dov�n� nebo jazyka,
  nastav� tabulku vzor� d�len� slov podle zvolen�ho jazyka
  a k�dov�n�. Pokud tabulka nebyla v dob� iniTeXu na�tena, 
  vyp��e varov�n� a nastav� tabulku "\defaulthyphentable".
* Jestli�e byl zm�n�n jazyk, pak spust� "\afterlangstack", kter�
  obsahuje z�sobn�k <p��kaz�> z "\afterlang" pro deaktivaci
  p�edchoz�ho jazyka. 
* Byl-li zm�n�n jazyk, nastav� 
  "\def\currentlang{<jazyk>}"\inl[currentlang] a "\currentdialect=0" a d�le
  spust� "\langinit" nov�ho jazyka.\inl[currentdialect] 
  P�ed p��kazem "\langinit" je�t�
  zkontroluje, zda byl na�ten stylov� soubor jazyka a pokud ne, na�te
  jej. (P�i �ten� m� "\globaldefs=1" a ignoruje mezery na konc�ch ��dk�.)
* Jestli�e nebylo zm�n�no <k�dov�n�>, pak kon��.
* Spust� p��kaz "\lccodesback", kter�
  vr�t� "\lccode" a "\uccode" do v�choz�ho stavu podle plain\TeX{}u (viz sekce...).
* Je-li pou�ito IENC, spust� "\unsetienc[\ienc/\fotenc]" (podle star�ho "\fotenc").
* Provede "\def\fotenc{<k�dov�n�>}". Nebyl-li na�ten soubor
  "ofs-<k�dov�n�>.tex", na�te jej.
  (P�i �ten� m� "\globaldefs=1" a ignoruje mezery na konc�ch ��dk�.)
* Provede "\global\let\gfotenc=\fotenc" a "\aftergroup\resetcodes". D�vod
  tohoto kroku je vysv�tlen v sekci~...
* Je-li pou�ito IENC, provede "\setienc [\ienc/\fotenc]".
* Spust� p��kaz "\<k�dov�n�>:lccodes", kter�
  je deklarovan� pomoc� "\modifydef" v~souboru "ofs-<k�dov�n�>.tex".
  T�m by se m�ly spr�vn� nastavit "\lccode", "\uccode" a "\catcode"
  P�i jejich nastaven� je p�echodn� "\globaldefs=1". Podrobn�ji o~tomto
  kroku viz sekci~...
* Pro dal�� pot�ebu nastav� <k�dov�n�> jako v�choz� k�dov�n� dan�ho jazyka.
* N�sleduje-li t�sn� za "\setlang" p��kaz "\setfonts" (bez mezery), provede ho,
  jinak provede "\setfonts[/]".
* Pokud "\setfonts" skon�il ne�sp�n�, vyp��e varov�n� a 
  nastav� v�choz� rodinu podle dan�ho k�dov�n�. Pro tuto rodinu
  znovu provede "\setfonts".
\enditems

Je vid�t, �e za p��kazem "\setlang" m��e okam�it� n�sledovat
"\setfonts" a pak se m�n� parametry "\setlang" a "\setfonts"
spole�n�. P��kaz "\setfonts" ale nesm� b�t ukryt� uvnit� makra.
Dvojice:

\begtt
\setlang[<jazyk>/<k�dov�n�>]\setfonts[<Rodina>-<varianta>/<velikost>]
\endtt
%
n�m tedy umo��uje p�ep�nat v p�tirozm�rn�m prostoru parametr�, p�i�em�
p�ep�nat m��eme t�eba jen pod�l n�kter� z p�ti os. Pokud po�adavek na
p�epnut� nen� mo�n� splnit (nap�. <Rodina> neobsahuje abecedu
po�adovan�ho jazyka), LANG a OFS nastav� p��padn� jin� <k�dov�n�>
a <Rodinu> a vyp��e o tom varov�n�. 


\subsec P��kaz {\tt\char`\\langdef}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Z�kladn�m p��kazem pou��van�m ve stylov�ch souborech je "\langdef",\inl[langdef]
kter� m� dv� mo�nosti z�pisu:

\begtt
\langdef (<seznam jazyk�>) \<makro> <maska parametr�> {<t�lo makra>}
\endtt
nebo
\begtt
\langdef \<makro> <maska parametr�> {<t�lo makra>}
\endtt
%
Pokud se pou�ije zkr�cen� verze z�pisu (bez <seznamu jazyk�> v~z�vorce), "\langdef" si
dopln� <seznam jazyk�> z makra "\langdeflist".\inl[langdeflist]
Parametr <seznam jazyk�> je seznam zkratek jazyk� odd�len�ch od sebe
mezerami.

P��kaz "\langdef" definuje "\<makro>" podobn�, jako to d�l� "\def".
To znamen�, �e <maska parametr�> a <t�lo definice> se zapisuj� stejn�
jako p�i pou�it� primitivu "\def". Rozd�l je ale v tom, �e "\makro"
m� dan� v�znam jen pro jazyky ze <seznamu jazyk�>. Jinde m��ete pou��t
"\langdef" stejn�ho "\<makra>" pro jin� jazyky, ani� by do�lo 
k p�ekr�v�n� definic. Typick�m p��kladem pou�it� "\langdef" je
definov�n� makra "\today" pro r�zn� jazyky r�zn�.

Chceme-li definovat "\<makro>" s prefixem (smysl m� asi jen prefix
"\long"), pak je nutno p�ed pou�it�m makra napsat
"\let\langdefprefix=\<prefix>". Po ka�d�m proveden� "\langdef"
se vrac� "\langdefprefix" na hodnotu "\relax".

Pokud u�ivatel pou�ije ve sv�m dokumentu "\<makro>" definovan� pomoc�
"\langdef", pak se pou�ije ta hodnota makra, kter� odpov�d� aktu�ln�
zvolen�mu jazyku. Jestli�e je "\<makro>" definovan� jen pro jin�
jazyky ne� aktu�ln� zvolen�, LANG je�t� zkontroluje, zda 
"\<makro>" bylo definovan� pomoc� "\langdef (*) \<makro>". Pokud ano, spust� toto
makro. Jinak LANG vyp��e varov�n� o~nedefinovan�m
"\<makru>" pro aktu�ln� jazyk a "\<makro>" je ignorov�no.

Pop��eme nyn� podrobn�, co "\langdef" d�l�. Nejprve 
definuje "\<makro>" jako "\langcommand{<makro>}".
To d�l� pro v�echny
jazyky stejn�, tak�e nedoch�z� k~p�ekr�v�n� definic stejn�ho makra.
D�le provede:

\begtt
\langdefprefix\def \c:><makro>(<jazyk>) <maska parametr�> {<t�lo makra>}
\endtt
%
kde <jazyk> je prvn� jazyk ze <seznamu jazyk�> a "\c:><makro>(<jazyk>)"
je kontroln� sekvence, kterou zde definujeme.
Pokud <seznam jazyk�> obsahuje dal�� jazyky, "\langdef" pro ka�d� 
z~nich je�t� provede

\begtt
\let \c:><makro>(<dal�� jazyk>) = \c:><makro>(<jazyk>)
\endtt

Dal�� pr�ci provede a� p��kaz "\langcommand{<makro>}"\inl[langcommand]
v~dob� pou�it�
"\<makra>". Tento p��kaz p�ekontroluje, zda je definov�no makro
"\c:><makro>(\currentlang)". Pokud je definov�no, pak toto makro spust�.
Nen�-li toto makro definov�no, pokus� se spustit
"\c:><makro>(*)". Pokud ani toto makro nen� 
definov�no, vyp��e chybov� hl�en� pou�it�m p��kazu 
"\langcommandwarn{<makro>}".\inl[langcommandwarn]

M�-li "\expandaction" hodnotu "\noexpand", pak "\langcommand{<makro>}"
zp�tn� expanduje na "\<makro>", tak�e je \uv{robustn�} v La\TeX{}ov�m
smyslu tohoto slova. O~triku s~"\expandaction" je �e�eno v�ce 
v~dokumentaci k~OFS v~sekci~3.2.

P��kaz "\langdef" odm�t� p�edefinovat kontroln� sekvence, kter� byly
definov�ny jinak ne� pomoc� "\langdef". P�i pokusu o~p�edefinov�n�
takov� sekvence "\langdef" vyp��e varov�n� pomoc� p��kazu
"\langdefwarn\<makro>"\inl[langdefwarn]. 
P�esn�ji: m�-li kontroln� sekvence "\<makro>"
jin� v�znam ne� "\undefined", "\relax" nebo "\langcommand{<makro>}",
pak "\langdef" ponech� "\<makro>" nezm�n�no a vyp��e jen varov�n�.
D�vod tohoto opat�en� je ten, �e ve stylov�ch souborech m��e b�t
definov�no pomoc� "\langdef" plno maker, o~nich� u�ivatel v�bec netu��
a jejich� n�zvy m��e u�ivatel m�t ve sv�ch vlastn�ch
definic�ch. P��kaz "\langdef" v takov�m p��pad� ct� u�ivatelovy
definice. Podobn� opat�en� je uplatn�no na "\characterdef" z~OFS.


\subsec P��kaz {\tt\char`\\setdialect}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

P��kaz "\setdialect[<n��e��>]"\inl[setdialect] 
spolupracuje s makrem "\whichdialect", kter� m��e b�t 
pomoc� "\langdef"\inl[whichdialect] 
(z�visle na pou�it�m jazyku) definov�no ve stylov�m souboru.
Pravidla definice makra "\whichdialect" jsou uvedena v~sekci...

Nen�-li makro "\whichdialect" pro aktu�ln� jazyk v�bec deklarov�no,
pak p��kaz
"\setdialect[<n��e��>]" vyp��e jen varov�n� a kon��. Jinak nastav� numerick�
registr "\currentdialect"\inl[currentdialect] na ��selnou hodnotu
<n��e��>, kter� je deklarov�na v makru "\whichdialect". D�l� to tak,
�e nastav� "\currentdialect=0" a d�le v cyklu zkou�� spustit
"\whichdialect", kde p�i ka�d�m dal��m pokusu zv�t�� "\currentdialect"
o~jedni�ku.  Cyklus je ukon�en v p��pad�, kdy "\whichdialect" vr�t�
<n��e��> stejn� jako v~parametru p��kazu "\setdialect". Cyklus je
ukon�en tak� tehdy, kdy� "\whichdialect" vr�t� pr�zdnou hodnotu. 
V~tomto druh�m p��pad� je�t� p��kaz "\setdialect" vr�t� hodnotu
"\currentdialect" do stavu, ve kter�m byla p�ed zavol�n�m p��kazu, a
vyp��e varov�n�, �e <n��e��> nen� pro aktu�ln� jazyk
deklarov�no. V�echna p�i�azen� jsou lok�ln�.

Jestli�e pou�ijeme "\setdialect[]", pak p��kaz "\setdialect" prov�d� stejnou
�innost jako je uvedena v��e. Nav�c ka�dou nepr�zdnou n�vratovou
hodnotu makra "\whichdialect" p�id� do makra "\tmpc" a odd�luje je
mezerou. V tomto p��pad� nep��e ��dn� varov�n�.


\subsec Tabulky dvojic znak�, z nich� prvn� je aktivn�
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

V n�kter�ch jazyc�ch se pracuje s tzv. zkratkami (shorthands), viz t�
sekci~... LANG umo��uje ve stylov�ch souborech deklarovat tabulky maker
dvojznak� nez�visle pro ka�d� jazyk zvlṻ. U�ivatel pak m��e nastavit
prvn� znak dvojznak� jako aktivn� a definovat jej jako "\expdoublechar".
T�m za�nou dvojznaky expandovat na deklarovan� makra v~z�vislosti 
na aktu�ln�m jazyku. P��klad:

\begtt
\def\langdeflist {de de2} % uk�zka ze stylov�ho souboru lang-de.tex
\doublechardef "u{\"u}
\doublechardef "o{\"o}
\doublechardef "s{\ss}
... atd.
\def\langdeflist {hu}     % uk�zka ze stylov�ho souboru lang-hu.tex
\doublechardef "u{\H u}
\doublechardef "o{\H o}
... atd.
\activedef "{\expdoublechar"}  % toto provede makro \activechar"
\endtt

Po proveden� "\activedef"{\tt\char`\"} se stane uvozovka aktivn�.
Pokud m� "\currentlang" hodnotu "de" nebo "de2", pak dvojice
{\tt\char`\"u} expanduje na {\tt\char`\\\char`\"u}, zat�mco p�i "\currentlang"
s hodnotou "hu" expanduje tat� dvojice na "\H u". P�i jin�m,
"\currentlang" expanduje samotn� uvozovka na sv�j neaktivn� prot�j�ek
za kter�m n�sleduje znak \clqq"u"\crqq{} jako oby�ejn� znak.

Vysv�tl�me si nyn� podrobn�, jak je to ud�l�no. Makro 
"\doublechardef"\inl[doublechardef]
m� dv� varianty z�pisu stejn� jako "\langdef":

\begtt
\doublechardef (<seznam jazyk�>) <znak1><znak2><maska parametr�>{<makro>}
\endtt
nebo
\begtt
\doublechardef <znak1><znak2><maska parametr�>{<makro>}
\endtt
%
V p��pad� varianty bez explicitn�ho "<seznamu jazyk�>" se pou�ije
<seznam jazyk�> z~makra "\langdeflist".
<Maska parametr�> je samoz�ejm� nepovinn� a v�t�inou se nepou��v�,
proto�e obvykl� zkratky expanduj� na makra bez parametr�.

P��kaz "\doublechardef" provede:

\begtt
\def \d:><znak1><znak2>(<jazyk>) <maska parametr�>{<makro>}
\endtt
%
kde "\d:><znak1><znak2>(<jazyk>)" je nov� definovan� kontroln� sekvence
a <jazyk> je prvn� jazyk ze <seznamu jazyk�>. Pro ostatn� jazyky 
makro provede ztoto�n�n� "\d:><znak1><znak2>(<dal�� jazyk>)" se
sekvenc� "\d:><znak1><znak2>(<jazyk>)" pomoc� "\let".

M�sto <znaku2> je mo�no pou��t symbol "#1":
\begtt
\doublechardef <znak1>#1<maska dal��ch parametr�>{<makro>}
\endtt
%
V tomto p��pad� "\doublechardef" provede:

\begtt
\def \d:><znak1>(<jazyk>) #1<maska dal��ch parametr�>{<makro>}
\endtt
%
a provede ztoto�n�n� pro ostatn� jazyky ze seznamu parametr�.

Informace ulo�en� pomoc� "\doublechardef" vyu�ije makro
"\expdoublechar"\inl[expdoublechar]
nebo "\ssdoublechar".\inl[ssdoublechar] Ob� makra d�laj� zhruba tot�.
P�e�tou dva n�sleduj�c� znaky <znak1> a <znak2> a expanduj� na 
prvn� definovanou sekvenci z n�sleduj�c�ho seznamu sekvenc�:

\begtt
\d:><znak1><znak2>(\currentlang)
\d:><znak1>(\currentlang)
\d:><znak1><znak2>(*)
\d:><znak1>(*)
\endtt
%
Jedn�-li se o~sekvenci, v~jej�m� n�zvu
chyb� <znak2>, pak se p�ipoj� za tuto sekvenci nav�c "{<znak2>}", 
tj.~<makro> m��e pracovat se <znakem2> jako s~parametrem "#1".

Nen�-li ��dn� z uveden�ch sekvenc� definov�na, makra "\expdoublechar" nebo
"\ssdoublechar" expanduj� na neaktivn� <znak1> a p�ipoj� za n�j <znak2>.
Na kategori�ch <znaku1> a <znaku2> nez�le��.

Makro "\expdoublechar" prov�d� ve�kerou svou �innost na �rovni expand
procesoru. Nen� tedy ohro�ena tvorba ligatur a kerningov�ch p�r� 
s~okoln�mi znaky ani d�len� slov, pokud se makro vyskytuje uvnit�
slova. Bohu�el, expand procesor neum� o�et�it, zda n�hodou nen�
<znak2> mezera. Mezeru bez varov�n� ignoruje a za <znak2> pova�uje a�
prvn� nemezerov� znak. 

Pokud se n�m to nel�b�, lze pou��t m�sto "\expdoublechar"
makro "\ssdoublechar" (space-sensitive double-char). Toto makro
pracuje s "\futurelet", tj. vyu��v� p��kazy hlavn�ho procesoru.
Bohu�el, pak nefunguj� ligatury s okoln�mi znaky ani kerningov�
p�ry. Na druhou stranu makro neignoruje mezeru jako <znak2> a je
odoln� i proti symbol�m \clqq"{"\crqq{} nebo \clqq"}"\crqq{} 
v m�st� <znaku2>. Pro tyto speci�ln� p��pady m��eme dokonce deklarovat
vlastn� <makro> pomoc�:

\begtt
\doublechardef <znak1>\space  <maska parametr�>{<makro>}
\doublechardef <znak1>\bgroup <maska parametr�>{<makro>}
\doublechardef <znak1>\egroup <maska parametr�>{<makro>}
\endtt

P��kaz "\ssdoublechar" nejprve zkontroluje, zda <znak2> nen� n�kter�
z~t�chto znak�: \uv{mezera}, \clqq"{"\crqq{} nebo \clqq"}"\crqq. 
Pokud ano, pak pozm�n� <znak2>
na odpov�daj�c� kontroln� sekvenci: "\space", "\bgroup" nebo "\egroup"
a spust� "\expdoublechar". Nyn� u� bude na�ten <znak2> do parametru
maker bez probl�m�.

Chceme-li deklarovat vlastn� makro, kter� reaguje na 
\clqq"{"\crqq{} nebo \clqq"}"\crqq{}
v~m�st� <znaku2>, pak bude asi pot�eba, aby makro expandovalo (mimo
jin�) na odpov�daj�c� "\bgroup" resp. "\egroup", jinak by mohl z�stat
dokument p�i pou�it� takov�ho makra nevybalancovan�.

Makra "\expdoublechar" i "\ssdoublechar" jsou vybavena
testem na to, zda je kontroln� sekvence "\expandaction" rovna
"\noexpand". Pokud ano, 
makra expanduj� na "\noexpand<znak1>", za kter�m n�sleduje <znak2>.

Makra "\expdoublechar" a "\ssdoublechar" pracuj� stejn� v textov�m i
matematick�m m�du, pokud pro <znak1> nen� deklarov�no matematick�
makro pomoc�:

\begtt
\doublechardef <znak1>\mathchar <maska parametr�>{<matematick� makro>}
\endtt

V takov�m p��pad� "\expdoublechar<znak1>" i
"\ssdoublechar<znak1>" expanduj� v~matematick�m m�du na 
<matematick� makro>, zat�mco v~textov�m m�du se chovaj� zp�sobem
popsan�m v��e.

Proto�e v��e uveden� <matematick� makro> se pou�ije v�dy bez
z�vislost� na hodnot� <znaku2>, je n�kdy v�hodn� je v�bec nedeklarovat
a m�sto toho v�tvit na p��pad matematick�ho m�du jednotliv� u ka�d�ho
<makra> deklarovan�ho pomoc� "\doublechardef". M��eme k tomu vyu��t
p��kaz "\textormath{<text-makro>}{<math-makro>}",\inl[textormath] 
kter� expanduje na odpov�daj�c� makro podle toho, zda je \TeX{} 
v~textov�m nebo matematick�m m�du. Tato makra mohou za sebou okam�it�
��st dal�� znaky ze vstupu bez nutnosti p�eskakovat "\else" nebo
"\fi". P��klad pou�it� najdeme v souboru "lang-de.tex".



\subsec Pr�ce s aktivn�mi znaky
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

V uk�zce na za��tku p�edchoz� sekce byl zm�n�n p��kaz
"\activedef"\inl[activedef].

\begtt
\activedef <znak><maska parametr�>{<makro>}
\endtt

P��kaz "\activedef" nastav� <znak> jako aktivn� a d�le jej definuje stejn�,
jako by to ud�lal primitiv "\def". Pokud se <znak> vyskytuje 
v~masce parametr� nebo v t�le makra, pak tam m� je�t� svoji p�vodn�
(pravd�podobn� neaktivn�) kategorii. P��kaz definuje makro p��mo�a�e,
tj. nen� zde implementov�na z�vislost na hodnot� "\currentlang".

P�i tvorb� maker, kter� pracuj� s aktivn�mi znaky, se m��e hodit
pou��t p��kaz "\maybeactive"\inl[maybeactive], kter� m� dva parametry:

\begtt
\maybeactive <token1><token2>
\endtt
%
Makro ponech� <token1> beze zm�ny, ale ne� mu p�ed� ��zen�, m��e
zm�nit kategorii <tokenu2> na aktivn�. Ud�l� to pouze tehdy, 
kdy� znak s ASCII hodnotou <tokenu2> m� v dob� �innosti makra 
aktivn� kategorii. Jinak ponech� <token2> beze zm�ny.
P��klad pou�it�:

\begtt
\def\test {\maybeactive \ifx *\tmpa ...\else ...\fi}
\endtt
%
P��klad ukazuje, jak m��eme porovn�vat znak
v~"\tmpa" (t�eba tam byl ulo�en pomoc� "\futurelet") s~konkr�tn�m znakem.
Nech� v dob� definice makra "\test" m� hv�zdi�ka kategorii~12.
Je-li pak p�ed spu�t�n�m makra "\test" provedeno 
"\let\tmpa=*", pak "\ifx" vr�t� hodnotu true nez�visle na tom, zda 
v tomto okam�iku je kategorie hv�zdi�ky~12 nebo~13.

Makro "\maybeactive" pracuje na �rovni hlavn�ho procesoru
a vyu��v� pomocn� kontroln� sekvence "\tmpc" a "\tmpd".


\subsec Princip nastavov�n� {\tt\char`\\lccode} znak�
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

P�ipome�me, �e "\setlang" p�i zm�n� k�dov�n� font� spust�
"\lccodesback" a d�le p��kaz "\fotenc:lccodes",
kter� m� b�t deklarov�n v souboru "ofs-\fotenc.tex".
T�m by m�ly b�t nastaveny "\lccode", "\uccode" a p��padn� "\catcode"
podle nov�ho k�dov�n�. Nastaven� se provede glob�ln�, proto�e v dob�
spu�t�n� t�chto maker je p�echodn� nastaveno "\globaldefs=1".

P��kaz "\fotenc:lccodes" by m�l definovat nov� v�znam makra
"\lccodesback"\inl[lccodesback], kter� by m�lo obsahovat p��kazy, pomoc�
nich� se nov� nastaven� "\lccode", "\uccode" a p��padn� "\catcode"
vr�t� do p�vodn�ho stavu podle standardu z ini\TeX{}u a souboru
"plain.tex". P���t�, a� bude "\setlang" p�ep�nat na dal�� k�dov�n�, se
toto makro "\lccodesback" pou�ije, tak�e nov� makro "\fotenc:lccodes"
m��e p�edpokl�dat, �e v�choz� stav "\lccode", "\uccode" a "\catcode"
je podle ini\TeX{}u a plainu. P�i prvn�m nastaven� k�dov�n� (prvn�
vol�n� "\setlang" v dokumentu) je "\lccodesback" nastaveno na "\relax",
proto�e v�choz� stav k�d� je skute�n� podle ini\TeX{}u a podle plainu.

P��kaz "\fotenc:lccodes" m��e pro nastaven� k�d� vyu��t n�sleduj�c�
p�ipraven� makra:

\begitems
* "\lccodes<znak1><znak2>"\inl[lccodes] -- nastav� "\lccode" <znaku1> i <znaku2> na
  <znak1> a nastav� "\uccode" <znaku1> i <znaku2> na <znak2>. Pokud
  maj� <znak1> anebo <znak2> kategorii 12, nastav� jim kategorii 11.
* "\lccodesloop<znak1><znak2><znak3>"\inl[lccodesloop] -- provede cyklus, kter�
  spou�t� n�sleduj�c� p��kazy: "\lccodes<znak1><znak3>", "\lccodes<znak1+1><znak3+1>",
  atd. a� po posledn� p��kaz "\lccodes<znak1+k=znak2><znak3+k>". 
  Jin�mi slovy: cyklus se prov�d� p�es \uv{mal� p�smena} v rozsahu
  <znak1> a� <znak2>, p�i�em� \uv{velk� p�smeno} pro <znak1> je
  <znak3> a dal�� \uv{velk� p�smena} maj� od \uv{mal�ch p�smen} st�le
  stejn� odstup.
\enditems

V p��kazu "\fotenc:lccodes" je pot�eba dodr�ovat n�sleduj�c� pravidlo
pro nastaven� "\catcode":
zm�n�me kategorii 12 na 11 pr�v� tehdy, kdy� je pro dan�
znak nastaveno nenulov� "\lccode". M�-li znak kategorii 13 (je
aktivn�) nebo jakoukoli jinou kategorii, nech�me ji nezm�n�nu. Jde o
to, �e p�ed zavol�n�m "\fotenc:lccodes" je zavol�no p��kazem
"\setlang" p��padn� nastaven� vstupn�ho p�ek�dov�n� bal��kem
IENC. Tento bal��ek, pokud nem� k dispozici enc\TeX{} a pokud mus�
skute�n� prov�st p�ek�dov�n� vstupu na odli�n� intern� hodnoty, nastav�
pot�ebn�m znak�m aktivn� kategorii. Tuto kategorii tedy mus�me 
v p��kazu "\fotenc:lccodes" respektovat a nesm�me ji m�nit.
P�ipraven� makra "\lccodes" a "\lccodesloop" toto pravidlo dodr�uj�.

P�i definici p��kazu "\lccodesback" m��eme pou��t n�sleduj�c� p��kazy:

\begitems
* "\zerolccodes<znak1><znak2>"\inl[zerolccodes] -- nastav� v�em znak�m v rozsahu
   <znak1> a� <znak2> nulov� "\lccode" a "\uccode". Pokud m� znak
   kategorii 11, nastav� mu kategorii 12.
* "\plainlccodes"\inl[plainlccodes] -- nastav� "\lccode", "\uccode" znak�m v rozsahu
  "^^00" a� "^^7f" podle hodnot obvykl�ch pro plain\TeX{}. Kategorii
   nastav� na 12 u pot�ebn�ch znak� (podle plain\TeX{}u) jen tehdy,
   kdy� p�vodn� kategorie znaku je 11.
\enditems 

Nyn� vysv�tl�me, jak se m�n� nastaven� "\lccode" atd. p�i opou�t�n�
skupin nebo p�i nastaven� nov�ho k�dov�n� p��kazem "\setlang". Tento
mechanismus je spole�n� s nastavov�n�m p�ek�dovac�ch tabulek bal��kem
IENC. Tyto tabulky jsme ob�as nuceni nastavit jen glob�ln� (v~enc\TeX{}u
to ani nijak nejde), tak�e jsem se rozhodl i "\lccode" atd. nastavit 
glob�ln� a o�et�it p�echody mezi skupinami n�sleduj�c�m trikem.

P��kaz "\setlang" p�i zm�n� k�dov�n� glob�ln� definuje makro 
"\gfotenc"\inl[gfotenc]
hodnotou nov�ho k�dov�n�. Makro "\fotenc" je definov�no stejn�,
ale jenom lok�ln�. D�le "\setlang" provede 
"\aftergroup\resetcodes".

Makro "\resetcodes"\inl[resetcodes] p�i sv�m spu�t�n� na konci skupiny
provede n�sleduj�c� �innost:

\begitems
* Je-li "\fotenc" rovno "\gfotenc", ned�l� nic a kon��.
* Spust� "\lccodesback" (s p�echodn�m "\globaldefs=1").
* Je-li pou�it bal��ek IENC, spust� "\unsetienc [\ienc/\gfotenc]".
* Je-li pou�it bal��ek IENC, spust� "\setienc [\ienc/\fotenc]".
* Spust� "\fotenc:lccodes" (s p�echodn�m "\globaldefs=1").
* Provede "\global\let\gfotenc=\fotenc".
\enditems

Uva�ujme p��klad:

\begtt
\setlang [/A]   % provede \aftergroup\resetcodes, toto \resetcodes 
                % se nikdy nespust�, proto�e nejsme uvnit� skupiny.
                % nastav� IENC podle A, 
                % spust�  \A:lccodes, kter� (mj.) definuje \lccodesback
                % je \fotenc=A, \gfotenc=A
{  ...          % je st�le \fotenc=A, \gfotenc=A
  \setlang [/B] % provede \aftergroup\resetcodes
                % spust� \lccodesback definovan� p�edchoz�m \A:lccodes        
                % ukon�� tabulku IENC podle A a nastav� ji podle B 
                % spust� \B:lccodes, kter� (mj.) definuje \lccodesback
  ...           % je \fotenc=B, \gfotenc=B
  \setlang [/C] % provede \aftergroup\resetcodes
                % spust� \lccodesback definovan� p�edchoz�m \B:lccodes        
                % ukon�� tabulku IENC podle B a nastav� ji podle C  
                % spust� \C:lccodes, kter� (mj.) definuje \lccodesback
  ...           % je \fotenc=C, \gfotenc=C
}               % je \fotenc=A, \gfotenc=C
                % prvn� \resetcodes (z \aftergroup\resetcodes) provede:         
                %   spust� \lccodesback definovan� p�edchoz�m \C:lccodes
                %   ukon�� tabulku IENC podle C a nastav� ji podle A
                %   spust� \A:lccodes, kter� (mj.) definuje \lccodesback
                %   nastav� \gfotenc=A
                % druh� \resetcodes neprovede nic, proto�e u� je
                % \fotenc=A, \gfotenc=A 
\endtt

Z u�ivatelsk�ho pohledu se tedy k�dy nastavuj� lok�ln�, a�koli ve
skute�nosti jsou nastaveny glob�ln� a v makrech se star�me o jejich
spr�vn� p�enastaven�.

V popisu �innosti makra "\resetcodes" jsme je�t� nezm�nili n�sleduj�c�
vlastnost: pokud m� makro "\langisused"\inl[langisused] v�znam
"\undefined", pak "\resetcodes" zavol� "\setlang[/]". Prvn�
zavol�n� makra "\setlang" nastav� lok�ln� pro sekvenci "\langisused" 
v�znam "\relax", tak�e k v��e zm�n�n� podm�nce dojde jen tehdy, kdy� prvn�
pou�it� p��kazu "\setlang" bylo provedeno ve skupin� a \TeX{} je zrovna
na konci t�to skupiny. V~t�to situaci je u� velmi obt��n� se vr�tit 
k p�vodn�m makr�m z "plain.tex", nebo� k�dovac� soubory byly p�e�teny
s glob�ln�mi definicemi. Z�staneme tedy rad�ji u v�choz�ho k�dov�n� 
"8t" a jazyka "none". To v tuto chv�li za��d� pr�v� p��kaz "\setlang[/]".


\sec Pravidla vytv��en� podp�rn�ch soubor� pro LANG
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsec Pravidla pro soubory {\tt hyph-\levaskoba jazyk>.tex}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

P�vodn� jsem po��tal s t�m, �e LANG bude ��st soubory
"ofs-<k�dov�n�>.tex" je�t� p�ed na�ten�m souboru "hyph-<jazyk>.tex". 
V takov�m p��pad� by sta�ilo pou��vat pro speci�ln� znaky jazyka na k�dov�n� 
nez�visl� \TeX{}ov� sekvence.  Podobn� je to ud�l�no nap��klad ve form�tu
"csplain". Ukazuje se ale, �e i po opu�t�n� skupiny \TeX{} nech�v� 
v~pam�ti v�echny pou�it� \uv{multiletter control sequences}, p�i�em� p�i
na��t�n� soubor� "ofs-<k�dov�n�>.tex" v�ech mo�n�ch jazyk� sv�ta se 
t�chto \uv{multiletter control sequences} m��e vytvo�it docela dost. 
P�itom ve vlastn�m dokumentu v�t�� ��st t�chto
kontroln�ch sekvenc� nepou�ijeme (proto�e asi nebudeme pou��vat
v�echny jazyky). Rozhodl jsem se tedy �et�it pam� \TeX{}u a soubory
"ofs-<k�dov�n�>.tex" v dob� ini\TeX{}u nena��tat. 
Soubory "hyph-<jazyk>.tex" se tak stanou m�n� p�ehledn�, ale
to snad nevad�, proto�e se do nich stejn� nikdo ned�v�.

Soubory "hyph-<jazyk>.tex" by m�ly n�kde na za��tku obsahovat
p��kaz\inl[declarehyphentable]

\begtt
\declarehyphentable [<jazyk>/<k�dov�n�>] % for LANG package
\endtt
%
kde <jazyk> je zkratka jazyka dan�ch vzor� d�len� a <k�dov�n�> je
k�dov�n�, ve kter�m jsou tyto vzory d�len� naps�ny. P��kaz
"\declarehyphentable" zkontroluje, zda je aktu�ln� hodnota 
"\fotenc" rovna <k�dov�n�>. Pokud ano, pak nastav� v�em znak�m s~k�dy
128--255 "\lccode" rovno k�du znaku. Pokud ne, pak zavol� soubor
"h<k�dov�n�>-\fotenc.tex", ve kter�m se p�edpokl�d� nastaven�
"\lccode" znaku podle <k�dov�n�> na hodnotu podle "\fotenc".
T�m je zaru�eno spr�vn� p�ek�dov�n� obsahu "\patterns" a
"\hyphenation" na k�dov�n� podle "\fotenc", proto�e zm�n�n� \TeX{}ov�
primitivy konvertuj� v�echna data vzor� d�len� podle aktu�ln�
hodnoty "\lccode".

V~datech pro "\patterns" a "\hyphenation" je mo�n� ps�t p��mo
osmibitov� znaky podle deklarovan�ho <k�dov�n�>. Proto�e ale m��eme
m�t obavy, �e nebude v dob� ini\TeX{}u nastaven "xord/xchr" vektor na
identick� zobrazen�, je lep�� asi ps�t osmibitov� znaky v~"^^ab" notaci.

V~souborech <hyph> m��eme pro sv� pot�eby prov�d�t lok�ln� nastaven� a
definice. Bal��ek LANG po na�ten� vzor� tato nastaven� zapomene.


\subsec Stylov� soubory, pravidla definov�n� maker pro jazyky
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

V sou�asn�ch \TeX{}ov�ch distribuc�ch jsou stylov� soubory pro jazyky
definov�ny r�zn�. Jak �el �as, nabalovaly se dal�� my�lenky a n�kter�
p�vodn� p��stupy se ponech�valy jen kv�li zp�tn� kompatibilit�. V p��pad�
bal��ku LANG m�me v�hodu, �e m��eme za��t \uv{na zelen� louce} a d�lat
pro v�echny jazyky v�ci po��dn� a s jednotn�m p��stupem. Z~tohoto
pohledu se jev� vhodn� v�echny stylov� soubory  pro jazyky p�epsat a
nazvat je nap��klad jm�nem "lang-<zkratka jazyka>.tex".

P�i psan� stylov�ho souboru pro LANG mus�me m�t na pam�ti, �e je �ten a� v dob�
prvn�ho p�epnut� do deklarovan�ho jazyka. P�itom re�im �ten� je
nastaven tak, �e prob�h� uvnit� skupiny s~"\endlinechar=-1"
a "\globaldefs=1".

Nastaven� "\endlinechar=-1" zp�sob� ignorov�n� pr�zdn�ch ��dk� a
token procesor nav�c nevytv��� mezery na konc�ch ��dk�. D�vod tohoto
opat�en� je z�ejm�: nen� toti� ��douc�, aby se p�i na�ten� stylov�ho
souboru do sazby vloudila mezera (nebo dokonce konec odstavce),
proto�e je mo�n�, �e bude stylov� soubor na�ten v horizont�ln�m m�du.

Po naps�n� stylov�ho souboru je tedy pot�eba p�ekontrolovat, zda jeho
p�e�ten�m nevygenerujeme ne��douc� mezery
v~horizont�ln�m m�du. D�ky "\endlinechar=-1" je to m�n� pravd�podobn�,
ne� obvykle, ale bohu�el to nen� vylou�en�. P��klad:

\begtt
\langdef \makro {...} % komentar
\endtt
%
Zde mezera za pravou z�vorkou \clqq"}"\crqq{} z�st�v� a to je �patn�. 
Mus�me tedy zcela odstranit \clqq"% komentar"\crqq{} nebo p�ilepit znak procenta
t�sn� za ukon�ovac� z�vorku definice.

D�ky "\globaldefs=1" jsou v�echny definice na vn�j�� �rovni stylov�ho
souboru glob�ln�, tj. efekt je stejn�, jako by byl stylov� soubor
p�e�ten na za��tku dokumentu, kdy je�t� nen� otev�ena ��dn� skupina.
Bohu�el, p�i "\globaldefs=1" nen� mo�no ve stylov�ch souborech p�echodn�
nastavovat "\catcode" uvnit� \uv{pracovn�ch} skupin. Jin�mi slovy
n�sleduj�c� p��klad je �patn�:

\begtt
{\catcode`\*=13 \gdef *{...}}
\endtt
%
Zde se nevr�t� kategorie hv�zdi�ky po ukon�en� skupiny do p�vodn�ho
stavu. M��eme sice vr�tit kategorii hv�zdi�ky \uv{ru�n�}
p��kazem "\catcode`\*=12", ale ani to nen� korektn�, proto�e nem�me
jistotu, zda v dob�, kdy je n� stylov� soubor p�e�ten, nen� n�hodou
u�ivatelem nastavena kategorie hv�zdi�ky na jinou hodnotu ne�~12.

Jedin� spr�vn� mo�nost, jak pracovat ve stylov�ch souborech se zm�nami
kategori�, je pou��vat p�ipraven� makra "\activedef", "\maybeactive".
Nebo je mo�no pou��t n�sleduj�c� postup:

\begtt
\globaldefs=0  % toto p�i�azen� se provede glob�ln�, ale to nevad�
{\catcode`\...  \gdef... }
\globaldefs=1  % toto p�i�azen� je lok�ln�, co� pot�ebujeme
... dal�� definice jsou automaticky glob�ln�
\endtt

P�i na�ten� stylov�ho souboru provede LANG p�esn� tuto �innost:

\begitems
* Pokud u� byl <stylov�-soubor> na�ten, neprovede nic.
* Jinak zalo�� novou skupinu ("\bgroup").
* Zavol� makro "\plaincatcodes"\inl[plaincatcodes], kter� 
  lok�ln� nastav� kategorie v�ech ASCII znak� na \uv{norm�ln� hodnoty}
  podle plain\TeX{}u. D�le nastav� "\catcode`\@=11".
* Provede "\endlinechar=-1".
* Provede "\globaldefs=1".
* Spust� "\input <stylov�-soubor>".
* Ukon�� skupinu ("\egroup"). T�m se vr�t� "\globaldefs=0" a nav�c se
  uvedou hodnoty kategori� znak� do stavu, jak je m�l p�ed "\bgroup"
  nastaveny u�ivatel.
\enditems

Vid�me tedy, �e ve stylov�m souboru m�me zaru�eny \uv{norm�ln�}
kategorie jako v~plain\TeX{}u (plus kategorie "@" nastavenu na 11) 
nez�visle na tom, jak� kategorie m� v~dob� vol�n� souboru 
nastaveny u�ivatel. 

Poznamenejme, �e v��e popsan� postup �ten� je implementov�n v~makru
"\ofsinput"\inl[ofsinput] z~OFS. Rovn� zde zm�n�n� 
makro "\plaincatcodes" je definov�no v~OFS. Tato makra jsou vyu�ita
i p�i �ten� k�dovac�ch soubor� typu "ofs-<k�dov�n�>.tex".

K�dov�n� stylov�ho souboru by m�lo b�t jen ASCII.
Chceme-li pracovat se znaky, kter� jsou v deklarovan�m jazyku b�n�,
ale nejsou v ASCII, pak mus�me pou��t \TeX{}ov� sekvence, kter� jsou
definov�ny v souboru "ofs-<k�dov�n�>.tex". Zaru�en� budou fungovat
v�echny takov� sekvence, kter� jsou deklarov�ny sou�asn� ve v�ech 
souborech "ofs-<k�dov�n�>.tex" pro v�echna <k�dov�n�> ze <seznamu-k�dov�n�>
dan�ho jazyka. P�ipom�n�m, �e <seznam-k�dov�n�> byl deklarov�n p��kazem
"\declarelang" v souboru "langdef.tex". 

Prvn�m p��kazem ve stylov�m souboru by m�l b�t:

\begtt
\def\langdeflist {<seznam zkratek jazyk�>}
\endtt
%
abychom nemuseli ps�t kulat� z�vorky ke ka�d�mu "\langdef".

D�le by m�lo b�t pomoc� "\langdef" definov�no makro 
"\langinfo",\inl[langinfo] kter�
expanduje na pln� n�zev deklarovan�ho jazyka. Obsahuje-li <seznam zkratek jazyk�>
v�ce ne� jeden jazyk, m�li bychom definovat "\langinfo" pro ka�d�
jazyk samostatn� za pou�it� kulat� z�vorky.

Obsahuje-li jazyk v�ce n��e��, pak je nutn� definovat
makro "\whichdialect"\inl[whichdialect] 
n�sleduj�c�m zp�sobem:

\begtt
\langdef \whichdialect {\ifcase\currentdialect default\or
   <n��e�� 1>\or <n��e�� 2>\or ... \or <n��e�� n>\fi}
\endtt
%
Neobsahuje-li jazyk n��e��, pak makro "\whichdialect" v�bec
nedefinujeme. V bal��ku LANG je �e�eno "\langdef \whichdialect (*) {none}",
tak�e m�me zaru�eno, �e "\whichdialect" expanduje na \uv{none} pro
v�echny jazyky, kter� si nedeklaruj� vlastn� podobu tohoto makra.

V dal��ch makrech m��eme pou��vat podm�nky 
"\ifnum <��slo>=\currentdialect" nebo "\ifcase\currentdialect",
abychom makra v�tvili podle n��e��, kter� si u�ivatel nastavil
p��kazem "\setdialect". P��klad pou�it� "\currentdialect"
najdeme nap��klad v souboru "lang-de.tex", kde "\toady"
pou��v� pro leden slovo \uv{Januar}, ale pokud je nastaveno n��e��
"austrian", pak se leden vypisuje jako \uv{J\"anner}.

V~makru "\langinit"\inl[langinit] bychom m�li soust�edit v�choz�
nastaven�, proto�e toto makro se spou�t� p�i ka�d�m p�epnut� do jazyka
p��kazem "\setlang". Makro "\langinit" definujeme pomoc� "\langdef".
M��e zde b�t nastaven� mezerov�n� (nap�.~"\frenchspacing")
a nastaven� hodnot "\lefthyphenmin" a "\righthyphenmin". 
O tomto nastaven� bychom m�li informovat u�ivatele v log souboru p��kazem
"\langmessage". D�le je nutn� uvnit� makra "\langinit" pamatovat na
navr�tila a p��kazem "\afterlang" deklarovat postup, jak vr�tit
nastaven� do stavu podle plain\TeX{}u. 

Pokud si vysta��me pro deklarovan� jazyk s implicitn�m nastaven�m
parametr� sazby podle plain\TeX{}u, nemus�me ve stylov�m souboru 
makro "\langinit" definovat.

P�edpokl�d� se, �e ka�d� stylov� soubor definuje p��kazem "\langdef"
makro "\today"\inl[today], kter� expanduje na z�pis aktu�ln�ho data v
p��slu�n�m jazyce. D�le je pot�eba definovat p��kazem "\langdef"
makro "\langphrases",\inl[langphrases] 
kter� sadou p��kaz� "\def" definuje fr�ze pro
n�zev kapitoly, seznam obr�zk� atd.~podle pou�it�ho jazyka. 
Seznam maker, kter� se zde maj� definovat, je uveden v~sekci~...
V~makru "\langphrases" m��eme nap��klad pou��t v�tven� podle hodnoty "\currentdialect",
aby mohl u�ivatel m�t p��stup k r�zn�m variant�m fr�z� v z�vislosti na
nastaven�m <n��e��>.

Ve stylov�m souboru bychom nem�li v ��dn�m p��pad� nastavovat znak�m
aktivn� kategorii. M�sto toho bychom m�li p��kazem "\langdef"
definovat makro "\activechar"\inl[activechar] s~jedn�m parametrem
zhruba takto:

\begtt
\langdef \activechar #1{%
   \if\string#1<znak1>\langmessage 
      {Character <znak1> is activated as ...}%
      \activedef <znak1>{...}\else
   \if\string#1<znak2>\langmessage
      {Character <znak2> is activated as ...}%
      \activedef <znak2>{...}\else
   ...
   \if\string#1<znak n>\langmessage
      {Character <znak n> is activated as ...}%
      \activedef <znak n>{...}\else
   \activecharwarn#1\fi...\fi\fi}
\endtt
%
T�m d�v�me u�ivateli mo�nost, aby mohl
p��kazem "\activechar<znak>" nastavit aktivn� kategorii
jen t�m znak�m, kter� uzn� za vhodn�.
Typickou deklarac� aktivn�ho znaku v~makru "\activechar" je:

\begtt
...\if\string#1<znak>\langmessage
      {Character <znak> is activated as expandable double-char prefix.}
      \activedef <znak>{\expdoublechar<znak>}\else ...
\endtt
%
a d�le pomoc� sady p��kaz� "\doublechardef<znak><znak2>..." definujeme
tabulku maker, kter� se po "\activechar<znak>" za�ne v z�vislosti na
aktu�ln�m jazyku pou��vat. Podrobn�ji je tato metoda pops�na v sekci...

Za posledn�m "\else" v makru "\activechar" p��eme "\activecharwarn#1", co�
vyvol� tisk varov�n� o~tom, �e "#1" nem� v aktu�ln�m jazyku p�ipravenu
deklaraci jako aktivn� znak.

Pokud definujeme ve stylov�m souboru
vlastn� pomocn� makra, pak by m�la m�t identifik�tor ve tvaru
"\<zkratka jazyka>@<identifik�tor>", nap��klad "\cz@tryemdash".
T�m snad zabr�n�me konfliktu s~n�zvy maker, kter� si definuje u�ivatel
nebo jsou pou�ita v~jin�m stylov�m souboru.

Za "\endinput" by m�la ve stylov�m souboru pokra�ovat dokumentace
stylov�ho souboru. Ta je �tena p��kazem "\printlangdoc"
od sekvence "\langdocbegin". Podrobn�ji o mo�nosti psan� 
dokumentace
ke stylov�m soubor�m rovnou ve stylov�ch souborech pojedn�v� sekce... 

P�i psan� stylov�ch soubor� se m��eme inspirovat existuj�c�mi
stylov�mi soubory "lang-cz.tex", "lang-de.tex", "l-czsk.tex" a dal��mi.


\subsec Dokumentov�n� stylov�ch soubor�
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

P��kaz "\printlangdoc"\inl[printlangdoc] nastav� kategorie znak� podle
plain\TeX{}u (pou�ije k~tomu p��kaz "\plaincatcodes" z~OFS) a p�e�te soubor maker
"l-doc.tex". Tento soubor definuje n�kolik maker, kter� se daj�
pou��vat p�i psan� dokumentace (viz n��e) a nastav� znaky {\tt\char`\"}
a {\tt\char`\<} jako aktivn�.  Pak p��kaz "\printlangdoc" p�e�te
stylov� soubor aktu�ln�ho jazyka. P�i �ten� souboru se
p�esko�� balancovan� text od za��tku souboru a� po
sekvenci "\langdocbegin".\inl[langdocbegin] 
Za touto sekvenc� by m�l n�sledovat
vlastn� text dokumentace.

V souboru "l-doc.tex" je obsa�eno i jednoduch� nastaven� sazby:
"\parindent", "\parskip", "\emergencystretch" a 
d�le je spu�t�n p��kaz "\english", proto�e se p�edpokl�d�,
�e dokumentace bude psan� v~anglick�m jazyce.

Po p�e�ten� a vyti�t�n� dokumentace "\printlangdoc" nevrac� nastaven�
a makra do p�vodn�ho stavu. Pouze si poznamen�, �e u� byl soubor
"l-doc.tex" p�e�ten a p�i dal��m spu�t�n� p��kazu "\printlangdoc" jej
ne�te znova. Nep�edpokl�d�me toti�, �e bude p��kaz "\printlangdoc"
za�azen do oby�ejn�ho dokumentu, ale na druhou stranu po��t�me s t�m,
�e m��e n�sledovat p�ep�na� do dal��ho jazyka n�sledovan� dal��m
p��kazem "\printlangdoc". T�m m��eme z�skat p��ru�ku o jazyc�ch, kter�
n�s zaj�maj�.

Pokud se po pou�it� p��kazu "\printlangdoc" chceme zbavit nastaven�,
kter� bylo provedeno v souboru "l-doc.tex", pak sta�� uzav��t p��kaz
do skupiny. P�i op�tovn�m pou�it� p��kazu "\printlangdoc" bude v
takov�m p��pad� na��t�n soubor "l-doc.tex" znova.

V dal��m textu uv�d�m makra, kter� nejsou definov�na v bal��ku LANG
obecn�, ale jsou k dispozici jen v souboru "l-doc.tex" a maj� umo�nit
snadn�j�� psan� dokumentace.

Makro "\title <text><pr�zdn� ��dek>"\inl[title]
vytiskne "<text>" jako nadpis. M�l by zde b�t uveden pln� n�zev jazyka
a jeho zkratka.

Makro "\author <text><pr�zdn� ��dek>"\inl[author]
vytiskne slovo Author: n�sledovan� <textem>.

Text mezi po��ta�ov�mi uvozovkami: {\tt\char`\"takto psan�\char`\"}
bude ti�t�n strojopisem ve verbatim re�imu, tj. v�echny znaky
v�etn� zp�tn�ho lom�tka se tisknou tak, jak jsou. Makro vytvo��
nezlomiteln� box s~textem a je ur�eno pro �seky verbatim textu uvnit�
odstavce (nap��klad p�i zmi�ov�n� kontroln�ch sekvenc�).
Mezi {\tt\char`\"...\char`\"} je p�echodn� aktivn� vyk�i�n�k, kter� je
definov�n jako "\string". Tak�e {\tt!\char`\"} mezi
{\tt\char`\"...\char`\"} vytiskne po��ta�ovou uvozovku a 
{\tt!!} vytiskne jeden vyk�i�n�k.

Text mezi skobat�mi z�vorkami {\tt\char`\<takto psan�\char`\>}
se prom�n� na nezlomiteln� symbol <takto psan�>. Tato vlastnost je
implementov�na pomoc� aktivn�ho znaku \clqq{\tt\char`\<}\crqq, kter�
z�st�v� aktivn� i mezi po��ta�ov�mi uvozovkami. Tak�e i verbatim text
mezi po��ta�ov�mi uvozovkami je citliv� na v�skyt znaku 
\clqq{\tt\char`\<}\crqq.

\uv{Display verbatim re�im} je mo�n� pomoc� dvojice
"\begtt"\inll[begtt ...\back endtt]..."\endtt". Nap��klad

{\catcode`*=13 \def*{\char`\\}
\begtt
\begtt
tady je text v�etn� \kontroln�ch \sekvenc�, kter� bude
vyti�t�n ve verbatim re�imu se stejn�m �len�n�m na ��dky.
Pouze otev�rac� lomen� z�vorka z�st�v� aktivn�
a vytv��� <takov� v�ci>.
*endtt
\endtt
\relax}

Pokud za "\endtt" nen� pr�zdn� ��dek, bude se n�sleduj�c� odstavec
tisknout bez odsazen�. Mezi "\begtt" a "\endtt" m� vyk�i�n�k kategorii
nula, tak�e je mo�no ps�t kontroln� sekvence {\tt\char`!takto}. 
P�itom makro "\!" je definov�no jako oby�ejn� vyk�i�n�k, tak�e "!!" vytiskne
jeden oby�ejn� vyk�i�n�k.

Pro v��et �daj� s odr�kami lze pou��t dvojici
"\begitems"..."\enditems"\inl[begitems]. Mezi touto dvojic� je
p�echodn� aktivn� znak "*",\inl[enditems] 
kter� ukon�uje p�edchoz� �daj a zahajuje
nov� �daj v�etn� punt�ku na za��tku. P��klad:

\begtt
\begitems
* prvn� polo�ka
* druh� polo�ka
* posledn� polo�ka
\enditems
\endtt

Jinak je mo�n� pou��t v�echna makra z plain\TeX{}u.


\sec Licence

...

\sec Rejst��k
%%%%%%%%%%%%%

Rejst��k obsahuje odkazy pouze na m�sta v~textu, kde je k~makru
vysv�tluj�c� koment��. V~tom m�st� je t� uveden pro snadn�j�� orientaci
n�zev makra v~lev�m okraji. V~rejst��ku nejsou odkazy na 
v�echny zm�nky o~makru v~textu. 

\bigskip
\immediate\closeout\indout
\input \jobname.ind

\def\inr #1 #2 #3;{\noindent{\tt
  \expandafter \ifx \csname ind:#2\endcsname \relax 
     \back#1%
  \else 
     \beglink{#2}\back#1\endlink
  \fi}\quad 
  #3 \quad\pg[#2]\par} 
\def\\#1 #2;{\inr #1 #1 #2;}


\\activechar ;
\\activedef ;
\\afterlang ;
\\author ;
\\begtt ;
\\begitems ;
\\currentdialect ;
\\currentlang ;
\\deactivechar ;
\\declareenc ;
\\declarehyphentable ;
\\declarelang ;
\\defaulthyphentable ;
\\doublechardef ;
\\enditems ;
\inr endtt begtt ;
\\expdoublechar ;
\\fotenc (OFS);
\\gfotenc ;
\\hyphentable ;
\\langcommand ;
\\langcommandwarn ;
\\langdef ;
\\langdefwarn ;
\\langdeflist ;
\\langdocbegin ;
\\langinfo ;
\\langinit ;
\\langisused ;
\\langphrases ;
\\langusage ;
\\lccodes ;
\\lccodesback ;
\\lccodesloop ;
\\loadpatterns ;
\\maybeactive ;
\\ofsinput (OFS);
\\plaincatcodes (OFS);
\\plainlccodes ;
\\printlangdoc ;
\\resetcodes ;
\\setdialect ;
\\setlang ;
\\showlangs ;
\\ssdoublechar ;
\\textormath ;
\\title ;
\\today ;
\\whichdialect ;
\\zerolccodes ;

\sec Literatura

\indent\llap{[1] }Karl Berry: Fontname -- Filenames for TeX fonts,
{\tt fontname.pdf}

\end


