方程式的反向引用

方程式的反向引用

我想在每个ed 方程的边缘放置一个页面列表,并通过超链接指向\eqref或的位置,就像参考书目和 一样。\cref\labelbackref\cite

两个都这个答案\ref此为图形列表不支持hyperref链接、重复数据删除和范围,例如backref。(编辑:见下文和第一条评论,结果发现并不难。

编辑:所以我的主要问题是在方程式标签旁边的边缘显示文本。

编辑2:发布我当前的解决方案作为答案

编辑3:它不工作,cleveref因为该补丁现在包含而不是像以前\label{X}一样破坏了。不知道这是怎么发生的,或者我如何删除。\df@label{X}X\refsto{}编辑4:实际上是在amsmath之前加载cleverref。但必须在 之前加载,因为\cref否则不能用来引用方程式。

编辑5:找到了一种删除{}存在的方法,是否有内置命令?

\def\maybeWithBraces{foo} % this
\def\maybeWithBraces{{foo}} % or this
\def\@identity#1{#1}
\def\@@identity#1{\@identity#1}
\edef\withoutBraces{\expandafter\@@identity\maybeWithBraces}
% \withoutBraces→foo in both cases.

答案1

发现我必须修补\make@display@tag,在调用之前,当前标签在 中\df@label,它被写出并在那里重置。通过存储标签,调用原始标签并将标签与我的一起使用,\refsto我可以将反向引用放在边距中。

但是不支持“参见第 2—4 页”这样的范围。

\ProvidesPackage{eqbackref}[2013/05/26 v0.1 Backreferences for equations]
\RequirePackage{amsmath}
\RequirePackage{etoolbox}

% dump both reference ends
\newcounter{eqbr@source}
\newcommand{\eqbr@record}[1]{%
    \edef\@l{eqbr\arabic{eqbr@source}}\label{\@l}%
    \if@filesw\protected@write\@auxout{}%
        {\string\eqbr@referenced{#1}{\@l}{\thepage}}\fi%
    \stepcounter{eqbr@source}}

% patch amsmath's eqref
\let\ams@eqref=\eqref
\renewcommand{\eqref}[1]{%
    \eqbr@record{#1}%
    \ams@eqref{#1}}

% make a list of refering pages
\newcommand{\eqbr@referenced}[3]{%
    \ifinlistcs{#3}{eqbr@page@#1}{}{%
        \listcsxadd{eqbr@page@#1}{#3}%
        \listcsxadd{eqbr@back@#1}{#2}}}

\newcommand{\refsto@prefix}{see p. }
\newcommand{\refsto@delim}{, }
\newcommand{\refsto@suffix}{}
% print list of refering pages
\newcommand{\refsto}[1]{%
    \ifcsundef{eqbr@back@#1}{}{%
        \refsto@prefix%
        \undef\@first%
        \renewcommand*{\do}[1]{%
            \ifdef\@first{\refsto@delim}{\def\@first{}}%
            \pageref{##1}}%
        \dolistcsloop{eqbr@back@#1}%
        \refsto@suffix}}

\newcommand{\refsto@marginstyle}{\footnotesize\quad}
% patch tag display, show refsto in margin.
\let\ams@make@display@tag=\make@display@tag
% sometimes \df@label expands to `{name}` instead of `name`
\def\@@removebrace@#1{#1}
\def\@@removebrace#1{\@@removebrace@#1}
\renewcommand{\make@display@tag}{%
    \ifdefempty{\df@label}{% can happen with package `autonum`.
        \ams@make@display@tag%
    }{% not empty, show refs
        \edef\orig@label{\expandafter\@@removebrace\df@label}% save label
        \ams@make@display@tag% resets label
        \rlap{\mbox{\refsto@marginstyle\refsto\orig@label}}% show
    }%
}

使用示例:

\documentclass{article}
\usepackage{hyperref} % optional
\usepackage{amsmath} % load before cleveref    
\usepackage{cleveref} % optional
\ussepackage{autonum} % optional
\usepackage{eqbackref}
\begin{document}
\begin{align}
    E_1 \label{eA} \\
    E_2 \label{eB} \\
    E_3 \label{eC}
\end{align}
\newpage\section{page two}\eqref{eA}
\newpage\section{page three}\eqref{eA}\eqref{eB}\eqref{eB}
\newpage\section{page four}\eqref{eA}
\end{document}

生成:

边距中的反向引用

相关内容