% Use format: csplain

\hsize11cm
\vsize16cm
\emergencystretch=1em

\parindent=1em

\font\petit=cstt8
\chyph

\def\cs{$\cal C\kern-.1667em\lower.5ex\hbox{$\cal S$}\kern-.075em $}

\def\allowhyphens{\nobreak\hskip0pt\relax}
\long\def \uv#1{\char254 \allowhyphens#1\allowhyphens\char255 }

\catcode`\"13
\def"{\leavevmode\hbox\bgroup\let"=\egroup\setverb\tt}
\def\setverb{\def\do##1{\catcode`##1=12}\dospecials\obeyspaces}
\def\begtt{\par\medskip\hrule\nobreak\smallskip
  \bgroup\def\par{\null\endgraf\penalty1001\noindent}\setverb
   \catcode`\"12\obeylines\baselineskip=.8\baselineskip\startverb}
{\catcode`|=0 \catcode`\\=12 |gdef|startverb#1\endtt{|petit #1|egroup
  |medskip|hrule|medskip}}
{\obeyspaces\gdef {\ }}

\def\begitems{\medskip\bgroup\catcode`\*=13 \narrower}
\def\enditems{\par\egroup\medskip}
{\catcode`\*=13 \gdef*{\par\noindent\llap{$\bullet$\ }\ignorespaces}}


\def\title#1\par{\noindent{\bf#1}\bigskip}
\def\autor#1\par{\noindent{\bf#1}\medskip}
\def\sec#1\par{\bigskip\noindent{\bf#1}\par\nobreak\medskip}

\def\b #1 {\medskip\noindent{\bf #1.\enspace}}
\catcode`\<=13 \def<{$\prec$}
\catcode`\>=13 \def>{$\succ$}

\def\?{\setbox0=\hbox{<}\hbox to\wd0{\hss?\hss}}


\title  Program csr (Czech SoRt) -- abecedn� �azen� podle normy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\autor  Petr Ol��k

Nejprve jsem si podle dokumentace pana Wagnera k~programu {\tt csindex}
ud�lal soukromou verzi programu na abecedn� �azen�. Pak mi kolega Josef
Tkadlec p�j�il normu �SN~01~0181 (Abecedn� �azen�). Jakmile jsem ji
otev�el, zhrozil jsem se. Kdy� jsem se vzpamatoval ze �oku, pokusil jsem se
sv�j program co nejv�ce p�ibl��it t�to norm� a hotov� produkt v�novat
ve�ejnosti. N�sleduje dokumentace k~programu. Zaj�mav� je z�ejm� odst.~5,
kde na mnoha m�stech doslova cituji normu, upozor�uji na rozpory a uv�d�m
p��padn� n�vrhy, jak probl�my �e�it.

Program {\tt csr} pou��v� speci�ln� �ty�pr�chodov� algoritmus abecedn�ho
�azen�. Prvn� dva pr�chody prob�haj� nad jednotliv�mi slovy a p��padn�
dal�� dva pr�chody nad obsahem cel� polo�ky. Podrobn�ji viz odst.~3.
Na rozd�l od �esk� verze programu {\tt makeindex} ({\tt csindex}) program
{\tt csr} �ad� pouze ��dky souboru bez dal��ho zpracov�n� pro form�tovac�
��ely. Pracuje s~extern� tabulkou znak�, kterou lze konvertovat do
libovoln�ho k�dov�n� a t�m prov�d�t �azen� v~libovoln�m k�dov�n�. Tuto
tabulku lze tak� editorem upravit tak, aby �adic� algoritmus l�pe vyhovoval
p�edstav�m u�ivatele. D�le, na rozd�l od programu {\tt csindex}, program
�e�� �azen� podle v�ce slov (nap�. p��jmen� a jm�no) a �azen� podle v�ce
polo�ek (heslo, dopln�k, podheslo atd.).

Program se vol� se t�emi parametry:
\smallskip

{\tt csr input sorttab output}
\smallskip
\noindent
kde {\tt input} je n�zev vstupn�ho souboru, {\tt sorttab} je n�zev souboru
s~tabulkou znak�, podle kter�ch se m� �adit a {\tt output} je n�zev v�stupn�ho
souboru. V�stupn� soubor m��e b�t shodn� se vstupn�m.

V�stup se bude od vstupu li�it v~po�ad� ��dk�, jinak v�echny
texty z�stanou beze zm�ny zachov�ny. V~hlavi�ce vstupn�ho souboru je mo�n�
specifikovat, podle kter�ch sloupc� se m� prov�d�t �azen� (viz odst.~2).

Program {\tt csr} najdete nap�. v~brn�nsk�m arch�vu {\tt ftp.muni.cz}
v~adres��i {\tt pub/tex/local/cstug/olsak/csr}. Krom� DOSovsk�
(zkompilovan�) verze {\tt csr.exe} tam je i zdrojov� text v~jazyce C, kter�
umo��uje snadno instalovat program pro nejr�zn�j�� UNIXy. V~UNIXu sta��
prov�st toto:
\smallskip

{\tt dos2unix csr.c csr.c} ... konverze na UNIXov� form�t

{\tt cc csr.c -o csr \ \ \ \ } ... vytvo�en� b�hov� verze programu
\smallskip

Proto�e program vy�aduje t�i parametry, je u�ite�n�
vyrobit script, nap��klad s~n�zvem {\tt csort}, obsahuj�c� ��dek:
\smallskip

\indent"csr $1 /uplna/specifikace/souboru/sorttab.iso $2"

\smallskip\noindent
Pak se d� program volat z~p��kazov� ��dky bez specifikace tabulky �azen�,
co� je ur�it� u�ivatelsky p�ijateln�j��. D�le pomoc� pracovn�ch soubor�
v~{\tt /tmp} a p��kazu {\tt cat} je mo�n� vylep�it script tak, aby se
choval jako filtr. Samoz�ejm� je nutn� p�esm�rovat {\tt stdout} programu do
{\tt stderr} nebo do {\tt /dev/null}. Program samotn� se jako filtr
nechov�. �ikovn� administr�to�i mohou script d�le roz���it o~mo�nosti
p�ep�n�n� mezi r�zn�mi k�dovac�mi tabulkami podle p�ep�na�� napsan�ch
v~p��kazov�m ��dku.



\sec 1. Pevn� a voln� ��dky vstupn�ho souboru
%--------------------------------------------

Ve vstupn�m souboru rozli�ujeme ��dky pevn� a voln�. Pevn� ��dky z�stanou
na stejn�m m�st� i ve v�stupn� souboru, zat�mco voln� ��dky podl�haj�
abecedn�mu �azen�. Zhruba �e�eno, pevn� ��dky mohou b�t na za��tku a konci
souboru, zat�mco \uv{uprost�ed} jsou ��dky voln�.

Pevn� ��dky jsou v�echny komentovan� ��dky na za��tku souboru. Komentovan�
��dek je ��dek, kter� m� v~prvn� pozici koment��ov� znak, nap��klad
procento (\%) (viz odst.~4). Tyto ��dky se bez zm�ny po�ad� p�ep��� do
v�stupn�ho souboru. Po�et takov�ch ��dk� m��e b�t libovoln�, tj. i nulov�.

Prvn� nekomentovan� ��dek souboru zahajuje pole voln�ch ��dk�. Pole
voln�ch ��dk� kon�� bu� koncem souboru nebo komentovan�m ��dkem. Od
tohoto komentovan�ho ��dku a� do konce souboru jsou v�echny ��dky
(i nekomentovan�) pevn�.

Poznamenejme, �e koment��ov� znak m� speci�ln� funkci pouze v~prvn� pozici
��dku. Kdekoli jinde se interpretuje jako oby�ejn� znak, tj. jako ka�d�
jin� a m��e nap��klad podl�hat i abecedn�mu �azen�.


\sec 2. Parametry polo�ek
%------------------------

Pokud v~poli pevn�ch ��dk� (na za��tku nebo na konci souboru) bezprost�edn�
za koment��ov�m znakem n�sleduje slovo "csr", program p�e�te z~tohoto ��dku
parametry polo�ek. Nap��klad:
\smallskip

\indent"%csr: 30-50, 10-29, 51-61"

\smallskip\noindent
znamen�, �e se bude nejprve �adit podle pod�et�zce (polo�ky) v~ka�d�m ��dku
od 30. do 50. sloupce, (nap��klad tam je v~ka�d�m ��dku naps�no p��jmen�),
pak podle polo�ky vymezen� 10. a� 29. sloupcem (t�eba tam je k�estn� jm�no)
a nakonec podle polo�ky vymezen� sloupci 51 a� 61 (je tam t�eba rodn�
��slo).

Symboly "-" (minus) a "," (��rka) jsou ve form�tu parametr� polo�ek nutn�.
Za posledn�m parametrem se nesm� napsat znak "," (��rka). Po�et polo�ek je
maxim�ln� 10.

Nenap��e-li se symbol "-" (minus), pak je dan� polo�ka ohrani�ena koncem
prvn�ho slova (tj. prvn�m v�skytem mezery, tabel�toru nebo konce ��dku).
Nap��klad, v�me-li, �e v�echna p��jmen� v~na�� datab�zi se skl�daj� jen
z~jednoho slova, pak stejn� po�adavek jako v~p�edchoz�m p��kladu m��eme
napsat takto:
\smallskip

\indent"%csr: 30, 10-29, 51"

\smallskip
Zde pouze v~poli k�estn�ch jmen p�edpokl�d�me v�skyt v�ce slov a proto jsme
specifikovali i konec polo�ky pro k�estn� jm�na.

Pozor na tabel�tory! Program interpretuje tabel�tor jako mezeru, tj. jedin�
znak. Program nem��e m�t p�edstavu, jak� interpretace tabel�toru je v~dan�m
p��pad� zvolena. Doporu�uje se proto nejprve nahradit v�echny tabel�tory
p��slu�n�m po�tem mezer a pak teprve ur�ovat parametry polo�ek. Jinak to
nebude �adit spr�vn�!

V~parametrech polo�ek m��e b�t bezprost�edn� za znakem "-" m�sto ��slice
znak "$". T�m je �e�eno, �e polo�ka kon�� a� koncem ��dku. Nap��klad
\smallskip

\indent"%csr: 1-$"

\smallskip\noindent
znamen�, �e ka�d� ��dek od za��tku do konce bude br�n jako jedin� polo�ka.
Toto nastaven� je implicitn� a pou�ije se tehdy, pokud chyb� v~poli pevn�ch
��dk� specifikace parametr� polo�ek.


\sec 3. Algoritmus �azen�
%------------------------

\vskip-\medskipamount

\b 3.1 Algoritmus porovn�v� jednotliv� ��dky nejprve podle polo�ek. Polo�ka je
    souvisl� pod�et�zec ��dku, kter� se obvykle specifikuje pomoc� zad�n�
    po��te�n�ho a koncov�ho sloupce (viz odst.~2). Polo�ek m��e b�t v�ce
    (maxim�ln� deset). Pokud se shled� obsah prvn� polo�ky z~hlediska
    �azen� shodn�, p�ejde se na porovn�n� druh� polo�ky, pak t�et� atd.

\b 3.2 Algoritmus porovn�v� jednotliv� polo�ky postupn� po jednotliv�ch
    slovech (zleva doprava). Slovo je skupina znak�, kter� je od dal��ho
    slova odd�lena mezerami a/nebo tabel�tory. Mezer a tabel�tor� m��e b�t
    mezi slovy libovoln� mno�stv� (po�et mezer a tabel�tor� mezi slovy na
    �azen� nem� vliv). Pokud se nap�. prvn� slovo shled� z~hlediska �azen�
    stejn�, p�ejde se na porovn�v�n� druh�ho slova v~r�mci polo�ky atd.

\b 3.3 Algoritmus porovn�v� jednotliv� slova nejv��e ve dvou pr�chodech.
    V~ka�d�m pr�chodu proch�z� slovo postupn� zleva doprava. V~prvn�m
    pr�chodu rozli�uje pouze podle prim�rn� �adic� platnosti (tj.
    nerozli�uje nap�. � od y ani od Y. P�esn� je to specifikov�no v~tabulce
    {\tt sorttab}). Pokud jsou z~tohoto pohledu slova stejn�, provede se druh�
    pr�chod, kde se rozli�uj� i znaky se sekund�rn� �adic� platnost� (nap�.
    rozli�uje mezi � a y, ale nerozli�uje mezi y a Y). V~tabulce {\tt
    sorttab} je (podle normy) uvedeno, �e v~prvn�m pr�chodu se nerozli�uj�
    p�smena s~diakritikou (a� na �ty�i v�jimky), zat�mco v~druh�m se
    diakritika rozli�uje. Ani v~jednom pr�chodu se nerozli�uje mezi velk�mi
    a mal�mi p�smeny.

\b 3.4 Pokud se v�echna slova v~jedn� polo�ce jev� podle odst.~3.3 jako
    stejn�, provedou se je�t� nejv��e dva dal�� pr�chody, ov�em glob�ln�
    nad cel�m obsahem polo�ky, nikoli po jednotliv�ch slovech. Pr�chody
    prob�haj� zleva doprava a ignoruj� mezery a tabel�tory mezi slovy.
    V~prvn�m (celkov� t�et�m) pr�chodu se rozli�uj� v�echny znaky uveden�
    v~tabulce {\tt sorttab} s~v�jimkou tzv. skoro-pr�zdn�ch znak�.
    Prakticky to znamen�, �e se rozli�uj� mal� a velk� p�smena.
    V~posledn�m pr�chodu se nav�c rozli�uj� skoro-pr�zdn� znaky, co�
    prakticky znamen� rozli�ov�n� interpunk�n�ch znam�nek.

\b 3.5 Mezera (nebo tabel�tor) jako prvn� znak za slovem je �azen� abecedn�
    d��ve, ne� jak�koli jin� znak. V~souboru {\tt sorttab} nelze pozici mezery
    ani tabel�toru specifikovat. Nap�. slovo gram bude abecedn� d��ve, ne�
    slovo gram�. Jinak �e�eno: jsou-li slova shodn� a� na to, �e jedno je
    krat��, pak to krat�� slovo bude �azeno d��ve.

\b 3.6 Pojem slovo (viz odst.~3.2) je zaveden pro libovolnou skupinu znak�
    s~v�jimkou mezery a tabel�toru. Pokud slovo obsahuje jenom pr�zdn�
    znaky (tj. znaky neuveden� v~�adic� tabulce {\tt sorttab} a pro pr�chod
    1 a� 3 t� skoro-pr�zdn� znaky), interpretuje se jako tzv. pr�zdn�
    slovo, kter� je abecedn� d��ve ne� jak�koli nepr�zdn� slovo. Mezi
    r�zn�mi pr�zdn�mi slovy �adic� algoritmus nerozli�uje
    (u~skoro-pr�zdn�ch znak� se rozli�uje ve �tvrt�m pr�chodu). P��klad je
    uveden v~odst. 5.11.

\medskip

P��klady spr�vn�ho �azen� slov (symbol \uv{<} ozna�uje abecedn� po�ad�):

\medskip
\halign{\hskip\parindent#\hfil&#\hfil&\quad#\hfil\cr
plagi�t  &< plachta   &(proto�e g < ch  v~prvn�m pr�chodu)\cr
pl�n�    &< pl�ni�ka  &(proto�e �$\null=\null$e < i,  v~prvn�m pr�chodu)\cr
pl�ni�ka &< Pl�ni�ka  &(proto�e p < P ve t�et�m pr�chodu)\cr
Pl�ni�ka &< pla�ka    &(proto�e i < k~v~prvn�m pr�chodu)\cr
pla�ka   &< plankton  &(proto�e a < t v~prvn�m pr�chodu)\cr
platno   &< pl�tno    &(proto�e a < � v~druh�m pr�chodu)\cr
pl�tno   &< platnost  &(proto�e platno < platnost v~1. pr�chodu)\cr
plṻ    &< plat      &(proto�e � < t v~prvn�m pr�chodu)\cr
plat     &< pl�t      &(proto�e a < � v~druh�m pr�chodu)\cr}
\medskip

\noindent
Celkov� �azen�:

    plagi�t < plachta < pl�n� < pl�ni�ka < Pl�ni�ka < pla�ka < plankton <
      plṻ < plat < pl�t < platno < pl�tno < platnost

\medskip
Jin� p��klad, potvrzuj�c� skute�nost, �e velk� a mal� p�smena se rozli�uj�
nikoli po jednotliv�ch slovech, ale v~cel� polo�ce:
\medskip

a < abc < ABC < abc fr�za�e < abc n�stroj��e < ABC n�stroj��e

\medskip\noindent
Vysv�tlen�:

\noindent
ABC < abc fr�za�e, proto�e  druh� slovo je v~polo�ce \uv{ABC} pr�zdn� a je tedy
                   abecedn� d��ve, ne� slovo \uv{fr�za�e}. K~rozli�en� dojde
                   u� v~prvn�m pr�chodu nad jednotliv�mi slovy, kdy se
                   je�t� nerozli�uj� velk� a mal� p�smena.


\sec 4. Tabulka sorttab
%----------------------

V~t�to tabulce jsou uvedeny v�echny znaky, podle kter�ch se prov�d� �azen�
(v�etn� speci�ln� notace pro dvojhl�sku CH). Do ��dk� jsou seskupeny znaky,
kter� se nerozli�uj� v~prvn�m pr�chodu, do skupin (odd�len�ch mezerou) jsou
zaps�ny znaky, kter� se nerozli�uj� v~druh�m pr�chodu a v�echny znaky se
rozli�uj� v~pr�chodu t�et�m (s~v�jimkou skoro-pr�zdn�ch znak�).
Skoro-pr�zdn� znaky jsou uvedeny na zvl�tn�ch ��dc�ch uvozen�ch mezerou.
Ty se rozli�uj� ve �tvrt�m pr�chodu. V~tabulce {\tt sorttab} se tak�
specifikuje koment��ov� znak.

Znaky, kter� nejsou v�bec uvedeny v tabulce {\tt sorttab} jsou tzv. pr�zdn�
znaky. �adic� algoritmus je ignoruje.

Podrobn�j�� informaci o~form�tu tabulky {\tt sorttab} najde �ten��
v~dokumentaci k~programu ({\tt csr.doc}). Domn�v�m se, �e tyto technick�
z�le�itosti nepat�� na str�nky tohoto �asopisu.

Dod�van� tabulka {\tt sorttab} m� n�sleduj�c� vlastnosti.

\begitems
* Dvojhl�sky ch, Ch a CH jsou mezi h a i.
* V~prvn�m pr�chodu se rozli�uj� jen p�smena neakcentovan� a p�smena �, �,
  � a �.
* V~prvn�m pr�chodu se t� rozli�uj� ��slice 0 a� 9, kter� jsou uvedeny a�
  za p�smenem �.
* V~druh�m pr�chodu se rozli�uj� v�echna akcentovan� p�smena, ale
  nerozli�uje se mezi velk�mi a mal�mi p�smeny.
* Ve t�et�m pr�chodu se rozli�uje mezi mal�mi a velk�mi p�smeny. Velk�
  p�smeno je pozd�ji, ne� mal�.
* Skoro-pr�zdn� znaky (�tvrt� pr�chod) jsou uvedeny a� za ��slicemi a to
  v~tomto po�ad�:
  ".,;?!:"{\tt\char34}"`'|/()[]"{\tt\char`\<\char`\>}"@&%=+"{\tt\char42}
\enditems


\sec 5. Odchylnosti chov�n� programu od normy �SN 01 0181
    \hfil\break\hbox{}\hskip\parindent a n�vrhy na �e�en�
%---------------------------------------------------------------------------

\b 5.1 Norma �len� tzv. prvky �azen� nikoli na polo�ky, ale na tzv. heslo (nap�.
    Nov�k Jan), dopln�k hesla (nap�. senior), prvn� podheslo (nap�. n�zev
    d�la), druh� podheslo (nap�. rok vyd�n�) apod. Heslo, dopln�k apod. se
    m��e skl�dat z~v�ce slov. Pro r�zn� struktury dat se pou��v� r�zn�
    �len�n�. P�i pou�it� programu m��eme prov�st nap�. toto ztoto�n�n�:

\medskip
\halign{\hskip\parindent#\hfil&#\hfil\cr
      heslo       &= 1. polo�ka\cr
      dopln�k     &= 2. polo�ka\cr
      1. podheslo &= 3. polo�ka\cr
      2. podheslo &= 4. polo�ka\cr
      atd.   &\cr} \medskip

    Ve v�jime�n�ch p��padech, kdy dopln�k hesla m� speci�ln� zp�sob �azen�
    nebo speci�ln� grafickou �pravu, nast�vaj� probl�my.

\b 5.2 V~�l�nku 7. normy je velmi nejasn� formulace t�kaj�c� se rozli�ov�n�
    slov, kter� se po prvn�m pr�chodu jev� jako stejn�. Citujeme doslova
    (v~hranat�ch z�vork�ch je vysv�tlen� kontextu, kter� jsem doplnil):

        \uv{{\it P�i jinak zcela stejn�m slov�\/ {\rm[tj. po prvn�m
    pr�chodu]} se �ad� nejprve p�smena bez diakritick�ch znam�nek a pak
    p�smena s~diakritick�mi znam�nky neobsa�en� v~abeced� podle �l.~5\/
    {\rm[�l.~5 uv�d� p�smena bez diakritiky plus p�smena �, �, �, �]}.

        P�i diakritick�ch znam�nk�ch na r�zn�ch m�stech v~jinak zcela
    toto�n�ch slovech se �ad� nejprve slovo s~diakritick�m znam�nkem bl��e
    konci slova. Vyskytnou-li se nad t�m� p�smenem slova r�zn� diakritick�
    znam�nka, stanov� se po�ad� podle �l.~8\/
    {\rm[�l.~8 stanov� nap�. � < �, nebo � < � < �]}.
    Vyskytnou-li se slova s~diakritick�m znam�nkem nad t�m� p�smenem, av�ak
    jedno slovo m� je�t� dal�� diakritick� znam�nko, �ad� se nejprve slovo
    s~jedn�m diakritick�m znam�nkem.}}

    Je vid�t, �e v�da se d� d�lat ze v�eho. M�n� pr�st�elnou formulaci by
    �lov�k t�ko vym��lel. Jedna interpretace t�to ��sti normy velmi bl�zko
    odpov�d� algoritmu implementovan�mu do programu (proch�z� se i v~druh�m
    pr�chodu zleva doprava). Nap��klad:

\medskip
\halign{#\hfil&#\hfil&\quad#\hfil\cr
    st�n�  &< st�na &(� < �, podle algoritmu v programu {\tt csr})\cr
    st�n�  &< st�na &(nejprve slovo s~diak. znam�nkem bl��e konci slova)\cr
    st�n�  &< st�na &(dv� r�zn� diak. znam�nka -- �l. 8)\cr
    st�n�  &> st�na &(nejprve slovo s~jedn�m diak. znam�nkem)\cr
    nad�v� &< n�diva &(a < �, podle algoritmu v programu {\tt csr})\cr
    nad�v� &< n�diva &(nejprve slovo s~diak. znam�nkem bl��e konci slova)\cr
    lal�l� &< l�lal� &(a < �, podle algoritmu v programu {\tt csr})\cr
    lal�l� &\? l�lal� &(nen� podle normy rozhodnuteln� !?!)\cr}

\medskip
    D�sledek: P�esn� po�adavky normy nejsou do programu implementov�ny,
    proto�e tyto po�adavky jsou

       a) nejasn� formulov�ny a vedou ke sporn�m p��pad�m,

       b) vedou k~nerozhodnuteln�m p��pad�m,

       c) vyhodnocov�n� zleva doprava je vesm�s ka�d�mu �lov�ku nejbli���.

