假设我的文档第 1 部分中有一个带标签的方程式,例如\label{eq1}
。然后稍后,例如在第 8 部分中,我想引用此方程式和所在部分。我知道\ref{eq1}
会给出方程编号。但是有没有命令(或编写命令的方法)可以让我说出类似的话\refsec{eq1}
并让它返回方程所在的部分编号?
我尽量避免总是查看章节标签。如果这个功能在各个章节中也能用就好了。
答案1
以下方法基于label
LaTeX-Kernel 定义的想法。首先,您必须定义一种新的标签,将所需信息写入文件aux
。通常,该命令\label
会在辅助文件中写入以下内容
\newlabel{#1}{{\@currentlabel}{\thepage}}
其中\@currentlabel
是当前数字(在您的情况下是方程数字)。
现在您需要当前章节编号而不是方程编号,因此aux
文件中的信息应该是:
\newlabel{sec@#1}{{\thesection}{\thepage}}
前缀sec@
用于避免多重标签。
amsmath
使用他自己对\label
命名的定义\label@in@display
。为了确保您不必输入两个不同的标签,该定义将通过新标签命令进行扩展。
现在我必须定义一个能够处理新标签的新引用命令。这个想法基于\ref
(参见 latex.ltx)的定义。
命令的解释\@bsphack
也可以在文档中找到宏2e。
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand\sec@label[1]{%
\@bsphack
\protected@write\@auxout{}%
{\string\newlabel{sec@#1}{{\thesection}{\thepage}}}%
\@esphack}
\def\label@in@display#1{%
\ifx\df@label\@empty\else
\@amsmath@err{Multiple \string\label's:
label '\df@label' will be lost}\@eha
\fi
\sec@label{#1}\gdef\df@label{#1}%
}
\def\secref#1{\expandafter\@setref\csname r@sec@#1\endcsname\@firstoftwo{#1}}
\def\secpageref#1{\expandafter\@setref\csname r@sec@#1\endcsname\@secondoftwo{#1}}
\makeatother
\begin{document}
\section{foo}
Text
\section{foo}
Text
\section{foo}
Text
\begin{equation}
a+b=c\label{eq1}
\end{equation}
\section{bar}
See equation in section \secref{eq1} on page \secpageref{eq1}
\end{document}
同样hyperref
\documentclass{article}
\usepackage{amsmath}
\usepackage{hyperref}
\makeatletter
\newcommand\sec@label[1]{%
\@bsphack
\if@filesw
\begingroup
\edef\@currentlabstr{%
\expandafter\strip@prefix\meaning\@currentlabelname
}%
\protected@write\@auxout{}{%
\string\newlabel{seceq@#1}{%
{\@currentlabel}%
{\thepage}%
{\@currentlabstr}%
{\@currentHref}%
{\theHsection}%%%%%%%%<- Define the reference counter
}%
}%
\endgroup
\fi
\@esphack}
\def\label@in@display#1{%
\ifx\df@label\@empty\else
\@amsmath@err{Multiple \string\label's:
label '\df@label' will be lost}\@eha
\fi
\sec@label{#1}\gdef\df@label{#1}%
}
\newcommand*\@refsecstar{}
\newcommand*\T@secref{}
\long\def\@fifthoffive#1#2#3#4#5{#5}
\def\@refsecstar#1{%
\HyRef@StarSetRef{seceq@#1}\@fifthoffive
}
\def\T@secref#1{\hyperref[{#1}]{\secref*{#1}}}%
\DeclareRobustCommand\secref{%
\@ifstar\@refsecstar\T@secref
}%
\makeatother
\begin{document}
\section{foo}
Text
\section{foo}
Text
\section{foo bar}\label{sec}
Text
\begin{table}[!ht]
\caption{table cpation}
\label{tab}
\end{table}
\addtocounter{equation}{5}
\begin{equation}
a+b=c\label{eq1}
\end{equation}
\begin{align}
a+b=c\label{eq2}
\end{align}
\clearpage
\section{bar}
See equation in section \secref{eq1} on page \pageref{eq1}
See equation in section \secref*{eq1} on page \pageref*{eq1}
\end{document}