読者です 読者をやめる 読者になる 読者になる

数式入力パネルとアプリケーションを連携させる 2 つの方法

Windows 7 .NET PowerShell

Windows 7 では,タブレット PC 向け機能が強化され,数式の手書き入力がサポートされるようになりました.この機能とアプリケーションを連携させるための方法を 2 つほど紹介します.

数式入力パネルからのデータをクリップボード経由で受け取る

『数式入力パネル』は,単体アプリケーションとして動作する数式入力ツールです.このツールは,いわゆるソフトウェアキーボードや文字パレットのように動作し,入力フォーカスを持つアプリケーションに数式情報を送り込みます.
実際には,この機能はクリップボードを利用して実現されています.
『数式入力パネル』は,挿入ボタンが押されると,数式を UTF-8エンコードされた MathML 形式でクリップボードに格納し,Ctrl+V のキーボードイベントを発生させます.このとき,入力フォーカスを持つアプリケーションが,Ctrl+V で貼り付け動作を行い,かつクリップボードに格納された "MathML Presentation" 形式または "MathML" 形式のデータを解釈できることが,『数式入力パネル』と連携するための条件です.

参考

数式入力パネル (Math Input Panel、MIP) は、Tablet PC のタブレットとペンを使用するように設計されています。ただし、タッチスクリーン、外部デジタイザー、あるいはマウスなどの任意の入力デバイスでも使用可能です。MIP は、クリップボードを介して、標準化された数学的なマークアップ言語である MathML フォーマットで認識結果を出力します。MIP で手書きされて認識された数式は、完全に編集可能な形式でレプリケート先アプリケーションに出力されます。テキストを編集したいときは、出力に対して挿入したり編集したりできます。

数式入力パネルでは、数学用マークアップ言語 (MathML) をサポートするプログラムにのみ数式を挿入できます。

数式入力パネルの入力ウィンドウをインプロセスで利用する

COM のインプロセスサーバとして,数式入力パネルの入力ウィンドウを利用することも可能です."%CommonProgramFiles%\Microsoft Shared\ink\micaut.dll" 内に格納された TypeLib から、必要な情報を得ることが出来るでしょう.
参考までに,C# で COM Interop を行ってみたサンプルを置いておきます.

このサンプルは,実行すると数式入力パネルの入力ウィンドウとコンソールウィンドウが表示され,入力ウィンドウの「挿入」を押したときに表示されていた数式が MathML 形式でコンソールに表示されます.

余談: 近年の Microsoft 製品と MathML とクリップボード

近年の Microsoft 製品では MathML の利用が増えています.
Microsoft Word 2007 以降の Microsoft Word や,Microsoft PowerPoint 2010 は,MathML 形式で数式を貼り付けることが可能です.ただし,クリップボードデータ形式については注意が必要でした.手元の Microsoft Office 2010 Beta で試してみたところ,以下のような挙動の違いがありました.

  • Microsoft Word 2010
    • データ形式が "Text" または "Unicode Text" であっても,内容が MathML であれば数式として挿入される.
    • データ形式が "MathML Presentation","MathML" いずれの場合も貼り付け可能
  • Microsoft PowerPoint 2010
    • データ形式が "Text" または "Unicode Text" の場合,内容が MathML であってもただのテキストとして解釈される.
    • データ形式が "MathML" の場合,MathML として解釈する."MathML Presentation" はサポートしない.

実験用の PowerShell スクリプトを以下に示します.

# STA モードで PowerShell を起動する (Windows.Forms.Clipboard のため)
powershell.exe -sta
$null = [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

# E = mc^2
$mathml = '<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>E</mml:mi><mml:mo>=</mml:mo><mml:mi>m</mml:mi><mml:msup><mml:mi>c</mml:mi><mml:mn>2</mml:mn></mml:msup></mml:math>'

# UTF-8 で MemoryStream に格納
$ms = New-Object System.IO.MemoryStream(,[System.Text.Encoding]::UTF8.GetBytes($mathml))

# "MathML" という形式名でクリップボードに格納
[Windows.Forms.Clipboard]::SetData("MathML", $ms)

このスクリプトを実行した後で,Microsoft Word 2010 または Microsoft PowerPoint 2010 に貼り付けを行ってみて下さい.数式が貼り付けられるはずです.
これを利用すると,MathML 形式で数式を出力できるソフトウェア,例えば Mathematica から出力した数式を,構造を保ったまま PowerPoint に貼り付ける,といったことが可能です.
また,Microsoft Word 2010 や Microsoft PowerPoint 2010 からクリップボードにコピーする際に,数式を MathML 形式でコピーするように設定することも可能です.この設定を有効にすれば,PowerPoint に書かれていた数式を Mathematica にコピーし,その場で計算を行う,といった使い道も可能です.