Microsoft Equationの数式で文字を数える

画像



当社では、文書を読む校正者にいくつかの料金があります。 彼らの責任には、元々紙の上にあった、入力したテキストと再印刷したテキストの検証も含まれます。 この種の専門家の給与は、出来高払いの原則、つまり、私がどれだけ読んだか、とても受け取ったものに従って計算されます。 作業単位として、スペース、タブ、段落記号などを除くすべての可視文字で構成される文字が使用されます。



したがって、作品に登場するテキストの文字数を数えるタスクがあります。 平文を計算するとき、問題は発生せず、1年生または2年生の学生はそのような課題に十分に対処することができます。 Microsoft Equationを使用して入力された要素の文字を考慮しようとすると、この場合の問題が発生しました。 さらに、要素の内容を記述したサービス情報が多くのドキュメントから削除されたという事実により、状況はさらに悪化しました。 つまり、式からは実際には写真しかありません。 したがって、タスクが発生しました-Microsoft Equationから残っている写真の文字数をカウントします。



最初のステップは、これらの「写真」がどのようなものかを理解することでした。 文書をxml形式で保存して掘り下げたところ(当然、強力で強力なGoogleを並行して使用)、写真はDeflate (gzip)アルゴリズムを使用して以前に圧縮されbase64に変換されたWMFファイルに過ぎないことが判明しました。



元の問題は、WMFファイル内の文字数をカウントする必要があることが判明しました。 この形式はラスターではなくベクトルであるため、含まれるオブジェクトのすべてのデータが利用できます。 実際、一般的に言えば、この段階での問題の解決策はすでに明確になっています。ベクターファイルの要素を調べてその数を計算することです。 ただし、以下では、データを取得するプロセスについて詳しく説明します。



WMFは廃止された形式であり、 EMFに置き換えられたため、Windows XPのすべてのAPI関数は特にEMFに焦点を当てています。 したがって、それ以上のアクションを行うには、ソースファイルを新しい形式に変換する必要があります。 SetWinMetaFileBits API関数を使用してこれを行うことができます。 次のステップは、ファイルに含まれるデータを取得することです。 これを行うには、コールバック関数を使用して、EMFファイルからアプリケーションにすべてのレコードを順次転送するAPIコマンドEnumEnhMetaFileを適用します。 データは、多くのパラメーターを含むENHMETARECORD構造の形式で送信され、パラメーターはレコードの種類ごとに異なります。 この場合、文字をカウントするための重要なものは、タイプENHMETARECORD.iTypeが次の定数 EMR_EXTTEXTOUTW(84)、EMR_MOVETOEX(27)、EMR_LINETO(54)と等しいレコードです。



ここでは、一時停止して小さなニュアンスについて話す必要があります。 このベクトル形式の数式のすべての要素は、テキスト(ラテンアルファベットの文字など)とグラフィックに分割され、一連の行(分数記号、ルート記号など)で構成されます。 さらに、テキスト要素の数を単純に数えることができる場合、行ではすべてが少し複雑になります。 解決策として、次の方法を思い付きました。各線について、その角係数を計算して記憶します(線の始点と終点の座標によって計算されます)。 さらに、各グラフィック要素が一連の線で描かれているという事実を使用して、任意の記号を角度係数のセットとして表すことができます。 たとえば、除算記号は1行で、角度係数は0で、大きい山括弧>、これらは2つの連続した係数104、76です。したがって、さまざまな式を調べることで、実際に明確に比較される有限のシーケンスセットを構成できます。表示された文字。



カウントに戻ります。 タイプEMR_EXTTEXTOUTWのレコードを使用して、テキストフラグメントに関するデータを取得し、そのサイズが構造に明確に示されています。 また、 EMR_MOVETOEXおよびEMR_LINETOレコードを使用して、すべての行の開始および終了の座標を収集できます。 上記のようにこのデータを変換すると、グラフィック文字の数が取得されます。 この時点で、カウントは完了したと見なすことができます。



その結果、記述されたアルゴリズムに基づいて作成されたプログラムは、数式内の文字数を表示し、テキスト文字数とグラフィック文字数を示し、使用されたグラフィック文字も確認できます。



API関数とさまざまな定数の詳細な説明は行いません。これらのデータはすべてここで簡単に見つけることができます



All Articles