\b 5.3 T�et� pr�chod se podle normy d�l� nikoli nad jednotliv�mi slovy, ale
    nad cel�mi hesly. Tato vlastnost je do programu implementov�na.
    Algoritmus se�azov�n� je ale op�t trochu zvl�tn�. Cituji normu, �l.~9:

        \uv{{\it Velk� a mal� p�smena maj� stejnou �adic� platnost. Teprve
    tehdy, li��-li se v~psan� velk�ch a mal�ch p�smen dv� HESLA (pop��pad�
    dal�� prvky �azen�), shodn� jak v~p�smenech standardizovan� abecedy,
    tak v~diakritick�ch znam�nk�ch, �ad� se nejprve heslo s~mal�m p�smenem.
    R�zn�-li se hesla velk�m p�smenem na r�zn�ch m�stech, �ad� se nejprve
    heslo s~velk�m p�smenem bl��e konci hesla. P�i r�zn�m po�tu velk�ch
    p�smen se �ad� nejprve heslo s~men��m po�tem velk�ch p�smen.}}

    M��eme u�init tyto d�sledky:

\medskip
\halign{#\hfil&#\hfil&\quad#\hfil\cr
    aBCD &< AbcD  &(a < A~podle algoritmu v programu {\tt csr})\cr
    aBCD &> AbcD  &(t�i velk� p�smena jsou v�ce ne� dv� podle normy)\cr
    AbcD &\? aBcD &(nen� podle normy rozhodnuteln� !?!)\cr}

