texjporg / tex-jp-build

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

[mendex] 大量のエントリで尻切れ #137

Closed aminophen closed 2 years ago

aminophen commented 2 years ago

添付の upldoc-ind.zip において

$ mendex -s gind.ist -o upldoc.ind upldoc.idx

とすると,1つのエントリが大量出現する場合(この場合は \xspcode)に

  \item \verb*+\xkanjiskip+\pfill \hdclindex{118}{code}{b-74}
  \item \verb*+\xspcode+\pfill \hdclindex{337}{code}{c-181}, 
        \hdclindex{338}{code}{c-182}, 
        \hdclindex{339}{code}{c-183}, 
   … (中略) …
        \hdclindex{459}{code}{c-303}, 
        \hdclindex{460}{code}{c-304}, 
        \hdcl

  \indexspace

のように出力が途中で途切れます。


参考:これが露呈したのは https://github.com/texjporg/platex/issues/98 に記載の「doc.sty v3 が hyperref 依存になった」に伴い https://github.com/texjporg/platex/commit/98d2da52068b90723222d143117529ae6e550b9a 及び https://github.com/texjporg/uplatex/commit/eb5f4ce60bd953481bc220aac7919e97568db265 で platex/uplatex のソースコード説明書の PDF 作成ソースを更新しようとしたら

uplatex-dev -kanji=utf8 upldoc.tex
This is e-upTeX, Version 3.141592653-p4.0.0-u1.28-220214-2.6 (utf8.uptex) (TeX Live 2022) (preloaded format=uplatex-dev)
 restricted \write18 enabled.
entering extended mode
(./upldoc.tex
pLaTeX2e <2021-11-15u04> (based on LaTeX2e <2022-06-01> pre-release-2 (develop 2022-3-6 branch))
… (中略) …
(/usr/local/texlive/2022dev/texmf-dist/tex/latex/plautopatch/plautopatch.sty)
(/usr/local/texlive/2022dev/texmf-dist/tex/platex/base/jltxdoc.cls
Document Class: jltxdoc 2017/09/24 v1.0d Standard pLaTeX file
(/usr/local/texlive/2022dev/texmf-dist/tex/latex-dev/base/ltxdoc.cls
… (中略) …
(/usr/local/texlive/2022dev/texmf-dist/tex/latex/hypdoc/hypdoc.sty
(/usr/local/texlive/2022dev/texmf-dist/tex/latex-dev/base/atveryend-ltx.sty)
(/usr/local/texlive/2022dev/texmf-dist/tex/latex/hyperref/hyperref.sty
… (中略) …
[1] [2] [3]) [4] (./upldoc.gls [88] [89] [90] [91]) [92] (./upldoc.ind [93]
[94] [95] [96] [97] [98] [99] [100] [101] [102]
! Undefined control sequence.
l.2862 ^^I^^I\hdcl

? x
Output written on upldoc.dvi (19 pages, 568040 bytes).
Transcript written on upldoc.log.
make: *** [upldoc.dvi] Error 1

という不思議なエラーで止まったからでした。ここで \hdcl というのは \hdclindex{460}{code}{…}, というエントリを出力しようとして尻切れしたもののようです。

aminophen commented 2 years ago

mendex の fwrite.c で #define BUFFERLEN 4096 なのに対して今回の大量のエントリは 4096 バイト以上あることが直接の原因のようですが,安直に増やすと環境によっては問題があるのでしょうか? ちなみに upmendex は mendex と同じく尻切れとなり,makeindex は切れずに正常出力されました。

また,原理的にはどこかに上限を設けるしかないのは承知の上で,ただその場合でも切れた旨を警告してくれた方が親切なように思います。

t-tk commented 2 years ago

今回引っかかっているのは↓で導入した文字列出力の上限を設けたところでしょうか?

安直に増やしても問題になることは無いと思いますが、問題にならない上限の値はいくら位でしょうか?

aminophen commented 2 years ago

ソースを見る限りだと,2014年より昔も出力文字列の上限は4096だったように見えます。

mendex の場合,改行文字 \n を含む出力文字列をいったんすべてバッファ lbuff に溜め込んでいる(fwrite.c の linecheck 関数)のが上限に達しやすい根源のようです。

参考:makeindex/genind.c は wrap_line 関数で,改行時にそのつどファイルに吐き出しています。

aminophen commented 2 years ago

mendex-longbuf ブランチで試しに https://github.com/texjporg/tex-jp-build/commit/564d999f073d7be8504559af692c973d68eb8154 のように「改行の都度ファイルに吐き出す」とすれば,バッファサイズを増やすことなく正常出力されるようです。いかがでしょう?

t-tk commented 2 years ago

ありがとうございます。 ソースを見ました。趣旨に賛同します。

aminophen commented 2 years ago

ありがとうございます。source freeze まで日数がないので r62492 で mendex / upmendex 両方にコミットしました。