texjporg / platex

pLaTeX community edition
BSD 3-Clause "New" or "Revised" License
49 stars 8 forks source link

LaTeX2e 2021-06-01 対策 #96

Closed aminophen closed 3 years ago

aminophen commented 3 years ago

94 から移行。

latex3/latex2e#444 への対応で,次期リリース LaTeX2e 2021-05-01 では \selectfont の定義が変わります。それと同時に,従来の everysel パッケージの機能もカーネルに取り込まれます。

とりあえず fa423e4 で作業を始めてみました。テストはまだです。

aminophen commented 3 years ago

latex3/latex2e@779ddbe7fcfac0c00b3a2e4d7c2ebe91ac117e68 までを確認して,他に気になったところ:

aminophen commented 3 years ago

先ほど pLaTeX2e <2020-10-01>+2 を CTAN に投稿しました。

としているつもりです。後者の新しいコードには \selectfont ならびに \fontseries, \fontshape の改修が入っているので,かなり大きな変更です。なお \@footnotetext の定義変更の調査は,まだ“本家”の CTAN latex-dev にも反映されていないため,保留です。

※ 今月末で TL2020 はフリーズになる予定なので,とりあえず「現状の latex-dev 対応したつもりの platex」を出しておきたかった

h20y6m commented 3 years ago

2点問題と思われるものを見つけました。


