% 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