<meta http-equiv="Content

Transkript

<meta http-equiv="Content
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/1998/REC-html40-19980424/strict.dtd" >
<html lang="cs">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF8"> </head>
<body id="www-abclinuxu-cz">
<h1>TeX – 4 (kódování znaků)</h1>
<div class="cl_perex">
U&nbsp;tak složitého systému, jakým je TeX, se občas bohužel stane, že ne vše
funguje jak má. V&nbsp;takovém případě uživatelům asi nepostačí jen znalost
autorského značkování a&nbsp;musejí se zanořit poněkud do hloubky mezi nánosy všeho
možného, co přinesla dlouholetá historie TeXu. V&nbsp;tomto díle seriálu si ukážeme,
jak TeX přistupoval a&nbsp;přistupuje ke kódování znaků textových fontů. Aspoň
rámcový přehled v&nbsp;této problematice se jistě vyplatí.</div>
<h2>Kódování znaků v&nbsp;diluviálním TeXu a&nbsp;nyní</h2>
<p>Původně Knuth rozhodl, že TeX bude interně pracovat v&nbsp;ASCII kódování. Na 94
viditelných ASCII znaků navázaly pro TeX připravené a&nbsp;<i>zhruba</i> stejně
kódované Computer Modern fonty. Co Knuth neměl na své klávesnici a&nbsp;chtěl
tisknout, na to si připravil řídicí sekvenci. Například <code>\ae</code> vytisklo æ.
Takovéto znaky Knuth vpravil do zbývajících míst 128znakové tabulky Computer Modern
fontů. Například znaku æ přidělil pozici 26 a&nbsp;řídicí sekvenci <code>\ae</code>
pak deklaroval v&nbsp;makru plainTeX primitivním příkazem <code>\chardef\ae=26</code>.
Na některé znaky nezbylo ve fontech místo, takže třeba znak paragrafu (§) byl
tištěn makrem <code>\S</code>, které jej dosti nekoncepčně lovilo z&nbsp;doplňkové
sady matematických fontů. Můžeme k&nbsp;tomu mít dnes výhrady, ale uvědomme si, že
se psal rok 1982.</p>
<p>Další vychytávku Knuth vymyslel pro snadné dosažení střední a&nbsp;dlouhé pomlčky:
dvojice <code>--</code> nebo trojice <code>---</code> se proměnila na odpovídající
pomlčku díky tomu, že byla zanesena v&nbsp;tabulce ligatur Computer Modern fontu.
Analogicky se f a&nbsp;i&nbsp;promění automaticky ve fontu na ligaturu fi.
Implementace pomlček jako ligatur taky není příliš ideální. Na druhé straně je to
ergonomické, účelné a&nbsp;přehledné při psaní zdrojových textů: tyto pomlčky ani
nyní na klávesnici přímo přístupné nejsou.</p>
<p>Pro znaky s&nbsp;akcenty měl Knuth připravena další makra, která sestavovala
akcentovaný znak z&nbsp;komponent (například z&nbsp;háčku a&nbsp;písmene). Takže
„české slovo“ se dalo (a&nbsp;dosud dá) napsat jako <code>\v{c}esk\’e slovo</code>.
S&nbsp;takovýmto TeXem jsem se poprvé setkal asi v&nbsp;roce 1990 a&nbsp;prohlásil
jsem, že pokud se to má začít používat v&nbsp;češtině, pak takto rozhodně ne.
A&nbsp;chopili jsme se společně s&nbsp;ostatními zájemci o&nbsp;TeX z&nbsp;tehdejšího
Československa práce...</p>
<p>Dnes existují 16bitové modifikace TeXu (XeTeX a&nbsp;LuaTeX), které pracují
interně v&nbsp;Unicode a&nbsp;se stejně kódovanými fonty. Ovšem cesta k&nbsp;tomuto
stavu byla dlouhá a&nbsp;vedla různými oklikami. Netradičně začnu od konce
a&nbsp;popíšu nejprve možnosti, které nabízejí současné 16bitové TeXy.</p>
<h2>UTF-8 kódování na vstupu a&nbsp;Unicode uvnitř</h2>
<p>Je třeba rozlišovat mezi kódováním vstupního souboru (což musí být UTF-8)
a&nbsp;interním kódováním 16bitového TeXu (Unicode). Konverzi mezi prvním
a&nbsp;druhým světem zajišťuje v&nbsp;TeXu vestavěný input procesor podle
<a href="http://en.wikipedia.org/wiki/UTF-8">jednoduchého pravidla</a>. V&nbsp;TeXu probíhá
i&nbsp;opačná konverze zpět do UTF-8 při ukládání informací do textových souborů
(například pro opakované načtení při sestavení obsahu). Dlužno podotknout, že input
procesor včetně zpětné konverze měl v&nbsp;daleko jednodušší podobě už Knuth ve svém
prvním TeXu: řešil tehdy otázku existence dvou kódování anglické abecedy EBCDIC
a&nbsp;ASCII s&nbsp;tím, že interně v&nbsp;TeXu předpokládal vždy ASCII i&nbsp;na
mašinách, které pracovaly v&nbsp;EBCDIC.</p>
<p>Input procesor konvertující UTF-8 do Unicode (a&nbsp;zpět) je v&nbsp;XeTeXu
implementován „natvrdo“, zatímco v&nbsp;LuaTeXu je řešen pomocí Lua skriptu a&nbsp;je
tedy modifikovatelný. Na interní kódování TeXu musejí navázat stejně kódované vzory
dělení slov jednotlivých jazyků a&nbsp;fonty. V&nbsp;tomto případě tedy vzory dělení
slov a&nbsp;fonty musejí být v&nbsp;Unicode.</p>
<p>Při psaní česky nebo slovensky v&nbsp;16bitovém TeXu jsme nuceni skutečně užít
unicodový font, protože znaky české a&nbsp;slovenské abecedy mají v&nbsp;Unicode
přidělena čísla často větší než 255. Na druhé straně naši evropští kolegové na
západ od nás používající kódovou sadu ISO-8859-1 (francouzi, němci, španělé, atd.)
mohou pro svůj jazyk načíst i&nbsp;starší 8bitový font, protože Unicode se ve
znacích jejich jazyka shoduje s&nbsp;ISO-8859-1. Nejsou tedy odkázáni na fonty jen
ve formátu OpenType. Mají-li nějaký starší oblíbený font v&nbsp;kódování ISO-8859-1,
nemají s&nbsp;tím v&nbsp;XeTeXu ani LuaTeXu (na rozdíl od nás) problém.</p>
<p>Zdrojové dokumenty je potřeba pořizovat za použití vhodného ovladače klávesnice
nebo input metody textového editoru. Tím se dá zcela vyhnout původnímu způsobu
pořizování textů, při kterém platilo pravidlo, že co není na klávesnici, na to se
použije řídicí sekvence. Takže při zapnuté české klávesnici píšeme jednoduše česky.
V&nbsp;editoru Emacs je také speciální input metoda, při které uživatel napíše
<code>\ae</code> a&nbsp;ono se to okamžitě v&nbsp;textovém editoru promění na UTF-8 kód
znaku æ. Nebo zápis <code>---</code> Emacs promění v&nbsp;UTF-8 kód dlouhé pomlčky.
Osobně se domnívám, že nic se nemá přehánět. Tento způsob zápisu totiž svádí
používat UTF-8 kódy třeba i&nbsp;v&nbsp;matematických vzorcích. Porovnejte:</p>
<pre class="kod">
$$ \sum_{n=1}^\infty {1\over n^2} = {\pi^2 \over 6} $$
$$ &#8721;_{n=1}^∞ {1\over n^2} = {π^2 \over 6} $$
</pre>
<p>Aby druhý řádek fungoval, je potřeba mít použité kódy deklarovány jako
odpovídající matematické znaky příkazem <code>\mathcode</code>. V&nbsp;klasickém TeXu
jsou deklarovány jen použité řídicí sekvence <code>\sum</code>, <code>\pi</code>,
<code>\infty</code> pomocí <code>\mathchardef</code>, jak je možné se přesvědčit
například v&nbsp;Knuthově souboru <code>plain.tex</code>.</p>
<p>I&nbsp;formát CSplain je možné vygenerovat s&nbsp;XeTeXem nebo LuaTeXem. CSplain
ale z&nbsp;historických důvodů má implicitně vnitřní kódování il2 (viz níže). Ovšem
je snadné přepnout na jiné kódování (T1 nebo Unicode). Začátek dokumentu
v&nbsp;CSplainu pod 16bitovým TeXem může tedy vypadat třeba takto:</p>
<pre class="kod">
\input ucode
% redefinice maker (závislých na kódování) podle Unicode
\chyph
% vzory dělení češtiny (nyní budou v Unicode)
\input lmfonts % načtení Latin Modern fontů v Unicode
Ahoj světe! Jak se mají žlutí koňové?
\end
</pre>
<h2>Osmibitové období</h2>
<p>Možnost použít unicodové fonty je poměrně nová. Ještě nedávno TeX uměl pracovat
pouze s&nbsp;metrickými údaji fontů s&nbsp;maximálně 256 znaky. Vrátíme se tedy na
počátek 90. let a&nbsp;popíšeme, jak vznikala podpora češtiny a&nbsp;slovenštiny.
Kvůli častému konzervativnímu přístupu TeXistů se některé tyto věci používají
dodnes.</p>
<p>Zhruba v&nbsp;roce 1991 jsme navrhli mírnou modifikaci Computer Modern fontů, tzv.
CSfonty. Ty přidávají kompletní akcentované znaky české a&nbsp;slovenské abecedy do
druhé poloviny tabulky podle ISO-8859-2. Toto kódování se nazývá <b>il2</b>.
Vzory dělení češtiny i&nbsp;slovenštiny jsou do CSplainu načteny v&nbsp;il2
a&nbsp;CSfonty na to navazují. V&nbsp;té době se pro češtinu používalo několik
jednobytových kódování vstupních souborů: ISO-8859-2, CP1250, CP852, KOI8-CS,
Kamenických atd. Mezi různými prostředími dle použitého kódování a&nbsp;interním
kódováním il2 bylo potřeba správně konfigurovat input procesor TeXu, který pro
případ překódování tam i&nbsp;zpět na úrovni „byte to byte“ byl připraven
již Knuthem. Docela podrobně jsem tuto problematiku popsal v&nbsp;článku
<a href="http://petr.olsak.net/ftp/olsak/bulletin/kodovani.pdf">Putování písmene ř z&nbsp;klávesy na
papír</a> (1997).</p>
<p>Na začátku 90. let na konferenci v&nbsp;Corku se TeXisté dohodli a&nbsp;vymezili
evropské kódování fontů. Využili všech tehdy dostupných 256 pozic. První polovina
tabulky respektovala viditelné ASCII znaky, druhá ISO-8859-1 a&nbsp;do volných míst
byly nacpány ostatní znaky latinkou píšících evropanů, tedy i&nbsp;naše abeceda.
Kódování nazvali <b>T1</b> alias <b>Cork</b>. Jádro LaTeXu bylo Jiřím Zlatuškou
upraveno tak, aby dokázalo načíst vzory dělení v&nbsp;obou kódováních (il2 i&nbsp;T1)
a&nbsp;tím vznikl CSLaTeX schopný pracovat jak s&nbsp;CSfonty tak s&nbsp;T1 kódovanými
fonty. Kresby znaků české abecedy byly v&nbsp;CSfontech vydařenější než
v&nbsp;analogickém fontu kódovaném podle T1 a&nbsp;tím se asi vysvětluje, proč
CSLaTeX přežíval dvě desetiletí. Já jsem navíc v&nbsp;il2 kódování připravil
počeštění základních PostSriptových fontů.</p>
<p>Fonty kódované podle T1 byly většinou z&nbsp;různých zdrojů (třeba i&nbsp;bez
akcentovaných znaků) generovány za použití nástroje <code>fontinst</code>, který
vytváří virtuální kompozitní znaky, jež může pak přímo používat TeX. Bohužel
v&nbsp;tomto nástroji byla a&nbsp;je <a href="http://petr.olsak.net/abcserial/chybatd.pdf">chyba
v&nbsp;konfiguraci znaku ď a&nbsp;ť</a>, takže desítky, možná stovky, takto
vytvořených fontů přítomných v&nbsp;TeXové distribuci jsou pro češtinu nepoužitelné.
Když jsem to teprve loni objevil (protože vesměs používám il2 kódované fonty),
docela jsem se podivil, že toto žádný uživatel za těch 20 let nereportoval. Že by
všichni čeští TeXisté užívali výhradně il2?</p>
<p>Kuriózní na T1 kódování je například to, že sice bylo navrženo pro Evropu, ale
stalo se tak v&nbsp;roce 1990, kdy ještě nikdo netušil, že bude existovat znak Euro.
V&nbsp;T1 tabulce najdeme libru, dolar, ale Euro nikoli. Nicméně TeX umožňuje na
úrovni maker snadno připojit ke každému 256znakovému fontu libovolné množství
expertních sad tak, že uživatel ani nepozná, že TeX uvnitř přepíná mezi základním
řezem a&nbsp;k&nbsp;němu připojenou expertní sadou. Viz například soubor maker
<a href="http://petr.olsak.net/abcserial/exchars.tex"><code>exchars.tex</code></a>. V&nbsp;expertní sadě
samozřejmě Euro přítomno je.</p>
<p>Nové fonty například z&nbsp;projektu
<a href="http://www.gust.org.pl/projects/e-foundry/tex-gyre/">TeXGyre</a> jsou primárně připraveny
v&nbsp;OpenType, ale jsou k&nbsp;nim rovněž vygenerovány klasické metriky pro TeX
podle <a href="http://petr.olsak.net/abcserial/kodovani.pdf">rozličných kódování</a>, která se během
osmibitového období narodila a&nbsp;začala v&nbsp;TeXových distribucích přežívat.</p>
<h2>UTF-8 na vstupu, osm bitů uvnitř</h2>
<p>V&nbsp;roce 2000 narůstal požadavek používat UTF-8 kódování vstupních souborů.
V&nbsp;té době byla ještě možnost číst unicodové fonty v&nbsp;nedohlednu, formát
OpenType (2005) neexistoval. Konverze UTF-8 na 8 bitů uvnitř TeXu byla v&nbsp;LaTeXu
řešena na úrovni maker: <code>\usepackage[utf8]{inputenc}</code>. Ovšem takto řešená
konverze přináší na nízké úrovni programování maker docela problémy. Proto jsem
počátkem milénia rozšířil input procesor TeXu tak, aby dokázal kromě „byte to byte“
konverze provádět i&nbsp;konverzi více bytů na jeden byte nebo na řídicí sekvenci.
Počet UTF-8 znaků je sice značný, ale počet řídicích sekvencí, na které se to
automaticky může uvnitř TeXu konvertovat, je víceméně neomezený. Každá řídicí
sekvence může navazovat na své makro, které vyšťourá znak buď z&nbsp;aktuální
základní sady nebo z&nbsp;některé z&nbsp;expertních sad přidružených aktuálnímu
fontu. Toto řešení jsem nazval <a href="http://petr.olsak.net/enctex.html">encTeX</a>.</p>
<p>Současný CSplain nad pdfTeXem s&nbsp;UTF-8 kódovaným vstupem využívá encTeX.
Implicitně rozumí znakům české a&nbsp;slovenské abecedy a&nbsp;textovým
znakům, na které měl Knuth řídicí sekvenci (typu <code>\ae</code>). Po načtení
dalších maker rozumí znakům z&nbsp;dalších částí Unicode tabulky. Například po
<code>\input utf8math</code> je CSplain schopen interpretovat matematické vzorečky
s&nbsp;UTF-8 znaky, jak bylo ukázáno v&nbsp;příkladu v&nbsp;úvodu tohoto článku.</p>
<h2>Historický přehled</h2>
<table border=1 cellpadding=4>
<tr><td>verze
</td><td>rok</td>
<td>poznámka</td></tr>
<tr><td>TeX v.&lt;3</td><td>&lt; 1990</td><td>ASCII a&nbsp;řídicí sekvence, interně 7 bitů</td></tr>
<tr><td>TeX v. 3.* </td><td>≥ 1990</td> <td>interně 8 bitů a&nbsp;řídicí sekvence, kódování il2, T1, konverze byte to byte</td></tr>
<tr><td>encTeX
</td><td>∼ 2002</td> <td>UTF-8 → 8 bitů+řídicí sekvence, kódování il2, T1</td></tr>
<tr><td>XeTeX
</td><td>∼ 2006</td> <td>umí číst OpenType fonty, UTF-8 na vstupu, interně Unicode</td></tr>
<tr><td>LuaTeX
</td><td>∼ 2010</td> <td>umí číst OpenType fonty, UTF-8 na vstupu, interně Unicode</td></tr>
</table>
</body>
</html>

