\section 最终使用 \@plus 和 \@minus 调用 \@startsection。发生了什么?

\section 最终使用 \@plus 和 \@minus 调用 \@startsection。发生了什么?

谁能向我解释一下这是什么

\section

代码定义如下:

\renewcommand\section{\@startsection {section}{1}{\z@}%
                   {-2.5ex \@plus -1ex \@minus -.2ex}%
                   {1.3ex \@plus.2ex}%
                   {\normalfont\Large\bfseries}}

具体来说,它@做什么,为什么不立即评估\@minus\@plus,而是相反,同时评估两者?

答案1

是的,这很奇怪。\section在常规用例中可以有以下 3 种输入样式中的任何一种:

\section{<title>}
\section[<ToC title>]{<title>}
\section*{<title>}

然而,目前还不清楚任何其中与它的定义有关(article.cls):

\renewcommand\section{\@startsection {section}{1}{\z@}%
                   {-2.5ex \@plus -1ex \@minus -.2ex}%
                   {1.3ex \@plus.2ex}%
                   {\normalfont\Large\bfseries}}

这是因为\sectionuses\@startsection实际上定义了大量的间距和格式参数。事实上,\@startsection它本身只是一个中间宏,只抓取了 6 个参数(来自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}}}}

在将其交给\@ssect或之前\@dblarg,取决于您是否使用了\section\section*。这就是为什么它很奇怪 -\section定义为不接受任何参数,但我们可以为其提供参数;这是因为参数是由包含在和更深层次中的辅助宏获取和处理的\section

有关每个参数的详细信息\@startsection,请参阅在哪里可以找到类似\@startsectionLaTeX 的命令的帮助文件或文档?


\@startsection具体来说,传递给包含的间距参数像胶水一样的长度通常,格式如下

<lengthA> <plus> <lengthB> <minus> <lengthC>

LaTeX 内核定义\@plus/\@minusplus/ minus,用户经常根据需要混合使用它们。简而言之,格式表明最终长度可以是

<lengthA> + <lengthB>

(最多)和

<lengthA> - <lengthC>

(至少)。具体到第 4 个参数\@startsection,(垂直)跳过之前其中 a\section可以小到2.3ex( 2.5ex - .2ex) 或大到3.5ex( 2.5ex + 1ex) *。同样,跳过后 范围在1.3ex1.5ex( 1.3ex + .2ex) 之间。实际使用的值取决于用于填充页面的其他内容(因为此粘连/拉伸是垂直的)。

*请注意,\@startsection的第四个参数符号(正数或负数)从长度计算中删除,实际上表示在 之后使用/抑制段落缩进\section。请参阅在哪里可以找到类似\@startsectionLaTeX 的命令的帮助文件或文档?了解详情。

相关内容