Pisanie symboli izotopów chemicznych [SOLVED]

Użytkowanie edytora dokumentów
Awatar użytkownika
Astur
Posty: 653
Rejestracja: wt lip 13, 2010 9:11 am

Pisanie symboli izotopów chemicznych [SOLVED]

Post autor: Astur »

Symbol izotopu pierwiastka chemicznego wygląda tak:
Obrazek

gdzie: A – liczba masowa, Z – liczba atomowa, X – symbol pierwiastka

Napisanie tego w LibreOffice wymaga włączenia obsługi języków azjatyckich i odpowiedniego formatowania. Wyjaśnię to pokrótce:
Włączenie języków azjatyckich
Narzędzia –> Opcje –> Ustawienia języka –> Języki. Zaznacz jak na obrazku:
Obrazek

Formatowanie tekstu
Aby uzyskać symbol izotopu, należy wpisać obie liczby (patrz na górę notatki, gdzie objaśnienie nazw) w następującym porządku:
A Z X
(spacje są ważne!)
Następnie należy objąć zaznaczeniem „A Z ” – czyli [litera]A[spacja][litera]Z[spacja]. Po czym przejść do:
Format –> Znak… –> [karta] Czcionka. Zgodnie z tym, co na obrazku:
Obrazek
…należy dopilnować, aby obie rodziny znaków były identyczne. W tym przykładzie czcionką jest Gentium Plus. Używam jej, bo jest ładna i wygląda nobliwie. Nie każdemu się musi podobać.
Wysokość czcionki tekstu azjatyckiego będzie odpowiadała obu indeksom. W sumie można ją zostawić tak, jak jest w domyśle.

Z kolei przejść do [karta]Układ azjatycki. Zaznaczyć to co na obrazku:
Obrazek
Resztę zostawić bez zmian.

To już właściwie wszystko. Gdyby ktoś zdołał zamknąć te polecenia w eleganckim makrze i je tu załączył, będę b. wdzięczny.
Ubuntu 20.04 — OpenOffice 4.1.10
Zanim zastosujesz się do jakiejś rady, zrób kopię zapasową dokumentu, którego ona ma dotyczyć.
Wskazówka: w dokumentach używam czasem niestandardowych, bezpłatnych czcionek Gentium i Lato
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Pisanie symboli izotopów chemicznych [SOLVED]

Post autor: Jermor »

Szanowny @Astur,
zastanawiałem się nad rozwiązaniem twego problemu. Pozwalam sobie przedstawić ci swój pomysł. Nie wykorzystuje on jednak metody podanej przez ciebie. Założyłem, że taki symbol izotopu powinien być odrębnym elementem, którego nie można przypadkowo zmienić.
Dlatego zbudowałem makro, które wstawia do dokumentu obiekt programu Math ulokowany w wierszu jako znak. Dzięki temu taki element łatwo jest zaznaczyć i przenieść w inne miejsce. Wielkość symbolu jest automatycznie dopasowywana do wielkości czcionki użytej w miejscu wstawiania symbolu.
Zasada działania jest taka: Należy wpisać trzy wyrazy rozdzielając je spacjami, w układzie: indeks górny, indeks dolny, symbol. Gdy kursor znajduje się za symbolem wywołać makro. Nie należy niczego zaznaczać, makro samo stara się zinterpretować te trzy składniki.
Makro nazwałem Izotop.
Nie wiem czy się przyda ale jest to jedno z rozwiązań.
Załączniki
izotop.txt
(2.77 KiB) Pobrany 160 razy
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Astur
Posty: 653
Rejestracja: wt lip 13, 2010 9:11 am

Re: Pisanie symboli izotopów chemicznych [SOLVED]

Post autor: Astur »

Po uruchomieniu wyszło tak:

Obrazek
…od razu widać, że Windows wciąż używa jedynie słusznego systemu kodowania, czyli CP1250 :?

Natchniony Twoim pomysłem postanowiłem użyć edytora formuł. Wyniki załączam w pliku.
Dodam, że ze strony https://www.libreoffice.org/download/appimage/ ściągnąłem sobie binarkę fresh, aby mieć absolutną pewność, że to nie są efekty developera mojego pakietu.
Niestety, w nowiutkim LO fresh jest dokłanie tak samo, czyli formuły wstawionej jako znak nie da się pozycjonować względem linii tekstu. Po prostu się nie daje. Wszystkie inne obiekty, wstawione jako znaki, dają się przesuwać. Formuła nie.
  • Tak przy okazji, sprawdziłem Twoje makro w ściągniętej wersji fresh, aby mieć pewność, że to nie wina wersji still. Niestety, wynik ten sam.
Nie rozumiem, dlaczego tak się dzieje i obawiam się, że LibreOffice nauczyło się myśleć za użytkownika, w tym najgorszym, microsoftowym sensie.
Załączniki
Walka_z_formula.odt
Dlaczego nie chcę używać formuł matematycznych jako znaków w tekście.
(28.19 KiB) Pobrany 130 razy
Ubuntu 20.04 — OpenOffice 4.1.10
Zanim zastosujesz się do jakiejś rady, zrób kopię zapasową dokumentu, którego ona ma dotyczyć.
Wskazówka: w dokumentach używam czasem niestandardowych, bezpłatnych czcionek Gentium i Lato
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Pisanie symboli izotopów chemicznych [SOLVED]

Post autor: Jermor »

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.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Pisanie symboli izotopów chemicznych [SOLVED]

Post autor: Jermor »

Jeszcze jedno
Option Explicit Statement
Określa, czy każda zmienna w kodzie programu musi być jawnie zadeklarowana za pomocą instrukcji Dim.

Składnia:
Option Explicit
Parametry:
warning
This statement must be added before the executable program code in a module.
Czyli musi być pierwszym elementem modułu, po ewentualnych komentarzach. Na twojej ilustracji makro zaczyna się od 9 wiersza, czyli coś już jest w tym module. Może to jest powód błędu?
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
ODPOWIEDZ