texjporg / tex-jp-build

Minimum source repository to build Japanese TeX processing tools
23 stars 6 forks source link

[dvipdfmx] 特定の条件で誤ったグリフが出力される #165

Closed h20y6m closed 9 months ago

h20y6m commented 11 months ago

dvipdfmxで以下のような条件のときに誤ったグリフが出力されます。

%#!ptex2pdf -u
\special{pdf:mapfile uptex-ipaex.map}
𠂰% U+200b0
𠃵% U+200f5
𠅘% U+20158
𤿲% U+24ff2
𧦴% U+279b4
𧵳% U+27d73
姬% U+2f862
諭% U+2f9d0
\bye
dvipdfmx:warning: Unicode char U+2f862 replaced with U+f862.
dvipdfmx:warning: Unicode char U+2f9d0 replaced with U+f9d0.
dvipdfmx:warning: Unicode char U+200b0 replaced with U+00b0.
dvipdfmx:warning: Unicode char U+200f5 replaced with U+00f5.
dvipdfmx:warning: Unicode char U+24ff2 replaced with U+4ff2.
dvipdfmx:warning: Unicode char U+27d73 replaced with U+7d73.
dvipdfmx:warning: Unicode char U+20158 replaced with U+0158.
dvipdfmx:warning: Unicode char U+279b4 replaced with U+79b4.

以下の部分でunsigned shortにキャストしているためだと思います。

https://github.com/texjporg/tex-jp-build/blob/3ee7d1f745ddf1d74481b9f3b25d80a46cb0d4d7/source/texk/dvipdfm-x/cidtype2.c#L829-L841

t-tk commented 10 months ago

fix_CJK_symbols() はレガシーエンコーディングとUnicodeの間の変換表の揺らぎ問題(波ダッシュ問題)で見つからないグリフを見つけられるようにする意図のようです。 なので、以下で充分だという気がします。 全然テストしていませんが…

