我正在开发一个宏,当给定该宏时,Hello
它将创建一个名为 hello 的章节,并按如下方式对其进行编号:1 - Hello
,并在1 -
页边距内。我还希望它通过将参数小写并删除所有空格来自动标记章节,从而创建一个\label{chap:hello}
。
到目前为止,我已经弄清楚了,要删除“章节”声明,我必须使用\chapter*{}
,并且必须附加其他命令以确保章节在目录中正确编号和显示。
我现在拥有的是:
\renewcommand{\chapter}[1]
{%
\chapter*{#1}
\addcontentsline{toc}{chapter}{#1}
\stepcounter{chapter}
}
在 MWE(最小工作示例)中:
\documentclass{report}
\title{An Example} \author{Nobody}
\renewcommand{\chapter}[1]{%
\chapter*{#1}
\addcontentsline{toc}{chapter}{#1}
\stepcounter{chapter}
}
\begin{document}
\maketitle
\tableofcontents
\chapter{Hello}
\end{document}
(由于某些格式问题,需要标题。)
当我测试这个时,我收到错误:
line 10: TeX capacity exceeded, sorry [input stack size=5000] \tableofcontents
我似乎无法在任何地方找到这个问题的答案:
这似乎是一个没有描述性的错误。帮忙吗?
一个请求:如果你给我一个可以完成整个工作的宏,请解释一下它是如何工作的。(如果不太麻烦的话,请附上文档)
答案1
你有一个小小的隐藏的无限循环。你正在重新定义\chapter
,它调用\chapter*
。这些是同一命令的变体。因此 TeX 构建了一个巨大的堆栈,并以溢出消息结束。
答案2
您不能\chapter
根据自身重新定义。使用在发布\@schapter
时调用的内部版本\chapter*
。我们必须考虑到\tableofcontents
调用\chapter*
,因此必须进行间接调用。
\documentclass{report}
\title{An Example} \author{Nobody}
\makeatletter
\renewcommand{\chapter}{\@ifstar{\@schapter}{\new@chapter}}
\newcommand{\new@chapter}[1]{%
\@schapter{#1}
\addcontentsline{toc}{chapter}{#1}
\stepcounter{chapter}
}
\makeatother
\begin{document}
\maketitle
\tableofcontents
\chapter{Hello}
\end{document}