![方程式的反向引用](https://linux22.com/image/269123/%E6%96%B9%E7%A8%8B%E5%BC%8F%E7%9A%84%E5%8F%8D%E5%90%91%E5%BC%95%E7%94%A8.png)
我想在每个ed 方程的边缘放置一个页面列表,并通过超链接指向\eqref
或的位置,就像参考书目和 一样。\cref
\label
backref
\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}
生成: