确定方程式所在的部分

确定方程式所在的部分

假设我的文档第 1 部分中有一个带标签的方程式,例如\label{eq1}。然后稍后,例如在第 8 部分中,我想引用此方程式所在部分。我知道\ref{eq1}会给出方程编号。但是有没有命令(或编写命令的方法)可以让我说出类似的话\refsec{eq1}并让它返回方程所在的部分编号?

我尽量避免总是查看章节标签。如果这个功能在各个章节中也能用就好了。

答案1

以下方法基于labelLaTeX-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}

相关内容