\chyph
\input opmac
\font\sc=cscsc10
\hyperlinks\Blue\Blue
\outlines0
\activettchar"
\catcode`<=13 \def<#1>{\hbox{\it$\langle$#1\/$\rangle$}}

\tit OPmac-bib -- bibliografické odkazy jednoduše

\centerline{\it Petr Olšák}\bigskip

Tradičně se v \TeX{}ových dokumentech zpracovávají bibliografické odkazy
čtením bibliografických záznamů z vnější databáze za pomocí externího programu.
Tímto programem je buď letitý Bib\TeX{}~\cite[bibtex] nebo jeho různá 
vylepšení nebo v poslední době je to často biber~\cite[biber].

OPmac-bib nabízí jiný přístup: nepoužít žádný externí program a řešit
všechny úkoly související s~bibliografickými odkazy jen na úrovni maker
\TeX{}u. Odpadají tím starosti se starobylým Bib\TeX{}em v~souvislosti s
jeho schopností správně chápat pouze ASCII
kódování, starosti s nutností spouštět externí program během zpracování
dokumentu, starosti se speciálním a hodně nepřítulným jazykem Bib\TeX{}ových
stylů a případně starosti s nepřehledným biberem, který se vydal cestou co
největší implementační složitosti a navíc předpokládá použití \LaTeX{}u. Hlavní
myšlenkou OPmac-bib je: zvládneme to v plain\TeX{}u jen makry \TeX{}u
přímočaře a jednoduše.

OPmac-bib je doplňkovým modulem maker k balíku OPmac~\cite[opmac], což jsou makra
umožňující pohodlnější práci s plain\TeX{}em. Uvedený modul
"opmac-bib.tex" načítá
další soubor maker "librarian.tex"~\cite[librarian], jehož autorem je 
Paul Isambert. 
Tento soubor maker byl využit pro čtení "*.bib" databází přímo \TeX{}em.

OPmac-bib je už nějakou dobu úspěšně používán studenty při psaní závěrečných
prací, pokud použijí šablonu CTUstyle~\cite[ctustyle].


\sec Terminologie

Chceme-li v našem dokumentu zmínit existenci jiného dokumentu nebo cizí
myšlenky, typicky taková zmínka podléhá formálním pravidlům, která jsou
obvyklá v daném vědním oboru či v použitém odborném časopise, nebo jsou 
pravidla stanovena nějakou normou nebo úmluvou. Často je to ale mix všeho
dohromady, protože normy
nepokrývají veškeré aspekty, které se zmínkami o jiných dokumentech souvisejí. Abychom
tato pravidla mohli formulovat a bavit se o jejich realizaci například
v~OPmac-bib, potřebujeme k tomu vhodnou terminologii. Tady je.

Doslovná zmínka cizí myšlenky se nazývá {\em citace}. Ta může mít i poněkud
volnou formu, například: {\em Když už člověk jednou je, tak má koukat aby
byl. A když kouká, aby byl, a je, tak má být to, co je, a nemá být to, co
není, jak tomu v mnoha případech je.} -- Jan Werich.
Zde jsem neuvedl přesný odkaz na zdroj, jen jméno autora. Myšlenku jsem
vysázel odlišnou variantou písma než běžný text. Takové volně formulované citace
také připouštíme, ale nejsou obsahem našeho dalšího technického zkoumání.
Nás bude především zajímat způsob odkazování na publikaci, odkud byla myšlenka
převzata.

Dokument, ze kterého odkazujeme, budeme nazývat {\em aktuální dokument}.
Zdroj, na který odkazujeme, budeme nazývat {\em odkazovaný dokument}. V
aktuálním dokumentu v textu se může vyskytnout místo, kde chceme připomenout
existenci odkazovaného dokumentu, tzv. {\em místo citace}. Odkaz pak bývá
typicky realizován ve dvou krocích: v místě citace se napíše jen {\em
odkazová značka}, která se někde jinde v aktuálním dokumentu (pod čarou na
stránce, na konci kapitoly, nebo nejobvykleji na konci dokumentu) 
zopakuje a připojí se k ní
{\em bibliografický záznam}. Ten by měl obsahovat dostatek {\em údajů} o
odkazovaném dokumentu, aby jej mohl čtenář na základě uvedeného záznamu
jednoznačně dohledat. Nejčastějším postupem tedy je používání odkazových
značek v textu aktuálního dokumentu a vytvoření souhrnného {\em seznamu}
bibliografických záznamů na konci aktuálního dokumentu.

\TeX{}ový uživatel chce v místě citace ve zdrojovém souboru aktuálního
dokumentu uvést jen {\em lejblík}, který se v dokumentu nezobrazí a který
jednoznačně určuje bibliografický záznam v použité databázi. \TeX{} by měl
pak automaticky vymyslet a použít odkazovou značku, která se naopak v
dokumentu zobrazí. Dále z vnější
databáze přečte údaje o odkazovaném dokumentu, aby mohl do seznamu
bibliografických záznamů připojit o dokumentu další záznam. Odkazové značky i seznam
bibliografických záznamů pak vznikají automaticky.

Předmětem nejrůznějších konvencí a norem je forma odkazových značek (jsou
typicky {\em numerické} nebo {\em obecné}) a pravidla jejich kumulace,
objeví-li se jich více na jednom místě citace. S tím souvisí i otázka, jakými
závorkami odkazové značky obklopit. Dále existují pravidla určující, které
údaje zařadit do bibliografického záznamu, jakým způsobem a v jakém pořadí
údaje do záznamu vkládat a jakými interpunkčními značkami je oddělovat a
jakými slovními spojeními či zkratkami je uvozovat. Pro různé {\em typy}
odkazovaných dokumentů se obvykle stanoví sada {\em povinných} údajů, které
v záznamu musejí bezpodmínečně být, a dále sada {\em doporučených} údajů.
Ostatní údaje, které nejsou ani povinné ani doporučené, ale jsou přítomny v
databázi, se nepoužijí. V~souvislosti s~tím je typickým údajem seznam
autorů, ve kterém je třeba řešit pořadí autorů (zda podle míry zásluhy na
vzniku dokumentu nebo podle abecedy), uvedení autorů celým jménem nebo s
iniciálami, pořadí jména a přímení (resp. otčestva a dalších méně obvyklých
součástí jména), oddělovací interpunkce mezi jednotlivými autory apod.
Konečně se vyskytují požadavky na způsob řazení jednotlivých
bibliografických záznamů v seznamu. Řazení může být podle pořadí
odpovídajícího místa citace v aktuálním dokumentu nebo podle nejrůznějších
jiných pravidel: podle abecedy prvního autora, podle roku, či dokonce měsíce
vydání, podle jména časopisu, podle směsi předchozích, podle pravidla, že
autor aktuálního dokumentu uvede své autocitace nejdříve a potom teprve
ostatní atd.

Vzhledem k tomu, že chceme, aby odkazové značky i seznamy bibliografických
záznamů vznikaly v aktuálním dokumentu automaticky jen na základě použitých
lejblíků, potřebujeme naprosto přesně zformulovat uvedená pravidla a pak se
bavit o tom, zda to je technicky možné, zda je k tomu dostatek připravených
údajů ve vnější bibliografické databázi, zda je navržena vhodná struktura
této databáze a jak to technicky realizovat. Tento druh přesnosti bohužel
žádná norma neobsahuje. Navíc pořád vznikají nové a nové typy odkazovaných
dokumentů v~dřívějších dobách nemyslitelné (např. \uv{výkřik na internetu}
nebo \uv{YouTube video}), další druhy údajů v~bibliografických záznamech
dříve nepoužívaných (např. DOI, URL atd.). Autor aktuálního dokumentu nebo
technické realizace automatu na generování bibliografických záznamů se tedy
musí často spolehnout sám na sebe, jak netypické věci řešit. A pak přijdou
mudrcové, kteří vyhrabou třeba nějakou starodávnou normu a argumentují, že
je něco špatně. Když se takového mudrce zeptáme, zda například údaj o vydání
máme psát jako 2.~vyd., 2.~vydání, 2.~Ed., $2^{\rm nd}$~ed., Second Edition
a přihodíme otázku, zda údaj má odpovídat jazyku aktuálního dokumentu nebo
citovaného dokumentu, většinou se nic kloudného nedozvíme. Je potřeba použít
vlastní názor. Úpravy na této úrovni budou snadno možné jen tehdy, když
základní technická implementace bude co nejjednodušší a realizovaná jasnými
a přímočarými \TeX{}ovými makry. A to je hlavním cílem balíčku OPmac-bib.


\sec OPmac bez bib

Sada maker OPmac~\cite[opmac] umožňuje práci s bibliografickými odkazy i bez použití
přídavného modulu \hbox{OPmac-bib}. Shrňme si tedy nejprve tyto základní vlastnosti.

V místě citace se používá "\cite[<lejblík>]", případně při více odkazech v
jednom místě použijeme lejblíky oddělené čárkou, tedy 
"\cite[<lejblíkA>,<lejblíkB>,<lejblíkC>]".
Bibliografický záznam lze zapsat na jiné místo dokumentu \uv{manuálně}
pomocí "\bib[<lejblík>] <záznam>". Primárně OPmac vygeneruje pro odkazové
značky čísla. Čísla jsou přidělována vzestupně podle pořadí bibliografických
záznamů a jsou implicitně uzavřena v hranatých závorkách. Existuje-li v
jednom místě citace více odkazů, jsou všechny značky umístěny do společné
závorky a odděleny čárkami. Při "\sortcitations" jsou čísla v každém místě
citace seřazena podle velikosti a při "\shortcitations" se navíc souvislé řady
čísel [3, 4, 5, 11, 12] promění automaticky v intervaly \hbox{[3--5,
11--12]}.

Jak vytvořit jiné běžné formy pro odkazové značky (jiné závorky místo
hranatých, čísla ve formě horních indexů) je popsáno v uživatelské
dokumentaci k OPmac.

Při "\nonumcitations" použije OPmac obecné odkazové značky,
které jsou u manuálně zapsaných bibliografických záznamů deklarovány takto:
"\bib [<lejblík>] = {<značka>} <záznam>".

OPmac dále nabízí v místě citace vynechat závorku kolem značky pomocí
"\rcite[<lejblíky>]". Uživatel si pak může závorky přidat sám, případně do nich
může přidat další údaje (třeba o čísle strany odkazovaného dokumentu). A při
použití "\ecite[<lejblík>]{<značka>}" lze zanést do místa citace manuálně
konkrétní "<značku>".

OPmac nabízí kromě manuálně tvořených seznamů bibliografických záznamů též
možnost tyto záznamy generovat obvyklým způsobem za použití Bib\TeX{}u nebo
vylepšeným způsobem za použití Bib\TeX{}em jednou předgenerované databáze.
Při klasickém použití Bib\TeX{}u stačí do místa, kde chceme vygenerovat
seznam bibliografických záznamů, vložit "\usebibtex{<bib-báze>}{<bst-styl>}"
a po \TeX{}ování spustit Bib\TeX{} a následně \TeX{}ovat ještě dvakrát.
Bib\TeX{} přečte z "<bib-báze>" (což je databáze bibliografických záznamů
typicky uložená v~souboru~"*.bib") jen ty záznamy, jejichž lejblíky byly
použity v~aktuálním dokumentu, a sestaví seznam bibliografických záznamů.
Formu jednotlivých záznamů a způsob jejich řazení určuje "<bst-styl>", což
je program uložený v souboru "*.bst", který během své činnosti Bib\TeX{}
interpretuje. Bohužel jazyk "*.bst" stylů je velice, ale opravdu velice
obskurní, takže dnes je situace taková, že skoro nikdo nemá odvahu do už
existujících stylů rýpnout. Pokud to někdo zkusil, má z~toho asi
(podobně jako já) zážitek na celý život. Jednotlivé časopisy si oprašují svůj
prastarý "*.bst" styl a vyžadují jej při přípravě článků použít. Modifikace
nejsou skoro možné. Chodí se okolo toho jako kolem horké kaše a když je
nějaký netypický odkaz neřešený v "*.bst" stylu, pak skoro nikdo neví, co 
s~tím.{\looseness=-1 \par}


\sec Bibliografické databáze

Data k bibliografickým záznamům pro použití v \TeX{}u se dnes nejčastěji
vyskytují v souborech "*.bib". Formát tohoto souboru vymyslel Oren
Patashnik, autor Bib\TeX{}u~\cite[bibtex]. 
Níže popíšeme plno nevýhod tohoto letitého formátu, ale
nejprve uvedu jednoznačnou výhodu: je to textový soubor. A není to žádné
nepřehledné XML, člověk se v tom s běžným textovým editorem docela dobře
orientuje. Jeden záznam v "*.bib" souboru může vypadat takto:

\begtt
@Book{Knuth:1984:TB,
  author =       "Donald E. Knuth",
  title =        "The {\TeX}book",
  publisher =    pub-AW,
  address =      pub-AW:adr,
  pages =        "ix + 483",
  year =         "1984",
  ISBN =         "0-201-13448-9 (paperback), 0-201-13447-0 (hardcover)",
  ISBN-13 =      "978-0-201-13448-3 (paperback), 978-0-201-13447-6 (hardcover)",
  LCCN =         "Z253.4.T47 K58 1984",
  bibdate =      "Fri Jul 22 09:08:51 1994",
  bibsource =    "http://www.math.utah.edu/pub/tex/bib/texbook3.bib",
  price =        "US\$15.95 (paperback), US\$32.95 (hardcover)",
}
\endtt

Za znakem "@" následuje typ záznamu (v tomto případě kniha) a dále ve
svorkách je vlastní záznam. První údaj před první čárkou je lejblík
dokumentu. To tedy znamená, že \TeX{}book bychom mohli při použití takového
"*.bib" souboru citovat pomocí "\cite[Knuth:1984:TB]".
V záznamu pak dále nasleduje čárkami oddělené údaje ve tvaru 
"klíč = hodnota", přitom "hodnota" je uzavřena do uvozovek nebo svorek nebo
do ničeho, pokud to je numerický údaj nebo pokud se má hodnota expandovat.
Bib\TeX{}ový styl "*.bst" mimo jiné určí, které údaje se při použití záznamu daného
typu skutečně použijí a všechny ostatní jsou ignorovány. 

Takové "*.bib" databáze se vyskytují všude možně na internetu. Také dnešní
programy na zpracování bibliografických záznamů umožňují mimo jiné export do
"*.bib" formátu. Konečně existují i příjemné grafické programy, které
nabízejí uživateli pohodlnou práci "*.bib" databázemi.

Nevýhodou "*.bib" formátu je bohužel fakt, že jej lze velmi obtížně přečíst
\TeX{}em se všemi vlastnostmi, které v tomto formátu využívá Bib\TeX{}.
Například typ dokumentu a klíč k údajům je možné psát velkými i malými
písmeny podle nálady, tj. je to na velikosti písmen nezávislé. Dále není pro
programování parseru příjemná dvojí možnost ohraničení hodnot a také velká
tolerance v možnostech, jak zapsat v "*.bib" souborech jména autorů. Můžeme
psát "Donald Ervin Knuth" nebo "Knuth, Donald E." nebo "Knuth, Donald Ervin"
anebo tak, jak je uvedeno v ukázce výše. Parser přitom potřebuje vědět, co
je příjmení a co křestní jména.

Ale největší komplikace při programování parseru 
způsobuje možnost Bib\TeX{}ové expanze údajů, která se chová
odlišně, než běžná \TeX{}ová expanze. Například v předchozí ukázce jsou dva údaje
"pub-AW" a "pub-AW:adr", které Bib\TeX{} nahradí na základě následujících
instrukcí napsaných na jiném místě stejného "*.bib" souboru:

\begtt
@String{pub-AW     = "Ad{\-d}i{\-s}on-Wes{\-l}ey"}
@String{pub-AW:adr = "Reading, MA, USA"}
\endtt 

Balíček "librarian.tex", který je v OPmac-bib použit, zvládá všechny
záludnosti formátu "*.bib" souborů až na jednu: nedokáže provést náhrady
deklarované pomocí "@String". Naštěstí automaticky generované "*.bib"
soubory, které se dnes nejčastěji používají, neobsahují "@String". A když
se setkáme se starším "*.bib" souborem, pak můžeme použít programy,
které \uv{očistí} "*.bib" soubor od "@String" a požadované náhrady provedou. 

Bib\TeX{} se svými styly v úsvitu počítačových věků rozlišoval jen tyto typy
bibliografických záznamů: "@article", "@book", "@booklet",
"@conference", "@inbook", "@incollection", "@inproceedings", "@manual",
"@mastersthesis", "@misc", "@phdthesis", "@proceedings", "@techreport",
"@unpublished". Pro každý typ je vymezena sada povinných a nepovinných
údajů, jak je popsáno například na
\url{http://en.wikipedia.org/wiki/BibTeX}. Typicky se tehdy pracovalo s
těmito údaji: "address", "annote", "author", "booktitle", "chapter",
"crossref", "edition", "editor", "howpublished", "institution", "journal",
"key", "month", "note", "number", "organization", "pages", "publisher",
"school", "series", "title", "type", "volume", "year".
Pokud jste se se svými bibliografickými záznamy do tohoto rámce nevešli,
měli jste smůlu. Tj. např. ISBN, URL, DOI a podobné věci začali lidé
cpát do údaje "note". Samozřejmě, mohli jste si vymezit samostatný údaj
"isbn" (jako v~předchozí ukázce), ale staré Bib\TeX{}ové styly to pak
jednoduše ignorovaly. A o nízké flexibilitě těchto stylů jsem se zmínil už
výše.
{\emergencystretch=2em\par}

Je nejvyšší čas ukončit tento úvod o Bib\TeX{}ových technologiích a pustit se 
do popisu modulu OPmac-bib.


\sec OPmac-bib z  pohledu uživatele

Na začátku dokumentu uživatel napíše "\input opmac-bib". Není nutné psát
"\input opmac", protože pokud není "opmac.tex" zaveden, balíček "opmac-bib"
to napraví. Dále je automaticky načten soubor maker
"librarian.tex". Je tedy potřebné, aby byl tento balíček v \TeX{}ové
distribuci instalován.

V textu v místě citace uživatel používá obvyklé "\cite[<lejblíky>]", kde
"<lejblíky>" (oddělené čárkou) vybírá ve shodě s tím, jaké lejblíky má
připraveny u záznamů ve své "*.bib" databázi. Pokud nechce do textu vložit
odkazovou značku, ale přesto chce mít v seznamu bibliografických záznamů příslušný
záznam, může napsat "\nocite[<lejblíky>]". Chce-li vytisknout všechny
záznamy z "*.bib" databáze, může použit "\nocite[*]".

V místě seznamu bibliografických záznamů uživatel napíše

\begtt
\usebib/s (<styl>) <bib-báze>
\endtt
%
kde "<bib-báze>" je název souboru "*.bib" bez přípony s bibliografickými
záznamy. Je možné načíst i více takových souborů, pak je třeba jejich názvy
oddělit čárkami bez mezer. Parametr "<styl>" určuje formu zobrazení záznamů a
jejich řazení. Konkrétně "<styl>" musí být součást názvu nějakého souboru
maker "opmac-bib-<styl>.tex", který se pro tyto účely přečte. Konečně
parametr "/s" říká, že řazení záznamů bude podléhat pravidlům podle
přečteného stylového souboru. Místo toho může uživatel napsat "/c", což
značí, že řazení záznamů bude podléhat pořadí, jak se poprvé vyskytly 
v parametrech "\cite" a "\nocite".

Dokument je typicky potřeba \TeX{}ovat dvakrát. Nejprve se vytvoří seznam
bibliografických záznamů (obvykle na konci dokumentu) a jednotlivým záznamům
se v tuto chvíli přiřadí odkazové značky. V~druhém průchodu se tyto značky
použijí i v místech citace.

OPmac-bib nabízí uživatelům dva připravené styly: "simple" a "iso690", tedy
v balíčku lze nalézt soubory "opmac-bib-simple.tex" a
"opmac-bib-iso690.tex". Druhý jmenovaný tiskne záznamy v souladu s~normou
ISO~690, zatímco první jmenovaný je jednoduchý a slouží jako výchozí pro
vlastní projekty uživatelů. To znamená, že si uživatel může soubor
"opmac-bib-simple.tex" zkopírovat třeba do "opmac-bib-muj.tex" a pustit se
do modifikací maker a přidávání dalších vlastních maker. 
Součástí balíčku OPmac je také "*.bib" soubor s~experimentálními záznamy 
"op-example.bib". Experimentování s~"opmac-bib.tex" můžete začít 
třeba takto:

\begtt
\input opmac-bib

Tady je \cite[tbn,texbook] a také \cite[Cmej].
\bigskip
\usebib/s (simple) op-example
\bye
\endtt
%
Dále můžete zkusit nahradit styl "simple" stylem "iso690" a také můžete
třeba zkusit připravit font "\sc" příkazem "\font\sc=cscsc10". Dále zkuste
dokument (zpracovávaný \CS{}plainem) označit jako český pomocí "\chyph" a
sledujte změny ve formě bibliografických záznamů. Konečně můžete zkusit
zaměnit numerické odkazové značky za obecné pomocí "\nonumcitations".

Existuje-li v databázi více záznamů se stejným lejblíkem, pak (od verze
OPmac-bib Jan. 2016) platí pravidlo \uv{první vyhrává}. To umožní předřadit do seznamu
souborů "<bib-báze>" dopředu soubor, ve kterém můžete mít speciální
modifikaci záznamů pro konkrétní dokument. Například je možné si založit
"local.bib" v adresáři dokumentu a psát:

\begtt
\usebib/s (iso690) local,global,op-example
\endtt
%
Záznamy v souborech napsaných dříve mají přednost před pozdějšími. Pokud
jsou všechny potřebné záznamy načteny, a přitom nebyly přečteny všechny
specifikované soubory, zbylé soubory se ignorují.


\sec Vlastnosti stylu {\tt iso690}

Podrobnou dokumentaci k tomuto stylu lze nalézt v souboru
"opmac-bib-iso690.tex" za "\endpinput". Zde uvedu jen krátké shrnutí.
V sekci~\ref[author] jsou dále podrobněji
rozvedeny jen vlastnosti jediného údaje "author", aby si čtenář mohl 
udělat představu, jak široká je to problematika.

Styl "iso690" předpokládá v zásadě stejné typy záznamů a názvy údajů, jako starobylý
Bib\TeX{}. Je tedy možné vyjít z existujících "*.bib" souborů a hrubý
výsledek se dostaví. Kromě toho je možné pro každý záznam vložit následující
doplňující údaje:

\begtt
option    ... parametry upřesňující tisk údajů oddělené mezerami.
lang      ... dvě písmena pro označení jazyka dokumentu (en, cs, sk, de, atd.).
bibmark   ... obecná odkazová značka použitá při \nonumcitations.
ednote    ... informace o vydání (ilustrátoři, odpovědní redaktoři atd.).
citedate  ... datum citace ve tvaru rok/měsíc/den.
numbering ... alternativní formát pro číslování časopisů.
isbn      ... ISBN
issn      ... ISSN
doi       ... DOI
url       ... URL
\endtt


\label[author]
\secc Údaj {\tt author}

Údaj "author" je všeobecně znám z Bib\TeX{}u. Obsahuje jednoho nebo více
autorů odkazovaného dokumentu. Jednotliví autoři jsou ve vstupním souboru
"*.bib" odděleni separátorem {\def\intthook{\adef{ }{\char`\ }}" and "}.
Obvykle jsou ve vstupním souboru uvedeni ve formátu

