Próba wyjaśnienia.
Chciałem, tak prawdę mówiąc, zorientować się jakie jest zainteresowanie makrami. Gdy są wprost umieszczone jako kod do pobrania - tego nie wiadomo. Gdy są plikiem, widać ile razy były pobrane.
Zapisałem makro poleceniem "Plik -> Eksportuj Bascic" jednak plik z rozszerzeniem .bas nie jest wpuszczany na forum. Zmieniłem rozszerzenie na .txt. Twój post sprawił, że podejrzałem plik. Rzeczywiście jest zapisany w kodowaniu ANSI. W Basicu nie mam możliwości wybrania zapisu tekstowego innego niż ANSI. W Writerze eksport pozwala wybrać plik tekstowy MediaWiki (txt) i ten jest kodowany w UTF-8.
Jak by nie było zamieszczam kod tego makra do pobrania wprost z tego postu.
Polecenie Option Explicit (w opisie Basica podają, że wielkość liter nie ma znaczenia) określa tylko fakt, że każda użyta zmienna w makrokodzie musi być najpierw zdefiniowana. Zatem nie rozumiem tego komunikatu. Można tę linię po prostu usunąć.
Co do twoich przykładów. Zastosowałeś formułę binom i rzeczywiście są problemy z pozycjonowaniem, ja natomiast tworzę formułę złożoną z trzech elementów: symbolu podstawowego opatrzonego z lewej strony indeksami, górnym i dolnym. W przypadku Windows działa to przyzwoicie. Ta formuła w zapisie formuł to (odwołując się do twego przykładu) "H" lsup {1} lsub {1} (H w cudzysłowie wymusza aby tekst był wprowadzony pismem prostym, liczby zawsze są wprowadzane pismem prostym)
Wstawiłem taką formulę do twojego dokumentu i wygląda dobrze.
Potwierdzam też, że przeciąganie tej konstrukcji jest blokowane. Działa na niej jednak operacja Wytnij i Wklej w nowym miejscu.
Poniżej kod makra.
Kod: Zaznacz cały
REM ***** BASIC *****
REM autor: Jermor, Polskie Forum OpenOffice (2020)
'Makro konwertuje na wzór układ trzech wyrazów poprzedzających kursor tekstowy
'w momencie jego wywołania. Działa tylko w Writerze
Option explicit
Sub izotop
Const temat="Konwersja na wzór"
Const c=""""
Dim oSels as Object, oDoc as Object
Dim sZaznaczenie as String, sformula as String, gora as string, dol as string
Dim smbl as string
Dim ipozycja as integer
dim document as object
dim dispatcher as object
oDoc=ThisComponent
if oDoc.Identifier <> "com.sun.star.text.TextDocument" then
msgbox "Makro można wywołać tylko w programie Writer",,Temat
stop
end if
oSels = ThisComponent.getCurrentSelection()
If oSels.getCount>1 Or oSels.getByIndex(0).getString()<>"" Then
MsgBox "Makro można wykonać gdy nie zaznaczono żadnego obszaru",,Temat : stop
End If
GoSub zaznacz
oSels = ThisComponent.getCurrentSelection()
sZaznaczenie=Trim(oSels.getByIndex(0).getString())
ipozycja=inStr(sZaznaczenie," ")-1
if ipozycja<0 then
msgBox "Nie udało się zaznaczyć trzech wyrazów",,temat : stop
End if
gora=left(sZaznaczenie,ipozycja)
sZaznaczenie=trim(right(sZaznaczenie,len(sZaznaczenie)-ipozycja))
ipozycja=instr(sZaznaczenie," ")-1
if ipozycja<0 then
msgBox "Nie udało się zaznaczyć trzech wyrazów",,temat : stop
End if
dol=left(sZaznaczenie,ipozycja)
smbl=trim(right(sZaznaczenie,len(sZaznaczenie)-ipozycja)
If asc(gora)=13 or asc(dol)=13 then
MsgBox "Nie udało się zaznaczyć trzech wyrazów",,temat
stop
End If
GoSub kasuj
sformula= c & smbl & c & "lsub {""" & dol & """} lsup {""" & gora & """}"
GoSub wzor
Stop
zaznacz:
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:WordLeftSel", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:WordLeftSel", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:WordLeftSel", "", 0, Array())
Return
Kasuj:
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, Array())
Return
Wzor:
Dim oVC
Dim oObj
Dim TempSize
oVC = oDoc.CurrentController.getViewCursor()
oVC.gotoRange(oVC.getEnd(), False)
oObj = oDoc.CreateInstance("com.sun.star.text.TextEmbeddedObject")
oObj.CLSID = "078B7ABA-54FC-457F-8551-6147e776a997"
oObj.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
oVC.Text.insertTextContent(oVC, oObj, False)
TempSize = oObj.Size
TempSize.Width = 500
TempSize.Height = 500
oObj.Size = TempSize
oObj.LeftMargin=0
oObj.RightMargin=0
oObj.Model.BaseFontHeight = oObj.Anchor.CharHeight
oObj.Model.formula = sFormula
Return
End Sub
Daj znać jesli to coś zmieniło.