[FF] 2007-05-19 - MimeTexBuffer aims to be an interactive math formula edit buffer. See it in action: [http://www.freemove.it/images/MimeTexBuffer.gif] or try the code. This is preliminary draft buggy crap junk code of a project I'll work in the near future. I post the code just right now so that you can enjoy hacking it :P I'm a bit tired and won't put my hands over it for a couple of days ^_^ ---- #!/bin/sh # This line continues for Tcl, but is a single line for 'sh' \ exec tclsh "$0" ${1+"$@"} package require Tk 8.4 package require base64 grid [canvas .c] -row 0 -columnspan 2 -sticky news set img "" set caret "@@@@8976@@@@" set buf $caret proc render e { global img .c delete eee catch {image delete $img} set p [open [list |mimetex -d "$e"] r] fconfigure $p -translation binary -encoding binary set rawData [base64::encode [read $p]] close $p set img [image create photo -data $rawData] .c create image 10 10 -image $img -tags eee -anchor nw } proc kp {w keycode keysym keysym_s} { global buf caret set caretpos [lsearch $buf $caret] set len [llength $buf] if [regexp {^[a-z0-9]$} $keysym_s] { set buf [linsert $buf $caretpos $keysym_s] } else { switch -- $keysym_s { plus { set buf [linsert $buf $caretpos "+"] } minus { set buf [linsert $buf $caretpos "-"] } asterisk { set buf [linsert $buf $caretpos " \\cdot "] } parentleft { set buf [linsert $buf $caretpos " \\left( "] } parentright { set buf [linsert $buf $caretpos " \\right) "] } Escape { set buf [linsert $buf $caretpos "\} "] } slash { set buf [linsert $buf [expr $caretpos+0] " \\frac\{"] set buf [linsert $buf [expr $caretpos+2] "\}\{"] set buf [linsert $buf [expr $caretpos+3] "\} "] } BackSpace { if {$caretpos > 0} { set newbuf [list] eval lappend newbuf [lrange $buf 0 [expr $caretpos-2]] lappend newbuf $caret eval lappend newbuf [lrange $buf [expr $caretpos+1] end] set buf $newbuf unset newbuf } } Delete { if {$len > 1 && [expr $caretpos+1] < $len} { set newbuf [list] eval lappend newbuf [lrange $buf 0 [expr $caretpos-2]] lappend newbuf [lindex $buf [expr $caretpos-1]] lappend newbuf $caret eval lappend newbuf [lrange $buf [expr $caretpos+2] end] set buf $newbuf unset newbuf } } Left { if {$caretpos > 0} { set newbuf [list] eval lappend newbuf [lrange $buf 0 [expr $caretpos-2]] lappend newbuf $caret lappend newbuf [lindex $buf [expr $caretpos-1]] eval lappend newbuf [lrange $buf [expr $caretpos+1] end] set buf $newbuf unset newbuf } } Right { if {[expr $caretpos+1] < $len} { set newbuf [list] eval lappend newbuf [lrange $buf 0 [expr $caretpos-1]] lappend newbuf [lindex $buf [expr $caretpos+1]] lappend newbuf $caret eval lappend newbuf [lrange $buf [expr $caretpos+2] end] set buf $newbuf unset newbuf } } }} set len [llength $buf] foreach sym {sqrt sin cos tan atan phi pi} { set sl [string length $sym] for {set i 0} {$i < [expr $len-$sl]} {incr i} { set m [join [lrange $buf $i [expr $i+$sl-1]] ""] if {$m == $sym} { set newbuf [lrange $buf 0 [expr $i-1]] lappend newbuf " \\$sym\{ " eval lappend newbuf [lrange $buf [expr $i+$sl] end] set buf $newbuf unset newbuf break } } } set buf_p [string map [list $caret " \\mid "] [join $buf ""]] puts "buf={${buf}}" render $buf_p } bind . {kp %W %k %N %K} ----