shipout/* フックを回避する \RawShipout が追加されているのですが、最初のページで異方向のボックスを出力しようとすると ! Incompatible direction list can't be unboxed. になります。

\documentclass{tarticle}
\begin{document}
\RawShipout\hbox{\yoko ABC}
\end{document}

\__shipout_execute_nohooks_cont: に対しても \__shipout_execute_cont: と同様の対処が必要そうです。


新機能の para/* フックですが、縦組みで使うと para/beforepara/begin フックが改ページ毎に(二段組みの時は段毎に)余分に実行されてしまうようです。

\documentclass{tarticle}
\usepackage{bxjalipsum}
\newcounter{para}
\AddToHook{para/before}{\stepcounter{para}}
\AddToHook{para/begin}{\hbox to 0pt{\hss\arabic{para}}}
\AddToHook{para/end}{\hbox to 0pt{\roman{para}\hss}}
\AddToHook{para/after}{\typeout{\arabic{para}}}
\begin{document}
\jalipsum{wagahai}
\end{document}

おそらく \@makecol の以下の箇所で段落が開始されてしまうためだと思います。

https://github.com/texjporg/platex/blob/5db1ffddf3512f57d1b100f66bb1a3b5a9885141/plcore.dtx#L570

対処するには para/* フックを一時的に無効化する仕組みが必要な気がします。

h-kitagawa commented 3 years ago

__shipout_execute_nohooks_cont: に対しても __shipout_execute_cont: と同様の対処が必要そうです。

73a23c2e9e735ecbdaea2dac7ecf7bc5e681003d でやりました. しかし,LaTeX2e 2021-05-01 では \shipout\RawShipout に共通する処理が \__shipout_execute_main_cont:Nnnn として切り出されたので, LuaTeX-ja のコミット のようにこっち(だけ)をパッチしたほうが最終的に楽になりそうな気がします.

% 03/14 07:23 edit: LuaTeX-ja のコミットへの参照を追加

h-kitagawa commented 3 years ago

新機能の para/* フックですが、縦組みで使うと para/beforepara/begin フックが改ページ毎に(二段組みの時は段毎に)余分に実行されてしまうようです。 ... おそらく \@makecol の以下の箇所で段落が開始されてしまうためだと思います。

https://github.com/texjporg/platex/blob/5db1ffddf3512f57d1b100f66bb1a3b5a9885141/plcore.dtx#L570

対処するには para/* フックを一時的に無効化する仕組みが必要な気がします。

こうすると「LaTeX カーネルによって隠されたプリミティブとしての everypar」がいじれるので,これでどうでしょう(強引ですが……).

\iftdir\vbox{\pdfprimitive\everypar{}\hskip\z@}\fi
h-kitagawa commented 3 years ago

NFSS 周辺を見直していますが,気づいたことを.

\@shape@roman@kanji フラグは \delayed@k@adjustment の中で変更/復帰させたほうが良いように思います (修正案).

また,pLaTeX (, LuaTeX-ja) では \set@safe@kanji@shape による「和文シェープの存在判定をしてから設定」という処理が加えられていますが,たとえば

\fontshape{it}\fontshape{sl}\selectfont

を実行すると

Kanji font shape `JY1/mc/m/it' undefined, No change`

という info が \selectfont の位置で it, sl の二回出現するのが気になります.何か良い解決方法はないでしょうか.

aminophen commented 3 years ago

全然貢献できていなくてすみません。shipout の件の検討ありがとうございます。

\pdfprimitive\everypar{}

この方法で良いと思います。類似のコードは \@makecol だけでなく \@vtryfc にも仕込んでありますので「縦組みのページ補正」を別名マクロに切出しておくと後々メンテナンスしやすいと思いました。

\def\pltx@tate@adjustemptypage{\iftdir\vbox{\pdfprimitive\everypar{}\hskip\z@}\fi}

とか。(その方が \iftdir の数を減らせて LuaTeX-ja とのコード共通化もしやすいですし)

NFSS周辺を見直し

あとで追いかけます…。

aminophen commented 3 years ago

リリースは先延ばしで 2021-06-01 になる? https://github.com/latex3/latex2e/commit/e871157472eb0a62471be271f66b3ac6679c10dd

h-kitagawa commented 3 years ago

リリースは先延ばしで 2021-06-01 になる?

だとしたらちょっと安心です.なかなか私も手が回らない…….

h-kitagawa commented 3 years ago

全然時間(とやる気)がなくて取り組めていませんが…….

\set@safe@kanji@shape による「和文シェープの存在判定をしてから設定」

添付した kshape.txt(実際には pLaTeX ソースです)をタイプセットすると, 2 回めの \selectfontにおいて,和文フォント側は

  1. \fontshape{sw} →現在の和文 (test/m/n) には sw シェープがないのでそのまま
  2. \fontseries{b} →和文は test/b/n に
  3. \fontseries{l} →和文は test/l/n に

という変更を受けます.しかし,和文で test/l/sw が定義されていることを考えると「不思議」な結果のように感じてしまいます.

aminophen commented 3 years ago

そろそろ本気でなんとかしないと…ということで今日・明日は真面目に考えます。明日夕方の時点で,完成/未完成によらずCTANに出そうと思います(遅かれ早かれ,あと10日で出さざるを得ないので)。

aminophen commented 3 years ago

作業メモ

NFSS 絡み (plfonts.dtx)

\selectfont 周りが4月にまたコードが変わっているので,最初に立ち戻って確認中…

\% 数か月前の自分,コミットログ

plfonts.dtx: sync with latex2e develop branch as of latex3/latex2e@83f0f81

と書いててエライ! → この時点からの diff を置いておく

shipout/* フック及び para/* フック絡み (plcore.dtx)

北川さんに対応いただいたので大丈夫そう。以下にも波及するので,対応が必要。

その他

自前パッケージについても要確認。

他にもあれば随時追記していく。

aminophen commented 3 years ago

NFSS絡み (plfonts.dtx)

メモ: 99313cfc で本家最新に追随したつもり…だがまだよくわかってない。

それと @h-kitagawa さんの上のほうのコメント2件

はまだ確認できてない,要調査。

aminophen commented 3 years ago

とりあえず無理やり現状のものを pLaTeX2e 2021-06-01 として出しました。さて:

\@shape@roman@kanji フラグは \delayed@k@adjustment の中で変更/復帰させたほうが良い

確かに。

\set@safe@kanji@shape による「和文シェープの存在判定をしてから設定」

[中略] 和文で test/l/sw が定義されていることを考えると「不思議」な結果のように感じてしまいます.

これも同意です。治すには「和文シェープの存在判定」を \delayed@k@adjustment のリストが定まった最後に実行できれば良いような気がしますが…頭が回らないのでコードを考えるのは後日にします。

aminophen commented 3 years ago

忘れないようにメモ → forum:3124#p18720: 和文シェープの警告が増えた件


さらにもう一点気づいたのですが

\RequirePackage[2020/10/01]{platexrelease}
\stop

これでエラーが出ますね。(2020/02/02 以前に巻戻すのは OK)

platexrelease.sty:3024:
! LaTeX3 Error: Control sequence \__platex_original_shipout_execute_cont:
(LaTeX3)        already defined.
aminophen commented 3 years ago

\RequirePackage[2020/10/01]{platexrelease} でエラー

c0098ad で platexrelease 側は直しましたが https://github.com/latex3/latex2e/issues/577 のためまだ動かない…。

→ 追記:LaTeX 側のバグについては workaround を教えてもらったので,一時的に plvers.dtx に導入 (c888300)。後日 LaTeX2e 本体の修正がリリースされたら,そのコードは削除する予定。

aminophen commented 3 years ago

forum:3124#p18720: 和文シェープの警告が増えた件 和文で test/l/sw が定義されていることを考えると「不思議」な結果のように感じてしまいます.

両者とも,以前ご指摘のあった「\@shape@roman@kanji フラグは \delayed@k@adjustment の中で変更/復帰」によって修正できたように思います (45ae7fd)。

aminophen commented 3 years ago

@h-kitagawa さんのブランチ (https://github.com/h-kitagawa/platex/commit/26bcadb8fe63869b5e4a56a7d68c370d3f10dc2d) にあるテストケースの結果が

で違う件についても,理由を調べていますがよくわかりません…。

%#!platex
\documentclass{jarticle}
\makeatletter
\DeclareKanjiFamily{JY1}{hoge}{}
\DeclareFontShape  {JY1}{hoge}{m} {n}{<-> s*nmlminr-h}{}
\DeclareFontShape  {JY1}{hoge}{ub}{n}{<-> s*nmlminb-h}{}
\DeclareKanjiFamily{JY1}{fuga}{}
\DeclareFontShape  {JY1}{fuga}{m} {n}{<-> s*nmlgothr-h}{}
\DeclareFontShape  {JY1}{fuga}{sb}{n}{<-> s*nmlgothb-h}{}

\def\mcdefault{hoge}\def\gtdefault{fuga}
\def\bfseries@mc{ub}\def\bfseries@gt{sb}
\def\test#1{%
  \par\begingroup#1%
    \xdef\status@af{\f@family/\f@series/\f@shape}%
    \xdef\status@jf{\k@family/\k@series/\k@shape}\endgroup%
  (\texttt{\status@af}, \texttt{\status@jf})
}
\begin{document}

\test{}
% => hoge/m/n

\test{\kanjiseries{ub}\selectfont\gtfamily}
% => fuga/sb/n

\test{\kanjiseriesforce{ub}\selectfont\gtfamily}
% => changed!
%  * 2020-10-01: fuga/ub/n (fallback -> fuga/m/n)
%  * 2021-06-01: fuga/sb/n

\test{\romanseries{l}\kanjiseries{ub}\selectfont\gtfamily}
% => fuga/sb/n

\test{\romanseriesforce{l}\kanjiseries{ub}\selectfont\gtfamily}
% => fuga/sb/n

\end{document}

上記3つ目の changed! の所が変化します。なお,この変化は本家 LaTeX2e (pdflatex) でも類似です。

%#!pdflatex
\documentclass{article}
\makeatletter
\DeclareFontFamily{OT1}{hoge}{}
\DeclareFontShape {OT1}{hoge}{m} {n}{<-> s*cmff10}{}
\DeclareFontShape {OT1}{hoge}{ub}{n}{<-> s*cmsl10}{}
\DeclareFontFamily{OT1}{fuga}{}
\DeclareFontShape {OT1}{fuga}{m} {n}{<-> s*cmbxti10}{}
\DeclareFontShape {OT1}{fuga}{sb}{n}{<-> s*cmbxsl10}{}

\def\rmdefault{hoge}\def\sfdefault{fuga}
\def\bfseries@rm{ub}\def\bfseries@sf{sb}
\def\test#1{%
  \par\begingroup#1%
    \xdef\status@af{\f@family/\f@series/\f@shape}\endgroup%
  (\texttt{\status@af})
}
\begin{document}

\test{}
% => hoge/m/n

\test{\fontseries{ub}\selectfont\sffamily}
% => fuga/sb/n

\test{\fontseriesforce{ub}\selectfont\sffamily}
% => changed!
%  * 2020-10-01: fuga/ub/n (fallback -> fuga/m/n)
%  * 2021-06-01: fuga/sb/n

\end{document}

結果的に sb になる原理はよくわかっていませんが,少なくともこの変化は「本家 LaTeX と互換である」と言えるので,問題ないとみなすことにします。(→ latex3/latex2e#579 で確認ずみ)

aminophen commented 3 years ago

https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=3146 で指摘された \userelfont での従属欧文のシェープ・シリーズ更新が効かない件について https://github.com/texjporg/platex/commit/04c437e5d3c9ada79d4d1c7a989061243c7847aa で対処しました。

  1. \delayed@k@adjustment の処理
  2. 和文の処理
  3. \rel@///(|all) = \romanseries/\romanshape で更新
  4. \delayed@f@adjustment の処理
  5. 欧文の処理

の順にすることでどうにか。合わせて https://github.com/texjporg/platex/commit/65a11dffbccdb269fb1b3b96d913952ca2759571forced@series フラグを roman/kanji で分けてみました。分けない場合に何が起こるのかはわかりませんが,原理的には分けておかないといけないように感じたため。