2013年8月17日土曜日

Windows 8にTex環境を構築(2) YaTeXの設定 ドル記号入力で数式入力モードへ

Emacsを使ってTeX原稿を作成するときにYaTeXが欠かせません.
Windowsの環境では,表題にあるような自動で数式入力モードに切り替わる環境設定の仕方がわからずに,原稿を作成していてストレスがたまるために,ネイティブなTeX環境を構築するのを半ばあきらめ気味でした.

MacでKeyRemap4MacBookを使ってほぼ目的を達成出来たので,同様の手段で上記の実現が出来ないか模索してみました.

結果的にはAutoHotkeyというソフトを用いることでほぼ満足の行く設定が出来ました.

AutoHotkeyはホットキーへの機能の割り当てを行うスクリプトエンジンだそうで,かなり高機能でいろいろなことができるようです.

AutoHotkeyの設定の仕方などはほかにも色々説明が詳しいサイトがあるので,ここでは必要最低限のことだけにします.

AutoHotkey Wiki や AutoHotkeyを流行らせるページ ミラーページ が詳しいようです.

まず公式ページからAutoHotkey_L_Install.exeをダウンロードしてインストールを行います.

AutoHotkye Wikiページによると,

AutoHotkeyをインストーラーでインストールすると、拡張子 .ahkのファイルに関連付けが行われ、拡張子 .ahkのスクリプトファイルをエクスプローラでダブルクリックしたときなどにAutoHotkey.exeで実行されるようになる。

ということだそうで,拡張子.ahkのスクリプトファイルにキーの割り当て変更などの設定を書き込んで実行させる形式です.

Emacs上でドル記号を入力した際に,IMEをオフにしてドル記号を入力するような設定ファイルを作成しました.

;-----------------------------------------------------------
; IMEの状態をセット
;   SetSts          1:ON / 0:OFF
;   WinTitle="A"    対象Window
;   戻り値          0:成功 / 0以外:失敗
;-----------------------------------------------------------
IME_SET(SetSts, WinTitle="A")    {
 ControlGet,hwnd,HWND,,,%WinTitle%
 if (WinActive(WinTitle)) {
  ptrSize := !A_PtrSize ? 4 : A_PtrSize
     VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0)
     NumPut(cbSize, stGTI,  0, "UInt")   ; DWORD   cbSize;
  hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI)
              ? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
 }

    return DllCall("SendMessage"
          , UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd)
          , UInt, 0x0283  ;Message : WM_IME_CONTROL
          ,  Int, 0x006   ;wParam  : IMC_SETOPENSTATUS
          ,  Int, SetSts) ;lParam  : 0 or 1
}


#IfWinActive ahk_class Emacs
$::
IME_SET(0)
Send,$
return
#IfWinActive

#IfWinActiveで囲んだ部分はemacsのウィンドウがアクティブな状況でのみ働くようにする設定で,ahk_classというものを特定しておかなければならないのですが,これはAutoIt3 Window Spyを起動してahk_classの知りたいアプリケーションをアクティブにすれば表示されます.これを例えばemacs_insert_dollar.ahktという名前で保存し,Convert .ahk to .exeという実行ファイルを起動してこのahkファイルを処理するとemacs_insert_dollar.exeという実行ファイルが作成されます.これをスタートアップフォルダに移すなどして,起動時に実行されるようにすれば,Emacsウィンドウをアクティブにしている場合にのみドル記号が直接入力されます.

IME_SETという関数はeamat@Cabinetで配布されているIME20121110.zip内のIME.ahkに記述されています.IME.ahkはIMEを制御する関数が色々定義されているようです.

これでほぼ望みどおりの環境を整えることが出来ました.
しかしplatexの実行速度については仮想マシン上のUbuntuとあまり変わらないかもしれません.