我在调试数学字体项目时遇到了非常奇怪的效果。我从中yhmath
生成,并将 tfm 转换为 pl 文件。cmex10.tfm
cmex10.mf
然后我重命名仅有的将驱动程序文件重命名为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,然后进行 diff ,我看到了变化无关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 文件中除了 0 之外最多可以有 15 个不同的深度值。现在让我们看看 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。这需要更积极地进行“价值统一”,从而导致更大的变化。