MetaFont: 新しいグリフを追加すると、変更されていないグリフの文字寸法は変わりますか?

MetaFont: 新しいグリフを追加すると、変更されていないグリフの文字寸法は変わりますか?

数学フォント項目をデバッグしているときに、非常に奇妙な効果があります。からyhmath生成し、tfm を pl ファイルに変換しています。cmex10.tfmcmex10.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に変換し、差分を作成すると、変更点がわかります無関係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 という関係は常に成り立つため、インデックスがゼロであれば値もゼロになります。

したがって、1 つの 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 に減らす必要がある異なる深さがさらに多くなります。これにより、「値の統一」についてより積極的に取り組む必要があり、結果として変更が大きくなります。

関連情報