\medskip
    Po�adavek normy na srovn�v�n� podle po�tu velk�ch p�smen nen� do
    programu implementov�n z~podobn�ch d�vod�, jako v~odst. 5.2.

\b 5.4 V~dokumentu [2] upozor�uje pan Wagner na pot�ebu �tvrt�ho pr�chodu pro
    rozli�en� dvou variant velk� alternativy p�smene CH (tj. Ch a CH).
    J� jsem to v~norm� nena�el a pova�uji za posta�uj�c�, rozli�it
    Ch < CH u� ve t�et�m pr�chodu.

    Pan Wagner se podrobn� rozepisuje o probl�mu \uv{kdy� Ch nen� Ch}. Jeho
    p��klad se slovem \uv{mochn�t�} je jeden z nejp�kn�j��ch p��klad�.
    P�i pou�it� programu {\tt csr} je nutno vlo�it mezi c a h
    v takov�ch p��padech pr�zdn� znak, tj. nap�. "moc-hn�t�" nebo
    "moc{}hn�t�". T�m se potla�� interpretace c a h jako dvojhl�sky ch.
    P�itom �adic� algoritmus pr�zdn� znaky ignoruje. Nebo jin� p��klad.
    "C.~H.~CH." bude p�i pr�zdn�ch znac�ch "~" a "." (vlnka a te�ka) �azeno
    jako "CHCH", ale prvn� dvojice CH bude interpretov�na jako C� a H� a
    druh� dvojice jako CH (Cvi�n� Horsk� Chata).

