我是 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
在组关闭后会重复,因此它可以全局生效。请注意,章节计数器在全局范围内仍然递增,这使得在那里也需要递减。