在 \begingroup 内定义标签

在 \begingroup 内定义标签

我是 LaTeX 新手,花了一整天时间在 Google 上搜索,但还是没能找到这个问题的解决方案。这个问题可能很简单,但我一点头绪都没有。

我正在使用一个不是我创建的类,其代码如下:

\pretocmd{\@chapter}{\begingroup\smallspacing}{}{}
\apptocmd{\@chapter}{\endgroup}{}{}

以下是使用该类的文档的基本示例:

\chapter{Intro}
\label{ch:intro}
This is the Intro

\chapter{First}
This references \ref{ch:intro}

这将输出一个空引用。问题是必须\label将 放在 和 之间\begingroup\endgroup但我不知道该怎么做,因为定义在类内部。有什么想法可以做到这一点吗?

答案1

正如评论中提到的,您可以将它放在标题\label\chapter,以便它位于本地分组内:

\chapter{\label{ch:intro}Intro}
This is the Intro

如果你仍然想使用\label通常的方式,你可以通过对钩子进行一些小的修改来实现\apptocmd。这是一个完整的例子:

\documentclass{book}

\usepackage{etoolbox}

\makeatletter
\let\smallspacing\relax
\pretocmd{\@chapter}{\begingroup\smallspacing}{}{}
\apptocmd{\@chapter}{%
    \endgroup
    \if@mainmatter
        \addtocounter{chapter}{-1}%
        \refstepcounter{chapter}%
    \fi
}{}{}
\makeatother

\begin{document}
\chapter{Intro}
\label{ch:intro}
This is the Intro.

This references \ref{ch:intro}.
\end{document}

本地分组的问题在于它无法使 的效果\refstepcounter全局可用,即,它会在组关闭后立即删除当前内部标签标记,以便以下\label命令不再使用它。在上面的示例中,\refstepcounter在组关闭后会重复,因此它可以全局生效。请注意,章节计数器在全局范围内仍然递增,这使得在那里也需要递减。

相关内容