texjporg / platex

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

jclasses: \addcontentsline の LaTeX への追随? #79

Closed aminophen closed 5 years ago

aminophen commented 5 years ago

latex3/latex2e@019eead で,ltsect.dtx で定義されている \addcontentsline に \protected@file@percent なる新しい命令が足されました。発端は latex3/latex2e#73 です。

jclasses には

\addcontentsline 縦組の場合にページ番号を\rensuji で囲むように変更します。

という再定義があるので,近々追随してみようと思います。

aminophen commented 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}
20180927-writefile-jclasses
aminophen commented 5 years ago

\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}
wtsnjp commented 5 years ago

その 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}
aminophen commented 5 years ago

\@lnumwidth の設定をグループの外に出す

なるほど。例の MWE の \l@section は jarticle.cls から持ってきたものです。ということは,jarticle.cls もそのように実装すべき,ということでしょうか。

aminophen commented 5 years ago

というか,

abenori commented 5 years ago

最初の例は\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}
aminophen commented 5 years ago

私も @abenori さんと同様の疑問を持っています。

あくまで推測としてですが,本家 LaTeX/classes の考えは

ということなのだ,と考えるとどうでしょう? そう仮定すれば,例の「発端となったソース」は

\renewcommand\l@subsection{\noindent}

の部分が“暗黙の規約”に反しているので,ソースの作り方が良くないと片付けることができます。

aminophen commented 5 years ago

以上を元に本題に戻ると,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}
aminophen commented 5 years ago

当面,filepercent ブランチで試すことにします。

aminophen commented 5 years ago

Merged beanch 'filepercent' into master.

aminophen commented 5 years ago

この修正は platex 2018-12-01 リリースに反映されます。