**************************************************************** * Program a2ac * **************************************************************** verze 1, Červen 95 Petr Olšák Program a2ac (Afm To Afm add Composites) konvertuje afm soubory (Adobe Font Metrics) na nové soubory rovněž ve formátu afm. Program přitom načítá tzv. definiční soubor, v němž je stanoveno, jaké změny se mají v afm formátu provést. Program především přidává nové kompozitní znaky a rozšiřuje tabulku kernů o nové kerningové údaje podle jistých masek. Program se volá se třemi parametry: a2ac input.afm corr.tab output.afm První parametr je název vstupního (afm) souboru, druhý parametr označuje definiční soubor obsahující definice změn, které se mají provést. Třetí parametr je název výstupního souboru. Přípony souborů (.afm, .tab) je nutno uvést, program si je nedomyslí. Pokud chceme vytvořit log a nechceme zaplnit terminál množstvím informací, můžeme napsat: a2ac input.afm corr.tab output.afm > logfile Příkazový řádek volání programu bývá obvykle součástí nějakého scriptu nebo dávkového souboru (viz též soubor readme.txt v balíku programu a2ac). K balíku programu je přidán soubor cscorr.tab, který obsahuje definice korekcí, pomocí nichž lze vytvořit český a slovenský font (tj. font obsahující znaky české a slovenské abecedy a vhodný kerning). Při použití tohoto souboru se pouze vyžaduje, aby vstupní afm soubor obsahoval všechny akcenty pro české/slovenské znaky. To splňují např. všechny standardní Adobe fonty. Výstupem je afm, obsahující navíc kompozitní znaky z cs abecedy a rozšířený kerning. Takto upravený font se dá použít například v TeXu. Pro zařazení nového fontu do TeXu je možno použít script "mkfnt". Ručně se zařazení provede v následujících krocích: (pro ilustraci výchozí standarní PostScriptový font má metriku s názvem font.afm). 1. a2ac font.afm cscorr.tab cfont.afm ... vytvoří se metrika cfont.afm se všemi akcentovanými znaky. 2. afm2tfm cfont.afm -t xil2.enc -v cfont rfont ... vytvoří se metrika rfont.tfm (potřebná pro další manipulace s programem dvips) a virtuální popis cfont.vpl kódovaný podle souboru xil2.enc. 3. vptovf cfont.vpl cfont.vf cfont.tfm ... vytvoří se metrika vhodná pro TeX (cfont.tfm) a virtuální popis cfont.vf pro ovladač dvips. 4. Obě tfm metriky (cfont, rfont) uložíme do adresáře s metrikami a soubor cfont.vf uložíme do adresáře, kde jej čte dvips. V konfiguračním souboru pro dvips s názvem psfonts.map přidáme řádek: rfont Uplny-Nazev-PostScriptoveho-Fontu Pokud font není rezidentně v tiskárně a máme tedy od něj soubor typu pfb, pak nový řádek v psfonts.map bude mít tvar: rfont Uplny-Nazev-PostScriptoveho-Fontu csr10) (MAPFONT D 0 (FONTNAME csr10) (FONTCHECKSUM D 0) (FONTAT R 1.0) ) - mv csr10.pl cptrm.vpl ... přejmenuj csr10.pl na cptrm.vpl (v DOSu: ren) - vptovf cptmr.vpl cptmr.vf cptmr.tfm ... soubor tfm zahodíme a soubor vf předložíme ovladači, který má použít náhradní font. Pozor! Nikoli pro ovladač dvips. Kutání do hloubky ================= Z předchozího odstavce je patrné, že byly použity dva soubory, jejichž změnou můžeme věc více přizůsobit obrazu svému. Za prvé se jedná o soubor cscorr.tab a za druhé jde o soubor xil2.enc. O jejich významu bude řeč v následujícím textu. AFM metrika obsahuje informace o symbolických názvech znaků (např. Scaron znamená Š, Uring je Ů a eacute je é). Každý použitý název může být podchycen v metrice dvěma způsoby. Buď je vázán na konkrétní pozici ve fontu (kód), nebo má kód označen hodnotou -1 a je popsán v metrice jako složenina jiných znaků. Popis složených (kompozitních) znaků se přitom opírá o symbolické názvy, takže není závislý na kódování fontu. Základní myšlenka programu a2ac je založena na tom, že v definičním souboru (například cscorr.tab) popíšeme všechny potřebné složeniny pomocí symbolických znaků a program a2ac je do metriky doplní. Výstupní afm soubor programu a2ac tedy většinou obsahuje větší množství kompozitních znaků a navíc v něm mohou být doplněny kerningové vztahy s těmito novými znaky. Protože program pracuje na úrovni symbolických názvů znaků, jeho činnost je naprosto nezávislá na kódování jak PostScriptového fontu, tak vnitřního kódování sázecího systému, pro který se font připravuje. Program a2ac je při čtení definičního souboru vybaven nenulovou inteligencí. Umožňuje deklarovat a používat proměnné, psát metrické a kompozitní informace pomocí jednoduchých výrazů a pomocí masky kernů doplňovat rozsáhlé množství nových kerningových informací pro nové znaky. Po transformaci afm metriky programem a2ac se pro TeX může použít program afm2tfm, který čte upravený soubor afm a dále soubor *.enc, podle něhož provádí překódování fontu do kódování použitém v TeXu. Výsledkem je virtuální font, který obsahuje nejen překódování fontu podle souboru *.enc, ale obsahuje též mechanismy na sestavení všech kompozitních znaků. Tyto mechanismy byly přitom sázecímu systému vnuceny pomocí popisu kompozitních znaků v souboru afm. O to se postaral program a2ac prostřednictvím souboru typu cscorr.tab. Popis chování programu ====================== Program pracuje ve třech krocích. 1. Načte vstupní soubor afm a informace uloží do paměti. 2. Provede v paměti změny podle definičního souboru. 3. Uloží obsah paměti do výstupního afm souboru. V druhém kroku se provádějí tyto operace: a) Definují se pracovní proměnné a ukládají se do nich hodnoty. b) Sestavují se nové kompozitní znaky. c) Provádí se korekce některých metrických informací. d) Provádí se případná redukce množství kerningových informací. e) Definují se kerny nové. Operace se provádějí v pořadí daném obsahem definičního souboru. Pokyny pro provedení operací c) až e) jsou ignorovány, pokud má font parametr IsFixedPitch roven hodnotě "true", tj. jedná se o font s pevnou šířkou písmen -- např. font psacího stroje. Formát definičního souboru ========================== Doporučuje se při vytváření nových definičních souborů vyjít z dodávaného souboru cscorr.tab. Jedná se o textový soubor. Řádky souboru se dělí na výkonné a komentářové. Výkonné řádky jsou z kraje (bez mezer) uvedeny tzv. prefixem. Jedná se zpravidla o dva až tři znaky na začátku řádku, viz níže. Komentářové řádky jsou všechny ostatní řádky, které nemají žádný z níže stanovených prefixů. Doporučuje se uvést každý komentářový řádek nějakým symbolem tak, aby nikdy nedošlo ke krytí s prefixem. Stačí mezera, ale vhodnější asi je použít znak % nebo #. Komentáře se nesmí vyskytovat uvnitř výkonného řádku. Přehled prefixů: >> .......... definice proměnných (viz a) NC, RC, !C ... definice nového kompozitního znaku (viz b) RWX .......... korekce parametru WX (viz c) ReduceKerns .. snížení počtu kerningových informací (viz d) NK, RK ....... vytváření nových kerningových informací (viz e). Pořadí výkonných řádků není pevně stanoveno. Podle tohoto pořadí se budou jednotlivé operace provádět. Operace, které vycházejí z existence symbolického jména nějakého znaku, musejí být uvedeny později, než je symbolické jméno definováno. Například pomocí definice kompozitního znaku zavedeme jméno Rcaron a teprve pak můžeme vytvářet nové kerningové páry se znakem Rcaron. Nedodržíme-li tento požadavek, dočkáme se chybového hlášení "Undefined identifier". a) Definice proměnných. ----------------------- Řádek, který definuje proměnnou, má tento formát: >> NazevPromenne = výraz kde ">>" je prefix, "NazevPromenne" je identifikátor proměnné a "výraz" je ve srovnání s běžnými výrazy syntakticky omezený. Výraz je součtem sčítanců, z nichž každý sčítanec může být tímto syntaktickým celkem: - číslo, - dříve definovaná proměnná, - volání funkce b, w, h nebo W, - součin čísla a proměnné, - součin čísla a funkce. Hodnoty jednotlivých sčítanců jsou celá čísla a sčítá se na úrovni celých čísel. Do proměnných je tedy možno uložit pouze celé číslo. Identifikátor může sestávat z alfanumerických znaků nebo znaku _. První znak musí být písmeno. Délka identifikátoru není omezena. Velká a malá písmena se všude rozlišují. Desetinné číslo je možné použít pouze jako konstantu a má smysl pouze v případě součinu čísla s proměnnou nebo funkcí. Výsledek součinu se hned konvertuje do celého čísla, přičemž se provede zaokrouhlení. Čísla tedy mohou obsahovat desetinnou tečku. V zápisu součinu mezi číslem a proměnnou nebo funkcí se nesmí použít mezi těmito objekty žádný znak, tj. běžné násobítko ve tvaru * není povoleno. Závorky (s vyjímkou použití u funkcí), vnoření operací, násobení dvou proměnných a dělení není povoleno. Funkce b, w, h, W nebo k musí mít hned za svým identifikátorem v kulatých závorkách napsaný jeden parametr. V případě funkce b nebo k se jedná o dva parametry oddělené čárkou. Parametrem je symbolický název znaku a u funkce b ještě následuje číslo od 1 do 4. Funkce vracejí do výrazu tyto hodnoty: b(znak,i) ... i tá hodnota parametru BoudingBox pro znak. Přesněji: b(znak,1) ... levý průmět znaku (souřadnice x), b(znak,2) ... dolní průmět znaku (souřadnice y), b(znak,3) ... pravý průmět znaku (souřadnice x), b(znak,4) ... horní průmět znaku (souřadnice y). w(znak) ... šířka znaku = b(znak,3) - b(znak,1). h(znak) ... celková výška znaku = b(znak,4) - b(znak,2). W(znak) ... hodnota WX pro daný znak. k(znak1,znak2) . hodnota kernu pro dvojici znak1 znak2 (nula, pokud kern pro dvojici neexistuje). Příklady výrazů najdete v souboru cscorr.tab. Při zahájení zpracování pole definic proměnných jsou známy hodnoty těchto proměnných: CapHeight, XHeight, Ascender, Descender (pouze ovšem za předpokladu, že jsou o nich vyplněny údaje ve vstupní afm metrice). V průběhu "výpočtu" je možné měnit hodnotu stejné proměnné tím, že se řádek deklarující proměnnou napíše znova s jiným výrazem. V takovém případě je možné ve výrazu využít starou hodnotu této proměnné. Například: >> Acutetop = Acutetop + 7 !! Důležitá poznámka: Mezery je možno vkládat do výrazu (kamkoli) pouze v řádcích definic pracovních proměnných. Ve všech ostatních výkonných řádcích tento výraz NESMÍ obsahovat jedinou mezeru! Mezera má v těchto řádcích význam delimitační a ukončuje načítání výrazu. b) Definice nového kompozitního znaku ------------------------------------- Řádek definuje jeden kompozitní znak podobně jako ve formátu afm. Řádek může být uveden třemi prefixy: NC ... New Composite -- Sestavení nového kompozitního znaku. Pokud ve vstupní metrice znak existuje (definovaný jako kompozitní nebo fyzický), originální definice se nepřepisuje. RC ... Rewrite Composite -- Sestaví nový znak. Pokud je znak v původní metrice definován jako kompozitní, tato definice je přepsána. !C ... Sestaví nový znak jako kompozitní, a případně přepíše původní definici znaku, třebaže je původní znak fyzickým znakem fontu. Následuje název znaku a počet částí (dílků), ze kterých se kompozitní znak skládá (maximálně 10). Pak je za středníkem premisa PCC následovaná názvem prvního dílku znaku se dvěma parametry oddělenými mezerami. Parametry udávají posun dílku vůči počátku v souřadnici x a y. Pak za středníkem je totéž pro druhý a další dílek. Všechny číselné parametry (kromě čísla udávajícího počet dílků) mohou být výrazy (viz výše). Výrazy jsou odděleny od sebe mezerami. Kromě premisy PCC se mohou použít ještě následující premisy: PAC, PCT, PAT. Premisy deklarují interpretaci následných číselných parametrů, které při standardním použití (písmeno C) udávají posun dílku vůči počátku. Premisa s písmenem A (axis) v druhé pozici říká, že údaj pro x-ovou souřadnici posunu dílku vyjadřuje posun osy dílku vzhledem k ose základního (tj. prvního) dílku v kompozitním znaku. Například "PAC caron 0 cosi" znamená, že osa znaku caron bude od osy základního znaku kompozitu vychýlena o 0, tj. osy se budou krýt. Kladná hodnota posunuje doprava, záporná doleva. Abychom definovali přesně osu znaku, uvažujme vodorovnou úsečku o délce WX daného znaku. První konec této úsečky je v počátku a druhý směřuje doprava. Osa znaku prochází středem této úsečky a svírá s ní úhel 90+ItalicAngle stupňů. Premisa s písmenem T (top) na třetí pozici říká, že y-ová souřadnice posunu dílku se počítá z parametru, který označuje hodnotu horního okraje dílku. Například v souboru cscorr.tab je napočítána hodnota Acutetop jako výška velkého písmene s akcentem. Pak jsou všechny akcenty povýšeny na tuto výšku jednoduše pomocí zápisu P?T cosi Acutetop. Tím je dosaženo toho, že všechny akcenty mají stejnou výšku, ačkoli velikosti písmen se nepatrně liší (např, O kvůli optickému klamu přesahuje horní i dolní okraj. Je-li použita jiná premisa, než PCC, program údaje přepočítá a na výstupu použije pouze premisy PCC. !! Důležitá poznámka: Mezery jsou v celém řádku významné, tj. třeba mezery před a za středníkem tam nejsou jenom pro okrasu. Žádnou mezeru nelze bezstarostně vynechat. Jedna mezera a více mezer totéž jsou, tj. může se vkládáním většího počtu mezer docílit jisté přehlednosti tím, že budou všechny údaje zarovnány pod sebou. c) Korekce parametru WX ----------------------- Sázecí systémy používají při sazbě znaků z fontu parametr posunu sázecího bodu každého znaku, který s BoudingBoxy nemusí mít mnoho společného. Posun sázecího bodu ve směru osy x je dán parametrem WX pro každý znak. (Pro evropské jazyky je posun ve směru osy y nulový). Tento údaj se např. do TeXu promítne jako šířka boxu pro znak (výška a hloubka se počítá z BoudingBoxů). Při počítání nových kompozitních znaků program napočítá pro každý znak nové hodnoty BoudingBoxů a pro parametr WX použije hodnotu WX z prvního (základního) dílku kompozitu. To nemusí být vždy vyhovující (viz znaky ť, ď). Proto lze použít řádky definující novou hodnotu WX. Každý řádek má tvar: RWX nazev vyraz kde "RWX" je pevná premisa, "nazev" je názem znaku, u kterého měníme hodnotu WX a "vyraz" vrací novou hodnotu WX. "vyraz" musí splňovat výše uvedená syntaktická omezení a nesmí obsahovat mezeru. Hodnota výrazu se může opírat o původní hodnotu WX znaku (použitím funkce W). d) Snížení počtu kerningových informací --------------------------------------- Řádek má tvar ReduceKerns vyraz a způsobí vymazání všech kerningových informací, které definují kern mezi dvěma písmeny v absolutní hodnotě menší nebo roven hodnotě "vyraz". "vyraz" má výše uvedená syntaktická omezení a píše se bez mezer. Tento řádek je užitečný pro vymazání kernů s nulovou nebo nepatrnou velikostí. Tyto kerny zbytečně zabírají místo v metrice fontu sázecího systému. Řádek je užitečné použít dvakrát. Nejprve na začátku definičního souboru (způsobí vymazání zbytečných kerningových informací získaných přímo ze vstupního souboru) a podruhé na konci (vymaže nově vzniklé informace s malou absolutní hodnotou kernu). Chceme-li být čistotní, je rozumné použít aspoň "ReduceKerns 0" na konci souboru. e) Vytváření nových kerningových informací ------------------------------------------ Řádek definující nové kerningové páry může mít jeden ze dvou prefixů: NK ... (New Kern), nový kern, pokud kern pro danou dvojici existuje, zůstane zachován. RK ... (Rewrite Kern), nový kern, pokud kern pro danou dvojici existuje, bude přepsán. Další pokračování řádku může být různé, viz následující body (i) až (v): (i) Pevná definice kernu jediného páru je ve tvaru: --------------------------------------------------- prefix prvni druhy vyraz kde "prefix" je NK nebo RK, "prvni" je název prvního znaku, "druhy" je název druhého znaku a "vyraz" (bez mezer) vrací hodnotu kernu. (ii) Definice kernu jediného páru podle hodnoty jiného páru ----------------------------------------------------------- Řádek má tvar prefix prvni druhy : treti ctvrty vyraz kde dvojice znaků se jmény "prvni" "druhy" dostane stejný kern, jako dvojice "treti" "ctvrty" zvětšený o hodnotu "vyraz". Parametr "vyraz" (bez mezer) je nepovinný a není-li uveden, je počítáno, že má hodnotu 0. Místo znaku "treti" anebo "ctvrty" může být uveden symbol "*". Vynechaný znak "treti" se doplní znakem "prvni" a vynechaný znak "ctvrty" se doplní znakem "druhy". Například: NK Anew B : A * je totéž jako NK Anew B : A B Chceme-li zvětšit kern mezi A a B o hodnotu c, napíšeme: RK A B : * * +c (iii) Definice skupiny kernů podle masky: ----------------------------------------- Řádek má stejný tvar, jako v předchozím případě, ovšem symbol "*" je uveden nejen za dvojtečkou ale i před ní. Tyto symboly se musí krýt, tj. pokud je znak "prvni" nahrazen, musí být nahrazen též znak "třetí". Symboly nahrazení jsou dva -- tečka nebo hvězdička -- a musí být v obou případech stejné. Řádek definuje kerny podle hodnot kernů všech dvojic, které lze sestavit vpravo od dvojtečky a jsou v paměti, doplněním postupně všech znaků za vynechaný znak. Je-li symbol nahrazení "*", doplňují se všechny znaky, je-li použita tečka, doplňují se jen malá písmena (názvy znaků, které začínají malými písmeny). Vše osvětlí příklad. Nechť máme v paměti kern hodnoty 1 pro A B, hodnoty 2 pro A C a hodnoty 3 pro A D. Nechť jiné kerny s písmenem A na začátku dvojice neexistují. Pak řádek NK Anew * : A * definuje kern hodnoty 1 pro Anew B, dále kern hodnoty 2 pro Anew C a konečně kern hodnoty 3 pro Anew D. Definují se tedy celkem tři kerny. V levo od dvojtečky je možno nahradit (hvězdičkou nebo tečkou) jen jediné jméno z dvojice. Na druhé straně vpravo od dvojtečky je možné napsat hvězdičku i na místo proti jménu. Například: RK Anew * : * * +c je totéž jako RK Anew * : Anew * +c tj. všechny kerny typu Anew * se zvětší o c. (iv) Jeden řádek je zkratkou za dva: ------------------------------------ Řádek má tvar: prefix prvni : druhy a nahrazuje dva řádky: prefix prvni * : druhy * prefix * prvni : * druhy (v) Výčty v řádcích definujících kerny: --------------------------------------- Symbolické jméno je možné nahradit výčtem symbolických jmen oddělených čárkami. Výčet je uzavřen do závorek a nesmí obsahovat mezery a další výčty. Jméno je možné nahradit výčtem v případech, které jsou shrnuty v následující tabulce. Slovo "vycet" znamená jedno jméno nebo výčet jmen, zatímco "single" je jedno jméno, které nesmí být nahrazeno výčtem. Slovo "vyraz" je nepovinný výraz. Tabulka zároveň shrnuje všechny syntaktické možnosti definování nových kernů. (i) prefix vycet vycet vyraz (ii) prefix vycet vycet : single single vyraz prefix vycet vycet : single * vyraz prefix vycet vycet : * single vyraz prefix vycet vycet : * * vyraz (iii) prefix vycet * : single * vyraz prefix vycet * : * * vyraz prefix * vycet : * single vyraz prefix * vycet : * * vyraz (iv) prefix vycet : single Hvězdičky v tabulce (iii) lze nahradit tečkami. Vidíme, že není dovoleno zapsat výčet za dvojtečku. Výčty se expandují do více řádků s postupně všemi jmény z výčtu. To se děje před spuštěním algoritmů podle (ii), (iii) a (iv). Jsou-li v jednom řádku dva výčty, pak se příkaz rozvine křížovým způsobem. Například: NK (A,B,C) (x,y) : * one se expanduje do šesti řádků: NK A x : * one NK A x : A one NK A y : * one NK A y : A one NK B x : * one což se interpretuje podle (ii) jako: NK B x : B one NK B y : * one NK B y : B one NK C x : * one NK C x : C one NK C y : * one NK C y : C one Ligatury ======== Informace o ligaturách bývá uvedena na konci řádků s prefixem C ve vstupním afm souboru. Například: C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ; Tato informace se přepíše do výstupního afm souboru a pro vytvoření záznamu v tabulce ligatur pro sázecí systémy je dostačující. Skutečně, např. program afm2tfm čte tyto údaje a vytváří odpovídající záznam v ligační tabulce pro formát tfm. Navíc se dají prostřednictvím souborů typu *.enc definovat nové, speciálně TeXovské, ligatury. Například řádek v souboru xl2.enc: % LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ; definuje ligatury pro "--" a "---". Poznámka k souboru cscorr.tab ============================= Pro znaky ď, ť by se správně měly použít symbolické názvy dquoteright a tquoteright. Místo nich byly ale použity symbolické názvy dcaron a tcaron. Důvod je ten, že tyto znaky mají svůj protějšek v kapitálkách nazvaný správně Dcaron a Tcaron. Kdybychom nazvali písmeno ď jako dquoteright, pak by použití parametru -V v programu afm2tfm pro vytvoření fontu "Capitals and Small Capitals" nedalo správný výsledek. Abychom nezaváděli nová symbolická označení pro Ľ a ľ, zůstali jsme i zde u názvu Lcaron a lcaron. Poznámka k souboru xil2.enc =========================== Kódovací soubor definuje tzv. CSencoding vector, tj. kódování CS-fontů. Kódování CS-fontů je patrné z tabulky na str. 3 po zpracování souboru ctimne.tex v CSTeXu. Přesnější tabulka je v dodatku F v [2]. Soubor xil2.enc je návrhem na standard kódování PostScriptových fontů v CSTeXu. Dolní polovina tabulky se přesně kryje s CM kódováním a horní polovina tabulky odpovídá normě ISO-8859 Latin2 kódování až na dvě výjimky (umístění českých uvozovek v posledních dvou pozicích). Toto kódování je nadmnožinou kódování CS-fontů. Znamená to, že pokud výchozí PostScriptový font definuje všechny znaky, které jsou použity v CS-fontech, pak se všechny znaky z CS-fontu budou krýt se znaky v sestaveném PostScriptovém virtuálním fontu. Navíc jsou definovány pozice podle ISO-8859 pro další znaky, které se mohou vyskytovat ve výchozím fontu ale nejsou v CS-fontech (např. přeškrtnuté l). V CSencoding vektoru je jedna výjimka proti kódování CS-fontů. V tabulkách Adobe Encoding vektorů neexistuje samostatně škrtátko pro polské l (CM: Cross for Polish l and L, kód 32), takže zůstalo v CSencoding vektoru nedefinováno. Podrobněji o problematice kódování fontů -- viz [3]. Poznamenejme, že většinou nejsou výchozím fontem pokryty první pozice CM kódování odpovídající řeckým znakům a trojnásobným ligaturám. Pro speciální aplikace -- použití TeXovské sazby matematiky PostScriptovým fontem je tedy vhodné editovat soubor *.vpl tak, aby se pokryly aspoň řecké znaky z fontu Symbol. Historie ======== Verze 0 - Vznik programu a české dokumentace. Program byl vystaven na ftp pro české a slovenské TeX-kouzelníky. Verze 1 <Červen 1995> - Nový formát definičních souborů umožňuje libovolné pořadí operací. Starý definiční soubor bude fungovat právě tehdy, když se přidá před každý řádek, definující proměnnou, prefix ve tvaru ">>". - Jsou možné zkratky jednoho řádku za dva (viz odst. e, (iv)) a výčty jmen, které uspoří ještě více řádků (viz odst. e, (v)). - Zavedena nová funkce "k" vracející hodnotu kerningového páru. - Opraveny některé chyby: . Opravena nestabilita UNIXového a2ac na DOSosvkém formátu vstupních souborů (nešťastné ^M na konci každého řádku). . Chybí-li pole "Composites" ve vstupní metrice, ve výstupní se už objeví. . Výstupní soubor se nevytvoří, pokud se narazí na chybu ve vstupu. . Opravena česká dokumentace a přidána (pseudo)anglická. . Přeuspořádán soubor cscorr.tab a přidány některé chybějící údaje. Reference ========= [1] Donald Knuth: Virtual fonts, a more fun for grand wizards. TUGboat 11/89 [2] Petr Olšák: Typografický sytém TeX. CSTUG 1995, 270 stran. ISBN 80-901950-0-8. [3] Petr Olšák: Úvaha o fontech v CSTeXu, TeXbulletin 3/93 (121--131).