WordVBAでのマクロのショートカット割り当て(Emacs風キーバインド暫定版)

Wordの場合はApplication.KeyBindings.Addメソッドを使ってショートカットキーの割り当てができる。

Application.Keybindings.Add _
    KeyCategory:=wdKeyCategoryCommand, _
    Command:="Command", _
    KeyCode:="KeyCode"

あまり良く読んでないのでKeyCategory引数の意味とかしっかり理解していないが、"Command"には割り当てたいマクロの名前を文字列として、"KeyCode"には割り当てたいキーのーキーコードを数値として与える。キーコードはwdKeyAやwdKeyControlなどの名前の定数が用意されているので、それを足しあわせて作る。
割り当てたショートカットを解除するには次のようにする。

With Application.FindKey("KeyCode")
    .Disable
    .Clear
End With

解除したいショートカットキーのキーコードを"KeyCode"に指定する。
これを利用すると、Wordで比較的簡単にEmacsキーバインドを再現できる。
ちょっとだけやってみた。

'' ----- Emacsモードの有効化と無効化 ---------------------
Sub EnableEmacsMode()
    Call AddKeyBindings("ForwardChar", wdKeyControl + wdKeyF)
    Call AddKeyBindings("BackwardChar", wdKeyControl + wdKeyB)
    Call AddKeyBindings("NextLine", wdKeyControl + wdKeyN)
    Call AddKeyBindings("PreviousLine", wdKeyControl + wdKeyP)
    Call AddKeyBindings("BeginningOfLine", wdKeyControl + wdKeyA)
    Call AddKeyBindings("EndOfLine", wdKeyControl + wdKeyE)
End Sub

Sub DisableEmacsMode()
    Call DeleteKeyBindings(wdKeyControl + wdKeyF)
    Call DeleteKeyBindings(wdKeyControl + wdKeyB)
    Call DeleteKeyBindings(wdKeyControl + wdKeyN)
    Call DeleteKeyBindings(wdKeyControl + wdKeyP)
    Call DeleteKeyBindings(wdKeyControl + wdKeyA)
    Call DeleteKeyBindings(wdKeyControl + wdKeyE)
End Sub

Sub AddKeyBindings(Command As String, KeyCode As Long)
    '' キーバインド登録
    Application.KeyBindings.Add _
        KeyCategory:=wdKeyCategoryCommand, _
        Command:=Command, KeyCode:=KeyCode
End Sub

Sub DeleteKeyBindings(KeyCode As Long)
    '' キーバインド登録解除
    With Application.FindKey(KeyCode)
        .Disable: .Clear
    End With
End Sub


'' ------ キーバインドマクロ定義 ------------------------
Sub ForwardChar() '' カーソル前移動
    Selection.MoveRight unit:=wdCharacter, Count:=1
End Sub
Sub BackwardChar() '' カーソル後ろ移動
    Selection.MoveLeft unit:=wdCharacter, Count:=1
End Sub
Sub NextLine() '' カーソル下移動
    Selection.MoveDown unit:=wdLine, Count:=1
End Sub
Sub PreviousLine() '' カーソル上移動
    Selection.MoveUp unit:=wdLine, Count:=1
End Sub
Sub BeginningOfLine() '' 行頭へ
    Selection.HomeKey unit:=wdLine
End Sub
Sub EndOfLine() '' 行末へ
    Selection.EndKey unit:=wdLine
End Sub

https://gist.github.com/nozma/5383099
現在のファイルなりNormal.dotmなりにインポートしてEnableEmacsModeを実行すればEmacs風のキーバインドに(カーソル移動だけだが)なり、DisableEmacsModeを実行すれば通常の状態に戻る。
2ストロークについてはExcelでEmacsライクなキーバインドを使う - もうカツ丼でいいよなでやったようにC-xでショートカットが切り替わるようにすれば良いと思う。
とりあえず今日は眠いので残りはいずれ。もしくは誰かやっといて。

はてな記法をMS Wordのスタイルに変換する

スタイルちゃんと定義しようと思ったけど箇条書きの定義の仕方がよく分からなくてはまってしまったので諦めた。その関係で中途半端なプロシージャがある。段落番号に至ってはあまり使う気がないのでデフォルトから調整してません。

説明

下記の様なはてな記法っぽい記述を…

下記の様にスタイル設定する。

使い方

  1. Normal.dot(常に使いたい)や対象文書(その文書だけでいい)、あるいはテンプレート(アドインしたい)の標準モジュールに下記コードを追加。
  2. HatenaStylesAdd実行(1回で可)
  3. Hatena2Wordを実行

スタイルが追加されたりListGalleries(そもそもこれが何処に入っているのかよくわからないが)をいじったりしているので、その辺りをリセットしたい場合はClearMyStyleを実行。

コード

Word 2007で最低限やっておく設定

論文とか書く場合は常識的に考えてLaTeX使うと思いますが,上からの圧力とか投稿規定とか避けがたい理由によりWordを使わざるを得ない場合もあるでしょう.たぶん.しかし恐れることはありません.スタイルの使い方といくつかの設定さえ押さえておけばWordでもまあボチボチ快適に文書が書けます.
というわけでWord使わないといけない場合はエンジニアのためのWord再入門講座 美しくメンテナンス性の高い開発ドキュメントの作り方(Amazonリンク)に載っている設定をしてるんだけど,この本からWord 2007用の設定探すのはちょっとばかし骨が折れるので多少の変更を加えつつ整理したものをメモ.
オプションの詳しい説明はしないので本を見るかヘルプを参照するなどして下さい.

