% A documentation for OFS package
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% July 2001                                       Petr Olsak
% February 2004

% See the ofsdoce.tex for English version of this documentation

\chyph  % pouľijte csplain

\headline={\llap{\tt May 2004}\hfil See the ofsdoc-e.tex for English version 
           of this documentation.\global\headline={\hfil}}

\magnification\magstephalf

\hoffset=4pc
\voffset=1pc
\hsize=31.6pc
\vsize=49pc
\raggedbottom
\parindent=15pt
\emergencystretch=2em

\font\smallbf=csb10 at7pt
\font\smalltt=cstt8
\font\smallit=csti8
\font\smallrm=csr8
\font\titulfont=\fontname\tenbf\space scaled\magstep4
\font\bigbf=\fontname\tenbf\space scaled\magstep1

\def\Red{}
\def\Black{}
\def\Blue{}
\def\Green{}
\def\beglink#1{}
\def\endlink{}
\def\aimlink#1{}

\ifx\pdfoutput\undefined\else   %%%% pdfTeX is used %%%%%%%%%%
\ifnum\pdfoutput>0    

\ifx \pdfstartlink\undefined %%% PDFTeX version <= 13
   \let\pdfstartlink=\pdfannotlink
\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\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 (July 2001) 
         /ModDate (March 2004)
         /Creator (TeX)
         /Producer (pdfTeX)
         /Title (OFS: Olsak's Font System)
         /Subject (Documentation)
         /Keywords (TeX, fonts)
}

\fi\fi %%%%%%%%%%%%%%%%%%%%%%%%%%%% End of pdfTeX macros %%%%%


\def\PLAIN #1:{{\smallbf \Red PLAIN\Black\if|#1|\else\space#1\fi}:}
\def\LATEX #1:{{\smallbf \Red LATEX\Black \if|#1|\else\space#1\fi}:}
\def\OBA   #1:{{\smallbf \Red PLAIN+LATEX\Black \if|#1|\else\space#1\fi}:}

\newcount\secnum \newcount\subsecnum

\def\sec #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\subsec #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\LaTeX{La\TeX}

