Podwieszanie spacji a makro

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
_justyna
Posty: 2
Rejestracja: wt gru 03, 2013 8:52 pm

Podwieszanie spacji a makro

Post autor: _justyna »

Szanowni Państwo,
jestem zupełnym laikiem, więc z góry proszę o wyrozumiałość. Przeszukiwałam dość długo forum i nie znalazłam satysfakcjonującej mnie odpowiedzi. Czy ma może ktoś z Państwa makro do podwieszania wiszących spójników, aby działało w LO 4.0? A może dysponują Państwo innymi ciekawymi i przydatnymi makrami? To mój debiut, chciałabym się nauczyć instalować i stosować makra, więc będę wdzięczna za wskazówki.

Z pozdrowieniami!
LibreOffice 4.0
Jan_J
Posty: 4653
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Podwieszanie spacji a makro

Post autor: Jan_J »

Co do usuwania wiszących słów, istnieje, czy raczej istniał wątek https://forum.openoffice.org/pl/forum/v ... p?f=8&t=63 oraz kilka pokrewnych.
W podsumowaniu: są dwie metody mądre, choć niemożliwe do zastosowania, i jedna głupia ale możliwa:
  1. wstawiać spację niełamliwą u+00a0. Proste, łatwe, dobre ćwiczenie na wyrażenia regularne albo nawet i na makra. Problem w tym, że znak ten we Writerze jest traktowany jakby miał stałą szerokość, mimo że Unicode tego nie wymaga. Patrz błąd https://issues.apache.org/ooo/show_bug.cgi?id=23333 (status ACCEPTED) oraz https://bugs.freedesktop.org/show_bug.cgi?id=41652
  2. skoro się nie da ze spacją niełamliwą, może by wykorzystać symbole zakazu łamania wiersza? niestety, algorytm dzielenia wierszy we Writerze reaguje tu nadzwyczaj dziwnie. Zgłosiłem kiedyś błąd w Libre https://bugs.freedesktop.org/show_bug.cgi?id=57652, dyskusję można poczytać, także w poprzednim odnośniku.
  3. skoro nie da się mądrze, można próbować głupio: zamiast wstawiać zakazy podziału, wymuszać zakończenia wierszy w optymalnych miejscach. Wierszy, nie akapitów. Efekt zostanie osiągnięty, jednak wynik będzie niepodatny na przeskładanie: coś jakby wstawiać kreskę ze spacją zamiast włączać dzielenie wyrazów. Oczywiście makro da się napisać, ale moim zdaniem nie warto...
