summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/cstex/opmac-d.tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2015-02-11 21:49:44 +0000
committerKarl Berry <karl@freefriends.org>2015-02-11 21:49:44 +0000
commit5b1aa58b4889aeb3418a3007a831bbb0b3fe72e4 (patch)
treeb33801a520f724cb145a845d7ae407b4b6d6fc2e /Master/texmf-dist/doc/cstex/opmac-d.tex
parent79a499bdfb2822be4bab61f6c6720f4c52119c3b (diff)
cstex (11feb15)
git-svn-id: svn://tug.org/texlive/trunk@36259 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/cstex/opmac-d.tex')
-rw-r--r--Master/texmf-dist/doc/cstex/opmac-d.tex738
1 files changed, 320 insertions, 418 deletions
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á makra chceme při "\write" do souboru nechat v původním stavu:
\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 "{<string1>}{<string2>}" vymění v makru "\tmpb"
+veškeré výskyty "<string1>" za "<string2>". Pro tento účel definuje pracovní
+makro \db replacestringsA se separátorem "<string1>". 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ívu.
\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řechodně předefinuje "\act" a předloží mu "\iilist".
\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ůže například psát "\def\everyii{\indent}", pokud chce.
\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 "<expanded-previi>&" 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ěříme na vytvoření makra
"\isAleB"~"\,<heslo1>"~"\,<heslo2>", které rozhodne, zda je "<heslo1>" řazeno
před "<heslem2>" 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
+"<string1>:<string2>" 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<kód jazyka>".
+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<aktuální jazyk>". 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 "\,<heslo>". Toto makro připraví pomocí do "\tmpb"
-"<heslo>" 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ěnit výstupní rutinu. Makro z TBN je zde v OPmac ve dvou věcech přepracováno:
\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ázdný.
\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ů "<num> <num> <num> <num> k"
-(pro text a plochy) a "<num> <num> <num> <num> 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 "{<CMYK barva>}" 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 "<k nebo K>" informaci do REF souboru ve formátu
-"\Xpdfcolork{<CMYK barvy>}" nebo "\XpdfcolorK{<CMYK barvy>}".
+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 "<přepínač barvy>" má hodnotu "K".
+Makro \db ensureblacko "{<sazba>}" je použito pro sazbu záhlaví a zápatí ve
+výstupní rutině v~makru "\opmacoutput". Implicitně se "\ensureblacko{<sazba>}" chová
+stejně jako samotná "<sazba>", ale po použití přepínače barvy
+"\setcmykcolor" začne fungovat jako \db ensureblackoA, což zajistí bravu
+"<sazby>" v~černém. Je to provedeno tak, že je na začátku "<sazby>"
+alokována nová úroveň zásobníku barev s výchozí černou barvou a na konci
+"<sazby>" 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 "{<CMYK barva>}" 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 "<c> <m> <y> <k> k" i s barvou tenkých linek
+"<c> <m> <y> <k> K".
+Konečně makro \db colorstackset "{<CMYK barva>}" 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 "<vzkaz>{<barva k>}{<barva K>}". 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 "<vzkaz>=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ží "<barvu k>" a do "\tmpb" vloží
-"<barvu K>" 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 "<vzkaz>=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 "{<CMYK barva>}" a \db XpdfcolorK "{<CMYK barva>}",
-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 <k nebo K> {<CMYK barvy>}".
-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ží do "\headline" box nulové výšky a šířky "\draftbox",
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 "{<text>}" je "<text>" 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žity PDF transformace souřadnic.
\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čí předefinovat pro tento režim makro
\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á makra "\toclink", "\pglink", "\citelink" a "\reflink" probouzejí k
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 "{<typ>}", které
-expanduje na nic, pokud není kontrolní sekvence "\<typ>border" definována.
-Jinak expandují na "arrt" "/C" s obsahem podle "\<typ>border".
+expanduje na "attr" "/Border[0 0 0]", pokud není kontrolní sekvence
+"\<typ>border" definována. Jinak expanduje na "arrt" "/Border[0 0 .6]" a
+"/C" s obsahem podle "\<typ>border".
\inext{pdfborder}{\empty}{+-}
@@ -1784,26 +1729,6 @@ má v URL znak procento, musí psát "\%"
nebo si změní kategorie sám. Podobná poznámka platí pro znaky "{", "}", "\",
"#" a "$".
-Makro \db replacestrings "{<string1>}{<string2>}" vymění v makru "\tmpb"
-veškeré výskyty "<string1>" za "<string2>". 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<původní obsah tmpb>\/<string1>\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 "<textu>" je vložen "?", který jej odděluje od přidaného
-"<string1>". Kdybychom jej tam nedali, pak při "<string1>=//" a při lomítku
-na konci "<textu>" 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íce řádků. Je možné si vyzkoušet třeba tento kód:
\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 "{<text>}" 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{<text>}". 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{<text>}" 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 "{<text>}" vloží vnější "\hbox{\vrule<vnitřek>\vrule}".
+Uvnitř tohoto boxu se nachází "\vtop{<další>\kern\vvkern\hrule}", takže "<další>"
+zůstává na účaří. Přitom "<další>" je "\vbox{\hrule\kern\vvkern<další2>}",
+takže "<další2>" zůstává na účaří. V tuto chvíli jsou již vytvořeny čáry
+vlevo, vravo, nahoře i dole. Konečně "<další2>" je
+"\hbox{\kern\hhkern<text>\kern\hhkern}".
\inext{frame}{\empty}{+-}
@@ -2274,39 +2194,6 @@ Při kladení vlevo musíme použít "fill", abychom přeprali natahovací mezeru z
\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 "[<lejblík>]". Nejprve je ošetřeno, zda je použit
-zkrácený nebo rozšířený zápis "\bib[<lejblík>] = {<značka>}". 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[<lejblík>] = {<značka>}". 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 "{<lejblík>}{<číslo citace>}{<značka>}" do REF souboru propojené údaje o
@@ -2624,50 +2515,56 @@ makra "\bbl:b" a "\bbl:c" si dva seznamy "\citelist" a "\citelistB" před svou
\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 "<makro>"
-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<sekvence>" 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í podle svého. Jinak je "\footline" shodná s původním nastavením
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čítáme jako "\pgwidth"~"-"~"\hsize"~"-"~"2*<levý>" což dá stejnou hodnotu jako
\inext{margins}{\empty}{+-}
Makro \db setpagedimens "<formát> " spustí
-\db setpagedimensA "(<šířka>,<výška>)<jednotka>&", k~to\-mu musí
-dopředu vyexpandovat obsah makra "\pgs:<formát>". To provedeme pomocí tří
-"\expandafter".
+\db setpagedimensB "(<šířka>,<výška>)<jednotka> ", pokud je prvním znakem
+"<formátu>" závorka, jinak spustí \db setpagedimensA, což je makro, které
+použije definovaný formát, ten expanduje a zavolá "\setpagedimensB". Pomocné
+makro \db setpagedimensC "<reg>=<num>:<jednotka>" přiřadí do "<reg>" daný
+rozměr.
\inext{setpagedimens}{\empty}{+-}
@@ -2747,5 +2651,3 @@ na zpracování dokumentu, který nám připravil uživatel. Přeji dobré pořízení.
\bye
-
-