
\hsize=30pc \vsize=45pc \emergencystretch=2em \hbadness=2000
\chyph

\def\CS{CS}
\def\uv#1{\clqq#1\crqq}
\def\LaTeX{L\kern-.36em\raise.5ex\hbox{\sevenrm A}\kern-.12em\TeX}

\def\titul#1\par{\bigskip\noindent{\bf#1}\medskip}
\def\autor#1\par{{\it#1}\medskip}
\def\sub#1.{\par\bigskip\noindent{\bf#1}\par\nobreak\medskip}

\exhyphenpenalty=10000
\chardef\\=`\\
\def\bull{$\bullet$ }

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


\def\motto{\noindent {\bf Motto: }}
\def\endmotto{\bigskip}

\motto
Certainly, if I~were a publishing house, if I~were in the
publishing bussiness myself, I~would have probably had ten different
versions of \TeX{} by now for ten different complicated projects that
had come in. They would all look almost the same as \TeX{}, but no one
else would have this program---they wouldn't need it, they're not
doing exactly the book that my publishing house was doing.

Donald E. Knuth, Prague, March 1996
\endmotto


\titul Enc\TeX{} --- zm�ny konverzn�ch tabulek \TeX{}u

\autor Petr Ol��k

�l�nek popisuje jednoduchou �pravu \TeX{}u, kter� umo��uje p��m� p��stup
k~intern�m vektor�m {\tt xord} a {\tt xchr} pou��van�m pro
konverzi mezi vstupn�m k�dov�n�m a vnit�n�m k�dov�n�m \TeX{}u. Nap��klad
u�ivatel� em\TeX{}u v~DOSu a OS/2 mohou zasahovat do t�chto vektor� 
prost�ednictv�m tzv.~{\tt tcp} tabulek, zat�mco v~UNIXu
takto pru�n� �e�en� implicitn� neexistovalo. Popsan� modifikace \TeX{}u
v�cem�n� zastupuje vlastnosti TCP tabulek. Proto�e je tato modifikace
provedena na �rovni zm�nov�ho souboru {\tt tex.ch} v~jazyce WEB, je
pou�iteln� v�ude tam, kde se \TeX{} implementuje ze zdrojov�ch text�.
Odzkou�ena byla v~UNIXov�ch syst�mech s~implementac� \TeX{}u {\tt web2c}.

Na t�chto implementac�ch \TeX{}u jsme dosud m�li
dv� mo�nosti, jak ovlivnit k�dovac� algoritmy \TeX{}u. Prvn� mo�nost�
bylo pou�it� z�platy pana �karvady~[3]. Toto �e�en� m�lo p��mo v~sob�
zabudov�no n�kolik k�dov�ch tabulek, ale tyto tabulky nebylo snadn�
m�nit u�ivatelem, proto�e byly sou��st� zdrojov�ho k�du k~\TeX{}u.
Na�ten� k�dov�n� se neukl�dalo po inicializaci do form�tu.
To mi nep�ipadalo p��li� pru�n�.

Druh� mo�nost spo��vala v~pou�it� tzv. {\tt tcx} soubor�, kter� byly
obdobou zn�m�ch {\tt tcp} tabulek. Tato mo�nost ale byla ve zdrojov�m k�du
\TeX{}u odkomentovan� se slovy:
\uv{{\tt tcx} files are probably a bad idea, since they make \TeX{} source
documents unportable.  Try the {\tt inputenc} \LaTeX{} package.}
S~t�mito slovy bych byl ochoten polemizovat. Mysl�m si, �e kdyby
u�ivatel� UNIXov�ch instalac� na�li obdobu {\tt tcp} tabulek, pak by
to zvl�t� v~na�ich zem�pisn�ch ���k�ch mnoz� uv�tali. Autor zm�n�n�ho
sd�len� o~\uv{�patn� ideji} asi nepou��v� �esk� jazyk. Kdyby jej pou��val,
kdyby byl nucen ��st {\tt log}y pln�
nesrozumiteln�ch st���ek nebo zapsan� v~odli�n�m k�dov�n� a
kdyby nemohl ps�t kontroln� sekvence ve sv�m jazyce (nap��klad {\tt\\p��kaz}),
asi by si znovu rozmyslel, jakou funkci p�id�lil
vektor�m {\tt xord} a {\tt xchr} s�m autor \TeX{}u. Mo�n� by
pak p�estal hovo�it o~\uv{�patn� ideji}. 
J� osobn� m�m z~citovan�ho sd�len� pocit, �e se automaticky p�edpokl�d�,
�e \TeX{} je pou��v�n v�dy jen prost�ednictv�m
\LaTeX{}u. Mysl�m si, �e pr�v� to je \uv{�patn� idea}.

Bohu�el, dokumentace k~{\tt tcx} soubor�m zcela chyb�, tak�e jen
letm�m pohledem do zdrojov�ho k�du lze tu�it, �e to tak� ukl�dalo
k�dovac� vektory �ten� z~{\tt tcx} soubor� do form�tu, a t�m bylo mo�n�
instalovat form�ty z�visl� na k�dov�n�, nap��klad {\tt csplain.fmt} a
{\tt csplain-kam.fmt}.

Moje �prava zdrojov�ho k�du {\tt tex.ch} v~instalaci {\tt web2c} jde je�t�
d�l, proto�e zahrnuje v�hody druh�ho p��stupu, a nav�c jsou ve�ker� tabulky
na��t�ny za b�hu \TeX{}u jednodu�e prost�ednictv�m {\tt \\input}.
Implementoval jsem toti� do \TeX{}u t�i nov� primitivy {\tt \\xordcode},
{\tt \\xchrcode} a {\tt \\xprncode}, pomoc� nich� je mo�n� p��m� p��stup
k~vektor�m {\tt xord} a {\tt xchr}. Novinkou je t� skute�nost, �e se
st�vaj� tyto vektory zcela nez�visl�mi, co� otev�r� dal�� �irok� mo�nosti,
kter� v~p�edchoz�ch �e�en�ch nebyly v�bec mo�n�.

\sub Technick� �vod do problematiky.

Vektory {\tt xord} a {\tt xchr} maj� velikost 256 byt� a obsahuj�
informaci o~p�ek�dov�n� znaku vstupuj�c�ho do \TeX{}u nebo
vystupuj�c�ho na termin�l a do textov�ch soubor�. Jedn� se o~pole
vestav�n� do programu, p�es kter� jsou filtrov�ny ve�ker� textov�
vstupn� a v�stupn� informace.  M�-li znak na vstupu k�d $x$ a chceme,
aby m�l uvnit� \TeX{}u k�d $y$, pak mus� b�t nastaven vektor
{\tt xord} tak, aby {\tt xord[$x$]${{}=y}$}. P�i zp�tn�m v�stupu znaku na
termin�l a do logu a do soubor� zpracov�van�ch pomoc� {\tt\\write} plat�
tato pravidla: Nen�-li znak s k�dem $y$ ozna�en jako \uv{tisknuteln�}, pak
vystupuje pomoc� p�episu {\tt \char`\^\char`\^}{\it k�d~$y$}. Je-li
tisknuteln�, pak vystupuje s~k�dem {\tt ${x={}}$xchr[$y$]}.

Standardn� b�vaj� v~syst�mech s~k�dem ASCII nastaveny hodnoty t�chto
vektor� tak, �e {\tt xord[$i$]${}={}$xchr[$i$]${}=i$} pro v�echna 
$i\in 0\dots255$. Na syst�mech,
kter� nepou��vaj� ASCII, se m��e mapovat 94 tisknuteln�ch ASCII znak� jinam.
Mimoto je deklarov�na vlastnost \uv{tisknutelnosti} znaku v~ASCII
takto: Znak je tisknuteln�, pokud m� k�d $y\in 32\dots126$. Ostatn� znaky se
pova�uj� za netisknuteln� a \TeX{} je standardn� p�episuje pomoc� dvojit�
st���ky. 

Instalace bal��ku enc\TeX{} byla odzkou�ena na distribuci \TeX{}u {\tt web2c}
verze~7. M�me-li k~t�to distribuci zdrojov� texty, pak sta�� 
spustit {\tt patch <enctex.patch} v~adres��i se souborem {\tt tex.ch} 
a p�ekompilovat \TeX{} pomoc� {\tt make tex}. Instalace je podrobn�ji
pops�na v~souboru {\tt INSTALL}.

Aplikac� p�ilo�en� z�platy {\tt patch} se pozm�n� jedin� soubor
{\tt tex.ch}. Ostatn� soubory v�etn� pomocn�ch knihoven v~jazyce C z�st�vaj�
beze zm�ny. P�i �innosti \uv{{\tt make tex}} se provede {\tt tangle} na
hlavn� zdrojov� soubor {\tt tex.web} a pozm�n�n� zm�nov� soubor
{\tt tex.ch}. T�m vznik� Pascalsk� k�d \TeX{}u {\tt tex.p}, kter� je pak
konvertov�n do jazyka~C skriptem {\tt convert} a kompilov�n do spustiteln�
podoby.

Proto�e je ve�ker� zm�na \TeX{}u implementov�na pouze do zm�nov�ho souboru
{\tt tex.ch}, je vlastn� toto �e�en� nez�visl� na pou�it�m opera�n�m
syst�mu �i implementaci \TeX{}u. Na jin�ch implementac�ch je ale jin�
v�choz� soubor {\tt tex.ch}, tak�e zde nelze jednodu�e prov�st povel
{\tt patch}. Proto je v~bal��ku zahrnut soubor {\tt enctex.ch}, kter�
obsahuje ty ��sti zm�nov�ho souboru {\tt tex.ch}, kter� se t�kaj� enc\TeX{}u.
Ve�ker� zm�ny
vych�zej� ze standardn�ho zdrojov�ho k�du \TeX{}u {\tt tex.web} a� na
jedinou v�jimku: ukl�d�n� vektor� {\tt xord} a {\tt xchr} do form�tu a
�ten� z~form�tu. Zde jsem s~v�hodou pou�il ji� hotov� pomocn� funkce
{\it dump\_things} a {\it undump\_things} napsan� pro {\tt web2c} p��mo
v~jazyce~C. Pokud by to n�kdo pot�eboval v~jin� implementaci, musel by
z�ejm� pou��t analogii k~{\it dump\_four\_ASCII} z~{\tt tex.web}.

Po instalaci bal��ku je mo�no p��mo nastavovat a ��st obsahy
vektor� {\tt xord} a {\tt xchr} prost�ednictv�m primitiv� {\tt \\xordcode}
a {\tt \\xchrcode} a d�le nastavovat vlastnost \uv{tisknutelnosti} znaku
pomoc� primitivu {\tt \\xprncode}. Syntaxe v�ech t�� nov�ch primitiv�
je naprosto stejn�, jakou zn�me nap��klad u~primitiv� {\tt \\lccode} a {\tt
\\uccode}. Nap��klad:

\begtt
\xordcode"AB="CD  \xchrcode\xordcode"AB="AB \the\xchrcode200
\endtt
\noindent
nastavuje {\tt xord[0xAB]=0xCD; xchr[xord[0xAB]]=0xAB} a d�le vytiskne
hodnotu {\tt xchr[200]}.

Na rozd�l od podobn�ch primitiv� {\tt \\catcode}, {\tt \\lccode}, {\tt
\\sfcode} a dal��ch v�ak nov� zaveden� primitivy maj� jednu podstatnou
v�jimku. Reprezentuj� intern� registry \TeX{}u, kter� v�dy maj� glob�ln�
platnost.  Proto je nastaven� {\tt \\xordcode} a {\tt \\xchrcode} uvnit�
skupiny za v�ech okolnost� glob�ln�, a�koli to explicitn� nep��eme.
�stupem z~po�adavku na mo�nost lok�ln�ho deklarov�n� hodnot jsem dos�hl
podstatn� v�t�� efektivity v�sledn�ho k�du programu.

Primitiv {\tt\\xprncode} umo��uje nastavovat vlastnost \uv{tisknutelnosti}
znaku takto: Znak s k�dem $y$ je tisknuteln� pr�v� tehdy, kdy� je
$y\in\{32\dots126\}$ nebo {\tt\\xprncode}$\,y>0$. Nap��eme-li nap��klad
{\tt\\xprncode255=1}, bude tisknuteln� znak s k�dem 255. Na druh� stran�,
nastaven� {\tt\\xprncode`a} t�eba na nulu nem� na chov�n� programu ��dn�
vliv, proto�e k�d znaku \uv{{\tt a}} je v mno�in� $\{32\dots126\}$. T�mto
opat�en�m program vykazuje ur�it� pud sebez�chovy, proto�e zl� u�ivatel by
mu mohl nastavit v�echny znaky jako netisknuteln� a program by ztratil
schopnost se vyjad�ovat. Hodnoty {\tt\\xprncode} lze nastavit jako u
ostatn�ch nov�ch primitiv� v rozsahu nula a� 255, ov�em ot�zka
tisknutelnosti je toto�n� s ot�zkou na kladnou hodnotu bez ohledu na to,
jak velk� tato hodnota je.

