由于宏,目录中的 TeX 容量超出范围

由于宏,目录中的 TeX 容量超出范围

我正在开发一个宏,当给定该宏时,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}

相关内容