谁能向我解释一下这是什么
\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}}
这是因为\section
uses\@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
,请参阅在哪里可以找到类似\@startsection
LaTeX 的命令的帮助文件或文档?。
\@startsection
具体来说,传递给包含的间距参数像胶水一样的长度通常,格式如下
<lengthA> <plus> <lengthB> <minus> <lengthC>
自LaTeX 内核定义\@plus
/\@minus
为plus
/ minus
,用户经常根据需要混合使用它们。简而言之,格式表明最终长度可以是
<lengthA> + <lengthB>
(最多)和
<lengthA> - <lengthC>
(至少)。具体到第 4 个参数\@startsection
,(垂直)跳过之前其中 a\section
可以小到2.3ex
( 2.5ex - .2ex
) 或大到3.5ex
( 2.5ex + 1ex
) *。同样,跳过后 范围在1.3ex
和1.5ex
( 1.3ex + .2ex
) 之间。实际使用的值取决于用于填充页面的其他内容(因为此粘连/拉伸是垂直的)。
*请注意,\@startsection
的第四个参数符号(正数或负数)从长度计算中删除,实际上表示在 之后使用/抑制段落缩进\section
。请参阅在哪里可以找到类似\@startsection
LaTeX 的命令的帮助文件或文档?了解详情。