V�choz� hodnoty pro k�dov�n� v dob� ini\TeX{}u jsou n�sleduj�c�:
\medskip
\noindent
{\tt\\xordcode}$\,i=i$ pro $i\in\{128\dots255\}$,\hfil\break
{\tt\\xchrcode}$\,i=i$ pro $i\in\{128\dots255\}$,\hfil\break
{\tt\\xprncode}$\,i=0$ pro $i\in\{0\dots31,127\dots255\}$,\hfil\break
{\tt\\xprncode}$\,i=1$ pro $i\in\{32\dots126\}$.
\medskip
Hodnoty {\tt\\xordcode}$\,i$ a {\tt\\xchrcode}$\,i$ pro $i\in\{0\dots127\}$
jsou z�visl� na opera�n�m syst�mu. Pokud syst�m pracuje v~r�mci t�to
mno�iny s~ASCII k�dov�n�m (co� je obvykl�), pak je {\tt\\xordcode}$\,i=i$ a
{\tt\\xchrcode}$\,i=i$. Na jin�ch syst�mech jde hlavn� o to, jak syst�m
k�duje 95 z�kladn�ch tisknuteln�ch znak�, kter� jsou v~ASCII na pozic�ch
$\{32\dots126\}$.

Hodnoty {\tt\\xordcode}, {\tt\\xchrcode} a {\tt\\xprncode} se
v~t�to �prav� \TeX{}u ukl�daj� do form�tu {\tt fmt}, z~n�ho� jsou znovu
na�teny p�i b�hu produk�n� verze \TeX{}u.

