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 | |
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')
-rw-r--r-- | Master/texmf-dist/doc/cstex/opmac-d.pdf | bin | 644772 -> 724033 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/cstex/opmac-d.tex | 639 | ||||
-rw-r--r-- | Master/texmf-dist/doc/cstex/opmac-u.pdf | bin | 252876 -> 256121 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/cstex/opmac-u.tex | 128 | ||||
-rw-r--r-- | Master/texmf-dist/doc/cstex/pdfuni-article.pdf | bin | 0 -> 117791 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/cstex/pdfuni-article.tex | 515 |
6 files changed, 1109 insertions, 173 deletions
diff --git a/Master/texmf-dist/doc/cstex/opmac-d.pdf b/Master/texmf-dist/doc/cstex/opmac-d.pdf Binary files differindex 3c591cee1fa..86c9b4b4dc8 100644 --- a/Master/texmf-dist/doc/cstex/opmac-d.pdf +++ b/Master/texmf-dist/doc/cstex/opmac-d.pdf 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". diff --git a/Master/texmf-dist/doc/cstex/opmac-u.pdf b/Master/texmf-dist/doc/cstex/opmac-u.pdf Binary files differindex b5103bc1c31..7d36ffb3686 100644 --- a/Master/texmf-dist/doc/cstex/opmac-u.pdf +++ b/Master/texmf-dist/doc/cstex/opmac-u.pdf diff --git a/Master/texmf-dist/doc/cstex/opmac-u.tex b/Master/texmf-dist/doc/cstex/opmac-u.tex index bd679271be8..2389ef9be78 100644 --- a/Master/texmf-dist/doc/cstex/opmac-u.tex +++ b/Master/texmf-dist/doc/cstex/opmac-u.tex @@ -5,6 +5,7 @@ \chyph % use (pdf)csplain \input opmac +\input pdfuni \typosize[11/13] @@ -24,10 +25,9 @@ \bigskip \centerline{\url{http://petr.olsak.net/opmac.html}} -\def\thesecnum{}\printsec{\unskip Obsah} \maketoc +\notoc\nonum \sec Obsah\par\maketoc - -\sec Ăvod +\nonum \sec Ăvod %%%%%%%%% OPmac je balĂk jednoduchĂ˝ch doplĹujĂcĂch maker k plain\TeX{}u umoĹžĹujĂcĂ @@ -225,6 +225,8 @@ JestliĹže je nĂĄzev kapitoly, sekce nebo podsekce pĹĂliĹĄ dlouhĂ˝, rozlomĂ se 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". \label[cislovani] \sec DalĹĄĂ ÄĂslovanĂŠ objekty a odkazy na nÄ @@ -246,7 +248,7 @@ Je-li potĹeba oÄĂslovat jednĂm ÄĂslem vĂce rovnic sestavenĂ˝ch pomocĂ \begtt $$ - \eqalignno{a^2+b^2 &= c^2 \cr + \eqalignno{a^2+b^2 &= c^2 \cr c &= \sqrt{a^2+b^2} & \eqmark \cr} $$ \endtt @@ -269,8 +271,7 @@ prĂĄzdnĂ˝m ĹĂĄdkem. PĹĂklad: 1--6 & projevujĂcĂ se \cr 6--12 & vĂ˝raznĂĄ \cr 12--20 & extrĂŠmnĂ \cr - 20--40 & mĂrnÄjĹĄĂ \cr - 40--60 & rĹŻznĂĄ \cr + 20--60 & mĂrnÄjĹĄĂ \cr 60--$\infty$ & umĂrnÄnĂĄ} % vytvoĹenĂ tabulky \par\nobreak\medskip \caption/t ZĂĄvislost zĂĄvislosti na poÄĂtaÄĂch na vÄku. @@ -285,8 +286,7 @@ Tato ukĂĄzka vytvoĹĂ: 1--6 & projevujĂcĂ se \cr 6--12 & vĂ˝raznĂĄ \cr 12--20 & extrĂŠmnĂ \cr - 20--40 & mĂrnÄjĹĄĂ \cr - 40--60 & rĹŻznĂĄ \cr + 20--60 & mĂrnÄjĹĄĂ \cr 60--$\infty$ & umĂrnÄnĂĄ} \par\nobreak\medskip \caption/t ZĂĄvislost zĂĄvislosti na poÄĂtaÄĂch na vÄku. @@ -444,14 +444,11 @@ 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 prvnĂm zjevenĂ obsahu se mohou strĂĄnky posunout jinam. -Nadpis pro obsah vÄtĹĄinou nebudeme psĂĄt pomocĂ "\chap" nebo "\sec", protoĹže -by se Ăşdaj o~obsahu dostal do obsahu, coĹž obvykle nenà ŞådoucĂ. Je proto -potĹeba pouĹžĂt vnitĹnĂho makra "\printsec" a pĹed jeho pouĹžitĂm vyprĂĄzdnit -obsah "\thesecnum", abychom nemÄli tuto sekci ÄĂslovanou. TakĹže obsah -vyrobĂme tĹeba takto: +Titulek k obsahu by nemÄl bĂ˝t ÄĂslovanĂ˝ a nemÄl by se zjevit v obsahu, takĹže +jej zapĂĹĄeme tĹeba pomocĂ \begtt -\def\thesecnum{}\printsec{\unskip Obsah}\maketoc +\nonum\notoc\sec Obsah \endtt Tituly kapitol, sekcĂ a podsekcĂ zapisuje OPmac pro ĂşÄely sestavenĂ obsahu do @@ -594,12 +591,12 @@ Funkci si vysvÄtlĂme na pĹĂkladu: \begtt \iis chikvadrat {$\chi$-kvadrĂĄt} \iis relax {{\tt \char`\\relax}} -\iis Geodelova/vÄta/o~neĂşplnosti {G\"odelova/vÄta/o~neĂşplnosti} -\iis vÄta/o~neĂşplnosti/Geodelova {vÄta/o~neĂşplnosti/G\"odelova} +\iis Goedelova/vÄta/o~neĂşplnosti {G\"odelova/vÄta/o~neĂşplnosti} +\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 -"\ii Geodelova/vÄta/o~neĂşplnosti,@". +"\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 materiĂĄl, @@ -638,9 +635,19 @@ TakĹže tĹeba "\ii Ernst~@~Young" pro ĹazenĂ a 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. - -Barvu textu mĹŻĹžete nastavit pomocĂ pĹepĂnaÄĹŻ "\Blue", "\Red", "\Brown", -"\Green", "\Yellow", "\White", "\Grey" a "\Black". Je potĹeba si uvÄdomit, Ĺže tyto +% +Barvu textu mĹŻĹžete nastavit pomocĂ pĹepĂnaÄĹŻ +{\localcolor\Blue "\Blue"}, +{\localcolor\Red "\Red"}, +{\localcolor\Brown "\Brown"}, +{\localcolor\Green "\Green"}, +{\localcolor\Yellow "\Yellow"}, +{\localcolor\Cyan "\Cyan"}, +{\localcolor\Magenta "\Magenta"}, +{"\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 @@ -651,7 +658,7 @@ sprĂĄvnĂĄ barva i na nĂĄsledujĂcĂch strĂĄnkĂĄch. Tuto skuteÄnost si totiĹž 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Ĺž 1pt. Tento \uv{druh +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 @@ -659,7 +666,7 @@ 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ĂŠ. \def\podbarvi#1#2#3{\setbox0=\hbox{#3}\leavevmode - \rlap{#1\strut\vrule width\wd0}#2\box0\Black} + {\localcolor\rlap{#1\strut\vrule width\wd0}#2\box0}} 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 @@ -667,15 +674,18 @@ definovĂĄny:\par\nobreak \begtt \def\Red{\setcmykcolor{0.0 1.0 1.0 0}} -\def\Brown{\setcmykcolor{0 0.67 0.67 0.5}} -... +\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:} \begtt \def\podbarvi#1#2#3{\setbox0=\hbox{#3}\leavevmode - \rlap{#1\strut\vrule width\wd0}#2\box0\Black} + {\localcolor\rlap{#1\strut\vrule width\wd0}#2\box0}} \podbarvi\Yellow\Brown{Tady je hnÄdĂ˝ text na ĹžlutĂŠm pozadĂ.} \endtt @@ -724,28 +734,34 @@ urÄuje, jakĂ˝ch odkazĹŻ se to tĂ˝kĂĄ. PĹĂklad: ImplicitnÄ tato makra nejsou definovĂĄna, coĹž znamenĂĄ, Ĺže se rĂĄmeÄky netvoĹĂ. ManuĂĄlnÄ je moĹžno vytvoĹit cĂl odkazu makrem -"\dest[<typ>:<lejblĂk>]{<výťka>}" -a klikacĂ text makrem "\link[<typ>:<lejblĂk>]{<color>}{<text>}". -Parametr <typ> je typ odkazu (toc, pg, cite, ref nebo dalĹĄĂ). Parametr -<výťka> urÄuje vzdĂĄlenost cĂle nad ĂşÄaĹĂm. ProtoĹže PDF prohlĂĹžeÄe vÄtĹĄinou -lĂcujĂ hornĂ hranu okna pĹesnÄ s mĂstem cĂle, je potĹeba cĂl umĂstit ponÄkud výťe, -abychom vidÄli i odkazovanĂ˝ text. +"\dest[<typ>:<lejblĂk>]" +a klikacĂ text mak\-rem "\link[<typ>:<lejblĂk>]{<color>}{<text>}". +Parametr <typ> je typ odkazu (toc, pg, cite, ref nebo dalĹĄĂ). Makro "\url" vytiskne odkaz do internetu. PĹĂklad: "\url{http://petr.olsak.net}" vytvoĹĂ \url{http://petr.olsak.net}. Text je psĂĄn strojopisem a mĹŻĹže se lĂĄmat do ĹĂĄdkĹŻ za lomĂtky. Je-li nastaveno "\hyperlinks", stĂĄvĂĄ se tento text aktivnĂm vnÄjĹĄĂm odkazem. +VyskytujĂ-li se v~argumentu "\url" znaky +"%", "\", "#", "$", "{" a "}", je tĹeba pouĹžĂt +"\%", "\\", "\#", "\$", "\{" a "\}". +OstatnĂ speciĂĄlnĂ znaky "~", "_", "^", "&" lze napsat do parametru "\url" +pĹĂmo. Obsah dokumentu se dĂĄ pĹesunout do levĂŠ zĂĄloĹžky PDF prohlĂĹžeÄe tak, Ĺže klikĂĄnĂm na nÄj se pĹechĂĄzĂ v~dokumentu na poĹžadovanĂŠ mĂsto. Ve specifikaci PDF se tomu ĹĂkĂĄ \uv{outlines}. Makro, kterĂŠ uvedenou vÄc zaĹĂdĂ, se jmenuje "\outlines{<ĂşroveĹ>}". ZĂĄloĹžky budou implicitnÄ rozevĹeny do <ĂşrovnÄ> -vÄetnÄ. TakĹže pĹi <ĂşroveĹ>=0 jsou -vidÄt jen ĂşrovnÄ kapitol, pĹi <ĂşroveĹ>=1 vidĂme i sekce a pĹi -<ĂşroveĹ>$\geq$2 vidĂme rozevĹeno vĹĄechno. BohuĹžel pĂsmo v zĂĄloĹžkĂĄch typicky -nezvlĂĄdĂĄ sprĂĄvnÄ ÄeskĂĄ a slovenskĂĄ pĂsmena. Proto OPmac konvertuje texty do -zĂĄloĹžek tak, Ĺže tam jsou bez hacku a carek. Chcete-li vypnout tuto konverzi, -napiĹĄte "\def\toasciidata{}". +vÄetnÄ. TakĹže tĹeba pĹi <ĂşroveĹ>=0 jsou +vidÄt jen ĂşrovnÄ kapitol. BohuĹžel pĂsmo v~zĂĄloĹžkĂĄch typicky +nezvlĂĄdĂĄ sprĂĄvnÄ ÄeskĂĄ a slovenskĂĄ pĂsmena. +%(kĂłdovĂĄnĂ PDFDocEncoding neobsahuje ÄeskĂŠ znaky). +Proto OPmac konvertuje texty do +zĂĄloĹžek tak, Ĺže tam jsou bez hacku a carek. +%\fnote +%{Chcete-li hĂĄÄky a ÄĂĄrky zachovat, pouĹžijte doplĹkovĂŠ makro {\tt pdfuni.tex}.} +Chcete-li vypnout tuto konverzi, napiĹĄte "\def\toasciidata{}". +Chcete-li akcenty zachovat, pouĹžijte doplĹkovĂŠ makro "pdfuni.tex". SamotnĂ˝ ĹĂĄdek do zĂĄloĹžek vloĹžĂte makrem "\insertoutline{<text>}". Text v~tomto pĹĂpadÄ nepodlĂŠhĂĄ konverzi. @@ -1004,10 +1020,11 @@ TBN, kapitolu Ätvrtou. \sec VklĂĄdĂĄnĂ obrĂĄzkĹŻ %%%%%%%%%%%%%%%%%%%%% -Nejprve je potĹeba nastavit ĹĄĂĹku obrĂĄzku do registru "\picw" a pak je moĹžnĂŠ -pouĹžĂt makro "\inspic <jmĂŠno>.<pĹĂpona>". ObrĂĄzek se vloŞà jako "\hbox" danĂŠ -ĹĄĂĹky "\picw". Registr "\picw" si ponechĂĄ svou hodnotu, takĹže dalĹĄĂ obrĂĄzek -bude mĂt stejnou ĹĄĂĹku, pokud ji nezmÄnĂte. +Makro "\inspic <jmĂŠno>.<pĹĂpona><mezera>" 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 +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". ObrĂĄzek je vyhledĂĄn v adresĂĄĹi "\picdir". Toto makro je implicitnÄ prĂĄzdnĂŠ, @@ -1100,10 +1117,13 @@ je tato znaÄka zopakovanĂĄ a vedle nĂ je <text>. 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 -jedniÄkou. ÄĂsla jsou vygenerovĂĄna sprĂĄvnÄ aĹž po +jedniÄkou\fnote +{Toto chovĂĄnĂ se dĂĄ zmÄnit vloĹženĂm pĹĂkazu {\tt\char`\\runningfnotes} na +zaÄĂĄtek dokumentu. V takovĂŠm pĹĂpadÄ se poznĂĄmky ÄĂslujĂ od jednĂŠ v celĂŠm +dokumentu. DalĹĄĂ moĹžnosti ÄĂslovĂĄnĂ jsou uvedeny v technickĂŠ dokumentaci.}. +ÄĂsla jsou vygenerovĂĄna sprĂĄvnÄ aĹž po opakovanĂŠm \TeX{}ovĂĄnĂ. PĹi prvnĂm zpracovĂĄnĂ jsou mĂsto ÄĂsel otaznĂky. - ImplicitnĂ znaÄkovĂĄnĂ je moĹžnĂŠ zmÄnit pĹedefinovĂĄnĂm makra "\thefnote". NapĹĂklad po @@ -1131,8 +1151,8 @@ PĹĂklad: \par\nobreak \fnotetext{notebook}\fnotetext{scateboard}\fnotetext{jachta} \endtt % -ÄĂsla za slovy "\fnotemark" jsou vztaĹžena vzhledem k jednĂŠ tabulce a nemusejĂ -souviset se skuteÄnĂ˝m ÄĂslem poznĂĄmky. NapĹĂklad, je-li na stejnĂŠ strĂĄnce nad +ÄĂsla za slovy "\fnotemark" je tĹeba psĂĄt od jednĂŠ v kaĹždĂŠ tabulce/boxu. +NemusejĂ souviset se skuteÄnĂ˝m ÄĂslem poznĂĄmky. NapĹĂklad, je-li na stejnĂŠ strĂĄnce nad tabulkou z ukĂĄzky normĂĄlnĂ "\fnote", bude mĂt vytiĹĄtÄno ÄĂslo 1, odkazy v tabulce budou mĂt ÄĂsla~2, 3, 4 a pĹĂpadnĂĄ dalĹĄĂ poznĂĄmka pod tabulkou na stejnĂŠ strĂĄnce obdrŞà ÄĂslo 5. @@ -1155,8 +1175,13 @@ nepĹesĂĄhl "\mnotesize". NenĂ oĹĄetĹen pĹĂpad, kdy je "\mnote" vĂceĹĂĄdkovĂĄ a je umĂstÄna na ĂşroveĹ napĹĂklad poslednĂho ĹĂĄdku strany. Pak text poznĂĄmky pĹeÄuhuje ponÄkud -dolĹŻ ze strany. Je tedy nutnĂŠ "\mnote" pouĹžĂt jen na velmi krĂĄtkĂŠ poznĂĄmky a -pĹĂpadnÄ si tento jev pohlĂdat a oĹĄetĹit pĹed definitivnĂ sazbou manuĂĄlnÄ. +dolĹŻ ze strany. Nebo se poznĂĄmky mohou pĹekrĂ˝vat. +Je tedy nutnĂŠ "\mnote" pouĹžĂt jen na velmi krĂĄtkĂŠ poznĂĄmky a +pĹĂpadnÄ si tento jev pohlĂdat a oĹĄetĹit pĹi definitivnĂ sazbÄ manuĂĄlnÄ. +Pro manuĂĄlnĂ oĹĄetĹenĂ vertikĂĄlnĂ polohy poznĂĄmek slouŞà "\mnoteskip", coĹž je +registr, kterĂ˝ udĂĄvĂĄ, o kolik se mĂĄ nĂĄsledujĂcĂ poznĂĄmka (a jen ta) posunout +nahoru. PĹi zĂĄpornĂŠ hodnotÄ se posune dolĹŻ. NapĹĂklad +"\mnoteskip=2\baselineskip \mnote{<text>}" posune poznĂĄmku o~dva ĹĂĄdky výťe. \sec BibliografickĂŠ Ăşdaje @@ -1409,7 +1434,7 @@ s~výťkou sazby "\vsize". NapĹĂklad \endtt UĹživatel mĹŻĹže pĹed pouĹžitĂm "\margins" definovat vlastnĂ <formĂĄt> papĂru pomocĂ -pĹĂkazu "\sdef{pgs:<formĂĄt>}{<ĹĄĂĹka> <výťka>}". +pĹĂkazu "\sdef{pgs:<formĂĄt>}{(<ĹĄĂĹka>,<výťka>)<jednotka>}". Opmac napĹĂklad implicitnÄ definuje: \begtt @@ -1439,8 +1464,8 @@ opakovanĂŠm zpracovĂĄnĂ \TeX{}em v~registru "\lastpage". K tomu musĂ bĂ˝t otevĹen soubor REF s daty pro kĹĂĹžovĂŠ odkazy, rejstĹĂk a obsah. Pokud pracujete s tÄmito daty, je soubor REF automaticky otevĹen. Pokud ne, mĹŻĹžete si vynutit jeho otevĹenĂ pĹĂkazem "\openref". -NenĂ-li soubor REF otevĹen, je hodnota registru "\laspage" rovna nule. -PĹĂklad vyuĹžitĂ: +NenĂ-li soubor REF otevĹen, je hodnota registru "\lastpage" rovna nule. +ÄĂslovĂĄnĂ strĂĄnek ve tvaru <ÄĂslo>/<poÄet stran> zajistĂte napĹĂklad takto: \begtt \footline={\hss \rm \thefontsize[10]\the\pageno/\the\lastpage \hss} @@ -1506,6 +1531,5 @@ KlĂÄovĂĄ makra balĂku OPmac jsou struÄnÄ shrnuta v nĂĄsledujĂcĂm vĂ˝pisu. \margins/<pg> <formĂĄt> (<levĂ˝>,<pravĂ˝>,<hornĂ>,<dolnĂ>)<jednotka> % okraje \endtt - \end diff --git a/Master/texmf-dist/doc/cstex/pdfuni-article.pdf b/Master/texmf-dist/doc/cstex/pdfuni-article.pdf Binary files differnew file mode 100644 index 00000000000..56c9268bb0a --- /dev/null +++ b/Master/texmf-dist/doc/cstex/pdfuni-article.pdf diff --git a/Master/texmf-dist/doc/cstex/pdfuni-article.tex b/Master/texmf-dist/doc/cstex/pdfuni-article.tex new file mode 100644 index 00000000000..734f5cbf152 --- /dev/null +++ b/Master/texmf-dist/doc/cstex/pdfuni-article.tex @@ -0,0 +1,515 @@ + +\mubyte \edieresis ^^c3^^ab\endmubyte +\def\edieresis{\"e} +\mubyte \Edieresis ^^c3^^8b\endmubyte +\def\Edieresis{\"E} +\mubyte \ntilde ^^c3^^b1\endmubyte % mapujeme Ăą na \ntilde +\def\ntilde{\~n} % definujeme \ntilde pro bÄĹžnĂ˝ tisk + +\parindent=12pt + +\chyph +\input opmac \input pdfuni + +\hyperlinks\Blue\Green \outlines1 + +\activettchar" +\catcode`<=13 +\def<#1>{\hbox{$\langle$\it#1\/$\rangle$}} + +%\pdfunidef\tmp{\dots § t\~e_~x^\%\$tĂ\&Ä\#e\_k} +%\insertoutline{\tmp} + +\tit PDFuni -- akcenty v PDF zĂĄloĹžkĂĄch + +\centerline{\it Petr OlĹĄĂĄk}\bigskip + +ZĂĄloĹžky v PDF dokumentu (outlines, bookmarks) jsou texty, kterĂŠ za jistĂ˝ch okolnostĂ +zobrazujĂ PDF prohlĂĹžeÄe a kterĂŠ jsou klikacĂ: rozvĂrajĂ se a nabĂzejĂ +stromovou strukturu. A hlavnÄ klik na text v zĂĄloĹžce zpĹŻsobĂ skok na tomu +odpovĂdajĂcĂ mĂsto v dokumentu. ZĂĄloĹžky se nikdy netisknou. MnozĂ uĹživatelĂŠ +pdf\TeX{}u si jistÄ vĹĄimli, Ĺže ÄeskĂ˝ nebo slovenskĂ˝ text mĂĄ nÄkdy sklon ke +znehodnocenĂ akcentovanĂ˝ch znakĹŻ, pokud jej posĂlĂĄme do zĂĄloĹžek. V +tomto ÄlĂĄnku si vysvÄtlĂme pozadĂ tÄchto problĂŠmĹŻ a popĂĹĄeme makro PDFuni +pro plain\TeX{}, kterĂŠ problĂŠm s ÄeskĂ˝mi a slovenskĂ˝mi texty v zĂĄloĹžkĂĄch a +dalĹĄĂch podobnĂ˝ch mĂstech ĹeĹĄĂ. + +\sec KĂłdovacĂ standardy pro PDF stringy + +PDF stringy jsou jednak texty v zĂĄloĹžkĂĄch a dĂĄle texty v informaci o PDF +dokumentu vloĹženĂŠ pĹĂkazem "\pdfinfo" o autorovi, nĂĄzvu dĂla, klĂÄovĂ˝ch +slovech a podobnÄ. Ădaje z "\pdfinfo" lze z dokumentu vydolovat programem +"pdfinfo" na pĹĂkazovĂŠm ĹĂĄdku a nÄkterĂŠ PDF prohlĂĹžeÄe je takĂŠ dokåŞà +zobrazit. + +PDF stringy nejsou souÄĂĄstĂ hlavnĂho textu dokumentu, takĹže pro nÄ nenĂ +pouĹžit font vybranĂ˝ autorem dokumentu. MĂsto toho si PDF prohlĂĹžeÄ k zobrazenĂ +PDF stringĹŻ zavolĂĄ font, kterĂ˝ je zrovna v dobÄ prohlĂĹženĂ po ruce a kterĂ˝ +mu nabĂdne operaÄnĂ systĂŠm. + +Specifikace PDF formĂĄtu \cite[pdfstandard] vymezuje (v dodatku D) pro PDF +stringy dvÄ moĹžnĂĄ kĂłdovĂĄnĂ, PrvnĂ je jednobytovĂŠ (tj. jeden znak je +reprezentovĂĄn jednĂm bytem) a jmenuje se "PDFDocEncoding". Toto kĂłdovĂĄnĂ se +shoduje s viditelnĂ˝mi znaky z ISO-8859-1, takĹže zĂĄpadoevropanĂŠ s nĂm nemajĂ problĂŠmy. +NevĂ˝hodou tohoto kĂłdovĂĄnĂ je, Ĺže v nÄm nenajdeme vÄtĹĄinu akcentovanĂ˝ch znakĹŻ +ÄeskĂŠ a slovenskĂŠ abecedy. NestarĂĄme-li se o nic jinĂŠho, je uloĹženĂ˝ string +interpetovĂĄn PDF prohlĂĹžeÄem jako kĂłdovanĂ˝ podle "PDFDocEncoding", takĹže +nĂĄm to zĂĄkonitÄ poniÄĂ ÄeskĂŠ texty. + +KvĹŻli tomu jsem se rozhodl do makra OPmac \cite[opmac] zaĹadit konverznĂ +proces, kterĂ˝ veĹĄkerĂŠ ÄeskĂŠ a slovenskĂŠ akcentovanĂŠ znaky pĹevede do jejich +ASCII podobnĂ˝ch znakĹŻ bez akcentu a teprve takto pĹevedenĂ˝ text uloŞà jako +PDF string. V zĂĄloĹžkĂĄch pak sice nevidĂme akcenty, ale taky tam nevidĂme +nesmysly, ke kterĂ˝m to je nĂĄchylnĂŠ. I kdyby byly PDF stringy sprĂĄvnÄ +kĂłdovanĂŠ pro ÄeĹĄtinu (jak popĂĹĄeme za chvĂli), mĹŻĹže se stĂĄt, Ĺže nejsou +sprĂĄvnÄ v prohlĂĹžeÄi zobrazeny, protoĹže sprĂĄvnĂŠ zobrazenĂ navĂc zĂĄvisĂ na +sprĂĄvnĂŠm nastavenĂ locales a na dalĹĄĂch systĂŠmovĂ˝ch parametrech. Rozhodl jsem +se tedy pro robustnĂ ĹeĹĄenĂ: PDF stringy generovanĂŠ makrem OPmac +budou jenom v ASCII. A nehodlĂĄm to mÄnit. + +NicmĂŠnÄ uĹživatelĂŠ napĹ. balĂÄku "hyperref" si jistÄ vĹĄimli, Ĺže za jistĂ˝ch +pĹĂznivĂ˝ch okolnostĂ konstelace hvÄzd (tj. "hyperref" pracuje v UNICODE a +PDF prohlĂĹžeÄ mĂĄ sprĂĄvnÄ nastaveny veĹĄkerĂŠ systĂŠmovĂŠ parametry) dokåŞà +vygenerovat nezmrĹĄenĂŠ ÄeskĂŠ texty i v zĂĄloĹžkĂĄch. Je to tĂm, Ĺže PDF specifikace +nabĂzĂ druhou (a poslednĂ) moĹžnost kĂłdovĂĄnĂ PDF stringĹŻ, kterou nazĂ˝vĂĄ +"UTF-16BE Unicode" (dĂĄle jen UNICODE). +KĂłdovĂĄnĂ PDF stringu v tomto reĹžimu se poznĂĄ tak, Ĺže prvnĂ dva +byty stringu majĂ hodnotu 254, 255. Je to prefix pro pĹepnutĂ do tohoto +kĂłdovĂĄnĂ. PodrobnÄji viz kapitolu 3.8.1 (String Types) +v~manuĂĄlu~\cite[pdfstandard]. + +Nechceme-li uklĂĄdat do PDF stringu jednotlivĂŠ byty nativnÄ, mĂĄme moĹžnost je +popsat pomocĂ backslashe nĂĄsledovanĂŠm tĹemi oktalovĂ˝mi ÄĂslicemi vyjadĹujĂcĂ +hodnotu bytu. String \uv{CviÄenĂ je zĂĄtÄĹž} pak mĹŻĹže v PDF stringu +bĂ˝t zapsanĂ˝ takto: + +\begtt +\376\377\000C\000v\000i\001\015\000e\000n\000\355\000\040\000j\000e\000\040 +\000z\000\341\000t\001\033\001\176 +\endtt + +V uvedenĂŠm pĹĂkladu vidĂme nejprve byty 254, 255 zapsanĂŠ oktalovÄ, dĂĄle je +oktalovÄ zapsanĂĄ nula nĂĄsledovanĂĄ pĂsmenem C (tyto dva byty reprezentujĂ +pĂsmeno C v UTF-16 kĂłdovĂĄnĂ). PodobnÄ jistÄ dokĂĄĹžete deĹĄifrovat pĂsmena +\uv{v} a \uv{i}. DĂĄle "\001\015" je 01,0D hexadecimĂĄlnÄ a to reprezentuje +znak \uv{Ä} v UNICODE. DĂĄl si ten string doÄtÄte sami... + +PrĂĄvÄ takovĂŠ stringy musĂme generovat \TeX{}em, pokud chceme vidÄt v +zĂĄloĹžkĂĄch sprĂĄvnÄ napsanĂŠ ÄeskĂŠ a slovenskĂŠ znaky. +Je asi nemyslitelnĂŠ, abychom psali ruÄnÄ do dokumentu +nÄco jako: + +\begtt +\pdfoutline goto name{cviceni} count0 {% zĂĄloĹžka +\string\376\string\377\string\000C\string\000v\string\000i\string\001\string\015% +\string\000e\string\000n\string\000\string\355\string\000\string\040\string\000j% +\string\000e\string\000\string\040\string\000z\string\000\string\341% +\string\000t\string\001\string\033\string\001\string\176}% +\pdfdest name{cviceni} xyz\relax % cĂl odkazu +\endtt + +Sice je tĂmto zpĹŻsobem na primitivnĂ Ăşrovni vytvoĹena zĂĄloĹžka s textem +\uv{CviÄenĂ je zĂĄtÄĹž}, ale kdybychom to takto dÄlali poĹĂĄd, byla by to +opravdu zĂĄtÄĹž. +Proto jsem vytvoĹil makro PDFuni, kterĂŠ uĹživatelĹŻm \csplain{}u +ulehÄĂ prĂĄci. UĹživatelĂŠ \LaTeX{}u nic takovĂŠho nepotĹebujĂ, protoĹže majĂ +balĂÄek "hyperref". + + +\sec PouĹžitĂ balĂÄku PDFuni + +ProtoĹže OPmac generuje do zĂĄloĹžek texty bez akcentĹŻ, je potĹeba zavolat +PDFuni aĹž po "\input opmac". BalĂÄek PDFuni pĹedefinuje implicitnĂ +konvertor z OPmac pro vĂ˝stup do PDF stringĹŻ (konvertor do ASCII) na novĂ˝ konvertor +do UNICODE. TakĹže staÄĂ na zaÄĂĄtku dokumentu psĂĄt: + +\begtt +\input opmac +\input pdfuni +\endtt + +Od tĂŠto chvĂle pĹĂkaz "\outlines<num>" generuje do zĂĄloĹžek sprĂĄvnÄ ÄeskĂŠ a +slovenskĂŠ texty. VyuĹžĂvĂĄ pĹitom automaticky generovanĂ˝ obsah. OPmac nabĂzĂ +jeĹĄtÄ pĹĂkaz "\insertoutline{<text>}", kterĂ˝ vloŞà do zĂĄloĹžek jeden Ăşdaj. +Tento pĹĂkaz vklĂĄdĂĄ "<text>" tak jak je bez konverze, z ÄehoĹž plyne, Ĺže tam +ÄeskĂŠ akcenty nebudou jednoduĹĄe fungovat. Je potĹeba pouĹžĂt pĹĂkaz +"\pdfunidef\makro{<text>}", kterĂ˝ je definovĂĄn v balĂÄku PDFuni a kterĂ˝ vloŞà +do "\makra" zkonvertovanĂ˝ "<text>" v kĂłdovĂĄnĂ UNICODE s~oktalovĂ˝mi pĹepisy. +Kategorie backslashe tam je 12 (obyÄejnĂ˝ znak). TakĹže je potĹeba psĂĄt: + +\begtt +\pdfunidef\tmp{Tady je ÄeskĂ˝ text} +\insertoutline{\tmp} +\endtt + +PDF dokument mĹŻĹže obsahovat PDF stringy rĹŻznÄ kĂłdovanĂŠ. TakĹže funguje +napĹĂklad i toto: + +\begtt + % tento PDF string je v UNICODE: +\pdfunidef\tmp{ÄeĹĄtina je dĹina}\insertoutline{\tmp} + % tento PDF string je v PDFDocEncoding: +\insertoutline{Jan Hus vnesl do jazyka velkou hloupost: zavedl akcenty.} +\endtt + +PĹĂkaz pdf\TeX{}u "\pdfinfo" zanĂĄĹĄĂ do PDF dokumentu doplĹujĂcĂ informace, +napĹĂklad takto: + +\begtt +\pdfinfo {/Author (Autor) + /Title (Tutul) + /Creator (csplain + OPmac) + /Subject (clanek) + /Keywords (klicova slova)} +\endtt + +Je potĹeba vÄdÄt, Ĺže PDF stringem je zde kaĹždĂ˝ Ăşdaj uzavĹenĂ˝ do zĂĄvorky, +pĹiÄemĹž nÄkterĂŠ tyto PDF stringy mohou bĂ˝t kĂłdovĂĄny podle PDFDocEncoding a +jinĂŠ podle UNICODE. TakĹže je moĹžnĂŠ Ăşdaje zanĂŠst tĹeba takto: + +\begtt +\def\author{Petr OlĹĄĂĄk}\pdfunidef\author{\author} +\def\title{PDFuni - akcenty v PDF zĂĄloĹžkĂĄch}\pdfunidef\title{\title} +\def\subject{ÄlĂĄnek}\pdfunidef\subject{\subject} +\pdfinfo {/Author (\author) + /Title (\title) + /Creator (csplain + OPmac) + /CreationDate (D:20130517000000) + /Subject (\subject) + /Keywords (TeX; pdfTeX; PDF; OPmac)} +\endtt + +\def\author{Petr OlĹĄĂĄk}\pdfunidef\author{\author} +\def\title{PDFuni - akcenty v PDF zĂĄloĹžkĂĄch}\pdfunidef\title{\title} +\def\subject{ÄlĂĄnek}\pdfunidef\subject{\subject} +\pdfinfo {/Author (\author) + /Title (\title) + /Creator (csplain + OPmac) + /CreationDate (D:20130517000000) + /Subject (\subject) + /Keywords (TeX; pdfTeX; PDF; OPmac)} + +Poznamenejme, Ĺže dalĹĄĂ informace "/Producer" a "/ModDate" vloŞà vÄtĹĄinou +nejlĂŠpe pdf\TeX{} sĂĄm, nicmĂŠnÄ uĹživatel je rovnÄĹž mĹŻĹže pĹedefinovat. Jsou-li oba +Ăşdaje "/CreationDate" a "/ModDate" nevyplnÄny, pak oba obsahujĂ Äas +vzniku PDF souboru. Jak je moĹžnĂŠ si vĹĄimnout, +chcete-li "/CreationDate" vyplnit podle svĂŠho, je nutnĂŠ dodrĹžet +formĂĄt "D:YYYYMMDDhhmmss". + + +\sec MoĹžnost rozĹĄĂĹenĂ kĂłdovacĂ tabulky o dalĹĄĂ znaky + +PĹĂkaz "\pdfunidef" konvertuje sprĂĄvnÄ vĹĄechny viditelnĂŠ ASCII znaky s +kategoriemi 11, 12 (pĂsmena, znaky) a dĂĄle znaky s kategoriemi 7, 8 ("^", "_"). +OstatnĂ viditelnĂŠ ASCII znaky jinĂ˝ch kategoriĂ (napĹ. "$",~"&") jsou ignorovĂĄny. +Chcete-li do PDF stringu dopravit znak jinĂŠ +kategorie neĹž 7, 8, 11, 12, musĂ mĂt takovĂ˝ znak +pĹed sebou backslash, tedy "\\", "\{", "\}", "\$", "\&", "\#", "\~", "\%". + +DĂĄle "\pdfunidef" konvertuje znaky kategorie 11 nebo 12, kterĂŠ nejsou ASCII, +pokud jsou zahrnuty do seznamu "\pdfunichars". Tento seznam implicitnÄ +obsahuje znaky ĂĂĄ Ăä ÄÄ ÄÄ ĂĂŠ ÄÄ Ăà Ěĺ ĽĞ ĹĹ ĂĂł ĂĂś ĂĂ´ ĹĹ ĹĹ Ĺ ĹĄ Ťż ĂĂş ĹŽĹŻ ĂĂź +ĂĂ˝ ŽŞ. OktalovĂ˝ zĂĄpis tÄchto znakĹŻ (tedy vĂ˝stup konverze) ve stejnĂŠm poĹadĂ +je uloĹžen v seznamu "\pdfunicodes". KĂłdy jsou tam zapisovĂĄny bez backslashĹŻ +a bez prvnĂ nuly a jsou oddÄleny od sebe pĹĂkazem "\or". PodĂvejte se do +souboru "pdfuni.tex" nebo do nĂĄsledujĂcĂ sekce, jak vypadajĂ implicitnĂ +hodnoty tÄchto seznamĹŻ. Chcete-li rozĹĄĂĹit tuto konverznĂ tabulku, je moĹžnĂŠ +pouĹžĂt pĹĂkaz "\addto" z OPmac napĹĂklad takto: + +\begtt +\addto\pdfunichars{ĂĂŤ} \addto\pdfinicodes{\or00313\or00353} +\endtt + +UvedenĂ˝ pĹĂklad rozĹĄiĹuje seznam "\pdfunichars" o znaky Ă, ĂŤ a dĂĄle +rozĹĄiĹuje seznam "\pdfunicodes" o kĂłdy "\000\313" a "\000\353". Na tyto kĂłdy +se budou znaky Ă, ĂŤ (v tomto poĹadĂ) konvertovat.\fnote +{Aby uvedenĂ˝ pĹĂklad fungoval, musĂ mĂt znaky Ă, ĂŤ svou reprezentaci ve +vnitĹnĂm kĂłdovĂĄnĂ \TeX{}u. To je u 16bitovĂ˝ch \TeX{}ovĂ˝ch maĹĄin zaĹĂzeno +automaticky. PĹi pouĹžitĂ \csplain{}u a enc\TeX{}u je moĹžnĂŠ pouĹžĂt tĹeba +{\tt\bslash input t1code}.} + +PĹĂkaz "\pdfunidef" jeĹĄtÄ pĹed zapoÄetĂm konverze provede Ăşplnou expanzi +svĂŠho parametru "<text>". PĹed touto expanzĂ je vhodnĂŠ pĹedefinovat nÄkterĂĄ +makra, napĹ. "\def\TeX{TeX}". TakovĂĄ Äinnost je zanesena do seznamu +"\pdfunipre", kterĂ˝ je (uvnitĹ skupiny) pĹedĹazen pĹed expanzĂ parametru +"<text>". KromÄ speciĂĄlnĂch expanzĂ maker tam jsou povelem +"\let\makro\relax" zabezpeÄena makra, kterĂĄ expandovat v danĂŠ chvĂli +nechceme. Jsou to makra "\ae", "\P" atd., kterĂĄ poslĂŠze +vstoupĂ do konverze a promÄnĂ se na svĹŻj oktalovĂ˝ kĂłd. +PĹidÄlenĂ tohoto kĂłdu se dÄje v seznamu "\pdfunipost" pomocĂ pĹĂkazu +"\odef\makro<6cifernĂ˝ kĂłd><mezera>". NapĹ. pĹĂkazem +"\odef\ae000346" ĹĂkĂĄme, Ĺže makro "\ae" se zkonvertuje na "\000\346". +ÄtenĂĄĹi doporuÄuji podĂvat se na obsahy seznamĹŻ "\pdfunipre" a "\pdfunipost" +do souboru "pdfuni.tex" nebo do nĂĄsledujĂcĂ sekce. + +Chcete-li rozĹĄĂĹit konverznĂ tabulku tĂ˝kajĂcĂ se maker, lze to udÄlat +pomocĂ "\addto" napĹĂklad takto: + +\begtt +\addto\pdfunipre{\let\endash\relax} \addto\pdfunipost{\odef\endash040023 } +\endtt + +Tento pĹĂklad pĹidĂĄvĂĄ do tabulky Ăşdaj o konverzi makra "\endash". Ve fĂĄzi +expandovĂĄnĂ parametru je jeho expanze potlaÄena a dĂĄle se zkonvertuje na +kĂłd "\040\023", coĹž je dle UNICODE pomlka na pĹŻlÄtverÄĂk. + +KontrolnĂ sekvence, kterĂŠ nejsou bÄhem expanze parametru "<text>" +expandovĂĄny a nemajĂ deklarovĂĄn svĹŻj kĂłd pomocĂ "\odef", jsou pĹi konverzi +ignorovĂĄny. + +NynĂ uĹž ÄtenĂĄĹ patrnÄ vĂ, proÄ pĹi pouĹžitĂ \csplain{}u s enc\TeX{}em funguje +sprĂĄvnÄ i prĂĄvnickĂ˝ znak~§, aÄkoli nenĂ uveden v seznamu "\pdfunichars". +Enc\TeX{} jej totiĹž mapuje na kontrolnĂ sekvenci "\S", takĹže kdykoli +napĂĹĄeme~§, promÄnĂ se to automaticky v "\S". +Znak "\S" je oĹĄetĹen v seznamu "\pdfunipre", kde je napsĂĄno +"\let\S\relax". A v seznamu "\pdfunipost" je definice "\odef\S000247". + + +\sec Popis internĂch maker a s nimi spojenĂ˝ch trikĹŻ + +Makra z "pdfuni.tex" obsahujĂ nÄkolik zajĂmavĂ˝ch trikĹŻ. Jejich popis je +urÄen pro pokroÄilĂŠ \TeX{}isty. + +Soubor "pdfuni.tex" je kĂłdovĂĄn v UTF-8 kĂłdovĂĄnĂ. Je nutnĂŠ, aby byl pĹeÄten +enc\TeX{}em nebo 16bitovou maĹĄinou, protoĹže chceme s jednotlivĂ˝mi +akcentovanĂ˝mi znaky v \TeX{}u pracovat jako s jednĂm tokenem. Proto je na +zaÄĂĄtku souboru test, zda je pouĹžita sprĂĄvnĂĄ \TeX{}ovĂĄ maĹĄina: + +\begtt +\def\tmp#1#2\end{\if$#2$\else +\errmessage {This file is UTF-8 encoded. Use TeX+encTeX or 16bit TeX engine.}\fi}% +\tmp Ä\end +\endtt + +DĂĄle definujeme na zaÄĂĄtku souboru makro "\Bslash", kterĂŠ expanduje na +backslash kategorie 12. TotĂŠĹž dÄlĂĄ OPmac s makrem "\bslash", ale OPmac +hodnotu tohoto makra v rĹŻznĂ˝ch mĂstech mÄnĂ. Zde potĹebujeme mĂt jistotu, Ĺže +to bude poĹĂĄd backslash. KromÄ toho potĹebujeme pracovat s pomocnĂ˝m ÄĂtaÄem +"\tmpnum". ProtoĹže nevĂme, zda je zavolĂĄn OPmac (makro PDFuni funguje i bez +nÄj), je za pĹedpokladu nedefinovanosti "\newcount" tento ÄĂtaÄ deklarovĂĄn. + +\begtt +\ifx\tmpnum\undefined \csname newcount\endcsname\tmpnum \fi +{\lccode`\?=`\\ \lowercase{\gdef\Bslash{?}}} +\endtt + +NĂĄsleduje vĂ˝pis implicitnĂ hodnoty seznamĹŻ "\pdfunichars" a +"\pdfunicodes" + +\begtt +\edef\pdfunichars{\Bslash() + ĂĂĄĂäÄÄÄÄ ĂĂŠÄÄĂĂĚĺ ĽĞĹĹĂĂłĂĂś ĂĂ´ĹĹĹĹĹ ĹĄ ŤżĂúŎůĂĂź ĂýŽŞ +} +\def\pdfunicodes {\or00134\or00050\or00051\or % \ () + 00301\or00341\or00304\or00344\or01014\or01015\or01016\or01017\or % ĂĂĄĂäÄÄÄÄ + 00311\or00351\or01032\or01033\or00315\or00355\or01071\or01072\or % ĂĂŠÄÄĂĂĚĺ + 01075\or01076\or01107\or01110\or00323\or00363\or00326\or00366\or % ĽĞĹĹĂĂłĂĂś + 00324\or00364\or01124\or01125\or01130\or01131\or01140\or01141\or % ĂĂ´ĹĹĹĹĹ ĹĄ + 01144\or01145\or00332\or00372\or01156\or01157\or00334\or00374\or % ŤżĂúŎůĂĂź + 00335\or00375\or01175\or01176% % ĂýŽŞ +} +\endtt + +Je vidÄt, Ĺže do seznamu jsou zaĹazeny i hodnoty "\", "(", ")". Je to tĂm, Ĺže +tyto znaky nechceme konvertovat do podoby "\000<znak>", protoĹže by v +PDF stringu zlobily (backslash je escape prefix a kulatĂŠ zĂĄvorky ohraniÄujĂ +string). Je tedy bezpeÄnÄjĹĄĂ je do PDF stringu zapsat v ĂşplnĂŠ oktalovĂŠ notaci. + +PokraÄuje vĂ˝pis implicitnĂ hodnoty "\pdfunipre" a "\pdfunipost" a +nÄkterĂ˝ch speciĂĄlnĂch kĂłdĹŻ. + +\begtt +\def\pdfunipre {\def\TeX{TeX}\def\LaTeX{LaTeX}\def~{ }\def\ { }% + \let\ss\relax \let\l\relax \let\L\relax + \let\ae\relax \let\oe\relax \let\AE\relax \let\OE\relax + \let\o\relax \let\O\relax \let\i\relax \let\j\relax \let\aa\relax + \let\AA\relax \let\S\relax \let\P\relax \let\copyright\relax + \let\dots\relax \let\dag\relax \let\ddag\relax + \let\clqq\relax \let\crqq\relax \let\flqq\relax \let\frqq\relax + \let\promile\relax \let\euro\relax + \def\\{\Bslash}\let\{\relax \let\}\relax + \def\${\string$}\def\&{\string&}\def\_{\string_}\def\~{\string~}% +} +\def\pdfunipost {\odef\ss000337 \odef\l001102 \odef\L001101 + \odef\AE000306 \odef\ae000346 \odef\OE001122 \odef\oe001123 + \odef\o000370 \odef\O000330 \odef\aa000345 \odef\AA000305 + \odef\i001061 \odef\j002067 \odef\S000247 \odef\P000266 + \odef\copyright000251 \odef\dots040046 \odef\dag040040 \odef\ddag040041 + \odef\clqq040033 \odef\crqq040034 \odef\flqq000253 \odef\frqq000273 + \odef\promile040060 \odef\euro040254 \odef\{000173 \odef\}000175 + \odef\#000043 +} +\def\pdfinitcode{\Bslash376\Bslash377} +\def\pdfspacecode{\Bslash000\Bslash040} +\def\pdfcircumflexcode{\Bslash000\Bslash136} +\def\pdflowlinecode{\Bslash000\Bslash137} +\endtt +\relax\let\tmp=$ % Editor mi obarvuje matematickĂ˝ mĂłd i kdyĹž nechci. + +NynĂ pĹistoupĂme na to hlavnĂ, na definici makra "\pdfunidef<makro>{<text>}". + +{\catcode`\<=12 +\begtt +\def\pdfunidef#1#2{\bgroup \def\tmpa{\noexpand#1}% + \pdfunipre \edef\tmp{#2}\edef\out{\pdfinitcode}% + \def\odef##1##2##3##4##5##6##7 + {\def##1{&\edef\out{\out\Bslash##2##3##4\Bslash##5##6##7}}}\pdfunipost + \def\insertbslashes ##1##2##3##4##5{\Bslash0##1##2\Bslash##3##4##5}% + \def\gobbletwowords ##1 ##2 {}% + \tmpnum=0 + \loop + \sfcode\tmpnum=0 \advance\tmpnum by1 + \ifnum \tmpnum<128 \repeat + \tmpnum=0 + \expandafter \pdfunidefA \pdfunichars {}% +} +\endtt +\relax} + +"\pdfunidef" nejprve zahĂĄjĂ +skupinu a zapamatuje si jmĂŠno "<makra>", kterĂŠ +mĂĄ definovat, do "\tmpa". DĂĄle spustĂ "\pdfunipre" a expanduje parametr "<text>". +Do pracovnĂho makra "\out" bude postupnÄ stĹĂĄdat vĂ˝sledek konverze. VĂ˝chozĂ hodnota je +"\pdfinitcode", coĹž je "\376\377", neboli prefix UNICODE stringu. +DĂĄle je definovĂĄno pomocnĂŠ makro "\odef<makro><6 oktalovĂ˝ch cifer><mezera>" +ponÄkud trikoidnĂm zpĹŻsobem. Makro provede "\def<makro>{&<Äinnost>}". +ProÄ tam je ten znak "&" bude vysvÄtleno pozdÄji. ÄinnostĂ, kterou makro +provede, je pĹidĂĄnĂ odpovĂdajĂcĂch oktalovĂ˝ch cifer do vĂ˝stupnĂho makra +"\out", pĹitom k tÄmto cifrĂĄm jsou pĹidĂĄny backslashe. Seznam "\pdfunipost" obsahuje +jednotlivĂŠ pĹĂkazy "\odef", tedy pĹipravĂ makra ke konverzi. + +DĂĄle je pĹipraveno pomocnĂŠ makro "\insertbslashes<5 oktalovĂ˝ch cifer>", +kterĂŠ pĹidĂĄ ĹĄestou nulu na zaÄĂĄtek a vloŞà na sprĂĄvnĂŠ mĂsto backslashe. +Makro "\gobbletwowords" odstranĂ dvÄ nĂĄsledujĂcĂ slova ukonÄenĂĄ mezerou. +Budeme to potĹebovat za chvĂli. + +V zĂĄvÄru tĂŠto ÄĂĄsti je cyklem uloĹženo kaĹždĂŠmu znaku s kĂłdem menĹĄĂm neĹž 128 +sfkĂłd rovnĂ˝ nule. Podle tĂŠto hodnoty sfkĂłdu poznĂĄme, Ĺže znak je z dolnĂ +ASCII tabulky a bude kĂłdovĂĄn na "\000<znak>". OstatnĂ znaky vyjmenovanĂŠ v +seznamu "\pdfunichars" budou mĂt kaĹždĂ˝ svĹŻj sfkĂłd postupnÄ se zvÄtĹĄujĂcĂ od +jedniÄky. To udÄlĂĄ makro "\pdfunidefA", kterĂŠ postupnÄ ze seznamu +"\pdfunichars" odlupuje jednotlivĂŠ znaky a dĂĄvĂĄ jim odpovĂdajĂcĂ sfkĂłdy. + +\begtt +\def\pdfunidefA #1{\if\relax#1\relax% + \def\next{\let\next= }\afterassignment\pdfunidefB \expandafter\next\tmp\end + \else \advance\tmpnum by1 \sfcode`#1=\tmpnum \expandafter \pdfunidefA + \fi +} +\endtt + +PostupnĂŠ odlupovĂĄnĂ konÄĂ, kdyĹž je naÄten prĂĄzdnĂ˝ parametr (poznĂĄme to +podle "\if\relax#1\relax", to se totiĹž sejde prvnĂ "\relax" s druhĂ˝m). +V takovĂŠm pĹĂpadÄ zahĂĄjĂme postupnĂŠ odlupovĂĄnĂ expandovanĂŠho "<text>", kterĂ˝ mĂĄme +v "\tmp". Konec druhĂŠho ĹĂĄdku ukĂĄzky po provedenĂ "\expandafter" a nĂĄslednĂŠ +expanzi "\next" vypadĂĄ takto: + +\begtt +\let\next= <expandovanĂ˝ text>\end +\endtt + +Mezera za rovnĂtkem je dĹŻleĹžitĂĄ, protoĹže dalĹĄĂ pĹĂpadnĂĄ mezera se pak +skuteÄnÄ pĹiĹadĂ. PĹĂkaz "\let\next" odloupne z "<expandovanĂŠho textu>" +prvnĂ token a po pĹiĹazenĂ spustĂ "\pdfunidefB". + +\begtt +\def\pdfunidefB {% + \ifcat x\noexpand\next \pdfunidefC + \else \ifcat.\noexpand\next \pdfunidefC + \else \ifcat\noexpand\next\space \edef\out{\out\pdfspacecode}% + \else \ifcat^\noexpand\next \edef\out{\out\pdfcircumflexcode}% + \else \ifcat_\noexpand\next \edef\out{\out\pdflowlinecode}% + \else \expandafter\ifx\expandafter&\next + \fi\fi\fi\fi\fi\fi + \ifx\next\end \edef\next{\def\tmpa{\out}}\expandafter\egroup\next \else + \def\next{\let\next= }\afterassignment\pdfunidefB \expandafter\next + \fi +} +\endtt + +Makro "\pdfunidefB" proĹĄetĹĂ obsah "\next" a podle jeho typu provede jeden +krok konverze. V zĂĄvÄru svĂŠ Äinnosti zavolĂĄ rekurzivnÄ samo sebe a odloupne +z "<expandovanĂŠho textu>" dalĹĄĂ token. To dÄlĂĄ poĹĂĄd, dokud nenarazĂ na "\end". +V pĹĂpadÄ, Ĺže narazilo na "\end", pak do "\next" vloĹžĂ: + +\begtt +\def<makro>{<zkonvertovanĂ˝ vĂ˝stup>} +\endtt +% +a nejprve expanduje "\next" pomocĂ "\expandafter" +(tehdy si jeĹĄtÄ pamatuje obsah "\next") a +vzĂĄpÄtĂ potĂŠ ukonÄĂ skupinu, vĹĄe tĂm zapomene +a provede vĂ˝sledek pĹipravenĂŠ expanze. DĂlo je dokonĂĄno. + +VraĹĽme se k makru "\pdfunidefB". Toto makro vyhodnotĂ pĹedevĹĄĂm kategorii +odloupnutĂŠho tokenu. Je-li to mezera, znak "^" nebo "_", pĹidĂĄ do "\out" +jejich odpovĂdajĂcĂ kĂłd. Je-li to pĂsmeno nebo ostatnĂ znak, provede +"\pdfunidefC". PodĂvejme se tedy, co dÄlĂĄ "\pdfunidefC". + +\begtt +\def\pdfunidefC {\edef\tmp{\expandafter\gobbletwowords\meaning\next}% + \edef\out{\out\pdfunidefD}% +} +\endtt + +Makro "\pdfunidefC" potĹebuje zpÄtnÄ zjistit, jakĂ˝ znak je v "\next" uloĹžen. K tomu +pouĹžije pĹĂkaz "\meaning\next", kterĂ˝ vypĂĹĄe tĹeba "the character B". +PomocĂ "\gobbletwowords" odstranĂme dvÄ slova "the character" a v makru "\tmp" zbude +jen "B". Do "\out" pak pĹidĂĄme vĂ˝sledek expanze "\pdfunidefD". + +\begtt +\def\pdfunidefD{% + \ifnum\sfcode\expandafter`\tmp=0 \Bslash 000\tmp + \else + \expandafter \insertbslashes \ifcase \sfcode\expandafter`\tmp\pdfunicodes + \else 000077\fi + \fi +} +\endtt + +Toto makro musĂ pracovat jen s expandovatelnĂ˝mi primitivy. Nejprve +"\pdfunidefD" zkontroluje, zda konvertovanĂ˝ znak (skrytĂ˝ v "\tmp") mĂĄ sfkĂłd +roven nula. V takovĂŠm pĹĂpadÄ expanduje na "\000<znak>". Jinak pomocĂ +"\expandafter" rozvine "\ifcase\sfcode`<znak>". ProtoĹže tato podmĂnka nenĂ +terminovanĂĄ, expanduje se i tÄlo tohoto "\ifcase" skrytĂŠ v makru +"\pdfunicodes". VĂme, Ĺže tam je psĂĄno + +\begtt +\or<5cifernĂ˝ kĂłd>\or<5cifernĂ˝ kĂłd>\or<5cifernĂ˝ kĂłd>... +\endtt +CelĂ˝ "\ifcase" je uzavĹen pomocĂ "\else 000077\fi", coĹž je kĂłd otaznĂku. +Expandafter pĹed "\ifcase" zpĹŻsobĂ, Ĺže toto "\ifcase" expanduje na svou +odpovĂdajĂcĂ vÄtev podle sfkĂłdu, kde je "<5cifernĂ˝ kĂłd>". PĹed tĂmto +vĂ˝sledkem se ovĹĄem rozprostĂrĂĄ makro "\insertbslashes", kterĂŠ do tohoto +"<5cifernĂŠho kĂłdu>" doplnĂ prvnĂ nulu a backslashe. + +ZajĂmavĂ˝ trik je na ĹĂĄdku tÄsnÄ nad Ĺadou "\fi\fi\fi\fi\fi\fi" v tÄle makra +"\pdfunidefB". Je tam ĹeÄeno "\expandafter\ifx\expandafter&\next". +PĹedstavme si, Ĺže "\next" je makro definovanĂŠ pomocĂ "\odef". V takovĂŠm +pĹĂpadÄ po vykonĂĄnĂ tÄch dvou "\expandafter" dostĂĄvĂĄme: + +\begtt +\ifx&&<Äinnost> +\endtt +a provede se tedy poĹžadovanĂĄ Äinnost. Je-li "\next" cokoli jinĂŠho, nenĂ to +shodnĂŠ se znakem "&" a neprovede se nic. Je-li "\next" pĹĂmo znak "&", +neprovede se takĂŠ nic. + +Soubor "pdfuni.tex" je ukonÄen definicĂ makra z OPmac, kterĂĄ mÄnĂ konvertor +spuĹĄtÄnĂ˝ pĹi Äinnosti "\outlines<num>" z pĹŻvodnĂ hodnoty (konverze do ASCII) na novou +hodnotu (konverze pomocĂ "\pdfunidef"). + +\begtt +\def\cnvhook #1#2{#2\pdfunidef\tmp\tmp} % the default convertor in OPmac is + % redefined here +\endtt + +\sec Reference + +\bib [pdfstandard] +\url{http://www.adobe.com/devnet/acrobat/pdfs/pdf_reference_1-7.pdf} + +\bib [opmac] \url{http://petr.olsak.net/opmac.html} + +\end + |