\begtt
Křestní Jména von Příjmení
nebo
von Příjmení, Křestní Jména
nebo
von Příjmení, dodatek, Křestní Jména
\endtt 
%
Tedy:

\begtt
Leonardo Piero da Vinci
nebo
da Vinci, Leonardo Piero
nebo
da Vinci, painter, Leonardo Piero
\endtt

Separátor {\def\intthook{\adef{ }{\char`\ }}" and "} mezi autory je
konvertován na čárky s mezerou. Na výstupu je slovo \uv{and} jen mezi
předposledním a posledním autorem. 

Norma ISO-690 uvádí v příkladu, že jméno prvního autora je tištěno ve formátu
\uv{{\sc Příjmení}, Křestní Jména von, dodatek} a jména dalších případných
autorů jsou v odlišném formátu: {Křestní Jména von {\sc Příjmení}, dodatek}.
Takže třeba

\begtt
author = "John Green and Bob Brown and Alice Black",
\endtt
%
dá na výstupu v souladu s normou: {\sc Green}, John, Bob {\sc Brown}, and
Alice {\sc Black}. Jednotlivá příjmení budou tištěna pomocí fontového
přepínače "\sc". Pokud tento přepínač není dostupný, budou tištěna
verzálkami. Je-li odkazovaný dokument jiný než anglický, spojka \uv{and}
mezi posledními dvěma autory se nahradí odpovídající spojkou podle jazyka
odkazovaného dokumentu. Takže třeba:

\begtt
author = "Jan Novák and Jiří Dvořák and Ferdinand Mravenec",
lang   = "cs",
\endtt
%
dá na výstupu: {\sc Novák}, Jan, Jiří {\sc Dvořák} a Ferdinand {\sc Mravenec}.

Je-li specifikován "option" "aumax:<číslo>", vytiskne se nejvýše "<číslo>"
autorů. Je-li jich ve vstupním souboru více, připojí se za posledního autora
příchlastek \uv{et~al.} (podoba příchlastku závisí na jazyce odkazovaného
dokumentu, v češtině se třeba dočkáme \uv{a~kol.}). Například:

\begtt
author = "John Green and Bob Brown and Alice Black",
option = "aumax:1",
\endtt
%
dá na výstupu: {\sc Green}, John,~et~al. 

Parametry "option" se nemusejí uvádět v jednotlivých záznamech v "*.bib"
souboru. Je možné je deklarovat \uv{globálně} pro všechny záznamy pomocí
"\def\biboptions{...}". Kromě parametru "aumax" je k dispozici též parametr
"aumin:<číslo>", který udává počet skutečně vytištěných autorů, pokud
celkový počet autorů v "*.bib" souboru přesahuje "aumax". Takže třeba

\begtt
\def\biboptions {aumax:4 aumin:1}  
\endtt  
%
způsobí, že pokud je skutečný počet autorů menší nebo roven čtyřem,
vytisknou se všichni. Jinak se vytiskne jen první autor a za něj se připojí
\uv{et~al.}.

Víme-li, že v "*.bib" souboru nejsou uvedeni všichni autoři a chceme tedy v
každém případě připojit \uv{et~al.}, je třeba přidat "option"
"auetal". Tedy:

\begtt
author = "John Green and Bob Brown and Alice Black",
option = "auetal",
\endtt
způsobí: {\sc Green}, John, Bob {\sc Brown}, Alice {\sc Black},~et~al.

Pokud potřebujeme k autorům přidat speciální doprovodný text, je možné k
tomuto účelu
použít "option" "auprint{<text>}". Místo seznamu autorů se vytiskne
"<text>". Přitom "<text>" může obsahovat užití marka "\AU", které vytiskne
seznam autorů. Například:

\begtt
author = "Robert Galbraith",
option = "auprint:{\AU\space [pseudonym of J. K. Rowling]}",
\endtt
%
vytiskne:  {\sc Galbraith}, Robert [pseudonym of J. K. Rowling].

Někdy je žádoucí zkracovat křestní jména. K tomu slouží "option"
"autrim:<číslo>". Je-li počet autorů, který se má tisknout po aplikaci
"aumax" a "aumin" větší nebo roven "<číslo>", křestní jména všech autorů
budou zkrácena. To znamená, že pokud je "autrim:1", budou vždy všechna
křestní jména zkrácena. Třeba:

\begtt
author = "John Green and Bob Brown and Alice Black",
option = "auetal autrim:1",
lang   = "cs"
\endtt
dá na výstupu: {\sc Green}, J., B. {\sc Brown}, A. {\sc Black}~a~kol.


\secc Jazyk zkratek a dalších automaticky generovaných slov

Zkratky, předložky, spojky a další slova automaticky vkládaná do záznamů jsou
dvojího druhu. Buď jsou součástí nějakého údaje a měly by být vyjádřeny
jazykem odkazovaného dokumentu. Nebo uvozují nějaký údaj a toto uvození by
mělo být v celém seznamu bibliografických záznamů stejné. Pak by takové
slovo mělo být řečeno jazykem aktuálního dokumentu. Příkladem prvního
druhu je \uv{and} mezi předposledním a posledním autorem nebo značka \uv{pp}
pro rozsah stran. Příkladem druhého
druhu je slovní spojení \uv{Dostupné na}, kterým se má dle normy ISO~690
uvádět například údaj URL. Je-li jazyk aktuálního dokumentu například
angličtina, asi bychom neměli radost z \uv{Dostupné na} a uvítali bychom spíš
\uv{Available from}. Takže:

\begtt
url = "http://petr.olsak.net/opmac.html"
\endtt
%
vytiskne: Dostupné na \url{http://petr.olsak.net/opmac.html} v případě, že
je jazyk aktuálního dokumentu český (tj. je nastaveno "\chyph") a vytiskne:
Avaliable from \url{http://petr.olsak.net/opmac.html} v případě, že je jazyk
aktuálního dokumentu anglický. A výsledek není ovlivněn existencí
údaje "lang".

Pokud záznam neobsahuje údaj "lang", předpokládá se jazyk odkazovaného
dokumentu totožný s~jazykem aktuálního dokumentu. Jinak se pro vzory dělení
slov konkrétního záznamu a pro automaticky generovaná slova prvního druhu
tohoto záznamu použije jazyk specifikovaný v "lang".


\secc Řazení záznamů

Jak bylo řečeno, pokud uživatel napíše "\usebib/c", budou záznamy řazeny
podle jejich první zmínky v~místech citace. Pokud chceme řadit záznamy
jinak, pak dle normy ISO~690 je třeba nejprve vzít v~úvahu příjmení a pak
křestní jména prvního autora odkazovaného dokumentu a řadit záznamy
abecedně. Pokud je tento údaj pro více záznamů stejný, rozhoduje rok vydání
(od starších k novějším). Pokud je i rok stejný, norma další způsob řazení
nezmiňuje.

Problém nastane, začneme-li se ptát, co to je \uv{abecední řazení}. Každý
jazyk má svá vlastní pravidla abecedního řazení a v případě autorů ze všech
možných koutů světa máme abecedně řadit hotový babylón. Nápad, že se má
použít pro řazení jazyk aktuálního dokumentu, nepomůže, protože mnozí autoři
mají ve svých jménech písmenka, která jazyk aktuálního dokumentu vůbec
nezná. Proto jsem se rozhodl pravidla abecedního řazení nekomplikovat a
uchýlil jsem se jen k jednoduchému řazení, které nabízí přímo "librarian": řadit
podle kódů použitých znaků s možností stanovit výjimky. To samozřejmě mnohdy
dává implicitně nesprávné výsledky, ale ty je možné ošetřit výjimkami podle
jazyka citovaného dokumentu. Takže třeba autorka
Čmejrková Světla se implicitně zařadí nespravedlivě až někam na konec seznamu záznamů.
Je ale možné v údaji "key" uvést string, podle kterého se má řadit.
Není-li údaj "key" použit, použije se pro řazení string z údaje "author", jinak
se použije string z údaje "key". Údaj:

\begtt
author    = "Světla Čmejrková",
key       = "Czzmejrkova Svetla",
\endtt
%
způsobí, že Světla Čmejrková se zařadí mezi \uv{C} a \uv{D}, tedy tam, kde
bychom jí my Češi hledali.

Někdy existuje požadavek dávat autocitace dopředu, tedy odkazované dokumenty
autora, který je též autorem aktuálního dokumentu, mají být vpředu v první
části seznamu záznamů. Toho můžeme dosáhnout třeba tak, že do údaje "key" vložíme
na začátek znak "@", který má kód menší než jakékoli písmeno abecedy.


\sec Tvorba stylu

Tvůrci bibliografických stylů mají možnost se inspirovat existujícími
soubory "opmac-bib-simple.tex" a "opmac-bib-iso690.tex". Dokumentaci pro
tvorbu stylů najdou v souboru "opmac-bib.tex" za "\endinput".

Stylový soubor je načten během činnosti makra "\usebib" v \TeX{}ové skupině, 
ve které jsou následně načteny "*.bib" soubory a ve které je vytištěn seznam záznamů.
Takže všechny definice a přiřazení užité ve stylovém souboru jsou lokální.
Těsně po načtení stylového souboru se provede makro "\bibtexhook", ve kterém
může uživatel některé definice stylového souboru dodatečně modifikovat.

Stylový soubor by měl definovat makra "print:<typ>", která se spustí pro
tisk jednotlivého záznamu daného typu. Například "print:book" se spustí v
případě, že záznam je typu "@Book". Ačkoli v "*.bib" souboru je možné
pro určení typu používat velká i malá písmena, zde musí být typ zapsán
malými písmeny. Dále má programátor stylů k dispozici makra "\bprinta" a
"\bprintb", která mají zhruba stejnou syntaxi a stejný význam:

\begtt
\bprinta [<jméno údaje>] {<je-li údaj v záznamu přítomen>} {<je-li údaj nepřítomen>}
\endtt

V textu "<je-li údaj v záznamu přítomen>" je možné použít symbol hvězdičky,
který se nahradí hodnotou specifikovaného údaje. Hvězdička ale nesmí být
schována v další úrovni závorek "{...}". To platí pro "\bprinta".
Při použití "\bprintb" je možné místo hvězdičky použít "##1" (nebo více
křížů, je-li makro vnořeno do jiného makra). Takový parametr se může nalézat
uvnitř další úrovně závorek "{...}". Podívejme se, jak je tištěn třeba údaj typu "@Book"
při užití stylu "simple":

\begtt
\sdef{print:book}{%
   \bprinta [!author]    {*\.\ }{\bibwarning}%
   \bprintb [title]      {{\em##1}\.\ }{\bibwarning}%
   \bprinta [edition]    {*~\mtext{bib.edition}.\ }{}%
   \bprinta [address]    {*: }{\bibwarning}%
   \bprinta [publisher]  {*, }{\bibwarning}%
   \bprinta [year]       {*.\ }{\bibwarning}%
   \bprinta [isbn]       {ISBN~*.\ }{\bibwarning}%
   \bprintb [url]        {\preurl\url{##1}. }{}%
}
\endtt
%
Nejprve je vytištěn seznam autorů. Vykřičník na začátku slova "author"
znamená, že se tento údaj netiskne \uv{tak, jak je}, ale nejprve podléhá
dalším konverzím deklarovaným na jiném místě stylového souboru.
Seznam autorů po konverzi je vytištěn v místě hvězdičky, pak následuje
\uv{možná tečka} což zařídí makro~"\.", které vytiskne tečku jen tehdy,
když nepředchází tečka, vykřičník nebo otazník. Proč to potřebujeme? Jméno
může končit zkratkou křestního jména, za kterou je tečka. My zde nechceme v takovém
případě přidávat tečku další. Za \uv{možná tečkou} následuje mezera pomocí 
"\"{\tt\char`\ }. 
Když chybí údaj "author", zobrazí se o tom na terminálu a v logu 
varování pomocí makra "\bibwarning". 

Pak následuje tisk titulu. Ten je vytištěn celý kurzívou pomocí "{\em##1}" a
je ukončen \uv{možná tečkou}, protože titul může končit třeba otazníkem a
tehdy je tečka nežádoucí.
Pak následuje mezera. Protože údaj "title" také patří mezi povinné údaje
pro typ "@Book", "\bibwarning" zobrazí varování, když tento údaj chybí.

Poté následuje nepovinný údaj o čísle vydání "edition". K němu se připojí za
nezlomitelnou mezeru text závislý na jazyku odkazovaného dokumentu. Text má
lejblík "bib.edition" a je deklarován ve stylovém souboru pomocí:

\begtt
% Multilinguals:      English     Czech     Slovak
\mtdef{bib.edition}   {edition}   {vydání}  {vydanie}
\endtt
%
Jak přidat další jazyk je popsáno v uživatelské dokumentaci k OPmac v
sekci~18.

V naší ukázce pro tisk záznamu typu "@Book" následuje povinný údaj "address"
s adresou nakladatele (píše se tradičně jen město) za kterým je dvojtečka,
mezera a povinný údaj se jménem nakladatele "publisher", za ním je čárka,
mezera a povinný údaj o roku vydání, za ním tečka a mezera. Dále následuje
povinný údaj "isbn", před který je předřazena zkratka ISBN a nedělitelná
mezera. Za údajem je tečka a mezera. Konečně následuje nepovinný údaj o~URL,
před kterým předchází obsah makra "\preurl".

Ke zpracování údaje "author" slouží makro "\authorname", které musí
programátor stylu vytvořit. Toto makro je voláno pro každý záznam třeba
opakovaně tolikrát, kolik je v záznamu autorů. Makro pracuje s údaji
"\NameCount", kde je pořadové číslo autora v rámci jednoho záznamu, dále
"0\namecount" označuje celkový počet autorů v záznamu, "\Lastname" obsahuje
příjmení, "\Firstname" křestní jména, "\Von" obsahuje případnou předložku ve
jméně a "\Junior" obsahuje dodatek ke jménu. Následuje ukázka makra
"\authorname" ze stylu "simple":

\begtt
\def\authorname{%
  \ifnum\NameCount>1
     \ifnum0\namecount=\NameCount \mtext{bib.and}\else , \fi
  \else
     \ifx\dobibmark\undefined \edef\dobibmark{\Lastname}\fi
  \fi
  \bprintc\Firstname{* }\bprintc\Von{* }\Lastname\bprintc\Junior{, *}%
}
\endtt

Vidíme, že pokud se jedná o prvního autora, uložíme si do makra "\dobibmark"
jeho příjmení. Jinak přidáme před autora čárku, ale když je to poslední
autor, předřadíme spojku \uv{and} závislou na jazyku odkazovaného dokumentu pomocí 
"\mtext{bib.and}". Dále vytiskneme křestní jména, pak případné "\Von", pak
příjmení a nakonec dodatek, před kterým je předřazena čárka. Nepovinné údaje
tiskneme pomocí makra "\bprintc", které nevytiskne nic, když údaj chybí, ale
vytiskne údaj společně s textem svého parametru, když je údaj přítomný.
Takže třeba mezera za "\Von" se vytiskne jen tehdy, když existuje údaj "\Von" 
(což se tedy u běžných jmen nestává moc často).

Styl by měl také vygenerovat obecnou odkazovou značku
užitou při "\nonumcitations". Kam dále vede cesta makra "\dobibmark", do
kterého jsme si zatím uložili příjmení prvního autora, si
zájemce o stylové programování může dohledat v souboru "opmac-bib-simple.tex"
samostatně.

Dají se programovat i daleko složitější stylové soubory, což dokládá ukázka
stylu "iso690". Jediné, co k tomu potřebujete, je nebát se programování v~\TeX{}u.


\sec Další možnosti

Stylové soubory pro OPmac-bib sice řeší formu každého vytištěného záznamu,
ale jen z hlediska jednoho pomyslného řádku za sebou jdoucích údajů. Jak se
tento řádek rozláme do odstavce, jaké bude mít odsazení, jaká značka (pokud
vůbec nějaká) se před odstavec předřadí, to vše je starost přímo maker OPmac,
která lze podle potřeby měnit. Jmenovitě se o to stará makro
"\printbib", které je předsunuto před každý bibliografický záznam a 
má tuto implicitní hodnotu:

\begtt
\def\printbib{\hangindent=\iindent
   \ifx\citelinkA\empty \noindent\hskip\iindent \llap{[\the\bibnum] }%
   \else \noindent \fi
}
\endtt
%
Tedy: odsazení bude podle "\iindent", a když není aktivováno "\nonumcitations",
tak se vytiskne doleva v~rámci "\llap" numerická odkazová značka "\the\bibnum".
Je-li zapnuto "\nonumcitations", tak není "\citelinkA" prázdné a 
provede se jenom "\noindent" bez přidání odkazové značky.

V souvislosti s možností modifikovat makro "\printbib" bych si dovolil
upozornit na důležitý rozdíl v přístupu k řešení alternativních požadavků v
OPmac od například \LaTeX{}u nebo Con\TeX{}tu. Místo desítek, možná stovek
parametrů, které řeší příslušnou modifikaci chování maker a které je třeba
si pamatovat nebo je pořád dokola dohledávat v rozsáhlé dokumentaci, OPmac
nabízí {\em jednoduché výchozí makro} a vzkaz: pokud to chcete jinak, předefinujte
si to. Při tomto přístupu nepotřebujete udržovat v~paměti ty spousty parametrů a
jejich syntaxi, ale stačí jediné: umět programovat v \TeX{}u.

Na stránce OPmac triků je uvedeno mnoho dalších variant, jak definovat
"\printbib". Například OPmac trik 0040
\url{http://petr.olsak.net/opmac-tricks.html\#bibnumindent}
dává návod, jak odsadit všechny záznamy podle největší numerické odkazové značky.
Nebo OPmac trik 0041 
\url{http://petr.olsak.net/opmac-tricks.html\#bibmarkindent}
poskytuje možnost odsadit všechny záznamy podle nejširší odkazové značky, ne nutně
numerické.

Výchozí makro "\printbib" předpokládá při obecných odkazových značkách
(při "\nonumcitations"), že tyto značky obsahují příjmení prvního autora
a podle tohoto příjmení jsou záznamy řazené. Proto se v~takovém případě
nepřepisuje odkazová značka před záznamem znovu. Pokud byste tam tu značku
chtěli mít, pak se stačí inspirovat OPmac trikem 0096
\url{http://petr.olsak.net/opmac-tricks.html\#abib}.

Stylové soubory OPmac-bib implicitně generují obecné odkazové značky (použité při
nastavení "\nonumcitations")
ve tvaru [Příjmení,~rok]. Existuje-li ale pro daný záznam údaj "bibmark", použije
se tento údaj přednostně místo automaticky generovaného.

OPmac trik 0097 z \url{http://petr.olsak.net/opmac-tricks.html\#bibmark}
ukazuje, jak z těchto automaticky generovaných \uv{dlouhých odkazových značek}
jako třeba (Knuth,~1984) přejít na zkratky typu [Kn84] bez nutnosti zasahovat do stylového souboru
nebo do "*.bib" souboru. I takové zkrácené odkazové značky se občas vyskytují v
požadavcích na způsob odkazování dokumentů.

Dlouhé odkazové značky mohou mít svá vlastní pravidla při jejich kumulaci v
jednom místě citace. Asi je nežádoucí v jednom místě citace opakovat
stejného autora, například (Olšák, 1995, Olšák, 1997, Olšák, 2013) a chtěli
bychom místo toho psát (Olšák, 1995, 1997, 2013). Jak to udělat automaticky
pomocí maker, předvádí OPmac trik 0039
\url{http://petr.olsak.net/opmac-tricks.html\#ccite}. A pokud někoho ruší
čárka mezi autorem a rokem, může použít OPmac trik 0043
\url{http://petr.olsak.net/opmac-tricks.html\#modcite}.

Při použití obecných odkazových značek se může stát, že dva různé
záznamy dostanou stejnou odkazovou značku. OPmac trik 0098
\url{http://petr.olsak.net/opmac-tricks.html\#bibmarkcheck}
dává návod, jak tento problém diagnostikovat. Pokud to nastane, může pak autor
některým záznamům přidělit výjimečně jinou značku pomocí údaje "bibmark" v
"*.bib" souboru. 

Při sestavování sborníků, časopisů odborných článků nebo rozsáhlejší
monografie se může stát, že potřebujete mít v každé části díla (kapitole,
příspěvku, článku) samostatný seznam bibliografických záznamů a v těchto
celcích chcete lokálně přidělit odkazové značky (například numerické)
nezávisle na přidělení odkazových značek v jiné kapitole, příspěvku nebo
článku. Jako by to byly samostatné nezávislé dokumenty. Jak toto zahrnout do jediného
dokumentu, radí OPmac trik 0042
\url{http://petr.olsak.net/opmac-tricks.html\#morebibs}.


\sec Odkazy

\bib [bibtex]    Bib\TeX:   \url{http://www.bibtex.org/}
\bib [biber]     Biber:     \url{http://biblatex-biber.sourceforge.net/}
\bib [opmac]     OPmac:     \url{http://petr.olsak.net/opmac.html}
\bib [librarian] Librarian: \url{https://www.ctan.org/pkg/librarian}
\bib [ctustyle]  CTUstyle:  \url{http://petr.olsak.net/ctustyle.html}

\bye