Ne� budeme zasahovat do hodnot vektor� {\tt xord} a {\tt xchr}, je dobr� si
uv�domit n�kolik souvislost�. K tomu pou�iji matematick� zna�en� a
terminologii. Nech� $X=\{0\dots255\}$ je mno�ina obsahuj�c� vtupn� k�dy a
$Y=X$ je matematicky tat� mno�ina, ov�em budeme ji pou��vat pro ozna�en�
vnit�n�ch k�d� \TeX{}u. Nech� d�le $Y_p\subseteq Y$ je mno�ina v�ech
tisknuteln�ch znak�. Je:
$$
Y_p = \{y; \hbox{\tt\\xprncode}\,y>0\}\cup\{32\dots126\}.
$$
Je z�ejm�, �e nastaven� hodnot vektoru {\tt xchr} na mno�in�
$Y\backslash Y_p$ nem� pro chov�n� programu ��dn� vliv. D�le ozna�me
vstupn� zobrazen� $I:X\to Y$ definovan� hodnotami vektoru {\tt xord} a
v�stupn� zobrazen� $O:Y_p\to X$ definovan� hodnotami vektoru {\tt xchr}.
V�choz� nastaven� je voleno tak, �e $I$ je prost� a na a $O$ je prost�.
Nastav�me-li {\tt\\xprncode} tak, �e $Y_p=Y$, pak i zobrazen� $O$ je prost�
a na. Nav�c je inverzn� k zobrazen� $I$. Ov�em tento ide�l plat� pouze do
prvn�ho z�sahu do vektor� {\tt xord} a {\tt xchr}. Nech� nap��klad m�me
$x\not=y$ a $x\in X$, $y\in Y$. Prove�me jedno element�rn� p�ehozen�:
$$
{\tt xord[}x{\tt]} = y, \quad {\tt xchr[}y{\tt]} = x. \eqno (1)
$$
Nyn� nen� ani zobrazen� $I$ ani $O$ prost�. Je toti�
{\tt xord[$x$]${}={}$xord[$y$]} a tot� plat� pro vektor {\tt xchr}.
Aby byla po dal��ch $n$ element�rn�ch p�ehozen�ch na�e zobrazen� op�t
prost�, mus� existovat posloupnost $x_0,\dots x_n$ takov�, �e
$$
x_0=x, \quad x_1=y \quad {\rm a} \quad
{\tt xord[}x_i{\tt]} = x_{i+1} \quad
\hbox{pro v�echna } i\in \{0\dots n-1\}
$$
a d�le mus� {\tt xord[}$x_n{\tt]}=x$. Podobn� vlastnost mus� platit pro
vektor {\tt xchr}. �asto se p�i prohazov�n� k�d� zam��ujeme jen na
podmno�inu $X$ (nap��klad abecedn� znaky, tisknuteln� znaky, dosa�iteln�
znaky v dan�m k�dov�n�). Pak se nesm�me divit, �e v�sledek na�eho
nastaven� nen� prost� zobrazen� a t�m nen� spln�na ani podm�nka, �e
$O=I^{-1}$, p�esto�e jsme d�sledn� prov�d�li element�rn� p�ehozen� podle
(1) pro oba vektory v�dy sou�asn�. V�t�inou n�m ale skute�nost, �e nejsou
na�e zobrazen� prost�, v dan� aplikaci moc nevad�.