続きを読む

Word2007の数式ビルダを使って数式を作成しよう

Officeを買ったのでWordで数式を入力する方法を少しまじめに調べた.
試用版をなんとなく使っていた時は知らなかったけど,Word2007からは今までのあの使いにくくてカッコ悪い数式エディタ*1ではなくて,数式ビルダというものが数式入力のための規定のツールになっている.

数式ビルダはこんなに便利!

数式ビルダはおそらくかなりTeXを意識して作られている.というのも,ほぼTeXのコマンドをそのまま入力するだけで数式の入力が完了するからだ.
たとえば,数式の入力エリアに次のようにコマンドを入力する.ちなみに[C-i]はCtrl+iです*2

[C-i]\sum_(i=1)^\infty x^i = 1/(1-x)

そうすると,こんな具合に出力してくれる.

このとき入力する\sumだとかいうコマンドは,適当なタイミングでスペースキーを叩くだけで組み立てられる.つまり,TeXっぽい簡単な数式入力ができる上に,数式の形を確認しながらの入力もできる.これは数式入力だけならばTeXよりも使いやすいと思う.
数式のエリアは[Alt]→N→E→Iと順番にタイプするだけで挿入できる.もしその行に数式がそれしかなければ上記の例のような別行立ての形になり,前後に文字が存在していれば文中のスタイルにしてくれる.また,そのほかに行形式と呼ばれる数式を行の形(Σ_(i=1)^∞=1/(1-x)のように)にするスタイルもある.
さらに,よく使う数式は登録しておくこともできるのだ!
さあこれでもうTeXからWordに乗り換えてもあんしん………とはいかない.さすが期待を裏切らない.

数式ビルダはこんなに不便!!

数式ビルダで作成される数式の外観はこれまでの数式エディタに比べるとずいぶんまともだ.積分とかも綺麗に見える.これはCambria Mathという数式組版のために開発されたフォントのおかげで達成されている.だが残念なことに数式ビルダの規定のフォントはCambria Mathしか選べない*3
また,新しく追加された機能だから仕方ないといえば仕方ないのだが古いバージョンのWordとの互換性がない.また,PowerPointなどにコピペしても小さなサイズの画像になってしまってイマイチ使えない.このあたりをどうしてもどうにかしたかったら昔の数式エディタを使うしかない*4
さらに信じられないことなのだが,せっかく数式を入力しても数式番号をつける手段がデフォルトでは用意されていない.かなり探したけどどうやら本当に用意されていないらしい.[参考資料]タブの[図表番号の挿入]や[相互参照]にはラベルや項目に[数式]が用意されているのに連携していないのだ.

ないものは作りましょう

幸いなことに数式入力エリアを自作して登録しておくことができる.
適当にそれっぽいものを作成して範囲選択して[挿入]タブの[数式]から[選択範囲を数式ギャラリーに追加]するだけ.
どうもWord2007ユーザーの間ではテーブルを駆使して数式エリアを作成するというのが一応の解答になっているようだ*5
必要に応じて適当に作って登録すればいいのだが,一応次のようにやるとそれっぽくて番号の参照にも便利なやつが作成できる.

  1. 1行3列の表を作成
  2. 表を選択し,[レイアウト]タブの[プロパティ]を開く
  3. [幅を指定する]にチェックし,基準をパーセント,値に100%を指定する
  4. [列]タブで列の幅をパーセントで指定,10%,80%,10%など左右を狭く同じ値にする
  5. [レイアウト]タブに戻り[配置]で中央のセルを中央揃え,右のセルを右揃え(中央)に
  6. 表全体を選択し,[デザイン]タブの罫線から罫線なしを選択し罫線を消す
  7. 中央のセルにカーソルを移動させ,[Alt], N, E, Iとタイプして数式エリアを作成(入力はしない)
  8. 適当な場所で[参考資料]タブから[図表番号の挿入]を選択
  9. ラベルに[数式]を選択し,[ラベルを図表番号から除外する]にチェックを入れてOKをクリックすると番号が出てくる
  10. 作成した番号を右側のセルにコピーペーストなどで移動させ,必要に応じて前後に括弧などを記入,フォントもボールドになっているので気に入らなければ[ホーム]タブから解除しておく
  11. 作成した表全体を選択,[挿入]タブの[数式]から[選択範囲を数式ギャラリーに追加]し,適当な名前で保存する

こうしておけば,[Alt], N, E, [Enter]とタイプ(ほかに数式を追加してなければ)するだけで数式番号付きの数式エリアが作成される.

数式番号は[参考資料]タブから[相互参照]を選択し,[参照する項目]に数式を選べば利用できる.TeXの\refみたいなもの.

*1:ちなみに使おうと思えば使える

*2:残念なことに数式がデフォルトでイタリックにならないというバグがあるらしく,最初にイタリックにするためのショートカットであるCtrl+Iを入力しないときれいにならない

*3:選べるということは追加の予定があるのだろうか?一応数式作成後に数式を選択してフォントを変更することはできるが,必ずしも反映されないしまず汚くなる.

*4:インストールしてあれば[挿入]タブの[オブジェクト]から数式 3.0を選択して挿入できる

*5:そういえばOOoのWriterも数式と数式番号の配置は表で実現してた