OpenOffice: Division durch Bruch ersetzen

  • Ich möchte meinen Laptop in der Schule benutzen, dabei wäre es für mich hilfreich, wenn ich insbesondere die Handhabung des Laptops in den naturwissenschaftlichen Fächeren verbessern könnte, Formeln würden sonst viel Zeit zur Eingabe in Anspruch nehmen.
    Dabei habe ich gedacht wäre ein Hotkey, der die momentane Auswahl ausliest(Mit send(^c), clipput etc..) und sie dann verändert wieder einfügt.
    Meine Erste Idee ist eine Division "{Dividend/Divisor}" in einen Bruch "{Zähler} over {Nenner}" umzuwandeln, folgende Fälle fallen mir spontan ein:
    "1/2" ==> "{1} over {2}"
    "(1 + 2)/3" == "{1+2} over {3}"
    "(1/2)/3" ==> "{(1/2)} over {3}"
    "((1/2) + 3) /4" ==> "{((1/2)+3)} over {4}"
    ABER:
    "(1/2)/(3/4)" ==> "{(1/2)} over {(3/4)}" etc...
    ohne Sonderfälle wäre das ja noch ziemich einfach..
    mein Ergebnis bis jetzt:

    Spoiler anzeigen
    [autoit]

    ; Script Start - Add your code below here
    #include <String.au3>
    HotKeySet("^!b","Bruch")
    While 1
    Sleep(50)
    WEnd
    #cs

    [/autoit] [autoit][/autoit] [autoit]

    #ce
    Func Bruch()
    $Clip = ClipGet()
    Send("^c")
    Sleep(500)
    $text = ClipGet()
    StringReplace($text,"/","/")
    $Brueche = @extended
    If Mod($Brueche,2) == 0 Then
    $Bruch = 1
    Else
    $Bruch = Ceiling($Brueche/2)
    EndIf
    Local $aBruch = StringRegExp($text, "^(" & _StringRepeat(".*?/",$Bruch - 1) & ".*?)/(.*)$",3)
    If IsArray($aBruch) Then
    ClipPut("{" & $aBruch[0] & "} over {" & $aBruch[1] & "}")
    Send("^v")
    EndIf
    Sleep(500)
    ClipPut($Clip)
    EndFunc

    [/autoit]

    Wobei das natürlich keine Sonderfälle beachtet...

    Ich hoffe ihr könnt mir auf die Sprünge helfen...

  • Du könntest mir StringRight überprüfen ob das letzte zeichen eine ) ist

    so z.B.

    Spoiler anzeigen
    [autoit]

    If $StringRight ($Clip,1) = ")" Then
    MsgBox(0,"","")
    Endif

    [/autoit]

    Ungetestet, hab leider kein autoit hier

    mfg. Jam00

  • Meine Lösung:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.1.1 (beta)
    Author: myName

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Template AutoIt script.

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ; Script Start - Add your code below here
    #include <Array.au3>
    #include <String.au3>
    HotKeySet("^!b","Bruch")
    HotKeySet("^!q","Quit")
    While 1
    Sleep(50)
    WEnd
    Func Quit()
    Exit
    EndFunc
    Func Bruch()
    $Clip = ClipGet()
    Send("^c")
    $text = ClipGet()
    StringReplace($text,"/","/")
    Send(Division2Fraction($text),1)
    ClipPut($Clip)
    EndFunc
    Func Division2Fraction($String)
    $aRegExpCheck = StringRegExp($String, "\(", 3)
    $openedBraces = UBound($aRegExpCheck)
    $aRegExpCheck = StringRegExp($String, "\)", 3)
    $closedBraces = UBound($aRegExpCheck)
    $openBraces = $openedBraces - $closedBraces
    If $openBraces <> 0 Then Return SetError(1, "", $String)
    $aSplit = StringSplit($String, "/", 2)
    If Not IsArray($aSplit) Or @error Then Return SetError(1, "", $String)
    $iStart = 0
    $openedBraces = 0
    $closedBraces = 0
    Dim $aRegExp
    While 1
    For $i = $iStart To UBound($aSplit) - 1
    $aRegExp = StringRegExp($aSplit[$i], "\(", 3)
    If IsArray($aRegExp) Then $openedBraces += UBound($aRegExp)
    $aRegExp = StringRegExp($aSplit[$i], "\)", 3)
    If IsArray($aRegExp) Then $closedBraces += UBound($aRegExp)
    $openBraces = $openedBraces - $closedBraces
    If $openBraces > 0 Then
    Do
    $openedBraces += UBound(StringRegExp($aSplit[$i + 1], "\(", 3)) - 1
    $closedBraces += UBound(StringRegExp($aSplit[$i + 1], "\)", 3)) - 1
    $openBraces = $openedBraces - $closedBraces
    $aSplit[$i] &= "/" & $aSplit[$i + 1]
    _ArrayDelete($aSplit, $i + 1)
    Until $openBraces == 0; Or UBound($aSplit) == $i+1
    $iStart = $i; + 1
    ContinueLoop (2)
    ElseIf $openBraces == 0 Then
    ContinueLoop
    ElseIf $openBraces < 0 Then
    Return SetError(1, "", $String)
    EndIf
    Next
    ExitLoop
    WEnd
    Local $sReturn = "{}over{" & $aSplit[Ubound($aSplit) - 1] & "}"
    For $i = UBound($aSplit) - 2 To 1 Step - 1
    $sReturn = _StringInsert($sReturn, "{}over{" & $aSplit[$i] & "}", StringInStr($sReturn,"}")-1)
    Next
    $sReturn = _StringInsert($sReturn, $aSplit[$i], StringInStr($sReturn,"}")-1)
    Return $sReturn
    EndFunc ;==>Division2Fraction

    [/autoit]