几天前,我问了一个问题,关于如何重新定义命令\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 source2e
source2e.pdf 文档:
\def\@minus{minus}
乍一看这对我来说似乎很荒谬,但这只是通过扩展一次宏而不是读取 5 个标记(哪些?我希望文档可以更好地解释这一点)来加快进程的一种方法
该文件也可以在这里查看:
http://mirror.ctan.org/macros/latex/base/classes.pdf
其他现象/头痛救星
如果您决定使用该etoc
包,但是您已经定义了自定义分段命令,那么您将需要为 etoc 的自定义分段命令添加一个级别。
答案4
该xparse
包包含用于解析可选星号的工具,如果您想捕获\section
包括其参数在内的整个命令,这将非常有用。
文档中有一个例子:
\NewDocumentCommand \chapter { s o m }
{
\IfBooleanTF {#1}
{ \typesetstarchapter {#3} }
{ \typesetnormalchapter {#2} {#3} }
}