CSplain

čeština a slovenština v plain TeXu

Petr Olšák, 2019

en English

CSplain (a pdfcsplain) je konzervativní rozšíření plain TeXu Donalda Knutha. Rozdíl mezi formátem plain a formátem csplain spočívá v tom, že místo CM fontů se pracuje implicitně s CS-fonty, což umožňuje:

  • přímé zpracování znaků české a slovenské abecedy,
  • zavedení vzorů dělení pro český a slovenský jazyk.

ve verzi May 2016 csplain nově obsahuje:

  • fontové soubory se opírají o makro ff-mac.tex, což nabízí koncept na sobě nezávislých fontových modifikátorů. Vlastnost je popsána a ilustrována v článku KP-fonts in plain TeX,
  • je přidána podpora Unicode Math fontů v souboru uni-math.tex,
  • OPmac umožní pomocí makra \fontfam vypsat fontové rodiny implementované ve fontových souborech a tisknout z nich katalog.

Ve vezi Dec. 2012 proběhly v CSplainu tyto významné změny:

  • implicitně podporuje vstupní kódování UTF-8,
  • umožňuje pohodlnou manipulaci s fonty (včetně jejich nastavování do různých velikostí),
  • spolupracuje s TeXem, eTeXem, pdfTeXem, XeTeXem i LuaTeXem,
  • má připravenu podporu kódování CS-fontů i kódování T1 (v případě použití XeTeXu nebo LuaTeXu pochopitelně podporuje Unicode),
  • podporuje zavedení vzorů dělení více než 50 jazyků v různých kódováních,
  • obsahuje balíček užitečných maker OPmac.

csplain.tar.gz
tpp.pdf
prednaska v Brne

Balíček csplain.tar.gz obsahuje kromě souborů potřebných pro vygenerování formátu csplain ještě další podpůrná makra. Byl součástí CSTeXu. Balíček CSplain pravděpodobně nemusíte stahovat a rozbalovat z této stránky, protože je součástí běžných TeXových distribucí (TeXlive, MikTeX).

Obsah

  1. Formáty csplain a pdfcsplain
  2. Příprava: generování formátu
  3. Vstupní a interní kódování csplainu
  4. Použití češtiny a slovenštiny
  5. Soubor maker opmac.tex
  6. UTF-8 vstup
  7. Fonty v csplainu
  8. Vzory dělení různých jazyků různě kódované
  9. Doporučená literatura

1. Formáty luacsplain, csplain a pdfcsplain

CSplain spolupracuje s klasickým TeXem, pdfTeXem, LuaTeXem nebo XeTeXem. Poslední dva TeXové programy interně pracují v Unicode (Unicode-TeX) a jste-li nový uživatel, doporučujeme použít jeden z nich, lépe LuaTeX. CSplain se v takovém případě spouští pomocí příkazu

   luacsplain dokument    (...nebo:  luatex -fmt pdfcsplain dokument)

Výstupem použití příkazu luacsplain je PDF soubor s vygenerovaným dokumentem. Zdrojový dokument při užití Unicode-TeXu musí obsahovat na začátku deklaraci nějaké fontové rodiny v Unicode, například \input lmfonts. Podrobněji viz sekci 7. České vzory dělení se inicializují pomocí \chyph. Takže testovací dokument může vypadat takto:

\input lmfonts   % Unicode Latin Modern fonty
\chyph           % České vzory dělení slov
Tady je český text.
\bye

CSplain má za sebou mnohaletý vývoj, kdy byl používán s klasickým TeXem nebo pdfTeXem, což vyžadovalo řešení nejrůznějších komplikací v rámci zvoleného vnitřního kódování TeXu (nemohlo to být Unicode). Konzervativní uživatelé používají CSplain tímto způsobem dodnes. Proto jsou zde zmíněny i tyto možnosti užití CSplainu. Příkaz csplain vytvoří DVI výstup klasickým TeXem a příkaz pdfcsplain vytvoří PDF výstup pomocí pdfTeXu. Tedy například

   pdfcsplain dokument

