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

[bibtex] TeX Live 2022 → 2023 でファイル入出力の挙動が変化? #163

Open
aminophen opened this issue Oct 12, 2023 · 13 comments

Comments

@aminophen
Copy link
Member

aminophen commented Oct 12, 2023

(u)(p)BibTeX の挙動が TL2022→2023 の間で変化し,ClutTeX が使えなくなったという報告を X(旧 Twitter)で複数見かけたので,issue を立てます。なおこの期間に ClutTeX は一度も更新されていないので,他の何か(→ BibTeX のプログラム側)の変化が影響していると思われます。

ClutTeX の説明は上のリンクを見ていただきたいですが,TeX のオプション -output-directory を使ってカレントディレクトリを汚さないという挙動をします。さて試しに

\begin{filecontents}{\jobname.bib}
@book{knuth86,
  author    = "Donald E. Knuth",
  title     = "The \TeX book",
  publisher = "Addison-Wesley",
  year      = 1986,
}
\end{filecontents}

\documentclass{article}
\begin{document}
See \cite{knuth86}.

\bibliographystyle{plain}
\bibliography{\jobname}

\end{document}

を clutbib.tex として保存し

$ cluttex --fresh -e lualatex --bibtex=upbibtex clutbib

を実行すると,TeX Live 2022 では lualatex → upbibtex → lualatex の順に走って正常終了しますが,TeX Live 2023 では upbibtex の段になって "3 is a bad bad" というエラーが発生して止まります。TL2022 の upbibtex バイナリを取ってきて TL2023 に置くと正常になるので,バイナリの変更点の何かが効いているようですが特定できていません。

@h20y6m
Copy link
Collaborator

h20y6m commented Oct 12, 2023

Windows でも再現しました。

(ClutTeX が設定する?)環境変数 max_print_line=65536 がセットされていると発生するみたいです。

max_print_line=10000 はセーフ、max_print_line=20000 はアウトでした。

@aminophen
Copy link
Member Author

確かに,試しに r63238 を revert すると ClutTeX でも大丈夫になりました。

bibtex.web 及び WEB2C 実装 bibtex.ch を考え合わせると max_print_line の値が 20000 未満でなければならないと書かれているので,ClutTeX が 20000 以上の値を設定しているのは NG のようです。

bibtex.web

@!buf_size=1000; {maximum number of characters in an input line (or string)}
@!min_print_line=3; {minimum \.{.bbl} line length: must be |>=3|}
@!max_print_line=79; {the maximum: must be |>min_print_line| and |<buf_size|}

bibtex.ch

@x [still 14]
@!buf_size=1000; {maximum number of characters in an input line (or string)}
@!min_print_line=3; {minimum \.{.bbl} line length: must be |>=3|}
@!max_print_line=79; {the maximum: must be |>min_print_line| and |<buf_size|}
@y
@!BUF_SIZE=20000; {initial maximum number of characters in an input line
                                                                (or string)}
@!min_print_line=3; {minimum \.{.bbl} line length: must be |>=3|}
@!MAX_PRINT_LINE=60; {the maximum: must be |>min_print_line| and |<buf_size|}
@z

@aminophen
Copy link
Member Author

aminophen commented Oct 12, 2023

(u)(p)BibTeX で「max_print_line を texmf.cnf あるいは環境変数から読むようにした」という新機能は意図的な変更なので(pbibtex-manual.pdf にも記載あり),この変数を設定する場合は (u)(p)BibTeX が許す値の範囲内とする必要がある。

  • ClutTeX の側で 65536 → 2^14=16384 くらいに落としていただく
  • (u)(p)BibTeX の BUF_SIZE を 20000 → 65537 以上まで増やす

後者は大きすぎて不自然なので ClutTeX での対応が望ましいでしょうか。 @minoki

@t-tk
Copy link
Collaborator

t-tk commented Oct 12, 2023

以前は max_print_line=79 で動作するのが固定だったはず(max_print_line=65536 が無視されていたはず)で、その時点で動作に支障がなかったはずなので、max_print_line=65536 の動作を可能にすることが適切な解決策とは考えにくいと思います。

ClutTeX 側の対応をお願いしたいと思います。

@minoki
Copy link

minoki commented Oct 13, 2023

了解です。ClutTeX側で max_print_line を16384に下げる形で対応します。

@h20y6m
Copy link
Collaborator

h20y6m commented Oct 15, 2023

max_print_line の値が 20000 未満でなければならない

なるほど。

ただ 3 is a bad bad というメッセージは不親切すぎる気がしますね……
max_print_line の値が不正というメッセージにはできないものでしょうか?

@t-tk
Copy link
Collaborator

t-tk commented Oct 16, 2023

max_print_line の値が不正というメッセージにはできないものでしょうか?

できると思います。
bibtex のような枯れたソフトの改良を積極的に手掛けている人は少ないのが現状です。
こういう感じの課題に対して、丁寧に地道に改良することを志していただけるのなら
そろそろTeX Liveのコミッターになっていただけないでしょうか。

@h20y6m
Copy link
Collaborator

h20y6m commented Oct 21, 2023

TeX Liveのコミッターになっていただけないでしょうか。

どういったことをすればよいのでしょうか?

@t-tk
Copy link
Collaborator

t-tk commented Oct 22, 2023

日本語 TeX 開発コミュニティの方にもお迎えしたいですが、
TeX Liveの方について以下記載します。

TeX Liveの方は、お仕事はボランティアでコミットするだけです。
公式の方の案内は↓にあります。
https://www.tug.org/texlive/contribute.html
@h20y6m さんのお得意の分野はこの中の As a package or program developer とか to contribute to TeX Live infrastructure development, including ... anything else (especially on Windows),
にあたると思います。

