![如何覆盖 \label 来创建两个 \newlabel?](https://linux22.com/image/255060/%E5%A6%82%E4%BD%95%E8%A6%86%E7%9B%96%20%5Clabel%20%E6%9D%A5%E5%88%9B%E5%BB%BA%E4%B8%A4%E4%B8%AA%20%5Cnewlabel%EF%BC%9F.png)
我正在尝试覆盖,\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
文件时,发现两个问题:
\newlabel
命令不包含“vol1”。\newlabel
每\label
两个只有一个。
笔记
根据我最初的模糊问题,这两个答案都是可以接受的。接受的答案能够解释完整的问题(现已更新)。
答案1
对 egreg 的回答的补充:
\label
由通过vianameref
加载的包重新定义。因此,在重新定义之前加载就足够了:hyperref
\AtBeginDocument
nameref
\usepackage{hyperref}
\usepackage{nameref}
\newcommand{\origlabel}{}
\let\origlabel\label
\renewcommand*{\label}[1]{\origlabel{vol1:#1}}
\AtBeginDocument
但如果涉及其他包,则可以另外进行重新定义。
问题还谈到二标签,则必须进行额外的操作。\label
尝试在空格方面不可见。如果在抑制以下空格之前检测到空格。此机制不适用于连续的\label
s,新定义应被\@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-hyper
:zref-xr
firstvolume.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}{}}