vytvoří dokument.pdf pomocí pdfTeXu. Příkaz \input lmfonts v takovém případě není nutné použít, ale když ho použijete, načtou se Latin Modern fonty ve zvoleném interním kódování, které při použití pdfTeXu není Unicode.

CSplain můžete použít také v prostředí pro sdílené TeXování dokumentů Overleaf, třebaže je toto prostředí primárně konfigurováno pro LaTeX. Stačí do hlavního adresáře projektu zařadit soubor se jménem latexmkrc a jednořádkovým obsahem:

$pdflatex = 'pdfcsplain %O %S';

2. Příprava: generování formátu

Na novějších TeXových distribucích (od prosince 2012) byste měli mít automaticky připraveny tyto formáty:

1. csplain.fmt ...... vstup: UTF-8, výstup: DVI, stroj: pdfTeX+encTeX,
                      příkaz ke spuštění: csplain dokument 
2. pdfcsplain.fmt ... vstup: UTF-8, výstup: PDF, stroj: pdfTeX+encTeX,
                      příkaz ke spuštění: pdfcsplain dokument
3. luacsplain.fmt ... vstup: UTF-8, výstup: PDF, stroj: luaTeX,
                      příkaz ke spuštění: luacsplain dokument nebo
                      luatex -fmt pdfcsplain dokument
4. pdfcsplain.fmt ... vstup: UTF-8, výstup: PDF, stroj: XeTeX,
                      příkaz ke spuštění: xetex -fmt pdfcsplain dokument

Pokud je nutné formátový soubor vygenerovat, pak můžete postupovat takto:

1. pdftex -jobname csplain -ini -etex -enc csplain-utf8.ini
   ... vygenerovaný csplain.fmt uložit do distribuce/web2c/pdftex/
2. pdftex -jobname pdfcsplain -ini -etex -enc csplain-utf8.ini   
   ... vygenerovaný pdfcsplain.fmt uložit do distribuce/web2c/pdftex/
3. luatex -jobname luacsplain -ini csplain.ini
   ... vygenerovaný luacsplain.fmt uložit do distribuce/web2c/luatex/
4. xetex -jobname pdfcsplain -ini -etex csplain.ini
   ... vygenerovaný pdfcsplain.fmt uložit do distribuce/web2c/xetex/

Před generováním i po uložení formátového souboru do distribuce je obvykle nutné použít příkaz texhash, který aktualizuje vyhledávací tabulky.

Poznámka Pro XeTeX a LuaTeX si můžete připravit vlastní formáty xeplain a luaplain podle pokynů v souborech xeplain.ini a luaplain.ini

3. Vstupní a interní kódování csplainu

Vstupní kódování csplainu bylo původně závislé na použitém operačním systému. Od prosince roku 2012 je vstupním kódováním jednotně UTF-8.

Interní kódování csplainu pro pdfTeX je implicitně (z historických důvodů) podle CSfontů. Je označované jako 8z a je odvozeno z ISO-8859-2. CSfonty v tomto kódování jsou též implicitně do formátu nataženy. Na toto kódování musejí navazovat uživatelem zavedené další fonty. Pokud chcete použít interní kódování podle Corku (označované jako 8t), je třeba na začátku dokumentu psát

\input t1code  % nastaví vnitřní kódování podle Cork (T1 kódování)
\input lmfonts % zavede LM fonty v nastaveném kódování 
               % (existují i jiné alternativy, viz níže sekci 7)

V kódování podle Corku byla v 90. letech připravena většina TeXových fontů pro evropské jazyky.

Interní kódování csplainu pro XeTeX a LuaTeX je Unicode. Protože ale XeTeX ani LuaTeX neumí natáhnout do formátu implicitní sadu Unicode fontů, jsou bohužel zavedeny CSfonty, které s Unicode nejsou kompatibilní. Je tedy nutné na začátku dokumentu psát

