我正在写一份 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
。它会根据需要创建一个引用,其中的所有文本都将成为链接。