如何将代码附加到某个部分?

如何将代码附加到某个部分?

在我的scrartcl文档中,我想更改各节和第一段之间的间距。由于我使用的是包parskip,因此 parskip 设置为非零值。该\section命令\parskip也使用,但我想将其删除。

这可以通过以下代码实现:

\section{Introduction}
\vskip-\parskip

这完全没问题。我怎样才能将该代码附加到\sectionLaTeX 中的命令中,而不重新定义其余部分?有电子工具箱使用类似的命令\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}

相关内容