\input lmfonts % zavede LM fonty v Unicode (existují i jiné alternativy)

4. Použití češtiny a slovenštiny

Formát csplain je inicializován tak, aby se implicitně choval jako plain. To znamená, že je nastaveno anglické dělení slov a sekvence typu \v, \' expandují na primitiv \accent. Rovněž je aktivní \nonfrenchspacing. Toto výchozí nastavení je tedy zcela stejné jako v plainTeXu. Rozdíl je jen ve velikosti implicitního rozměru zrcadla sazby, které je v csplainu nastaveno pro palcové okraje při formátu A4, zatímco v plainu je nastaveno pro palcové okraje formátu Letter.

Pro inicializaci vzorů dělení slov a nastavení expanze sekvencí \v, \', \^, \`, \", \r na přirozené znaky jsou rezervovány následující příkazy:

   \chyph      % inicializuje české dělení slov a \frenschpacing
   \shyph      % inicializuje slovenské dělení slov a \frenschspacing
   \csaccents  % způsobí jiné chování \', \v, \^, \`, \" a \r, které od
               % této chvíle expandují přímo na znaky dle interního kódování

Doporučení: První řádek dokumentu by měl být například

   \chyph  % use format csplain

Když bude uživatel takový dokument zpracovávat jiným formátem, který nemá definovan příkaz \chyph, výše uvedený řádek se objeví v chybovém hlášení včetně komentáře takže uživatel vidí, čím má dokument zpracovat.

Návrat k původnímu nastavení:

   \ehyph      % americké dělení a \nonfrenchspacing
   \cmaccents  % \', \v aspol. expandují na primitiv \accent

Další příkazy jsou jen zkratkami k některým znakům v CS-fontech:

   \clqq       % levá dvojitá česká uvozovka
   \crqq       % pravá dvojitá česká uvozovka
   \flqq       % levá dvojitá francouzská uvozovka
   \frqq       % pravá dvojitá francouzská uvozovka
   \promile    % znak pro promile
   \uv         % text uvozený českými uvozovkami: \uv{text}
   \ogonek a   % polské ,,a s ocáskem`` (sestaveno z komponent)

5. Soubor maker opmac.tex

Formát csplain je koncipován jako minimální rozšíření plainu, takže formát samotný nenabízí jiné příkazy mimo příkazů z plainu a příkazů popsaných v předchozí kapitole. Je to nízkoúrovňový základ pro zpracování českých a slovenských textů všeho druhu. Nicméně uživatel si musí k csplainu doprogramovat další typicky používané vlastnosti: automatickou tvorbu obsahu, číslování, křížové reference, verbatim prostředí, atd. Aby v jednoduchých případech nebylo nutno tuto práci dělat pořád znovu, vytvořil jsem soubor maker opmac.tex, který je součástí balíku csplain od konce roku 2012.

Podrobnější informace o makru jsou na www stránce OPmac.

6. UTF-8 vstup s použitím encTeXu

Od roku 2012 je UTF-8 doporučovaným implicitním kódováním. CSplain toto kódování podporuje nativně v XeTeXu a LuaTeXu a za použití rozšíření encTeX v ostatních případech (TeX, pdfTeX). Tato sekce popisuje vlastnosti transformace UTF-8 na vnitřní kódování pomocí encTeXu. Uživatelé XeTeXu a LuaTeXu mohou tuto sekci zcela přeskočit, neboť v jejich případě probíhá konverze do vnitřního Unicode nativně.