\b 5.5 N�meck� ostr� \ss\ se �ad� jako "ss".

    Tato vlastnost (a mnoho podobn�ch) se d� �e�it za�azen�m preprocesoru a
    postprocesoru. Nech� nap�. znak "#" nen� uveden v~tabulce {\tt
    sorttab}, tj. jedn� se o~pr�zdn� znak. Nahra�me preprocesorem v�skyty
    ostr�ho \ss\ skupinou t�� znak� "ss#". Pak provedeme �azen�, kter�
    skute�n� �ad� "ss#" jako "ss", proto�e "#" je pr�zdn� znak. Nakonec
    postprocesorem nahrad�me skupinu znak� "ss#" ostr�m "s". Takov� pre- a
    post-procesory se nap�. v~UNIXu implementuj� jednodu�e jako p��kaz
    "sed" s~ur�it�mi parametry.

    V~\TeX{}u nem�me v�bec ��dn� probl�m, proto�e tam se ostr� \ss{} zapisuje
    jako "\ss{}", tj. sta�� m�t znaky "\", "{" a "}" jako pr�zdn�.

    Je t�eba si uv�domit, �e preprocesor prodlu�uje texty polo�ek, tj. m��e
    se st�t, �e polo�ky u� nebudou spr�vn� pod sebou zarovnan� ve sloupc�ch.
    Pokud se jedn� jen o~p�r pozic (mezer), v�t�inou se nic ned�je, proto�e
    program p�eskakuje libovoln� mno�stv� mezer na za��tku polo�ky.

