Closed aminophen closed 5 years ago
jclasses での \addcontentsline の命令は,LaTeX カーネルと比較すると大幅に変更されているようです。その為かどうかわかりませんが,例の latex3/latex2e#73 の発端となったソースを
\documentclass{article} → \documentclass{jarticle}
としてコンパイルすると,(今回の変更とは関係なくもともと)変ですね。
\documentclass{jarticle}
\setcounter{tocdepth}{2}
\makeatletter
\renewcommand\l@subsection{\noindent}
\begin{document}
\tableofcontents
\section{xx}
\subsection{a}
\subsection{a}
\subsubsection{b}
\subsubsection{b}
\subsubsection{b}
\subsubsection{b}
\subsection{a}
\end{document}
\documentclass{article} → \documentclass{jarticle} としてコンパイルすると,(今回の変更とは関係なくもともと)変
jarticle を使わない場合,以下が MWE のようです。
\documentclass{article}
\makeatletter
\newdimen\@lnumwidth
\def\numberline#1{\hb@xt@\@lnumwidth{#1\hfil}}
\renewcommand*{\l@section}[2]{%
\ifnum \c@tocdepth >\z@
\addpenalty{\@secpenalty}%
\addvspace{1.0em \@plus\p@}%
\begingroup
\parindent\z@ \rightskip\@pnumwidth \parfillskip-\rightskip
\leavevmode\bfseries
\setlength\@lnumwidth{1.5em}%
\advance\leftskip\@lnumwidth \hskip-\leftskip
#1\nobreak\hfil\nobreak\hb@xt@\@pnumwidth{\hss#2}\par
\endgroup
\fi}
\makeatother
\setcounter{tocdepth}{2}
\makeatletter
\renewcommand\l@subsection{\noindent}
\begin{document}
\tableofcontents
\section{xx}
\subsection{a}
\subsection{a}
\subsubsection{b}
\subsubsection{b}
\subsubsection{b}
\subsubsection{b}
\subsection{a}
\end{document}
その MWE に関しては, \@lnumwidth
の設定をグループの外に出すだけで本家の出力と一致するように見えますね.
\newdimen\@lnumwidth
\def\numberline#1{\hb@xt@\@lnumwidth{#1\hfil}}
\renewcommand*{\l@section}[2]{%
\ifnum \c@tocdepth >\z@
\addpenalty\@secpenalty
\addvspace{1.0em \@plus\p@}%
\setlength\@lnumwidth{1.5em}%
\begingroup
\parindent\z@ \rightskip\@pnumwidth \parfillskip-\rightskip
\leavevmode \bfseries
\advance\leftskip\@lnumwidth \hskip-\leftskip
#1\nobreak\hfil\nobreak\hb@xt@\@pnumwidth{\hss#2}\par
\endgroup
\fi}
\@lnumwidth
の設定をグループの外に出す
なるほど。例の MWE の \l@section
は jarticle.cls から持ってきたものです。ということは,jarticle.cls もそのように実装すべき,ということでしょうか。
というか,
\@tempdima
という一時変数を意識したくないので \@lnumwidth
を使う」とは書かれていますが,classes と違って「\@lnumwidth
をグループ内に収めている」理由は書かれていません。最初の例は\l@section
が設定した\@tempdima
をsubsectionに対する\numberline
が利用しているように見えますが,そもそもそれでよいのだろうか……?
\documentclass{article}
\setcounter{tocdepth}{2}
\makeatletter
\renewcommand\l@section{\noindent}
\renewcommand\l@subsection{\noindent}
\begin{document}
\@tempdima=0pt
\tableofcontents
\section{xx}
\subsection{a}
\subsection{a}
\subsubsection{b}
\subsubsection{b}
\subsubsection{b}
\subsubsection{b}
\subsection{a}
\end{document}
私も @abenori さんと同様の疑問を持っています。
あくまで推測としてですが,本家 LaTeX/classes の考えは
\@tempdima
は一時変数なので,それ以降の動作は未定義である。だから,l@section で使う時も,特にグループ内でローカライズする必要はない。\@tempdima
の値を設定しなければならない」という“暗黙の規約”を設けて,classes はその通りに実装している。ということなのだ,と考えるとどうでしょう? そう仮定すれば,例の「発端となったソース」は
\renewcommand\l@subsection{\noindent}
の部分が“暗黙の規約”に反しているので,ソースの作り方が良くないと片付けることができます。
以上を元に本題に戻ると,jarticle の場合は以下をテストケースにすればよさそうですね。
\documentclass{jarticle}
\setcounter{tocdepth}{2}
\makeatletter
\renewcommand\l@subsection{\setlength\@lnumwidth{1.5em}\noindent}
\begin{document}
\tableofcontents
\section{xx}
\subsection{a}
\subsection{a}
\subsubsection{b}
\subsubsection{b}
\subsubsection{b}
\subsubsection{b}
\subsection{a}
\end{document}
当面,filepercent ブランチで試すことにします。
Merged beanch 'filepercent' into master.
この修正は platex 2018-12-01 リリースに反映されます。
latex3/latex2e@019eead で,ltsect.dtx で定義されている \addcontentsline に
\protected@file@percent
なる新しい命令が足されました。発端は latex3/latex2e#73 です。jclasses には
という再定義があるので,近々追随してみようと思います。