Chcete v OpenOffice.org nastavovať riadkovanie podobne, ako je to obvyklé v DTP programoch? Vyriešte to makrom, ktoré nastaví riadkovanie podľa veľkosti písma.
V ďalšom pokračovaní seriálu o programovaní makier v OpenOffice.org ukážeme makro, pomocou ktorého dokážete nastavovať riadkovanie odsekov tak, ako je to obvyklé v DTP programoch, t. j. percentuálne podľa veľkosti písma.
Aby to však nebolo až také jednoduché, hneď na začiatok si spomeňme, že veľkosť písma je pojem, ktorý typograficky nie je jednoznačný, pretože existuje viacero definícií veľkosti tzv. typografického bodu, z ktorého vychádzajú ostatné veľkosti. Historicky prvý merný systém navrhol v roku 1737 francúz Pierre Simon Fournier, ktorý rozdelil jednu parížsku stopu (32,48 cm) na 864 častí a túto čiastku nazval „typografický bod“. Neskôr, v roku 1774 jeho definíciu upravil francúz François Ambroise Didot na metrický systém – jeden meter obsahuje 2660 typografických bodov.
Nebudeme sa však ďalej venovať celej histórii a preto spomeňme, že v súčasnosti sa používa hlavne angloamerický systém, ktorý vychádza z angloamerickej stopy (v súčasnosti 30,48 cm), pričom sa rozdeľuje jeden palec (dvanástina stopy) buď na 72,27 častí – tento systém používa napríklad typografický program TeX, alebo na 72 častí – tento systém je aplikovaný v programoch Adobe, OpenOffice.org atď.
Aby sme pokryli potreby rôznych spôsobov sadzby, budeme v makre používa tri systémy, ktoré sme už naznačili. Pre jednoduchosť budeme označovať angloamerické systémy slovom „pica“, čo je pomenovanie jednotky pre 12 bodov a Didot (v tomto systéme je 12 bodov označovaných ako Cicero) s tým, že hoci označíme systém „Didot“, budeme ho počítať starým systémom „Fournier“, aby sme aspoň takto zachovali historicky prvý merný typografický systém (veľkosť tohto typografického bodu sa oproti systému Didot líši až na piatom desatinnom mieste, takže to nie je úplne zavádzajúce označenie). Pri tomto umožníme jednak zmenu veľkosti písma v označenom texte a jednak riadkovanie podľa takto nastavenej veľkosti písma.

