chapter
KOMA级指令定义scrbook
如下:
\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
\thispagestyle{\chapterpagestyle}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter
}
我想知道\secdef
是什么。
答案1
\secdef
是一个实用命令;如果定义的形式为
\def\foo{<tokens>\secdef\fooA\fooB}
呼唤\foo
<tokens>\fooA
而调用\foo*
就可以了
<tokens>\fooB
这是因为的定义\secdef
是
\def\secdef#1#2{\@ifstar{#2}{\@dblarg{#1}}}
因此,撇开<tokens>
可能先于执行的\secdef
,我们得到
\@ifstar{\fooB}{\@dblarg{\fooA}}
如果\foo*
被调用,\fooB
则执行,否则 TeX 执行
\@dblarg{\fooA}
所以\fooA
必须以特殊方式定义:
\def\fooA[#1]#2{...}
就像\@chapter
是。这个\@dblarg
技巧基本上检查下一个标记;如果是[
,那么我们就会处于这样的情况
\foo[X]{Y}
LaTeX 就可以了
\fooA[X]{Y}
否则我们有
\foo{Y}
并将\@dblarg
以这样一种方式安排事情,以便 TeX 最终能够看到
\fooA[Y]{Y}
改为、\foo
改为和改为以便更好地理解这个想法。\chapter
\fooA
\@chapter
\fooB
\@schapter
答案2
哦...我想我自己明白了:\secdef
似乎在\chapter
和\chapter*
调用之间切换,所以你可以在上面的例子中为每种情况定义一个自己的宏\@chapter
(非星号案例)或\@schapter
(星号案例)。