Zmiana * na cdot

Użytkowanie edytora równań

Zmiana * na cdot

Postprzez Tribiasz » Pt maja 31, 2013 1:17 pm

Witam, czy jest możliwość ustawienia w Math aby po wciśnięciu * na klawiaturze numerycznej Math interpretował to jako wpisanie komendy cdot ?
LibreOffice 3.6.*.* Win 7 & LMDE
Tribiasz
 
Posty: 1
Dołączył(a): Pt lut 01, 2013 12:23 pm

Re: Zmiana * na cdot

Postprzez Jan_J » Pt maja 31, 2013 11:48 pm

Łatwej metody zdaje się nie ma. Math pozwala na tworzenie własnych symboli, ale ich nazwy muszą być poprzedzone znakiem %, zaś wynik będzie zwykłym symbolem, a nie znakiem działania, co wpływa na otaczanie go odstępami. Interfejs nie przewiduje ingerencji użytkownika w znaczenie słów kluczowych i podstawowych symboli działań.
Autokorekta nie jest stosowana w Math (poza tym działałaby także w innych modułach pakietu). Takoż nie funkcjonują autoteksty. Co się nasuwa, to napisać makropolecenie, które śledzi formułę i robi w niej porządki.

PS. rozumiem frustrację; warto byłoby mieć choćby importer, który np. z wzoru w programistycznej notacji, jak a * c - b * d, zrobi ładną formułę z cdot-ami.
JJ
LO Still (6.2) ∙ AOO 4.1.7 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3975
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Zmiana * na cdot

Postprzez Minio » So cze 01, 2013 10:43 am

Autokorekta nie działa w Math, ale działa we Writerze. Można w nim napisać kod wzoru, zaznaczyć go i wybrać z menu tworzenie formuły — zostanie utworzona na podstawie zaznaczonego kodu. Co najwyżej później trzeba go przenieść/skopiować.
Przy czym Writer nie odróżnia gwiazdki nad 8 od gwiazdki na klawiaturze numerycznej, więc autokorekta musiałaby zamieniać wszystkie gwiazdki jak leci.

Prędzej dałoby się to zrobić na poziomie systemu operacyjnego. Na Linuksie gwiazdka nad 8 ma inny kod niż gwiazdka na klawiaturze numerycznej, więc można zmodyfikować mapę klawiszy w taki sposób, aby za pomocą tej drugiej wprowadzać tekst. Nie wiem jak na Windowsie. Ale znowu — to będzie działać wszędzie, a w Calcu może np. irytować.

Lub, tak jak pisze Jan, stworzyć makro które będzie zamieniać ten symbol kontekstowo.
Mój blog o używaniu LibreOffice
LibreOffice 4.2.6, Debian testing amd64
Minio
 
Posty: 323
Dołączył(a): Śr sie 01, 2012 1:48 am
Lokalizacja: (Poznań|Dziwnów), Polska

Re: Zmiana * na cdot

Postprzez Jan_J » N cze 02, 2013 12:08 am

Pierwsze podejście, które nie załatwia sprawy: globalna zamiana we wszystkich formułach w głównej części bieżącego dokumentu Writera (dokumenty Calc|Draw|Inpress mają inną strukturę, i do formuł dochodzi się nieco inaczej).

Basic
Kod: Zaznacz cały   Rozszerz widokZwiń widok
rem zmienia "*" na symbol "cdot" w formułach w bieżącym dokumencie
sub ast2cdot()
   d = thisComponent
   frames = d.EmbeddedObjects
   for i = 0 to frames.Count-1
     f = frames.getByIndex(i).Component
     if f.ImplementationName = "com.sun.star.comp.math.FormulaDocument" then
       f.Formula = replace(f.Formula, "*", " cdot ")
     endif
   next i
end sub

Python
Kod: Zaznacz cały   Rozszerz widokZwiń widok
def ast2cdot():
    ' zmienia "*" na symbol "cdot" w formułach w bieżącym dokumencie '
    d = XSCRIPTCONTEXT.getDocument()
    frames = d.EmbeddedObjects
    for i in range(frames.Count):
        f = frames.getByIndex(i).Component
        if f.ImplementationName == "com.sun.star.comp.math.FormulaDocument":
            f.Formula = f.Formula.replace("*", " cdot ")
JJ
LO Still (6.2) ∙ AOO 4.1.7 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3975
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Zmiana * na cdot

Postprzez Jan_J » Pn cze 03, 2013 12:28 am

Podejście drugie: technologia obsługi zdarzeń. W momencie dezaktywacji bloku formuły wszystkie wystąpienia * zamieniają się na cdot. Rzecz jasna, to tylko szkic pokazujący metodę, która powinna działać bardziej wybiórczo (np. zachować gwiazdki wewnątrz tekstów ujętych w cudzysłowy).

Basic
Kod: Zaznacz cały   Rozszerz widokZwiń widok
sub wlacz()
   d = thisComponent
   c = d.currentController
   h = CreateUnoListener("my_","com.sun.star.view.XSelectionChangeListener")
   c.addSelectionChangeListener(h)
end sub

sub my_SelectionChanged(evt)
   ast2cdot(evt.Source.Selection)
end sub

sub my_disposing(evt)
        ' pusta
end sub

sub ast2cdot(s)
   on error goto done
   f = s.Component
   if f.ImplementationName = "com.sun.star.comp.math.FormulaDocument" then
     f.Formula = replace(f.Formula, "*", " cdot ")
   end if
   done:
end sub

Python
Kod: Zaznacz cały   Rozszerz widokZwiń widok
import uno
import unohelper
from com.sun.star.view import XSelectionChangeListener

class mySelectionChangeListener(unohelper.Base, XSelectionChangeListener):

    def selectionChanged(self, evt):
        ast2cdot(evt.Source.Selection)

    def disposing(self, evt):
        pass

def ast2cdot(sel):
    try:
        f = sel.Component
        if f.ImplementationName == "com.sun.star.comp.math.FormulaDocument":
            f.Formula = f.Formula.replace("*", " cdot ")
    except:
        pass

def wlacz():
    d = XSCRIPTCONTEXT.getDocument()
    c = d.getCurrentController()
    h = mySelectionChangeListener()
    c.addSelectionChangeListener(h)

g_exportedScripts = (wlacz,)
JJ
LO Still (6.2) ∙ AOO 4.1.7 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3975
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław


Powrót do Math

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości