我为我的书使用 Constantia 字体(Windows 7 附带),并希望使用 Mathematica 中的相同字体为本书准备图形。问题是 Constantia 默认输出oldstyle digits。我知道,例如在 XeTeX 中,可以控制是否使用旧式或普通数字进行输出。
是否可以控制 Mathematica 中的数字样式?
我为我的书使用 Constantia 字体(Windows 7 附带),并希望使用 Mathematica 中的相同字体为本书准备图形。问题是 Constantia 默认输出oldstyle digits。我知道,例如在 XeTeX 中,可以控制是否使用旧式或普通数字进行输出。
是否可以控制 Mathematica 中的数字样式?
我认为这是相当困难的。Constantia 可直接在 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
orTicks
选项中使用它。当然,这确实意味着指定您的刻度,而不是让 Mathematica 自动计算出它们的值。这也意味着采用默认的刻度长度,除非你想有另一个参数来ConstantiaTicks
指定它。
我会抓住FontForge。较新的版本(我似乎记得)有一个深深隐藏的菜单选项来应用映射并将其展平到字体中,因此您可以选择lnum
(大写数字)并轻松输出 Constantia 的版本,用衬里替换旧样式在 Mathematica 之外已经制作了数字。或者,在 Font-forge 中,您只需复制并粘贴小写字母顶部的衬里或表格数字即可。
Font-forge 看起来并不漂亮,但可以稍微放松一下,因为它实际上非常好,并且对于调整字体非常方便。
作为替代解决方案,您是否考虑过将 Mathematica 中的数据导出到平面文件并使用 TikZ 在您的 XeTeX 中本地呈现?这是我通常使用的方法,并且输出确实非常出色。