补充答案

补充答案

几天前,我问了一个问题,关于如何重新定义命令\section以便能够在节头之后立即写入内容而不换行:重新定义 \section 命令(我强烈建议您查看附加的链接,因为它可以作为理解这个问题的一个很好的参考点)。

虽然我们已经得到了满意的答案,但我还是想问一个相关的问题。我觉得这很相似但不完全相同,所以我开了一个新的帖子(如果我错了,请纠正我)。

这是我的问题

我想在类本身\section中更改命令article。我找不到任何地方说它有可选选项,我发现唯一允许您对其进行实质性更改的方法是使用包titlesec

我怎样才能改变它以使其以不同的方式工作?问题本身更多的是关于如何在其核心中更改 LaTeX 命令,而不仅仅是命令本身\section。但为了清楚起见,我们可以使用它。

答案1

\section没有在 latex 内核中定义,它在每个类文件中定义(或不​​定义)。例如中的实现article只是一个定义

\newcommand\section{\@startsection {section}{1}{\z@}%
                                   {-3.5ex \@plus -1ex \@minus -.2ex}%
                                   {2.3ex \@plus.2ex}%
                                   {\normalfont\Large\bfseries}}

\section是一个显示标题,article因为{2.3ex \@plus.2ex}参数是正的,如果你在那里放一个负空间,它就会是一个插入标题(就像\paragraph这样

\makeatletter

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

\makeatother

例如在序言中就会产生这种效果。

titlesec包提供了一个稍微更具声明性的界面来做出相同的更改,但同样,它基本上必须假设原始定义或多或少与article类中的定义相似。

其他一些类别(比如memoir我认为的)从更复杂的定义开始,以便更容易地进行定制。

答案2

这是我重新定义部分的方式(使用/def 命令):

\let\oldsection\section
\makeatletter
\def\msection{%
\@ifstar{\@Starred}{\@nonStarred}%
}
\def\@Starred{%
\@ifnextchar[%
{\GenericWarning{}{Warning: A starred section can not have parameters. I am going to ignore them!}\@StarredWith}%
{\@StarredWithout}%
}      
\def\@StarredWith[#1]#2{%
\oldsection*{#2}%
}
\def\@StarredWithout#1{
\oldsection*{#1}%
}
\def\@nonStarred{%
\@ifnextchar[%
{\@nonStarredWith}%
{\@nonStarredWithout}%
}
\def\@nonStarredWith[#1]#2{%
\oldsection[#1]{#2}%
}
\def\@nonStarredWithout#1{%
\oldsection{#1}%
}
\makeatother

我的部分将提供的唯一更改是它将接受带有目录参数的带星号部分(并忽略该参数 :P)当然,这不是任何真正的更改,但您可以使用这些命令出于任何原因重新定义部分。例如,报纸可以添加 if 语句,如果部分标题包含自由或奴隶等字词... 可以从目录和沉睡的人生活的内容中忽略这些部分 :P。

答案3

补充答案

运行texdoc article打开classes.pdf文件,它很好地解释了 David Carlisle 的回答。查找以下部分:

章节和节

其中\@startsection\secdef进行了解释。

另请参阅 \z@ 起什么作用?

另请注意texdoc source2esource2e.pdf 文档:

\def\@minus{minus}乍一看这对我来说似乎很荒谬,但这只是通过扩展一次宏而不是读取 5 个标记(哪些?我希望文档可以更好地解释这一点)来加快进程的一种方法


该文件也可以在这里查看:

http://mirror.ctan.org/macros/latex/base/classes.pdf

其他现象/头痛救星

如果您决定使用该etoc包,但是您已经定义了自定义分段命令,那么您将需要为 etoc 的自定义分段命令添加一个级别。

为什么使用 etoc 时我的自定义切片命令在第二次运行时崩溃?

答案4

xparse包包含用于解析可选星号的工具,如果您想捕获\section包括其参数在内的整个命令,这将非常有用。

文档中有一个例子:

\NewDocumentCommand \chapter { s o m }
{
\IfBooleanTF {#1}
{ \typesetstarchapter {#3} }
{ \typesetnormalchapter {#2} {#3} }
}

相关内容