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