\b 5.6 N�kter� znaky (nap�. �eck� $\gamma$) se �ad� jako slovo (tj.
    \uv{gamma}) a nikoli jako znak.

    V~takov�m p��pad� m��eme pou��t preprocesor podobn� jako pro ostr�~\ss{}.
    V~\TeX{}u op�t nem�me probl�my, proto�e tam se nap�. znak $\gamma$ p��e
    jako "$\gamma$". Sta�� m�t "$" a "\" jako pr�zdn� znaky.

\b 5.7 Probl�m s~��slicemi a ��sly komplikuje norma takto:

        \uv{{\it ��slice se �ad� podle sv�ho v�znamu v~hesle nebo 
v~dal��ch prvc�ch �azen�:

        a) bu� jako slovo (resp. souslov�), pokud jsou jako ��st del��ho
    slovn�ho v�razu ch�p�ny sp��e jako slovn� sou��st ofici�ln�ho nebo
    ust�len�ho ozna�en� ur�it�ho jevu, ud�losti, n�zvu apod.

        b) anebo v~��seln�m po��dku, jestli�e v�razn� ozna�uj� po�ad�
    n��eho, chronologii apod.

        c) jestli�e je v�jime�n� nutno p�ihl��et p�ednostn� k~��seln�
    hodnot� ��slic, �ad� se ve vzestupn�m ��seln�m po�ad� a� za abecedu,
    tj. za p�smeno~�.}}

    P��klady:

