From 5b1aa58b4889aeb3418a3007a831bbb0b3fe72e4 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 11 Feb 2015 21:49:44 +0000 Subject: cstex (11feb15) git-svn-id: svn://tug.org/texlive/trunk@36259 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/cstex/opmac-d.tex | 738 +++++++++++++---------------- Master/texmf-dist/doc/cstex/opmac-u-en.pdf | Bin 227867 -> 227735 bytes Master/texmf-dist/doc/cstex/opmac-u-en.tex | 46 +- Master/texmf-dist/doc/cstex/opmac-u.pdf | Bin 262553 -> 264133 bytes Master/texmf-dist/doc/cstex/opmac-u.tex | 192 ++++---- Master/texmf-dist/doc/cstex/prvni.pdf | Bin 246318 -> 254373 bytes Master/texmf-dist/doc/cstex/prvni.tex | 56 ++- 7 files changed, 485 insertions(+), 547 deletions(-) (limited to 'Master') diff --git a/Master/texmf-dist/doc/cstex/opmac-d.tex b/Master/texmf-dist/doc/cstex/opmac-d.tex index 7fd3da08a92..8643c42bdba 100644 --- a/Master/texmf-dist/doc/cstex/opmac-d.tex +++ b/Master/texmf-dist/doc/cstex/opmac-d.tex @@ -8,7 +8,7 @@ % UTF-8 encTeX has a conflict with DocByTeX \chyph -\def\projectversion{Jul 2014} +\def\projectversion{Dec. 2014} \def\headtitle{OPmac} \widowpenalty=10000 @@ -225,9 +225,58 @@ Definovan \inext {addprotect}{}{+-} Makro "\exfont" se vyskytuje v souboru "exchars.tex" z \CS{}plainu. -Příkaz "\addprotect\exfont" zaprotektuje všechny znaky deklarované v toto +Příkaz "\addprotect\exfont" zaprotektuje všechny znaky deklarované v tomto souboru naráz. Podrobnosti lze nalézt v uvedeném souboru. +Makro \db replacestrings "{}{}" vymění v makru "\tmpb" +veškeré výskyty "" za "". Pro tento účel definuje pracovní +makro \db replacestringsA se separátorem "". Jak to pracuje je +ukázáno na příkladu níže. +Před spuštěním "\replacestringsA" je třeba nejprve vyvrhnout obsah "\tmpb" +do vstupní fronty, poté provést "\def\tmpb{}" a nakonec provést +"\replacestringsA". To je uděláno pomocí triku s "\edef\tmpb" a se dvěma "\expandafter". +V makru pracujeme s tokeny "!" a "?" kategorie 3, které slouží jako +separátory. Předpokládáme, že takové nestandardní tokeny se ve zpracovávaném +textu nikdy neobjeví, protože vykřičník a otazník mají normálně kategorii +12. + +\inext{bgroup}{\empty}{+-} + +Jak to pracuje si ukážeme na příkladu "\replacestrings{XX}{YY}", pokud máme +v "\tmpb" uložen třeba text "ahaXXuffXXkonec". Makro "\replacestringsA" je v +takovém případě definováno jako: + +\begtt +\def\replacestringsA #1XX#2!{% + \ifx!#2!\addto\tmpb{#1}\else\addto\tmpb{#1YY}\replacestringsA#2!\fi}% +\endtt +% +a jednotlivé kroky zpracování probíhají takto: + +\begtt +\replacestringsA ahaXXuffXXkonec?XX! +#1 = "aha" #2 = "uffXXkonec?XX!" +\addto\tmpb{ahaYY} +\replacestringsA uffXXkonec?XX! +#1 = "uff" #2 = "konec?XX!" +\addto\tmpb{uffYY}, tj. \tmpb obsahuje "ahaYYuffYY". +\replacestringsA konec?XX! +#1 = "konec?" #2 = "" (prázdný parametr) +\addto\tmpb{konec?}, tj. \tmpb obsahuje "ahaYYuffYYkonec?" a rekurze končí. +\endtt +% +Dále se předefinuje "\def\replacestrin""gsA#1?{\def\tmpb{#1}}" a provede se + +\begtt +\replacestringsA ahaYYuffYYkonec? +#1 = "ahaYYuffYYkonec" +\def\tmpb{ahaYYuffYYkonec} +\endtt +% +tedy tímto algoritmem odstraníme koncový otazník. Proč jsme ho tam vlastně +dávali? Kdyby tam nebyl, tak by nesprávně fungovalo +"\replacestrings{XX}{YY}" při "\tmpb" ve tvaru "ahaX". + \subsec Globální parametry %%%%%%%%%%%%%%%%%%%%%%%%%% @@ -716,7 +765,7 @@ kurz \inext{titfont}{\empty}{+-} -V další části této sekce je implemantace maker "\chap", "\sec" a "\secc". +V další části této sekce je implementace maker "\chap", "\sec" a "\secc". Pro číslování kapitol, sekcí a podsekcí potřebujeme čítače a další registry: \dgn \nb chapnum \dgn \nb secnum \dgn \nb seccnum \dgn \nb nonumnum @@ -1125,7 +1174,7 @@ znovu p \ilabel [mkindex:od] {firstdata} \ilabel [mkindex:do] {after\nb act} -\ilabel [mkindex:orippx] {orippx} +\ilabel [mkindex:par] {exhyphenpenalty} \inext{makeindex}{^^B\cbrace}{++} @@ -1171,20 +1220,12 @@ M \ilabel [printii:iindent] {iindent} \inext{printii}{\empty}{+-} -Makro \db iiparparams nastavuje parametry sazby odstavce v rejstříku. Vlevo +Makro "\makeindex" nastavuje na řádku \cite[mkindex:par] lokálně +parametry sazby odstavce v rejstříku. Vlevo budeme mít "\leftskip" rovný "\iindent", ale první řádek posuneme o "-\iindent" (viz řádek kódu~\cite[printii:iindent]) takže první řádek je vystrčen doleva. Vpravo máme pružnou mezeru, aby se seznam čísel stran mohl -rozumně lámat, když je moc dlouhý. Makro "\iiparparams" si musí poznačit do -makra \db orippx původní údaje měněných hodnot. Není možné se totiž schovat -do skupiny, protože rejstřík je obvykle tištěn pomocí -"\begmulti...\endmulti" a toto makro občas ukončuje plnění boxu a spouští -"\flushcolumns". Kdybychom měli "\makeindex" ve skupině, pak by při -"\flushcolumns" došlo ke křížení skupin. Na konci práce "\makeindex" na -řádku \cite[mkindex:orippx] je makro "\orippx" zavoláno a tím jsou parametry -odstavce vráceny do původní podoby. - -\inext{iiparparams}{\empty}{+-} +rozumně lámat, když je moc dlouhý. Pomocné makro \db scanprevii "&" se podívá do "\previi", odloupne z něj úsek před prvním lomítkem a tento úsek definuje jako @@ -1205,112 +1246,131 @@ Nejprve se zam "\isAleB"~"\,"~"\,", které rozhodne, zda je "" řazeno před "" nebo ne. Výsledek zkoumání můžeme prověřit pomocí "\ifAleB". -Pro porovnání dvou údajů vyžaduje norma dva průchody. V prvním (primární +Pro porovnání dvou údajů vyžaduje norma dva průchody. V prvním (primárním řazení) se rozlišuje jen mezi písmeny A B C Č D E F G H Ch I J K L M N O P Q R Ř S Š T U V W X Y Z Ž. Pokud jsou hesla z tohoto pohledu stejná, pak se provede druhý průchod (sekundární řazení), ve kterém jsou řazena neakcentovaná písmena před přehlasovaná před čárkovaná před háčkovaná před stříškovaná před kroužkovaná a dále s nejnižší prioritou malá písmena před -velká. Připravíme si tedy dvě sady "\lccode" dvojic: pro první průchod a pro -druhý. Porovnávaná hesla zkonvertujeme pomocí "\lowercase" při nastavení -"\lccode" odpovídajícího průchodu. Pak takto zkonvertovaná hesla teprve -začneme porovnávat. - -Makro \db setprimarysorting připraví "\lccode" znaků české a slovenské -abecedy pro první průchod a \db setsecondarysorting pro druhý průchod. -Makro "\setprimarysorting" expanduje \db sortingdata -a předhodí před takto expandovaná data "\act". +velká. + +Nejprve připravíme data pro porovnávací algoritmus. + +\inext{sortingdata}{\empty}{+-} + +Mezi jednotlivými čárkami v makru \db sortingdata jsou skupiny znaků, které +se z hlediska prvního průchodu řadicím algoritmem nerozlišují. Jednotlivé +znaky v "\sortingdata" se rozliší při případném druhém průchodu. Řazení +znaků v "\sortingdata" odpovídá požadovanému abecednímu řazení. + +Dále je makrem \db setignoredchars vyjmenován seznam znaků, které se při +řazení zcela ignorují (jakoby tam vůbec nebyly). Typicky jde o interpunkci. +Makro nastaví všem těmto znakům pomocí "\setlccodes" kód tečky a tato tečka +se posléze z porovnávaného textu odstraní. Seznam znaků je oddělen tečkou a +ukončen dvojicí "{}{}". Seznam ignorovaných znaků odpovídá pravidlům českého +řazení. Norma doporučuje sice pro případ, kdy se hesla neliší jinak než těmito znaky, +nasadit další průchod řazení, ale pro jednoduchost a velkou výjimečnost +takové situace toto v OPmac implementováno není. + +Makra \db specsortingdatacs a \db specsortingdatask deklarují náhrady před +použitím řadicího algoritmu. Jednotivá náhrada je deklarována jako +":" a je od další deklarace náhrady oddělena mezerou. +Tímto způsobem jsou implementovány spřežky ch, Ch a CH, které se nahrazují +znaky "^^T", "^^U" a "^^V". Ty vystupují v řadicím algoritmu jako jediný +znak, a mají své místo v makru "\sortingdata" Slovenština má sice další +spřežky dz, Dz, DZ, dž, Dž, DŽ, ale ty jsou řazeny těsně za D, takže jsou +řazeny správně i za situace, kdy nejsou nahrazeny jediným znakem. Nicméně, +pokud by někdo chtěl tyto spřežky (například pro ošetřování výjimek) použít +jako samostatné znaky, může si definovat své makro "\sortingdata", které by +obsahovalo + +\begtt + ... + dD\v d\v D,% + ^^N^^O^^P,% dz Dz DZ + ^^Q^^R^^S,% dž Dž DŽ + eE\'e\'E\v e\v E,% + ... +\endtt +a dále definuje +\begtt +\def\specsortingdatask {ch:^^T Ch:^^U CH:^^V + dz:^^N Dz:^^O DZ:^^P d\v z:^^Q D\v z:^^R D\v Z:^^S} +\endtt +% +Makra pro spřežky mají název ve tvaru "\specsortingdata". +Použije se makro odpovídající jazyku podle nastaveného dělení slov. +Není-li makro pro použitý jazyk definováno, žádné náhrady se neprovedou. +Je třeba upozornit (například uživatele maďarštiny), pokud by se v těchto +spřežkách chtěli rozšoupnout, vyhněte se znakům "^^I" a "^^M", kterým +plain\TeX, resp. ini\TeX, nastavuje speciální kategorie. + +Implementaci řadicího algoritmu zahájíme makrem \db setprimarysorting, které +se spustí jednou při sestavení rejstříku, přečte výše uvedená data a +připraví odpovídající datové stuktury pro první průchod řadicího algoritmu. +Hlavní činností tohoto makra je, že připraví "\lccode" znaků vyjmenovaných v +"\sortingdata" podle jejich vzestupného pořadí, přitom znakům v jedné +skupině (oddělené čárkou) přiřadí stejné "\lccode". Text před řazením pak +budeme konvertovat použitím "\lowercase". + +\inext{setprimarysorting}{\empty}{+-} + +Vidíme, že makro "\setprimarysorting" nejprve expanduje "\sortingdata", +aby se realizovaly znaky typu "\v c" podle nastaveného kódování. +Dělá to jen tehdy, když je definováno makro "\r", tj. uvedené sekvence pro +akcenty expandují na správné kódy. Rovněž pomocí +"\let"\db asciisorting \unskip"=t" +je možné zabránit použití "\sortingdata" a řadicí algoritmus řadí podle +ASCII. + +Dále "\setprimarysorting" připraví makro +\db specsortingdata (bez přípony jazyka) z makra +"\specsortingdata". Nejrve je expanduje a pak pomocí triku s +"\meaning" za spoluráce s~makrem \db setprimarysortingA převede všechny znaky +v makru na kategorii 12, protože toto budeme pro řadicí algoritmus potřebovat. + +Konečně se v makru "\setprimarysorting" připraví (za použití opakovaného +volání "\act") "\lccode" všech znaků zmíněných v "\sortingdata". Povšimneme si, že pro první průchod dostanou stejný "\lccode" všechny znaky -na společném řádku makra "\sortingdata", zatímco v druhém průchodu budou mít -všechny znaky z tohoto makra rozdílný "\lccode", ve vzestupném pořadí. +ve skupině mezi čárkami. Je to tím, že v makru "\setprimarysorting" se zvedá "\tmpnum" jen v místě -čárky, zatímco v "\setsecondarysorting" se "\tmpnum" zvedá pro každý znak. -Nejnižší hodnotu má mezera vyznačená v "\sortingdata" pomocí "{ }". +čárky. Nejnižší hodnotu má mezera vyznačená v "\sortingdata" pomocí "{ }". Tím je zaručeno, že kratší slovo je řazeno dřív než delší slovo se stejným začátkem, obsahující celé kratší slovo (ten~tučňák$\prec$tento). Je sice pravda, že ASCII hodnota mezery je ještě menší, ale my musíme mezeru někam šoupnout na jiný kód než 32, jinak by nám ji nepřečetlo makro s~neseparovaným parametrem. Ovšem my budeme chtít mezeru přečíst. - -\ilabel [sorten] {sort:en} -\ilabel [lan] {lan:} -\ilabel [chsorting] {chsorting} - -\inext{sortingdata}{\count=3 ^^B\cbrace}{++} - -Jedním z problémů českého řazení je dvojhláska ch. Tu potřebujeme -proměnit v jediný znak. Pro potřeby řazení proměníme ch v "^^T", Ch v "^^U" -a CH v "^^V". Uděláme to následujícím okultním kódem, který definuje makro -\db preparesorting "\,". Toto makro připraví pomocí do "\tmpb" -"" zkonvertované krz "\lowercase", -ovšem nejprve je dvojhláska ch nahrazena jedním znakem. -Makro \db chsorting je implicitně nedefinované, což znamená, že pracujeme s -dvojhláskou ch. Na řádku \cite[sorten], \cite[lan] a \cite[chsorting] je ovšem nastaveno -"\chsorting" jako "n", což je vzkaz, že dvojhlásku ch nechceme -interpretovat. - -\inext{bgroup}{\empty}{+-} - -Tento kód je bohužel obtížněji čitelný, protože makra "\iiscanch" a další -potřebují mít separátor "ch" ve stavu, kdy jednotlivá písmena mají "\catcode" 12. -Pracujeme totiž s výstupem primitivu "\string", který bohužel vše (až na -mezeru) balí do tokenů s kategorií 12. Proto je celý kód obalen do -"\bgroup", "\egroup" a "\lowercase". Tam jsou znaky 4, 5, 6, 7, -které mají kategorii 12, šoupnuty na c, h, C, H. Po tomto dešifrování tedy -vidíme, že makro \db iiscanch je definováno takto: - -\begtt -\gdef\iiscanch #1ch#2\relax{#1\if$#2$\else^^T\iiscanch #2\relax\fi} -\iiscanch Schází hrách, který bych házel na stěnu.ch\relax -\endtt - -Uvedený příklad expanduje postupně na - -\begtt -#1<-S -#2<-ází hrách, který bych házel na stěnu.ch -=> s^^T\iiscanch #2\relax - -#1<-ází hrá -#2<-, který bych házel na stěnu.ch -=> s^^Tází hrá^^T\iiscanch #2\relax - -#1<-, který by -#2<- házel na stěnu.ch -=> s^^Tází hrá^^T, který by^^T\iiscan #2\relax - -#1<- házel na stěnu. -#2<- -=> s^^Tází hrá^^T, který by^^T házel na stěnu. -\endtt -a to nahradí všechny výskyty dvojhlásky ch znakem "^^T". Analogicky pracují -makra \db iiscanCh a \db iiscanCH. Makro \db preparesortingA nakonec zavolá -všechna tři makra, takže máme nahrazeny všechny dvojhlásky ch, Ch i CH. - -V rámci optimalizace rychlosti jsou před algoritmem na setřídění seznamu -všechna hesla jednorázově zkonvertovaná podle pravidel prvního průchodu -řazení a tato data jsou uložena v prvním datovém údaji hesla (ve druhém máme -seznam stránek). Není tedy nutné dělat konverzi při každém porovnávání dvou -hesel. Ovšem, pokud porovnání hesel vyjde bez rozdílu, je potřeba provést -druhý průchod řazení (sekundární řazení). Ten nastavujeme jednotlivě jen pro -takové dvojice hesel, kde to je potřeba. Pravděpodobnost, že to je vůbec -někdy potřeba, je mizivá. Data pro primární řazení jsou tedy už připravena na -řádcích \cite[mkindex:od] až \cite[mkindex:do] v makru "\makeindex". - -V českém řazení se nemá přihlížet na interpunkční znaky (tečka, středník, -otazník, atd.). Hesla máme řadit tak, jako kdyby tam tyto znaky nebyly. -Kdyby se dvě hesla podle tohoto pravidla nelišila, norma předepisuje nasadit -cca čtvrtý průchod, ve kterém se tyto znaky rozliší. Čtvrtý průchod -implementován není: hesla lišící se jen interpunkčními znaky, jsou v OPmac -při řazení nerozlišitelná, tj. jsou řazena v pořadí, v jakém vstupují do -rejstříku. Ignorování interpunkčních znaků je provedeno tak, že všem -těmto znakům je přidělen makrem \db setignoredchars "\lccode" tečky a -tečka je při zpracování v~"\setprimarysorting" a "\setsecondarysorting" odstraněna -makrem \db removedot. - -\inext{removedot}{\empty}{+-} - -Připravíme si "\newif", kterým ohlásíme výsledek porovnání dvou hesel: +Makrem "\setignoredchars" se zcela nakonec nastaví ignorovaným znakům +"\lccode" tečky. + +Makro \db setsecondarysorting se volá opakovaně a příležitostně pro případy, +kdy jsou hesla z~hlediska primárního řazení totožná. Nastaví jinak "\lccode" +znaků. Tentokrát mají všechny znaky ze "\sortingdata" rozdílný "\lccode", ve +vzestupném pořadí. + +\inext{setsecondarysorting}{\empty}{+-} + +Makro \db preparesorting se volá (s nastavenými parametry podle +"\setprimarysorting") pro každé heslo jednou. Heslo je uloženo v názvu +kontrolní sekvence, která je parametrem makra "\preparesorting". Data pro +primární řazení jsou už připravena na řádcích \cite[mkindex:od] až +\cite[mkindex:do] v makru "\makeindex". V případech, kdy jsou dvě hesla +shodná z hlediska primárního řazení (to nastane asi velmi výjimečně), je pro +danou dvojici hesel znovu zavoláno makro "\preparesorting", tentokrát s +přednastavenými daty podle "\setsecondarysorting". Makro "\preparesorting" +má za úkol uložit výsledek své konverze do "\tmpb". + +\inext{preparesorting}{\empty}{+-} + +Všimneme si, že "\preparesorting" vykonává jádro své činnosti v \db +preparesortingA, které přebere text hesla extrahovaný do parametru "#3". +Toto makro pomocí \db preparesortingB opakovaně volá "\replacestrings", aby +nahradilo spřežky odpovídajícími náhradami. Dále pomocí "\lowercase" provede +konverzi a konečně pomocí "\replacestrings{.}{}" odstraní z hesla nejen +tečky, ale i znaky vyjmenované v makru "\setignoredchars". + +Připravíme si pomocí "\newif" makro \db ifAleB, kterým ohlásíme výsledek +porovnání dvou hesel: \inext{newif}{\empty}{+-} @@ -1407,18 +1467,15 @@ m \item * Důslednější balancování sloupců vylučující možnost ztráty sazby a umožňující mít sazbu s nezlomitelnými mezerami mezi řádky. \item * Makro měří kumulovanou sazbu a umožňuje při rozsáhlém množství - tiskového materiálu přechodně přejít do režimu \uv{vyprazdňování}. + tiskového materiálu obejít problém \uv{dimension too large}. \enditems Makra \db begmulti, \db endmulti, \db corrsize, \db makecolumns a \db splitpart pracují zhruba tak, jak je popsáno v TBN. -\ilabel [mul:endgraf] {endgraf} -\ilabel [mul:balance] {last balancing} -\ilabel [mul:relax] {relax\cbrace} -\ilabel [mul:prevgraf] {prevdepth} +\ilabel[mul:prevgraf] {prevgraf} -\inext{corrsize}{\count=2 \empty}{+-} +\inext{mullines}{\count=5 ^^B\cbrace}{++} Výstup rozlomené sazby do sloupců probíhá ve dvou režimech: když je třeba sloupci zaplnit celou stránku, použijeme "\makecolumns". Toto makro neřeší @@ -1434,226 +1491,112 @@ pr \inext{balancecolumns}{^^B\cbrace}{++} -Když je sazba plněna do boxu~6, může ji být tak moc, že tento box -překročí maximální výšku boxu, která je v \TeX{}u bohužel -omezena na cca pět metrů -(16383~pt). Proto na řádku~\cite[mul:endgraf] je předefinován "\par", který -přičítá do "\dimen0" celkovou výšku postupně kumulované sazby. Jakmile tato -výška dosáhne "0.9\maxdimen", předefinujeme makro -"\balancecolumns" na "\flushcolumns" a spustíme předčasně "\endmulti". Toto makro -vyprázdní box pomocí opakovaného "\splitpart", ovšem nevyprázdní ho celý. -Jen tu část, která zaplní celé stránky. Jakmile bude chtít -"\splitpart" přejít k~vybalancování sazby pomocí -"\balancecolumns" na řádku \cite[mul:balance], spustí se místo běžného -"\balancecolumns" makro \db flushcolumns. Toto makro ignoruje zbytek činnosti -"\endmulti" až po "\relax" na řádku \cite[mul:relax], takže vyskočí z -trojitě zanořeného "\if". Musí tedy vrátit příslušné množství "\fi" a dále -vystartuje nový "\setbox6=\vbox". Uvnitř tohoto boxu nejprve vysype zbytek -boxu~6, pomocí "\unskip\unskip" odstraní "\vfil" a "\vskip-\prevdepth", -který tam vložil "\endmulti" na řádku~\cite[mul:prevgraf], -vrátí se k zálohovanému významu makra \db ibalancecolumns -a znovu definuje "\par" obdobným způsobem jako v~"\begmulti". -Pak pokračuje ve čtení sazby. - -\inext{flushcolumns}{\empty}{+-} +Když je sazba plněna do boxu~6, může ji být tak moc, že se nedá změřit jeho +výška pomocí "\dimen0=\ht6". Box samotný sice může být vyšší než pět metrů, +ale "\dimen0" nikoli: objeví se chyba \uv{dimension too large}. +Z toho důvodu je v makrech zavedena proměnná \db mullines, která pomocí +předefinovaného "\par" (na řádku \cite[mul:prevgraf]) +počítá počet řádků sazby. Je-li "\mullines" větší než +"\tmpnum" (což při daném "\baselineskip" odpovídá 0,8"\maxdimen"), makro +pracuje, jakoby výška boxu 6 byla 0,8"\maxdimen", tedy rozběhne se +"\splitpart" a "\makecolumns". Přitom makro "\makecolumns" snižuje hodnotu +"\mullines" o~počet vytištěných řádků, takže příště už může být "\mullines" +menší než "\tmpnum". K tomu určitě na několika posledních stránkách dojde, +takže nakonec "\balancecolumns" pracuje s přesnou výškou boxu~6. \subsec [barvy] Barvy %%%%%%%%%%%%%%%%%%%%% -Od verze pdf\TeX{}u 1.40 nabízí tento program primitivy -"\pdfcolorstackinit" a "\pdfcolorstack". Makra v OPmac tyto -primitivy nepoužívají, protože: - -\begitems -\item * Řešení v OPmac jsem vytvořil a použil podstatně dřív, než si programátoři - pdf\TeX{}u vůbec všimli, že existuje problém s přecházením barev na nové - stránky. -\item * Primitivy "\pdfcolorstackinit" a "\pdfcolorstack" stále nejsou dokumentované. -\enditems - -\noactive {\nb writecolorfalse} \noactive {\nb writecolortrue} - -Deklarujeme \db ifwritecolor, což nastaveno na true způsobí, že makro -"\writecolor" bude zapisovat do REF souboru informaci o zrovna nastavené barvě. -Tuto informaci pak zužitkujeme ve výstupní rutině při nastavování barev, -které přetékají ze strany na stranu. -Dále deklarujeme \db lastpage. Tento registr budeme -potřebovat pro identifikaci jednotlivých stran při čtení REF souboru. - -\inext{ifwritecolor}{\empty}{+-} - -Barvy se v PDF přepínají pomocí PDF speciálů " k" -(pro text a plochy) a " K" pro linky. Pro oba typy -barev připravíme barevná makra \db Blue, \db Red, \db Brown, \db Green, \db +Až po verzi OPmac Nov. 2014 byly barvy implementovány pomocí "\pdfliteral" +za použití maker, která sama implementují "\colorstack" pomocí REF +souboru. V prosinci 2014 jsem se rozhodl tento kód z OPmac odstranit a +využít přímo primitivní "\pdfcolorstack" (v pdf\TeX{}u od verze 1.40). +OPmac se tak zbavil asi 30~řádků +poměrně komplikovaného kódu a ušetřil množství zápisů do REF souboru. Tyto +změny jsou v souladu s~myšlenkou \uv{v jednoduchosti je síla}. Uvedené rozhodnutí není +zcela zpětně kompatibilní, protože opouští možnost samostatného nastavení +barvy pro tenké linky a pro text. Domnívám se, že to nevadí, protože pokud +uživatel potřebuje elementární manipulaci s barvami, použije sám přímo +"\pdfliteral". Makra "\setcmykcolor" se nyní opírají o "\pdfcolorstack" a +nastavují oba typy barev společně. Bylo sice možné inicializovat dva +zásobníky barev (pro linky a pro text), ale to by fungovalo jen +v~pdf\TeX{}u. Nikoli v~Xe\TeX{}u. Cílem ovšem je, aby se barvy v pdf\TeX{}u a Xe\TeX{}u +chovaly pokud možno stejně. Navíc, když uživatel napíše barevně odmocninu, +musí mít oba typy barev zapnuty současně na stejnou hodnotu, jinak má véčko +odmocniny v jiné barvě než vodorovnou čáru. Je tedy i pro uživatele +jednodušší tyto dva typy barev nerozlišovat. + +Makro \db localcolor (na rozdíl od předchozí verze) pouze +nastavuje "\localcolortrue". Podle \db localcolortrue +resp. \db localcolorfalse se bude větvit činnost přepínačů barev, které +ukládají aktuální barvu do zásobníku. To je tedy druhá mírná odlišnost od starší verze +OPmac Nov. 2014, kdy makro "\localcolor" přímo ukládalo aktuální barvu do zásobníku +barev, zatímco přepínače barev toto neřešily. Původní typické použití makra +"\localcolor" není ve sporu s jeho novým významem. + +\inext{iflocalcolor}{\empty}{+-} + +Makro "\longlocalcolor" dříve umožňovalo přechod barvy na další stránku, +nyní je tato vlastnost přímo řešena díky "\pdfcolorstack", takže netřeba +rozlišovat mezi "\localcolor" a \db longlocalcolor. +Makro \db linecolor nyní nedělá nic, protože nerozlišujeme mezi barvou linek +a barvou textu. V původní verzi bylo prefixem pro barvy linek. + +\inext{backward}{\empty}{+-} + +Připravíme barevná makra \db Blue, \db Red, \db Brown, \db Green, \db Yellow, \db Cyan, \db Magenta, \db White, \db Grey, \db LightGrey, \db Black. Uživatel si může definovat další. \inext{Blue}{\empty}{+-} -Makro \db setcmykcolor nastaví barvu textu (při "\pdfK" obsahující \uv{k}) -nebo barvu linek (při "\pdfK" obsahující -\uv{K}). Dále si toto makro globálně uloží nastavenou barvu do -\db currcolork, resp. \db currcolorK. Také podle předchozí "\currcolork", -resp. "\currcolorK" testuje, zda je potřeba aktuální barvu -změnit. Pokud ne, tak "\pdfliteral" pro nastavení barvy nevloží. +Makro \db setcmykcolor "{}" nastaví požadovanou barvu. +Nejprve přepne makro "\ensureblacko" do aktivního stavu. V tomto stavu makro +setrvá právě tehdy, když je v dokumentu použit aspoň jednou přepínač barvy. +Dále makro "\setcmykcolor" nastaví při +"\localcolorfalse" barvu přímo a při "\localocolortrue" barvu vloží do +zásobníku a pomocí "\aftergroup" zajistí návrat k původní hodnotě. +Navíc nastaví na odpovídající hodnotu makro \db currentcolor. \inext{setcmykcolor}{^^B\cbrace}{++} -Problém barev v PDF je, že od výskytu speciálu pro barvu jsou změněné barvy -až po jiný výskyt takového speciálu nebo po konec strany. Na každé nové -straně začíná sazba v barvě černé. Nám ovšem někdy může obarvený text přetéci -na další stranu. Pak ale musíme v "\output" rutině -nastavit barvu, která přetekla. Ovšem jak poznáme, že něco přeteklo do další -strany? Jedině pomocí asynchronního "\write". Proto makro -"\setcmykcolor" nevkládá do PDF jen požadovaný speciál, ale taky ukládá -pomocí \db writecolor "" informaci do REF souboru ve formátu -"\Xpdfcolork{}" nebo "\XpdfcolorK{}". +Makro "\currentcolor" je nastaveno na výchozí hodnotu \db pdfblackcolor -\inext{writecolor}{^^B\cbrace}{++} +\inext{pdfblackcolor}{currentcolor}{++} -Makro \db pdfK má implicitně hodnotu "k" (barva pro texty a plochy) a -přechodně při použití \db linecolor "" má hodnotu "K". +Makro \db ensureblacko "{}" je použito pro sazbu záhlaví a zápatí ve +výstupní rutině v~makru "\opmacoutput". Implicitně se "\ensureblacko{}" chová +stejně jako samotná "", ale po použití přepínače barvy +"\setcmykcolor" začne fungovat jako \db ensureblackoA, což zajistí bravu +"" v~černém. Je to provedeno tak, že je na začátku "" +alokována nová úroveň zásobníku barev s výchozí černou barvou a na konci +"" je tato úroveň zásobníku ukončena. -\inext{pdfK}{\empty}{+-} +\inext{ensureblacko}{\empty}{+-} -Výchozí hodnoty maker "\currcolork" a "\currcolorK" jsou rovny barvě černé, -neboli makru \db pdfblackcolor. +Makra \db colorstackpush "{}" a \db colorstackpop implementují +práci se zásobníkem barev za použití odpovídajících \TeX{}ových primitivů. +Není-li přítomen pdf\TeX{} ve verzi aspoň 1.40, je barva nastavena pomocí +"\pdfliteral" (což v komplikovanějších případech při přechodu na další +stránky nefunguje správně), jinak je použit "\pdfcolorstack", který je +inicializován pomocí "\pdfcolorstackinit". Povšimněte si, že se současně +pracuje s barvou textu " k" i s barvou tenkých linek +" K". +Konečně makro \db colorstackset "{}" nastavuje barvu přímo s +umístěním této bravy na vrchol zásobníku místo bravy předchozí. -\inext{pdfblackcolor}{\empty}{+-} - -Následuje výklad makra \db localcolor. Uvědomíme si, co od něj -vlastně očekáváme. Ukázka první: - -\begtt -\Blue základní text je modrý. -{\localcolor \Green Zelený, {\localcolor \Red červený,} tady zpátky zelený, - \Grey Gandalf šedý} a tady zpátky základní modrý text. -\endtt - -Ukázka druhá: - -\begtt -\Blue základní text je modrý. -{\localcolor \Green \linecolor\Red Tady je zelený text a červené linky.} -Zde je zpátky text modrý a linky černé. -\endtt - -Z ukázky první plyne, že "\localcolor" si musí uložit informaci o právě -nastavené barvě do zásobníku, ze kterého ji na konci skupiny vyzvedneme -makrem "\restorecolor". Toto makro pošleme na konec skupiny příkazem -"\aftergroup". Z ukázky druhé plyne, že do zásobníku musíme uložit nejen -informaci o barvě textu (k) ale též informaci o barvě linek (K) a makro -"\restorecolor" musí zrestaurovat oba typy barev. - -Pro zásobník je rezervováno makro \db savedcolors, do kterého jsou údaje -vkládány vlevo a zleva jsou též vyzvedávány. Jeden údaj je -ve tvaru "{}{}". Výchozí hodnota zásobníku je -prázdná. - -\inext{savedcolors}{\empty}{+-} +\inext{pdfcolorstack}{\empty}{+-} -Často se stává, že barvy uvnitř skupin jsou současně barvami v boxech a pak -máme jistotu, že barva nepřeteče to další strany. Je tedy zbytečné ukládat -informaci o přechodu barev do REF souboru. Takže makro "\localcolor" -nastavuje lokálně uvnitř dané skupiny "\writecolorfalse". Pokud uživatel -pracuje se skupinou, která má tendenci utéci na další stranu, použije místo -"\localcolor" makro \db longlocalcolor. Makra "\localcolor" a -"\longlocalcolor" tedy vypadají takto: - -\inext{localcolor}{\empty}{+-} - -Vidíme, že "=1" v zásobníku "\savedcolors" znamená, že je třeba změnu -barvy provedenou na konci skupiny zapsat do REF souboru. - -Makro \db restorecolor usazené za koncem skupiny pomocí "\aftergroup" si -vyzvedne potřebné tři údaje ze zásobníku. K tomu definuje makro "\tmp", -které to provede. Dále do "\tmpa" vloží "" a do "\tmpb" vloží -"" a testem proti "\currcolork", resp. "\currcolorK" zjistí, zda je -vůbec potřeba barvu měnit. Pokud ne, nedělá nic. Jinak zapíše potřebný -"\pdfliteral" a přenastaví makro "\currcolork", resp. "\currcolorK". -Konečně, při "=1", zapíše nově nastavenou barvu do REF souboru. -Celou práci vykoná uvnitř skupiny, takže lokální změny se vracejí po -ukončení práce makra k původním hodnotám. - -\inext{restorecolor}{\empty}{+-} +Makra "\colorstackpush", "\colorstackpop" a "\colorstackset" jsou +odpovídajícím způsobem předefinována v souboru "opmac-xetex.tex", aby bylo +možné pracovat s barvami i v Xe\TeX{}u. Přepínače barev stejně jako makra "\localcolor" nebo "\longlocalcolor" se mohou vyskytnout v~nadpise. Takže je potřeba je zabezpečit proti rozsypání. \inext{addprotect}{\empty}{+-} -Aby mohla output rutina správně obsloužit barvy, je třeba učinit několik -opatření, která jsou zhruba načrtnuta v následujícím schémátku. - -\begtt -\output = { -\begoutput % Záloha aktuálních barev, nastavení \currcolorkK=černá -... -\makeheadline % Uživatel může měnit barvy, ale musí se vrátit k černé. -\pagecontents = { - ...\topins % Výchozí barva je černá, k černé je třeba se vrátit. - \preboxcclv % Nastavení barvy, která přetekla na tuto stranu. - \unvbox256 % Sazba pro tuto stranu. - \postboxcclv % Návrat k barvě černé. - ...\footins % Poznámky pod čarou. -} -\makefootline % Výchozí barva je černá, uživatel může nastavit cokoli. -... -\endoutput % návrat \currcolorkK k původním zálohovaným barvám -} -\endtt - -Při nastavování barev v "\headline" a "\footline" je možné použít -"\localcolor", protože zásobník se tím při práci output rutiny posune a také -znovu splaskne na původní hodnotu a neovlivní tedy stav v běžné sazbě (mimo -output rutinu). Ovšem běžná sazba má nastaveny nějak hodnoty "\currcolork" a -"\currcolorK" a není žádoucí, aby byly tyto hodnoty output rutinou měněny. -Proto jsou v makru \db begoutput tyto hodnoty zálohovány a v makru -\db endoutput se k nim output rutina vrátí. Uvnitř output rutiny potlačíme -všem přepínačům barev jejich tendenci ukládat něco do REF souboru, takže je -v makru "\begoutput" použito "\writecolorfalse". - -\inext{begoutput}{\empty}{+-} - -Poněkud složitější je makro "\preboxcclv", které má nastavit barvu, která -přetekla z předchozí strany. Abychom se k funkci tohoto makra dobrali, -vraťme se k makrům -\db Xpdfcolork "{}" a \db XpdfcolorK "{}", -která jsou uložena v REF souboru pro každé (potenciálně dlouhé) přepnutí barvy. -Povšimněte si, že output rutina ukládá do REF souboru pro každou stranu -makrem "\begoutput" údaj "\Xpage{<číslo strany>}". Tyto údaje -tvoří oddělovače mezi jednotlivými stránkami. - -Příkazy "\Xpdfcolork" a "\XpdfcolorK" ukládají při čtení REF souboru do -\db pdflastcolork, resp. \db pdflastcolorK, naposledy použitou barvu. Takže na -příští straně, až narazíme při čtení REF souboru na další "\Xpage", budeme -vědět, zda je tato naposledy použitá barva černá nebo jiná. Pokud jiná, je -potřeba ji nastavit jako výchozí i pro tuto (tedy příští) stranu. -Makro \db Xpage v takovém případě uloží do makra -"\pgc:<číslo strany>" povel "\setpgcolor {}". -Opakuje-li se stejná strana (např. postupné odkrývání výkřiků ve -slideshow), další "\Xpage" se stejnou stranou nedělají nic. - -\inext{Xpdfcolork}{\count=2 \empty}{+-} - -Makro \db preboxcclv jednoduše spustí "\pgc:<číslo strany>". Není-li -"\pgc:<číslo strany>" definováno, je to známka, že barva na začátku je -černá a díky dvojici "\csname", "\endcsname" se provede "\relax", tedy nic. -Jinak se nastaví správná barva pomocí \db setpgcolor. - -\inext{preboxcclv}{}{++} - -Makro \db postboxcclv nastaví zpět černou barvu. Dělá to inteligentně. -Nejprve nastaví správné hodnoty makrům "\currcolork" a "\currcolorK" po vložení -boxu~255. K tomu účelu předefinuje "\setpgcolor" tak, aby pouze ukládal tyto -hodnoty a spustí "\pgc:<číslo strany+1>". -Poté příkazy "\Black" a "\linecolor\Black" budou vědět, -jaká je aktuální barva. A je-li černá, neudělají nic, jinak vloží příslušný -"\special". - -\inext{postboxcclv}{\empty}{+-} - Není-li použit pdf\TeX{}, některá makra pro barvu deaktivujeme: \inext{ifpdftex}{\empty}{+-} @@ -1662,7 +1605,7 @@ Makro \db draft vlo který vystrčí svou šedou sazbu ven ze svého rozměru a je tištěn dřív, než jakýkoli jiný materiál na stránce. -\inext{draft}{\empty}{+-} +\inext{draft}{}{++} V makru \db draftbox "{}" je "" otočen o 55 stupňů, zvětšen desetkrát a vytištěn v barvě "\LightGrey". K tomu jsou @@ -1670,7 +1613,7 @@ vyu \inext{draftbox}{\empty}{+-} -Když není použit pdf\TeX{}, není makro deaktivujeme. +Když není použit pdf\TeX{}, barvy nefungují, takže makro "\draft" deaktivujeme. \inext{ifpdftex}{\empty}{+-} @@ -1706,9 +1649,10 @@ modifikovalo. Sta \begtt \def\destbox[#1#2:#3]{\vbox to0pt{\kern-\destheight \pdfdest name{#1#2:#3} xyz\relax - \if#1r\llap{\localcolor\Green\ttt[#3]}\vss - \else \if#1c\vss\llap{\localcolor\Green\ttt[\tmpb] }\kern-\prevdepth + \if#1r\llap{\labelfont[\detokenize\expandafter{#3}]}\vss \else + \if#1c\vss\llap{\labelfont[\detokenize\expandafter{\tmpb}] }\kern-\prevdepth \else \vss \fi\fi}} +\def\labelfont{\localcolor\Red\tt\thefontsize[10]} \endtt Při tomto řešení budou lejblíky z "\label" tištěny nahoru v místě cíle @@ -1749,8 +1693,9 @@ uveden Pdf\TeX{}ové primitivy pro klikací odkazy dovolují dopravit do PDF další atributy odkazu za slovem "attr". Tam je možné dát najevo, že chceme vidět aktivní plochy ve formě rámečků. To zařídí makro \db pdfborder "{}", které -expanduje na nic, pokud není kontrolní sekvence "\border" definována. -Jinak expandují na "arrt" "/C" s obsahem podle "\border". +expanduje na "attr" "/Border[0 0 0]", pokud není kontrolní sekvence +"\border" definována. Jinak expanduje na "arrt" "/Border[0 0 .6]" a +"/C" s obsahem podle "\border". \inext{pdfborder}{\empty}{+-} @@ -1784,26 +1729,6 @@ m nebo si změní kategorie sám. Podobná poznámka platí pro znaky "{", "}", "\", "#" a "$". -Makro \db replacestrings "{}{}" vymění v makru "\tmpb" -veškeré výskyty "" za "". Pro tento účel definuje pracovní -makro "\tmp", které pracuje podobně, jako makro "\iiscanch" (doporučujeme se -podívat na výklad makra "\iiscanch"). Makro "\tmp" ale není na rozdíl od -"\iiscanch" expandující. Místo toho postupně kumuluje -výsledek do nového "\tmpb" pomocí "\addto". Před spuštěním "\tmp" -expandujeme "\tmpb" pomocí pěti "\expandafter" a poté ho pronulujeme, -takže to pracuje jako -"\def\tmbb{}\tmp\/\relax". - -V makru pracujeme s tokeny "!" a "?" kategorie 3, které slouží jako -separátory. Předpokládáme, že takové tokeny se ve zpracovávaném textu nikdy neobjeví. - -\inext{bgroup}{\empty}{+-} - -Na konci "" je vložen "?", který jej odděluje od přidaného -"". Kdybychom jej tam nedali, pak při "=//" a při lomítku -na konci "" bychom měli "...///" a to způsobí potíže. -V závěru makra "\replacestring" je přidaný otazník zase odstraněn. - \subsec Outlines -- obsah v záložce PDF dokumentu %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -2071,8 +1996,9 @@ do v \begtt \newdimen\Pwidth \def\tabdeclareP {\enskip\vtop{\hsize=\Pwidth \rightskip=0pt plus1fil - \baselineskip=1.2em\lineskiplimit=0pt \noindent##\tabstrutA}\hss\enskip} - + \baselineskip=1.2em\lineskiplimit=0pt + \noindent##\unskip\tabstrutA}\hss\enskip +} \Pwidth=3cm \table{|c|P|}{\crl \tskip3pt aaa & Tady je delší textík, který se nevejde na řádek. \crl \tskip3pt bb & A tady je taky je něco delšího. \crl} @@ -2114,18 +2040,12 @@ TBN na str.~328. \inext{orihrule}{\empty}{+-} -Makro \db frame "{}" vloží vnější "\vbox{\hrule..\hrule}". -V něm se nachází další box "\hbox{\vrule\kern\vvkern..\kern\vvkern\vrule}" -a v něm "\vbox{\kern\hhkern..\kern\hhkern}". -Nejvíce uvnitř je pak "\hbox{}". To by pro sazbu rámovaného textu -stačilo, nicméně my ještě řešíme úpravu výsledného boxu tak, aby měl účaří -ve stejném místě jako je účaří textu. Proto uložíme "\hbox{}" do boxu0 -a změříme mu hloubku. V proměnné "\tmpdim" spočítáme celkovou hloubku -výsledného boxu. Ve výpočtu přičítáme výšku "\hrule", která nemusí být -0.4pt. Proto si její výšku změříme v boxu1. Ve vnějším "\vbox"u po -nakreslení spodní "\hrule" se pak vracíme pomocí "\kern-\tmpdim" na úroveň -účaří a zde umístíme strut hloubky "\tmpdim", aby sazba směrem dolů -nepřečnívala, ale byla obsažena v~hloubce výsledného boxu. +Makro \db frame "{}" vloží vnější "\hbox{\vrule\vrule}". +Uvnitř tohoto boxu se nachází "\vtop{\kern\vvkern\hrule}", takže "" +zůstává na účaří. Přitom "" je "\vbox{\hrule\kern\vvkern}", +takže "" zůstává na účaří. V tuto chvíli jsou již vytvořeny čáry +vlevo, vravo, nahoře i dole. Konečně "" je +"\hbox{\kern\hhkern\kern\hhkern}". \inext{frame}{\empty}{+-} @@ -2274,39 +2194,6 @@ P \inext{mnoteA}{^^B\cbrace}{++} -Text uvnitř "\mnote" přebírá barvu kvůli "\vadjust" \uv{se zpožděním}, podle -barvy, která je na konci řádku, vedle kterého je "\mnote" umístěna. Makra -tedy při zpracování parametru "\mnote" nemohou dopředu vědět, jaká to bude -barva, a nelze tedy použít zásobník barev řízený makry. Uživateli přitom -musíme dát možnost barvu "\mnote" nastavit, například: - -\begtt -\def\mnotehook{\noindent\Black} -\endtt -zajistí, že budou všechny poznámky na okraji černé bez ohledu na to, jakou -barvu mají řádky, vedle kterých ty poznámky stojí. K tomu účelu je nastavení -případných barev uživatelem jednak v makru "\mnoteA" obklopeno do dvojice -"\pdfsave"--"\pdfrestore" a dále je nastartován pomocí \db mnoteC lokální -zásobník barev, který je pomocí \db mnoteD vrácen do stavu, v jakém byl před -zahájemním zpracování "\mnote". Uživatel může v prametru "\mnote" používat -"{\localcolor\Green X{\localcolor\Blue Y}Z}" s~očekávaným výsledkem. -Barvy neoznačené "\localcolor" končí svou platnost na konci poznámky -"\mnote". - -\inext{mnoteC}{^^B\cbrace}{++} - -Základová barva lokálního zásobníku barev je převzata jako -aktuální barva v době zpracování "\mnote", ale je pozměněna prefixem "\long", -aby explicitní nastavení barvy vždy založilo barvu. Obecně -totiž "\setcmykcolor" zakládá barvu jen tehdy, když je rozdílná od -aktuální. Zde je rozdílnost zajištěna prefixem "\long". -Tento trik zabere, pokud se uvnitř "\mnote" pomocí "A{\localcolor\Red BC}DE" -má přejít k původní barvě pro písmena "DE". Ovšem ne vždy bude barva "A" -shodná s barvou "DE", protože barva "A" odpovídá barvě na koci aktuálního -řádku odstavce, zatímco "DE" odpovídá barvě v době činnosti makra "\mnote". -Pokud toto bude uživateli vadit, musí si pomocí "\mnotehook" nastavit -explicitní barvu poznámky. - Makro \db Xmnote pracuje během čtení REF souboru a využívá toho, že makro "\Xpage" nastavuje číslo právě procesované strany do registru "\lastpge". Takže stačí použít "\sxdef" následujícím způsobem: @@ -2495,8 +2382,12 @@ makra "\citelink". \inext{ecite}{\empty}{+-} Následuje kód makra \db bib "[]". Nejprve je ošetřeno, zda je použit -zkrácený nebo rozšířený zápis "\bib[] = {}". V prvním -případě se zavolá "\bibB" s prázdným "\bibmark", v druhém případě se +zkrácený nebo rozšířený zápis "\bib[] = {}". Případná +mezera před rovnítkem je odstaněna pomocí triku s~"\rommannumeral", který +při záporném čísle expanduje na prázdný výsledek, ale případná mezera za "`\." při +skenování tohoto čísla je pozřena. +Při zkráceném zápisu makra "\bib" (bez rovnítka) +se zavolá "\bibB" s prázdným "\bibmark", v druhém případě se "\bibmark" nejprve naplní prostřednictvím makra \db bibA. Makro \db bibB vloží prostřednictvím \db wbib "{}{<číslo citace>}{}" do REF souboru propojené údaje o @@ -2624,50 +2515,56 @@ makra "\bbl:b" a "\bbl:c" si dva seznamy "\citelist" a "\citelistB" p \subsec Úprava output rutiny %%%%%%%%%%%%%%%%%%%%%%%%%%%% -Místo původního makra "\plainoutput" používá OPmac makro \db opmacoutput, -která je obklopeno makry "\begoutput" a "\endoutput" kvůli barvám, jak bylo -vysvětleno v sekci~\ilink[barvy]{\numref[barvy]}. - -\inext{opmacoutput}{}{++} - OPmac mění output rutinu proti originální "\plainoutput" jen v nejnutnějších věcech. -Řeší tyto tři problémy: +Řeší následující problémy: \begitems \item * Místo přímého "\shipout" nechá nejprve box sestavit jako "\box0", pak provede "\protectlist" a pak provede "\shipout\box0". Tím jsou zabezpečeny tzv. protektované příkazy při "\write". +\item * Pomocí "\ensureblacko" jsou řešeny barvy záhlaví, zápatí, "\topins" + a "\footins". \item * Je vložen "\pghook" po sestavení boxů, ale před "\shipout". Implicitně je "\pghook" prázdný. Mění jej makro "\margins" pro účely pravolevého střídání okrajů. -\item * Do "\pagecontents" vkládá "\prepage" (kvůli odkazům na stránku) - a "\preboxcclv", "\postboxcclv" (kvůli barvám). +\item * Makro "\pagecontents" obsahuje navíc "\prepage" (kvůli odkazům na stránku). \enditems -První úprava zabrání expanzi maker zabezpečených pomocí "\addprotect" v době -práce příkazu "\shipout", tedy v době, kdy expandují parametry "\write". -Těmto makrům je přidělen prostřednictvím \db doprotect "" -pro tento okamžik význam "\relax". Je potřeba ještě -vysvětlit, proč bylo nutné sestavit nejprve "\box0" a teprve poté jej poslat -ven pomocí "\shipout". Je to z toho důvodu, že v době sestavování "\box0" -jsou expandována "\headline" a "\footline" a pro ten případ ještě chceme, -aby všechna makra správně expandovala. +Místo původního makra "\plainoutput" používá OPmac makro "\opmacoutput", +která je obklopeno makry "\begoutput" a "\endoutput". Makro \db begoutput +zapíše do REF souboru údaj o čísle strany a předefinuje makra, která se +mohou vyskytnout v záhlaví či zápatí stránky, pokud od nich chceme, aby +se chovaly jinak než obvykle. Makro \db endoutput je prázdné a je určeno +pro strýčka Příhodu. + +\inext{opmacoutput}{\empty}{+-} + +Makro \db opmacoutput se chová analogicky, jako "\plainoutput". Rozdíl je v +tom, že nejprve sestaví celou stranu do boxu0 a v té době expandují makra v +"\headline" a "\footline". Pak spustí "\pghook" a +"\protectlist". Makro "\protectlist" nastaví díky \db doprotect kontrolní sekvence +označené jako "\addprotect" na "\relax", takže během "\shipout" (tedy +během expanze záznamů "\write") se nebudou expandovat. +Další činnost je zcela shodná s činností makra "\plainoutput". \inext{opmacoutput}{doprotect}{++} -K makru "\begoutput" přidáme lokální změnu makra "\nl" v mezeru. -Makro "\nl" implicitně zalamuje řádky a může se vyskytovat v titulcích, -takže může být dopraveno do plovoucího záhlaví, kde je zalamování řádků -neřádoucí. -Původní obsah makra "\begoutput" je definován v~sekci~\ilink[barvy]{\numref[barvy]} -a řeší zejména správné nastavení barev. -Makro \db prepage vkládá klikatelný cíl pro stránku, je-li známo její číslo. +Barvy jsou v textu nastaveny pomocí "\pdfcolorstack", takže na začátku +následující strany začíná barva, která skončila na straně předchozí. +My ale nechceme, aby +barva textu ovlivnila barvu záhlaví a zápatí. Proto je sazba "\makeheadline" +a "\makefootline" realizována pomocí makra "\ensureblacko". -\inext{begoutput}{\empty}{+-} +Makro \db prepage se spustí na začátku "\pagecontents" a zajistí uložení +cíle pro odskok podle čísla strany. Makra \db preboxcclv a \db postboxcclv +se spustí na začátku a na konci sazby boxu~255, jsou prázdná a zůstávají v +kódu pro zachování zpětné kompatibility. -Poslední úprava mění plainovské \db pagecontents tak, že vkládá -"\prepage", "\preboxcclv" a "\postboxcclv". Jinak nechává obsah makra -stejný, jako v plain\TeX{}u. +\inext{prepage}{\empty}{+-} + +OPmac předefinovává makro \db pagecontents z plain\TeX{}u tak, že přidává +makra "\prepage", "\preboxcclv" a "\postboxcclv". Také obsah boxů "\topins" +a "\footins" tiskne pomocí "\ensureblacko". \inext{catcode}{\empty}{+-} @@ -2679,7 +2576,12 @@ nastav v~plain\TeX{}u. \inext{footline}{\empty}{+-} + +Makro \db Xpage z REF souboru nastavuje \db lastpage a "\fnotenumlocal". +S těmito registry také spolupracují makra "\Xlabel", "\Xmnote" a "\Xfnote". +\inext{lastpage}{\empty}{+-} + \subsec Okraje %%%%%%%%%%%%%% @@ -2712,9 +2614,11 @@ po \inext{margins}{\empty}{+-} Makro \db setpagedimens " " spustí -\db setpagedimensA "(<šířka>,)&", k~to\-mu musí -dopředu vyexpandovat obsah makra "\pgs:". To provedeme pomocí tří -"\expandafter". +\db setpagedimensB "(<šířka>,) ", pokud je prvním znakem +"" závorka, jinak spustí \db setpagedimensA, což je makro, které +použije definovaný formát, ten expanduje a zavolá "\setpagedimensB". Pomocné +makro \db setpagedimensC "=:" přiřadí do "" daný +rozměr. \inext{setpagedimens}{\empty}{+-} @@ -2747,5 +2651,3 @@ na zpracov \bye - - diff --git a/Master/texmf-dist/doc/cstex/opmac-u-en.pdf b/Master/texmf-dist/doc/cstex/opmac-u-en.pdf index 37f865a8ba6..1a30d653693 100644 Binary files a/Master/texmf-dist/doc/cstex/opmac-u-en.pdf and b/Master/texmf-dist/doc/cstex/opmac-u-en.pdf differ diff --git a/Master/texmf-dist/doc/cstex/opmac-u-en.tex b/Master/texmf-dist/doc/cstex/opmac-u-en.tex index 82c65e45165..c81b6c9ac19 100644 --- a/Master/texmf-dist/doc/cstex/opmac-u-en.tex +++ b/Master/texmf-dist/doc/cstex/opmac-u-en.tex @@ -487,7 +487,8 @@ character between h and i. \sec Colors %%%%%%%%%%% -The colors selection macros are working only if pdf\TeX-like engine is used. +The colors selection macros are working only if pdf\TeX-like engine (or +Xe\TeX) is used. OPmac provides a small number of color selectors: {\localcolor\Blue "\Blue"}, {\localcolor\Red "\Red"}, @@ -499,31 +500,31 @@ OPmac provides a small number of color selectors: {"\White"}, {\localcolor\Grey "\Grey"}, {\localcolor\LightGrey "\LightGrey"} and -"\Black". But user can define more +"\Black". User can define more such selectors by setting the CMYK components. For example \begtt \def\Orange{\setcmykcolor{0 0.5 1 0}} \endtt -The selectors itself change the color of the text and of the lines with the -thickness more than 1bp. If the "\linecolor" immediately precedes the color -selector then the lines with thickness less or equal 1bp are colored. This -is a second independent type of the color. +The current color in CMYK format is saved in the "\currentcolor" macro, thus you +can save it to your macro "\let\yourmacro=\currentcolor" and you can return to +this color by "\setcmykcolor\yourmacro". -The color selectors work globally on the one page. If the colored text is -broken to the next page then the color is correctly set on the following -page(s) after the second run of \TeX, because this event is implemented via -external file. User can write "\localcolor" inside the group. This command -saves the current color and restore it after the group is completed. It is -supposed that the group corresponds to the boundary of a box which cannot break -to more pages. If this is not true case then user can use "\longlocalcolor" -instead "\localcolor". Example: +The color selectors work globally by default. It means that colors don't +respect the \TeX{} groups and you have to return back to the black +typesetting explicitly by the "\Black" selector. + +OPmac provides the macro "\localcolor". If it is used then the +colors return back to the original value after \TeX{} groups automatically. +The macro has local validity. You can use it at begin of your document +(for all \TeX{} broups) or only in selected \TeX{} group (for this group +and nested goups). Example: \begtt \Red The text is red -\hbox{\localcolor \Blue here is blue {\localcolor \Green and green} - restored blue \Brown and brown} +{\localcolor \Blue here is blue {\Green and green} + restored blue \Brown and brown} now the text is red. \endtt @@ -1153,7 +1154,7 @@ Parameters are: \begitems * \dots\ "1" or "2" specifies one-page or two-pages design. -* \dots\ paper format (a4, a4l, etc.). +* \dots\ paper format (a4, a4l, a5, letter, etc. or user defined). * , , , \dots\ gives the amount of left, right, top and bottom margins. * \dots\ unit used for values , , , . @@ -1177,6 +1178,17 @@ declared margins are true for odd pages. The margins at the even pages are mirrored in such case, it means that is replaced by and vice versa. +The "" can be in the form "(,)" where "" is +optional. If it is missing then "" after margins sspecification is +used. Fo example: + +\begtt +\margins/1 (100,200) (7,7,7,7)mm +\endtt +% +declares the paper 100$\times$200\,mm with all four margins 7\,mm. The spaces +before and after "" parameter are necessery. + The command "\magscale[]" scales the whole typesetting area. The fixed point of such scaling is the so called the ``Knuth's point'': 1in below and 1in right of paper sides. Typesetting (breakpoints etc.) is diff --git a/Master/texmf-dist/doc/cstex/opmac-u.pdf b/Master/texmf-dist/doc/cstex/opmac-u.pdf index b1fb80155bd..3a485896585 100644 Binary files a/Master/texmf-dist/doc/cstex/opmac-u.pdf and b/Master/texmf-dist/doc/cstex/opmac-u.pdf differ diff --git a/Master/texmf-dist/doc/cstex/opmac-u.tex b/Master/texmf-dist/doc/cstex/opmac-u.tex index 87eb21a924f..fa26b8e53ab 100644 --- a/Master/texmf-dist/doc/cstex/opmac-u.tex +++ b/Master/texmf-dist/doc/cstex/opmac-u.tex @@ -94,8 +94,8 @@ Pojďme společnĂ˝mi silami tomu odstranit případnĂŠ mouchy a muĹĄky. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% VĹĄechna makra popsanĂĄ v tĂŠto sekci nastavujĂ­ změny ve fontech a dalĹĄĂ­ch -parametrech jen lokĂĄlně, takĹže po ukončenĂ­ skupiny se nastavenĂ­ vracĂ­ k pĹŻvodnĂ­m -hodnotĂĄm. +parametrech jen lokĂĄlně, takĹže jsou-li ve skupině, +za nĂ­ se nastavenĂ­ vracĂ­ k pĹŻvodnĂ­m hodnotĂĄm. Makro "\typosize[/<řádkovĂĄnĂ­>]" nastavĂ­ velikost textovĂ˝ch i matematickĂ˝ch fontĹŻ a řádkovĂĄnĂ­. Je-li některĂ˝ z parametrĹŻ prĂĄzdnĂ˝, makro @@ -115,10 +115,10 @@ Začátek dokumentu tedy mĹŻĹže vypadat takto: \endtt Makro "\typoscale[/]" zvětĹĄĂ­ nebo zmenĹĄĂ­ velikost -textovĂ˝ch i matematickĂ˝ch fontĹŻ resp. řádkovĂĄnĂ­ krĂĄt aktuĂĄlnĂ­ +textovĂ˝ch i matematickĂ˝ch fontĹŻ resp. řádkovĂĄnĂ­ krĂĄt aktuĂĄlnĂ­ velikost fontĹŻ resp. řádkovĂĄnĂ­. Faktor je celĂŠ číslo, přitom 1000 znamenĂĄ -jedničku (jako za slovem "scaled" v~příkazu "\font"). Je-li parametr +faktor jedna ku jednĂŠ (jako za slovem "scaled" v~příkazu "\font"). Je-li parametr prĂĄzdnĂ˝, je to stejnĂŠ, jako by byl roven 1000. \begtt @@ -217,7 +217,7 @@ K tomu slouŞí makro "\nl", kterĂŠ odřádkuje v mĂ­stě pouĹžitĂ­ (newline). Toto makro se navĂ­c v obsahu chovĂĄ jako mezera. Kapitola, sekce, podsekce se nečísluje, předchĂĄzĂ­-li "\nonum". Kapitola, -sekce, podeskce se neobjevĂ­ v obsahu, předchĂĄzlĂ­-li "\notoc". +sekce, podsekce se neobjevĂ­ v obsahu, předchĂĄzlĂ­-li "\notoc". \label[cislovani] \sec DalĹĄĂ­ číslovanĂŠ objekty a odkazy na ně @@ -226,7 +226,7 @@ sekce, podeskce se neobjevĂ­ v obsahu, předchĂĄzlĂ­-li "\notoc". Kromě kapitol, sekcĂ­ a podsekcĂ­ se automaticky číslujĂ­ jeĹĄtě rovnice a popisky pod obrĂĄzky a pod tabulkami. -Pokud na konci display mĂłdu je uvedeno +Pokud je na konci display mĂłdu uvedeno "\eqmark", tato rovnice bude číslovanĂĄ. FormĂĄt číslovĂĄnĂ­ je implicitně jedinĂŠ číslo uzavřenĂŠ v kulatĂŠ zĂĄvorce resetovanĂŠ při kaĹždĂŠm zahĂĄjenĂ­ novĂŠ sekce. Příklad: "$$ a^2 + b^2 = c^2 \eqmark $$" vytiskne @@ -253,7 +253,7 @@ $$ DalĹĄĂ­mi číslovanĂ˝mi objekty jsou popisky. Popisek pod obrĂĄzky je potřeba uvĂŠst slovem "\caption/f" a popisek pod -tabulkami slovem "\caption/t". Pak nĂĄsleduje text popisku ukončenĂ˝ +nebo nad tabulkami slovem "\caption/t". Pak nĂĄsleduje text popisku ukončenĂ˝ prĂĄzdnĂ˝m řádkem. Příklad: \begtt @@ -329,7 +329,7 @@ pomocĂ­ plain\TeX{}ovĂŠho makra "\topinsert" resp. "\midinsert". Například: Na automaticky číslovanĂŠ objekty je nutno se občas v textu odkazovat. ProtoĹže dopředu nevĂ­me, pod jakĂ˝m číslem se rovnice, sekce, tabulka atd. -vytiskne, je potřeba pouŞít internĂ­ lejblĂ­ky k označkovĂĄnĂ­ odkazovanĂ˝ch +vytiskne, je potřeba pouŞít internĂ­ lejblĂ­ky k označenĂ­ odkazovanĂ˝ch objektĹŻ. K tomu slouŞí makro "\label[]", kterĂŠ musĂ­ předchĂĄzet makru, jeĹž generuje číslo. NenĂ­ nutnĂŠ, aby "\label" předchĂĄzel těsně danĂŠmu makru. Tedy například: @@ -352,14 +352,14 @@ kterĂĄ shrnuje jistĂ˝ druh zĂĄvislosti. Text z ukĂĄzky vytvoří zhruba toto: \uv{NynĂ­ mĹŻĹžeme hovořit o sekci 2.1 na straně 13 nebo taky o rovnici (1) na straně 15. DĂĄle bude -potřeba upozornit na tabulku 1.3.1 na straně 42, +potřeba upozornit na tabulku 5.3.1 na straně 42, kterĂĄ shrnuje jistĂ˝ druh zĂĄvislosti.} JestliĹže se v textu vyskytujĂ­ dopřednĂŠ reference (tj. odkazujeme na objekt, kterĂ˝ jeĹĄtě nenĂ­ vytiĹĄtěn) nebo text odkazuje na strĂĄnky ("\pgref"), je nutnĂŠ -\TeX{}ovat dokument dvakrĂĄt. +\TeX{}ovat dokument aspoň dvakrĂĄt. -PomocĂ­ "\label[]\wlabel[]" se dĂĄ vytvořit kdekoli +PomocĂ­ "\label[]\wlabel{}" se dĂĄ vytvořit kdekoli obecnĂ˝ cĂ­l , na kterĂ˝ je moĹžnĂŠ odkazovat makry "\ref[]" nebo "\pgref[]". @@ -427,13 +427,13 @@ doporučuji na stejnou hodnotu nastavit "\iindent". VertikĂĄlnĂ­ mezera nad a pod prostředĂ­m s odrĂĄĹžkami je řízena makrem "\iiskip". -\sec Tvorba obsahu -%%%%%%%%%%%%%%%%%% +\sec Tvorba automaticky generovanĂŠho obsahu +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Makro "\maketoc" vytiskne v mĂ­stě svĂŠho pouĹžitĂ­ obsah dokumentu bez nadpisu, jen jednotlivĂŠ řádky obsahu. OdsazenĂ­ jednotlivĂ˝ch řádkĹŻ je nastaveno na nĂĄsobky registru "\iindent". Často je potřeba dokument \TeX{}ovat vĂ­cekrĂĄt, -neĹž se obsah zjevĂ­ a neĹž se strĂĄnkovĂŠ číslice srovnajĂ­ sprĂĄvně, protoĹže po +neĹž se obsah zjevĂ­ a neĹž se čísla stran srovnajĂ­ sprĂĄvně, protoĹže po prvnĂ­m zjevenĂ­ obsahu se mohou strĂĄnky posunout jinam. Titulek k obsahu by neměl bĂ˝t číslovanĂ˝ a neměl by se zjevit v obsahu, takĹže @@ -443,7 +443,7 @@ jej zapĂ­ĹĄeme třeba pomocĂ­ \nonum\notoc\sec Obsah \endtt -Tituly kapitol, sekcĂ­ a podsekcĂ­ zapisuje OPmac pro účely sestavenĂ­ obsahu do +Titulky kapitol, sekcĂ­ a podsekcĂ­ zapisuje OPmac pro účely sestavenĂ­ obsahu do externĂ­ho souboru "*.ref". MĹŻĹže se stĂĄt, Ĺže uĹživatel v těchto textech pouĹžije nějakĂŠ komplikovanĂŠ makro, kterĂŠ se pak v souboru \uv{rozsype} do takovĂŠho stavu, Ĺže nejde vzĂĄpětĂ­ přečíst. V takovĂŠm případě je potřeba @@ -456,17 +456,21 @@ proti expanzi do "*.ref" souboru. Například OPmac deklaruje: \endtt % a mnoho dalĹĄĂ­ch. NenĂ­ moĹžnĂŠ ale předvĂ­dat vĹĄechno, co mĹŻĹže uĹživatel -nacpat do titulu sekce nebo kapitoly. Pokud se tedy \uv{rozsype} +nacpat do titulku sekce nebo kapitoly. Pokud se tedy \uv{rozsype} REF soubor, je potřeba si tĂ­mto zpĹŻsobem zabezpečit pouŞívanĂŠ makro. +PoznĂĄmka: Při přechodu na novějĹĄĂ­ verzi OPmac se mĹŻĹže stĂĄt, Ĺže REF soubor +vygenerovanĂ˝ starou verzĂ­ zpĹŻsobĂ­ chyby při dalĹĄĂ­m zpracovĂĄnĂ­. Pak je +potřebnĂŠ nejprve REF soubor smazat. + \sec SestavenĂ­ rejstříku %%%%%%%%%%%%%%%%%%%%%%%% Makro pro zanĂĄĹĄenĂ­ slov do rejstříku je navrĹženo s ohledem na optimalizaci počtu ĂşhozĹŻ na klĂĄvesnici. Autor uĹž napsal svĂŠ dĂ­lo, mĂĄ danĂ˝ termĂ­n -odevzdĂĄnĂ­ a nynĂ­ ho čekĂĄ ĂşmornĂĄ prĂĄce vyhledĂĄvĂĄnĂ­ slov v textu, kterĂŠ by -měly přijĂ­t do rejstříku, a jejich vyznačovĂĄnĂ­. Je třeba mu tuto prĂĄci co +odevzdĂĄnĂ­ a nynĂ­ ho čekĂĄ ĂşmornĂĄ prĂĄce vyhledĂĄvĂĄnĂ­ slov v textu, kterĂĄ by +měla přijĂ­t do rejstříku, a jejich vyznačovĂĄnĂ­. Je třeba mu tuto prĂĄci co nejvĂ­ce usnadnit. Pro zanesenĂ­ slova do rejstříku slouŞí makro "\ii". Je to zkratka za @@ -525,7 +529,7 @@ kterĂŠ naznačujĂ­, Ĺže se do rejstříku dĂĄvĂĄ vĂ­ce slov: % Dostaneme totĂŠĹž jako při "\ii lineĂĄrnĂ­~prostor \ii vektorovĂ˝~prostor " a tato ukĂĄzka demonstruje jeĹĄtě jednu věc: je-li potřeba do parametru "\ii" -dostat mezeru, piĹĄte vlnku. +dostat mezeru, piĹĄte vlnku nebo napiĹĄte heslo uzavřenĂŠ ve svorkĂĄch. Pokud se v rejstříku objevĂ­ hesla sklĂĄdajĂ­cĂ­ se z vĂ­ce slov, obvykle chceme, aby u~hesla, kterĂŠ opakuje prvnĂ­ slovo, se toto slovo @@ -533,9 +537,9 @@ v rejstříku nevypisovalo opakovaně, ale aby bylo nahrazeno pomlčkou. Například: \par\nobreak \medskip -\hbox{\indent lineĂĄrnĂ­ podprostor 12, 16, 18, 29}\nobreak -\hbox{\indent \space --- prostor 12, 16--32, 51}\nobreak -\hbox{\indent \space --- zĂĄvislost 18--20, 34} +\hbox{\indent lineĂĄrnĂ­ podprostor \ 12, 16, 18, 29}\nobreak +\hbox{\indent \space --- prostor \ 12, 16--32, 51}\nobreak +\hbox{\indent \space --- zĂĄvislost \ 18--20, 34} \medskip \noindent Při takovĂŠm poĹžadavku piĹĄte mĂ­sto vlnky mezi slovy lomĂ­tko. Příklad: @@ -556,8 +560,8 @@ prostor/lineĂĄrnĂ­. Aby se to nemuselo psĂĄt dvakrĂĄt, je k dispozici zkratka Počet lomĂ­tek v hesle pro rejstřík nenĂ­ omezen. MĹŻĹžete tedy vytvořit vĂ­ceĂşrovňovĂ˝ rejstřík. NicmĂŠně je třeba vědět, Ĺže zkratka "@" nevytváří -vĹĄechny permutace, ale jen prohazuje prvnĂ­ Ăşdaj před lomĂ­tkem se vĹĄemi -ostatnĂ­mi. TakĹže "\ii a/b/c,@" je totĂŠĹž jako "\ii a/b/c" "\ii b/c/a". +vĹĄechny permutace, ale jen přesune prvnĂ­ Ăşdaj před lomĂ­tkem za vĹĄechny +ostatnĂ­. TakĹže "\ii a/b/c,@" je totĂŠĹž jako "\ii a/b/c" "\ii b/c/a". SamotnĂ˝ rejstřík vznikne v mĂ­stě příkazu "\makeindex". Rejstřík obsahuje data z předchozĂ­ho zpracovĂĄnĂ­ dokumentu \TeX{}em, takĹže je potřeba @@ -587,7 +591,7 @@ Funkci si vysvětlĂ­me na příkladu: \iis věta/o~neĂşplnosti/Goedelova {věta/o~neĂşplnosti/G\"odelova} \endtt % -Lze pak psĂĄt "\ii relax" nebo "\ii chikvadrat" nebo +Lze pak psĂĄt "\ii relax", "\ii chikvadrat" nebo "\ii Goedelova/věta/o~neĂşplnosti,@". OPmac abecedně řadĂ­ podle těchto hesel, ale kdyĹž dojde na potřebu heslo vytisknout do rejstříku, vytiskne mĂ­sto těchto hesel @@ -596,8 +600,7 @@ kterĂ˝ je uveden na pravĂŠ straně slovnĂ­ku. Příklad ukazuje, Ĺže tĂ­m lze řeĹĄit nejen tisk hesel, kterĂĄ je potřeba oĹĄetřit speciĂĄlnĂ­mi makry (v příkladu slovo relax), ale takĂŠ -vĂ˝jimky abecednĂ­ho řazenĂ­ (pĂ­smeno "\"{\tt\char`\"o} -nemĂĄme v českĂŠ abecedě, kdovĂ­, kam by se to zařadilo). +vĂ˝jimky abecednĂ­ho řazenĂ­. % SlovnĂ­k vĂ˝jimek je moĹžnĂ˝ zapsat kamkoli před "\makeindex", typicky se pĂ­ĹĄe na začátek dokumentu. @@ -625,8 +628,8 @@ TakĹže třeba "\ii Ernst~@~Young" pro řazenĂ­ a \sec Barvy, vodoznaky %%%%%%%%%%%%%%%%%%%%% -Makra uvedenĂĄ v tĂŠto sekci nastavujĂ­ barvy jen při pouĹžitĂ­ pdf\TeX{}u a při -vĂ˝stupu do PDF. Jinak tato makra neudělajĂ­ nic. +Makra uvedenĂĄ v tĂŠto sekci nastavujĂ­ barvy jen při přímĂŠm +vytvářenĂ­ do PDF. TakĹže při vĂ˝stupu do DVI tato makra neudělajĂ­ nic. % Barvu textu mĹŻĹžete nastavit pomocĂ­ přepĂ­načů {\localcolor\Blue "\Blue"}, @@ -639,48 +642,53 @@ Barvu textu mĹŻĹžete nastavit pomocĂ­ přepĂ­načů {"\White"}, {\localcolor\Grey "\Grey"}, {\localcolor\LightGrey "\LightGrey"} a -{"\Black"}. Je potřeba si uvědomit, Ĺže tyto -přepĂ­nače pracujĂ­ globĂĄlně nezĂĄvisle na skupině uvnitř boxu i mimo, prostě -kdekoli. Barvu jinou neĹž černou je potřeba nakonec vypnout přepĂ­načem -"\Black". Pokud barvu jinou neĹž černou zapnete na některĂŠ strĂĄnce a text v -tĂŠto barvě přeteče do strĂĄnek dalĹĄĂ­ch, při opakovanĂŠm \TeX{}ovĂĄnĂ­ se objevĂ­ -sprĂĄvnĂĄ barva i na nĂĄsledujĂ­cĂ­ch strĂĄnkĂĄch. Tuto skutečnost si totiĹž -\TeX{} musĂ­ ujasnit prostřednictvĂ­m pomocnĂŠho souboru s odkazy. - -Společně s barvou textu tyto přepĂ­nače zapĂ­najĂ­ i barvu větĹĄĂ­ch ploch -vytvořenĂ˝ch pomocĂ­ "\hrule" a "\vrule". Ve specifikaci formĂĄtu PDF je -nicmĂŠně jeĹĄtě jeden přepĂ­nač barev nezĂĄvislĂ˝ na barvě textu a větĹĄĂ­ch ploch. -Jsou to barvy linek, kterĂŠ majĂ­ tlouĹĄĹĽku menĹĄĂ­ neĹž 1~bp. Tento \uv{druh -barvy} se přepĂ­nĂĄ stejnĂ˝mi přepĂ­nači "\Blue", ..., "\Black" ovĹĄem -před tĂ­mto přepĂ­načem musĂ­ bezprostředně předchĂĄzet slovo "\linecolor". -TakĹže "\linecolor\Red" zapne barvu linek na červenou, ale barva textu -zĹŻstane pĹŻvodnĂ­. Nebo "\Black" vrĂĄtĂ­ do normĂĄlu barvu textu, zatĂ­mco -"\linecolor\Black" zpĹŻsobĂ­, Ĺže takĂŠ linky budou dĂĄle černĂŠ. +{"\Black"}. + +Implicitně tyto přepĂ­nače pracujĂ­ globĂĄlně nezĂĄvisle na \TeX{}ovĂŠ skupině. +Barvu jinou neĹž černou je pak potřeba ukončit explicitnĂ­m přepĂ­načem +"\Black". Toto chovĂĄnĂ­ je moĹžnĂŠ změnit uvedenĂ­m příznaku "\localcolor". +Tento příznak je moĹžnĂŠ nastavit globĂĄlně (například na začátku dokumentu) +nebo lokĂĄlně uvnitř skupiny. Při globĂĄlnĂ­m nastavenĂ­ se sazba vracĂ­ +k~pĹŻvodnĂ­ barvě za vĹĄemi \TeX{}ovĂ˝mi skupinami +a při lokĂĄlnĂ­m nastavenĂ­ se k pĹŻvodnĂ­ barvě vracĂ­ sazba +za skupinou začínajĂ­cĂ­ příznakem "\localcolor" (a za vĹĄemi vnořenĂ˝mi skupinami). +Příklad: \def\podbarvi#1#2#3{\setbox0=\hbox{#3}\leavevmode {\localcolor\rlap{#1\strut\vrule width\wd0}#2\box0}} +\begtt +ČernĂ˝ {\localcolor \Blue modrĂ˝ {\Green zelenĂ˝ \Red červenĂ˝} modrĂ˝} černĂ˝. +\endtt +% +DalĹĄĂ­ příklad vytvoří \podbarvi\Yellow\Brown{podbarvenĂ˝ text:} + +\begtt +\def\podbarvi#1#2#3{\setbox0=\hbox{#3}\leavevmode + {\localcolor\rlap{#1\strut\vrule width\wd0}#2\box0}} + \podbarvi\Yellow\Brown{Tady je hnědĂ˝ text na ĹžlutĂŠm pozadĂ­.} +\endtt + +V pĹŻvodnĂ­ verzi OPmac bylo moĹžnĂŠ rozliĹĄovat barvy tenkĂ˝ch linek a pĂ­sma. +Tuto vlastnost jsem opustil od verze Dec.~2014. ZdĹŻvodněnĂ­ najdete v +technickĂŠ dokumentaci. + Kromě uvedenĂ˝ch barevnĂ˝ch přepĂ­načů si mĹŻĹžete \uv{namĂ­chat} v reĹžimu CMYK i barvy vlastnĂ­. Stačí se inspirovat, jak jsou uvedenĂŠ přepĂ­nače definovĂĄny:\par\nobreak \begtt -\def\Red{\setcmykcolor{0.0 1.0 1.0 0}} +\def\Red{\setcmykcolor{0 1 1 0}} \def\Brown{\setcmykcolor{0 0.67 0.67 0.5}} ... \endtt -Uvnitř skupiny, kterĂĄ se nerozpadne do vĂ­ce strĂĄnek, je moĹžno před přepnutĂ­m -barvy pouŞít "\localcolor". \TeX{} si v mĂ­stě tohoto příkazu -zapamatuje aktuĂĄlnĂ­ barvu a po ukončenĂ­ -skupiny se k nĂ­ automaticky vrĂĄtĂ­. -NĂĄsleduje příklad, kterĂ˝m vytvoříme \podbarvi\Yellow\Brown{podbarvenĂ˝ text:} +AktuĂĄlnĂ­ barvu ve formě čtyř čísel CMYK je moĹžnĂŠ přečíst z makra +"\currentcolor" například pomocĂ­ +"\let\savedcolor=\currentcolor" a později je moĹžnĂŠ se k tĂŠto barvě +vrĂĄtit pomocĂ­ "\setcmykcolor\savedcolor". -\begtt -\def\podbarvi#1#2#3{\setbox0=\hbox{#3}\leavevmode - {\localcolor\rlap{#1\strut\vrule width\wd0}#2\box0}} - \podbarvi\Yellow\Brown{Tady je hnědĂ˝ text na ĹžlutĂŠm pozadĂ­.} -\endtt +\medskip {\bf Vodoznakem} je mĂ­něn ĹĄedĂ˝ text opakujĂ­cĂ­ se na kaĹždĂŠ strĂĄnce, kterĂ˝ je vytiĹĄtěn pod obvyklĂ˝m textem. Například OPmac nabĂ­zĂ­ makro "\draft", kterĂŠ zpĹŻsobĂ­, Ĺže kaĹždĂĄ strĂĄnka obsahuje ĹĄikmo napsanĂ˝ velikĂ˝ ĹĄedĂ˝ @@ -800,7 +808,7 @@ odsazenĂ­. Je-li před zahĂĄjenĂ­m "\begtt" nastaven registr "\ttline" na nezĂĄpornou hodnotu, bude makro číslovat řádky. PrvnĂ­ řádek mĂĄ číslo "\ttline+1" -a po prĂĄci makra se registr "\ttbline" posune na číslo poslednĂ­ho +a po prĂĄci makra se registr "\ttline" posune na číslo poslednĂ­ho vytiĹĄtěnĂŠho řádku. TakĹže v~dalĹĄĂ­m prostředĂ­ "\begtt" ... "\endtt" číslovĂĄnĂ­ pokračuje tam, kde přestalo. Implicitně je "\ttline=-1", takĹže číslovĂĄnĂ­ neprobĂ­hĂĄ. @@ -852,7 +860,7 @@ makrosouborĹŻ. DĹŻvod: "\activettchar" nastavuje jako aktivnĂ­, coĹž mĹŻ čtenĂ­ souborĹŻ maker vadit. NenĂ­ taky rozumnĂŠ aktivovat znak pro derivaci nebo jinĂ˝ v~textu pouŞívanĂ˝ znak. -Verbatim listingy je moĹžnĂŠ tisknout z externĂ­ho souboru. Například +Verbatim vĂ˝pisy je moĹžnĂŠ tisknout z externĂ­ho souboru. Například \begtt \verbinput (12-42) program.c @@ -866,7 +874,7 @@ Parametry v kulatĂŠ zĂĄvorce mohou vypadat takĂŠ takto: \verbinput (-60) program.c % vĂ˝pis od začátku souboru do řádku 60 \verbinput (61-) program.c % vĂ˝pis od řádku 61 do konce souboru \verbinput (-) program.c % vĂ˝pis celĂŠho souboru -\verbinput (70+10) program.c % čtenĂ­ od řádku 70, přečteno bude 10 řádkĹŻ +\verbinput (70+10) program.c % vĂ˝pis od řádku 70, tiskne 10 řádkĹŻ \endtt V dalĹĄĂ­ch ukĂĄzkĂĄch OPmac čte od řádku, kterĂ˝ nĂĄsleduje za naposledy @@ -875,8 +883,8 @@ přečtenĂ˝m řádkem souboru z předchozĂ­ho volĂĄnĂ­ "\verbinput". Je-li soubo řádek je označen v komentářích jako "n". \begtt -\verbinput (+10) program.c % čtenĂ­ deseti řádkĹŻ od řádku n -\verbinput (+) program.c % čtenĂ­ od řádku n do konce souboru +\verbinput (+10) program.c % vĂ˝pis deseti řádkĹŻ od řádku n +\verbinput (+) program.c % vĂ˝pis od řádku n do konce souboru \vebrinput (-5+7) program.c % vynechĂĄ 5 řádkĹŻ, od n+5 tiskne dalĹĄĂ­ch 7 \verbinput (-3+) program.c % vynechĂĄ 3 řádky, tiskne do konce souboru \endtt @@ -902,7 +910,7 @@ OPmac v makru "\table{}{}". Příklad: \begtt \table{||lc|r||}{\crl - MěsĂ­c & zboŞí & cena\hfil \crli \tskip.2em + měsĂ­c & zboŞí & cena\hfil \crli \tskip.2em leden & noĹĽas & 14 kKč \cr Ăşnor & skejt & 2 kKč \cr červenec & jachtička & 3,4 MKč \crl} @@ -912,7 +920,7 @@ UvedenĂ˝ příklad povede na nĂĄsledujĂ­cĂ­ vĂ˝sledek: \medskip \hfil\table{||lc|r||}{\crl - MěsĂ­c & zboŞí & cena\hfil \crli \tskip.2em + měsĂ­c & zboŞí & cena\hfil \crli \tskip.2em leden & noĹĽas & 14 kKč \cr Ăşnor & skejt & 2 kKč \cr červenec & jachtička & 3,4 MKč \crl} @@ -1022,10 +1030,10 @@ TBN, kapitolu čtvrtou. Makro "\inspic ." vloŞí obrĂĄzek. Je-li předem nastaven registr "\picw", mĂĄ obrĂĄzek poĹžadovanou šířku. -ImplicitnĂ­ hodonta registru je 0\,pt, coĹž znamenĂĄ, Ĺže bude obrĂĄzek vloĹžen +ImplicitnĂ­ hodnota registru je 0\,pt, coĹž znamenĂĄ, Ĺže bude obrĂĄzek vloĹžen ve svĂŠ přirozenĂŠ velikosti. Analogicky lze nastavit výťku obrĂĄzku registrem "\picheight". -Přípony souboru s obrĂĄzkem mohou bĂ˝t: "png", "jpg", "jbig2", "pdf". +Přípony souboru s obrĂĄzkem mohou bĂ˝t "png", "jpg", "jbig2", "pdf". ObrĂĄzek je vyhledĂĄn v adresáři "\picdir". Toto makro je implicitně prĂĄzdnĂŠ, tj. obrĂĄzek je vyhledĂĄn v aktuĂĄlnĂ­m adresáři. @@ -1045,7 +1053,7 @@ do PDF dokumentu jen jednou pdf\TeX{}ovĂ˝m příkazem "\pdfximage" a dĂĄle opakovat jeho zobrazenĂ­ na rĹŻznĂ˝ch mĂ­stech dokumentu pomocĂ­ "\pdfrefximage". Dokumentace k pdf\TeX{}u řekne vĂ­c. -Makro "\inspic" pracuje jen v pdf\TeX{}u při vĂ˝stupu do PDF. Pokud mĂĄte +Makro "\inspic" pracuje jen při vĂ˝stupu do PDF. Pokud mĂĄte nastaven vĂ˝stup do DVI, mĹŻĹžete pouŞít makro "epsf.tex". Vzhledem k omezenĂ˝m moĹžnostem (obrĂĄzek jen ve formĂĄtu EPS) nenĂ­ tento zpĹŻsob prĂĄce s obrĂĄzky v makru OPmac podporovĂĄn. @@ -1106,14 +1114,13 @@ třetĂ­: \bigskip\bigskip - \sec PoznĂĄmky pod čarou a na okraji %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {\bf PoznĂĄmku pod čarou} vytvoříte pomocĂ­ "\fnote{}". V mĂ­stě tohoto zĂĄpisu v textu se objevĂ­ automaticky generovanĂĄ značka a pod čarou dole na strĂĄnce -je tato značka zopakovanĂĄ a vedle nĂ­ je . +je tato značka zopakovĂĄna a vedle nĂ­ je . Značka je implicitně definovanĂĄ jako číslo v exponentu nĂĄsledovanĂŠ zĂĄvorkou. ČíslovĂĄnĂ­ poznĂĄmek je na kaĹždĂŠ strĂĄnce započato @@ -1144,11 +1151,11 @@ Příklad: \begtt {\typoscale[/1200]\table{||lc|r||}{\crl - MěsĂ­c & zboŞí & cena\hfil \crli \tskip.2em + měsĂ­c & zboŞí & cena\hfil \crli \tskip.2em leden & noĹĽas\fnotemark1 & 14 kKč \cr Ăşnor & skejt\fnotemark2 & 2 kKč \cr červenec & jachtička\fnotemark3 & 3,4 MKč \crl}} -\par\nobreak \fnotetext{notebook}\fnotetext{scateboard}\fnotetext{jachta} +\par\nobreak \fnotetext{notebook}\fnotetext{skateboard}\fnotetext{jachta} \endtt % Čísla za slovy "\fnotemark" je třeba psĂĄt od jednĂŠ v kaĹždĂŠ tabulce/boxu. @@ -1188,7 +1195,7 @@ nahoru. Při zĂĄpornĂŠ hodnotě se posune dolĹŻ. Například %%%%%%%%%%%%%%%%%%%%%%%%% {\bf Odkazy.} -PomocĂ­ "\cite[]" nebo "\cite[,,]" +PomocĂ­ "\cite[]" nebo "\cite[,,]" atd. vytvoříme v~textu odkazy na poloĹžky v seznamu literatury. V seznamu literatury je třeba uvĂŠst zĂĄznamy, kterĂŠ majĂ­ odkazovanĂŠ lejblĂ­ky. Tyto zĂĄznamy dostanou v seznamu automaticky vygenerovanĂĄ čísla a sekvence @@ -1238,16 +1245,16 @@ JednotlivĂŠ zpĹŻsoby jsou nĂ­Ĺže probrĂĄny podrobněji. \par\nobreak \begtt -\bib [tbn] Petr OlĹĄĂĄk. {\it\TeX{}book naruby.} 468~s. Brno: Konvoj, 1997. +\bib [tbn] Petr OlĹĄĂĄk. {\it\TeX{}book naruby.} 468~s. Brno: Konvoj, 2001. \bib [tst] Petr OlĹĄĂĄk. {\it TypografickĂ˝ systĂŠm \TeX.} - 269~s. Praha: CSTUG, 1995. + 300~s. Brno: Konvoj, 2000. \endtt % Výťe uvedenĂĄ ukĂĄzka dĂĄ nĂĄsledujĂ­cĂ­ vĂ˝stup: \medskip -\bib[tbn] Petr OlĹĄĂĄk. {\it\TeX{}book naruby.} 468~s. Brno: Konvoj, 1997. +\bib[tbn] Petr OlĹĄĂĄk. {\it\TeX{}book naruby.} 468~s. Brno: Konvoj, 2001. \bib[tst] Petr OlĹĄĂĄk. {\it TypografickĂ˝ systĂŠm \TeX.} - 269~s. Praha: CSTUG, 1995. + 300~s. Brno: Konvoj, 2000. \medskip Je moĹžnĂŠ pouŞít rozšířenĂ˝ zpĹŻsob zĂĄpisu "\bib [] = {} ". Údaj "" se @@ -1255,8 +1262,8 @@ pouĹžije do odkazĹŻ při zapnutĂŠm "\nonumcitations". Kolem rovnĂ­tka musejĂ­ b Například: \begtt -\bib [tbn] = {OlĹĄĂĄk, 1997} - OLŠÁK, P. {\it\TeX{}book naruby.} 468~s. Brno: Konvoj, 1997. +\bib [tbn] = {OlĹĄĂĄk, 2001} + OLŠÁK, P. {\it\TeX{}book naruby.} 468~s. Brno: Konvoj, 2001. \endtt \medskip\noindent @@ -1290,7 +1297,7 @@ pokyny pro Bib\TeX{} do souboru ".aux" a zjistĂ­, Ĺže soubor WARNING: .bbl file doesn't exist. Use the ``bibtex '' command. \endtt -Přejděte tedy na příkazovĂ˝ řádek a napĂ­ĹĄeme "bibtex ". TĂ­m se +Přejděte tedy na příkazovĂ˝ řádek a napiĹĄte "bibtex ". TĂ­m se spustĂ­ program Bib\TeX{}, kterĂ˝ přečte ze souboru ".aux" vstupnĂ­ pokyny (kterou otevřít ".bib" databĂĄzi, kterĂ˝ ".bst" styl a jakĂŠ lejblĂ­ky jsou poĹžadovĂĄny) a na zĂĄkladě toho vygeneruje soubor ".bbl", kterĂ˝ @@ -1376,7 +1383,7 @@ podle rĹŻznĂ˝ch stylĹŻ rĹŻznĂŠ soubory typu "mybbl-plain.bbl", \noindent {\bf PřímĂŠ čtenĂ­ ".bib" databĂĄze} je moĹžnĂŠ po "\input opmac-bib.tex". Tato přídavnĂĄ makra navĂ­c pouŞívajĂ­ externĂ­ balíček na čtenĂ­ ".bib" souborĹŻ -"librarian.tex" od Paula Isamberta. UĹžitĂ­ je podobnĂŠ, jako při "\usebbl": +"librarian.tex" od Paula Isamberta. UĹžitĂ­ je podobnĂŠ jako při "\usebbl": \begtt \usebib/c (