我找到了etoolbox
允许我在另一个命令开头添加命令的包。
我尝试了以下操作,但没有效果:
\apptocmd{\chapter}{
\exewidth{(34)}
}
我想通过调用 在每个章节开始时重置某个值\exewidth
。该怎么做?
答案1
\chapter
类中的定义book
是
% book.cls, line 365:
\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
\thispagestyle{plain}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
如果你
\apptocmd{\chapter}{
\exewidth{(34)}
}{}{}
(注意两个尾随参数,查看文档etoolbox
了解说明),您将使命令\secdef
失败。
您还添加了不需要的空格,但这只是一个小细节。
正确的添加位置\exewidth
是开始:
\pretocmd{\chapter}{% <--- IMPORTANT
\exewidth{(34)}% <--- IMPORTANT
}{}{}
但是,当然,当\chapter*
调用时,这也会添加设置。如果您只想将其用于编号章节,则修补的正确命令是\@chapter
,再次使用\pretocmd
。
\exewidth{(34)}
假设在末尾添加。\secdef
执行时,它会吸收其两个参数(在本例中为\@chapter
和\@schapter
)并寻找后续的*
;没有*
,因为下一个标记是\exewidth
,因此根据其定义,\secdef
传递\@dblarg{\@chapter}
。请注意,\exewidth
仅检查了 ,但仍在输入流中。
现在\@dblarg
执行;其操作首先在于查看是否[
遵循。没有,有\exewidth
;很好,因此寻找一个参数(由表示#1
)并执行\@chapter[#1]{#1}
。
是什么#1
?通常,如果您输入 ,它就是章节标题\chapter{Title}
。但这里仍有\exewidth
待处理的标记。没有括号,因此\exewidth
变成#1
。
这是你想要的吗?;-)