Nezalomiteľné medzery podľa typografických pravidiel
Pozrime sa teraz bližšie na ďalší problém, z ktorým sa pri praktickej práci stretávame. Je to ten fakt, že OpenOffice.org nevkladá automaticky nezalomiteľné medzery napr. za jednoznakové predložky. Toto však odporuje zásadám typografie, v ktorých sa o.i. hovorí, že k zalomeniu riadku nemá dôjsť pred jednociferným číslom bez bernej jednotky (napríklad „1 človek“), medzi rádovými skupinami cifier vo vnútri čísla alebo pri telefónnych číslach (napr. „1 587 235“), medzi číslom a značkou mernej jednotky (napr. „123 km“), medzi skratkami akademických titulov, vojenskými a vedeckými hodnosťami a menom (napr. „Ing. Pastierik“), medzi skratkou krstného mena a priezviskom (napr. „J. Pastierik“), za číslicami v dátumoch (napr. „16. 1. 2006“) a ani za jednoznakovou predložkou alebo spojkou.
V prípade predložiek a spojok je otázka nezalomiteľných medzier trochu nejednoznačná. Ide o to, že niektoré zdroje (napr. http://www.typo.cz) uvádzajú, že spojka „a“ (ale nie verzálka „A“) je výnimka a ďalej, že v prípade úzkej sadzby (do 25 znakov) sú možné výnimky aj za ostatnými jednoznakovými predložkami a spojkami. Iné pramene popisujú ako výnimku iba spojku „a“ a aj to iba v prípade úzkej sadzby. Pretože rozhodnutie leží na každom používateľovi, budeme sa snažiť vyriešiť otázku okolo spojky „a“ tak, aby si každý mohol urobiť jednoduchú úpravu podľa svojich požiadavok.
Nezalomiteľné medzery za spojkami
Ako vidíme, problematika nezalomiteľných medzier je pomerne široká a preto sa ňou budeme zaoberať postupne. Ako prvé, čo si budeme v spomínanej oblasti programovať, bude makro pre zámenu zalomiteľných medzier za jednoznakovými predložkami a spojkami, pretože toto je najčastejšie požadované od používateľov OpenOffice.org. Jednoduchá verzia tohto makra by mohla vyzerať takto (predložky rozpoznáme tak, že pred nimi a za nimi je medzera):
sub nezalomitelne_Spojky
dim predlozky() as string
dim i, kolko as long
predlozky()=array("a","i","k","o","s","u","v","z")
kolko=0
REM pre všetky predložky
for i=lbound(predlozky()) to ubound(predlozky())
kolko=kolko+vymen(" "+predlozky(i)+" "," "+predlozky(i)+NM,false)
next i
msgbox("Nahradených "+kolko+" zalomiteľných medzier.",0,"Nezalomiteľné medzery")
end sub
Podobne, ako v prípade prvej verzie makra pre mazanie viacnásobných medzier, aj toto makro má veľa nedostatkov. Ten najhlavnejší je však ten, že ak máme spojku napísanú veľkými písmenami, tak ju zamení za malé písmeno. Je jasné, že pri zámene musíme rozpoznávať veľké a malé písmena. Na tento účel si preto najprv musíme upraviť funkciu „Vymen“. Aby sme jej úpravu nemuseli robiť tak často, hneď si uvedieme aj ďalší parameter, pomocou ktorého budeme rozpoznávať, či hľadáme celé slová, alebo iba ich časti:
function Vymen(Co, Za as string, Regularne, Cele_slova, Velke_pismena as Boolean) as long
rem Funkcia vymení reťazec Co za reťazec Za a vráti počet výmien
rem Regularne - určuje, či vyhľadávaný výraz je (true) alebo nie je (false) regulárny výraz
rem Cele_slova - určuje, či vyhľadávaný výraz je (true) alebo nie je (false) celé slovo
rem Velke_pismena - určuje, či sa majú (true) alebo nemajú (false) rozoznávať veľké a malé písmená
Vymena.SearchString=Co
Vymena.ReplaceString=Za
Vymena.SearchRegularExpression=Regularne
Vymena.SearchWords=Cele_slova
Vymena.SearchCaseSensitive=Velke_pismena
Vymen=Dokument.replaceAll(Vymena)
end function
Pravdaže, teraz si musíme upraviť aj makro pre zámenu viacnásobných medzier, pretože sme tam nepočítali s novými parametrami:
SUB Viacnasobna_medzera
DIM kolko AS Long
' Inicializácia spoločných premenných
Init
' Výmena viacnásobných medzier za jednoduchú
kolko=Vymen(" +"," ",TRUE,false,false)
' Kombinácie nezalomiteľných a zalomiteľných medzier
kolko=kolko+Vymen(" "+NM+" |"+NM+" | "+NM,NM,TRUE,false,false)
' Kombinácie tabelátorov a medzier
kolko=kolko+Vymen(" \t |\t | \t","\t",TRUE,false,false)
' Medzery na začiatku a konci odstavca
kolko=kolko+Vymen("^[:space:]*|[:space:]*$","",TRUE,false,false)
' Tabelátory na začiatku a konci odstavca
kolko=kolko+Vymen("^\t*|\t*$","",TRUE,false,false)
msgbox("Nahradených "+kolko+" viacnásobných medzier.",0,"Viacnásobne medzery")
END SUB
Makro pre zámenu zalomiteľných medzier za predložkami a spojkami by teraz mohlo vyzerať takto:
sub nezalomitelne_Spojky
dim predlozky() as string
dim i, kolko as long
predlozky()=array("a","i","k","o","s","u","v","z")
kolko=0
REM pre všetky predložky
for i=lbound(predlozky()) to ubound(predlozky())
rem malé predložky
kolko=kolko+vymen(" "+predlozky(i)+" "," "+predlozky(i)+NM,false,false,TRUE)
rem veľké predložky – funkcia uCase prevedie malé znaky na veľké
kolko=kolko+vymen(" "+ucase(predlozky(i))+" "," "+ucase(predlozky(i))+NM,false,false,TRUE)
next i
msgbox("Nahradených "+kolko+" zalomiteľných medzier.",0,"Nezalomiteľné medzery")
end sub
V tejto verzii makra sa však vkladá nezalomiteľná medzera aj za spojku „a“, čo nie každému vyhovuje. Tento stav sa dá ošetriť napríklad tak, že budeme túto výnimku testovať:
sub nezalomitelne_Spojky
dim predlozky() as string
dim i, kolko as long
predlozky()=array("a","i","k","o","s","u","v","z")
kolko=0
REM pre všetky predložky
for i=lbound(predlozky()) to ubound(predlozky())
rem malé predložky
if predlozky(i)<>"a" then
kolko=kolko+vymen(" "+predlozky(i)+" "," "+predlozky(i)+NM,false,false,TRUE)
end if
rem veľké predložky – funkcia uCase prevedie malé znaky na veľké
kolko=kolko+vymen(" "+ucase(predlozky(i))+" "," "+ucase(predlozky(i))+NM,false,false,TRUE)
next i
msgbox("Nahradených "+kolko+" zalomiteľných medzier.",0,"Nezalomiteľné medzery")
end sub
Alebo, ešte jednoduchšie, vymenovaním všetkých malých aj veľkých spojok a predložiek osobitne:
sub nezalomitelne_Spojky
dim predlozky() as string
dim i, kolko as long
predlozky()=array("A","i","I","k","K","o","O","s","S","u","U","v","V","z","Z")
kolko=0
REM pre všetky predložky
for i=lbound(predlozky()) to ubound(predlozky())
kolko=kolko+vymen(" "+predlozky(i)+" "," "+predlozky(i)+NM,false,false,TRUE)
next i
msgbox("Nahradených "+kolko+" zalomiteľných medzier.",0,"Nezalomiteľné medzery")
end sub
Ten, kto chce vkladať aj za spojku „a“ nezalomiteľnú medzeru, si ju môže do zoznamu jednoducho doplniť. Ani toto riešenie nie je však úplne dobré, pretože niekto môže chcieť, aby sa za touto spojku nevkladala nezalomiteľná medzera iba v prípade úzkej sadzby. Toto však budeme riešiť až niekedy inokedy.
Na budúce: Zlepšujeme makro pre nezalomiteľné medzery, alebo predložky bývajú aj v kombináciách či na začiatkoch odstavca.