
            EncTeX --- monost pekdovn vstupu v TeXu
            ============================================
            6.9.1997                          Petr Olk
                                 olsak@math.feld.cvut.cz

Tento balek je voln programov vybaven; mete jej dle it
a modifikovat podle podmnek "GNU General Public License", kterou
publikovala "Free Software Foundation"; pouijte verzi 2 tto licence
nebo (podle Va volby) libovolnou pozdj verzi.

Tento balek je roziovn v nadji, e bude uiten, avak BEZ
JAKKOLI ZRUKY; neposkytuj se ani odvozen zruky PRODEJNOSTI anebo
VHODNOSTI PRO URIT EL. Dal podrobnosti hledejte v Obecn veejn
licenci GNU.

Kopii "GNU General Public License" jste ml obdret spolu s tmto
programem; pokud se tak nestalo, napite o ni Free Software Foundation,
Inc., 675 Mass Ave, Cambridge, MA 02139, USA. esk peklad tto
licence najdete na "http://www.gnu.cz/gplcz.html. 

--------------------

Balk encTeX je jednoduch rozen TeXu pro takov implementace, ve
kterch se TeX instaluje ze zdrojovho kdu tex.web. Tuto podmnku napklad
spluje implementace web2c, uren pro UNIXy a jin 32 bitov operan
systmy s kvalitnm pekladaem jazyka C.

Rozen encTeX je zptn kompatibiln s originlnm TeXem. Pidv ti
nov primitivy, kterm lze st nebo naplovat vnitn kdovac vektory
xord a xchr a dle nastavovat, zda znak bude vystupovat pomoc pepisu
^^kd, nebo pmo.

Zmna TeXu je dkladn testovan a prola t testem TRIP 
s tmito dvma odlinostmi:

* Odlin banner 
* Poet "multiletter control sequences" je o ti vt.


Instalace
---------
Viz soubor INSTALL.


Podrobnji o encTeXu, viz lnek "EncTeX -- zmny konverznch tabulek TeXu",
kter je k dispozici v souborech enctex.tex, enctex.ps nebo enctex.pdf.
V tomto lnku je zastaral informace o makrech \setcharcode a
dalch. Aktuln informace je zde v tomto textu.


Technick vod do problematiky
------------------------------
Vektory xord a xchr maj velikost 255 byt a obsahuj informaci o
pekdovn znaku vstupujcho do TeXu nebo vystupujcho na terminl a do
textovch soubor. Jedn se o pole vestavn do programu, pes kter jsou
filtrovny veker textov vstupn a vstupn informace. M-li znak na
vstupu kd x a chceme, aby ml uvnit TeXu kd y, pak mus bt nastaven
vektor xord tak, aby xord[x]=y. Pi zptnm vstupu znaku na
terminl a do logu a do soubor zpracovvanch pomoc \write plat
tato pravidla: Nen-li znak s kdem y oznaen jako "tisknuteln", pak
vystupuje pomoc pepisu ^^kd y. Je-li tisknuteln, pak vystupuje 
s kdem x=xchr[y].

Standardn bvaj v systmech s kdem ASCII nastaveny hodnoty tchto
vektor tak, e xord[i]=xchr[i]=i pro vechna i v rozsahu 0...255. Na
systmech, kter nepouvaj ASCII, se me mapovat 94 tisknutelnch ASCII
znak jinam. Mimoto je deklarovan vlastnost "tisknutelnosti" znaku v ASCII
takto: Znak je tisknuteln, pokud m kd y v rozsahu 32...126. Ostatn
znaky se povauj za netisknuteln a TeX je standardn pepisuje pomoc
dvojit stky.

Po instalaci balku encTeX je mono pmo nastavovat a st obsahy
vektor xord a xchr prostednictvm primitiv \xordcode
a \xchrcode a dle nastavovat vlastnost "tisknutelnosti" znaku
pomoc primitivu \xprncode. Syntaxe vech t novch primitiv
je naprosto stejn, jakou znme napklad u primitiv \lccode a
\uccode. Napklad:

\xordcode"AB="CD  \xchrcode\xordcode"AB="AB \the\xchrcode200

nastavuje xord[0xAB]=0xCD; xchr[xord[0xAB]]=0xAB a dle vytiskne
hodnotu xchr[200].

