\chyph % použijte csplain % Přimlovám se k tomu nepřeznačkovávat článek do LaTeXu % Na článku totiž demonstruji vlastnosti OFS a opírám se % o OFS z plainu. Přechod na LaTeX se zachováním těchto vlastností % by nebyl jednoduchý. Můžete rozbalit metriky % a virtuální fonty k Charteru (přiložený charter8z.zip) do % pracovního adresáře a zpracovat csplainem na instalaci TeXu, % která obsahuje OFS. Před spuštěním dvips je pak potřeba doplnit % do psfonts.map čtyři řádky uvedené v souboru mapfile. Můžete mě také % informovat o tom, na kterých stránkách se dokument bude ve sborníku % nacházet, já opravím údaj \firstpage, zplainuji to, zdvipsuji a % pošlu obratem zpátky. \newcount\firstpage \firstpage=79 \newcount\numpages \numpages=14 \def\addcmd #1#2{\expandafter\def\expandafter\tmpa\expandafter{#1}% \def\tmpb{#1}% \ifx\tmpa\tmpb % the #1 is not a macro \expandafter\let\csname \string#1-original\endcsname =#1% \expandafter\def\expandafter #1\expandafter{% \csname\string#1-original\endcsname #2}% \else % the #1 is a macro \expandafter\def\expandafter #1\expandafter{#1#2}% \fi} \input ofs [ffonts] % Charter je ve skupině free fonts \setfonts [Charter/10pt] % výchozí rodina \setmath[//] % inicializace matematiky \fontdef\tt [CMTypewriter/mag1.1] % strojopis, korekce střední výšky \fontdef\verbtt [CMTypewriter-rm/8] % strojopis pro display ukázky \fontdef\small [!/9] % zmenšení pro abstrakt a záhlaví \addcmd \small {\baselineskip11pt \rm \def\mathversion{normal}\setmath[//]} \fontdef\fontsekce [!/12] % pro nadpisy sekcí \addcmd \fontsekce {\bf \let\it=\bi \def\mathversion{bold}\setmath[//]} \fontdef\fonttitul [!-bf/14.4] % titul \hsize=12,2cm \vsize=19,3cm \hoffset=63pt \voffset=43pt \parindent=14pt \lineskiplimit=-10pt \raggedbottom \exhyphenpenalty=10000 \widowpenalty=10000 \clubpenalty=10000 \showboxdepth=10 \showboxbreadth=50 \def\starthead{\global\headline= {\small \ifodd\pageno \hfil \thetitul \headspace \the\pageno \else \the\pageno \headspace \theauthor \hfil \fi}} \headline={\hfil\starthead} \def\headspace{\hskip2.5em\relax} \def\makeheadline{\vbox to0pt{\vskip-25pt \line{\vbox to8.5pt{}\the\headline}\vss}\nointerlineskip} \footline={\setfonts[/7]\setmath[//]\baselineskip=9pt \vbox{\hbox{\copytext}\hbox{\copykonvoj}}\hfil \global\footline={}} \def\lastpage{\advance\firstpage by\numpages \advance\firstpage by-1 \the\firstpage} \def\copytext{Jan Kasprzak, Petr Sojka (editoři): \SLT~2002 -- sborník semináře o~Linuxu a \TeX{}u, str. \the\firstpage--\lastpage, 2002.} \def\copykonvoj{\copyright~Konvoj, CSTUG, CZLUG 2002} \newcount\subnum \def\kap #1\par{\advance\subnum by1 \removelastskip %\goodbreak \vskip17pt plus2pt minus1pt\noindent{\fontsekce \ifnum\subnum>1 \the\subnum\enspace\enspace\fi #1}% \par\nobreak\vskip11pt plus2pt minus1pt \everypar{\setbox0=\lastbox \everypar={}}} \def\reference {\subnum=-1 \kap Reference\par \small} \def\bib{\par\advance\subnum by1 \leftskip=\parindent \noindent\llap{\the\subnum.\enspace}\ignorespaces} \let\orifootnote=\footnote \newcount\footnotenum \def\footnote#1{\global\advance\footnotenum by1 \orifootnote{$\setmath[//]^\the\footnotenum$}{\small \hangindent=\parindent #1\par}} \def\footnoterule{\kern-3pt \hrule width 2cm \kern2.6pt } \def\titul #1 \par{\def\thetitul{#1}\pageno=\firstpage \centerline{\fonttitul #1}\vskip20pt\relax} \def\autor #1 \par{\def\theauthor{#1} \centerline{#1}\vskip10pt\relax} \def\institut #1 \par{\centerline{\small #1}} \def\email #1 \par{\centerline{\small Email: \tt #1}\vskip20pt\relax} \def\abstrakt #1\par{\bgroup \small \leftskip=3em \rightskip=3em \noindent{\bf Abstrakt:}\enspace #1\par \egroup\bigskip} \def\url#1{{\tt#1}} \font\mflogo=logo10 % METAFONT logo \font\boldsy=cmbsy10 at12pt % Tučné \CS, \AMS. \font\bboldsy=cmbsy10 scaled\magstep2 % Tučné \CS v titulu \def\CS{$\cal C\kern-.1667em\lower.5ex\hbox{$\cal S$}\kern-.075em $} \def\bCS{{\boldsy C\kern-.1667em\lower.5ex\hbox{S}\kern-.04em}} \def\CSTeX{\CS\TeX} \def\CSTUG{\CS TUG} \def\CSfont{\CS\kern.1em font} \def\csplain{\CS\kern.1em plain} \let\CSplain=\csplain \def\mf{{\mflogo META}\-{\mflogo FONT}} \def\mp{{\mflogo META}\-{\mflogo POST}} \def\LaTeX{L\kern-.2em\raise.45ex\hbox{\setfonts[/mag.7] A}\kern-.05em\TeX} \def\twoe{$2_{\textstyle\varepsilon}$} \def\LaTeXe{\LaTeX\thinspace\twoe} \def\cslatex{\CS\kern.05em\LaTeX} \let\CSLaTeX=\cslatex \def\twoe{$2_{\textstyle\varepsilon}$} \def\LaTeXe{\LaTeX\thinspace\twoe} \def\AMS{$\cal A\kern-.166em\lower.5ex\hbox{$\cal M$}\kern-.075em S$} \def\bAMS{{\boldsy A\kern-.166em\lower.5ex\hbox{M}\kern-.075em S}} \def\ps{Post\-Script} \def\SLT{S\kern-0.025em\lower.5ex\hbox{L}\kern-.2emT} \def\DOS{\hbox{DOS}} %% Definice verbatim prostředí %% !verb. \catcode`\"=13 \def"{\hbox\bgroup\let"=\egroup\setverb\tt} \def\setverb{\def\do##1{\catcode`##1=12}\dospecials\obeyspaces} \def\begtt{\medskip\bgroup \nobreak\setverb \parskip=0pt %\parindent=0pt \catcode`\"=12\catcode`\~=13 \obeylines \baselineskip=10pt \let\tt=\verbtt \startverb} {\catcode`\|=0 \catcode`\\=12 |gdef|startverb#1\endtt{% |tt#1|nobreak|egroup|penalty0|medskip|scannexttoken}} {\obeyspaces\gdef {\ }} \long\def\scannexttoken#1{\ifx#1\par\else\noindent#1\fi} \def\citeref #1 #2 {\expandafter\def\csname cit:#1\endcsname{#2}} \citeref pismolijna 1 \citeref ofsftp 2 \citeref ofsdoc 3 \citeref stormcl 4 \def\cite#1{\expandafter\ifx \csname cit:#1\endcsname\relax \message{Warning: cite{#1} is not defined}[??]% \else [\csname cit:#1\endcsname]\fi} %------------------------------------------------------------------------- \titul Makro OFS %%%%%%%%% \autor Petr Olšák \institut Elektrotechnická fakulta ČVUT, Praha \email olsak@math.feld.cvut.cz \abstrakt OFS (Olšákův fontový systém) je balíček TeXových maker, který umožní získat větší přehled nad rozsáhlými kolekcemi fontů a umožní s~nimi poměrně snadnou manipulaci. Balík byl vyvinut pro získání přehledu nad fonty z~Typokatalogu Střešovické písmolijny~\cite{pismolijna}. Na základě poptávky \LaTeX{}ových uživatelů byl balík napsán ještě jednou pro \LaTeX, kde využívá NFSS a pokouší se je trošičku vylepšit. Základní uživatelské příkazy OFS jsou pak v~obou prostředích (plain i \LaTeX) stejné. Na přednášce předvedu použití OFS na uživatelské i konfigurační úrovni. \kap Úvodem %---------- Makro OFS jsem si napsal hlavně proto, abych se vyznal ve stovkách fontů, které pocházely ze Střešovické písmolijny a pro které jsem před rokem udělal \TeX{}ovou podporu. Protože jsem plainista, šlo mi hlavně o~to udělat makro co nejvíce srozumitelné uživateli plainu, který potřebuje přesně vědět, co to makro dělá. Tento požadavek například \LaTeX{}ové NFSS nesplňuje. Později se začali o~OFS zajímat též někteří uživatelé \LaTeX{}u. Tož jsem se přemohl a pokusil OFS napsat ještě jednou, tentokrát pod \LaTeX{}em s~využitím~NFSS. Cílem tohoto přepsání bylo hlavně to, aby se uživatelské příkazy pro vyhledávání a přepínání rodin fontů zcela shodovaly v~\LaTeX{}ové verzi s~verzí plainovou. \LaTeX{}ová verze přesto umí podstatně méně věcí, než plainová, protože pokud by měla umět vše, musel bych NFSS zcela odmítnout a fontový modul \LaTeX{}u si napsat po svém. Tím bych ale popřel \LaTeX{} jako takový, takže jsem zůstal u~respektování principů NFSS. Věci, které se v~NFSS dají dělat velmi těžko, jsem raději nedělal. Z~těchto důvodů jsem se v~\LaTeX{}u nepouštěl ani do podpory matematických fontů. Koncepce matematiky v~NFSS mi připadá jako plainistovi poněkud nesrozumitelná. Navíc velké kolekce fontů, které byly hlavní motivací OFS, jsou většinou textové. Pokud chce někdo použít matematickou sadu fontů v~\LaTeX{}u, použije "\usepackage{styl}" a ten styl je k~té matematické sadě většinou dodáván. Nepovažoval jsem tedy řešení matematiky v~\LaTeX{}u za prioritní. Na druhou stranu matematické rodiny v~plainu se pomocí OFS doplňují a zavádějí ve všech velikostech velmi elegantně. Věřím, že alespoň nějakému plainistovi (kromě mě) se toto řešení bude hodit. Makro OFS jsem zveřejnil na \cite{ofsftp} pod \TeX-like licencí, tj. je volně k~mání, ale změny pod stejným názvem nesmí dále šířit nikdo jiný, než autor. Do \TeX{}ových distribucí jsem makro zatím neprosadil, protože bohužel chybí anglická dokumentace. Domnívám se, že kdyby anglická dokumentace byla, nebyl by se zařazením do \TeX{}ových distribucí problém a makro by mohlo využít daleko více lidí. Bohužel, nejsem v~angličtině natolik zdatný, abych tento problém rychle překonal. Pro letošní letní prázdniny jsem sice plánoval, že se pokusím anglickou dokumentaci napsat, jenže přišla voda\dots K~OFS existuje samozřejmě česká dokumentace~\cite{ofsdoc} podrobě popisující chování makra. Navíc jsem se o~OFS zmínil už v~článku o~\TeX{}ové podpoře Štormových fontů~\cite{stormcl}. Dovolil jsem si zde přesto znovu k~tomuto tématu vrátit. Nechci být nyní tak technicky exaktní, jako v~manuálu~\cite{ofsdoc}, ale zase mám zde více místa k~rozepsání možností makra, než jsem měl ve článku~\cite{stormcl}, který byl především o~Štormových fontech. \kap Základy uživatelského rozhraní %---------------------------------- Uživatelské rozhraní je shodné v~\LaTeX{}ové verzi OFS i v~plainové s~výjimkou snad zavedení makra OFS, které v~plainu provedeme jednoduše pomocí "\input ofs [kolekce, fontů]", zatímco v~záhlaví \LaTeX{}ového dokumentu píšeme "\usepackage [kolekce, fontů] {ofs}". Abych v~tomto textu nemusel každou chvíli větvit svůj výklad na situaci vhodnou pro plain a pro \LaTeX{}, rozhodl jsem se zde předpokládat, že pracujeme pouze s~plainem (například s~\csplain{}em). \LaTeX{}ový uživatel si bude muset dohledat specifika verze OFS pro svůj formát v~dokumentaci~\cite{ofsdoc}. \bigskip Příkazem "\fontusage" dostaneme na terminál a do logu základní informace o~uživatelských příkazech: \begtt $ tex ofs \\fontusage This is TeX, Version 3.14159 (Web2C 7.3beta5) (/usr/local/share/texmf/tex/csplain/ofs.tex OFS (Olsak's Font System) based on plain initialized. (/usr/local/share/texmf/tex/csplain/ofsdef.tex)) \fontusage: ============== Olsak's Font System, usage: ================= \input ofs [sjannon, sdynamo, a35] ... for example \showfonts ... shows all loaded font families (by previous \input) \setfonts [Family/] ... local switch to the new family, after this, the \rm, \bf, \it, bi will switch to the variants. The current size is used. \setfonts [/size] ... local switch to the new size of fonts, the family is not changed. The "size" has the following possible formats: at ... the same as \font\something=file at ... the same as at ... the same as atpt scaled ... the same as \font\something=file scaled mag fonts will be magnified by given coefficient depend on current size of the fonts. \setfonts [Family/size] ... switch to the new family at given size \setfonts [Family-vr/] ... switch to the specified font, the current size is used. The "vr" is acronym for variant (bf for example). \setfonts [Family-vr/size] ... switch to the specified font. \fontdef\name [Family/size] ... same as \gdef\name{\setfonts[Family/size]} The "Family" or "size" parameter may be empty. \fontdef\name [Family-vr/size] ... \name is fixed-font switch iff: "size" is no empty and no mag. Fixed-font switch "\name" is implemented as \global\font\name=file. \setmath [size/size/size] ... set math it/rm as current it/rm + use PS Symbol \nofontmessages, \logfontmessages, \displayfontmessages, \detailfontmessages ... the levels of log. * \endtt Vidíme, že příkaz "\showfonts" nám ukáže kolekce fontů. Pokud jsme nepoužili \uv{previous "\input"}, dopadne základní kolekce (implementovaná přímo uvnitř OFS) takto: \begtt *\showfonts OFS (l.0): 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 \endtt Názvy fontových rodin jsou zde uvedeny v~hranatých závorkách a vedle jsou uvedeny přepínače variant, které pro danou rodinu je možné použít. Vidíme, že nejběžnější textové fonty Computer Modern jsou zaneseny v~OFS do tří rodin "CMRoman", "CMSans" a "CMTypewriter". Myslím, že netřeba dodávat, co to znamená. V~rodinách "CMSans" a "CMTypewriter" není k~dispozici jinak obvyklá varianta "BoldItalic", pro kterou je vyhrazen přepínač "\bi". V~rodině "CMTypewriter" nenajdeme ani přepínač "\bf" pro tučnou variantu, ale zato můžeme použít \uv{nadstandardní} variantu "\sl" (slanted), která je k~dispozici i v~rodině "CMRoman". %OFS také přímo pracuje s~rodinami "Times", "Helvetica" a %"Courier". %Rodina "Helvetica" má kromě běžných variant ještě varianty %zúžené, například "\nbf" znamená "NarrowBold". Pokud písmová rodina %nemá skutečnou kurzívu, ale jen skloněnou variantu, je přesto tato %varianta vymezena přepínačem "\it". %Většina písmových rodin totiž %dodržuje \uv{logiku čtyř variant}, pro které jsou v~OFS vyhrazeny %právě přepínače "\rm", "\bf", "\it", "\bi". Deklarace dalších písmových rodin jsou zanášeny do deklaračních souborů s~příponou "tex"% \footnote{V \LaTeX{}ovém OFS se jedná o~příponu {\tt sty}.}. V~každém distribuci \TeX{}u doporučuji udržovat soubor volající všechny deklarační soubory "allfonts.tex". Například na mém počítači vypadá tento soubor takto: \begtt $ cat `kpsewhich allfonts.tex` %%% All OFS families declared on this TeX %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Petr Olsak \input a35 % PostScript 35 \input ffonts % Another free fonts \input btfonts % Bitstream fonts \input skatalog % Stromtype foundry, 89 families \endtt % Když tedy napíšu "$ tex allfonts \\showfonts \\end | less"~, dostanu na svém počítači výpis zhruba tří set písmových rodin, každá obvykle ve čtyřech variantách. Důležité je, že se v tom vyznám a nemusím vzpomínat, jak se která metrika jmenuje. Následuje jen část výpisu. \begtt OFS (l.0): 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 a35.tex: [AvantGarde/] \rm, \bf, \it, \bi [Bookman/] \rm, \bf, \it, \bi [NewCentury/] \rm, \bf, \it, \bi [Palatino/] \rm, \bf, \it, \bi [ZapfChancery/] \rm, - , \it, - [ZapfDingbats/] \rm, - , - , - [Symbol/] \rm, - , \it, - ffonts.tex: [Charter/] \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: ... [DynaGroteskLE/] \rm, \bf, \it, \bi [DynaGroteskD/] \rm, \bf, \it, \bi [DynaGroteskR/] \rm, \bf, \it, \bi ... stitul.tex: [Alcoholica/] \rm, \bf, \it, - [Monarchia/] \rm, \bf, - , - [MonarchiaText/] \rm, \bf, - , - [Clichee/] \rm, \bf, \it, \bi [Regula/] \rm, - , \it, - [Splendid/] \rm, \bf, \it, - , \script, \sans [Cobra/] \rm, \bf, - , - [ExcelScript/] \rm, - , - , - , \ext [ExcelScriptText/] \rm, - , - , - , \ext [Zeppelin/] \rm, \bf, - , - , \lr, \coll [Negro/] \rm, - , - , - [Farao/] \rm, \bf, - , - , \kr, \coll ... slido.tex: [Lido/] \rm, \bf, \it, \bi, \crm, \cbf \endtt Ve výpisu je uveden i \TeX{}ový soubor, kde se deklarace odpovídajících rodin skutečně nachází. Vidíme tedy, že "a35.tex" už obsahuje deklarace rodin, ale například soubor "skatalog.tex" zřejmě obsahuje jen další "\input sjannon", "\input sdynamo", "\input stitul" atd. Když si pro svůj dokument vyberu třeba rodiny "JannonText", "DynaGroteskR" a "Farao", pak místo toho, abych psal \begtt \input ofs [allfonts] \endtt % si vystačím~s \begtt \input ofs [sjannon, sdynamo, stitul] \endtt % což způsobí načítání podstatně méně souborů s~deklaracemi fontových rodin. Pokud potřebuji vědět, jak ty fonty vypadají, napíšu například: \begtt $ pdfcsplain ofscatal [sjannon, sdynamo, stitul] ; acroread ofscatal.pdf \endtt % Soubor "ofscatal.tex", který vytvoří katalog, byl zařazen do balíku OFS od verze~"Oct 2002". \kap Přepínač rodin a velikostí Hlavním příkazem OFS na uživatelské úrovni je "\setfonts". Jedná se především o~přepínač rodin, viz výpis "\fontusage" v~předchozí sekci. Přepínač má dva parametry v~hranaté závorce oddělené lomítkem. Prvním parametrem je název rodiny a druhým požadovaná velikost fontů. Pokud některý parametr chybí, přepínač nebude jeho nastavení měnit. Přepínač samozřejmě funguje lokálně ve skupinách, jako bývá u~fontových přepínačů obvyklé. Po přepnutí rodiny pracují přepínače variant (obvykle "\rm", "\bf", "\it", "\bi") pro novou rodinu. Varianta se po přepnutí rodiny inicializuje stejná, jako byla před přepnutím, tj. jsme-li zrovna v~kurzívě rodiny Times a přepneme do Helveticy, zůstáváme ve variantě "\it" rodiny Helvetica, tj. skloněné písmo. Pokud ale při přepnutí rodiny aktuální varianta v~nové rodině neexistuje, inicializuje se varianta "\rm", kterou musí obsahovat každá rodina. Příklady \begtt \setfonts [JannonText/10.5] % nastavím na začátku dokumentu \setfonts [/14]\bf % například pro nadpisy \setfonts [/8]\rm % pro poznámky pod čarou \setfonts [DynagroteskR/]\it % třeba pro citáty \setfonts [CMTypewriter/] % pro strojopis. % tento přepínač např. v kurzívě nastaví automaticky % variantu kurzíva-strojopis. \endtt Výhodou tedy je, že si nemusím pamatovat názvy matrik (v~\LaTeX{}u pak nesrozumitelné zkratky rodin používané v~NFSS), ale píšu název rodiny do dokumentu stejným způsobem, jak jej vidím v~písmovém katalogu. Pokud udělám v~názvu rodiny překlep (třeba nedodržím velká a malá písmena), příkaz "\setfonts" spustí "\showfonts", tj. na obrazovce a v~logu vidím seznam všech rodin, které mohu použít. Velikost fontů mohu nastavit přímo udáním v~jednotce "pt", nebo připsáním jiné jednotky (např. "mm"), nebo jako u~primitivu "\font" pomocí slova "scaled" (koeficient zvětšení se váže k~základní velikosti fontu) a konečně i pomocí zcela nového prefixu "mag", který udává zvětšení vzhledem ke zrovna použité velikosti fontů, například: \begtt \def\maly{\setfonts [/mag0.8]} stanu se {\maly menším a {\maly menším a {\maly ještě menším}}} a už jsem se z toho dostal. \endtt % dopadne takto: \medskip \def\maly{\setfonts[/mag0.8]} stanu se {\maly menším a {\maly menším a {\maly ještě menším}}} a už jsem se z~toho dostal. \medskip Prefix "mag" pro velikost využijeme například v~logu \LaTeX{}, které jsem si v~plainu definoval jako \begtt \def\LaTeX{L\kern-.2em\raise.45ex\hbox{\setfonts[/mag.7] A}\kern-.05em\TeX} \endtt % a funguje to v~nadpisech (je tam tučné vyvýšené A~odpovídající velikosti) i v~poznámkách pod čarou. V~\LaTeX{}u samotném mají toto logo definováno tak, že se pro vyvýšené A~použije font v~indexové velikosti. No jo, zde jim to náhodou prochází, ale co kdyby se (například v~jiném v~logu) hodilo pro některé písmeno použít velikost "mag.8", která není jako indexová velikost použita? Bez OFS bychom to pak dělali dost obtížně, protože NFSS nám řešení nenabízí. Dalším využitím prefixu "mag" je možnost korigovat nestejné střední výšky písma. Například v~tomto sborníku je pro strojopis použit "CMTypewriter". Pokud si všimnete v~jiných příspěvcích, než tento, vidíte, že uvnitř odstavců ten strojopis s~fontem Charter moc nesedí, protože strojopis má menší střední výšku písma. Stačí ale pro přepínač "\tt" použít "\setfonts [CMTypewriter/mag1.1]", a střední výška je v~lati. To vidíme například v~tomto příspěvku. A~funguje to včetně zmenšených variant, které jsou v~příspěvcích pro \SLT{} použity v~abstaktu, poznámce pod čarou, nebo třeba v~údaji \uv{Email}, uvedeném v~záhlaví příspěvku. Příkaz "\setfonts" může obsahovat i specifikaci varianty (viz výpis příkazu "\fontusage"). Pak se už nejedná o~přepínač rodiny, ale fontu samotného. V~takovém případě přepínač "\setfonts" neovlivní přepínače variant "\rm", "\bf" a dalších, ale nastaví jen požadovaný jediný font. Například pro nadpisy by šlo psát "\setfonts[-bf/14]" místo "\setfonts[/14]\bf", ale museli bychom mít jistotu, že v~nadpisu nepoužijeme přepínač varianty, protože ten by vrátil font do velikosti aktuální rodiny. Tou velikostí je třeba 10pt. Abychom v~nadpisu mohli použít přepínač "\it", a přitom se dostali do varianty "\bi" (což je žádoucí), je potřeba přepínač fontu v~makru pro nadpis naprogramovat zhruba takto: \begtt \def\nadpis #1{{\setfonts[/14]\bf \let\it=\bi #1}} \endtt % Kvůli tomuto jednoduchému obratu, který zvládne snad každý plainista, jsem se rozhodl nekomplikovat jádro OFS podobným způsobem jako NFSS a nezavádět tedy další \uv{nezávislou souřadnici} popisující duktus fontu. Pro speciální rodiny fontů (jako je třeba rodina "DynaGrotesk") jsem ale snadno pomocí doplňujících maker vytvořil přepínač, který respektuje ještě o~jednu \uv{nezávislou souřadnici} více, než zvládá NFSS. V~tomto případě to nebyl jen duktus, ale i stupeň zúžení písma. Navíc tento přepínač dokáže \uv{poskakovat} po jednotkách vpřed a vzad podél zvolené souřadnice. To také NFSS nezvládá. Často se hodí vytvářet zkratky pro přepínače rodin. K~tomu slouží makro "\fontdef\přepínač[Rodina/velikost]", které funguje podobně, jako použití konstrukce "\gdef\přepínač{\setfonts[Rodina/velikost]}". V~záhlaví tohoto dokumentu mám například uvedeno: \begtt \input ofs [ffonts] % Charter je ve skupině free fonts \setfonts [Charter/10pt] % výchozí rodina \fontdef\tt [CMTypewriter/mag1.1] % strojopis, korekce střední výšky \fontdef\verbtt [CMTypewriter/8] % strojopis pro display ukázky \fontdef\small [Charter/9] % zmenšení pro abstrakt a záhlaví \endtt Možná čtenáře napadne, že jsem nemusel psát podruhé slovo "Charter" v~deklaraci přepínače "\small". Při kompletní změně základní rodiny dokumentu na jinou bych pak mohl změnit slovo "Charter" jen na jediném místě (u~příkazu "\setfonts") a byl bych hotov. Bohužel, vynechání rodiny v~příkazu "\small" vede k~problémům, protože tento příkaz je použit v~záhlaví dokumentu, tj. ~v~"\output" rutině. Pokud zde neuvedeme explicitně rodinu, dědí se rodina aktuálně použitá, která ovšem může být jakákoli, protože "\output" rutina je vyvolávaná z~různých míst při zpracování dokumentu. Mít záhlaví jednou strojopisem a podruhé Charterem podle toho, odkud byla "\output" rutina zavolána, je samozřejmě nežádoucí. Tento problém se dá řešit \uv{vykřičníkovou} konvencí, kterou umí zpracovat příkaz "\fontdef": \begtt \fontdef\small [!/9] \addcmd\small {\rm} % pro abstrakt a záhlaví \endtt % Vykřičník je nahrazen aktuální rodinou už v~době činnosti příkazu "\fontdef", nikoli tedy až v~době provádění přepínače. V~"\output" rutině se musíme ještě postarat o~potlačení dědičnosti aktuální varianty. Proto jsem použil ještě příkaz "\addcmd" (zaveden nově od verze OFS "Oct 2002"), který k~existujícímu makru přidá další příkazy na jeho konec. Celá deklarace fontů v~tomto dokumentu tedy vypadá zhruba takto: \begtt \input ofs [ffonts] % Charter je ve skupině free fonts \setfonts [Charter/10pt] % výchozí rodina \fontdef\tt [CMTypewriter/mag1.1] % strojopis, korekce střední výšky \fontdef\verbtt [CMTypewriter-rm/8] % strojopis pro display ukázky \fontdef\small [!/9] \addcmd \small {\baselineskip11pt\rm} % zmenšení pro abstrakt a záhlaví \fontdef\fontsekce [!/12] \addcmd \fontsekce {\bf \let\it=\bi} % pro nadpisy sekcí \fontdef\fonttitul [!-bf/14.4] % v titulu nebudeme přepínat varianty \endtt Povedlo se tedy veškeré aktivity související s~výběrem fontů soustředit na jedno místo dokumentu bez nutnosti používat názvy metrik. \kap Kódování fontů %------------------ OFS pro plain implicitně pracuje v~kódování \CSfont{}ů, ale můžete jej přepnout do jiného kódování. \footnote{OFS pro \LaTeX{} přenechává starost o~kódování zcela na~NFSS.} Základem informace o~kódování v~OFS pro plain je makro "\fotenc", které má implicitně hodnotu "8z". To znamená, že rodiny "CMRoman", "CMTypewriter" a "CMSans" budou pracovat s~\CSfont{}y. Kdyby uživatel nastavil "\def\fotenc{8t}", začalo by OFS pracovat v~případě těchto rodin s~DC nebo EC fonty. Jaké je technické pozadí vysvětlíme v~následující sekci. Většina metrik \ps{}ových fontů má varianty "*8t" (pro kódování podle Corku) a "*8z" (pro kódování podle \CSfont{}ů). Makro "\fotenc" tedy musí obsahovat koncovku metrik, které chceme použít. Tím volíme kódování. Příklad: \begtt \input ofs \setfonts [Times/] text 1 % metrika: ptmr8z, tj. kódování CSfontů \def\fotenc{8t} \setfonts [/] text 2 % metrika: ptmr8t tj. kódování podle Corku \endtt % Máte-li své fonty v~nějakém dalším kódování a koncovky metrik máte s~názvy třeba "*8x", pak není problém napsat "\def\fotenc{8x}" a můžete začít používat své vlastní metriky. Pokud používáte kódování podle Corku, doporučuji definovat makro "\fotenc" jako "8t" před zavedením makra OFS. Při použití složitěji deklarovaných rodin se to hodí. V~balíku OFS jsou soubory "ofs-8z.tex" a "ofs-8t.tex", ve kterých je deklarace akcentů a některých na kódování závislých maker, jako například "\promile". Implicitně není načten ani jeden z~těchto souborů, tj.~jsou respektována makra pro akcenty z~originálního plainu, která expandují na "\accent" podle kódování CMfontů. Pokud je toto chování nevyhovující, můžete načíst pomocí "\input" jeden nebo oba dva výše zmíněné soubory (v~libovolném pořadí -- jejich definice se nehádají). Pokud načtete oba soubory, pak makra pro akcenty expandují na znaky podle kódování, které je aktuálně nastaveno v~makru "\fotenc" ("8z" nebo "8t"). Podívejme se do souborů "ofs-8z.tex" a "ofs-8t.tex" (výrazně kráceno): \begtt %%% Default accents in CM \accentdef \` * 8z {\accent 18 } % grave \accentdef \' * 8z {\accent 19 } % acute \accentdef \v * 8z {\accent 20 } % caron \accentdef \u * 8z {\accent 21 } % breve ... %%% Standard characters in plain (redefined here) \def\aa{\r a} \def\AA{\r A} \characterdef \i 8z 16 \characterdef \j 8z 17 \characterdef \SS 8z {SS} \characterdef \AE 8z 29 ... %%% Extra characters from CS-fonts \characterdef \promile 8z 141 \characterdef \varhyphen 8z 156 \characterdef \flqq 8z 158 \characterdef \frqq 8z 159 \characterdef \clqq 8z 254 \characterdef \crqq 8z 255 ... %%% Accented letters from CS fonts \accentdef \` A 8z 152 \accentdef \' A 8z 193 \accentdef \" A 8z 196 \accentdef \` a 8z 184 \accentdef \' a 8z 225 ... %%% Default accents in Cork \accentdef \` * 8t {\accent 0 } \accentdef \' * 8t {\accent 1 } \accentdef \^ * 8t {\accent 2 } \accentdef \~ * 8t {\accent 3 } \accentdef \" * 8t {\accent 4 } ... %%% Standard characters in plain (redefined here) \def\aa{\r a} \def\AA{\r A} \characterdef \i 8t 25 \characterdef \j 8t 26 \characterdef \SS 8t 223 \characterdef \AE 8t 198 ... \characterdef \promile 8t {\%\char 24 } \characterdef \textpertenthousand 8t {\%\char 24\char 24 } ... %%% Accented letters from Cork encoding \accentdef \. i 8t `\i \accentdef \u A 8t 128 \accentdef \k A 8t 129 \accentdef \' C 8t 130 \accentdef \v C 8t 131 ... \endtt Myslím, že syntaxe a význam příkazů "\characterdef" a "\accentdef" je v~této ukázce samovysvětlující. Pokud ne, odkazuji čtenáře do dokumentace~\cite{ofsdoc}, která do posledního detailu (včetně popisu jednotlivých fází expanze) vysvětluje činnost těchto příkazů. \LaTeX{}ovému uživateli to může připomínat příkazy "\DeclareTextSymbol" a "\DeclareTextComposite" a jim podobné, které dělají zhruba totéž (jen poněkud komplikovaněji, nepřehledněji a těžkopádněji). OFS také počítá s~možností, že některé znaky jsou přidány do extra fontu, který s~původním fontem vytváří uspořádanou dvojici. Takové dvojice metrik jsou použity například pro fonty Štormovy písmolijny, protože obsahují více než 256 znaků. Přitom by bylo škoda některé znaky nevyužít. Ke každé metrice těchto fontů ("*8z" i "*8t") je přiřazena extra metrika "*6s", obsahující zbylé znaky. Pomocí "\characterdef" a "\accentdef" můžeme deklarovat přítomnost těchto znaků v~kódování "6s" (viz soubor "stormenc.tex"). Pokud aktuální metrika má k~sobě extra font v~kódování "6s" a je požadován znak z~tohoto fontu, OFS jej automaticky \uv{vyloví} pomocí přechodného přepnutí na extra metriku. \kap Deklarace rodin %------------------- Podívejme se nyní do souboru "a35.tex", který deklaruje rodiny pro základních 35 \ps{}ových fontů (kráceno): \begtt %%% Times, Helvetica, Courier is in OFS defaults \ofsdeclarefamily [AvantGarde] {% -------------------- AvantGarde \loadtextfam (Book) pagk\fotenc;% (Demi) pagd\fotenc;% (BookOblique) pagko\fotenc;% (DemiOblique) pagdo\fotenc;;% \def\TeX{T\kern-.08em\lower.3333ex\hbox{E}\kern-0.09emX}% } \ofsdeclarefamily [NewCentury] {% -------------------- NewCenturySchlbk \loadtextfam (Roman) pncr\fotenc;% pncb\fotenc;% pncri\fotenc;% pncbi\fotenc;;% \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX}% } ... \endtt Zde je tedy deklarováno zobrazení mezi názvy rodin a metrikami.% \footnote{ V~OFS pro \LaTeX{} takové soubory neexistují; tam se pouze deklaruje zobrazení mezi (dlouhými) názvy rodin v~OFS a zkratkami rodin v~NFSS. } Každá rodina má čtyři povinné metriky (pro běžné čtyři varianty). Metriky jsou zapsány pomocí "\fotenc", aby fungovalo přepínání kódování. Mezi předposledním a posledním středníkem může být uvedeno extra kódování, pokud je font rozložen do dvou metrik (v~tomto příkladě není). Příkazy uvedené v~parametru "\ofsdeclarefamily" se provedou při každém přepnutí rodiny příkazem "\setfonts". V~ukázce tam máme alternativní definice loga "\TeX", aby toto logo pěkně vypadalo v~každém fontu. Od verze OFS "Oct 2002" je přidána možnost použít nepovinné parametry v~argumentech příkazu "\loadtextfam". Tyto parametry píšeme do kulaté závorky a značí název varianty, pokud je odlišný od běžného názvu. Tato informace se použije v logu a při tisku katalogu. Podívejme se ještě do souboru "sjannon.tex" z~podpory Štormových fontů (výpis je zde neúplný): \begtt \ofsdeclarefamily [JannonAntikva] {% -------- Jannon Antikva \loadtextfam sjnr\fotenc;% sjnb\fotenc;% sjnri\fotenc;% sjnbi\fotenc;6s;% \newvariant2 \mr (Medium) sjnm\fotenc;6s;% \newvariant3 \mi (MediumItalic) sjnmi\fotenc;6s;% } \ofsdeclarefamily [JannonText] {% ------------ Jannon Text \loadtextfam sjnrg\fotenc;% sjnbg\fotenc;% sjnrig\fotenc;% sjnbig\fotenc;6s;% \newvariant2 \mr (Medium) sjnmg\fotenc;6s;% \newvariant3 \mi (MediumItalic) sjnmig\fotenc;6s;% } ... \endtt % Vidíme, že navíc je zde deklarována extra metrika v~kódování~"6s" a že se zde deklarují doplňující přepínače variant "\mr" a "\mi" mimo základní čtyři varianty. Podrobnější vysvětlení použitých příkazů čtenář opět najde v~dokumentaci~\cite{ofsdoc}. Jak jsou pomocí expanze "\fotenc" mapovány metriky \CSfont{}ů resp. DC~fontů, které v~názvech koncovku "8z" ani "8t" nemají? To souvisí rovněž s~tím, že tyto fonty mají pro různé velikosti různé metriky. V~deklaračních souborech je pak tento problém vyřešen způsobem \uv{dvě mouchy jednou ranou} (viz soubor "ofsdef.tex"): \begtt \registertfm cmr8z - csr10 % metrika pro všechny velikosti \registertfm cmr8z 0pt-6pt csr5 \registertfm cmr8z 6pt-7pt csr6 \registertfm cmr8z 7pt-8pt csr7 \registertfm cmr8z 8pt-9pt csr8 \registertfm cmr8z 9pt-10pt csr9 \registertfm cmr8z 10pt-12pt csr10 \registertfm cmr8z 12pt-17pt csr12 \registertfm cmr8z 17pt-* csr17 ... \registertfm cmr8t - dcr10 % metrika pro všechny velikosti ... \ofsdeclarefamily [CMRoman] {% ------------ Computer Modern Roman \loadtextfam cmr\fotenc;% cmbx\fotenc;% cmti\fotenc;% cmbxti\fotenc;;% \newvariant8 \sl (Slanted) cmsl\fotenc;;% } \endtt % Centrálním příkazem je zde makro "\registertfm", které mapuje neexistující metriky formálně vytvořené pomocí expanze "\fotenc" do skutečných metrik. Toto makro také umí registrovat různé metriky pro různé velikosti. Pokud tedy budeme chtít font daný pomocí "\setfonts[CMRoman-rm/12.5]", vyvolá se při "\fotenc" s~hodnotou "8z" metrika "csr12 at12.5pt". \uv{Metrika pro všechny velikosti} se použije v~případě, že je velikost fontu deklarovaná s~\hbox{prefixem} "scaled", takže "\setfonts[CMRoman-rm/scaled1250]" vyvolá metriku "csr10 scaled1250". Ztrácíte-li přehled o~tom, jaká metrika se ve skutečnosti použila, můžete zapnout logovací přepínač "\detailfontmessages". Podíváte-li se do souboru "ofsdef.tex" podrobněji, můžete si všimnout, že jsem metriky rodiny "CMRoman" a dalších "CM"~rodin pro kódování~"8t" poněkud odbyl. Registroval jsem je jako metriky DC fontů bez střídání metrik pro různé velikosti. Nechtělo se mi to totiž vypisovat a nevěděl jsem, zda uživatel tohoto kódování raději nepoužije EC fonty místo DC fontů. Ve zmíněném souboru jsou příklady, jak by se ta deklarace měla provést. Pokud ji někdo dopíše (například pro DC i EC fonty do zvláštních souborů), rád ji do balíku OFS zařadím. Osobně ale fonty kódované v~"8t" nepoužívám, takže mě zatím nic nemotivuje to udělat. \kap Matematické fonty %--------------------- Každý plainista ví, že fonty pro matematiku se sdružují do matematických rodin obsahující font pro základní, indexovou a index-indexovou velikost. Rovněž ví, že první čtyři matematické rodiny (s~číslem 0 až~3) jsou s~\TeX{}em jistým způsobem pevně významově svázány a další rodiny se dají deklarovat. Aby plainista při deklarování matematických rodin nemusel psát třikrát za sebou "\font" a potom ještě "\textfont\rodina=...", "\scriptfont...", atd, je v~OFS k~tomu vytvořena zkratka "\loadmathfam", jak ukážu za chvíli. Inicializaci matematických fontů v~OFS pro plain provedeme pomocí příkazu "\setmath". Dokud tento příkaz nepoužijeme, jsou matematické fonty ve stavu, jak je inicializoval plain. Ve třech parametrech příkazu "\setmath" (oddělených lomítky) dáváme najevo, jakou chceme základní velikost, jakou pro indexy a jakou pro indexy indexů. Jsou-li tyto parametry prázdné, je použito relativní zmenšení podle aktuální velikosti textového fontu pomocí prefixu "mag" takto: \begtt \setmath [//] je totéž jako \setmath [mag1.0/mag.7/mag.5] \endtt Příkaz "\setmath" vypočítá požadované velikosti a startuje makro pro zavedení fontů "\mathfonts". Dále tento příkaz startuje makro pro inicializaci matematického kódování "\mathchars". Tato makra si může plainista definovat jak chce, nicméně většinou využije již připravených maker "\defaultmathfonts" a "\defaultmathchars", která jsou udělána tak, že spouštějí různé varianty kódu podle hodnoty maker "\fomenc" a "\mathversion". Při "\def\fomenc{PS}" (imlicitní hodnota: PostScriptové fonty) se zavedou fonty tak, že matematická kurzíva se ztotožní s~aktuální textovou kurzívou a podobně rodina~0 pro číslice a textové symboly zůstává nastavena podle aktuální textové rodiny varianty "\rm". Matematické symboly se berou (pokud to je možné) z~běžně dostupného \ps{}ového fontu "Symbol". Zbytek (např. natahovací závorky) pak zůstává v~Computer Modern. Matematické kódování je pro tuto situaci výrazně pozměněno obvyklými primitivy "\mathchardef" a podobnými, aby byly dosažitelné všechny znaky plainu. Například pro řecká písmena musela být zavedena nová rodina se skloněným fontem "Symbol" a příkazy typu "\alpha" jsou překódovány z~původní matematické rodiny~1 na tuto novou rodinu. Nastavíte-li "\def\fomenc{CM}", pak příkaz "\setmath" zavede stejné matematické fonty z~rodiny Computer Modern, jako v~plainu. Příkaz "\setmath[//]" pak pouze aktualizuje velikosti těchto fontů podle velikosti aktuálního textového fontu. Nakoupíte-li fonty MathTimes, dále načtete soubor "ofsmtdef.tex" (součástí OFS od verze "Jun. 2002") a definujete "\def\fomenc{MT}", pak příkaz "\setmath" zavede kurzívu a rodinu~0 stejně jako při "\def\fomenc{PS}", ale navíc použije pro {\it všechny\/} symboly včetně natahovacích závorek fonty MathTimes. Kromě hodnoty "\fomenc" se příkaz "\setmath" větví i vzhledem k~hodnotě makra "\mathversion". Implicitně OFS počítá se dvěma hodnotami tohoto mak\-ra: "\def\mathversion{normal}" nebo "bold". Při verzi "bold" jsou načteny do matematických rodin tučné alternativy fontů, pokud to jde. Vše názorně vysvětlí pohled do souboru "ofsdef.tex": \begtt \def\defaultmathfonts{\csname load\fomenc\mathversion math\endcsname} \def\defaultmathchars{\csname set\fomenc mathchars\endcsname} \def\mathfonts{\defaultmathfonts} \def\mathchars{\defaultmathchars \let\mathchars=\relax % to protect the twice math-setting } \def\loadPSnormalmath{% \loadmathfam 0[tenrm/]% Actual Roman font \loadmathfam 1[tenit/]% Actual Italic font \loadmathfam 2[/cmsy]% Standard symbols from CM \noindexsize\loadmathfam 3[tenex/]% Standard extra symbols from CM \chardef\itfam=1 \chardef\bifam=5 \loadmathfam \bffam [tenbf/]% Actual Bold font \loadmathfam \bifam [tenbi/]% Actual Bold Italic \newmathfam\symbfam \loadmathfam \symbfam [/psyr]% PostScript Symbol \newmathfam\symbofam \loadmathfam \symbofam [/psyro]% PostScript Symbol Oblique } \def\loadPSboldmath{% \loadmathfam 0[tenbf/]% Actual Bold font \loadmathfam 1[tenbi/]% Actual Bold-Italic font ... } \def\loadCMnormalmath{% \loadmathfam 0[/cmr8z]% Roman font \loadmathfam 1[/cmmi]% Math Italic font \loadmathfam 2[/cmsy]% Standard symbols from CM \noindexsize\loadmathfam 3[/cmex10]% Standard extra symbols from CM ... } \def\loadCMboldmath{% \loadmathfam 0[/cmbx8z]% Roman font \loadmathfam 1[/cmmib10]% Math Italic font ... } \def\setPSmathchars{% \fontmessage{\ofsmessageheader Math codes are set for PS encoding}% \mathcode`\,="602C \mathcode`\.="002E \delcode`\<="\hex\symbfam E130A \delcode`\>="\hex\symbfam F130B \delcode`\|="\hex\symbfam 7C30C \edef\langle{\delimiter"4\hex\symbfam E130A }% \edef\rangle{\delimiter"5\hex\symbfam F130B }% \mathchardef\alpha "0\hex\symbofam 61 \mathchardef\beta "0\hex\symbofam 62 \mathchardef\gamma "0\hex\symbofam 67 ... } \endtt Chceme-li přidat nějaké další matematické rodiny (v~terminologii NFSS matematické abecedy), pak můžeme postupovat třeba takto: \begtt \def\mathfonts{\defaultmathfonts \newmathfam\bbfam \loadmathfam \bbfam [/bbold12]% Dvojitá vertikální kresba \def\bb{\fam\bbfam}% } \def\mathchars{\defaultmathchars \mathchardef\balpha "0\hex\bbfam 0B \mathchardef\bbeta "0\hex\bbfam 0C ... } \endtt Příklad z~konce sekce~3 nyní obohatíme o~možnost práce s~matematikou v~libovolných velikostech: \begtt \input ofs [ffonts] % Charter je ve skupině free fonts \setfonts [Charter/10pt] % výchozí rodina \setmath[//] % inicializace matematiky \fontdef\tt [CMTypewriter/mag1.1] % strojopis, korekce střední výšky \fontdef\verbtt [CMTypewriter-rm/8] % strojopis pro display ukázky \fontdef\small [!/9] % zmenšení pro abstrakt a záhlaví \addcmd \small {\baselineskip11pt \rm \def\mathversion{normal}\setmath[//]} \fontdef\fontsekce [!/12] % pro nadpisy sekcí \addcmd \fontsekce {\bf \let\it=\bi \def\mathversion{bold}\setmath[//]} \fontdef\fonttitul [!-bf/14.4] % titul \endtt Nyní i v~abstraktech, poznámkách pod čarou a záhlavích je matematika ve všech velikostech všech možných indexů zmenšená odpovídajícím způsobem. Pokud by se matematika měla použít v~názvu sekce, pak bude také tučná a správně veliká. \reference \bib \url{www.pismolijna.cz}, \url{www.cstug.cz/stormtype}. \bib \url{ftp://math.feld.cvut.cz/pub/olsak/ofs}. \bib Petr Olšák. {\it OFS: Olšákův fontový systém}. 2001. Dokumentace k~balíku je v~souborech "ofsdoc.tex", "ofsdoc.pdf". \bib Petr Olšák. {\it Jak \TeX{} k~fontům ze Střešovic přišel}. Zpravodaj Československého sdružení uživatelů \TeX{}u, 4/2001, pp~153--180. \bye