Formát csplain s UTF-8 vstupem implicitně rozpozná na vstupu následující znaky:

  1. Všechny znaky ASCII (128 tzv. sedmibitových znaků),
  2. Znaky ÁáÄäČčĎďÉéĚěÍíĹ弾ŇňÓóÖöÔôŔŕŘřŠšŤťÚúŮůÜüÝýŽž.
  3. Znaky, které jsou definovány v plainu nebo csplainu jako kontrolní sekvence: \ss, \l, \L, \ae, \oe, \AE, \OE, \o, \O, \i, \j, \aa, \AA, \S, \P, \copyright, \dots, \dag, \ddag, \clqq, \crqq, \elqq, \erqq, \elq, \erq, \flqq, \frqq, \promile. UTF-8 kódy těchto znaků se v inputprocesoru TeXu promění v uvedené kontrolní sekvence a do \write souborů se vrací zase jako UTF-8 kódy.

Jestliže se ve vstupním souboru objeví jakýkoli jiný znak (dlouhá pomlčka, nedělitelná mezera atd.) pak csplain s encTeXem vypíše na terminál hlášení podobné tomuto:

  WARNING: unknown UTF-8 code: `€ = ^^e2^^82^^ac' (line: 42)

a do výstupního DVI nebo PDF vloží černý čtvereček. Uživatel může nedefinovaný kód mapovat na kontrolní sekvenci a dále tuto sekvenci definovat, třeba takto:

  \mubyte\eurochar ^^e2^^82^^ac\endmubyte % kód znaku € mapován na \eurochar
  \def\eurochar{{\eurofont e}}            % definice \eurochar
  \font\eurofont=feymr10                  % použitý font

Poznámka: uvedené řešení se znakem Euro bude fungovat jen v jedné velikosti a v jedné variantě (\rm) znaku Euro. Lepší řešení je přejít na některou z rodin fontů zmíněných v následující sekci, např. \input lmfonts. Pak bude přímo fungovat příkaz \euro ve všech velikostech a variantách.

Pro práci s UTF-8 kódováním jsou připraveny následující soubory, které je možno načíst na začátku dokumentu pomocí \input:

  utf8lat1.tex ... doplní mapování UTF-8 kódů z Latin-1 Supplement U+0080--U+00FF
  utf8lata.tex ... doplní mapování UTF-8 kódů z Latin Extended-A U+0100--U+017F

Předpokládám, že v podobném duchu, jako jsou soubory utf8lat1.tex a utf8lata.tex, někdo rozšíří možnost mapování UTF-8 kódů o další důležité bloky UNICODE tabulky.

Jako příklad dalšího možného rozšíření UTF-8 kódů poslouží soubor cyrchars.tex, který zavádí UTF-8 kódy pro azbuku a umožní přímo bez přepínání fontů psát azbukou. Dokumentace je na konci uvedeného souboru.

Předložíte-li csplainu s encTeXem vstup, který není kódovaný podle UTF-8, objeví se chybové hlášení:

  ! UTF-8 INPUT IS CORRUPTED !  May be you are using another input encoding.

V takovém případě můžete na začátek dokumentu přidat jeden z následujících dvou možných \input příkazů:

  \input utf8off  ... vypíná UTF-8 kódování, vstup/výstup je v ISO-8859-2 
  \input mixcodes ... umožní mít ve vstupním dokumentu směs texů kódovaných
                      v UTF-8 nebo ISO-8859-2 nebo CP1250. Vše zpracuje 
                      správně bez nutnosti používat přepínače. 
                      Výstup pomocí \write probíhá v UTF-8.

Poznámka: \input utf8off samotné přepíná csplain do vstupu (a výstupu pomocí \write) v ISO-8859-2. Pokud za tento příkaz dále napíšete některý z následujících příkazů, máte vstup (a výstup pomocí \write) ve zvoleném kódování.

  % po \input utf8off je možno dále psát jeden z těchto příkazů:
  \input csenc-w ... vstup/výstup v CP1250 (MS Windows)
  \input csenc-p ... vstup/výstup v CP852 (MS DOS)
  \input csenc-k ... vstup/výstup v Kamenických (starodávný DOS)

XeTeX a LuaTeX převádějí veškeré vstupní UTF-8 kódy do interního UNICODE přímo bez použití encTeXu.

7. Fonty v csplainu

Implicitní rodina fontů v csplainu jsou CSfonty, které jsou mírným rozšířením Knuthových Computer Modern fontů. Přejít na jinou rodinu fontů je možné zavedením jednoho z následujících souborů na začátku dokumentu:

  \input lmfonts       % Latin Moder fonts
  \input ctimes        % rodina fontů Times
  \input chelvet       % rodina fontů Helvetica
  \input cavantga      % rodina fontů AvantGarde
  \input cbookman      % rodina fontů Bookman
  \input cncent        % rodina fontů NewCenturySchlbk
  \input cpalatin      % rodina fontů Palatino
  \input cs-bera       % Bera
  \input cs-arev       % ArevSans
  \input cs-charter    % Charter
  \input cs-antt       % Antykwa Torunska
  \input cs-polta      % Antykwa Poltawskiego
  \input cs-termes     % TeX Gyre Termes, obdoba Times
  \input cs-heros      % TeX Grye Heros, obdoba Helvetica
  \input cs-adventor   % TeX Gyre Adventor, obdoba AvatGarde
  \input cs-bonum      % TeX Gyre Bonum, obdoba Bookman
  \input cs-schola     % TeX Gyre Schola, obdoba NewCenturySchlbk
  \input cs-pagella    % TeX Gyre Pagella, obdoba Palatino
  \input cs-cursor     % TeX Gyre Cursor, obdoba Courier
  \input cs-libertine  % Linux Libertine
  \input cs-ebgaramond % EB Garamond
  \input kp-fonts      % KP fonty

kpfonts-plain.pdf

Tyto tzv. fontové soubory typicky zavedou rodinu fontů, která je pak přístupná pomocí přepínačů \rm, \bf, \it a \bi. Některé fontové soubory navíc nabízejí modifikátory uvedených přepínačů, například \cond\it vybere v případě rodiny fontů TeX Gyre Heros zúženou variantu skloněného písma. Podrobnosti o modifikátorech včetně rozsáhlé ukázky lze najít v článku KP-fonts in plain TeX. Inspiraci pro tvorbu vlastních fontových souborů včetně dokumentace pro programátory lze najít v souboru cs-heros.tex.

Uvedené fontové soubory zavedou fonty v nastaveném kódování a podporují tři možnosti: CSfonts (\input il2code), Cork (\input t1code) a Unicode (XeTeX, LuaTeX). Jen soubory ctimes až cpalatin a kp-fonts nepodporují Unicode. Ovšem k souborům ctimes až cpalatin dnes existují plně zastupitelné náhrady z TeX Gyre projektu, které Unicode podporují.

opmac-u.pdf

Při použití OPmac je k dispozici makro \fontfam, které vylistuje přehled fontových rodin, pro které jsou připraveny fontové soubory a uvede i seznam dostupných modifikátorů a informaci o tom, jaká matematická sada fontů je implicitně s uvedenou rodinou fontů kombinována.

Matematické sady fontů mají svá makra připravena v souborech cosi-math.tex. K dispozici je vždy aspoň sada matematických symbolů známých z AMSTeXu a matematické abecedy \frak (fraktura), \script (skript kroucenější než \cal), \bbchar (písmena se zdvojenými tahy), \bf, \bi (tučná bezserifová abeceda normal a slanted). Zůstanete-li u implicitní rodiny fontů (CSfonty), je možné k ní zavést makro ams-math.tex, které připraví AMS fonty jež na textovou rodinu vizuálně navazuje.

tpp.pdf

Fonty v textu i matematice lze snadno zvětšovat a zmenšovat do požadované velikosti. V OPmac jsou na to připravena makra \typosize a \typoscale. Změna velikosti fontů bez použití balíčku OPmac je popsána v TeXu pro pragmatiky v kapitole páté.

8. Vzory dělení různých jazyků různě kódované

Vzory dělení slov se načítají při generování formátu. CSplain je připraven načíst vzory dělení 57 jazyků (viz) a některé z nich až ve třech možných kódováních: 8z (kódování CSfontů), 8t (kódování dle Corku) a U (Unicode).

(pdf)csplain v pdfTeXu (od března 2019) implicitně načítá vzory dělení us(USplain), cs(czech,8z), sk(slovak,8z), cs(czech,8t), sk(slovak,8t), it(italian), engb(UKenglish), de(ngerman,8t), fr(french,8t), pl(polish,8t), es(spanish,8t), sl(slovenian,8t), fi(finnish,8t). Do vzorů dělení těchto jazyků lze přepínat pomocí \uslang, \cslang, \sklang, \itlang, \engblang, \delang, \frlang, \pllang, \eslang, \sllang, \filang. Před použitím vzorů s označením 8t je třeba nejprve provést \input t1code a načíst k tomu také odpovídající fonty. Přepínače \cslang, \sklang přepínají do vzorů podle předem vybraného kódování (implicitně 8z). Z důvodu kompatibility se staršími dokumenty exitují alternativní názvy maker: \chyph je totéž jako \cslang, \shyph je totéž jako \sklang a \ehyph je totéž jako \uslang.

pdfcsplain v XeTeXu implicitně načítá vzory dělení us(USplain), cs(czech,8z), sk(slovak,8z), cs(czech,U), sk(slovak,U), it(italian), engb(UKenglish). Další vzory dělení je možno načíts do formátu podle návodu níže.

pdfcsplain v LuaTeXu (od března 2019) nabízí k přímému použití vzory dělení všech v TeXu dostupných jazyků (momentálně je jich 57) a využívá možnosti LuaTeXu zavést tyto vzory podle potřeby až při zpracování dokumentu při prvním použití příkazu \cslang, \delang, \frlang atd. (takových příkazů je připraveno stejně jako je dostupných jazyků). Seznam všech dostupných jazyků lze získat expanzí makra \langlist. Opakované použití příkazů \cslang, \delang atd. ve stejném dokumentu už znovu vzory dělení nenačítá. Podrobnější informace je v souboru lua-hyphen.lan.

Nepoužíváte-li LuaTeX a Vámi použitý jazyk není v seznamu zavedených vzorů dělení, je třeba jazyk zavést a přegenerovat formát. To lze provést odkomentováním odpovídajícího řádku v souboru hyphen.lan a přegenerováním formátu. Nebo je možné požadavek na přidání vzoru dělení zapsat do příkazového řádku pro generování formátu třeba takto:

pdftex -ini -jobname pdfcsplain -etex -enc "\let\daCork=y \let\enc=u \input csplain.ini"

Tento příklad vygeneruje nově pdfcsplain pro pdfTeX a k implicitním vzorům dělení jsou přidány vzory dělení jazyka Dannish v kódování Cork. Zapnout tyto vzory dělení je pak možné příkazem \dalang. Přepínač \dalang ovšem začne fungovat až po \input t1code, protože vzory dělení evropských jazyků (s výjimkou angličtiny a italštiny, které jsou v ASCII a s výjimkou češtiny a slovenštiny, které mají své CSfonty) jsou připraveny pro pdfTeX výhradně v kódování Cork. Je-li při generování formátu detekován XeTeX, jsou použity vzory dělení výhradně v Unicode.

9. Doporučená literatura

Položky jsou uvedeny v doporučeném pořadí.

  1. Petr Olšák: První setkání s TeXem.
  2. Petr Olšák: TeX pro pragmatiky.
  3. Petr Olšák: TeXbook naruby.
  4. Petr Olšák: Typografický systém TeX.
  5. Donald Knuth: The TeXbook.