\catcode`<=13
\def<#1>{\hbox{$\langle$\it#1\/$\rangle$}}
\def\,{\thinspace}

{\obeyspaces \gdef\activespace{\obeyspaces\let =\ }}
\def\setverb{\def\do##1{\catcode`##1=12}\dospecials}
\def\begtt{\medskip\bgroup \setverb \catcode`@=0 \activespace
   \parindent=0pt \catcode`\"=12
   \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"{\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}

\newwrite\indout
\immediate\openout\indout=\jobname.ind
\def\inl[#1]{\strut
   \write\indout{\noexpand\indexentry{#1}{\the\pageno}}%
   \vadjust{\vbox to0pt{\vss
   \hbox to\hsize{\llap{{\aimlink{#1}\smalltt\Blue\char`\\ #1%
      \ifx\extratext\empty\else\space\extratext\fi\Black}%
      \kern2pt\quad}\strut\hfil}%
   \hrule height0pt}}\def\extratext{}}
\def\inll[#1 #2]{\def\extratext{#2}\inl[#1]}
\def\indexentry #1#2{\expandafter \ifx \csname ind:#1\endcsname \relax
      \expandafter \def \csname ind:#1\endcsname {#2}%
   \else 
      \expandafter \edef \csname ind:#1\endcsname {%
          \csname ind:#1\endcsname, #2}%
   \fi
}  
\def\pg[#1]{\csname ind:#1\endcsname}

\chardef\back=`\\

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\title   OFS: Oląákův fontový systém
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

OFS je makro, které umoľní přehledně
v~\TeX{}u vybírat rodiny fontů, jejichľ názvy jsou v~souladu s~názvy 
z~písmového katalogu. Toto makro je z~uľivatelského
pohledu stejné v~plainu i \LaTeX{}u. Výklad pouľití OFS bude tedy
společný pro obě skupiny uľivatelů. Pokud některý text platí jen
pro csplain (a podobné formáty), bude uveden slovem \PLAIN: a pokud
je text určen pro uľivatele \LaTeX{}u2e, je uveden slovem \LATEX:.

Pod skupinu \PLAIN: patří nejen csplain, plain a odvozené formáty, ale
téľ dnes uľ nepouľívaný \LaTeX2.09 bez NFSS. Pod skupinu \LATEX: bychom
mohli zařadit vąechny formáty, které pracují s~NFSS~2, předevąím tedy 
\LaTeX 2e.

Po zavedení přísluąných maker v~záhlaví dokumentu (viz níľe) se na
terminálu mimo jiné objeví:

\begtt
@PLAIN: OFS (Olsak's Font System) based on plain initialized. @char`<verze>
@LATEX: OFS (Olsak's Font System) based on NFSS initialized. @char`<verze>
\endtt
Výhody OFS: 

\begitems
* Sjednocuje rozhraní pro uľivatele \LaTeX{}u i plainu.
* Pomocí příkazu "\fontusage" dostaneme na terminál a do logu stručnou
  informaci o~pouľití maker z~OFS.
* Umoľňuje pracovat se skutečnými názvy písmových rodin tak, 
  jak jsou uvedeny v~písmovém katalogu a tím 
  nenutí uľivatele si kromě těchto názvů pamatovat jeątě 
  interní zkratky pouľité v~NFSS nebo v~názvech metrik fontů.
* Umoľní pracovat s~fontem rozloľeným do dvou metrik 
  (základní a roząiřující) jakoby se jednalo o~jediný font.
* Umoľní na začátku dokumentu vybrat oblíbené kódování základní 
  metriky, jsou-li metriky připraveny v~různých kódováních
  (typicky kódování IL2 a T1).
* Definuje rozhraní pro vytváření pomocných souborů, které
  obsahují konverzní informace mezi \uv{dlouhými názvy} fontů
  z~katalogu a \PLAIN: názvy metrik
  nebo \LATEX: zkratkami pouľívanými v~NFSS.
* \PLAIN: Umoľňuje podobnou nezávislost výběru jednotlivých 
  parametů fontů, jako NFSS v~\LaTeX{}u. 
* \PLAIN: Definuje deklarační příkazy pro podchycení kódování fontů.
* \PLAIN: Je moľné pro různé velikosti registrovat různé metriky, coľ
  vyuľijeme zejména u~rodiny Computer Modern.
* \PLAIN: Obsahuje nástroje na pouľití PostScriptových fontů 
  i v~matematické sazbě.
* Interaktivní makro "ofstest.tex" umoľní tisknout vzorky odstavců ve
  zvolených písmových rodinách, tisknout tabulky fontů, katalogy fontů,
  vzorky matematické sazby a seznamy znaků ve fontech včetně jejich
  \TeX{}ových sekvencí. Stačí napsat na příkazový řádek
  "tex ofstest [allfonts]" nebo "csplain ofstest [allfonts]"
  a řídit se pokyny na terminálu.
\enditems


\sec Členění písmových rodin
%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Makro OFS vychází z~toho, ľe větąina dnes dodávaných písmových rodin
obsahuje čtyři řezy: základní ("\rm"), tučný ("\bf"), kurzívu ("\it"),
a tučnou kurzívu ("\bi")\inll[rm \back bf \back it \back bi]. 
Těmto řezům budeme říkat \uv{standardní varianty}.
Po zavedení rodiny příkazem "\setfonts" (viz níľe) lze pak 
přepínat pomocí "\rm", "\bf", "\it" a "\bi" mezi variantami v~dané
rodině. První tři uvedené přepínače jsou známé z~plainu 
(v~\LaTeX{}u přetrvávají z~dob zaąlé slávy LaTeXu2.09) 
a čtvrtý přepíná do varianty BoldItalic.

Některé rodiny mohou deklarovat přepínače daląích 
\uv{nadstandardních variant} a u~některých rodin naopak 
můľe chybět i některá ze standardních variant.

Varianty v~některých rodinách se mírně liąí od zde uvedených
názvů pro standardní varianty. Místo tučného písma můľe být 
třeba přítomno jen polotučné a místo kurzívy třeba skloněné písmo. 
Přepínače "\rm", "\bf", "\it" a "\bi" zůstávají pokud moľno
zachovány, takľe by nás nemělo vyvést z~rovnováhy, ľe v~některé rodině
třeba "\it" přepíná do skloněného písma a ne do kurzívy.

Pokud chceme současně pracovat s~daląími přepínači fontů jiné rodiny
(například "\tt" pro strojopis), je moľné takové přepínače deklarovat pomocí
příkazu "\fontdef". 

Členění fontů do rodin je deklarováno v~souborech, které
mají v~plainu podobný význam, jako {\tt fd} (Font Definition) soubory
z~\LaTeX{}u. Doporučená přípona souboru je pro plain {\tt tex} a
pro \LaTeX{} {\tt sty}. Těmto souborům budeme říkat \uv{deklarační soubory}.
Podle názvu deklaračních souborů by mělo být uľivateli zřejmé, které rodiny
jsou v~něm deklarovány. Příklady:

\begtt
@PLAIN:         @LATEX:
sjannon.tex,  sjannon.sty  ... souhrnná rodina Jannon ze Střeąovic
a35.tex,      a35.sty      ... základní skupina 35 fontů od Adobe
\endtt

Vidíme, ľe deklarační soubory (na rozdíl od {\tt fd} souborů z~\LaTeX{}u) 
obsahují obvykle definice více souvisejících rodin. Mezi těmito
soubory uľivatel vybírá ty, které bude potřebovat a uvede jejich jména
při zavedení makra OFS v~záhlaví svého dokumentu. 
Aby měl uľivatel zjednoduąenou práci, zakládáme obvykle téľ souhrné
soubory, které obsahují "\input" nebo "\RequirePackage" na jednotlivé
deklarační soubory:

\begtt
skatalog.tex, skatalog.sty ... vąechny fonty ze Střeąovic
allfonts.tex, allfonts.sty ... vąechny fonty na TeXové instalaci
\endtt


\sec Uľivatelské příkazy
%%%%%%%%%%%%%%%%%%%%%%%%

\subsec Zavedení OFS
%%%%%%%%%%%%%%%%%%%%

Pro příklad předpokládejme, ľe budeme chtít pracovat 
s~fonty ze souhrnné rodiny Jannon a
DynaGrotesk. Protoľe se jedná o~rodiny ze Střeąovické písmolijny od pana
©torma, najdeme odpovídající deklarační soubory v~adresáři 
"storm". Na Internetu je získáme společně s~makrem OFS
například na "www.cstug.cz/stormtype".
Souhrnné rodiny Jannon a Dyna\-Grotesk jsou deklarovány v~těchto souborech: 
\PLAIN: "sjannon.tex", "sdynamo.tex";
\LATEX: "sjannon.sty", "sdynamo.sty".
Písmeno "s" na začátku názvů znamená, 
ľe fonty pocházejí ze Střeąovické písmolijny. Jména těchto souborů bez
přípony je nutné uvést v~hranaté závorce při zavedení makra OFS takto:

\begtt
@PLAIN: \input ofs [sjannon, sdynamo] % mezera před "[" je nutná!
@LATEX: \usepackage [sjannon, sdynamo] {ofs}
\endtt

Dále můľeme pracovat s~rodinami, které jsou obsaľeny v~souhrnných
rodinách Jannon a DynaGrotesk. 
Napíąeme-li do dokumentu příkaz "\showfonts"\inl[showfonts],
zobrazí se na \hbox{terminál} (a~zapíąe do logu) seznam názvů jednotlivých
rodin, které dále můľeme pouľívat. Po zavedení "sjannon" a 
"sdynamo", jak bylo uvedeno výąe, zobrazí příkaz "\showfonts" tento seznam:

\begtt
OFS (l.1): The list of known font families:
defaults:
   [CMRoman/]            \rm, \bf, \it, \bi, \sl
   [CMSans/]             \rm, \bf, \it,  -
   [CMTypewriter/]       \rm,  - , \it,  - , \sl
   [Times/]              \rm, \bf, \it, \bi
   [Helvetica/]          \rm, \bf, \it, \bi, \nrm, \nbf, \nit, \nbi
   [Courier/]            \rm, \bf, \it, \bi
sjannon.tex:
   [JannonAntikva/]      \rm, \bf, \it, \bi, \mr, \mi
   [JannonText/]         \rm, \bf, \it, \bi, \mr, \mi
   [JannonCaps/]         \rm, \bf, \it, \bi
sdynamo.tex:
   [DynaGroteskDXE/]     \rm, \bf, \it, \bi
   [DynaGroteskRXE/]     \rm, \bf, \it, \bi
   [DynaGroteskLXE/]     \rm, \bf, \it, \bi
   ... <a daląích 15 rodin DynaGrotesk> ...
\endtt

Prvních 6 rodin (označené jako defaults) je definováno v~OFS. 
Teprve daląí rodiny jsou deklarovány v~pouľitých souborech.

Vedle názvů rodin jsou uvedeny přepínače variant, které pro danou
rodinu můľeme pouľít. První čtyři přepínače jsou pro standardní
varianty a pokud v~některé rodině taková varianta není přístupná, 
je zde na místě odpovídajícího přepínače pomlčka. 
Pátý a případně daląí přepínače se vztahují k~případným nadstandardním
variantám. Zde například rodina Helvetica má navíc přepínače 
pro varianty \uv{Narrow} a rodiny Jannon mají přepínače pro 
varianty \uv{Medium}.

Napíąeme-li do dokumentu příkaz "\fontusage"\inl[fontusage], 
zobrazí se na terminál a
do logu stručná informace o~pouľití příkazů z~balíku OFS.

Kromě výąe uvedeného způsobu zavedení:

\begtt
@PLAIN: \input ofs [<soubor>, <soubor>, ...]
@LATEX: \usepackage [<soubor>, <soubor>, ...] {ofs}
\endtt
%
existuje jeątě moľnost přímo zavést poľadované soubory. Pak není nutné
v~dokumentu explicitně zavádět soubor "ofs.tex" resp. "ofs.sty":

\begtt
@PLAIN: \input <soubor> \input <soubor> ...
@LATEX: \usepackage {<soubor>} \usepackage {<soubor>} ...
\endtt
%
Příklad:

\begtt
@PLAIN: \input sjannon \input sdynamo
@LATEX: \usepackage {sjannon} \usepackage {sdynamo}
\endtt
%
Nedoporučuje se (zvláątě v~\LaTeX{}u) oba tyto způsoby zavedení
makra OFS míchat.


\subsec Příkaz {\tt\back setfonts}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

V~daląích příkladech předpokládáme,\inl[setfonts]
ľe jsme zavedli pouze potřebné
rodiny, například ze souborů {\tt sjannon} a {\tt sdynamo}.
Nyní třeba po pouľití příkazu

\begtt
\setfonts [JannonText/12pt]
\endtt
%
lze přepínat do jednotlivých variant této rodiny JannonText ve
velikosti 12pt. Je moľné pouľít přepínače 
"\rm", "\bf", "\it", a "\bi" a speciálně pro tuto
rodinu jeątě "\mr" a "\mi". 

Příkaz "\setfonts [<JménoRodiny>/<velikost>]" 
přepíná do nové rodiny a ctí
naposledy zapnutou variantu. 
Pokud před tímto příkazem
byla zapnutá třeba varianta BoldItalic, pak po tomto příkazu zůstává
zapnutá tato varianta i v~nové rodině. 
Pokud v nové rodině naposledy zapnutá
varianta neexistuje, přepíná se do "\rm". Tato varianta musí být
deklarována v~kaľdé rodině.

Příkaz "\setfonts" vymezuje vąechny změny pouze
lokálně. Po ukončení skupiny se sazba vrací k~rodině a variantě, která
byla aktuální při zahájení skupiny.

Parametry příkazu "\setfonts" mohou být prázdné:
"\setfonts [<JménoRodiny>/]" přepne do nové 
rodiny a ctí naposledy nastavenou velikost a 
"\setfonts [/<velikost>]" nastaví novou velikost 
a ponechá aktuálně vybranou rodinu. Po inicializaci OFS je (pro
případ pouľití prázdného parametru) defaultně nastavena rodina
"CMRoman" a velikost 10\,pt. Příkaz "\setfonts [/]" 
je syntakticky korektní, ale neudělá kromě zápisu 
do logu vůbec nic.

Parametr <JménoRodiny>, je-li uveden, musí přesně odpovídat jménu
rodiny podle seznamu známých rodin (viz nahoře příkaz "\showfonts").
Je třeba dodrľovat malá a velká písmena a celé jméno psát bez mezer.
Pokud se tento parametr neshoduje s~ľádnou známou rodinou, vypíąe \TeX{}
varování a připojí seznam vąech známých rodin. Takľe například
"\setfonts [?/]" lze pouľít se stejným efektem, 
jako příkaz "\showfonts".

\LATEX: <JménoRodiny> můľe být nejen jméno podle seznamu známých rodin
(dlouhý název), ale je dovoleno pouľít i zkratku z~NFSS. Takľe
například "\setfonts [Times/]" a "\setfonts [ptm/]" je v~\LaTeX{}u totéľ.

\OBA:
Parametr <velikost> má tyto moľnosti:

\begitems
* <číslo>                 .... např. "12", "17.4",
* <číslo><jednotka>       .... např. "12pt", "17.4pt",  "10dd",
* "at"<číslo><jednotka>   .... např. "at12pt", "at17.4pt", "at10dd",
* "scaled"<celé číslo>    .... např. "scaled1200",  "scaled\magstep3",
* "mag"<desetinné číslo>  .... např. "mag1.2",  "mag.7",  "mag2.0".
\enditems

První tři moľnosti se významově shodují. Klíčové slovo "at" je
nepovinné a není-li uvedeno ani "at" ani jednotka, doplní se
automaticky "at<číslo>pt". Font se zavede přesně v~poľadované
velikosti. Samozřejmě při globálním "\magnification" celého dokumentu 
se jedná o~relativní a nikoli absolutní rozměry, pokud nepouľijeme
jednotku uvozenou slovem "true" (např. "17truept"). 
Jestliľe píąeme klíčové slovo "at", nesmíme vynechat jednotku.
Nesprávně: "at12", správně: "at12pt" nebo jenom "12".

Čtvrtá moľnost ("scaled") je shodná s~pouľitím slova "scaled" při zavádění
fontu pomocí primitivu "\font". Např. "scaled1200" je font, jehoľ základní
velikost je pronásobena koeficientem 1,2. Je-li základní velikost
fontu 10\,pt (coľ je obvyklé), pak je "scaled1200" shodné s~"at12pt".

Poslední moľnost ("mag") pronásobí aktuální velikost fontů daným
koeficientem. Na rozdíl od "scaled" se tedy vztahuje k~aktuální
velikosti a nikoli k~základní velikosti fontu. Je-li nejprve pouľito
třeba "\setfonts[/12]" a v~zápětí "\setfonts[/mag2.]", rodina fontů
bude nyní sázena ve velikosti 24\,pt. Příklad:

\begtt
\def\small{\setfonts[/mag.7]}
Text {\small je menąí \small a menąí \small a jeątě menąí} a tady je
zase v normální velikosti.
\endtt

Upozornění: Změna velikosti fontů pomocí "\setfonts" nijak nemění
vzdálenost účaří ("\baselineskip"). To si musí uľivatel nastavit sám.

Pomocí "\setfonts" můľeme nastavit nejen celou rodinu (to ovlivní
přepínače variant "\rm", "\bf", "\it", "\bi" a případně daląí), ale také 
jen zvolenou variantu v~dané rodině. V~takovém případě 
"\setfonts" nemění význam přepínačů variant ani aktuální 
velikost ostatních fontů. Při specifikaci varianty je nutno 
v~parametru "\setfonts" za název rodiny napsat znak mínus následovaný 
zkratkou pro variantu. Příklady:

\begtt
\setfonts [JannonText-it/12] ..... nastaví kurzívu dané rodiny ve
                                   velikosti 12pt
\setfonts [JannonText-rm/] ....... nastaví základní řez dané rodiny
                                   v aktuální velikosti.
\setfonts [CMTypeWriter-sl/] ..... nastaví základní variantu \sl 
                                   v aktuální velikosti.
\endtt

I~při specifikaci varianty je moľné v~parametru vynechat název rodiny,
pak se pouľije aktuální rodina. Například

\begtt
\setfonts [JannonText/12]
\setfonts [-bf/17]     ... varinata Bold JannonText, velikost 17pt.
                           Přepínače \rm, \bf, \it a \bi zůstanou 
                           nezměněny, v tomto příkladě přepínají
                           JannonText ve velikosti 12pt.
                           Následné pouľití třeba \setfonts [Times/]
                           nastaví rodinu Times ve velikosti 12pt.
ALE:
\setfonts [/17]\bf    ...  Varinata Bold aktuální rodiny, velikost 17pt.
                           Přepínače \rm, \bf, \it a \bi nyní
                           přepínají ve velikosti 17pt. Aktuální
                           velikost fontů je nyní 17pt.
\endtt

\LATEX: Co zde bylo řečeno o~ponechání významu přepínačů variant
při specifikování varianty v~\LaTeX{}u není pravda, 
protoľe by to naruąilo logiku NFSS. 
V~\LaTeX{}u tedy je "\setfonts [-bf/17]" zcela shodné 
s~příkazy "\setfonts [/17]\bf".


\subsec  Příkazy {\tt\back fontdef} a {\tt\back addcmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Příkaz "\fontdef"\inl[fontdef] umoľňuje deklarovat nové fontové přepínače.

\begtt
\fontdef \<přepínač> [<JménoRodiny>/<velikost>]
\endtt
%
Tato deklarace se zhruba shoduje s{}

\begtt
\gdef \<přepínač> {\setfonts [<JménoRodiny>/<velikost>]}
\endtt

\PLAIN: Pokud je specifikována rodina včetně varianty a 
parametr <velikost> není prázdný ani není zadán pomocí klíčového slova
"mag", pak "\<přepínač>" není implementován jako makro obsahující
"\setfonts", ale jedná se o nativní přepínač fontu implementovaný 
pomocí "\global\font\<přepínač>" (tzv.~fixed font). 
Tak můľe uľivatel deklarovat vlastní nativní přepínač 
fontu bez znalosti názvu metriky.

\LATEX: Deklarovaný přepínač je ve vąech případech implementován jako
makro obsahující "\setfonts". Přístup k~nativním přepínačům je před
uľivatelem v~NFSS skryt.

\OBA:
Místo jména rodiny můľe být uveden vykřičník. 
Pak se doplní jméno rodiny aktuální v~místě příkazu 
"\fontdef". Na druhé straně, pokud je jméno rodiny prázdné,
pak se jméno rodiny doplní podle aktuální rodiny
v~místě pouľití deklarovaného přepínače. Analogická vlastnost platí
pro parametr <velikost>. Příklady:

\begtt
\setfonts [JannonAntikva/]
\fontdef \small  [/7]             % \small = \setfonts [/7pt]
\fontdef \sffam  [DynaGroteskR/]  % \sffam = \setfonts [DynagroteskR/]
\fontdef \velky  [Times/17]       % \velky = \setfonts [Times/17pt]
\fontdef \ttfam  [Courier/]       % \ttfam = \setfonts [Courier/]
\fontdef \mylogo [Times-rm/mag.8] % \mylogo = \setfonts [Times-rm/mag.8] 
                                  % velikost fontu bude vľdy rovna 
                                  % 0.8 násobku aktuální velikosti.
\fontdef \timbf  [Times-bf/12]    % \timbf = fixed-font přepínač, jako:
                                  % \global\font\timbf=ptmb8z at12pt
\fontdef \jansmall [!/7]          % \jansmall=\setfonts[JannonAntikva/7]
\fontdef \janbi [!-bi/17]         % \janbi = fixed-font přepínač, jako:
                                  % \global\font\janbi=sjnbi8z at17pt
\fontdef \tt [Courier-rm/!]       % \tt = fixed-font přepínač, jako
                                  % \global\font\tt=pcrr8u at10pt
\endtt                               

Příkaz "\fontdef" deklaruje přepínač globálně, ovąem tento přepínač je
sám o~sobě lokální. Jinými slovy "\global\fontdef\jmeno" je totéľ jako
"\fontdef\jmeno", ale přepínač "\jmeno" nastaví font (nebo celou
rodinu) jen lokálně. 

Od verze OFS Oct.~2002 je podporován příkaz
"\addcmd"\inl[addcmd], který umoľní společně s~příkazem "\fontdef"
soustředit problematiku fontů do jediného místa v souboru maker. 
Příkaz má formát:

\begtt
\addcmd \<přepínač> {<příkazy>}
\endtt
%
a chová se, jako "\def\<přepínač> {<původní význam přepínače> <příkazy>}".
Pomocí "\addcmd" tedy můľeme \uv{roząířit} obsah makra "\<přepínač>" 
o~daląí příkazy. Sekvence "\<přepínač>" musí být (před pouľitím
"\addcmd") definována jako makro bez parametrů nebo musí být 
ve významu neexpandované kontrolní sekvence deklarované například
pomocí "\font", "\chardef" apod. Po pouľití "\addcmd" je sekvence
"\<přepínač>" definována vľdy jako makro bez parametru. Opakované
pouľití "\addcmd" na stejný "\<přepínač>" je moľné.

Příklad pouľití:

\begtt
\setfonts [JannonText/]
\fontdef \footnotefont  [!/7]     
\addcmd  \footnotefont  {\rm \baselineskip=9pt \relax}
\fontdef \sectionfont  [!/12]
\addcmd  \sectionfont  {\bf \let\it=\bi}
\endtt


\subsec Test přítomnosti rodiny
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\PLAIN: Ve svých makrech můľeme testovat, zda je rodina fontů deklarovaná,
tj.~zda je načtena její deklarace z~deklaračního souboru. Pouľijeme 
k~tomu konstrukci "\knownfam <JménoRodiny>? \iftrue", která expanduje
na "\iftrue", pokud je rodina deklarovaná a na "\iffalse", pokud
deklarovaná není. Parametr <JménoRodiny> musíme uvést bez specifikace varianty.

\OBA: Z důvodů zpětné kompatibility se starąí verzí OFS~dělá stejnou práci jako
"\knownchar" makro "\ifknownfam [<JménoRodiny>]"\inl[ifknownfam]. 
V~OFS pro plain se ale
od verze Feb.~2004 doporučuje pouľívat "\knownfam", protoľe to udrľuje
správně spárované primitivy "\if*", "\else", "\fi". La\TeX{}ový uľivatel
si můľe "\knownfam" snadno definovat.

\subsec \LATEX:  Propojení OSF s~NFSS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Tato sekce je určena pouze pro \LaTeX{}isty. Příkaz\inl[OFSfamily]

\begtt
\OFSfamily [<JménoRodiny>] 
\endtt
%
konvertuje dlouhý název rodiny podle katalogu na interní název rodiny
zanesený do NFSS. Například

\begtt
\OFSfamily [JannonText]
\endtt
%
expanduje na "sjng". Makro pracuje jen na úrovni expandprocesoru,
proto nedostaneme při překlepu v~názvu rodiny chybové hláąení. 
Při neexistující rodině makro expanduje na text "unknown". 
Pouľijeme-li například "\OFSfamily" ve svých stylových souborech 
a zpozorujeme, ľe se NFSS snaľí substituovat rodinu "unknown", 
můľeme si být jisti, ľe máme překlep v~názvu rodiny nebo nemáme 
správně pouľité "\usepackage".  

Příklad pouľití:

\begtt
\usepackage [sjannon, sdynamo] {ofs}
\edef\rmdefault {\OFSfamily [JannonAntikva]}
\edef\sfdefault {\OFSfamily [DynaGroteskR]}
\edef\ttdefault {\OFSfamily [Courirer]}
\endtt

Význam maker "\rmdefault", "\sfdefault", "\ttdefault" je popsán 
v~dokumentaci NFSS.

Dále OFS definuje příkaz\inl[OFSfamilydefault]

\begtt
\OFSfamilydefault [<JménoRodiny>]
\endtt
%
který nastaví základní rodinu celého dokumentu. Tato rodina se v~přísluąných 
velikostech a variantách objeví nejen v~textu, ale i v~záhlaví 
kapitol, sekcí a podobně (jsou-li makra v~pouľitém class souboru udělána
rozumně). Příkaz interně provede

\begtt
\edef\familydefault {\OFSfamily [<JménoRodiny>]}
\endtt
%
s~tím, ľe navíc oąetří případ neexistující rodiny chybovým hláąením 
s~výpisem vąech aktuálně dostupných rodin.

                        
\subsec Kódování fontů
%%%%%%%%%%%%%%%%%%%%%%

\LATEX: Přepínání mezi kódováním fontů probíhá zcela v~reľii NFSS. OFS
v~této věci nepřidává nic nového. 

\PLAIN (aľ do konce sekce): 
Implicitně se předpokládá kódování CSfontů. Pokud ale potřebujeme
pouľít fonty například v kódování T1, pak pouľijeme 
"\def\fotenc{8t}"\inl[fotenc]
a OFS bude pracovat s~fonty v~tomto kódování. 

Můľeme dokonce uvnitř dokumentu přepínat: 

\begtt
\def\fotenc{8z} \setfonts[/] ... fonty v kódování CSfontů
\def\fotenc{8t} \setfonts[/] ... fonty v kódování podle Corku.
\endtt

Kromě toho OFS obsahuje nástroje, aby makra závislá na kódování
fontů (například "\v", "\'", "\ae") expandovala správně 
na znak ve zvoleném kódování. 
Implicitně je v~OFS nastaveno "\loadingenc=0"\inl[loadingenc],
coľ znamená, ľe změnou kódování fontů ani příkazem "\setfonts" se 
nemění makra typu "\v", "\ae". Tato makra si ponechají svůj 
originální význam z~\hbox{plainu}. To uvítají ortodoxní plainisté, 
kteří nemají rádi, kdyľ má pouľitý balíček zbytečně velkou inteligenci.

Je-li ale na začátku dokumentu uvedeno "\loadingenc=1", například:

\begtt
\input ofs [a35,sjannon]  \loadingenc=1
\endtt
%
pak při kaľdém příkazu "\setfonts" si \TeX{} zkontroluje, zda má
načteny vąechny potřebné soubory se jménem "ofs-<kódování>.tex". 
Tyto soubory obsahují předefinování maker závislých na nastaveném kódování fontů. 
Pokud tyto soubory načteny nejsou, \TeX{} je během "\setfonts"
načte. Podrobněji viz sekce~\beglink{3.3}3.3\endlink{} aľ 
\beglink{3.5}3.5\endlink.

Balíček OFS obsahuje tři soubory s~deklaracemi maker závislými na
kódování: "ofs-8z.tex", "ofs-8t.tex" a "ofs-8c.tex". Při pouľití jiného kódování
fontů si můľete vytvořit daląí soubor analogického názvu.
Příkazy "\accentdef" a "\characterdef" pouľívané v~těchto 
souborech jsou podrobně vysvětleny v~\beglink{3.4}sekci~3.4\endlink.


\subsec Fonty v~matematice
%%%%%%%%%%%%%%%%%%%%%%%%%%

\LATEX: OFS pro \LaTeX{} vůbec neřeąí otázku fontů pro matematiku. 
Je potřeba vyuľít nabídku moľností NFSS.

\PLAIN (aľ do konce sekce): 
Příkaz "\setfonts" a přepínače deklarované pomocí "\fontdef" 
přepínají jen písmo v~textovém reľimu. 
Pokud nepouľijeme příkaz "\setmath", zůstává vąe,
co je ve vstupním souboru mezi dolary, vytiątěno v~Computer
Modern ve velikostech 10\,pt/7\,pt/5\,pt (velikost: 
základní/indexová/indexindexová). To nemusí být vľdy ľádoucí.

Příkaz "\setmath" má tento tvar:\inl[setmath]

\begtt
\setmath [<základní velikost>/<indexová velikost>/<indexindexová velikost>]
\endtt
%
V~parametrech příkazu dáváme najevo, v~jakých velikostech chceme matematické
fonty nastavit. Je moľné pouľít libovolný zápis velikosti, jako 
u~příkazu "\setfonts". Je-li pouľita moľnost "mag<číslo>", je
velikost vypočítána jako <číslo> krát velikost aktuálního 
textového fontu. Je-li parametr prázdný, doplní se takto:

\begitems
* základní velikost --- "mag1.0"
* indexová velikost --- "mag0.7"
* indexindexová velikost --- "mag0.5"
\enditems

Takľe "\setmath [//]" udělá totéľ jako 
"\setmath [mag1./mag.7/mag.5]". OFS definuje makro
"\setsimplemath"\inl[setsimplemath] jako "\setmath [//]".

Příkaz "\setmath" nastaví matematické fonty podle
aktuální situace. Jeho činnost závisí na obsahu maker
"\fomenc" a "\mathversion".

Matematické kódování je určeno hodnotou makra 
"\fomenc".\inl[fomenc]
Existují tyto moľnosti:

\begitems
* Implicitní hodnota je "\def\fomenc{PS}" (PostScript-Symbol). 
  Příkaz "\setmath" pak
  převezme kurzívu aktuální rodiny a pouľije ji jako matematickou
  kurzívu. Dále převezme základní variantu aktuální rodiny a pouľije ji
  pro číslice a daląí symboly, které jsou psány i v~matematice jako
  "\rm". Standardní přepínače variant "\rm", "\it", "\bf" a "\bi"
  začnou přepínat do odpovídajících fontů i v~matematické sazbě.
  %
  Při "\def\fomenc{PS}" se navíc chybějící matematické znaky, 
  které obvykle nejsou přítomny v~PostScriptových fontech
  (například písmena řecké abecedy), nahradí z~Post\-Script\-ového fontu 
  Symbol. Tento font se totiľ ke větąině
  PostScriptovým písmům hodí daleko lépe neľ Computer Modern. Ostatní
  znaky (například zvětąující závorky a velké operátory) zůstávájí 
  v~Computer Modern.

* Je-li "\def\fomenc{CM}" (Computer Modern), pak "\setmath" ponechá
  matematickým vzorečkům Computer Modern fonty, jen se případně
  přizpůsobí poľadované velikosti.

* Po zavedení souboru "amsfn.tex" je moľné pouľít "\def\fomenc{AMS}".
  Matematika se pak chová stejně jako při "CM", ale navíc jsou k~dispozici   
  veąkeré symboly z~AMS\TeX{}u.

* Po zavedení souboru "txfn.tex" můľeme pouľít dvě nová kódování: 
  "\def\fomenc{TX}" nebo "\def\fomenc{PX}". 
  V obou případech se pro matematiku pouľijí
  volně dostupné TXfonty, které vycházejí z řezů rodin Times a
  Helvetica. Při hodnotě "TX" se v~matematice pouľijí výhradně
  TXfonty, zatímco při hodnotě "PX" budou TXfonty kombinovány
  s~kurzívou a základním řezem aktuální textové rodiny fontů (podobně
  jako při kódování "PS"). OFS podporuje vąechny kontrolní sekvence na
  matematické symboly podle manuálu k TXfontům. Jsou zde veąekré
  symboly z AMS\TeX{}u a mnoho daląích. Symbolů z TXfontů je několik stovek.
  {\hbadness=1015\par}

* Po zavedení souboru "mtfn.tex" je moľné pouľít
  "\def\fomenc{MT}". Matematika bude obsahovat kurzívu a základní řez
  aktuální rodiny fontů kombinovanou se znaky~komerční verze 
  matematických fontů MathTimes.
\enditems

Podobně jako v~NFSS jsou podporovány dvě verze vzorečků: normal a
bold. Poľadovaná verze se nastavuje v~makru "\mathversion"\inl[mathversion] 
pomocí "\def\mathversion{normal}" nebo "\def\mathversion{bold}". 
Makro "\setmath" pak přizpůsobí zavedení matematických fontů poľadované
verzi. Implicitně je nastaveno "\def\mathversion{normal}".
Nastavení "\mathversion" je potřeba provést před vyvoláním příkazu 
"\setmath". Příklady:

\begtt
\setmath [//] $vzoreček$      % vzoreček je ve verzi "normal"
$\def\mathversion{bold}\setmath[//] vzoreček$ % vzoreček ve verzi "bold"
\endtt


\sec Jak je to uděláno, aneb pohled do hloubky
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\LATEX: Vąechna makra, která jsou jen pomocná, jsou ve stylu "ofs.sty"
definována se jménem "\ofs@jménomakra", aby nedoąlo ke zmatení s~jinými
styly. Makra, která se pouľívají v~deklaračních souborech, mají název
"\OFSjménomakra". Dále styl definuje uľivatelské příkazy "\setfonts",
"\fontdef", "\showfonts", "\fontusage", a předefinovává přepínače
"\rm", "\bf", "\it", "\bi".

\PLAIN: Vąechna makra definovaná v~"ofs.tex" jsou uvedena v~rejstříku na
konci tohoto dokumentu. Při návrhu názvů maker jsem nevyuľil konvenci
se znakem "@", protoľe tento znak v~názvech maker osobně nenávidím.
 

\subsec Výpisy do logu
%%%%%%%%%%%%%%%%%%%%%%

\LATEX: Pro trasování makra NFSS se pouľije balíček "tracefnt".

\PLAIN: Pokud někoho ruąí při častém přepínání rodin fontů příkazem 
"\setfonts" výpisy v~logu, můľe pouľít příkaz 
"\nofontmessages"\inl[nofontmessages].
Pokud naopak chceme tyto výpisy vidět i na terminálu, piąme
"\displayfontmessages"\inl[displayfontmessages]. Implicitně je zapnut výpis
pouze do logu příkazem "\logfontmessages"\inl[logfontmessages].
Pokud chceme přesně vidět, které metriky fontů se zavádějí primitivním
příkazem "\font", pouľijeme "\detailfontmessages"\inl[detailfontmessages].

Varování o~nepřístupných znacích nebo kódováních se vľdy vypisují na
terminál i do logu. Chceme-li je mít jen v~logu, můľeme napsat
"\let\displaymessage=\wlog"\inl[displaymessage], protoľe tato sekvence
je v~OFS pouľívána na zobrazení zpráv na terminál.


\subsec Robustní a křehké příkazy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\LATEX: \LaTeX{}2e má zavedené postupy na definování robustních
příkazů. Význam těchto pojmů je vysvětlen v~dokumentaci k~\LaTeX{}u.
Příkaz "\setfonts" a přepínače deklarované pomocí "\fontdef" jsou
samozřejmě definovány jako robustní, takľe se mohou vyskytovat
v~textech pro obsahy, rejsříky apod. bez toho, aby způsobily obtíľe.

\PLAIN (aľ do konce sekce): 
Makro plainu problematiku křehkých příkazů neřeąí
a uľivatelé plainu, pokud narazí na tento problém, pouľívají různá svá
vlastní řeąení, která nejsou standardizována. Jedno takové řeąení je i
v~OFS.

Nejprve stručně naznačíme, v~čem spočívá problém s~křehkými příkazy.
Občas potřebujeme (pro generování obsahu, rejstříku apod.) poslat
nějaký text do pomocného souboru (primitivem "\write"), aby byl tento
soubor v~zápětí (při daląím zpracování \TeX{}em) znovu načten.
Problém je, ľe primitiv "\write" zapíąe do souboru text po expanzi
maker, coľ nemusí vľdy vyhovovat. Pokud je například fontový přepínač
implementován jako sloľité makro a je pouľit v~textu zpracovaném
primitivem "\write", v~souboru se objeví celé makro po expanzi.
Při opětovném načtení takového souboru dojde větąinou k~havárii;
říkáme, ľe byl pouľit křehký (fragile) příkaz v~textu posílaném do
souboru a v~souboru se nám tento příkaz \uv{rozsypal}.

Pokud se dostane (potenciálně) křehký příkaz z~maker OFS do souboru,
pak se při novém načtení takového souboru automaticky při havárii
zobrazí na terminálu a v~logu návod jak postupovat, aby se uľivatel
tohoto problému zbavil. Text návodu po překladu do čeątiny vypadá
takto:

\begtt
CHYBA !! křehký příkaz v toc/ind/aux nebo podobném souboru.
Tento problém můľete řeąit následujícími kroky:
1. Vymaľte pomocný soubor s tímto křehkým příkazem.
2. Vloľte následující kód do záhlaví svého dokumentu:
      \let\orishipout=\shipout
      \def\shipout#1#2{\setbox0=#1{#2}\bgroup
           \let\expandaction=\noexpand \orishipout\box0 \egroup}
3. Znovu TeXujte svůj dokument nejméně dvakrát za sebou.
Daląí informace najdete v dokumentaci k OFS.
\endtt

Vysvětlíme si, jak je to uděláno. Makro, které můľe v~parametru
primitivu "\write" působit potíľe, je v~OFS definováno zhruba takto:

\begtt
\def\makro {%
   \ifx\expandaction\noexpand
      \noexpand\makro
   \else
      \csname fragilecommand!\endcsname
      <vlastní kód makra>
   \fi
}
\endtt

Pokud se nenastaví "\expandaction"\inl[expandaction] 
na hodnotu "\noexpand", pak se
provede část kódu za "\else". Protoľe příkaz 
"\csname fragilecommand!\endcsname"\inl[fragilecommand!]
není definován, realizuje se v~hlavním procesoru jako "\relax"
[TBN, strana 349]. Při expanzi primitivem "\write" se do souboru
zapíąe "\fragilecommand!". Při daląím čtení soboru se spustí příkaz
"\fragilecommand"\inl[fragilecommand], 
který vypíąe na terminál jiľ zmíněnou nápovědu.

Jestliľe uľivatel pouľije kód z~nápovědy v~záhlaví svého dokumentu,
pak v~době činnosti primitivu "\shipout" (tj.~v~době, kdy expandují
argumenty primitivů "\write") je nastaveno "\let\expandaction=\noexpand". 
V~makru "\makro" se provede první část před "\else", takľe do souboru 
se zapíąe jen "\makro". To je přesně to, co potřebujeme.

V~OFS není kód, který předefinovává "\shipout", přímo zahrnut. Místo
toho pouze doporučíme uľivateli, aby to udělal sám. Uľivatel plainu totiľ
potřebuje mít věci pod vlastní kontrolou a neměl by asi důvěru k~makru,
které bez jeho vědomí předefinuje tak zásadní věc, jako je primitiv
"\shipout". Také je moľné, ľe uľivatel plainu pouľije na různé části
textu ve svých makrech "\edef" a potřebuje vědět, ľe je v~takovém
případě vhodné nejpve nastavit "\let\expandaction=\noexpand".

Podobně jako zde v~ukázce definice příkazu "\makro" jsou 
v~OFS definovány
příkazy "\setfonts" (\beglink{2.2}sekce~2.2\endlink), 
"\setmath" (\beglink{2.7}sekce~2.7\endlink), 
"\setextrafont", "\printcharacter", "\printaccent"
(\beglink{3.4}sekce~3.4\endlink),
"\accentabove", "\accentbelow" a "\ofshexbox" (\beglink{3.6}sekce~3.6\endlink). 
Po pouľití kódu z~nápovědy se tato makra stávají \uv{robustními}
v~\LaTeX{}ovém smyslu tohoto slova.


\subsec Deklarační soubory
%%%%%%%%%%%%%%%%%%%%%%%%%%

\LATEX: Deklarační soubory v~\LaTeX{}u jsou běľné stylové soubory,
které shrnují několik rodin fontů ve smyslu NFSS. Tyto rodiny jsou
deklarovány běľným způsobem ve~"fd" souborech. V~deklaračních souborech 
je moľno pouľít následující příkazy:

\begitems
* "\OFSprocessoptions"\inl[OFSprocessoptions] 
  --- má větąinou hodnotu "\undefined". Pokud ale
  je stylový soubor načítán ze souboru "ofs.sty" jako parametr, 
  má "\OFSprocessoptions" hodnotu "\relax". Test na tuto
  sekvenci pouľíváme v~záhlaví stylového souboru, abychom vynachali
  \LaTeX{}ovské "\RequirePackage{ofs}", pokud to není potřeba (a
  pouze by to zlobilo).
* "\OFSextraencoding {<roząiřující kódování>}"\inl[OFSextraencoding] 
  --- Toto makro si poznamená do paměti <roząiřující kódování> a
  provede "\input {<roząiřující kódování>ini.def}".
  Předpokládá se, ľe tam jsou odpovídající definice pro
  <roząiřující kódování>, viz například soubor "se1ini.def", který obsahuje
  deklarace pro roząiřující kódování SE1 fontů ze Střeąovické písmolijny.
  Pokud uľ byl soubor "<roząiřující kódování>ini.def" načten, makro jej
  nenačítá znovu. Pozor: <roząiřující kódování> je nutno psát 
  velkými písmeny, ačkoli v~názvu souboru musí být naopak tato písmena malá.
* "\OFSputfamlist {<text>}"\inl[OFSputfamlist] 
  --- vloľí <text> do seznamu rodin, který
  se vypisuje při "\showfonts" nebo při neznámé rodině.
* "\OFSdeclarefamily [<JménoRodiny>] {<NFSS-jméno>}"\inl[OFSdeclarefamily] 
  --- poznamená si
  do paměti, ľe <JménoRodiny> je ve skutečnosti <NFSS-jméno>.
  Tato pamě» se vyuľije například v~příkazu "\OFSfamily".
  Navíc zanese <JménoRodiny> do seznamu rodin vypisovaném při 
  "\showfonts".
* "\OFSnormalvariants"\inl[OFSnormalvariants]
  --- do textu, který se vypisuje při "\showfonts" 
  nebo při neznámé rodině vloľí, seznam standardních přepínačů,
  tj.~"\rm,"~"\bf,"~"\it,"~"\bi".
\enditems

\PLAIN (aľ do konce sekce): 
Deklarační soubory mají příponu "tex" a předpokládá se o~nich,
ľe mají pojistku proti opakovanému načtení. Pokud není jeątě načten
soubor "ofs.tex", je nutno jej před daląí činností načíst. Rovněľ je
vhodné zde načíst soubor definic znaků podle pouľitých kódování 
(viz~\beglink{3.4}sekce~3.4\endlink).

V~deklaračním souboru je nutno vytvořit vazbu mezi názvy rodin a pouľitými
metrikami. K~tomu se pouľívají následující příkazy:

\begitems
* "\protectreading <soubor><mezera>"\inl[protectreading] --- poznamená
  si do paměti, ľe je přečten <soubor>. Pokud je příkaz se stejným 
  parametrem čten podruhé, provede "\endinput", takľe následující deklarace jsou
  chráněny proti vícenásobnému čtení.
* "\ofsputfamlist {<text>}"\inl[ofsputfamlist] 
  --- vloľí <text> do seznamu rodin, který
  se vypisuje při "\showfonts" nebo při neznámé rodině.  
* "\ofsdeclarefamily [<JménoRodiny>] {<příkazy>}"\inl[ofsdeclarefamily] 
  --- deklarace nové
  rodiny se jménem <JménoRodiny>. Toto jméno se zanese do seznamu
  známých rodin vypisovaných pomocí "\showfonts". Pokud se tato rodina
  pouľije při "\setfonts", pak se provedou <příkazy>. Mezi <příkazy> se
  pouľije právě jeden příkaz "\loadtextfam", který zavede fonty dané
  rodiny do paměti \TeX{}u.
* "\loadtextfam"\inl[loadtextfam] 
  --- Zavede čtyři fonty s~danými metrikami. Tento příkaz vyľaduje
  podrobnějąí vysvětlení, které je včetně parametrů příkazu uvedeno níľe.
* "\newvariant<číslice> \<přepínač> (<Varianta>) <mezera> <metrika>;<extra-enc>;"\inl[newvariant]
  \null\penalty0 --- Dekla\-ruje nový přepínač varianty.
  Podrobnějąí vysvětlení je uvedeno níľe.
* "\modifyenc <kódování>:<identifikátor>;"\inl[modifyenc] --- přidání
  výjimek vzhledem k~základnímu kódování, viz~\beglink{3.5}sekce~3.5\endlink. 
* "\fosize"\inl[fosize] 
  --- makro, které uchovává informaci o~aktuální velikosti
  fontů v~naposledy vybrané rodině. Obsah "\fosize" můľe mít dvě
  podoby: "at<dimen>" nebo "scaled<number>" podle toho, jaký tvar
  parametru <velikost> byl pouľit v~příkazu "\setfonts".
* "\fotenc"\inl[fotenc] 
  --- makro, které uchovává informaci o~aktuálním kódování.
  Nejčastějąí moľnosti jsou "\def\fotenc{8z}" (kódování podle CS-fontů) nebo
  "\def\fotenc{8t}" (kódování podle Corku). Je-li při načtení souboru
  "ofs.tex" makro "\fotenc" uľ známé, ponechá se beze změny, jinak se
  definuje jako "8z".
* "\extranec"\inl[extraenc] 
  --- makro, které uchovává informaci o~roząiřujícím kódování.
  Tuto informaci tam kopíruje z~parametru <extra-enc> makro "\laodatextfam".
* "\defaultextraenc"\inl[defaultextraenc] 
  --- makro, jehoľ předefinováním můľeme změnit roząiřující kódování základních
  rodin a rodin z~"a35.tex". Výchozí hodnota makra~"8c".
* "\setfontshook"\inl[setfontshook]
  --- makro, které se spustí vľdy při činnosti příkazu "\setfonts"
  těsně před tím, neľ jsou vykonány <příkazy> z~"\ofsdeclarefamily".
* "\registertfm <jméno> <od>-<do> <skutečná metrika>"\inl[registertfm]
  --- umoľňuje pracovat při různých velikostech fontů s~různými
  metrikami. Podrobnosti viz \beglink{3.8}sekce~3.8\endlink.
* "\registerenc <JménoRodiny>: <kódování> <mezera>"\inl[registerenc]
  --- umoľňuje omezit pouľití rodiny fontů jen pro vymezená
  kódování. Podrobnosti viz \beglink{3.9}sekce~3.9\endlink.
\enditems

Příkaz "\loadtextfam" pouľívaný v deklaračních
souborech mezi <příkazy> makra "\ofsdeclarefamily" má parametry:

\begtt
\loadtextfam (<Varianta-rm>) <mezera> <metrika-rm>;%
             (<Varianta-bf>) <mezera> <metrika-bf>;%
             (<Varianta-it>) <mezera> <metrika-it>;%
             (<Varianta-bi>) <mezera> <metrika-bi>;<extra-enc>;%
\endtt
%
Procenta na koncích řádků v této ukázce označují, ľe za středníky nemá
být mezera. 
Údaje "(<Varianta-XX>)" slouľí jako komentáře o variantách zapisované do
logu a je moľno je kompletně včetně závorek a <mezery> vynechat (třeba jen
některé). Ve verzích OFS do Sep~2002 nebyl tento parametr vůbec
podporován. Při vynechání tohoto parametru se předpokládají 
následující implicitní hodnoty: "rm: ()", "bf: (Bold)",
"it: (Italic)", "bi: (BoldItalic)". 

Údaje <metrika-XX> odpovídají názvům metrik, které se pro uvedené
varianty fontů makrem "\loadtextfam" zavedou. Makro zhruba provede toto:

\begtt
\font\tenrm=<metrika-rm> \fosize
\font\tenbf=<metrika-bf> \fosize
\font\tenit=<metrika-it> \fosize
\font\tenbi=<metrika-bi> \fosize
\endtt
%
Předpokládá se, ľe vąechny <metriky-XX> jsou 
v~deklaračním souboru napsány tak, ľe
obsahují makro "\fotenc". %\inl[fotenc]
Tím je zaručena změna názvu metriky při
přechodu na jiné kódování (tj. při předefinování makra "\fotenc").

Konečně údaj <extra-enc> udává název extra kódování. Pokud je tento parametr
neprázdný, pak "\loadtextfam" provede na přechodnou dobu
"\def\fotenc{<extra-enc>}" a znovu expanduje 
parametry <metrika-rm>, <metrika-bf>, <metrika-it> a <metrika-bi>. 
Výsledky těchto expanzí si poznamená do paměti. Jedná se o~roząiřující 
metriky k~základním metrikám. Je-li parametr <extra-enc> prázdný,
poznámka o roząiřujících metrikách se nekoná.
Kdyľ pak nějaké makro pro přístup ke speciálnímu znaku tuto
metriku potřebuje, objeví se na terminálu varování, ľe aktuálně
zvolená metrika nemá roząiřující variantu.

Některé metriky v~příkazu "\loadtextfam"  s výjimkou <metrika-rm> 
mohou být vynechány. Je-li například prázdný parametr 
<metrika-XX>, pak se zhruba provede
\begtt
\def\tenXX{\message{varování o neexistující variantě na terminálu}}
\endtt
%
takľe při přechodu na takovou variantu se objeví na terminálu
a v~logu hláąení o~ne\-existující variantě a font se nezmění.

Příkaz "\setfonts"\inl[setfonts] 
nemění význam maker "\rm", "\bf", "\it" a "\bi",
ale mění význam přepínačů fontů "\tenrm", "\tenbf", "\tenit" a "\tenbi". 
Dělá to navíc zprostředkovaně tím, ľe spustí <příkazy> deklarované pro
poľadovanou rodinu v~"\ofsdeclarefamily" a mezi těmito <příkazy>
se vyskytuje příkaz "\loadtextfam". 

Makra "\rm", "\bf", "\it", resp. "\bi" pouľívají fontové přepínače
"\tenrm", "\tenbf", "\tenit",\inll[tenrm \back tenbf \back tenit]
resp. "\tenbi". První tři jsou známy z~plainu
a čtvrtý\inl[tenbi] je zaveden nově. 
Navíc makra "\rm", "\bf", "\it" a "\bi" ukládají
do kontrolní sekvence "\currentvariant"\inl[currentvariant] 
informaci o~naposledy aktivované variantě. Tato informace má podobu
písmene ("M", "F", "T", resp. "I"), protoľe jedině konstrukce
"\let\currentvariant=<písmeno>" je odolná vůči expanzi. ©lo o~to, aby
makra přepínačů variant byla robustní i bez předefinování "\shipout".

Vąimneme si, ľe "\loadtextfam" nastavuje přepínače 
"\tenrm", "\tenbf", "\tenit" a "\tenbi" 
na fonty v~libovolné velikosti. Činí tak podle aktuální 
hodnoty makra "\fosize", které mění makro "\setfonts" podle toho, jak
je zadán parametr <velikost>.
Slovo {\clqq"ten"\crqq} v~názvech fontových přepínačů tedy
nemusí znamenat, ľe se jedná o~font ve velikosti 10\,pt. Povaľujme
tyto názvy za historické a z~hlediska OFS moľná trochu
kuriózní. Není přitom nutné pro přepínače textových fontů vymýąlet
názvy nové.

Někdo můľe namítnout, ľe opakované pouľívání makra "\setfonts" vľdy
znovu a znovu spouątí čtveřici příkazů "\font", coľ můľe způsobit
větąí nároky na pamě» a čas. Není to pravda, protoľe \TeX{} si eviduje
interní tabulku uľ zavedených metrik a při opakovaném pouľití
primitivu "\font" na stejnou metriku se uľ neobtěľuje metriku vůbec
otevírat. Jen inicializuje přísluąný fontový přepínač asi stejně rychle,
jako by se to provedlo pomocí "\let".

Příkaz "\loadtextfam" jeątě před zavedením fontů načte
při "\loadingenc>0"\inl[loadingenc]
soubor "ofs-\fotenc.tex". Při neprázdném parametru <extra-enc>
navíc načte soubor "ofs-<extra-enc>.tex".
Tyto soubory jsou čteny jen jednou a v době čtení jsou
ignorovány prázdné řádky, konce řádků. Čtení probíhá uvnitř 
skupiny, kde jsou pro jistotu lokálně nastaveny
kategorie znaků podle plain\TeX{}u (a~"\catcode`@=11")
a je nastaveno "\globaldefs=1", tj.~vąechna
předefinování ze souboru "ofs-<kódování>.tex" se provedou globálně.
To nám nevadí, protoľe nově načtené kódovací soubory nejsou v~konfliktu 
s~předchozími (viz vlastnosti příkazů "\characterdef" a "\accentdef"
v~\beglink{3.4}sekci~3.4\endlink). Načtení větąího mnoľství těchto 
souborů neľ je v~dané chvíli potřeba, rovněľ neohrozí funkcionalitu 
maker závislých na kódování. Důvod globální definice je v~tom, ľe 
není vhodné, aby při opakovaném "{...\setfonts...}" musel být 
kódovací soubor načítán neustále znovu a znovu. 

Pokud uľivateli vadí, ľe je předefinování maker globální
(chce například svůj článek zařadit do sborníku, kde by
předefinování mohlo vadit jiným článkům), pak ponechá "\loadingenc=0" a
musí načíst soubory s~deklaracemi maker manuálně pomocí 
"\input" na začátku článku. V~takovém případě se provede
deklarace jen lokálně.

V~parametru <příkazy> makra "\ofsdeclarefamily" se můľe deklarovat
nadstandardní varianta rodiny pomocí příkazu "\newvariant".\inl[newvariant]
Tento příkaz provede:

\begtt
\font\ten<přepínač>=<metrika> \fosize
\def \<přepínač> {\let\currentvariant=<číslice> \ten<přepínač>}
\endtt
%
Dále příkaz "\newvariant" zanese do paměti informaci o~případné
roząiřující metrice podle <ext-enc>.

Pokud OFS potřebuje dodrľet při přechodu na novou rodinu naposledy
zvolenou nadstandardní variantu, činí tak podle hodnoty 
"\currentvariant". Pokud tedy nová rodina má deklarovánu 
nadstandardní variantu pod stejnnou <číslicí>, bude pouľita tato 
varianta a OFS nebude přepínat do defaultní varianty "\rm".
Je proto vhodné deklarovat varianty různých rodin ale 
\uv{stejného typu} pod stejnou <číslicí>. 
Z principu věci vidíme, ľe v~OFS existuje omezení v~počtu
nadstandardních variant jedné rodiny na maximálně 10.
To by nemělo vadit, protoľe kdykoli můľeme rozdělit rozsáhlou 
rodinu na více rodin (například ©tormovy rodiny DynamoGrotesk).

Makro "\setfonts" můľe měnit význam maker "\loadtextfam" a
"\newvariant". Udělá to právě tehdy, kdyľ je v parametru <Rodina>
specifikovaná varianta. V takovém případě stačí zavést jeden font a
není potřeba zavádět celou rodinu. Při specifikaci standardní varianty
"\newvariant" nebude dělat nic a "\loadtextfam" zavede jediný font.
Při specifikaci nadstandardní varianty "\loadtextfam" nebude dělat nic
a "\newvariant" zavede font jen tehdy, pokud se jedná o font
specifikované varianty. 

Na závěr této sekce si podrobněji vysvětlíme činnost 
příkazu "\setfonts".\inl[setfonts] 
Tento příkaz \uv{vypočítá} a definuje podle parametru <velikost> hodnotu
makra "\fosize". Dále při neprázdném pamaretru <JménoRodiny> a při
neuvedení varianty tento příkaz provede
"\def\currentfamily{<JménoRodiny>}"\inl[currentfamily], 
zatímco při prázdném parametru
hod\-notu z~"\currentfamily" pouze pouľije. 
Je-li v~parametrech uvedena varianta
rodiny, pozmění "\setfonts" na přechodnou dobu makra "\loadtextfam" a
"\newvariant" tak, aby místo
celé rodiny fontů byl zaveden jen jeden font. Dále spustí
"\setfontshook" a pak <příkazy> z~odpovídajícího "\ofsdeclarefamily". 
Potom vrátí hodnoty maker
"\loadtextfam" a "\newvariant" do původního stavu, pokud byly 
tyto hodnoty měněny. Nakonec spustí makro 
"\runmodifylist"\inl[runmodifylist], které nastaví za jistých okolností
výjimky ze zvoleného kódování (podrobněji viz~\beglink{3.5}sekci~3.5\endlink).
Konečně příkaz "\setfonts" spustí "\ignorespaces", aby případná
zapomenutá mezera za závorkou~\clqq"]"\crqq nebyla v~horizonálním módu
vytiątěna.


\subsec Kódování fontů a deklarace znaků
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\PLAIN: Pro přepínání do roząiřující metriky slouľí makro 
"\setextrafont"\inl[setextrafont]. 
Toto makro se podívá, zda k~aktuálnímu fontu existuje v~paměti poznámka 
o~roząiřující metrice (viz příkaz "\loadtextfam" a "\newvariant"
\beglink{3.3}v~předchozí sekci\endlink). 
Pokud taková poznámka existuje, příkaz "\setextrafont" provede zhruba toto:

\begtt
\font\extrafont=<roząiřující metrika ve velikosti základní metriky> \extrafont@inl[extrafont]
\endtt

\LATEX:  Pro přepínání do roząiřujícího kódování, které je deklarováno
příkazem "\OFSextraencoding", slouľí (stejně jako v plainu) 
makro "\setextrafont". Toto makro se podívá, zda bylo 
roząiřující kódování deklarováno, a pokud ano, provede zhruba toto:

\begtt
\fontencoding{<roząiřující kódování>}\selectfont
\endtt

\OBA: Chceme-li vytisknout z~roząiřující metriky (roząiřujícího
kódování) nějaký znak s~kódem <číslo>, je moľné pouľít 
makro "\extchar <číslo>"\inl[extchar].

\PLAIN (aľ do konce sekce):
Pro definice maker závislých na aktuálním kódování
je moľné v~OFS pouľít dva deklarační příkazy: 
"\characterdef" a "\accentdef". První z~nich\inl[characterdef] 
má tyto parametry:

\begtt
\characterdef \<sekvence>  <kódování> <mezera> <číslo>
% příklad:
\characterdef \promile  8z  141
% nebo
\characterdef \<sekvence>  <kódování> <mezera> {<příkazy>}
% příklad:
\characterdef \promile  8t  {\%\char24 }
\characterdef \promile  *   {\vrule height1ex width1ex\relax} 
                            % in another encodings
\endtt

V~prvním případě se bude "\<sekvence>" při aktuálním kódování fontů 
shodném s~<kódováním> expandovat na token kategorie 12 s~kódem 
rovným <číslu>. V~druhém případě "\<sekvence>" expanduje při 
shodnosti <kódování> na <příkazy>. Vąe proběhne na úrovni 
expand procesoru. Pokud pouľijeme oba výąe zmíněné příklady 
pro definici "\promile", pak platí:

\begtt
\def\fotenc{8z} \promile % expanduje na znak s kódem 141
\def\fotenc{8t} \promile % expanduje na příkazy \%\char24
\endtt

Mimoto je moľné deklarovat přístup k~roząířenému kódování, pokud je
toto kódování specifikováno jako parametr <extra-enc> v~příkazu
"\loadtextfam". Příklad:

\begtt
\characterdef \euro  8z  134
\characterdef \euro  6s  37

\def\fotenc{8z} \euro % expanduje na znak s kódem 134
\def\fotenc{8t} \euro % expanduje na: {\setextrafont znak s kódem 37}
\endtt

V~tomto příkladě se při "\def\fotenc{8t}" můľe stát, ľe aktuální font
nemá poznámku o~roząiřující metrice, nebo má poznámku o~roząiřující 
metrice jiné neľ "6s". Pak "\euro" vypíąe varování na terminál 
o~nedostupnosti znaku "\euro".

Vysvětlíme nyní podrobněji, jak makra deklarovaná pomocí 
"\characterdef" fungují. Příkaz "\characterdef"
definuje "\<sekvenci>" 
jako "\printcharacter{<sekvence>}"\inl[printcharacter],
takľe například "\promile" expanduje nejprve na "\printcharacter{promile}".
a "\euro" na "\printcharacter{euro}".
Pokud se "\characterdef" pouľije opakovaně na stejnou "\<sekvenci>",
pak se vľdy znovu definuje stejně, takľe nedochází ke ztrátě předchozí
informace. Kromě toho ale "\characterdef" definuje daląí makro 
"\<sekvence>:-<kódování>" tak, ľe toto makro expanduje na znak se 
specifikovaným kódem nebo na <příkazy>. Daląí inteligence je schována 
v~příkazu "\printcharacter". Ten ověří, zda je definováno makro 
"\<sekvence>:-\fotenc". Pokud ano, expanduje na obsah tohoto makra.
Jinak ověří, zda existuje poznámka o~roząiřující metrice vztaľená
k~aktuálnímu fontu. Pokud ano, zjistí kódování této roząiřující
metriky <extra-enc> a podívá se, zda je definováno makro 
"\<sekvence>:-<extra-enc>". Pokud ano, expanduje na 

\begtt
{\setextrafont \<sekvence>:-<extra-enc>} 
\endtt
%
Pokud se stále nepodařilo realizovat poľadovaný znak, 
pokusí se vytisknout defaultní znak nezávislý na kódování 
"\<sekvence>:-*". Pokud ani to není moľné,
spustí se "\printcharacterwarn{<sekvence>}".\inl[printcharacterwarn]
Implicitní hodnota tohoto makra vypíąe varování 
o~nedostupném znaku <sekvence> na terminál a do logu a do výstupu
nevytiskne nic.

Chceme-li se vyhnout výpisu varování, můľeme "\printcharacterwarn"
předefinovat, třeba takto:

\begtt
\def\printcharacterwarn #1{?(#1)?}
\endtt

Od verze OFS Mar. 2004 "\characterdef" odmítá předefinovat uľ
definované kontrolní sekvence. Definuje pouze sekvence, které mají
zatím význam "\undefined" nebo "\relax". V jiném případě (a pokud není
sekvence uľ pomocí "\characterdef" definována) vypíąe
varování o ignorované definici do log souboru. Důvod tohoto opatření
je ten, ľe kódovací soubory deklarují obrovské mnoľství nových
kontrolních sekvencí pomocí "\characterdef", a přitom programátor
maker nemusí vąechny znát. Můľe se tedy stát, ľe pouľije pro své vlastní makro
stejné jméno. V takovém případě "\characterdef" respektuje makro
definované programátorem a přísluąný znak ponechá nepřístupný.
Pokud potřebujeme pomocí "\characterdef" skutečně některé
kontrolní sekvence předefinovat (u~maker závislých na kódování z~plainu to je
nutné), pak musíme před pouľitím "\characterdef" napsat
"\let\<sekvence>=\relax". 

Ze~stejných důvodů bylo do OFS přidáno makro "\safelet"\inl[safelet],
které se chová jako "\let", ale odmítá předefinovat uľ definované
kontrolní sekvence. Místo toho pouze vypíąe varování, definované 
v~makru "\safeletwarn"\inl[safeletwarn].

Kromě deklarace znaků pomocí "\characterdef" je k~dispozici moľnost
deklarace akcentových příkazů prostřednictvím 
"\accentdef"\inl[accentdef], který má
tyto parametry:

\begtt
\accentdef \<sekvence> <znak> <nepovinná mezera> <kódování> <mezera> <číslo>
% Příklad:
\accentdef \v E  8z  204           % Ecaron
% nebo
\accentdef \<sekvence> <znak> <nep. mezera> <kódování> <mezera> {<příkazy>}
% Příklad:
\accentdef \v *  8z  {\accent20 }  % default caron in 8z
\accentdef \v *  *   {\blackbox }  % default caron
\endtt

Pokud je aktuální kódování fontů totoľné s~<kódováním>, pak "\<sekvence>"
následovaná znakem <znak> expanduje na token kategorie 12 s~kódem
<číslo>, respektive expanduje na <příkazy>. To vąe se děje jen na
úrovni expand procesoru. Pokud je při deklaraci
pomocí "\accentdef" jako <znak> uvedena hvězdička, pak se deklarované
<příkazy> nebo kód <číslo> pouľije vľdy, kdyľ znak následující 
"\<sekvenci>" není nikde prostřednictvím "\accentdef"
deklarován. Jedná se tedy o~defaultní realizaci akcentu, pokud ve
fontu neexistuje přímo akcentovaný znak.

Kromě toho mají akcenty deklarované pomocí "\accentdef" stejnou
inteligenci týkající se moľnosti vyuľití roząiřující metriky, jako
znaky deklarované v~"\characterdef".

Vysvětlíme si nyní podrobněji, jak akcenty deklarované pomocí 
"\accentdef" fungují. Příkaz "\accentdef"
definuje "\<sekvenci>" jako makro s~jedním neseparovaným parametrem
"#1", které v~první řadě expanduje 
na "\printaccent{<sekvence>}{#1}"\inl[printaccent],
takľe například "\v E" expanduje na "\printaccent{v}{E}". Dále
"\accentdef" definuje makro "\<sekvence>:<znak>:-<kódování>" jako znak
s~daným kódem <číslo> nebo jako <příkazy>. Daląí práci udělá
příkaz "\printaccent". Tento příkaz zjistí, zda je definováno makro
"\<sekvence>:<znak>:-\fotenc". Pokud ano, expanduje na toto makro.
Pokud ne, tak si ověří, zda je k~aktuálnímu fontu poznamenána
roząiřující metrika a zjistí její kódování <extra-enc>. Jestliľe je
definováno makro "\<sekvence>:<znak>:-<extra-enc>", pak se expanduje na 
"{\setextrafont \<sekvence>:<znak>:-<extra-enc>}". Pokud zatím vąe
selhalo, zkusí "\printaccent" postupně zjistit, zda jsou definována
makra "\<sekvence>:*:-\fotenc" a "\<sekvence>:*:-<extra-enc>". Pokud je
definováno první z~nich, expanduje a připojí na konec expanze <znak>.
Pokud je definováno jen druhé z~nich, expanduje na

\begtt
{\setextrafont \<sekvence>:*:-<extra-enc> <normalfont> <znak>}
\endtt
%
kde <normalfont> označuje přepínač do aktuálního fontu. Jestliľe 
dosud vąe selhalo, pokusí se jeątě o~realizaci akcentu nezávislého na
kódování, tj.~pokusí se tisknout "\<sekvence>:<znak>:-*" nebo konečně
"\<sekvence>:*:-*  <znak>". Teprve kdyľ i toto selhalo,
spustí se "\printaccentwarn{<sekvence>}{<znak>}".\inl[printaccentwarn]
Implicitní hodnota tohoto makra vypíąe se na terminál a do 
logu varování o~nedostupnosti akcentovaného znaku a do výstupu
nevytiskne nic.

Je třeba si uvědomit, ľe přechod ke znaku v~roząiřující metrice uvnitř
slova znamená ztrátu vyrovnávacího kernu kolem tohoto znaku a
nemoľnost pouľít na takové slovo vzory dělení slov. Proto doporučujeme
pouľít základní metriku kódovanou tak, aby přechod na roząiřující
metriku byl jen výjimečný. Pro český a slovenský jazyk jsou v~tomto smyslu
vhodná kódování "8z" i "8t", protoľe obě zahrnují kompletní českou a
slovenskou abecedu. 

Chceme-li odstranit uľ deklarovaný znak\inl[characterdel]
(viz téľ tzv.~<výjimky> v~následující sekci), můľeme pouľít příkazy
"\characterdel" a "\accentdel".\inl[accentdel]
Tyto příkazy mají stejné parametry
jako "\characterdef" resp. "\accentdef" a odstraní definici příkazu
"\<sekvence>:-<kódování>" resp. "\<sekvence>:<znak>:-<kódování>".

%Na závěr této sekce uvedeme příklad definice inteligentního
%"\Uppercase":
%
%\begtt
%\def\Uppercase #1{\bgroup
%   \let\expandaction=\noexpand % \euro zůstane po expanzi bez změny
%                               % \u{g} taky zůstane beze změny
%   \def\ss{SS}\def\l{\L}\def\o{\O}\def\ae{\AE}\def\oe{\OE}%
%   \edef\tmp{#1}\expandafter
%   \egroup \expandafter\uppercase\expandafter{\tmp}%
%}                    % \uppercase promění \u{g} na \u{G}. O to ąlo.
%\endtt


\subsec \PLAIN: Soubory maker závislých na kódování a výjimky z~kódování
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Příkazy "\characterdef" a "\accentdef" popsané v~předchozí sekci
předefinovávají makra závislá na kódování ("\v", "\ae", atd.). V~této
sekci popíąeme koncepci, kam tato makra zapisovat, aby OFS při
"\loadingenc=1" udrľovalo konzistentní definice těchto maker
v~závislosti na zvoleném kódování a na mnoľině výjimek
pouľité rodiny fontů.

Deklarace maker pomocí "\characterdef" a "\accentdef"
se zapisují do souborů s~názvem "ofs-<kódování>.tex" (tzv.~{\it
kódovacích souborů\/}),
protoľe příkaz "\loadtextfam" (volaný z~makra "\setfonts") 
tyto deklarace při nastaveném "\loadingenc=1"\inl[loadingenc] odtud čte.

Kaľdé kódování má svou základní sadu znaků a akcentovaných písmen.
Tato sada je v~kódovacím souboru zanesena pomocí příkazů
"\characterdef" a "\accentdef". Vzhledem k této základní sadě mohou
jednotlivé rodiny fontů obsahovat nějaké znaky navíc nebo naopak nějaké
znaky mohou chybět. Tyto výjimky se deklarují
pomocí příkazu "\modifydef"\inl[modifydef] takto:

\begtt
\modifydef <kódování>:<identifikátor>; {<výjimky>}
\endtt
%
Přitom <výjimky> obsahují příkazy "\characterdef", "\accentdef",
"\characterdel" a "\accentdel". Příkazy "\*del" musejí obsahovat 
v~argumentu hodnotu znaku podle základní sady daného kódování.
Pokud má být nějaký znak vzhledem k základní sadě předefinován, musejí
příkazy "\*del" a "\*def" k tomuto znaku následovat těsně za sebou.

V parametru příkazu "\ofsdeclarefamily" můľeme pomocí \uv{odkazu na
<výjimky>} příkazem "\modifyenc"\inl[modifyenc]
vyznačit, ľe daná rodina obsahuje vzhledem k~základní sadě kódování
odpovídající <výjimky>. Příkaz má tvar:

\begtt
\modifyenc <kódování>:<identifikátor>;%
\endtt
%
Takových příkazů můľe být pro kaľdou rodinu fontů uvedeno více 
(a samozřejmě tyto příkazy mohou obsahovat různá <kódování>).
Odkazuje-li tento příkaz na <výjimky>, které jeątě
nebyly deklarovány, neprovede se nic. 

Příklad deklarace výjimek kódování "8z:csfonts" najdete v~souboru
"ofs-8z.tex" a odkazy na ně pak najdete u~rodin "CM*" 
v~souboru "ofsdef.tex". 

Příkazy "\modifyenc" jsou spuątěny při kaľdém "\setfonts". Ve
skutečnosti tyto příkazy pouze ukádají do tzv.~{\it seznamu odkazů}
(do makra "\newmodifylist"\inl[newmodifylist])
své parametry. Při startu "\setfonts" se zakládá prázdný seznam odkazů.
"\modifyenc" ukládá do tohoto seznamu svůj parametr jen tehdy, pokud 
<kódování> je rovno "\fotenc" nebo "\extraenc". Vlastní práci 
(nastavení výjimek) provede aľ příkaz "\runmodifylist", který je spuątěn
na konci "\setfonts" a jehoľ činnost si nyní podrobně popíąeme.

Makro "\runmodifylist"\inl[runmodifylist] porovná seznam 
odkazů na výjimky předchozí rodiny ("\modifylist"\inl[modifylist]) 
se seznamem odkazů nově nastavené rodiny ("\newmodifylist").  Pokud jsou oba seznamy
stejné nebo "\modifylist" má význam "\relax", pak "\runmodifylist" 
ukončí činnost.  Jinak se pustí do nastavení výjimek. Nejprve prohodí významy
"\characterdef"$\leftrightarrow$"\characterdel" a
"\accentdef"$\leftrightarrow$"\accentdel" a spustí "\modifylist"
Jinými slovy vrátí stav maker vázaných na
kódování do výchozího stavu.  Při této činnosti je ignorováno mazání
znaku, pokud těsně před tím byl znak deklarován (viz pravidlo 
o~předefinování znaku na začátku této sekce).  Pak příkaz "\runmodifylist"
vrátí "\characterdef" a "\accentdef" do původního stavu a spustí
"\newmodifylist". Veąkerá předefinování, která se při této činnosti provádějí, 
jsou jen lokální. Mechanismus dvou seznamů odkazů zaručuje, 
ľe například při

\begtt
\setfonts [Rodina1/] ... \setfonts [Rodina2/] ...
\endtt
%
budou správně nastaveny výjimky aktuálního kódování i pro
Rodinu2, ačkoli Rodina1 má jinou mnoľinu výjimek neľ
Rodina2. 

Kontrolní sekvence "\modifylist" má po inicializaci OFS význam
prázdného makra. Programátor maker můľe pouľít
"\let\modifylist=\relax" a tím potlačí veąkeré nastavování výjimek.

Poznamenejme jeątě, ľe deklarační příkazy "\modifydef" nejenľe ukládají 
<výjimky> do paměti, ale projdou také
jejich obsah a definují vąechny zde deklarované sekvence jako odpovídající
"\printcharacter" resp. "\printaccent". Tím máme zaručeno, ľe kaľdá
kontrolní sekvence ze vąech výjimek je definována (nedojde ke zprávě
{\tt undefined control sequence}) a navíc OFS má
dokonalý přehled o tom, zda je v~aktuální rodině tato kontrolní
sekvence pouľitelná nebo nikoli. Tvůrce maker si pak můľe podle
potřeby předefinovat makra "\print*warn".

Příkaz "\modifydef" prochází <výjimky> tak, ľe na přechodnou dobu
pozmění příkazy "\accentdef", "\accentdel", atd. a <výjimky> spustí.
Pokud nechceme, aby se makra ve <výjimkách> spouątěla uľ v~době
činnosti "\modifydef", uvedeme před tato makra sekvenci
"\skipfirststep".\inl[skipfirststep]
Ta se chová jako "\relax", ale při spouątění
<výjimek> příkazem "\modifydef" způsobí, ľe vąe za touto sekvencí aľ
do konce <výjimek> bude přeskočeno.

Identifikátory "<kódování>:lccodes" a "<kódování>:ienc" jsou rezervovány
pro pouľití mimo OFS v~daląích makrech. OFS například vůbec neřeąí nastavení
"\lccode", "\uccode" znaků podle pouľitého kódování. Makro, které
se o toto stará, můľe vhodně definovat příkazy "\lccodes"\inl[lccodes]
a "\lccodesloop"
a spustí "\csname <kódování>:lccodes\endcsname". OFS uvedené příkazy
vůbec nedefinuje.\inl[lccodesloop]  
Deklarace "<kódování>:lccodes" jsou uvedeny 
v~souborech "ofs-8t.tex" a "ofs-8z.tex" ačkoli nejsou v OFS vyuľity, 
protoľe to souvisí s~kódováním textových fontů. Příklad pouľití
"<kódování>:lccodes" je v makru "lang.tex" a makro "inec.tex"
pouľívá "<kódování>:ienc". V dokumentaci~k těmto makrům je
řečeno více.

Deklarace nejčastěji pouľívaných výjimek se zapisují přímo do
kódovacích souborů. Deklarace méně obvyklých výjimek (vztahujících se
jen na určité rodiny fontů) můľeme psát za "\endinput" deklaračních
souborů. Mezi <příkazy> makra "\ofsdeclarefamily" pak
pouľijeme příkaz\inl[modifyread]

\begtt
\modifyread <jméno souboru>;%
\endtt
%
Tento příkaz při kladném "\loadingenc" načte daný soubor
od výskytu sekvence "\modifytext"\inl[modifytext].
Tuto sekvenci je vhodné umístit za "\endinput", aby "\modifyread"
přečetl tu část souboru, která zatím nebyla čtena.
Přiřazení je v době čtení globální a ignorují se konce 
řádků a prázdné řádky. Opakovaně se soubor nenačítá. 

Díky tomuto příkazu můľeme soustředit deklarace rodin fontů a
deklarace výjimek z~kódování do společného souboru. Výjimky
\TeX{} přečte aľ v době, kdy to potřebuje. ©etří se tím pamě» \TeX{}u.
Příklad pouľití je v~souboru "slido.tex".

OFS nabízí také testovací
makro, zda kontrolní sekvence odpovídá znaku, který je ve fontu
přístupný či nikoli:\inl[knownchar]

\begtt
\knownchar <znak nebo akcent+znak>? \iftrue znak je přístupný
           \else   znak je nepřístupný nebo nedefinovaný \fi
% příklad:
\def\tryeuro{\knownchar \euro? \iftrue \euro \else Euro\fi}
\endtt


\subsec Pomocná makra pro akcenty a znaky
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Pro pohodlné deklarování defaultních akcentů jsou v~OFS\inl[accentabove] 
připravena dvě makra: "\accentabove" a "\accentbelow", 
která se pouľívají takto:\inl[accentbelow]

\begtt
\accentabove {<znak akcentu>}{<vertikální mezera>}{<základní znak>}
\accentbelow {<znak akcentu>}{<vertikální mezera>}{<základní znak>}
\endtt

Příkaz "\accentabove" resp. "\accentbelow" přisadí 
<znak akcentu> nad resp. pod <základní znak>, přičemľ mezi těmito
znaky bude <vertikální mezera>. Oba znaky budou na společné vertikální
ose a při skloněném písmu na společné skloněné ose. ©ířka výsledného 
sloľeného znaku je odvozena od ąířky základního znaku. Makra jsou
implementována jako "\vbox" resp. "\vtop" společně s~"\halign" a 
s~výpočtem usazení na případně skloněné ose.

Znaky pro akcent nahoře jsou ve fontech vesměs kresleny ve výące
odpovídající základnímu znaku o~výące 1\,ex. Proto usazení 
takového akcentu vyľaduje kompenzaci:

\begtt
\accentabove {<znak akcentu>}{-1ex}{<základní znak>}
\endtt

V~tomto případě se akcent umístí naprosto stejně, jako při pouľití
primitivu "\accent". Na rozdíl od tohoto primitivu ale makra
"\accentabove" a "\accentbelow" umoľnují vzájemné skládání, 
čímľ můľeme dosáhnout několikanásobného akcentu. Vyzkouąejte:

\begtt
\it \accentabove {.}{.1ex}{\accentabove {,}{.1ex}{\v A}}
\endtt

\PLAIN:
Bohuľel, makra deklarovaná pomocí "\accentdef" nejsou uzpůsobena na
více neľ dvojí akcent. Navíc dvojí akcent je moľný jen 
v~tom případě, ľe se vnitřní akcent
se základním znakem realizuje jako jediný znak. Pokud potřebujeme 
vícenásobný akcent, můľeme vľdy pouľít přímo v~textu makro 
"\accentabove" nebo "\accentbelow".

\PLAIN:
Od verze OFS Feb. 2004 je k dispozici makro
"\ofshexbox"\inl[ofshexbox], které pracuje podobně jako
plainové "\mathhexbox", ale navíc dovede nastavit font podle 
aktuální varianty. Nejprve pomocí příkazu 
"\ofshexboxdef"\inl[ofshexboxdef] nastavíme \uv{rodinu} čtyř metrik:

\begtt
\ofshexboxdef <rodina>{<metrika-rm>}{<metrika-bf>}{<metrika-it>}{<metrika-bi>}
\ofshexboxdef 2 {cmsy}{cmbsy10}{cmsy}{cmbsy10} % například takto
\endtt
%
Pak příkaz "\ofshexbox <rodina><hexa-kód>" vytiskne znak s~<hexa-kódem>
z jednoho ze čtyř deklarovaných fontů a v aktuální velikosti "\fosize"
Volba fontu závisí na aktuální variantě. Pokud je varianta jiná neľ
"\bf", "\it", "\bi", pouľije se <metrika-rm>. OFS implicitně deklaruje
jen <rodinu> = 2, protoľe plain pouľívá jen "\mathhexbox2..".
Cílem tohoto makra bylo definovat pro CMfonty/CSfonty znaky
"\S", "\dag", "\ddag", "\P" způsobem, který je nezávislý na aktuálním
nastavení matematických fontů, ale je závislý na aktuální velikosti a
variantě. Viz soubor "ofs-8z.tex".

Pomocí "\ofshexbox" můľeme snadno definovat například symbol 
"\euro" pro vąechna kódování fontů, ve kterých je tento 
symbol nepřítupný:

\begtt
\ofshexboxdef {TS1}{tcrm1000}{tcbx1000}{tcti1000}{tcbi1000}
\characterdef \euro * {\ofshexbox{TS1}BF}
\endtt


\subsec \PLAIN: Fonty v~matematice podruhé
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Nastal čas podrobněji vysvětlit činnost příkazu "\setmath"\inl[setmath].
Ten převezme parametry a vypočítá z~nich
základní\inl[textfosize],
indexovou a index-indexovou velikost fontů. Výsledky uloľí do maker
"\textfosize"\inl[scriptfosize], 
"\scriptfosize" a "\scriptscriptfosize". V~nich jsou
údaje o~velikosti uloľeny ve tvaru 
"at<dimen>" nebo "scaled<číslo>"\inl[scriptscriptfosize]
podobně jako v~makru "\fosize". Pak příkaz "\setmath" spustí makro
"\mathfonts"\inl[mathfonts].  
V~něm se předpokládá zavedení a nastavení
matematických fontů. 
Pokud je "\setmath" spuątěno poprvé nebo pokud doąlo ke změně
hodnoty "\fomenc", tak "\setmath" jeątě spustí
makro "\mathchars"\inl[mathchars]. 
Tam se obvykle nastavují kódy matematických znaků pomocí 
"\mathcode", "\mathchardef" a příbuzných primitivů.
Makra "\mathfonts" a "\mathchars" mají sice v~OFS svou 
implicitní hodnotu, ale zkuąený uľivatel je můľe podle své 
potřeby měnit.

Pro pohodlné zavádění a nastavování matematických fontů je připraveno
makro "\loadmathfam"\inl[loadmathfam], 
které se pouľívá v~definici makra "\mathfonts".
Makro "\loadmathfam" má tyto moľnosti parametrů:

\begtt
%%                                % font je deklarován:
\loadmathfam <rodina>[/<metrika>]   % metrikou
\loadmathfam <rodina>[-<varianta>/] % variantou aktuální rodiny
\loadmathfam <rodina>[<přepínač>/]  % přepínačem textového fontu
\loadmathfam <rodina>[X<přepínač>/] % roząiřující metrikou přepínače
\endtt
%
Příklady:

\begtt
\loadmathfam 0[tenrm/]% metrika podle přepínače \tenrm
\loadmathfam 5[-bi/]%   metrika z akuální textové rodiny, varianta bi
\newmathfam \symbfam 
\loadmathfam \symbfam [/psyr]%    metrika psyr
\newmathfam \extitfam
\loadmathfam \extitfam [Xtenit/]% roząiřující metrika k přepínači tenit
\endtt
%
V~příkladě jsou do rodiny 0 zavedeny fonty stejné, jako v~aktuálním
textovém fontu "\tenrm". V~rodině 5 jsou zavedeny fonty
jako při~"\setfonts [-bi/]".
Dále je deklarována nová rodina "\symbfam",
do které jsou zavedeny fonty z~metriky "psyr". 

Existuje nepatrný rozdíl např.~mezi pouľitím příkazu "\loadmathfam 5[tenbi/]"
a "\loadmathfam 5[-bi/]". V~prvním případě OFS zjistí metriku 
k~přepínači "\tenbi" a tuto metriku pouľije ve vąech velikostech
stejnou pouze modifikovanou klíčovým slovem "at<dimen>".
Ve druhém případě se můľe pro různé velikosti pouľít různá metrika,
pokud je tato vlastnost pro danou variantu fontu
deklarována (viz~\beglink{3.8}sekce~3.8\endlink).

Pro deklaraci nové
rodiny se v příkladu pouľila alternativa k~"\newfam" s~názvem 
"\newmathfam"\inl[newmathfam], 
protoľe makro "\newfam" z~plainu je definováno jako "\outer" 
a nelze je tedy pouľít uvnitř definice. Navíc makro
"\newmathfam" pracuje lokálně a tudíľ ąetří více místa pro uľivatelské
rodiny neľ plainovské "\newfam".
V~deklaracích základních matematických kódování se nové matematické
rodiny definují přímo pomocí "\chardef" a je tam pomocí příkazu
"\lastfam=<číslo>"\inl[lastfam]
nastavena maximální pouľitá hodonta. To zaručí, ľe uľivatel můľe
později pouľít "\newmathfam" a začne alokovat daląí
rodiny s~čísly těsně větąími neľ "\lastfam".

Popíąeme nyní princip činnosti makra "\loadmathfam". Toto makro
zjistí metriku, která odpovídá zadanému parametru. 
Pak provede třikrát primitiv "\font" zhruba takto:

\begtt
\font \<název>-Mt = <metrika> \textfosize
\font \<název>-Ms = <metrika> \scriptfosize
\font \<název>-Mss = <metrika> \scriptscriptfosize
\textfont <rodina> = \<název>-Mt
\scriptfont <rodina> = \<název>-Ms
\scriptscriptfont <rodina> = \<název>-Mss
\endtt
%
Přitom <název> je text parametru "\loadmathfam", který deklaruje
metriku (přepínač, varianta nebo metrika).

Fonty matematické rodiny~3 jsou v~plain\TeX{}u obvykle zavedeny bez
zmenąování pro indexy a indexy indexů. Pokud poľadujeme 
při zavádění matematické rodiny
nezmenąovat fonty pro indexy, uvedeme těsně před "\loadmathfam" 
prefix "\noindexsize"\inl[noindexsize]. 
Makro "\loadmathfam" pak zavede font jen ve velikosti "\textfosize"
a pouľije ho i pro indexovou a indexindexovou velikost.
Příklad:

\begtt
\noindexsize\loadmathfam 3[tenex/]% Standard extra symbols from CM
\endtt

OFS definuje v~souboru "ofsdef.tex" pro zavádění matematických fontů
čtyři různá makra. Ta se pouľijí podle toho, zda je "\fomenc" 
nastaveno na "CM" nebo "PS" a "\mathversion" na "normal" nebo "bold". 
Dále OFS definuje dvě makra s~deklaracemi matematických kódů,
která se pouľijí podle aktuálně nastavené hodnoty "\fomenc".

\begitems
* "\loadCMnormalmath"\inl[loadCMnormalmath] 
  --- zavede CM fonty ve verzi \uv{normal}.
* "\loadCMboldmath"\inl[loadCMboldmath]
  --- zavede CM fonty ve verzi \uv{bold}.
* "\loadPSnormalmath"\inl[loadPSnormalmath]
  --- zavede PostScriptové fonty ve verzi \uv{normal}.
* "\loadPSboldmath"\inl[loadPSboldmath]
  --- zavede PostScriptové fonty ve verzi \uv{bold}.
* "\setCMmathchars"\inl[setCMmathchars]
  --- ponechá matematické kódy z~plainu.
* "\setPSmathchars"\inl[setPSmathchars]
  --- nastaví matematické kódy tak, aby se nahradily
  některé znaky z~fontu Symbol.
\enditems

Dále je v~OFS implicitně nastaveno:

\begtt
\ifx \fomenc\undefined \def\fomenc{PS}\fi 
\def\mathversion{normal}
\def\defaultmathfonts{\csname load\fomenc\mathversion math\endcsname}@inl[defaultmathfonts]
\def\defaultmathchars{\csname set\fomenc mathchars\endcsname}@inl[defaultmathchars]
\def\mathfonts{\defaultmathfonts}
\def\mathchars{\defaultmathchars}
\endtt

Je moľné přidávat k~implicitně nastaveným matematickým fontům 
daląí matematické rodiny (v~terminologii NFSS matematické abecedy) 
pozměněním maker "\mathfonts" a případně "\mathchars". 
Níľe je příklad přidání fraktury z~Eulerových fontů od AMS:

\begtt
\input amsfn % tam je deklarována metrika eufm a eufb
\addcmd\mathfonts{\def\tmpa{bold}%
   \ifx\mathversion\tmpa \def\tmpa{b}\else\def\tmpa{b}\fi
   \newmathfam\frakfam \loadmathfam\frakfam [/euf\tmpa]}
\def\frak#1{{\fam\frakfam#1}}
\endtt

Daląí příklady deklarací matematických rodin 
jsou uvedeny v~souborech "amsfn.tex",
"txfn.tex" a "mtfn.tex". Soubory definují výchozí skupiny
matematických fontů pro kódování "AMS", "TX", "PX", "MT".
Na konci těchto souborů jsou komentáře včetně ukázek, jaké
doplňující rodiny fontů je moľno pomocí "\addcmd" zavést.

Protoľe chci umoľnit načtení vąech fontových deklarací OFS 
v~ini\TeX{}u (viz projekt Ok\TeX{}), ale přitom ąetřit pokud 
moľno pamětí \TeX{}u, rozhodl jsem se nenačítat rozsáhlé definice
obsahující deklarace kódování matematických fontů pomocí
"\mathchardef" atd. okamľitě, ale aľ v době, kdy to uľivatel 
v dokumentu skutečně potřebuje. 
Proto jsem od verze OFS Apr. 2004 předefinoval například makro
"\setPSmathchars" takto:

\begtt
\def\setPSmathchars{\mathencread ofs-ps;}
\endtt
%
Příkaz "\mathencread <soubor>;"\inl[mathencread]
načte kódovací příkazy ze souboru
<soubor.tex>. Např. v~souboru "ofs-ps.tex" jsou kódovací příkazy pro
kódování "PS", v~"ofs-ams.tex" jsou kódovací příkazy pro kódování 
"AMS"~atd.

V~souborech "ofs-ps.tex", "ofs-tx.tex" atd.
jsou kódovací příkazy \uv{baleny} do skupin a
definovány příkazem "\mathencdef"\inl[mathencdef]. Tento příkaz
pracuje implicitně jako \uv{definuj, spus» a zapomeň}. Tento model
ąetří pamě», ale při častých změnách matematického kódování budou
kódovací soubory čteny opakovaně znovu. To větąinou nevadí, protoľe
větąinou bývá pro celý dokument nastaveno jediné matematické kódování.
Pokud ale tento model někomu nevyhovuje, můľe si jako cvičení zkusit
předefinovat "\mathencread" a "\mathencdef" tak, aby se soubory četly
jen jednou a při opakovaném spuątění "\mathchars" se kódovací příkazy 
četly ze zapamatovaných maker.

Příkaz "\mathencread <soubor>;" zaloľí skupinu, ve které pro jistotu
nastaví kategorie vąech znaků podle plain\TeX{}u 
(s~výjimkou "\catcode`@=11") a přečte "<soubor>.tex".
Při čtení je "\globaldefs=1" a ignorují se konce řádků a prázdné řádky.
Rovněľ je ignorováno makro "\protectreading", takľe soubor můľe být
čten opakovaně. Příkazy "\mathencdef" spustí a zapomenou
nadefinovaná makra aľ po uzavření skupiny, 
takľe tato makra spouątí příkazy "\mathchardef" atd. uľ jen 
s~lokálními přiřazeními.

Vysvětlíme, jak je zajiątěno obnovování výchozích hodnot
při přepínání mezi matematickými kódováními.
Příkaz "\setmath" spouątí těsně před "\mathchars" makro 
"\mathcharsback"\inl[mathcharsback], aby uvedl matematické kódování
do výchozího stavu podle plain\-\TeX{}u.
Toto makro má implicitně význam
"\relax", protoľe implicitně je matematické kódování
podle plain\TeX{}u nastaveno.
Mění-li ale příkaz "\set<fomenc>mathchars" hodnoty nastavené
v~plain\TeX{}u, měl by také definovat makro
"\mathcharsback", do kterého uloľí postup, jak 
vrátit nastavení do původního stavu.
V definici makra "\mathcharsback" můľeme mimo jiné pouľít
příkaz "\mathencread ofs-cm;", protoľe v~souboru "ofs-cm.tex"
jsou uloľeny deklarace metamatického kódování podle plain\TeX{}u

Pokud si budeme deklarovat vlastní matematická kódování (různá od
připravených "PS", "CM", "AMS" atd.), pak je potřeba myslet na
následující zásadu: ve vąech verzích matematických fontů
(normal/bold/atd.) by měla být čísla matematických rodin alokována
stejně a ukončena stejným "\lastfam", protoľe makro "\mathchars" se po
přepnutí do jiné verze nespouątí znovu.  Zvláątě nesmíme měnit
čísla těch rodin, na které se odvoláváme v~makru
"\set<kódování>mathchars".

Nyní popíąeme daląí makra ulehčující deklaraci matematického kódování.
Makro "\hex"\inl[hex] 
konvertuje číslo na jednociferné hexadecimální
číslo. Vyuľití tohoto makra najdeme v~souborech "ofs-ps.tex",
"ofs-tx.tex" a daląích.

Pro definování sekvencí, které budou pracovat v textovém i
matematickém módu současně, slouľí makro 
"\safemathchardef"\inl[safemathchardef].
Toto makro má stejný způsob pouľití, jako primitivní "\mathchardef":

\begtt
\safemathchardef \<sekvence> <číslo>
\endtt

Pokud není "\<sekvence>" v~okamľiku pouľití "\safemathchardef"
definována, příkaz pracuje zcela stejně jako "\mathchardef".
Pokud ale je "\<sekvence>" uľ definována, uloľí příkaz
"\safemathchardef" její význam do "\T<sekvence>", dále provede 
"\mathchardef \M<sekvence> = <číslo>" a konečně "\<sekvenci>"
předefinuje následujícím způsobem:

\begtt
\def \<sekvence> {\ifmmode \expandafter \M<sekvence> 
                 \else \expandafter \T<sekvence> \fi}
\endtt
%
Od této chvíle "\<sekvence>" pracuje v textovém i matematickém módu.
Pro případ opakovaného pouľití "\safemathchardef" na stejnou
"\<sekvenci>" makro kontroluje, zda uľ není definována "\M<sekvence>".
Pokud ano, pak "\safemathchardef" neprovede nic.

Je potřeba, aby byly soubory s~příkazy "\characterdef" 
načteny před prvním pouľitím "\setmath". Pak lze v~rámci 
"\setmath" (přesněji v~makru "\mathchars") pouľít 
"\safemathchardef" na předefinování některých sekvencí, 
které byly dříve deklarovány pomocí "\characterdef". Tyto sekvence pak
budou pracovat v textovém i matematickém módu.

Naprosto stejně, jako "\safemathchardef" pracuje příkaz
"\safemathaccentdef"\inl[safemathaccentdef].
Pouze místo primitivu "\mathchardef" pouľije
makro "\mathaccentdef"\inl[mathaccentdef], 
které přečte za "\<sekvencí>" "<číslo>" separované mezerou 
a provede:

\begtt
\def \<sekvence> {\mathaccent<číslo> }
\endtt

Pokud nechceme deklarovat novou matematickou rodinu pro několik 
málo znaků (počet matematických rodin je totiľ v~\TeX{}u 
omezen na 16), můľeme pouľít makro 
"\pickmathfont"\inl[pickmathfont], které má tyto
parametry:

\begtt
\pickmathfont {<metrika>}{<text>}
% příklad pouľití:
\mathbin {\pickmathfont {psybo}{\char"C4}}
\endtt
%
Makro "\pickmathfont" pouľije primitiv "\font" na specifikovanou
<metriku> a v~tomto fontu zapíąe <text>, který v~matematickém seznamu
tvoří atom typu Ord. Důleľité je, ľe je pouľit font v~odpovídající
velikosti (základní, indexová, indexindexová), takľe to vypadá, jako
by byl pouľita nová matematická rodina fontů. Přitom to není pravda,
protoľe "\pickmathfont" je implementován pomocí primitivu "\mathchoice".
Pouľití příkazu "\pickmathfont" najdeme v~souboru "ofsdef.tex" 
v~definici makra "\setPSmathchars".



\subsec Registrování metrik pro různé velikosti
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\LATEX: Registrování různých metrik pro různé velikosti se dělá
ve~"fd" souborech a je to dokonale vyřeąeno v~NFSS.

\PLAIN (aľ do konce sekce):
Existují speciální rodiny fontů (například Computer Modern), kde se
pro různé velikosti fontů pouľívají různé metriky. I~tato vlastnost je
implementována v~OFS. Dosud jsme zatajili, ľe v~parametrech příkazů
"\loadtextfam", "\loadmathfam" a "\pickmathfont" je moľné místo názvů 
metrik uvést smyąlené <jméno>, které je registrováno příkazem 
"\registertfm"\inl[registertfm].
V~takovém případě se skutečná metrika pro zavedení primitivem "\font" 
vypočítá z~poľadované velikosti fontu a z~údajů, které byly zadány
pomocí skupiny příkazů "\registertfm". Upřesníme nyní parametry 
příkazu "\registertfm":

\begtt
\registertfm <jméno> <mezera> <od>-<do> <mezera> <skutečná metrika> <mezera>
\endtt

Parametry <od> a <do> musejí obsahovat jednotku a vymezují uzavřený
interval, pro který platí: jestliľe je poľadovaná velikost fontu
ve tvaru "at"<dimen> a současně <dimen> leľí
v~intervalu "<od>-<do>", pak se místo <jména> pouľije 
"<skutečná metrika> at<dimen>".
Příkaz "\registertfm" je potřeba pro vymezení různých 
intervalů pouľít opakovaně na stejné <jméno>.
Ačkoli jsou intervaly "<od>-<do>" uzavřené, později
deklarovaný interval má přednost před dříve deklarovaným, takľe nakonec
je kladná reálná osa rozdělena na polouzavřené intervaly. Příklad
pouľití je v~souboru "ofsdef.tex".

Jsou-li oba parametry <od> a <do> prázdné, je příkazem "\registertfm"
deklarována metrika, která se pouľije při specifikaci velikosti pomocí
"scaled<číslo>" nebo v~případě, kdy <dimen> neleľí v~ľádném
specifikovaném intervalu. Hvězdička místo parametru <do> značí 
\uv{nekonečnou velikost}.

Příkaz "\registertfm <jméno> <mezera> - <mezera> - <mezera>"
vymaľe z~paměti předchozí registrace pro dané <jméno> a navíc vyznačí
<jméno> jako nepřístupný font. OFS se pak chová stejně, jakoby odpovídající
varianta nebyla vůbec deklarována. Dává nám to
moľnost vyznačit neexistující varianty deklarované rodiny 
jen pro některá kódování (viz například "cmssbxti" 
v~souboru "ofsdef.tex").

Parametry <jméno> a <skutečná metrika>  se expandují v~okamľiku
činnosti příkazu "\registertfm". Není proto obvyklé v~nich pouľívat
makro "\fotenc". Nicméně toto makro můľeme v~uvedených parametrech 
pouľít, pokud zahrneme potřebnou skupinu příkazů "\registertfm" 
do vlastního makra a toto makro spustíme opakovaně pro různé
hodnoty "\fotenc".

Makro "\registerECfont"\inl[registerECfont]  
je zkratkou za opakované pouľití příkazu
"\registertfm" na vąechny velikosti EC fontů od "0500" 
aľ po "3583". Stejně makro
"\registerECTTfont"\inl[registerECTTfont] 
je zkratkou pro velikosti EC fontů od "0800" do "3583" pouľívané pro
strojopis. Definice a pouľití těchto maker najdeme v souboru
"ofsdef.tex". Makra můľeme pouľít i na jiné fonty, které mají stejně
odstupňované velikosti jako EC fonty (např. LH fonty s~azbukou nebo
fonty odvozené z~CM-super).


\subsec Omezení pouľití rodiny fontů pro určitá kódování
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\LATEX: Pouľití rodiny v~daném kódování je závislé na existenci 
"fd" souboru, tj.~vąe je v~reľii NFSS.

\PLAIN (aľ do konce sekce):
OFS od verze Feb.~2004 zavádí příkaz "\registerenc",\inl[registerenc]
kterým můľeme omezit pouľití deklarované rodiny fontů 
jen pro vymezená kódování.
Pokud pak uľivatel napíąe "\setfonts" a vyľaduje rodinu 
v~neregistrovaném kódování, OFS vypíąe varování na obrazovku 
a vůbec do poľadované rodiny nepřepne. Tím se vyhne pokusu zavést
pravděpodobně neexistující metriky fontů. Příkaz "\registerenc"
má dva parametry:

\begtt
\registerenc <JménoRodiny>: <kódování><mezera>
\registerenc Times: 8t   % například
\registerenc Times: 8z   % nyní má Times registrována dvě kódování
\endtt

Pokud nemá rodina registrováno ľádné kódování, pak OFS předpokládá, ľe
je pouľitelná v~jakémkoli kódování (například fonty značek).

V~deklaračních souborech tedy můľeme pomocí "\registerenc" omezit
pouľití rodiny jen na vymezená kódování. Uľivatel ale můľe 
příkazem "\registerenc" přidat k~rodině daląí povolené kódování. Nebo
také můľe naznačit, ľe rodina má povoleno libovolné kódování
příkazem "\registerenc <JménoRodiny>: * ".

Abychom v~deklaračních souborech nemuseli opisovat <JménoRodiny>, můľe
být tento parametr prázdný. V~takovém případě "\registerenc" pouľije
rodinu z~posledního příkazu "\ofsdeclarefamily".

Ve svých makrech se můľete zeptat, zda je rodina pro aktuální hodnotu
"\fotenc" registrovaná:\inl[registeredfam]

\vbox \bgroup
\begtt
\registeredfam <JménoRodiny>? \iftrue 
       Rodina má \fotenc registrováno nebo má povoleno jakékoli kódování 
       nebo vůbec není deklarována.
\else  Rodina má registována kódování, ale \fotenc mezi nimi není.
\fi
\endtt \egroup  

Pokud spustíme "\setfonts[<JménoRodiny>/]" pro nedeklarovanou rodinu
nebo pro rodinu s~nedovoleným kódováním, 
pak OFS napíąe varování na terminál a vrátí "\setfontsOK"\inl[setfontsOK]
jako "\undefined". Po úspěąném nastavení fontu má sekvence
"\setfontsOK" hodnotu "\relax".


\sec Licence
%%%%%%%%%%%%

Balíček OFS můľe pouľívat kdokoli bez licenčních poplatků. Kdokoli jej
rovněľ můľe distribuovat, pokud nezmění obsah souboru "readme.ofs"
"ofs.tex", "ofsdef.tex", "ofs.sty", "ofs-8z.tex",
"ofs-8t.tex", "a35.tex", "a35.sty", "ofsdoc.tex", "ofsdoce-e.tex",
"ofsmtdef.tex" a
vąechny tyto soubory budou v distribuci přítomny.
Právo na změnu těchto souborů a
tím změnu verzí zůstává výhradně autorovi. Pokud potřebujete změnit
obsah některého z~uvedených souborů, nazvěte jej jinak. Balíček je
poskytován s~přáním, aby byl uľitečný, ale BEZ JAKÉKOLI ZÁRUKY.

\bigskip
V~Praze dne 16. 8. 2001 \hfill autor: Petr Oląák


\sec Historie
%%%%%%%%%%%%%

\noindent
16. 8. 2001 --- uvedena první verze

\noindent
24. 10. 2002 --- provedeny drobné úpravy respekutjící změny 
ve verzi OFS Oct.~2002.
V této verzi byl přidán příkaz "\addcmd" a byly 
umoľněny nepovinné parametry 
"(<Varianta>)" v příkazu "\loadtextfam". 

\noindent
10. 2. 2004 --- Vąechny úpravy se týkají jen OFS pro plain:

\def\bod{\hangindent=1.2em \hangafter=1 \noindent + }

\bod Vylepąena manipulace s deklaracemi maker
závislých na kódování, deklarace výjimek a registrování kódování pro
zvolenou rodinu.
Viz~\beglink{3.5}sekce~3.5\endlink{} a \beglink{3.9}sekce~3.9\endlink.

\bod Přidána moľnost předefinování rodiny (např. dodatečným načtením
souboru deklaračního souboru, který modifikuje vlastnosti implicitních rodin).

\bod Deklarace CMRoman, CMSans a CMTypewriter pro kódování 8t
pouľitím EC fontů.

\bod Přidána podpora roząiřujícího kódování 8c.

\bod Upravena deklarace matematického kódování PS, aby "\int",
"\sum" a "\prod" pracovaly v~display módu s~větąími znaky.

\bod Definováno makro "\ofshexbox" a "\ofshexboxdef".

\bod Nově zveřejněno interaktivní makro "ofstest.tex".

\bod Zaveden adresář "examples/", kde průběľně budu dávat 
příklady pouľití OFS. 

\noindent
12. 3. 2004 --- OFS pro plain:

\bod Kódovací soubory jsou čteny přímo z "\loadtextfam". 
Tím je umoľněno dávat do kódovacích souborů mapování metrik příkazem
"\registerenc" (vyuľiju pro LANG).

\bod "\characterdef" respektuje definované makro a nepředefinuje jej.

\bod Reimplementováno "\showfonts". Nyní ąetří výrazně pamě» i čas na
rozsáhlých seznamech fontů. Pozor: pokud jste měli makra vyuľívající
interní makro "\listfamilies", pak toto přestane
fungovat. Např. nefunguje od této verze zastaralé "ofscatal.tex".
Místo něj je moľno pouľít "ofstest.tex"

\bod Modifikováno "ofstest.tex", aby pracovalo s novou implementací
seznamu rodin "\ofslistfamilies".

\noindent
2. 4. 2004 --- přidáno "\plaincatcodes" před čtením souborů "ofs-<kódování>.tex".

\bod Zavedeno "\safelet" a "\protectreading".

\bod Mezera za <znakem> v "\accentdef" je nepovinná.

\bod Přidána moľnost "\loadmathfam <rodina>[-<varianta>/]" a roząířena
a přepracována deklarace pro matematická kódování "CM", "PS", "AMS",
"TX", "PX", "MT". 


\sec Rejstřík vąech maker definovaných v~OFS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Rejstřík obsahuje odkazy pouze na místa v~textu, kde je k~makru
vysvětlující komentář. V~tom místě je téľ uveden pro snadnějąí orientaci
název makra v~levém okraji. V~rejstříku nejsou odkazy na 
vąechny zmínky o~makru v~textu. Rejstřík je správně vygenerován hned
po prvním průchodu zpracování tohoto dokumentu příkazem "csplain ofsdoc".

Některá makra definovaná v~"ofs.tex" jsou interní nebo pomocná
a není o~nich zmínka v~textu. Pak odkaz na stranu záměrně chybí a je
připojena jen krátká poznámka o~takovém makru. Rovněľ jsou připojeny
poznámky o~tom, zda je makro pouľito ve verzi pro 
{\smallbf PLAIN} nebo {\smallbf LATEX}.


\bigskip
\immediate\closeout\indout
\input \jobname.ind

\begingroup
\let\tt=\smalltt \let\it=\smallit \let\rm=\smallrm \rm
\baselineskip=10.3pt

\def\inr #1 #2 #3;{\noindent{\tt
  \expandafter \ifx \csname ind:#2\endcsname \relax 
     \back#1%
  \else 
     \beglink{#2}\back#1\endlink
  \fi}\quad 
  #3 \quad\pg[#2]\par} 
\def\\#1 #2;{\inr #1 #1 #2;}
\def\pl{{\sevenrm (PLAIN)}}
\def\la{{\sevenrm (LATEX)}}
\def\oba{{\sevenrm (PLAIN+LATEX)}}

\\accentabove \pl;
\par\nobreak
\\accentbelow \pl;
\\accentdef \pl;
\\accentdel \pl;
\\accentdefori \unskip, {\tt\back accentdelori} \pl~interní, 
   udrľují původní význam maker;
\\accentnodef \pl~interní, {\tt\back def\back <makro>\#1%
  \char`\{\back printaccent\char`\{<makro>\char`\}\char`\{\#1\char`\}\char`\}};
\\addcmd \oba;
\inr bf rm \oba; 
\inr bi rm \oba;
\\bifam \pl~interní, matematická rodina pro BoldItalic;
\\calculatemetricfile \pl~interní, definuje {\tt\back metricfile}
                       podle velikosti;
\\catcodesloop \pl~interní, nastaví kategorie znaků v cyklu podle daného čísla;
\\characterdef \pl;
\\characterdel \pl;
\\characterdefori \unskip, {\tt\back characterdelori} \pl~interní,
      udrľují původní význam maker;
\\characternodef \pl~interní, {\tt\back def\back <makro>%
       \char`\{\back printcharacter\char`\{<makro>\char`\}\char`\}};
\\currentfamily \pl;
\\currentfomenc \pl~interní, jméno naposledy pouľitého matemat. kódování;
\\currentvariant \pl;
\\declaredfamily \pl~interní, obsahuje jméno naposledy deklarované rodiny;
\\defaultextraenc \pl;
\\defaultmathchars \pl;
\\defaultmathfonts \pl;
\\defpttotmpa \pl~interní, udělá {\tt\back def\back tmpa\char`\{pt\char`\}},
    pokud chybí jednotka;
\\detailfontmessages \pl;
\\displayfontmessages \pl;
\\displaymessage \pl;
\\docharacterdef \pl~interní, pro potřeby makra {\tt\back characterdef};
\\doextchar \pl~interní, pro potřeby makra {\tt\back extchar};
\\dosafemathdef \pl~interní, pro potřeby maker {\tt\back safemath*def};
\\donumbercharacterdef \pl~interní, pro potřeby makra {\tt\back characterdef};
\\endOFSmacro \pl~interní, moľnost čtení {\tt[<file>, ...]} za 
    {\tt\back input ofs};
\\expandaction \pl;
\\extchar \oba;
\\extraenc \pl;
\\extrafont \pl;
\\fontdef \oba;
\\fontloadmessage \pl~interní, výpis informace o~provedení {\tt\back font};
\\fontmessage \pl~interní, střídá hodnoty nic, 
                     {\tt\back wlog} a {\tt\back displaymessage};
\\fontprefix \pl~interní, střídá hodnotu nic a {\tt\back global};
\\fontusage \oba;
\\fosize \pl;
\\fomenc \pl;
\\fotenc \pl;
\\fragilecommand \pl;
\\fragilecommand! \pl;
\\hex \pl;
\\ifknownfam \oba;
\\isunitpresent \pl~interní, řeąí případ absence jednotky;
\inr it rm \oba;
\\knownchar pl;
\\knownfam pl;
\\lastfam pl;
\\lccodes \unskip, {\tt\back lccodesloop} \pl;
\\loadCMboldmath \pl;
\\loadCMnormalmath \pl;
\\loadingenc \pl;
\\loadmathfam \pl;
\\loadPSboldmath \pl;
\\loadPSnormalmath \pl;
\\loadtextfam \pl;
\\logfontmessages \pl;
\\mathaccentdef \pl;
\\mathchars \pl;
\\mathcharsback \pl;
\\mathencdef \pl;
\\mathencread \pl;
\\mathfonts \pl;
\\mathversion \pl;
\\metricfile \pl~interní, jméno metriky při pouľití {\tt\back font};
\\metrictmpa \pl~interní, expanduje na metriku fontu {\tt\back tmpa};
\\modifydef \pl;
\\modifyenc \pl;
\\modifylist \pl;
\\modifyread \pl;
\\newfamily \pl~přechodné, zadané jméno rodiny;
\\newmathfam \pl;
\\newmodifylist \pl;
\\newvariant \pl;
\\nofontmessages \pl;
\\noindexsize \pl;
\\noPT \pl~interní, odstraní {\tt pt} z~{\tt\back the<dimen>} [TBN, str.~80];
\\ofsaddenctolist \pl~interní, přidá parametr do seznamu {\tt\back newmodifylist};
\\OFSdeclarefamily \la;
\\ofsdeclarefamily \pl;
\\OFSextraencoding \la;
\\OFSfamily \la;
\\OFSfamilydefault \la;
\\ofshexbox \pl;
\\ofshexboxdef \pl;
\\ofsinput \pl~interní, čte soubor při {\tt\back globaldefs=1}, ignoruje konce řádků;
\\ofslistfamilies \pl~interní, seznam rodin pro {\tt\back showfonts};
\\ofslistfamily \pl~interní, uvozuje rodinu v {\tt\back listfamilies};
\\ofslistvariants \pl~interní, text pro výpis variant do logu;
\\ofslisttext \pl~interní, uvozuje text v {\tt\back listfamilies};
\\ofsloadfont \pl~interní, zavede jeden font;
\\ofsloadfontori \pl~interní, zavede jeden font;
\\ofsmeaning \pl~interní, vykostí z~výstupu {\tt \back meaning} slovo
        {\tt letter}/{\tt character};
\\ofsmessageheader \pl~interní, hlavička hláąení do logu a na terminál;
\\OFSnormalvariants \la;
\\OFSprocessoptions \la;
\\OFSputfamlist \la;
\\ofsputfamlist \pl;
\\ofsremovefromlist \pl~interní, odstraní rodinu ze seznamu;
\\OFSversion \oba~interní, datum verze makra;
\\orifosize \pl~přechodné, podrľí hodnotu {\tt\back fosize};
\\origTeX \pl~interní, originální definice loga \TeX;
\\oriloadfam \pl~přechodné, podrľí hodnotu {\tt loadtextfam};
\\pickmathfont \pl;
\\plaincatcodes \pl~interní, nastaví kategorie znaků podle plain\TeX{}u;
\\printaccent \pl;
\\printaccentwarn \pl;
\\printcharacter \pl;
\\printcharacterwarn \pl;
\\processOFSoption \pl~interní, pro potřeby makra {\back endOFSmacro};
\\protectreading \pl;
\\readfamvariant \pl~interní, testuje, zda je zadána varianta rodiny;
\\readfirsttoken \pl~interní, vrátí první token textu ukončeného {\tt:\back end};
\\readfosize \pl~interní, vloľí hodnotu {\tt\back fosize} 
                   do {\tt\back dimen0};
\\readmag \pl~interní, počítá {\tt\back fosize}, je-li dáno 
    {\tt mag}<desetinné číslo>;
\\readOFSoptions \pl~interní, pro potřeby makra {\tt\back endOFSmacro};
\\readothertokens \pl~interní, vrátí druhý a daląí tokeny aľ po {\tt:\back end};
\\readsixdigits \pl~interní, vyuľito pro zaokrouhlování;
\\registeredfam \pl;
\\registerECfont \pl;
\\registerECTTfont \pl;
\\registerenc \pl;
\\registertfm \pl;
\\restorefontid \pl~interní, obnovení jména fontu, viz {\tt\back savefontid};
\\rm \oba;
\\runmodifylist \pl;
\\safelet \pl;
\\safeletwarn \pl;
\\safemathaccentdef \pl;
\\safemathchardef \pl;
\\savefontid \pl~interní, pro udrľení jména fontu ve výpisech Overfull;
\\savetokenname \pl~interní, něco jako {\tt\back string} bez backslashe;
\\scriptfosize \pl;
\\scriptscriptfosize \pl;
\\separeofsvariant \pl~interní, separace nepovinného parametru 
          {\tt\back loadtextfam};
\\setextrafont \oba;
\\setCMmathchars \pl;
\\setfonts \oba;
\\setfontshook \pl;
\\setfontsOK \pl;
\\setfontfamily \pl~interní, {\tt\back setfonts}, 
         pokud není dána varianta;
\\setfosize \pl~interní, vypočítá hodnotu {\tt\back fosize};
\\setmath \pl;
\\setPSmathchars \pl;
\\setsimplemath \pl;
\\setsinglefont \pl~interní, {\tt\back setfonts},
         pokud je dána varianta;
\\setsinglefontname \pl~interní, vykostí z názvu metriky případné "at<dimen>";
\\sgfamily \pl~interní, pro uloľení informace o~rodině;
\\sgvariant \pl~interní, pro uloľení informace o~variantě;
\\showfonts \oba;
\\singlefont \pl;
\\singlefontname \pl~interní, odstraní {\tt at<dimen>} z~názvu metriky;
\\skipfirststep \pl;
\\slantcorrection \pl~interní, pro potřeby
     {\tt\back accentabove} a {\tt\back accentbelow};
\\storeofsvariant \pl~interní, separace nepovinného parametru 
          u~{\tt\back loadtextfam};
\\switchdeftodel \pl~interní, prohodí {\tt\back accent/characterdef}
  s~{\tt\back *del};
\\tenbi \pl;
\inr tenbf tenrm \pl;
\inr tenit tenrm \pl;
\\tenrm \pl;
\\testOFSoptions \pl~interní, pro potřeby makra {\tt\back endOFSmacro};
\\testtfmsize \pl~interní, pro potřeby {\tt\back registertfm};
\\testtfmsizeat \pl~interní, přechodná hodnota {\tt\back testtfmsize};
\\testtfmsizescaled \pl~interní, přechodná hodnota {\tt\back testtfmsize};
\\textfosize \pl;
\\tryloadenc \pl~interní, načte kódovací soubory;
\\tmpa \oba~přechodné;
\\tmpb \oba~přechodné; 
\\tmpc \pl~přechodné;
\\warnmissingfont \pl~interní, výpis o~chybějící variantě;
\\warnM \unskip, {\tt\back warnF}, {\tt\back warnT}, {\tt\back warnI}
\pl~interní, výpis o~chybějící standardní variantě;
\\warnunregistered \pl~interní, výpis o~nedovoleném kódování zvolené rodiny;

\endgroup

\sec Reference

\noindent \hangindent=2\parindent
[TBN] Petr Oląák {\it \TeX{}book naruby}, Konvoj 
1.~vyd. 1997 (ISBN 80-7302-007-6), 
2.~vyd. 2001 (ISBN 80-85615-64-9), Brno, 466 stran. 
PDF verze knihy je volně k~dispozici na 
{\tt http://math.feld.cvut.cz/olsak/tbn.html}.



\end