Okrem toho, samozrejme, umožníme v makre aj bežné nastavenie riadkovania (jeden, jeden a pol, ..., pričom, aby sme nemali veľa nastavovacích prvkov, budeme toto riadkovanie nastavovať cez percentá – riadkovanie 1 bude 100%). A pretože sa riadkovanie dá nastaviť iba pre odsek, umožníme aj nastavenie veľkosti horného a spodného odsadenia odseku.
Ako zaujímavé súčasti makra musia byť aj funkcie pre prevod reťazca na reálne číslo a naopak, pretože v slovenčine (aj češtine) sa čísla oddeľujú desatinnou čiarkou, ale bežné prevodné programy počítajú s desatinnou bodkou.
Ostatné možnosti, ako je napríklad paralelná práca v texte pri otvorenom dialógovom okne sme si spomínali v minulom dieli „Makrá v OpenOffice.org – Nastavenie šírky a rozostupu znakov“, takže sa im už nebudeme venovať.
dim dlgr as object
REM Prevod reálneho čísla na reťazec (2 desatinné miesta)
function single_2_string (cislo as single) as string
dim pom, cela, desatinna as string
dim kde as long
pom=trim(str(cislo))
kde=Instr(pom,",") ' Vhľadáme desatinnú čiarku
if kde=0 then
kde=Instr(pom,".") ' Ak nie je desatinná čiarka, vhľadáme desatinnú bodku
endif
cela="0"
desatinna="00"
if kde>0 then
cela=left(pom,kde-1) ' Vybranie celej časti, je desatinná čiarka
else
cela=pom ' Vybranie celej časti, nie je desatinná čiarka
endif
if kde>0 then ' Ak je desatinná čiarka, tak spracujeme desatinnú časť
kde=len(pom)-kde
if kde>0 then
desatinna=right(pom,kde) ' Vybranie desatinnej časti
endif
endif
kde=len(desatinna)
select case kde ' Nastavenie desatinnej časti na dve desatinné miesta
case 0
desatinna="00"
case 1
desatinna=desatinna+"0"
case else
desatinna=left(desatinna,2)
end select
single_2_string=cela+","+desatinna ' Výsledný reťazec (nastavujeme desatinnú čiarku)
end function
REM Prevod reťazca na reálne číslo
function string_2_single(retazec as string) as single
dim cela, desatinna, kde, pom as long
kde=Instr(retazec,",") ' Vhľadáme desatinnú čiarku
if kde=0 then
kde=Instr(retazec,".") ' Ak nie je desatinná čiarka, vhľadáme desatinnú bodku
endif
cela=0
desatinna=0
if kde>0 then
cela=val(left(retazec,kde-1)) ' Vybranie celej časti, je desatinná čiarka
else
cela=val(retazec) ' Vybranie celej časti, nie je desatinná čiarka
endif
if kde>0 then ' Ak je desatinná čiarka, tak spracujeme desatinnú časť
kde=len(retazec)-kde
if kde>0 then
desatinna=val(right(retazec,kde)) ' Vybranie desatinnej časti
kde=len(right(retazec,kde)) ' Veľkosť desatinnej časti
endif
endif
pom=cela*10^kde + desatinna ' Prevod reťazca na celé číslo
string_2_single=pom/10^kde ' Vlastný prevod na reálne číslo
end function
Rem Prevod reálneho čísla v cm na stotiny mm
function cm_mm(retazec as string) as long
cm_mm=string_2_single(retazec)*1000 ' 1 cm = 1000 stotín mm
end function
REM Procedúra pre nastavenie veľkosti písma
sub Velkost_Initiated
dim velkost as single ' Pre nastavenie veľkosti písma podľa nastaveného systém (Pica, TeX, Didot)
dim kurzor as object
velkost=string_2_single(dlgr.model.Pismo.text) ' Veľkosť písma, default v OO.o je Pica – tú nemusíme prepočítavať
if dlgr.model.TeX.State=1 then
' Budeme nastavovať veľkosť v Pica TeX – 1palec = 72,27pt (1pt = 25,4/72,27=0,3515mm)
velkost=velkost*(25.4/72.27)/(25.4/72) ' veľkosť(Pica)*TeX/Pica
elseif dlgr.model.Didot.State=1 then
' Budeme nastavovať veľkosť v Didot – 1parížska stopa = 864pt (1pt = 324,8/864=0,3759mm)
velkost=velkost*(324.8/864)/(25.4/72) ' veľkosť(Pica)*Didot/Pica
endif
kurzor= ThisComponent.currentcontroller.getViewCursor() ' viditeľný kurzor
kurzor.charHeight=velkost ' Zmena veľkosti označených znakov
end sub
Rem Procedúra pre nastavenie riadkovania počas definície hodnôt
sub Riadkovanie_Initiated
dim dokument, dispatcher, oVyber as object
dim hore, dole, ako, kolko as long
dim velkost, vyska as single
oVyber=ThisComponent.getCurrentSelection()
' Prevod horného a dolného odsadenia na stotiny milimetra
hore=cm_mm(dlgr.model.Odsek_h.text)
dole=cm_mm(dlgr.model.Odsek_d.text)
dokument = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
if dlgr.model.Pica.State=1 then
' Budeme nastavovať veľkosť v Pica Adobe – 1palec = 72pt (1pt = 25,4/72=0,3528mm)
velkost=25.4/72
elseif dlgr.model.TeX.State=1 then
' Budeme nastavovať veľkosť v Pica TeX – 1palec = 72,27pt (1pt = 25,4/72,27=0,3515mm)
velkost=25.4/72.27
else
' Budeme nastavovať veľkosť v Didot – 1parížska stopa = 864pt (1pt = 324,8/864=0,3759mm)
velkost=324.8/864
endif
vyska=string_2_single(dlgr.model.Pismo.text) ' Výška písma v pt
if dlgr.model.Set_pismo.State=1 then
ako=3 ' Nastavenie riadkovania v stotinách mm
kolko=vyska*velkost*val(dlgr.model.Hodnota.text) ' 1 mm sa nastavuje ako 100, čo je zabezpečené údajom "Hodnota"
else
ako=0 ' Nastavenie riadkovania v %
kolko=val(dlgr.model.Hodnota.text) ' "Hodnota" určuje priamo percentá
endif
' Nastavenie riadkovania
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "LineSpacing.Mode"
args1(0).Value = ako
args1(1).Name = "LineSpacing.Height"
args1(1).Value = kolko
dispatcher.executeDispatch(dokument, ".uno:LineSpacing", "", 0, args1())
' Nastavenie horného a dolného odsadenia
dim args2(3) as new com.sun.star.beans.PropertyValue
args2(0).Name = "TopBottomMargin.TopMargin"
args2(0).Value = hore
args2(1).Name = "TopBottomMargin.BottomMargin"
args2(1).Value = dole
args2(2).Name = "TopBottomMargin.TopRelMargin"
args2(2).Value = 100
args2(3).Name = "TopBottomMargin.BottomRelMargin"
args2(3).Value = 100
dispatcher.executeDispatch(dokument, ".uno:TopBottomMargin", "", 0, args2())
end sub
REM Makro, ktoré zneviditeľní dialóg – t.j. nastaví, že sa má ukončiť čakací cyklus (volané stlačením klávesy "Koniec" v dialógu)
sub Koniec_Riadkovanie_Initiated
dlgr.setVisible(false) ' Zneviditeľnenie dialógu
end sub
Rem Volanie dialógu a makra pre nastavenie riadkovania
sub Nastav_riadkovanie
dim kurzor as object
dim vyska, hore, dole as single
dim percento as integer
DialogLibraries.LoadLibrary("JP_Kerning_znakov") ' Otvorenie knižnice
JP_Kerning_znakov.Odpamataj_vyber ' Odpamätanie pôvodného výberu
kurzor= ThisComponent.currentcontroller.getViewCursor() ' viditeľný kurzor
kurzor.collapseToStart() ' ak je niečo označené, tak zrušíme výber a skočíme na začiatok
vyska=kurzor.charHeight ' Výška prvého znaku z výberu
hore=kurzor.ParaTopMargin/1000 ' Horné odsadenie (prevod zo stotín mm na cm)
dole=kurzor.ParaBottomMargin/1000 ' Dolné odsadenie (prevod zo stotín mm na cm)
percento=100 ' Default hodnota riadkovania
if kurzor.ParaLineSpacing.Mode=0 then ' Riadkovanie je zadané v %
percento=kurzor.ParaLineSpacing.Height
endif
if kurzor.ParaLineSpacing.Mode=3 then ' Riadkovanie je zadané v stotinách mm
percento=kurzor.ParaLineSpacing.Height/(vyska*(25.4/72)) ' Riadkovanie prevedieme na % v Pica
endif
JP_Kerning_znakov.Nastav_vyber ' Nastavenie pôvodného výberu
if not isnull(dlgr) then exit sub ' Ak je okno otvorené, neotvárame druhé
dlgr=CreateUnoDialog(DialogLibraries.JP_Kerning_znakov.Dialog_Odsadenie_riadkov) ' Sprístupnenie dialógu
dlgr.model.Pismo.text=single_2_string(vyska) ' Init aktuálnej výšky písma
dlgr.model.Hodnota.text=str(percento) ' Init aktuálneho riadkovania
dlgr.model.Pica.State=1 ' Init nastavovania veľkosti v Pica (default)
dlgr.model.TeX.State=0
dlgr.model.Didot.State=0
dlgr.model.Set_pismo.State=1 ' Budeme nastavovať veľkosť cez veľkosť písma
dlgr.model.Odsek_h.text=single_2_string(hore) ' Init horného odsadenia
dlgr.model.Odsek_d.text=single_2_string(dole) ' Init dolného odsadenia
dlgr.setVisible(true) ' zviditeľnenie dialógu – namiesto dlg.Execute(), aby sa dalo paralelne pracovať s textom
while dlgr.isVisible() ' Cyklus, ktorý čaká na stlačenie klávesy "Koniec" v dialógu (kým je dialóg viditeľný)
wait 500 ' Časová medzera 500 milisekúnd (0,5 sec) na to, aby sa dalo paralelne pracovať s dokumentom
wend
dlgr.dispose() ' Zatvorenie dialógu
end sub
Copyright © 2002 - 2012 Inet.sk, s. r. o.Všetky práva vyhradenéNeprešlo jazykovou úpravouISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Webhosting Inet.sk