summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/cstex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2013-08-15 22:30:20 +0000
committerKarl Berry <karl@freefriends.org>2013-08-15 22:30:20 +0000
commitb334c30fe0a0faa600731910cc98905b9f0b4955 (patch)
tree25247ec41ddc97637739cfa4cc3d00627505300d /Master/texmf-dist/doc/cstex
parent223162e87cec5243ae4b5345d9d5599523632e70 (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')
-rw-r--r--Master/texmf-dist/doc/cstex/opmac-d.pdfbin644772 -> 724033 bytes
-rw-r--r--Master/texmf-dist/doc/cstex/opmac-d.tex639
-rw-r--r--Master/texmf-dist/doc/cstex/opmac-u.pdfbin252876 -> 256121 bytes
-rw-r--r--Master/texmf-dist/doc/cstex/opmac-u.tex128
-rw-r--r--Master/texmf-dist/doc/cstex/pdfuni-article.pdfbin0 -> 117791 bytes
-rw-r--r--Master/texmf-dist/doc/cstex/pdfuni-article.tex515
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
index 3c591cee1fa..86c9b4b4dc8 100644
--- a/Master/texmf-dist/doc/cstex/opmac-d.pdf
+++ b/Master/texmf-dist/doc/cstex/opmac-d.pdf
Binary files differ
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
index b5103bc1c31..7d36ffb3686 100644
--- a/Master/texmf-dist/doc/cstex/opmac-u.pdf
+++ b/Master/texmf-dist/doc/cstex/opmac-u.pdf
Binary files differ
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
new file mode 100644
index 00000000000..56c9268bb0a
--- /dev/null
+++ b/Master/texmf-dist/doc/cstex/pdfuni-article.pdf
Binary files differ
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
+