\begitems
    *  zz < z-2 < � < 3  (podle c) -- je implementov�no v~tabulce {\tt
       sorttab}.
    *  1 < 10 < 100  (podle b) -- plat�  001 < 010 < 100. Sta�� nahradit
          vedouc� nuly p�ed ��slem n�jak�m znakem, kter� v~dal��m
          zpracov�n� nebudeme tisknout. Nap�. v~��dku s~nulou v~tabulce
          {\tt sorttab} stoj� znak "_". Pak vyu�ijeme toho, �e:  "__1" <
          "_10" < "100".
    *  10 poh�dek < 2. m�sto < 25 let < 1. v�ro��
                   (podle a) -- �ad� se jako:
       deset poh�dek < druh� m�sto < dvacet p�t let < prvn� v�ro��.
    *  V�clav III < V�clav IV  (proto�e V�clav 3 < V�clav 4).
\enditems

    Posledn� dva p��klady nelze snadno implementovat. V�t�inou jsou dosti
    v�jime�n� a pokud je pot�eba je �e�it, pak jsou dv� mo�nosti:

    1. Preprocesorem nahrad�me v�echny v�skyty ��slovek slovy (nap�. m�sto
    10 bude "\deset"). Programovat takov� preprocesor pro obecn� pou�it� by
    asi bylo dost slo�it�.

    2. Vytvo��me \uv{st�novou polo�ku} s~obsahem nap�. \uv{deset poh�dek},
    podle kter� se �ad�, ale kter� se nebude tisknout p�i dal��m
    typografick�m zpracov�n�. M�me tedy vedle sebe polo�ky \uv{deset
    poh�dek} (podle kter� �ad�me) a \uv{10 poh�dek} (kterou tiskneme).

\b 5.8 K~interpunk�n�m znam�nk�m a zna�k�m (tj.: "!", ";" apod.) se obecn� p�i
    �azen� nep�ihl���. Teprve v~p��pad�, �e jsou hesla stejn� a li�� se jen
    interpunkc�, pak se p�istupuje k~�azen� podle interpunkce. Podle
    charakteru �azen�ho materi�lu je mo�n� n�kter� interpunk�n� znam�nka
    za�adit do tabulky {\tt sorttab} nap��klad jako skoro-pr�zdn� znaky. Pro
    orientaci citujme �l.~14 normy:

        \char254{\it Jestli�e se znam�nka, zna�ky, obrazce vyskytuj� samy 
o~sob� ve funkci hesla, �ad�me je a� na konec abecedy, resp. a� za
    ��slice (pokud jsou �azeny podle �l.~11 c)\/ {\rm[viz bod c)
    v~odst.~5.7]}, a to v~tomto po�ad�:

{\rm

\indent". , ; ? ! :" {\it v�echny tvary uvozovek}

\indent"- | / \ ( ) [ ] "{\tt\char`\<\ \char`\>}" { }"

\indent \& {\it\char\$\/} \S\ \% \char141{} \$  % \char141 je promile

\indent = + $\times$ "*" \# $\sim$ $\approx$ $\simeq$

}

\indent  dal�� grafick� zna�ky

        Stejn�ho po�ad� se pou��v� p�i pod�azov�n� sm��en�ch hesel se
    stejnou p�semnou ��st� a se znam�nkem (zna�kou, obrazcem) na stejn�m
    m�st� hesla.

         Ve speci�ln�ch p��padech je nutno ur�it po�ad� podle z�sad
    p��slu�n� v�dn� discipl�ny.}\char255

    Poznamenejme, �e v~dod�van� tabulce {\tt sorttab} nejsou uvedeny
    v�echny tyto znaky. Pozm��te si tabulku {\tt sorttab} tak, aby to
    nejl�pe odpov�dalo �azen�mu materi�lu.

