如何覆盖 \label 来创建两个 \newlabel?

如何覆盖 \label 来创建两个 \newlabel?

我正在尝试覆盖,\label以便它会自动创建两个标签。

\documentclass[11pt,twoside]{book}
\usepackage{hyperref}
\let\origlabel\label
\renewcommand{\label}[1]{\origlabel{vol1:#1}\origlabel{#1}}
\begin{document}
\chapter{Beginning}\label{chap:begin}
\chapter{Middle}\label{chap:middle}
\chapter{End}\label{chap:end}
\end{document}

当我查看该.aux文件时,发现两个问题:

  1. \newlabel命令不包含“vol1”。
  2. \newlabel\label两个只有一个。

笔记

根据我最初的模糊问题,这两个答案都是可以接受的。接受的答案能够解释完整的问题(现已更新)。

答案1

对 egreg 的回答的补充:

\label由通过vianameref加载的包重新定义。因此,在重新定义之前加载就足够了:hyperref\AtBeginDocumentnameref

\usepackage{hyperref}
\usepackage{nameref}

\newcommand{\origlabel}{}
\let\origlabel\label
\renewcommand*{\label}[1]{\origlabel{vol1:#1}}

\AtBeginDocument但如果涉及其他包,则可以另外进行重新定义。


问题还谈到标签,则必须进行额外的操作。\label尝试在空格方面不可见。如果在抑制以下空格之前检测到空格。此机制不适用于连续的\labels,新定义应被\@bsphack和包围\@esphack

\makeatletter
\AtBeginDocument{%
  \newcommand*{\orig@label}{}%
  \let\orig@label\label
  \renewcommand*{\label}[1]{%
    \@bsphack
    \orig@label{#1}%
    \orig@label{vol1:#1}%
    \@esphack
  }%
  \makeatother
}%

添加的目的是什么vol1:?如果标签在另一个文档中使用,那么能够导入外部标签(xr、、)的软件包通常允许为标签名称添加前缀。假设主 TeX 文件名为,则另一个文档使用类似以下内容xr-hyperzref-xrfirstvolume.tex

xr/xr-hyper: \externaldocument[vol1:]{firstvolume}
zref-xr: \zxrsetup{...}\zexternaldocument*[vol1:]{firstvolumne}

答案2

hyperref我可以在加载时重现该问题,因为它重新定义了\label

解决方法:

\documentclass{article}

\usepackage{hyperref}

\AtBeginDocument{
  \let\origlabel\label
  \renewcommand{\label}[1]{\origlabel{vol1:#1}}
}

\begin{document}

\section{A}\label{x}

\end{document}

文件中的条目.aux将是

\newlabel{vol1:x}{{1}{1}{A}{section.1}{}}

相关内容