MetaFont: размер символа неизмененных глифов меняется при добавлении новых глифов?

MetaFont: размер символа неизмененных глифов меняется при добавлении новых глифов?

У меня очень странный эффект при отладке yhmathэлементов шрифтов математики. Я генерирую cmex10.tfmиз cmex10.mfи конвертирую файл tfm в pl.

Затем я переименовываютолькопереименуйте файл драйвера в yrcmex10.mf, идобавлятьследующееновыйОпределения глифов в bigdel.mf, без изменения чего-либо в остальных файлах:

cmchar "\big left parenthesis";
beginchar(oct"200",8u#,rule_thickness#,2.5dh#-rule_thickness#);
adjust_fit(1.75u#,-.25u#); left_paren(hair,stem); endchar;

cmchar "\big left parenthesis";
beginchar(oct"201",10u#,rule_thickness#,3.5dh#-rule_thickness#);
adjust_fit(2.25u#,-.25u#); left_paren(hair,stem); endchar;


cmchar "\big left parenthesis";
beginchar(oct"202",12u#,rule_thickness#,4.5dh#-rule_thickness#);
adjust_fit(2.75u#,-.25u#); left_paren(hair,stem); endchar;

cmchar "\big left parenthesis";
beginchar(oct"203",13u#,rule_thickness#,5dh#-rule_thickness#);
adjust_fit(3u#,-.25u#); left_paren(hair,stem); endchar;


cmchar "\big left parenthesis";
beginchar(oct"204",15u#,rule_thickness#,6dh#-rule_thickness#);
adjust_fit(3.5u#,-.25u#); left_paren(hair,stem); endchar;

cmchar "\big left parenthesis";
beginchar(oct"205",17u#,rule_thickness#,7dh#-rule_thickness#);
adjust_fit(4u#,-.25u#); left_paren(hair,stem); endchar;

cmchar "\big left parenthesis";
beginchar(oct"206",19u#,rule_thickness#,8dh#-rule_thickness#);
adjust_fit(4.5u#,-.25u#); left_paren(hair,stem); endchar;

Таким образом, единственное различие между cmex10шрифтом и yrcmex10начертанием — это добавление вышеуказанных символов.

Конвертирую оба tfm в pl и делаю разницу. Я вижу изменения вне связанныйglpyphs, в частности, DPизменяются параметры:

--- cmex10.pl   2019-03-07 09:30:01.263513678 +0900
+++ yrcmex10.pl 2019-03-07 09:52:25.578670436 +0900
@@ -1,7 +1,7 @@
 (DESIGNSIZE R 10.0)
 (COMMENT DESIGNSIZE IS IN POINTS)
 (COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE)
-(CHECKSUM O 37254272422)
+(CHECKSUM O 35311171576)
 (FONTDIMEN
    (SLANT R 0.0)
    (SPACE R 0.0)
@@ -20,85 +20,85 @@
 (CHARACTER O 0
    (CHARWD R 0.458336)
    (CHARHT R 0.039999)
-   (CHARDP R 1.160013)
+   (CHARDP R 1.135567)
    (NEXTLARGER O 20)
    )
 (CHARACTER O 1
    (CHARWD R 0.458336)
    (CHARHT R 0.039999)
-   (CHARDP R 1.160013)
+   (CHARDP R 1.135567)
    (NEXTLARGER O 21)
    )
...

Это очень удивительно, я бы предположил, что размеры глифов других неизмененных глифов не меняются. Более того, эти изменения становятся больше, чем больше дополнительных глифов я добавляю.

У кого-нибудь есть этому объяснение?

решение1

По данным MetaFont, программа:

Поскольку для многих символов характерна одинаковая высота, глубина или курсивная коррекция, формат TFM устанавливает ограничение в 16 различных высот, 16 различных глубин и 64 различных курсивных коррекций.

Кстати, соотношение width[0]=height[0]=depth[0]= italic[0]=0 должно соблюдаться всегда, так что нулевой индекс подразумевает нулевое значение.

Таким образом, в одном файле TFM может быть не более 15 различных значений глубины, кроме 0. Теперь давайте посмотрим на значения глубины в вашем yrcmex10.pl:

     1     (CHARDP R 0.300003)
     2     (CHARDP R 0.580007)
     3     (CHARDP R 0.900009)
     4     (CHARDP R 1.000013)
     5     (CHARDP R 1.135567)
     6     (CHARDP R 1.480014)
     7     (CHARDP R 1.780019)
     8     (CHARDP R 2.060022)
     9     (CHARDP R 2.222246)
    10     (CHARDP R 2.360025)
    11     (CHARDP R 2.660028)
    12     (CHARDP R 2.9600315)
    13     (CHARDP R 3.560038)
    14     (CHARDP R 4.160044)
    15     (CHARDP R 4.76005)

(Список создан с помощью grep 'CHARDP' yrcmex10.pl|sort|uniq|nl)

Итак, ваш шрифт уже содержит максимальное количество различных глубин, что объясняет изменения: Глубина 0была 1.160013, но это значение не является частью списка выше. Поэтому его пришлось бы добавить, но тогда было бы слишком много различных глубин. Поэтому, когда MetaFont считывал дополнительные символы, он понял, что не может сохранить все глубины в файле TFM. Поэтому некоторые значения пришлось округлить, а и 1.135567очень 1.160013близки, что делает их идеальными кандидатами.

Это также объясняет, почему изменение становится больше по мере добавления дополнительных глифов: если новые глифы снова имеют разную глубину, MetaFont придется уменьшить глубину еще больше, до 15. Это требует более агрессивного подхода к «унификации значений», что приводит к более крупным изменениям.

Связанный контент