Makrá v OpenOffice.org 05/2008

Július Pastierik  /  28. 05. 2008, 00:00

V dnešnom dieli seriálu o makrách sa znovu vrátime k textovým dokumentom a ukážeme si, ako dokážeme nastaviť rozostup medzi znakmi.

 

Pokiaľ používame OpenOffice.org na písanie kníh či iných podobných publikácií, chceme, aby vyzeral dobre aj z hľadiska estetickej úpravy, ktoré sú overené generáciami našich predkov a ktoré do svojich pravidiel zahrnuli typografi. Medzi takéto náležitosti patrí napríklad aj to, že na konci strany sa nenecháva jeden riadok textu a na začiatku novej strany tiež nie (tzv. siroty a vdovy).

Kontrola sirotkov a vdov

Samozrejme, v OpenOffice.org dokážeme nastaviť, že sa takéto riadky nebudú vyskytovať a to v nastaveniach štýlov odstavcov (záložka „Tok textu“, voľby „Kontrola sirotkov“ a „Kontrola vdov“. Pokiaľ však toto nastavíme, častokrát sa nám stane, že na konci strany zostane prázdny riadok.

Pokiaľ tlačíme dokument na obidve strany papiera (ale nielen vtedy), vzniká nám nový problém – na dvoch susediacich stranách nemusí byť na konci strany text, čo pôsobí rušivo. A práve vtedy môžeme zasiahnuť podobne, ako to robili sadzači pri ručnej sadzbe – zmenením rozostupu medzi znakmi.

Nastavenie odsadenia znakov v štýle odstavca

Samozrejme, rozostupy medzi znakmi sa dajú tiež nastaviť v štýle odstavca (záložka „Umiestnenie“, nastavenia „Vzdialenosť“). To však platí pre všetky odstavce a netýka sa to iba nastavenia konkrétnej strany. Pokiaľ chceme nastavovať rozostupy pre jeden znak, môžeme ho označiť a pomocou voľby menu „Formát – Znak...“ na záložke „Umiestnenie“ nastaviť tento rozostup.

Ak si však predstavíme, že na jednej strane sú stovky medzier, je to veľmi prácne (hádam viac, ako keď sa robila sadzba ručne). A práve z tohto dôvodu si urobíme makro, pomocou ktorého dokážeme nastaviť rozostup medzi znakmi v označenom texte – a to nielen pre ich zväčšovanie, ale aj zmenšovanie.

Dialóg pre odsadenie znakov - parametre vstupného čísla

Aby sme makro urobili čo najobecnejšie, pripravíme si najprv dialóg, pomocou ktorého nastavíme príslušné parametre – veľkosť rozostupu a množinu znakov, pre ktoré ho chceme použiť. Pretože obvykle nastavujeme rozostup buď medzi všetkými znakmi alebo iba v rámci medzier, do dialógu vložíme štyri prepínacie voľby: „Všetky znaky vo výbere“, „Všetky medzery“, „Iba zalomiteľné medzery“ a „Iba nezalomiteľné medzery“.

Vlastné volanie makraĎalej si v dialógu nastavíme pre vstupnú hodnotu formátovanie (celé čísla), minimálnu a maximálnu hodnotu (-9999 až 9999). Toto nastavenie urobíme preto, aby sme nemuseli zadanú hodnotu špeciálne testovať. Záporné hodnoty rozostupy zmenšujú, štandardný rozostup je hodnota 0 a kladné hodnoty rozostupy zväčšujú. Samozrejme, konkrétne čísla je potrebné vyskúšať osobitne pre každú nastavovanú stranu – v tomto smere sa nedá povedať, aká hodnota je najlepšia.

Vlastné makro tvoria dve funkcie – otvorenie dialógu a nastavenie rozostupov. Makrá sú, ako obvykle, okomentované a preto sa nimi nemusíme hlbšie zaoberať.

Text pred zmenením odsadenia

REM Makro pre úpravu rozostupov medzi znakmi vo vybranom texte
sub uprav_kerning_znakov(medzera, all, sp_nbsp, nbsp as long)
 ' Význam parametrov:
 ' Medzera – veľkosť rozostupu
 
 ' all – ak je 1, tak nastavujeme všetky znaky
 ' sp_nbsp – ak je 1, tak nastavujeme všetky medzery
 ' nbsp – ak je 1, tak iba nezalomiteľné medzery
 ' Ak všetky predchádzajúce parametre sú 0, tak sa nastavuje iba zalomiteľná medzera

 dim dokument, kurzor as object ' Aktuálny dokument, viditeľný kurzor
 dim hladaj as string ' Hľadaný reťazec podľa parametrov
 
 dim args(18) as new com.sun.star.beans.PropertyValue ' Parametre pre hľadanie v označenom texte
 
 if all=0 then
  ' Ak nenastavujeme všetky znaky, tak
  hladaj=" " ' nastavenie hľadaného reťazca na SP
  if sp_nbsp=1 then
   ' Ak hľadáme všetky medzery, tak
   hladaj=" |"+chr$(&HA0) ' nastavenie hľadania SP alebo NBSP
  else
   if nbsp=1 then
    ' Ak hľadáme iba NBSP, tak
    hladaj=chr$(&HA0) ' nastavenie hľadania NBSP
   endif
  endif
  ' Nastavenie nasledujúcich parametrov je z nahrávania makra
  args(0).Name = "SearchItem.StyleFamily"
  args(0).Value = 2
  args(1).Name = "SearchItem.CellType"
  args(1).Value = 0
  args(2).Name = "SearchItem.RowDirection"
  args(2).Value = true
  args(3).Name = "SearchItem.AllTables"
  args(3).Value = false
  args(4).Name = "SearchItem.Backward"
  args(4).Value = false
  args(5).Name = "SearchItem.Pattern"
  args(5).Value = false
  args(6).Name = "SearchItem.Content"
  args(6).Value = false
  args(7).Name = "SearchItem.AsianOptions"
  args(7).Value = false
  args(8).Name = "SearchItem.AlgorithmType"
  args(8).Value = 1 ' Budeme hľadať regulárne výrazy
  args(9).Name = "SearchItem.SearchFlags"
  args(9).Value = 71680 ' Hľadá sa v označenom texte (výbere). Pre hľadanie v celom dokumente by muselo byť 65536
  args(10).Name = "SearchItem.SearchString"
  args(10).Value = hladaj ' Hľadaný reťazec
  args(11).Name = "SearchItem.ReplaceString"
  args(11).Value = ""
  args(12).Name = "SearchItem.Locale"
  args(12).Value = 255
  args(13).Name = "SearchItem.ChangedChars"
  args(13).Value = 2
  args(14).Name = "SearchItem.DeletedChars"
  args(14).Value = 2
  args(15).Name = "SearchItem.InsertedChars"
  args(15).Value = 2
  args(16).Name = "SearchItem.TransliterateFlags"
  args(16).Value = 1280
  args(17).Name = "SearchItem.Command"
  args(17).Value = 1
  args(18).Name = "Quiet"
  args(18).Value = true

  dokument=ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  dispatcher.executeDispatch(dokument, ".uno:ExecuteSearch", "", 0, args()) ' Vlastné hľadanie – označenie všetkých nájdených znakov
 endif
 kurzor= ThisComponent.currentcontroller.getViewCursor()
 ' Viditeľný kurzor
 ' ak sme nehľadali medzery, tak je to celý označený text, inak iba nájdené medzery
 kurzor.CharKerning=medzera ' Zmena rozostupu označených znakov
end sub

Rem Volanie dialógu a makra pre nastavenie rozostupov
sub Kerning_znakov

 dim medzera as long ' Pre získanie číselnej hodnoty z dialógovej premennej "Hodnota"

 DialogLibraries.LoadLibrary("JP_Kerning_znakov") ' Otvorenie knižnice
 
 dlg=CreateUnoDialog(DialogLibraries.JP_Kerning_znakov.Dialog_Kerning_znakov) ' Sprístupnenie dialógu
 
 dlg.model.Vyber_all.State=0
 dlg.model.Vyber_SP_NBSP.State=1 ' V prepínačoch si prednastavíme, že budeme meniť rozostupy všetkých medzier
 dlg.model.Vyber_SP.State=0
 dlg.model.Vyber_NBSP.State=0
   
 dlg.model.Hodnota.text="0" ' 0 znamená, že rozostupy majú byť štandardné

 if dlg.Execute()=1 then
  ' Ak sme stlačili "OK", tak
  medzera=val(dlg.model.Hodnota.text) ' Hodnota rozostupov
  uprav_kerning_znakov(medzera,dlg.model.Vyber_all.State,dlg.model.Vyber_SP_NBSP.State,dlg.model.Vyber_NBSP.State) ' Nastavenie rozostupov
 endif
 dlg.dispose() ' Zatvorenie dialógu
end sub

Text po zmene odsadenia s vyznačenými medzerami

Neprehliadnite: