Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 17. 8. 2011 18:41:31

Sladecek
Člen
Registrace: 4. 11. 2008
Příspěvků: 55

Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

Dobrý den,
nevíte někdo, jak nastavit v Automatických opravách ve Writeru automatické generování mezery mezi číslem a jednotkou? Příklad: Chci, aby 12,23mm po zapsání se automaticky předělalo na 12,23 mm. Toto nejlépe pro více běžných jednotek. Nešlo by to pomocí regulárních výrazů?
Díky.

Offline

#2 17. 8. 2011 18:45:32

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

Dobrý den,
s oddělil jsem Váš nový dotaz od starého vlákna.


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 17. 8. 2011 19:10:02

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

Nejsem si jistý, zda automatické opravy podporují regulární výrazy. A pomocí najít a nahradit zase nejde rozdělit vyhledaný text, tak zbývá asi jen makro.

;o)



Tak rozdělení vyhledaného textu pomocí reg. výrazů lze jak níže píše p. Pastierik

Editoval sedlacekdan (18. 8. 2011 09:28:36)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#4 17. 8. 2011 20:23:56

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

Možné makro zde:

sub format_mernych_jednotek
doc=thisComponent
formcisla=doc.CreateReplaceDescriptor
formcisla.searchstring = "[:digit:]+[:alpha:]{2}\>" ' hledáme 2 pís.za číslem na konci slova
formcisla.SearchRegularExpression = true
pocet=doc.findAll(formcisla)

for n = 0 to pocet.count - 1
 formatuj_vse = pocet(n)
 oznaccislo = formatuj_vse.Text.createTextCursorByRange(formatuj_vse)
 kformatovani=oznaccislo.getString
 kformatovani=trim(str(kformatovani))
 delka = len(kformatovani)
 cislo = left(kformatovani, delka - 2)
 jednotka = right(kformatovani, 2)
 kformatovani = cislo + chr$(&HA0) + jednotka
 formatuj_vse.SetString(kformatovani)
next n

formcisla1=doc.CreateReplaceDescriptor
formcisla1.searchstring = "[:digit:]+[:alpha:]{1}\>" 'hledáme 1 pís.za číslem na konci slova
formcisla1.SearchRegularExpression = true
pocet = doc.findAll(formcisla1)
for n = 0 to pocet.count - 1
 formatuj_vse = pocet(n)
 oznaccislo = formatuj_vse.Text.createTextCursorByRange(formatuj_vse)
 kformatovani=oznaccislo.getString
 kformatovani=trim(str(kformatovani))
 delka = len(kformatovani)
 cislo = left(kformatovani, delka - 1)
 jednotka = right(kformatovani, 1)
 kformatovani = cislo + chr$(&HA0) + jednotka
 formatuj_vse.SetString(kformatovani)
next n
end sub

Toto makro vyhledá všechna čísla na konci slov, za kterými jsou písmena bez mezer a vloží mezi ně nezalomitelnou mezeru. Vyhledává 1 až dvě písmena za číslem, pokud je písmen více mezera se nevloží.

Snad bude k užitku


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#5 18. 8. 2011 05:10:36

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

Pomocou regulárnych výrazov napr. takto:
hľadať: ([:digit:]+)([:alpha:]+)
nahradiť za: $1 $2

Offline

#6 18. 8. 2011 05:15:28

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

to sedlacekdan: makro je dobré, ale jednotky sú aj jednopísmenové (napr. gram - g), aj viacpísmenové (napr. kilohertz - kHz).

Editoval j-pastierik (18. 8. 2011 05:16:28)

Offline

#7 18. 8. 2011 09:22:20

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

Aha možnost náhrady pomocí regulárních výrazů, není v nápovědě moc dobře popsaná.

Takže když uzavřu ve vyhledávání výraz do () tak ho v nahradit můžu rozdělit pomocí $1 $2 ....

sub format_mernych_jednotek
doc=thisComponent
formcisla=doc.CreateReplaceDescriptor
formcisla.SearchRegularExpression = true
formcisla.searchstring = "([:digit:]+)([:alpha:]+)\>"
formcisla.ReplaceString = "$1"+ chr$(&HA0) + "$2" 
rem formcisla.ReplaceString = "$1"+ " " + "$2" pro obyčejnou mezeru.
doc.ReplaceAll(formcisla)
end sub

To už se celkem zjednodušilo. Díky.

Makro najde všechna čísla a písmena, která se nachází na konci slov a vloží mezi ně mezeru.


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#8 18. 8. 2011 15:15:56

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

V pomocníkovi to veru nie je popísané práve najlepšie, aj keď som odpoveď písal podľa neho, lebo som vedel, že to ide, len som si nepamätal ako:
( ) V poli Hledat: Určuje znaky v závorkách jako referenci. Na první referenci v aktuálním výrazu se je poté možné odkázat pomocí "\1", na druhou referenci "\2" atd.
Např. pokud váš text obsahuje číslo 13487889 a hledáte regulárním výrazem (8)7\1\1, najde se "8788".
Závorky () je také je možné použít k seskupení výrazů, např. "a(bc)?d" najde "ad" nebo "abcd".
V poli Nahradit za:
Pro vložení odkazů použijte $ (znak dolaru) místo \ (zpětné lomítky). Pro vložení celého řetězce použijte $0.

Offline

#9 18. 8. 2011 21:39:24

Sladecek
Člen
Registrace: 4. 11. 2008
Příspěvků: 55

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

Děkuji, to makro funguje tak, jak jsem chtěl.
Ještě mám potíž s tím, jak ho uložit třeba mezi makra s rozšířeními, co už jsou nainstalovaná.

Nešlo by to ale přece jen nějak dát do automatických oprav?

Offline

#10 19. 8. 2011 04:42:37

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

Pripravím novú verziu typografického rozšírenia, kde túto funkciu vložím. Automatické opravy sú robené zoznamom, tam to momentálne nevidím schodné.

Offline

#11 19. 8. 2011 18:13:35

Sladecek
Člen
Registrace: 4. 11. 2008
Příspěvků: 55

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

To by bylo hezké a určitě potřebné. Když už, tak by se mi líbila možnost, že by to fungovalo třeba i pro cm2, m3 a další jednotky s číslem v exponentu (a ještě tak, že když se napíše třeba 12cm2, aby to zároveň udělalo tu dvojku jako horní index - do automatických oprav jsem zařadil svůj převod z mm2 ma mm2 s dvojkou jako horní index, ale tu mezeru mezi číslem a jednotkou jsem už neuměl).

Offline

#12 19. 8. 2011 21:05:15

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

V automatických opravách by jste musel definovat veškeré kombinace čísel a písmen pro které chcete vložit mezeru. Pravda je, že by se Vám dokument takto formátoval již při psaní, ale ta práce než to zadáte....


Než p. Pastierik vytvoří rozšíření - je možné použít toto makro.
1. Vyhledá všechna čísla s písmeny a rozměrem (např. 3cm2) a vloží mezeru mezi číslo a písmeno.
2. Vyhledá všehna čísla s písmeny (např. 3cm) a vloží mezeru
3. Vyhledá rozměry (čtvereční a krychlové) a rozměr zformátuje jako horní index


Šlo by také rozšířit makro o test, zda jsou jednotky zapsány správně (velká a malá písmena)...


sub format_mernych_jednotek
doc = thisComponent


REM najde a přidá mezery mezi číslo a písmeno
formcisla=doc.CreateReplaceDescriptor
formcisla.SearchRegularExpression = true
formcisla.searchstring = "([:digit:]+)([:alpha:]+)([:digit:])\>" 'čísla,písmena,číslo (3cm3)
formcisla.ReplaceString = "$1"+ chr$(&HA0) + "$2" + "$3"
doc.ReplaceAll(formcisla)


formcisla=doc.CreateReplaceDescriptor
formcisla.SearchRegularExpression = true
formcisla.searchstring = "([:digit:]+)([:alpha:]+)\>" 'čísla, písmena (3cm)
formcisla.ReplaceString = "$1"+ chr$(&HA0) + "$2" 'vložíme nezalomitelnou mezeru
doc.ReplaceAll(formcisla)


rozmer=doc.CreateSearchDescriptor
rozmer.SearchRegularExpression = true
rozmer.SearchString = "([:alpha:])([23])\>" ' všechna písmena s čísly 2 nebo 3 bez mezer
pocet = doc.FindAll(rozmer) ' celkový počet výskytů
jeden = doc.FindFirst(rozmer) ' první výskyt
for i = 0 to pocet.count - 1 ' od prvního do posledního výskytu
 kurzor = jeden.text.createTextCursorByRange(jeden) ' vytvoříme kurzor na jednotlivém výskytu
 kurzor.CollapseToEnd() ' posuneme se na konec výskytu
 kurzor.GoLeft(1, True) ' označíme poslední znak výskytu (2 nebo 3)
 kurzor.CharEscapement = 30 ' nejsem si jist výškou nastavení indexu
 kurzor.CharEscapementHeight = 60 ' ani jeho velikostí, snad to odpovídá, je to od oka
 jeden = doc.FindNext(jeden, rozmer) ' přejdeme na další výskyt
next i
end sub

;o)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#13 19. 8. 2011 21:21:16

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

Rozšírenie som už urobil - viď krátka správa, ktorú som, o tom napísal: Rozšíření pro typografickou úpravu
Robí to aj merné jednotky s číslom, na horný index to neprevádzam, to chce trochu dlhší čas - zapíšem si to do plánu na úpravy tohto rozšírenia.

Offline

#14 19. 8. 2011 21:28:22

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

sedlacekdan napsal(a)

formcisla.searchstring = "([:digit:]+)([:alpha:]+)([:digit:])\>" 'čísla,písmena,číslo (3cm3)
formcisla.ReplaceString = "$1"+ chr$(&HA0) + "$2" + "$3"
doc.ReplaceAll(formcisla)
formcisla=doc.CreateReplaceDescriptor
formcisla.SearchRegularExpression = true
formcisla.searchstring = "([:digit:]+)([:alpha:]+)\>" 'čísla, písmena (3cm)
formcisla.ReplaceString = "$1"+ chr$(&HA0) + "$2" 'vložíme nezalomitelnou mezeru
doc.ReplaceAll(formcisla)

Stačí v hľadaní toto: "([:digit:]+)([:alpha:]+[:digit:]*)\>"
a náhrada: "$1"+chr$(&HA0)+"$2"

Príkaz formcisla=doc.CreateReplaceDescriptor nemusíte opakovať, nahradzovací objekt "formcisla" stačí vytvoriť raz. Detto formcisla.SearchRegularExpression=true ak ste nemenili spôsob vyhľadávania regulárne/neregulárne výrazy.

sedlacekdan napsal(a)

([:alpha:])([23])\>

To nestačí, lebo sa v texte môžu vyskytovať dolné indexy (čo pri matematike je úplne bežné) a toto by ich zrušilo. Musí sa hľadať ([:digit:]+)([:alpha:]+[:digit:]*)\> a potom nájdený reťazec testovať, či obsahuje číslo a ak áno, tak v ňom nastaviť horný index. Dnes to však už neurobím, možno na budúci týždeň.

Editoval j-pastierik (19. 8. 2011 21:31:49)

Offline

#15 19. 8. 2011 21:36:41

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

K indexom: Rozširenie pre nastavovanie indexov - tu nájdete ako sú nastavené štandardne horné a dolné indexy

Offline

#16 20. 8. 2011 09:08:33

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

Děkuji za vysvětlení, už se těším na rozšíření.


Zajímavé je, že makro funguje pouze částečně. Při vyhledání číslo/písmeno/číslo nahradí správně pouze v případě, že nenásleduje mezera (3cm3)- pak vloží správně mezeru. Pokud tam mezera je (3cm3 ) tak vloží $1 $2.

with formcisla
.SearchRegularExpression = true
.searchstring = "([:digit:]+)([:alpha:]+[:digit:])\>"
.ReplaceString = "$1" + chr$(&HA0) + "$2" 
doc.ReplaceAll(formcisla)

Zatímco při vyhledání písmeno/číslo to funguje normálně v obou případech správně.

.searchstring = "([:digit:]+)([:alpha:]+)\>"
.ReplaceString = "$1"+ chr$(&HA0) + "$2"
doc.ReplaceAll(formcisla)
end with

;o)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#17 21. 8. 2011 05:38:36

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

Chyba je v ([:digit:]+)([:alpha:]+[:digit:])\> - musí byť iba ([:digit:]+)([:alpha:]+[:digit:]) - zaujímavá chyba, ktorej nerozumiem (prečo na konci slova, ak tam je číslo a medzera, tak OO.o blbne). Opravná verzia rozšírenia je už zverejnená.

Inak, ak som si dal hľadať ([:digit:]+)([:alpha:]+[:digit:]*)\> tak to správne našlo (a označilo) celý reťazec (napr. 12cm3), ale ako prvú časť si OO.o zapamätalo číslo 3 (tomuto nerozumiem) a potom, samozrejme, vložilo 3 a medzeru za ňou.

Editoval j-pastierik (21. 8. 2011 05:53:11)

Offline

#18 21. 8. 2011 05:55:26

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: Automatické generování mezery mezi číslem a jednotkou - VYŘEŠENO

Aj tak sa na to musím ešte pozrieť viac, lebo nie sú zahrnuté záporné indexy (napr. s-1). Ale neskôr...

Offline

Zápatí