% 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` @LATEX: OFS (Olsak's Font System) based on NFSS initialized. @char` \endtt Výhody OFS: \begitems * Sjednocuje rozhraní pro uživatele \LaTeX{}u i plainu. * Pomocí příkazu "\fontusage" dostaneme na terminál a do logu stručnou informaci o~použití maker z~OFS. * Umožňuje pracovat se skutečnými názvy písmových rodin tak, jak jsou uvedeny v~písmovém katalogu a tím nenutí uživatele si kromě těchto názvů pamatovat ještě interní zkratky použité v~NFSS nebo v~názvech metrik fontů. * Umožní pracovat s~fontem rozloženým do dvou metrik (základní a rozšiřující) jakoby se jednalo o~jediný font. * Umožní na začátku dokumentu vybrat oblíbené kódování základní metriky, jsou-li metriky připraveny v~různých kódováních (typicky kódování IL2 a T1). * Definuje rozhraní pro vytváření pomocných souborů, které obsahují konverzní informace mezi \uv{dlouhými názvy} fontů z~katalogu a \PLAIN: názvy metrik nebo \LATEX: zkratkami používanými v~NFSS. * \PLAIN: Umožňuje podobnou nezávislost výběru jednotlivých parametů fontů, jako NFSS v~\LaTeX{}u. * \PLAIN: Definuje deklarační příkazy pro podchycení kódování fontů. * \PLAIN: Je možné pro různé velikosti registrovat různé metriky, což využijeme zejména u~rodiny Computer Modern. * \PLAIN: Obsahuje nástroje na použití PostScriptových fontů i v~matematické sazbě. * Interaktivní makro "ofstest.tex" umožní tisknout vzorky odstavců ve zvolených písmových rodinách, tisknout tabulky fontů, katalogy fontů, vzorky matematické sazby a seznamy znaků ve fontech včetně jejich \TeX{}ových sekvencí. Stačí napsat na příkazový řádek "tex ofstest [allfonts]" nebo "csplain ofstest [allfonts]" a řídit se pokyny na terminálu. \enditems \sec Členění písmových rodin %%%%%%%%%%%%%%%%%%%%%%%%%%%% Makro OFS vychází z~toho, že většina dnes dodávaných písmových rodin obsahuje čtyři řezy: základní ("\rm"), tučný ("\bf"), kurzívu ("\it"), a tučnou kurzívu ("\bi")\inll[rm \back bf \back it \back bi]. Těmto řezům budeme říkat \uv{standardní varianty}. Po zavedení rodiny příkazem "\setfonts" (viz níže) lze pak přepínat pomocí "\rm", "\bf", "\it" a "\bi" mezi variantami v~dané rodině. První tři uvedené přepínače jsou známé z~plainu (v~\LaTeX{}u přetrvávají z~dob zašlé slávy LaTeXu2.09) a čtvrtý přepíná do varianty BoldItalic. Některé rodiny mohou deklarovat přepínače dalších \uv{nadstandardních variant} a u~některých rodin naopak může chybět i některá ze standardních variant. Varianty v~některých rodinách se mírně liší od zde uvedených názvů pro standardní varianty. Místo tučného písma může být třeba přítomno jen polotučné a místo kurzívy třeba skloněné písmo. Přepínače "\rm", "\bf", "\it" a "\bi" zůstávají pokud možno zachovány, takže by nás nemělo vyvést z~rovnováhy, že v~některé rodině třeba "\it" přepíná do skloněného písma a ne do kurzívy. Pokud chceme současně pracovat s~dalšími přepínači fontů jiné rodiny (například "\tt" pro strojopis), je možné takové přepínače deklarovat pomocí příkazu "\fontdef". Členění fontů do rodin je deklarováno v~souborech, které mají v~plainu podobný význam, jako {\tt fd} (Font Definition) soubory z~\LaTeX{}u. Doporučená přípona souboru je pro plain {\tt tex} a pro \LaTeX{} {\tt sty}. Těmto souborům budeme říkat \uv{deklarační soubory}. Podle názvu deklaračních souborů by mělo být uživateli zřejmé, které rodiny jsou v~něm deklarovány. Příklady: \begtt @PLAIN: @LATEX: sjannon.tex, sjannon.sty ... souhrnná rodina Jannon ze Střešovic a35.tex, a35.sty ... základní skupina 35 fontů od Adobe \endtt Vidíme, že deklarační soubory (na rozdíl od {\tt fd} souborů z~\LaTeX{}u) obsahují obvykle definice více souvisejících rodin. Mezi těmito soubory uživatel vybírá ty, které bude potřebovat a uvede jejich jména při zavedení makra OFS v~záhlaví svého dokumentu. Aby měl uživatel zjednodušenou práci, zakládáme obvykle též souhrné soubory, které obsahují "\input" nebo "\RequirePackage" na jednotlivé deklarační soubory: \begtt skatalog.tex, skatalog.sty ... všechny fonty ze Střešovic allfonts.tex, allfonts.sty ... všechny fonty na TeXové instalaci \endtt \sec Uživatelské příkazy %%%%%%%%%%%%%%%%%%%%%%%% \subsec Zavedení OFS %%%%%%%%%%%%%%%%%%%% Pro příklad předpokládejme, že budeme chtít pracovat s~fonty ze souhrnné rodiny Jannon a DynaGrotesk. Protože se jedná o~rodiny ze Střešovické písmolijny od pana Štorma, najdeme odpovídající deklarační soubory v~adresáři "storm". Na Internetu je získáme společně s~makrem OFS například na "www.cstug.cz/stormtype". Souhrnné rodiny Jannon a Dyna\-Grotesk jsou deklarovány v~těchto souborech: \PLAIN: "sjannon.tex", "sdynamo.tex"; \LATEX: "sjannon.sty", "sdynamo.sty". Písmeno "s" na začátku názvů znamená, že fonty pocházejí ze Střešovické písmolijny. Jména těchto souborů bez přípony je nutné uvést v~hranaté závorce při zavedení makra OFS takto: \begtt @PLAIN: \input ofs [sjannon, sdynamo] % mezera před "[" je nutná! @LATEX: \usepackage [sjannon, sdynamo] {ofs} \endtt Dále můžeme pracovat s~rodinami, které jsou obsaženy v~souhrnných rodinách Jannon a DynaGrotesk. Napíšeme-li do dokumentu příkaz "\showfonts"\inl[showfonts], zobrazí se na \hbox{terminál} (a~zapíše do logu) seznam názvů jednotlivých rodin, které dále můžeme používat. Po zavedení "sjannon" a "sdynamo", jak bylo uvedeno výše, zobrazí příkaz "\showfonts" tento seznam: \begtt OFS (l.1): The list of known font families: defaults: [CMRoman/] \rm, \bf, \it, \bi, \sl [CMSans/] \rm, \bf, \it, - [CMTypewriter/] \rm, - , \it, - , \sl [Times/] \rm, \bf, \it, \bi [Helvetica/] \rm, \bf, \it, \bi, \nrm, \nbf, \nit, \nbi [Courier/] \rm, \bf, \it, \bi sjannon.tex: [JannonAntikva/] \rm, \bf, \it, \bi, \mr, \mi [JannonText/] \rm, \bf, \it, \bi, \mr, \mi [JannonCaps/] \rm, \bf, \it, \bi sdynamo.tex: [DynaGroteskDXE/] \rm, \bf, \it, \bi [DynaGroteskRXE/] \rm, \bf, \it, \bi [DynaGroteskLXE/] \rm, \bf, \it, \bi ... ... \endtt Prvních 6 rodin (označené jako defaults) je definováno v~OFS. Teprve další rodiny jsou deklarovány v~použitých souborech. Vedle názvů rodin jsou uvedeny přepínače variant, které pro danou rodinu můžeme použít. První čtyři přepínače jsou pro standardní varianty a pokud v~některé rodině taková varianta není přístupná, je zde na místě odpovídajícího přepínače pomlčka. Pátý a případně další přepínače se vztahují k~případným nadstandardním variantám. Zde například rodina Helvetica má navíc přepínače pro varianty \uv{Narrow} a rodiny Jannon mají přepínače pro varianty \uv{Medium}. Napíšeme-li do dokumentu příkaz "\fontusage"\inl[fontusage], zobrazí se na terminál a do logu stručná informace o~použití příkazů z~balíku OFS. Kromě výše uvedeného způsobu zavedení: \begtt @PLAIN: \input ofs [, , ...] @LATEX: \usepackage [, , ...] {ofs} \endtt % existuje ještě možnost přímo zavést požadované soubory. Pak není nutné v~dokumentu explicitně zavádět soubor "ofs.tex" resp. "ofs.sty": \begtt @PLAIN: \input \input ... @LATEX: \usepackage {} \usepackage {} ... \endtt % Příklad: \begtt @PLAIN: \input sjannon \input sdynamo @LATEX: \usepackage {sjannon} \usepackage {sdynamo} \endtt % Nedoporučuje se (zvláště v~\LaTeX{}u) oba tyto způsoby zavedení makra OFS míchat. \subsec Příkaz {\tt\back setfonts} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% V~dalších příkladech předpokládáme,\inl[setfonts] že jsme zavedli pouze potřebné rodiny, například ze souborů {\tt sjannon} a {\tt sdynamo}. Nyní třeba po použití příkazu \begtt \setfonts [JannonText/12pt] \endtt % lze přepínat do jednotlivých variant této rodiny JannonText ve velikosti 12pt. Je možné použít přepínače "\rm", "\bf", "\it", a "\bi" a speciálně pro tuto rodinu ještě "\mr" a "\mi". Příkaz "\setfonts [/]" přepíná do nové rodiny a ctí naposledy zapnutou variantu. Pokud před tímto příkazem byla zapnutá třeba varianta BoldItalic, pak po tomto příkazu zůstává zapnutá tato varianta i v~nové rodině. Pokud v nové rodině naposledy zapnutá varianta neexistuje, přepíná se do "\rm". Tato varianta musí být deklarována v~každé rodině. Příkaz "\setfonts" vymezuje všechny změny pouze lokálně. Po ukončení skupiny se sazba vrací k~rodině a variantě, která byla aktuální při zahájení skupiny. Parametry příkazu "\setfonts" mohou být prázdné: "\setfonts [/]" přepne do nové rodiny a ctí naposledy nastavenou velikost a "\setfonts [/]" nastaví novou velikost a ponechá aktuálně vybranou rodinu. Po inicializaci OFS je (pro případ použití prázdného parametru) defaultně nastavena rodina "CMRoman" a velikost 10\,pt. Příkaz "\setfonts [/]" je syntakticky korektní, ale neudělá kromě zápisu do logu vůbec nic. Parametr , je-li uveden, musí přesně odpovídat jménu rodiny podle seznamu známých rodin (viz nahoře příkaz "\showfonts"). Je třeba dodržovat malá a velká písmena a celé jméno psát bez mezer. Pokud se tento parametr neshoduje s~žádnou známou rodinou, vypíše \TeX{} varování a připojí seznam všech známých rodin. Takže například "\setfonts [?/]" lze použít se stejným efektem, jako příkaz "\showfonts". \LATEX: může být nejen jméno podle seznamu známých rodin (dlouhý název), ale je dovoleno použít i zkratku z~NFSS. Takže například "\setfonts [Times/]" a "\setfonts [ptm/]" je v~\LaTeX{}u totéž. \OBA: Parametr má tyto možnosti: \begitems * <číslo> .... např. "12", "17.4", * <číslo> .... např. "12pt", "17.4pt", "10dd", * "at"<číslo> .... např. "at12pt", "at17.4pt", "at10dd", * "scaled" .... např. "scaled1200", "scaled\magstep3", * "mag" .... např. "mag1.2", "mag.7", "mag2.0". \enditems První tři možnosti se významově shodují. Klíčové slovo "at" je nepovinné a není-li uvedeno ani "at" ani jednotka, doplní se automaticky "at<číslo>pt". Font se zavede přesně v~požadované velikosti. Samozřejmě při globálním "\magnification" celého dokumentu se jedná o~relativní a nikoli absolutní rozměry, pokud nepoužijeme jednotku uvozenou slovem "true" (např. "17truept"). Jestliže píšeme klíčové slovo "at", nesmíme vynechat jednotku. Nesprávně: "at12", správně: "at12pt" nebo jenom "12". Čtvrtá možnost ("scaled") je shodná s~použitím slova "scaled" při zavádění fontu pomocí primitivu "\font". Např. "scaled1200" je font, jehož základní velikost je pronásobena koeficientem 1,2. Je-li základní velikost fontu 10\,pt (což je obvyklé), pak je "scaled1200" shodné s~"at12pt". Poslední možnost ("mag") pronásobí aktuální velikost fontů daným koeficientem. Na rozdíl od "scaled" se tedy vztahuje k~aktuální velikosti a nikoli k~základní velikosti fontu. Je-li nejprve použito třeba "\setfonts[/12]" a v~zápětí "\setfonts[/mag2.]", rodina fontů bude nyní sázena ve velikosti 24\,pt. Příklad: \begtt \def\small{\setfonts[/mag.7]} Text {\small je menší \small a menší \small a ještě menší} a tady je zase v normální velikosti. \endtt Upozornění: Změna velikosti fontů pomocí "\setfonts" nijak nemění vzdálenost účaří ("\baselineskip"). To si musí uživatel nastavit sám. Pomocí "\setfonts" můžeme nastavit nejen celou rodinu (to ovlivní přepínače variant "\rm", "\bf", "\it", "\bi" a případně další), ale také jen zvolenou variantu v~dané rodině. V~takovém případě "\setfonts" nemění význam přepínačů variant ani aktuální velikost ostatních fontů. Při specifikaci varianty je nutno v~parametru "\setfonts" za název rodiny napsat znak mínus následovaný zkratkou pro variantu. Příklady: \begtt \setfonts [JannonText-it/12] ..... nastaví kurzívu dané rodiny ve velikosti 12pt \setfonts [JannonText-rm/] ....... nastaví základní řez dané rodiny v aktuální velikosti. \setfonts [CMTypeWriter-sl/] ..... nastaví základní variantu \sl v aktuální velikosti. \endtt I~při specifikaci varianty je možné v~parametru vynechat název rodiny, pak se použije aktuální rodina. Například \begtt \setfonts [JannonText/12] \setfonts [-bf/17] ... varinata Bold JannonText, velikost 17pt. Přepínače \rm, \bf, \it a \bi zůstanou nezměněny, v tomto příkladě přepínají JannonText ve velikosti 12pt. Následné použití třeba \setfonts [Times/] nastaví rodinu Times ve velikosti 12pt. ALE: \setfonts [/17]\bf ... Varinata Bold aktuální rodiny, velikost 17pt. Přepínače \rm, \bf, \it a \bi nyní přepínají ve velikosti 17pt. Aktuální velikost fontů je nyní 17pt. \endtt \LATEX: Co zde bylo řečeno o~ponechání významu přepínačů variant při specifikování varianty v~\LaTeX{}u není pravda, protože by to narušilo logiku NFSS. V~\LaTeX{}u tedy je "\setfonts [-bf/17]" zcela shodné s~příkazy "\setfonts [/17]\bf". \subsec Příkazy {\tt\back fontdef} a {\tt\back addcmd} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Příkaz "\fontdef"\inl[fontdef] umožňuje deklarovat nové fontové přepínače. \begtt \fontdef \ [/] \endtt % Tato deklarace se zhruba shoduje s{} \begtt \gdef \ {\setfonts [/]} \endtt \PLAIN: Pokud je specifikována rodina včetně varianty a parametr není prázdný ani není zadán pomocí klíčového slova "mag", pak "\" není implementován jako makro obsahující "\setfonts", ale jedná se o nativní přepínač fontu implementovaný pomocí "\global\font\" (tzv.~fixed font). Tak může uživatel deklarovat vlastní nativní přepínač fontu bez znalosti názvu metriky. \LATEX: Deklarovaný přepínač je ve všech případech implementován jako makro obsahující "\setfonts". Přístup k~nativním přepínačům je před uživatelem v~NFSS skryt. \OBA: Místo jména rodiny může být uveden vykřičník. Pak se doplní jméno rodiny aktuální v~místě příkazu "\fontdef". Na druhé straně, pokud je jméno rodiny prázdné, pak se jméno rodiny doplní podle aktuální rodiny v~místě použití deklarovaného přepínače. Analogická vlastnost platí pro parametr . Příklady: \begtt \setfonts [JannonAntikva/] \fontdef \small [/7] % \small = \setfonts [/7pt] \fontdef \sffam [DynaGroteskR/] % \sffam = \setfonts [DynagroteskR/] \fontdef \velky [Times/17] % \velky = \setfonts [Times/17pt] \fontdef \ttfam [Courier/] % \ttfam = \setfonts [Courier/] \fontdef \mylogo [Times-rm/mag.8] % \mylogo = \setfonts [Times-rm/mag.8] % velikost fontu bude vždy rovna % 0.8 násobku aktuální velikosti. \fontdef \timbf [Times-bf/12] % \timbf = fixed-font přepínač, jako: % \global\font\timbf=ptmb8z at12pt \fontdef \jansmall [!/7] % \jansmall=\setfonts[JannonAntikva/7] \fontdef \janbi [!-bi/17] % \janbi = fixed-font přepínač, jako: % \global\font\janbi=sjnbi8z at17pt \fontdef \tt [Courier-rm/!] % \tt = fixed-font přepínač, jako % \global\font\tt=pcrr8u at10pt \endtt Příkaz "\fontdef" deklaruje přepínač globálně, ovšem tento přepínač je sám o~sobě lokální. Jinými slovy "\global\fontdef\jmeno" je totéž jako "\fontdef\jmeno", ale přepínač "\jmeno" nastaví font (nebo celou rodinu) jen lokálně. Od verze OFS Oct.~2002 je podporován příkaz "\addcmd"\inl[addcmd], který umožní společně s~příkazem "\fontdef" soustředit problematiku fontů do jediného místa v souboru maker. Příkaz má formát: \begtt \addcmd \ {} \endtt % a chová se, jako "\def\ { }". Pomocí "\addcmd" tedy můžeme \uv{rozšířit} obsah makra "\" o~další příkazy. Sekvence "\" musí být (před použitím "\addcmd") definována jako makro bez parametrů nebo musí být ve významu neexpandované kontrolní sekvence deklarované například pomocí "\font", "\chardef" apod. Po použití "\addcmd" je sekvence "\" definována vždy jako makro bez parametru. Opakované použití "\addcmd" na stejný "\" je možné. Příklad použití: \begtt \setfonts [JannonText/] \fontdef \footnotefont [!/7] \addcmd \footnotefont {\rm \baselineskip=9pt \relax} \fontdef \sectionfont [!/12] \addcmd \sectionfont {\bf \let\it=\bi} \endtt \subsec Test přítomnosti rodiny %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \PLAIN: Ve svých makrech můžeme testovat, zda je rodina fontů deklarovaná, tj.~zda je načtena její deklarace z~deklaračního souboru. Použijeme k~tomu konstrukci "\knownfam ? \iftrue", která expanduje na "\iftrue", pokud je rodina deklarovaná a na "\iffalse", pokud deklarovaná není. Parametr musíme uvést bez specifikace varianty. \OBA: Z důvodů zpětné kompatibility se starší verzí OFS~dělá stejnou práci jako "\knownchar" makro "\ifknownfam []"\inl[ifknownfam]. V~OFS pro plain se ale od verze Feb.~2004 doporučuje používat "\knownfam", protože to udržuje správně spárované primitivy "\if*", "\else", "\fi". La\TeX{}ový uživatel si může "\knownfam" snadno definovat. \subsec \LATEX: Propojení OSF s~NFSS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Tato sekce je určena pouze pro \LaTeX{}isty. Příkaz\inl[OFSfamily] \begtt \OFSfamily [] \endtt % konvertuje dlouhý název rodiny podle katalogu na interní název rodiny zanesený do NFSS. Například \begtt \OFSfamily [JannonText] \endtt % expanduje na "sjng". Makro pracuje jen na úrovni expandprocesoru, proto nedostaneme při překlepu v~názvu rodiny chybové hlášení. Při neexistující rodině makro expanduje na text "unknown". Použijeme-li například "\OFSfamily" ve svých stylových souborech a zpozorujeme, že se NFSS snaží substituovat rodinu "unknown", můžeme si být jisti, že máme překlep v~názvu rodiny nebo nemáme správně použité "\usepackage". Příklad použití: \begtt \usepackage [sjannon, sdynamo] {ofs} \edef\rmdefault {\OFSfamily [JannonAntikva]} \edef\sfdefault {\OFSfamily [DynaGroteskR]} \edef\ttdefault {\OFSfamily [Courirer]} \endtt Význam maker "\rmdefault", "\sfdefault", "\ttdefault" je popsán v~dokumentaci NFSS. Dále OFS definuje příkaz\inl[OFSfamilydefault] \begtt \OFSfamilydefault [] \endtt % který nastaví základní rodinu celého dokumentu. Tato rodina se v~příslušných velikostech a variantách objeví nejen v~textu, ale i v~záhlaví kapitol, sekcí a podobně (jsou-li makra v~použitém class souboru udělána rozumně). Příkaz interně provede \begtt \edef\familydefault {\OFSfamily []} \endtt % s~tím, že navíc ošetří případ neexistující rodiny chybovým hlášením s~výpisem všech aktuálně dostupných rodin. \subsec Kódování fontů %%%%%%%%%%%%%%%%%%%%%% \LATEX: Přepínání mezi kódováním fontů probíhá zcela v~režii NFSS. OFS v~této věci nepřidává nic nového. \PLAIN (až do konce sekce): Implicitně se předpokládá kódování CSfontů. Pokud ale potřebujeme použít fonty například v kódování T1, pak použijeme "\def\fotenc{8t}"\inl[fotenc] a OFS bude pracovat s~fonty v~tomto kódování. Můžeme dokonce uvnitř dokumentu přepínat: \begtt \def\fotenc{8z} \setfonts[/] ... fonty v kódování CSfontů \def\fotenc{8t} \setfonts[/] ... fonty v kódování podle Corku. \endtt Kromě toho OFS obsahuje nástroje, aby makra závislá na kódování fontů (například "\v", "\'", "\ae") expandovala správně na znak ve zvoleném kódování. Implicitně je v~OFS nastaveno "\loadingenc=0"\inl[loadingenc], což znamená, že změnou kódování fontů ani příkazem "\setfonts" se nemění makra typu "\v", "\ae". Tato makra si ponechají svůj originální význam z~\hbox{plainu}. To uvítají ortodoxní plainisté, kteří nemají rádi, když má použitý balíček zbytečně velkou inteligenci. Je-li ale na začátku dokumentu uvedeno "\loadingenc=1", například: \begtt \input ofs [a35,sjannon] \loadingenc=1 \endtt % pak při každém příkazu "\setfonts" si \TeX{} zkontroluje, zda má načteny všechny potřebné soubory se jménem "ofs-.tex". Tyto soubory obsahují předefinování maker závislých na nastaveném kódování fontů. Pokud tyto soubory načteny nejsou, \TeX{} je během "\setfonts" načte. Podrobněji viz 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 [//] \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 \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 {}"\inl[OFSextraencoding] --- Toto makro si poznamená do paměti a provede "\input {ini.def}". Předpokládá se, že tam jsou odpovídající definice pro , viz například soubor "se1ini.def", který obsahuje deklarace pro rozšiřující kódování SE1 fontů ze Střešovické písmolijny. Pokud už byl soubor "ini.def" načten, makro jej nenačítá znovu. Pozor: je nutno psát velkými písmeny, ačkoli v~názvu souboru musí být naopak tato písmena malá. * "\OFSputfamlist {}"\inl[OFSputfamlist] --- vloží do seznamu rodin, který se vypisuje při "\showfonts" nebo při neznámé rodině. * "\OFSdeclarefamily [] {}"\inl[OFSdeclarefamily] --- poznamená si do paměti, že je ve skutečnosti . Tato paměť se využije například v~příkazu "\OFSfamily". Navíc zanese do seznamu rodin vypisovaném při "\showfonts". * "\OFSnormalvariants"\inl[OFSnormalvariants] --- do textu, který se vypisuje při "\showfonts" nebo při neznámé rodině vloží, seznam standardních přepínačů, tj.~"\rm,"~"\bf,"~"\it,"~"\bi". \enditems \PLAIN (až do konce sekce): Deklarační soubory mají příponu "tex" a předpokládá se o~nich, že mají pojistku proti opakovanému načtení. Pokud není ještě načten soubor "ofs.tex", je nutno jej před další činností načíst. Rovněž je vhodné zde načíst soubor definic znaků podle použitých kódování (viz~\beglink{3.4}sekce~3.4\endlink). V~deklaračním souboru je nutno vytvořit vazbu mezi názvy rodin a použitými metrikami. K~tomu se používají následující příkazy: \begitems * "\protectreading "\inl[protectreading] --- poznamená si do paměti, že je přečten . 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 {}"\inl[ofsputfamlist] --- vloží do seznamu rodin, který se vypisuje při "\showfonts" nebo při neznámé rodině. * "\ofsdeclarefamily [] {}"\inl[ofsdeclarefamily] --- deklarace nové rodiny se jménem . Toto jméno se zanese do seznamu známých rodin vypisovaných pomocí "\showfonts". Pokud se tato rodina použije při "\setfonts", pak se provedou . Mezi se použije právě jeden příkaz "\loadtextfam", který zavede fonty dané rodiny do paměti \TeX{}u. * "\loadtextfam"\inl[loadtextfam] --- Zavede čtyři fonty s~danými metrikami. Tento příkaz vyžaduje podrobnější vysvětlení, které je včetně parametrů příkazu uvedeno níže. * "\newvariant<číslice> \ () ;;"\inl[newvariant] \null\penalty0 --- Dekla\-ruje nový přepínač varianty. Podrobnější vysvětlení je uvedeno níže. * "\modifyenc :;"\inl[modifyenc] --- přidání výjimek vzhledem k~základnímu kódování, viz~\beglink{3.5}sekce~3.5\endlink. * "\fosize"\inl[fosize] --- makro, které uchovává informaci o~aktuální velikosti fontů v~naposledy vybrané rodině. Obsah "\fosize" může mít dvě podoby: "at" nebo "scaled" podle toho, jaký tvar parametru byl použit v~příkazu "\setfonts". * "\fotenc"\inl[fotenc] --- makro, které uchovává informaci o~aktuálním kódování. Nejčastější možnosti jsou "\def\fotenc{8z}" (kódování podle CS-fontů) nebo "\def\fotenc{8t}" (kódování podle Corku). Je-li při načtení souboru "ofs.tex" makro "\fotenc" už známé, ponechá se beze změny, jinak se definuje jako "8z". * "\extranec"\inl[extraenc] --- makro, které uchovává informaci o~rozšiřujícím kódování. Tuto informaci tam kopíruje z~parametru makro "\laodatextfam". * "\defaultextraenc"\inl[defaultextraenc] --- makro, jehož předefinováním můžeme změnit rozšiřující kódování základních rodin a rodin z~"a35.tex". Výchozí hodnota makra~"8c". * "\setfontshook"\inl[setfontshook] --- makro, které se spustí vždy při činnosti příkazu "\setfonts" těsně před tím, než jsou vykonány z~"\ofsdeclarefamily". * "\registertfm - "\inl[registertfm] --- umožňuje pracovat při různých velikostech fontů s~různými metrikami. Podrobnosti viz \beglink{3.8}sekce~3.8\endlink. * "\registerenc : "\inl[registerenc] --- umožňuje omezit použití rodiny fontů jen pro vymezená kódování. Podrobnosti viz \beglink{3.9}sekce~3.9\endlink. \enditems Příkaz "\loadtextfam" používaný v deklaračních souborech mezi makra "\ofsdeclarefamily" má parametry: \begtt \loadtextfam () ;% () ;% () ;% () ;;% \endtt % Procenta na koncích řádků v této ukázce označují, že za středníky nemá být mezera. Údaje "()" slouží jako komentáře o variantách zapisované do logu a je možno je kompletně včetně závorek a vynechat (třeba jen některé). Ve verzích OFS do Sep~2002 nebyl tento parametr vůbec podporován. Při vynechání tohoto parametru se předpokládají následující implicitní hodnoty: "rm: ()", "bf: (Bold)", "it: (Italic)", "bi: (BoldItalic)". Údaje odpovídají názvům metrik, které se pro uvedené varianty fontů makrem "\loadtextfam" zavedou. Makro zhruba provede toto: \begtt \font\tenrm= \fosize \font\tenbf= \fosize \font\tenit= \fosize \font\tenbi= \fosize \endtt % Předpokládá se, že všechny jsou v~deklaračním souboru napsány tak, že obsahují makro "\fotenc". %\inl[fotenc] Tím je zaručena změna názvu metriky při přechodu na jiné kódování (tj. při předefinování makra "\fotenc"). Konečně údaj udává název extra kódování. Pokud je tento parametr neprázdný, pak "\loadtextfam" provede na přechodnou dobu "\def\fotenc{}" a znovu expanduje parametry , , a . Výsledky těchto expanzí si poznamená do paměti. Jedná se o~rozšiřující metriky k~základním metrikám. Je-li parametr prázdný, poznámka o rozšiřujících metrikách se nekoná. Když pak nějaké makro pro přístup ke speciálnímu znaku tuto metriku potřebuje, objeví se na terminálu varování, že aktuálně zvolená metrika nemá rozšiřující variantu. Některé metriky v~příkazu "\loadtextfam" s výjimkou mohou být vynechány. Je-li například prázdný parametr , pak se zhruba provede \begtt \def\tenXX{\message{varování o neexistující variantě na terminálu}} \endtt % takže při přechodu na takovou variantu se objeví na terminálu a v~logu hlášení o~ne\-existující variantě a font se nezmění. Příkaz "\setfonts"\inl[setfonts] nemění význam maker "\rm", "\bf", "\it" a "\bi", ale mění význam přepínačů fontů "\tenrm", "\tenbf", "\tenit" a "\tenbi". Dělá to navíc zprostředkovaně tím, že spustí deklarované pro požadovanou rodinu v~"\ofsdeclarefamily" a mezi těmito se vyskytuje příkaz "\loadtextfam". Makra "\rm", "\bf", "\it", resp. "\bi" používají fontové přepínače "\tenrm", "\tenbf", "\tenit",\inll[tenrm \back tenbf \back tenit] resp. "\tenbi". První tři jsou známy z~plainu a čtvrtý\inl[tenbi] je zaveden nově. Navíc makra "\rm", "\bf", "\it" a "\bi" ukládají do kontrolní sekvence "\currentvariant"\inl[currentvariant] informaci o~naposledy aktivované variantě. Tato informace má podobu písmene ("M", "F", "T", resp. "I"), protože jedině konstrukce "\let\currentvariant=" je odolná vůči expanzi. Šlo o~to, aby makra přepínačů variant byla robustní i bez předefinování "\shipout". Všimneme si, že "\loadtextfam" nastavuje přepínače "\tenrm", "\tenbf", "\tenit" a "\tenbi" na fonty v~libovolné velikosti. Činí tak podle aktuální hodnoty makra "\fosize", které mění makro "\setfonts" podle toho, jak je zadán parametr . Slovo {\clqq"ten"\crqq} v~názvech fontových přepínačů tedy nemusí znamenat, že se jedná o~font ve velikosti 10\,pt. Považujme tyto názvy za historické a z~hlediska OFS možná trochu kuriózní. Není přitom nutné pro přepínače textových fontů vymýšlet názvy nové. Někdo může namítnout, že opakované používání makra "\setfonts" vždy znovu a znovu spouští čtveřici příkazů "\font", což může způsobit větší nároky na paměť a čas. Není to pravda, protože \TeX{} si eviduje interní tabulku už zavedených metrik a při opakovaném použití primitivu "\font" na stejnou metriku se už neobtěžuje metriku vůbec otevírat. Jen inicializuje příslušný fontový přepínač asi stejně rychle, jako by se to provedlo pomocí "\let". 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 navíc načte soubor "ofs-.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-.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 makra "\ofsdeclarefamily" se může deklarovat nadstandardní varianta rodiny pomocí příkazu "\newvariant".\inl[newvariant] Tento příkaz provede: \begtt \font\ten= \fosize \def \ {\let\currentvariant=<číslice> \ten} \endtt % Dále příkaz "\newvariant" zanese do paměti informaci o~případné rozšiřující metrice podle . Pokud OFS potřebuje dodržet při přechodu na novou rodinu naposledy zvolenou nadstandardní variantu, činí tak podle hodnoty "\currentvariant". Pokud tedy nová rodina má deklarovánu nadstandardní variantu pod stejnnou <číslicí>, bude použita tato varianta a OFS nebude přepínat do defaultní varianty "\rm". Je proto vhodné deklarovat varianty různých rodin ale \uv{stejného typu} pod stejnou <číslicí>. Z principu věci vidíme, že v~OFS existuje omezení v~počtu nadstandardních variant jedné rodiny na maximálně 10. To by nemělo vadit, protože kdykoli můžeme rozdělit rozsáhlou rodinu na více rodin (například Štormovy rodiny DynamoGrotesk). Makro "\setfonts" může měnit význam maker "\loadtextfam" a "\newvariant". Udělá to právě tehdy, když je v parametru specifikovaná varianta. V takovém případě stačí zavést jeden font a není potřeba zavádět celou rodinu. Při specifikaci standardní varianty "\newvariant" nebude dělat nic a "\loadtextfam" zavede jediný font. Při specifikaci nadstandardní varianty "\loadtextfam" nebude dělat nic a "\newvariant" zavede font jen tehdy, pokud se jedná o font specifikované varianty. Na závěr této sekce si podrobněji vysvětlíme činnost příkazu "\setfonts".\inl[setfonts] Tento příkaz \uv{vypočítá} a definuje podle parametru hodnotu makra "\fosize". Dále při neprázdném pamaretru a při neuvedení varianty tento příkaz provede "\def\currentfamily{}"\inl[currentfamily], zatímco při prázdném parametru hod\-notu z~"\currentfamily" pouze použije. Je-li v~parametrech uvedena varianta rodiny, pozmění "\setfonts" na přechodnou dobu makra "\loadtextfam" a "\newvariant" tak, aby místo celé rodiny fontů byl zaveden jen jeden font. Dále spustí "\setfontshook" a pak z~odpovídajícího "\ofsdeclarefamily". Potom vrátí hodnoty maker "\loadtextfam" a "\newvariant" do původního stavu, pokud byly tyto hodnoty měněny. Nakonec spustí makro "\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= \extrafont@inl[extrafont] \endtt \LATEX: Pro přepínání do rozšiřujícího kódování, které je deklarováno příkazem "\OFSextraencoding", slouží (stejně jako v plainu) makro "\setextrafont". Toto makro se podívá, zda bylo rozšiřující kódování deklarováno, a pokud ano, provede zhruba toto: \begtt \fontencoding{}\selectfont \endtt \OBA: Chceme-li vytisknout z~rozšiřující metriky (rozšiřujícího kódování) nějaký znak s~kódem <číslo>, je možné použít makro "\extchar <číslo>"\inl[extchar]. \PLAIN (až do konce sekce): Pro definice maker závislých na aktuálním kódování je možné v~OFS použít dva deklarační příkazy: "\characterdef" a "\accentdef". První z~nich\inl[characterdef] má tyto parametry: \begtt \characterdef \ <číslo> % příklad: \characterdef \promile 8z 141 % nebo \characterdef \ {} % příklad: \characterdef \promile 8t {\%\char24 } \characterdef \promile * {\vrule height1ex width1ex\relax} % in another encodings \endtt V~prvním případě se bude "\" při aktuálním kódování fontů shodném s~ expandovat na token kategorie 12 s~kódem rovným <číslu>. V~druhém případě "\" expanduje při shodnosti na . Vše proběhne na úrovni expand procesoru. Pokud použijeme oba výše zmíněné příklady pro definici "\promile", pak platí: \begtt \def\fotenc{8z} \promile % expanduje na znak s kódem 141 \def\fotenc{8t} \promile % expanduje na příkazy \%\char24 \endtt Mimoto je možné deklarovat přístup k~rozšířenému kódování, pokud je toto kódování specifikováno jako parametr v~příkazu "\loadtextfam". Příklad: \begtt \characterdef \euro 8z 134 \characterdef \euro 6s 37 \def\fotenc{8z} \euro % expanduje na znak s kódem 134 \def\fotenc{8t} \euro % expanduje na: {\setextrafont znak s kódem 37} \endtt V~tomto příkladě se při "\def\fotenc{8t}" může stát, že aktuální font nemá poznámku o~rozšiřující metrice, nebo má poznámku o~rozšiřující metrice jiné než "6s". Pak "\euro" vypíše varování na terminál o~nedostupnosti znaku "\euro". Vysvětlíme nyní podrobněji, jak makra deklarovaná pomocí "\characterdef" fungují. Příkaz "\characterdef" definuje "\" jako "\printcharacter{}"\inl[printcharacter], takže například "\promile" expanduje nejprve na "\printcharacter{promile}". a "\euro" na "\printcharacter{euro}". Pokud se "\characterdef" použije opakovaně na stejnou "\", pak se vždy znovu definuje stejně, takže nedochází ke ztrátě předchozí informace. Kromě toho ale "\characterdef" definuje další makro "\:-" tak, že toto makro expanduje na znak se specifikovaným kódem nebo na . Další inteligence je schována v~příkazu "\printcharacter". Ten ověří, zda je definováno makro "\:-\fotenc". Pokud ano, expanduje na obsah tohoto makra. Jinak ověří, zda existuje poznámka o~rozšiřující metrice vztažená k~aktuálnímu fontu. Pokud ano, zjistí kódování této rozšiřující metriky a podívá se, zda je definováno makro "\:-". Pokud ano, expanduje na \begtt {\setextrafont \:-} \endtt % Pokud se stále nepodařilo realizovat požadovaný znak, pokusí se vytisknout defaultní znak nezávislý na kódování "\:-*". Pokud ani to není možné, spustí se "\printcharacterwarn{}".\inl[printcharacterwarn] Implicitní hodnota tohoto makra vypíše varování o~nedostupném znaku na terminál a do logu a do výstupu nevytiskne nic. Chceme-li se vyhnout výpisu varování, můžeme "\printcharacterwarn" předefinovat, třeba takto: \begtt \def\printcharacterwarn #1{?(#1)?} \endtt 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\=\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 \ <číslo> % Příklad: \accentdef \v E 8z 204 % Ecaron % nebo \accentdef \ {} % Příklad: \accentdef \v * 8z {\accent20 } % default caron in 8z \accentdef \v * * {\blackbox } % default caron \endtt Pokud je aktuální kódování fontů totožné s~, pak "\" následovaná znakem expanduje na token kategorie 12 s~kódem <číslo>, respektive expanduje na . To vše se děje jen na úrovni expand procesoru. Pokud je při deklaraci pomocí "\accentdef" jako uvedena hvězdička, pak se deklarované nebo kód <číslo> použije vždy, když znak následující "\" není nikde prostřednictvím "\accentdef" deklarován. Jedná se tedy o~defaultní realizaci akcentu, pokud ve fontu neexistuje přímo akcentovaný znak. Kromě toho mají akcenty deklarované pomocí "\accentdef" stejnou inteligenci týkající se možnosti využití rozšiřující metriky, jako znaky deklarované v~"\characterdef". Vysvětlíme si nyní podrobněji, jak akcenty deklarované pomocí "\accentdef" fungují. Příkaz "\accentdef" definuje "\" jako makro s~jedním neseparovaným parametrem "#1", které v~první řadě expanduje na "\printaccent{}{#1}"\inl[printaccent], takže například "\v E" expanduje na "\printaccent{v}{E}". Dále "\accentdef" definuje makro "\::-" jako znak s~daným kódem <číslo> nebo jako . Další práci udělá příkaz "\printaccent". Tento příkaz zjistí, zda je definováno makro "\::-\fotenc". Pokud ano, expanduje na toto makro. Pokud ne, tak si ověří, zda je k~aktuálnímu fontu poznamenána rozšiřující metrika a zjistí její kódování . Jestliže je definováno makro "\::-", pak se expanduje na "{\setextrafont \::-}". Pokud zatím vše selhalo, zkusí "\printaccent" postupně zjistit, zda jsou definována makra "\:*:-\fotenc" a "\:*:-". Pokud je definováno první z~nich, expanduje a připojí na konec expanze . Pokud je definováno jen druhé z~nich, expanduje na \begtt {\setextrafont \:*:- } \endtt % kde označuje přepínač do aktuálního fontu. Jestliže dosud vše selhalo, pokusí se ještě o~realizaci akcentu nezávislého na kódování, tj.~pokusí se tisknout "\::-*" nebo konečně "\:*:-* ". Teprve když i toto selhalo, spustí se "\printaccentwarn{}{}".\inl[printaccentwarn] Implicitní hodnota tohoto makra vypíše se na terminál a do logu varování o~nedostupnosti akcentovaného znaku a do výstupu nevytiskne nic. Je třeba si uvědomit, že přechod ke znaku v~rozšiřující metrice uvnitř slova znamená ztrátu vyrovnávacího kernu kolem tohoto znaku a nemožnost použít na takové slovo vzory dělení slov. Proto doporučujeme použít základní metriku kódovanou tak, aby přechod na rozšiřující metriku byl jen výjimečný. Pro český a slovenský jazyk jsou v~tomto smyslu vhodná kódování "8z" i "8t", protože obě zahrnují kompletní českou a slovenskou abecedu. Chceme-li odstranit už deklarovaný znak\inl[characterdel] (viz též tzv.~ v~následující sekci), můžeme použít příkazy "\characterdel" a "\accentdel".\inl[accentdel] Tyto příkazy mají stejné parametry jako "\characterdef" resp. "\accentdef" a odstraní definici příkazu "\:-" resp. "\::-". %Na závěr této sekce uvedeme příklad definice inteligentního %"\Uppercase": % %\begtt %\def\Uppercase #1{\bgroup % \let\expandaction=\noexpand % \euro zůstane po expanzi bez změny % % \u{g} taky zůstane beze změny % \def\ss{SS}\def\l{\L}\def\o{\O}\def\ae{\AE}\def\oe{\OE}% % \edef\tmp{#1}\expandafter % \egroup \expandafter\uppercase\expandafter{\tmp}% %} % \uppercase promění \u{g} na \u{G}. O to šlo. %\endtt \subsec \PLAIN: Soubory maker závislých na kódování a výjimky z~kódování %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Příkazy "\characterdef" a "\accentdef" popsané v~předchozí sekci předefinovávají makra závislá na kódování ("\v", "\ae", atd.). V~této sekci popíšeme koncepci, kam tato makra zapisovat, aby OFS při "\loadingenc=1" udržovalo konzistentní definice těchto maker v~závislosti na zvoleném kódování a na množině výjimek použité rodiny fontů. Deklarace maker pomocí "\characterdef" a "\accentdef" se zapisují do souborů s~názvem "ofs-.tex" (tzv.~{\it kódovacích souborů\/}), protože příkaz "\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 :; {} \endtt % Přitom obsahují příkazy "\characterdef", "\accentdef", "\characterdel" a "\accentdel". Příkazy "\*del" musejí obsahovat v~argumentu hodnotu znaku podle základní sady daného kódování. Pokud má být nějaký znak vzhledem k základní sadě předefinován, musejí příkazy "\*del" a "\*def" k tomuto znaku následovat těsně za sebou. V parametru příkazu "\ofsdeclarefamily" můžeme pomocí \uv{odkazu na } příkazem "\modifyenc"\inl[modifyenc] vyznačit, že daná rodina obsahuje vzhledem k~základní sadě kódování odpovídající . Příkaz má tvar: \begtt \modifyenc :;% \endtt % Takových příkazů může být pro každou rodinu fontů uvedeno více (a samozřejmě tyto příkazy mohou obsahovat různá ). Odkazuje-li tento příkaz na , které ještě nebyly deklarovány, neprovede se nic. Příklad deklarace výjimek kódování "8z:csfonts" najdete v~souboru "ofs-8z.tex" a odkazy na ně pak najdete u~rodin "CM*" v~souboru "ofsdef.tex". Příkazy "\modifyenc" jsou spuštěny při každém "\setfonts". Ve skutečnosti tyto příkazy pouze ukádají do tzv.~{\it seznamu odkazů} (do makra "\newmodifylist"\inl[newmodifylist]) své parametry. Při startu "\setfonts" se zakládá prázdný seznam odkazů. "\modifyenc" ukládá do tohoto seznamu svůj parametr jen tehdy, pokud je rovno "\fotenc" nebo "\extraenc". Vlastní práci (nastavení výjimek) provede až příkaz "\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í do paměti, ale projdou také jejich obsah a definují všechny zde deklarované sekvence jako odpovídající "\printcharacter" resp. "\printaccent". Tím máme zaručeno, že každá kontrolní sekvence ze všech výjimek je definována (nedojde ke zprávě {\tt undefined control sequence}) a navíc OFS má dokonalý přehled o tom, zda je v~aktuální rodině tato kontrolní sekvence použitelná nebo nikoli. Tvůrce maker si pak může podle potřeby předefinovat makra "\print*warn". Příkaz "\modifydef" prochází tak, že na přechodnou dobu pozmění příkazy "\accentdef", "\accentdel", atd. a spustí. Pokud nechceme, aby se makra ve spouštěla už v~době činnosti "\modifydef", uvedeme před tato makra sekvenci "\skipfirststep".\inl[skipfirststep] Ta se chová jako "\relax", ale při spouštění příkazem "\modifydef" způsobí, že vše za touto sekvencí až do konce bude přeskočeno. Identifikátory ":lccodes" a ":ienc" jsou rezervovány pro použití mimo OFS v~dalších makrech. OFS například vůbec neřeší nastavení "\lccode", "\uccode" znaků podle použitého kódování. Makro, které se o toto stará, může vhodně definovat příkazy "\lccodes"\inl[lccodes] a "\lccodesloop" a spustí "\csname :lccodes\endcsname". OFS uvedené příkazy vůbec nedefinuje.\inl[lccodesloop] Deklarace ":lccodes" jsou uvedeny v~souborech "ofs-8t.tex" a "ofs-8z.tex" ačkoli nejsou v OFS využity, protože to souvisí s~kódováním textových fontů. Příklad použití ":lccodes" je v makru "lang.tex" a makro "inec.tex" používá ":ienc". V dokumentaci~k těmto makrům je řečeno více. Deklarace nejčastěji používaných výjimek se zapisují přímo do kódovacích souborů. Deklarace méně obvyklých výjimek (vztahujících se jen na určité rodiny fontů) můžeme psát za "\endinput" deklaračních souborů. Mezi makra "\ofsdeclarefamily" pak použijeme příkaz\inl[modifyread] \begtt \modifyread ;% \endtt % Tento příkaz při kladném "\loadingenc" načte daný soubor od výskytu sekvence "\modifytext"\inl[modifytext]. Tuto sekvenci je vhodné umístit za "\endinput", aby "\modifyread" přečetl tu část souboru, která zatím nebyla čtena. Přiřazení je v době čtení globální a ignorují se konce řádků a prázdné řádky. Opakovaně se soubor nenačítá. Díky tomuto příkazu můžeme soustředit deklarace rodin fontů a deklarace výjimek z~kódování do společného souboru. Výjimky \TeX{} přečte až v době, kdy to potřebuje. Šetří se tím paměť \TeX{}u. Příklad použití je v~souboru "slido.tex". OFS nabízí také testovací makro, zda kontrolní sekvence odpovídá znaku, který je ve fontu přístupný či nikoli:\inl[knownchar] \begtt \knownchar ? \iftrue znak je přístupný \else znak je nepřístupný nebo nedefinovaný \fi % příklad: \def\tryeuro{\knownchar \euro? \iftrue \euro \else Euro\fi} \endtt \subsec Pomocná makra pro akcenty a znaky %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Pro pohodlné deklarování defaultních akcentů jsou v~OFS\inl[accentabove] připravena dvě makra: "\accentabove" a "\accentbelow", která se používají takto:\inl[accentbelow] \begtt \accentabove {}{}{} \accentbelow {}{}{} \endtt Příkaz "\accentabove" resp. "\accentbelow" přisadí nad resp. pod , přičemž mezi těmito znaky bude . Oba znaky budou na společné vertikální ose a při skloněném písmu na společné skloněné ose. Šířka výsledného složeného znaku je odvozena od šířky základního znaku. Makra jsou implementována jako "\vbox" resp. "\vtop" společně s~"\halign" a s~výpočtem usazení na případně skloněné ose. Znaky pro akcent nahoře jsou ve fontech vesměs kresleny ve výšce odpovídající základnímu znaku o~výšce 1\,ex. Proto usazení takového akcentu vyžaduje kompenzaci: \begtt \accentabove {}{-1ex}{} \endtt V~tomto případě se akcent umístí naprosto stejně, jako při použití primitivu "\accent". Na rozdíl od tohoto primitivu ale makra "\accentabove" a "\accentbelow" umožnují vzájemné skládání, čímž můžeme dosáhnout několikanásobného akcentu. Vyzkoušejte: \begtt \it \accentabove {.}{.1ex}{\accentabove {,}{.1ex}{\v A}} \endtt \PLAIN: Bohužel, makra deklarovaná pomocí "\accentdef" nejsou uzpůsobena na více než dvojí akcent. Navíc dvojí akcent je možný jen v~tom případě, že se vnitřní akcent se základním znakem realizuje jako jediný znak. Pokud potřebujeme vícenásobný akcent, můžeme vždy použít přímo v~textu makro "\accentabove" nebo "\accentbelow". \PLAIN: Od verze OFS Feb. 2004 je k dispozici makro "\ofshexbox"\inl[ofshexbox], které pracuje podobně jako plainové "\mathhexbox", ale navíc dovede nastavit font podle aktuální varianty. Nejprve pomocí příkazu "\ofshexboxdef"\inl[ofshexboxdef] nastavíme \uv{rodinu} čtyř metrik: \begtt \ofshexboxdef {}{}{}{} \ofshexboxdef 2 {cmsy}{cmbsy10}{cmsy}{cmbsy10} % například takto \endtt % Pak příkaz "\ofshexbox " vytiskne znak s~ z jednoho ze čtyř deklarovaných fontů a v aktuální velikosti "\fosize" Volba fontu závisí na aktuální variantě. Pokud je varianta jiná než "\bf", "\it", "\bi", použije se . OFS implicitně deklaruje jen = 2, protože plain používá jen "\mathhexbox2..". Cílem tohoto makra bylo definovat pro CMfonty/CSfonty znaky "\S", "\dag", "\ddag", "\P" způsobem, který je nezávislý na aktuálním nastavení matematických fontů, ale je závislý na aktuální velikosti a variantě. Viz soubor "ofs-8z.tex". Pomocí "\ofshexbox" můž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" 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 [/] % metrikou \loadmathfam [-/] % variantou aktuální rodiny \loadmathfam [/] % přepínačem textového fontu \loadmathfam [X/] % 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". 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 \-Mt = \textfosize \font \-Ms = \scriptfosize \font \-Mss = \scriptscriptfosize \textfont = \-Mt \scriptfont = \-Ms \scriptscriptfont = \-Mss \endtt % Přitom 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 ;"\inl[mathencread] načte kódovací příkazy ze souboru . 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 ;" založí skupinu, ve které pro jistotu nastaví kategorie všech znaků podle plain\TeX{}u (s~výjimkou "\catcode`@=11") a přečte ".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 "\setmathchars" 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 "\setmathchars". 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 \ <číslo> \endtt Pokud není "\" v~okamžiku použití "\safemathchardef" definována, příkaz pracuje zcela stejně jako "\mathchardef". Pokud ale je "\" už definována, uloží příkaz "\safemathchardef" její význam do "\T", dále provede "\mathchardef \M = <číslo>" a konečně "\" předefinuje následujícím způsobem: \begtt \def \ {\ifmmode \expandafter \M \else \expandafter \T \fi} \endtt % Od této chvíle "\" pracuje v textovém i matematickém módu. Pro případ opakovaného použití "\safemathchardef" na stejnou "\" makro kontroluje, zda už není definována "\M". Pokud ano, pak "\safemathchardef" neprovede nic. Je potřeba, aby byly soubory s~příkazy "\characterdef" načteny před prvním použitím "\setmath". Pak lze v~rámci "\setmath" (přesněji v~makru "\mathchars") použít "\safemathchardef" na předefinování některých sekvencí, které byly dříve deklarovány pomocí "\characterdef". Tyto sekvence pak budou pracovat v textovém i matematickém módu. Naprosto stejně, jako "\safemathchardef" pracuje příkaz "\safemathaccentdef"\inl[safemathaccentdef]. Pouze místo primitivu "\mathchardef" použije makro "\mathaccentdef"\inl[mathaccentdef], které přečte za "\" "<číslo>" separované mezerou a provede: \begtt \def \ {\mathaccent<číslo> } \endtt Pokud nechceme deklarovat novou matematickou rodinu pro několik málo znaků (počet matematických rodin je totiž v~\TeX{}u omezen na 16), můžeme použít makro "\pickmathfont"\inl[pickmathfont], které má tyto parametry: \begtt \pickmathfont {}{} % příklad použití: \mathbin {\pickmathfont {psybo}{\char"C4}} \endtt % Makro "\pickmathfont" použije primitiv "\font" na specifikovanou a v~tomto fontu zapíše , který v~matematickém seznamu tvoří atom typu Ord. Důležité je, že je použit font v~odpovídající velikosti (základní, indexová, indexindexová), takže to vypadá, jako by byl použita nová matematická rodina fontů. Přitom to není pravda, protože "\pickmathfont" je implementován pomocí primitivu "\mathchoice". Použití příkazu "\pickmathfont" najdeme v~souboru "ofsdef.tex" v~definici makra "\setPSmathchars". \subsec Registrování metrik pro různé velikosti %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \LATEX: Registrování různých metrik pro různé velikosti se dělá ve~"fd" souborech a je to dokonale vyřešeno v~NFSS. \PLAIN (až do konce sekce): Existují speciální rodiny fontů (například Computer Modern), kde se pro různé velikosti fontů používají různé metriky. I~tato vlastnost je implementována v~OFS. Dosud jsme zatajili, že v~parametrech příkazů "\loadtextfam", "\loadmathfam" a "\pickmathfont" je možné místo názvů metrik uvést smyšlené , které je registrováno příkazem "\registertfm"\inl[registertfm]. V~takovém případě se skutečná metrika pro zavedení primitivem "\font" vypočítá z~požadované velikosti fontu a z~údajů, které byly zadány pomocí skupiny příkazů "\registertfm". Upřesníme nyní parametry příkazu "\registertfm": \begtt \registertfm - \endtt Parametry a musejí obsahovat jednotku a vymezují uzavřený interval, pro který platí: jestliže je požadovaná velikost fontu ve tvaru "at" a současně leží v~intervalu "-", pak se místo použije " at". Příkaz "\registertfm" je potřeba pro vymezení různých intervalů použít opakovaně na stejné . Ačkoli jsou intervaly "-" uzavřené, později deklarovaný interval má přednost před dříve deklarovaným, takže nakonec je kladná reálná osa rozdělena na polouzavřené intervaly. Příklad použití je v~souboru "ofsdef.tex". Jsou-li oba parametry a prázdné, je příkazem "\registertfm" deklarována metrika, která se použije při specifikaci velikosti pomocí "scaled<číslo>" nebo v~případě, kdy neleží v~žádném specifikovaném intervalu. Hvězdička místo parametru značí \uv{nekonečnou velikost}. Příkaz "\registertfm - - " vymaže z~paměti předchozí registrace pro dané a navíc vyznačí 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 a se expandují v~okamžiku činnosti příkazu "\registertfm". Není proto obvyklé v~nich používat makro "\fotenc". Nicméně toto makro můžeme v~uvedených parametrech použít, pokud zahrneme potřebnou skupinu příkazů "\registertfm" do vlastního makra a toto makro spustíme opakovaně pro různé hodnoty "\fotenc". 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 : \registerenc Times: 8t % například \registerenc Times: 8z % nyní má Times registrována dvě kódování \endtt Pokud nemá rodina registrováno žádné kódování, pak OFS předpokládá, že je použitelná v~jakémkoli kódování (například fonty značek). V~deklaračních souborech tedy můžeme pomocí "\registerenc" omezit použití rodiny jen na vymezená kódování. Uživatel ale může příkazem "\registerenc" přidat k~rodině další povolené kódování. Nebo také může naznačit, že rodina má povoleno libovolné kódování příkazem "\registerenc : * ". Abychom v~deklaračních souborech nemuseli opisovat , může být tento parametr prázdný. V~takovém případě "\registerenc" použije rodinu z~posledního příkazu "\ofsdeclarefamily". Ve svých makrech se můžete zeptat, zda je rodina pro aktuální hodnotu "\fotenc" registrovaná:\inl[registeredfam] \vbox \bgroup \begtt \registeredfam ? \iftrue Rodina má \fotenc registrováno nebo má povoleno jakékoli kódování nebo vůbec není deklarována. \else Rodina má registována kódování, ale \fotenc mezi nimi není. \fi \endtt \egroup Pokud spustíme "\setfonts[/]" pro nedeklarovanou rodinu nebo pro rodinu s~nedovoleným kódováním, pak OFS napíše varování na terminál a vrátí "\setfontsOK"\inl[setfontsOK] jako "\undefined". Po úspěšném 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 "()" 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-.tex". \bod Zavedeno "\safelet" a "\protectreading". \bod Mezera za v "\accentdef" je nepovinná. \bod Přidána možnost "\loadmathfam [-/]" 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 \#1% \char`\{\back printaccent\char`\{\char`\}\char`\{\#1\char`\}\char`\}}; \\addcmd \oba; \inr bf rm \oba; \inr bi rm \oba; \\bifam \pl~interní, matematická rodina pro BoldItalic; \\calculatemetricfile \pl~interní, definuje {\tt\back metricfile} podle velikosti; \\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 % \char`\{\back printcharacter\char`\{\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[, ...]} 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} [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}; \\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"; \\sgfamily \pl~interní, pro uložení informace o~rodině; \\sgvariant \pl~interní, pro uložení informace o~variantě; \\showfonts \oba; \\singlefont \pl; \\singlefontname \pl~interní, odstraní {\tt at} z~názvu metriky; \\skipfirststep \pl; \\slantcorrection \pl~interní, pro potřeby {\tt\back accentabove} a {\tt\back accentbelow}; \\storeofsvariant \pl~interní, separace nepovinného parametru u~{\tt\back loadtextfam}; \\switchdeftodel \pl~interní, prohodí {\tt\back accent/characterdef} s~{\tt\back *del}; \\tenbi \pl; \inr tenbf tenrm \pl; \inr tenit tenrm \pl; \\tenrm \pl; \\testOFSoptions \pl~interní, pro potřeby makra {\tt\back endOFSmacro}; \\testtfmsize \pl~interní, pro potřeby {\tt\back registertfm}; \\testtfmsizeat \pl~interní, přechodná hodnota {\tt\back testtfmsize}; \\testtfmsizescaled \pl~interní, přechodná hodnota {\tt\back testtfmsize}; \\textfosize \pl; \\tryloadenc \pl~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