如何在交叉引用时丢弃部分方程编号?

如何在交叉引用时丢弃部分方程编号?

我正在写一份 LaTeX 文档,其中我会对各节中的方程式进行编号。因此,在我的序言中,我有

\makeatletter
    \@addtoreset {equation}{section}
    \renewcommand{\theequation}{\thesection.\@arabic\c@equation}
\makeatother

并且它按照我希望的方式工作。当我用“参见 Eq.\ (\ref{mylabel})”交叉引用方程时,我得到的结果是,例如,对于第 3.4 节中的第 15 个方程,“参见 Eq. (3.4.15)”。

但是,我希望能够从其所在的部分交叉引用该方程,并省略部分编号。在这种情况下,我希望获得“参见方程 (15)”

我正在使用 hyperref 包,因此 .aux 文件中的信息如下所示

\newlabel{mylabel}{{3.4.15}{43}{GENERALIZED SPEEDS\relax }{equation.3.4.15}{}}

我了解到 \ref 命令在 .aux 文件中查找 {mylabel},找到 {3.4.15},并使用括号内的字符串。我想知道是否可以定义一个新命令,将其命名为 \myref,并让它丢弃“3.4”。因此,“see Eq.\ (\myref{mylabel})”的结果将是“see Eq. (15)”

\hyperref 命令的语法如下

\hyperref[mylabel]{text}

所以如果我能想出一种方法来使用 mylabel 进入 .aux 文件,带回字符串 3.4.15,并丢弃“\thesection。”,我就可以使用剩下的内容作为 \hyperref 的参数 {text}。


@Ricardo:非常感谢你提供的解决方案。没有 hyperref 时,它工作得很好,但不幸的是,我遇到了 hyperref 的问题。当我使用

\renewcommand{\theequation}{\@arabic\c@equation}

在主部分创建缩写的方程式编号,这会导致辅助文件中出现非唯一条目,并且出现错误

! pdfTeX warning (ext4): destination with the same identifier (name{equation.1}
) has been already used, duplicate ignored

问题是每个部分都有一个方程 (1)。我尝试根据 hyperref README 中关于“下属计数器”的建议来修复该问题,但没有成功。以下是您的代码和 @Lockstep 的示例的组合,应该可以重现该问题:

\documentclass{book}

% The book class numbers equations within chapters.
% We want to number these within sections.    

\makeatletter
    \@addtoreset {equation}{section}
    \renewcommand{\theequation}{\@arabic\c@equation}
\makeatother

\usepackage[colorlinks=true, linkcolor={blue}]{hyperref}
\usepackage{smartref}

\addtoreflist{section}

\newcommand*{\srefaux}[1]{%
  \issectionchanged{#1}% checks if section number has changed
  \ifsectionchanged% if section is different
  \sectionref{#1}.% put the section reference
  \fi% else do nothing
  \ref*{#1}%  <-<-<--- we changed this to ref*
}

\newcommand*\sref[1]{\hyperref[#1]{\hbox{\srefaux{#1}}}}

\begin{document}

\chapter{first}
\section{bla}

If we include a first equation
\begin{equation}\label{eq:xyz}
x^2 + y^2 = z^2
\end{equation}
in this section then hyperref will not be happy with another first equation in the 
next section.

As shown in Eq.\ (\sref{eq:def}) \dots

\section{blubb}

As shown in Eq.\ (\sref{eq:abc}) \dots

\begin{equation}\label{eq:abc}
a^2 + b^2 = c^2
\end{equation}

\begin{equation}\label{eq:def}
d^2 + e^2 = f^2
\end{equation}

\section{foo}

As shown in Eq.\ (\sref{eq:abc}) \dots

\end{document}

答案1

虽然我希望看到涉及该zref包的解决方案,但这里有一个使用 的快速修复etoolbox。新\myref命令将自动在每个方程编号前加上节编号,除非它是在定义相关标签的节中发出的。

\documentclass{book}

\usepackage{etoolbox}

\makeatletter

\apptocmd{\label}{%
  \protected@write\@auxout{}{%
    \csxdef{secnum@#1}{\thesection}%
  }%
}{}{}

\newcommand*{\myref}[1]{%
  (% Optional
  \edef\@tempa{\thesection}%
  \ifcsequal{secnum@#1}{@tempa}{%
  }{%
    \csname secnum@#1\endcsname.%
  }%
  \ref{#1}%
  )% Optional
}

\makeatother

\usepackage{chngcntr}
\counterwithout{equation}{chapter}
\counterwithin*{equation}{section}

\begin{document}

\chapter{first}

\section{bla}

As shown in equation~\myref{eq:abc} \dots

\section{blubb}

As shown in equation~\myref{eq:abc} \dots

\begin{equation}\label{eq:abc}
a^2 + b^2 = c^2
\end{equation}

\begin{equation}\label{eq:def}
d^2 + e^2 = f^2
\end{equation}

\section{foo}

As shown in equation~\myref{eq:abc} \dots

\end{document}

编辑:我必须强调,我的代码不起作用hyperref,因此充其量只是解决问题的第一步。

编辑 2:更改代码以便使用书籍类,使用包更改中心

答案2

这是我目前使用的解决方案,我相信我从中学到的http://www.tug.org/pipermail/macostex-archives/2006-April/021810.html

此解决方案基于包smartref。我将其用于章节而不是部分,到目前为止,它似乎可以与一起使用hyperref

\usepackage{smartref}
\addtoreflist{section}

\newcommand*{\srefaux}[1]{%
   \issectionchanged{#1}% checks if section number has changed
   \ifsectionchanged% if section is different
   \sectionref{#1}.% put the section reference
   \fi% else do nothing
   \ref{#1}%
}

\newcommand*{\sref}[1]{\hbox{\srefaux}}% puts an hbox around the reference

对于此代码,我使用命令\sref而不是\ref

引用中唯一成为hyperref链接的部分是非章节部分。也可以使用以下代码来更改这一点。

\usepackage{hyperref,smartref}
\addtoreflist{section}

\newcommand*{\srefaux}[1]{%
   \issectionchanged{#1}% checks if section number has changed
   \ifsectionchanged% if section is different
   \sectionref{#1}.% put the section reference
   \fi% else do nothing
   \ref*{#1}%  <-<-<--- we changed this to ref*
}

\newcommand*\sref[1]{\hyperref[#1]{\hbox{\srefaux{#1}}}}

再次,\sref成为用来代替 的命令\ref。它会根据需要创建一个引用,其中的所有文本都将成为链接。

相关内容