diff options
Diffstat (limited to 'Master/texmf-dist/doc/generic/enctex/encdoc.tex')
-rw-r--r-- | Master/texmf-dist/doc/generic/enctex/encdoc.tex | 1168 |
1 files changed, 1168 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/enctex/encdoc.tex b/Master/texmf-dist/doc/generic/enctex/encdoc.tex new file mode 100644 index 00000000000..f9007af6efa --- /dev/null +++ b/Master/texmf-dist/doc/generic/enctex/encdoc.tex @@ -0,0 +1,1168 @@ +% EncTeX documentation +%%%%%%%%%%%%%%%%%%%%%% +% Petr Olsak + +% see encdoce-e.tex for English version of this documentation + +\chyph % zpracujte formatem csplain + +\def\Red{} +\def\Black{} +\def\Blue{} +\def\Green{} +\def\beglink#1{} +\def\endlink{} +\def\aimlink#1{} +\def\urllink#1{{\tt#1}} +\def\urllinkk#1#2{{\tt#1}} + +\ifx\pdfoutput\undefined\else %%%% pdfTeX is used %%%%%%%%%% +\ifnum\pdfoutput>0 + +\ifx\pdfannotlink\undefined % Verze pdfTeXu >= 14 + \let\pdfannotlink=\pdfstartlink +\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\urllinkk#1#2{\pdfannotlink height 10pt depth 3pt + user{/Border[0 0 0]/Subtype/Link/A << /Type/Action/S/URI/URI(#2)>>}\relax + \Green{\tt #1}\Black\pdfendlink} +\def\urllink#1{\urllinkk{#1}{#1}} + + +\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 (Feb. 2003) + /ModDate (Jun. 2004) + /Creator (TeX) + /Producer (pdfTeX) + /Title (encTeX) + /Subject (Documentation) + /Keywords (TeX, fonts) +} + +\fi\fi %%%%%%%%%%%%%%%%%%%%%%%%%%%% End of pdfTeX macros %%%%% + + +\font\titulfont=\fontname\tenbf\space scaled\magstep4 +\font\bigbf=\fontname\tenbf\space scaled\magstep1 + +\parindent=12pt + +\newcount\secnum \newcount\subsecnum + +\def\kap #1\par{\ifnum\secnum>0 \goodbreak\fi\removelastskip + \vskip2\baselineskip + \subsecnum=0 \advance\secnum by1 + \noindent{\bigbf\llap{\the\secnum.\quad}#1}\par\nobreak\medskip} +\def\sec #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 + \centerline{\titulfont #1}\vskip2\baselineskip} +\def\date #1\par{\bigskip#1\par} +\def\author #1\par{\bigskip#1\par} + +\catcode`<=13 +\def<{\hbox\bgroup\catcode`_=\active\relax\skoba} +\def\skoba #1>{$\langle$\it#1\/$\rangle$\egroup} +\def\,{\thinspace} +{\catcode`_=\active \gdef_{\_}} + +{\obeyspaces \gdef\activespace{\obeyspaces\let =\ }} +\def\setverb{\def\do##1{\catcode`##1=12}\dospecials} +\def\begtt{\medskip\bgroup \setverb \activespace + \catcode`\"=12 \catcode`_=13 + \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"{\leavevmode\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} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +{\nopagenumbers + +\vglue 4cm + +\centerline {\titulfont Enc\TeX} +\vskip2cm +\centerline {\titulfont možnost překódování vstupu v~\TeX{}u} + +\vskip3cm + +\centerline {\bigbf Petr Olšák} + +\vskip2cm + +\centerline{\urllinkk{www.olsak.net/enctex.html}{http://www.olsak.net/enctex.html}} + +\vfil + +\centerline {\bigbf Toto je dokumentace k~verzi Feb. 2003 a Jun. 2004} + +\vskip 4cm +\break + +\null \vfil + +Enc\TeX{} je volné programové vybavení; můžete jej dále šířit +a modifikovat podle podmínek \uv{GNU General Public License}, kterou +publikovala "Free Software Foundation"; použijte verzi 2 této licence +nebo (podle Vaší volby) libovolnou pozdější verzi. + +Balíček najdete na Internetu na +\urllink{ftp://math.feld.cvut.cz/pub/olsak/enctex/}. + + +Tento balíček je rozšiřován v~naději, že bude užitečný, avšak BEZJAKÉKOLI ZÁRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI anebo +VHODNOSTI PRO URČITÝ ÚČEL. Další podrobnosti hledejte v~Obecné veřejné +licenci GNU. + +Kopii \uv{GNU General Public License} jste měl obdržet spolu s~tímto +programem; pokud se tak nestalo, napište o~ni Free Software Foundation, +Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Český překlad této +licence najdete na "http://www.gnu.cz/gplcz.html". + +\bigskip +\copyright\quad 1997, 2002, 2003, 2004\enspace RNDr. Petr Olšák + +\bigskip + +\TeX{} je ochranná známka American Mathematical Society. + +\bigskip +Autor \TeX{}u je profesor Donald Knuth. \TeX{} je volné programové +vybavení se specifickou licencí, viz dokumentaci k~tomuto programu. + +\break +} + +\kap Základní informace + %%%%%%%%%%%%%%%%%% + +Balík enc\TeX{} je jednoduché rozšíření \TeX{}u pro takové implementace, ve +kterých se \TeX{} instaluje ze zdrojového kódu "tex.web". Tuto +podmínku například splňuje implementace web2c, určená pro UNIXy +a jiné operační systémy s~kvalitním překladačem jazyka C. + +Rozšíření enc\TeX{} je zpětně kompatibilní s~originálním +\TeX{}em. Přidává deset nových primitivů, kterými lze číst nebo +naplňovat vnitřní kódovací tabulky, podle nichž je znak transformován +na úrovni vstupního procesoru \TeX{}u nebo při výstupu na terminál, do +"log" souboru a "\write" souborů. Tyto tabulky se ukládají do +formátových souborů, takže po načtení formátu se inicializují ve +stejném stavu, v~jakém byly v~okamžiku příkazu "\dump". + +Změna \TeX{}u je důkladně testovaná a prošla též testem TRIP +s~těmito dvěma odlišnostmi: + +\begitems +* Odlišný banner +* Počet \uv{multiletter control sequences} je o~deset větší. +\enditems + +\sec Instalace +% --------- + +Viz soubor "INSTALL". + +\sec Verze +% ----- + +V~roce 1997 byla zveřejněna první verze enc\TeX{}u, která umožňovala +konverze pouze v~režimu \uv{byte na byte} a nastavovala tisknutelnost +znaků (primitivy "\xordcode", "\xchrcode", "\xprncode"). + +V~roce 1998 obnovil někdo z~Polska používání TCX tabulek ve web2c +\TeX{}u. Protože enc\TeX{} z~roku 1997 dělal víceméně totéž a +používání obou nadstaveb současně by mohlo být pro mnoho uživatelů +matoucí, přestal jsem enc\TeX{} prosazovat. Ovšem v~roce 2002 +jsem se rozhodl přidat do enc\TeX{}u podporu UTF-8 kódování, protože +tato podpora není a asi nebude v~TCX tabulkách implementována. +V~prosinci 2002 jsem se tedy rozhodl znovu začít propagovat enc\TeX{}, +který navíc zvládne UTF-8 kódování. + +Verze enc\TeX{}u "Feb.2003" přidává dalších +7~primitivů "\mubyte", "\endmubyte", "\mubytein", "\mubyteout", +"\mubytelog", "\specialout" a "\noconvert". To umožní definovat vstup +pro UTF-8 kódované soubory. Tato verze je samozřejmě zpětně +kompatibilní s~původní verzí enc\TeX{}u z~roku 1997. Neplánuji do +budoucna žádné rozsáhlejší změny. Pokud přeci jenom k~nějakým změnám +dojde, pak vždy budou zpětně kompatibilní se stávajícím řešením + +Verze "Jun.2004" opravuje jen některé drobné chyby a nepřídává žádné +nové funkce (podrobněji viz soubor "enctex.patch-jun2004"). + + +\sec Enc\TeX{} ve web2c distribuci +% ----------------------------- + +Enc\TeX{} se v~\TeX{}u, pdf\TeX{}u, e-\TeX{}u a pdfe\TeX{}u +v~distribuci web2c inicializuje pomocí přepínače "-enc" na příkazové +řádce. Tento přepínač je nutno použít při inicializaci formátu. +V~takovém případě enc\TeX{} uloží své primitivy a svá data do formátu. Při +použití formátu už není nutné přepínač "-enc" psát znova. Enc\TeX{} se +v~tomto případě inicializuje z~formátu a napíše o~tom zprávu na terminál +a do log souboru. Pokud nepoužijete přepínač "-enc" v~době generování +formátu, ale použijete jej až při použití formátu, pak +\TeX{} vypíše varování o~neexistenci enc\TeX{}u ve formátu a přepínač +"-enc" je ignorován. + +Ve web2c distribuci pracují se stejnými kódovacími vektory xord a xchr +(pro překódování byte na byte) jednak enc\TeX{} a jednak tzv. TCX tabulky +(při použití přepínače "-translate-file"). Určitému konfliktu se tedy při +současném používání obou rozšíření nevyhneme. +Je-li v~enc\TeX{}u použita TCX tabulka, pak při startu \TeX{}u +přepíše hodnoty "\xordcode", "\xchrcode" a "\xprncode" podle sebe. +Znamená to, že při použití ini\TeX{}u pak nemusejí platit implicitní +hodnoty těchto kódů dokumentované v~sekci 2.2 a při použití formátu +s~enc\TeX{}em jsou hodnoty těchto kódů, které si do formátu uložil +enc\TeX{}, přepsány podle TCX tabulky. O~této skutečnosti enc\TeX{} +náležitě informuje na terminálu a v~logu. Při běhu programu pak můžete +enc\TeX{}ovými primitivy tyto kódy dále číst a měnit. Použití TCX +tabulky tedy nevylučuje možnosti enc\TeX{}u. + +\sec Problém s~licencí \TeX{}u +% ------------------------- + +Enc\TeX{} rozšiřuje \TeX{} o~nové primitivy, takže bychom neměli tomuto +programu říkat \TeX{}. Na druhé straně ale Knuth samotný předpokládá, +že vnitřnosti \TeX{}u budou odstíněny od prostředí operačního +systému. Proto implementoval xord a xchr vektory. V~enc\TeX{}u můžeme +nastavit podle zvyklostí operačního systému vstupní a výstupní +překódovací tabulky a pak nastavit všem novým primitivům význam +"\undefined". Dále se bude \TeX{} modifikovaný enc\TeX{}em chovat stejně, +jako originální \TeX{}. Navíc můžeme překódovací tabulky nastavit při +generování formátu a v~produkční verzi \TeX{}u zakázat přístup +k~primitivům. Produkční verze \TeX{}u se pak chová zcela stejně jako +originální \TeX{}. Knuth předpokládá, že odstínění od prostředí +operačního systému se provede vždy při kompilaci zdrojového kódu +\TeX{}u, zatímco enc\TeX{} umožňuje tuto otázku řešit později, +například v~době generování formátu. Umožnění úpravy některých +(například paměťových) parametrů až za běhu \TeX{}u také není nic +nového a známe to skoro u~všech distribucí \TeX{}u. + +Domnívám se, že druhý řádek na terminálu a v~logu dostatečně informuje +o~tom, že se jedná o~modifikovanou verzi \TeX{}u. Také se domnívám, že +pokud se velmi rozšíří kódování UTF-8, pak není zbytí a takové +konverze jsou v~8 bitové verzi \TeX{}u nezbytné. + +Je důležité rovněž připomenout, že implicitní chování enc\TeX{}u je +takové, že pokud se nepoužijí rozšířené primitivy enc\TeX{}u, pak se +chová naprosto stejně jako originální \TeX{}. + +Podle mého názoru novější implementace web2c \TeX{}u taky není v~přísném +slova smyslu \TeX{}. Umožňuje totiž změnu chování programu, pokud na +prvním řádku dokumentu za znaky "%&" je cosi specifického napsáno. To +je podle mého názoru větší přestupek oproti licenci \TeX{}u, než +enc\TeX{}ovými primitivy nastavit ve formátu prostředí systému a pak tyto +primitivy v~produkční verzi \TeX{}u zakázat. + + +\kap Překódování byte na byte pomocí vektorů xord, xchr + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\sec Vektory xord a xchr +% ------------------- + +Vektory xord a xchr mají velikost 255 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 xord tak, aby +xord[$x$]=$y$. Při zpětném výstupu znaku na terminál, do logu a do +souborů zpracovávaných pomocí "\write" platí tato pravidla: Není-li znak +s~kódem $y$ označen jako \uv{tisknutelný}, pak vystupuje pomocí přepisu +"^^"kód~$y$. Je-li tisknutelný, pak vystupuje s~kódem $z$=xchr[$y$]. + +Standardně bývají v~systémech s~kódem ASCII nastaveny hodnoty těchto +vektorů tak, že +\medskip +xord[$i$]=xchr[$i$]=$i$ pro všechna $i$ v~rozsahu 0~až~255. +\medskip +Na systémech, které nepoužívají ASCII, se může mapovat 94 +tisknutelných ASCII znaků jinam. Mimoto je deklarovaná vlastnost +\uv{tisknutelnosti} znaku v~ASCII takto: Znak je tisknutelný, pokud má +kód~$y$ v~rozsahu 32 až 126. Ostatní znaky se považují za netisknutelné a +\TeX{} je standardně přepisuje pomocí dvojité stříšky. + +Po instalaci balíčku enc\TeX{} je možno přímo nastavovat a číst obsahy +vektorů xord a xchr prostřednictvím primitivů "\xordcode" +a "\xchrcode" a dále nastavovat vlastnost \uv{tisknutelnosti} znaku +pomocí primitivu "\xprncode". Syntaxe všech tří nových primitivů +je naprosto stejná, jakou známe například u~primitivů "\lccode" a +"\uccode". Například: + +\begtt +\xordcode"AB="CD \xchrcode\xordcode"AB="AB \the\xchrcode200 +\endtt +% +nastavuje xord[0xAB]=0xCD; xchr[xord[0xAB]]=0xAB a dále vytiskne +hodnotu xchr[200]. + +Na rozdíl od podobných primitivů "\catcode", "\lccode", "\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í "\xordcode" a "\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. + + +\sec Tisknutelnost znaků nastavená pomocí {\tt\char`\\xprncode} +% ---------------------------------------------------------- + +Primitiv "\xprncode" umožňuje nastavovat vlastnost \uv{tisknutelnosti} +znaku takto: Znak s~kódem $y$ je tisknutelný právě tehdy, když je +$y$ v~rozsahu 32 až 126 nebo je "\xprncode" $y > 0$. Napíšeme-li například +"\xprncode255=1", bude tisknutelný znak s~kódem 255. Na druhé straně, +nastavení "\xprncode`a" třeba na nulu nemá na chování programu žádný +vliv, protože kód znaku "a" je v~rozsahu 32 až 126. 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 "\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í: + +\vbox{ +\begitems +* "\xordcode" $i$ = $i$ pro všechna $i$ v~rozsahu 0...255, +* "\xchrcode" $i$ = $i$ pro všechna $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. +\enditems +} + +První dva řádky jsou pravdivé jen na operačních systémech, které přijaly +kódování anglické abecedy podle ASCII. Pokud tomu tak není, pak jsou +výchozí hodnoty vektorů xord a xchr pozměněny tak, aby mapovaly tisknutelné +znaky podle systému do ASCII uvnitř \TeX{}u. Taková změna se týká jen 95 +základních tisknutelných znaků, které jsou v~ASCII na pozicích +32~až~126. + + +\kap Konverze více bytů na jeden byte nebo kontrolní sekvenci + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Od verze Dec 2002 enc\TeX{} umí také konvertovat na úrovni vstupního +procesoru více bytů na jeden byte nebo kontrolní sekvenci. +Při výstupu do logu a "\write" souborů je pak tento objekt +zpětně převeden na původních více bytů. Tato vlastnost nechce nahradit +chybějící interpret regulárních výrazů ve vstupním procesoru \TeX{}u. +Byla implementována pouze z~důvodu umožnit pracovat s~UTF-8 kódovanými +soubory v~běžném 8 bitovém \TeX{}u tak, že znaky z~UTF-8 +z~nejčastěji používané abecedy mohou být mapovány na jeden znak, +který může mít svůj "\catcode", "\uccode" atd. Jiné znaky +z~UTF-8 mohou být mapovány na libovolné kontrolní sekvence. + +Pro nastavení takové konverze jsou do \TeX{}u přidáno nový pět +primitivů: "\mubytein", "\mubyteout", "\mubytelog", "\mubyte" a "\endmubyte". +Primitivy "\mubytein", "\mubyteout" a "\mubytelog" jsou celočíselné +registry implicitně s~nulovou hodnotou, tj. konverze vstupu a výstupu +podle konverzní tabulky se neprovádějí. Je-li "\mubytein" nastaveno na +kladnou hodnotu, \TeX{} okamžitě zahájí konverze vstupního řádku podle +konverzní tabulky. Je-li "\mubyteout" nastaveno na kladnou hodnotu, +\TeX{} začne konvertovat do výstupních "\write" souborů podle +stejné konverzní tabulky. Při kladném "\mubytelog" bude \TeX{} zpětně +konvertovat také výstup do logu a na terminál. +Implicitně je konverzní tabulka prázdná a +jednotlivé řádky se do ní přidávají pomocí dvojice primitivů +"\mubyte", "\endmubyte" s~touto syntaxí: + +\begtt +\mubyte <first_token><one_optional_space><optional_prefix><byte_sequence>\endmubyte +\endtt + +Každá <byte_sequence> bude převedena ve vstupním procesoru na +<first_token>. Je-li <first_token> znakem (tj. není to kontrolní +sekvence), pak se ignoruje jeho kategorie, protože konverze je +prováděna v~input procesoru podle schématu: <byte_sequence> na jeden +<byte>. Při výstupu do logu a "\write" souborů se pak každý takový +<byte> znovu převede na <byte_sequence>. + +Pokud je <first_token> +kontrolní sekvence, pak se na úrovni vstupního procesoru promění +každá <byte_sequence> na tuto kontrolní sekvenci implementovanou ve formě +neměnitelného tokenu. Token procesor tuto sekvenci tedy znovu +neinterpretuje a zůstává za ní ve stavu neignorování mezer. Při +{\catcode`\<=12 "\mubyteout<2"} není při výstupu do "\write" +souborů tato kontrolní sekvence zpětně převáděna na původní <byte_sequenci>, +ale podléhá jen běžné expanzi, jako ostatní kontrolní sekvence. +Při "\mubyteout>=2" se i tyto kontrolní sekvence převádějí do +"\write" souborů na původní <byte_sequence>. Aby se ale mohly převést, +nesmějí před tím expandovat, tj.~musejí +mít v~době expanze význam neexpandovatelné kontrolní sekvence +nebo musejí být označeny pomocí "\noexpand". +Při "\mubyteout>=3" enc\TeX{} potlačí expanzi kontrolních sekvencí +deklarovaných v~"\mubyte" automaticky (podrobněji viz sekci~3.8). +Výstup do logu a na terminál, který není produktem příkazu "\write", +ponechává i při kladném "\mubytelog" kontrolní sekvence nezměněny. + +Význam <optional_prefix> je vysvětlen v~sekci~3.5. + +\sec Zanášení údajů do konverzní tabulky +% ----------------------------------- + +Záznamy do konverzní tabulky jsou pomocí primitivů "\mubyte", "\endmubyte" +zanášeny globálně, zatímco hodnoty v~registerch "\mubytein", +"\mubyteout" a "\mubytelog" mají obvykou lokální platnost. + +Dvojice primitivů "\mubyte", "\endmubyte" pracuje analogicky, jako +dvojice "\csname", "\endcsname". Rozdíl je pouze v~tom, že první token +<first_byte> se neexpanduje a že za ním může (po expanzi) následovat +<one_optional_space>. Při skenování <optional_prefix> a +<byte_sequence> již probíhá úplná expanze a při ní se nesmí objevit na +vstupu do hlavního procesoru token typu kontrolní sekvence, jinak +nastane chyba, kterou už známe z~používání "\csname", "\endcsname": + +\begtt +! Missing \endmubyte inserted. +\endtt + +Primitiv "\mubyte" na rozdíl od "\csname" neprovádí činnost na úrovni +expand procesoru, ale jedná se o~přiřazovací primitiv zpracovaný na +úrovni hlavního procesoru. Takže po + +\begtt +\edef\a{\mubyte X ABC\endmubyte} +\endtt +% +bude makro "\a" obsahovat tokeny: "\mubyte X ABC\endmubyte". + +Příklady: + +\begtt +\mubyte ^^c1 ^^c3^^81\endmubyte % Á +\mubyte ^^e1 ^^c3^^a1\endmubyte % á +% atd. -- implementace UTF8 + +\mubyte \endash ^^c4^^f6\endmubyte % příklad na kontrolní sekvenci +\mubyte \integral INT\endmubyte % příklad pro ilustraci, viz dále. + +\mubytein=1 \mubyteout=1 \mubytelog=1 % od této chvíle je překódování aktivní + +\def\endash {--} +\def\integral {\ifmmode \int\else $\int$\fi} +\endtt + +V~tomto příkladě je v~místě <one optional space> více mezer a +tabulátorů. Protože tabulátory mají kategorii mezery, jsou všechny +tyto znaky přeměněny token procesorem na jedinou mezeru požadovanou +v~syntaktickém pravidle pro "\mubyte", "\endmubyte". + +Po použití definic z~příkladu se například slovo INTEGRAL promění v~token +"\integral" okamžitě následovaný písmeny \uv{EGRAL}. V~textu INT EGRAL +bude za tokenem "\integral" mezera a teprve pak písmena +\uv{EGRAL}. Také jsou možné konstrukce typu "\defINT{něco}" apod. +Když napíšeme "\show INT", dostaneme odpověď: + +\begtt +> \integral=macro: +->\ifmmode \int \else $\int $\fi . +l.18 \show INT +\endtt +% +a "\string INT" se expanduje na text: "\integral". + +Po deklaraci INT podle předchozího příkladu se může +stát, že někdo napíše: "\INT". Správně by to mělo vést na prázdnou +kontrolní sekvenci ("\csname\endcsname") následovanou kontrolní +sekvencí "\integral". Protože se ale s~prázdnými kontrolními +sekvencemi v~\TeX{}u moc často nepracuje a pro uživatele by to mohlo +být matoucí, rozhodl jsem se tuto situaci ošetřit tak, že "\INT" je +převedeno pouze na token "\integral". Pozor na skutečnost, +že za sekvencí "\INT" není \TeX{} ve stavu ignorování mezer +a navíc může za ní okamžitě následovat písmeno. + +\sec Vlastnosti konverze +% ------------------- + +Multibytové sekvence jsou převedeny ze vstupu pouze tehdy, pokud jsou +celé obsaženy v~jediném řádku. Přesah do dalšího řádku není +možný. Připojený "\endlinechar" na konci řádku se může stát předmětem +konverze podle konverzní tabulky. + +Sekvence "^^c3^^81" se nepromění ani po použití definic z~příkladu na +byte \uv{Á}, protože převod dvojitých zobáků na jednotlivé byty +probíhá v~token procesoru, tj. později, než převody více bytů na +jeden podle "\mubyte". + +Převod více bytů na jeden byte nebo kontrolní sekvenci +probíhá později než konverze podle "\xordcode" a při výstupu do "\write" a +log souborů pak převod podle "\mubyte" probíhá dříve než konverze podle +"\xchrcode". <byte_sequence> tedy musí obsahovat sekvenci bytů tak, jak +jsou tyto byty konvertovány ze vstupního souboru pomocí "\xordcode". + +Postupné procesy na vstupu a výstupu si můžeme naznačit takto: + +\begtt +vstupní text -> \xordcode -> připojení \endlinechar -> + \mubyte -> token procesor -> expanze ... +argument \write -> expanze -> \mubyte -> \xchrcode -> výstup +\endtt + +Při výstupu do "\write" souborů a logů zpětně konvertované +<byte_sequence> už nepodléhají další konverzi na formát typu +"^^c3^^81" ani opakované konverzi podle "\mubyte". Tyto +<byte_sequence> se pouze převedou podle hodnot "\xchrcode". + +Pokud se v~konverzní tabulce vyskytují <byte_sequence> se společným +začátkem, ale různě dlouhé, pak input procesor enc\TeX{}u (od verze +Feb.~2003) převádí vždy podle nejdelší možné <byte_sequence>, která se +na vstupu objeví. Příklad: + +\begtt +\mubyte X A\endmubyte +\mubyte Y ABC\endmubyte +\mubyte \foo ABCD\endmubyte +\endtt + +V~tomto příkladě se každé A~konvertuje na X, ale pokud následuje BC, +pak se skupina ABC konvertuje na Y ovšem s~tou výjimkou, že se skupina +ABCD konvertuje na "\foo". Na pořadí vkládání údajů do konverzní tabulky +primitivem "\mubyte" v~tomto případě nezáleží. + +Pokud se v~konverzní tabulce objeví dvě stejné <byte_sequence>, pak má +přednost ta, která byla zanesena do tabulky později. + + +\sec Konverze výstupu do logu a na terminál +% -------------------------------------- + +Výstup do logu a na terminál je při nulovém "\mubytelog" ponechán bez +konverze. Pokud je v~takovém případě "\xprncode" znaku nulový, pak se +znak vytiskne ve formě "^^A" nebo "^^bc". Při kladném "\mubytelog" se +znaky zanesené do konverzní tabulky konvertují zpět na +<byte_sequence>. Do logu a na terminál se ale na <byte_sequence> +nikdy nekonvertují kontrolní sekvence. + +Zpětná konverze do logu a na terminál je nastavována společně +primitivem "\mubytelog" a nelze ji oddělit tak, že by například pro +terminál byla zpětná konverze potlačena a pro log soubory nikoli. + +Výpisy do logu a na terminál občas obsahují kompletní přepis právě +čteného řádku, který je například při hlášení chyby rozrtžen na dva +řádky, aby \TeX{} naznačil místo, kde došlo k~problému. Pro další +výklad budeme těmto částem logu říkad \uv{přepisy řádků}. + +Je-li registr "\mubytein" nulový, pak přepisy řádků +fungují jako ve standardním \TeX{}u. Je-li "\mubytein" kladný a +"\mubytelog" nulový, pak je v~přepisech řádků zobrazen obsah řádku až +po konverzi input procesorem enc\TeX{}u, tj. v~těchto přepisech se +mohou například vyskytovat kontrolní sekvence, které tam uživatel +vůbec nenapsal. Jsou-li "\mubytein" i "\mubytelog" +kladné, pak jsou přepisy řádků realizovány bez multibytové konverze +tam ani zpět. Probíhá jen konverze podle xchr a xord vektorů. +Je třeba si uvědomit, že v~tomto případě mohou být chybové výpisy +poněkud matoucí. Například po + +\begtt +\mubyte \sekvence ABC\endmubyte \let\sekvence=\undefined +\mubytein=1 \mubytelog=1 +Tady je test ABC a řádek pokačuje. +\endtt +% +dostáváme na výstupu: + +\begtt +! Undefined control sequence. +l.3 Tady je test ABC + a řádek pokačuje. +? +\endtt +% +Teprve "\show ABC" odhalí: + +\begtt +> \sekvence=undefined. +l.3 \show ABC +\endtt + + +\sec Mazání údajů v~konverzí tabulce +% ------------------------------- + +Údaje v~konverzní tabulce lze mazat jen hromadně: příkaz vymaže +všechny údaje začínající na společný první znak v~<byte_sequenci>. +Provede se to pomocí příkazu "\mubyte <znak> <znak>\endmubyte". +Například: + +\begtt +\mubyte A A\endmubyte +\endtt +% +odstraní z~konverzní tabulky všechny <byte_sequence> začínající +písmenem A. + +Následující kód promaže celou tabulku: + +\catcode`<=12 +\begtt +{\catcode`\^^@=12 +\gdef\clearmubytes{\bgroup \count255=1 + \loop \uccode`X=\count255 + \uppercase{\mubyte XX\endmubyte}% + \advance\count255 by1 + \ifnum\count255<256 \repeat + \mubyte ^^@^^@\endmubyte + \egroup} +} +\clearmubytes +\endtt +\catcode`<=13 + + +\sec Vstupní a výstupní část konverzní tabulky +% ----------------------------------------- + +Konverzní tabulka konstruovaná pomocí "\mubyte", "\endmubyte" má dvě +nezávislé části: vstupní, se kterou pracuje input procesor a výstupní, +která se používá při zpětných konverzích. Údaje je možné zanést +nezávisle do každé části při použití neprázdného <optional_prefix> +(viz syntaktické pravidlo "\mubyte" na začátku této kapitoly). +Je-li <optional_prefix> +prázdný, pak se požadavek na konverzi zanese dvojmo do vstupní i +výstupní části. Je-li ale <optional_prefix> znak kategorie~8 (obvykle +znak "_"), pak se údaj zanese jen do vstupní části tabulky. Obsahuje-li +<optional_prefix> dvojici znaků kategorie~8 (obvykle tedy "__"), pak +se údaj zanese jen do výstupní části tabulky. + +Při <optional_prefix> "__" (výstupní část tabulky) je dovoleno mít +prázdnou <byte_sequenci>. V~takovém případě se původní +údaje z~výstupní části tabulky, které odpovídají <first_token>, +vymažou. Pokud tam žádné takové údaje nebyly, nestane se nic. + +Vraťme se ke kódu na vymazání tabulky z~předchozí sekce. Tento kód +vymaže vše ze vstupní části tabulky a z~výstupní jen ty údaje, které +jsou vázány na <first_token> ve tvaru <byte>. Údaje z~výstupní části +vázané na kontrolní sekvence nejsou tímto způsobem promazány. +Promazání jednoho údaje uděláme pomocí: +"\mubyte \foo __\endmubyte". + + +\sec Vkládání dalších kontrolních sekvencí +% ------------------------------------- + +Je-li <first_token> ve tvaru kontrolní sekvence a navíc +<optional_prefix> je token kategorie~6 +(obvykle znak "#") následovaný <číslem>, +pak input procesor ponechá beze změny <číslo> znaků, +ale vloží před ně deklarovanou kontrolní sekvenci. +Údaj se zanese jen do vstupní části konverzní tabulky. +Příklad: + +\begtt +\def\abc{ABC} +\mubyte X BC\endmubyte \mubytein=1 +\mubyte \foo #3 \abc\endmubyte Nyní ABC přechází na \foo ABC +\mubyte \foo #1 \abc\endmubyte Nyní ABC přechází na \foo AX +\endtt + +Parametr <číslo> má stejnou syntaxi, jako gramatická kategorie <number> +z~\TeX{}booku. Například při přímém zápisu dekadických číslic +může následovat jedna nepovinná mezera, jako v~předchozí ukázce. + +Je-li <číslo> rovno nule, pak bude +ponechána beze změny celá <byte_sequence>, která následuje. +Výsledek je tedy stejný, jako kdyby <číslo> mělo hodnotu délky +<byte_sequence>. + +Hodnota <čísla> je akceptována jen v~rozsahu 0 až 50. Záporná čísla +jsou interpretována stejně jako nula a čísla větší než 50 způsobí, že +input procesor vypne po vložení kontrolní sekvence další konverzi až +do konce řádku. + +Praktický příklad použití: + +\begtt +\mubyte \warntwobytes #2^^c3\endmubyte +\mubyte \warntwobytes #2^^c4\endmubyte +\mubyte \warntwobytes #2^^c5\endmubyte +% atd... +\def\warntwobytes #1#2{\message{WARNING: the UTF8 code: + \noconvert#1\noconvert#2 is not defined i my macros.}} +\endtt + +V~tomto příkladě byl použit nový primitiv enc\TeX{}u "\noconvert", +jehož vlastnosti jsou uvedeny později v~kapitole~5. Připomínám také, +že od verze Feb.~2003 nezpůsobují jednoznakové <byte_sequence> kolizi +s~víceznakovými <byte_sequencemi> se stejným začátkem, takže tento +příklad neruší konverzi \uv{známých} UTF-8 kódů. + + + +\sec Rozpoznání začátku řádku +% ------------------------ + +Existují-li v~konverzní tabulce <byte_sequence> +s~prvním znakem shodným s~aktuálním "\endlinechar", +tj.~<byte_sequence> jsou ve tvaru <endlinechar><zbytek>, +pak input procesor navíc ověřuje, zda je <zbytek> shodný se +začátkem každého řádku. Pokud ano, provede požadovanou konverzi. +Příklad použití: + +\begtt +\bgroup \uccode`X=\endlinechar \uppercase{\gdef\echar{X}}\egroup +\mubyte \fooB \echar ABC\endmubyte % vyhovuje ABC na začátku řádku +\mubyte \fooE ABC\echar \endmubyte % vyhovuje ABC na konci řádku +\mubyte \fooW \spce\space ABC\space \endmubyte + % vyhovuje ABC jako slovo s mezerami vpředu i vzadu +\mubyte \foo #\echar ABC\endmubyte % + % je-li ABC na začátku řádku, vloží před něj \foo +\endtt + + +\sec Potlačení expanze v~parametrech write +% ------------------------------------- + +Chceme-li převádět kontrolní sekvence zpětně na <byte_sequence> při +zápisu do "\write" souborů, musíme potlačit případnou expanzi těchto +kontrolních sekvencí například pomocí "\let\macro=\relax". Protože ale +"\write" často pracuje asynchronně a kontrolních sekvencí mapujících +UTF-8 můžeme mít stovky nebo tisíce, umožňuje enc\TeX{} nastavit +v~době expanze parametrů "\write" příslušným kontrolním sekvencím +význam "\relax" automaticky. Dělá to při "\mubyteout>=3" a význam +"\relax" přiřadí právě těm kontrolním sekvencím, které mají +ve výstupní části konverzní tabulky neprázdnou <byte_sequenci>. +Jakékoli jiné expanze mimo parametr "\write" probíhají +normálním způsobem. Příklad: + +\begtt +\mubyte \foo ABC\endmubyte \def\foo{macro body} +\mubyteout=2 +\immediate\write16{testwrite: \foo} % zapíše "testwrite: macro body" +\immediate\write16{testwrite: \noexpand\foo} % zapíše "testwrite: ABC" +\mubyteout=3 +\immediate\write16{testwrite: \foo} % zapíše "testwrite: ABC" +\message{testmessage: \foo} % zapíše "testmessage: macro body" +\message{testmessage: \noexpand\foo} % zapíše "testmessage: \foo" +\edef\a{testedef: \foo} % expanduje na macro body +\foo % expanduje na macro body +\immediate\write16{\meaning\foo} % zapíše "\relax" +\message{\meaning\foo} % zapíše "macro:->macro body" +\endtt + +Pomocí zápisu "\mubyte <control_sequence> \relax \endmubyte" je možno +přidělit kontrolní sekvenci příznak, aby se neexpandovala +v~parametrech "\write" při "\mubyteout>=3", ale na druhé straně nebude +konvertována do žádné <byte_sequence>, ale vypíše se jako obvykle. +Uvedený zápis má tedy stejný význam jako +"\mubyte" <control_sequence>" __\string" <control_sequence>"\space\endmubyte", +ale navíc šetří pamětí \TeX{}u, neboť \TeX{} není nucen ukládat +string <byte_sequence> do poolu. + +Popsanou vlastnost enc\TeX{}u můžete využít k~vytváření vlastních +maker, která jinak expandují v~parametrech "\write" a jinak +\uv{normálně}. Příklad: + +\begtt +\mubyte \writeparameter \relax \endmubyte \def\writeparameter{} +\def\mymacro{\ifx\writeparameter\relax Tady expanduji ve write. + \else Tady expanduji normálně.\fi} +\endtt + + +\sec Asynchronní zpracování příkazu write +% ------------------------------------ + +Je známo, že pokud nepoužijeme "\immediate", pak se argument příkazu +"\write" expanduje až později: ne v~okamžiku výskytu příkazu. +Příkaz "\write" si proto uloží do své paměti aktuální +hodnotu registru "\mubyteout" v~době prvního zpracování a pak +při expanzi a zápisu do souboru tuto hodnotu použije. + +Díky této vlastnosti můžeme třeba pro soubor s~obsahem zapisovat +s~hodnotou "\mubyteout=3" a současně při zápisu do jiného souboru +ponecháme hodnotu "\mubyteout=0". To může být žádoucí +například proto, že soubor je určen ke zpracování programem, který +nemá implementovánu schopnost práce s~UTF-8 kódováním. Vyzkoušejte: + +\begtt +\newwrite\tocfile \newwrite\indexfile +\immediate\openout\tocfile=\jobname.toc +\immediate\openout\indexfile=\jobname.idx +\mubyteout=3 +\write\tocfile{parametr se bude později konvertovat do UTF-8} +{\mubyteout=0 \write\indexfile{parametr zůstane nezměněný bez konverze}} +\write\tocfile{zde se znovu provede konverze} +\end % a teprve v tento okamžik se všechny tři zápisy provedou +\endtt + + +\sec Hodnoty registru mubyteout +% -------------------------- + +Kromě již zmíněných hodnot 0, 1, 2 a 3 registru "\mubyteout" může být +někdy užitečné nastavit tento registr na hodnoty $-1$, $-2$ a $-3$. +Význam těchto hodnot je vysvětlen v~následující tabulce: + +\vbox{ +\begtt +\mubyteout <byte>-><byte_sequence> <cs_name>-><byte_sequence> potlačení expanze +---------------------------------------------------------------------------- + 0 ne ne ne + 1 ano ne ne + 2 ano ano ne + 3 ano ano ano + -1 ano ne ano + -2 ne ne ano +\endtt +\relax} + +Je-li zapnutá konverze <byte>"->"<byte_sequence>, pak se tato konverze +provádí i do logu a na terminál, zatímco konverze +<cs_name>"->"<byte_sequence> a potlačení +expanze se týkají jen argumentů "\write" a "\special". + + +\kap Argumenty primitivu special + %%%%%%%%%%%%%%%%%%%%%%%%%%% + +V~argumentech "\special" se často objevují texty +v~přirozeném jazyce (například texty pro záložky do PDF dokumentu). +Při stále častějším používání UTF-8 je žádoucí, aby tyto texty byly +kódovány v~tomto kódování. Enc\TeX{} tuto možnost nabízí. + +Argument primitivu "\special" je zpracován podle hodnoty celočíselného +registru "\specialout", který má implicitní hodnotu~0. + +\begitems +* "\speialout=0" -- žádná konverze argumentu se neprovede. +* "\speialout=1" -- provede se konverze jen podle vektoru xchr. +* "\speialout=2" -- provede se konverze jen podle hodnoty "\mubyteout". +* "\speialout=3" -- provede se konverze podle hodnoty "\mubyteout" + následovaná konverzí podle xchr. +\enditems + +Primitiv "\special" expanduje svůj argument okamžitě. Při +"\specialout" 2 nebo 3 se expanze provede podle hodnoty "\mubyteout" +stejně jako u~primitivu "\write". Pak si příkaz "\special" uloží do +paměti aktuální hodnoty "\specialout" a "\mubyteout" a tyto hodnoty +použije ještě jednou při skutečném výstupu argumentu do "dvi" souboru. + + +\kap Primitiv noconvert + %%%%%%%%%%%%%%%%%% + +Enc\TeX{} zavádí primitiv "\noconvert", který +potlačí případnou konverzi následujícího znaku nebo kontrolní sekvence. +Přesněji: primitiv "\noconvert" je neexpandující a v~sazbě neudělá nic +(podobně jako "\relax"). Pokud se ale +tento primitiv vyskytne v~argumentu "\message" nebo "\errmessage", +pak jeho kontrolní sekvence není vůbec vytištěna. Navíc pak následující +znak není konvertován na <byte_sequenci>, ačkoli třeba je "\mubytelog" +kladný a znak je uveden ve výstupní části konverzní tabulky. + +Primitiv "\noconvert" se chová stejně i v~parametrech "\write" a +"\special". V~tomto případě navíc může primitiv "\noconvert" potlačit +konverzi následující kontrolní sekvence, ačkoli je třeba "\mubyteout" +věší než~2. + +Konstrukce "\noconvert\noconvert" vytiskne jedno "\noconvert". + +Pokud se má primitiv "\noconvert" vypsat v~jiných situacích (například +při výpisu kontextu při hlášení o~chybě nebo při různých +"\tracing..."), pak jeho kontrolní sekvence nemizí a navíc +neovlivní tisk následujícího znaku. + + +\kap Seznam primitivů enc\TeX{}u + %%%%%%%%%%%%%%%%%%%%%%%%%%% + +Pro lepší orientaci uvádím přehled nových primitivů enc\TeX{}u: + +\begitems +* "\mubyte" --- zanáší údaje do konverzní tabulky, viz~kap.~3. +* "\endmubyte" --- separátor pro "\mubyte". +* "\mubytein" --- registr integer. 0: vícebytová vstupní konverze + potlačena, 1 a více: vícebytová vstupní konverze je + aktivována. +* "\mubyteout" --- registr integer, ovlivní konverzi do výstupních + souborů "\write" a parametrů "\special", viz~3.10. +* "\mubytelog" --- registr integer, 0: vícebytová výstupní konverze do + logu a na terminál potlačena, 1 a více: vícebytová + výstupní konverze je aktivována. +* "\specialout" --- registr integer, ovlivní zpracování parametrů + "\special", viz~kap.~4. +* "\noconvert" --- podobně jako "\noexpand", ale pro konverze. Viz~kap.~5. +* "\xordcode" --- přístup k~vektoru xord, viz 2.1. +* "\xchrcode" --- přístup k~vektoru xchr, viz 2.1. +* "\xprncode" --- přístup k~vektoru pro tisknutelnost znaků, viz 2.2. +\enditems + +Přehled prefixů při použití +"\mubyte"<first_token><optional_space><prefix><byte_sequence>"\endmubyte". +Znak~"#" zde označuje libovolný token kategorie~6 a znak~"_" označuje +libovolný token kategorie~7. + +\begitems +* žádný prefix --- záznam do vstupní i výstupní tabulky. +* "_" --- záznam jen do vstupní části tabulky +* "__" --- záznam jen do výstupní části tabulky +* "#<číslo>" --- vložení kontrolní sekvence, následujících <číslo> znaků + ponechá input procesor beze změny. +* "\relax" --- kontrolní sekvence nebude expandovat v~parametrech "\write" +\enditems + +Další prefixy se mohou objevit v~budoucích verzích enc\TeX{}u. Vždy +budou mít kategorie odlišné od 11 a 12, takže pro začátek +<byte_sequence> je vhodné v~makrech použít token kategorie 11 nebo 12, +aby se předešlo případnému konfliktu s~budoucí vezí enc\TeX{}u. + + +\kap Dokumentace k~přiloženým souborům maker + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Tato část dokumentace nebyla ve verzi Dec. 2002 revidovaná a je +ponechána ve stavu z~roku 1997 s~výjimkou následujícího odstavce. + +\sec Kódování UTF-8 +% -------------- + +Pro vstupní kódování UTF-8 jsou připraveny soubory "utf8-csf.tex" a +"utf8-t1.tex". V~tomto případě je překódování implementováno pomocí +"\mubyte" a vektory xord, xchr jsou nastaveny tak, že na jejich úrovni +je zachováno identické zobrazení. + +\sec Formáty typu {\tt plain-x-y} +% ---------------------------- + +V~balíčku jsou připraveny inicializační soubory pro vygenerování formátu +podobnému standardnímu formátu plain. Například příkazem + +\begtt +$ tex -ini -enc plain-1250-cs +\endtt + +vygenerujeme formát analogický plainu, který čte vstupní soubory +v~kódování CP1250 a pracuje s~CS-fonty. + +V~balíku jsou k~dispozici tyto inicializační soubory pro plain: + +\begtt +plain-il2-cs ... vstup podle ISO8859-2, textové fonty v TeXu: CS-font +plain-kam-cs ... vstup podle Kamenických, 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 Kamenických, 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 +\endtt + +\sec Poznámka k~dlouhým názvům souborů +% --------------------------------- + +Všechny soubory "*.tex" v~balíčku splňují DOSové omezení na délku názvu +8+3. Výjimkou z~tohoto pravidla jsou pouze soubory plain-x-y popsané +výše a analogické inicializační soubory pro La\TeX{}. Pokud používáte +systém, který je omezen na 8+3, doporučuji pro každé kódování zvolit +jedno písmeno (například c=cs, d=dc, i=il2, w=1250, p=852, k=kam, +o=koi8, m=mac) a nahradit názvy souborů v~distribuci těmito názvy: + +\begtt +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 +\endtt + +Obsah "\message" v~souborech {\tt plain-x-y} neměňte. Například formát +"plain-wc" se po spuštění představí svým plným jménem + +\catcode`\<=12 +\begtt +The format: plain-1250-cs <Sep. 1997>. +\endtt +\catcode`\<=13 + +\sec Kódovací tabulky +% ---------------- + +Protože změna vektorů xord a 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 "\xordcode", +"\xchrcode" a "\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 tex. Říkáme jim +kódovací tabulky. Rozlišujeme dva typy kódovacích tabulek. + + +\sec 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 +xord vektor tak, aby mapoval znaky z~ISO-8859-2 do T1 a vektor xchr musí +převádět zpátky z~T1 do kódování systému. + +Tento typ tabulek je použit v~inicializačních souborech "plain-*.tex" a +obsahuje v~názvu souboru vstupní i cílové vnitřní kódování \TeX{}u. Podívejte +se, jak vypadá například tabulka "il2-t1.tex", která definuje vnitřní +kódování \TeX{}u podle Corku a vstupní kódování ISO8859-2. + +Každá tabulka prvního typu čte soubor "encmacro.tex" s~definicemi maker +"\setcharcode", "\expandto", "\texaccent", "\texmacro" a "\redefaccent". + +\begitems +* "\setcharcode #1 #2 #3 #4 #5 #6 #7" deklaruje \TeX{}ové kódy pro jeden znak. + Nastaví xord["#1"]="#2", xchr["#2"]="#1", "\xprncode#2"="#7" a + postupně nastaví "\lccode", "\uccode", "\sfcode" a "\catcode" znaku + s~kódem "#2" na hodnoty "#3", "#4", "#5" a "#6". + Je-li "#1" otazník, pak se xord a xchr nenastaví. + +* "\expandto {<definice>}" definuje aktivní podobu znaku "#2" z~posledního + "\setcharcode" tak, že tento token expanduje na <definici>. Podrobněji: + je-li v~"\setcharcode" uvedeno "#6=13", pak bude každý výskyt znaku "#2" + expandovat na <definici>. Není-li v~"\setcharcode" řečeno "#6=13", pak + k~expanzi znaku "#2" na <definici> dojde teprve tehdy, když bude + (třeba později) nastaveno "\catcode" znaku "#2" na "13". + +* "\texaccent" uv{zápis akcentu} připravuje expanzi \uv{zápisu akcentu} + na znak s~kódem "#2" z~naposledy použitého "\setcharcode". Například + zápis "\v C" bude po načtení souboru il2-t1.tex expandovat na znak + s~kódem {\tt\char`\"83}. Pokud zápis pro akcent není v~tabulce uveden, + zůstává v~původním významu, tj. třeba "\v g" expanduje na primitiv + "\accent", který usadí háček nad písmeno g. + K~aktivaci všech \uv{zápisů akcentu} dojde až po použití makra + "\redefaccent" (viz níže). + +* "\texmacro #1" deklaruje makro "#1" tak, že bude expandovat na znak s~kódem + "#2" z~naposledy použitého "\setcharcode". K~předefinování makra "#1" + dojde (na rozdíl od "\texaccent") okamžitě. Například makro "\S" bude + po načtení souboru "il2-t1.tex" expandovat na znak s~kódem "9F", protože + na této pozici je podle Corku znak paragraf. + +* "\redefaccent #1" aktivuje expanzi zápisů podle "\texaccent" pro jeden + konkrétní akcent "#1". +\enditems + +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 "t1macro.tex". +Definují se tam sekvence "\promile", "\clqq" a další. + +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 "\setcharcode" až "\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 jsou připraveny tyto tabulky prvního druhu: + +\begtt +Název souboru vstupní kódování vnitřní kódování TeXu +------------------------------------------------------------- +il2-csf.tex ISO8859-2 CS-font +kam-csf.tex Kamenických 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 Kamenických T1 alias Cork +1250-t1.tex CP1250, MS-Windows T1 alias Cork +852-t1.tex CP852, PC Latin2 T1 alias Cork +\endtt + +Za zmínku stojí první uvedená tabulka "il2-csf.tex", protože ta +jediná ponechává vektory xord a xchr beze změny. Tuto tabulku +je tedy možné použít i v~\TeX{}u, který neobsahuje rozšíření +enc\TeX{}. Všechny ostatní tabulky enc\TeX{} explicitně vyžadují. + + +\sec 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. "t1" nebo "csf"), ale značku používanou pro kódování operačního systému +(např. "il2", "kam"). Třeba tabulka "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 xchr, ale výstupní vektor 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 +log, 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 "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 "*-il2.tex", třeba: + +\begtt +\input kam-il2 +\input dokument +\restoreinputencoding +nyní mohu pracovat v původním kódování... +\end +\endtt + +V~době, kdy probíhá načítání souboru 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 logu máme v~ISO8859-2. V~tomto +kódování je také zapsán další text pod "\restoreinputencoding". +Tabulka totiž deklaruje toto makro, aby byl možný návrat k~původnímu +nastavení vektoru 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 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 "\dump" v~situaci, +kdy máme načtenou tabulku druhého typu. + +\end + + + + + + + + + |