私は自分の本にConstantiaフォント(Windows 7に付属)を使用しており、Mathematicaで同じフォントを使用してこの本のグラフィックを準備したいと思っています。問題は、コンスタンシアがデフォルトで古いスタイルの数字を出力することです。たとえば、XeTeXでは、出力に古いスタイルの数字を使用するか、通常の数字を使用するかを制御できることを知っています。
Mathematicaで数字のスタイルを制御することは可能ですか?
私は自分の本にConstantiaフォント(Windows 7に付属)を使用しており、Mathematicaで同じフォントを使用してこの本のグラフィックを準備したいと思っています。問題は、コンスタンシアがデフォルトで古いスタイルの数字を出力することです。たとえば、XeTeXでは、出力に古いスタイルの数字を使用するか、通常の数字を使用するかを制御できることを知っています。
Mathematicaで数字のスタイルを制御することは可能ですか?
これはかなり難しいと思います。コンスタンシアはMathematicaで直接使用できます:
Style["0123456789", FontFamily -> "Constantia", FontSize -> 100]
ただし、フォントはこのようにバランスが取れるように特別に設計されています。を使用して文字のサイズと位置を微調整するFontSize
と、次のようになりAdjustmentBox
ます。
shift = {0, 0, 0, -1, -1, -1, 0.0, -1, 0.0, -1} 0.5;
s = 0.65;
sizeScale = {1, 1, 1, s, s, s, s, s, s, s, s};
Row[Table[
AdjustmentBox[
Style[num, FontFamily -> "Constantia",
FontSize -> 100 sizeScale[[num + 1]]],
BoxBaselineShift -> shift[[num + 1]]], {num, 0,
9}]
] // DisplayForm
シフトされた文字とスケーリングされた文字の体重が異なることがわかります。フォントの太さは調整できますが、大まかにしか調整できません。通常、プレーンスタイルとボールドスタイルしかありません。だからあなたはこれと同じくらい近づくことができます:
body = {Plain, Plain, Plain, Bold, Bold, Bold, Bold, Bold, Bold, Bold};
Row[Table[
AdjustmentBox[
Style[num, FontFamily -> "Constantia" ,
FontWeight -> body[[num + 1]],
FontSize -> 100 sizeScale[[num + 1]]],
BoxBaselineShift -> shift[[num + 1]]], {num, 0,
9}]] // DisplayForm
やや良いですが、それでも醜いです。これが機能するためには、文字の完全に新しいデザインが必要だと思います。おそらく、通常の文字はフォントテーブルのどこかにありますか?
アップデート
代替番号セットが見つかりました。それらはフォントテーブルの8320〜8329の位置にあります。フォントユーティリティを使用してそれらを切り替えることができるはずです。
Style[FromCharacterCode[Range[8320, 8329]],FontFamily -> "Constantia", FontSize -> 100]
ティックの場合、回避策がありますが、少しプログラミングが必要です。まず、補助機能があります。
getDigits[n_Integer] := IntegerDigits[n]
getDigits[0.] := {0}
getDigits[n_Real] :=
With[{rd = RealDigits[n]},
Join[Take[rd[[1]], rd[[2]]], {"."},
Drop[rd[[1]], rd[[2]]] ] /. {".", z___} -> {0, ".", z} /. {a__,
0 ..} -> {a} /. {a__, Repeated[0, {4, 150}], q__} -> {a} /.
{b__, "."} -> {b}]
Attributes[getDigits] = Listable
getDigits[{14.3, 2, 274, 2345.67}]
{{1, 4, ".", 3}, {2}, {2, 7, 4}, {2, 3, 4, 5, ".", 6, 7}}
次に、次のような関数:
ConstantiaTicks[a_?VectorQ, opts : OptionsPattern[Style]] :=
Transpose@{a,
Style[#, FontFamily -> "Constantia",
Sequence @@ {opts}] & /@ (StringJoin /@
Map[ToString[
Style[Which[IntegerQ[#],
FromCharacterCode[# + 8320], # === ".", "."]]] &,
(getDigits[a]), {2}])}
次の結果が得られます。
これは、FrameTicks
またはTicks
オプションで使用できます。もちろん、Mathematicaに値を自動的に計算させるのではなく、ティックを指定することを意味します。また、それを指定する別の引数が必要でない限り、デフォルトのティック長を使用することも意味しますConstantiaTicks
。
FontForgeを入手します。lnum
新しいバージョン(私は覚えているようです)には、マッピングを適用してフォントにフラット化するための深く隠されたメニューオプションがあるため、 (大文字の数字)を選択して、古いスタイルの代わりにライニングを使用してコンスタンシアのバージョンを簡単に出力できますMathematicaの外ですでに作られた数字。または、もう少しハイテクではないFont-forgeでは、小文字の数字の上に裏地または表形式の数字をコピーして貼り付けることができます。
Font-forgeは見た目はきれいではありませんが、実際には非常に優れており、フォントを微調整するのに非常に便利なため、多少の余裕を持たせてください。
別の解決策として、Mathematicaのデータをフラットファイルにエクスポートし、TikZを使用してXeTeXでネイティブにレンダリングすることを考えましたか?それは私が通常使用するアプローチであり、出力は確かに優れています。