https://www.tug.org/texlive/pkgcontrib.html https://www.tug.org/texlive/build.html を読むと、新規のパッケージのことと既存のバイナリーのビルドの話が中心で、既存部分のメンテのトピックスは見当たりませんね。
ライセンスが怪しいものを持ち込まない、追加するならライセンスをはっきりさせるなど、コンセプトは一緒だと思います。

自前の環境は、TeX Live svn リポジトリとのやりとりが出来るようにすることが必要です。自分側はsvnである必要はなくgit svnでも大丈夫です。
karlさんにお願いしてTeX Live svn側のアカウントを発行してもらうことが必要です。
今までお書きになって github に公開されているパッチが多数あり実績は充分と思われるので、こういうことをしたい、という旨を karl さんにメールしてお願いすると発行してもらえると思います。おそらく歓迎されると思います。

優しい終身の独裁者 もクリティカルレヴューアーもいらっしゃいません。なので、自制心が重要と思います。

ChangeLog に記載するメールアドレスは、公開されてしまいます。
私の場合、TeXの開発専用アドレスなのに、金融関係のフィッシングメールが毎日届きます😞

いかがでしょうか。

@h20y6m
Copy link
Collaborator

h20y6m commented Oct 29, 2023

ありがとうございます。
karl さんメールして TeX Live svn のアカウントを発行してもらえました。


さて、

max_print_line の値が不正というメッセージにはできないものでしょうか?

の件ですが、ユーザーに分かりやすいメッセージ("max_print_line is too large." とか)を出すとしてそのあとどうするのがよいでしょうか?

  • エラー終了する
  • max_print_line をデフォルト値に設定する
  • max_print_line を最大値 (buf_size-1=19999) に設定する

できるだけ改行してほしくないという意図をくみ取るなら最大値でしょうか?

@t-tk
Copy link
Collaborator

t-tk commented Oct 30, 2023

確かめずに言いますが、
max_print_line は {{u,}p,}bibtex に限らずTeX, Metafont, MetaPost系列でも使われているそうです。
なので、それらと挙動を合わせるのが一番自然な気がします。
どこかのマニュアルに記載があるかどうかも知りませんが、ここまで細かい挙動までは書かないような気がしますし、実装側で適当に決めていいことのように思います。

bibtex-x の方は C言語で全然別の実装なのですが、
ちょこちょこいじっていて、多分 r67639 が関連部分の更新の最後です。
max_print_line の設定が max_print_lineの最大値を超えた場合は、最大値に設定する、に今はなっていると思います。(違うかもしれません)

私の好みは「max_print_line を最大値 (buf_size-1=19999) に設定する」です。
改行の位置が変わった程度では、組版に影響はないか軽微なはずで、「エラー終了」は過激すぎるように思います。
デフォルト値に戻すのも違うような気がします。

@h20y6m
Copy link
Collaborator

h20y6m commented Nov 3, 2023

max_print_line は {{u,}p,}bibtex に限らずTeX, Metafont, MetaPost系列でも使われているそうです。

簡単に調べただけですが、
TeX, Metafont, MetaPostはいずれも max_print_line には下限はあるが上限はないようです。

TeX, Metafont は下限が 60 で 60 未満の値だった場合は

Ouch---my internal constants have been clobbered!---case 2

というエラーで終了するようです。

MetaPostは下限 79 未満の値だった場合は無言で 79 に設定される(?)ようです。

bibtex-x の方は C言語で全然別の実装なのですが、
ちょこちょこいじっていて、多分 r67639 が関連部分の更新の最後です。
max_print_line の設定が max_print_lineの最大値を超えた場合は、最大値に設定する、に今はなっていると思います。(違うかもしれません)

bibtex8, bibtexu も max_print_line が最大値を超えた場合は "3 is bad bad" でエラー終了するようです。
また bibtex8, bibtexu は max_print_line が最小値 3 以下の場合に "2 is bad bad" でエラー終了するようです。
(u)(p)bibtex の場合 max_print_line はデフォルト値 MAX_PRINT_LINE=60 以下は設定されないようになっている (bibtex,ch の setup_bound_var) ようです。


メッセージを出力して max_print_line を最大値 (buf_size-1) に設定するを h20y6m@fef15b8 で試しています。
このタイミングではログファイルはまだ開いていないのでメッセージは端末だけになりそうです。

(u)(p)bibtex だけ変更するは中途半端な気もしますが……

@t-tk
Copy link
Collaborator

t-tk commented Nov 15, 2023

bibtex{8,u} の場合、 "3 is bad bad" でエラー終了するのは、Buf_Size を超えたときのように見えます。
なので、エラー終了は妥当に思えます。
親切なエラーメッセージではない、かもしれまん。

bibtex-2.c ::

    if (Max_Print_Line >= Buf_Size)
        bad = 10 * bad + 3;

Buf_Size は増やしてもよい、とコメント行に書いてありました。

utils.c ::

**    Parameter       Cmd   Standard       --big      --huge  --wolfgang
**    ------------------------------------------------------------------
**    Buf_Size        *** initialy 20000, increased as required ***

bibtex.h ::

/***************************************************************************
 * WEB section number:   14
 * ~~~~~~~~~~~~~~~~~~~
 * These parameters may be changed at compile time to extend or reduce
 * BiBTeX's capacity. They are set to accommodate a maximum of about 750
 * cites when used with the standard styles.
 ***************************************************************************/
#define MIN_PRINT_LINE              3
#define MAX_PRINT_LINE              79
#define AUX_STACK_SIZE              20
#define MAX_BIB_FILES               20

#define BUF_SIZE                   20000

よい仕様が何なのか、わからなくなってしまいました。

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

4 participants