diff --git a/source/texk/dvipdfm-x/cidtype2.c b/source/texk/dvipdfm-x/cidtype2.c
index 2c6caf908..a3d5a63c8 100644
--- a/source/texk/dvipdfm-x/cidtype2.c
+++ b/source/texk/dvipdfm-x/cidtype2.c
@@ -827,7 +827,7 @@ CIDFont_type2_dofont (pdf_font *font)
         } else {
           gid  = tt_cmap_lookup(ttcmap, code);
 #ifdef FIX_CJK_UNIOCDE_SYMBOLS
-          if (gid == 0 && unicode_cmap) {
+          if (gid == 0 && unicode_cmap && code <= 0xFFFF) {
             int alt_code;

             alt_code = fix_CJK_symbols((unsigned short)code);
t-tk commented 10 months ago

なぜか、この変換表に FULLWIDTH YEN SIGN (U+FFE5) “¥” と YEN SIGN (U+00A5) “¥” の相互変換が含まれていません。 変換表のラインナップからすると、入れた方がいいような気がします。

    {0x2014, 0x2015}, /* EM DASH <-> HORIZONTAL BAR */
    {0x2016, 0x2225}, /* DOUBLE VERTICAL LINE <-> PARALLEL TO */
    {0x203E, 0xFFE3}, /* OVERLINE <-> FULLWIDTH MACRON */
    {0x2026, 0x22EF}, /* HORIZONTAL ELLIPSIS <-> MIDLINE HORIZONTAL ELLIPSIS */
    {0x2212, 0xFF0D}, /* MINUS SIGN <-> FULLWIDTH HYPHEN-MINUS */
    {0x301C, 0xFF5E}, /* WAVE DASH <-> FULLWIDTH TILDE */
    {0xFFE0, 0x00A2}, /* FULLWIDTH CENT SIGN <-> CENT SIGN */
    {0xFFE1, 0x00A3}, /* FULLWIDTH POUND SIGN <-> POUND SIGN */
    {0xFFE2, 0x00AC}, /* FULLWIDTH NOT SIGN <-> NOT SIGN */
    {0xFFFF, 0xFFFF}, /* EOD */
t-tk commented 10 months ago

テストしました。 予定通り、提示していただいたサンプルで下記のようなエラーになり、該当の文字は□に×のグリフになりました。

dvipdfmx:warning: Could not open config file "dvipdfmx.cfg".
replace00.dvi -> replace00.pdf

dvipdfmx:warning: Failed to load AGL file "pdfglyphlist.txt"...
dvipdfmx:warning: Failed to load AGL file "glyphlist.txt"...
[1]
dvipdfmx:warning: Glyph missing in font. (CID=13998, code=0x2f862)
dvipdfmx:warning: Glyph missing in font. (CID=14068, code=0x2f9d0)
dvipdfmx:warning: Glyph missing in font. (CID=14209, code=0x200b0)
dvipdfmx:warning: Glyph missing in font. (CID=20057, code=0x200f5)
dvipdfmx:warning: Glyph missing in font. (CID=20059, code=0x24ff2)
dvipdfmx:warning: Glyph missing in font. (CID=20060, code=0x27d73)
dvipdfmx:warning: Glyph missing in font. (CID=20075, code=0x20158)
dvipdfmx:warning: Glyph missing in font. (CID=20133, code=0x279b4)

3435 bytes written
h20y6m commented 9 months ago

ありがとうございます。 よさそうですが、縦組みにもおなじ処理があります。 https://github.com/texjporg/tex-jp-build/blob/f5e7f9224147ba75ea1b12d6f855a9cdc5c435d2/source/texk/dvipdfm-x/cidtype2.c#L921

t-tk commented 9 months ago

縦組みとは気付きませんでした。 https://github.com/texjporg/tex-jp-build/commit/21b812e179a961d8c5efa7199dd5d3a23fe9ec4f でどうでしょう。

縦組み用 replace01.tex ::

\special{pdf:mapfile uptex-ipaex.map}
\tate
𠂰% U+200b0
𠃵% U+200f5
𠅘% U+20158
𤿲% U+24ff2
𧦴% U+279b4
𧵳% U+27d73
姬% U+2f862
諭% U+2f9d0

¢£¥¬
¢£¥¬

〜~
—―
‖∥
\bye

対策前

dvipdfmx:warning: Unicode char U+2f862 replaced with U+f862.
dvipdfmx:warning: Unicode char U+2f9d0 replaced with U+f9d0.
dvipdfmx:warning: Unicode char U+200b0 replaced with U+00b0.
dvipdfmx:warning: Unicode char U+200f5 replaced with U+00f5.
dvipdfmx:warning: Unicode char U+24ff2 replaced with U+4ff2.
dvipdfmx:warning: Unicode char U+27d73 replaced with U+7d73.
dvipdfmx:warning: Unicode char U+20158 replaced with U+0158.
dvipdfmx:warning: Unicode char U+279b4 replaced with U+79b4.

対策後

dvipdfmx:warning: Glyph missing in font. (CID=13998, code=0x2f862)
dvipdfmx:warning: Glyph missing in font. (CID=14068, code=0x2f9d0)
dvipdfmx:warning: Glyph missing in font. (CID=14209, code=0x200b0)
dvipdfmx:warning: Glyph missing in font. (CID=20057, code=0x200f5)
dvipdfmx:warning: Glyph missing in font. (CID=20059, code=0x24ff2)
dvipdfmx:warning: Glyph missing in font. (CID=20060, code=0x27d73)
dvipdfmx:warning: Glyph missing in font. (CID=20075, code=0x20158)
dvipdfmx:warning: Glyph missing in font. (CID=20133, code=0x279b4)
h20y6m commented 9 months ago

21b812e でどうでしょう。

よさそうです。

そろそろ #155 の dvipdfmx の変更を TeX Live svn に入れようと思っているのですが、こちらの修正はどうしましょう? 別々にコミットしたほうが良いのでしょうか? それとも一緒にコミットしたほうが良いのでしょうか?

t-tk commented 9 months ago

ご確認ありがとうございました。 こちらは TeX Live svn にコミットしました。 r69763

155 の方は、そちらにコメントします。

こちらは閉じます。