Можно ли контролировать стиль цифр в Mathematica? - PullRequest
8 голосов
/ 13 сентября 2011

Я использую шрифт Constantia (который поставляется с Windows 7) для своей книги и хотел бы подготовить графику для этой книги, используя тот же шрифт в Mathematica.Проблема в том, что Констанция по умолчанию выводит цифры старого стиля .Я знаю, что, например, в XeTeX, можно контролировать, используются ли для вывода старые стили или обычные цифры.

Можно ли контролировать стиль цифр в Mathematica?

Ответы [ 3 ]

9 голосов
/ 14 сентября 2011

Я думаю, что это довольно сложно. Констанция используется в Mathematica напрямую:

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

enter image description here

Однако шрифт специально разработан таким образом, чтобы его можно было сбалансировать. Если вы измените размеры и позиции букв, используя 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

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

Немного лучше, но все же безобразно. Я предполагаю, что совершенно новый дизайн букв необходим для того, чтобы это работало. Возможно, нормальные буквы можно найти где-то еще в таблице шрифтов?


UPDATE

Найден альтернативный набор номеров. Они находятся в позициях 8320 - 8329 в таблице шрифтов. Вы должны иметь возможность переключать их с помощью утилиты шрифтов.

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

enter image description here

3 голосов
/ 16 октября 2011

Для тиков есть обходной путь, но он требует немного программирования.Сначала есть вспомогательная функция.

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

Это можетиспользоваться в параметре FrameTicks или Ticks.Конечно, это означает, что вы указываете свои тики, а не позволяете Mathematica автоматически определять их значения.Это также означает использование длины тика по умолчанию, если только вы не хотите иметь другой аргумент ConstantiaTicks, который указывает это.

2 голосов
/ 14 сентября 2011

Я бы схватил FontForge . Более новые версии (кажется, я помню) имеют глубоко скрытый пункт меню для применения сопоставления и выравнивания его в шрифте, поэтому вы можете выбрать lnum (цифры в верхнем регистре) и легко вывести версию Constantia с заменой подкладки цифры в старом стиле уже сделаны, за пределами Mathematica. В качестве альтернативы, в стиле Font-Forge вы можете просто копировать и вставлять подкладку или табличные цифры поверх строчных.

Font-Forge выглядит не очень красиво, но немного провисает, потому что на самом деле он очень хорош и очень удобен для настройки шрифтов.

В качестве альтернативного решения задумывались ли вы об экспорте данных в Mathematica в плоский файл и их непосредственном рендеринге в XeTeX с TikZ? Именно такой подход я обычно использую, и результат действительно отличный.

...