Strona 1 z 1

Zmiana * na cdot

PostNapisane: Pt maja 31, 2013 1:17 pm
przez Tribiasz
Witam, czy jest możliwość ustawienia w Math aby po wciśnięciu * na klawiaturze numerycznej Math interpretował to jako wpisanie komendy cdot ?

Re: Zmiana * na cdot

PostNapisane: Pt maja 31, 2013 11:48 pm
przez Jan_J
Ł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.

Re: Zmiana * na cdot

PostNapisane: So cze 01, 2013 10:43 am
przez Minio
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.

Re: Zmiana * na cdot

PostNapisane: N cze 02, 2013 12:08 am
przez Jan_J
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 ")

Re: Zmiana * na cdot

PostNapisane: Pn cze 03, 2013 12:28 am
przez Jan_J
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,)