有人能告诉我为什么吗
\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
是*
。
命令的参数要么是命令后面的大括号组中包含的文本,要么是第一个标记(不同于空格)(如果没有紧跟大括号的话)。