Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[dvipdfmx] 欧文 TrueType フォントの文字幅が異常になる。 #172

Open
h20y6m opened this issue Dec 9, 2024 · 4 comments
Open

Comments

@h20y6m
Copy link
Collaborator

h20y6m commented Dec 9, 2024

欧文フォントに TrueType フォントを指定し 128 個以上のグリフを使うと 128 個目以降のグリフの文字幅が異常になります。

再現手順

Nunito フォントをダウンロード

TFM を生成

otftotfm --no-type1 --no-dotlessj -e ec.enc -n nunito-sb-t1 Nunito-Medium.ttf

以下のサンプルをタイプセット

% plain TeX
\special{pdf:mapline nunito-sb-t1--base a_2km3dn Nunito-Medium.ttf}
\font\testfont=nunito-sb-t1 \relax
\def\TEST#1{\vrule width 4pt{\testfont {#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}}\vrule width 4pt \par}
\newcount\cnt \cnt="00
\loop\ifnum\cnt<"100
  \the\cnt : \TEST{\char\cnt}
  \advance\cnt1
\repeat
\end

dvipdfmx で PDF に変換してみると文字コード 134 以降の文字幅が異常になっている。
(グリフがない、同じグリフになっているなどでずれていますが、文字コード 134 が 128 個目のグリフです。)


USHORTchar (多くの環境で符号付き)→ USHORT のキャストで 128-1280xff80 と値が異常になっているみたいです。

cmap_table[18+code] = idx & 0xff; /* bug here */

idx = tt_get_index(glyphs, (USHORT) cmap_table[18+code]);

cmap_table[18 + code] = idx & 0xff; /* bug here */

idx = tt_get_index(glyphs, (USHORT) cmap_table[18+code]);

/* bug here */ と書かれているのでこの辺りもともと何か問題を抱えているのかもしれません。

@h20y6m
Copy link
Collaborator Author

h20y6m commented Dec 22, 2024

h20y6m@0ceefe5 で修正してみました。

/* bug here */ と書かれているのでこの辺りもともと何か問題を抱えているのかもしれません。

これは do_builtin_encoding のコメントにある

 * It does not work with encodings that uses full 256 range since
 * GID = 0 is reserved for .notdef, so GID = 256 is not accessible.

に関連すると思われます。
256 グリフすべてが使用されたいた場合に 256 番目のグリフを cmap に正しく格納できず、豆腐になるようです。
まれなことだとは思いますが、無言で豆腐になるのはよくなさそうなので、警告を入れるようにしてみました。


dvipdfmx では(欧文の)埋め込み TrueType フォントの cmap に format 0 の (platform=1, encoding=0) subtable を使っているため .notdef グリフを除くと 255 グリフしか入れることができません。

一方で pdftex は埋め込み TrueType フォントの cmap に

  • format 6 の (platform=1, encoding=0) subtable と
  • format 4 の (platform=3, encoding=0) subtable

を使っていて 256 グリフすべて正常に表示できるようです。
試しに h20y6m@aa1e46b で cmap を format 6 と format 4 サブテーブルをやってみました。

@t-tk
Copy link
Collaborator

t-tk commented Dec 27, 2024

とりあえず再現実験です。
フォントのダウンロードが面倒だったので、CTANにあって TeX Live にも入っている Cuprum font で実験。
https://ctan.org/tex-archive/fonts/cuprum

Cuprum-Regular.ttf, cprmn8t.tfm, T1-WGL4.enc が使われるらしい。

% plain TeX
\special{pdf:mapline cprmn8t T1-WGL4 Cuprum-Regular.ttf}
\font\testfont=cprmn8t \relax
\def\TEST#1{\vrule width 4pt{\testfont {#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}}\vrule width 4pt \par}
\newcount\cnt \cnt="00
\loop\ifnum\cnt<"100
  \the\cnt : \TEST{\char\cnt}
  \advance\cnt1
\repeat
\end

dvipdfmx Version 20240511 で PDF に変換してみると文字コード 153 以降の文字幅が異常になっている。
ご提案のパッチ適用後はまだ試していません。

@t-tk
Copy link
Collaborator

t-tk commented Dec 27, 2024

ご提案のパッチ適用と Cuprum font を利用した test を追加してみました。
文字幅は正しくなっています。

@h20y6m
Copy link
Collaborator Author

h20y6m commented Dec 28, 2024

Cuprum-Regular.ttf 用の 256 文字フルに埋めたカスタムエンコーディングの tfm を作ってみました。

Cuprum-Regular-custom.zip

pdf:mapline cuprum-r-custom a_kdsrov Cuprum-Regular.ttf

元の dvipdfmx だと文字コード 255 の文字が表示されません。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants