9

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

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

4

3 回答 3

9

我认为这是相当困难的。Constantia 可直接在 Mathematica 中使用:

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

在此处输入图像描述

但是,该字体是专门设计为以这种方式平衡的。如果你调整字母的大小和位置,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

在此处输入图像描述

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

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]

在此处输入图像描述

于 2011-09-13T21:28:42.770 回答
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}])}

产生以下结果: 在此处输入图像描述

然后可以在FrameTicksorTicks选项中使用它。当然,这确实意味着指定您的刻度,而不是让 Mathematica 自动计算出它们的值。这也意味着采用默认的刻度长度,除非你想有另一个参数来ConstantiaTicks指定它。

于 2011-10-16T04:19:24.960 回答
2

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

Font-forge 看起来并不漂亮,但可以稍微放松一下,因为它实际上非常好,并且对于调整字体非常方便。

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

于 2011-09-14T10:38:45.893 回答