\sub K�dovac� tabulky.

Proto�e zm�na vektor� {\tt xord} a {\tt xchr} m��e tot�ln� rozhodit chov�n�
\TeX{}u zcela k~nepozn�n�, doporu�uji pou��vat ur�it� soubory, kter�
nastav� po�adovan� k�dov�n�, a d�le s~primitivy {\tt \\xordcode},
{\tt \\xchrcode} a {\tt \\xprncode} za b�hu \TeX{}u moc nela�kovat.
V~bal��ku enc\TeX{} jsou k~dispozici soubory, kter� zm�nu vektor� pro b�n�
k�dov�n� definuj�. Tyto soubory maj� obvyklou p��ponu {\tt tex}. ��k�me jim
k�dovac� tabulky. Rozli�ujeme dva typy k�dovac�ch tabulek.

\sub Prvn� typ k�dovac�ch tabulek.

Prvn� typ tabulek deklaruje vnit�n� k�dov�n� \TeX{}u ve vztahu ke k�dov�n�,
kter� je b�n� pou��van� v~hostitelsk�m opera�n�m syst�mu. M�me-li
nap��klad v~syst�mu k�dov�n� ISO-8859-2 a vnit�n� k�dov�n� \TeX{}u vol�me
podle Corku (k�dov�n� je ozna�ov�no jako T1), 
pak tabulka mus� p�edefinovat {\tt xord} vektor tak, aby
mapoval znaky z~ISO-8859-2 do T1 a vektor {\tt xchr} mus� p�ev�d�t
zp�tky z~T1 do k�dov�n� syst�mu.

Tento typ tabulek obsahuje v~n�zvu souboru vstupn� i c�lov� vnit�n� k�dov�n�
\TeX{}u. Nap��klad tabulka {\tt iso2-t1.tex} vypad� n�sledovn�:

\begtt
%%% The encoding table, v.Aug.1997 (C) Petr Ol\v s\'ak
%%% input: ISO-8859-2, internal TeX: T1 alias Cork

\input encmacro  \input t1macro

