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

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

Closed
aminophen opened this issue Mar 6, 2022 · 6 comments
Closed

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

aminophen opened this issue Mar 6, 2022 · 6 comments
Labels

Comments

@aminophen
Copy link
Member

添付の 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

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


参考:これが露呈したのは texjporg/platex#98 に記載の「doc.sty v3 が hyperref 依存になった」に伴い texjporg/platex@98d2da5 及び texjporg/uplatex@eb5f4ce で 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
Copy link
Member Author

aminophen commented Mar 6, 2022

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

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

@t-tk
Copy link
Collaborator

t-tk commented Mar 6, 2022

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

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

@aminophen
Copy link
Member Author

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

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

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

@aminophen
Copy link
Member Author

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

@t-tk
Copy link
Collaborator

t-tk commented Mar 7, 2022

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

@aminophen
Copy link
Member Author

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

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

No branches or pull requests

2 participants