![MetaFont: размер символа неизмененных глифов меняется при добавлении новых глифов?](https://rvso.com/image/391710/MetaFont%3A%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B0%20%D0%BD%D0%B5%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B3%D0%BB%D0%B8%D1%84%D0%BE%D0%B2%20%D0%BC%D0%B5%D0%BD%D1%8F%D0%B5%D1%82%D1%81%D1%8F%20%D0%BF%D1%80%D0%B8%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8%20%D0%BD%D0%BE%D0%B2%D1%8B%D1%85%20%D0%B3%D0%BB%D0%B8%D1%84%D0%BE%D0%B2%3F.png)
У меня очень странный эффект при отладке 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. Это требует более агрессивного подхода к «унификации значений», что приводит к более крупным изменениям.