今回のテーマ
\section
が内部で読み出している\@startsection
という制御綴の定義がjsarticle.clsで上書きされていて,その変更理由が不思議に思えたので共有します。
latex.ltxにおける仕様
\def\@startsection#1#2#3#4#5#6{%
\if@noskipsec \leavevmode \fi
\par
\@tempskipa #4\relax
\@afterindenttrue
\ifdim \@tempskipa <\z@
\@tempskipa -\@tempskipa \@afterindentfalse
\fi
\if@nobreak
\everypar{}%
\else
\addpenalty\@secpenalty\addvspace\@tempskipa
\fi
\@ifstar
{\@ssect{#3}{#4}{#5}{#6}}%
{\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
jsarticle.clsにおける仕様
\def\@startsection#1#2#3#4#5#6{%
\if@noskipsec \leavevmode \fi
\par
\@tempskipa #4\relax
\if@english \@afterindentfalse \else \@afterindenttrue \fi
\ifdim \@tempskipa <\z@
\@tempskipa -\@tempskipa \@afterindentfalse
\fi
\if@nobreak
\everypar{}%
\else
\addpenalty\@secpenalty
\ifdim \@tempskipa >\z@
\if@slide\else
\null
\vspace*{-\baselineskip}%
\fi
\vskip\@tempskipa
\fi
\fi
\noindent
\@ifstar
{\@ssect{#3}{#4}{#5}{#6}}%
{\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
本題
今回話題に上げるのは,この部分です。
latex.ltxにおける仕様(重要部分だけ抜き出し)
\if@nobreak
\everypar{}%
\else
\addpenalty\@secpenalty\addvspace\@tempskipa
\fi
jsarticle.clsにおける仕様(重要部分だけ抜き出し)
\if@nobreak
\everypar{}%
\else
\addpenalty\@secpenalty
\ifdim \@tempskipa >\z@
\if@slide\else
\null
\vspace*{-\baselineskip}%
\fi
\vskip\@tempskipa
\fi
\fi
\noindent
\@nobreak
がfalseであるときの挙動が変更されています。改ページ直後に\section
が来たときに,jsarticle版だと,
\null
\vspace*{-\baselineskip}%
というところで余分なスペースが出力されてしまいます。\@srartsection
の引数の中で,必要な上下の空き幅については指定出来るはずですので,私が頭の中で思い浮かべる仕様と異なっている・・不思議です。