Wobec zaimplementowania TeX-owego algorytmu Knutha--Plassa w JavaScripcie (http://www.bramstein.com/projects/typeset/) były/(są?) pewne nadzieje na zrobienie podobnej rzeczy w Libre, np. https://bugs.freedesktop.org/show_bug.cgi?id=38159. W 2011 r. marzył o tym Laszlo Nemeth, patrz http://numbertext.org/linux/LibOConf2011_DTP.pdf.

Tak że ważny temat wisielców nie okazał się najszczęśliwszy, jeżeli chodzi o naukę instalacji makr ...
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
chris_
Posty: 171
Rejestracja: pn cze 10, 2013 1:42 pm

Re: Podwieszanie spacji a makro

Post autor: chris_ »

Nawet jeśli byłoby dostępne działające makro, to i tak można byłoby je traktować jako prowizoryczne rozwiązanie problemu. Temat niełatwy do przejścia nie tylko dla Writera, ale całego cyfrowego składu (wyłączając zaawansowane systemy DTP).
LibreOffice (wersja stabilna) | Crunchbang
_justyna
Posty: 2
Rejestracja: wt gru 03, 2013 8:52 pm

Re: Podwieszanie spacji a makro

Post autor: _justyna »

Dziękuję za odpowiedzi.
Oczywiście pierwszy podany wątek przejrzałam, ale nie znalazłam kodu na makro. Kiedyś pracowałam na Wordzie i własnie wykorzystywałam makro na spacje nierozdzielające, myślałam, że w LO będę mogła robić to samo.
Próbowałam (podług wskazówek z innych wątków) zainstalować makro na łącznik opcjonalny i na zmianę nazw miesięcy - ale również bezskutecznie, podejrzewam, że to moja niewiedza na to nie pozwala.
Oczywiście do tej pory podwieszałam Ctrl+Shift+Spacja, pewnie dalej tak będę robić, jeżeli stosuje się dzielenie wyrazów, to nie wygląda to aż tak źle, nie tworzą się korytarzyki.
Tak naprawdę to prowadzę takie zajęcia dodatkowe z wykorzystanie podstawowych funkcji LO i chciałam zaprezentować słuchaczom właśnie działanie makra, będę musiała niestety wymyślić coś innego.
LibreOffice 4.0
Jan_J
Posty: 4653
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Podwieszanie spacji a makro

Post autor: Jan_J »

_justyna pisze:do tej pory podwieszałam Ctrl+Shift+Spacja, pewnie dalej tak będę robić, jeżeli stosuje się dzielenie wyrazów, to nie wygląda to aż tak źle, nie tworzą się korytarzyki
Nie chodzi o korytarzyki. Podstawowy system łamania wierszy we Writerze jest nędzny: wypełnij bieżący wiersz -> spróbuj podzielić następne słowo, a nuż się zmieści -> wyjustuj -> przejdź do następnego. Ale to osobna sprawa.
Problem w tym, że w trybie justowania spacja u+0020 jest elastyczna, a u+00a0 ma stałą szerokość. Czyli podklejone spójniki są na ogół zbytnio zbliżone do następującego po nich słowa.
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Astur
Posty: 654
Rejestracja: wt lip 13, 2010 9:11 am

Re: Podwieszanie spacji a makro

Post autor: Astur »

Potrzebne będą dwa makra w LIbreOffice Basic, w Moje okna dialogowe i makra/Standard/Module1

Kod: Zaznacz cały

sub PrzeniesZwis
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:InsertZWNBSP", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:GoToEndOfLine", "", 0, Array())


end sub


sub KrytycznaGestoscTekstu
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:InsertNonBreakingSpace", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:GoToEndOfLine", "", 0, Array())


end sub
Makro PrzeniesZwis wykonuje następujące operacje:
  1. Wstawienie łącznika nierozdzielającego
  2. Przejście na koniec linii
Makro KrytycznaGestoscTekstu wykonuje następujące operacje:
  1. Usunięcie kolejnego znaku
  2. Wstawienie twardej spacji
  3. Przejście na koniec linii
Objaśnienie:
Ciąg <litera początkowa><łącznik nierozdzielający zerowej szerokości><spacja><litera końcowa> przymocowuje literę początkową do litery końcowej podobnie jak twarda spacja, ale w sposób elastyczny. Operację taką, czyli doklejenie do ostatniej litery wiersza wspomnianego łącznika dokonuje pierwsze makro. Czasami jednak, gdy gęstość liter w następnym wierszu staje się krytyczna, operacja ta nieskutkuje i wówczas trzeba użyć drugiego makra, które zamieni spację na twardą spację. Ponieważ gęstość następnego wiersza jest krytyczna, twarda spacja jest dobrą miarą justunku, szczególnie gdy włączone jest dzielenie wyrazów.

Makro można rozbudować do czegoś większego, co by sprawdzało tekst linię po linii i w razie wykrycia zwisającej literki, przesuwało ją na początek następnej linii. Odsyłam do odpowiedniego wątku na tym forum: viewtopic.php?p=11229#p11229
Jeśli chodzi o mnie, to czekając na ciekawsze rozwiązanie, wstawiłem te makra jako przyciski do paska narzędzi, zmieniając im nazwę i dodając ikonki.
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
ODPOWIEDZ