%            input  TeX   lc   uc  cat       sequence
\setcharcode   "C1  "C1  "E1  "C1  11  \texaccent \'A
\setcharcode   "E1  "E1  "E1  "C1  11  \texaccent \'a
\setcharcode   "C4  "C4  "E4  "C4  11  \texaccent \"A
\setcharcode   "E4  "E4  "E4  "C4  11  \texaccent \"a
\setcharcode   "C8  "83  "A3  "83  11  \texaccent \v C
\setcharcode   "E8  "A3  "A3  "83  11  \texaccent \v c
\setcharcode   "CF  "84  "A4  "84  11  \texaccent \v D
...
\setcharcode   "A7  "9F    0    0  12  \texmacro  \S
\setactivecode "D7  "03   {$\times$}
...
\redefaccent \' 
\redefaccent \v 
...
\endtt

Ka�d� tabulka prvn�ho typu �te soubor {\tt encmacro} s~definicemi maker
{\tt\\setcharcode}, {\tt\\setactivecode},
{\tt\\texaccent}, {\tt\\texmacro} a {\tt\\redefaccent}. 

\bull{\tt\\setcharcode \#1 \#2 \#3 \#4 \#5} deklaruje \TeX{}ovsk� k�dy pro
jeden znak. Nastav� {\tt xord[\#1]=\#2}, {\tt xchr[\#2]=\#1},
{\tt\\xprncode\#2=1} a postupn� nastav�
{\tt\\lccode},  {\tt\\uccode} a {\tt\\catcode} znaku s~k�dem 
{\tt\#2} na hodnoty {\tt\#3}, {\tt\#4} a {\tt\#5}. Je-li {\tt\#1} otazn�k,
pak se {\tt xord} a {\tt xchr} nenastav� a {\tt\\xprncode=0}.

\bull{\tt\\setactivecode \#1 \#2 \char`\{{\it definice}\char`\}} nastav�
rovn� hodnoty k�dovac�ch vektor� 
{\tt xord[\#1]=\#2}, {\tt xchr[\#2]=\#1}, {\tt\\xprncode\#2=1}
a d�le znak s~k�dem
{\tt\#2} deklaruje jako aktivn� a definuje jej podle {\it definice}.
Je-li {\tt\#1} otazn�k, {\tt \\setactivecode} neprovede v�bec nic.
Nap��klad v~ISO-8859-2 je na pozici~{\tt"D7} znak~\uv{$\times$}. My jsme
v~na�� uk�zce tomuto znaku p�id�lili vnit�n� k�d \TeX{}u {\tt"03} a znak bude
expandovat na {\tt\$\\times\$}.

\bull{\tt\\texaccent \#1} p�ipravuje expanzi z�pisu {\tt\#1} na znak s~k�dem
{\tt\#2} z~naposledy pou�it�ho {\tt\\setcharcode}. 
Nap��klad z�pis {\tt\\v~C} bude podle na�� uk�zky expandovat na znak s~k�dem 
{\tt"83}. Pokud z�pis pro akcent nen� v~tabulce uveden, z�st�v� 
v~p�vodn�m v�znamu, tj.~t�eba {\tt\\v~g} expanduje na primitiv 
{\tt\\accent}, kter� usad� h��ek nad p�smeno g. 
K~aktivaci v�ech z�pis� {\tt\\texaccent} dojde a� po pou�it�
makra {\tt\\redefaccent} (viz n��e).

\bull{\tt\\texmacro \#1} deklaruje makro {\tt\#1} tak, �e bude expandovat
na znak s~k�dem~{\tt\#2} z~naposledy pou�it�ho {\tt\\setcharcode}.
K~p�edefinov�n� makra {\tt\#1} dojde (na rozd�l od {\tt\\texaccent})
okam�it�. Nap��klad makro {\tt\\S} bude podle na�� uk�zky expandovat na
znak s~k�dem {\tt"9F}, proto�e na t�to pozici je podle Corku znak~\uv{\S}.

\bull{\tt\\redefaccent \#1} aktivuje expanzi z�pis� podle {\tt\\texaccent}
pro jeden konkr�tn� akcent {\tt\#1}. 

Krom� toho je na za��tku tabulky �ten soubor definic z�visl�ch na
k�dov�n� textov�ho fontu \TeX{}u. V~na�� uk�zce jde nap��klad o~soubor 
{\tt t1macro}. Definuj� se tam sekvence {\tt\\promile},
{\tt\\clqq} a dal��. Jedn� se o~jednoduchou obdobu {\tt fd} soubor� 
z~NFSS.

M��e se st�t, �e nechceme uveden� makra pou��t,
ale hodnoty z~tabulky na��st chceme. Pak m��eme p�istoupit 
k~n�sleduj�c�mu triku: Definujeme si makra {\tt\\setcharcode} a� 
{\tt\\redefaccent}
sami a d�le provedeme na�ten� tabulky takto:

\begtt
\let\originput=\input \def\input #1 {}
\originput il2-t1
\let\input=\originput
\endtt

V~bal��ku encTeX jsou p�ipraveny tyto tabulky prvn�ho druhu:
$$
\vbox{
\halign{{\tt #}\hfil\quad&#\hfil\quad&#\hfil\cr
\rm N�zev souboru  & vstupn� k�dov�n�   & vnit�n� k�dov�n� \TeX{}u \cr
\noalign{\medskip\hrule\medskip}
il2-csf.tex        & ISO8859-2          & \CS-font \cr
kam-csf.tex        & Kamenick�ch        & \CS-font \cr 
1250-csf.tex       & CP1250, MS-Windows & \CS-font \cr
852-csf.tex        & CP852, PC Latin2   & \CS-font \cr
il2-t1.tex         & ISO8859-2          & T1 alias Cork \cr
kam-t1.tex         & Kamenick�ch        & T1 alias Cork \cr 
1250-t1.tex        & CP1250, MS-Windows & T1 alias Cork \cr
852-t1.tex         & CP852, PC Latin2   & T1 alias Cork \cr}}
$$

Za zm�nku stoj� prvn� uveden� tabulka {\tt il2-csf.tex}, proto�e ta
jedin� ponech�v� vektory {\tt xord} a {\tt xchr} beze zm�ny. Tuto tabulku
je tedy mo�n� pou��t i v~\TeX{}u, kter� neobsahuje roz���en�
enc\TeX{}. Pro form�t {\tt csplain} by p��slu�n� soubor 
{\tt csplain.ini} mohl vypadat t�eba takto:

\begtt
\input csfonts    % re-defines primitive \font
\input plain      % format Plain
\restorefont      % original meaning of primitive \font
\input il2-csf    % input ISO8859-2, internal TeX: CS-font
\input hyphen.lan % czech / slovak hyphenation pattern 
\input plaina4    % \hsize and \vsize for A4
\everyjob=\expandafter{\the\everyjob
   \message{The format: plain-il2-cs <Sep. 1997>.}
   \message{The cs-fonts are preloaded and A4 size predefined.}}
\dump
\endtt

Takto generovan� form�t by se od standardn�ho form�tu {\tt csplain}
nem�l mnoho li�it. Pokud v~tomto {\tt ini} souboru zam�n�me kup��kladu
slovo {\tt il2} za {\tt 1250}, pak vytvo��me identick� form�t, kter�
je ale nam�sto UNIXu ur�en pro prost�ed� MS-Windows. V~tomto p��pad�
ov�em u� budeme pot�ebovat roz���en� \TeX{}u s~n�zvem enc\TeX.

Pokud bychom cht�li vytvo�it analogii form�tu {\tt csplain} pro
pou�it� s~DC/EC fonty, pak bych doporu�oval tento postup:

\begtt
\input noprefnt   % \font\preloaded is not preloaded
\input plain      % format Plain
\restorefont      % original meaning of primitive \font
\input dcfonts    % load text-style fonts
\input il2-t1     % input ISO8859-2, internal TeX: Cork
\input hyphen.lan % czech / slovak hyphenation pattern 
\input plaina4    % \hsize and \vsize for A4
\everyjob=\expandafter{\the\everyjob
   \message{The format: plain-il2-dc <Sep. 1997>.}
   \message{The dc+cm-fonts are preloaded and A4 size predefined.}}
\dump
\endtt

Nech�me tedy matematick� fonty na��st origin�ln�m makrem {\tt plain}
a potom p�edefinujeme textov� fonty v~souboru {\tt dcfonts} jednodu�e
takto:

\begtt
\font\tenrm=dcr10  \font\tenbf=dcbx10  \font\tenit=dcti10
\font\tentt=dctt10 \font\tensl=dcsl10  \tenrm
\endtt

Upozor�uji, �e tento form�t m��e v~sob� skr�vat podstatn� odli�nosti
od origin�ln�ho form�tu {\tt csplain}. Bu�te p�i jeho pou��v�n� opatrn�.

Pokud budeme cht�t vytvo�it dal�� tabulky, kter� maj� stejn� vnit�n�
k�dov�n� ale odli�n� vstupn�, pak v�t�inou sta�� vyj�t z~existuj�c� tabulky a
pozm�nit jen prvn� sloupec.


\sub Druh� typ k�dovac�ch tabulek.

Druh� typ tabulek prov�d� p�ek�dov�n� pouze na vstupn� stran� \TeX{}u.
Pozn�me je podle toho, �e nemaj� na konci n�zvu zna�ku pro
vnit�n� k�dov�n� \TeX{}u (tj.~{\tt t1} nebo {\tt csf}), ale zna�ku
pou��vanou pro k�dov�n� opera�n�ho syst�mu (nap�.~{\tt il2}, {\tt kam}).
T�eba tabulka {\tt kam-il2.tex} prov�d� na vstupn� stran� konverzi
z~k�dov�n� kamenick�ch do k�dov�n� ISO8859-2. 
Tento typ tabulek pozm��uje pouze vektor {\tt xchr}, 
ale v�stupn� vektor {\tt xord} ponech�v� beze zm�ny.
Takovou tabulku pou�ijeme, pokud \TeX{}em na��t�me soubor, kter� je v~jin�m
k�dov�n�, ne� b�n� pou��v�me na na�em opera�n�m syst�mu. P�itom v�stup do
{\tt log}, {\tt aux} apod. ponech�me v~k�dov�n� podle na�eho syst�mu.
Tyto zm�ny k�dov�n� je mo�n� prov�d�t i v~pr�b�hu zpracov�n� jedin�ho
dokumentu.

Druh� typ tabulek navazuje na vstupn� k�dov�n� deklarovan� d��ve
tabulkou prvn�ho typu. Nastaven� vnit�n�ho k�dov�n� \TeX{}u nen� v�bec
druh�m typem tabulek m�n�no. Uvedeme p��klad. P�i generov�n� form�tu
jsme pou�ili tabulku prvn�ho typu {\tt il2-t1.tex}, tak�e vnit�n�
k�dov�n� m�me podle Corku. Nyn� m��eme p�i zpracov�n� dokumentu na
p�echodnou dobu vybrat n�kterou z~tabulek {\tt *-il2.tex}, t�eba:

\begtt
\input kam-il2  
\input dokument
\restoreinputencoding
nyn� mohu pracovat v~p�vodn�m k�dov�n�...
\endtt

V~dob�, kdy prob�h� na��t�n� souboru {\tt dokument.tex} se prov�d�
p�ek�dov�n� z~Kamenick�ch do T1, uvnit� \TeX{}u se v�e zpracov�v�
v~T1 a v�stup na termin�l a do {\tt log}u m�me v~ISO8859-2. V~tomto
k�dov�n� je tak� zaps�n dal�� text pod \hbox{\tt\\restoreinputencoding}.
Tabulka toti� deklaruje toto makro, aby byl mo�n� n�vrat k p�vodn�mu
nastaven� vektoru {\tt xord}.

P�i pou�it� tabulek druh�ho typu mus�me d�t velk� pozor, abychom n�co
neud�lali �patn�. V~na�em p��klad� jsou v�echny v�stupy do soubor�
typu {\tt aux} v~ISO-8859-2, tak�e je p�i opakovan�m
spu�t�n� \TeX{}u nesm�me na��tat v~okam�iku, kdy m�me nastaven vstupn�
k�d podle Kamenick�ch. To je tak� d�vod, pro� nedoporu�uji generovat
form�t p��kazem {\tt\\dump} v~situaci, kdy m�me na�tenou tabulku
druh�ho typu.



\sub O~kompatibilit� neboli slu�itelnosti.

Upraven� \TeX{} (enc\TeX) projde zcela bez probl�m� testem TRIP s~v�jimkou
jedin�ho p��padu: po�et vlo�en�ch \uv{{\tt multiletter control sequences}}
je o~t�i v�t��, ne� v~origin�ln�m \TeX{}u.

Ve�ker� zm�ny \TeX{}u, kter� nem�n� dosavadn� chov�n� \TeX{}u, ale pouze
p�id�vaj� nov� primitivy, jsou zp�tn� zcela kompatibiln� s~origin�ln�m
\TeX{}em. T�m se mysl�, �e dokumenty napsan� pro origin�ln� \TeX{} se
budou v~pozm�n�n�m \TeX{}u chovat zcela stejn�. V�jimkou je snad dokument
s~konstrukc� typu {\tt \\ifx\\xordcode\\undefined}, ale �etnost v�skytu
takov�ch konstrukc� v~dokumentech pro origin�ln� \TeX{} je prakticky
nulov�.

Je t�eba si ale uv�domit, �e v~pozm�n�n�m \TeX{}u lze ps�t
dokumenty a makra, kter� nejsou s~origin�ln�m \TeX{}em kompatibiln�. To
je nev�hoda v�ech roz���en�, kter� p�id�vaj� primitivy. Je zcela jedno, zda
jsou nov� primitivy p�id�ny do \TeX{}u \uv{natvrdo} (jako v~p��pad�
enc\TeX{}u nebo pdf\TeX{}u), nebo zda je p��stup k~nov�m primitiv�m
otev�en a� po speci�ln� volb� na p��kazov�m ��dku p�i inicializaci form�tu
(NTS, ML\TeX{}). Zde z�le�� na tom, jak moc se pou��v�n� nov�ch
primitiv� roz����, a kdo bude dohl��et, aby roz���en� mno�ina primitiv� byla
celosv�tov� standardizov�na. V~p��pad� m�ho jednoduch�ho roz���en� si
nekladu ��dn� n�rok na to, aby se to dostalo do n�jak�ch standard�. Prost�
jsem si to ud�lal pro svoje pot�eby a pokud se to l�b� je�t� n�komu jin�mu,
m� mo�nost m� roz���en� pou��t s~v�dom�m, �e chce-li ps�t p�enositeln�
dokumenty, nebude roz���en� primitivy ani makra, kter� tyto primitivy
volaj�, ve sv�m dokumentu pou��vat.

Chce-li administr�tor syst�mu instalovat \TeX{}ovsk� form�t v�etn�
volby vhodn�ho k�dov�n�, pak p�i inicializaci form�tu m��e zavolat n�kterou
tabulku prvn�ho typu a potom, t�sn� p�ed povelem {\tt \\dump}, zak�e
u�ivatel�m sahat na k�dovac� vektory:

\begtt
\let\xordcode=\undefined  
\let\xchrcode=\undefined
\let\xprncode=\undefined
\endtt
\noindent
T�m m� zaru�eno, �e u�ivatel nebude pou��vat nestandardn� roz���en� t�to
implementace \TeX{}u. Na ve�ejn�ch s�t�ch bych asi takov� �e�en� doporu�il.
T�mto zp�sobem nav�c vektory {\tt xord} a {\tt xchr} pln� funkci, kv�li
kter� je do \TeX{}u u� d�vno zahrnul jeho autor: staraj� se o~odst�n�n� mezi
k�dovac�mi specifiky jednotliv�ch opera�n�ch syst�m� a pevn� zvolen�m
vnit�n�m k�dov�n�m \TeX{}u.

P�vodn� z�m�r autora \TeX{}u spo��val v~tom, �e nastaven� k�dovac�ch
vektor� provede administr�tor syst�mu z�sahem do zm�nov�ho souboru
{\tt tex.ch} v~dob� kompilace \TeX{}u a tyto vektory budou pevn� pro ka�dou
implementaci nastaveny. Bohu�el, tato praxe se v~p��pad� implementac�
\TeX{}u pro UNIX p��li� neroz���ila, proto�e by to od administr�tora
vy�adovalo speci�ln� aktivitu nav�c, kter� nav�c pro nepou�en�ho nebyla
zcela trivi�ln�. Zaveden� primitiv� {\tt \\xordcode} a {\tt \\xchrcode} a
tabulek prvn�ho typu posunuje �pravu k�dovac�ch vektor� a� na dobu
inicializace form�tu, ale tak� podstatn� zjednodu�uje jejich nastaven�. To
bych pova�oval za v�hodu m�ho �e�en�. J� jsem vlastn� neud�lal nic jin�ho,
ne� �e jsem z~pozice administr�tora syst�mu pozm�nil zm�nov� soubor {\tt
tex.ch} a zm�nu jsem ud�lal tak, aby v�sledek m� pr�ce byl pokud mo�no
flexibiln�.

M��eme si polo�it ot�zku, pro� profesor Knuth u� d�vno primitivy sahaj�c�
k~vektor�m {\tt xord} a {\tt xchr} nezavedl. Z�ejm� cht�l, aby se v�echna
\TeX{}ovsk� makra chovala zcela stejn� na v�ech implementac�ch. P��m�
p��stup k~vektor�m {\tt xord} a {\tt xchr} byl pro n�j v~takov�m p��pad�
nep�ijateln�. V~konstrukc�ch typu \hbox{\tt \\ifnum\\xordcode`@=`@} se toti�
m��e makro v�tvit podle toho, zda hostitelsk� opera�n� syst�m pou��v�
stejn� k�dov�n� jako ASCII nebo ne.

Poznamenejme, �e se autorovi \TeX{}u nepoda�ilo zcela zajistit
stejn� chov�n� maker na v�ech implementac�ch. Kdy� si nech�m vypsat do
souboru znak, kter� je v~jednom opera�n�m syst�mu tisknuteln� a v~druh�m
ne, pak m�m dva r�zn� v�sledky: bu� p��mo znak nebo
{\tt \char`\^\char`\^{\it k�d}}. Kdy� znovu v~druh�m b�hu \TeX{}u
takov� soubor p�e�tu, ale nejprve nastav�m {\tt \\catcode`\char`\^=12},
pak se m��e m� makro v�tvit podle toho, zda je testovan� znak v~dan�
implementaci tisknuteln� nebo nikoli.


\sub Z�v�re�n� pozn�mka.

Ka�d� si m��e pro sv� pot�eby upravit
\TeX{} p��mo ze zdrojov�ho k�du. Viz t� �vodn� motto. P�itom je to �kol
jednodu���, ne� by se na prvn� pohled mohlo zd�t. M� osobn� sta�ilo
jeden ve�er listovat v~[1] a v�e si d�kladn� rozmyslet. Pak jsem druh� den
dopoledne dostal my�lenku do po��ta�e a v�e vyzkou�el a odpoledne jsem napsal
tento �l�ne�ek. A~v�c je hotova. To v�e d�ky velmi dob�e dokumentovan�mu
programu \TeX.


\sub Reference.

{\hangindent=\parindent \hangafter=1 \parindent=0pt \def\par{{\endgraf}}
\def\[#1] {\leavevmode\hbox to\hangindent{[#1]\hss}}

\[1] Donald Knuth. {\it \TeX: The program}, volume B of 
{\it Computers \& Typesetting}. Addison-Wesley, Reading, MA, USA, 1986.

\[2] Petr Ol��k. {\it enc\TeX}, bal�k roz�i�uj�c� \TeX{} voln� k~dost�n� na
\hfil\break
{\tt ftp://math.feld.cvut.cz/pub/olsak/enctex}

\[3] Libor �karvada. Z�plata roz�i�uj�c� \TeX{} voln� k~dost�n� na
\hfil\break
{\tt ftp://ftp.muni.cz/pub/tex/local/cstug/skarvada}

}

\end
