% 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={\hfil See the ofsdoce.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 (February 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` @LATEX: OFS (Olsak's Font System) based on NFSS initialized. @char` \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 ... ... \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 [, , ...] @LATEX: \usepackage [, , ...] {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 \input ... @LATEX: \usepackage {} \usepackage {} ... \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 [/]" 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 [/]" přepne do nové rodiny a ctí naposledy nastavenou velikost a "\setfonts [/]" 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 , 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: 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 má tyto možnosti: \begitems * <číslo> .... např. "12", "17.4", * <číslo> .... např. "12pt", "17.4pt", "10dd", * "at"<číslo> .... např. "at12pt", "at17.4pt", "at10dd", * "scaled" .... např. "scaled1200", "scaled\magstep3", * "mag" .... 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 \ [/] \endtt % Tato deklarace se zhruba shoduje s{} \begtt \gdef \ {\setfonts [/]} \endtt \PLAIN: Pokud je specifikována rodina včetně varianty a parametr není prázdný ani není zadán pomocí klíčového slova "mag", pak "\" není implementován jako makro obsahující "\setfonts", ale jedná se o nativní přepínač fontu implementovaný pomocí "\global\font\" (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 . 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 \ {} \endtt % a chová se, jako "\def\ { }". Pomocí "\addcmd" tedy můžeme \uv{rozšířit} obsah makra "\" o~další příkazy. Sekvence "\" 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 "\" definována vždy jako makro bez parametru. Opakované použití "\addcmd" na stejný "\" 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 ? \iftrue", která expanduje na "\iftrue", pokud je rodina deklarovaná a na "\iffalse", pokud deklarovaná není. Parametr 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 []"\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 [] \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 [] \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 []} \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-.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~\beglink{3.5}sekci~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 [//] \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". Je-li matematické kódování v~makru "\fomenc"\inl[fomenc] nastaveno na CM ("\def\fomenc{CM}"), pak "\setmath" ponechá matematickým vzorečkům Computer Modern fonty, jen se případně přizpůsobí požadované velikosti. Je-li "\def\fomenc{PS}" (PostScript-Symbol), pak "\setmath" 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, protože (bohužel) neexistuje volně dostupná alternativa k~těmto fontům. Komerční matematické fonty pro \TeX{} existují: (MathTimes, LucidaMath) a uživatel může snadno použít i tyto fonty. Technické detaily jsou v~\beglink{3.7}sekci~3.7\endlink. Defaultně je nastaveno "\def\fomenc{PS}", protože se předpokládá, že je makro OFS použito právě kvůli PostScriptovým fontům. 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 \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" a "\accentbelow" (\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 {}"\inl[OFSextraencoding] --- Toto makro si poznamená do paměti a provede "\input {ini.def}". Předpokládá se, že tam jsou odpovídající definice pro , 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 "ini.def" načten, makro jej nenačítá znovu. Pozor: je nutno psát velkými písmeny, ačkoli v~názvu souboru musí být naopak tato písmena malá. * "\OFSputfamlist {}"\inl[OFSputfamlist] --- vloží do seznamu rodin, který se vypisuje při "\showfonts" nebo při neznámé rodině. * "\OFSdeclarefamily [] {}"\inl[OFSdeclarefamily] --- poznamená si do paměti, že je ve skutečnosti . Tato paměť se využije například v~příkazu "\OFSfamily". Navíc zanese 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 * "\ofsputfamlist {}"\inl[ofsputfamlist] --- vloží do seznamu rodin, který se vypisuje při "\showfonts" nebo při neznámé rodině. * "\ofsdeclarefamily [] {}"\inl[ofsdeclarefamily] --- deklarace nové rodiny se jménem . 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 . Mezi 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> \ () ;;"\inl[newvariant] \null\penalty0 --- Dekla\-ruje nový přepínač varianty. Podrobnější vysvětlení je uvedeno níže. * "\modifyenc :;"\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" nebo "scaled" podle toho, jaký tvar parametru 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 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 z~"\ofsdeclarefamily". * "\registertfm - "\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 : "\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"\inl[loadtextfam] používaný v deklaračních souborech mezi makra "\ofsdeclarefamily" má parametry: \begtt \loadtextfam () ;% () ;% () ;% () ;;% \endtt % Procenta na koncích řádků v této ukázce označují, že za středníky nemá být mezera. Údaje "()" slouží jako komentáře o variantách zapisované do logu a je možno je kompletně včetně závorek a 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 odpovídají názvům metrik, které se pro uvedené varianty fontů makrem "\loadtextfam" zavedou. Makro zhruba provede toto: \begtt \font\tenrm= \fosize \font\tenbf= \fosize \font\tenit= \fosize \font\tenbi= \fosize \endtt % Předpokládá se, že všechny 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 udává název extra kódování. Pokud je tento parametr neprázdný, pak "\loadtextfam" provede na přechodnou dobu "\def\fotenc{}" a znovu expanduje parametry , , a . 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 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 mohou být vynechány. Je-li například prázdný parametr , 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í deklarované pro požadovanou rodinu v~"\ofsdeclarefamily" a mezi těmito 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=" 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 . 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". V~parametru makra "\ofsdeclarefamily" se může deklarovat nadstandardní varianta rodiny pomocí příkazu "\newvariant".\inl[newvariant] Tento příkaz provede: \begtt \font\ten= \fosize \def \ {\let\currentvariant=<číslice> \ten} \endtt % Dále příkaz "\newvariant" zanese do paměti informaci o~případné rozšiřující metrice podle . 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 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 hodnotu makra "\fosize". Dále při neprázdném pamaretru a při neuvedení varianty tento příkaz provede "\def\currentfamily{}"\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 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 "\tryloadenc"\inl[tryloadenc], které může za jistých okolností předefinovat makra závislá na zvoleném kódování "\fotenc" (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= \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{}\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 \ <číslo> % příklad: \characterdef \promile 8z 141 % nebo \characterdef \ {} % příklad: \characterdef \promile 8t {\%\char24 } \characterdef \promile * {\vrule height1ex width1ex\relax} % in another encodings \endtt V~prvním případě se bude "\" při aktuálním kódování fontů shodném s~ expandovat na token kategorie 12 s~kódem rovným <číslu>. V~druhém případě "\" expanduje při shodnosti na . 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 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 "\" jako "\printcharacter{}"\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 "\", pak se vždy znovu definuje stejně, takže nedochází ke ztrátě předchozí informace. Kromě toho ale "\characterdef" definuje další makro "\:-" tak, že toto makro expanduje na znak se specifikovaným kódem nebo na . Další inteligence je schována v~příkazu "\printcharacter". Ten ověří, zda je definováno makro "\:-\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 a podívá se, zda je definováno makro "\:-". Pokud ano, expanduje na \begtt {\setextrafont \:-} \endtt % Pokud se stále nepodařilo realizovat požadovaný znak, pokusí se vytisknout defaultní znak nezávislý na kódování "\:-*". Pokud ani to není možné, spustí se "\printcharacterwarn{}".\inl[printcharacterwarn] Implicitní hodnota tohoto makra vypíše varování o~nedostupném znaku 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 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 \ <číslo> % Příklad: \accentdef \v E 8z 204 % Ecaron % nebo \accentdef \ {} % 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~, pak "\" následovaná znakem expanduje na token kategorie 12 s~kódem <číslo>, respektive expanduje na . To vše se děje jen na úrovni expand procesoru. Pokud je při deklaraci pomocí "\accentdef" jako uvedena hvězdička, pak se deklarované nebo kód <číslo> použije vždy, když znak následující "\" 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 "\" jako makro s~jedním neseparovaným parametrem "#1", které v~první řadě expanduje na "\printaccent{}{#1}"\inl[printaccent], takže například "\v E" expanduje na "\printaccent{v}{E}". Dále "\accentdef" definuje makro "\::-" jako znak s~daným kódem <číslo> nebo jako . Další práci udělá příkaz "\printaccent". Tento příkaz zjistí, zda je definováno makro "\::-\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í . Jestliže je definováno makro "\::-", pak se expanduje na "{\setextrafont \::-}". Pokud zatím vše selhalo, zkusí "\printaccent" postupně zjistit, zda jsou definována makra "\:*:-\fotenc" a "\:*:-". Pokud je definováno první z~nich, expanduje a připojí na konec expanze . Pokud je definováno jen druhé z~nich, expanduje na \begtt {\setextrafont \:*:- } \endtt % kde 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 "\::-*" nebo konečně "\:*:-* ". Teprve když i toto selhalo, spustí se "\printaccentwarn{}{}".\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~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 "\:-" resp. "\::-". %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-.tex" (tzv.~{\it kódovacích souborů\/}), protože příkaz "\tryloadenc" (volaný z~makra "\setfonts") tyto deklarace při nastaveném "\loadingenc=1"\inl[loadingenc] odtud čte. Co dělá "\tryloadenc" přesně, popíšeme v~této sekci později. 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 :; {} \endtt % Přitom 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 } příkazem "\modifyenc"\inl[modifyenc] vyznačit, že daná rodina obsahuje vzhledem k~základní sadě kódování odpovídající . Příkaz má tvar: \begtt \modifyenc :;% \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á ). Odkazuje-li tento příkaz na , 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 je rovno "\fotenc" nebo "\extraenc". Vlastní práci (nastavení výjimek) provede až příkaz "\tryloadenc", který je spuštěn na konci "\setfonts" a jehož činnost si nyní podrobně popíšeme. Příkaz "\tryloadenc"\inl[tryloadenc] načte při "\loadingenc>0" soubor "ofs-\fotenc.tex" %\inl[fotenc] a při neprázdném "\extraenc"\inl[fotenc] navíc načte soubor "ofs-\extraenc.tex". Příkaz "\tryloadenc" si také poznamená,\inl[extraenc] že je konkrétní kódovací soubor načten, a příště už jej načítat nebude. Během čtení těchto souborů jsou ignorovány prázdné řádky a konce řádků a je přechodně nastaveno "\globaldefs=1", tj. všechna předefinování 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~předchozí sekci). 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 se 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ě. Makro "\tryloadenc" poté, co se pokusilo načíst odpovídající kódovací soubory, projde seznam odkazů na výjimky předchozí rodiny ("\modifylist"\inl[modifylist]) a nově nastavené rodiny ("\newmodifylist"). Pokud jsou oba seznamy stejné nebo "\modifylist" má význam "\relax", pak "\tryloadenc" 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 "\tryloadenc" 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í 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í tak, že na přechodnou dobu pozmění příkazy "\accentdef", "\accentdel", atd. a spustí. Pokud nechceme, aby se makra ve 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í příkazem "\modifydef" způsobí, že vše za touto sekvencí až do konce bude přeskočeno. Identifikátory ":lccodes" a ":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 :lccodes\endcsname". OFS uvedené příkazy vůbec nedefinuje.\inl[lccodesloop] Deklarace ":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í ":lccodes" je v makru "lang.tex" a makro "inec.tex" používá ":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 makra "\ofsdeclarefamily" pak použijeme příkaz\inl[modifyread] \begtt \modifyread ;% \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 ? \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 {}{}{} \accentbelow {}{}{} \endtt Příkaz "\accentabove" resp. "\accentbelow" přisadí nad resp. pod , přičemž mezi těmito znaky bude . 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 {}{-1ex}{} \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 {}{}{}{} \ofshexboxdef 2 {cmsy}{cmbsy10}{cmsy}{cmbsy10} % například takto \endtt % Pak příkaz "\ofshexbox " vytiskne znak s~ 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 . OFS implicitně deklaruje jen = 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ůžete 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" 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ů. Nakonec se 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 defaultní 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 parametry: \begtt \loadmathfam [/] \endtt % přitom v~hranaté závorce musí být právě jeden parametr prázdný. To znamená, že je určena buď aktuálně nastaveným přepínačem textového fontu nebo metrikou. Příklady: \begtt \loadmathfam 0[tenrm/]% \newmathfam \symbfam \loadmathfam \symbfam [/psyr]% \newmathfam \extitfam \loadmathfam \extitfam [Xtenit/]% \endtt % V~tomto příkladě jsou do rodiny 0 zavedeny fonty stejné, jako v~aktuálním textovém fontu "\tenrm". Dále je deklarována nová rodina "\symbfam", do které jsou zavedeny fonty z~metriky "psyr". Pro deklaraci nové rodiny se 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" nedělá nic, pokud už je dříve rodina deklarována (deklaruje se vždy globálně). Znamená to, že při opakovaném použití "\setmath" se nealokují další a další rodiny až do vyčerpání počtu~16. V~posledních dvou řádcích příkladu je ukázka určité výjimky. Pokud název přepínače začíná na velké písmeno X, pak zbylý text v~názvu značí přepínač, ke kterému se má použít odpovídající rozšiřující metrika. Makro "\loadmathfam" nejprve zjistí metriku, která odpovídá zadanému přepínači. Pokud je metrika přímo dána, nedělá v~této fázi nic. Pak provede třikrát primitiv "\font" zhruba takto: \begtt \font \-Mt = \textfosize \font \-Ms = \scriptfosize \font \-Mss = \scriptscriptfosize \textfont = \-Mt \scriptfont = \-Ms \scriptscriptfont = \-Mss \endtt Přitom je buď název textového přepínače nebo název metriky podle toho, co bylo v~parametrech zadáno. Fonty matematické rodiny~3 jsou v~plainu obvykle zavedeny bez zmenšování pro indexy a indexy indexů. Pokud také 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 Pro pohodlné deklarování matematických kódů znaků je v~OFS připraveno makro "\hex"\inl[hex], které konvertuje číslo na jednociferné hexadecimální číslo. Využití tohoto makra najdeme v~souboru "ofsdef.tex". 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 defaultně 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 \let\mathchars=\relax} \endtt V~definici "\matchars" je použito "\let\mathchars=\relax", aby se při opakovaném "\setmath" zbytečně nespouštěla rozsáhlá nastavování matematických kódů znovu. Tento trik si můžeme dovolit, pokud budeme předpokládat, že uživatel nebude měnit kódování "\fomenc" během dokumentu. Pouze může na začátku dokumentu před prvním použitím "\setmath" definovat "\fomenc" jako "PS" nebo "CM" a dále toto kódování nemění. Změna matematického kódování uvnitř dokumentu je natolik neobvyklá, že s~ní OFS nepočítá a nastavuje pro úsporu paměti jednoduše "\let\setCMmathchars=\relax". Kdyby bylo nutné kódování během dokumentu měnit, muselo by se toto makro poctivě nadefinovat podobně jako "\setPSmathchars". Je možné přidávat k~defaultně nastaveným matematickým fontům další matematické rodiny (v~terminologii NFSS matematické abecedy) drobným pozměněním maker "\mathfonts" a "\mathchars". Například [viz též TBN, str.~177-179]: \begtt \def\mathfonts{\defaultmathfonts \newmathfam \bbfam \def\bb{\fam\bbfam \bbmathcodes}% [TBN, str.178] \loadmathfam \bbfam [/bbold10]% \newmathfam \bebfam \loadmathfam \bebfam [/cspex10]% } \def\mathchars{\defaultmathchars \def\[{\delimiter"4\hex\bbfam5B\hex\bebfam02 }% \def\]{\delimiter"5\hex\bbfam5D\hex\bebfam03 }% \mathchardef\squarcap="1\hex\bebfam46 <... další deklarace ...> \let\mathchars=\relax } \endtt Tento příklad ilustruje mj. smysl maker "\defaultmathfonts" a "\defaultmathchars", které jsou definovány v~OFS. Další rozsáhlý příklad je v souboru "ofsmtdef.tex", kde je definice nového kódování "\def\fomenc{MT}" pro fonty z balíku MathTimes. 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 \ <číslo> \endtt Pokud není "\" v~okamžiku použití "\safemathchardef" definována, příkaz pracuje zcela stejně jako "\mathchardef". Pokud ale je "\" už definována, uloží příkaz "\safemathchardef" její význam do "\T", dále provede "\mathchardef \M = <číslo>" a konečně "\" předefinuje následujícím způsobem: \begtt \def \ {\ifmmode \expandafter \M \else \expandafter \T \fi} \endtt % Od této chvíle "\" pracuje v textovém i matematickém módu. Pro případ opakovaného použití "\safemathchardef" na stejnou "\" makro kontroluje, zda už není definována "\M". 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 "\" "<číslo>" separované mezerou a provede: \begtt \def \ {\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 {}{} % příklad použití: \mathbin {\pickmathfont {psybo}{\char"C4}} \endtt % Makro "\pickmathfont" použije primitiv "\font" na specifikovanou a v~tomto fontu zapíše , 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é , 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 - \endtt Parametry a musejí obsahovat jednotku a vymezují uzavřený interval, pro který platí: jestliže je požadovaná velikost fontu ve tvaru "at" a současně leží v~intervalu "-", pak se místo použije " at". Příkaz "\registertfm" je potřeba pro vymezení různých intervalů použít opakovaně na stejné . Ačkoli jsou intervaly "-" 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 a 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 neleží v~žádném specifikovaném intervalu. Hvězdička místo parametru značí \uv{nekonečnou velikost}. Parametry a 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". \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 : \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 : * ". Abychom v~deklaračních souborech nemuseli opisovat , 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] \begtt \registeredfam ? \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 Pokud spustíme "\setfonts[/]" 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 nastavéní 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 "()" 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. Můžete zde najít zárodky nově vznikajícího balíčku LANG (multijazykové prostředí založené na OFS pro plain) a balíčku IENC (mapování vstupního kódování). \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=11pt \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; \\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 \#1% \char`\{\back printaccent\char`\{\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; \\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 % \char`\{\back printcharacter\char`\{\char`\}\char`\}}; \\currentfamily \pl; \\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[, ...]} 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; \\lccodes \unskip, {\tt\back lccodesloop} \pl; \\listfamilies \pl~interní, text vypisovaný při {\tt\back showfonts}; \\loadCMboldmath \pl; \\loadCMnormalmath \pl; \\loadingenc \pl; \\loadmathfam \pl; \\loadPSboldmath \pl; \\loadPSnormalmath \pl; \\loadtextfam \pl; \\logfontmessages \pl; \\mathaccentdef \pl; \\mathchars \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} [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; \\ofslistvariants \pl~interní, text pro výpis variant do logu; \\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; \\printaccent \pl; \\printaccentwarn \pl; \\printcharacter \pl; \\printcharacterwarn \pl; \\processOFSoption \pl~interní, pro potřeby makra {\back endOFSmacro}; \\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}; \\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; \\registerenc \pl; \\registertfm \pl; \\restorefontid \pl~interní, obnovení jména fontu, viz {\tt\back savefontid}; \\rm \oba; \\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"; \\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} 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; \\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