
\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