\b 5.9 Existuj� skupiny slov, kter� se maj� interpretovat jako jedno slovo.
    Nap�. mluvnick� �leny v~rom�nsk�ch jm�nech (la le) se berou dohromady
    se slovem:
\smallskip

    lebeda < le Bon < lepra < l' Herbier < Li Pen < li�ka

\smallskip
    V~t�chto p��padech je mo�no slova spojovat nap�. n�jak�m pr�zdn�m
    znakem, t�eba:
\smallskip

    lebeda < le"~"Bon < lepra < l'"~"Herbier < Li"~"Pen < li�ka

\smallskip
    Postprocesor m��e tyto vlnky nahradit mezerami. V~\TeX{}u nem�me
    probl�my.

\b 5.10  U~firemn�ch n�zv� skl�daj�c�ch se ze dvou nebo v�ce slov spojen�ch
    symbolem "&" nebo "+" nebo "a" se nejprve �ad� podle jednotliv�ch slov
    bez p�ihl�dnut� ke spojce. A� v~p��pad�, �e jsou ob� (v�echna) slova
    stejn�, pak se ke spojce p�ihl���.

    Zeman + J. < Zeman a Zeman < Zeman \& Zeman < Zeman + Zeman < Zeman \& �.

    Jak to implementovat? Spojku "a" nahradit nap�. znakem "@".
    De\-kla\-ru\-je\-me-li v~tabulce {\tt sorttab} znaky "@", "&" a "+" jako
    skoro-pr�zdn� (v~uveden�m po�ad�), pak skute�n� m�me:

    Zeman + J. < Zeman @ Zeman < Zeman \& Zeman < Zeman + Zeman < Zeman \& �.

    Postprocesor pak nahrad� znak "@" p�smenem "a".

\b 5.11  Porovn�v�n� pr�zdn�ch slov (viz odst.~3.7). P��klad:

\smallskip
          1.    Nov�k

          2.    Nov�k -- junior

          3.    Nov�k -- senior

          4.    Nov�k Jan

          5.    Nov�k Jan -- senior

          6.    Nov�k Karel

\smallskip
    Pro pochopen� �azen� t�chto �daj� je vhodn� interpretovat nap�. prvn�
    ��dek jako ��dek s~prvn�m slovem nepr�zdn�m (Nov�k) a s~dal��mi slovy
    pr�zdn�mi. Druh� ��dek m� prvn� slovo nepr�zdn� (Nov�k) a druh� pr�zdn�
    (--), proto�e se skl�d� z~pr�zdn�ch znak�. T�et� slovo je nepr�zdn�
    (junior). Nerovnost 1. < 2. plat�, proto�e pr�zdn� t�et� slovo prvn�ho
    ��dku < nepr�zdn� t�et� slovo druh�ho ��dku. Podobn� nap�. 3. < 4.,
    proto�e pr�zdn� druh� slovo t�et�ho ��dku < nepr�zdn� druh� slovo
    �tvrt�ho ��dku. V�sledn� efekt je p�esn� to, co od �azen� o�ek�v�me.

    M�me-li r�zn� odd�len� dopl�ky hesel, p��padn� z~v�znamov�ho hlediska
    jsou stejn� slova jinak interpretovan�, pak je pot�eba b�t ve st�ehu.
    Citujme �l.~19 normy (v�etn� p��kladu):

        \uv{{\it Jestli�e se sejde v~t�e abecedn� sestav� ve funkci po�adatel�
    {\rm[prvn�ch slov hlavn�ho hesla]} rodinn� jm�no se stejn� psan�m osobn�m
    jm�nem, �ad� se nejprve osobn� jm�no.}}

\smallskip
    P��klad:   Adam - bakal�� < Adam de la Halle < Adam, Alfred.

\smallskip
    Program spr�vn� se�ad�, pokud prost�edn� prvek p��eme t�eba ve tvaru
    "Adam ~ de la Halle", tj. vnut�me za osobn� jm�no "Adam" pr�zdn� slovo.
    V~prvn� polo�ce u� pr�zdn� slovo prezentovan� znakem "-" m�me.

\b 5.12  Je�t� v�t�� probl�my jsou s~tzv. dvojit�mi jm�ny. Norma prav�, �e
    nejprve �ad�me rodinn� jm�na jednoduch� a potom teprve dvojit�. Dvojit�
    rodinn� jm�no se nepova�uje za jedno slovo. M� platit:
\smallskip

    Nov�, Zdena < Nov�-Vlachov�, Anna < Nov��ek

\smallskip
    Probl�m je mo�no �e�it nap��klad t�m, �e pro rodinn� jm�na (p��jmen�)
    sestav�me jinou polo�ku, ne� pro jm�na k�estn�. Takto je to uk�z�no
    v~p��kladu v~odst.~2.  D�le pak mus�me v~rodinn�ch jm�nech nahradit
    p�ed zpracov�n�m spojovn�k mezerou a po zpracov�n� tam vr�tit
    spojovn�k. To lze d�lat automaticky pre- a post-procesorem. Jin�m
    �e�en�m je vlo�it do tabulky {\tt sorttab} znak "-" dop�edu p�ed
    v�echny abecedn� znaky. To ale p�edpokl�d�, �e znak "-" nebude
    v~�azen�m souboru pou�it jin�m zp�sobem. Pokud ale znak "-" je pou�it
    jako \uv{klasick�} interpunkce, m��eme t�eba nahradit v�echny
    spojovn�ky dvojit�ch jmen znakem "^", kter� bude uveden v~�ele tabulky
    {\tt sorttab}. Postprocesor pak nahrad� tento znak zp�tn� spojovn�kem.

