![从公式参考中提取节号](https://linux22.com/image/250204/%E4%BB%8E%E5%85%AC%E5%BC%8F%E5%8F%82%E8%80%83%E4%B8%AD%E6%8F%90%E5%8F%96%E8%8A%82%E5%8F%B7.png)
如何获取公式(或图形)出现的章节编号?例如,我有参考3.2,指的是第二个(第二) 节中的方程3. 我怎样才能提取3(或者2),以便它仍然可以点击(使用 hyperref)?
最好,当它是第二个方程式时,它应该返回“2nd”,当它是第三个方程式时,它应该返回“3d”,依此类推。
梅威瑟:
\documentclass[10pt,a4paper,fleqn]{article}
\usepackage{amsmath}
\usepackage{lipsum}
\usepackage{hyperref}
\hypersetup{colorlinks}
\numberwithin{equation}{section}
\setlength{\parindent}{0pt}
\begin{document}
\section{Start}
\lipsum[1]
\section{Halfway}
The equation \eqref{ThisOne} is the (1st, 2nd, 3d, ...?) Equation in Section (1, 2, 3, ...?).
\section{End}
A famous formula:
\begin{equation}
x_1, x_2 = \frac{ -b \pm \sqrt{b^2 - 4ac} }{ 2a }
\end{equation}
And another one:
\begin{equation}
\sin^2(\varphi) + \cos^2(\varphi) = 1
\label{ThisOne}
\end{equation}
\end{document}
答案1
您可以在refcount
(将参考编号转换为字符串),xstring
(提取点前后的数字),以及engord
(以获得所需的序数格式)包。
在下面的例子中,我定义了命令\SecNum
和\EqNum
;第一个命令给出参考文献的章节编号,第二个命令给出序数表示法的方程编号并将其转换为给定方程的超链接:
\documentclass[10pt,a4paper,fleqn]{article}
\usepackage{amsmath}
\usepackage{refcount}
\usepackage{xstring}
\usepackage{engord}
\usepackage{xspace}
\usepackage{lipsum}
\usepackage{hyperref}
\hypersetup{colorlinks}
\numberwithin{equation}{section}
\setlength{\parindent}{0pt}
\newcommand\equ{}
\newcommand\EqNum[1]{%
\StrBehind{\getrefnumber{#1}}{.}[\equ]%
\hyperref[#1]{\engordnumber{\equ}\xspace}%
}
\newcommand\SecNum[1]{%
\StrBefore{\getrefnumber{#1}}{.}\xspace%
}
\begin{document}
\section{Start}
\lipsum[1]
\section{Halfway}
The equation \eqref{ThisOne} is the \EqNum{ThisOne}~Equation in Section \SecNum{ThisOne}.
\section{End}
A famous formula:
\begin{equation}
x_1, x_2 = \frac{ -b \pm \sqrt{b^2 - 4ac} }{ 2a }
\end{equation}
And another one:
\begin{equation}
\sin^2(\varphi) + \cos^2(\varphi) = 1
\label{ThisOne}
\end{equation}
\end{document}
我\xspace
从xspace
包中添加了内容以保持适当的间距。
答案2
这zref
包裹\label
允许将常规的 2 部分系统扩展\ref
为任意数量的属性/元素。以下 MWE 创建了一个新的属性列表(称为special
),并向此列表添加section
和equation
计数器(\arabic
格式为)以供引用:
\documentclass[10pt,a4paper,fleqn]{article}
\usepackage{amsmath}% http://ctan.org/pkg/amsmath
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\usepackage{hyperref}% http://ctan.org/pkg/hyperref
\usepackage{zref}% http://ctan.org/pkg/zref
\makeatletter
\zref@newlist{special}% Create a new property list called special
\zref@newprop{section}{\arabic{section}}% Section property holds \arabic{section}
\zref@addprop{special}{section}% Add a section property to special
\zref@newprop{equation}{\arabic{equation}}% Equation property holds \arabic{equation}
\zref@addprop{special}{equation}% Add an equation property to special
\newcommand*{\eqnref}[1]{\zref@extractdefault{#1}{equation}{??}}
\newcommand*{\secref}[1]{\zref@extractdefault{#1}{section}{??}}
\newcommand*{\spref}[2][section]{\zref@extractdefault{#2}{#1}{??}}
\newcommand*{\splabel}[1]{\zref@labelbylist{#1}{special}}%
\makeatother
\hypersetup{colorlinks}
\numberwithin{equation}{section}
\setlength{\parindent}{0pt}
\begin{document}
\section{Start}
\lipsum[1]
\section{Halfway}
The equation \eqref{ThisOne} is Equation~\eqnref{ThisOne} in Section~\secref{ThisOne}.
\section{End}
A famous formula:
\begin{equation}
x_1, x_2 = \frac{ -b \pm \sqrt{b^2 - 4ac} }{ 2a }
\end{equation}
And another one:
\begin{equation}
\sin^2(\varphi) + \cos^2(\varphi) = 1
\label{ThisOne}\splabel{ThisOne}
\end{equation}
\end{document}
zref
标签使用 来设置\splabel
,而方程使用 来引用\eqnref
,部分使用 来引用\secref
。这些是更通用的具体实现\spref[<type>]{<refname>}
(<type>
默认为section
)。由于使用的宏是可扩展的,fmtcount
也可用于提供序数引用:
\usepackage{fmtcount}% http://ctan.org/pkg/fmtcount
%...
\newcommand*{\eqnref}[1]{\ordinalnum{\zref@extractdefault{#1}{equation}{??}}}
如果需要的话,也可以进行超级引用。
随着
\let\oldlabel\label
\renewcommand{\label}[1]{\oldlabel{#1}\splabel{#1}}%
在您的序言中,您只需使用一个\label
命令即可获得所需的引用输出,而不是\label
+ \splabel
。