在我的scrartcl
文档中,我想更改各节和第一段之间的间距。由于我使用的是包parskip
,因此 parskip 设置为非零值。该\section
命令\parskip
也使用,但我想将其删除。
这可以通过以下代码实现:
\section{Introduction}
\vskip-\parskip
这完全没问题。我怎样才能将该代码附加到\section
LaTeX 中的命令中,而不重新定义其余部分?有电子工具箱使用类似的命令\appto
,但按如下方式应用只会导致错误:
\appto{\section}{\vskip-\parskip}
我猜是因为\section
需要参数,什么是正确的命令或者有其他解决方案?
答案1
这不是因为\section
采取了一个论点(或多个论点)本身。这是因为\section
在处理其后的参数之前充当中间函数。事实上,在标准文档中,类\section
根本不接受任何参数(来自article.cls
,但类似scrartcl.cls
):
\newcommand\section{\@startsection {section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\Large\bfseries}}
像这样,追加代码\section
实际上插入它在需要某些参数的函数之间,正如您所发现的,这会导致问题。因此,虽然\@startsection
定义为接受 6 个参数并且如上所述,但实际上\@sect
(对于编号)和\@ssect
(对于未编号或星号)设置了部分标题。甚至更进一步,“向下”,\@xsect
被调用来设置后标题功能,所以我在下面修补了它:
\documentclass{scrartcl}% http://ctan.org/pkg/koma-script
\usepackage{parskip}% http://ctan.org/pkg/parskip
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\begin{document}
\section{Introduction}% Original untouched \section
Here is some text.
\section{Introduction}% \section with manual modification
\vskip-\parskip
Here is some text.
\makeatletter
\patchcmd{\@xsect}% <cmd>
{\ignorespaces}% <search>
{\vskip-\parskip\relax\ignorespaces}% <replace>
{}{}% <success><failure>
\makeatother
\section{Introduction}% Modified \section after patch
Here is some text.
\end{document}
由于此修改是在调用的宏上完成的全部分段单元,它将适用于所有单元。
答案2
您scrartcl.cls
将发现以下定义。
\newcommand\section{\@startsection{section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\ifnum \scr@compatibility>\@nameuse{scr@[email protected]}\relax
\setlength{\parfillskip}{\z@ plus 1fil}\fi
\raggedsection\normalfont\sectfont\nobreak\size@section}%
}
第二行和第三行分别确定节标题前后的空间大小。您可以\patchcmd
使用etoolbox 包,或者您可以\section
直接重新定义。无论哪种方式,您都需要,\makeatletter
因为代码包含@
符号。
\documentclass{scrartcl}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\section}{2.3ex \@plus.2ex}{1pt}{}{}
\makeatother
\begin{document}
\section{A section}
Some text
\section{Another section}
\end{document}
。
\documentclass{scrartcl}
\makeatletter
\renewcommand\section{\@startsection{section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{1pt}%
{\ifnum \scr@compatibility>\@nameuse{scr@[email protected]}\relax
\setlength{\parfillskip}{\z@ plus 1fil}\fi
\raggedsection\normalfont\sectfont\nobreak\size@section}%
}
\makeatother
\begin{document}
\section{A section}
Some text
\section{Another section}
\end{document}