Podobné dokumenty

TeX pro pragmatiky

TeX pro pragmatiky Ten pořizuje autor dokumentu v~běžném textovém editoru, který nepřidává do souboru žádné nepatřičné neviditelné znaky. Odstavce ve zdrojovém textu jsou odděleny prázdným řádkem. Jejich rozdělení do...

Více

Pokynech pro přispěvatele

Pokynech pro přispěvatele Příspěvky odevzdávejte v elektronické podobě ve formátu .doc, .docx, .odt nebo .rtf (ostatní vhodné formáty po domluvě). Rozsah článku je minimálně 14 400, maximálně 55 000 znaků, rozsah recenze mi...

Více

openMagazin 5/2009

openMagazin 5/2009 Screenlets – to pravé pro vaši obrazovku..........................11 Nové Ubuntu má vážné problémy s grafikami Intel...........39 Hybrid Share: Sdílení souborů a komunikace s přáteli......14 Zajíma...

Více

TeX Live 2016: Prírucka TeX Live, CS verze 1.57

TeX Live 2016: Prírucka TeX Live, CS verze 1.57 Tento oddíl uvádí seznam předdefinovaných proměnných určujících texmf stromy používané systémem, a jejich zamýšlený účel ve standardním uspořádání systému TEX Live. Povel tlmgr conf ukáže hodnoty t...

Více

Elektronická verze - Zpravodaj Československého sdružení

Elektronická verze - Zpravodaj Československého sdružení Text si neklade za cíl popsat naprosto přesně veškeré vlastnosti TEXu. K tomu slouží TEXbook naruby, na který v textu často odkazuji zkratkou TBN. Vybral jsem to, co podle mého názoru pragmatik pot...

Více

Jak TEX k fontům ze Střešovic přišel

Jak TEX k fontům ze Střešovic přišel jako akcenty pro mínusky. Ty verzálkové ale mnohdy příliš vyčnívaly z řádku. Pokoušel jsem se na ně aplikovat (v rámci virtuálních skriptů v TEXu a prostřednictvím standardních PostScriptových ope...

Více