自定义 \chapter 定义

自定义 \chapter 定义

有人能告诉我为什么吗

\let\stdchapter\chapter
\renewcommand{\chapter}[1]{\stdchapter{#1}}

这样做不安全吗?别在意我为什么问,我有解决方法,所以这更多的是因为 LaTeX 的行为不符合我的预期。该\let命令应该将原始\chapter定义备份为\stdchapter,重新定义\chapter以扩展为\stdchapter应该会使其完全按照最初的方式执行。但是,如果我进行此更改,LaTeX 将无法处理我的文档(错误消息:“ LaTeX Error: Something's wrong--perhaps a missing \item.”)。

更新: 以下是重现该问题所需的最少代码:

\documentclass[a4paper]{report}
\usepackage[american]{babel}
\let\stdchapter\chapter
\renewcommand{\chapter}[1]{\stdchapter{#1}}
\begin{document}
\tableofcontents
\end{document}

答案1

你必须赶上明星版的\chapter

\documentclass[openany]{report}

\makeatletter
\let\stdchapter\chapter
\renewcommand*\chapter{%
  \@ifstar{\starchapter}{\@dblarg\nostarchapter}}
\newcommand*\starchapter[1]{\stdchapter*{#1}}
\def\nostarchapter[#1]#2{\stdchapter[{#1}]{#2}}
\makeatother

\begin{document}
\tableofcontents
\chapter{foo}
\chapter*{baz}
\end{document}

答案2

很难立即说出问题的根源。您的重新定义应该可以合理地发挥作用,尽管这不是我推荐的。

\chapter通常具有论点。它出现有一个可选和一个强制参数,但实际上并没有,在进行重新定义时应该考虑到这一点。

\chapter例如,类中的定义book

\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
                    \thispagestyle{plain}%
                    \global\@topnum\z@
                    \@afterindentfalse
                    \secdef\@chapter\@schapter}

这表明\chapter不寻求争论。

我可以理解您的示例仅仅是一个例子,但是这样您就会失去\chapter(*-form 和可选参数) 提供的所有功能。

为什么你会得到错误肯定取决于您如何实际重新定义\chapter

让我们看看为什么您的示例中会出现错误。宏\tableofcontents问题\chapter*{\contentsname}以及重新定义失败的原因: 的参数\chapter*

命令的参数要么是命令后面的大括号组中包含的文本,要么是第一个标记(不同于空格)(如果没有紧跟大括号的话)。

相关内容