\b 5.13  K~mluvnick�mu �lenu na za��tku hesla se nep�ihl���. Nap��klad
    \uv{Der grosse Einbruch} se �ad� jako \uv{grosse Einbruch}.

    U~n�mecko-�esk�ho slovn�ku sta�� ps�t �leny do sloupce (polo�ky), ke
    kter� se p�i �azen� nep�ihl���, ale kter� se nakonec tiskne. Takov�
    polo�ka m��e b�t \uv{vysunuta vlevo} od hlavn� polo�ky. U~samostatn�ho
    n�meck�ho slovn�ku je t�eba postupovat podle p��slu�n� normy DIN,
    kterou nezn�m. U~ji� zpracovan�ch datab�z� (nap��klad pro n�zvy d�l
    v~kni�n�m katalogu) by asi bylo pot�eba vytvo�it preprocesor.

\b 5.14  Necht�l jsem nikoho odradit od entuziasmu algoritmizovat �azen� podle
    �esk� normy. Nicm�n� je vid�t, �e problematika je �irok� a k~r�zn�m
    typ�m datov�ch vzork� je pot�eba p�istupovat individu�ln�. Norma byla
    schv�lena v~roce 1977, tj. p�ed 17 lety. K~v�po�etn� technice je tam
    naps�no tolik:

        \uv{{\it Norma je ur�ena pro konven�n� (ru�n�) �azen�. Doporu�uje
    se v�ak, aby i p�i po��ta�ov�m �azen�, zejm�na p�i sestavov�n� program�
    a �prav� vstupn�ch dat bylo k~t�to norm� p�ihl��eno (v~mez�ch dan�ch
    �rovn� strojov� techniky) za ��elem sn��en� stupn� diskompatibility
    mezi ru�n� a strojov� �azen�mi abecedn�mi sestavami na minim�ln�,
    nevyhnutelnou m�ru.}}

    Nen� vylou�eno, �e v~dob�, kdy p��u tyto ��dky, existuje i norma pro
    strojov� �azen�. V~ka�d�m p��pad� se mezi strojov�m a ru�n�m �azen�m
    mus�me sna�it \uv{sn��it stupe� diskompatibility na minim�ln�,
    nevyhnutelnou m�ru}. Ov��te si, jak ct� tuto skute�nost r�zn�, �asto
    draze koupen�, datab�zov� syst�my, kter� o~sob� hlu�n� tvrd�, �e
    obsahuj� n�rodn� \uv{lokalizaci}. M�m zku�enosti, �e mnohdy slavn�
    lokalizace kon�� prachb�dn�m p�elo�en�m manu�lu do �e�tiny a po�e�t�n�m
    nab�dek.


\sec 6. Omezen� programu csr
%---------------------------

\b 6.1 Program dynamicky alokuje pam� pro obsah cel�ho vstupn�ho souboru.
    T�m je omezena velikost zpracov�n� vstupn�ho souboru. Nap��klad
    p�edkompilovan� verze programu {\tt (csr.exe)} dod�van� v~bal�ku um�
    pracovat jen s~konven�n� pam�t�, tj. maxim�ln� rozm�ry soubor� jsou cca
    400~kB. Na druh� stran� program byl testov�n na UNIXov�ch pracovn�ch
    stanic�ch (SUN) a bez probl�m� zpracoval i soubory velikosti
    n�kolika des�tek MB obsahuj�c� nap�. 250 000 ��dk�. Nepova�uji proto
    omezen� dan� velikost� alokovateln� pam�ti za p��li� rozhoduj�c�.
    Ur�it� t� bude mo�n� kompilovat program pro DOS tak, aby pracoval
    s~roz���enou pam�t�. J� to d�lat nebudu, proto�e

    a) pracuji s~kompil�torem C pro DOS verze 1.0,

    b) m�m k~dispozici zm�n�n� pracovn� stanice.

\b 6.2 Maxim�ln� d�lka jednoho ��dku je stanovena parametrem MAXLINE ve
    zdrojov�m textu programu na 1000 znak�. V~p��pad� pot�eby je mo�n�
    uvedenou hodnotu zv�t�it. Na n�roky dynamick� alokace pam�ti to nem�
    vliv.

\b 6.3 Po�et �azen�ch ��dk� vstupn�ho souboru je omezen prostorem
    dynamicky alokovateln� pam�ti a ��slem $2\,147\,483\,648$.

\b 6.4 V~tabulce {\tt sorttab} ani ve vstupn�m souboru nelze pracovat se znakem
    ASCII 0, proto�e tento znak m� v~programu speci�ln� v�znam. Tak� nelze
    pracovat se znaky ASCII 1 a� 4, proto�e t�mto k�d�m je p�i�azena
    vnit�n� reprezentace dvojhl�sek ch, Ch, cH a CH. Se v�emi ostatn�mi
    znaky (ASCII 5 a� 255) lze pracovat bez omezen�. S~v�jimkou mezery,
    tabel�toru a znaku/znak� pro konec ��dku v~dan�m syst�mu lze tedy
    pro libovoln� jin� znaky v~rozsahu 5 a� 255 definovat jejich
    interpretaci v~tabulce {\tt sorttab} a pak podle nich prov�d�t �azen�.


\sec 7. Literatura
%-----------------

\hangindent=\parindent
\noindent[1]  �SN 01 0181 ... Norma na abecedn� �azen� slov.{\par}
\smallskip
\noindent[2]  csindex.dvi ... �esk�/slovensk� index, dokumentace. �esk� p�eklad a
                     implementace �e�tiny: Zden�k Wagner. Dokumentace je
                     sou��st� voln� ���en�ho bal�ku CSINDEX, kter� je nap�.
                     p�ibalen do voln� ���en�ho bal�ku CS\TeX.

\end
