Zmiana * na cdot

Użytkowanie edytora równań
Tribiasz
Posty: 1
Rejestracja: pt lut 01, 2013 12:23 pm

Zmiana * na cdot

Post autor: Tribiasz »

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
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Zmiana * na cdot

Post autor: 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.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Minio
Posty: 323
Rejestracja: śr sie 01, 2012 1:48 am
Lokalizacja: (Poznań|Dziwnów), Polska

Re: Zmiana * na cdot

Post autor: 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.
Mój blog o używaniu LibreOffice
LibreOffice 4.2.6, Debian testing amd64
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Zmiana * na cdot

Post autor: 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

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

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 (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Zmiana * na cdot

Post autor: 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

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

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 (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