diff options
author | Karl Berry <karl@freefriends.org> | 2013-08-15 22:30:20 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-08-15 22:30:20 +0000 |
commit | b334c30fe0a0faa600731910cc98905b9f0b4955 (patch) | |
tree | 25247ec41ddc97637739cfa4cc3d00627505300d /Master/texmf-dist/doc/cstex/opmac-d.tex | |
parent | 223162e87cec5243ae4b5345d9d5599523632e70 (diff) |
missed cstex doc update
git-svn-id: svn://tug.org/texlive/trunk@31438 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.tex | 639 |
1 files changed, 518 insertions, 121 deletions
diff --git a/Master/texmf-dist/doc/cstex/opmac-d.tex b/Master/texmf-dist/doc/cstex/opmac-d.tex index 95d241e0f0a..bb8122b8786 100644 --- a/Master/texmf-dist/doc/cstex/opmac-d.tex +++ b/Master/texmf-dist/doc/cstex/opmac-d.tex @@ -7,7 +7,7 @@ % This file is encoded in ISO-8859-2 because % UTF-8 encTeX has a conflict with DocByTeX -\def\projectversion{Dec. 2012} +\def\projectversion{Aug. 2013} \def\headtitle{OPmac} \widowpenalty=10000 @@ -198,6 +198,15 @@ znak kategorie 12. Na tento znak se v našem kódu překlopí otazník, Takže \inext {percent}{}{+-} +Podobně je naprogramováno makro \db bslash, které vytiskne obyčejné zpětné +lomítko: + +\inext {bslash}{}{+-} + +Obě makra chceme při "\write" do souboru nechat v původním stavu: + +\inext {addprotect}{}{+-} + Makro plain\TeX{}u "\," funguje jen v matematické sazbě. Uživatel bude chtít makro často použít například mezi číslem a jednotkou v textovém módu: "5\,mm", takže @@ -241,6 +250,9 @@ uživatelské dokumentaci. \dgn \nb secchook \dgn \nb cnvhook \dgn \nb pghook +\dgn \nb toclinehook +\dgn \nb mnotehook +\dgn \nb captionhook \inext {newdimen}{\count=7 \empty}{+-} @@ -292,14 +304,17 @@ kódu ze souboru "csfontsm.tex" z balíčku \csplain{}. Implicitně jsou zavedeny \CS{}fonty, takže k nim přidáme AMS fonty z "ams-math.tex", které vizuálně odpovídají. Později si může uživatel zavést -jiné makro (např. "tx-math.tex") a zavede si třeba i jiné textové fonty. To nezmění -vlastnosti maker v OPmac, pokud nové soubory maker správně předefinují +jiné makro (např. "tx-math.tex") a zavede si třeba i jiné textové fonty. +To nezmění vlastnosti maker v OPmac, pokud nové soubory maker správně +předefinují makra "\setmathsizes[<text>/<script>/<scriptscript>]", "\normalmath" a -"\boldmath". +"\boldmath". Soubor "ams-math.tex" načteme jen tehdy, když není definováno +"\normalmath". Je totiž možné, že uživatel načetl matematické makro ještě +před zavoláním "\input opmac". -\inext {ams-math}{\empty}{+-} +\inext {ams-math}{}{+-} -Po načtení souboru ams-math disponujeme makry \db regtfm na registraci +Po načtení souboru "ams-math.tex" disponujeme makry \db regtfm na registraci různých metrik pro různé designované velikosti fontů a \db whichtfm, které expanduje na svůj parametr nebo na metriku, která je registrována pro velikost \db dgsize. Registrace metrik \CS{}fontů je rovněž provedena @@ -310,9 +325,11 @@ velikost fontu "<fontselector>" podle obsahu makra "\sizespec" (viz soubor resizefontskipat na odstranění \uv{sizespec} z názvu metriky. Toto pomocné makro je v OPmac předefinováno s využitím "\whichtfm", takže když před voláním makra "\resizefont" připravíme správnou "\dgsize", \TeX{} použije -metriku designovanou na požadovanou velikost: +metriku designovanou na požadovanou velikost. Nebyl-li načten +"ams-math.tex", není "\whichtfm" definováno a v takovém případě +neprovedeme nic. -\inext {resizefontskip}{\empty}{+-} +\inext {whichtfm}{\empty}{+-} Makra "\typosize", "\fontsizex", "\textfontsize", "\setbaselineskip" požadují zápis parametru bez jednotky. @@ -395,9 +412,11 @@ drsným "\space". To separuje číselný parametr dostatečně. \inext {magstep}{\empty}{+-} Makro \db em přepíná kontextově do odpovídající varianty a ve spolupráci s -makrem "\additcorr" přidává italickou korekci. Makro \db additcorr +makry "\additcorr" a "\afteritcorr" přidává italickou korekci. Makro \db additcorr si pomocí "\lastskip" zapamatuje poslední mezeru, pak ji odstraní, vloží italickou korekci a nakonec vrátí tu odstraněnou mezeru. +Makro \db afteritcorr se probudí k činnosti na konci skupiny a přidá +italickou korekci, pokud nenásleduje tečka nebo čárka. \inext {def\nb em}{\empty}{+-} @@ -557,6 +576,113 @@ potřebujeme asynchronní "\write". \subsec Kapitoly, sekce, podsekce %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Od verze OPmac Jul. 2013 jsou zcela přepracována pomocná makra pro návrh +typografie kapitol, sekcí a podsekcí. Nyní má autor typografického návrhu +lépe pod vlastní kontrolou, co se vkládá do vertikálního seznamu, což je pro +programování možných stránkových zlomů a nezlomů důležité. + +Autor typografie dokumentu by měl definovat pro +tisk kapitoly, sekce a podsekce makra "\printchap", "\printsec" a +"\printsecc". Makra mají jeden parametr "#1", který obsahuje text titulku. +Typická struktura každého takového makra je: + +\bgroup\def\begtthook{\langleactive} +\begtt +\par +<penalta obvykle záporná, neboli bonus, pro zlomení stránky před nadpisem> +<mezera před nadpisem> +{<nastavení fontu> \noindent \dotocnum{<značka>}#1\nbpar} +<případné vložení značky (insertmark) pro plovoucí záhlaví> +\nobreak <mezera pod napisem> +\endtt +\par\egroup + +Pro realizaci maker "\printchap", "\printsec" a "\printsecc" může autor +návrhu využít následujících interních maker OPmac: + +\begitems +\item* "\dotocnum{<značka>}" -- umístí cíle odkazů, zařídí obsah, vytiskne "<značku>" +\item* "\thetocnum" -- "<značka>", např. 3.2.4 pro secc, 3.2 pro sec a 3 pro chap +\item* "\insertmark{<text>}" -- vloží "\mark" s expandovaným "\thetocnum" + a neexpandovaným "<textem>" +\item* "\nbpar" -- jako "\par", ale mezi řádky je nezlomitelná mezera +\item* "\remskip<velikost>" -- mezera (pod nadpisem) odstranitelná + následujícím "\norempenalty" +\item* "\norempenalty<číslo>" -- vloží penaltu "<číslo>" jen pokud nepředchází + "\remskip" +\enditems + +Aby fungoval obsah a cíle odkazů, je {\it nutné\/} použít "\dotocnum". +Parametr makra "\dotocnum" nemusí obsahovat jen "\thetocnum", ale také +tečky a mezery kolem "<značky>". Předchází-li "\nonum", makro "\dotocnum" +nevytiskne celý svůj druhý prametr, tedy včetně případného \uv{okolí} +značky. Návrh tisku sekce může vypadat takto: + +\begtt +\def\printsec#1{\par + \norempenalty-500 + \vskip 12pt plus 2pt + {\secfont \noindent \dotocnum{\thetocnum\quad}#1\nbpar}% + \placemark{#1}% + \nobreak \remskip 6pt plus 1pt +} +\endtt +V tomto návrhu bude nad nadpisem penalta $-500$ (bonus za zlomení nad +nadpisem), dále je "12pt" mezera, pak je titulek "#1" vytištěný fontem +"\secfont". Před tímto titulkem je číselná značka oddělená od titulku +mezerou "\quad". Titulek může být na více +řádcích. Protože je ukončen "\nbpar", nebude povolen mezi jednotlivými řádky +titulku řádkový zlom. + +Vysvětlíme si nyní na příkladu činnost a smysl "\remskip" a "\norempenalty". +Předpokládejme pro ilustraci definici "\printsec", jako je uvedená výše. +Pokud je dále třeba definice podsedkce "\printsecc" zahájena příkazy + +\begtt +\par \norempenalty-200 \vskip 8pt plus2pt +\endtt +% +pak se mohou dít tyto věci: + +\begitems +\item* Následuje-li podsekce těsně za sekcí, pak se vymaže spodní mezera od sekce + "6pt plus1pt" a místo ní se vloží mezera "8pt plus2pt". Mezery se tedy + nesčítají. Navíc v tomto případě se nevloží penalta $-200$, takže mezi + sekcí a podeskcí nedojde nikdy ke stránkovému zlomu. +\item* Následuje-li za sekcí obyčejný text, pak je pod sekcí a nad textem mezera + "6pt plus 1pt", která je nezlomitelná. +\item* Předchází-li před podseskcí obyčejný text, pak se vloží před nadpisem + podsekce "\penalty-200" následovaná "\vskip 8pt plus2pt". Tato mezera je + ochotně zlomitelná (bonus $-200$), takže se může nadpis podsekce objevit na + následující straně. +\enditems + +Je možné mezeru pod nadpisem složit ze dvou druhů: + +\begtt +\def\printsec{% + ... + \nobreak \vskip 2pt \remskip 4pt plus1pt} +\endtt + +V tomto příkladě se odstraní při následující podsekci z celkové mezery +"6pt plus1pt" jen její část "4pt plus1pt". + +Defaultní hodnoty maker \db printchap, \db printsec a \db printsecc vypadají +v OPmac takto: + +\inext{printchap}{\count=3 ^^B\cbrace}{++} + +Příkazem "\firstnoindent" dávají tato makra najevo, +že následující odstavec nebude mít odstavcovou zarážku. + +Makro pro titul \db tit počítá s tím, že bude titul na více řádcích. Sází ho +tedy jako odstavec s~pružnými "\leftskip" a "\rightskip". Příkaz "\unskip" +těsně za parametrem "#1" odstraní mezeru z konce řádku, která tam obvykle +je. Teprve poté je nadpis řádně centrován. + +\inext{tit}{^^B\cbrace}{++} + Fonty pro titul, kapitoly a sekce \db titfont, \db chapfont, \db secfont a \db seccfont jsou definovány jako odpovídající zvětšení a nastavení tučného duktu. @@ -566,34 +692,73 @@ kurzívu. \inext{titfont}{\empty}{+-} -Pro číslování kapitol, sekcí a podsekcí potřebujeme čítače: +V další části této sekce je implemantace 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 chapnum \dgn \nb secnum \dgn \nb seccnum \dgn \nb nonumnum -\inext{newcount}{\empty}{+-} +\inext{newcount}{newcount}{++} -Makro pro titul \db tit počítá s tím, že bude titul na více řádcích. Sází ho -tedy jako odstavec s~pružnými "\leftskip" a "\rightskip". Příkaz "\unskip" -těsně za parametrem "#1" odstraní mezeru z konce řádku, která tam obvykle -je. Teprve poté je nadpis řádně centrován. +Makro \db notoc je možno použít jako prefix před "\chap", "\sec", "\secc" s +tím, že se kapitola, sekce, podsekce nedostane do obsahu. Makro +\db nonum je možnot použít jako prefix před stejnými makry s tím, že +kapitola, sekce, podsekce nebude mít číslo. I nečíslovaní kapitola se může +dostat do obsahu. Je-li obsah klikací, pořebuje mít svoje referenšní číslo +pro vytvoření linku. K tomu slouží registr "\nonumnum". -\inext{tit}{^^B\cbrace}{++} +\inext{notoc}{\empty}{+-} Makra \db chap, \db sec a \db secc nastaví odpovídající čítače, dále vytvoří číslování pro tisk (sestávající z více čísel) v makrech \db thechapnum, -\db thesecnum a \db theseccnum a zavolají odpovídající makro "\printchap", +\db thesecnum a \db theseccnum. Aktuální čítač má vždy název \db thetocnum. +S touto hodnotou (nazávisle na tom, zde jde o kapitlu, sekci nebo podsekci, +bude pracovat "\dotocnum". Dále makra připraví obsah makra \db dotocnumafter, +což je proměnlivá část makra "\dotocnum". +Konečně uvedená makra "\chap", "\sec" a "\secc" +zavolají odpovídající makro "\printchap", "\printsec" a "\printsecc". -Poté zavolá "\wlabel" na -propojení případného labelu s číslem kapitoly/sekce/podsekce a -pomocí \db wcontents uloží do "\reffile" potřebná data pro obsah.\par\vskip-1pt -\inext{chap}{\empty}{+-} +\inext{chap}{\count=3 ^^B\cbrace}{++} + +V proměnlivé části makra "\dotocnum", tedy v "\dotocnumafter", se řeší +uložení informací o kapitole, sekci nebo podsekci do obsahu. K tomu je +využito makro \db wcontents, které provede +\bgroup\def\begtthook{\langleactive} +\begtt +\write\reffile{\string#1{<expandovaný thetocnum>}{#2}{\the\pageno}} +\endtt +\par\egroup + +\inext{wcontents}{^^B\cbrace}{++} + +Makro \db dotocnum "{<text>}" umístí cíl odkazu do místa, které je od +účaří vzdáleno o "\destheight". Toto místo se kryje s horní hranou okna +prohlížeče po kliknutí na odkaz. Dále toto makro vygeneruje data pro obsah +pomocí předpřipraveného "\dotocnumafter". +Pokud předchází "\notoc", makro nezapíše nic do obsahu. Pokud předchází +"\nonum", makro nevytiskne svůj parametr, takže je titulek bez čísla. +Dále v~takovém případě je pro hyperlinkové odkazy číslo "\nonumnum" uvozeno +vykřičníkem, což navazuje v~obsahu na makro "\toclinkA". + +\inext{dotocnum}{^^B\cbrace}{++} + +V makrech "\chap", "\sec", "\secc" je po zavolání "\printchap", "\printsec" +nebo "\printsecc" voláno \db resetnonunotoc, které vrátí hodnotu přepínačů +"\ifnonum" a "\ifnotoc" na imlicitní hodnoty. Tím je zaručeno, že makra +"\nonum" a "\notoc" ovlivní jen následující kapitolu, sekci nebo podsekci +a fungují jako prefixy. Makro navíc kvůli přechodu na verzi OPmac Jul. 2013 +kontroluje, zda makra "\printchap", "\printsec" a "\printsecc" skutečně +použila makro "\dotocnum". Pokud ne, náležitě na to upozorní. + +\inext{resetnonumnotoc}{^^B\cbrace}{++} Text titulu sekce a její číslo jsou vloženy do "\mark", takže tyto údaje můžete použít v plovoucím záhlaví. Tato vlastnost není dokumentována v -uživatelské části, protože je poněkud techničtějšího charakteru. Makro \db -insertmark "\thesecnum{<text>}" vloží do "\mark" data ve formátu -"{<secnum>} {<text>}", takže je možno je použít přímo expanzí např. +uživatelské části, protože je poněkud techničtějšího charakteru. + +Makro \db insertmark "{<text>}" vloží do "\mark" data ve formátu +"{<thetocnum>} {<text>}", +takže je možno je použít přímo expanzí např. "\firstmark", nebo je oddělit a zpracovat zvlášť. Parametru "<text>" je zabráněna expanze pomocí protažení tohoto parametru přes "\toks", viz TBN str. 54 dole a strany 55--57. Příkaz "\mark" se totiž snaží o expanzi. @@ -616,11 +781,19 @@ třeba v okamžiku, kdy je zapnutá jiná velikost písma. Pokud chcete kombinovat na levých a pravých stránkách plovoucí záhlaví z kapitol a sekcí, inspirujte se v TBN na stranách 259 a 260. -Makra \db printchap, \db printsec a \db printsecc vytisknou číslo a titul -kapitoly, sekce resp. podsekce. Příkazem "\firstnoindent" dávají najevo, -že následující odstavec nebude mít odstavcovou zarážku. +Makro \db remskip "<velikost>" je implimentováno jako "\vskip<velikost>" +následované smluvenou nezlomitelnou penaltou 11333. Makro \db norempenalty +pak podle této hodnoty poslední penalty v seznamu větví svou činnost. +V registru \db remskipamount je uložena naposledy vložená mezera z "\remskip". + +\inext{remskip}{\empty}{+-} -\inext {printchap}{\count=3 ^^B\cbrace}{++} +Makro \db othe pracuje stejně jako primitiv "\the" s tím rozdílem, že +nezobrazí nic (a sejme následující tečku), pokud je hodnota registru nulová. +Tímto způsobem lze tisnout dokument jen se sekcemi bez kapitol. Číslo +kapitoly se pak nezobrazuje jako "0.", protože se nezobrazuje vůbec. + +\inext{othe}{\empty}{+-} Makro \db afternoindent potlačí odstavcovou zarážku pomocí přechodného naplnění "\everypar" kódem, který odstraní box vzniklý z "\indent" a @@ -639,6 +812,9 @@ Tomuto makru později v "\output" rutině změníme význam na mezeru. \inext{nbpar}{\empty}{+-} + + + \subsec Popisky, rovnice %%%%%%%%%%%%%%%%%%%%%%%% @@ -654,13 +830,22 @@ Výchozí hodnoty maker, které se vypisují v místě generovaného čísla jsou: Makro \db caption "/<typ> " zvedne čítač "\<typ>num" o jedničku, dále nastaví pružné mezery s odsazením "\iindent" a s centrováním posledního řádku (viz TBN str.~234), propojí pomocí "\wlabel" číslo s případným -lejblíkem, vytiskne slovo Tabulka/Obrázek v závislosti na jazyku makrem -"\mtext", vytiskne číslo "\the<typ>num" a zpracuje odstavec s nastavenými -"\leftskip", "\rightskip". Předefinuje "\par" tak, že první výskyt prázdného -řádku ukončí skupinu a tím se všechna nastavení vrátí do původního stavu. +lejblíkem a vytiskne zahájení popisku makrem "\printcaption". +Makro "\caption" tím končí svou činnost a dále je zpracován +odstavec s~nastavenými +"\leftskip", "\rightskip". Sekvence "\par" je předefinována tak, že první výskyt +"\par" (alias prázdného řádku) ukončí skupinu a tím se všechna nastavení +vrátí do původního stavu. \inext{caption}{^^B\cbrace}{++} +Makro \db printcaption "{<slovo>}{<číslo>}" vytiskne zahájení popisku +tabulky a obrázku. Za číslem implicitně není žádná interpunkce, jen +"\enspace". Je možné předefinovat "\printcaption" s interpunkcí třeba takto: +"\def\printcaption#1#2{{\bf#1 #2:}\space}" + +\inext{printcaption}{\empty}{+-} + Makro \db eqmark zvedne "\dnum" o jedničku. V display módu pak použije primitiv "\eqno", za kterým následuje "\thednum". V interním módu (v boxu) vytiskne jen "\thetnum". @@ -743,6 +928,13 @@ upozorní o tom adekvátním způsobem na terminál. \inext{maketoc}{\empty}{+-} +Makro \db toclinkA je citlivé na vykřičník jako první znak argumentu. Pokud +tam je, vytiskne jen mezeru velikosti 0.8em, jinak vytiskne argument. +Vykřičník do argumentu dáme v případě kapitol a sekcí prefixovaných +jako "\nonum". V obsahu pak nechceme mít žádné číslo, jen příslušnou mezeru. + +\inext{toclinkA}{\empty}{+-} + \subsec Sestavení rejstříku %%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -917,10 +1109,12 @@ Makro \uv{print index item} \db printii "<heslo>&" vytiskne jeden údaj do rejstříku. Makro projde prostřednictvím \db printiiA jednotlivá podslova oddělená lomítkem a přepíše je do rejstříku odděleny mezerou. Přitom kontroluje, zda se podslova rovnají odpovídajícím podslovům z předchozího -hesla, které je uloženo v \db previi. Pokud ano, místo podslova vloží \db -iiemdash, což je pomlka. Na konci činnosti se spustí makro \db printiiB, -které nastaví "\previi" na \db currii (nové slovo se pro další zpracování stává -předchozím) a vytiskne seznam stránek. Makrem \db everyii +hesla, které je uloženo v \db previi. Toto porovnání je protaženo krz +"\meaning", protože nechceme porovnávat kategorie, ale jen stringy. +Pokud se stringy rovnají, místo podslova se vloží \db +iiemdash, což je pomlka. Na konci činnosti se +nastaví "\previi" na \db currii (nové slovo se pro další zpracování stává +předchozím) a vytiskne se seznam stránek. Makrem \db everyii (implicitně je prázdné) dovolíme uživateli vstoupit do procesu tisku hesla. Může například psát "\def\everyii{\indent}", pokud chce. @@ -1213,16 +1407,9 @@ Pak pokračuje ve čtení sazby. \inext{flushcolumns}{\empty}{+-} - -\subsec Barvy -%%%%%%%%%%%%% - -Deklarujeme \db ifpgcolor, což budeme potřebovat v makru "\locpgcolor". -Dále deklarujeme \db lastpage. Tento registr budeme průběžně zvětšovat při -čtení REF souboru v makru "\Xpage" a na konci čtení REF souboru tedy bude -obsahovat číslo poslední strany. - -\inext{ifpgcolor}{\empty}{+-} + +\subsec [barvy] Barvy +%%%%%%%%%%%%%%%%%%%%% Od verze pdf\TeX{}u 1.40 nabízí tento program primitivy "\pdfcolorstackinit" a "\pdfcolorstack". Makra v OPmac tyto @@ -1233,12 +1420,19 @@ primitivy nepoužívají, protože: 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é. -\item * Barevné řešení v "pdftex.def" pro La\TeX{} nepovažuji za koncepčně - správné, protože se snaží pomocí "\aftergroup" vytvořit zdání, že - barvy fungují lokálně uvnitř skupiny. To je zbytečná komplikace - navíc, která jde proti přirozenosti nastavování barev v PDF souboru. \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 @@ -1247,49 +1441,170 @@ 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 "\special" pro nastavení barvy nevloží. + +\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ě (v makru "\prepage") +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í REF souboru a asynchronního "\write". Proto makro \db -setcmykcolor nevkládá do PDF jen požadovaný speciál, ale taky ukládá o sobě -informaci do REF souboru. Jakmile se při čtení REF souboru objeví "\Xpage", -zkontrolujeme, zda naposledy nastavená barva byla černá. Pokud ne, dáme -pokyn makru "\prepage" prostřednictvím makra "\pg:<číslo strany>", aby -aktivovalo hned po "\headline" barvu naposledy nastavenou. To je tedy -základní idea, nyní implementace: +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>}". -\inext{ifpdftex}{\count=2 \empty}{+-} +\inext{writecolor}{^^B\cbrace}{++} Makro \db pdfK má implicitně hodnotu "k" (barva pro texty a plochy) a -přechodně při použití \db linecolor má hodnotu "K". Právě nastavenou barvu -pak makro "\setcmykcolor" uloží do REF souboru. -Jen tehdy, když je explicitně -známo, že barva nepřeteče do další strany, je možné použít před použitím -přepínače barvy prefix \db locpgcolor, který potlačí v takovém případě tisk -informací do REF souboru. Následně budou potlačeny zápisy informací do REF souboru -všech barevných přepínačů až po "\Black" včetně. Další barevné přepínače (po -"\Black") se chovají už normálně. -Toto opatření je zde jen proto, aby byl REF soubor -poněkud menší a přehlednější i v případě, kdy navrhujeme bohatě barevný dokument. - -Makra \db Xpdfcolork a \db XpdfcolorK udržují při čtení REF souboru -informaci o naposledy vložené barvě v makrech \db pdflastcolork a -\db pdflastcolorK (název koresponduje typu barvy). - -\inext{Xpdfcolork}{\empty}{+-} - -Output rutina vkládá na každé stránce do REF souboru -\db Xpage "{<číslo strany>}". -Toto makro při čtení REF souboru kontroluje, zda byla naposledy použita -na předcházející straně barva černá. Pokud ne, přidá do makra -"\pg:<číslo strany>" pokyn pro nastavení barvy ve tvaru -\db setpgcolor "<k nebo K>{<čísla barvy>}". -Toto makro se spustí v output rutině na straně "<číslo strany>" -za "\headline", ale před sestavením boxu s textem. - -\inext{Xpage}{\empty}{+-} +přechodně při použití \db linecolor "<přepínač barvy>" má hodnotu "K". + +\inext{pdfK}{\empty}{+-} + +Výchozí hodnoty maker "\currcolork" a "\currcolorK" jsou rovny barvě černé, +neboli makru \db pdfblackcolor. + +\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}{+-} + +Č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ý +"\special" 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}{+-} + +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>}". + +\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}{+-} 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ž @@ -1307,16 +1622,19 @@ využity PDF transformace souřadnic. \subsec Klikací odkazy %%%%%%%%%%%%%%%%%%%%%% -Makro \db destactive "[<typ>:<lejblík>]{<výška>}" založí cíl odkazu jen tehdy, když +Makro \db destactive "[<typ>:<lejblík>]" založí cíl odkazu jen tehdy, když je "<lejblík>" neprázdný. Ve vertikálním módu se nalepí na předchozí box díky "\prevdepth=-1000pt" a po vložení boxu s cílem vrátí hodnotu "\prevdepth" do původního stavu, aby následující box byl správně řádkován. -V horizontálním módu postě vloží "\destbox". Makro -\db destbox "[<typ>:<lejblík>]{<výška>}" vytvoří box nulové výšky a z~něj -vystrčí nahoru cíl klikacího odkazu vzdálený od účaří o "<výška>". Interně +V horizontálním módu prostě vloží "\destbox". Makro +\db destbox "[<typ>:<lejblík>]" vytvoří box nulové výšky a z~něj +vystrčí nahoru cíl klikacího odkazu vzdálený od účaří o "\destheight". Interně použije pdf\TeX{}ový primitiv "\pdfdest" s parametrem "xyz", což -charakterizuje obvyklou možnost chování PDF prohlížeče při odskoku na cíl. -Podrobněji viz manuál k~pdf\TeX{}u. +charakterizuje obvyklou možnost chování PDF prohlížeče při odskoku na cíl. +Podrobněji viz manuál k~pdf\TeX{}u. PDF prohlížeče většinou +lícují horní hranu okna přesně s~místem cíle, je tedy +potřeba cíl umístit poněkud výše, abychom viděli i odkazovaný text. +K~tomu právě slouží registr \db destheight. \inext{dest}{\empty}{+-} @@ -1324,6 +1642,24 @@ V uživatelské dokumentaci je zmíněno místo "\destactive" makro \db dest se stejnými parametry. Toto makro je implicitně prázdné a tedy nečiné. Teprve "\hyperlinks" je přinutí k činnosti. +Někdy je účelné v režimu \uv{draft} dokumentu tisknout v místě cílů odkazů +jména lejblíků, aby autor viděl, jaké lejblíky použil a lépe se mu dílo +modifikovalo. Stačí předefinovat pro tento režim makro +"\destbox" třeba takto: + +\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 + \else \vss \fi\fi}} +\endtt + +Při tomto řešení budou lejblíky z "\label" tištěny nahoru v místě cíle +zatímco lejblíky z~"\bib" a "\bibitem" budou tištěny vedle položky se seznamem +literatury. V obou případech budou lejblíky zelené a díky "\llap" neovlivní +polohu ostatní sazby. + Klikací text vytvoří makro \db link "[<typ>:<lejblík>]{<barva>}{<text>}". Makro používá pdf\TeX{}ový primitiv "\pdfstartlink", ve kterém je vymezena výška a hloubka @@ -1336,16 +1672,11 @@ vytiskne aktivní "<text>" a přepne zpět na černou barvu. Pdf\TeX{}ový primitiv Makro \db urllink "[<typ>:<lejblík>]{<text>}" pracuje analogicky jako "\link". Jen navíc přidává některé atributy do PDF výstupu a pracuje s barvou "\urlcolor". +Toto makro vytvoří externí odkaz. Je použito v~makru "\url" +prostřednictvím makra "\ulink". \inext{urllink}{^^B\cbrace}{++} -Makro \db url "{<odkaz>}" vysází "<odkaz>" strojopisem, přičemž znak "/" je -na přechodnou dobu aktivní a definován jako "\\". Toto makro při sestavování -externího odkazu zpětně expanduje na normální "/", ale při sazbě expanduje -na "\discretionary", aby bylo možné v něm rozdělit sazbu do více řádků. - -\inext{url}{\empty}{+-} - Makra \db toclink, \db pglink, \db citelink, \db reflink, \db ulink, která se specializují na určitý typ linku, implicitně nedělají nic: @@ -1353,7 +1684,7 @@ specializují na určitý typ linku, implicitně nedělají nic: Ovšem po použití makra \db hyperlinks "{<barva-lok>}{<barva-url>}" se uvedená makra "\toclink", "\pglink", "\citelink" a "\reflink" probouzejí k -životu: +životu. Zde je také definováno makro \db urlcolor. \inext{hyperlinks}{\empty}{+-} @@ -1370,6 +1701,49 @@ deaktivovat: \inext{ifpdftex}{\empty}{+-} +Makro \db url "{<text>}" se používá k tisku URL. Vytiskne "<text>" fontem +\db urlfont, přitom kolem znaků lomítko, tečka a dalších přidává nulovou +mezeru s dodatečnou mírnou roztažitelností \db urlskip. Mezera vpravo od +těchto znaků je navíc zlomitelná s penaltou definovanou v makru \db +urlbskip. Dvojité lomítko \db urlslashslash má zlomitelnou mezeru jen na +konci. + +\inext{url}{\empty}{+-} + +Je třeba vysvětlit, proč je v makru "\urlskip" použito "\null", neboli +"\hbox{}". Tento box se přilepí na předchozí slovo a tím zakážeme toto slovo +dělit podle vzorů dělení slov. Spojovník při rozděleném slovu je totiž pro +čtenáře matoucí: nemůže vědět, zda je nebo není součástí URL. + +Makro "\url{<text>}" pracuje tak, že uloží "<text>" do "\tmpb" a nechá +vyměnit příslušné znaky uvnitř "\tmpb" pomocí "\replacestrings". +Nakonec vytiskne "<text>" prostřednictvím "\ulink". + +Aktivní vlnku lze v "<textu>" vyměnit za "\char`\~". Podobně lze řešit +některé další znaky, ale ne všechny: procento, backlash. +U těchto znaků bychom nejprve museli vyměnit jejich +kategorie. Pak by ale makro "\url" nefungovalo uvnitř parametrů jiných +maker. V zájmu jednoduchosti makra "\url" to neděláme. Takže pokud uživatel +má v URL znak procento, nahradí ho sekvencí "\percent" manuálně a pokud tam má +další speciální znak, vyřeší to podobným makrem jako "\percent". + +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". + +\inext{replacestring}{\empty}{+-} + +Na konci "<textu>" je vložena sekvence "\/", která jej odděluje od přidaného +"<string1>". Kdybychom ji 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á sekvence "\/" zase odstraněna. + \subsec Outlines -- obsah v záložce PDF dokumentu %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1696,15 +2070,14 @@ nepřečnívala, ale byla obsažena v~hloubce výsledného boxu. \subsec Vložení obrázku %%%%%%%%%%%%%%%%%%%%%%% -Nejprve deklarujeme \db picw. +Nejprve deklarujeme \db picwidth a \db picheight. Z důvodu zpětné +kompatibility je dále ztotožněn "\picwidth" se sekvencí \db picw. \inext{picw}{\empty}{+-} Makro \db inspic je zkratka za použití primitivů "\pdfximage", "\pdfrefximage" a "\pdflastximage". Kdo si to má pořád pamatovat. Není-li aktivován PDF výstup, napíšeme jen varování a neprovedeme nic. -Pokud budeme pracovat se stejnými obrázky v jednom dokumentu, bude -vhodné možnosti primitivů využít naplno. \inext{ifpdftex}{\empty}{+-} @@ -1797,9 +2170,18 @@ Makru \db Xfnote tedy stačí pozvednout \inext{Xfnote}{\empty}{+-} +Makro \db runningfnotes vypne lokální číslování poznámek na každé stránce. +Místo toho se budou poznámky číslovat podle registru "\fnotenum". Ten se +zvětšuje o jedničku v celém dokumentu. Chcete-li mít poznámky číslované +zvlášť například v každé kapitole, je nutno navíc resetovat tento čítač +například pomocí "\addto\chaphook{\global\fnotenum=0}". + +\inext{runningfnotes}{\empty}{+-} + Registr \db mnotenum. globálně čísluje okrajové poznámky a plní podobnou funkci, jako registr -"\fnotenum" pro podčárové poznámky. +"\fnotenum" pro podčárové poznámky. Registr \db mnoteskip udává hodnotu +vertikálního posunu poznámky. \inext{mnotenum}{\empty}{+-} @@ -2061,20 +2443,27 @@ 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. +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 dva problémy: +Řeší tyto tři problémy: \begitems \item * Místo přímého "\shipout" nechá nejprve box sestavit jako "\box0", - pak provede "\protectlist" a pak provede "\shipout\box0". -\item * Mezi "\makeheadline" a "\pagebody" vkládá "\prepage". + pak provede "\protectlist" a pak provede "\shipout\box0". Tím jsou + zabezpečeny tzv. protektované příkazy při "\write". +\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). \enditems -První úprava zabrání expanzi maker přidaných pomocí "\addprotect" v době +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ě @@ -2083,25 +2472,33 @@ 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. -\inext{opmacoutput}{\empty}{+-} +\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. -Druhá úprava vkládá makro \db prepage, které zajistí tisk stránkové číslice -do "\reffile" (to je docela užitečné) a kromě toho nastaví správnou barvu -textu strany pomocí PDF speciálu. +\inext{begoutput}{\empty}{+-} -\inext{prepage}{\empty}{+-} +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. -Když budou barvy přecházet na další stranu, jistě nechceme mít obarvenu -stránkovou číslici. Je tedy potřeba do \db footline vložit "\Black". Když -bude uživatel měnit velikost fontů v dokumentu, jistě nechce mít +\inext{catcode}{\empty}{+-} + +Když bude uživatel měnit velikost fontů v dokumentu, jistě nechce mít stránkovou číslici pokaždé jinak velkou. Proto je do "\footline" vloženo "\thefontsize". Je nastaveno pevně na 10pt. Předpokládáme, že pokud bude -někdo chtít jinak velkou stránkovou číslici, jednoduže si "\footline" +někdo chtít jinak velkou stránkovou číslici, jednoduše si "\footline" nastaví podle svého. Jinak je "\footline" shodná s původním nastavením v~plain\TeX{}u. \inext{footline}{\empty}{+-} - + \subsec Okraje %%%%%%%%%%%%%% @@ -2134,7 +2531,7 @@ 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>/" a k tomu musí +\db setpagedimensA "(<šířka>,<výška>)<jednotka>&", k~to\-mu musí dopředu vyexpandovat obsah makra "\pgs:<formát>". To provedeme pomocí tří "\expandafter". |