我可以为标签设置自定义行为吗?

我可以为标签设置自定义行为吗?

我希望每个章节都有一组封闭的标签,这意味着不同的章节可以包含相同的标签,如果我\eqref在该章节中使用,则只在同一章节中查找标签,否则会显示“未定义标签”。总之,我希望每个章节都有独立的标签。我可以这样做吗?

答案1

您可以创建一个宏来自动添加chap<chapternumber>:在每个标签前,并进行更改\ref以便它搜索带有chap<chapternumber>:前缀的引用。

\documentclass{book}
\usepackage{amsmath}

\let\normallabel\label
\let\normalref\ref

\makeatletter
% Poor man's version of ConTeXt's \expanded macro
\newcommand\expanded[1]
    {\xdef\EXPANDED@MACRO{\noexpand#1}\EXPANDED@MACRO}
\makeatother

\newcommand\customlabel[1]
    {\expanded{\normallabel{chap\thechapter:#1}}}

\newcommand\customref[1]
    {\normalref{chap\thechapter:#1}}

\let\ref\customref
\let\label\customlabel

% AMSMath changes the behavior of label.
\makeatletter
\let\ltx@label\customlabel
\makeatother


\begin{document}

\chapter{First chapter}
\begin{equation}\label{eq:first}
  a = b + c
\end{equation}

It is shown in \eqref{eq:first} (\ref{eq:first}) that \ldots

\chapter{Second chapter}
\begin{equation}\label{eq:first}
  a = b + c
\end{equation}

It is shown in \eqref{eq:first} (\ref{eq:first}) that \ldots
\end{document}

如果你打开filename.aux文件,你会看到:

\relax 
\@writefile{toc}{\contentsline {chapter}{\numberline {1}First chapter}{1}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{chap1:eq:first}{{1.1}{1}}
\@writefile{toc}{\contentsline {chapter}{\numberline {2}Second chapter}{3}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{chap2:eq:first}{{2.1}{3}}

因此,标签写为{chap1:eq:first}{chap2:eq:first}等。所以,每个章节的标签都是唯一的。

相关内容