是否可以控制Mathematica中的数字样式?

时间:2011-09-13 15:48:45

标签: fonts wolfram-mathematica mathematica-8

我使用Constantia字体(Windows 7附带)用于我的书,并希望使用Mathematica中的相同字体为本书准备图形。问题是Constantia默认输出oldstyle digits。我知道,例如在XeTeX中,可以控制旧式或普通数字是否用于输出。

  

是否可以控制Mathematica中的数字样式?

3 个答案:

答案 0 :(得分:9)

我认为这很难。 Constantia可直接在Mathematica中使用:

Style["0123456789", FontFamily -> "Constantia", FontSize -> 100]

enter image description here

但是,字体专门设计为以这种方式平衡。如果您使用FontSizeAdjustmentBox调整字母的大小和位置,则会得到以下结果:

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

enter image description here

您会看到移位和缩放的字母具有不同的体重。字体重量可以调整,但只能非常粗略。通常你只有普通和粗体样式。所以你可以尽可能接近:

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

enter image description here

有点好,但仍然很难看。我假设这个字母的全新设计是必要的。也许正常的字母可以在字体表中的某个地方找到?


<强>更新

找到替代号码集。它们位于字体表中的位置8320 - 8329。您应该能够使用字体实用程序切换它们。

Style[FromCharacterCode[Range[8320, 8329]],FontFamily -> "Constantia", FontSize -> 100]

enter image description here

答案 1 :(得分:3)

对于刻度,有一种解决方法,但它需要一些编程。 首先,有一个辅助功能。

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}])}

产生以下结果: enter image description here

然后可以在FrameTicksTicks选项中使用它。当然,它确实意味着指定您的刻度,而不是让Mathematica自动计算出它们的值。它还意味着采用默认的刻度长度,除非你想要另一个指向ConstantiaTicks的参数指定。{/ p>

答案 2 :(得分:2)

我抓住了FontForge。较新的版本(我似乎记得)有一个深度隐藏的菜单选项来应用映射并将其展平为字体,因此您可以选择lnum(大写数字)并轻松输出Constantia的版本,替换为在Mathematica外面已经制作的旧式数字衬里。或者,稍微不那么高科技,在Font-forge中你可以复制并粘贴在小写字母顶部的衬里或表格数字上。

Font-forge看起来并不漂亮,但减少了一些松弛,因为它实际上非常好,并且非常方便调整字体。

作为替代解决方案,您是否考虑过将Mathematica中的数据导出为平面文件并使用TikZ在XeTeX中本地呈现?这是我经常使用的方法,输出确实非常好。