mikeo_410


GlyphsをTextBlockに置き換えることの問題点

  GlyphsをTextBlockに置き換えればフォントファイルを伴う必要が無くなり、プログラミングに使うのには便利だと考えました。しかし、完全には置き換えられないことがわかりました。

※クライアントにCambria Mathフォントを導入するには、「PowerPoint Viewer 2007」をインストールすれば良いようです。

※Linux-FireFoxでも、(Moonlightプラグインで)Silverlightを実行できますが、動作するものとしないものがあります。フォントの参照のし方との関係を試して見たところ、フォントを組み込みにしたもの(Glyphsを使ったもの)だけが動くようです。TextBoxにしてファミリ名で参照したものは動作しませんでした。フォントファミリに「Portabl User Intaface」を指定するのも不可だったので確認方法の方にも問題があるかもしれません。

1.Unicodeのない文字

  XPSファイル中の Glyphs には、UnicodeString がなく、Indices のみが指定されている箇所があります。
  具体的な例は、数式中の Σ で、Indices は 3533 でした。
  シグマ(Σ)は、Unicodeにあるので、Indices の値からUnicodeへの変換ができれば、TextBlockに置き換えられます。
  このインデクスは、Cambria Math のものです。インデクスは、XPSファイル中のodttfに適用されるように記述されたわけですが、このインデクスの値は元のCAMBRIA.TTC のインデクスとしても有効でした。WPFアプリケーションなら、FontUri に "c:/windows/fonts/CAMBRIA.TTC" を指定して、3533で「Σ」表示することが出来ます。
  フォントファイル中の cmap には、unicode - index の変換表があります。しかし、3533を示す Unicode はありません。
  3533 近傍の字形を調べると、大きさの異なる Σ が並んでいます。
  下方ではなく、中央を揃えた大きさの異なるフォントを使うことで、一行分の文字列を一行で表示しようとするもののようです。同じポイント数を指定して、通常の文字の3倍以上の高さの文字を書いています。

1.1.一般的な対応

  1. UnicodeStringが設定されている場合は、UnicodeStringを使い、Indicesを無視します。
  2. UnicodeStringが設定されていない場合は、XPSに組み込まれたフォントのcmapの逆引きを試みます。該当があれば、その Unicode を採用します。
  3. 該当ない時は、文字が抜けた表示になります。

1.2.Cambria Math フォントの場合の対応

  1. UnicodeStringが設定されている場合は、UnicodeStringを使い、Indicesを無視します。
  2. UnicodeStringが設定されていない場合は、XPSに組み込まれたフォントのcmapの逆引きを試みます。該当があれば、その Unicode を採用します。
  3. 該当ない時は、別に作成した対応表(後述)を引いて Unicode に変換します。

1.3.Cambria Math フォントの対応表

  フォントファイル中の、Unicodeで参照されない(Indicesのみで参照される)Indicesの値について、Unicodeを決める表を用意します。
  GlyphTypefaceには、CharacterToGlyphMapテーブルがあります。この表にないインデクスを対象にします。1700超の文字がありました。今のところの認識では、ワードは、括弧やΣなど特定の物だけを使っていて、大半は参照されないのではと思っています。

1.3.1.数字、英字、ギリシャ文字、キリル文字

  大きさ、上付き、下付き、斜体などの異なるものが格納されています。字形は Unicode で参照されるものと大差ないと判断しました。
  高さから、フォントサイズを計算し、TextBlockに設定するフォントサイズを変えて対応します。

1.3.2.文字と同じ扱いの数学記号

  以下のような文字は、「数字、英字、ギリシャ文字、キリル文字」と同じ扱いにしました。

  ∑∏∩∪⨀⨁⨂⨃⨄⨅⨆⨇⨈⨉

1.3.3.括弧など

  Indicesで指定されたフォントの高さになるように、Unicodeで参照される文字の高さを拡大縮小します。幅は、線幅が太くなるのを避けるために保持することにしました。

1.3.4.縦書き用の括弧

  Indicesで指定されたフォントの幅になるように、Unicodeで参照される文字の幅を拡大縮小します。高さは、線幅が太くなるのを避けるために保持することにしました。
  これは、文字形の前後の余白も伸縮するのでレイアウトを崩します。Clipを設定する必要がありますが実施していません。
  実際に縦書きをして見ると、この文字は使われず、普通の括弧を回転して使うことが判ったので、問題がなければこのままにします。

1.3.5.対応できていないもの

  いくつかわたしにはわからないものがあります。

 

2.縦書きの問題


  縦書きと言うと日本語の縦書きを思い浮かべますが、ワードでは単に「文字列の方向」と言うようです。日本語の縦書きは、文字列の方向は縦ですが、文字そのものは横(回転しない)です。

  日本語の縦書は、Glyphsで実現されています。RenderTransform での回転と、IsSideways が true に設定されてます。IsSideways を true に設定すると、文字形そのものの回転を抑止する効果があります。

  これを TextBlock などで行うことはできないようです。

  ワードで選択可能な「文字列の方向」と、Xps2Xaml での変換結果を下図に示します。
  上の段が、変換結果を示しています。下段は、ワードの表示をキャプチャしたものです。

    ※文字列の回転では、ワードアートやパワーポイントでの傾斜がありますが、これはきれいに表示されます。これらは、文字ではなくPathで記録されるためです。


mikeo_410@hotmail.com