Na rozdl od podobnch primitiv \catcode, \lccode, \sfcode a dalch vak
nov zaveden primitivy maj jednu podstatnou vjimku. Reprezentuj intern
registry TeXu, kter vdy maj globln platnost. Proto je nastaven
\xordcode a \xchrcode uvnit skupiny za vech okolnost globln, akoli to
explicitn nepeme. stupem z poadavku na monost loklnho deklarovn
hodnot jsem doshl podstatn vt efektivity vslednho kdu programu.

Primitiv \xprncode umouje nastavovat vlastnost "tisknutelnosti"
znaku takto: Znak s kdem y je tisknuteln prv tehdy, kdy je
y v rozsahu 32...126 nebo je \xprncode y > 0. Napeme-li napklad
\xprncode255=1, bude tisknuteln znak s kdem 255. Na druh stran,
nastaven \xprncode`a teba na nulu nem na chovn programu dn
vliv, protoe kd znaku "a" je v rozsahu 32...126. Tmto
opatenm program vykazuje urit pud sebezchovy, protoe zl uivatel
by mu mohl nastavit vechny znaky jako netisknuteln a program by ztratil
schopnost se vyjadovat. Hodnoty \xprncode lze nastavit jako u ostatnch
novch primitiv v rozsahu nula a 255, ovem otzka tisknutelnosti je
toton s otzkou na kladnou hodnotu bez ohledu na to, jak velk tato
hodnota je.

Vchoz hodnoty pro kdovn v dob iniTeXu jsou nsledujc:

\xordcode i = i pro vechna i v rozsahu 0...255,
\xchrcode i = i pro vechna i v rozsahu 0...255,
\xprncode i = 0 pro i v rozsahu 0...31,127...255,
\xprncode i = 1 pro i v rozsahu 32...126.

Prvn dva dky jsou pravdiv jen na operanch systmech, kter pijaly
kdovn anglick abecedy podle ASCII. Pokud tomu tak nen, pak jsou
vchoz hodnoty vektor xord a xchr pozmnny tak, aby mapovaly tisknuteln
znaky podle systmu do ASCII uvnit TeXu. Takov zmna se tk jen 95
zkladnch tisknutelnch znak, kter jsou v ASCII na pozicch
32...126.

Hodnoty \xordcode, \xchrcode a \xprncode se v tto prav TeXu ukldaj do
formtu fmt, z nho jsou znovu nateny pi bhu produkn verze TeXu.


Formty typu plain-x-y
----------------------
V balku jsou pipraveny inicializan soubory pro vygenerovn formtu
podobnmu standardnmu formtu plain. Napklad pkazem

$ tex -i plain-1250-cs

vygenerujeme formt analogick plainu, kter te vstupn soubory
v kdovn CP1250 a pracuje s CS-fonty.

V balku jsou k dispozici tyto inicializan soubory pro plain:

plain-il2-cs   ...  vstup podle ISO8859-2, textov fonty v TeXu: CS-font
plain-kam-cs   ...  vstup podle Kamenickch, textov fonty v TeXu: CS-font
plain-1250-cs  ...  vstup podle CP1250, textov fonty v TeXu: CS-font
plain-852-cs   ...  vstup podle CP852, textov fonty v TeXu: CS-font
plain-il2-dc   ...  vstup podle ISO8859-2, textov fonty v TeXu: DC
plain-kam-dc   ...  vstup podle Kamenickch, textov fonty v TeXu: DC
plain-1250-dc  ...  vstup podle CP1250, textov fonty v TeXu: DC
plain-852-dc   ...  vstup podle CP852, textov fonty v TeXu: DC


Poznmka k dlouhm nzvm soubor
---------------------------------
Vechny soubory *.tex v balku spluj DOSov omezen na dlku nzvu
8+3. Vjimkou z tohoto pravidla jsou pouze soubory plain-x-y popsan
ve a analogick inicializan soubory pro LaTeX. Pokud pouvte
systm, kter je omezen na 8+3, doporuuji pro kad kdovn zvolit
jedno psmeno (napklad c=cs, d=dc, i=il2, w=1250, p=852, k=kam,
o=koi8, m=mac) a nahradit nzvy soubor v distribuci tmito nzvy:

plain-il2-cs.tex     plain-ic.tex
plain-kam-cs.tex     plain-kc.tex
plain-1250-cs.tex    plain-wc.tex
plain-852-cs.tex     plain-pc.tex
plain-il2-dc.tex     plain-id.tex
plain-kam-dc.tex     plain-kd.tex
plain-1250-dc.tex    plain-wd.tex
plain-852-dc.tex     plain-pd.tex
kam-latex.tex        latex-ki.tex
852-latex.tex        latex-pi.tex

Obsah \message v souborech plain-x-y nemte. Napklad formt
plain-wc se po sputn pedstav svm plnm jmnem
The format: plain-1250-cs <Sep. 1997>.


Kdovac tabulky
----------------
Protoe zmna vektor xord a xchr me totln rozhodit chovn TeXu zcela
k nepoznn, doporuuji pouvat urit soubory, kter nastav poadovan
kdovn, a dle s primitivy \xordcode, \xchrcode a \xprncode za bhu TeXu
moc nelakovat. V balku encTeX jsou k dispozici soubory, kter zmnu
vektor pro bn kdovn definuj. Tyto soubory maj obvyklou pponu
tex. kme jim kdovac tabulky. Rozliujeme dva typy kdovacch tabulek.


Prvn typ kdovacch tabulek
----------------------------
Prvn typ tabulek deklaruje vnitn kdovn TeXu ve vztahu ke kdovn,
kter je bn pouvan v hostitelskm operanm systmu. Mme-li
napklad v systmu kdovn ISO-8859-2 a vnitn kdovn TeXu volme
podle Corku (kdovn je oznaovno jako T1), pak tabulka mus pedefinovat
xord vektor tak, aby mapoval znaky z ISO-8859-2 do T1 a vektor xchr mus
pevdt zptky z T1 do kdovn systmu.

Tento typ tabulek je pouit v inicializanch souborech plain-*.tex a
obsahuje v nzvu souboru vstupn i clov vnitn kdovn TeXu. Podvejte
se, jak vypad napklad tabulka il2-t1.tex, kter definuje vnitn
kdovn TeXu podle Corku a vstupn kdovn ISO8859-2.

Kad tabulka prvnho typu te soubor encmacro.tex s definicemi maker
\setcharcode, \expandto, \texaccent, \texmacro a \redefaccent.

* \setcharcode #1 #2 #3 #4 #5 #6 #7 deklaruje TeXovsk kdy pro jeden znak.
  Nastav xord[#1]=#2, xchr[#2]=#1, \xprncode#2=1 a postupn nastav
  \lccode, \uccode, \sfcode a \catcode znaku s kdem #2 na hodnoty #3, #4,
  #5 a #6. "Tisknutelnost" znaku \xprncode je nastavena podle #7.
  Je-li #1 otaznk, pak se xord a xchr nenastav.

* \expandto {definice} definuje aktivn podobu znaku #2 z poslednho
  \setcharcode tak, e tento token expanduje na "definici". Podrobnji:
  je-li v \setcharcode uvedeno #6=13, pak bude kad vskyt znaku #2
  expandovat na "definici". Nen-li v \setcharcode eeno #6=13, pak
  k expanzi znaku #2 na "definici" dojde teprve tehdy, kdy bude
  (teba pozdji) nastaveno \catcode znaku #2 na 13.

* \texaccent "zpis akcentu" pipravuje expanzi "zpisu akcentu" na znak
  s kdem #2 z naposledy pouitho \setcharcode. Napklad zpis \v C bude
  po naten souboru il2-t1.tex expandovat na znak s kdem "83. Pokud zpis
  pro akcent nen v tabulce uveden, zstv v pvodnm vznamu, tj. teba
  \v g expanduje na primitiv \accent, kter usad hek nad psmeno g.
  K aktivaci vech "zpis akcentu" dojde a po pouit makra \redefaccent
  (viz ne).

* \texmacro #1 deklaruje makro #1 tak, e bude expandovat na znak s kdem
  #2 z naposledy pouitho \setcharcode. K pedefinovn makra #1 dojde (na
  rozdl od \texaccent) okamit. Napklad makro \S bude po naten
  souboru il2-t1.tex expandovat na znak s kdem "9F, protoe na tto pozici
  je podle Corku znak paragraf.

* \redefaccent #1 aktivuje expanzi zpis podle \texaccent pro jeden
  konkrtn akcent #1.

Krom toho je na zatku tabulky ten soubor definic zvislch na kdovn
textovho fontu TeXu. V na ukzce jde napklad o soubor t1macro.
Definuj se tam sekvence \promile, \clqq a dal. Jedn se o jednoduchou
obdobu fd soubor z NFSS.

Me se stt, e nechceme uveden makra pout, ale hodnoty z tabulky
nast chceme. Pak meme pistoupit k nsledujcmu triku: Definujeme si
makra \setcharcode a \redefaccent sami a dle provedeme naten tabulky
takto:

\let\originput=\input \def\input #1
\originput il2-t1
\let\input=\originput

V balku jsou pipraveny tyto tabulky prvnho druhu:

Nzev souboru       vstupn kdovn    vnitn kdovn TeXu
-----------------------------------------------------------
il2-csf.tex         ISO8859-2           CS-font
kam-csf.tex         Kamenickch         CS-font
1250-csf.tex        CP1250, MS-Windows  CS-font
852-csf.tex         CP852, PC Latin2    CS-font
il2-t1.tex          ISO8859-2           T1 alias Cork
kam-t1.tex          Kamenickch         T1 alias Cork
1250-t1.tex         CP1250, MS-Windows  T1 alias Cork
852-t1.tex          CP852, PC Latin2    T1 alias Cork

Za zmnku stoj prvn uveden tabulka il2-csf.tex, protoe ta
jedin ponechv vektory xord a xchr beze zmny. Tuto tabulku
je tedy mon pout i v TeXu, kter neobsahuje rozen
encTeX. Vechny ostatn tabulky encTeX explicitn vyaduj.


Druh typ kdovacch tabulek
----------------------------
Druh typ tabulek provd pekdovn pouze na vstupn stran TeXu. Poznme
je podle toho, e nemaj na konci nzvu znaku pro vnitn kdovn TeXu
(tj. t1 nebo csf), ale znaku pouvanou pro kdovn operanho systmu
(nap. il2, kam). Teba tabulka kam-il2.tex provd na vstupn stran
konverzi z kdovn kamenickch do kdovn ISO8859-2. Tento typ tabulek
pozmuje pouze vektor xchr, ale vstupn vektor xord ponechv beze zmny.
Takovou tabulku pouijeme, pokud TeXem natme soubor, kter je v jinm
kdovn, ne bn pouvme na naem operanm systmu. Pitom vstup do
log, aux apod. ponechme v kdovn podle naeho systmu. Tyto zmny
kdovn je mon provdt i v prbhu zpracovn jedinho dokumentu.

Druh typ tabulek navazuje na vstupn kdovn deklarovan dve
tabulkou prvnho typu. Nastaven vnitnho kdovn TeXu nen vbec
druhm typem tabulek mnno. Uvedeme pklad. Pi generovn formtu
jsme pouili tabulku prvnho typu il2-t1.tex, take vnitn
kdovn mme podle Corku. Nyn meme pi zpracovn dokumentu na
pechodnou dobu vybrat nkterou z tabulek *-il2.tex, teba:

\input kam-il2  
\input dokument
\restoreinputencoding
nyn mohu pracovat v pvodnm kdovn...
\end

V dob, kdy probh natn souboru dokument.tex se provd
pekdovn z Kamenickch do T1, uvnit TeXu se ve zpracovv
v T1 a vstup na terminl a do logu mme v ISO8859-2. V tomto
kdovn je tak zapsn dal text pod \restoreinputencoding.
Tabulka toti deklaruje toto makro, aby byl mon nvrat k pvodnmu
nastaven vektoru xord.

Pi pouit tabulek druhho typu musme dt velk pozor, abychom nco
neudlali patn. V naem pklad jsou vechny vstupy do soubor
typu aux v ISO-8859-2, take je pi opakovanm sputn TeXu nesmme
natat v okamiku, kdy mme nastaven vstupn kd podle Kamenickch. To je
tak dvod, pro nedoporuuji generovat formt pkazem \dump v situaci,
kdy mme natenou tabulku druhho typu.

